@astralyn/pi 1.4.5 → 1.4.7
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 +42 -0
- package/dist/bundle/chunks/chunk-FODCTZXW.js +230 -0
- package/dist/bundle/chunks/{chunk-I5S7H7GA.js → chunk-FYKNSJG6.js} +1 -1
- package/dist/bundle/chunks/{chunk-AXFWZIHH.js → chunk-MG5XDTXV.js} +1 -1
- package/dist/bundle/chunks/{chunk-ALHAFUHP.js → chunk-PU2IWWXV.js} +1 -1
- package/dist/bundle/chunks/{chunk-5M3YJ54Z.js → chunk-RO2VH6UZ.js} +1 -1
- package/dist/bundle/chunks/chunk-YJTSOLP2.js +1499 -0
- package/dist/bundle/chunks/{cli-FH77R7JR.js → cli-MEL7SGJD.js} +1 -1
- package/dist/bundle/chunks/{execute-GMFGC27P.js → execute-4CWRNHPO.js} +1 -1
- package/dist/bundle/chunks/{runtime-R5CMHJ5P.js → runtime-R3X67XMR.js} +1 -1
- package/dist/bundle/chunks/{virtual-modules-6FUV7ZDV.js → virtual-modules-PKEOKGYI.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/agent-session.d.ts +0 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +0 -4
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/isolated-session.d.ts +23 -0
- package/dist/core/isolated-session.d.ts.map +1 -0
- package/dist/core/isolated-session.js +55 -0
- package/dist/core/isolated-session.js.map +1 -0
- package/dist/core/package-manager.d.ts +7 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +72 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/resource-loader.d.ts +1 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +23 -7
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +11 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-schema.d.ts +7 -0
- package/dist/core/settings-schema.d.ts.map +1 -1
- package/dist/core/settings-schema.js +6 -0
- package/dist/core/settings-schema.js.map +1 -1
- package/dist/core/skills.d.ts +10 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +23 -0
- package/dist/core/skills.js.map +1 -1
- package/dist/core/tasks/codec.d.ts +12 -0
- package/dist/core/tasks/codec.d.ts.map +1 -0
- package/dist/core/tasks/codec.js +139 -0
- package/dist/core/tasks/codec.js.map +1 -0
- package/dist/core/tasks/delivery.d.ts +11 -4
- package/dist/core/tasks/delivery.d.ts.map +1 -1
- package/dist/core/tasks/delivery.js +9 -9
- package/dist/core/tasks/delivery.js.map +1 -1
- package/dist/core/tasks/execution.d.ts +71 -0
- package/dist/core/tasks/execution.d.ts.map +1 -0
- package/dist/core/tasks/execution.js +292 -0
- package/dist/core/tasks/execution.js.map +1 -0
- package/dist/core/tasks/format.d.ts +0 -2
- package/dist/core/tasks/format.d.ts.map +1 -1
- package/dist/core/tasks/format.js +1 -16
- package/dist/core/tasks/format.js.map +1 -1
- package/dist/core/tasks/limits.d.ts +12 -1
- package/dist/core/tasks/limits.d.ts.map +1 -1
- package/dist/core/tasks/limits.js +20 -1
- package/dist/core/tasks/limits.js.map +1 -1
- package/dist/core/tasks/output.d.ts +17 -17
- package/dist/core/tasks/output.d.ts.map +1 -1
- package/dist/core/tasks/output.js +72 -69
- package/dist/core/tasks/output.js.map +1 -1
- package/dist/core/tasks/presentation.d.ts +14 -5
- package/dist/core/tasks/presentation.d.ts.map +1 -1
- package/dist/core/tasks/presentation.js +56 -185
- package/dist/core/tasks/presentation.js.map +1 -1
- package/dist/core/tasks/record.d.ts +45 -0
- package/dist/core/tasks/record.d.ts.map +1 -0
- package/dist/core/tasks/record.js +80 -0
- package/dist/core/tasks/record.js.map +1 -0
- package/dist/core/tasks/runtime.d.ts +22 -22
- package/dist/core/tasks/runtime.d.ts.map +1 -1
- package/dist/core/tasks/runtime.js +170 -343
- package/dist/core/tasks/runtime.js.map +1 -1
- package/dist/core/tasks/scheduler.d.ts +16 -0
- package/dist/core/tasks/scheduler.d.ts.map +1 -0
- package/dist/core/tasks/scheduler.js +42 -0
- package/dist/core/tasks/scheduler.js.map +1 -0
- package/dist/core/tasks/session.d.ts +1 -1
- package/dist/core/tasks/session.d.ts.map +1 -1
- package/dist/core/tasks/session.js +22 -35
- package/dist/core/tasks/session.js.map +1 -1
- package/dist/core/tasks/store.d.ts +18 -25
- package/dist/core/tasks/store.d.ts.map +1 -1
- package/dist/core/tasks/store.js +45 -43
- package/dist/core/tasks/store.js.map +1 -1
- package/dist/core/tasks/types.d.ts +159 -70
- package/dist/core/tasks/types.d.ts.map +1 -1
- package/dist/core/tasks/types.js +3 -9
- package/dist/core/tasks/types.js.map +1 -1
- package/dist/core/tools/shell-execution.d.ts +8 -7
- package/dist/core/tools/shell-execution.d.ts.map +1 -1
- package/dist/core/tools/shell-execution.js +19 -27
- package/dist/core/tools/shell-execution.js.map +1 -1
- package/dist/core/tools/shell-tool.d.ts.map +1 -1
- package/dist/core/tools/shell-tool.js +42 -47
- package/dist/core/tools/shell-tool.js.map +1 -1
- package/dist/core/usage-totals.d.ts +4 -3
- package/dist/core/usage-totals.d.ts.map +1 -1
- package/dist/core/usage-totals.js +32 -8
- package/dist/core/usage-totals.js.map +1 -1
- package/dist/extensions/agent/activity.d.ts +4 -4
- package/dist/extensions/agent/activity.d.ts.map +1 -1
- package/dist/extensions/agent/activity.js +15 -24
- package/dist/extensions/agent/activity.js.map +1 -1
- package/dist/extensions/agent/index.d.ts +2 -11
- package/dist/extensions/agent/index.d.ts.map +1 -1
- package/dist/extensions/agent/index.js +3 -88
- package/dist/extensions/agent/index.js.map +1 -1
- package/dist/extensions/agent/progress.d.ts +31 -0
- package/dist/extensions/agent/progress.d.ts.map +1 -0
- package/dist/extensions/agent/progress.js +135 -0
- package/dist/extensions/agent/progress.js.map +1 -0
- package/dist/extensions/agent/render.d.ts.map +1 -1
- package/dist/extensions/agent/render.js +8 -17
- package/dist/extensions/agent/render.js.map +1 -1
- package/dist/extensions/agent/report.d.ts +9 -0
- package/dist/extensions/agent/report.d.ts.map +1 -0
- package/dist/extensions/agent/report.js +40 -0
- package/dist/extensions/agent/report.js.map +1 -0
- package/dist/extensions/agent/settings-panel.d.ts +43 -0
- package/dist/extensions/agent/settings-panel.d.ts.map +1 -0
- package/dist/extensions/agent/settings-panel.js +125 -0
- package/dist/extensions/agent/settings-panel.js.map +1 -0
- package/dist/extensions/agent/settings.d.ts +1 -1
- package/dist/extensions/agent/settings.d.ts.map +1 -1
- package/dist/extensions/agent/settings.js +101 -83
- package/dist/extensions/agent/settings.js.map +1 -1
- package/dist/extensions/agent/tool.d.ts +13 -0
- package/dist/extensions/agent/tool.d.ts.map +1 -0
- package/dist/extensions/agent/tool.js +88 -0
- package/dist/extensions/agent/tool.js.map +1 -0
- package/dist/extensions/agent/types.d.ts +19 -21
- package/dist/extensions/agent/types.d.ts.map +1 -1
- package/dist/extensions/agent/types.js +2 -10
- package/dist/extensions/agent/types.js.map +1 -1
- package/dist/extensions/agent/worker.d.ts +16 -0
- package/dist/extensions/agent/worker.d.ts.map +1 -0
- package/dist/extensions/agent/worker.js +66 -0
- package/dist/extensions/agent/worker.js.map +1 -0
- package/dist/extensions/btw/agent.d.ts +1 -1
- package/dist/extensions/btw/agent.d.ts.map +1 -1
- package/dist/extensions/btw/agent.js +3 -20
- package/dist/extensions/btw/agent.js.map +1 -1
- package/dist/extensions/cached-compaction/index.d.ts.map +1 -1
- package/dist/extensions/cached-compaction/index.js +3 -22
- package/dist/extensions/cached-compaction/index.js.map +1 -1
- package/dist/extensions/cached-compaction/render.d.ts +1 -0
- package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
- package/dist/extensions/cached-compaction/render.js +42 -14
- package/dist/extensions/cached-compaction/render.js.map +1 -1
- package/dist/extensions/deepwiki/client.d.ts.map +1 -1
- package/dist/extensions/deepwiki/client.js +6 -78
- package/dist/extensions/deepwiki/client.js.map +1 -1
- package/dist/extensions/deepwiki/transport.d.ts +3 -0
- package/dist/extensions/deepwiki/transport.d.ts.map +1 -0
- package/dist/extensions/deepwiki/transport.js +96 -0
- package/dist/extensions/deepwiki/transport.js.map +1 -0
- package/dist/extensions/provider/ui/builtin-data.d.ts +3 -3
- package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
- package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
- package/dist/extensions/provider/ui/compat.d.ts +3 -3
- package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
- package/dist/extensions/provider/ui/compat.js.map +1 -1
- package/dist/extensions/provider/ui/controls.d.ts +2 -2
- package/dist/extensions/provider/ui/controls.d.ts.map +1 -1
- package/dist/extensions/provider/ui/controls.js.map +1 -1
- package/dist/extensions/provider/ui/dialogs.d.ts +3 -3
- package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -1
- package/dist/extensions/provider/ui/dialogs.js.map +1 -1
- package/dist/extensions/provider/ui/dictionary.d.ts +2 -2
- package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
- package/dist/extensions/provider/ui/dictionary.js.map +1 -1
- package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
- package/dist/extensions/provider/ui/editor.js +1 -3
- package/dist/extensions/provider/ui/editor.js.map +1 -1
- package/dist/extensions/provider/ui/fetch-models.d.ts +2 -2
- package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
- package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
- package/dist/extensions/provider/ui/model-fields.d.ts +2 -2
- package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
- package/dist/extensions/provider/ui/model-fields.js.map +1 -1
- package/dist/extensions/provider/ui/model-options.d.ts +6 -6
- package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
- package/dist/extensions/provider/ui/model-options.js.map +1 -1
- package/dist/extensions/provider/ui/pane.d.ts +21 -12
- package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
- package/dist/extensions/provider/ui/pane.js.map +1 -1
- package/dist/extensions/provider/ui/provider-fields.d.ts +3 -3
- package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
- package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
- package/dist/extensions/provider/ui/thinking-map.d.ts +2 -2
- package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
- package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
- package/dist/extensions/run-summary/format.js +1 -1
- package/dist/extensions/run-summary/format.js.map +1 -1
- package/dist/extensions/statusline/usage.d.ts.map +1 -1
- package/dist/extensions/statusline/usage.js +2 -6
- package/dist/extensions/statusline/usage.js.map +1 -1
- package/dist/extensions/tasks/tool/actions.d.ts +1 -1
- package/dist/extensions/tasks/tool/actions.d.ts.map +1 -1
- package/dist/extensions/tasks/tool/actions.js +50 -115
- package/dist/extensions/tasks/tool/actions.js.map +1 -1
- package/dist/extensions/tasks/tool/constants.d.ts +1 -6
- package/dist/extensions/tasks/tool/constants.d.ts.map +1 -1
- package/dist/extensions/tasks/tool/constants.js +1 -6
- package/dist/extensions/tasks/tool/constants.js.map +1 -1
- package/dist/extensions/tasks/tool/schema.d.ts +0 -3
- package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
- package/dist/extensions/tasks/tool/schema.js +5 -14
- package/dist/extensions/tasks/tool/schema.js.map +1 -1
- package/dist/extensions/tasks/tool/types.d.ts +2 -8
- package/dist/extensions/tasks/tool/types.d.ts.map +1 -1
- package/dist/extensions/tasks/tool/types.js +0 -2
- package/dist/extensions/tasks/tool/types.js.map +1 -1
- package/dist/extensions/tasks/tool.d.ts.map +1 -1
- package/dist/extensions/tasks/tool.js +2 -2
- package/dist/extensions/tasks/tool.js.map +1 -1
- package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/completion-render.js +46 -47
- package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
- package/dist/extensions/tasks/ui/inspector.d.ts +5 -3
- package/dist/extensions/tasks/ui/inspector.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/inspector.js +18 -6
- package/dist/extensions/tasks/ui/inspector.js.map +1 -1
- package/dist/extensions/tasks/ui/layout.d.ts +7 -7
- package/dist/extensions/tasks/ui/layout.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/layout.js +118 -84
- package/dist/extensions/tasks/ui/layout.js.map +1 -1
- package/dist/extensions/tasks/ui/list.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/list.js +45 -31
- package/dist/extensions/tasks/ui/list.js.map +1 -1
- package/dist/extensions/tasks/ui/manager.d.ts +16 -7
- package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/manager.js +167 -129
- package/dist/extensions/tasks/ui/manager.js.map +1 -1
- package/dist/extensions/tasks/ui/model.d.ts +29 -0
- package/dist/extensions/tasks/ui/model.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/model.js +16 -1
- package/dist/extensions/tasks/ui/model.js.map +1 -1
- package/dist/extensions/tasks/ui/render.d.ts +1 -1
- package/dist/extensions/tasks/ui/render.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/render.js +12 -9
- package/dist/extensions/tasks/ui/render.js.map +1 -1
- package/dist/extensions/tasks/ui/status.d.ts +15 -0
- package/dist/extensions/tasks/ui/status.d.ts.map +1 -0
- package/dist/extensions/tasks/ui/status.js +16 -0
- package/dist/extensions/tasks/ui/status.js.map +1 -0
- package/dist/extensions/tasks/ui/tree.js +1 -1
- package/dist/extensions/tasks/ui/tree.js.map +1 -1
- package/dist/extensions/tasks/ui/views.d.ts +10 -5
- package/dist/extensions/tasks/ui/views.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/views.js +61 -36
- package/dist/extensions/tasks/ui/views.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +14 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +258 -7
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +2 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +7 -4
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/status-marker.d.ts +2 -1
- package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-marker.js +0 -1
- package/dist/modes/interactive/components/status-marker.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +10 -3
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +7 -1
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/utils/duration.d.ts +3 -0
- package/dist/utils/duration.d.ts.map +1 -0
- package/dist/utils/duration.js +17 -0
- package/dist/utils/duration.js.map +1 -0
- package/dist/utils/number.d.ts +3 -0
- package/dist/utils/number.d.ts.map +1 -0
- package/dist/utils/number.js +5 -0
- package/dist/utils/number.js.map +1 -0
- package/docs/bundled/extensions/agent.md +14 -12
- package/docs/bundled/extensions/cached-compaction.md +13 -4
- package/docs/bundled/extensions/deepwiki.md +3 -1
- package/docs/bundled/extensions/statusline.md +1 -1
- package/docs/bundled/tasks.md +15 -14
- package/docs/extensions.md +26 -10
- package/docs/packages.md +5 -3
- package/docs/sdk.md +3 -3
- package/docs/session-format.md +28 -24
- package/docs/settings.md +11 -0
- package/docs/skills.md +23 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/schemas/settings.schema.json +36 -0
- package/dist/bundle/chunks/chunk-FSJ45CRP.js +0 -229
- package/dist/bundle/chunks/chunk-W3FIUMGM.js +0 -1501
- package/dist/core/tasks/history.d.ts +0 -4
- package/dist/core/tasks/history.d.ts.map +0 -1
- package/dist/core/tasks/history.js +0 -131
- package/dist/core/tasks/history.js.map +0 -1
- package/dist/extensions/agent/runner.d.ts +0 -24
- package/dist/extensions/agent/runner.d.ts.map +0 -1
- package/dist/extensions/agent/runner.js +0 -274
- package/dist/extensions/agent/runner.js.map +0 -1
- package/dist/extensions/deepwiki/http.d.ts +0 -13
- package/dist/extensions/deepwiki/http.d.ts.map +0 -1
- package/dist/extensions/deepwiki/http.js +0 -88
- package/dist/extensions/deepwiki/http.js.map +0 -1
- package/dist/extensions/tasks/ui/task-view.d.ts +0 -13
- package/dist/extensions/tasks/ui/task-view.d.ts.map +0 -1
- package/dist/extensions/tasks/ui/task-view.js +0 -20
- package/dist/extensions/tasks/ui/task-view.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { PAGE_HEADER_RE } from \"./contents.ts\";\nimport { fetchWithRetry } from \"./http.ts\";\nimport { type DeepWikiParams, normalizeDeepWikiParams } from \"./schema.ts\";\n\nconst DEEPWIKI_MCP_URL = \"https://mcp.deepwiki.com/mcp\";\nconst MCP_PROTOCOL_VERSION = \"2024-11-05\";\nconst REQUEST_TIMEOUT_MS = 45_000;\nconst CACHE_TTL_MS = 10 * 60_000;\n/** Long-lived process guard: entries are only otherwise dropped on re-read after expiry. */\nconst MAX_CACHE_ENTRIES = 50;\n/** Transient-failure retries (network blips, 5xx, 429). Aborts/timeouts are not retried. */\nconst MAX_RETRIES = 2;\n\ntype DeepWikiToolName = \"read_wiki_structure\" | \"read_wiki_contents\" | \"ask_question\";\n\ninterface JsonRpcErrorPayload {\n\tcode?: number;\n\tmessage?: string;\n\tdata?: unknown;\n}\n\ninterface JsonRpcEnvelope {\n\tjsonrpc?: string;\n\tid?: string | number | null;\n\tresult?: unknown;\n\terror?: JsonRpcErrorPayload;\n}\n\ninterface McpTextContent {\n\ttype: \"text\";\n\ttext: string;\n}\n\ninterface McpToolCallResult {\n\tcontent?: unknown;\n\tstructuredContent?: unknown;\n\tisError?: boolean;\n}\n\nexport interface DeepWikiResponse {\n\ttoolName: DeepWikiToolName;\n\ttext: string;\n\toutputLength: number;\n\tpageTitles?: string[];\n\tcacheHit?: boolean;\n}\n\ninterface CacheEntry {\n\texpiresAt: number;\n\tresponse: DeepWikiResponse;\n}\n\nconst responseCache = new Map<string, CacheEntry>();\n\nfunction toolNameForAction(action: DeepWikiParams[\"action\"]): DeepWikiToolName {\n\tif (action === \"structure\") return \"read_wiki_structure\";\n\tif (action === \"contents\") return \"read_wiki_contents\";\n\treturn \"ask_question\";\n}\n\n// Callers pass params already normalized by callDeepWiki's entry gate; no re-normalization.\nfunction argumentsForParams(params: DeepWikiParams): Record<string, unknown> {\n\tif (params.action === \"question\") {\n\t\tconst question = params.question?.trim();\n\t\tif (!question) throw new Error(\"question is required when action is question\");\n\t\treturn { repoName: params.repoName, question };\n\t}\n\treturn { repoName: params.repoName };\n}\n\nfunction cacheKey(params: DeepWikiParams): string {\n\tconst repos = Array.isArray(params.repoName) ? params.repoName : [params.repoName];\n\treturn JSON.stringify([params.action, repos, params.question ?? \"\"]);\n}\n\nfunction cloneResponse(response: DeepWikiResponse, cacheHit: boolean): DeepWikiResponse {\n\treturn {\n\t\t...response,\n\t\t...(response.pageTitles ? { pageTitles: [...response.pageTitles] } : {}),\n\t\tcacheHit,\n\t};\n}\n\nfunction truncate(text: string, maxLength = 500): string {\n\tif (text.length <= maxLength) return text;\n\treturn `${text.slice(0, maxLength - 3)}...`;\n}\n\nfunction parseJson(text: string): JsonRpcEnvelope {\n\ttry {\n\t\treturn JSON.parse(text) as JsonRpcEnvelope;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`DeepWiki returned invalid JSON: ${message}`);\n\t}\n}\n\nfunction parseSse(text: string): JsonRpcEnvelope {\n\tconst blocks = text.split(/\\r?\\n\\r?\\n/);\n\tlet fallback: JsonRpcEnvelope | undefined;\n\tfor (const block of blocks) {\n\t\tconst dataLines = block\n\t\t\t.split(/\\r?\\n/)\n\t\t\t.filter((line) => line.startsWith(\"data:\"))\n\t\t\t.map((line) => line.slice(5).replace(/^ /, \"\"));\n\t\tif (dataLines.length === 0) continue;\n\n\t\tconst data = dataLines.join(\"\\n\").trim();\n\t\tif (!data || data === \"[DONE]\") continue;\n\t\tconst envelope = parseJson(data);\n\t\tif (envelope.error || envelope.result !== undefined) return envelope;\n\t\tfallback = envelope;\n\t}\n\tif (fallback) return fallback;\n\tthrow new Error(\"DeepWiki returned an empty event stream\");\n}\n\nfunction parseEnvelope(text: string, contentType: string | null): JsonRpcEnvelope {\n\tif (contentType?.includes(\"text/event-stream\")) return parseSse(text);\n\treturn parseJson(text);\n}\n\nfunction extractStructuredResult(result: McpToolCallResult): string | undefined {\n\tif (!result.structuredContent || typeof result.structuredContent !== \"object\") return undefined;\n\tconst value = (result.structuredContent as Record<string, unknown>).result;\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction extractContentResult(result: McpToolCallResult): string {\n\tif (!Array.isArray(result.content)) return \"\";\n\treturn result.content\n\t\t.filter((part): part is McpTextContent => {\n\t\t\tif (!part || typeof part !== \"object\") return false;\n\t\t\tconst record = part as Record<string, unknown>;\n\t\t\treturn record.type === \"text\" && typeof record.text === \"string\";\n\t\t})\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nfunction isDeepWikiErrorText(text: string): boolean {\n\tconst trimmed = text.trim();\n\treturn (\n\t\t/^Error fetching wiki for .+?: Repository not found\\./i.test(trimmed) ||\n\t\t/^Error processing question: Repository not found\\./i.test(trimmed)\n\t);\n}\n\nfunction extractToolText(result: unknown): string {\n\tif (!result || typeof result !== \"object\") throw new Error(\"DeepWiki returned no result object\");\n\n\tconst toolResult = result as McpToolCallResult;\n\tconst text = extractStructuredResult(toolResult) ?? extractContentResult(toolResult);\n\tif (!text) throw new Error(\"DeepWiki returned no text content\");\n\tif (toolResult.isError || isDeepWikiErrorText(text)) throw new Error(text);\n\treturn text;\n}\n\nexport function extractStructureSections(text: string): string[] {\n\treturn uniqueTitles(text.split(\"\\n\").map((line) => line.match(/^\\s*-\\s+\\d+\\s+(.+)$/)?.[1]?.trim()));\n}\n\nexport function extractContentPages(text: string): string[] {\n\treturn uniqueTitles(text.split(\"\\n\").map((line) => line.match(PAGE_HEADER_RE)?.[1]?.trim()));\n}\n\nfunction uniqueTitles(titles: Array<string | undefined>): string[] {\n\tconst seen = new Set<string>();\n\tconst result: string[] = [];\n\tfor (const title of titles) {\n\t\tif (!title || seen.has(title)) continue;\n\t\tseen.add(title);\n\t\tresult.push(title);\n\t}\n\treturn result;\n}\n\nfunction extractPageTitles(toolName: DeepWikiToolName, text: string): string[] {\n\tif (toolName === \"read_wiki_structure\") return extractStructureSections(text);\n\tif (toolName === \"read_wiki_contents\") return extractContentPages(text);\n\treturn [];\n}\n\nexport async function callDeepWiki(params: DeepWikiParams, signal: AbortSignal | undefined): Promise<DeepWikiResponse> {\n\tsignal?.throwIfAborted();\n\tconst normalizedParams = normalizeDeepWikiParams(params);\n\tconst key = cacheKey(normalizedParams);\n\tconst cached = responseCache.get(key);\n\tif (cached && cached.expiresAt > Date.now()) {\n\t\treturn cloneResponse(cached.response, true);\n\t}\n\tif (cached) responseCache.delete(key);\n\n\tconst toolName = toolNameForAction(normalizedParams.action);\n\tconst bodyJson = JSON.stringify({\n\t\tjsonrpc: \"2.0\",\n\t\tid: 1,\n\t\tmethod: \"tools/call\",\n\t\tparams: {\n\t\t\tname: toolName,\n\t\t\targuments: argumentsForParams(normalizedParams),\n\t\t},\n\t});\n\n\t// Timeout + bounded transient retry live in this extension's http.ts; non-retryable\n\t// statuses come back here for the domain-specific HTTP error below.\n\tconst { response, text } = await fetchWithRetry(\n\t\tDEEPWIKI_MCP_URL,\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAccept: \"application/json, text/event-stream\",\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"MCP-Protocol-Version\": MCP_PROTOCOL_VERSION,\n\t\t\t},\n\t\t\tbody: bodyJson,\n\t\t},\n\t\t{ timeoutMs: REQUEST_TIMEOUT_MS, retries: MAX_RETRIES, signal, label: \"DeepWiki\" },\n\t);\n\tsignal?.throwIfAborted();\n\n\tif (!response.ok) {\n\t\tthrow new Error(`DeepWiki HTTP ${response.status}: ${truncate(text)}`);\n\t}\n\n\tconst envelope = parseEnvelope(text, response.headers.get(\"content-type\"));\n\tif (envelope.error) {\n\t\tthrow new Error(envelope.error.message ?? `DeepWiki JSON-RPC error ${envelope.error.code ?? \"unknown\"}`);\n\t}\n\n\tconst resultText = extractToolText(envelope.result);\n\tconst pageTitles = extractPageTitles(toolName, resultText);\n\tconst result: DeepWikiResponse = {\n\t\ttoolName,\n\t\ttext: resultText,\n\t\toutputLength: resultText.length,\n\t\t...(pageTitles.length ? { pageTitles } : {}),\n\t};\n\tsignal?.throwIfAborted();\n\tresponseCache.set(key, { expiresAt: Date.now() + CACHE_TTL_MS, response: cloneResponse(result, false) });\n\twhile (responseCache.size > MAX_CACHE_ENTRIES) {\n\t\tconst oldest = responseCache.keys().next().value;\n\t\tif (oldest === undefined) break;\n\t\tresponseCache.delete(oldest);\n\t}\n\treturn result;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CallToolResult, TextContent } from \"@earendil-works/pi-mcp\";\nimport { PAGE_HEADER_RE } from \"./contents.ts\";\nimport { type DeepWikiParams, normalizeDeepWikiParams } from \"./schema.ts\";\nimport { callDeepWikiTool } from \"./transport.ts\";\n\nconst CACHE_TTL_MS = 10 * 60_000;\n/** Long-lived process guard: entries are only otherwise dropped on re-read after expiry. */\nconst MAX_CACHE_ENTRIES = 50;\n\ntype DeepWikiToolName = \"read_wiki_structure\" | \"read_wiki_contents\" | \"ask_question\";\n\nexport interface DeepWikiResponse {\n\ttoolName: DeepWikiToolName;\n\ttext: string;\n\toutputLength: number;\n\tpageTitles?: string[];\n\tcacheHit?: boolean;\n}\n\ninterface CacheEntry {\n\texpiresAt: number;\n\tresponse: DeepWikiResponse;\n}\n\nconst responseCache = new Map<string, CacheEntry>();\n\nfunction toolNameForAction(action: DeepWikiParams[\"action\"]): DeepWikiToolName {\n\tif (action === \"structure\") return \"read_wiki_structure\";\n\tif (action === \"contents\") return \"read_wiki_contents\";\n\treturn \"ask_question\";\n}\n\n// Callers pass params already normalized by callDeepWiki's entry gate; no re-normalization.\nfunction argumentsForParams(params: DeepWikiParams): Record<string, unknown> {\n\tif (params.action === \"question\") {\n\t\tconst question = params.question?.trim();\n\t\tif (!question) throw new Error(\"question is required when action is question\");\n\t\treturn { repoName: params.repoName, question };\n\t}\n\treturn { repoName: params.repoName };\n}\n\nfunction cacheKey(params: DeepWikiParams): string {\n\tconst repos = Array.isArray(params.repoName) ? params.repoName : [params.repoName];\n\treturn JSON.stringify([params.action, repos, params.question ?? \"\"]);\n}\n\nfunction cloneResponse(response: DeepWikiResponse, cacheHit: boolean): DeepWikiResponse {\n\treturn {\n\t\t...response,\n\t\t...(response.pageTitles ? { pageTitles: [...response.pageTitles] } : {}),\n\t\tcacheHit,\n\t};\n}\n\nfunction extractStructuredResult(result: Partial<CallToolResult>): string | undefined {\n\tif (!result.structuredContent || typeof result.structuredContent !== \"object\") return undefined;\n\tconst value = (result.structuredContent as Record<string, unknown>).result;\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction extractContentResult(result: Partial<CallToolResult>): string {\n\tif (!Array.isArray(result.content)) return \"\";\n\treturn result.content\n\t\t.filter((part): part is TextContent => {\n\t\t\tif (!part || typeof part !== \"object\") return false;\n\t\t\tconst record = part as unknown as Record<string, unknown>;\n\t\t\treturn record.type === \"text\" && typeof record.text === \"string\";\n\t\t})\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nfunction isDeepWikiErrorText(text: string): boolean {\n\tconst trimmed = text.trim();\n\treturn (\n\t\t/^Error fetching wiki for .+?: Repository not found\\./i.test(trimmed) ||\n\t\t/^Error processing question: Repository not found\\./i.test(trimmed)\n\t);\n}\n\nfunction extractToolText(result: unknown): string {\n\tif (!result || typeof result !== \"object\") throw new Error(\"DeepWiki returned no result object\");\n\n\tconst toolResult = result as Partial<CallToolResult>;\n\tconst text = extractStructuredResult(toolResult) ?? extractContentResult(toolResult);\n\tif (!text) throw new Error(\"DeepWiki returned no text content\");\n\tif (toolResult.isError || isDeepWikiErrorText(text)) throw new Error(text);\n\treturn text;\n}\n\nexport function extractStructureSections(text: string): string[] {\n\treturn uniqueTitles(text.split(\"\\n\").map((line) => line.match(/^\\s*-\\s+\\d+\\s+(.+)$/)?.[1]?.trim()));\n}\n\nexport function extractContentPages(text: string): string[] {\n\treturn uniqueTitles(text.split(\"\\n\").map((line) => line.match(PAGE_HEADER_RE)?.[1]?.trim()));\n}\n\nfunction uniqueTitles(titles: Array<string | undefined>): string[] {\n\tconst seen = new Set<string>();\n\tconst result: string[] = [];\n\tfor (const title of titles) {\n\t\tif (!title || seen.has(title)) continue;\n\t\tseen.add(title);\n\t\tresult.push(title);\n\t}\n\treturn result;\n}\n\nfunction extractPageTitles(toolName: DeepWikiToolName, text: string): string[] {\n\tif (toolName === \"read_wiki_structure\") return extractStructureSections(text);\n\tif (toolName === \"read_wiki_contents\") return extractContentPages(text);\n\treturn [];\n}\n\nexport async function callDeepWiki(params: DeepWikiParams, signal: AbortSignal | undefined): Promise<DeepWikiResponse> {\n\tsignal?.throwIfAborted();\n\tconst normalizedParams = normalizeDeepWikiParams(params);\n\tconst key = cacheKey(normalizedParams);\n\tconst cached = responseCache.get(key);\n\tif (cached && cached.expiresAt > Date.now()) {\n\t\treturn cloneResponse(cached.response, true);\n\t}\n\tif (cached) responseCache.delete(key);\n\n\tconst toolName = toolNameForAction(normalizedParams.action);\n\tconst result = await callDeepWikiTool(toolName, argumentsForParams(normalizedParams), signal);\n\tsignal?.throwIfAborted();\n\n\tconst resultText = extractToolText(result);\n\tconst pageTitles = extractPageTitles(toolName, resultText);\n\tconst response: DeepWikiResponse = {\n\t\ttoolName,\n\t\ttext: resultText,\n\t\toutputLength: resultText.length,\n\t\t...(pageTitles.length ? { pageTitles } : {}),\n\t};\n\tsignal?.throwIfAborted();\n\tresponseCache.set(key, { expiresAt: Date.now() + CACHE_TTL_MS, response: cloneResponse(response, false) });\n\twhile (responseCache.size > MAX_CACHE_ENTRIES) {\n\t\tconst oldest = responseCache.keys().next().value;\n\t\tif (oldest === undefined) break;\n\t\tresponseCache.delete(oldest);\n\t}\n\treturn response;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/transport.ts"],"names":[],"mappings":"AA6DA,qFAAqF;AACrF,wBAAsB,gBAAgB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,GAAG,SAAS,GAC7B,OAAO,CAAC,OAAO,CAAC,CAoClB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* transport.ts — one stateless MCP `tools/call` round trip to DeepWiki.
|
|
3
|
+
*
|
|
4
|
+
* DeepWiki's public endpoint issues no `Mcp-Session-Id`, so a session-bearing
|
|
5
|
+
* `McpClient` would only add an initialize handshake to every uncached call.
|
|
6
|
+
* The request therefore stays a single POST. Retry and abort semantics come from
|
|
7
|
+
* `management-http`, body bounding from `http-response`, and JSON-RPC validation
|
|
8
|
+
* from `@earendil-works/pi-mcp`. The SSE framing is the only local protocol code
|
|
9
|
+
* because pi-mcp does not export its stream parser.
|
|
10
|
+
*/
|
|
11
|
+
import { isJsonRpcResponse, McpError, parseJsonRpcMessage, } from "@earendil-works/pi-mcp";
|
|
12
|
+
import { readResponseTextBounded } from "../../utils/http-response.js";
|
|
13
|
+
import { fetchWithRetry } from "../../utils/management-http.js";
|
|
14
|
+
const DEEPWIKI_MCP_URL = "https://mcp.deepwiki.com/mcp";
|
|
15
|
+
const REQUEST_TIMEOUT_MS = 45_000;
|
|
16
|
+
const RESPONSE_BODY_BYTES = 8 * 1024 * 1024;
|
|
17
|
+
const ERROR_BODY_CHARS = 500;
|
|
18
|
+
/** Pinned, not pi-mcp's latest: this call never negotiates, so it sends the version DeepWiki is known to accept. */
|
|
19
|
+
const PROTOCOL_VERSION = "2024-11-05";
|
|
20
|
+
function parseJson(text) {
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(text);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
throw new Error(`DeepWiki returned invalid JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function parseJsonRpcResponse(value) {
|
|
29
|
+
const message = parseJsonRpcMessage(value);
|
|
30
|
+
if (!isJsonRpcResponse(message))
|
|
31
|
+
throw new Error("DeepWiki returned a JSON-RPC message that is not a response");
|
|
32
|
+
return message;
|
|
33
|
+
}
|
|
34
|
+
/** The first JSON-RPC response in an SSE body; notifications and `[DONE]` are skipped. */
|
|
35
|
+
function parseSseResponse(text) {
|
|
36
|
+
for (const block of text.split(/\r?\n\r?\n/)) {
|
|
37
|
+
const data = block
|
|
38
|
+
.split(/\r?\n/)
|
|
39
|
+
.filter((line) => line.startsWith("data:"))
|
|
40
|
+
.map((line) => line.slice(5).replace(/^ /, ""))
|
|
41
|
+
.join("\n")
|
|
42
|
+
.trim();
|
|
43
|
+
if (!data || data === "[DONE]")
|
|
44
|
+
continue;
|
|
45
|
+
const message = parseJsonRpcMessage(parseJson(data));
|
|
46
|
+
if (isJsonRpcResponse(message))
|
|
47
|
+
return message;
|
|
48
|
+
}
|
|
49
|
+
throw new Error("DeepWiki returned an empty event stream");
|
|
50
|
+
}
|
|
51
|
+
function truncate(text) {
|
|
52
|
+
return text.length <= ERROR_BODY_CHARS ? text : `${text.slice(0, ERROR_BODY_CHARS - 3)}...`;
|
|
53
|
+
}
|
|
54
|
+
/** Call a DeepWiki MCP tool and return the raw `result` of the JSON-RPC response. */
|
|
55
|
+
export async function callDeepWikiTool(toolName, args, signal) {
|
|
56
|
+
// One budget for connect, retries, and body read; it is terminal, so a timeout is never retried.
|
|
57
|
+
const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);
|
|
58
|
+
const requestSignal = signal ? AbortSignal.any([signal, timeout]) : timeout;
|
|
59
|
+
try {
|
|
60
|
+
const response = await fetchWithRetry(DEEPWIKI_MCP_URL, {
|
|
61
|
+
method: "POST",
|
|
62
|
+
headers: {
|
|
63
|
+
Accept: "application/json, text/event-stream",
|
|
64
|
+
"Content-Type": "application/json",
|
|
65
|
+
"MCP-Protocol-Version": PROTOCOL_VERSION,
|
|
66
|
+
},
|
|
67
|
+
body: JSON.stringify({
|
|
68
|
+
jsonrpc: "2.0",
|
|
69
|
+
id: 1,
|
|
70
|
+
method: "tools/call",
|
|
71
|
+
params: { name: toolName, arguments: args },
|
|
72
|
+
}),
|
|
73
|
+
signal: requestSignal,
|
|
74
|
+
});
|
|
75
|
+
const text = await readResponseTextBounded(response, {
|
|
76
|
+
maxBytes: RESPONSE_BODY_BYTES,
|
|
77
|
+
overflowMessage: `DeepWiki response exceeded ${RESPONSE_BODY_BYTES} bytes`,
|
|
78
|
+
signal: requestSignal,
|
|
79
|
+
});
|
|
80
|
+
if (!response.ok)
|
|
81
|
+
throw new Error(`DeepWiki HTTP ${response.status}: ${truncate(text)}`);
|
|
82
|
+
const isSse = response.headers.get("content-type")?.includes("text/event-stream");
|
|
83
|
+
const message = isSse ? parseSseResponse(text) : parseJsonRpcResponse(parseJson(text));
|
|
84
|
+
if ("error" in message)
|
|
85
|
+
throw new McpError(message.error.code, message.error.message, message.error.data);
|
|
86
|
+
return message.result;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (signal?.aborted)
|
|
90
|
+
throw new Error("DeepWiki request aborted");
|
|
91
|
+
if (timeout.aborted)
|
|
92
|
+
throw new Error(`DeepWiki request timed out after ${REQUEST_TIMEOUT_MS / 1000}s`);
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/transport.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * transport.ts — one stateless MCP `tools/call` round trip to DeepWiki.\n *\n * DeepWiki's public endpoint issues no `Mcp-Session-Id`, so a session-bearing\n * `McpClient` would only add an initialize handshake to every uncached call.\n * The request therefore stays a single POST. Retry and abort semantics come from\n * `management-http`, body bounding from `http-response`, and JSON-RPC validation\n * from `@earendil-works/pi-mcp`. The SSE framing is the only local protocol code\n * because pi-mcp does not export its stream parser.\n */\nimport {\n\tisJsonRpcResponse,\n\ttype JsonRpcResponse,\n\tMcpError,\n\tparseJsonRpcMessage,\n\ttype SupportedProtocolVersion,\n} from \"@earendil-works/pi-mcp\";\nimport { readResponseTextBounded } from \"../../utils/http-response.ts\";\nimport { fetchWithRetry } from \"../../utils/management-http.ts\";\n\nconst DEEPWIKI_MCP_URL = \"https://mcp.deepwiki.com/mcp\";\nconst REQUEST_TIMEOUT_MS = 45_000;\nconst RESPONSE_BODY_BYTES = 8 * 1024 * 1024;\nconst ERROR_BODY_CHARS = 500;\n/** Pinned, not pi-mcp's latest: this call never negotiates, so it sends the version DeepWiki is known to accept. */\nconst PROTOCOL_VERSION: SupportedProtocolVersion = \"2024-11-05\";\n\nfunction parseJson(text: string): unknown {\n\ttry {\n\t\treturn JSON.parse(text);\n\t} catch (error) {\n\t\tthrow new Error(`DeepWiki returned invalid JSON: ${error instanceof Error ? error.message : String(error)}`);\n\t}\n}\n\nfunction parseJsonRpcResponse(value: unknown): JsonRpcResponse {\n\tconst message = parseJsonRpcMessage(value);\n\tif (!isJsonRpcResponse(message)) throw new Error(\"DeepWiki returned a JSON-RPC message that is not a response\");\n\treturn message;\n}\n\n/** The first JSON-RPC response in an SSE body; notifications and `[DONE]` are skipped. */\nfunction parseSseResponse(text: string): JsonRpcResponse {\n\tfor (const block of text.split(/\\r?\\n\\r?\\n/)) {\n\t\tconst data = block\n\t\t\t.split(/\\r?\\n/)\n\t\t\t.filter((line) => line.startsWith(\"data:\"))\n\t\t\t.map((line) => line.slice(5).replace(/^ /, \"\"))\n\t\t\t.join(\"\\n\")\n\t\t\t.trim();\n\t\tif (!data || data === \"[DONE]\") continue;\n\t\tconst message = parseJsonRpcMessage(parseJson(data));\n\t\tif (isJsonRpcResponse(message)) return message;\n\t}\n\tthrow new Error(\"DeepWiki returned an empty event stream\");\n}\n\nfunction truncate(text: string): string {\n\treturn text.length <= ERROR_BODY_CHARS ? text : `${text.slice(0, ERROR_BODY_CHARS - 3)}...`;\n}\n\n/** Call a DeepWiki MCP tool and return the raw `result` of the JSON-RPC response. */\nexport async function callDeepWikiTool(\n\ttoolName: string,\n\targs: Record<string, unknown>,\n\tsignal: AbortSignal | undefined,\n): Promise<unknown> {\n\t// One budget for connect, retries, and body read; it is terminal, so a timeout is never retried.\n\tconst timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);\n\tconst requestSignal = signal ? AbortSignal.any([signal, timeout]) : timeout;\n\ttry {\n\t\tconst response = await fetchWithRetry(DEEPWIKI_MCP_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAccept: \"application/json, text/event-stream\",\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"MCP-Protocol-Version\": PROTOCOL_VERSION,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid: 1,\n\t\t\t\tmethod: \"tools/call\",\n\t\t\t\tparams: { name: toolName, arguments: args },\n\t\t\t}),\n\t\t\tsignal: requestSignal,\n\t\t});\n\t\tconst text = await readResponseTextBounded(response, {\n\t\t\tmaxBytes: RESPONSE_BODY_BYTES,\n\t\t\toverflowMessage: `DeepWiki response exceeded ${RESPONSE_BODY_BYTES} bytes`,\n\t\t\tsignal: requestSignal,\n\t\t});\n\t\tif (!response.ok) throw new Error(`DeepWiki HTTP ${response.status}: ${truncate(text)}`);\n\n\t\tconst isSse = response.headers.get(\"content-type\")?.includes(\"text/event-stream\");\n\t\tconst message = isSse ? parseSseResponse(text) : parseJsonRpcResponse(parseJson(text));\n\t\tif (\"error\" in message) throw new McpError(message.error.code, message.error.message, message.error.data);\n\t\treturn message.result;\n\t} catch (error) {\n\t\tif (signal?.aborted) throw new Error(\"DeepWiki request aborted\");\n\t\tif (timeout.aborted) throw new Error(`DeepWiki request timed out after ${REQUEST_TIMEOUT_MS / 1000}s`);\n\t\tthrow error;\n\t}\n}\n"]}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import "../keybindings.ts";
|
|
9
9
|
import { type CatalogEntry } from "../catalog.ts";
|
|
10
|
-
import type {
|
|
10
|
+
import type { EditorPane, ModelHandle, ProviderPaneHost } from "./pane.ts";
|
|
11
11
|
import { type ScrollWindowInfo } from "./value-row.ts";
|
|
12
12
|
export declare class BuiltinCandidatesPane implements EditorPane {
|
|
13
13
|
readonly crumb = "Use Built-in Data";
|
|
@@ -17,7 +17,7 @@ export declare class BuiltinCandidatesPane implements EditorPane {
|
|
|
17
17
|
private focused;
|
|
18
18
|
private readonly host;
|
|
19
19
|
private readonly model;
|
|
20
|
-
constructor(host:
|
|
20
|
+
constructor(host: ProviderPaneHost, model: ModelHandle);
|
|
21
21
|
private candidates;
|
|
22
22
|
render(width: number): string[];
|
|
23
23
|
scrollWindow(): ScrollWindowInfo;
|
|
@@ -40,7 +40,7 @@ export declare class BuiltinPreviewPane implements EditorPane {
|
|
|
40
40
|
private readonly host;
|
|
41
41
|
private readonly model;
|
|
42
42
|
private readonly reference;
|
|
43
|
-
constructor(host:
|
|
43
|
+
constructor(host: ProviderPaneHost, model: ModelHandle, reference: CatalogEntry);
|
|
44
44
|
private rowCount;
|
|
45
45
|
render(width: number): string[];
|
|
46
46
|
scrollWindow(): ScrollWindowInfo;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtin-data.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/builtin-data.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,mBAAmB,CAAC;AAI3B,OAAO,EAAE,KAAK,YAAY,EAA6D,MAAM,eAAe,CAAC;AAI7G,OAAO,KAAK,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"builtin-data.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/builtin-data.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,mBAAmB,CAAC;AAI3B,OAAO,EAAE,KAAK,YAAY,EAA6D,MAAM,eAAe,CAAC;AAI7G,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAmC,KAAK,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AAOrG,qBAAa,qBAAsB,YAAW,UAAU;IACvD,QAAQ,CAAC,KAAK,uBAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;gBACxB,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,WAAW;IAYtD,OAAO,CAAC,UAAU;IAIlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA4B/B,YAAY,IAAI,gBAAgB;IAKhC,OAAO,CAAC,WAAW;IAMnB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAwB/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAQf;AAED,qBAAa,kBAAmB,YAAW,UAAU;IACpD,QAAQ,CAAC,KAAK,sCAAiC;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAC7B,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY;IAY/E,OAAO,CAAC,QAAQ;IAIhB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAsC/B,YAAY,IAAI,gBAAgB;IAahC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAwC/B,OAAO,CAAC,KAAK;IA+Bb,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,KAAK,IAAI,MAAM;CAOf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtin-data.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/builtin-data.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Use Built-in Data: pick a Pi builtin catalog entry as a reference for the\n * current model, preview per-field changes (\"current → reference\"), check the\n * fields to copy, and apply once. Selection and preview are temporary state;\n * Esc applies nothing. Identity/connection fields (provider, id, api,\n * baseUrl, keys) are never touched.\n */\n\nimport \"../keybindings.ts\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { ModelsJsonModel } from \"../../../core/model-config.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { type CatalogEntry, computeFieldChanges, type FieldChange, matchBuiltinModels } from \"../catalog.ts\";\nimport { truncate } from \"../constants.ts\";\nimport { jsonEquals } from \"../store.ts\";\nimport { moveSelection } from \"./controls.ts\";\nimport type { EditorHost, EditorPane, ModelHandle } from \"./pane.ts\";\nimport { renderInfoLine, renderPlainLine, type ScrollWindowInfo, ValueEditor } from \"./value-row.ts\";\n\nfunction formatContext(model: Model<Api>): string {\n\tconst ctx = model.contextWindow >= 1000 ? `${Math.round(model.contextWindow / 1024)}k` : String(model.contextWindow);\n\treturn `${model.api} · ${ctx} ctx${model.reasoning ? \" · reasoning\" : \"\"}`;\n}\n\nexport class BuiltinCandidatesPane implements EditorPane {\n\treadonly crumb = \"Use Built-in Data\";\n\tprivate readonly search: ValueEditor;\n\tprivate query: string;\n\tprivate index = 0;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\n\t\tthis.query = this.model.read().id ?? \"\";\n\t\tthis.search = new ValueEditor({\n\t\t\tonCommit: () => this.pickCurrent(),\n\t\t\tonCancel: () => this.host.popPane(),\n\t\t});\n\t\tthis.search.reset(this.query);\n\t}\n\n\tprivate candidates(): ReturnType<typeof matchBuiltinModels> {\n\t\treturn matchBuiltinModels(this.query, this.host.effectiveApi(this.model.read()));\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst lines: string[] = [this.search.renderLine(width)];\n\t\tconst matches = this.candidates();\n\t\tif (matches.length === 0) {\n\t\t\tlines.push(renderInfoLine(theme, \"No builtin candidates — keep configuring manually.\", width));\n\t\t}\n\t\tfor (const [rowIndex, match] of matches.entries()) {\n\t\t\tconst { providerId, model } = match.entry;\n\t\t\tconst label = `${providerId} / ${model.id}`;\n\t\t\tconst note =\n\t\t\t\t(match.tier === \"exact\" ? \"exact · \" : \"\") +\n\t\t\t\t`${model.name !== model.id ? `${model.name} · ` : \"\"}${formatContext(model)}`;\n\t\t\tlines.push(\n\t\t\t\trenderPlainLine(theme, label, {\n\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tnote,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tlines.push(\n\t\t\trenderInfoLine(theme, \"Candidates are a reference only; the configured id is never rewritten.\", width),\n\t\t);\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The filter input pins above, the reference disclaimer below.\n\t\treturn { top: 1, bottom: 1, cursor: 1 + this.index };\n\t}\n\n\tprivate pickCurrent(): void {\n\t\tconst entry = this.candidates()[this.index]?.entry;\n\t\tif (!entry) return;\n\t\tthis.host.pushPane(new BuiltinPreviewPane(this.host, this.model, entry));\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst count = this.candidates().length;\n\t\tconst next = moveSelection(kb, data, this.index, count);\n\t\tif (next !== undefined) {\n\t\t\tthis.index = next;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.pickCurrent();\n\t\t\treturn;\n\t\t}\n\t\tconst before = this.query;\n\t\tthis.search.handleInput(data);\n\t\tthis.query = this.search.value;\n\t\tif (this.query !== before) this.index = 0;\n\t\tthis.host.refresh();\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tthis.search.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn true; // the candidate filter always owns ←/→\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\trawKeyHint(\"type\", \"filter\"),\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"preview\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\nexport class BuiltinPreviewPane implements EditorPane {\n\treadonly crumb = \"Use Built-in Data · preview\";\n\tprivate readonly changes: FieldChange[];\n\tprivate readonly checked: boolean[];\n\tprivate readonly snapshot: Partial<ModelsJsonModel> & { id?: string };\n\tprivate readonly snapshotApi: string | undefined;\n\tprivate index = 0;\n\tprivate expanded: number | undefined;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tprivate readonly reference: CatalogEntry;\n\tconstructor(host: EditorHost, model: ModelHandle, reference: CatalogEntry) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t\tthis.reference = reference;\n\n\t\tconst current = model.read();\n\t\tthis.snapshot = structuredClone(current);\n\t\tthis.snapshotApi = host.effectiveApi(current);\n\t\tthis.changes = computeFieldChanges(current, reference.model, host.effectiveApi(current));\n\t\tthis.checked = this.changes.map((change) => change.checked && change.applicable);\n\t}\n\n\tprivate rowCount(): number {\n\t\treturn this.changes.length + 1; // + Apply row\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst lines: string[] = [\n\t\t\trenderInfoLine(theme, `reference: ${this.reference.providerId} / ${this.reference.model.id}`, width),\n\t\t];\n\t\tfor (const [rowIndex, change] of this.changes.entries()) {\n\t\t\tconst active = rowIndex === this.index;\n\t\t\tconst expandable = change.referenceDetails !== undefined;\n\t\t\tconst note = !change.applicable ? \"· view only\" : undefined;\n\t\t\tlines.push(\n\t\t\t\trenderPlainLine(theme, `${change.field}: ${change.currentText} → ${change.referenceText}`, {\n\t\t\t\t\tchecked: change.applicable ? this.checked[rowIndex] : undefined,\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tnote,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (this.expanded === rowIndex && expandable) {\n\t\t\t\tfor (const detail of change.referenceDetails!) {\n\t\t\t\t\tlines.push(renderInfoLine(theme, ` ${detail}`, width));\n\t\t\t\t}\n\t\t\t\tif (change.referenceHasTiers) {\n\t\t\t\t\tlines.push(renderInfoLine(theme, \" reference has cost tiers — tiers are never imported.\", width));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlines.push(\n\t\t\trenderPlainLine(theme, \"Apply Selected Fields\", {\n\t\t\t\tactive: this.index === this.changes.length,\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\twidth,\n\t\t\t}),\n\t\t);\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The reference header pins above; errors pin below. Expanded detail\n\t\t// lines shift the cursor row when they sit above it.\n\t\tlet cursor = 1 + this.index;\n\t\tif (this.expanded !== undefined && this.expanded < this.index) {\n\t\t\tconst change = this.changes[this.expanded]!;\n\t\t\tif (change.referenceDetails) {\n\t\t\t\tcursor += change.referenceDetails.length + (change.referenceHasTiers ? 1 : 0);\n\t\t\t}\n\t\t}\n\t\treturn { top: 1, bottom: this.error ? 1 : 0, cursor };\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst next = moveSelection(kb, data, this.index, this.rowCount());\n\t\tif (next !== undefined) {\n\t\t\tthis.index = next;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.list.toggle\")) {\n\t\t\tconst change = this.changes[this.index];\n\t\t\tif (!change) return;\n\t\t\tif (!change.applicable) {\n\t\t\t\tthis.expanded = this.expanded === this.index ? undefined : this.index;\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.checked[this.index] = !this.checked[this.index];\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tif (this.index === this.changes.length) {\n\t\t\t\tthis.apply();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst change = this.changes[this.index]!;\n\t\t\tif (change.referenceDetails) {\n\t\t\t\tthis.expanded = this.expanded === this.index ? undefined : this.index;\n\t\t\t} else if (change.applicable) {\n\t\t\t\tthis.checked[this.index] = !this.checked[this.index];\n\t\t\t}\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate apply(): void {\n\t\t// Re-validate against the live model: a stale preview must not write to a changed model.\n\t\tconst current = this.model.read();\n\t\tif (this.host.effectiveApi(current) !== this.snapshotApi) {\n\t\t\tthis.error = \"The API changed since this preview opened; reopen to continue.\";\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (!current.id || !jsonEquals(current, this.snapshot)) {\n\t\t\tthis.error = \"The model changed since this preview opened; reopen to continue.\";\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst chosen = this.changes.filter((_, rowIndex) => this.checked[rowIndex] && this.changes[rowIndex]!.applicable);\n\t\tif (chosen.length === 0) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tthis.host.edits.batch(() => {\n\t\t\tfor (const change of chosen) {\n\t\t\t\tfor (const patch of change.patches) this.model.setField(patch.path, patch.value);\n\t\t\t}\n\t\t});\n\t\tthis.host.notify(\n\t\t\t`Applied ${chosen.length} field${chosen.length === 1 ? \"\" : \"s\"} from ${this.reference.providerId} / ${this.reference.model.id}.`,\n\t\t\t\"info\",\n\t\t);\n\t\tthis.host.popPane(); // preview\n\t\tthis.host.popPane(); // candidates → back to the model fields\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\tkeyHint(\"app.list.toggle\", \"check\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"details / apply\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"builtin-data.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/builtin-data.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Use Built-in Data: pick a Pi builtin catalog entry as a reference for the\n * current model, preview per-field changes (\"current → reference\"), check the\n * fields to copy, and apply once. Selection and preview are temporary state;\n * Esc applies nothing. Identity/connection fields (provider, id, api,\n * baseUrl, keys) are never touched.\n */\n\nimport \"../keybindings.ts\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { ModelsJsonModel } from \"../../../core/model-config.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { type CatalogEntry, computeFieldChanges, type FieldChange, matchBuiltinModels } from \"../catalog.ts\";\nimport { truncate } from \"../constants.ts\";\nimport { jsonEquals } from \"../store.ts\";\nimport { moveSelection } from \"./controls.ts\";\nimport type { EditorPane, ModelHandle, ProviderPaneHost } from \"./pane.ts\";\nimport { renderInfoLine, renderPlainLine, type ScrollWindowInfo, ValueEditor } from \"./value-row.ts\";\n\nfunction formatContext(model: Model<Api>): string {\n\tconst ctx = model.contextWindow >= 1000 ? `${Math.round(model.contextWindow / 1024)}k` : String(model.contextWindow);\n\treturn `${model.api} · ${ctx} ctx${model.reasoning ? \" · reasoning\" : \"\"}`;\n}\n\nexport class BuiltinCandidatesPane implements EditorPane {\n\treadonly crumb = \"Use Built-in Data\";\n\tprivate readonly search: ValueEditor;\n\tprivate query: string;\n\tprivate index = 0;\n\tprivate focused = false;\n\n\tprivate readonly host: ProviderPaneHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: ProviderPaneHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\n\t\tthis.query = this.model.read().id ?? \"\";\n\t\tthis.search = new ValueEditor({\n\t\t\tonCommit: () => this.pickCurrent(),\n\t\t\tonCancel: () => this.host.popPane(),\n\t\t});\n\t\tthis.search.reset(this.query);\n\t}\n\n\tprivate candidates(): ReturnType<typeof matchBuiltinModels> {\n\t\treturn matchBuiltinModels(this.query, this.host.effectiveApi(this.model.read()));\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst lines: string[] = [this.search.renderLine(width)];\n\t\tconst matches = this.candidates();\n\t\tif (matches.length === 0) {\n\t\t\tlines.push(renderInfoLine(theme, \"No builtin candidates — keep configuring manually.\", width));\n\t\t}\n\t\tfor (const [rowIndex, match] of matches.entries()) {\n\t\t\tconst { providerId, model } = match.entry;\n\t\t\tconst label = `${providerId} / ${model.id}`;\n\t\t\tconst note =\n\t\t\t\t(match.tier === \"exact\" ? \"exact · \" : \"\") +\n\t\t\t\t`${model.name !== model.id ? `${model.name} · ` : \"\"}${formatContext(model)}`;\n\t\t\tlines.push(\n\t\t\t\trenderPlainLine(theme, label, {\n\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tnote,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tlines.push(\n\t\t\trenderInfoLine(theme, \"Candidates are a reference only; the configured id is never rewritten.\", width),\n\t\t);\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The filter input pins above, the reference disclaimer below.\n\t\treturn { top: 1, bottom: 1, cursor: 1 + this.index };\n\t}\n\n\tprivate pickCurrent(): void {\n\t\tconst entry = this.candidates()[this.index]?.entry;\n\t\tif (!entry) return;\n\t\tthis.host.pushPane(new BuiltinPreviewPane(this.host, this.model, entry));\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst count = this.candidates().length;\n\t\tconst next = moveSelection(kb, data, this.index, count);\n\t\tif (next !== undefined) {\n\t\t\tthis.index = next;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.pickCurrent();\n\t\t\treturn;\n\t\t}\n\t\tconst before = this.query;\n\t\tthis.search.handleInput(data);\n\t\tthis.query = this.search.value;\n\t\tif (this.query !== before) this.index = 0;\n\t\tthis.host.refresh();\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tthis.search.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn true; // the candidate filter always owns ←/→\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\trawKeyHint(\"type\", \"filter\"),\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"preview\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\nexport class BuiltinPreviewPane implements EditorPane {\n\treadonly crumb = \"Use Built-in Data · preview\";\n\tprivate readonly changes: FieldChange[];\n\tprivate readonly checked: boolean[];\n\tprivate readonly snapshot: Partial<ModelsJsonModel> & { id?: string };\n\tprivate readonly snapshotApi: string | undefined;\n\tprivate index = 0;\n\tprivate expanded: number | undefined;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: ProviderPaneHost;\n\tprivate readonly model: ModelHandle;\n\tprivate readonly reference: CatalogEntry;\n\tconstructor(host: ProviderPaneHost, model: ModelHandle, reference: CatalogEntry) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t\tthis.reference = reference;\n\n\t\tconst current = model.read();\n\t\tthis.snapshot = structuredClone(current);\n\t\tthis.snapshotApi = host.effectiveApi(current);\n\t\tthis.changes = computeFieldChanges(current, reference.model, host.effectiveApi(current));\n\t\tthis.checked = this.changes.map((change) => change.checked && change.applicable);\n\t}\n\n\tprivate rowCount(): number {\n\t\treturn this.changes.length + 1; // + Apply row\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst lines: string[] = [\n\t\t\trenderInfoLine(theme, `reference: ${this.reference.providerId} / ${this.reference.model.id}`, width),\n\t\t];\n\t\tfor (const [rowIndex, change] of this.changes.entries()) {\n\t\t\tconst active = rowIndex === this.index;\n\t\t\tconst expandable = change.referenceDetails !== undefined;\n\t\t\tconst note = !change.applicable ? \"· view only\" : undefined;\n\t\t\tlines.push(\n\t\t\t\trenderPlainLine(theme, `${change.field}: ${change.currentText} → ${change.referenceText}`, {\n\t\t\t\t\tchecked: change.applicable ? this.checked[rowIndex] : undefined,\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tnote,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (this.expanded === rowIndex && expandable) {\n\t\t\t\tfor (const detail of change.referenceDetails!) {\n\t\t\t\t\tlines.push(renderInfoLine(theme, ` ${detail}`, width));\n\t\t\t\t}\n\t\t\t\tif (change.referenceHasTiers) {\n\t\t\t\t\tlines.push(renderInfoLine(theme, \" reference has cost tiers — tiers are never imported.\", width));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlines.push(\n\t\t\trenderPlainLine(theme, \"Apply Selected Fields\", {\n\t\t\t\tactive: this.index === this.changes.length,\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\twidth,\n\t\t\t}),\n\t\t);\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The reference header pins above; errors pin below. Expanded detail\n\t\t// lines shift the cursor row when they sit above it.\n\t\tlet cursor = 1 + this.index;\n\t\tif (this.expanded !== undefined && this.expanded < this.index) {\n\t\t\tconst change = this.changes[this.expanded]!;\n\t\t\tif (change.referenceDetails) {\n\t\t\t\tcursor += change.referenceDetails.length + (change.referenceHasTiers ? 1 : 0);\n\t\t\t}\n\t\t}\n\t\treturn { top: 1, bottom: this.error ? 1 : 0, cursor };\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst next = moveSelection(kb, data, this.index, this.rowCount());\n\t\tif (next !== undefined) {\n\t\t\tthis.index = next;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.list.toggle\")) {\n\t\t\tconst change = this.changes[this.index];\n\t\t\tif (!change) return;\n\t\t\tif (!change.applicable) {\n\t\t\t\tthis.expanded = this.expanded === this.index ? undefined : this.index;\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.checked[this.index] = !this.checked[this.index];\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tif (this.index === this.changes.length) {\n\t\t\t\tthis.apply();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst change = this.changes[this.index]!;\n\t\t\tif (change.referenceDetails) {\n\t\t\t\tthis.expanded = this.expanded === this.index ? undefined : this.index;\n\t\t\t} else if (change.applicable) {\n\t\t\t\tthis.checked[this.index] = !this.checked[this.index];\n\t\t\t}\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate apply(): void {\n\t\t// Re-validate against the live model: a stale preview must not write to a changed model.\n\t\tconst current = this.model.read();\n\t\tif (this.host.effectiveApi(current) !== this.snapshotApi) {\n\t\t\tthis.error = \"The API changed since this preview opened; reopen to continue.\";\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (!current.id || !jsonEquals(current, this.snapshot)) {\n\t\t\tthis.error = \"The model changed since this preview opened; reopen to continue.\";\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst chosen = this.changes.filter((_, rowIndex) => this.checked[rowIndex] && this.changes[rowIndex]!.applicable);\n\t\tif (chosen.length === 0) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tthis.host.edits.batch(() => {\n\t\t\tfor (const change of chosen) {\n\t\t\t\tfor (const patch of change.patches) this.model.setField(patch.path, patch.value);\n\t\t\t}\n\t\t});\n\t\tthis.host.notify(\n\t\t\t`Applied ${chosen.length} field${chosen.length === 1 ? \"\" : \"s\"} from ${this.reference.providerId} / ${this.reference.model.id}.`,\n\t\t\t\"info\",\n\t\t);\n\t\tthis.host.popPane(); // preview\n\t\tthis.host.popPane(); // candidates → back to the model fields\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\tkeyHint(\"app.list.toggle\", \"check\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"details / apply\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n"]}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* level deeper and allow free keys per the schema.
|
|
6
6
|
*/
|
|
7
7
|
import "../keybindings.ts";
|
|
8
|
-
import type {
|
|
8
|
+
import type { EditorPane, ModelHandle, PaneHost, ProviderPaneHost } from "./pane.ts";
|
|
9
9
|
import { type ScrollWindowInfo } from "./value-row.ts";
|
|
10
10
|
export declare class CompatPane implements EditorPane {
|
|
11
11
|
readonly crumb = "compat";
|
|
@@ -15,7 +15,7 @@ export declare class CompatPane implements EditorPane {
|
|
|
15
15
|
private focused;
|
|
16
16
|
private readonly host;
|
|
17
17
|
private readonly model;
|
|
18
|
-
constructor(host:
|
|
18
|
+
constructor(host: ProviderPaneHost, model: ModelHandle);
|
|
19
19
|
private entries;
|
|
20
20
|
private effectiveApi;
|
|
21
21
|
/** Entry rows plus the trailing "+ Add Entry" action. */
|
|
@@ -45,7 +45,7 @@ export declare class CompatKeyPickerPane implements EditorPane {
|
|
|
45
45
|
private readonly api;
|
|
46
46
|
private readonly taken;
|
|
47
47
|
private readonly onPick;
|
|
48
|
-
constructor(host:
|
|
48
|
+
constructor(host: PaneHost, api: string, taken: ReadonlySet<string>, onPick: (key: string) => void);
|
|
49
49
|
private candidates;
|
|
50
50
|
render(width: number): string[];
|
|
51
51
|
scrollWindow(): ScrollWindowInfo;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/compat.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,mBAAmB,CAAC;AAQ3B,OAAO,KAAK,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/compat.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,mBAAmB,CAAC;AAQ3B,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACrF,OAAO,EAIN,KAAK,gBAAgB,EAErB,MAAM,gBAAgB,CAAC;AAoBxB,qBAAa,UAAW,YAAW,UAAU;IAC5C,QAAQ,CAAC,KAAK,YAAY;IAC1B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;gBACxB,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,WAAW;IAKtD,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,YAAY;IAIpB,yDAAyD;IACzD,OAAO,CAAC,QAAQ;IAIhB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA6D/B,YAAY,IAAI,gBAAgB;IAMhC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAyD/B,OAAO,CAAC,WAAW;IA4CnB,4EAA4E;IAC5E,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,IAAI;IAKZ,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAgBf;AAMD,qBAAa,mBAAoB,YAAW,UAAU;IACrD,QAAQ,CAAC,KAAK,6BAAwB;IACtC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;gBAEnC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;IAYlG,OAAO,CAAC,UAAU;IAMlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAmB/B,YAAY,IAAI,gBAAgB;IAKhC,OAAO,CAAC,WAAW;IAOnB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA6B/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAQf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compat.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/compat.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Compat pane: entries are `Key: Value` rows whose Key comes from the known\n * field catalog of the model's effective API (picker, no arbitrary top-level\n * keys). Open dictionaries (chatTemplateKwargs/chatTemplateArgs) nest one\n * level deeper and allow free keys per the schema.\n */\n\nimport \"../keybindings.ts\";\nimport { fuzzyFilter } from \"@earendil-works/pi-tui\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { type CompatField, compatFieldFor, compatFieldsForApi, validateJsonCompatValue } from \"../compat-fields.ts\";\nimport { truncate } from \"../constants.ts\";\nimport { DELETE } from \"../store.ts\";\nimport { moveSelection } from \"./controls.ts\";\nimport { DictPane } from \"./dictionary.ts\";\nimport type { EditorHost, EditorPane, ModelHandle } from \"./pane.ts\";\nimport {\n\trenderInfoLine,\n\trenderKeyValueLine,\n\trenderPlainLine,\n\ttype ScrollWindowInfo,\n\tValueEditor,\n} from \"./value-row.ts\";\n\nfunction compatObject(handle: ModelHandle): Record<string, unknown> {\n\tconst compat = handle.read().compat;\n\treturn typeof compat === \"object\" && compat !== null && !Array.isArray(compat)\n\t\t? (compat as Record<string, unknown>)\n\t\t: {};\n}\n\nfunction scalarText(value: unknown): string {\n\tif (value === null) return \"null\";\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n\treturn JSON.stringify(value) ?? String(value);\n}\n\ntype CompatMode =\n\t| { type: \"list\" }\n\t| { type: \"editValue\"; key: string; editor: ValueEditor }\n\t| { type: \"chooseValue\"; key: string; options: readonly string[]; index: number };\n\nexport class CompatPane implements EditorPane {\n\treadonly crumb = \"compat\";\n\tprivate index = 0;\n\tprivate mode: CompatMode = { type: \"list\" };\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t}\n\n\tprivate entries(): [string, unknown][] {\n\t\treturn Object.entries(compatObject(this.model));\n\t}\n\n\tprivate effectiveApi(): string | undefined {\n\t\treturn this.host.effectiveApi(this.model.read());\n\t}\n\n\t/** Entry rows plus the trailing \"+ Add Entry\" action. */\n\tprivate rowCount(): number {\n\t\treturn this.entries().length + 1;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst api = this.effectiveApi();\n\t\tconst lines: string[] = [\n\t\t\trenderInfoLine(theme, api ? `effective api: ${api}` : \"effective api: unresolved — set API Type\", width),\n\t\t];\n\t\tif (this.mode.type === \"chooseValue\") {\n\t\t\tconst mode = this.mode;\n\t\t\tlines.push(\n\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: mode.key,\n\t\t\t\t\tvalueText: \"choose a value\",\n\t\t\t\t\tactive: true,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tfor (const [index, option] of mode.options.entries()) {\n\t\t\t\tlines.push(\n\t\t\t\t\trenderPlainLine(theme, option, { active: index === mode.index, paneFocused: this.focused, width }),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn lines;\n\t\t}\n\t\tconst known = api ? compatFieldsForApi(api) : [];\n\t\tconst entries = this.entries();\n\t\tconst editingKey = this.mode.type === \"list\" ? undefined : this.mode.key;\n\t\tif (editingKey !== undefined && !entries.some(([key]) => key === editingKey))\n\t\t\tentries.push([editingKey, undefined]);\n\t\tif (known.length === 0 && entries.length === 0) {\n\t\t\tlines.push(renderInfoLine(theme, `No compat fields are known for ${api ?? \"this api\"}.`, width));\n\t\t}\n\t\t// All entries render; the editor's fixed window scrolls around scrollWindow().\n\t\tfor (const [rowIndex, [key, value]] of entries.entries()) {\n\t\t\tconst active = rowIndex === this.index;\n\t\t\tconst field = api ? compatFieldFor(api, key) : undefined;\n\t\t\tconst editing = this.mode.type === \"editValue\" && this.mode.key === key ? this.mode.editor : undefined;\n\t\t\tconst note = field ? undefined : `· not used by ${api ?? \"this api\"}`;\n\t\t\tlines.push(\n\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: key,\n\t\t\t\t\tvalueText: value === undefined ? \"not set\" : scalarText(value),\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tediting,\n\t\t\t\t\tnote,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tlines.push(\n\t\t\trenderPlainLine(theme, \"+ Add Entry\", {\n\t\t\t\tactive: this.index === entries.length && this.mode.type === \"list\",\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\twidth,\n\t\t\t}),\n\t\t);\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The effective-api header pins above; errors pin below.\n\t\tif (this.mode.type === \"chooseValue\") return { top: 1, cursor: 2 + this.mode.index };\n\t\treturn { top: 1, bottom: this.error ? 1 : 0, cursor: 1 + this.index };\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (this.mode.type === \"editValue\") {\n\t\t\tif (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) return;\n\t\t\tthis.mode.editor.handleInput(data);\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.mode.type === \"chooseValue\") {\n\t\t\tconst mode = this.mode;\n\t\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\t\tthis.mode = { ...mode, index: mode.index === 0 ? mode.options.length - 1 : mode.index - 1 };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\t\tthis.mode = { ...mode, index: (mode.index + 1) % mode.options.length };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\t\tconst option = mode.options[mode.index]!;\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.writeValue(mode.key, this.parseChosen(option));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t// list mode\n\t\tconst next = moveSelection(kb, data, this.index, this.rowCount());\n\t\tif (next !== undefined) {\n\t\t\tthis.index = next;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.provider.removeEntry\")) {\n\t\t\tconst entry = this.entries()[this.index];\n\t\t\tif (!entry) return;\n\t\t\tconst [key] = entry;\n\t\t\tthis.model.setField([\"compat\", key], DELETE);\n\t\t\tthis.index = Math.min(this.index, this.rowCount() - 2 < 0 ? 0 : this.rowCount() - 2);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.list.toggle\") || kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.activateRow();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate activateRow(): void {\n\t\tconst entries = this.entries();\n\t\tif (this.index === entries.length) {\n\t\t\tconst api = this.effectiveApi();\n\t\t\tif (!api) {\n\t\t\t\tthis.fail(\"Set API Type first — compat fields depend on the effective api.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst known = compatFieldsForApi(api);\n\t\t\tif (known.length === 0) {\n\t\t\t\tthis.fail(`No compat fields are known for ${api}.`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst taken = new Set(entries.map(([key]) => key));\n\t\t\tthis.host.pushPane(new CompatKeyPickerPane(this.host, api, taken, (key) => this.beginValueEntry(key)));\n\t\t\treturn;\n\t\t}\n\t\tconst [key, value] = entries[this.index]!;\n\t\tconst field = this.effectiveApi() ? compatFieldFor(this.effectiveApi()!, key) : undefined;\n\t\tif (!field) {\n\t\t\t// unknown/foreign key: raw JSON edit\n\t\t\tthis.beginJsonEdit(key, value);\n\t\t\treturn;\n\t\t}\n\t\tswitch (field.kind) {\n\t\t\tcase \"boolean\":\n\t\t\t\tthis.writeValue(key, value !== true);\n\t\t\t\treturn;\n\t\t\tcase \"enum\":\n\t\t\t\tthis.mode = { type: \"chooseValue\", key, options: field.options, index: 0 };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"number\":\n\t\t\t\tthis.beginTextEdit(key, value);\n\t\t\t\treturn;\n\t\t\tcase \"json\":\n\t\t\t\tthis.beginJsonEdit(key, value);\n\t\t\t\treturn;\n\t\t\tcase \"stringMap\":\n\t\t\t\tthis.host.pushPane(new DictPane(this.host, this.model, key));\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\t/** After picking a key in the picker: enter the value flow for its kind. */\n\tprivate beginValueEntry(key: string): void {\n\t\tconst api = this.effectiveApi()!;\n\t\tconst field = compatFieldFor(api, key)!;\n\t\tswitch (field.kind) {\n\t\t\tcase \"boolean\":\n\t\t\t\tthis.mode = { type: \"chooseValue\", key, options: [\"true\", \"false\"], index: 0 };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"enum\":\n\t\t\t\tthis.mode = { type: \"chooseValue\", key, options: field.options, index: 0 };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"number\":\n\t\t\t\tthis.beginTextEdit(key, undefined);\n\t\t\t\treturn;\n\t\t\tcase \"json\":\n\t\t\t\tthis.beginJsonEdit(key, undefined);\n\t\t\t\treturn;\n\t\t\tcase \"stringMap\":\n\t\t\t\t// Materialize an empty dictionary, then open it for entries.\n\t\t\t\tthis.writeValue(key, {});\n\t\t\t\tthis.host.pushPane(new DictPane(this.host, this.model, key));\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate beginTextEdit(key: string, current: unknown): void {\n\t\tconst editor = new ValueEditor({\n\t\t\tonCommit: (raw) => {\n\t\t\t\tconst parsed = Number(raw.trim());\n\t\t\t\tif (!Number.isFinite(parsed)) {\n\t\t\t\t\tthis.error = `${key} must be a number.`;\n\t\t\t\t\treturn this.host.refresh();\n\t\t\t\t}\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.writeValue(key, parsed);\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.host.refresh();\n\t\t\t},\n\t\t});\n\t\tif (current !== undefined) editor.beginTweak(String(current));\n\t\teditor.focused = this.focused;\n\t\tthis.mode = { type: \"editValue\", key, editor };\n\t\tthis.host.refresh();\n\t}\n\n\tprivate beginJsonEdit(key: string, current: unknown): void {\n\t\tconst editor = new ValueEditor({\n\t\t\tonCommit: (raw) => {\n\t\t\t\tconst text = raw.trim();\n\t\t\t\tif (!text) {\n\t\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\t\tthis.writeValue(key, DELETE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst shapeError = validateJsonCompatValue(key, text);\n\t\t\t\tif (shapeError) {\n\t\t\t\t\tthis.error = shapeError;\n\t\t\t\t\treturn this.host.refresh();\n\t\t\t\t}\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.writeValue(key, JSON.parse(text));\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.host.refresh();\n\t\t\t},\n\t\t});\n\t\tif (current !== undefined) editor.beginTweak(JSON.stringify(current));\n\t\teditor.focused = this.focused;\n\t\tthis.mode = { type: \"editValue\", key, editor };\n\t\tthis.host.refresh();\n\t}\n\n\tprivate parseChosen(option: string): unknown {\n\t\tif (option === \"true\") return true;\n\t\tif (option === \"false\") return false;\n\t\treturn option;\n\t}\n\n\tprivate writeValue(key: string, value: unknown): void {\n\t\tthis.model.setField([\"compat\", key], value);\n\t}\n\n\tprivate fail(message: string): void {\n\t\tthis.error = message;\n\t\tthis.host.refresh();\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tif (this.mode.type === \"editValue\") this.mode.editor.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.mode.type === \"editValue\";\n\t}\n\n\thints(): string {\n\t\tif (this.mode.type === \"editValue\")\n\t\t\treturn [keyHint(\"tui.input.submit\", \"save\"), keyHint(\"tui.select.cancel\", \"cancel\")].join(\" \");\n\t\tif (this.mode.type === \"chooseValue\")\n\t\t\treturn [\n\t\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\t\tkeyHint(\"tui.select.confirm\", \"set\"),\n\t\t\t\tkeyHint(\"tui.select.cancel\", \"cancel\"),\n\t\t\t].join(\" \");\n\t\treturn [\n\t\t\tkeyHint(\"tui.select.confirm\", \"edit\"),\n\t\t\tkeyHint(\"app.list.toggle\", \"toggle\"),\n\t\t\tkeyHint(\"app.provider.removeEntry\", \"remove\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n// -------------------------------------------------------------------------\n// Known-key picker (searchable, filters already-configured keys)\n// -------------------------------------------------------------------------\n\nexport class CompatKeyPickerPane implements EditorPane {\n\treadonly crumb = \"compat · new entry\";\n\tprivate query = \"\";\n\tprivate index = 0;\n\tprivate editor: ValueEditor;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly api: string;\n\tprivate readonly taken: ReadonlySet<string>;\n\tprivate readonly onPick: (key: string) => void;\n\n\tconstructor(host: EditorHost, api: string, taken: ReadonlySet<string>, onPick: (key: string) => void) {\n\t\tthis.host = host;\n\t\tthis.api = api;\n\t\tthis.taken = taken;\n\t\tthis.onPick = onPick;\n\n\t\tthis.editor = new ValueEditor({\n\t\t\tonCommit: () => this.pickCurrent(),\n\t\t\tonCancel: () => this.host.popPane(),\n\t\t});\n\t}\n\n\tprivate candidates(): CompatField[] {\n\t\tconst available = compatFieldsForApi(this.api).filter((field) => !this.taken.has(field.key));\n\t\tconst query = this.query.trim();\n\t\treturn query ? fuzzyFilter(available, query, (field) => `${field.key} ${field.note ?? \"\"}`) : available;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst lines: string[] = [this.editor.renderLine(width)];\n\t\tconst candidates = this.candidates();\n\t\tif (candidates.length === 0) lines.push(renderInfoLine(theme, \"No remaining known fields.\", width));\n\t\t// All candidates render; the editor's fixed window scrolls around scrollWindow().\n\t\tfor (const [rowIndex, field] of candidates.entries()) {\n\t\t\tlines.push(\n\t\t\t\trenderPlainLine(theme, field.key, {\n\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tnote: field.note ? `· ${field.kind} — ${truncate(field.note, 30)}` : `· ${field.kind}`,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The filter input pins above the candidate rows.\n\t\treturn { top: 1, cursor: 1 + this.index };\n\t}\n\n\tprivate pickCurrent(): void {\n\t\tconst field = this.candidates()[this.index];\n\t\tif (!field) return;\n\t\tthis.host.popPane();\n\t\tthis.onPick(field.key);\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tconst count = this.candidates().length;\n\t\t\tif (count > 0) this.index = this.index === 0 ? count - 1 : this.index - 1;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tconst count = this.candidates().length;\n\t\t\tif (count > 0) this.index = (this.index + 1) % count;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.pickCurrent();\n\t\t\treturn;\n\t\t}\n\t\tconst before = this.query;\n\t\tthis.editor.handleInput(data);\n\t\tthis.query = this.editor.value;\n\t\tif (this.query !== before) this.index = 0;\n\t\tthis.host.refresh();\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tthis.editor.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn true; // the filter input always owns ←/→\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\trawKeyHint(\"type\", \"filter\"),\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"choose\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"compat.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/compat.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Compat pane: entries are `Key: Value` rows whose Key comes from the known\n * field catalog of the model's effective API (picker, no arbitrary top-level\n * keys). Open dictionaries (chatTemplateKwargs/chatTemplateArgs) nest one\n * level deeper and allow free keys per the schema.\n */\n\nimport \"../keybindings.ts\";\nimport { fuzzyFilter } from \"@earendil-works/pi-tui\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { type CompatField, compatFieldFor, compatFieldsForApi, validateJsonCompatValue } from \"../compat-fields.ts\";\nimport { truncate } from \"../constants.ts\";\nimport { DELETE } from \"../store.ts\";\nimport { moveSelection } from \"./controls.ts\";\nimport { DictPane } from \"./dictionary.ts\";\nimport type { EditorPane, ModelHandle, PaneHost, ProviderPaneHost } from \"./pane.ts\";\nimport {\n\trenderInfoLine,\n\trenderKeyValueLine,\n\trenderPlainLine,\n\ttype ScrollWindowInfo,\n\tValueEditor,\n} from \"./value-row.ts\";\n\nfunction compatObject(handle: ModelHandle): Record<string, unknown> {\n\tconst compat = handle.read().compat;\n\treturn typeof compat === \"object\" && compat !== null && !Array.isArray(compat)\n\t\t? (compat as Record<string, unknown>)\n\t\t: {};\n}\n\nfunction scalarText(value: unknown): string {\n\tif (value === null) return \"null\";\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n\treturn JSON.stringify(value) ?? String(value);\n}\n\ntype CompatMode =\n\t| { type: \"list\" }\n\t| { type: \"editValue\"; key: string; editor: ValueEditor }\n\t| { type: \"chooseValue\"; key: string; options: readonly string[]; index: number };\n\nexport class CompatPane implements EditorPane {\n\treadonly crumb = \"compat\";\n\tprivate index = 0;\n\tprivate mode: CompatMode = { type: \"list\" };\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: ProviderPaneHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: ProviderPaneHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t}\n\n\tprivate entries(): [string, unknown][] {\n\t\treturn Object.entries(compatObject(this.model));\n\t}\n\n\tprivate effectiveApi(): string | undefined {\n\t\treturn this.host.effectiveApi(this.model.read());\n\t}\n\n\t/** Entry rows plus the trailing \"+ Add Entry\" action. */\n\tprivate rowCount(): number {\n\t\treturn this.entries().length + 1;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst api = this.effectiveApi();\n\t\tconst lines: string[] = [\n\t\t\trenderInfoLine(theme, api ? `effective api: ${api}` : \"effective api: unresolved — set API Type\", width),\n\t\t];\n\t\tif (this.mode.type === \"chooseValue\") {\n\t\t\tconst mode = this.mode;\n\t\t\tlines.push(\n\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: mode.key,\n\t\t\t\t\tvalueText: \"choose a value\",\n\t\t\t\t\tactive: true,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tfor (const [index, option] of mode.options.entries()) {\n\t\t\t\tlines.push(\n\t\t\t\t\trenderPlainLine(theme, option, { active: index === mode.index, paneFocused: this.focused, width }),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn lines;\n\t\t}\n\t\tconst known = api ? compatFieldsForApi(api) : [];\n\t\tconst entries = this.entries();\n\t\tconst editingKey = this.mode.type === \"list\" ? undefined : this.mode.key;\n\t\tif (editingKey !== undefined && !entries.some(([key]) => key === editingKey))\n\t\t\tentries.push([editingKey, undefined]);\n\t\tif (known.length === 0 && entries.length === 0) {\n\t\t\tlines.push(renderInfoLine(theme, `No compat fields are known for ${api ?? \"this api\"}.`, width));\n\t\t}\n\t\t// All entries render; the editor's fixed window scrolls around scrollWindow().\n\t\tfor (const [rowIndex, [key, value]] of entries.entries()) {\n\t\t\tconst active = rowIndex === this.index;\n\t\t\tconst field = api ? compatFieldFor(api, key) : undefined;\n\t\t\tconst editing = this.mode.type === \"editValue\" && this.mode.key === key ? this.mode.editor : undefined;\n\t\t\tconst note = field ? undefined : `· not used by ${api ?? \"this api\"}`;\n\t\t\tlines.push(\n\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: key,\n\t\t\t\t\tvalueText: value === undefined ? \"not set\" : scalarText(value),\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tediting,\n\t\t\t\t\tnote,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tlines.push(\n\t\t\trenderPlainLine(theme, \"+ Add Entry\", {\n\t\t\t\tactive: this.index === entries.length && this.mode.type === \"list\",\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\twidth,\n\t\t\t}),\n\t\t);\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The effective-api header pins above; errors pin below.\n\t\tif (this.mode.type === \"chooseValue\") return { top: 1, cursor: 2 + this.mode.index };\n\t\treturn { top: 1, bottom: this.error ? 1 : 0, cursor: 1 + this.index };\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (this.mode.type === \"editValue\") {\n\t\t\tif (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) return;\n\t\t\tthis.mode.editor.handleInput(data);\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.mode.type === \"chooseValue\") {\n\t\t\tconst mode = this.mode;\n\t\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\t\tthis.mode = { ...mode, index: mode.index === 0 ? mode.options.length - 1 : mode.index - 1 };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\t\tthis.mode = { ...mode, index: (mode.index + 1) % mode.options.length };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\t\tconst option = mode.options[mode.index]!;\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.writeValue(mode.key, this.parseChosen(option));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t// list mode\n\t\tconst next = moveSelection(kb, data, this.index, this.rowCount());\n\t\tif (next !== undefined) {\n\t\t\tthis.index = next;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.provider.removeEntry\")) {\n\t\t\tconst entry = this.entries()[this.index];\n\t\t\tif (!entry) return;\n\t\t\tconst [key] = entry;\n\t\t\tthis.model.setField([\"compat\", key], DELETE);\n\t\t\tthis.index = Math.min(this.index, this.rowCount() - 2 < 0 ? 0 : this.rowCount() - 2);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.list.toggle\") || kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.activateRow();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate activateRow(): void {\n\t\tconst entries = this.entries();\n\t\tif (this.index === entries.length) {\n\t\t\tconst api = this.effectiveApi();\n\t\t\tif (!api) {\n\t\t\t\tthis.fail(\"Set API Type first — compat fields depend on the effective api.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst known = compatFieldsForApi(api);\n\t\t\tif (known.length === 0) {\n\t\t\t\tthis.fail(`No compat fields are known for ${api}.`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst taken = new Set(entries.map(([key]) => key));\n\t\t\tthis.host.pushPane(new CompatKeyPickerPane(this.host, api, taken, (key) => this.beginValueEntry(key)));\n\t\t\treturn;\n\t\t}\n\t\tconst [key, value] = entries[this.index]!;\n\t\tconst field = this.effectiveApi() ? compatFieldFor(this.effectiveApi()!, key) : undefined;\n\t\tif (!field) {\n\t\t\t// unknown/foreign key: raw JSON edit\n\t\t\tthis.beginJsonEdit(key, value);\n\t\t\treturn;\n\t\t}\n\t\tswitch (field.kind) {\n\t\t\tcase \"boolean\":\n\t\t\t\tthis.writeValue(key, value !== true);\n\t\t\t\treturn;\n\t\t\tcase \"enum\":\n\t\t\t\tthis.mode = { type: \"chooseValue\", key, options: field.options, index: 0 };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"number\":\n\t\t\t\tthis.beginTextEdit(key, value);\n\t\t\t\treturn;\n\t\t\tcase \"json\":\n\t\t\t\tthis.beginJsonEdit(key, value);\n\t\t\t\treturn;\n\t\t\tcase \"stringMap\":\n\t\t\t\tthis.host.pushPane(new DictPane(this.host, this.model, key));\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\t/** After picking a key in the picker: enter the value flow for its kind. */\n\tprivate beginValueEntry(key: string): void {\n\t\tconst api = this.effectiveApi()!;\n\t\tconst field = compatFieldFor(api, key)!;\n\t\tswitch (field.kind) {\n\t\t\tcase \"boolean\":\n\t\t\t\tthis.mode = { type: \"chooseValue\", key, options: [\"true\", \"false\"], index: 0 };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"enum\":\n\t\t\t\tthis.mode = { type: \"chooseValue\", key, options: field.options, index: 0 };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"number\":\n\t\t\t\tthis.beginTextEdit(key, undefined);\n\t\t\t\treturn;\n\t\t\tcase \"json\":\n\t\t\t\tthis.beginJsonEdit(key, undefined);\n\t\t\t\treturn;\n\t\t\tcase \"stringMap\":\n\t\t\t\t// Materialize an empty dictionary, then open it for entries.\n\t\t\t\tthis.writeValue(key, {});\n\t\t\t\tthis.host.pushPane(new DictPane(this.host, this.model, key));\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate beginTextEdit(key: string, current: unknown): void {\n\t\tconst editor = new ValueEditor({\n\t\t\tonCommit: (raw) => {\n\t\t\t\tconst parsed = Number(raw.trim());\n\t\t\t\tif (!Number.isFinite(parsed)) {\n\t\t\t\t\tthis.error = `${key} must be a number.`;\n\t\t\t\t\treturn this.host.refresh();\n\t\t\t\t}\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.writeValue(key, parsed);\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.host.refresh();\n\t\t\t},\n\t\t});\n\t\tif (current !== undefined) editor.beginTweak(String(current));\n\t\teditor.focused = this.focused;\n\t\tthis.mode = { type: \"editValue\", key, editor };\n\t\tthis.host.refresh();\n\t}\n\n\tprivate beginJsonEdit(key: string, current: unknown): void {\n\t\tconst editor = new ValueEditor({\n\t\t\tonCommit: (raw) => {\n\t\t\t\tconst text = raw.trim();\n\t\t\t\tif (!text) {\n\t\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\t\tthis.writeValue(key, DELETE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst shapeError = validateJsonCompatValue(key, text);\n\t\t\t\tif (shapeError) {\n\t\t\t\t\tthis.error = shapeError;\n\t\t\t\t\treturn this.host.refresh();\n\t\t\t\t}\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.writeValue(key, JSON.parse(text));\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.host.refresh();\n\t\t\t},\n\t\t});\n\t\tif (current !== undefined) editor.beginTweak(JSON.stringify(current));\n\t\teditor.focused = this.focused;\n\t\tthis.mode = { type: \"editValue\", key, editor };\n\t\tthis.host.refresh();\n\t}\n\n\tprivate parseChosen(option: string): unknown {\n\t\tif (option === \"true\") return true;\n\t\tif (option === \"false\") return false;\n\t\treturn option;\n\t}\n\n\tprivate writeValue(key: string, value: unknown): void {\n\t\tthis.model.setField([\"compat\", key], value);\n\t}\n\n\tprivate fail(message: string): void {\n\t\tthis.error = message;\n\t\tthis.host.refresh();\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tif (this.mode.type === \"editValue\") this.mode.editor.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.mode.type === \"editValue\";\n\t}\n\n\thints(): string {\n\t\tif (this.mode.type === \"editValue\")\n\t\t\treturn [keyHint(\"tui.input.submit\", \"save\"), keyHint(\"tui.select.cancel\", \"cancel\")].join(\" \");\n\t\tif (this.mode.type === \"chooseValue\")\n\t\t\treturn [\n\t\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\t\tkeyHint(\"tui.select.confirm\", \"set\"),\n\t\t\t\tkeyHint(\"tui.select.cancel\", \"cancel\"),\n\t\t\t].join(\" \");\n\t\treturn [\n\t\t\tkeyHint(\"tui.select.confirm\", \"edit\"),\n\t\t\tkeyHint(\"app.list.toggle\", \"toggle\"),\n\t\t\tkeyHint(\"app.provider.removeEntry\", \"remove\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n// -------------------------------------------------------------------------\n// Known-key picker (searchable, filters already-configured keys)\n// -------------------------------------------------------------------------\n\nexport class CompatKeyPickerPane implements EditorPane {\n\treadonly crumb = \"compat · new entry\";\n\tprivate query = \"\";\n\tprivate index = 0;\n\tprivate editor: ValueEditor;\n\tprivate focused = false;\n\n\tprivate readonly host: PaneHost;\n\tprivate readonly api: string;\n\tprivate readonly taken: ReadonlySet<string>;\n\tprivate readonly onPick: (key: string) => void;\n\n\tconstructor(host: PaneHost, api: string, taken: ReadonlySet<string>, onPick: (key: string) => void) {\n\t\tthis.host = host;\n\t\tthis.api = api;\n\t\tthis.taken = taken;\n\t\tthis.onPick = onPick;\n\n\t\tthis.editor = new ValueEditor({\n\t\t\tonCommit: () => this.pickCurrent(),\n\t\t\tonCancel: () => this.host.popPane(),\n\t\t});\n\t}\n\n\tprivate candidates(): CompatField[] {\n\t\tconst available = compatFieldsForApi(this.api).filter((field) => !this.taken.has(field.key));\n\t\tconst query = this.query.trim();\n\t\treturn query ? fuzzyFilter(available, query, (field) => `${field.key} ${field.note ?? \"\"}`) : available;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst lines: string[] = [this.editor.renderLine(width)];\n\t\tconst candidates = this.candidates();\n\t\tif (candidates.length === 0) lines.push(renderInfoLine(theme, \"No remaining known fields.\", width));\n\t\t// All candidates render; the editor's fixed window scrolls around scrollWindow().\n\t\tfor (const [rowIndex, field] of candidates.entries()) {\n\t\t\tlines.push(\n\t\t\t\trenderPlainLine(theme, field.key, {\n\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tnote: field.note ? `· ${field.kind} — ${truncate(field.note, 30)}` : `· ${field.kind}`,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The filter input pins above the candidate rows.\n\t\treturn { top: 1, cursor: 1 + this.index };\n\t}\n\n\tprivate pickCurrent(): void {\n\t\tconst field = this.candidates()[this.index];\n\t\tif (!field) return;\n\t\tthis.host.popPane();\n\t\tthis.onPick(field.key);\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tconst count = this.candidates().length;\n\t\t\tif (count > 0) this.index = this.index === 0 ? count - 1 : this.index - 1;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tconst count = this.candidates().length;\n\t\t\tif (count > 0) this.index = (this.index + 1) % count;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.pickCurrent();\n\t\t\treturn;\n\t\t}\n\t\tconst before = this.query;\n\t\tthis.editor.handleInput(data);\n\t\tthis.query = this.editor.value;\n\t\tif (this.query !== before) this.index = 0;\n\t\tthis.host.refresh();\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tthis.editor.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn true; // the filter input always owns ←/→\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\trawKeyHint(\"type\", \"filter\"),\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"choose\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Small reusable controls for provider panes; field policy stays with the caller. */
|
|
2
2
|
import type { KeybindingsManager } from "../../../core/keybindings.ts";
|
|
3
|
-
import type {
|
|
3
|
+
import type { EditorPane, PaneHost } from "./pane.ts";
|
|
4
4
|
import { ValueEditor } from "./value-row.ts";
|
|
5
5
|
/** Returns the wrapped selection, or undefined when this was not a navigation key. */
|
|
6
6
|
export declare function moveSelection(keys: KeybindingsManager, data: string, index: number, count: number): number | undefined;
|
|
@@ -9,7 +9,7 @@ export interface Choice<T> {
|
|
|
9
9
|
value: T;
|
|
10
10
|
dim?: boolean;
|
|
11
11
|
}
|
|
12
|
-
type ControlHost = Pick<
|
|
12
|
+
type ControlHost = Pick<PaneHost, "theme" | "keybindings" | "refresh" | "popPane">;
|
|
13
13
|
interface ChoiceOptions<T> {
|
|
14
14
|
choices(): readonly Choice<T>[];
|
|
15
15
|
current(): T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/controls.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,KAAK,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/controls.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAmC,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E,sFAAsF;AACtF,wBAAgB,aAAa,CAC5B,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAGpB;AAED,MAAM,WAAW,MAAM,CAAC,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;IACT,GAAG,CAAC,EAAE,OAAO,CAAC;CACd;AAED,KAAK,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC;AACnF,UAAU,aAAa,CAAC,CAAC;IACxB,OAAO,IAAI,SAAS,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAChC,OAAO,IAAI,CAAC,CAAC;IACb,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,UAAU;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAqB;gBAEtB,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAUvE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAa/B,YAAY,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAIlD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAmB/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAGlC,KAAK,IAAI,MAAM;CAOf;AAED,uFAAuF;AACvF,qBAAa,UAAU,CAAC,GAAG;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,MAAM,CAAgD;IAC9D,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEd,OAAO,EAAE,MAAM,IAAI;IAG/B,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,GAAG,SAAS;IAGzC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,KAAK,CACJ,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,WAAW,GAAG,OAAO,EAC3B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAC7C,SAAS,CAAC,EAAE,MAAM,GAChB,IAAI;IAoBP,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO;CAO5D"}
|