@astralyn/pi 0.83.0 → 0.84.1
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 +66 -0
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/register-bedrock.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.js.map +1 -1
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +22 -3
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.d.ts +19 -0
- package/dist/cli/auth-check.d.ts.map +1 -0
- package/dist/cli/auth-check.js +50 -0
- package/dist/cli/auth-check.js.map +1 -0
- package/dist/cli/auth-command.d.ts +24 -0
- package/dist/cli/auth-command.d.ts.map +1 -0
- package/dist/cli/auth-command.js +104 -0
- package/dist/cli/auth-command.js.map +1 -0
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +2 -2
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/credential-print.d.ts +5 -15
- package/dist/cli/credential-print.d.ts.map +1 -1
- package/dist/cli/credential-print.js +42 -82
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/cli/experimental/auth.d.ts +16 -0
- package/dist/cli/experimental/auth.d.ts.map +1 -0
- package/dist/cli/experimental/auth.js +13 -0
- package/dist/cli/experimental/auth.js.map +1 -0
- package/dist/cli/experimental/cli.d.ts +6 -0
- package/dist/cli/experimental/cli.d.ts.map +1 -0
- package/dist/cli/experimental/cli.js +5 -0
- package/dist/cli/experimental/cli.js.map +1 -0
- package/dist/cli/experimental/command-options.d.ts +17 -0
- package/dist/cli/experimental/command-options.d.ts.map +1 -0
- package/dist/cli/experimental/command-options.js +35 -0
- package/dist/cli/experimental/command-options.js.map +1 -0
- package/dist/cli/experimental/command.d.ts +63 -0
- package/dist/cli/experimental/command.d.ts.map +1 -0
- package/dist/cli/experimental/command.js +127 -0
- package/dist/cli/experimental/command.js.map +1 -0
- package/dist/cli/experimental/commands/client.d.ts +13 -0
- package/dist/cli/experimental/commands/client.d.ts.map +1 -0
- package/dist/cli/experimental/commands/client.js +25 -0
- package/dist/cli/experimental/commands/client.js.map +1 -0
- package/dist/cli/experimental/commands/pi.d.ts +15 -0
- package/dist/cli/experimental/commands/pi.d.ts.map +1 -0
- package/dist/cli/experimental/commands/pi.js +28 -0
- package/dist/cli/experimental/commands/pi.js.map +1 -0
- package/dist/cli/experimental/commands/server.d.ts +13 -0
- package/dist/cli/experimental/commands/server.d.ts.map +1 -0
- package/dist/cli/experimental/commands/server.js +25 -0
- package/dist/cli/experimental/commands/server.js.map +1 -0
- package/dist/cli/experimental/transport-address.d.ts +10 -0
- package/dist/cli/experimental/transport-address.d.ts.map +1 -0
- package/dist/cli/experimental/transport-address.js +38 -0
- package/dist/cli/experimental/transport-address.js.map +1 -0
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/list-models.d.ts +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +2 -2
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/project-trust.d.ts.map +1 -1
- package/dist/cli/project-trust.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli/startup-ui.d.ts +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +2 -2
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/remote-session.d.ts +53 -0
- package/dist/client/remote-session.d.ts.map +1 -0
- package/dist/client/remote-session.js +340 -0
- package/dist/client/remote-session.js.map +1 -0
- package/dist/client/transcript.d.ts +12 -0
- package/dist/client/transcript.d.ts.map +1 -0
- package/dist/client/transcript.js +98 -0
- package/dist/client/transcript.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +0 -8
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -0
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +30 -10
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +177 -187
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts +25 -9
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +235 -42
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/cache-stats.d.ts.map +1 -1
- package/dist/core/cache-stats.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.js.map +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.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/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +43 -20
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +2 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +25 -29
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +26 -3
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +17 -18
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +5 -0
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/keybindings.d.ts +165 -125
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +0 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config.d.ts +37 -13
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +4 -2
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts +5 -3
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +13 -11
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +4 -3
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +42 -10
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +30 -13
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +241 -91
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/models-store.d.ts +12 -7
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js +84 -16
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/output-guard.d.ts.map +1 -1
- package/dist/core/output-guard.js.map +1 -1
- package/dist/core/package-manager.d.ts +4 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +63 -42
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-manifest.d.ts +8 -0
- package/dist/core/pi-manifest.d.ts.map +1 -0
- package/dist/core/pi-manifest.js +25 -0
- package/dist/core/pi-manifest.js.map +1 -0
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/provider-composer.d.ts +4 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +36 -15
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/radius.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +73 -67
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +2 -46
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +5 -5
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js +12 -10
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-cwd.js +0 -1
- package/dist/core/session-cwd.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +10 -12
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +12 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +47 -33
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts +4 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +18 -14
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +4 -0
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +15 -10
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/find.d.ts +7 -0
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +18 -17
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +4 -0
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +5 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +4 -0
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +5 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +12 -18
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/core/tools/read.d.ts +4 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +7 -3
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/truncate.d.ts.map +1 -1
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/tools/write.d.ts +4 -0
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +6 -3
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +0 -1
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/usage-totals.d.ts.map +1 -1
- package/dist/core/usage-totals.js.map +1 -1
- package/dist/extensions/biu/index.d.ts +19 -0
- package/dist/extensions/biu/index.d.ts.map +1 -0
- package/dist/extensions/biu/index.js +350 -0
- package/dist/extensions/biu/index.js.map +1 -0
- package/dist/extensions/biu/prompts.d.ts +26 -0
- package/dist/extensions/biu/prompts.d.ts.map +1 -0
- package/dist/extensions/biu/prompts.js +260 -0
- package/dist/extensions/biu/prompts.js.map +1 -0
- package/dist/extensions/biu/workspace.d.ts +122 -0
- package/dist/extensions/biu/workspace.d.ts.map +1 -0
- package/dist/extensions/biu/workspace.js +404 -0
- package/dist/extensions/biu/workspace.js.map +1 -0
- package/dist/extensions/deepwiki/client.d.ts.map +1 -1
- package/dist/extensions/deepwiki/client.js.map +1 -1
- package/dist/extensions/deepwiki/constants.d.ts.map +1 -1
- package/dist/extensions/deepwiki/constants.js.map +1 -1
- package/dist/extensions/deepwiki/contents.d.ts.map +1 -1
- package/dist/extensions/deepwiki/contents.js.map +1 -1
- package/dist/extensions/deepwiki/execute.d.ts.map +1 -1
- package/dist/extensions/deepwiki/execute.js.map +1 -1
- package/dist/extensions/deepwiki/http.d.ts.map +1 -1
- package/dist/extensions/deepwiki/http.js.map +1 -1
- package/dist/extensions/deepwiki/index.d.ts.map +1 -1
- package/dist/extensions/deepwiki/index.js.map +1 -1
- package/dist/extensions/deepwiki/render.d.ts.map +1 -1
- package/dist/extensions/deepwiki/render.js.map +1 -1
- package/dist/extensions/deepwiki/schema.d.ts +1 -1
- package/dist/extensions/deepwiki/schema.d.ts.map +1 -1
- package/dist/extensions/deepwiki/schema.js.map +1 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +2 -0
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/llama/client.d.ts.map +1 -1
- package/dist/extensions/llama/client.js +0 -2
- package/dist/extensions/llama/client.js.map +1 -1
- package/dist/extensions/llama/huggingface.d.ts.map +1 -1
- package/dist/extensions/llama/huggingface.js +0 -2
- package/dist/extensions/llama/huggingface.js.map +1 -1
- package/dist/extensions/llama/index.d.ts.map +1 -1
- package/dist/extensions/llama/index.js +11 -2
- package/dist/extensions/llama/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +21 -7
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/llama/ui.d.ts.map +1 -1
- package/dist/extensions/llama/ui.js +12 -28
- package/dist/extensions/llama/ui.js.map +1 -1
- package/dist/extensions/question/constants.d.ts.map +1 -1
- package/dist/extensions/question/constants.js.map +1 -1
- package/dist/extensions/question/dialog-primitives.d.ts.map +1 -1
- package/dist/extensions/question/dialog-primitives.js.map +1 -1
- package/dist/extensions/question/dialog.d.ts.map +1 -1
- package/dist/extensions/question/dialog.js.map +1 -1
- package/dist/extensions/question/index.d.ts.map +1 -1
- package/dist/extensions/question/index.js.map +1 -1
- package/dist/extensions/question/limits.d.ts.map +1 -1
- package/dist/extensions/question/render-cache.d.ts.map +1 -1
- package/dist/extensions/question/render-cache.js +3 -4
- package/dist/extensions/question/render-cache.js.map +1 -1
- package/dist/extensions/question/render.d.ts.map +1 -1
- package/dist/extensions/question/render.js.map +1 -1
- package/dist/extensions/question/results.d.ts.map +1 -1
- package/dist/extensions/question/results.js.map +1 -1
- package/dist/extensions/question/schema.d.ts.map +1 -1
- package/dist/extensions/question/schema.js.map +1 -1
- package/dist/extensions/question/state.d.ts.map +1 -1
- package/dist/extensions/question/state.js.map +1 -1
- package/dist/extensions/question/types.d.ts.map +1 -1
- package/dist/extensions/rewind/anchor.d.ts.map +1 -1
- package/dist/extensions/rewind/anchor.js.map +1 -1
- package/dist/extensions/rewind/config.d.ts.map +1 -1
- package/dist/extensions/rewind/config.js.map +1 -1
- package/dist/extensions/rewind/engine.d.ts.map +1 -1
- package/dist/extensions/rewind/engine.js.map +1 -1
- package/dist/extensions/rewind/gc.d.ts.map +1 -1
- package/dist/extensions/rewind/gc.js.map +1 -1
- package/dist/extensions/rewind/index.d.ts.map +1 -1
- package/dist/extensions/rewind/index.js.map +1 -1
- package/dist/extensions/rewind/menu.d.ts.map +1 -1
- package/dist/extensions/rewind/menu.js.map +1 -1
- package/dist/extensions/rewind/paths.d.ts.map +1 -1
- package/dist/extensions/rewind/paths.js.map +1 -1
- package/dist/extensions/rewind/restore.d.ts.map +1 -1
- package/dist/extensions/rewind/restore.js.map +1 -1
- package/dist/extensions/rewind/snapshot.d.ts.map +1 -1
- package/dist/extensions/rewind/snapshot.js.map +1 -1
- package/dist/extensions/rewind/storage.d.ts.map +1 -1
- package/dist/extensions/rewind/storage.js.map +1 -1
- package/dist/extensions/rewind/text.d.ts.map +1 -1
- package/dist/extensions/rewind/text.js.map +1 -1
- package/dist/extensions/rewind/tool-path.d.ts.map +1 -1
- package/dist/extensions/rewind/tool-path.js.map +1 -1
- package/dist/extensions/router/constants.d.ts +3 -0
- package/dist/extensions/router/constants.d.ts.map +1 -1
- package/dist/extensions/router/constants.js +3 -0
- package/dist/extensions/router/constants.js.map +1 -1
- package/dist/extensions/router/dialog.d.ts +14 -7
- package/dist/extensions/router/dialog.d.ts.map +1 -1
- package/dist/extensions/router/dialog.js +70 -132
- package/dist/extensions/router/dialog.js.map +1 -1
- package/dist/extensions/router/index.d.ts.map +1 -1
- package/dist/extensions/router/index.js.map +1 -1
- package/dist/extensions/router/presets.d.ts +8 -3
- package/dist/extensions/router/presets.d.ts.map +1 -1
- package/dist/extensions/router/presets.js +33 -17
- package/dist/extensions/router/presets.js.map +1 -1
- package/dist/extensions/router/probe.d.ts.map +1 -1
- package/dist/extensions/router/probe.js.map +1 -1
- package/dist/extensions/router/register.d.ts +3 -3
- package/dist/extensions/router/register.d.ts.map +1 -1
- package/dist/extensions/router/register.js.map +1 -1
- package/dist/extensions/router/store.d.ts.map +1 -1
- package/dist/extensions/router/store.js.map +1 -1
- package/dist/extensions/router/stream.d.ts.map +1 -1
- package/dist/extensions/router/stream.js.map +1 -1
- package/dist/extensions/router/types.d.ts.map +1 -1
- package/dist/extensions/router/ui.d.ts +11 -2
- package/dist/extensions/router/ui.d.ts.map +1 -1
- package/dist/extensions/router/ui.js +316 -171
- package/dist/extensions/router/ui.js.map +1 -1
- package/dist/extensions/statusline/index.d.ts.map +1 -1
- package/dist/extensions/statusline/index.js +17 -9
- package/dist/extensions/statusline/index.js.map +1 -1
- package/dist/extensions/subagent/activity.d.ts.map +1 -1
- package/dist/extensions/subagent/activity.js.map +1 -1
- package/dist/extensions/subagent/agents.d.ts.map +1 -1
- package/dist/extensions/subagent/agents.js.map +1 -1
- package/dist/extensions/subagent/constants.d.ts.map +1 -1
- package/dist/extensions/subagent/index.d.ts +3 -0
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +83 -12
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent/picker.d.ts.map +1 -1
- package/dist/extensions/subagent/picker.js +2 -9
- package/dist/extensions/subagent/picker.js.map +1 -1
- package/dist/extensions/subagent/render.d.ts.map +1 -1
- package/dist/extensions/subagent/render.js +33 -9
- package/dist/extensions/subagent/render.js.map +1 -1
- package/dist/extensions/subagent/resolve.d.ts.map +1 -1
- package/dist/extensions/subagent/resolve.js.map +1 -1
- package/dist/extensions/subagent/retry.d.ts.map +1 -1
- package/dist/extensions/subagent/retry.js.map +1 -1
- package/dist/extensions/subagent/runner.d.ts +2 -1
- package/dist/extensions/subagent/runner.d.ts.map +1 -1
- package/dist/extensions/subagent/runner.js +10 -12
- package/dist/extensions/subagent/runner.js.map +1 -1
- package/dist/extensions/subagent/schema.d.ts.map +1 -1
- package/dist/extensions/subagent/schema.js.map +1 -1
- package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
- package/dist/extensions/subagent/sdk-runner.js +41 -1
- package/dist/extensions/subagent/sdk-runner.js.map +1 -1
- package/dist/extensions/subagent/settings.d.ts.map +1 -1
- package/dist/extensions/subagent/settings.js +46 -36
- package/dist/extensions/subagent/settings.js.map +1 -1
- package/dist/extensions/subagent/types.d.ts +0 -1
- package/dist/extensions/subagent/types.d.ts.map +1 -1
- package/dist/extensions/subagent/types.js.map +1 -1
- package/dist/extensions/todo/constants.d.ts.map +1 -1
- package/dist/extensions/todo/constants.js.map +1 -1
- package/dist/extensions/todo/index.d.ts.map +1 -1
- package/dist/extensions/todo/index.js.map +1 -1
- package/dist/extensions/todo/overlay.d.ts.map +1 -1
- package/dist/extensions/todo/overlay.js +6 -10
- package/dist/extensions/todo/overlay.js.map +1 -1
- package/dist/extensions/todo/schema.d.ts +2 -2
- package/dist/extensions/todo/schema.d.ts.map +1 -1
- package/dist/extensions/todo/state.d.ts.map +1 -1
- package/dist/extensions/todo/state.js.map +1 -1
- package/dist/extensions/todo/view.d.ts.map +1 -1
- package/dist/extensions/todo/view.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +70 -25
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js.map +1 -1
- package/dist/modes/index.d.ts +1 -0
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js +6 -10
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +5 -2
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +13 -11
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +4 -10
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +0 -3
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +1 -3
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +5 -22
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +1 -7
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +8 -8
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +1 -4
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -7
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js +6 -8
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js +0 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -7
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +2 -8
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +1 -9
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +2 -4
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +2 -4
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +3 -9
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
- package/dist/modes/interactive/components/markdown-transform.js +19 -0
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
- package/dist/modes/interactive/components/mermaid.d.ts +11 -0
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
- package/dist/modes/interactive/components/mermaid.js +75 -0
- package/dist/modes/interactive/components/mermaid.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +28 -29
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +3 -11
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +4 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +34 -13
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +35 -60
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +8 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +30 -14
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +0 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +0 -2
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +0 -2
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +0 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +18 -36
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-group.js +2 -3
- package/dist/modes/interactive/components/tool-group.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +19 -39
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js +0 -6
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +3 -6
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +3 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +8 -5
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +46 -5
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +538 -282
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/model-search.d.ts.map +1 -1
- package/dist/modes/interactive/model-search.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +1 -0
- package/dist/modes/interactive/theme/light.json +1 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +3 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +11 -8
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +5 -1
- package/dist/modes/interactive/theme/theme.d.ts +4 -4
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +24 -12
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +28 -0
- package/dist/modes/json-event.d.ts.map +1 -0
- package/dist/modes/json-event.js +12 -0
- package/dist/modes/json-event.js.map +1 -0
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +12 -2
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +5 -4
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +7 -8
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +4 -3
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +11 -9
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/rpc-entry.d.ts.map +1 -1
- package/dist/rpc-entry.js +1 -0
- package/dist/rpc-entry.js.map +1 -1
- package/dist/server/create-harness.d.ts +26 -0
- package/dist/server/create-harness.d.ts.map +1 -0
- package/dist/server/create-harness.js +104 -0
- package/dist/server/create-harness.js.map +1 -0
- package/dist/utils/abort.d.ts +5 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +48 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/child-process.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +22 -2
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/coalescing-terminal.d.ts +20 -4
- package/dist/utils/coalescing-terminal.d.ts.map +1 -1
- package/dist/utils/coalescing-terminal.js +48 -12
- package/dist/utils/coalescing-terminal.js.map +1 -1
- package/dist/utils/deprecation.d.ts.map +1 -1
- package/dist/utils/deprecation.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js.map +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/html.d.ts.map +1 -1
- package/dist/utils/html.js.map +1 -1
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-process.d.ts.map +1 -1
- package/dist/utils/image-process.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/image-resize-worker.d.ts.map +1 -1
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/json.d.ts.map +1 -1
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/management-http.d.ts +23 -0
- package/dist/utils/management-http.d.ts.map +1 -0
- package/dist/utils/management-http.js +50 -0
- package/dist/utils/management-http.js.map +1 -0
- package/dist/utils/mime.d.ts.map +1 -1
- package/dist/utils/mime.js.map +1 -1
- package/dist/utils/open-browser.d.ts.map +1 -1
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/paths.d.ts +3 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +23 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.js.map +1 -1
- package/dist/utils/pi-user-agent.d.ts.map +1 -1
- package/dist/utils/pi-user-agent.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js.map +1 -1
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/dist/utils/tool-result-images.d.ts +19 -0
- package/dist/utils/tool-result-images.d.ts.map +1 -0
- package/dist/utils/tool-result-images.js +45 -0
- package/dist/utils/tool-result-images.js.map +1 -0
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +4 -6
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts +4 -0
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +20 -2
- package/dist/utils/version-check.js.map +1 -1
- package/dist/utils/windows-self-update.d.ts.map +1 -1
- package/dist/utils/windows-self-update.js.map +1 -1
- package/docs/bundled/README.md +1 -0
- package/docs/bundled/extensions/biu.md +63 -0
- package/docs/bundled/extensions/router.md +20 -14
- package/docs/bundled/extensions/statusline.md +7 -5
- package/docs/custom-provider.md +123 -2
- package/docs/development.md +83 -0
- package/docs/docs.json +8 -4
- package/docs/extensions.md +30 -5
- package/docs/json.md +21 -2
- package/docs/keybindings.md +46 -14
- package/docs/models.md +21 -3
- package/docs/providers.md +9 -1
- package/docs/quickstart.md +2 -0
- package/docs/rpc.md +12 -11
- package/docs/sdk.md +46 -0
- package/docs/security.md +1 -1
- package/docs/settings.md +4 -1
- package/docs/themes.md +7 -5
- package/docs/usage.md +8 -0
- package/examples/extensions/custom-compaction.ts +1 -16
- package/examples/extensions/custom-provider-anthropic/index.ts +2 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +5 -5
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/doom-overlay/wad-finder.ts +7 -3
- package/examples/extensions/dynamic-resources/dynamic.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/handoff.ts +2 -11
- package/examples/extensions/qna.ts +3 -7
- package/examples/extensions/sandbox/package-lock.json +3 -3
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/summarize.ts +8 -18
- package/examples/extensions/with-deps/package-lock.json +4 -4
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/rpc-extension-ui.ts +11 -2
- package/examples/sdk/02-custom-model.ts +1 -2
- package/examples/sdk/09-api-keys-and-oauth.ts +1 -1
- package/examples/sdk/12-full-control.ts +1 -1
- package/examples/sdk/README.md +1 -0
- package/npm-shrinkwrap.json +193 -264
- package/package.json +15 -8
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* biu/workspace.ts — filesystem view of the Biu workspace.
|
|
3
|
+
*
|
|
4
|
+
* The workspace lives under <agentDir>/biu/<safe-cwd>/ and holds SPEC.md,
|
|
5
|
+
* tasks/TASK-*.md, Summary.md, and archived/. Workflow state is carried by
|
|
6
|
+
* Markdown frontmatter and derived on demand by loadBiuSnapshot(); nothing
|
|
7
|
+
* here owns state. The model addresses workspace files through the biu://
|
|
8
|
+
* scheme, resolved by resolveBiuUri().
|
|
9
|
+
*/
|
|
10
|
+
import { mkdir, readdir, readFile, rename, rm, stat } from "node:fs/promises";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { getAgentDir } from "../../config.js";
|
|
13
|
+
import { applyEditsToNormalizedContent, normalizeToLF } from "../../core/tools/edit-diff.js";
|
|
14
|
+
import { parseFrontmatter } from "../../utils/frontmatter.js";
|
|
15
|
+
import { cwdToSafeDirName, resolvePath } from "../../utils/paths.js";
|
|
16
|
+
export const BIU_URI_SCHEME = "biu://";
|
|
17
|
+
export const BIU_SPEC_FILE_NAME = "SPEC.md";
|
|
18
|
+
export const BIU_SUMMARY_FILE_NAME = "Summary.md";
|
|
19
|
+
export const BIU_TASKS_DIRECTORY_NAME = "tasks";
|
|
20
|
+
export const BIU_ARCHIVED_DIRECTORY_NAME = "archived";
|
|
21
|
+
export const BIU_MAX_SHORTNAME_LENGTH = 60;
|
|
22
|
+
/** Snapshot bound: tasks beyond this count are reported in problems, not listed. */
|
|
23
|
+
export const BIU_MAX_SNAPSHOT_TASKS = 100;
|
|
24
|
+
export const BIU_STAGES = ["plan", "execute", "archive"];
|
|
25
|
+
export const BIU_TASK_STATUSES = ["ready", "in_progress", "completed"];
|
|
26
|
+
export const BIU_SPEC_STATUSES = ["draft", "ready"];
|
|
27
|
+
export const BIU_EXECUTION_MODES = ["direct", "tasks"];
|
|
28
|
+
export function getBiuPaths(cwd, agentDir = getAgentDir()) {
|
|
29
|
+
const root = join(agentDir, "biu", cwdToSafeDirName(resolvePath(cwd)));
|
|
30
|
+
return {
|
|
31
|
+
root,
|
|
32
|
+
specFile: join(root, BIU_SPEC_FILE_NAME),
|
|
33
|
+
summaryFile: join(root, BIU_SUMMARY_FILE_NAME),
|
|
34
|
+
tasksDir: join(root, BIU_TASKS_DIRECTORY_NAME),
|
|
35
|
+
archivedDir: join(root, BIU_ARCHIVED_DIRECTORY_NAME),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Create the workspace directories when missing. Idempotent. */
|
|
39
|
+
export async function ensureBiuWorkspace(cwd, agentDir = getAgentDir()) {
|
|
40
|
+
const paths = getBiuPaths(cwd, agentDir);
|
|
41
|
+
await Promise.all([mkdir(paths.tasksDir, { recursive: true }), mkdir(paths.archivedDir, { recursive: true })]);
|
|
42
|
+
return paths;
|
|
43
|
+
}
|
|
44
|
+
export function isBiuUri(path) {
|
|
45
|
+
return path.startsWith(BIU_URI_SCHEME);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve a biu:// URI to an absolute path inside the workspace for the given
|
|
49
|
+
* cwd. `biu://` alone resolves to the workspace root. Rejects rooted rests and
|
|
50
|
+
* any ".." segment, so a resolved path can never escape the workspace.
|
|
51
|
+
*/
|
|
52
|
+
export function resolveBiuUri(uri, cwd, agentDir = getAgentDir()) {
|
|
53
|
+
if (!isBiuUri(uri))
|
|
54
|
+
return { ok: false, reason: `Not a biu:// path: ${uri}` };
|
|
55
|
+
const rest = uri.slice(BIU_URI_SCHEME.length).replace(/\\/g, "/");
|
|
56
|
+
if (rest.startsWith("/") || /^[A-Za-z]:/.test(rest) || rest.startsWith("~")) {
|
|
57
|
+
return {
|
|
58
|
+
ok: false,
|
|
59
|
+
reason: `Invalid biu:// path ${JSON.stringify(uri)}: use a workspace-relative path like ${BIU_URI_SCHEME}${BIU_SPEC_FILE_NAME}.`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const segments = rest.split("/").filter((segment) => segment !== "" && segment !== ".");
|
|
63
|
+
if (segments.some((segment) => segment === "..")) {
|
|
64
|
+
return { ok: false, reason: `Invalid biu:// path ${JSON.stringify(uri)}: ".." segments are not allowed.` };
|
|
65
|
+
}
|
|
66
|
+
const paths = getBiuPaths(cwd, agentDir);
|
|
67
|
+
return { ok: true, path: segments.length === 0 ? paths.root : join(paths.root, ...segments) };
|
|
68
|
+
}
|
|
69
|
+
/** Format a workspace-relative location as a biu:// URI for prompts and messages. */
|
|
70
|
+
export function toBiuUri(...segments) {
|
|
71
|
+
return `${BIU_URI_SCHEME}${segments.join("/")}`;
|
|
72
|
+
}
|
|
73
|
+
/** Whether the content's frontmatter says status: ready. Parse failures count as not ready. */
|
|
74
|
+
function isSpecContentReady(content) {
|
|
75
|
+
try {
|
|
76
|
+
return parseFrontmatter(content).frontmatter.status === "ready";
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Normalize edit-tool input into Edit[], accepting the legacy top-level oldText/newText shape. */
|
|
83
|
+
function toSpecEdits(input) {
|
|
84
|
+
const edits = [];
|
|
85
|
+
if (Array.isArray(input.edits)) {
|
|
86
|
+
for (const entry of input.edits) {
|
|
87
|
+
if (!entry || typeof entry !== "object")
|
|
88
|
+
continue;
|
|
89
|
+
const candidate = entry;
|
|
90
|
+
if (typeof candidate.oldText === "string" && typeof candidate.newText === "string") {
|
|
91
|
+
edits.push({ oldText: candidate.oldText, newText: candidate.newText });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (typeof input.oldText === "string" && typeof input.newText === "string") {
|
|
96
|
+
edits.push({ oldText: input.oldText, newText: input.newText });
|
|
97
|
+
}
|
|
98
|
+
return edits;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Whether a write/edit tool call would flip the SPEC's frontmatter status from
|
|
102
|
+
* non-ready to ready — the transition that requires user approval. Edits are
|
|
103
|
+
* simulated with the edit tool's own replacement semantics. Any failure
|
|
104
|
+
* (unmatched oldText, invalid YAML) returns false: the gate steps aside and
|
|
105
|
+
* lets the real tool report the error.
|
|
106
|
+
*/
|
|
107
|
+
export function detectSpecReadyTransition(currentContent, toolName, input) {
|
|
108
|
+
if (currentContent !== null && isSpecContentReady(currentContent))
|
|
109
|
+
return false;
|
|
110
|
+
if (toolName === "write") {
|
|
111
|
+
return typeof input.content === "string" && isSpecContentReady(input.content);
|
|
112
|
+
}
|
|
113
|
+
if (currentContent === null)
|
|
114
|
+
return false;
|
|
115
|
+
const edits = toSpecEdits(input);
|
|
116
|
+
if (edits.length === 0)
|
|
117
|
+
return false;
|
|
118
|
+
try {
|
|
119
|
+
const { newContent } = applyEditsToNormalizedContent(normalizeToLF(currentContent), edits, BIU_SPEC_FILE_NAME);
|
|
120
|
+
return isSpecContentReady(newContent);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function isMissingFileError(error) {
|
|
127
|
+
return error instanceof Error && "code" in error && error.code === "ENOENT";
|
|
128
|
+
}
|
|
129
|
+
function describeError(error) {
|
|
130
|
+
return error instanceof Error ? error.message : String(error);
|
|
131
|
+
}
|
|
132
|
+
async function pathExists(path) {
|
|
133
|
+
try {
|
|
134
|
+
await stat(path);
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
if (isMissingFileError(error))
|
|
139
|
+
return false;
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function asTrimmedString(value) {
|
|
144
|
+
if (typeof value !== "string")
|
|
145
|
+
return null;
|
|
146
|
+
const trimmed = value.trim();
|
|
147
|
+
return trimmed || null;
|
|
148
|
+
}
|
|
149
|
+
function parseStatus(value, allowed) {
|
|
150
|
+
return typeof value === "string" && allowed.includes(value) ? value : "unknown";
|
|
151
|
+
}
|
|
152
|
+
/** Strip an optional .md extension so depends_on accepts "TASK-x" and "TASK-x.md" alike. */
|
|
153
|
+
function toTaskId(reference) {
|
|
154
|
+
return reference.endsWith(".md") ? reference.slice(0, -3) : reference;
|
|
155
|
+
}
|
|
156
|
+
async function readSpecInfo(specFile, problems) {
|
|
157
|
+
let raw;
|
|
158
|
+
try {
|
|
159
|
+
raw = await readFile(specFile, "utf8");
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
if (!isMissingFileError(error))
|
|
163
|
+
problems.push(`${BIU_SPEC_FILE_NAME}: ${describeError(error)}`);
|
|
164
|
+
return { exists: false, status: "unknown", title: null, baselineCommit: null, execution: null };
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
const { frontmatter } = parseFrontmatter(raw);
|
|
168
|
+
const status = parseStatus(frontmatter.status, BIU_SPEC_STATUSES);
|
|
169
|
+
if (status === "unknown") {
|
|
170
|
+
problems.push(`${BIU_SPEC_FILE_NAME}: frontmatter "status" must be one of ${BIU_SPEC_STATUSES.join(", ")}.`);
|
|
171
|
+
}
|
|
172
|
+
let execution = null;
|
|
173
|
+
if (frontmatter.execution !== undefined) {
|
|
174
|
+
const parsed = parseStatus(frontmatter.execution, BIU_EXECUTION_MODES);
|
|
175
|
+
if (parsed === "unknown") {
|
|
176
|
+
problems.push(`${BIU_SPEC_FILE_NAME}: frontmatter "execution" must be one of ${BIU_EXECUTION_MODES.join(", ")}.`);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
execution = parsed;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
exists: true,
|
|
184
|
+
status,
|
|
185
|
+
title: asTrimmedString(frontmatter.title),
|
|
186
|
+
baselineCommit: asTrimmedString(frontmatter.baseline_commit),
|
|
187
|
+
execution,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
problems.push(`${BIU_SPEC_FILE_NAME}: invalid frontmatter (${describeError(error)})`);
|
|
192
|
+
return { exists: true, status: "unknown", title: null, baselineCommit: null, execution: null };
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async function readTaskInfo(tasksDir, fileName, problems) {
|
|
196
|
+
const id = toTaskId(fileName);
|
|
197
|
+
const relative = `${BIU_TASKS_DIRECTORY_NAME}/${fileName}`;
|
|
198
|
+
let raw;
|
|
199
|
+
try {
|
|
200
|
+
raw = await readFile(join(tasksDir, fileName), "utf8");
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
problems.push(`${relative}: ${describeError(error)}`);
|
|
204
|
+
return { id, title: id, status: "unknown", dependsOn: [] };
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
const { frontmatter } = parseFrontmatter(raw);
|
|
208
|
+
const status = parseStatus(frontmatter.status, BIU_TASK_STATUSES);
|
|
209
|
+
if (status === "unknown") {
|
|
210
|
+
problems.push(`${relative}: frontmatter "status" must be one of ${BIU_TASK_STATUSES.join(", ")}.`);
|
|
211
|
+
}
|
|
212
|
+
const dependsOn = Array.isArray(frontmatter.depends_on)
|
|
213
|
+
? frontmatter.depends_on.filter((dep) => typeof dep === "string").map(toTaskId)
|
|
214
|
+
: [];
|
|
215
|
+
return { id, title: asTrimmedString(frontmatter.title) ?? id, status, dependsOn };
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
problems.push(`${relative}: invalid frontmatter (${describeError(error)})`);
|
|
219
|
+
return { id, title: id, status: "unknown", dependsOn: [] };
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function countTasks(tasks) {
|
|
223
|
+
const counts = { total: tasks.length, ready: 0, inProgress: 0, completed: 0, unknown: 0 };
|
|
224
|
+
for (const task of tasks) {
|
|
225
|
+
if (task.status === "ready")
|
|
226
|
+
counts.ready++;
|
|
227
|
+
else if (task.status === "in_progress")
|
|
228
|
+
counts.inProgress++;
|
|
229
|
+
else if (task.status === "completed")
|
|
230
|
+
counts.completed++;
|
|
231
|
+
else
|
|
232
|
+
counts.unknown++;
|
|
233
|
+
}
|
|
234
|
+
return counts;
|
|
235
|
+
}
|
|
236
|
+
/** What to work on next: the in-progress task, else the first ready task whose dependencies are all completed. */
|
|
237
|
+
export function getBiuFocus(tasks) {
|
|
238
|
+
const active = tasks.find((task) => task.status === "in_progress");
|
|
239
|
+
if (active)
|
|
240
|
+
return { kind: "active", task: active };
|
|
241
|
+
const byId = new Map(tasks.map((task) => [task.id, task]));
|
|
242
|
+
const next = tasks.find((task) => task.status === "ready" && task.dependsOn.every((dep) => byId.get(dep)?.status === "completed"));
|
|
243
|
+
if (next)
|
|
244
|
+
return { kind: "next", task: next };
|
|
245
|
+
if (tasks.length > 0 && tasks.every((task) => task.status === "completed"))
|
|
246
|
+
return { kind: "allDone" };
|
|
247
|
+
return { kind: "none" };
|
|
248
|
+
}
|
|
249
|
+
function deriveStage(spec, tasks, summaryExists) {
|
|
250
|
+
if (summaryExists)
|
|
251
|
+
return "archive";
|
|
252
|
+
if (!spec.exists || spec.status !== "ready")
|
|
253
|
+
return "plan";
|
|
254
|
+
if (tasks.length > 0 && tasks.every((task) => task.status === "completed"))
|
|
255
|
+
return "archive";
|
|
256
|
+
return "execute";
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Build the workspace snapshot by reading frontmatter from SPEC.md and
|
|
260
|
+
* tasks/*.md. Content problems (unreadable files, malformed frontmatter) are
|
|
261
|
+
* reported in `problems` and degrade to "unknown" instead of throwing.
|
|
262
|
+
*/
|
|
263
|
+
export async function loadBiuSnapshot(cwd, agentDir = getAgentDir()) {
|
|
264
|
+
const paths = getBiuPaths(cwd, agentDir);
|
|
265
|
+
const problems = [];
|
|
266
|
+
const spec = await readSpecInfo(paths.specFile, problems);
|
|
267
|
+
let summaryExists = false;
|
|
268
|
+
try {
|
|
269
|
+
summaryExists = await pathExists(paths.summaryFile);
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
problems.push(`${BIU_SUMMARY_FILE_NAME}: ${describeError(error)}`);
|
|
273
|
+
}
|
|
274
|
+
let taskFiles = [];
|
|
275
|
+
try {
|
|
276
|
+
taskFiles = (await readdir(paths.tasksDir)).filter((name) => name.endsWith(".md")).sort();
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
if (!isMissingFileError(error))
|
|
280
|
+
problems.push(`${BIU_TASKS_DIRECTORY_NAME}/: ${describeError(error)}`);
|
|
281
|
+
}
|
|
282
|
+
if (taskFiles.length > BIU_MAX_SNAPSHOT_TASKS) {
|
|
283
|
+
problems.push(`${BIU_TASKS_DIRECTORY_NAME}/: ${taskFiles.length} task files exceed the snapshot limit of ${BIU_MAX_SNAPSHOT_TASKS}; only the first ${BIU_MAX_SNAPSHOT_TASKS} are listed.`);
|
|
284
|
+
taskFiles = taskFiles.slice(0, BIU_MAX_SNAPSHOT_TASKS);
|
|
285
|
+
}
|
|
286
|
+
const tasks = [];
|
|
287
|
+
for (const fileName of taskFiles) {
|
|
288
|
+
tasks.push(await readTaskInfo(paths.tasksDir, fileName, problems));
|
|
289
|
+
}
|
|
290
|
+
return {
|
|
291
|
+
stage: deriveStage(spec, tasks, summaryExists),
|
|
292
|
+
spec,
|
|
293
|
+
summaryExists,
|
|
294
|
+
tasks,
|
|
295
|
+
counts: countTasks(tasks),
|
|
296
|
+
focus: getBiuFocus(tasks),
|
|
297
|
+
problems,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
export function sanitizeShortname(shortname) {
|
|
301
|
+
const printable = Array.from(shortname.trim())
|
|
302
|
+
.filter((ch) => {
|
|
303
|
+
const code = ch.codePointAt(0) ?? 0;
|
|
304
|
+
return code >= 0x20 && code !== 0x7f;
|
|
305
|
+
})
|
|
306
|
+
.join("");
|
|
307
|
+
const cleaned = printable
|
|
308
|
+
.replace(/[<>:"/\\|?*]+/g, "-")
|
|
309
|
+
.replace(/\s+/g, "-")
|
|
310
|
+
.replace(/-{2,}/g, "-")
|
|
311
|
+
.replace(/^[-.]+|[-.]+$/g, "");
|
|
312
|
+
return cleaned.slice(0, BIU_MAX_SHORTNAME_LENGTH).replace(/^[-.]+|[-.]+$/g, "");
|
|
313
|
+
}
|
|
314
|
+
/** Move one file or directory, returning false when the source does not exist. */
|
|
315
|
+
async function moveIfExists(from, to) {
|
|
316
|
+
if (!(await pathExists(from)))
|
|
317
|
+
return false;
|
|
318
|
+
await rename(from, to);
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Close the current cycle: move SPEC.md, Summary.md, and tasks/ into
|
|
323
|
+
* archived/YYYY-MM-DD-<shortname>/. If any move fails, already-moved files are
|
|
324
|
+
* rolled back so the cycle is never left half-archived; when a rollback itself
|
|
325
|
+
* fails, the recovery data stays in the archive directory and the error says
|
|
326
|
+
* where. Requires SPEC.md and Summary.md to exist so an empty or unfinished
|
|
327
|
+
* draft is never archived silently.
|
|
328
|
+
*
|
|
329
|
+
* `move` is injectable for tests; rollback always uses the real move.
|
|
330
|
+
*/
|
|
331
|
+
export async function archiveBiuCycle(cwd, shortname, agentDir = getAgentDir(), now = new Date(), move = moveIfExists) {
|
|
332
|
+
const paths = getBiuPaths(cwd, agentDir);
|
|
333
|
+
const safeName = sanitizeShortname(shortname);
|
|
334
|
+
if (!safeName)
|
|
335
|
+
throw new Error(`Archive shortname ${JSON.stringify(shortname)} is empty after sanitization.`);
|
|
336
|
+
if (!(await pathExists(paths.specFile))) {
|
|
337
|
+
throw new Error("Cannot archive: SPEC.md does not exist in the Biu workspace.");
|
|
338
|
+
}
|
|
339
|
+
if (!(await pathExists(paths.summaryFile))) {
|
|
340
|
+
throw new Error("Cannot archive: Summary.md does not exist yet. Draft and confirm the summary first.");
|
|
341
|
+
}
|
|
342
|
+
await mkdir(paths.archivedDir, { recursive: true });
|
|
343
|
+
const date = now.toISOString().slice(0, 10);
|
|
344
|
+
const baseName = `${date}-${safeName}`;
|
|
345
|
+
let existing;
|
|
346
|
+
try {
|
|
347
|
+
existing = await readdir(paths.archivedDir);
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
existing = [];
|
|
351
|
+
}
|
|
352
|
+
let archiveName = baseName;
|
|
353
|
+
for (let suffix = 2; existing.includes(archiveName); suffix++) {
|
|
354
|
+
archiveName = `${baseName}-${String(suffix).padStart(2, "0")}`;
|
|
355
|
+
}
|
|
356
|
+
const archivedPath = join(paths.archivedDir, archiveName);
|
|
357
|
+
await mkdir(archivedPath, { recursive: false });
|
|
358
|
+
const moves = [
|
|
359
|
+
{ from: paths.specFile, to: join(archivedPath, BIU_SPEC_FILE_NAME) },
|
|
360
|
+
{ from: paths.summaryFile, to: join(archivedPath, BIU_SUMMARY_FILE_NAME) },
|
|
361
|
+
{ from: paths.tasksDir, to: join(archivedPath, BIU_TASKS_DIRECTORY_NAME) },
|
|
362
|
+
];
|
|
363
|
+
const moved = [];
|
|
364
|
+
try {
|
|
365
|
+
for (const entry of moves) {
|
|
366
|
+
if (await move(entry.from, entry.to))
|
|
367
|
+
moved.push(entry);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
throw await rollbackArchive(error, archivedPath, moved);
|
|
372
|
+
}
|
|
373
|
+
// Recreate the empty tasks/ directory for the next cycle. Best-effort: the
|
|
374
|
+
// next ensureBiuWorkspace call recreates it anyway.
|
|
375
|
+
await mkdir(paths.tasksDir, { recursive: true }).catch(() => { });
|
|
376
|
+
return { archivedPath, archiveName };
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Reverse the already-moved files and clean the archive directory. Returns
|
|
380
|
+
* the original error unchanged when the rollback fully succeeded, otherwise
|
|
381
|
+
* a chained error whose message says exactly what remains inconsistent.
|
|
382
|
+
*/
|
|
383
|
+
async function rollbackArchive(error, archivedPath, moved) {
|
|
384
|
+
const restoreErrors = [];
|
|
385
|
+
for (const entry of [...moved].reverse()) {
|
|
386
|
+
try {
|
|
387
|
+
await moveIfExists(entry.to, entry.from);
|
|
388
|
+
}
|
|
389
|
+
catch (restoreError) {
|
|
390
|
+
restoreErrors.push(`moving ${entry.to} back failed: ${describeError(restoreError)}`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
if (restoreErrors.length > 0) {
|
|
394
|
+
return new Error(`${describeError(error)} Rollback incomplete, recovery data left in ${archivedPath}: ${restoreErrors.join("; ")}`, { cause: error });
|
|
395
|
+
}
|
|
396
|
+
try {
|
|
397
|
+
await rm(archivedPath, { recursive: true, force: true });
|
|
398
|
+
}
|
|
399
|
+
catch (cleanupError) {
|
|
400
|
+
return new Error(`${describeError(error)} Rollback succeeded, but removing the empty ${archivedPath} directory failed: ${describeError(cleanupError)}`, { cause: error });
|
|
401
|
+
}
|
|
402
|
+
return error instanceof Error ? error : new Error(describeError(error), { cause: error });
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/extensions/biu/workspace.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * biu/workspace.ts — filesystem view of the Biu workspace.\n *\n * The workspace lives under <agentDir>/biu/<safe-cwd>/ and holds SPEC.md,\n * tasks/TASK-*.md, Summary.md, and archived/. Workflow state is carried by\n * Markdown frontmatter and derived on demand by loadBiuSnapshot(); nothing\n * here owns state. The model addresses workspace files through the biu://\n * scheme, resolved by resolveBiuUri().\n */\nimport { mkdir, readdir, readFile, rename, rm, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../../config.ts\";\nimport { applyEditsToNormalizedContent, type Edit, normalizeToLF } from \"../../core/tools/edit-diff.ts\";\nimport { parseFrontmatter } from \"../../utils/frontmatter.ts\";\nimport { cwdToSafeDirName, resolvePath } from \"../../utils/paths.ts\";\n\nexport const BIU_URI_SCHEME = \"biu://\";\nexport const BIU_SPEC_FILE_NAME = \"SPEC.md\";\nexport const BIU_SUMMARY_FILE_NAME = \"Summary.md\";\nexport const BIU_TASKS_DIRECTORY_NAME = \"tasks\";\nexport const BIU_ARCHIVED_DIRECTORY_NAME = \"archived\";\nexport const BIU_MAX_SHORTNAME_LENGTH = 60;\n/** Snapshot bound: tasks beyond this count are reported in problems, not listed. */\nexport const BIU_MAX_SNAPSHOT_TASKS = 100;\n\nexport const BIU_STAGES = [\"plan\", \"execute\", \"archive\"] as const;\nexport type BiuStage = (typeof BIU_STAGES)[number];\n\nexport const BIU_TASK_STATUSES = [\"ready\", \"in_progress\", \"completed\"] as const;\nexport type BiuTaskStatus = (typeof BIU_TASK_STATUSES)[number];\n\nexport const BIU_SPEC_STATUSES = [\"draft\", \"ready\"] as const;\nexport type BiuSpecStatus = (typeof BIU_SPEC_STATUSES)[number];\n\nexport const BIU_EXECUTION_MODES = [\"direct\", \"tasks\"] as const;\nexport type BiuExecutionMode = (typeof BIU_EXECUTION_MODES)[number];\n\nexport interface BiuPaths {\n\troot: string;\n\tspecFile: string;\n\tsummaryFile: string;\n\ttasksDir: string;\n\tarchivedDir: string;\n}\n\nexport function getBiuPaths(cwd: string, agentDir: string = getAgentDir()): BiuPaths {\n\tconst root = join(agentDir, \"biu\", cwdToSafeDirName(resolvePath(cwd)));\n\treturn {\n\t\troot,\n\t\tspecFile: join(root, BIU_SPEC_FILE_NAME),\n\t\tsummaryFile: join(root, BIU_SUMMARY_FILE_NAME),\n\t\ttasksDir: join(root, BIU_TASKS_DIRECTORY_NAME),\n\t\tarchivedDir: join(root, BIU_ARCHIVED_DIRECTORY_NAME),\n\t};\n}\n\n/** Create the workspace directories when missing. Idempotent. */\nexport async function ensureBiuWorkspace(cwd: string, agentDir: string = getAgentDir()): Promise<BiuPaths> {\n\tconst paths = getBiuPaths(cwd, agentDir);\n\tawait Promise.all([mkdir(paths.tasksDir, { recursive: true }), mkdir(paths.archivedDir, { recursive: true })]);\n\treturn paths;\n}\n\nexport function isBiuUri(path: string): boolean {\n\treturn path.startsWith(BIU_URI_SCHEME);\n}\n\nexport type BiuUriResolution = { ok: true; path: string } | { ok: false; reason: string };\n\n/**\n * Resolve a biu:// URI to an absolute path inside the workspace for the given\n * cwd. `biu://` alone resolves to the workspace root. Rejects rooted rests and\n * any \"..\" segment, so a resolved path can never escape the workspace.\n */\nexport function resolveBiuUri(uri: string, cwd: string, agentDir: string = getAgentDir()): BiuUriResolution {\n\tif (!isBiuUri(uri)) return { ok: false, reason: `Not a biu:// path: ${uri}` };\n\tconst rest = uri.slice(BIU_URI_SCHEME.length).replace(/\\\\/g, \"/\");\n\tif (rest.startsWith(\"/\") || /^[A-Za-z]:/.test(rest) || rest.startsWith(\"~\")) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: `Invalid biu:// path ${JSON.stringify(uri)}: use a workspace-relative path like ${BIU_URI_SCHEME}${BIU_SPEC_FILE_NAME}.`,\n\t\t};\n\t}\n\tconst segments = rest.split(\"/\").filter((segment) => segment !== \"\" && segment !== \".\");\n\tif (segments.some((segment) => segment === \"..\")) {\n\t\treturn { ok: false, reason: `Invalid biu:// path ${JSON.stringify(uri)}: \"..\" segments are not allowed.` };\n\t}\n\tconst paths = getBiuPaths(cwd, agentDir);\n\treturn { ok: true, path: segments.length === 0 ? paths.root : join(paths.root, ...segments) };\n}\n\n/** Format a workspace-relative location as a biu:// URI for prompts and messages. */\nexport function toBiuUri(...segments: string[]): string {\n\treturn `${BIU_URI_SCHEME}${segments.join(\"/\")}`;\n}\n\n/** Whether the content's frontmatter says status: ready. Parse failures count as not ready. */\nfunction isSpecContentReady(content: string): boolean {\n\ttry {\n\t\treturn parseFrontmatter(content).frontmatter.status === \"ready\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/** Normalize edit-tool input into Edit[], accepting the legacy top-level oldText/newText shape. */\nfunction toSpecEdits(input: Record<string, unknown>): Edit[] {\n\tconst edits: Edit[] = [];\n\tif (Array.isArray(input.edits)) {\n\t\tfor (const entry of input.edits) {\n\t\t\tif (!entry || typeof entry !== \"object\") continue;\n\t\t\tconst candidate = entry as Record<string, unknown>;\n\t\t\tif (typeof candidate.oldText === \"string\" && typeof candidate.newText === \"string\") {\n\t\t\t\tedits.push({ oldText: candidate.oldText, newText: candidate.newText });\n\t\t\t}\n\t\t}\n\t}\n\tif (typeof input.oldText === \"string\" && typeof input.newText === \"string\") {\n\t\tedits.push({ oldText: input.oldText, newText: input.newText });\n\t}\n\treturn edits;\n}\n\n/**\n * Whether a write/edit tool call would flip the SPEC's frontmatter status from\n * non-ready to ready — the transition that requires user approval. Edits are\n * simulated with the edit tool's own replacement semantics. Any failure\n * (unmatched oldText, invalid YAML) returns false: the gate steps aside and\n * lets the real tool report the error.\n */\nexport function detectSpecReadyTransition(\n\tcurrentContent: string | null,\n\ttoolName: \"write\" | \"edit\",\n\tinput: Record<string, unknown>,\n): boolean {\n\tif (currentContent !== null && isSpecContentReady(currentContent)) return false;\n\tif (toolName === \"write\") {\n\t\treturn typeof input.content === \"string\" && isSpecContentReady(input.content);\n\t}\n\tif (currentContent === null) return false;\n\tconst edits = toSpecEdits(input);\n\tif (edits.length === 0) return false;\n\ttry {\n\t\tconst { newContent } = applyEditsToNormalizedContent(normalizeToLF(currentContent), edits, BIU_SPEC_FILE_NAME);\n\t\treturn isSpecContentReady(newContent);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport interface BiuSpecInfo {\n\texists: boolean;\n\t/** \"unknown\" when the file exists but frontmatter is missing or invalid. */\n\tstatus: BiuSpecStatus | \"unknown\";\n\ttitle: string | null;\n\tbaselineCommit: string | null;\n\t/** Execution path chosen in the plan stage; null when absent or invalid. */\n\texecution: BiuExecutionMode | null;\n}\n\nexport interface BiuTaskInfo {\n\t/** Task id = file name without the .md extension, e.g. \"TASK-alias\". */\n\tid: string;\n\ttitle: string;\n\t/** \"unknown\" when frontmatter is missing or invalid; treated as neither ready nor completed. */\n\tstatus: BiuTaskStatus | \"unknown\";\n\tdependsOn: string[];\n}\n\nexport interface BiuTaskCounts {\n\ttotal: number;\n\tready: number;\n\tinProgress: number;\n\tcompleted: number;\n\tunknown: number;\n}\n\nexport type BiuFocus =\n\t| { kind: \"active\"; task: BiuTaskInfo }\n\t| { kind: \"next\"; task: BiuTaskInfo }\n\t| { kind: \"allDone\" }\n\t| { kind: \"none\" };\n\nexport interface BiuSnapshot {\n\tstage: BiuStage;\n\tspec: BiuSpecInfo;\n\tsummaryExists: boolean;\n\ttasks: BiuTaskInfo[];\n\tcounts: BiuTaskCounts;\n\tfocus: BiuFocus;\n\t/** Human-readable notes about unreadable or malformed workspace files. */\n\tproblems: string[];\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n\treturn error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction describeError(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait stat(path);\n\t\treturn true;\n\t} catch (error) {\n\t\tif (isMissingFileError(error)) return false;\n\t\tthrow error;\n\t}\n}\n\nfunction asTrimmedString(value: unknown): string | null {\n\tif (typeof value !== \"string\") return null;\n\tconst trimmed = value.trim();\n\treturn trimmed || null;\n}\n\nfunction parseStatus<T extends string>(value: unknown, allowed: readonly T[]): T | \"unknown\" {\n\treturn typeof value === \"string\" && (allowed as readonly string[]).includes(value) ? (value as T) : \"unknown\";\n}\n\n/** Strip an optional .md extension so depends_on accepts \"TASK-x\" and \"TASK-x.md\" alike. */\nfunction toTaskId(reference: string): string {\n\treturn reference.endsWith(\".md\") ? reference.slice(0, -3) : reference;\n}\n\nasync function readSpecInfo(specFile: string, problems: string[]): Promise<BiuSpecInfo> {\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(specFile, \"utf8\");\n\t} catch (error) {\n\t\tif (!isMissingFileError(error)) problems.push(`${BIU_SPEC_FILE_NAME}: ${describeError(error)}`);\n\t\treturn { exists: false, status: \"unknown\", title: null, baselineCommit: null, execution: null };\n\t}\n\ttry {\n\t\tconst { frontmatter } = parseFrontmatter(raw);\n\t\tconst status = parseStatus(frontmatter.status, BIU_SPEC_STATUSES);\n\t\tif (status === \"unknown\") {\n\t\t\tproblems.push(`${BIU_SPEC_FILE_NAME}: frontmatter \"status\" must be one of ${BIU_SPEC_STATUSES.join(\", \")}.`);\n\t\t}\n\t\tlet execution: BiuExecutionMode | null = null;\n\t\tif (frontmatter.execution !== undefined) {\n\t\t\tconst parsed = parseStatus(frontmatter.execution, BIU_EXECUTION_MODES);\n\t\t\tif (parsed === \"unknown\") {\n\t\t\t\tproblems.push(\n\t\t\t\t\t`${BIU_SPEC_FILE_NAME}: frontmatter \"execution\" must be one of ${BIU_EXECUTION_MODES.join(\", \")}.`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\texecution = parsed;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\texists: true,\n\t\t\tstatus,\n\t\t\ttitle: asTrimmedString(frontmatter.title),\n\t\t\tbaselineCommit: asTrimmedString(frontmatter.baseline_commit),\n\t\t\texecution,\n\t\t};\n\t} catch (error) {\n\t\tproblems.push(`${BIU_SPEC_FILE_NAME}: invalid frontmatter (${describeError(error)})`);\n\t\treturn { exists: true, status: \"unknown\", title: null, baselineCommit: null, execution: null };\n\t}\n}\n\nasync function readTaskInfo(tasksDir: string, fileName: string, problems: string[]): Promise<BiuTaskInfo> {\n\tconst id = toTaskId(fileName);\n\tconst relative = `${BIU_TASKS_DIRECTORY_NAME}/${fileName}`;\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(join(tasksDir, fileName), \"utf8\");\n\t} catch (error) {\n\t\tproblems.push(`${relative}: ${describeError(error)}`);\n\t\treturn { id, title: id, status: \"unknown\", dependsOn: [] };\n\t}\n\ttry {\n\t\tconst { frontmatter } = parseFrontmatter(raw);\n\t\tconst status = parseStatus(frontmatter.status, BIU_TASK_STATUSES);\n\t\tif (status === \"unknown\") {\n\t\t\tproblems.push(`${relative}: frontmatter \"status\" must be one of ${BIU_TASK_STATUSES.join(\", \")}.`);\n\t\t}\n\t\tconst dependsOn = Array.isArray(frontmatter.depends_on)\n\t\t\t? frontmatter.depends_on.filter((dep): dep is string => typeof dep === \"string\").map(toTaskId)\n\t\t\t: [];\n\t\treturn { id, title: asTrimmedString(frontmatter.title) ?? id, status, dependsOn };\n\t} catch (error) {\n\t\tproblems.push(`${relative}: invalid frontmatter (${describeError(error)})`);\n\t\treturn { id, title: id, status: \"unknown\", dependsOn: [] };\n\t}\n}\n\nfunction countTasks(tasks: BiuTaskInfo[]): BiuTaskCounts {\n\tconst counts: BiuTaskCounts = { total: tasks.length, ready: 0, inProgress: 0, completed: 0, unknown: 0 };\n\tfor (const task of tasks) {\n\t\tif (task.status === \"ready\") counts.ready++;\n\t\telse if (task.status === \"in_progress\") counts.inProgress++;\n\t\telse if (task.status === \"completed\") counts.completed++;\n\t\telse counts.unknown++;\n\t}\n\treturn counts;\n}\n\n/** What to work on next: the in-progress task, else the first ready task whose dependencies are all completed. */\nexport function getBiuFocus(tasks: BiuTaskInfo[]): BiuFocus {\n\tconst active = tasks.find((task) => task.status === \"in_progress\");\n\tif (active) return { kind: \"active\", task: active };\n\tconst byId = new Map(tasks.map((task) => [task.id, task]));\n\tconst next = tasks.find(\n\t\t(task) => task.status === \"ready\" && task.dependsOn.every((dep) => byId.get(dep)?.status === \"completed\"),\n\t);\n\tif (next) return { kind: \"next\", task: next };\n\tif (tasks.length > 0 && tasks.every((task) => task.status === \"completed\")) return { kind: \"allDone\" };\n\treturn { kind: \"none\" };\n}\n\nfunction deriveStage(spec: BiuSpecInfo, tasks: BiuTaskInfo[], summaryExists: boolean): BiuStage {\n\tif (summaryExists) return \"archive\";\n\tif (!spec.exists || spec.status !== \"ready\") return \"plan\";\n\tif (tasks.length > 0 && tasks.every((task) => task.status === \"completed\")) return \"archive\";\n\treturn \"execute\";\n}\n\n/**\n * Build the workspace snapshot by reading frontmatter from SPEC.md and\n * tasks/*.md. Content problems (unreadable files, malformed frontmatter) are\n * reported in `problems` and degrade to \"unknown\" instead of throwing.\n */\nexport async function loadBiuSnapshot(cwd: string, agentDir: string = getAgentDir()): Promise<BiuSnapshot> {\n\tconst paths = getBiuPaths(cwd, agentDir);\n\tconst problems: string[] = [];\n\n\tconst spec = await readSpecInfo(paths.specFile, problems);\n\n\tlet summaryExists = false;\n\ttry {\n\t\tsummaryExists = await pathExists(paths.summaryFile);\n\t} catch (error) {\n\t\tproblems.push(`${BIU_SUMMARY_FILE_NAME}: ${describeError(error)}`);\n\t}\n\n\tlet taskFiles: string[] = [];\n\ttry {\n\t\ttaskFiles = (await readdir(paths.tasksDir)).filter((name) => name.endsWith(\".md\")).sort();\n\t} catch (error) {\n\t\tif (!isMissingFileError(error)) problems.push(`${BIU_TASKS_DIRECTORY_NAME}/: ${describeError(error)}`);\n\t}\n\tif (taskFiles.length > BIU_MAX_SNAPSHOT_TASKS) {\n\t\tproblems.push(\n\t\t\t`${BIU_TASKS_DIRECTORY_NAME}/: ${taskFiles.length} task files exceed the snapshot limit of ${BIU_MAX_SNAPSHOT_TASKS}; only the first ${BIU_MAX_SNAPSHOT_TASKS} are listed.`,\n\t\t);\n\t\ttaskFiles = taskFiles.slice(0, BIU_MAX_SNAPSHOT_TASKS);\n\t}\n\tconst tasks: BiuTaskInfo[] = [];\n\tfor (const fileName of taskFiles) {\n\t\ttasks.push(await readTaskInfo(paths.tasksDir, fileName, problems));\n\t}\n\n\treturn {\n\t\tstage: deriveStage(spec, tasks, summaryExists),\n\t\tspec,\n\t\tsummaryExists,\n\t\ttasks,\n\t\tcounts: countTasks(tasks),\n\t\tfocus: getBiuFocus(tasks),\n\t\tproblems,\n\t};\n}\n\nexport function sanitizeShortname(shortname: string): string {\n\tconst printable = Array.from(shortname.trim())\n\t\t.filter((ch) => {\n\t\t\tconst code = ch.codePointAt(0) ?? 0;\n\t\t\treturn code >= 0x20 && code !== 0x7f;\n\t\t})\n\t\t.join(\"\");\n\tconst cleaned = printable\n\t\t.replace(/[<>:\"/\\\\|?*]+/g, \"-\")\n\t\t.replace(/\\s+/g, \"-\")\n\t\t.replace(/-{2,}/g, \"-\")\n\t\t.replace(/^[-.]+|[-.]+$/g, \"\");\n\treturn cleaned.slice(0, BIU_MAX_SHORTNAME_LENGTH).replace(/^[-.]+|[-.]+$/g, \"\");\n}\n\n/** Signature for archive file moves; injectable for tests. */\nexport type BiuMoveFile = (from: string, to: string) => Promise<boolean>;\n\n/** Move one file or directory, returning false when the source does not exist. */\nasync function moveIfExists(from: string, to: string): Promise<boolean> {\n\tif (!(await pathExists(from))) return false;\n\tawait rename(from, to);\n\treturn true;\n}\n\nexport interface BiuArchiveResult {\n\tarchivedPath: string;\n\tarchiveName: string;\n}\n\n/**\n * Close the current cycle: move SPEC.md, Summary.md, and tasks/ into\n * archived/YYYY-MM-DD-<shortname>/. If any move fails, already-moved files are\n * rolled back so the cycle is never left half-archived; when a rollback itself\n * fails, the recovery data stays in the archive directory and the error says\n * where. Requires SPEC.md and Summary.md to exist so an empty or unfinished\n * draft is never archived silently.\n *\n * `move` is injectable for tests; rollback always uses the real move.\n */\nexport async function archiveBiuCycle(\n\tcwd: string,\n\tshortname: string,\n\tagentDir: string = getAgentDir(),\n\tnow: Date = new Date(),\n\tmove: BiuMoveFile = moveIfExists,\n): Promise<BiuArchiveResult> {\n\tconst paths = getBiuPaths(cwd, agentDir);\n\tconst safeName = sanitizeShortname(shortname);\n\tif (!safeName) throw new Error(`Archive shortname ${JSON.stringify(shortname)} is empty after sanitization.`);\n\tif (!(await pathExists(paths.specFile))) {\n\t\tthrow new Error(\"Cannot archive: SPEC.md does not exist in the Biu workspace.\");\n\t}\n\tif (!(await pathExists(paths.summaryFile))) {\n\t\tthrow new Error(\"Cannot archive: Summary.md does not exist yet. Draft and confirm the summary first.\");\n\t}\n\n\tawait mkdir(paths.archivedDir, { recursive: true });\n\tconst date = now.toISOString().slice(0, 10);\n\tconst baseName = `${date}-${safeName}`;\n\tlet existing: string[];\n\ttry {\n\t\texisting = await readdir(paths.archivedDir);\n\t} catch {\n\t\texisting = [];\n\t}\n\tlet archiveName = baseName;\n\tfor (let suffix = 2; existing.includes(archiveName); suffix++) {\n\t\tarchiveName = `${baseName}-${String(suffix).padStart(2, \"0\")}`;\n\t}\n\tconst archivedPath = join(paths.archivedDir, archiveName);\n\tawait mkdir(archivedPath, { recursive: false });\n\n\tconst moves: Array<{ from: string; to: string }> = [\n\t\t{ from: paths.specFile, to: join(archivedPath, BIU_SPEC_FILE_NAME) },\n\t\t{ from: paths.summaryFile, to: join(archivedPath, BIU_SUMMARY_FILE_NAME) },\n\t\t{ from: paths.tasksDir, to: join(archivedPath, BIU_TASKS_DIRECTORY_NAME) },\n\t];\n\tconst moved: Array<{ from: string; to: string }> = [];\n\ttry {\n\t\tfor (const entry of moves) {\n\t\t\tif (await move(entry.from, entry.to)) moved.push(entry);\n\t\t}\n\t} catch (error) {\n\t\tthrow await rollbackArchive(error, archivedPath, moved);\n\t}\n\t// Recreate the empty tasks/ directory for the next cycle. Best-effort: the\n\t// next ensureBiuWorkspace call recreates it anyway.\n\tawait mkdir(paths.tasksDir, { recursive: true }).catch(() => {});\n\treturn { archivedPath, archiveName };\n}\n\n/**\n * Reverse the already-moved files and clean the archive directory. Returns\n * the original error unchanged when the rollback fully succeeded, otherwise\n * a chained error whose message says exactly what remains inconsistent.\n */\nasync function rollbackArchive(\n\terror: unknown,\n\tarchivedPath: string,\n\tmoved: Array<{ from: string; to: string }>,\n): Promise<Error> {\n\tconst restoreErrors: string[] = [];\n\tfor (const entry of [...moved].reverse()) {\n\t\ttry {\n\t\t\tawait moveIfExists(entry.to, entry.from);\n\t\t} catch (restoreError) {\n\t\t\trestoreErrors.push(`moving ${entry.to} back failed: ${describeError(restoreError)}`);\n\t\t}\n\t}\n\tif (restoreErrors.length > 0) {\n\t\treturn new Error(\n\t\t\t`${describeError(error)} Rollback incomplete, recovery data left in ${archivedPath}: ${restoreErrors.join(\"; \")}`,\n\t\t\t{ cause: error },\n\t\t);\n\t}\n\ttry {\n\t\tawait rm(archivedPath, { recursive: true, force: true });\n\t} catch (cleanupError) {\n\t\treturn new Error(\n\t\t\t`${describeError(error)} Rollback succeeded, but removing the empty ${archivedPath} directory failed: ${describeError(cleanupError)}`,\n\t\t\t{ cause: error },\n\t\t);\n\t}\n\treturn error instanceof Error ? error : new Error(describeError(error), { cause: error });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAA2B,MAAM,aAAa,CAAC;AAW3E,KAAK,gBAAgB,GAAG,qBAAqB,GAAG,oBAAoB,GAAG,cAAc,CAAC;AA0BtF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAkHD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1D;AAmBD,wBAAsB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4DrH"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAA2B,MAAM,aAAa,CAAC;AAW3E,KAAK,gBAAgB,GAAG,qBAAqB,GAAG,oBAAoB,GAAG,cAAc,CAAC;AA0BtF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAkHD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1D;AAmBD,wBAAsB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4DrH"}
|
|
@@ -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\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\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\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 { 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\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\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\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAC7C,eAAO,MAAM,cAAc,aAAa,CAAC;AAEzC,eAAO,MAAM,oBAAoB,owBACutB,CAAC;AAEzvB,eAAO,MAAM,uBAAuB,yHACmF,CAAC;AAExH,eAAO,MAAM,0BAA0B,UAKtC,CAAC"
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAC7C,eAAO,MAAM,cAAc,aAAa,CAAC;AAEzC,eAAO,MAAM,oBAAoB,owBACutB,CAAC;AAEzvB,eAAO,MAAM,uBAAuB,yHACmF,CAAC;AAExH,eAAO,MAAM,0BAA0B,UAKtC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,oBAAoB,GAChC,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,oBAAoB,GAChC,uvBAAuvB,CAAC;AAEzvB,MAAM,CAAC,MAAM,uBAAuB,GACnC,sHAAsH,CAAC;AAExH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACzC,mSAAmS;IACnS,uRAAuR;IACvR,oQAAoQ;IACpQ,uMAAuM;CACvM,CAAC","sourcesContent":["/**\n * constants.ts — deepwiki tool identity + prompt copy.\n *\n * Name/label/description/promptSnippet/promptGuidelines live here so\n * `index.ts` only assembles the tool. Prompt copy is the model-facing\n * contract; keep it stable.\n */\n\nexport const DEEPWIKI_TOOL_NAME = \"deepwiki\";\nexport const DEEPWIKI_LABEL = \"DeepWiki\";\n\nexport const DEEPWIKI_DESCRIPTION =\n\t\"Query DeepWiki's AI-generated documentation for indexed public GitHub repositories. Recommended flow: structure lists the wiki's pages; contents with page (title or 1-based index) reads one page — read pages selectively rather than pulling the whole wiki (omitting page returns everything, truncated past ~120k chars); question answers a focused query (up to 10 repos for comparisons) — reach for it when the wiki pages don't cover what you need, or on its own for a quick answer without reading. Use it for architecture, module layout, APIs, extension points, and implementation patterns when designing or building. Results describe indexed public snapshots and may cite sources; they are not local workspace state, private code, or guaranteed-fresh facts.\";\n\nexport const DEEPWIKI_PROMPT_SNIPPET =\n\t\"Query AI-generated docs for public GitHub repos: architecture, APIs, implementation patterns, cross-repo comparisons\";\n\nexport const DEEPWIKI_PROMPT_GUIDELINES = [\n\t\"Use `deepwiki` on public GitHub repos only: run `structure` first for that owner/repo. If structure fails with repository not found, the wiki is not indexed on DeepWiki — do not call contents or question for that repo; pick another repo (e.g. upstream `badlogic/pi-mono` for pi-mono docs).\",\n\t\"After structure, use `contents` with `page` set to a 1-based index or an exact page title from the structure list (titles are plain names like `Extension System`, not numbered outline lines like `4.4 Extension System`). Avoid `contents` without `page` unless the wiki is small.\",\n\t\"Use `deepwiki` action `question` for a focused answer without reading pages, or when structure/contents do not cover the topic. Single repo: `repoName` as a string. Compare 2-10 repos: `repoName` as an array of owner/repo strings (or comma-separated string).\",\n\t\"Do not use `deepwiki` for local workspace files, private repos, exact current HEAD, or freshness-sensitive facts (releases, pricing, advisories); use local tools or current primary sources instead.\",\n];\n"]}
|