@bastani/atomic 0.9.27 → 0.9.28-alpha.2
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 +61 -0
- package/dist/builtin/intercom/CHANGELOG.md +6 -0
- package/dist/builtin/intercom/broker/broker.ts +13 -1
- package/dist/builtin/intercom/package.json +2 -2
- package/dist/builtin/mcp/CHANGELOG.md +6 -0
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/package.json +3 -3
- package/dist/builtin/web-access/index.bundle.mjs +194 -44
- package/dist/builtin/web-access/package.json +3 -3
- package/dist/builtin/workflows/CHANGELOG.md +31 -0
- package/dist/builtin/workflows/builtin/{chunk-gw7rghda.js → chunk-aqv8ny38.js} +257 -259
- package/dist/builtin/workflows/builtin/{chunk-gts8wgjr.js → chunk-br4ac9a3.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-9bhs02gm.js → chunk-p3xmajmj.js} +439 -40
- package/dist/builtin/workflows/builtin/chunk-p6jagvyf.js +8 -0
- package/dist/builtin/workflows/builtin/goal.js +2 -2
- package/dist/builtin/workflows/builtin/index.js +4 -4
- package/dist/builtin/workflows/builtin/ralph.js +2 -2
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/src/authoring.d.ts +14 -0
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +108110 -107201
- package/dist/builtin/workflows/src/index.js +42226 -41077
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +16 -11
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +16 -1
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +12 -5
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/credential-print.d.ts +1 -1
- package/dist/cli/credential-print.d.ts.map +1 -1
- package/dist/cli/credential-print.js +2 -56
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/codemode-worker.js +99 -3
- package/dist/core/agent-session-accessors.d.ts.map +1 -1
- package/dist/core/agent-session-accessors.js +6 -1
- package/dist/core/agent-session-accessors.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +20 -3
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-events.js +3 -2
- package/dist/core/agent-session-events.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts +6 -0
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +96 -12
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +4 -1
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +19 -3
- package/dist/core/agent-session-prompt.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-state.d.ts.map +1 -1
- package/dist/core/agent-session-state.js +3 -2
- package/dist/core/agent-session-state.js.map +1 -1
- package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
- package/dist/core/agent-session-tool-registry.js +11 -16
- package/dist/core/agent-session-tool-registry.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +1 -0
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +5 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage-backends.d.ts.map +1 -1
- package/dist/core/auth-storage-backends.js +2 -1
- package/dist/core/auth-storage-backends.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +15 -7
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/azure-provider-compat.d.ts +8 -0
- package/dist/core/azure-provider-compat.d.ts.map +1 -0
- package/dist/core/azure-provider-compat.js +65 -0
- package/dist/core/azure-provider-compat.js.map +1 -0
- package/dist/core/child-session-options.d.ts +1 -1
- package/dist/core/child-session-options.d.ts.map +1 -1
- package/dist/core/child-session-options.js +11 -2
- package/dist/core/child-session-options.js.map +1 -1
- package/dist/core/compaction/classifier-compaction.d.ts +13 -0
- package/dist/core/compaction/classifier-compaction.d.ts.map +1 -0
- package/dist/core/compaction/classifier-compaction.js +110 -0
- package/dist/core/compaction/classifier-compaction.js.map +1 -0
- package/dist/core/compaction/compaction-boundary.d.ts.map +1 -1
- package/dist/core/compaction/compaction-boundary.js +2 -6
- package/dist/core/compaction/compaction-boundary.js.map +1 -1
- package/dist/core/compaction/compaction-runner.d.ts +16 -1
- package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
- package/dist/core/compaction/compaction-runner.js +97 -12
- package/dist/core/compaction/compaction-runner.js.map +1 -1
- package/dist/core/compaction/compaction-types.d.ts +18 -1
- package/dist/core/compaction/compaction-types.d.ts.map +1 -1
- package/dist/core/compaction/compaction-types.js +1 -1
- package/dist/core/compaction/compaction-types.js.map +1 -1
- package/dist/core/compaction/fallback-planner.d.ts +1 -0
- package/dist/core/compaction/fallback-planner.d.ts.map +1 -1
- package/dist/core/compaction/fallback-planner.js +2 -0
- package/dist/core/compaction/fallback-planner.js.map +1 -1
- package/dist/core/compaction/index.d.ts +3 -0
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/index.js +3 -0
- package/dist/core/compaction/index.js.map +1 -1
- package/dist/core/compaction/model-resolver.d.ts +16 -0
- package/dist/core/compaction/model-resolver.d.ts.map +1 -0
- package/dist/core/compaction/model-resolver.js +18 -0
- package/dist/core/compaction/model-resolver.js.map +1 -0
- package/dist/core/compaction/morph-compaction.d.ts +14 -0
- package/dist/core/compaction/morph-compaction.d.ts.map +1 -0
- package/dist/core/compaction/morph-compaction.js +99 -0
- package/dist/core/compaction/morph-compaction.js.map +1 -0
- package/dist/core/compaction/pi-summary-fallback.d.ts +34 -0
- package/dist/core/compaction/pi-summary-fallback.d.ts.map +1 -0
- package/dist/core/compaction/pi-summary-fallback.js +357 -0
- package/dist/core/compaction/pi-summary-fallback.js.map +1 -0
- package/dist/core/compaction/planner-outcome.d.ts +10 -6
- package/dist/core/compaction/planner-outcome.d.ts.map +1 -1
- package/dist/core/compaction/planner-outcome.js +11 -4
- package/dist/core/compaction/planner-outcome.js.map +1 -1
- package/dist/core/compaction/range-planner-diagnostics.d.ts +3 -1
- package/dist/core/compaction/range-planner-diagnostics.d.ts.map +1 -1
- package/dist/core/compaction/range-planner-diagnostics.js +11 -0
- package/dist/core/compaction/range-planner-diagnostics.js.map +1 -1
- package/dist/core/compaction/range-planner.d.ts +3 -3
- package/dist/core/compaction/range-planner.d.ts.map +1 -1
- package/dist/core/compaction/range-planner.js +59 -28
- package/dist/core/compaction/range-planner.js.map +1 -1
- package/dist/core/compaction/region-trimming.d.ts.map +1 -1
- package/dist/core/compaction/region-trimming.js +7 -0
- package/dist/core/compaction/region-trimming.js.map +1 -1
- package/dist/core/compaction/structured-compaction-input.d.ts +19 -0
- package/dist/core/compaction/structured-compaction-input.d.ts.map +1 -0
- package/dist/core/compaction/structured-compaction-input.js +70 -0
- package/dist/core/compaction/structured-compaction-input.js.map +1 -0
- package/dist/core/compaction/transcript-serialization.d.ts +1 -0
- package/dist/core/compaction/transcript-serialization.d.ts.map +1 -1
- package/dist/core/compaction/transcript-serialization.js +26 -0
- package/dist/core/compaction/transcript-serialization.js.map +1 -1
- package/dist/core/extensions/api-types.d.ts +3 -2
- package/dist/core/extensions/api-types.d.ts.map +1 -1
- package/dist/core/extensions/api-types.js.map +1 -1
- package/dist/core/extensions/context-types.d.ts +1 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/loader-api.d.ts.map +1 -1
- package/dist/core/extensions/loader-api.js +5 -0
- package/dist/core/extensions/loader-api.js.map +1 -1
- package/dist/core/extensions/loader-host-modules.d.ts +1 -0
- package/dist/core/extensions/loader-host-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-host-modules.js +12 -0
- package/dist/core/extensions/loader-host-modules.js.map +1 -1
- package/dist/core/extensions/runner-context.d.ts +10 -4
- package/dist/core/extensions/runner-context.d.ts.map +1 -1
- package/dist/core/extensions/runner-context.js +47 -3
- package/dist/core/extensions/runner-context.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +11 -4
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +38 -9
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/tool-types.d.ts +2 -0
- package/dist/core/extensions/tool-types.d.ts.map +1 -1
- package/dist/core/extensions/tool-types.js.map +1 -1
- package/dist/core/extensions/workflow-events.d.ts +49 -0
- package/dist/core/extensions/workflow-events.d.ts.map +1 -1
- package/dist/core/extensions/workflow-events.js.map +1 -1
- package/dist/core/extensions/workflow-run-control-hub.d.ts +16 -4
- package/dist/core/extensions/workflow-run-control-hub.d.ts.map +1 -1
- package/dist/core/extensions/workflow-run-control-hub.js +72 -1
- package/dist/core/extensions/workflow-run-control-hub.js.map +1 -1
- package/dist/core/extensions/workflow-run-control.d.ts +11 -3
- package/dist/core/extensions/workflow-run-control.d.ts.map +1 -1
- package/dist/core/extensions/workflow-run-control.js.map +1 -1
- package/dist/core/fast-model-variants.d.ts +1 -1
- package/dist/core/fast-model-variants.js +1 -1
- package/dist/core/fast-model-variants.js.map +1 -1
- package/dist/core/keybindings.d.ts +4 -4
- package/dist/core/messages.d.ts +1 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +5 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +2 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-fallback-failures.d.ts.map +1 -1
- package/dist/core/model-fallback-failures.js +5 -1
- package/dist/core/model-fallback-failures.js.map +1 -1
- package/dist/core/model-resolver-cli.d.ts.map +1 -1
- package/dist/core/model-resolver-cli.js +5 -1
- package/dist/core/model-resolver-cli.js.map +1 -1
- package/dist/core/model-resolver-defaults.js +1 -1
- package/dist/core/model-resolver-defaults.js.map +1 -1
- package/dist/core/model-resolver-initial.d.ts.map +1 -1
- package/dist/core/model-resolver-initial.js +6 -1
- package/dist/core/model-resolver-initial.js.map +1 -1
- package/dist/core/model-resolver-patterns.d.ts.map +1 -1
- package/dist/core/model-resolver-patterns.js +2 -1
- package/dist/core/model-resolver-patterns.js.map +1 -1
- package/dist/core/model-resolver-scope.d.ts.map +1 -1
- package/dist/core/model-resolver-scope.js +3 -1
- package/dist/core/model-resolver-scope.js.map +1 -1
- package/dist/core/model-runtime-streaming.d.ts.map +1 -1
- package/dist/core/model-runtime-streaming.js +2 -0
- package/dist/core/model-runtime-streaming.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +48 -22
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-composer-internal.d.ts.map +1 -1
- package/dist/core/provider-composer-internal.js +4 -1
- package/dist/core/provider-composer-internal.js.map +1 -1
- package/dist/core/provider-display-names.js +1 -1
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +3 -0
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader-core.d.ts +1 -0
- package/dist/core/resource-loader-core.d.ts.map +1 -1
- package/dist/core/resource-loader-core.js +4 -0
- package/dist/core/resource-loader-core.js.map +1 -1
- package/dist/core/resource-loader-internals.d.ts +1 -0
- package/dist/core/resource-loader-internals.d.ts.map +1 -1
- package/dist/core/resource-loader-internals.js.map +1 -1
- package/dist/core/resource-loader-reload.d.ts.map +1 -1
- package/dist/core/resource-loader-reload.js +28 -5
- package/dist/core/resource-loader-reload.js.map +1 -1
- package/dist/core/resource-loader-types.d.ts +2 -0
- package/dist/core/resource-loader-types.d.ts.map +1 -1
- package/dist/core/resource-loader-types.js.map +1 -1
- package/dist/core/sdk-types.d.ts +6 -4
- package/dist/core/sdk-types.d.ts.map +1 -1
- package/dist/core/sdk-types.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +5 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-lifecycle-work.d.ts +2 -1
- package/dist/core/session-lifecycle-work.d.ts.map +1 -1
- package/dist/core/session-lifecycle-work.js +15 -1
- package/dist/core/session-lifecycle-work.js.map +1 -1
- package/dist/core/session-manager-history.d.ts.map +1 -1
- package/dist/core/session-manager-history.js +4 -2
- package/dist/core/session-manager-history.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts +2 -0
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-basic-accessors.js +33 -4
- package/dist/core/settings-manager-basic-accessors.js.map +1 -1
- package/dist/core/settings-manager-core.d.ts.map +1 -1
- package/dist/core/settings-manager-core.js +2 -0
- package/dist/core/settings-manager-core.js.map +1 -1
- package/dist/core/settings-storage.d.ts.map +1 -1
- package/dist/core/settings-storage.js +2 -1
- package/dist/core/settings-storage.js.map +1 -1
- package/dist/core/settings-types.d.ts +1 -0
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +3 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/system-prompt.d.ts +3 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +7 -3
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tool-loadout.d.ts.map +1 -1
- package/dist/core/tool-loadout.js +8 -1
- package/dist/core/tool-loadout.js.map +1 -1
- package/dist/core/tool-selection.d.ts +13 -0
- package/dist/core/tool-selection.d.ts.map +1 -0
- package/dist/core/tool-selection.js +43 -0
- package/dist/core/tool-selection.js.map +1 -0
- package/dist/core/tools/read.d.ts +7 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +11 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/transcript.d.ts +58 -0
- package/dist/core/transcript.d.ts.map +1 -0
- package/dist/core/transcript.js +185 -0
- package/dist/core/transcript.js.map +1 -0
- package/dist/extensions/codemode/execute.d.ts.map +1 -1
- package/dist/extensions/codemode/execute.js +2 -1
- package/dist/extensions/codemode/execute.js.map +1 -1
- package/dist/extensions/codemode/index.d.ts.map +1 -1
- package/dist/extensions/codemode/index.js +1 -0
- package/dist/extensions/codemode/index.js.map +1 -1
- package/dist/extensions/codemode/tool.d.ts +4 -1
- package/dist/extensions/codemode/tool.d.ts.map +1 -1
- package/dist/extensions/codemode/tool.js +6 -3
- package/dist/extensions/codemode/tool.js.map +1 -1
- package/dist/extensions/herdr/index.d.ts.map +1 -1
- package/dist/extensions/herdr/index.js +15 -10
- package/dist/extensions/herdr/index.js.map +1 -1
- package/dist/extensions/herdr/pane-owner.d.ts +6 -2
- package/dist/extensions/herdr/pane-owner.d.ts.map +1 -1
- package/dist/extensions/herdr/pane-owner.js +19 -4
- package/dist/extensions/herdr/pane-owner.js.map +1 -1
- package/dist/extensions/mcp/client/oauth/flow.d.ts.map +1 -1
- package/dist/extensions/mcp/client/oauth/flow.js +14 -1
- package/dist/extensions/mcp/client/oauth/flow.js.map +1 -1
- package/dist/extensions/mcp/client/oauth/types.d.ts +1 -0
- package/dist/extensions/mcp/client/oauth/types.d.ts.map +1 -1
- package/dist/extensions/mcp/client/oauth/types.js.map +1 -1
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/runtime.d.ts +5 -2
- package/dist/extensions/mcp/runtime.d.ts.map +1 -1
- package/dist/extensions/mcp/runtime.js +18 -4
- package/dist/extensions/mcp/runtime.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +2 -0
- package/dist/main.js.map +1 -1
- package/dist/migrations-azure.d.ts +4 -0
- package/dist/migrations-azure.d.ts.map +1 -0
- package/dist/migrations-azure.js +41 -0
- package/dist/migrations-azure.js.map +1 -0
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +2 -0
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.js +2 -1
- package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.d.ts +2 -0
- package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.js +9 -3
- package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.d.ts +2 -0
- package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.js +15 -3
- package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js +43 -0
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts +6 -0
- package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
- package/dist/modes/interactive/interactive-prompt-turn.js +6 -4
- package/dist/modes/interactive/interactive-prompt-turn.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +13 -1
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +8 -0
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +2 -0
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +1 -1
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/theme/tui-theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/tui-theme.js +1 -0
- package/dist/modes/interactive/theme/tui-theme.js.map +1 -1
- package/dist/modes/interactive-engine/engine-args.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-args.js +1 -0
- package/dist/modes/interactive-engine/engine-args.js.map +1 -1
- package/dist/utils/credential-redaction.d.ts +2 -0
- package/dist/utils/credential-redaction.d.ts.map +1 -0
- package/dist/utils/credential-redaction.js +20 -0
- package/dist/utils/credential-redaction.js.map +1 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js +6 -1
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/docs/codemode.md +3 -2
- package/docs/compaction/reference.md +10 -4
- package/docs/compaction.md +40 -8
- package/docs/docs.json +1 -0
- package/docs/extensions/api-reference.md +18 -0
- package/docs/extensions/authoring.md +1 -1
- package/docs/extensions/events.md +2 -2
- package/docs/extensions.md +2 -0
- package/docs/keybindings.md +9 -9
- package/docs/mcp-servers.md +4 -0
- package/docs/providers.md +33 -3
- package/docs/reference/cli.md +10 -3
- package/docs/sdk/reference.md +16 -1
- package/docs/sdk/web-server.md +325 -0
- package/docs/sdk.md +83 -1
- package/docs/security.md +1 -1
- package/docs/workflows/api-reference.md +74 -4
- package/docs/workflows/authoring.md +6 -2
- package/docs/workflows/builtins.md +4 -0
- package/docs/workflows/operations.md +12 -4
- package/npm-shrinkwrap.json +78 -74
- package/package.json +9 -9
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { applyAssistantMessageDelta, beginStreamingAssistantMessage, } from "../modes/interactive/streaming-assistant-message.js";
|
|
2
|
+
/** A detached, JSON-shaped copy, so callers cannot mutate transcript state and parts always serialize. */
|
|
3
|
+
function toJson(value) {
|
|
4
|
+
try {
|
|
5
|
+
const text = JSON.stringify(value);
|
|
6
|
+
return text === undefined ? null : JSON.parse(text);
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function hasToolCall(message, id) {
|
|
13
|
+
return message.content.some((block) => block.type === "toolCall" && block.id === id);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Reduce session events into the assistant's output as plain JSON parts.
|
|
17
|
+
*
|
|
18
|
+
* ```ts
|
|
19
|
+
* const transcript = createTranscript();
|
|
20
|
+
* session.subscribe((event) => transcript.apply(event));
|
|
21
|
+
* transcript.parts();
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function createTranscript(options = {}) {
|
|
25
|
+
const entries = [];
|
|
26
|
+
/** Results that arrived before any assistant message held their tool call. */
|
|
27
|
+
const unbound = new Map();
|
|
28
|
+
let streaming;
|
|
29
|
+
/** Bind to the most recent call with this id that has no final result, so reused ids keep separate results. */
|
|
30
|
+
const record = (id, raw) => {
|
|
31
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
32
|
+
const entry = entries[i];
|
|
33
|
+
if (!hasToolCall(entry.message, id) || entry.results.get(id)?.isPartial === false)
|
|
34
|
+
continue;
|
|
35
|
+
entry.results.set(id, raw);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (raw.isPartial && unbound.get(id)?.isPartial === false)
|
|
39
|
+
return;
|
|
40
|
+
unbound.set(id, raw);
|
|
41
|
+
};
|
|
42
|
+
const adopt = (entry) => {
|
|
43
|
+
for (const block of entry.message.content) {
|
|
44
|
+
if (block.type !== "toolCall" || entry.results.has(block.id))
|
|
45
|
+
continue;
|
|
46
|
+
const raw = unbound.get(block.id);
|
|
47
|
+
if (!raw)
|
|
48
|
+
continue;
|
|
49
|
+
entry.results.set(block.id, raw);
|
|
50
|
+
unbound.delete(block.id);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const settle = (entry) => {
|
|
54
|
+
const message = entry.message;
|
|
55
|
+
if (message.stopReason !== "aborted" && message.stopReason !== "error")
|
|
56
|
+
return;
|
|
57
|
+
const text = message.errorMessage || (message.stopReason === "aborted" ? "Operation aborted" : "Unknown error");
|
|
58
|
+
for (const block of message.content) {
|
|
59
|
+
if (block.type !== "toolCall" || entry.results.get(block.id)?.isPartial === false)
|
|
60
|
+
continue;
|
|
61
|
+
entry.results.set(block.id, {
|
|
62
|
+
result: { content: [{ type: "text", text }] },
|
|
63
|
+
isError: true,
|
|
64
|
+
isPartial: false,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const toolResult = (toolName, raw) => {
|
|
69
|
+
const value = raw.result;
|
|
70
|
+
let content = typeof value === "string" ? value : "";
|
|
71
|
+
if (typeof value === "object" && value !== null && Array.isArray(value.content)) {
|
|
72
|
+
content = value.content
|
|
73
|
+
.filter((item) => item?.type === "text")
|
|
74
|
+
.map((item) => item.text)
|
|
75
|
+
.join("\n");
|
|
76
|
+
}
|
|
77
|
+
if ((options.toolResult?.(toolName) ?? "content") === "details") {
|
|
78
|
+
const details = toJson(typeof value === "object" && value !== null ? value.details : undefined);
|
|
79
|
+
const errorText = raw.isError && details === null && content !== "" ? { content } : {};
|
|
80
|
+
return { details, ...errorText, isError: raw.isError, isPartial: raw.isPartial };
|
|
81
|
+
}
|
|
82
|
+
return { content, isError: raw.isError, isPartial: raw.isPartial };
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
apply(event) {
|
|
86
|
+
if ("parentToolCallId" in event && typeof event.parentToolCallId === "string")
|
|
87
|
+
return;
|
|
88
|
+
switch (event.type) {
|
|
89
|
+
case "message_start":
|
|
90
|
+
if (event.message.role !== "assistant")
|
|
91
|
+
return;
|
|
92
|
+
streaming = { message: beginStreamingAssistantMessage(event.message), results: new Map() };
|
|
93
|
+
entries.push(streaming);
|
|
94
|
+
return;
|
|
95
|
+
case "message_update": {
|
|
96
|
+
if (!streaming) {
|
|
97
|
+
streaming = {
|
|
98
|
+
message: {
|
|
99
|
+
role: "assistant",
|
|
100
|
+
content: [],
|
|
101
|
+
api: "",
|
|
102
|
+
provider: "",
|
|
103
|
+
model: "",
|
|
104
|
+
usage: {
|
|
105
|
+
input: 0,
|
|
106
|
+
output: 0,
|
|
107
|
+
cacheRead: 0,
|
|
108
|
+
cacheWrite: 0,
|
|
109
|
+
totalTokens: 0,
|
|
110
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
111
|
+
},
|
|
112
|
+
stopReason: "stop",
|
|
113
|
+
timestamp: Date.now(),
|
|
114
|
+
},
|
|
115
|
+
results: new Map(),
|
|
116
|
+
};
|
|
117
|
+
entries.push(streaming);
|
|
118
|
+
}
|
|
119
|
+
const delta = event.assistantMessageEvent;
|
|
120
|
+
applyAssistantMessageDelta(streaming.message, delta);
|
|
121
|
+
if (delta.type === "thinking_start" ||
|
|
122
|
+
delta.type === "thinking_delta" ||
|
|
123
|
+
delta.type === "thinking_end") {
|
|
124
|
+
// Deltas do not carry the redaction flag; the provider's partial does.
|
|
125
|
+
const source = delta.partial?.content[delta.contentIndex];
|
|
126
|
+
const block = streaming.message.content[delta.contentIndex];
|
|
127
|
+
if (source?.type === "thinking" && source.redacted && block?.type === "thinking")
|
|
128
|
+
block.redacted = true;
|
|
129
|
+
}
|
|
130
|
+
adopt(streaming);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
case "message_end": {
|
|
134
|
+
if (event.message.role !== "assistant")
|
|
135
|
+
return;
|
|
136
|
+
const message = beginStreamingAssistantMessage(event.message);
|
|
137
|
+
const entry = streaming ?? { message, results: new Map() };
|
|
138
|
+
if (streaming)
|
|
139
|
+
entry.message = message;
|
|
140
|
+
else
|
|
141
|
+
entries.push(entry);
|
|
142
|
+
streaming = undefined;
|
|
143
|
+
adopt(entry);
|
|
144
|
+
settle(entry);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
case "tool_execution_update":
|
|
148
|
+
record(event.toolCallId, { result: event.partialResult, isError: false, isPartial: true });
|
|
149
|
+
return;
|
|
150
|
+
case "tool_execution_end":
|
|
151
|
+
record(event.toolCallId, { result: event.result, isError: event.isError, isPartial: false });
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
parts() {
|
|
156
|
+
const parts = [];
|
|
157
|
+
for (const { message, results } of entries) {
|
|
158
|
+
for (const block of message.content) {
|
|
159
|
+
if (block.type === "text") {
|
|
160
|
+
if (block.text)
|
|
161
|
+
parts.push({ type: "text", text: block.text });
|
|
162
|
+
}
|
|
163
|
+
else if (block.type === "thinking") {
|
|
164
|
+
if (!block.redacted && block.thinking)
|
|
165
|
+
parts.push({ type: "thinking", thinking: block.thinking });
|
|
166
|
+
}
|
|
167
|
+
else if (block.type === "toolCall") {
|
|
168
|
+
const raw = results.get(block.id);
|
|
169
|
+
const part = {
|
|
170
|
+
type: "toolCall",
|
|
171
|
+
id: block.id,
|
|
172
|
+
name: block.name,
|
|
173
|
+
arguments: toJson(block.arguments),
|
|
174
|
+
};
|
|
175
|
+
if (raw)
|
|
176
|
+
part.result = toolResult(block.name, raw);
|
|
177
|
+
parts.push(part);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return parts;
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/core/transcript.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonObject, JsonValue } from \"@bastani/pi-ai\";\nimport type { AssistantMessage, TextContent } from \"@bastani/pi-ai/compat\";\nimport type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport {\n\tapplyAssistantMessageDelta,\n\tbeginStreamingAssistantMessage,\n} from \"../modes/interactive/streaming-assistant-message.ts\";\nimport type { AgentSessionEvent } from \"./agent-session-types.js\";\n\n/** Assistant prose. */\nexport interface TranscriptTextPart {\n\ttype: \"text\";\n\ttext: string;\n}\n\n/** Visible assistant reasoning. Redacted thinking blocks are never reported. */\nexport interface TranscriptThinkingPart {\n\ttype: \"thinking\";\n\tthinking: string;\n}\n\n/** The latest result reported for a tool call. */\nexport interface TranscriptToolResult {\n\t/** Text content of the result, joined with newlines. Set when the tool reports `\"content\"`. */\n\tcontent?: string;\n\t/**\n\t * The result's `details`, or `null` when it had none. Set when the tool reports `\"details\"`.\n\t * A failed call without details also carries its error text in `content`.\n\t */\n\tdetails?: JsonValue;\n\tisError: boolean;\n\t/** True while the result comes from `tool_execution_update` and the tool is still running. */\n\tisPartial: boolean;\n}\n\n/** A tool call from assistant content, joined by id with its execution result. */\nexport interface TranscriptToolCallPart {\n\ttype: \"toolCall\";\n\tid: string;\n\tname: string;\n\targuments: JsonObject;\n\t/** Absent until the tool reports an update or finishes. */\n\tresult?: TranscriptToolResult;\n}\n\nexport type TranscriptPart = TranscriptTextPart | TranscriptThinkingPart | TranscriptToolCallPart;\n\n/** Which field of a tool result to report: its text content (the default) or its `details`. */\nexport type TranscriptToolResultFormat = \"content\" | \"details\";\n\nexport interface TranscriptOptions {\n\t/** Choose per tool whether `result.content` or `result.details` is reported. Defaults to `\"content\"`. */\n\ttoolResult?: (toolName: string) => TranscriptToolResultFormat;\n}\n\nexport interface Transcript {\n\t/** Feed one session event. Events from nested tool calls (`parentToolCallId`) are ignored. */\n\tapply(event: AgentSessionEvent): void;\n\t/** Ordered parts of every assistant message seen so far, including the one still streaming. */\n\tparts(): TranscriptPart[];\n}\n\n/** What a tool reports as its result; anything else reports empty content and no details. */\ntype ToolResultValue = Partial<AgentToolResult> | string | null | undefined;\n\ninterface RawToolResult {\n\tresult: ToolResultValue;\n\tisError: boolean;\n\tisPartial: boolean;\n}\n\n/** One assistant message and the results bound to its tool calls, keyed by call id. */\ninterface MessageEntry {\n\tmessage: AssistantMessage;\n\tresults: Map<string, RawToolResult>;\n}\n\n/** A detached, JSON-shaped copy, so callers cannot mutate transcript state and parts always serialize. */\nfunction toJson(value: JsonValue | undefined): JsonValue {\n\ttry {\n\t\tconst text = JSON.stringify(value);\n\t\treturn text === undefined ? null : (JSON.parse(text) as JsonValue);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction hasToolCall(message: AssistantMessage, id: string): boolean {\n\treturn message.content.some((block) => block.type === \"toolCall\" && block.id === id);\n}\n\n/**\n * Reduce session events into the assistant's output as plain JSON parts.\n *\n * ```ts\n * const transcript = createTranscript();\n * session.subscribe((event) => transcript.apply(event));\n * transcript.parts();\n * ```\n */\nexport function createTranscript(options: TranscriptOptions = {}): Transcript {\n\tconst entries: MessageEntry[] = [];\n\t/** Results that arrived before any assistant message held their tool call. */\n\tconst unbound = new Map<string, RawToolResult>();\n\tlet streaming: MessageEntry | undefined;\n\n\t/** Bind to the most recent call with this id that has no final result, so reused ids keep separate results. */\n\tconst record = (id: string, raw: RawToolResult): void => {\n\t\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = entries[i];\n\t\t\tif (!hasToolCall(entry.message, id) || entry.results.get(id)?.isPartial === false) continue;\n\t\t\tentry.results.set(id, raw);\n\t\t\treturn;\n\t\t}\n\t\tif (raw.isPartial && unbound.get(id)?.isPartial === false) return;\n\t\tunbound.set(id, raw);\n\t};\n\n\tconst adopt = (entry: MessageEntry): void => {\n\t\tfor (const block of entry.message.content) {\n\t\t\tif (block.type !== \"toolCall\" || entry.results.has(block.id)) continue;\n\t\t\tconst raw = unbound.get(block.id);\n\t\t\tif (!raw) continue;\n\t\t\tentry.results.set(block.id, raw);\n\t\t\tunbound.delete(block.id);\n\t\t}\n\t};\n\n\tconst settle = (entry: MessageEntry): void => {\n\t\tconst message = entry.message;\n\t\tif (message.stopReason !== \"aborted\" && message.stopReason !== \"error\") return;\n\t\tconst text = message.errorMessage || (message.stopReason === \"aborted\" ? \"Operation aborted\" : \"Unknown error\");\n\t\tfor (const block of message.content) {\n\t\t\tif (block.type !== \"toolCall\" || entry.results.get(block.id)?.isPartial === false) continue;\n\t\t\tentry.results.set(block.id, {\n\t\t\t\tresult: { content: [{ type: \"text\", text }] },\n\t\t\t\tisError: true,\n\t\t\t\tisPartial: false,\n\t\t\t});\n\t\t}\n\t};\n\n\tconst toolResult = (toolName: string, raw: RawToolResult): TranscriptToolResult => {\n\t\tconst value = raw.result;\n\t\tlet content = typeof value === \"string\" ? value : \"\";\n\t\tif (typeof value === \"object\" && value !== null && Array.isArray(value.content)) {\n\t\t\tcontent = value.content\n\t\t\t\t.filter((item): item is TextContent => item?.type === \"text\")\n\t\t\t\t.map((item) => item.text)\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\t\tif ((options.toolResult?.(toolName) ?? \"content\") === \"details\") {\n\t\t\tconst details = toJson(typeof value === \"object\" && value !== null ? value.details : undefined);\n\t\t\tconst errorText = raw.isError && details === null && content !== \"\" ? { content } : {};\n\t\t\treturn { details, ...errorText, isError: raw.isError, isPartial: raw.isPartial };\n\t\t}\n\t\treturn { content, isError: raw.isError, isPartial: raw.isPartial };\n\t};\n\n\treturn {\n\t\tapply(event) {\n\t\t\tif (\"parentToolCallId\" in event && typeof event.parentToolCallId === \"string\") return;\n\t\t\tswitch (event.type) {\n\t\t\t\tcase \"message_start\":\n\t\t\t\t\tif (event.message.role !== \"assistant\") return;\n\t\t\t\t\tstreaming = { message: beginStreamingAssistantMessage(event.message), results: new Map() };\n\t\t\t\t\tentries.push(streaming);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"message_update\": {\n\t\t\t\t\tif (!streaming) {\n\t\t\t\t\t\tstreaming = {\n\t\t\t\t\t\t\tmessage: {\n\t\t\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\t\t\tapi: \"\",\n\t\t\t\t\t\t\t\tprovider: \"\",\n\t\t\t\t\t\t\t\tmodel: \"\",\n\t\t\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tstopReason: \"stop\",\n\t\t\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tresults: new Map(),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tentries.push(streaming);\n\t\t\t\t\t}\n\t\t\t\t\tconst delta = event.assistantMessageEvent;\n\t\t\t\t\tapplyAssistantMessageDelta(streaming.message, delta);\n\t\t\t\t\tif (\n\t\t\t\t\t\tdelta.type === \"thinking_start\" ||\n\t\t\t\t\t\tdelta.type === \"thinking_delta\" ||\n\t\t\t\t\t\tdelta.type === \"thinking_end\"\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Deltas do not carry the redaction flag; the provider's partial does.\n\t\t\t\t\t\tconst source = delta.partial?.content[delta.contentIndex];\n\t\t\t\t\t\tconst block = streaming.message.content[delta.contentIndex];\n\t\t\t\t\t\tif (source?.type === \"thinking\" && source.redacted && block?.type === \"thinking\")\n\t\t\t\t\t\t\tblock.redacted = true;\n\t\t\t\t\t}\n\t\t\t\t\tadopt(streaming);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"message_end\": {\n\t\t\t\t\tif (event.message.role !== \"assistant\") return;\n\t\t\t\t\tconst message = beginStreamingAssistantMessage(event.message);\n\t\t\t\t\tconst entry = streaming ?? { message, results: new Map<string, RawToolResult>() };\n\t\t\t\t\tif (streaming) entry.message = message;\n\t\t\t\t\telse entries.push(entry);\n\t\t\t\t\tstreaming = undefined;\n\t\t\t\t\tadopt(entry);\n\t\t\t\t\tsettle(entry);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"tool_execution_update\":\n\t\t\t\t\trecord(event.toolCallId, { result: event.partialResult, isError: false, isPartial: true });\n\t\t\t\t\treturn;\n\t\t\t\tcase \"tool_execution_end\":\n\t\t\t\t\trecord(event.toolCallId, { result: event.result, isError: event.isError, isPartial: false });\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\tparts() {\n\t\t\tconst parts: TranscriptPart[] = [];\n\t\t\tfor (const { message, results } of entries) {\n\t\t\t\tfor (const block of message.content) {\n\t\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\t\tif (block.text) parts.push({ type: \"text\", text: block.text });\n\t\t\t\t\t} else if (block.type === \"thinking\") {\n\t\t\t\t\t\tif (!block.redacted && block.thinking) parts.push({ type: \"thinking\", thinking: block.thinking });\n\t\t\t\t\t} else if (block.type === \"toolCall\") {\n\t\t\t\t\t\tconst raw = results.get(block.id);\n\t\t\t\t\t\tconst part: TranscriptToolCallPart = {\n\t\t\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\t\t\tid: block.id,\n\t\t\t\t\t\t\tname: block.name,\n\t\t\t\t\t\t\targuments: toJson(block.arguments) as JsonObject,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (raw) part.result = toolResult(block.name, raw);\n\t\t\t\t\t\tparts.push(part);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn parts;\n\t\t},\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,QAAQ,EAQR,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAWhF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAEnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAKlE,OAAO,EAIN,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EAGxB,MAAM,WAAW,CAAC;AAqCnB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsB1F;AAOD,kHAAkH;AAClH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa5E;AAkSD,wBAAsB,eAAe,CACpC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,EAC5E,GAAG,EAAE,oBAAoB,GAAG,SAAS,EACrC,OAAO,GAAE,mBAAwB,GAC/B,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,QAAQ,EAQR,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAWhF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAEnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAKlE,OAAO,EAIN,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EAGxB,MAAM,WAAW,CAAC;AAqCnB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsB1F;AAOD,kHAAkH;AAClH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa5E;AAkSD,wBAAsB,eAAe,CACpC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,EAC5E,GAAG,EAAE,oBAAoB,GAAG,SAAS,EACrC,OAAO,GAAE,mBAAwB,GAC/B,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAqI/C"}
|
|
@@ -350,7 +350,8 @@ export async function executeCodemode(id, input, signal, update, ctx, options =
|
|
|
350
350
|
const snapshot = () => ({ calls: calls.map((call) => ({ ...call })) });
|
|
351
351
|
const publish = () => update?.({ content: [], details: snapshot() });
|
|
352
352
|
const callable = ctx ? getCodemodeCallableTools(ctx.tools) : [];
|
|
353
|
-
const
|
|
353
|
+
const guidelines = options.getToolGuidelines?.();
|
|
354
|
+
const samples = new Map(callable.map((tool) => [tool.name, renderToolSample(toCodemodeDeclaration(tool, guidelines?.get(tool.name)))]));
|
|
354
355
|
const sandbox = new CodemodeSandbox({
|
|
355
356
|
tools: callable.map((tool) => ({
|
|
356
357
|
name: tool.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/extensions/codemode/execute.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tAnyModel,\n\tClassifierContext,\n\tImageContent,\n\tImagesContext,\n\tModelType,\n\tModelTypeMap,\n\tTextContent,\n\tUsage,\n} from \"@bastani/pi-ai\";\nimport type { AgentTool, AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype CodemodeResult,\n\tCodemodeSandbox,\n\ttype CodemodeTool,\n\tloadQuickJSWasm,\n\tparseCodemodeSource,\n\trenderToolSample,\n\ttoCodemodeIdentifier,\n} from \"@earendil-works/pi-codemode\";\nimport { getCodemodeWorkerUrl, getQuickJSWasmPath } from \"../../config.js\";\nimport type { ExtensionToolContext } from \"../../core/extensions/context-types.ts\";\nimport type { ToolNamespace } from \"../../core/extensions/tool-types.ts\";\nimport type { SessionEntry } from \"../../core/session-manager.ts\";\nimport { formatSize } from \"../../core/tools/truncate.ts\";\nimport { combineUsage } from \"../../core/usage-totals.ts\";\nimport { writeOutputFile } from \"../../utils/output-files.js\";\nimport { Bm25Ranker, createToolSearchDocument, DEFAULT_TOOL_SEARCH_LIMIT } from \"../tool-search/tool.js\";\nimport {\n\tCODEMODE_DOCS_PATH,\n\tCODEMODE_STORE_ENTRY_TYPE,\n\ttype CodemodeNestedCall,\n\ttype CodemodeToolDetails,\n\ttype CodemodeToolInput,\n\ttype CodemodeToolOptions,\n\tgetCodemodeCallableTools,\n\ttoCodemodeDeclaration,\n} from \"./tool.js\";\n\nconst IMAGE_EXTENSIONS: Record<string, string> = {\n\t\"image/png\": \".png\",\n\t\"image/jpeg\": \".jpg\",\n\t\"image/gif\": \".gif\",\n\t\"image/webp\": \".webp\",\n};\n\nasync function saveImages(items: (TextContent | ImageContent)[]): Promise<(TextContent | ImageContent)[]> {\n\tconst labels = new Map<string, Promise<string>>();\n\tconst label = async ({ data, mimeType }: ImageContent): Promise<string> => {\n\t\tconst bytes = Buffer.from(data, \"base64\");\n\t\tconst kind = `${mimeType}, ${formatSize(bytes.length)}`;\n\t\tconst extension = IMAGE_EXTENSIONS[mimeType];\n\t\tif (!extension) throw new Error(`No file extension for image type ${mimeType}`);\n\t\ttry {\n\t\t\tconst path = await writeOutputFile(\"atomic-codemode\", extension, bytes);\n\t\t\treturn `[Image saved to ${path} (${kind})]`;\n\t\t} catch (error) {\n\t\t\treturn `[Image (${kind}) could not be saved: ${error instanceof Error ? error.message : String(error)}]`;\n\t\t}\n\t};\n\tconst result = await Promise.all(\n\t\titems.map(async (item): Promise<(TextContent | ImageContent)[]> => {\n\t\t\tif (item.type !== \"image\") return [item];\n\t\t\tlet pending = labels.get(item.data);\n\t\t\tif (!pending) {\n\t\t\t\tpending = label(item);\n\t\t\t\tlabels.set(item.data, pending);\n\t\t\t}\n\t\t\treturn [{ type: \"text\", text: await pending }, item];\n\t\t}),\n\t);\n\treturn result.flat();\n}\n\nexport function readCodemodeStore(branch: readonly SessionEntry[]): Record<string, unknown> {\n\tconst store = new Map<string, unknown>();\n\tfor (const entry of branch) {\n\t\tif (\n\t\t\tentry.type !== \"custom\" ||\n\t\t\tentry.customType !== CODEMODE_STORE_ENTRY_TYPE ||\n\t\t\ttypeof entry.data !== \"object\" ||\n\t\t\tentry.data === null\n\t\t)\n\t\t\tcontinue;\n\t\tconst data = entry.data as { set?: Record<string, unknown>; delete?: string[] };\n\t\tif (\n\t\t\t!data.set ||\n\t\t\ttypeof data.set !== \"object\" ||\n\t\t\t!Array.isArray(data.delete) ||\n\t\t\t!data.delete.every((key) => typeof key === \"string\")\n\t\t)\n\t\t\tcontinue;\n\t\tfor (const key of data.delete) store.delete(key);\n\t\tfor (const [key, value] of Object.entries(data.set)) store.set(key, value);\n\t}\n\treturn Object.fromEntries(store);\n}\nfunction textOf(result: AgentToolResult<unknown>): string {\n\treturn result.content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\\n\");\n}\n/** Explicit public catalog fields. Provider configuration and credential-bearing URLs never cross into the VM. */\nexport function toCodemodeModelInfo(model: AnyModel): Record<string, unknown> {\n\treturn {\n\t\ttype: model.type,\n\t\tprovider: model.provider,\n\t\tid: model.id,\n\t\tname: model.name,\n\t\tapi: model.api,\n\t\tinput: model.input,\n\t\t...(\"reasoning\" in model ? { reasoning: model.reasoning } : {}),\n\t\t...(\"contextWindow\" in model ? { contextWindow: model.contextWindow } : {}),\n\t\t...(\"maxTokens\" in model ? { maxTokens: model.maxTokens } : {}),\n\t\tcost: model.cost,\n\t};\n}\nconst MODEL_TYPES = [\"chat\", \"image\", \"classifier\"] as const;\nfunction modelType(value: unknown): ModelType {\n\tif (value === \"chat\" || value === \"image\" || value === \"classifier\") return value;\n\tthrow new Error('Model type must be \"chat\", \"image\", or \"classifier\"');\n}\nfunction withArticle(word: string): string {\n\treturn `${/^[aeiou]/.test(word) ? \"an\" : \"a\"} ${word}`;\n}\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction describeValue(value: unknown): string {\n\tif (value === undefined || value === null) return String(value);\n\tif (Array.isArray(value)) return value.length === 0 ? \"an empty array\" : \"an array\";\n\tif (typeof value === \"object\") {\n\t\tconst keys = Object.keys(value);\n\t\tif (keys.length === 0) return \"{}\";\n\t\treturn `{ ${keys.slice(0, 6).join(\", \")}${keys.length > 6 ? \", ...\" : \"\"} }`;\n\t}\n\treturn typeof value === \"string\" ? \"a string\" : `a ${typeof value}`;\n}\nconst CLASSIFIER_CONTEXT_SHAPE =\n\t'{ state: { ... }, questions: { <id>: { type: \"choice\", instructions, criteria: { <label>: <meaning> } } | { type: \"score\", instructions, criteria: [<lowest level>, ..., <highest level>] } | { type: \"bool\", instructions, criteria: { true: <meaning>, false: <meaning> } } } }';\nfunction checkClassifierContext(context: unknown): ClassifierContext {\n\tconst fail = (problem: string) =>\n\t\tnew Error(\n\t\t\t`models.classify() ${problem}. Expected context: ${CLASSIFIER_CONTEXT_SHAPE}. See \"Classify\" in ${CODEMODE_DOCS_PATH}.`,\n\t\t);\n\tif (!isRecord(context)) throw fail(`expects a context object as its second argument, got ${describeValue(context)}`);\n\tif (!isRecord(context.state)) throw fail(`context.state must be an object, got ${describeValue(context.state)}`);\n\tconst { questions } = context;\n\tif (!isRecord(questions) || Object.keys(questions).length === 0)\n\t\tthrow fail(`context.questions must map question IDs to questions, got ${describeValue(questions)}`);\n\tconst isStrings = (values: unknown[]) => values.length > 0 && values.every((value) => typeof value === \"string\");\n\tfor (const [questionId, question] of Object.entries(questions)) {\n\t\tconst at = `context.questions.${questionId}`;\n\t\tif (!isRecord(question)) throw fail(`${at} must be a question object, got ${describeValue(question)}`);\n\t\tif (typeof question.instructions !== \"string\") throw fail(`${at}.instructions must be a string`);\n\t\tconst { criteria } = question;\n\t\tif (question.type === \"choice\") {\n\t\t\tif (!isRecord(criteria) || !isStrings(Object.values(criteria)))\n\t\t\t\tthrow fail(`${at} is a \"choice\" question, so criteria must map each label to its meaning`);\n\t\t} else if (question.type === \"score\") {\n\t\t\tif (!Array.isArray(criteria) || !isStrings(criteria))\n\t\t\t\tthrow fail(`${at} is a \"score\" question, so criteria must list the levels as strings, lowest first`);\n\t\t} else if (question.type === \"bool\") {\n\t\t\tif (!isRecord(criteria) || typeof criteria.true !== \"string\" || typeof criteria.false !== \"string\")\n\t\t\t\tthrow fail(`${at} is a \"bool\" question, so criteria must be { true: string, false: string }`);\n\t\t} else {\n\t\t\tthrow fail(`${at}.type must be \"choice\", \"score\", or \"bool\", got ${JSON.stringify(question.type)}`);\n\t\t}\n\t}\n\treturn context as unknown as ClassifierContext;\n}\nfunction checkImagesContext(context: unknown): ImagesContext {\n\tconst fail = (problem: string) =>\n\t\tnew Error(\n\t\t\t`models.generateImages() ${problem}. Expected context: { input: [{ type: \"text\", text: <prompt> }, ...optional { type: \"image\", data: <base64>, mimeType } references] }. See \"Generate images\" in ${CODEMODE_DOCS_PATH}.`,\n\t\t);\n\tif (!isRecord(context)) throw fail(`expects a context object as its second argument, got ${describeValue(context)}`);\n\tconst { input } = context;\n\tif (!Array.isArray(input) || input.length === 0)\n\t\tthrow fail(`context.input must be a non-empty array of blocks, got ${describeValue(input)}`);\n\tinput.forEach((block: unknown, index) => {\n\t\tif (isRecord(block) && block.type === \"text\" && typeof block.text === \"string\") return;\n\t\tif (\n\t\t\tisRecord(block) &&\n\t\t\tblock.type === \"image\" &&\n\t\t\ttypeof block.data === \"string\" &&\n\t\t\ttypeof block.mimeType === \"string\"\n\t\t)\n\t\t\treturn;\n\t\tthrow fail(`context.input[${index}] must be a text or image block, got ${describeValue(block)}`);\n\t});\n\treturn context as unknown as ImagesContext;\n}\nfunction provider(value: unknown): string | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value === \"string\") return value;\n\tthrow new Error(\"provider must be a string\");\n}\nfunction preview(args: unknown): string {\n\ttry {\n\t\treturn (JSON.stringify(args) ?? \"\").slice(0, 200);\n\t} catch {\n\t\treturn \"\";\n\t}\n}\ninterface ModelCallResult {\n\tstopReason: \"stop\" | \"error\" | \"aborted\";\n\terrorMessage?: string;\n\tusage?: Usage;\n}\nfunction createLimiter(limit: number) {\n\tlet active = 0;\n\tconst waiting: (() => void)[] = [];\n\treturn async <T>(run: () => Promise<T>): Promise<T> => {\n\t\tif (active >= limit) await new Promise<void>((resolve) => waiting.push(resolve));\n\t\tactive++;\n\t\ttry {\n\t\t\treturn await run();\n\t\t} finally {\n\t\t\tactive--;\n\t\t\twaiting.shift()?.();\n\t\t}\n\t};\n}\nfunction discoveryGlobals(\n\ttools: readonly AgentTool[],\n\tsamples: ReadonlyMap<string, string>,\n\toptions: CodemodeToolOptions,\n): CodemodeTool[] {\n\tconst entry = (name: string) => ({ name: toCodemodeIdentifier(name), description: samples.get(name) ?? \"\" });\n\treturn [\n\t\t{\n\t\t\tname: \"searchTools\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [query, config] = args as [unknown, { limit?: unknown; namespace?: unknown } | undefined];\n\t\t\t\tif (typeof query !== \"string\") throw new Error(\"searchTools() expects a query string\");\n\t\t\t\tconst limit = config?.limit ?? DEFAULT_TOOL_SEARCH_LIMIT;\n\t\t\t\tif (typeof limit !== \"number\" || !Number.isInteger(limit) || limit <= 0)\n\t\t\t\t\tthrow new Error(\"searchTools() limit must be a positive integer\");\n\t\t\t\tif (config?.namespace !== undefined && typeof config.namespace !== \"string\")\n\t\t\t\t\tthrow new Error(\"searchTools() namespace must be a string\");\n\t\t\t\tconst docs = tools.flatMap((tool) => {\n\t\t\t\t\tconst namespace = options.getToolNamespace?.(tool.name);\n\t\t\t\t\treturn config?.namespace && namespace?.name !== config.namespace\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: [createToolSearchDocument(tool, namespace)];\n\t\t\t\t});\n\t\t\t\treturn new Bm25Ranker().rank(query, docs, limit).map((match) => entry(match.name));\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"describeTool\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [name] = args as unknown[];\n\t\t\t\tif (typeof name !== \"string\") throw new Error(\"describeTool() expects a tool name\");\n\t\t\t\tconst tool = tools.find((tool) => tool.name === name || toCodemodeIdentifier(tool.name) === name);\n\t\t\t\treturn tool ? samples.get(tool.name) : undefined;\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"describeNamespace\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [name] = args as unknown[];\n\t\t\t\tif (typeof name !== \"string\") throw new Error(\"describeNamespace() expects a namespace name\");\n\t\t\t\tlet namespace: ToolNamespace | undefined;\n\t\t\t\tconst names: string[] = [];\n\t\t\t\tfor (const tool of tools) {\n\t\t\t\t\tconst toolNamespace = options.getToolNamespace?.(tool.name);\n\t\t\t\t\tif (toolNamespace?.name !== name) continue;\n\t\t\t\t\tnamespace ??= toolNamespace;\n\t\t\t\t\tnames.push(toCodemodeIdentifier(tool.name));\n\t\t\t\t}\n\t\t\t\tif (!namespace) return undefined;\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\t...(namespace.description ? { description: namespace.description } : {}),\n\t\t\t\t\t...(namespace.instructions ? { instructions: namespace.instructions } : {}),\n\t\t\t\t\ttools: names,\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t];\n}\nfunction modelGlobals(\n\tctx: ExtensionToolContext,\n\tid: string,\n\tcalls: CodemodeNestedCall[],\n\tpublish: () => void,\n\taddUsage: (usage: Usage) => void,\n\taddGeneratedImages: (count: number) => void,\n): CodemodeTool[] {\n\tconst models = ctx.modelRegistry;\n\tconst limit = createLimiter(4);\n\tlet count = 0;\n\tconst runModelCall = async <TType extends \"classifier\" | \"image\", TContext, TResult extends ModelCallResult>(\n\t\tname: string,\n\t\ttype: TType,\n\t\t[ref, context]: unknown[],\n\t\tcheckContext: (context: unknown) => TContext,\n\t\trun: (model: ModelTypeMap[TType], context: TContext) => Promise<TResult>,\n\t): Promise<TResult> => {\n\t\tconst listHint = `List the ${type} models you can use with models.getAvailableOfType(\"${type}\").`;\n\t\tif (!isRecord(ref) || typeof ref.provider !== \"string\" || typeof ref.id !== \"string\") {\n\t\t\tconst undefinedHint =\n\t\t\t\tref === undefined || ref === null\n\t\t\t\t\t? \" models.getModelOfType() returns undefined for an unknown provider or id.\"\n\t\t\t\t\t: \"\";\n\t\t\tthrow new Error(\n\t\t\t\t`${name}() expects ${withArticle(type)} model as its first argument, got ${describeValue(ref)}.${undefinedHint} ${listHint}`,\n\t\t\t);\n\t\t}\n\t\tconst { provider: providerId, id: modelId } = ref;\n\t\tconst model = models.getModelOfType(type, providerId, modelId);\n\t\tif (!model) {\n\t\t\tconst actualType = MODEL_TYPES.find(\n\t\t\t\t(other) => other !== type && models.getModelOfType(other, providerId, modelId) !== undefined,\n\t\t\t);\n\t\t\tthrow new Error(\n\t\t\t\tactualType\n\t\t\t\t\t? `\"${providerId}/${modelId}\" is ${withArticle(actualType)} model, not ${withArticle(type)} model. ${listHint}`\n\t\t\t\t\t: `Unknown ${type} model \"${providerId}/${modelId}\". ${listHint}`,\n\t\t\t);\n\t\t}\n\t\tconst checked = checkContext(context);\n\t\tconst record: CodemodeNestedCall = {\n\t\t\tid: `${id}/${name}/${++count}`,\n\t\t\tname,\n\t\t\targs: `${model.provider}/${model.id}`,\n\t\t\tstatus: \"running\",\n\t\t};\n\t\tcalls.push(record);\n\t\tpublish();\n\t\tconst start = performance.now();\n\t\tconst result = await limit(() => run(model, checked));\n\t\trecord.durationMs = performance.now() - start;\n\t\trecord.status = result.stopReason === \"stop\" ? \"ok\" : result.stopReason === \"aborted\" ? \"cancelled\" : \"error\";\n\t\tif (result.errorMessage) record.error = result.errorMessage.slice(0, 500);\n\t\tif (result.usage) {\n\t\t\trecord.cost = result.usage.cost.total;\n\t\t\taddUsage(result.usage);\n\t\t}\n\t\tpublish();\n\t\treturn result;\n\t};\n\treturn [\n\t\t{\n\t\t\tname: \"models.getModelsOfType\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [type, source] = args as unknown[];\n\t\t\t\treturn models.getModelsOfType(modelType(type), provider(source)).map(toCodemodeModelInfo);\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"models.getAvailableOfType\",\n\t\t\tspread: true,\n\t\t\texecute: async (args, { signal }) => {\n\t\t\t\tconst [type, source] = args as unknown[];\n\t\t\t\treturn (await models.getAvailableOfType(modelType(type), provider(source), { signal })).map(\n\t\t\t\t\ttoCodemodeModelInfo,\n\t\t\t\t);\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"models.getModelOfType\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [type, source, modelId] = args as unknown[];\n\t\t\t\tif (typeof source !== \"string\" || typeof modelId !== \"string\")\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`models.getModelOfType(type, provider, id) expects three strings, got (${(args as unknown[]).map(describeValue).join(\", \")}). The provider and the id are separate arguments, for example models.getModelOfType(\"classifier\", \"typesafe\", \"jev-latest\").`,\n\t\t\t\t\t);\n\t\t\t\tconst model = models.getModelOfType(modelType(type), source, modelId);\n\t\t\t\treturn model ? toCodemodeModelInfo(model) : undefined;\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"models.classify\",\n\t\t\tspread: true,\n\t\t\texecute: (args, { signal }) =>\n\t\t\t\trunModelCall(\"models.classify\", \"classifier\", args as unknown[], checkClassifierContext, (model, context) =>\n\t\t\t\t\tmodels.classify(model, context, { signal }),\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname: \"models.generateImages\",\n\t\t\tspread: true,\n\t\t\texecute: (args, { signal }) =>\n\t\t\t\trunModelCall(\n\t\t\t\t\t\"models.generateImages\",\n\t\t\t\t\t\"image\",\n\t\t\t\t\targs as unknown[],\n\t\t\t\t\tcheckImagesContext,\n\t\t\t\t\tasync (model, context) => {\n\t\t\t\t\t\tconst result = await models.generateImages(model, context, { signal });\n\t\t\t\t\t\taddGeneratedImages(result.output.filter((block) => block.type === \"image\").length);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t},\n\t];\n}\n\nexport async function executeCodemode(\n\tid: string,\n\tinput: CodemodeToolInput,\n\tsignal: AbortSignal | undefined,\n\tupdate: ((result: AgentToolResult<CodemodeToolDetails>) => void) | undefined,\n\tctx: ExtensionToolContext | undefined,\n\toptions: CodemodeToolOptions = {},\n): Promise<AgentToolResult<CodemodeToolDetails>> {\n\tconst start = performance.now();\n\tconst { code, options: source } = parseCodemodeSource(input.code);\n\tconst calls: CodemodeNestedCall[] = [];\n\tlet usage: Usage | undefined;\n\tlet generatedImages = 0;\n\tconst snapshot = (): CodemodeToolDetails => ({ calls: calls.map((call) => ({ ...call })) });\n\tconst publish = () => update?.({ content: [], details: snapshot() });\n\tconst callable = ctx ? getCodemodeCallableTools(ctx.tools) : [];\n\tconst samples = new Map(callable.map((tool) => [tool.name, renderToolSample(toCodemodeDeclaration(tool))]));\n\tconst sandbox = new CodemodeSandbox({\n\t\ttools: callable.map((tool) => ({\n\t\t\tname: tool.name,\n\t\t\tdescription: samples.get(tool.name),\n\t\t\texecute: async (args, { signal: callSignal }) => {\n\t\t\t\tconst record: CodemodeNestedCall = {\n\t\t\t\t\tid: `${id}/?`,\n\t\t\t\t\tname: tool.name,\n\t\t\t\t\targs: preview(args),\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t};\n\t\t\t\tcalls.push(record);\n\t\t\t\tpublish();\n\t\t\t\tconst started = performance.now();\n\t\t\t\tif (!ctx) throw new Error(\"Tool calls need a session\");\n\t\t\t\tconst outcome = await ctx.executeTool(tool.name, args, { signal: callSignal });\n\t\t\t\trecord.id = outcome.toolCall.id;\n\t\t\t\trecord.durationMs = performance.now() - started;\n\t\t\t\trecord.status = outcome.isError ? (callSignal.aborted ? \"cancelled\" : \"error\") : \"ok\";\n\t\t\t\tconst text = textOf(outcome.result);\n\t\t\t\tif (outcome.isError) record.error = (text || `Tool ${tool.name} failed`).slice(0, 500);\n\t\t\t\tpublish();\n\t\t\t\tif (tool.outputSchema && outcome.result.structuredContent !== undefined)\n\t\t\t\t\treturn outcome.result.structuredContent;\n\t\t\t\tif (outcome.isError) throw new Error(text || `Tool ${tool.name} failed`);\n\t\t\t\treturn text;\n\t\t\t},\n\t\t})),\n\t\tglobals: [\n\t\t\t...discoveryGlobals(callable, samples, options),\n\t\t\t...(options.models && ctx\n\t\t\t\t? modelGlobals(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tcalls,\n\t\t\t\t\t\tpublish,\n\t\t\t\t\t\t(extra) => {\n\t\t\t\t\t\t\tusage = usage ? combineUsage(usage, extra) : extra;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(count) => {\n\t\t\t\t\t\t\tgeneratedImages += count;\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: []),\n\t\t],\n\t\ttimeoutMs: source.timeoutMs ?? Number.POSITIVE_INFINITY,\n\t\tmemoryLimitBytes: 256 * 1024 * 1024,\n\t\twasm: loadQuickJSWasm(getQuickJSWasmPath()),\n\t\tworkerUrl: getCodemodeWorkerUrl(),\n\t});\n\tlet result: CodemodeResult;\n\ttry {\n\t\tresult = await sandbox.execute(code, {\n\t\t\tsignal,\n\t\t\tstore: ctx ? readCodemodeStore(ctx.sessionManager.getBranch()) : {},\n\t\t});\n\t} finally {\n\t\tawait sandbox.close();\n\t}\n\tfor (const call of calls) if (call.status === \"running\") call.status = \"cancelled\";\n\tlet content: (TextContent | ImageContent)[] = [...result.output];\n\tif (result.ok) {\n\t\tif (Object.keys(result.storeWrites.set).length || result.storeWrites.delete.length)\n\t\t\toptions.appendEntry?.(CODEMODE_STORE_ENTRY_TYPE, result.storeWrites);\n\t\tif (result.value !== undefined)\n\t\t\tcontent.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext:\n\t\t\t\t\ttypeof result.value === \"string\" ? result.value : (JSON.stringify(result.value) ?? String(result.value)),\n\t\t\t});\n\t} else\n\t\tcontent.push({\n\t\t\ttype: \"text\",\n\t\t\ttext: `Script error:\\n${result.error.stack ?? result.error.message}\\n\\nTool calls made before the failure (they are not undone): ${calls.map((call) => `${call.name} (${call.status})`).join(\", \") || \"none\"}`,\n\t\t});\n\tif (generatedImages > 0 && !content.some((block) => block.type === \"image\"))\n\t\tcontent.push({\n\t\t\ttype: \"text\",\n\t\t\ttext: `Note: models.generateImages() returned ${generatedImages} image${generatedImages === 1 ? \"\" : \"s\"} that the script did not show. Show each image block of result.output with image(block).`,\n\t\t});\n\tconst text = content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\\n\");\n\tconst budget = (source.maxOutputTokens ?? 10_000) * 4;\n\tconst details = snapshot();\n\tif (text.length > budget) {\n\t\tlet path: string;\n\t\tlet notice: string;\n\t\ttry {\n\t\t\tpath = await writeOutputFile(\"atomic-codemode\", \".txt\", text);\n\t\t\tdetails.fullOutputPath = path;\n\t\t\tnotice = `Full output: ${path}`;\n\t\t} catch (error) {\n\t\t\tnotice = `Could not save full output: ${error instanceof Error ? error.message : String(error)}`;\n\t\t}\n\t\tconst head = Math.floor(budget / 2);\n\t\tconst tail = budget - head;\n\t\tcontent = [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Warning: truncated output (original token count: ${Math.ceil(text.length / 4)})\\n${text.slice(0, head)}\\n... output truncated ...\\n${tail ? text.slice(-tail) : \"\"}\\n${notice}`,\n\t\t\t},\n\t\t\t...content.filter((block) => block.type === \"image\"),\n\t\t];\n\t}\n\t// Save after truncation so labels cannot be cut or separated from their images.\n\tcontent = await saveImages(content);\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `${result.ok ? \"Script completed\" : \"Script failed\"}\\nWall time ${((performance.now() - start) / 1000).toFixed(1)} seconds\\nOutput:\\n`,\n\t\t\t},\n\t\t\t...content,\n\t\t],\n\t\tdetails,\n\t\t...(usage ? { usage } : {}),\n\t\t...(result.ok ? {} : { isError: true }),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/extensions/codemode/execute.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tAnyModel,\n\tClassifierContext,\n\tImageContent,\n\tImagesContext,\n\tModelType,\n\tModelTypeMap,\n\tTextContent,\n\tUsage,\n} from \"@bastani/pi-ai\";\nimport type { AgentTool, AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype CodemodeResult,\n\tCodemodeSandbox,\n\ttype CodemodeTool,\n\tloadQuickJSWasm,\n\tparseCodemodeSource,\n\trenderToolSample,\n\ttoCodemodeIdentifier,\n} from \"@earendil-works/pi-codemode\";\nimport { getCodemodeWorkerUrl, getQuickJSWasmPath } from \"../../config.js\";\nimport type { ExtensionToolContext } from \"../../core/extensions/context-types.ts\";\nimport type { ToolNamespace } from \"../../core/extensions/tool-types.ts\";\nimport type { SessionEntry } from \"../../core/session-manager.ts\";\nimport { formatSize } from \"../../core/tools/truncate.ts\";\nimport { combineUsage } from \"../../core/usage-totals.ts\";\nimport { writeOutputFile } from \"../../utils/output-files.js\";\nimport { Bm25Ranker, createToolSearchDocument, DEFAULT_TOOL_SEARCH_LIMIT } from \"../tool-search/tool.js\";\nimport {\n\tCODEMODE_DOCS_PATH,\n\tCODEMODE_STORE_ENTRY_TYPE,\n\ttype CodemodeNestedCall,\n\ttype CodemodeToolDetails,\n\ttype CodemodeToolInput,\n\ttype CodemodeToolOptions,\n\tgetCodemodeCallableTools,\n\ttoCodemodeDeclaration,\n} from \"./tool.js\";\n\nconst IMAGE_EXTENSIONS: Record<string, string> = {\n\t\"image/png\": \".png\",\n\t\"image/jpeg\": \".jpg\",\n\t\"image/gif\": \".gif\",\n\t\"image/webp\": \".webp\",\n};\n\nasync function saveImages(items: (TextContent | ImageContent)[]): Promise<(TextContent | ImageContent)[]> {\n\tconst labels = new Map<string, Promise<string>>();\n\tconst label = async ({ data, mimeType }: ImageContent): Promise<string> => {\n\t\tconst bytes = Buffer.from(data, \"base64\");\n\t\tconst kind = `${mimeType}, ${formatSize(bytes.length)}`;\n\t\tconst extension = IMAGE_EXTENSIONS[mimeType];\n\t\tif (!extension) throw new Error(`No file extension for image type ${mimeType}`);\n\t\ttry {\n\t\t\tconst path = await writeOutputFile(\"atomic-codemode\", extension, bytes);\n\t\t\treturn `[Image saved to ${path} (${kind})]`;\n\t\t} catch (error) {\n\t\t\treturn `[Image (${kind}) could not be saved: ${error instanceof Error ? error.message : String(error)}]`;\n\t\t}\n\t};\n\tconst result = await Promise.all(\n\t\titems.map(async (item): Promise<(TextContent | ImageContent)[]> => {\n\t\t\tif (item.type !== \"image\") return [item];\n\t\t\tlet pending = labels.get(item.data);\n\t\t\tif (!pending) {\n\t\t\t\tpending = label(item);\n\t\t\t\tlabels.set(item.data, pending);\n\t\t\t}\n\t\t\treturn [{ type: \"text\", text: await pending }, item];\n\t\t}),\n\t);\n\treturn result.flat();\n}\n\nexport function readCodemodeStore(branch: readonly SessionEntry[]): Record<string, unknown> {\n\tconst store = new Map<string, unknown>();\n\tfor (const entry of branch) {\n\t\tif (\n\t\t\tentry.type !== \"custom\" ||\n\t\t\tentry.customType !== CODEMODE_STORE_ENTRY_TYPE ||\n\t\t\ttypeof entry.data !== \"object\" ||\n\t\t\tentry.data === null\n\t\t)\n\t\t\tcontinue;\n\t\tconst data = entry.data as { set?: Record<string, unknown>; delete?: string[] };\n\t\tif (\n\t\t\t!data.set ||\n\t\t\ttypeof data.set !== \"object\" ||\n\t\t\t!Array.isArray(data.delete) ||\n\t\t\t!data.delete.every((key) => typeof key === \"string\")\n\t\t)\n\t\t\tcontinue;\n\t\tfor (const key of data.delete) store.delete(key);\n\t\tfor (const [key, value] of Object.entries(data.set)) store.set(key, value);\n\t}\n\treturn Object.fromEntries(store);\n}\nfunction textOf(result: AgentToolResult<unknown>): string {\n\treturn result.content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\\n\");\n}\n/** Explicit public catalog fields. Provider configuration and credential-bearing URLs never cross into the VM. */\nexport function toCodemodeModelInfo(model: AnyModel): Record<string, unknown> {\n\treturn {\n\t\ttype: model.type,\n\t\tprovider: model.provider,\n\t\tid: model.id,\n\t\tname: model.name,\n\t\tapi: model.api,\n\t\tinput: model.input,\n\t\t...(\"reasoning\" in model ? { reasoning: model.reasoning } : {}),\n\t\t...(\"contextWindow\" in model ? { contextWindow: model.contextWindow } : {}),\n\t\t...(\"maxTokens\" in model ? { maxTokens: model.maxTokens } : {}),\n\t\tcost: model.cost,\n\t};\n}\nconst MODEL_TYPES = [\"chat\", \"image\", \"classifier\"] as const;\nfunction modelType(value: unknown): ModelType {\n\tif (value === \"chat\" || value === \"image\" || value === \"classifier\") return value;\n\tthrow new Error('Model type must be \"chat\", \"image\", or \"classifier\"');\n}\nfunction withArticle(word: string): string {\n\treturn `${/^[aeiou]/.test(word) ? \"an\" : \"a\"} ${word}`;\n}\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction describeValue(value: unknown): string {\n\tif (value === undefined || value === null) return String(value);\n\tif (Array.isArray(value)) return value.length === 0 ? \"an empty array\" : \"an array\";\n\tif (typeof value === \"object\") {\n\t\tconst keys = Object.keys(value);\n\t\tif (keys.length === 0) return \"{}\";\n\t\treturn `{ ${keys.slice(0, 6).join(\", \")}${keys.length > 6 ? \", ...\" : \"\"} }`;\n\t}\n\treturn typeof value === \"string\" ? \"a string\" : `a ${typeof value}`;\n}\nconst CLASSIFIER_CONTEXT_SHAPE =\n\t'{ state: { ... }, questions: { <id>: { type: \"choice\", instructions, criteria: { <label>: <meaning> } } | { type: \"score\", instructions, criteria: [<lowest level>, ..., <highest level>] } | { type: \"bool\", instructions, criteria: { true: <meaning>, false: <meaning> } } } }';\nfunction checkClassifierContext(context: unknown): ClassifierContext {\n\tconst fail = (problem: string) =>\n\t\tnew Error(\n\t\t\t`models.classify() ${problem}. Expected context: ${CLASSIFIER_CONTEXT_SHAPE}. See \"Classify\" in ${CODEMODE_DOCS_PATH}.`,\n\t\t);\n\tif (!isRecord(context)) throw fail(`expects a context object as its second argument, got ${describeValue(context)}`);\n\tif (!isRecord(context.state)) throw fail(`context.state must be an object, got ${describeValue(context.state)}`);\n\tconst { questions } = context;\n\tif (!isRecord(questions) || Object.keys(questions).length === 0)\n\t\tthrow fail(`context.questions must map question IDs to questions, got ${describeValue(questions)}`);\n\tconst isStrings = (values: unknown[]) => values.length > 0 && values.every((value) => typeof value === \"string\");\n\tfor (const [questionId, question] of Object.entries(questions)) {\n\t\tconst at = `context.questions.${questionId}`;\n\t\tif (!isRecord(question)) throw fail(`${at} must be a question object, got ${describeValue(question)}`);\n\t\tif (typeof question.instructions !== \"string\") throw fail(`${at}.instructions must be a string`);\n\t\tconst { criteria } = question;\n\t\tif (question.type === \"choice\") {\n\t\t\tif (!isRecord(criteria) || !isStrings(Object.values(criteria)))\n\t\t\t\tthrow fail(`${at} is a \"choice\" question, so criteria must map each label to its meaning`);\n\t\t} else if (question.type === \"score\") {\n\t\t\tif (!Array.isArray(criteria) || !isStrings(criteria))\n\t\t\t\tthrow fail(`${at} is a \"score\" question, so criteria must list the levels as strings, lowest first`);\n\t\t} else if (question.type === \"bool\") {\n\t\t\tif (!isRecord(criteria) || typeof criteria.true !== \"string\" || typeof criteria.false !== \"string\")\n\t\t\t\tthrow fail(`${at} is a \"bool\" question, so criteria must be { true: string, false: string }`);\n\t\t} else {\n\t\t\tthrow fail(`${at}.type must be \"choice\", \"score\", or \"bool\", got ${JSON.stringify(question.type)}`);\n\t\t}\n\t}\n\treturn context as unknown as ClassifierContext;\n}\nfunction checkImagesContext(context: unknown): ImagesContext {\n\tconst fail = (problem: string) =>\n\t\tnew Error(\n\t\t\t`models.generateImages() ${problem}. Expected context: { input: [{ type: \"text\", text: <prompt> }, ...optional { type: \"image\", data: <base64>, mimeType } references] }. See \"Generate images\" in ${CODEMODE_DOCS_PATH}.`,\n\t\t);\n\tif (!isRecord(context)) throw fail(`expects a context object as its second argument, got ${describeValue(context)}`);\n\tconst { input } = context;\n\tif (!Array.isArray(input) || input.length === 0)\n\t\tthrow fail(`context.input must be a non-empty array of blocks, got ${describeValue(input)}`);\n\tinput.forEach((block: unknown, index) => {\n\t\tif (isRecord(block) && block.type === \"text\" && typeof block.text === \"string\") return;\n\t\tif (\n\t\t\tisRecord(block) &&\n\t\t\tblock.type === \"image\" &&\n\t\t\ttypeof block.data === \"string\" &&\n\t\t\ttypeof block.mimeType === \"string\"\n\t\t)\n\t\t\treturn;\n\t\tthrow fail(`context.input[${index}] must be a text or image block, got ${describeValue(block)}`);\n\t});\n\treturn context as unknown as ImagesContext;\n}\nfunction provider(value: unknown): string | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value === \"string\") return value;\n\tthrow new Error(\"provider must be a string\");\n}\nfunction preview(args: unknown): string {\n\ttry {\n\t\treturn (JSON.stringify(args) ?? \"\").slice(0, 200);\n\t} catch {\n\t\treturn \"\";\n\t}\n}\ninterface ModelCallResult {\n\tstopReason: \"stop\" | \"error\" | \"aborted\";\n\terrorMessage?: string;\n\tusage?: Usage;\n}\nfunction createLimiter(limit: number) {\n\tlet active = 0;\n\tconst waiting: (() => void)[] = [];\n\treturn async <T>(run: () => Promise<T>): Promise<T> => {\n\t\tif (active >= limit) await new Promise<void>((resolve) => waiting.push(resolve));\n\t\tactive++;\n\t\ttry {\n\t\t\treturn await run();\n\t\t} finally {\n\t\t\tactive--;\n\t\t\twaiting.shift()?.();\n\t\t}\n\t};\n}\nfunction discoveryGlobals(\n\ttools: readonly AgentTool[],\n\tsamples: ReadonlyMap<string, string>,\n\toptions: CodemodeToolOptions,\n): CodemodeTool[] {\n\tconst entry = (name: string) => ({ name: toCodemodeIdentifier(name), description: samples.get(name) ?? \"\" });\n\treturn [\n\t\t{\n\t\t\tname: \"searchTools\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [query, config] = args as [unknown, { limit?: unknown; namespace?: unknown } | undefined];\n\t\t\t\tif (typeof query !== \"string\") throw new Error(\"searchTools() expects a query string\");\n\t\t\t\tconst limit = config?.limit ?? DEFAULT_TOOL_SEARCH_LIMIT;\n\t\t\t\tif (typeof limit !== \"number\" || !Number.isInteger(limit) || limit <= 0)\n\t\t\t\t\tthrow new Error(\"searchTools() limit must be a positive integer\");\n\t\t\t\tif (config?.namespace !== undefined && typeof config.namespace !== \"string\")\n\t\t\t\t\tthrow new Error(\"searchTools() namespace must be a string\");\n\t\t\t\tconst docs = tools.flatMap((tool) => {\n\t\t\t\t\tconst namespace = options.getToolNamespace?.(tool.name);\n\t\t\t\t\treturn config?.namespace && namespace?.name !== config.namespace\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: [createToolSearchDocument(tool, namespace)];\n\t\t\t\t});\n\t\t\t\treturn new Bm25Ranker().rank(query, docs, limit).map((match) => entry(match.name));\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"describeTool\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [name] = args as unknown[];\n\t\t\t\tif (typeof name !== \"string\") throw new Error(\"describeTool() expects a tool name\");\n\t\t\t\tconst tool = tools.find((tool) => tool.name === name || toCodemodeIdentifier(tool.name) === name);\n\t\t\t\treturn tool ? samples.get(tool.name) : undefined;\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"describeNamespace\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [name] = args as unknown[];\n\t\t\t\tif (typeof name !== \"string\") throw new Error(\"describeNamespace() expects a namespace name\");\n\t\t\t\tlet namespace: ToolNamespace | undefined;\n\t\t\t\tconst names: string[] = [];\n\t\t\t\tfor (const tool of tools) {\n\t\t\t\t\tconst toolNamespace = options.getToolNamespace?.(tool.name);\n\t\t\t\t\tif (toolNamespace?.name !== name) continue;\n\t\t\t\t\tnamespace ??= toolNamespace;\n\t\t\t\t\tnames.push(toCodemodeIdentifier(tool.name));\n\t\t\t\t}\n\t\t\t\tif (!namespace) return undefined;\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\t...(namespace.description ? { description: namespace.description } : {}),\n\t\t\t\t\t...(namespace.instructions ? { instructions: namespace.instructions } : {}),\n\t\t\t\t\ttools: names,\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t];\n}\nfunction modelGlobals(\n\tctx: ExtensionToolContext,\n\tid: string,\n\tcalls: CodemodeNestedCall[],\n\tpublish: () => void,\n\taddUsage: (usage: Usage) => void,\n\taddGeneratedImages: (count: number) => void,\n): CodemodeTool[] {\n\tconst models = ctx.modelRegistry;\n\tconst limit = createLimiter(4);\n\tlet count = 0;\n\tconst runModelCall = async <TType extends \"classifier\" | \"image\", TContext, TResult extends ModelCallResult>(\n\t\tname: string,\n\t\ttype: TType,\n\t\t[ref, context]: unknown[],\n\t\tcheckContext: (context: unknown) => TContext,\n\t\trun: (model: ModelTypeMap[TType], context: TContext) => Promise<TResult>,\n\t): Promise<TResult> => {\n\t\tconst listHint = `List the ${type} models you can use with models.getAvailableOfType(\"${type}\").`;\n\t\tif (!isRecord(ref) || typeof ref.provider !== \"string\" || typeof ref.id !== \"string\") {\n\t\t\tconst undefinedHint =\n\t\t\t\tref === undefined || ref === null\n\t\t\t\t\t? \" models.getModelOfType() returns undefined for an unknown provider or id.\"\n\t\t\t\t\t: \"\";\n\t\t\tthrow new Error(\n\t\t\t\t`${name}() expects ${withArticle(type)} model as its first argument, got ${describeValue(ref)}.${undefinedHint} ${listHint}`,\n\t\t\t);\n\t\t}\n\t\tconst { provider: providerId, id: modelId } = ref;\n\t\tconst model = models.getModelOfType(type, providerId, modelId);\n\t\tif (!model) {\n\t\t\tconst actualType = MODEL_TYPES.find(\n\t\t\t\t(other) => other !== type && models.getModelOfType(other, providerId, modelId) !== undefined,\n\t\t\t);\n\t\t\tthrow new Error(\n\t\t\t\tactualType\n\t\t\t\t\t? `\"${providerId}/${modelId}\" is ${withArticle(actualType)} model, not ${withArticle(type)} model. ${listHint}`\n\t\t\t\t\t: `Unknown ${type} model \"${providerId}/${modelId}\". ${listHint}`,\n\t\t\t);\n\t\t}\n\t\tconst checked = checkContext(context);\n\t\tconst record: CodemodeNestedCall = {\n\t\t\tid: `${id}/${name}/${++count}`,\n\t\t\tname,\n\t\t\targs: `${model.provider}/${model.id}`,\n\t\t\tstatus: \"running\",\n\t\t};\n\t\tcalls.push(record);\n\t\tpublish();\n\t\tconst start = performance.now();\n\t\tconst result = await limit(() => run(model, checked));\n\t\trecord.durationMs = performance.now() - start;\n\t\trecord.status = result.stopReason === \"stop\" ? \"ok\" : result.stopReason === \"aborted\" ? \"cancelled\" : \"error\";\n\t\tif (result.errorMessage) record.error = result.errorMessage.slice(0, 500);\n\t\tif (result.usage) {\n\t\t\trecord.cost = result.usage.cost.total;\n\t\t\taddUsage(result.usage);\n\t\t}\n\t\tpublish();\n\t\treturn result;\n\t};\n\treturn [\n\t\t{\n\t\t\tname: \"models.getModelsOfType\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [type, source] = args as unknown[];\n\t\t\t\treturn models.getModelsOfType(modelType(type), provider(source)).map(toCodemodeModelInfo);\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"models.getAvailableOfType\",\n\t\t\tspread: true,\n\t\t\texecute: async (args, { signal }) => {\n\t\t\t\tconst [type, source] = args as unknown[];\n\t\t\t\treturn (await models.getAvailableOfType(modelType(type), provider(source), { signal })).map(\n\t\t\t\t\ttoCodemodeModelInfo,\n\t\t\t\t);\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"models.getModelOfType\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [type, source, modelId] = args as unknown[];\n\t\t\t\tif (typeof source !== \"string\" || typeof modelId !== \"string\")\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`models.getModelOfType(type, provider, id) expects three strings, got (${(args as unknown[]).map(describeValue).join(\", \")}). The provider and the id are separate arguments, for example models.getModelOfType(\"classifier\", \"typesafe\", \"jev-latest\").`,\n\t\t\t\t\t);\n\t\t\t\tconst model = models.getModelOfType(modelType(type), source, modelId);\n\t\t\t\treturn model ? toCodemodeModelInfo(model) : undefined;\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"models.classify\",\n\t\t\tspread: true,\n\t\t\texecute: (args, { signal }) =>\n\t\t\t\trunModelCall(\"models.classify\", \"classifier\", args as unknown[], checkClassifierContext, (model, context) =>\n\t\t\t\t\tmodels.classify(model, context, { signal }),\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname: \"models.generateImages\",\n\t\t\tspread: true,\n\t\t\texecute: (args, { signal }) =>\n\t\t\t\trunModelCall(\n\t\t\t\t\t\"models.generateImages\",\n\t\t\t\t\t\"image\",\n\t\t\t\t\targs as unknown[],\n\t\t\t\t\tcheckImagesContext,\n\t\t\t\t\tasync (model, context) => {\n\t\t\t\t\t\tconst result = await models.generateImages(model, context, { signal });\n\t\t\t\t\t\taddGeneratedImages(result.output.filter((block) => block.type === \"image\").length);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t},\n\t];\n}\n\nexport async function executeCodemode(\n\tid: string,\n\tinput: CodemodeToolInput,\n\tsignal: AbortSignal | undefined,\n\tupdate: ((result: AgentToolResult<CodemodeToolDetails>) => void) | undefined,\n\tctx: ExtensionToolContext | undefined,\n\toptions: CodemodeToolOptions = {},\n): Promise<AgentToolResult<CodemodeToolDetails>> {\n\tconst start = performance.now();\n\tconst { code, options: source } = parseCodemodeSource(input.code);\n\tconst calls: CodemodeNestedCall[] = [];\n\tlet usage: Usage | undefined;\n\tlet generatedImages = 0;\n\tconst snapshot = (): CodemodeToolDetails => ({ calls: calls.map((call) => ({ ...call })) });\n\tconst publish = () => update?.({ content: [], details: snapshot() });\n\tconst callable = ctx ? getCodemodeCallableTools(ctx.tools) : [];\n\tconst guidelines = options.getToolGuidelines?.();\n\tconst samples = new Map(\n\t\tcallable.map((tool) => [tool.name, renderToolSample(toCodemodeDeclaration(tool, guidelines?.get(tool.name)))]),\n\t);\n\tconst sandbox = new CodemodeSandbox({\n\t\ttools: callable.map((tool) => ({\n\t\t\tname: tool.name,\n\t\t\tdescription: samples.get(tool.name),\n\t\t\texecute: async (args, { signal: callSignal }) => {\n\t\t\t\tconst record: CodemodeNestedCall = {\n\t\t\t\t\tid: `${id}/?`,\n\t\t\t\t\tname: tool.name,\n\t\t\t\t\targs: preview(args),\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t};\n\t\t\t\tcalls.push(record);\n\t\t\t\tpublish();\n\t\t\t\tconst started = performance.now();\n\t\t\t\tif (!ctx) throw new Error(\"Tool calls need a session\");\n\t\t\t\tconst outcome = await ctx.executeTool(tool.name, args, { signal: callSignal });\n\t\t\t\trecord.id = outcome.toolCall.id;\n\t\t\t\trecord.durationMs = performance.now() - started;\n\t\t\t\trecord.status = outcome.isError ? (callSignal.aborted ? \"cancelled\" : \"error\") : \"ok\";\n\t\t\t\tconst text = textOf(outcome.result);\n\t\t\t\tif (outcome.isError) record.error = (text || `Tool ${tool.name} failed`).slice(0, 500);\n\t\t\t\tpublish();\n\t\t\t\tif (tool.outputSchema && outcome.result.structuredContent !== undefined)\n\t\t\t\t\treturn outcome.result.structuredContent;\n\t\t\t\tif (outcome.isError) throw new Error(text || `Tool ${tool.name} failed`);\n\t\t\t\treturn text;\n\t\t\t},\n\t\t})),\n\t\tglobals: [\n\t\t\t...discoveryGlobals(callable, samples, options),\n\t\t\t...(options.models && ctx\n\t\t\t\t? modelGlobals(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tcalls,\n\t\t\t\t\t\tpublish,\n\t\t\t\t\t\t(extra) => {\n\t\t\t\t\t\t\tusage = usage ? combineUsage(usage, extra) : extra;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(count) => {\n\t\t\t\t\t\t\tgeneratedImages += count;\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t: []),\n\t\t],\n\t\ttimeoutMs: source.timeoutMs ?? Number.POSITIVE_INFINITY,\n\t\tmemoryLimitBytes: 256 * 1024 * 1024,\n\t\twasm: loadQuickJSWasm(getQuickJSWasmPath()),\n\t\tworkerUrl: getCodemodeWorkerUrl(),\n\t});\n\tlet result: CodemodeResult;\n\ttry {\n\t\tresult = await sandbox.execute(code, {\n\t\t\tsignal,\n\t\t\tstore: ctx ? readCodemodeStore(ctx.sessionManager.getBranch()) : {},\n\t\t});\n\t} finally {\n\t\tawait sandbox.close();\n\t}\n\tfor (const call of calls) if (call.status === \"running\") call.status = \"cancelled\";\n\tlet content: (TextContent | ImageContent)[] = [...result.output];\n\tif (result.ok) {\n\t\tif (Object.keys(result.storeWrites.set).length || result.storeWrites.delete.length)\n\t\t\toptions.appendEntry?.(CODEMODE_STORE_ENTRY_TYPE, result.storeWrites);\n\t\tif (result.value !== undefined)\n\t\t\tcontent.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext:\n\t\t\t\t\ttypeof result.value === \"string\" ? result.value : (JSON.stringify(result.value) ?? String(result.value)),\n\t\t\t});\n\t} else\n\t\tcontent.push({\n\t\t\ttype: \"text\",\n\t\t\ttext: `Script error:\\n${result.error.stack ?? result.error.message}\\n\\nTool calls made before the failure (they are not undone): ${calls.map((call) => `${call.name} (${call.status})`).join(\", \") || \"none\"}`,\n\t\t});\n\tif (generatedImages > 0 && !content.some((block) => block.type === \"image\"))\n\t\tcontent.push({\n\t\t\ttype: \"text\",\n\t\t\ttext: `Note: models.generateImages() returned ${generatedImages} image${generatedImages === 1 ? \"\" : \"s\"} that the script did not show. Show each image block of result.output with image(block).`,\n\t\t});\n\tconst text = content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\\n\");\n\tconst budget = (source.maxOutputTokens ?? 10_000) * 4;\n\tconst details = snapshot();\n\tif (text.length > budget) {\n\t\tlet path: string;\n\t\tlet notice: string;\n\t\ttry {\n\t\t\tpath = await writeOutputFile(\"atomic-codemode\", \".txt\", text);\n\t\t\tdetails.fullOutputPath = path;\n\t\t\tnotice = `Full output: ${path}`;\n\t\t} catch (error) {\n\t\t\tnotice = `Could not save full output: ${error instanceof Error ? error.message : String(error)}`;\n\t\t}\n\t\tconst head = Math.floor(budget / 2);\n\t\tconst tail = budget - head;\n\t\tcontent = [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Warning: truncated output (original token count: ${Math.ceil(text.length / 4)})\\n${text.slice(0, head)}\\n... output truncated ...\\n${tail ? text.slice(-tail) : \"\"}\\n${notice}`,\n\t\t\t},\n\t\t\t...content.filter((block) => block.type === \"image\"),\n\t\t];\n\t}\n\t// Save after truncation so labels cannot be cut or separated from their images.\n\tcontent = await saveImages(content);\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `${result.ok ? \"Script completed\" : \"Script failed\"}\\nWall time ${((performance.now() - start) / 1000).toFixed(1)} seconds\\nOutput:\\n`,\n\t\t\t},\n\t\t\t...content,\n\t\t],\n\t\tdetails,\n\t\t...(usage ? { usage } : {}),\n\t\t...(result.ok ? {} : { isError: true }),\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,MAAM,WAAW,wBAAwB;IACxC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,wBAA6B,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,MAAM,WAAW,wBAAwB;IACxC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,wBAA6B,GAAG,gBAAgB,CAchG"}
|
|
@@ -5,6 +5,7 @@ export function createCodemodeExtension(options = {}) {
|
|
|
5
5
|
models: options.models ?? true,
|
|
6
6
|
appendEntry: (type, data) => pi.appendEntry(type, data),
|
|
7
7
|
getToolNamespace: (name) => pi.getAllTools().find((tool) => tool.name === name)?.namespace,
|
|
8
|
+
getToolGuidelines: () => new Map(pi.getAllTools().map((tool) => [tool.name, tool.promptGuidelines ?? []])),
|
|
8
9
|
getMode: () => options.mode ?? (pi.getSettings().codemode?.mode === "only" ? "only" : "on"),
|
|
9
10
|
getInlineBudget: () => options.inlineBudget ?? pi.getSettings().codemode?.inlineBudget,
|
|
10
11
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/codemode/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AAOzD,MAAM,UAAU,uBAAuB,CAAC,OAAO,GAA6B,EAAE;IAC7E,OAAO,CAAC,EAAE,EAAE,EAAE;QACb,EAAE,CAAC,YAAY,CACd,4BAA4B,CAAC;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;YACvD,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,SAAS;YAC1F,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3F,eAAe,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,YAAY;SACtF,CAAC,CACF,CAAC;IACH,CAAC,CAAC;AACH,CAAC;AACD,eAAe,uBAAuB,EAAE,CAAC","sourcesContent":["import type { ExtensionFactory } from \"../../core/extensions/types.ts\";\nimport type { CodemodeMode } from \"../../core/settings-manager.ts\";\nimport { createCodemodeToolDefinition } from \"./tool.js\";\n\nexport interface CodemodeExtensionOptions {\n\tmode?: CodemodeMode;\n\tinlineBudget?: number;\n\tmodels?: boolean;\n}\nexport function createCodemodeExtension(options: CodemodeExtensionOptions = {}): ExtensionFactory {\n\treturn (pi) => {\n\t\tpi.registerTool(\n\t\t\tcreateCodemodeToolDefinition({\n\t\t\t\tmodels: options.models ?? true,\n\t\t\t\tappendEntry: (type, data) => pi.appendEntry(type, data),\n\t\t\t\tgetToolNamespace: (name) => pi.getAllTools().find((tool) => tool.name === name)?.namespace,\n\t\t\t\tgetMode: () => options.mode ?? (pi.getSettings().codemode?.mode === \"only\" ? \"only\" : \"on\"),\n\t\t\t\tgetInlineBudget: () => options.inlineBudget ?? pi.getSettings().codemode?.inlineBudget,\n\t\t\t}),\n\t\t);\n\t};\n}\nexport default createCodemodeExtension();\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/codemode/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AAOzD,MAAM,UAAU,uBAAuB,CAAC,OAAO,GAA6B,EAAE;IAC7E,OAAO,CAAC,EAAE,EAAE,EAAE;QACb,EAAE,CAAC,YAAY,CACd,4BAA4B,CAAC;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;YACvD,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,SAAS;YAC1F,iBAAiB,EAAE,GAAG,EAAE,CACvB,IAAI,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAU,CAAC,CAAC;YAC3F,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3F,eAAe,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,YAAY;SACtF,CAAC,CACF,CAAC;IACH,CAAC,CAAC;AACH,CAAC;AACD,eAAe,uBAAuB,EAAE,CAAC","sourcesContent":["import type { ExtensionFactory } from \"../../core/extensions/types.ts\";\nimport type { CodemodeMode } from \"../../core/settings-manager.ts\";\nimport { createCodemodeToolDefinition } from \"./tool.js\";\n\nexport interface CodemodeExtensionOptions {\n\tmode?: CodemodeMode;\n\tinlineBudget?: number;\n\tmodels?: boolean;\n}\nexport function createCodemodeExtension(options: CodemodeExtensionOptions = {}): ExtensionFactory {\n\treturn (pi) => {\n\t\tpi.registerTool(\n\t\t\tcreateCodemodeToolDefinition({\n\t\t\t\tmodels: options.models ?? true,\n\t\t\t\tappendEntry: (type, data) => pi.appendEntry(type, data),\n\t\t\t\tgetToolNamespace: (name) => pi.getAllTools().find((tool) => tool.name === name)?.namespace,\n\t\t\t\tgetToolGuidelines: () =>\n\t\t\t\t\tnew Map(pi.getAllTools().map((tool) => [tool.name, tool.promptGuidelines ?? []] as const)),\n\t\t\t\tgetMode: () => options.mode ?? (pi.getSettings().codemode?.mode === \"only\" ? \"only\" : \"on\"),\n\t\t\t\tgetInlineBudget: () => options.inlineBudget ?? pi.getSettings().codemode?.inlineBudget,\n\t\t\t}),\n\t\t);\n\t};\n}\nexport default createCodemodeExtension();\n"]}
|
|
@@ -15,6 +15,8 @@ export interface CodemodeStoreEntryData {
|
|
|
15
15
|
export type CodemodeModelRuntime = Pick<ModelRegistry, "getModelsOfType" | "getAvailableOfType" | "getModelOfType" | "classify" | "generateImages">;
|
|
16
16
|
export interface CodemodeToolOptions {
|
|
17
17
|
getToolNamespace?: (name: string) => ToolNamespace | undefined;
|
|
18
|
+
/** Prompt guidelines shown with tool declarations in describeTool() and ALL_TOOLS. */
|
|
19
|
+
getToolGuidelines?: () => ReadonlyMap<string, readonly string[]>;
|
|
18
20
|
models?: boolean;
|
|
19
21
|
appendEntry?: (type: string, data: CodemodeStoreEntryData) => void;
|
|
20
22
|
getMode?: () => CodemodeMode;
|
|
@@ -38,12 +40,13 @@ export interface CodemodeToolDetails {
|
|
|
38
40
|
calls: CodemodeNestedCall[];
|
|
39
41
|
fullOutputPath?: string;
|
|
40
42
|
}
|
|
41
|
-
export declare function toCodemodeDeclaration(tool: AgentTool): Omit<CodemodeTool, "execute">;
|
|
43
|
+
export declare function toCodemodeDeclaration(tool: AgentTool, guidelines?: readonly string[]): Omit<CodemodeTool, "execute">;
|
|
42
44
|
export declare function getCodemodeCallableTools(tools: readonly AgentTool[]): AgentTool[];
|
|
43
45
|
export interface CodemodeDescriptionOptions {
|
|
44
46
|
models?: boolean;
|
|
45
47
|
namespaces?: ReadonlyMap<string, ToolNamespace>;
|
|
46
48
|
deferred?: ReadonlySet<string>;
|
|
49
|
+
guidelines?: ReadonlyMap<string, readonly string[]>;
|
|
47
50
|
inlineBudget?: number;
|
|
48
51
|
}
|
|
49
52
|
export declare function createCodemodeDescription(tools: readonly AgentTool[], options?: CodemodeDescriptionOptions): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/tool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAsB,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAQpF,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAe,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC3G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAInE,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAC7C,eAAO,MAAM,kBAAkB,QAAqC,CAAC;AACrE,eAAO,MAAM,yBAAyB,mBAAmB,CAAC;AAC1D,eAAO,MAAM,8BAA8B,OAAO,CAAC;AACnD,MAAM,WAAW,sBAAsB;IACtC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AACD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACtC,aAAa,EACb,iBAAiB,GAAG,oBAAoB,GAAG,gBAAgB,GAAG,UAAU,GAAG,gBAAgB,CAC3F,CAAC;AACF,MAAM,WAAW,mBAAmB;IACnC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACnE,OAAO,CAAC,EAAE,MAAM,YAAY,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAC3C;AACD,eAAO,MAAM,cAAc;;EAKzB,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC,GAAG,OAAO,CAEnF;AACD,MAAM,WAAW,kBAAkB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,WAAW,CAAC;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AACD,wBAAgB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,10 +17,11 @@ export const codemodeSchema = Type.Object({
|
|
|
17
17
|
export function isCodemodeTool(tool) {
|
|
18
18
|
return tool.name === CODEMODE_TOOL_NAME && tool.parameters === codemodeSchema;
|
|
19
19
|
}
|
|
20
|
-
export function toCodemodeDeclaration(tool) {
|
|
20
|
+
export function toCodemodeDeclaration(tool, guidelines = []) {
|
|
21
|
+
const bullets = guidelines.flatMap((guideline) => (guideline.trim() ? [`- ${guideline.trim()}`] : []));
|
|
21
22
|
return {
|
|
22
23
|
name: tool.name,
|
|
23
|
-
description: tool.description,
|
|
24
|
+
description: bullets.length > 0 ? `${tool.description.trim()}\n\n${bullets.join("\n")}` : tool.description,
|
|
24
25
|
inputSchema: tool.parameters,
|
|
25
26
|
outputSchema: tool.outputSchema ?? { type: "string" },
|
|
26
27
|
};
|
|
@@ -49,7 +50,7 @@ export function createCodemodeDescription(tools, options = {}) {
|
|
|
49
50
|
groups.set(key, group);
|
|
50
51
|
}
|
|
51
52
|
const id = toCodemodeIdentifier(tool.name);
|
|
52
|
-
const section = `### \`${id}\`${id === tool.name ? "" : ` (\`${tool.name}\`)`}\n${renderToolSample(toCodemodeDeclaration(tool)).trim()}`;
|
|
53
|
+
const section = `### \`${id}\`${id === tool.name ? "" : ` (\`${tool.name}\`)`}\n${renderToolSample(toCodemodeDeclaration(tool, options.guidelines?.get(tool.name))).trim()}`;
|
|
53
54
|
group.entries.push({
|
|
54
55
|
name: tool.name,
|
|
55
56
|
section,
|
|
@@ -130,9 +131,11 @@ function prepareLoadout(loadout, options) {
|
|
|
130
131
|
const namespace = loadout.getNamespace(tool.name);
|
|
131
132
|
return namespace ? [[tool.name, namespace]] : [];
|
|
132
133
|
}));
|
|
134
|
+
const guidelines = new Map(listed.map((tool) => [tool.name, loadout.getPromptGuidelines(tool.name)]));
|
|
133
135
|
descriptions[CODEMODE_TOOL_NAME] = createCodemodeDescription(listed, {
|
|
134
136
|
models: options.models,
|
|
135
137
|
namespaces,
|
|
138
|
+
guidelines,
|
|
136
139
|
deferred: new Set(listed.filter((tool) => loadout.getExposure(tool.name) === "deferred").map((tool) => tool.name)),
|
|
137
140
|
inlineBudget: options.getInlineBudget?.() ?? DEFAULT_CODEMODE_INLINE_BUDGET,
|
|
138
141
|
});
|