@asm-agent/coding-agent 0.8.8 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +2 -7
- package/dist/asm-agent-runtime/src/__pycache__/asm_cm_driver.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/__pycache__/phase76_address_head.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__init__.py +1 -1
- package/dist/asm-agent-runtime/src/rlm/__pycache__/__init__.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/bash.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/bash.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp_base.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/repl.cpython-312.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/repl.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/__pycache__/skill.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/src/rlm/bash.py +94 -31
- package/dist/asm-agent-runtime/src/rlm/repl.md +3 -3
- package/dist/asm-agent-runtime/src/rlm/repl.py +46 -45
- package/dist/asm-agent-runtime/test/__pycache__/test_bash.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/__pycache__/test_repl.cpython-313.pyc +0 -0
- package/dist/asm-agent-runtime/test/test_bash.py +74 -19
- package/dist/asm-agent-runtime/test/test_repl.py +67 -3
- package/dist/asm-agent-runtime/uv.lock +446 -155
- package/dist/bundle/{anthropic-OFECORE7.js → anthropic-ZOZNPFXS.js} +2 -2
- package/dist/bundle/{azure-openai-responses-AOVTLR6N.js → azure-openai-responses-TDHCU647.js} +2 -2
- package/dist/bundle/{bundled-modules-JQCJDEIY.js → bundled-modules-Q2YODC4B.js} +3 -3
- package/dist/bundle/{chunk-M67RGWDQ.js → chunk-AMKLNEAK.js} +25 -44
- package/dist/bundle/{chunk-7TB7CGPV.js → chunk-FPY7FFJS.js} +978 -1821
- package/dist/bundle/{chunk-JC2TT4MZ.js → chunk-G6SC4YYW.js} +4942 -1916
- package/dist/bundle/{chunk-A65OM3TZ.js → chunk-QLHAP3FT.js} +1 -1
- package/dist/bundle/{cli-main-FNHDQGQD.js → cli-main-277AG2BR.js} +3 -3
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/{google-RVJL6RIQ.js → google-Q3AJWUOY.js} +1 -1
- package/dist/bundle/{google-vertex-EZTRRRH6.js → google-vertex-2CSNOUBS.js} +1 -1
- package/dist/bundle/{main-IYXIIAJN.js → main-TNXWJXIU.js} +3 -3
- package/dist/bundle/{mistral-FSGKSMA7.js → mistral-XRYJGLLG.js} +1 -1
- package/dist/bundle/{openai-codex-responses-VM5Y564D.js → openai-codex-responses-C6BRO2BN.js} +2 -2
- package/dist/bundle/{openai-completions-X46FOQDN.js → openai-completions-DNXCK2JW.js} +3 -3
- package/dist/bundle/{openai-responses-SOQNEPBE.js → openai-responses-BEMWVIXE.js} +2 -2
- package/dist/config.d.ts +0 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -3
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-config.d.ts +1 -2
- package/dist/core/agent-session-config.d.ts.map +1 -1
- package/dist/core/agent-session-config.js +0 -3
- package/dist/core/agent-session-config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +0 -8
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +0 -2
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +0 -22
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +8 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +100 -22
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/kernel/bootstrap.d.ts.map +1 -1
- package/dist/core/kernel/bootstrap.js +1 -1
- package/dist/core/kernel/bootstrap.js.map +1 -1
- package/dist/core/kernel/repl-manager.d.ts +32 -8
- package/dist/core/kernel/repl-manager.d.ts.map +1 -1
- package/dist/core/kernel/repl-manager.js +401 -102
- package/dist/core/kernel/repl-manager.js.map +1 -1
- package/dist/core/kernel/shared.d.ts +11 -7
- package/dist/core/kernel/shared.d.ts.map +1 -1
- package/dist/core/kernel/shared.js +2 -5
- package/dist/core/kernel/shared.js.map +1 -1
- package/dist/core/mcp/mcp-manager.d.ts +4 -2
- package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
- package/dist/core/mcp/mcp-manager.js +9 -7
- package/dist/core/mcp/mcp-manager.js.map +1 -1
- package/dist/core/prime-inference-auth.d.ts +0 -9
- package/dist/core/prime-inference-auth.d.ts.map +1 -1
- package/dist/core/prime-inference-auth.js +0 -50
- package/dist/core/prime-inference-auth.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +0 -1
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/session-manager.d.ts +0 -4
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +0 -22
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +13 -43
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +0 -5
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/tools/acp-mcp.d.ts +6 -0
- package/dist/core/tools/acp-mcp.d.ts.map +1 -0
- package/dist/core/tools/acp-mcp.js +86 -0
- package/dist/core/tools/acp-mcp.js.map +1 -0
- package/dist/core/tools/index.d.ts +1 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ipython.d.ts.map +1 -1
- package/dist/core/tools/ipython.js +9 -4
- package/dist/core/tools/ipython.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +2 -11
- package/dist/main.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts.map +1 -1
- package/dist/modes/acp/acp-mode.js +1 -1
- package/dist/modes/acp/acp-mode.js.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.d.ts +0 -2
- package/dist/modes/agent-connection/daemon-agent-connection.d.ts.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.js +0 -2
- package/dist/modes/agent-connection/daemon-agent-connection.js.map +1 -1
- package/dist/modes/agents-view/agents-view-mode.d.ts.map +1 -1
- package/dist/modes/agents-view/agents-view-mode.js +0 -19
- package/dist/modes/agents-view/agents-view-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-mode.d.ts +1 -10
- package/dist/modes/daemon/daemon-mode.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-mode.js +134 -274
- package/dist/modes/daemon/daemon-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-protocol.d.ts +11 -5
- package/dist/modes/daemon/daemon-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-protocol.js +6 -8
- package/dist/modes/daemon/daemon-protocol.js.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.d.ts +0 -3
- package/dist/modes/daemon/daemon-supervisor.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.js +18 -52
- package/dist/modes/daemon/daemon-supervisor.js.map +1 -1
- package/dist/modes/daemon/daemon-worker-protocol.d.ts +1 -6
- package/dist/modes/daemon/daemon-worker-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-worker-protocol.js +0 -2
- package/dist/modes/daemon/daemon-worker-protocol.js.map +1 -1
- package/dist/modes/interactive/auth-flows.d.ts +0 -2
- package/dist/modes/interactive/auth-flows.d.ts.map +1 -1
- package/dist/modes/interactive/auth-flows.js +1 -101
- package/dist/modes/interactive/auth-flows.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +6 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +13 -3
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +2 -2
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/mermaid.d.ts +12 -0
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
- package/dist/modes/interactive/components/mermaid.js +63 -0
- package/dist/modes/interactive/components/mermaid.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +10 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/feature-hints.d.ts.map +1 -1
- package/dist/modes/interactive/feature-hints.js +0 -4
- package/dist/modes/interactive/feature-hints.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -7
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +23 -279
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/settings.md +1 -31
- package/docs/usage.md +1 -4
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +6 -5
- package/dist/core/agent-traces.d.ts +0 -130
- package/dist/core/agent-traces.d.ts.map +0 -1
- package/dist/core/agent-traces.js +0 -746
- package/dist/core/agent-traces.js.map +0 -1
- package/dist/core/telemetry.d.ts +0 -92
- package/dist/core/telemetry.d.ts.map +0 -1
- package/dist/core/telemetry.js +0 -633
- package/dist/core/telemetry.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-flows.js","sourceRoot":"","sources":["../../../src/modes/interactive/auth-flows.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from \"node:path\";\nimport { getProviders, type OAuthProviderId, type OAuthSelectPrompt } from \"@asm-agent/ai\";\nimport type { OverlayHandle, TUI } from \"@asm-agent/tui\";\nimport { getAuthPath, getDocsPath } from \"../../config.js\";\nimport type { ModelRegistry } from \"../../core/model-registry.js\";\nimport {\n\tASM_AGENT_TRACES_PROVIDER_ID,\n\tASM_AGENT_TRACES_PROVIDER_NAME,\n\tcheckAsmAgentTracesAccess,\n\tcheckPrimeInferenceAccess,\n\tfetchPrimeTeams,\n\tloadPrimeCliConfig,\n\tloginAsmAgentTraces,\n\tloginPrimeInference,\n\tPRIME_INFERENCE_PROVIDER_ID,\n\tPRIME_INFERENCE_PROVIDER_NAME,\n\ttype PrimeTeam,\n\tresolveAsmAgentTracesBaseUrl,\n} from \"../../core/prime-inference-auth.js\";\nimport { BUILT_IN_PROVIDER_DISPLAY_NAMES } from \"../../core/provider-display-names.js\";\nimport { SERPER_CREDENTIAL_ID, SERPER_CREDENTIAL_NAME } from \"../../core/websearch-credential.js\";\nimport { showFullPaneOverlay } from \"./components/centered-overlay.js\";\nimport { ExtensionSelectorComponent } from \"./components/extension-selector.js\";\nimport { LoginDialogComponent } from \"./components/login-dialog.js\";\nimport {\n\ttype AuthSelectorCategory,\n\ttype AuthSelectorProvider,\n\tcompareAuthSelectorProviders,\n\tOAuthSelectorComponent,\n} from \"./components/oauth-selector.js\";\nimport { PrimeTeamSelectorComponent } from \"./components/prime-team-selector.js\";\nimport { theme } from \"./theme/theme.js\";\n\nexport type AuthenticationResult =\n\t| {\n\t\t\tstatus: \"success\";\n\t\t\tproviderId: string;\n\t\t\tproviderName: string;\n\t\t\tauthType: \"oauth\" | \"api_key\";\n\t\t\t/** \"service\" credentials (e.g. web search) don't affect model selection. */\n\t\t\tkind?: \"provider\" | \"service\";\n\t }\n\t| { status: \"cancelled\" }\n\t| { status: \"failed\" };\n\nexport const BEDROCK_PROVIDER_ID = \"amazon-bedrock\";\nexport const ASM_AGENT_LOGIN_PROVIDER_IDS = new Set([\"openai-codex\", \"anthropic\"]);\n\nexport const ANTHROPIC_SUBSCRIPTION_AUTH_WARNING =\n\t\"Anthropic subscription auth is active. Third-party harness usage draws from extra usage and is billed per token, not your Claude plan limits. Manage extra usage at https://claude.ai/settings/usage.\";\n\nfunction isAnthropicSubscriptionAuthKey(apiKey: string | undefined): boolean {\n\treturn typeof apiKey === \"string\" && apiKey.startsWith(\"sk-ant-oat\");\n}\n\nexport async function getAnthropicSubscriptionAuthWarning(\n\tmodelRegistry: ModelRegistry,\n\tmodel: { provider: string } | undefined,\n): Promise<string | undefined> {\n\tif (!model || model.provider !== \"anthropic\") {\n\t\treturn undefined;\n\t}\n\n\tconst storedCredential = modelRegistry.authStorage.get(\"anthropic\");\n\tif (storedCredential?.type === \"oauth\") {\n\t\treturn ANTHROPIC_SUBSCRIPTION_AUTH_WARNING;\n\t}\n\n\ttry {\n\t\tconst apiKey = await modelRegistry.getApiKeyForProvider(model.provider);\n\t\tif (isAnthropicSubscriptionAuthKey(apiKey)) {\n\t\t\treturn ANTHROPIC_SUBSCRIPTION_AUTH_WARNING;\n\t\t}\n\t} catch {\n\t\t// Ignore auth lookup failures for warning-only checks.\n\t}\n\treturn undefined;\n}\n\nconst BUILT_IN_MODEL_PROVIDERS = new Set<string>(getProviders());\n\nexport function isApiKeyLoginProvider(\n\tproviderId: string,\n\toauthProviderIds: ReadonlySet<string>,\n\tbuiltInProviderIds: ReadonlySet<string> = BUILT_IN_MODEL_PROVIDERS,\n): boolean {\n\tif (BUILT_IN_PROVIDER_DISPLAY_NAMES[providerId]) {\n\t\treturn true;\n\t}\n\tif (builtInProviderIds.has(providerId)) {\n\t\treturn false;\n\t}\n\treturn !oauthProviderIds.has(providerId);\n}\n\nexport interface ProviderAuthFlowsHost {\n\treadonly ui: TUI;\n\treadonly modelRegistry: ModelRegistry;\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n\t/** Models currently visible to the host; used to detect providers configured via external credentials. */\n\tgetAvailableModels(): Promise<ReadonlyArray<{ provider: string }>>;\n\t/** Invoked after stored credentials change so the host can refresh dependent UI. */\n\tonAuthChanged?(): void | Promise<void>;\n\t/** Invoked after a successful login (e.g. to surface billing warnings). */\n\tonLoginCompleted?(): void;\n}\n\nexport interface ProviderLoginOptions {\n\tauthType?: \"oauth\" | \"api_key\";\n\tinitialCategory?: AuthSelectorCategory;\n}\n\n/** Shared auth dialogs: host-specific refresh and billing effects remain outside the flow. */\nexport class ProviderAuthFlows {\n\tconstructor(private readonly host: ProviderAuthFlowsHost) {}\n\n\t/**\n\t * Run the OAuth login flow for an MCP integration server.\n\t *\n\t * The provider must already be registered (the McpManager does this as\n\t * `mcp:<server>`). On success the credentials land in auth.json and the\n\t * caller should reload resources so the integration's skill enables.\n\t */\n\trunMcpLogin(server: string, label?: string): Promise<AuthenticationResult> {\n\t\tconst providerId = `mcp:${server}`;\n\t\tconst provider = this.host.modelRegistry.authStorage.getOAuthProviders().find((p) => p.id === providerId);\n\t\tif (!provider) {\n\t\t\tthis.host.showError(`Unknown MCP integration: ${server}`);\n\t\t\treturn Promise.resolve({ status: \"failed\" });\n\t\t}\n\t\treturn this.showLoginDialog(providerId, label ?? provider.name, \"service\");\n\t}\n\n\trunLogin(options: ProviderLoginOptions = {}): Promise<AuthenticationResult> {\n\t\tconst { authType, initialCategory } = options;\n\t\tconst providerOptions = this.getLoginProviderOptions(authType);\n\t\tif (providerOptions.length === 0) {\n\t\t\tthis.host.showStatus(\n\t\t\t\tauthType === \"oauth\"\n\t\t\t\t\t? \"No subscription providers available.\"\n\t\t\t\t\t: authType === \"api_key\"\n\t\t\t\t\t\t? \"No API key providers available.\"\n\t\t\t\t\t\t: \"No providers available.\",\n\t\t\t);\n\t\t\treturn Promise.resolve({ status: \"failed\" });\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tlet handle: OverlayHandle | undefined;\n\t\t\tconst close = () => {\n\t\t\t\thandle?.hide();\n\t\t\t\tthis.host.ui.requestRender();\n\t\t\t};\n\t\t\tconst selector = new OAuthSelectorComponent(\n\t\t\t\t\"login\",\n\t\t\t\tthis.host.modelRegistry.authStorage,\n\t\t\t\tproviderOptions,\n\t\t\t\tasync (providerOption: AuthSelectorProvider) => {\n\t\t\t\t\tclose();\n\t\t\t\t\tresolve(await this.loginProvider(providerOption));\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tclose();\n\t\t\t\t\tresolve({ status: \"cancelled\" });\n\t\t\t\t},\n\t\t\t\t(providerId) => this.host.modelRegistry.getProviderAuthStatus(providerId),\n\t\t\t\t{ getRows: () => this.host.ui.terminal.rows, initialCategory },\n\t\t\t);\n\t\t\thandle = showFullPaneOverlay(this.host.ui, selector, 78);\n\t\t});\n\t}\n\n\tloginProvider(providerOption: AuthSelectorProvider): Promise<AuthenticationResult> {\n\t\tconst kind = providerOption.category === \"service\" ? \"service\" : \"provider\";\n\t\tif (providerOption.authType === \"oauth\") {\n\t\t\treturn this.showLoginDialog(providerOption.id, providerOption.name, kind);\n\t\t}\n\t\tif (providerOption.id === PRIME_INFERENCE_PROVIDER_ID) {\n\t\t\treturn this.runPrimeInferenceLogin();\n\t\t}\n\t\tif (providerOption.id === BEDROCK_PROVIDER_ID) {\n\t\t\treturn this.showBedrockSetupDialog(providerOption.id, providerOption.name);\n\t\t}\n\t\treturn this.showApiKeyLoginDialog(providerOption.id, providerOption.name, kind);\n\t}\n\n\trunLogout(): Promise<string | null> {\n\t\tconst providerOptions = this.getLogoutProviderOptions();\n\t\tif (providerOptions.length === 0) {\n\t\t\tthis.host.showStatus(\n\t\t\t\t\"No stored credentials to remove. /logout only removes credentials saved by /login; environment variables and models.json config are unchanged.\",\n\t\t\t);\n\t\t\treturn Promise.resolve(null);\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tlet handle: OverlayHandle | undefined;\n\t\t\tconst close = () => {\n\t\t\t\thandle?.hide();\n\t\t\t\tthis.host.ui.requestRender();\n\t\t\t};\n\t\t\tconst selector = new OAuthSelectorComponent(\n\t\t\t\t\"logout\",\n\t\t\t\tthis.host.modelRegistry.authStorage,\n\t\t\t\tproviderOptions,\n\t\t\t\tasync (providerOption: AuthSelectorProvider) => {\n\t\t\t\t\tclose();\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.host.modelRegistry.authStorage.logout(providerOption.id);\n\t\t\t\t\t\tthis.host.modelRegistry.refresh();\n\t\t\t\t\t\tawait this.host.onAuthChanged?.();\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\tproviderOption.authType === \"oauth\"\n\t\t\t\t\t\t\t\t? `Logged out of ${providerOption.name}`\n\t\t\t\t\t\t\t\t: `Removed stored API key for ${providerOption.name}. Environment variables and models.json config are unchanged.`;\n\t\t\t\t\t\tthis.host.showStatus(message);\n\t\t\t\t\t\tresolve(providerOption.id);\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tthis.host.showError(`Logout failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\t\t\tresolve(null);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tclose();\n\t\t\t\t\tresolve(null);\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\t{ getRows: () => this.host.ui.terminal.rows },\n\t\t\t);\n\t\t\thandle = showFullPaneOverlay(this.host.ui, selector, 78);\n\t\t});\n\t}\n\n\tgetLoginProviderOptions(authType?: \"oauth\" | \"api_key\"): AuthSelectorProvider[] {\n\t\tconst authStorage = this.host.modelRegistry.authStorage;\n\t\tif (authType === \"api_key\") {\n\t\t\treturn [];\n\t\t}\n\t\tconst oauthProviders = authStorage\n\t\t\t.getOAuthProviders()\n\t\t\t.filter((provider) => ASM_AGENT_LOGIN_PROVIDER_IDS.has(provider.id));\n\t\tconst options: AuthSelectorProvider[] = oauthProviders.map((provider) => ({\n\t\t\tid: provider.id,\n\t\t\tname: provider.name,\n\t\t\tauthType: \"oauth\",\n\t\t}));\n\n\t\treturn options.sort(compareAuthSelectorProviders);\n\t}\n\n\tprivate getLogoutProviderOptions(): AuthSelectorProvider[] {\n\t\tconst authStorage = this.host.modelRegistry.authStorage;\n\t\tconst options: AuthSelectorProvider[] = [];\n\n\t\tconst oauthProvidersById = new Map(authStorage.getOAuthProviders().map((p) => [p.id, p]));\n\t\tfor (const providerId of authStorage.list()) {\n\t\t\tconst credential = authStorage.get(providerId);\n\t\t\tif (!credential) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isSerper = providerId === SERPER_CREDENTIAL_ID;\n\t\t\tconst isMcp = providerId.startsWith(\"mcp:\");\n\t\t\tconst name = isSerper\n\t\t\t\t? SERPER_CREDENTIAL_NAME\n\t\t\t\t: isMcp\n\t\t\t\t\t? (oauthProvidersById.get(providerId)?.name ?? providerId.slice(\"mcp:\".length))\n\t\t\t\t\t: this.host.modelRegistry.getProviderDisplayName(providerId);\n\t\t\toptions.push({\n\t\t\t\tid: providerId,\n\t\t\t\tname,\n\t\t\t\tauthType: credential.type,\n\t\t\t\tcategory: isSerper || isMcp ? \"service\" : \"provider\",\n\t\t\t});\n\t\t}\n\n\t\tif (!options.some((option) => option.id === PRIME_INFERENCE_PROVIDER_ID)) {\n\t\t\tconst primeInferenceStatus = authStorage.getAuthStatus(PRIME_INFERENCE_PROVIDER_ID);\n\t\t\tif (primeInferenceStatus.source === \"prime_cli\") {\n\t\t\t\toptions.push({\n\t\t\t\t\tid: PRIME_INFERENCE_PROVIDER_ID,\n\t\t\t\t\tname: PRIME_INFERENCE_PROVIDER_NAME,\n\t\t\t\t\tauthType: \"api_key\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn options.sort((a, b) => a.name.localeCompare(b.name));\n\t}\n\n\tprivate async completeProviderAuthentication(\n\t\tproviderId: string,\n\t\tproviderName: string,\n\t\tauthType: \"oauth\" | \"api_key\",\n\t\tstatusSuffix?: string,\n\t\tkind: \"provider\" | \"service\" = \"provider\",\n\t\tcredentialPath: string = getAuthPath(),\n\t): Promise<AuthenticationResult> {\n\t\tthis.host.modelRegistry.refresh();\n\n\t\tconst actionLabel = authType === \"oauth\" ? `Logged in to ${providerName}` : `Saved API key for ${providerName}`;\n\t\tawait this.host.onAuthChanged?.();\n\t\tthis.host.showStatus(\n\t\t\t`${actionLabel}. Credentials saved to ${credentialPath}${statusSuffix ? `. ${statusSuffix}` : \"\"}`,\n\t\t);\n\t\tthis.host.onLoginCompleted?.();\n\t\treturn {\n\t\t\tstatus: \"success\",\n\t\t\tproviderId,\n\t\t\tproviderName,\n\t\t\tauthType,\n\t\t\tkind,\n\t\t};\n\t}\n\n\tprivate async completeExternalProviderSetup(\n\t\tproviderId: string,\n\t\tproviderName: string,\n\t): Promise<AuthenticationResult> {\n\t\tthis.host.modelRegistry.refresh();\n\t\tawait this.host.onAuthChanged?.();\n\t\tthis.host.showStatus(`${providerName} uses external credentials. Select a model after configuring them.`);\n\t\treturn {\n\t\t\tstatus: \"success\",\n\t\t\tproviderId,\n\t\t\tproviderName,\n\t\t\tauthType: \"api_key\",\n\t\t};\n\t}\n\n\tprivate async hasAvailableProviderModels(providerId: string): Promise<boolean> {\n\t\tconst models = await this.host.getAvailableModels();\n\t\treturn models.some((model) => model.provider === providerId);\n\t}\n\n\tprivate async showBedrockSetupDialog(providerId: string, providerName: string): Promise<AuthenticationResult> {\n\t\tconst dialog = new LoginDialogComponent(this.host.ui, providerId, () => {}, providerName, \"Amazon Bedrock setup\");\n\t\tconst handle = showFullPaneOverlay(this.host.ui, dialog, 88);\n\t\tconst closeDialog = () => {\n\t\t\thandle.hide();\n\t\t\tthis.host.ui.requestRender();\n\t\t};\n\n\t\ttry {\n\t\t\tawait dialog.showContinueInfo([\n\t\t\t\ttheme.fg(\"text\", \"Amazon Bedrock uses AWS credentials instead of a single API key.\"),\n\t\t\t\ttheme.fg(\"text\", \"Configure an AWS profile, IAM keys, bearer token, or role-based credentials.\"),\n\t\t\t\ttheme.fg(\"muted\", \"See:\"),\n\t\t\t\ttheme.fg(\"accent\", ` ${path.join(getDocsPath(), \"providers.md\")}`),\n\t\t\t]);\n\t\t\tcloseDialog();\n\t\t\tif (!(await this.hasAvailableProviderModels(providerId))) {\n\t\t\t\tthis.host.showStatus(`${providerName} credentials were not detected. Configure them, then reopen /model.`);\n\t\t\t\treturn { status: \"cancelled\" };\n\t\t\t}\n\t\t\treturn await this.completeExternalProviderSetup(providerId, providerName);\n\t\t} catch (error: unknown) {\n\t\t\tcloseDialog();\n\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\tif (errorMsg !== \"Login cancelled\") {\n\t\t\t\tthis.host.showError(`Failed to set up ${providerName}: ${errorMsg}`);\n\t\t\t\treturn { status: \"failed\" };\n\t\t\t}\n\t\t\treturn { status: \"cancelled\" };\n\t\t}\n\t}\n\n\tprivate showPrimeTeamSelector(\n\t\tteams: PrimeTeam[],\n\t\tcurrentTeamId: string | undefined,\n\t): Promise<PrimeTeam | null | undefined> {\n\t\treturn new Promise((resolve) => {\n\t\t\tlet handle: OverlayHandle | undefined;\n\t\t\tconst close = () => {\n\t\t\t\thandle?.hide();\n\t\t\t\tthis.host.ui.requestRender();\n\t\t\t};\n\t\t\tconst selector = new PrimeTeamSelectorComponent(\n\t\t\t\tteams,\n\t\t\t\tcurrentTeamId,\n\t\t\t\t(team) => {\n\t\t\t\t\tclose();\n\t\t\t\t\tresolve(team);\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tclose();\n\t\t\t\t\tresolve(undefined);\n\t\t\t\t},\n\t\t\t\t{ getRows: () => this.host.ui.terminal.rows },\n\t\t\t);\n\t\t\thandle = showFullPaneOverlay(this.host.ui, selector, 78);\n\t\t});\n\t}\n\n\tprivate getPrimeInferenceDefaultTeamStatus(): string {\n\t\tconst configPath = this.host.modelRegistry.authStorage.getPrimeCliConfigPath();\n\t\tif (configPath) {\n\t\t\tlet config: ReturnType<typeof loadPrimeCliConfig>;\n\t\t\ttry {\n\t\t\t\tconfig = loadPrimeCliConfig(configPath);\n\t\t\t} catch {\n\t\t\t\treturn \"Using personal account.\";\n\t\t\t}\n\t\t\tif (config.teamIdFromEnv) {\n\t\t\t\treturn \"Using team from PRIME_TEAM_ID.\";\n\t\t\t}\n\t\t\tif (config.teamName) {\n\t\t\t\treturn `Using team \"${config.teamName}\".`;\n\t\t\t}\n\t\t\tif (config.teamId) {\n\t\t\t\treturn \"Using Prime CLI team.\";\n\t\t\t}\n\t\t}\n\t\tconst storedTeam = this.host.modelRegistry.authStorage.getPrimeInferenceTeamSelection();\n\t\tif (storedTeam) {\n\t\t\treturn `Using team \"${storedTeam.name}\".`;\n\t\t}\n\t\tif (storedTeam === null) {\n\t\t\treturn \"Using personal account.\";\n\t\t}\n\t\treturn \"Using personal account.\";\n\t}\n\n\tprivate async selectPrimeInferenceTeam(apiKey: string, dialog: LoginDialogComponent): Promise<string | undefined> {\n\t\ttry {\n\t\t\tconst config = loadPrimeCliConfig(this.host.modelRegistry.authStorage.getPrimeCliConfigPath());\n\t\t\tif (config.teamIdFromEnv) {\n\t\t\t\tthis.host.modelRegistry.authStorage.reload();\n\t\t\t\treturn \"Using team from PRIME_TEAM_ID.\";\n\t\t\t}\n\n\t\t\tdialog.showProgress(\"Loading Prime teams...\");\n\t\t\tconst teams = await fetchPrimeTeams(apiKey, config.baseUrl, { signal: dialog.signal });\n\t\t\tif (dialog.signal.aborted) {\n\t\t\t\treturn this.getPrimeInferenceDefaultTeamStatus();\n\t\t\t}\n\t\t\tif (teams.length === 0) {\n\t\t\t\tthis.host.modelRegistry.authStorage.setPrimeInferenceTeamSelection(null);\n\t\t\t\treturn \"Using personal account.\";\n\t\t\t}\n\n\t\t\tconst storedTeam = this.host.modelRegistry.authStorage.getPrimeInferenceTeamSelection();\n\t\t\tconst currentTeamId = storedTeam === null ? undefined : (storedTeam?.teamId ?? config.teamId);\n\t\t\tconst selectedTeam = await this.showPrimeTeamSelector(teams, currentTeamId);\n\t\t\tif (selectedTeam !== undefined) {\n\t\t\t\tthis.host.modelRegistry.authStorage.setPrimeInferenceTeamSelection(selectedTeam);\n\t\t\t}\n\t\t\treturn selectedTeam\n\t\t\t\t? `Using team \"${selectedTeam.name}\".`\n\t\t\t\t: selectedTeam === null\n\t\t\t\t\t? \"Using personal account.\"\n\t\t\t\t\t: this.getPrimeInferenceDefaultTeamStatus();\n\t\t} catch {\n\t\t\tthis.host.modelRegistry.authStorage.reload();\n\t\t\treturn this.getPrimeInferenceDefaultTeamStatus();\n\t\t}\n\t}\n\n\tprivate async completePrimeInferenceLogin(\n\t\tapiKey: string,\n\t\tdialog: LoginDialogComponent,\n\t\tcloseDialog: () => void,\n\t): Promise<AuthenticationResult> {\n\t\tthis.host.modelRegistry.authStorage.setPrimeInferenceApiKey(apiKey);\n\t\tconst teamStatus = await this.selectPrimeInferenceTeam(apiKey, dialog);\n\n\t\tcloseDialog();\n\t\treturn await this.completeProviderAuthentication(\n\t\t\tPRIME_INFERENCE_PROVIDER_ID,\n\t\t\tPRIME_INFERENCE_PROVIDER_NAME,\n\t\t\t\"api_key\",\n\t\t\tteamStatus,\n\t\t\t\"provider\",\n\t\t\tthis.host.modelRegistry.authStorage.getPrimeCliConfigPath() ?? getAuthPath(),\n\t\t);\n\t}\n\n\tprivate async completeAsmAgentTracesLogin(apiKey: string, closeDialog: () => void): Promise<AuthenticationResult> {\n\t\tthis.host.modelRegistry.authStorage.set(ASM_AGENT_TRACES_PROVIDER_ID, {\n\t\t\ttype: \"api_key\",\n\t\t\tkey: apiKey,\n\t\t});\n\n\t\tcloseDialog();\n\t\treturn await this.completeProviderAuthentication(\n\t\t\tASM_AGENT_TRACES_PROVIDER_ID,\n\t\t\tASM_AGENT_TRACES_PROVIDER_NAME,\n\t\t\t\"api_key\",\n\t\t);\n\t}\n\n\tasync runPrimeInferenceLogin(): Promise<AuthenticationResult> {\n\t\tconst dialog = new LoginDialogComponent(\n\t\t\tthis.host.ui,\n\t\t\tPRIME_INFERENCE_PROVIDER_ID,\n\t\t\t(_success, _message) => {},\n\t\t\tPRIME_INFERENCE_PROVIDER_NAME,\n\t\t);\n\n\t\tconst handle = showFullPaneOverlay(this.host.ui, dialog, {\n\t\t\tmaxContentWidth: 88,\n\t\t\tsuspendFullscreenMouse: true,\n\t\t});\n\n\t\tconst closeDialog = () => {\n\t\t\thandle.hide();\n\t\t\tthis.host.ui.requestRender();\n\t\t};\n\n\t\t// The browser challenge gets its own controller so a manually pasted key\n\t\t// can stop the polling without tearing down the dialog.\n\t\tconst browserAbort = new AbortController();\n\t\tconst onDialogAbort = () => browserAbort.abort();\n\t\tdialog.signal.addEventListener(\"abort\", onDialogAbort, { once: true });\n\n\t\tlet manualInputArmed = false;\n\t\tlet resolveManualKey: (entry: { apiKey: string; source: \"manual\" }) => void = () => {};\n\t\tconst manualKeyEntry = new Promise<{ apiKey: string; source: \"manual\" }>((resolve) => {\n\t\t\tresolveManualKey = resolve;\n\t\t});\n\t\tconst armManualInput = (prompt: string): void => {\n\t\t\tmanualInputArmed = true;\n\t\t\tvoid (async () => {\n\t\t\t\tlet value = (await dialog.showManualInput(prompt)).trim();\n\t\t\t\twhile (!value) {\n\t\t\t\t\tvalue = (await dialog.waitForInput()).trim();\n\t\t\t\t}\n\t\t\t\tresolveManualKey({ apiKey: value, source: \"manual\" });\n\t\t\t})().catch(() => {\n\t\t\t\t// Cancellation surfaces through the dialog signal.\n\t\t\t});\n\t\t};\n\n\t\ttry {\n\t\t\tconst browserLogin = loginPrimeInference(\n\t\t\t\t{\n\t\t\t\t\tonAuth: (info) => {\n\t\t\t\t\t\tdialog.showAuth(info.url, info.instructions);\n\t\t\t\t\t\tarmManualInput(\"Complete the sign-in in your browser, or paste an API key below:\");\n\t\t\t\t\t},\n\t\t\t\t\tonProgress: (message) => {\n\t\t\t\t\t\tdialog.showProgress(message);\n\t\t\t\t\t},\n\t\t\t\t\tsignal: browserAbort.signal,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tconfigPath: this.host.modelRegistry.authStorage.getPrimeCliConfigPath(),\n\t\t\t\t},\n\t\t\t);\n\t\t\t// When the browser challenge cannot start or breaks down, keep the dialog\n\t\t\t// open and fall back to plain API key entry instead of failing outright.\n\t\t\tconst browserLoginOrFallback = browserLogin.catch((error: unknown) => {\n\t\t\t\tif (browserAbort.signal.aborted) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\t\tdialog.showProgress(`Browser sign-in unavailable (${errorMsg}).`);\n\t\t\t\tif (!manualInputArmed) {\n\t\t\t\t\tarmManualInput(\"Paste a Prime API key below:\");\n\t\t\t\t}\n\t\t\t\treturn manualKeyEntry;\n\t\t\t});\n\t\t\t// Once the browser flow has settled into manual fallback, nothing above\n\t\t\t// rejects on cancel anymore, so the dialog signal must end the race too.\n\t\t\tconst dialogCancelled = new Promise<never>((_, reject) => {\n\t\t\t\tdialog.signal.addEventListener(\"abort\", () => reject(new Error(\"Login cancelled\")), { once: true });\n\t\t\t});\n\t\t\t// Promise.race observes the rejections below, but keep dedicated handlers\n\t\t\t// so neither an aborted browser flow nor a cancelled dialog can surface\n\t\t\t// as an unhandled rejection.\n\t\t\tbrowserLoginOrFallback.catch(() => {});\n\t\t\tdialogCancelled.catch(() => {});\n\n\t\t\tconst result = await Promise.race([browserLoginOrFallback, manualKeyEntry, dialogCancelled]);\n\t\t\tif (dialog.signal.aborted) {\n\t\t\t\tcloseDialog();\n\t\t\t\treturn { status: \"cancelled\" };\n\t\t\t}\n\n\t\t\tif (result.source === \"manual\") {\n\t\t\t\tbrowserAbort.abort();\n\t\t\t\tdialog.showProgress(\"Checking Prime Inference access...\");\n\t\t\t\tconst config = loadPrimeCliConfig(this.host.modelRegistry.authStorage.getPrimeCliConfigPath());\n\t\t\t\tconst access = await checkPrimeInferenceAccess(result.apiKey, config.baseUrl, { signal: dialog.signal });\n\t\t\t\tif (dialog.signal.aborted) {\n\t\t\t\t\tcloseDialog();\n\t\t\t\t\treturn { status: \"cancelled\" };\n\t\t\t\t}\n\t\t\t\tif (!access.ok) {\n\t\t\t\t\tconst status = access.status === undefined ? \"\" : `HTTP ${access.status}: `;\n\t\t\t\t\tthrow new Error(`Prime API key does not have Prime Inference access (${status}${access.message})`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn await this.completePrimeInferenceLogin(result.apiKey, dialog, closeDialog);\n\t\t} catch (error: unknown) {\n\t\t\tcloseDialog();\n\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\tif (!dialog.signal.aborted && errorMsg !== \"Login cancelled\") {\n\t\t\t\tthis.host.showError(`Failed to login to ${PRIME_INFERENCE_PROVIDER_NAME}: ${errorMsg}`);\n\t\t\t\treturn { status: \"failed\" };\n\t\t\t}\n\t\t\treturn { status: \"cancelled\" };\n\t\t} finally {\n\t\t\tdialog.signal.removeEventListener(\"abort\", onDialogAbort);\n\t\t}\n\t}\n\n\tasync runAsmAgentTracesLogin(): Promise<AuthenticationResult> {\n\t\tconst dialog = new LoginDialogComponent(\n\t\t\tthis.host.ui,\n\t\t\tASM_AGENT_TRACES_PROVIDER_ID,\n\t\t\t(_success, _message) => {},\n\t\t\tASM_AGENT_TRACES_PROVIDER_NAME,\n\t\t);\n\n\t\tconst handle = showFullPaneOverlay(this.host.ui, dialog, {\n\t\t\tmaxContentWidth: 88,\n\t\t\tsuspendFullscreenMouse: true,\n\t\t});\n\n\t\tconst closeDialog = () => {\n\t\t\thandle.hide();\n\t\t\tthis.host.ui.requestRender();\n\t\t};\n\n\t\tconst browserAbort = new AbortController();\n\t\tconst onDialogAbort = () => browserAbort.abort();\n\t\tdialog.signal.addEventListener(\"abort\", onDialogAbort, { once: true });\n\n\t\tlet manualInputArmed = false;\n\t\tlet resolveManualKey: (entry: { apiKey: string; source: \"manual\" }) => void = () => {};\n\t\tconst manualKeyEntry = new Promise<{ apiKey: string; source: \"manual\" }>((resolve) => {\n\t\t\tresolveManualKey = resolve;\n\t\t});\n\t\tconst armManualInput = (prompt: string): void => {\n\t\t\tmanualInputArmed = true;\n\t\t\tvoid (async () => {\n\t\t\t\tlet value = (await dialog.showManualInput(prompt)).trim();\n\t\t\t\twhile (!value) {\n\t\t\t\t\tvalue = (await dialog.waitForInput()).trim();\n\t\t\t\t}\n\t\t\t\tresolveManualKey({ apiKey: value, source: \"manual\" });\n\t\t\t})().catch(() => {\n\t\t\t\t// Cancellation surfaces through the dialog signal.\n\t\t\t});\n\t\t};\n\n\t\ttry {\n\t\t\tconst browserLogin = loginAsmAgentTraces({\n\t\t\t\tonAuth: (info) => {\n\t\t\t\t\tdialog.showAuth(info.url, info.instructions);\n\t\t\t\t\tarmManualInput(\"Complete the sign-in in your browser, or paste a Prime API key below:\");\n\t\t\t\t},\n\t\t\t\tonProgress: (message) => {\n\t\t\t\t\tdialog.showProgress(message);\n\t\t\t\t},\n\t\t\t\tsignal: browserAbort.signal,\n\t\t\t});\n\t\t\tconst browserLoginOrFallback = browserLogin.catch((error: unknown) => {\n\t\t\t\tif (browserAbort.signal.aborted) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\t\tdialog.showProgress(`Browser sign-in unavailable (${errorMsg}).`);\n\t\t\t\tif (!manualInputArmed) {\n\t\t\t\t\tarmManualInput(\"Paste a Prime API key below:\");\n\t\t\t\t}\n\t\t\t\treturn manualKeyEntry;\n\t\t\t});\n\t\t\tconst dialogCancelled = new Promise<never>((_, reject) => {\n\t\t\t\tdialog.signal.addEventListener(\"abort\", () => reject(new Error(\"Login cancelled\")), { once: true });\n\t\t\t});\n\t\t\tbrowserLoginOrFallback.catch(() => {});\n\t\t\tdialogCancelled.catch(() => {});\n\n\t\t\tconst result = await Promise.race([browserLoginOrFallback, manualKeyEntry, dialogCancelled]);\n\t\t\tif (dialog.signal.aborted) {\n\t\t\t\tcloseDialog();\n\t\t\t\treturn { status: \"cancelled\" };\n\t\t\t}\n\n\t\t\tif (result.source === \"manual\") {\n\t\t\t\tbrowserAbort.abort();\n\t\t\t\tdialog.showProgress(\"Checking ASM Agent trace access...\");\n\t\t\t\tconst access = await checkAsmAgentTracesAccess(result.apiKey, resolveAsmAgentTracesBaseUrl(), {\n\t\t\t\t\tsignal: dialog.signal,\n\t\t\t\t});\n\t\t\t\tif (dialog.signal.aborted) {\n\t\t\t\t\tcloseDialog();\n\t\t\t\t\treturn { status: \"cancelled\" };\n\t\t\t\t}\n\t\t\t\tif (!access.ok) {\n\t\t\t\t\tconst status = access.status === undefined ? \"\" : `HTTP ${access.status}: `;\n\t\t\t\t\tthrow new Error(`Prime API key does not have ASM Agent trace access (${status}${access.message})`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn await this.completeAsmAgentTracesLogin(result.apiKey, closeDialog);\n\t\t} catch (error: unknown) {\n\t\t\tcloseDialog();\n\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\tif (!dialog.signal.aborted && errorMsg !== \"Login cancelled\") {\n\t\t\t\tthis.host.showError(`Failed to login to ${ASM_AGENT_TRACES_PROVIDER_NAME}: ${errorMsg}`);\n\t\t\t\treturn { status: \"failed\" };\n\t\t\t}\n\t\t\treturn { status: \"cancelled\" };\n\t\t} finally {\n\t\t\tdialog.signal.removeEventListener(\"abort\", onDialogAbort);\n\t\t}\n\t}\n\n\tprivate async showApiKeyLoginDialog(\n\t\tproviderId: string,\n\t\tproviderName: string,\n\t\tkind: \"provider\" | \"service\" = \"provider\",\n\t): Promise<AuthenticationResult> {\n\t\tconst dialog = new LoginDialogComponent(this.host.ui, providerId, (_success, _message) => {}, providerName);\n\n\t\tconst handle = showFullPaneOverlay(this.host.ui, dialog, 88);\n\n\t\tconst closeDialog = () => {\n\t\t\thandle.hide();\n\t\t\tthis.host.ui.requestRender();\n\t\t};\n\n\t\ttry {\n\t\t\tconst apiKey = (await dialog.showPrompt(\"Enter API key:\")).trim();\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(\"API key cannot be empty.\");\n\t\t\t}\n\n\t\t\tthis.host.modelRegistry.authStorage.set(providerId, { type: \"api_key\", key: apiKey });\n\n\t\t\tcloseDialog();\n\t\t\treturn await this.completeProviderAuthentication(providerId, providerName, \"api_key\", undefined, kind);\n\t\t} catch (error: unknown) {\n\t\t\tcloseDialog();\n\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\tif (errorMsg !== \"Login cancelled\") {\n\t\t\t\tthis.host.showError(`Failed to save API key for ${providerName}: ${errorMsg}`);\n\t\t\t\treturn { status: \"failed\" };\n\t\t\t}\n\t\t\treturn { status: \"cancelled\" };\n\t\t}\n\t}\n\n\tprivate showOAuthLoginSelect(dialogHandle: OverlayHandle, prompt: OAuthSelectPrompt): Promise<string | undefined> {\n\t\treturn new Promise((resolve) => {\n\t\t\tdialogHandle.setHidden(true);\n\t\t\tlet selectorHandle: OverlayHandle | undefined;\n\t\t\tconst restoreDialog = () => {\n\t\t\t\tselectorHandle?.hide();\n\t\t\t\tdialogHandle.setHidden(false);\n\t\t\t\tdialogHandle.focus();\n\t\t\t\tthis.host.ui.requestRender();\n\t\t\t};\n\t\t\tconst labels = prompt.options.map((option) => option.label);\n\t\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\t\tprompt.message,\n\t\t\t\tlabels,\n\t\t\t\t(optionLabel) => {\n\t\t\t\t\trestoreDialog();\n\t\t\t\t\tresolve(prompt.options.find((option) => option.label === optionLabel)?.id);\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\trestoreDialog();\n\t\t\t\t\tresolve(undefined);\n\t\t\t\t},\n\t\t\t\t{ getRows: () => this.host.ui.terminal.rows },\n\t\t\t);\n\t\t\tselectorHandle = showFullPaneOverlay(this.host.ui, selector, 76);\n\t\t});\n\t}\n\n\tprivate async showLoginDialog(\n\t\tproviderId: string,\n\t\tproviderName: string,\n\t\tkind: \"provider\" | \"service\" = \"provider\",\n\t): Promise<AuthenticationResult> {\n\t\tconst providerInfo = this.host.modelRegistry.authStorage\n\t\t\t.getOAuthProviders()\n\t\t\t.find((provider) => provider.id === providerId);\n\n\t\tconst usesCallbackServer = providerInfo?.usesCallbackServer ?? false;\n\n\t\tconst dialog = new LoginDialogComponent(this.host.ui, providerId, (_success, _message) => {}, providerName);\n\n\t\tconst dialogHandle = showFullPaneOverlay(this.host.ui, dialog, {\n\t\t\tmaxContentWidth: 88,\n\t\t\tsuspendFullscreenMouse: true,\n\t\t});\n\n\t\tlet manualCodeResolve: ((code: string) => void) | undefined;\n\t\tlet manualCodeReject: ((err: Error) => void) | undefined;\n\t\tconst manualCodePromise = new Promise<string>((resolve, reject) => {\n\t\t\tmanualCodeResolve = resolve;\n\t\t\tmanualCodeReject = reject;\n\t\t});\n\n\t\tconst closeDialog = () => {\n\t\t\tdialogHandle.hide();\n\t\t\tthis.host.ui.requestRender();\n\t\t};\n\n\t\ttry {\n\t\t\tawait this.host.modelRegistry.authStorage.login(providerId as OAuthProviderId, {\n\t\t\t\tonAuth: (info: { url: string; instructions?: string }) => {\n\t\t\t\t\tdialog.showAuth(info.url, info.instructions);\n\n\t\t\t\t\tif (usesCallbackServer) {\n\t\t\t\t\t\tdialog\n\t\t\t\t\t\t\t.showManualInput(\"Paste redirect URL below, or complete login in browser:\")\n\t\t\t\t\t\t\t.then((value) => {\n\t\t\t\t\t\t\t\tif (value && manualCodeResolve) {\n\t\t\t\t\t\t\t\t\tmanualCodeResolve(value);\n\t\t\t\t\t\t\t\t\tmanualCodeResolve = undefined;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t\tif (manualCodeReject) {\n\t\t\t\t\t\t\t\t\tmanualCodeReject(new Error(\"Login cancelled\"));\n\t\t\t\t\t\t\t\t\tmanualCodeReject = undefined;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t} else if (providerId === \"github-copilot\") {\n\t\t\t\t\t\tdialog.showWaiting(\"Waiting for browser authentication...\");\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tonPrompt: async (prompt: { message: string; placeholder?: string }) => {\n\t\t\t\t\treturn dialog.showPrompt(prompt.message, prompt.placeholder);\n\t\t\t\t},\n\n\t\t\t\tonProgress: (message: string) => {\n\t\t\t\t\tdialog.showProgress(message);\n\t\t\t\t},\n\n\t\t\t\tonSelect: (prompt: OAuthSelectPrompt) => this.showOAuthLoginSelect(dialogHandle, prompt),\n\n\t\t\t\tonManualCodeInput: () => manualCodePromise,\n\n\t\t\t\tsignal: dialog.signal,\n\t\t\t});\n\n\t\t\tcloseDialog();\n\t\t\treturn await this.completeProviderAuthentication(providerId, providerName, \"oauth\", undefined, kind);\n\t\t} catch (error: unknown) {\n\t\t\tcloseDialog();\n\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\tif (errorMsg !== \"Login cancelled\") {\n\t\t\t\tthis.host.showError(`Failed to login to ${providerName}: ${errorMsg}`);\n\t\t\t\treturn { status: \"failed\" };\n\t\t\t}\n\t\t\treturn { status: \"cancelled\" };\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"auth-flows.js","sourceRoot":"","sources":["../../../src/modes/interactive/auth-flows.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from \"node:path\";\nimport { getProviders, type OAuthProviderId, type OAuthSelectPrompt } from \"@asm-agent/ai\";\nimport type { OverlayHandle, TUI } from \"@asm-agent/tui\";\nimport { getAuthPath, getDocsPath } from \"../../config.js\";\nimport type { ModelRegistry } from \"../../core/model-registry.js\";\nimport {\n\tcheckPrimeInferenceAccess,\n\tfetchPrimeTeams,\n\tloadPrimeCliConfig,\n\tloginPrimeInference,\n\tPRIME_INFERENCE_PROVIDER_ID,\n\tPRIME_INFERENCE_PROVIDER_NAME,\n\ttype PrimeTeam,\n} from \"../../core/prime-inference-auth.js\";\nimport { BUILT_IN_PROVIDER_DISPLAY_NAMES } from \"../../core/provider-display-names.js\";\nimport { SERPER_CREDENTIAL_ID, SERPER_CREDENTIAL_NAME } from \"../../core/websearch-credential.js\";\nimport { showFullPaneOverlay } from \"./components/centered-overlay.js\";\nimport { ExtensionSelectorComponent } from \"./components/extension-selector.js\";\nimport { LoginDialogComponent } from \"./components/login-dialog.js\";\nimport {\n\ttype AuthSelectorCategory,\n\ttype AuthSelectorProvider,\n\tcompareAuthSelectorProviders,\n\tOAuthSelectorComponent,\n} from \"./components/oauth-selector.js\";\nimport { PrimeTeamSelectorComponent } from \"./components/prime-team-selector.js\";\nimport { theme } from \"./theme/theme.js\";\n\nexport type AuthenticationResult =\n\t| {\n\t\t\tstatus: \"success\";\n\t\t\tproviderId: string;\n\t\t\tproviderName: string;\n\t\t\tauthType: \"oauth\" | \"api_key\";\n\t\t\t/** \"service\" credentials (e.g. web search) don't affect model selection. */\n\t\t\tkind?: \"provider\" | \"service\";\n\t }\n\t| { status: \"cancelled\" }\n\t| { status: \"failed\" };\n\nexport const BEDROCK_PROVIDER_ID = \"amazon-bedrock\";\nexport const ASM_AGENT_LOGIN_PROVIDER_IDS = new Set([\"openai-codex\", \"anthropic\"]);\n\nexport const ANTHROPIC_SUBSCRIPTION_AUTH_WARNING =\n\t\"Anthropic subscription auth is active. Third-party harness usage draws from extra usage and is billed per token, not your Claude plan limits. Manage extra usage at https://claude.ai/settings/usage.\";\n\nfunction isAnthropicSubscriptionAuthKey(apiKey: string | undefined): boolean {\n\treturn typeof apiKey === \"string\" && apiKey.startsWith(\"sk-ant-oat\");\n}\n\nexport async function getAnthropicSubscriptionAuthWarning(\n\tmodelRegistry: ModelRegistry,\n\tmodel: { provider: string } | undefined,\n): Promise<string | undefined> {\n\tif (!model || model.provider !== \"anthropic\") {\n\t\treturn undefined;\n\t}\n\n\tconst storedCredential = modelRegistry.authStorage.get(\"anthropic\");\n\tif (storedCredential?.type === \"oauth\") {\n\t\treturn ANTHROPIC_SUBSCRIPTION_AUTH_WARNING;\n\t}\n\n\ttry {\n\t\tconst apiKey = await modelRegistry.getApiKeyForProvider(model.provider);\n\t\tif (isAnthropicSubscriptionAuthKey(apiKey)) {\n\t\t\treturn ANTHROPIC_SUBSCRIPTION_AUTH_WARNING;\n\t\t}\n\t} catch {\n\t\t// Ignore auth lookup failures for warning-only checks.\n\t}\n\treturn undefined;\n}\n\nconst BUILT_IN_MODEL_PROVIDERS = new Set<string>(getProviders());\n\nexport function isApiKeyLoginProvider(\n\tproviderId: string,\n\toauthProviderIds: ReadonlySet<string>,\n\tbuiltInProviderIds: ReadonlySet<string> = BUILT_IN_MODEL_PROVIDERS,\n): boolean {\n\tif (BUILT_IN_PROVIDER_DISPLAY_NAMES[providerId]) {\n\t\treturn true;\n\t}\n\tif (builtInProviderIds.has(providerId)) {\n\t\treturn false;\n\t}\n\treturn !oauthProviderIds.has(providerId);\n}\n\nexport interface ProviderAuthFlowsHost {\n\treadonly ui: TUI;\n\treadonly modelRegistry: ModelRegistry;\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n\t/** Models currently visible to the host; used to detect providers configured via external credentials. */\n\tgetAvailableModels(): Promise<ReadonlyArray<{ provider: string }>>;\n\t/** Invoked after stored credentials change so the host can refresh dependent UI. */\n\tonAuthChanged?(): void | Promise<void>;\n\t/** Invoked after a successful login (e.g. to surface billing warnings). */\n\tonLoginCompleted?(): void;\n}\n\nexport interface ProviderLoginOptions {\n\tauthType?: \"oauth\" | \"api_key\";\n\tinitialCategory?: AuthSelectorCategory;\n}\n\n/** Shared auth dialogs: host-specific refresh and billing effects remain outside the flow. */\nexport class ProviderAuthFlows {\n\tconstructor(private readonly host: ProviderAuthFlowsHost) {}\n\n\t/**\n\t * Run the OAuth login flow for an MCP integration server.\n\t *\n\t * The provider must already be registered (the McpManager does this as\n\t * `mcp:<server>`). On success the credentials land in auth.json and the\n\t * caller should reload resources so the integration's skill enables.\n\t */\n\trunMcpLogin(server: string, label?: string): Promise<AuthenticationResult> {\n\t\tconst providerId = `mcp:${server}`;\n\t\tconst provider = this.host.modelRegistry.authStorage.getOAuthProviders().find((p) => p.id === providerId);\n\t\tif (!provider) {\n\t\t\tthis.host.showError(`Unknown MCP integration: ${server}`);\n\t\t\treturn Promise.resolve({ status: \"failed\" });\n\t\t}\n\t\treturn this.showLoginDialog(providerId, label ?? provider.name, \"service\");\n\t}\n\n\trunLogin(options: ProviderLoginOptions = {}): Promise<AuthenticationResult> {\n\t\tconst { authType, initialCategory } = options;\n\t\tconst providerOptions = this.getLoginProviderOptions(authType);\n\t\tif (providerOptions.length === 0) {\n\t\t\tthis.host.showStatus(\n\t\t\t\tauthType === \"oauth\"\n\t\t\t\t\t? \"No subscription providers available.\"\n\t\t\t\t\t: authType === \"api_key\"\n\t\t\t\t\t\t? \"No API key providers available.\"\n\t\t\t\t\t\t: \"No providers available.\",\n\t\t\t);\n\t\t\treturn Promise.resolve({ status: \"failed\" });\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tlet handle: OverlayHandle | undefined;\n\t\t\tconst close = () => {\n\t\t\t\thandle?.hide();\n\t\t\t\tthis.host.ui.requestRender();\n\t\t\t};\n\t\t\tconst selector = new OAuthSelectorComponent(\n\t\t\t\t\"login\",\n\t\t\t\tthis.host.modelRegistry.authStorage,\n\t\t\t\tproviderOptions,\n\t\t\t\tasync (providerOption: AuthSelectorProvider) => {\n\t\t\t\t\tclose();\n\t\t\t\t\tresolve(await this.loginProvider(providerOption));\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tclose();\n\t\t\t\t\tresolve({ status: \"cancelled\" });\n\t\t\t\t},\n\t\t\t\t(providerId) => this.host.modelRegistry.getProviderAuthStatus(providerId),\n\t\t\t\t{ getRows: () => this.host.ui.terminal.rows, initialCategory },\n\t\t\t);\n\t\t\thandle = showFullPaneOverlay(this.host.ui, selector, 78);\n\t\t});\n\t}\n\n\tloginProvider(providerOption: AuthSelectorProvider): Promise<AuthenticationResult> {\n\t\tconst kind = providerOption.category === \"service\" ? \"service\" : \"provider\";\n\t\tif (providerOption.authType === \"oauth\") {\n\t\t\treturn this.showLoginDialog(providerOption.id, providerOption.name, kind);\n\t\t}\n\t\tif (providerOption.id === PRIME_INFERENCE_PROVIDER_ID) {\n\t\t\treturn this.runPrimeInferenceLogin();\n\t\t}\n\t\tif (providerOption.id === BEDROCK_PROVIDER_ID) {\n\t\t\treturn this.showBedrockSetupDialog(providerOption.id, providerOption.name);\n\t\t}\n\t\treturn this.showApiKeyLoginDialog(providerOption.id, providerOption.name, kind);\n\t}\n\n\trunLogout(): Promise<string | null> {\n\t\tconst providerOptions = this.getLogoutProviderOptions();\n\t\tif (providerOptions.length === 0) {\n\t\t\tthis.host.showStatus(\n\t\t\t\t\"No stored credentials to remove. /logout only removes credentials saved by /login; environment variables and models.json config are unchanged.\",\n\t\t\t);\n\t\t\treturn Promise.resolve(null);\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tlet handle: OverlayHandle | undefined;\n\t\t\tconst close = () => {\n\t\t\t\thandle?.hide();\n\t\t\t\tthis.host.ui.requestRender();\n\t\t\t};\n\t\t\tconst selector = new OAuthSelectorComponent(\n\t\t\t\t\"logout\",\n\t\t\t\tthis.host.modelRegistry.authStorage,\n\t\t\t\tproviderOptions,\n\t\t\t\tasync (providerOption: AuthSelectorProvider) => {\n\t\t\t\t\tclose();\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.host.modelRegistry.authStorage.logout(providerOption.id);\n\t\t\t\t\t\tthis.host.modelRegistry.refresh();\n\t\t\t\t\t\tawait this.host.onAuthChanged?.();\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\tproviderOption.authType === \"oauth\"\n\t\t\t\t\t\t\t\t? `Logged out of ${providerOption.name}`\n\t\t\t\t\t\t\t\t: `Removed stored API key for ${providerOption.name}. Environment variables and models.json config are unchanged.`;\n\t\t\t\t\t\tthis.host.showStatus(message);\n\t\t\t\t\t\tresolve(providerOption.id);\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tthis.host.showError(`Logout failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\t\t\tresolve(null);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tclose();\n\t\t\t\t\tresolve(null);\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\t{ getRows: () => this.host.ui.terminal.rows },\n\t\t\t);\n\t\t\thandle = showFullPaneOverlay(this.host.ui, selector, 78);\n\t\t});\n\t}\n\n\tgetLoginProviderOptions(authType?: \"oauth\" | \"api_key\"): AuthSelectorProvider[] {\n\t\tconst authStorage = this.host.modelRegistry.authStorage;\n\t\tif (authType === \"api_key\") {\n\t\t\treturn [];\n\t\t}\n\t\tconst oauthProviders = authStorage\n\t\t\t.getOAuthProviders()\n\t\t\t.filter((provider) => ASM_AGENT_LOGIN_PROVIDER_IDS.has(provider.id));\n\t\tconst options: AuthSelectorProvider[] = oauthProviders.map((provider) => ({\n\t\t\tid: provider.id,\n\t\t\tname: provider.name,\n\t\t\tauthType: \"oauth\",\n\t\t}));\n\n\t\treturn options.sort(compareAuthSelectorProviders);\n\t}\n\n\tprivate getLogoutProviderOptions(): AuthSelectorProvider[] {\n\t\tconst authStorage = this.host.modelRegistry.authStorage;\n\t\tconst options: AuthSelectorProvider[] = [];\n\n\t\tconst oauthProvidersById = new Map(authStorage.getOAuthProviders().map((p) => [p.id, p]));\n\t\tfor (const providerId of authStorage.list()) {\n\t\t\tconst credential = authStorage.get(providerId);\n\t\t\tif (!credential) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isSerper = providerId === SERPER_CREDENTIAL_ID;\n\t\t\tconst isMcp = providerId.startsWith(\"mcp:\");\n\t\t\tconst name = isSerper\n\t\t\t\t? SERPER_CREDENTIAL_NAME\n\t\t\t\t: isMcp\n\t\t\t\t\t? (oauthProvidersById.get(providerId)?.name ?? providerId.slice(\"mcp:\".length))\n\t\t\t\t\t: this.host.modelRegistry.getProviderDisplayName(providerId);\n\t\t\toptions.push({\n\t\t\t\tid: providerId,\n\t\t\t\tname,\n\t\t\t\tauthType: credential.type,\n\t\t\t\tcategory: isSerper || isMcp ? \"service\" : \"provider\",\n\t\t\t});\n\t\t}\n\n\t\tif (!options.some((option) => option.id === PRIME_INFERENCE_PROVIDER_ID)) {\n\t\t\tconst primeInferenceStatus = authStorage.getAuthStatus(PRIME_INFERENCE_PROVIDER_ID);\n\t\t\tif (primeInferenceStatus.source === \"prime_cli\") {\n\t\t\t\toptions.push({\n\t\t\t\t\tid: PRIME_INFERENCE_PROVIDER_ID,\n\t\t\t\t\tname: PRIME_INFERENCE_PROVIDER_NAME,\n\t\t\t\t\tauthType: \"api_key\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn options.sort((a, b) => a.name.localeCompare(b.name));\n\t}\n\n\tprivate async completeProviderAuthentication(\n\t\tproviderId: string,\n\t\tproviderName: string,\n\t\tauthType: \"oauth\" | \"api_key\",\n\t\tstatusSuffix?: string,\n\t\tkind: \"provider\" | \"service\" = \"provider\",\n\t\tcredentialPath: string = getAuthPath(),\n\t): Promise<AuthenticationResult> {\n\t\tthis.host.modelRegistry.refresh();\n\n\t\tconst actionLabel = authType === \"oauth\" ? `Logged in to ${providerName}` : `Saved API key for ${providerName}`;\n\t\tawait this.host.onAuthChanged?.();\n\t\tthis.host.showStatus(\n\t\t\t`${actionLabel}. Credentials saved to ${credentialPath}${statusSuffix ? `. ${statusSuffix}` : \"\"}`,\n\t\t);\n\t\tthis.host.onLoginCompleted?.();\n\t\treturn {\n\t\t\tstatus: \"success\",\n\t\t\tproviderId,\n\t\t\tproviderName,\n\t\t\tauthType,\n\t\t\tkind,\n\t\t};\n\t}\n\n\tprivate async completeExternalProviderSetup(\n\t\tproviderId: string,\n\t\tproviderName: string,\n\t): Promise<AuthenticationResult> {\n\t\tthis.host.modelRegistry.refresh();\n\t\tawait this.host.onAuthChanged?.();\n\t\tthis.host.showStatus(`${providerName} uses external credentials. Select a model after configuring them.`);\n\t\treturn {\n\t\t\tstatus: \"success\",\n\t\t\tproviderId,\n\t\t\tproviderName,\n\t\t\tauthType: \"api_key\",\n\t\t};\n\t}\n\n\tprivate async hasAvailableProviderModels(providerId: string): Promise<boolean> {\n\t\tconst models = await this.host.getAvailableModels();\n\t\treturn models.some((model) => model.provider === providerId);\n\t}\n\n\tprivate async showBedrockSetupDialog(providerId: string, providerName: string): Promise<AuthenticationResult> {\n\t\tconst dialog = new LoginDialogComponent(this.host.ui, providerId, () => {}, providerName, \"Amazon Bedrock setup\");\n\t\tconst handle = showFullPaneOverlay(this.host.ui, dialog, 88);\n\t\tconst closeDialog = () => {\n\t\t\thandle.hide();\n\t\t\tthis.host.ui.requestRender();\n\t\t};\n\n\t\ttry {\n\t\t\tawait dialog.showContinueInfo([\n\t\t\t\ttheme.fg(\"text\", \"Amazon Bedrock uses AWS credentials instead of a single API key.\"),\n\t\t\t\ttheme.fg(\"text\", \"Configure an AWS profile, IAM keys, bearer token, or role-based credentials.\"),\n\t\t\t\ttheme.fg(\"muted\", \"See:\"),\n\t\t\t\ttheme.fg(\"accent\", ` ${path.join(getDocsPath(), \"providers.md\")}`),\n\t\t\t]);\n\t\t\tcloseDialog();\n\t\t\tif (!(await this.hasAvailableProviderModels(providerId))) {\n\t\t\t\tthis.host.showStatus(`${providerName} credentials were not detected. Configure them, then reopen /model.`);\n\t\t\t\treturn { status: \"cancelled\" };\n\t\t\t}\n\t\t\treturn await this.completeExternalProviderSetup(providerId, providerName);\n\t\t} catch (error: unknown) {\n\t\t\tcloseDialog();\n\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\tif (errorMsg !== \"Login cancelled\") {\n\t\t\t\tthis.host.showError(`Failed to set up ${providerName}: ${errorMsg}`);\n\t\t\t\treturn { status: \"failed\" };\n\t\t\t}\n\t\t\treturn { status: \"cancelled\" };\n\t\t}\n\t}\n\n\tprivate showPrimeTeamSelector(\n\t\tteams: PrimeTeam[],\n\t\tcurrentTeamId: string | undefined,\n\t): Promise<PrimeTeam | null | undefined> {\n\t\treturn new Promise((resolve) => {\n\t\t\tlet handle: OverlayHandle | undefined;\n\t\t\tconst close = () => {\n\t\t\t\thandle?.hide();\n\t\t\t\tthis.host.ui.requestRender();\n\t\t\t};\n\t\t\tconst selector = new PrimeTeamSelectorComponent(\n\t\t\t\tteams,\n\t\t\t\tcurrentTeamId,\n\t\t\t\t(team) => {\n\t\t\t\t\tclose();\n\t\t\t\t\tresolve(team);\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tclose();\n\t\t\t\t\tresolve(undefined);\n\t\t\t\t},\n\t\t\t\t{ getRows: () => this.host.ui.terminal.rows },\n\t\t\t);\n\t\t\thandle = showFullPaneOverlay(this.host.ui, selector, 78);\n\t\t});\n\t}\n\n\tprivate getPrimeInferenceDefaultTeamStatus(): string {\n\t\tconst configPath = this.host.modelRegistry.authStorage.getPrimeCliConfigPath();\n\t\tif (configPath) {\n\t\t\tlet config: ReturnType<typeof loadPrimeCliConfig>;\n\t\t\ttry {\n\t\t\t\tconfig = loadPrimeCliConfig(configPath);\n\t\t\t} catch {\n\t\t\t\treturn \"Using personal account.\";\n\t\t\t}\n\t\t\tif (config.teamIdFromEnv) {\n\t\t\t\treturn \"Using team from PRIME_TEAM_ID.\";\n\t\t\t}\n\t\t\tif (config.teamName) {\n\t\t\t\treturn `Using team \"${config.teamName}\".`;\n\t\t\t}\n\t\t\tif (config.teamId) {\n\t\t\t\treturn \"Using Prime CLI team.\";\n\t\t\t}\n\t\t}\n\t\tconst storedTeam = this.host.modelRegistry.authStorage.getPrimeInferenceTeamSelection();\n\t\tif (storedTeam) {\n\t\t\treturn `Using team \"${storedTeam.name}\".`;\n\t\t}\n\t\tif (storedTeam === null) {\n\t\t\treturn \"Using personal account.\";\n\t\t}\n\t\treturn \"Using personal account.\";\n\t}\n\n\tprivate async selectPrimeInferenceTeam(apiKey: string, dialog: LoginDialogComponent): Promise<string | undefined> {\n\t\ttry {\n\t\t\tconst config = loadPrimeCliConfig(this.host.modelRegistry.authStorage.getPrimeCliConfigPath());\n\t\t\tif (config.teamIdFromEnv) {\n\t\t\t\tthis.host.modelRegistry.authStorage.reload();\n\t\t\t\treturn \"Using team from PRIME_TEAM_ID.\";\n\t\t\t}\n\n\t\t\tdialog.showProgress(\"Loading Prime teams...\");\n\t\t\tconst teams = await fetchPrimeTeams(apiKey, config.baseUrl, { signal: dialog.signal });\n\t\t\tif (dialog.signal.aborted) {\n\t\t\t\treturn this.getPrimeInferenceDefaultTeamStatus();\n\t\t\t}\n\t\t\tif (teams.length === 0) {\n\t\t\t\tthis.host.modelRegistry.authStorage.setPrimeInferenceTeamSelection(null);\n\t\t\t\treturn \"Using personal account.\";\n\t\t\t}\n\n\t\t\tconst storedTeam = this.host.modelRegistry.authStorage.getPrimeInferenceTeamSelection();\n\t\t\tconst currentTeamId = storedTeam === null ? undefined : (storedTeam?.teamId ?? config.teamId);\n\t\t\tconst selectedTeam = await this.showPrimeTeamSelector(teams, currentTeamId);\n\t\t\tif (selectedTeam !== undefined) {\n\t\t\t\tthis.host.modelRegistry.authStorage.setPrimeInferenceTeamSelection(selectedTeam);\n\t\t\t}\n\t\t\treturn selectedTeam\n\t\t\t\t? `Using team \"${selectedTeam.name}\".`\n\t\t\t\t: selectedTeam === null\n\t\t\t\t\t? \"Using personal account.\"\n\t\t\t\t\t: this.getPrimeInferenceDefaultTeamStatus();\n\t\t} catch {\n\t\t\tthis.host.modelRegistry.authStorage.reload();\n\t\t\treturn this.getPrimeInferenceDefaultTeamStatus();\n\t\t}\n\t}\n\n\tprivate async completePrimeInferenceLogin(\n\t\tapiKey: string,\n\t\tdialog: LoginDialogComponent,\n\t\tcloseDialog: () => void,\n\t): Promise<AuthenticationResult> {\n\t\tthis.host.modelRegistry.authStorage.setPrimeInferenceApiKey(apiKey);\n\t\tconst teamStatus = await this.selectPrimeInferenceTeam(apiKey, dialog);\n\n\t\tcloseDialog();\n\t\treturn await this.completeProviderAuthentication(\n\t\t\tPRIME_INFERENCE_PROVIDER_ID,\n\t\t\tPRIME_INFERENCE_PROVIDER_NAME,\n\t\t\t\"api_key\",\n\t\t\tteamStatus,\n\t\t\t\"provider\",\n\t\t\tthis.host.modelRegistry.authStorage.getPrimeCliConfigPath() ?? getAuthPath(),\n\t\t);\n\t}\n\n\tasync runPrimeInferenceLogin(): Promise<AuthenticationResult> {\n\t\tconst dialog = new LoginDialogComponent(\n\t\t\tthis.host.ui,\n\t\t\tPRIME_INFERENCE_PROVIDER_ID,\n\t\t\t(_success, _message) => {},\n\t\t\tPRIME_INFERENCE_PROVIDER_NAME,\n\t\t);\n\n\t\tconst handle = showFullPaneOverlay(this.host.ui, dialog, {\n\t\t\tmaxContentWidth: 88,\n\t\t\tsuspendFullscreenMouse: true,\n\t\t});\n\n\t\tconst closeDialog = () => {\n\t\t\thandle.hide();\n\t\t\tthis.host.ui.requestRender();\n\t\t};\n\n\t\t// The browser challenge gets its own controller so a manually pasted key\n\t\t// can stop the polling without tearing down the dialog.\n\t\tconst browserAbort = new AbortController();\n\t\tconst onDialogAbort = () => browserAbort.abort();\n\t\tdialog.signal.addEventListener(\"abort\", onDialogAbort, { once: true });\n\n\t\tlet manualInputArmed = false;\n\t\tlet resolveManualKey: (entry: { apiKey: string; source: \"manual\" }) => void = () => {};\n\t\tconst manualKeyEntry = new Promise<{ apiKey: string; source: \"manual\" }>((resolve) => {\n\t\t\tresolveManualKey = resolve;\n\t\t});\n\t\tconst armManualInput = (prompt: string): void => {\n\t\t\tmanualInputArmed = true;\n\t\t\tvoid (async () => {\n\t\t\t\tlet value = (await dialog.showManualInput(prompt)).trim();\n\t\t\t\twhile (!value) {\n\t\t\t\t\tvalue = (await dialog.waitForInput()).trim();\n\t\t\t\t}\n\t\t\t\tresolveManualKey({ apiKey: value, source: \"manual\" });\n\t\t\t})().catch(() => {\n\t\t\t\t// Cancellation surfaces through the dialog signal.\n\t\t\t});\n\t\t};\n\n\t\ttry {\n\t\t\tconst browserLogin = loginPrimeInference(\n\t\t\t\t{\n\t\t\t\t\tonAuth: (info) => {\n\t\t\t\t\t\tdialog.showAuth(info.url, info.instructions);\n\t\t\t\t\t\tarmManualInput(\"Complete the sign-in in your browser, or paste an API key below:\");\n\t\t\t\t\t},\n\t\t\t\t\tonProgress: (message) => {\n\t\t\t\t\t\tdialog.showProgress(message);\n\t\t\t\t\t},\n\t\t\t\t\tsignal: browserAbort.signal,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tconfigPath: this.host.modelRegistry.authStorage.getPrimeCliConfigPath(),\n\t\t\t\t},\n\t\t\t);\n\t\t\t// When the browser challenge cannot start or breaks down, keep the dialog\n\t\t\t// open and fall back to plain API key entry instead of failing outright.\n\t\t\tconst browserLoginOrFallback = browserLogin.catch((error: unknown) => {\n\t\t\t\tif (browserAbort.signal.aborted) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\t\tdialog.showProgress(`Browser sign-in unavailable (${errorMsg}).`);\n\t\t\t\tif (!manualInputArmed) {\n\t\t\t\t\tarmManualInput(\"Paste a Prime API key below:\");\n\t\t\t\t}\n\t\t\t\treturn manualKeyEntry;\n\t\t\t});\n\t\t\t// Once the browser flow has settled into manual fallback, nothing above\n\t\t\t// rejects on cancel anymore, so the dialog signal must end the race too.\n\t\t\tconst dialogCancelled = new Promise<never>((_, reject) => {\n\t\t\t\tdialog.signal.addEventListener(\"abort\", () => reject(new Error(\"Login cancelled\")), { once: true });\n\t\t\t});\n\t\t\t// Promise.race observes the rejections below, but keep dedicated handlers\n\t\t\t// so neither an aborted browser flow nor a cancelled dialog can surface\n\t\t\t// as an unhandled rejection.\n\t\t\tbrowserLoginOrFallback.catch(() => {});\n\t\t\tdialogCancelled.catch(() => {});\n\n\t\t\tconst result = await Promise.race([browserLoginOrFallback, manualKeyEntry, dialogCancelled]);\n\t\t\tif (dialog.signal.aborted) {\n\t\t\t\tcloseDialog();\n\t\t\t\treturn { status: \"cancelled\" };\n\t\t\t}\n\n\t\t\tif (result.source === \"manual\") {\n\t\t\t\tbrowserAbort.abort();\n\t\t\t\tdialog.showProgress(\"Checking Prime Inference access...\");\n\t\t\t\tconst config = loadPrimeCliConfig(this.host.modelRegistry.authStorage.getPrimeCliConfigPath());\n\t\t\t\tconst access = await checkPrimeInferenceAccess(result.apiKey, config.baseUrl, { signal: dialog.signal });\n\t\t\t\tif (dialog.signal.aborted) {\n\t\t\t\t\tcloseDialog();\n\t\t\t\t\treturn { status: \"cancelled\" };\n\t\t\t\t}\n\t\t\t\tif (!access.ok) {\n\t\t\t\t\tconst status = access.status === undefined ? \"\" : `HTTP ${access.status}: `;\n\t\t\t\t\tthrow new Error(`Prime API key does not have Prime Inference access (${status}${access.message})`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn await this.completePrimeInferenceLogin(result.apiKey, dialog, closeDialog);\n\t\t} catch (error: unknown) {\n\t\t\tcloseDialog();\n\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\tif (!dialog.signal.aborted && errorMsg !== \"Login cancelled\") {\n\t\t\t\tthis.host.showError(`Failed to login to ${PRIME_INFERENCE_PROVIDER_NAME}: ${errorMsg}`);\n\t\t\t\treturn { status: \"failed\" };\n\t\t\t}\n\t\t\treturn { status: \"cancelled\" };\n\t\t} finally {\n\t\t\tdialog.signal.removeEventListener(\"abort\", onDialogAbort);\n\t\t}\n\t}\n\n\tprivate async showApiKeyLoginDialog(\n\t\tproviderId: string,\n\t\tproviderName: string,\n\t\tkind: \"provider\" | \"service\" = \"provider\",\n\t): Promise<AuthenticationResult> {\n\t\tconst dialog = new LoginDialogComponent(this.host.ui, providerId, (_success, _message) => {}, providerName);\n\n\t\tconst handle = showFullPaneOverlay(this.host.ui, dialog, 88);\n\n\t\tconst closeDialog = () => {\n\t\t\thandle.hide();\n\t\t\tthis.host.ui.requestRender();\n\t\t};\n\n\t\ttry {\n\t\t\tconst apiKey = (await dialog.showPrompt(\"Enter API key:\")).trim();\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(\"API key cannot be empty.\");\n\t\t\t}\n\n\t\t\tthis.host.modelRegistry.authStorage.set(providerId, { type: \"api_key\", key: apiKey });\n\n\t\t\tcloseDialog();\n\t\t\treturn await this.completeProviderAuthentication(providerId, providerName, \"api_key\", undefined, kind);\n\t\t} catch (error: unknown) {\n\t\t\tcloseDialog();\n\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\tif (errorMsg !== \"Login cancelled\") {\n\t\t\t\tthis.host.showError(`Failed to save API key for ${providerName}: ${errorMsg}`);\n\t\t\t\treturn { status: \"failed\" };\n\t\t\t}\n\t\t\treturn { status: \"cancelled\" };\n\t\t}\n\t}\n\n\tprivate showOAuthLoginSelect(dialogHandle: OverlayHandle, prompt: OAuthSelectPrompt): Promise<string | undefined> {\n\t\treturn new Promise((resolve) => {\n\t\t\tdialogHandle.setHidden(true);\n\t\t\tlet selectorHandle: OverlayHandle | undefined;\n\t\t\tconst restoreDialog = () => {\n\t\t\t\tselectorHandle?.hide();\n\t\t\t\tdialogHandle.setHidden(false);\n\t\t\t\tdialogHandle.focus();\n\t\t\t\tthis.host.ui.requestRender();\n\t\t\t};\n\t\t\tconst labels = prompt.options.map((option) => option.label);\n\t\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\t\tprompt.message,\n\t\t\t\tlabels,\n\t\t\t\t(optionLabel) => {\n\t\t\t\t\trestoreDialog();\n\t\t\t\t\tresolve(prompt.options.find((option) => option.label === optionLabel)?.id);\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\trestoreDialog();\n\t\t\t\t\tresolve(undefined);\n\t\t\t\t},\n\t\t\t\t{ getRows: () => this.host.ui.terminal.rows },\n\t\t\t);\n\t\t\tselectorHandle = showFullPaneOverlay(this.host.ui, selector, 76);\n\t\t});\n\t}\n\n\tprivate async showLoginDialog(\n\t\tproviderId: string,\n\t\tproviderName: string,\n\t\tkind: \"provider\" | \"service\" = \"provider\",\n\t): Promise<AuthenticationResult> {\n\t\tconst providerInfo = this.host.modelRegistry.authStorage\n\t\t\t.getOAuthProviders()\n\t\t\t.find((provider) => provider.id === providerId);\n\n\t\tconst usesCallbackServer = providerInfo?.usesCallbackServer ?? false;\n\n\t\tconst dialog = new LoginDialogComponent(this.host.ui, providerId, (_success, _message) => {}, providerName);\n\n\t\tconst dialogHandle = showFullPaneOverlay(this.host.ui, dialog, {\n\t\t\tmaxContentWidth: 88,\n\t\t\tsuspendFullscreenMouse: true,\n\t\t});\n\n\t\tlet manualCodeResolve: ((code: string) => void) | undefined;\n\t\tlet manualCodeReject: ((err: Error) => void) | undefined;\n\t\tconst manualCodePromise = new Promise<string>((resolve, reject) => {\n\t\t\tmanualCodeResolve = resolve;\n\t\t\tmanualCodeReject = reject;\n\t\t});\n\n\t\tconst closeDialog = () => {\n\t\t\tdialogHandle.hide();\n\t\t\tthis.host.ui.requestRender();\n\t\t};\n\n\t\ttry {\n\t\t\tawait this.host.modelRegistry.authStorage.login(providerId as OAuthProviderId, {\n\t\t\t\tonAuth: (info: { url: string; instructions?: string }) => {\n\t\t\t\t\tdialog.showAuth(info.url, info.instructions);\n\n\t\t\t\t\tif (usesCallbackServer) {\n\t\t\t\t\t\tdialog\n\t\t\t\t\t\t\t.showManualInput(\"Paste redirect URL below, or complete login in browser:\")\n\t\t\t\t\t\t\t.then((value) => {\n\t\t\t\t\t\t\t\tif (value && manualCodeResolve) {\n\t\t\t\t\t\t\t\t\tmanualCodeResolve(value);\n\t\t\t\t\t\t\t\t\tmanualCodeResolve = undefined;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t\tif (manualCodeReject) {\n\t\t\t\t\t\t\t\t\tmanualCodeReject(new Error(\"Login cancelled\"));\n\t\t\t\t\t\t\t\t\tmanualCodeReject = undefined;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t} else if (providerId === \"github-copilot\") {\n\t\t\t\t\t\tdialog.showWaiting(\"Waiting for browser authentication...\");\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tonPrompt: async (prompt: { message: string; placeholder?: string }) => {\n\t\t\t\t\treturn dialog.showPrompt(prompt.message, prompt.placeholder);\n\t\t\t\t},\n\n\t\t\t\tonProgress: (message: string) => {\n\t\t\t\t\tdialog.showProgress(message);\n\t\t\t\t},\n\n\t\t\t\tonSelect: (prompt: OAuthSelectPrompt) => this.showOAuthLoginSelect(dialogHandle, prompt),\n\n\t\t\t\tonManualCodeInput: () => manualCodePromise,\n\n\t\t\t\tsignal: dialog.signal,\n\t\t\t});\n\n\t\t\tcloseDialog();\n\t\t\treturn await this.completeProviderAuthentication(providerId, providerName, \"oauth\", undefined, kind);\n\t\t} catch (error: unknown) {\n\t\t\tcloseDialog();\n\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\tif (errorMsg !== \"Login cancelled\") {\n\t\t\t\tthis.host.showError(`Failed to login to ${providerName}: ${errorMsg}`);\n\t\t\t\treturn { status: \"failed\" };\n\t\t\t}\n\t\t\treturn { status: \"cancelled\" };\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { AssistantMessage } from "@asm-agent/ai";
|
|
2
2
|
import { Container, type MarkdownTheme } from "@asm-agent/tui";
|
|
3
|
+
import type { MermaidMarkdownTransform } from "./mermaid.js";
|
|
3
4
|
export interface AssistantMessageComponentOptions {
|
|
4
5
|
expanded?: boolean;
|
|
5
6
|
precededByToolActivity?: boolean;
|
|
7
|
+
/** Replaces Mermaid code blocks in assistant text (never thinking) with Unicode diagrams. */
|
|
8
|
+
mermaidTransform?: MermaidMarkdownTransform;
|
|
6
9
|
}
|
|
7
10
|
/**
|
|
8
11
|
* One-line recap for a collapsed thinking block: the last bold section header
|
|
@@ -31,13 +34,15 @@ export declare class AssistantMessageComponent extends Container {
|
|
|
31
34
|
private blockMarkdowns;
|
|
32
35
|
private lastBlockTexts;
|
|
33
36
|
private precededByToolActivity;
|
|
37
|
+
private mermaidTransform?;
|
|
38
|
+
private isStreaming;
|
|
34
39
|
constructor(message?: AssistantMessage, hideThinkingBlock?: boolean, markdownTheme?: MarkdownTheme, hiddenThinkingLabel?: string, options?: AssistantMessageComponentOptions);
|
|
35
40
|
invalidate(): void;
|
|
36
41
|
setHideThinkingBlock(hide: boolean): void;
|
|
37
42
|
setHiddenThinkingLabel(label: string): void;
|
|
38
43
|
setExpanded(expanded: boolean): void;
|
|
39
44
|
render(width: number): string[];
|
|
40
|
-
updateContent(message: AssistantMessage): void;
|
|
45
|
+
updateContent(message: AssistantMessage, isStreaming?: boolean): void;
|
|
41
46
|
/**
|
|
42
47
|
* Everything that affects child component identity/order, but not the text
|
|
43
48
|
* inside a block. While the signature is stable, updates reduce to setText()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistant-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/assistant-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAEN,SAAS,EAET,KAAK,aAAa,EAKlB,MAAM,gBAAgB,CAAC;AAgBxB,MAAM,WAAW,gCAAgC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CACjC;AAwCD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,CAgBxF;AAcD;;;;;;;GAOG;AACH,qBAAa,yBAA0B,SAAQ,SAAS;IACvD,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,WAAW,CAAC,CAAmB;IACvC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,sBAAsB,CAAU;IAExC,YACC,OAAO,CAAC,EAAE,gBAAgB,EAC1B,iBAAiB,UAAQ,EACzB,aAAa,GAAE,aAAkC,EACjD,mBAAmB,SAAgB,EACnC,OAAO,GAAE,gCAAqC,EAiB9C;IAEQ,UAAU,IAAI,IAAI,CAK1B;IAED,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAGxC;IAED,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAG1C;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAKnC;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAevC;IAED,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAG7C;IAED;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA4BxB,OAAO,CAAC,SAAS;IA6BjB,OAAO,CAAC,OAAO;IAwFf,OAAO,CAAC,oBAAoB;CAoB5B","sourcesContent":["import type { AssistantMessage } from \"@asm-agent/ai\";\nimport {\n\ttype Component,\n\tContainer,\n\tMarkdown,\n\ttype MarkdownTheme,\n\tSpacer,\n\tText,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@asm-agent/tui\";\nimport { LOGIN_RECOVERY_MESSAGE } from \"../../../core/auth-guidance.js\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport {\n\tCollapsibleErrorComponent,\n\tnormalizeErrorDetails,\n\tshouldCollapseErrorDetails,\n\tsummarizeErrorDetails,\n} from \"./collapsible-error.js\";\nimport { expandCollapseHint } from \"./keybinding-hints.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\nconst OSC133_ZONE_FINAL = \"\\x1b]133;C\\x07\";\nconst LOGIN_RECOVERY_SUFFIX = `\\n\\n${LOGIN_RECOVERY_MESSAGE}`;\n\nexport interface AssistantMessageComponentOptions {\n\texpanded?: boolean;\n\tprecededByToolActivity?: boolean;\n}\n\nfunction getThinkingMarkdownTheme(baseTheme: MarkdownTheme): MarkdownTheme {\n\tconst quiet = (text: string) => theme.fg(\"thinkingText\", text);\n\treturn {\n\t\t...baseTheme,\n\t\theading: quiet,\n\t\tlink: quiet,\n\t\tlinkUrl: quiet,\n\t\tcode: quiet,\n\t\tcodeBlock: quiet,\n\t\tcodeBlockBorder: quiet,\n\t\tquote: quiet,\n\t\tquoteBorder: quiet,\n\t\thr: quiet,\n\t\tlistBullet: quiet,\n\t\thighlightCode: (code: string) => code.split(\"\\n\").map((line) => quiet(line)),\n\t};\n}\n\n/** Single collapsed-thinking row that truncates the recap to the render width instead of wrapping. */\nclass CollapsedThinkingRow implements Component {\n\tconstructor(\n\t\tprivate readonly label: string,\n\t\tprivate readonly recap: string,\n\t\tprivate readonly hint: string,\n\t) {}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(1, width);\n\t\tconst separator = theme.fg(\"dim\", \" · \");\n\t\tconst fixedWidth = visibleWidth(` ${this.label}${separator} ${this.hint}`);\n\t\tconst recapWidth = Math.max(8, safeWidth - fixedWidth);\n\t\tconst recap = theme.fg(\"thinkingText\", truncateToWidth(this.recap, recapWidth));\n\t\treturn [truncateToWidth(` ${this.label}${separator}${recap} ${this.hint}`, safeWidth, \"\")];\n\t}\n\n\tinvalidate(): void {}\n}\n\n/**\n * One-line recap for a collapsed thinking block: the last bold section header\n * when the trace has one (reasoning summaries usually do), otherwise the first\n * non-empty line, stripped of markdown emphasis and truncated.\n */\nexport function thinkingRecap(thinking: string, fallback: string, maxWidth = 120): string {\n\tconst lines = thinking\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line.length > 0);\n\tconst lastHeader = [...lines].reverse().find((line) => /^\\*\\*[^*]+\\*\\*:?$/.test(line) || /^#{1,6}\\s+\\S/.test(line));\n\tconst source = lastHeader ?? lines[0] ?? fallback;\n\tconst plain = source\n\t\t.replace(/^#{1,6}\\s+/, \"\")\n\t\t.replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\")\n\t\t.replace(/\\*([^*]+)\\*/g, \"$1\")\n\t\t.replace(/`([^`]+)`/g, \"$1\")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.replace(/:$/, \"\")\n\t\t.trim();\n\treturn truncateToWidth(plain || fallback, Math.max(20, maxWidth));\n}\n\nfunction formatInlineLoginRecoveryMessage(message: string): string | undefined {\n\tconst normalized = normalizeErrorDetails(message);\n\tif (!normalized.endsWith(LOGIN_RECOVERY_SUFFIX)) {\n\t\treturn undefined;\n\t}\n\tconst base = normalized.slice(0, -LOGIN_RECOVERY_SUFFIX.length).trimEnd();\n\tif (!base || shouldCollapseErrorDetails(base)) {\n\t\treturn undefined;\n\t}\n\treturn `${base} · ${LOGIN_RECOVERY_MESSAGE}`;\n}\n\n/**\n * Component that renders a complete assistant message.\n *\n * Streaming sends one updateContent() per token, so content updates are\n * reconciled lazily at render time (at most once per frame): when the block\n * structure is unchanged, only the text of changed blocks is updated in place,\n * preserving each Markdown child's render cache instead of rebuilding the tree.\n */\nexport class AssistantMessageComponent extends Container {\n\tprivate contentContainer: Container;\n\tprivate hideThinkingBlock: boolean;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate hiddenThinkingLabel: string;\n\tprivate lastMessage?: AssistantMessage;\n\tprivate hasToolCalls = false;\n\tprivate expanded = false;\n\tprivate dirty = false;\n\tprivate lastSignature?: string;\n\tprivate blockMarkdowns = new Map<number, Markdown>();\n\tprivate lastBlockTexts = new Map<number, string>();\n\tprivate precededByToolActivity: boolean;\n\n\tconstructor(\n\t\tmessage?: AssistantMessage,\n\t\thideThinkingBlock = false,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t\thiddenThinkingLabel = \"Thinking...\",\n\t\toptions: AssistantMessageComponentOptions = {},\n\t) {\n\t\tsuper();\n\n\t\tthis.hideThinkingBlock = hideThinkingBlock;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.hiddenThinkingLabel = hiddenThinkingLabel;\n\t\tthis.expanded = options.expanded ?? false;\n\t\tthis.precededByToolActivity = options.precededByToolActivity ?? false;\n\n\t\t// Container for text/thinking content\n\t\tthis.contentContainer = new Container();\n\t\tthis.addChild(this.contentContainer);\n\n\t\tif (message) {\n\t\t\tthis.updateContent(message);\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\t// Force a full rebuild so theme-dependent children are recreated.\n\t\tthis.lastSignature = undefined;\n\t\tthis.dirty = true;\n\t}\n\n\tsetHideThinkingBlock(hide: boolean): void {\n\t\tthis.hideThinkingBlock = hide;\n\t\tthis.dirty = true;\n\t}\n\n\tsetHiddenThinkingLabel(label: string): void {\n\t\tthis.hiddenThinkingLabel = label;\n\t\tthis.dirty = true;\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this.expanded !== expanded) {\n\t\t\tthis.expanded = expanded;\n\t\t\tthis.dirty = true;\n\t\t}\n\t}\n\n\toverride render(width: number): string[] {\n\t\tif (this.dirty) {\n\t\t\tif (this.lastMessage) {\n\t\t\t\tthis.reconcile(this.lastMessage);\n\t\t\t}\n\t\t\tthis.dirty = false;\n\t\t}\n\t\tconst lines = super.render(width);\n\t\tif (this.hasToolCalls || lines.length === 0) {\n\t\t\treturn lines;\n\t\t}\n\n\t\tlines[0] = OSC133_ZONE_START + lines[0];\n\t\tlines[lines.length - 1] = OSC133_ZONE_END + OSC133_ZONE_FINAL + lines[lines.length - 1];\n\t\treturn lines;\n\t}\n\n\tupdateContent(message: AssistantMessage): void {\n\t\tthis.lastMessage = message;\n\t\tthis.dirty = true;\n\t}\n\n\t/**\n\t * Everything that affects child component identity/order, but not the text\n\t * inside a block. While the signature is stable, updates reduce to setText()\n\t * on changed blocks; any structural change triggers a full rebuild.\n\t */\n\tprivate computeSignature(message: AssistantMessage): string {\n\t\tconst parts: string[] = [];\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst content = message.content[i];\n\t\t\tif (content?.type === \"text\") {\n\t\t\t\tparts.push(`${i}:text:${content.text.trim() ? 1 : 0}`);\n\t\t\t} else if (content?.type === \"thinking\") {\n\t\t\t\tparts.push(`${i}:thinking:${content.thinking.trim() ? 1 : 0}`);\n\t\t\t\tif (this.hideThinkingBlock && content.thinking.trim()) {\n\t\t\t\t\t// The collapsed row bakes the recap into a static line, so a recap\n\t\t\t\t\t// change must count as a structural change during streaming.\n\t\t\t\t\t// JSON-encode the free text so it cannot forge part boundaries.\n\t\t\t\t\tparts.push(`${i}:recap:${JSON.stringify(thinkingRecap(content.thinking, this.hiddenThinkingLabel))}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparts.push(`${i}:${content?.type ?? \"invalid\"}`);\n\t\t\t}\n\t\t}\n\t\tparts.push(\n\t\t\t`hide:${this.hideThinkingBlock}`,\n\t\t\t`label:${this.hiddenThinkingLabel}`,\n\t\t\t`expanded:${this.expanded}`,\n\t\t\t`stop:${message.stopReason ?? \"\"}`,\n\t\t\t`error:${message.errorMessage ?? \"\"}`,\n\t\t);\n\t\treturn parts.join(\"|\");\n\t}\n\n\tprivate reconcile(message: AssistantMessage): void {\n\t\tconst signature = this.computeSignature(message);\n\t\tif (signature !== this.lastSignature) {\n\t\t\tthis.lastSignature = signature;\n\t\t\tthis.rebuild(message);\n\t\t\treturn;\n\t\t}\n\n\t\t// Structure unchanged: update only blocks whose text changed (during\n\t\t// streaming that is just the final block).\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst markdown = this.blockMarkdowns.get(i);\n\t\t\tif (!markdown) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst content = message.content[i];\n\t\t\tconst text =\n\t\t\t\tcontent?.type === \"text\"\n\t\t\t\t\t? content.text.trim()\n\t\t\t\t\t: content?.type === \"thinking\"\n\t\t\t\t\t\t? content.thinking.trim()\n\t\t\t\t\t\t: \"\";\n\t\t\tif (this.lastBlockTexts.get(i) !== text) {\n\t\t\t\tmarkdown.setText(text);\n\t\t\t\tthis.lastBlockTexts.set(i, text);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rebuild(message: AssistantMessage): void {\n\t\t// Clear content container\n\t\tthis.contentContainer.clear();\n\t\tthis.blockMarkdowns.clear();\n\t\tthis.lastBlockTexts.clear();\n\n\t\tconst hasVisibleContent = message.content.some(\n\t\t\t(c) => (c?.type === \"text\" && c.text.trim()) || (c?.type === \"thinking\" && c.thinking.trim()),\n\t\t);\n\n\t\tif (hasVisibleContent) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\t// Render content in order\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst content = message.content[i];\n\t\t\tif (content?.type === \"text\" && content.text.trim()) {\n\t\t\t\t// Assistant text messages with no background - trim the text\n\t\t\t\t// Set paddingY=0 to avoid extra spacing before tool executions\n\t\t\t\tconst markdown = new Markdown(content.text.trim(), 1, 0, this.markdownTheme);\n\t\t\t\tthis.blockMarkdowns.set(i, markdown);\n\t\t\t\tthis.lastBlockTexts.set(i, content.text.trim());\n\t\t\t\tthis.contentContainer.addChild(markdown);\n\t\t\t} else if (content?.type === \"thinking\" && content.thinking.trim()) {\n\t\t\t\t// Add spacing only when another visible assistant content block follows.\n\t\t\t\t// This avoids a superfluous blank line before separately-rendered tool execution blocks.\n\t\t\t\tconst hasVisibleContentAfter = message.content\n\t\t\t\t\t.slice(i + 1)\n\t\t\t\t\t.some((c) => (c?.type === \"text\" && c.text.trim()) || (c?.type === \"thinking\" && c.thinking.trim()));\n\n\t\t\t\tconst thinkingLabel = theme.bold(theme.fg(\"thinkingText\", this.hiddenThinkingLabel));\n\t\t\t\tif (this.hideThinkingBlock) {\n\t\t\t\t\t// Collapsed row: bold label, a one-line recap of the trace, and the\n\t\t\t\t\t// hint. The row truncates the recap to the render width so it never\n\t\t\t\t\t// wraps onto a second line on narrow terminals.\n\t\t\t\t\tconst recap = thinkingRecap(content.thinking, this.hiddenThinkingLabel);\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew CollapsedThinkingRow(thinkingLabel, recap, expandCollapseHint(\"app.thinking.toggle\", false)),\n\t\t\t\t\t);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Expanded: the same label line with the collapse hint, then the trace.\n\t\t\t\t\t// Thinking traces keep Markdown structure but stay visually quiet.\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew Text(`${thinkingLabel} ${expandCollapseHint(\"app.thinking.toggle\", true)}`, 1, 0),\n\t\t\t\t\t);\n\t\t\t\t\tconst markdown = new Markdown(\n\t\t\t\t\t\tcontent.thinking.trim(),\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tgetThinkingMarkdownTheme(this.markdownTheme),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcolor: (text: string) => theme.fg(\"thinkingText\", text),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tthis.blockMarkdowns.set(i, markdown);\n\t\t\t\t\tthis.lastBlockTexts.set(i, content.thinking.trim());\n\t\t\t\t\tthis.contentContainer.addChild(markdown);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst hasToolCalls = message.content.some((c) => c?.type === \"toolCall\");\n\t\tthis.hasToolCalls = hasToolCalls;\n\t\tif (message.stopReason === \"aborted\") {\n\t\t\tconst abortMessage =\n\t\t\t\tmessage.errorMessage && message.errorMessage !== \"Request was aborted\"\n\t\t\t\t\t? message.errorMessage\n\t\t\t\t\t: \"Operation aborted\";\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\tthis.contentContainer.addChild(this.createErrorComponent(abortMessage));\n\t\t} else if (!hasToolCalls && message.stopReason === \"error\") {\n\t\t\tconst errorMsg = message.errorMessage || \"Unknown error\";\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\tthis.contentContainer.addChild(this.createErrorComponent(errorMsg, \"Error\"));\n\t\t}\n\n\t\tif (hasToolCalls && (hasVisibleContent || message.stopReason === \"aborted\" || !this.precededByToolActivity)) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t}\n\t}\n\n\tprivate createErrorComponent(message: string, prefix?: string): Component {\n\t\tconst inlineLoginRecovery = formatInlineLoginRecoveryMessage(message);\n\t\tif (inlineLoginRecovery) {\n\t\t\tconst text = prefix ? `${prefix}: ${inlineLoginRecovery}` : inlineLoginRecovery;\n\t\t\treturn new Text(theme.fg(\"error\", text), 1, 0);\n\t\t}\n\n\t\tif (!shouldCollapseErrorDetails(message)) {\n\t\t\tconst text = prefix ? `${prefix}: ${message}` : message;\n\t\t\treturn new Text(theme.fg(\"error\", text), 1, 0);\n\t\t}\n\n\t\tconst text = prefix ? `${prefix}: ${message}` : message;\n\t\tconst summary = prefix ? `${prefix}: ${summarizeErrorDetails(message)}` : summarizeErrorDetails(message);\n\t\treturn new CollapsibleErrorComponent({\n\t\t\ttext,\n\t\t\tsummary,\n\t\t\texpanded: this.expanded,\n\t\t});\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"assistant-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/assistant-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAEN,SAAS,EAET,KAAK,aAAa,EAKlB,MAAM,gBAAgB,CAAC;AAUxB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAO7D,MAAM,WAAW,gCAAgC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,6FAA6F;IAC7F,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;CAC5C;AAwCD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,CAgBxF;AAcD;;;;;;;GAOG;AACH,qBAAa,yBAA0B,SAAQ,SAAS;IACvD,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,WAAW,CAAC,CAAmB;IACvC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,sBAAsB,CAAU;IACxC,OAAO,CAAC,gBAAgB,CAAC,CAA2B;IACpD,OAAO,CAAC,WAAW,CAAS;IAE5B,YACC,OAAO,CAAC,EAAE,gBAAgB,EAC1B,iBAAiB,UAAQ,EACzB,aAAa,GAAE,aAAkC,EACjD,mBAAmB,SAAgB,EACnC,OAAO,GAAE,gCAAqC,EAkB9C;IAEQ,UAAU,IAAI,IAAI,CAK1B;IAED,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAGxC;IAED,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAG1C;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAKnC;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAevC;IAED,aAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,WAAW,UAAmB,GAAG,IAAI,CAI7E;IAED;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,SAAS;IA6BjB,OAAO,CAAC,OAAO;IA6Ff,OAAO,CAAC,oBAAoB;CAoB5B","sourcesContent":["import type { AssistantMessage } from \"@asm-agent/ai\";\nimport {\n\ttype Component,\n\tContainer,\n\tMarkdown,\n\ttype MarkdownTheme,\n\tSpacer,\n\tText,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@asm-agent/tui\";\nimport { LOGIN_RECOVERY_MESSAGE } from \"../../../core/auth-guidance.js\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport {\n\tCollapsibleErrorComponent,\n\tnormalizeErrorDetails,\n\tshouldCollapseErrorDetails,\n\tsummarizeErrorDetails,\n} from \"./collapsible-error.js\";\nimport { expandCollapseHint } from \"./keybinding-hints.js\";\nimport type { MermaidMarkdownTransform } from \"./mermaid.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\nconst OSC133_ZONE_FINAL = \"\\x1b]133;C\\x07\";\nconst LOGIN_RECOVERY_SUFFIX = `\\n\\n${LOGIN_RECOVERY_MESSAGE}`;\n\nexport interface AssistantMessageComponentOptions {\n\texpanded?: boolean;\n\tprecededByToolActivity?: boolean;\n\t/** Replaces Mermaid code blocks in assistant text (never thinking) with Unicode diagrams. */\n\tmermaidTransform?: MermaidMarkdownTransform;\n}\n\nfunction getThinkingMarkdownTheme(baseTheme: MarkdownTheme): MarkdownTheme {\n\tconst quiet = (text: string) => theme.fg(\"thinkingText\", text);\n\treturn {\n\t\t...baseTheme,\n\t\theading: quiet,\n\t\tlink: quiet,\n\t\tlinkUrl: quiet,\n\t\tcode: quiet,\n\t\tcodeBlock: quiet,\n\t\tcodeBlockBorder: quiet,\n\t\tquote: quiet,\n\t\tquoteBorder: quiet,\n\t\thr: quiet,\n\t\tlistBullet: quiet,\n\t\thighlightCode: (code: string) => code.split(\"\\n\").map((line) => quiet(line)),\n\t};\n}\n\n/** Single collapsed-thinking row that truncates the recap to the render width instead of wrapping. */\nclass CollapsedThinkingRow implements Component {\n\tconstructor(\n\t\tprivate readonly label: string,\n\t\tprivate readonly recap: string,\n\t\tprivate readonly hint: string,\n\t) {}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(1, width);\n\t\tconst separator = theme.fg(\"dim\", \" · \");\n\t\tconst fixedWidth = visibleWidth(` ${this.label}${separator} ${this.hint}`);\n\t\tconst recapWidth = Math.max(8, safeWidth - fixedWidth);\n\t\tconst recap = theme.fg(\"thinkingText\", truncateToWidth(this.recap, recapWidth));\n\t\treturn [truncateToWidth(` ${this.label}${separator}${recap} ${this.hint}`, safeWidth, \"\")];\n\t}\n\n\tinvalidate(): void {}\n}\n\n/**\n * One-line recap for a collapsed thinking block: the last bold section header\n * when the trace has one (reasoning summaries usually do), otherwise the first\n * non-empty line, stripped of markdown emphasis and truncated.\n */\nexport function thinkingRecap(thinking: string, fallback: string, maxWidth = 120): string {\n\tconst lines = thinking\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line.length > 0);\n\tconst lastHeader = [...lines].reverse().find((line) => /^\\*\\*[^*]+\\*\\*:?$/.test(line) || /^#{1,6}\\s+\\S/.test(line));\n\tconst source = lastHeader ?? lines[0] ?? fallback;\n\tconst plain = source\n\t\t.replace(/^#{1,6}\\s+/, \"\")\n\t\t.replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\")\n\t\t.replace(/\\*([^*]+)\\*/g, \"$1\")\n\t\t.replace(/`([^`]+)`/g, \"$1\")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.replace(/:$/, \"\")\n\t\t.trim();\n\treturn truncateToWidth(plain || fallback, Math.max(20, maxWidth));\n}\n\nfunction formatInlineLoginRecoveryMessage(message: string): string | undefined {\n\tconst normalized = normalizeErrorDetails(message);\n\tif (!normalized.endsWith(LOGIN_RECOVERY_SUFFIX)) {\n\t\treturn undefined;\n\t}\n\tconst base = normalized.slice(0, -LOGIN_RECOVERY_SUFFIX.length).trimEnd();\n\tif (!base || shouldCollapseErrorDetails(base)) {\n\t\treturn undefined;\n\t}\n\treturn `${base} · ${LOGIN_RECOVERY_MESSAGE}`;\n}\n\n/**\n * Component that renders a complete assistant message.\n *\n * Streaming sends one updateContent() per token, so content updates are\n * reconciled lazily at render time (at most once per frame): when the block\n * structure is unchanged, only the text of changed blocks is updated in place,\n * preserving each Markdown child's render cache instead of rebuilding the tree.\n */\nexport class AssistantMessageComponent extends Container {\n\tprivate contentContainer: Container;\n\tprivate hideThinkingBlock: boolean;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate hiddenThinkingLabel: string;\n\tprivate lastMessage?: AssistantMessage;\n\tprivate hasToolCalls = false;\n\tprivate expanded = false;\n\tprivate dirty = false;\n\tprivate lastSignature?: string;\n\tprivate blockMarkdowns = new Map<number, Markdown>();\n\tprivate lastBlockTexts = new Map<number, string>();\n\tprivate precededByToolActivity: boolean;\n\tprivate mermaidTransform?: MermaidMarkdownTransform;\n\tprivate isStreaming = false;\n\n\tconstructor(\n\t\tmessage?: AssistantMessage,\n\t\thideThinkingBlock = false,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t\thiddenThinkingLabel = \"Thinking...\",\n\t\toptions: AssistantMessageComponentOptions = {},\n\t) {\n\t\tsuper();\n\n\t\tthis.hideThinkingBlock = hideThinkingBlock;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.hiddenThinkingLabel = hiddenThinkingLabel;\n\t\tthis.expanded = options.expanded ?? false;\n\t\tthis.precededByToolActivity = options.precededByToolActivity ?? false;\n\t\tthis.mermaidTransform = options.mermaidTransform;\n\n\t\t// Container for text/thinking content\n\t\tthis.contentContainer = new Container();\n\t\tthis.addChild(this.contentContainer);\n\n\t\tif (message) {\n\t\t\tthis.updateContent(message);\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\t// Force a full rebuild so theme-dependent children are recreated.\n\t\tthis.lastSignature = undefined;\n\t\tthis.dirty = true;\n\t}\n\n\tsetHideThinkingBlock(hide: boolean): void {\n\t\tthis.hideThinkingBlock = hide;\n\t\tthis.dirty = true;\n\t}\n\n\tsetHiddenThinkingLabel(label: string): void {\n\t\tthis.hiddenThinkingLabel = label;\n\t\tthis.dirty = true;\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this.expanded !== expanded) {\n\t\t\tthis.expanded = expanded;\n\t\t\tthis.dirty = true;\n\t\t}\n\t}\n\n\toverride render(width: number): string[] {\n\t\tif (this.dirty) {\n\t\t\tif (this.lastMessage) {\n\t\t\t\tthis.reconcile(this.lastMessage);\n\t\t\t}\n\t\t\tthis.dirty = false;\n\t\t}\n\t\tconst lines = super.render(width);\n\t\tif (this.hasToolCalls || lines.length === 0) {\n\t\t\treturn lines;\n\t\t}\n\n\t\tlines[0] = OSC133_ZONE_START + lines[0];\n\t\tlines[lines.length - 1] = OSC133_ZONE_END + OSC133_ZONE_FINAL + lines[lines.length - 1];\n\t\treturn lines;\n\t}\n\n\tupdateContent(message: AssistantMessage, isStreaming = this.isStreaming): void {\n\t\tthis.lastMessage = message;\n\t\tthis.isStreaming = isStreaming;\n\t\tthis.dirty = true;\n\t}\n\n\t/**\n\t * Everything that affects child component identity/order, but not the text\n\t * inside a block. While the signature is stable, updates reduce to setText()\n\t * on changed blocks; any structural change triggers a full rebuild.\n\t */\n\tprivate computeSignature(message: AssistantMessage): string {\n\t\tconst parts: string[] = [];\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst content = message.content[i];\n\t\t\tif (content?.type === \"text\") {\n\t\t\t\tparts.push(`${i}:text:${content.text.trim() ? 1 : 0}`);\n\t\t\t} else if (content?.type === \"thinking\") {\n\t\t\t\tparts.push(`${i}:thinking:${content.thinking.trim() ? 1 : 0}`);\n\t\t\t\tif (this.hideThinkingBlock && content.thinking.trim()) {\n\t\t\t\t\t// The collapsed row bakes the recap into a static line, so a recap\n\t\t\t\t\t// change must count as a structural change during streaming.\n\t\t\t\t\t// JSON-encode the free text so it cannot forge part boundaries.\n\t\t\t\t\tparts.push(`${i}:recap:${JSON.stringify(thinkingRecap(content.thinking, this.hiddenThinkingLabel))}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparts.push(`${i}:${content?.type ?? \"invalid\"}`);\n\t\t\t}\n\t\t}\n\t\tparts.push(\n\t\t\t`hide:${this.hideThinkingBlock}`,\n\t\t\t`label:${this.hiddenThinkingLabel}`,\n\t\t\t`expanded:${this.expanded}`,\n\t\t\t// In the signature so the streaming->final transition rebuilds (mermaid renders differently).\n\t\t\t`streaming:${this.isStreaming}`,\n\t\t\t`stop:${message.stopReason ?? \"\"}`,\n\t\t\t`error:${message.errorMessage ?? \"\"}`,\n\t\t);\n\t\treturn parts.join(\"|\");\n\t}\n\n\tprivate reconcile(message: AssistantMessage): void {\n\t\tconst signature = this.computeSignature(message);\n\t\tif (signature !== this.lastSignature) {\n\t\t\tthis.lastSignature = signature;\n\t\t\tthis.rebuild(message);\n\t\t\treturn;\n\t\t}\n\n\t\t// Structure unchanged: update only blocks whose text changed (during\n\t\t// streaming that is just the final block).\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst markdown = this.blockMarkdowns.get(i);\n\t\t\tif (!markdown) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst content = message.content[i];\n\t\t\tconst text =\n\t\t\t\tcontent?.type === \"text\"\n\t\t\t\t\t? content.text.trim()\n\t\t\t\t\t: content?.type === \"thinking\"\n\t\t\t\t\t\t? content.thinking.trim()\n\t\t\t\t\t\t: \"\";\n\t\t\tif (this.lastBlockTexts.get(i) !== text) {\n\t\t\t\tmarkdown.setText(text);\n\t\t\t\tthis.lastBlockTexts.set(i, text);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rebuild(message: AssistantMessage): void {\n\t\t// Clear content container\n\t\tthis.contentContainer.clear();\n\t\tthis.blockMarkdowns.clear();\n\t\tthis.lastBlockTexts.clear();\n\n\t\tconst hasVisibleContent = message.content.some(\n\t\t\t(c) => (c?.type === \"text\" && c.text.trim()) || (c?.type === \"thinking\" && c.thinking.trim()),\n\t\t);\n\n\t\tif (hasVisibleContent) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\t// Render content in order\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst content = message.content[i];\n\t\t\tif (content?.type === \"text\" && content.text.trim()) {\n\t\t\t\t// Assistant text messages with no background - trim the text\n\t\t\t\t// Set paddingY=0 to avoid extra spacing before tool executions\n\t\t\t\tconst mermaidTransform = this.mermaidTransform;\n\t\t\t\tconst isStreaming = this.isStreaming;\n\t\t\t\tconst markdown = new Markdown(content.text.trim(), 1, 0, this.markdownTheme, undefined, {\n\t\t\t\t\ttransform:\n\t\t\t\t\t\tmermaidTransform && ((md, availableWidth) => mermaidTransform(md, availableWidth, isStreaming)),\n\t\t\t\t});\n\t\t\t\tthis.blockMarkdowns.set(i, markdown);\n\t\t\t\tthis.lastBlockTexts.set(i, content.text.trim());\n\t\t\t\tthis.contentContainer.addChild(markdown);\n\t\t\t} else if (content?.type === \"thinking\" && content.thinking.trim()) {\n\t\t\t\t// Add spacing only when another visible assistant content block follows.\n\t\t\t\t// This avoids a superfluous blank line before separately-rendered tool execution blocks.\n\t\t\t\tconst hasVisibleContentAfter = message.content\n\t\t\t\t\t.slice(i + 1)\n\t\t\t\t\t.some((c) => (c?.type === \"text\" && c.text.trim()) || (c?.type === \"thinking\" && c.thinking.trim()));\n\n\t\t\t\tconst thinkingLabel = theme.bold(theme.fg(\"thinkingText\", this.hiddenThinkingLabel));\n\t\t\t\tif (this.hideThinkingBlock) {\n\t\t\t\t\t// Collapsed row: bold label, a one-line recap of the trace, and the\n\t\t\t\t\t// hint. The row truncates the recap to the render width so it never\n\t\t\t\t\t// wraps onto a second line on narrow terminals.\n\t\t\t\t\tconst recap = thinkingRecap(content.thinking, this.hiddenThinkingLabel);\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew CollapsedThinkingRow(thinkingLabel, recap, expandCollapseHint(\"app.thinking.toggle\", false)),\n\t\t\t\t\t);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Expanded: the same label line with the collapse hint, then the trace.\n\t\t\t\t\t// Thinking traces keep Markdown structure but stay visually quiet.\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew Text(`${thinkingLabel} ${expandCollapseHint(\"app.thinking.toggle\", true)}`, 1, 0),\n\t\t\t\t\t);\n\t\t\t\t\tconst markdown = new Markdown(\n\t\t\t\t\t\tcontent.thinking.trim(),\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tgetThinkingMarkdownTheme(this.markdownTheme),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcolor: (text: string) => theme.fg(\"thinkingText\", text),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tthis.blockMarkdowns.set(i, markdown);\n\t\t\t\t\tthis.lastBlockTexts.set(i, content.thinking.trim());\n\t\t\t\t\tthis.contentContainer.addChild(markdown);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst hasToolCalls = message.content.some((c) => c?.type === \"toolCall\");\n\t\tthis.hasToolCalls = hasToolCalls;\n\t\tif (message.stopReason === \"aborted\") {\n\t\t\tconst abortMessage =\n\t\t\t\tmessage.errorMessage && message.errorMessage !== \"Request was aborted\"\n\t\t\t\t\t? message.errorMessage\n\t\t\t\t\t: \"Operation aborted\";\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\tthis.contentContainer.addChild(this.createErrorComponent(abortMessage));\n\t\t} else if (!hasToolCalls && message.stopReason === \"error\") {\n\t\t\tconst errorMsg = message.errorMessage || \"Unknown error\";\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\tthis.contentContainer.addChild(this.createErrorComponent(errorMsg, \"Error\"));\n\t\t}\n\n\t\tif (hasToolCalls && (hasVisibleContent || message.stopReason === \"aborted\" || !this.precededByToolActivity)) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t}\n\t}\n\n\tprivate createErrorComponent(message: string, prefix?: string): Component {\n\t\tconst inlineLoginRecovery = formatInlineLoginRecoveryMessage(message);\n\t\tif (inlineLoginRecovery) {\n\t\t\tconst text = prefix ? `${prefix}: ${inlineLoginRecovery}` : inlineLoginRecovery;\n\t\t\treturn new Text(theme.fg(\"error\", text), 1, 0);\n\t\t}\n\n\t\tif (!shouldCollapseErrorDetails(message)) {\n\t\t\tconst text = prefix ? `${prefix}: ${message}` : message;\n\t\t\treturn new Text(theme.fg(\"error\", text), 1, 0);\n\t\t}\n\n\t\tconst text = prefix ? `${prefix}: ${message}` : message;\n\t\tconst summary = prefix ? `${prefix}: ${summarizeErrorDetails(message)}` : summarizeErrorDetails(message);\n\t\treturn new CollapsibleErrorComponent({\n\t\t\ttext,\n\t\t\tsummary,\n\t\t\texpanded: this.expanded,\n\t\t});\n\t}\n}\n"]}
|
|
@@ -98,6 +98,8 @@ export class AssistantMessageComponent extends Container {
|
|
|
98
98
|
blockMarkdowns = new Map();
|
|
99
99
|
lastBlockTexts = new Map();
|
|
100
100
|
precededByToolActivity;
|
|
101
|
+
mermaidTransform;
|
|
102
|
+
isStreaming = false;
|
|
101
103
|
constructor(message, hideThinkingBlock = false, markdownTheme = getMarkdownTheme(), hiddenThinkingLabel = "Thinking...", options = {}) {
|
|
102
104
|
super();
|
|
103
105
|
this.hideThinkingBlock = hideThinkingBlock;
|
|
@@ -105,6 +107,7 @@ export class AssistantMessageComponent extends Container {
|
|
|
105
107
|
this.hiddenThinkingLabel = hiddenThinkingLabel;
|
|
106
108
|
this.expanded = options.expanded ?? false;
|
|
107
109
|
this.precededByToolActivity = options.precededByToolActivity ?? false;
|
|
110
|
+
this.mermaidTransform = options.mermaidTransform;
|
|
108
111
|
// Container for text/thinking content
|
|
109
112
|
this.contentContainer = new Container();
|
|
110
113
|
this.addChild(this.contentContainer);
|
|
@@ -147,8 +150,9 @@ export class AssistantMessageComponent extends Container {
|
|
|
147
150
|
lines[lines.length - 1] = OSC133_ZONE_END + OSC133_ZONE_FINAL + lines[lines.length - 1];
|
|
148
151
|
return lines;
|
|
149
152
|
}
|
|
150
|
-
updateContent(message) {
|
|
153
|
+
updateContent(message, isStreaming = this.isStreaming) {
|
|
151
154
|
this.lastMessage = message;
|
|
155
|
+
this.isStreaming = isStreaming;
|
|
152
156
|
this.dirty = true;
|
|
153
157
|
}
|
|
154
158
|
/**
|
|
@@ -176,7 +180,9 @@ export class AssistantMessageComponent extends Container {
|
|
|
176
180
|
parts.push(`${i}:${content?.type ?? "invalid"}`);
|
|
177
181
|
}
|
|
178
182
|
}
|
|
179
|
-
parts.push(`hide:${this.hideThinkingBlock}`, `label:${this.hiddenThinkingLabel}`, `expanded:${this.expanded}`,
|
|
183
|
+
parts.push(`hide:${this.hideThinkingBlock}`, `label:${this.hiddenThinkingLabel}`, `expanded:${this.expanded}`,
|
|
184
|
+
// In the signature so the streaming->final transition rebuilds (mermaid renders differently).
|
|
185
|
+
`streaming:${this.isStreaming}`, `stop:${message.stopReason ?? ""}`, `error:${message.errorMessage ?? ""}`);
|
|
180
186
|
return parts.join("|");
|
|
181
187
|
}
|
|
182
188
|
reconcile(message) {
|
|
@@ -220,7 +226,11 @@ export class AssistantMessageComponent extends Container {
|
|
|
220
226
|
if (content?.type === "text" && content.text.trim()) {
|
|
221
227
|
// Assistant text messages with no background - trim the text
|
|
222
228
|
// Set paddingY=0 to avoid extra spacing before tool executions
|
|
223
|
-
const
|
|
229
|
+
const mermaidTransform = this.mermaidTransform;
|
|
230
|
+
const isStreaming = this.isStreaming;
|
|
231
|
+
const markdown = new Markdown(content.text.trim(), 1, 0, this.markdownTheme, undefined, {
|
|
232
|
+
transform: mermaidTransform && ((md, availableWidth) => mermaidTransform(md, availableWidth, isStreaming)),
|
|
233
|
+
});
|
|
224
234
|
this.blockMarkdowns.set(i, markdown);
|
|
225
235
|
this.lastBlockTexts.set(i, content.text.trim());
|
|
226
236
|
this.contentContainer.addChild(markdown);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistant-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/assistant-message.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@asm-agent/ai\";\nimport {\n\ttype Component,\n\tContainer,\n\tMarkdown,\n\ttype MarkdownTheme,\n\tSpacer,\n\tText,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@asm-agent/tui\";\nimport { LOGIN_RECOVERY_MESSAGE } from \"../../../core/auth-guidance.js\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport {\n\tCollapsibleErrorComponent,\n\tnormalizeErrorDetails,\n\tshouldCollapseErrorDetails,\n\tsummarizeErrorDetails,\n} from \"./collapsible-error.js\";\nimport { expandCollapseHint } from \"./keybinding-hints.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\nconst OSC133_ZONE_FINAL = \"\\x1b]133;C\\x07\";\nconst LOGIN_RECOVERY_SUFFIX = `\\n\\n${LOGIN_RECOVERY_MESSAGE}`;\n\nexport interface AssistantMessageComponentOptions {\n\texpanded?: boolean;\n\tprecededByToolActivity?: boolean;\n}\n\nfunction getThinkingMarkdownTheme(baseTheme: MarkdownTheme): MarkdownTheme {\n\tconst quiet = (text: string) => theme.fg(\"thinkingText\", text);\n\treturn {\n\t\t...baseTheme,\n\t\theading: quiet,\n\t\tlink: quiet,\n\t\tlinkUrl: quiet,\n\t\tcode: quiet,\n\t\tcodeBlock: quiet,\n\t\tcodeBlockBorder: quiet,\n\t\tquote: quiet,\n\t\tquoteBorder: quiet,\n\t\thr: quiet,\n\t\tlistBullet: quiet,\n\t\thighlightCode: (code: string) => code.split(\"\\n\").map((line) => quiet(line)),\n\t};\n}\n\n/** Single collapsed-thinking row that truncates the recap to the render width instead of wrapping. */\nclass CollapsedThinkingRow implements Component {\n\tconstructor(\n\t\tprivate readonly label: string,\n\t\tprivate readonly recap: string,\n\t\tprivate readonly hint: string,\n\t) {}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(1, width);\n\t\tconst separator = theme.fg(\"dim\", \" · \");\n\t\tconst fixedWidth = visibleWidth(` ${this.label}${separator} ${this.hint}`);\n\t\tconst recapWidth = Math.max(8, safeWidth - fixedWidth);\n\t\tconst recap = theme.fg(\"thinkingText\", truncateToWidth(this.recap, recapWidth));\n\t\treturn [truncateToWidth(` ${this.label}${separator}${recap} ${this.hint}`, safeWidth, \"\")];\n\t}\n\n\tinvalidate(): void {}\n}\n\n/**\n * One-line recap for a collapsed thinking block: the last bold section header\n * when the trace has one (reasoning summaries usually do), otherwise the first\n * non-empty line, stripped of markdown emphasis and truncated.\n */\nexport function thinkingRecap(thinking: string, fallback: string, maxWidth = 120): string {\n\tconst lines = thinking\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line.length > 0);\n\tconst lastHeader = [...lines].reverse().find((line) => /^\\*\\*[^*]+\\*\\*:?$/.test(line) || /^#{1,6}\\s+\\S/.test(line));\n\tconst source = lastHeader ?? lines[0] ?? fallback;\n\tconst plain = source\n\t\t.replace(/^#{1,6}\\s+/, \"\")\n\t\t.replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\")\n\t\t.replace(/\\*([^*]+)\\*/g, \"$1\")\n\t\t.replace(/`([^`]+)`/g, \"$1\")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.replace(/:$/, \"\")\n\t\t.trim();\n\treturn truncateToWidth(plain || fallback, Math.max(20, maxWidth));\n}\n\nfunction formatInlineLoginRecoveryMessage(message: string): string | undefined {\n\tconst normalized = normalizeErrorDetails(message);\n\tif (!normalized.endsWith(LOGIN_RECOVERY_SUFFIX)) {\n\t\treturn undefined;\n\t}\n\tconst base = normalized.slice(0, -LOGIN_RECOVERY_SUFFIX.length).trimEnd();\n\tif (!base || shouldCollapseErrorDetails(base)) {\n\t\treturn undefined;\n\t}\n\treturn `${base} · ${LOGIN_RECOVERY_MESSAGE}`;\n}\n\n/**\n * Component that renders a complete assistant message.\n *\n * Streaming sends one updateContent() per token, so content updates are\n * reconciled lazily at render time (at most once per frame): when the block\n * structure is unchanged, only the text of changed blocks is updated in place,\n * preserving each Markdown child's render cache instead of rebuilding the tree.\n */\nexport class AssistantMessageComponent extends Container {\n\tprivate contentContainer: Container;\n\tprivate hideThinkingBlock: boolean;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate hiddenThinkingLabel: string;\n\tprivate lastMessage?: AssistantMessage;\n\tprivate hasToolCalls = false;\n\tprivate expanded = false;\n\tprivate dirty = false;\n\tprivate lastSignature?: string;\n\tprivate blockMarkdowns = new Map<number, Markdown>();\n\tprivate lastBlockTexts = new Map<number, string>();\n\tprivate precededByToolActivity: boolean;\n\n\tconstructor(\n\t\tmessage?: AssistantMessage,\n\t\thideThinkingBlock = false,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t\thiddenThinkingLabel = \"Thinking...\",\n\t\toptions: AssistantMessageComponentOptions = {},\n\t) {\n\t\tsuper();\n\n\t\tthis.hideThinkingBlock = hideThinkingBlock;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.hiddenThinkingLabel = hiddenThinkingLabel;\n\t\tthis.expanded = options.expanded ?? false;\n\t\tthis.precededByToolActivity = options.precededByToolActivity ?? false;\n\n\t\t// Container for text/thinking content\n\t\tthis.contentContainer = new Container();\n\t\tthis.addChild(this.contentContainer);\n\n\t\tif (message) {\n\t\t\tthis.updateContent(message);\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\t// Force a full rebuild so theme-dependent children are recreated.\n\t\tthis.lastSignature = undefined;\n\t\tthis.dirty = true;\n\t}\n\n\tsetHideThinkingBlock(hide: boolean): void {\n\t\tthis.hideThinkingBlock = hide;\n\t\tthis.dirty = true;\n\t}\n\n\tsetHiddenThinkingLabel(label: string): void {\n\t\tthis.hiddenThinkingLabel = label;\n\t\tthis.dirty = true;\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this.expanded !== expanded) {\n\t\t\tthis.expanded = expanded;\n\t\t\tthis.dirty = true;\n\t\t}\n\t}\n\n\toverride render(width: number): string[] {\n\t\tif (this.dirty) {\n\t\t\tif (this.lastMessage) {\n\t\t\t\tthis.reconcile(this.lastMessage);\n\t\t\t}\n\t\t\tthis.dirty = false;\n\t\t}\n\t\tconst lines = super.render(width);\n\t\tif (this.hasToolCalls || lines.length === 0) {\n\t\t\treturn lines;\n\t\t}\n\n\t\tlines[0] = OSC133_ZONE_START + lines[0];\n\t\tlines[lines.length - 1] = OSC133_ZONE_END + OSC133_ZONE_FINAL + lines[lines.length - 1];\n\t\treturn lines;\n\t}\n\n\tupdateContent(message: AssistantMessage): void {\n\t\tthis.lastMessage = message;\n\t\tthis.dirty = true;\n\t}\n\n\t/**\n\t * Everything that affects child component identity/order, but not the text\n\t * inside a block. While the signature is stable, updates reduce to setText()\n\t * on changed blocks; any structural change triggers a full rebuild.\n\t */\n\tprivate computeSignature(message: AssistantMessage): string {\n\t\tconst parts: string[] = [];\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst content = message.content[i];\n\t\t\tif (content?.type === \"text\") {\n\t\t\t\tparts.push(`${i}:text:${content.text.trim() ? 1 : 0}`);\n\t\t\t} else if (content?.type === \"thinking\") {\n\t\t\t\tparts.push(`${i}:thinking:${content.thinking.trim() ? 1 : 0}`);\n\t\t\t\tif (this.hideThinkingBlock && content.thinking.trim()) {\n\t\t\t\t\t// The collapsed row bakes the recap into a static line, so a recap\n\t\t\t\t\t// change must count as a structural change during streaming.\n\t\t\t\t\t// JSON-encode the free text so it cannot forge part boundaries.\n\t\t\t\t\tparts.push(`${i}:recap:${JSON.stringify(thinkingRecap(content.thinking, this.hiddenThinkingLabel))}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparts.push(`${i}:${content?.type ?? \"invalid\"}`);\n\t\t\t}\n\t\t}\n\t\tparts.push(\n\t\t\t`hide:${this.hideThinkingBlock}`,\n\t\t\t`label:${this.hiddenThinkingLabel}`,\n\t\t\t`expanded:${this.expanded}`,\n\t\t\t`stop:${message.stopReason ?? \"\"}`,\n\t\t\t`error:${message.errorMessage ?? \"\"}`,\n\t\t);\n\t\treturn parts.join(\"|\");\n\t}\n\n\tprivate reconcile(message: AssistantMessage): void {\n\t\tconst signature = this.computeSignature(message);\n\t\tif (signature !== this.lastSignature) {\n\t\t\tthis.lastSignature = signature;\n\t\t\tthis.rebuild(message);\n\t\t\treturn;\n\t\t}\n\n\t\t// Structure unchanged: update only blocks whose text changed (during\n\t\t// streaming that is just the final block).\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst markdown = this.blockMarkdowns.get(i);\n\t\t\tif (!markdown) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst content = message.content[i];\n\t\t\tconst text =\n\t\t\t\tcontent?.type === \"text\"\n\t\t\t\t\t? content.text.trim()\n\t\t\t\t\t: content?.type === \"thinking\"\n\t\t\t\t\t\t? content.thinking.trim()\n\t\t\t\t\t\t: \"\";\n\t\t\tif (this.lastBlockTexts.get(i) !== text) {\n\t\t\t\tmarkdown.setText(text);\n\t\t\t\tthis.lastBlockTexts.set(i, text);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rebuild(message: AssistantMessage): void {\n\t\t// Clear content container\n\t\tthis.contentContainer.clear();\n\t\tthis.blockMarkdowns.clear();\n\t\tthis.lastBlockTexts.clear();\n\n\t\tconst hasVisibleContent = message.content.some(\n\t\t\t(c) => (c?.type === \"text\" && c.text.trim()) || (c?.type === \"thinking\" && c.thinking.trim()),\n\t\t);\n\n\t\tif (hasVisibleContent) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\t// Render content in order\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst content = message.content[i];\n\t\t\tif (content?.type === \"text\" && content.text.trim()) {\n\t\t\t\t// Assistant text messages with no background - trim the text\n\t\t\t\t// Set paddingY=0 to avoid extra spacing before tool executions\n\t\t\t\tconst markdown = new Markdown(content.text.trim(), 1, 0, this.markdownTheme);\n\t\t\t\tthis.blockMarkdowns.set(i, markdown);\n\t\t\t\tthis.lastBlockTexts.set(i, content.text.trim());\n\t\t\t\tthis.contentContainer.addChild(markdown);\n\t\t\t} else if (content?.type === \"thinking\" && content.thinking.trim()) {\n\t\t\t\t// Add spacing only when another visible assistant content block follows.\n\t\t\t\t// This avoids a superfluous blank line before separately-rendered tool execution blocks.\n\t\t\t\tconst hasVisibleContentAfter = message.content\n\t\t\t\t\t.slice(i + 1)\n\t\t\t\t\t.some((c) => (c?.type === \"text\" && c.text.trim()) || (c?.type === \"thinking\" && c.thinking.trim()));\n\n\t\t\t\tconst thinkingLabel = theme.bold(theme.fg(\"thinkingText\", this.hiddenThinkingLabel));\n\t\t\t\tif (this.hideThinkingBlock) {\n\t\t\t\t\t// Collapsed row: bold label, a one-line recap of the trace, and the\n\t\t\t\t\t// hint. The row truncates the recap to the render width so it never\n\t\t\t\t\t// wraps onto a second line on narrow terminals.\n\t\t\t\t\tconst recap = thinkingRecap(content.thinking, this.hiddenThinkingLabel);\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew CollapsedThinkingRow(thinkingLabel, recap, expandCollapseHint(\"app.thinking.toggle\", false)),\n\t\t\t\t\t);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Expanded: the same label line with the collapse hint, then the trace.\n\t\t\t\t\t// Thinking traces keep Markdown structure but stay visually quiet.\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew Text(`${thinkingLabel} ${expandCollapseHint(\"app.thinking.toggle\", true)}`, 1, 0),\n\t\t\t\t\t);\n\t\t\t\t\tconst markdown = new Markdown(\n\t\t\t\t\t\tcontent.thinking.trim(),\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tgetThinkingMarkdownTheme(this.markdownTheme),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcolor: (text: string) => theme.fg(\"thinkingText\", text),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tthis.blockMarkdowns.set(i, markdown);\n\t\t\t\t\tthis.lastBlockTexts.set(i, content.thinking.trim());\n\t\t\t\t\tthis.contentContainer.addChild(markdown);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst hasToolCalls = message.content.some((c) => c?.type === \"toolCall\");\n\t\tthis.hasToolCalls = hasToolCalls;\n\t\tif (message.stopReason === \"aborted\") {\n\t\t\tconst abortMessage =\n\t\t\t\tmessage.errorMessage && message.errorMessage !== \"Request was aborted\"\n\t\t\t\t\t? message.errorMessage\n\t\t\t\t\t: \"Operation aborted\";\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\tthis.contentContainer.addChild(this.createErrorComponent(abortMessage));\n\t\t} else if (!hasToolCalls && message.stopReason === \"error\") {\n\t\t\tconst errorMsg = message.errorMessage || \"Unknown error\";\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\tthis.contentContainer.addChild(this.createErrorComponent(errorMsg, \"Error\"));\n\t\t}\n\n\t\tif (hasToolCalls && (hasVisibleContent || message.stopReason === \"aborted\" || !this.precededByToolActivity)) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t}\n\t}\n\n\tprivate createErrorComponent(message: string, prefix?: string): Component {\n\t\tconst inlineLoginRecovery = formatInlineLoginRecoveryMessage(message);\n\t\tif (inlineLoginRecovery) {\n\t\t\tconst text = prefix ? `${prefix}: ${inlineLoginRecovery}` : inlineLoginRecovery;\n\t\t\treturn new Text(theme.fg(\"error\", text), 1, 0);\n\t\t}\n\n\t\tif (!shouldCollapseErrorDetails(message)) {\n\t\t\tconst text = prefix ? `${prefix}: ${message}` : message;\n\t\t\treturn new Text(theme.fg(\"error\", text), 1, 0);\n\t\t}\n\n\t\tconst text = prefix ? `${prefix}: ${message}` : message;\n\t\tconst summary = prefix ? `${prefix}: ${summarizeErrorDetails(message)}` : summarizeErrorDetails(message);\n\t\treturn new CollapsibleErrorComponent({\n\t\t\ttext,\n\t\t\tsummary,\n\t\t\texpanded: this.expanded,\n\t\t});\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"assistant-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/assistant-message.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@asm-agent/ai\";\nimport {\n\ttype Component,\n\tContainer,\n\tMarkdown,\n\ttype MarkdownTheme,\n\tSpacer,\n\tText,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@asm-agent/tui\";\nimport { LOGIN_RECOVERY_MESSAGE } from \"../../../core/auth-guidance.js\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport {\n\tCollapsibleErrorComponent,\n\tnormalizeErrorDetails,\n\tshouldCollapseErrorDetails,\n\tsummarizeErrorDetails,\n} from \"./collapsible-error.js\";\nimport { expandCollapseHint } from \"./keybinding-hints.js\";\nimport type { MermaidMarkdownTransform } from \"./mermaid.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\nconst OSC133_ZONE_FINAL = \"\\x1b]133;C\\x07\";\nconst LOGIN_RECOVERY_SUFFIX = `\\n\\n${LOGIN_RECOVERY_MESSAGE}`;\n\nexport interface AssistantMessageComponentOptions {\n\texpanded?: boolean;\n\tprecededByToolActivity?: boolean;\n\t/** Replaces Mermaid code blocks in assistant text (never thinking) with Unicode diagrams. */\n\tmermaidTransform?: MermaidMarkdownTransform;\n}\n\nfunction getThinkingMarkdownTheme(baseTheme: MarkdownTheme): MarkdownTheme {\n\tconst quiet = (text: string) => theme.fg(\"thinkingText\", text);\n\treturn {\n\t\t...baseTheme,\n\t\theading: quiet,\n\t\tlink: quiet,\n\t\tlinkUrl: quiet,\n\t\tcode: quiet,\n\t\tcodeBlock: quiet,\n\t\tcodeBlockBorder: quiet,\n\t\tquote: quiet,\n\t\tquoteBorder: quiet,\n\t\thr: quiet,\n\t\tlistBullet: quiet,\n\t\thighlightCode: (code: string) => code.split(\"\\n\").map((line) => quiet(line)),\n\t};\n}\n\n/** Single collapsed-thinking row that truncates the recap to the render width instead of wrapping. */\nclass CollapsedThinkingRow implements Component {\n\tconstructor(\n\t\tprivate readonly label: string,\n\t\tprivate readonly recap: string,\n\t\tprivate readonly hint: string,\n\t) {}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(1, width);\n\t\tconst separator = theme.fg(\"dim\", \" · \");\n\t\tconst fixedWidth = visibleWidth(` ${this.label}${separator} ${this.hint}`);\n\t\tconst recapWidth = Math.max(8, safeWidth - fixedWidth);\n\t\tconst recap = theme.fg(\"thinkingText\", truncateToWidth(this.recap, recapWidth));\n\t\treturn [truncateToWidth(` ${this.label}${separator}${recap} ${this.hint}`, safeWidth, \"\")];\n\t}\n\n\tinvalidate(): void {}\n}\n\n/**\n * One-line recap for a collapsed thinking block: the last bold section header\n * when the trace has one (reasoning summaries usually do), otherwise the first\n * non-empty line, stripped of markdown emphasis and truncated.\n */\nexport function thinkingRecap(thinking: string, fallback: string, maxWidth = 120): string {\n\tconst lines = thinking\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line.length > 0);\n\tconst lastHeader = [...lines].reverse().find((line) => /^\\*\\*[^*]+\\*\\*:?$/.test(line) || /^#{1,6}\\s+\\S/.test(line));\n\tconst source = lastHeader ?? lines[0] ?? fallback;\n\tconst plain = source\n\t\t.replace(/^#{1,6}\\s+/, \"\")\n\t\t.replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\")\n\t\t.replace(/\\*([^*]+)\\*/g, \"$1\")\n\t\t.replace(/`([^`]+)`/g, \"$1\")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.replace(/:$/, \"\")\n\t\t.trim();\n\treturn truncateToWidth(plain || fallback, Math.max(20, maxWidth));\n}\n\nfunction formatInlineLoginRecoveryMessage(message: string): string | undefined {\n\tconst normalized = normalizeErrorDetails(message);\n\tif (!normalized.endsWith(LOGIN_RECOVERY_SUFFIX)) {\n\t\treturn undefined;\n\t}\n\tconst base = normalized.slice(0, -LOGIN_RECOVERY_SUFFIX.length).trimEnd();\n\tif (!base || shouldCollapseErrorDetails(base)) {\n\t\treturn undefined;\n\t}\n\treturn `${base} · ${LOGIN_RECOVERY_MESSAGE}`;\n}\n\n/**\n * Component that renders a complete assistant message.\n *\n * Streaming sends one updateContent() per token, so content updates are\n * reconciled lazily at render time (at most once per frame): when the block\n * structure is unchanged, only the text of changed blocks is updated in place,\n * preserving each Markdown child's render cache instead of rebuilding the tree.\n */\nexport class AssistantMessageComponent extends Container {\n\tprivate contentContainer: Container;\n\tprivate hideThinkingBlock: boolean;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate hiddenThinkingLabel: string;\n\tprivate lastMessage?: AssistantMessage;\n\tprivate hasToolCalls = false;\n\tprivate expanded = false;\n\tprivate dirty = false;\n\tprivate lastSignature?: string;\n\tprivate blockMarkdowns = new Map<number, Markdown>();\n\tprivate lastBlockTexts = new Map<number, string>();\n\tprivate precededByToolActivity: boolean;\n\tprivate mermaidTransform?: MermaidMarkdownTransform;\n\tprivate isStreaming = false;\n\n\tconstructor(\n\t\tmessage?: AssistantMessage,\n\t\thideThinkingBlock = false,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t\thiddenThinkingLabel = \"Thinking...\",\n\t\toptions: AssistantMessageComponentOptions = {},\n\t) {\n\t\tsuper();\n\n\t\tthis.hideThinkingBlock = hideThinkingBlock;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.hiddenThinkingLabel = hiddenThinkingLabel;\n\t\tthis.expanded = options.expanded ?? false;\n\t\tthis.precededByToolActivity = options.precededByToolActivity ?? false;\n\t\tthis.mermaidTransform = options.mermaidTransform;\n\n\t\t// Container for text/thinking content\n\t\tthis.contentContainer = new Container();\n\t\tthis.addChild(this.contentContainer);\n\n\t\tif (message) {\n\t\t\tthis.updateContent(message);\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\t// Force a full rebuild so theme-dependent children are recreated.\n\t\tthis.lastSignature = undefined;\n\t\tthis.dirty = true;\n\t}\n\n\tsetHideThinkingBlock(hide: boolean): void {\n\t\tthis.hideThinkingBlock = hide;\n\t\tthis.dirty = true;\n\t}\n\n\tsetHiddenThinkingLabel(label: string): void {\n\t\tthis.hiddenThinkingLabel = label;\n\t\tthis.dirty = true;\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this.expanded !== expanded) {\n\t\t\tthis.expanded = expanded;\n\t\t\tthis.dirty = true;\n\t\t}\n\t}\n\n\toverride render(width: number): string[] {\n\t\tif (this.dirty) {\n\t\t\tif (this.lastMessage) {\n\t\t\t\tthis.reconcile(this.lastMessage);\n\t\t\t}\n\t\t\tthis.dirty = false;\n\t\t}\n\t\tconst lines = super.render(width);\n\t\tif (this.hasToolCalls || lines.length === 0) {\n\t\t\treturn lines;\n\t\t}\n\n\t\tlines[0] = OSC133_ZONE_START + lines[0];\n\t\tlines[lines.length - 1] = OSC133_ZONE_END + OSC133_ZONE_FINAL + lines[lines.length - 1];\n\t\treturn lines;\n\t}\n\n\tupdateContent(message: AssistantMessage, isStreaming = this.isStreaming): void {\n\t\tthis.lastMessage = message;\n\t\tthis.isStreaming = isStreaming;\n\t\tthis.dirty = true;\n\t}\n\n\t/**\n\t * Everything that affects child component identity/order, but not the text\n\t * inside a block. While the signature is stable, updates reduce to setText()\n\t * on changed blocks; any structural change triggers a full rebuild.\n\t */\n\tprivate computeSignature(message: AssistantMessage): string {\n\t\tconst parts: string[] = [];\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst content = message.content[i];\n\t\t\tif (content?.type === \"text\") {\n\t\t\t\tparts.push(`${i}:text:${content.text.trim() ? 1 : 0}`);\n\t\t\t} else if (content?.type === \"thinking\") {\n\t\t\t\tparts.push(`${i}:thinking:${content.thinking.trim() ? 1 : 0}`);\n\t\t\t\tif (this.hideThinkingBlock && content.thinking.trim()) {\n\t\t\t\t\t// The collapsed row bakes the recap into a static line, so a recap\n\t\t\t\t\t// change must count as a structural change during streaming.\n\t\t\t\t\t// JSON-encode the free text so it cannot forge part boundaries.\n\t\t\t\t\tparts.push(`${i}:recap:${JSON.stringify(thinkingRecap(content.thinking, this.hiddenThinkingLabel))}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparts.push(`${i}:${content?.type ?? \"invalid\"}`);\n\t\t\t}\n\t\t}\n\t\tparts.push(\n\t\t\t`hide:${this.hideThinkingBlock}`,\n\t\t\t`label:${this.hiddenThinkingLabel}`,\n\t\t\t`expanded:${this.expanded}`,\n\t\t\t// In the signature so the streaming->final transition rebuilds (mermaid renders differently).\n\t\t\t`streaming:${this.isStreaming}`,\n\t\t\t`stop:${message.stopReason ?? \"\"}`,\n\t\t\t`error:${message.errorMessage ?? \"\"}`,\n\t\t);\n\t\treturn parts.join(\"|\");\n\t}\n\n\tprivate reconcile(message: AssistantMessage): void {\n\t\tconst signature = this.computeSignature(message);\n\t\tif (signature !== this.lastSignature) {\n\t\t\tthis.lastSignature = signature;\n\t\t\tthis.rebuild(message);\n\t\t\treturn;\n\t\t}\n\n\t\t// Structure unchanged: update only blocks whose text changed (during\n\t\t// streaming that is just the final block).\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst markdown = this.blockMarkdowns.get(i);\n\t\t\tif (!markdown) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst content = message.content[i];\n\t\t\tconst text =\n\t\t\t\tcontent?.type === \"text\"\n\t\t\t\t\t? content.text.trim()\n\t\t\t\t\t: content?.type === \"thinking\"\n\t\t\t\t\t\t? content.thinking.trim()\n\t\t\t\t\t\t: \"\";\n\t\t\tif (this.lastBlockTexts.get(i) !== text) {\n\t\t\t\tmarkdown.setText(text);\n\t\t\t\tthis.lastBlockTexts.set(i, text);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rebuild(message: AssistantMessage): void {\n\t\t// Clear content container\n\t\tthis.contentContainer.clear();\n\t\tthis.blockMarkdowns.clear();\n\t\tthis.lastBlockTexts.clear();\n\n\t\tconst hasVisibleContent = message.content.some(\n\t\t\t(c) => (c?.type === \"text\" && c.text.trim()) || (c?.type === \"thinking\" && c.thinking.trim()),\n\t\t);\n\n\t\tif (hasVisibleContent) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\t// Render content in order\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst content = message.content[i];\n\t\t\tif (content?.type === \"text\" && content.text.trim()) {\n\t\t\t\t// Assistant text messages with no background - trim the text\n\t\t\t\t// Set paddingY=0 to avoid extra spacing before tool executions\n\t\t\t\tconst mermaidTransform = this.mermaidTransform;\n\t\t\t\tconst isStreaming = this.isStreaming;\n\t\t\t\tconst markdown = new Markdown(content.text.trim(), 1, 0, this.markdownTheme, undefined, {\n\t\t\t\t\ttransform:\n\t\t\t\t\t\tmermaidTransform && ((md, availableWidth) => mermaidTransform(md, availableWidth, isStreaming)),\n\t\t\t\t});\n\t\t\t\tthis.blockMarkdowns.set(i, markdown);\n\t\t\t\tthis.lastBlockTexts.set(i, content.text.trim());\n\t\t\t\tthis.contentContainer.addChild(markdown);\n\t\t\t} else if (content?.type === \"thinking\" && content.thinking.trim()) {\n\t\t\t\t// Add spacing only when another visible assistant content block follows.\n\t\t\t\t// This avoids a superfluous blank line before separately-rendered tool execution blocks.\n\t\t\t\tconst hasVisibleContentAfter = message.content\n\t\t\t\t\t.slice(i + 1)\n\t\t\t\t\t.some((c) => (c?.type === \"text\" && c.text.trim()) || (c?.type === \"thinking\" && c.thinking.trim()));\n\n\t\t\t\tconst thinkingLabel = theme.bold(theme.fg(\"thinkingText\", this.hiddenThinkingLabel));\n\t\t\t\tif (this.hideThinkingBlock) {\n\t\t\t\t\t// Collapsed row: bold label, a one-line recap of the trace, and the\n\t\t\t\t\t// hint. The row truncates the recap to the render width so it never\n\t\t\t\t\t// wraps onto a second line on narrow terminals.\n\t\t\t\t\tconst recap = thinkingRecap(content.thinking, this.hiddenThinkingLabel);\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew CollapsedThinkingRow(thinkingLabel, recap, expandCollapseHint(\"app.thinking.toggle\", false)),\n\t\t\t\t\t);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Expanded: the same label line with the collapse hint, then the trace.\n\t\t\t\t\t// Thinking traces keep Markdown structure but stay visually quiet.\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew Text(`${thinkingLabel} ${expandCollapseHint(\"app.thinking.toggle\", true)}`, 1, 0),\n\t\t\t\t\t);\n\t\t\t\t\tconst markdown = new Markdown(\n\t\t\t\t\t\tcontent.thinking.trim(),\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tgetThinkingMarkdownTheme(this.markdownTheme),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcolor: (text: string) => theme.fg(\"thinkingText\", text),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tthis.blockMarkdowns.set(i, markdown);\n\t\t\t\t\tthis.lastBlockTexts.set(i, content.thinking.trim());\n\t\t\t\t\tthis.contentContainer.addChild(markdown);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst hasToolCalls = message.content.some((c) => c?.type === \"toolCall\");\n\t\tthis.hasToolCalls = hasToolCalls;\n\t\tif (message.stopReason === \"aborted\") {\n\t\t\tconst abortMessage =\n\t\t\t\tmessage.errorMessage && message.errorMessage !== \"Request was aborted\"\n\t\t\t\t\t? message.errorMessage\n\t\t\t\t\t: \"Operation aborted\";\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\tthis.contentContainer.addChild(this.createErrorComponent(abortMessage));\n\t\t} else if (!hasToolCalls && message.stopReason === \"error\") {\n\t\t\tconst errorMsg = message.errorMessage || \"Unknown error\";\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\tthis.contentContainer.addChild(this.createErrorComponent(errorMsg, \"Error\"));\n\t\t}\n\n\t\tif (hasToolCalls && (hasVisibleContent || message.stopReason === \"aborted\" || !this.precededByToolActivity)) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t}\n\t}\n\n\tprivate createErrorComponent(message: string, prefix?: string): Component {\n\t\tconst inlineLoginRecovery = formatInlineLoginRecoveryMessage(message);\n\t\tif (inlineLoginRecovery) {\n\t\t\tconst text = prefix ? `${prefix}: ${inlineLoginRecovery}` : inlineLoginRecovery;\n\t\t\treturn new Text(theme.fg(\"error\", text), 1, 0);\n\t\t}\n\n\t\tif (!shouldCollapseErrorDetails(message)) {\n\t\t\tconst text = prefix ? `${prefix}: ${message}` : message;\n\t\t\treturn new Text(theme.fg(\"error\", text), 1, 0);\n\t\t}\n\n\t\tconst text = prefix ? `${prefix}: ${message}` : message;\n\t\tconst summary = prefix ? `${prefix}: ${summarizeErrorDetails(message)}` : summarizeErrorDetails(message);\n\t\treturn new CollapsibleErrorComponent({\n\t\t\ttext,\n\t\t\tsummary,\n\t\t\texpanded: this.expanded,\n\t\t});\n\t}\n}\n"]}
|
|
@@ -6,7 +6,7 @@ import type { ReadonlyFooterDataProvider } from "../../../core/footer-data-provi
|
|
|
6
6
|
* Renders nothing by default — token counters, cost, model name, cwd, and context %
|
|
7
7
|
* are intentionally hidden. The setters and invalidate/dispose hooks are kept so the
|
|
8
8
|
* existing call sites in interactive-mode keep working without modification, and so
|
|
9
|
-
* `/usage` can expose
|
|
9
|
+
* `/usage` can expose runtime status without re-plumbing.
|
|
10
10
|
*/
|
|
11
11
|
export declare class FooterComponent implements Component {
|
|
12
12
|
private footerData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAExF;;;;;;;GAOG;AACH,qBAAa,eAAgB,YAAW,SAAS;IACpC,OAAO,CAAC,UAAU;IAA9B,YAAoB,UAAU,EAAE,0BAA0B,EAEzD;IAED,qBAAqB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAE7C;IAED;;;OAGG;IACH,UAAU,IAAI,IAAI,CAEjB;IAED;;;OAGG;IACH,OAAO,IAAI,IAAI,CAEd;IAED,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAI/B;CACD","sourcesContent":["import type { Component } from \"@asm-agent/tui\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.js\";\n\n/**\n * Footer component for the prime brand TUI.\n *\n * Renders nothing by default — token counters, cost, model name, cwd, and context %\n * are intentionally hidden. The setters and invalidate/dispose hooks are kept so the\n * existing call sites in interactive-mode keep working without modification, and so\n * `/usage` can expose
|
|
1
|
+
{"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAExF;;;;;;;GAOG;AACH,qBAAa,eAAgB,YAAW,SAAS;IACpC,OAAO,CAAC,UAAU;IAA9B,YAAoB,UAAU,EAAE,0BAA0B,EAEzD;IAED,qBAAqB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAE7C;IAED;;;OAGG;IACH,UAAU,IAAI,IAAI,CAEjB;IAED;;;OAGG;IACH,OAAO,IAAI,IAAI,CAEd;IAED,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAI/B;CACD","sourcesContent":["import type { Component } from \"@asm-agent/tui\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.js\";\n\n/**\n * Footer component for the prime brand TUI.\n *\n * Renders nothing by default — token counters, cost, model name, cwd, and context %\n * are intentionally hidden. The setters and invalidate/dispose hooks are kept so the\n * existing call sites in interactive-mode keep working without modification, and so\n * `/usage` can expose runtime status without re-plumbing.\n */\nexport class FooterComponent implements Component {\n\tconstructor(private footerData: ReadonlyFooterDataProvider) {\n\t\tvoid this.footerData;\n\t}\n\n\tsetAutoCompactEnabled(_enabled: boolean): void {\n\t\t// no-op while the footer is empty\n\t}\n\n\t/**\n\t * No-op: git branch caching now handled by provider.\n\t * Kept for compatibility with existing call sites in interactive-mode.\n\t */\n\tinvalidate(): void {\n\t\t// No-op: git branch is cached/invalidated by provider\n\t}\n\n\t/**\n\t * Clean up resources.\n\t * Git watcher cleanup now handled by provider.\n\t */\n\tdispose(): void {\n\t\t// Git watcher cleanup handled by provider\n\t}\n\n\trender(_width: number): string[] {\n\t\t// Footer is intentionally empty in the prime brand TUI. Runtime status (cost, tokens, model,\n\t\t// cwd, context %) is hidden by default; bring it back via /usage when needed.\n\t\treturn [];\n\t}\n}\n"]}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Renders nothing by default — token counters, cost, model name, cwd, and context %
|
|
5
5
|
* are intentionally hidden. The setters and invalidate/dispose hooks are kept so the
|
|
6
6
|
* existing call sites in interactive-mode keep working without modification, and so
|
|
7
|
-
* `/usage` can expose
|
|
7
|
+
* `/usage` can expose runtime status without re-plumbing.
|
|
8
8
|
*/
|
|
9
9
|
export class FooterComponent {
|
|
10
10
|
footerData;
|
|
@@ -30,7 +30,7 @@ export class FooterComponent {
|
|
|
30
30
|
// Git watcher cleanup handled by provider
|
|
31
31
|
}
|
|
32
32
|
render(_width) {
|
|
33
|
-
// Footer is intentionally empty in the prime brand TUI.
|
|
33
|
+
// Footer is intentionally empty in the prime brand TUI. Runtime status (cost, tokens, model,
|
|
34
34
|
// cwd, context %) is hidden by default; bring it back via /usage when needed.
|
|
35
35
|
return [];
|
|
36
36
|
}
|