Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/scripts/detect_validate_surfaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,14 @@
"emitters/rust.py",
"emitters/sql.py",
"emitters/typescript.py",
"llm/conversation_plan.py",
"llm/conversation_planner.py",
"llm/conversation_backend.py",
"llm/conversation_engine.py",
"llm/context.py",
"llm/provider_types.py",
"llm/workspace_editor.py",
"llm/workspace_query.py",
"registry/__init__.py",
"registry/resolver.py",
"registry/signature.py",
Expand Down
1 change: 1 addition & 0 deletions cli/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ asyncio_default_test_loop_scope = "module"
addopts = "-n auto"
markers = [
"docker: requires Docker daemon and internet access (opt-in via MODELABLE_DOCKER_TESTS=1)",
"ollama: requires a developer-controlled local Ollama server and model (opt-in via MODELABLE_OLLAMA_TESTS=1)",
]

[tool.coverage.run]
Expand Down
7 changes: 7 additions & 0 deletions cli/scripts/build_browser_wheel.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,14 @@
"emitters/rust.py",
"emitters/sql.py",
"emitters/typescript.py",
"llm/conversation_plan.py",
"llm/conversation_planner.py",
"llm/conversation_backend.py",
"llm/conversation_engine.py",
"llm/context.py",
"llm/provider_types.py",
"llm/workspace_editor.py",
"llm/workspace_query.py",
"registry/__init__.py",
"registry/resolver.py",
"registry/signature.py",
Expand Down
3 changes: 3 additions & 0 deletions cli/src/modelable/browser/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from modelable.browser.api import BrowserCompiler
from modelable.browser.conversation import BrowserConversationReply, BrowserConversationService
from modelable.browser.dispatch import dispatch_browser_request
from modelable.browser.dto import (
BrowserArtifact,
Expand All @@ -17,6 +18,8 @@
"BrowserCompileResult",
"BrowserCompiler",
"BrowserCompletionResult",
"BrowserConversationReply",
"BrowserConversationService",
"BrowserDiagnostic",
"BrowserFormatResult",
"BrowserHoverResult",
Expand Down
189 changes: 0 additions & 189 deletions cli/src/modelable/browser/ai.py

This file was deleted.

65 changes: 6 additions & 59 deletions cli/src/modelable/browser/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,8 @@

from types import MappingProxyType

from modelable.browser.ai import (
build_explain_request,
build_generate_entity_request,
build_suggest_projection_request,
parse_explain_result,
parse_generate_result,
)
from modelable.browser.compatibility import build_browser_compatibility
from modelable.browser.dto import (
BrowserAiExplainResult,
BrowserAiGenerateResult,
BrowserAiPendingResult,
BrowserArtifact,
BrowserCompatibilityResult,
BrowserCompileResult,
Expand Down Expand Up @@ -117,6 +107,11 @@ def _load_workspace(sources: tuple[BrowserSource, ...]) -> Workspace | tuple[Bro
class BrowserCompiler:
def __init__(self) -> None:
self.language = LanguageWorkspace()
self._sources: tuple[BrowserSource, ...] = ()

@property
def sources(self) -> tuple[BrowserSource, ...]:
return self._sources

def open_workspace(
self,
Expand All @@ -130,6 +125,7 @@ def open_workspace(
workspace_revision,
tuple(LanguageDocument.from_text(source.uri, source.text, source.version) for source in sources),
)
self._sources = sources
return BrowserWorkspaceResult(
workspace_revision=synchronization.revision,
diagnostics=tuple(_browser_diagnostic(diagnostic) for diagnostic in synchronization.diagnostics),
Expand Down Expand Up @@ -277,55 +273,6 @@ def governance(
raise BrowserLanguageError("LANGUAGE_UNAVAILABLE")
return build_browser_governance(semantic, workspace_revision)

def ai_generate(
self,
workspace_revision: int,
action: str,
parameters: dict[str, object],
llm_response_content: str | None,
) -> BrowserAiPendingResult | BrowserAiGenerateResult:
if workspace_revision != self.language.revision:
raise BrowserLanguageError("STALE_WORKSPACE")

if llm_response_content is None:
if action == "generate_entity":
return build_generate_entity_request(
self.language,
description=str(parameters.get("description", "")),
domain_name=parameters.get("domainName"), # type: ignore[arg-type]
model_name=parameters.get("modelName"), # type: ignore[arg-type]
)
if action == "suggest_projection":
return build_suggest_projection_request(
self.language,
source_ref=str(parameters.get("sourceRef", "")),
consumer_domain=str(parameters.get("consumerDomain", "")),
)
raise BrowserRequestValidationError(f"Unknown generate action: {action}")

return parse_generate_result(llm_response_content)

def ai_explain(
self,
workspace_revision: int,
parameters: dict[str, object],
llm_response_content: str | None,
) -> BrowserAiPendingResult | BrowserAiExplainResult:
if workspace_revision != self.language.revision:
raise BrowserLanguageError("STALE_WORKSPACE")

if llm_response_content is None:
ref = parameters.get("ref")
raw_index = parameters.get("diagnosticIndex")
diag_index: int | None = int(raw_index) if isinstance(raw_index, (int, float, str)) else None
return build_explain_request(
self.language,
ref=str(ref) if ref is not None else None,
diagnostic_index=diag_index,
)

return parse_explain_result(llm_response_content)

def _validate_language_request(
self,
request: BrowserLanguagePosition,
Expand Down
Loading