@bastani/atomic 0.9.19-alpha.1 → 0.9.19-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 +94 -0
- package/dist/builtin/intercom/CHANGELOG.md +16 -0
- package/dist/builtin/intercom/README.md +21 -11
- package/dist/builtin/intercom/broker/broker.ts +73 -9
- package/dist/builtin/intercom/broker/client.ts +4 -0
- package/dist/builtin/intercom/broker/framing.ts +5 -2
- package/dist/builtin/intercom/broker/group-membership.ts +4 -2
- package/dist/builtin/intercom/broker/presence-handler.ts +14 -0
- package/dist/builtin/intercom/broker/send-handler.ts +34 -5
- package/dist/builtin/intercom/broker/terminal-questions.ts +29 -0
- package/dist/builtin/intercom/index.bundle.mjs +936 -740
- package/dist/builtin/intercom/package.json +2 -2
- package/dist/builtin/intercom/recipient-purpose.ts +9 -0
- package/dist/builtin/intercom/recoverable-disconnect.ts +2 -3
- package/dist/builtin/intercom/retry-policy.ts +4 -2
- package/dist/builtin/intercom/skills/intercom/SKILL.md +5 -4
- package/dist/builtin/intercom/types.ts +16 -2
- package/dist/builtin/mcp/CHANGELOG.md +6 -0
- package/dist/builtin/mcp/README.md +2 -0
- package/dist/builtin/mcp/index.bundle.mjs +2201 -12000
- package/dist/builtin/mcp/package.json +2 -2
- package/dist/builtin/subagents/CHANGELOG.md +27 -0
- package/dist/builtin/subagents/README.md +33 -12
- package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
- package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
- package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
- package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
- package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
- package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
- package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
- package/dist/builtin/subagents/agents/debugger.md +1 -1
- package/dist/builtin/subagents/agents/worker.md +1 -1
- package/dist/builtin/subagents/package.json +2 -2
- package/dist/builtin/subagents/skills/herdr/LICENSE +201 -0
- package/dist/builtin/subagents/skills/herdr/SKILL.md +202 -0
- package/dist/builtin/subagents/skills/subagent/SKILL.md +14 -10
- package/dist/builtin/subagents/skills/tmux/SKILL.md +1 -1
- package/dist/builtin/subagents/src/extension/index.bundle.mjs +1284 -609
- package/dist/builtin/web-access/index.bundle.mjs +26280 -26274
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/workflows/CHANGELOG.md +38 -0
- package/dist/builtin/workflows/README.md +1 -1
- package/dist/builtin/workflows/builtin/adversarial-verification.js +5 -7
- package/dist/builtin/workflows/builtin/{chunk-reqr3sr3.js → chunk-1kx4aggw.js} +22 -22
- package/dist/builtin/workflows/builtin/{chunk-42s7sw0b.js → chunk-62v3gg9f.js} +9 -9
- package/dist/builtin/workflows/builtin/{chunk-wgccch41.js → chunk-6w6cvk6b.js} +16 -16
- package/dist/builtin/workflows/builtin/{chunk-zbekjqew.js → chunk-a2kdsqn8.js} +4 -4
- package/dist/builtin/workflows/builtin/{chunk-ze5x3d1r.js → chunk-fg9esgkj.js} +7 -7
- package/dist/builtin/workflows/builtin/{chunk-n8h4yyew.js → chunk-g0csgs7w.js} +11 -11
- package/dist/builtin/workflows/builtin/{chunk-79fjkcvh.js → chunk-hbnwv56f.js} +17 -17
- package/dist/builtin/workflows/builtin/{chunk-ed4jfn5t.js → chunk-mygmtz6e.js} +43 -43
- package/dist/builtin/workflows/builtin/{chunk-7430zyas.js → chunk-p8jjwfg6.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-hqpe2cyx.js → chunk-r9qq7xfj.js} +49 -49
- package/dist/builtin/workflows/builtin/{chunk-k3w87x8y.js → chunk-t6x2d78s.js} +10 -10
- package/dist/builtin/workflows/builtin/{chunk-6fqs7c01.js → chunk-z0d03ktm.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-b0v2xab1.js → chunk-zggjyg5z.js} +221 -23
- package/dist/builtin/workflows/builtin/classify-and-act.js +5 -6
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize.js +3 -4
- package/dist/builtin/workflows/builtin/generate-and-filter.js +5 -6
- package/dist/builtin/workflows/builtin/goal.js +7 -8
- package/dist/builtin/workflows/builtin/index.js +20 -22
- package/dist/builtin/workflows/builtin/loop-until-done.js +5 -6
- package/dist/builtin/workflows/builtin/open-claude-design.js +3 -3
- package/dist/builtin/workflows/builtin/ralph.js +7 -8
- package/dist/builtin/workflows/builtin/steering-context.js +3 -3
- package/dist/builtin/workflows/builtin/tournament.js +5 -7
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +26654 -25831
- package/dist/builtin/workflows/src/index.js +907 -473
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/startup-ui.d.ts +1 -1
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.js +5 -4
- package/dist/core/agent-session-auto-compaction.js.map +1 -1
- package/dist/core/agent-session-bash.d.ts +1 -1
- package/dist/core/agent-session-bash.d.ts.map +1 -1
- package/dist/core/agent-session-bash.js +5 -1
- package/dist/core/agent-session-bash.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts +1 -1
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-custom-message-commit.d.ts +1 -1
- package/dist/core/agent-session-custom-message-commit.js.map +1 -1
- package/dist/core/agent-session-delivery-forwarding.d.ts +1 -1
- package/dist/core/agent-session-delivery-forwarding.js.map +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-events.js +5 -0
- package/dist/core/agent-session-events.js.map +1 -1
- package/dist/core/agent-session-export.d.ts +1 -1
- package/dist/core/agent-session-export.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts +8 -1
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +45 -3
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-message-queue.d.ts +1 -1
- package/dist/core/agent-session-message-queue.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +14 -7
- 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 +2 -2
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +22 -18
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-runtime-auth.d.ts +1 -1
- package/dist/core/agent-session-runtime-auth.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +13 -4
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +27 -4
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +5 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +44 -34
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-state.d.ts +1 -1
- package/dist/core/agent-session-state.js.map +1 -1
- package/dist/core/agent-session-tasks.d.ts +9 -0
- package/dist/core/agent-session-tasks.d.ts.map +1 -0
- package/dist/core/agent-session-tasks.js +113 -0
- package/dist/core/agent-session-tasks.js.map +1 -0
- package/dist/core/agent-session-tool-registry.d.ts +1 -0
- package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
- package/dist/core/agent-session-tool-registry.js +30 -5
- package/dist/core/agent-session-tool-registry.js.map +1 -1
- package/dist/core/agent-session-tree.d.ts.map +1 -1
- package/dist/core/agent-session-tree.js +3 -0
- package/dist/core/agent-session-tree.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +2 -2
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +4 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +7 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts +1 -1
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts +1 -1
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extension-session-state.js.map +1 -1
- package/dist/core/extensions/agent-events.d.ts +4 -4
- package/dist/core/extensions/agent-events.d.ts.map +1 -1
- package/dist/core/extensions/agent-events.js.map +1 -1
- package/dist/core/extensions/api-types.d.ts +8 -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 +9 -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/event-results.d.ts +1 -1
- package/dist/core/extensions/event-results.js.map +1 -1
- package/dist/core/extensions/event-types.d.ts +2 -1
- package/dist/core/extensions/event-types.d.ts.map +1 -1
- package/dist/core/extensions/event-types.js.map +1 -1
- package/dist/core/extensions/index.d.ts +2 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader-api.d.ts +1 -1
- package/dist/core/extensions/loader-api.d.ts.map +1 -1
- package/dist/core/extensions/loader-api.js +7 -0
- package/dist/core/extensions/loader-api.js.map +1 -1
- package/dist/core/extensions/loader-core.d.ts +1 -1
- package/dist/core/extensions/loader-core.js.map +1 -1
- package/dist/core/extensions/loader-discovery.d.ts +1 -1
- package/dist/core/extensions/loader-discovery.js.map +1 -1
- package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
- package/dist/core/extensions/loader-runtime.js +3 -0
- package/dist/core/extensions/loader-runtime.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +1 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/message-types.d.ts +1 -1
- package/dist/core/extensions/message-types.js.map +1 -1
- package/dist/core/extensions/runner-context.d.ts +11 -1
- package/dist/core/extensions/runner-context.d.ts.map +1 -1
- package/dist/core/extensions/runner-context.js +41 -2
- package/dist/core/extensions/runner-context.js.map +1 -1
- package/dist/core/extensions/runner-events.d.ts +1 -1
- package/dist/core/extensions/runner-events.d.ts.map +1 -1
- package/dist/core/extensions/runner-events.js +17 -2
- package/dist/core/extensions/runner-events.js.map +1 -1
- package/dist/core/extensions/runner-ui.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +17 -2
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +68 -18
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts +4 -1
- package/dist/core/extensions/runtime-types.d.ts.map +1 -1
- package/dist/core/extensions/runtime-types.js.map +1 -1
- package/dist/core/extensions/tool-types.d.ts +1 -1
- package/dist/core/extensions/tool-types.js.map +1 -1
- package/dist/core/extensions/types.d.ts +1 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/ui-types.d.ts +5 -1
- package/dist/core/extensions/ui-types.d.ts.map +1 -1
- package/dist/core/extensions/ui-types.js.map +1 -1
- package/dist/core/extensions/workflow-activity-hub.d.ts +25 -0
- package/dist/core/extensions/workflow-activity-hub.d.ts.map +1 -0
- package/dist/core/extensions/workflow-activity-hub.js +183 -0
- package/dist/core/extensions/workflow-activity-hub.js.map +1 -0
- package/dist/core/extensions/workflow-events.d.ts +118 -0
- package/dist/core/extensions/workflow-events.d.ts.map +1 -0
- package/dist/core/extensions/workflow-events.js +2 -0
- package/dist/core/extensions/workflow-events.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +8 -4
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +97 -11
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/keybindings.d.ts +27 -2
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +7 -2
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/mandatory-runtime-tools.d.ts +1 -1
- package/dist/core/mandatory-runtime-tools.js.map +1 -1
- package/dist/core/model-fallback-failures.js +2 -2
- package/dist/core/model-fallback-failures.js.map +1 -1
- package/dist/core/model-registry.d.ts +5 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +8 -0
- package/dist/core/model-registry.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/resource-loader-assets.js.map +1 -1
- package/dist/core/resource-loader-core.d.ts +1 -1
- package/dist/core/resource-loader-core.js.map +1 -1
- package/dist/core/resource-loader-internals.d.ts +2 -2
- package/dist/core/resource-loader-internals.js.map +1 -1
- package/dist/core/resource-loader-reload.d.ts +2 -0
- package/dist/core/resource-loader-reload.d.ts.map +1 -1
- package/dist/core/resource-loader-reload.js +231 -191
- package/dist/core/resource-loader-reload.js.map +1 -1
- package/dist/core/resource-loader-types.d.ts +4 -2
- 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-exports.d.ts +2 -2
- package/dist/core/sdk-exports.js.map +1 -1
- package/dist/core/sdk-types.d.ts +2 -2
- package/dist/core/sdk-types.js.map +1 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager-core.d.ts.map +1 -1
- package/dist/core/settings-manager-core.js +10 -4
- package/dist/core/settings-manager-core.js.map +1 -1
- package/dist/core/settings-storage.d.ts +1 -0
- package/dist/core/settings-storage.d.ts.map +1 -1
- package/dist/core/settings-storage.js +18 -0
- package/dist/core/settings-storage.js.map +1 -1
- package/dist/core/settings-types.d.ts +11 -0
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +2 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +5 -6
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tasks/agent-adapter.d.ts +32 -0
- package/dist/core/tasks/agent-adapter.d.ts.map +1 -0
- package/dist/core/tasks/agent-adapter.js +71 -0
- package/dist/core/tasks/agent-adapter.js.map +1 -0
- package/dist/core/tasks/command-output.d.ts +15 -0
- package/dist/core/tasks/command-output.d.ts.map +1 -0
- package/dist/core/tasks/command-output.js +29 -0
- package/dist/core/tasks/command-output.js.map +1 -0
- package/dist/core/tasks/completion-ordering.d.ts +11 -0
- package/dist/core/tasks/completion-ordering.d.ts.map +1 -0
- package/dist/core/tasks/completion-ordering.js +19 -0
- package/dist/core/tasks/completion-ordering.js.map +1 -0
- package/dist/core/tasks/completion.d.ts +36 -0
- package/dist/core/tasks/completion.d.ts.map +1 -0
- package/dist/core/tasks/completion.js +115 -0
- package/dist/core/tasks/completion.js.map +1 -0
- package/dist/core/tasks/contracts.d.ts +404 -0
- package/dist/core/tasks/contracts.d.ts.map +1 -0
- package/dist/core/tasks/contracts.js +2 -0
- package/dist/core/tasks/contracts.js.map +1 -0
- package/dist/core/tasks/execution-scope.d.ts +10 -0
- package/dist/core/tasks/execution-scope.d.ts.map +1 -0
- package/dist/core/tasks/execution-scope.js +27 -0
- package/dist/core/tasks/execution-scope.js.map +1 -0
- package/dist/core/tasks/owner-store.d.ts +53 -0
- package/dist/core/tasks/owner-store.d.ts.map +1 -0
- package/dist/core/tasks/owner-store.js +155 -0
- package/dist/core/tasks/owner-store.js.map +1 -0
- package/dist/core/tasks/supervisor.d.ts +121 -0
- package/dist/core/tasks/supervisor.d.ts.map +1 -0
- package/dist/core/tasks/supervisor.js +916 -0
- package/dist/core/tasks/supervisor.js.map +1 -0
- package/dist/core/tasks/transcript.d.ts +23 -0
- package/dist/core/tasks/transcript.d.ts.map +1 -0
- package/dist/core/tasks/transcript.js +74 -0
- package/dist/core/tasks/transcript.js.map +1 -0
- package/dist/core/tools/ask-user-question/ask-user-question.d.ts +2 -2
- package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/ask-user-question.js +8 -4
- package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
- package/dist/core/tools/ask-user-question/state/build-questionnaire.d.ts +1 -1
- package/dist/core/tools/ask-user-question/state/build-questionnaire.js.map +1 -1
- package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts +1 -1
- package/dist/core/tools/ask-user-question/state/questionnaire-session.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts +1 -1
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.d.ts +1 -1
- package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts +1 -1
- package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts +1 -1
- package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/tab-bar.d.ts +1 -1
- package/dist/core/tools/ask-user-question/view/components/tab-bar.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts +1 -1
- package/dist/core/tools/ask-user-question/view/dialog-builder.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/tab-content-strategy.d.ts +1 -1
- package/dist/core/tools/ask-user-question/view/tab-content-strategy.js.map +1 -1
- package/dist/core/tools/bash-pty-native.d.ts +18 -3
- package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
- package/dist/core/tools/bash-pty-native.js +116 -1
- package/dist/core/tools/bash-pty-native.js.map +1 -1
- package/dist/core/tools/bash.d.ts +11 -4
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +52 -8
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +1 -2
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +2 -2
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/powershell.d.ts +20 -10
- package/dist/core/tools/powershell.d.ts.map +1 -1
- package/dist/core/tools/powershell.js +32 -7
- package/dist/core/tools/powershell.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -2
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/resource-selectors.d.ts.map +1 -1
- package/dist/core/tools/resource-selectors.js +15 -7
- package/dist/core/tools/resource-selectors.js.map +1 -1
- package/dist/core/tools/search.js.map +1 -1
- package/dist/core/tools/todos-render.d.ts +1 -1
- package/dist/core/tools/todos-render.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +1 -2
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/workflow-stage-admission.d.ts +10 -0
- package/dist/core/workflow-stage-admission.d.ts.map +1 -1
- package/dist/core/workflow-stage-admission.js +24 -0
- package/dist/core/workflow-stage-admission.js.map +1 -1
- package/dist/extensions/herdr/activity.d.ts +15 -0
- package/dist/extensions/herdr/activity.d.ts.map +1 -0
- package/dist/extensions/herdr/activity.js +24 -0
- package/dist/extensions/herdr/activity.js.map +1 -0
- package/dist/extensions/herdr/environment.d.ts +7 -0
- package/dist/extensions/herdr/environment.d.ts.map +1 -0
- package/dist/extensions/herdr/environment.js +6 -0
- package/dist/extensions/herdr/environment.js.map +1 -0
- package/dist/extensions/herdr/index.d.ts +9 -0
- package/dist/extensions/herdr/index.d.ts.map +1 -0
- package/dist/extensions/herdr/index.js +225 -0
- package/dist/extensions/herdr/index.js.map +1 -0
- package/dist/extensions/herdr/pane-owner.d.ts +30 -0
- package/dist/extensions/herdr/pane-owner.d.ts.map +1 -0
- package/dist/extensions/herdr/pane-owner.js +111 -0
- package/dist/extensions/herdr/pane-owner.js.map +1 -0
- package/dist/extensions/herdr/transport.d.ts +8 -0
- package/dist/extensions/herdr/transport.d.ts.map +1 -0
- package/dist/extensions/herdr/transport.js +28 -0
- package/dist/extensions/herdr/transport.js.map +1 -0
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +2 -0
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/llama/huggingface-ui.d.ts +1 -1
- package/dist/extensions/llama/huggingface-ui.js.map +1 -1
- package/dist/extensions/llama/ui.js.map +1 -1
- package/dist/index-extensions.d.ts +3 -2
- package/dist/index-extensions.d.ts.map +1 -1
- package/dist/index-extensions.js.map +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/main-session.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +149 -69
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/atomic-banner.d.ts +1 -1
- package/dist/modes/interactive/components/atomic-banner.js.map +1 -1
- package/dist/modes/interactive/components/atomic-working-status.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.d.ts +12 -0
- package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.js +44 -0
- package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.js +43 -8
- package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-editor.d.ts +1 -1
- package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.d.ts +2 -2
- package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.d.ts +2 -2
- package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.js +12 -3
- package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-runtime.d.ts +4 -5
- package/dist/modes/interactive/components/chat-session-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-runtime.js +8 -6
- package/dist/modes/interactive/components/chat-session-host-runtime.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.d.ts +7 -2
- package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.js +1 -0
- package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.d.ts +1 -1
- package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-types.d.ts +8 -3
- package/dist/modes/interactive/components/chat-session-host-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-types.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-utils.d.ts +1 -1
- package/dist/modes/interactive/components/chat-session-host-utils.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-utils.js +2 -0
- package/dist/modes/interactive/components/chat-session-host-utils.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.d.ts +17 -2
- package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.js +97 -1
- package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.d.ts +1 -0
- package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.js +1 -1
- package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +12 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts +1 -1
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +7 -6
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +27 -9
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/host-input-form-mount.js.map +1 -1
- package/dist/modes/interactive/components/host-input-form.d.ts +1 -1
- package/dist/modes/interactive/components/host-input-form.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +2 -2
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/mermaid.d.ts +1 -1
- package/dist/modes/interactive/components/mermaid.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/reserved-bottom-overlay.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-header.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-submenus.d.ts +1 -1
- package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts +1 -1
- package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/task-completion-message.d.ts +13 -0
- package/dist/modes/interactive/components/task-completion-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/task-completion-message.js +65 -0
- package/dist/modes/interactive/components/task-completion-message.js.map +1 -0
- package/dist/modes/interactive/components/task-detail.d.ts +27 -0
- package/dist/modes/interactive/components/task-detail.d.ts.map +1 -0
- package/dist/modes/interactive/components/task-detail.js +107 -0
- package/dist/modes/interactive/components/task-detail.js.map +1 -0
- package/dist/modes/interactive/components/task-inspector.d.ts +50 -0
- package/dist/modes/interactive/components/task-inspector.d.ts.map +1 -0
- package/dist/modes/interactive/components/task-inspector.js +599 -0
- package/dist/modes/interactive/components/task-inspector.js.map +1 -0
- package/dist/modes/interactive/components/task-list.d.ts +18 -0
- package/dist/modes/interactive/components/task-list.d.ts.map +1 -0
- package/dist/modes/interactive/components/task-list.js +59 -0
- package/dist/modes/interactive/components/task-list.js.map +1 -0
- package/dist/modes/interactive/components/task-live-transcript.d.ts +17 -0
- package/dist/modes/interactive/components/task-live-transcript.d.ts.map +1 -0
- package/dist/modes/interactive/components/task-live-transcript.js +33 -0
- package/dist/modes/interactive/components/task-live-transcript.js.map +1 -0
- package/dist/modes/interactive/components/task-navigation.d.ts +38 -0
- package/dist/modes/interactive/components/task-navigation.d.ts.map +1 -0
- package/dist/modes/interactive/components/task-navigation.js +93 -0
- package/dist/modes/interactive/components/task-navigation.js.map +1 -0
- package/dist/modes/interactive/components/task-row.d.ts +34 -0
- package/dist/modes/interactive/components/task-row.d.ts.map +1 -0
- package/dist/modes/interactive/components/task-row.js +158 -0
- package/dist/modes/interactive/components/task-row.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/transcript-follow-indicator.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector-component.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector-content.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector-help.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector-label-input.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector-list.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/working-status.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.js +8 -2
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-login.js +3 -1
- package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.js +9 -30
- package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.js +2 -1
- package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-context.js +14 -4
- package/dist/modes/interactive/interactive-extension-context.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-custom-ui.js +52 -4
- package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js +1 -0
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-widgets.js +9 -1
- package/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +19 -0
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +6 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +4 -1
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.d.ts +6 -6
- package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +3 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/interactive-process-lifecycle.js +4 -1
- package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +2 -0
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-session-routing.js +33 -23
- package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +1 -0
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-summarization-retry-events.js +2 -2
- package/dist/modes/interactive/interactive-summarization-retry-events.js.map +1 -1
- package/dist/modes/interactive/interactive-task-projection.d.ts +13 -0
- package/dist/modes/interactive/interactive-task-projection.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-task-projection.js +72 -0
- package/dist/modes/interactive/interactive-task-projection.js.map +1 -0
- package/dist/modes/interactive/interactive-tui.js.map +1 -1
- package/dist/modes/interactive/interactive-windows-subshell.d.ts +17 -0
- package/dist/modes/interactive/interactive-windows-subshell.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-windows-subshell.js +92 -0
- package/dist/modes/interactive/interactive-windows-subshell.js.map +1 -0
- package/dist/modes/interactive/skill-command-autocomplete.d.ts +12 -0
- package/dist/modes/interactive/skill-command-autocomplete.d.ts.map +1 -0
- package/dist/modes/interactive/skill-command-autocomplete.js +69 -0
- package/dist/modes/interactive/skill-command-autocomplete.js.map +1 -0
- package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-class.js +4 -1
- package/dist/modes/interactive/theme/theme-class.js.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +1 -1
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive-engine/create-isolated-runtime.d.ts +1 -1
- package/dist/modes/interactive-engine/create-isolated-runtime.js.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts +5 -9
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.js +14 -5
- package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
- package/dist/modes/interactive-engine/engine-dialog-host.d.ts +2 -2
- package/dist/modes/interactive-engine/engine-dialog-host.js.map +1 -1
- package/dist/modes/interactive-engine/engine-project-trust.d.ts +10 -0
- package/dist/modes/interactive-engine/engine-project-trust.d.ts.map +1 -0
- package/dist/modes/interactive-engine/engine-project-trust.js +28 -0
- package/dist/modes/interactive-engine/engine-project-trust.js.map +1 -0
- package/dist/modes/interactive-engine/engine-render-service.d.ts +1 -1
- package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
- package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +3 -1
- package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
- package/dist/modes/interactive-engine/extension-ui-bridge.js +6 -0
- package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
- package/dist/modes/interactive-engine/input-form-host.d.ts +2 -2
- package/dist/modes/interactive-engine/input-form-host.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-auth.d.ts +1 -1
- package/dist/modes/interactive-engine/isolated-auth.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.d.ts +5 -2
- package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.js +40 -3
- package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
- package/dist/modes/interactive-engine/protocol.d.ts +9 -0
- package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
- package/dist/modes/interactive-engine/protocol.js +8 -0
- package/dist/modes/interactive-engine/protocol.js.map +1 -1
- package/dist/modes/interactive-engine/remote-component.d.ts +2 -2
- package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
- package/dist/modes/interactive-engine/remote-component.js +3 -2
- package/dist/modes/interactive-engine/remote-component.js.map +1 -1
- package/dist/modes/interactive-engine/remote-model-catalog.d.ts +1 -1
- package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
- package/dist/modes/interactive-engine/remote-renderer.d.ts +1 -1
- package/dist/modes/interactive-engine/remote-renderer.js.map +1 -1
- package/dist/modes/interactive-engine/session-picker-host.d.ts +2 -2
- package/dist/modes/interactive-engine/session-picker-host.js.map +1 -1
- package/dist/modes/json-event.d.ts +1 -1
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-bash-request-owners.d.ts +2 -2
- package/dist/modes/rpc/rpc-bash-request-owners.js.map +1 -1
- package/dist/modes/rpc/rpc-client-api.d.ts +2 -2
- package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client-api.js +2 -2
- package/dist/modes/rpc/rpc-client-api.js.map +1 -1
- package/dist/modes/rpc/rpc-client-waits.d.ts +1 -1
- package/dist/modes/rpc/rpc-client-waits.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +3 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +20 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts +4 -2
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.js +12 -4
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-extension-ui.d.ts +1 -1
- package/dist/modes/rpc/rpc-extension-ui.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +11 -2
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-provider-auth.d.ts +1 -1
- package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
- package/dist/modes/rpc/rpc-session-binding.d.ts +4 -1
- package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-session-binding.js +35 -1
- package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +13 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/task-ui-bridge.d.ts +9 -0
- package/dist/modes/rpc/task-ui-bridge.d.ts.map +1 -0
- package/dist/modes/rpc/task-ui-bridge.js +146 -0
- package/dist/modes/rpc/task-ui-bridge.js.map +1 -0
- package/dist/self-update-plan.js.map +1 -1
- package/docs/background-tasks.md +199 -0
- package/docs/compaction.md +2 -0
- package/docs/development.md +3 -1
- package/docs/docs.json +2 -0
- package/docs/environment-variables.md +1 -1
- package/docs/extensions.md +108 -6
- package/docs/herdr.md +106 -0
- package/docs/intercom.md +38 -35
- package/docs/keybindings.md +19 -2
- package/docs/models/evals.md +222 -147
- package/docs/models/model-selection.md +20 -14
- package/docs/models/pareto-efficiency.md +2 -2
- package/docs/providers.md +48 -46
- package/docs/quickstart.md +1 -1
- package/docs/sdk.md +244 -0
- package/docs/settings.md +15 -3
- package/docs/skills.md +23 -1
- package/docs/subagents.md +71 -9
- package/docs/themes.md +4 -0
- package/docs/tools.md +25 -0
- package/docs/tui.md +29 -2
- package/docs/usage.md +4 -0
- package/docs/windows.md +4 -4
- package/docs/workflows/api-reference.md +13 -4
- package/docs/workflows/operations.md +42 -1
- package/docs/workflows/reliable-design.md +35 -4
- package/docs/workflows/verification.md +21 -4
- package/docs/workflows.md +3 -1
- package/npm-shrinkwrap.json +781 -661
- package/package.json +10 -10
- /package/dist/builtin/workflows/builtin/{chunk-cg9tmks0.js → chunk-n1910xc4.js} +0 -0
- /package/dist/builtin/workflows/builtin/{chunk-wpckd35c.js → chunk-rc5ec5xx.js} +0 -0
- /package/dist/builtin/workflows/builtin/{chunk-7at6dnkr.js → chunk-tgt0s5e5.js} +0 -0
- /package/dist/builtin/workflows/builtin/{chunk-bfkmzv9h.js → chunk-xtxcq5tj.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../../src/core/tasks/supervisor.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncResource } from \"node:async_hooks\";\nimport type * as native from \"@bastani/atomic-natives\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { createModuleRequire } from \"../../utils/module-require.ts\";\nimport type { AgentSessionEvent } from \"../agent-session.js\";\nimport type { SessionManager } from \"../session-manager.ts\";\nimport { COMMAND_FOREGROUND_BUDGET_MS } from \"./command-output.js\";\nimport type { TaskCompletionSource } from \"./completion-ordering.js\";\nimport type * as C from \"./contracts.js\";\n\nexport type TaskTranscriptSource = Pick<SessionManager, \"getSessionId\" | \"getEntries\"> & {\n\treadonly completionSource?: TaskCompletionSource;\n\t/** Viewer-only subscription; updates never publish task lifecycle events. */\n\tsubscribe?(listener: (event: AgentSessionEvent) => void): () => void;\n\tgetStreamingMessage?(): AgentMessage | undefined;\n};\n\nexport const DEFAULT_AGENT_WAIT_BUDGET_MS = 30000;\n/** These objects are live authority, not DTOs, restart tokens or model arguments. */\nclass Capability {\n\t#live = true;\n\ttoJSON(): never {\n\t\tthrow new TypeError(`Task capability is not serializable (${this.#live ? \"live\" : \"closed\"})`);\n\t}\n}\nclass HostCapability extends Capability {\n\treadonly kind = \"host\";\n}\nclass OwnerCapability extends Capability {\n\treadonly kind = \"owner\";\n}\nclass TaskCapability extends Capability {\n\treadonly kind = \"task\";\n}\nclass WaitCapability extends Capability {\n\treadonly kind = \"wait\";\n}\nclass SubscriptionCapability extends Capability {\n\treadonly kind = \"subscription\";\n}\nclass StdinCapability extends Capability {\n\treadonly kind = \"stdin\";\n}\nexport type StdinLease = StdinCapability;\nexport type HostSession = HostCapability;\nexport type OwnerLease = OwnerCapability;\nexport type TaskLease = TaskCapability;\nexport type WaitLease = WaitCapability;\nexport type SubscriptionLease = SubscriptionCapability;\n\nexport type FakeRunnerContext = {\n\tref: C.NativeTaskRef;\n\tsignal: AbortSignal;\n\treportActivity(report: C.ActivityReport): C.Result<C.ReportReceipt, C.ReportError>;\n\t/** Bind existing child history while holding the admitted runner authority. */\n\tbindTranscript(session: TaskTranscriptSource): void;\n};\n/** Independent cleanup evidence: an outcome alone never proves resource release. */\nexport type FakeExecution = { result: Promise<C.TaskResult>; cleanup: Promise<C.Cleanup> };\nexport type TrustedTaskHost = {\n\tscope: C.OwnerScope;\n\t/** Owner-host observation settings; never an execution deadline. */\n\ttasks?: { wait?: C.TaskWaitConfiguration };\n\t/** The existing host/tool refusal throws here, before native admission. */\n\tauthorizeCommandLaunch?(intent: C.CommandIntent): void;\n\tauthorizeLaunch(intent: C.AgentIntent): void;\n\tonTaskSettled?(ref: C.NativeTaskRef, receipt: C.SettlementReceipt): void;\n\tcreateRunner(context: FakeRunnerContext, intent: C.AgentIntent): FakeExecution;\n};\ntype HostState = { native: native.HostSession; binding: TrustedTaskHost };\ntype OwnerState = {\n\tnative: native.OwnerLease;\n\thost: HostState;\n\ttasks: Map<C.TaskId, TaskLease>;\n\twatches: Set<TaskSubscription>;\n\tsettledTasks: Set<C.TaskId>;\n};\ntype TaskState = {\n\tnative: native.TaskLease;\n\towner: OwnerState;\n\tref: C.NativeTaskRef;\n\tcontroller: AbortController;\n\tkind?: \"command\";\n\texecution?: Promise<C.Result<C.Cleanup, C.ReportError>>;\n\ttranscript?: TaskTranscriptSource;\n};\ntype WaitState = { native: native.WaitLease; outcome: Promise<C.Result<C.WaitOutcome, C.WaitError>> };\n\n// Native supervisors share one actor per environment; their JS continuations must too.\nconst environment = {\n\thosts: new WeakMap<HostSession, HostState>(),\n\towners: new WeakMap<OwnerLease, OwnerState>(),\n\ttasks: new WeakMap<TaskLease, TaskState>(),\n\tinputs: new WeakMap<StdinLease, native.StdinLease>(),\n\twaits: new WeakMap<WaitLease, WaitState>(),\n\twaitRegistry: new Map<C.WaitId, WaitLease>(),\n\townerIds: new Map<C.OwnerId, OwnerLease>(),\n};\n\n/** Reads only history bound by the admitted runner, never a caller-selected session. */\nexport function taskTranscriptSource(\n\ttask: TaskLease,\n): C.Result<{ session: TaskTranscriptSource; taskId: C.TaskId }, C.Failure<\"UnknownTask\" | \"TranscriptUnavailable\">> {\n\tconst state = environment.tasks.get(task);\n\tif (!state) return { ok: false, error: { code: \"UnknownTask\", message: \"Unknown task\" } };\n\tif (!state.transcript)\n\t\treturn { ok: false, error: { code: \"TranscriptUnavailable\", message: \"Transcript unavailable\" } };\n\treturn { ok: true, value: { session: state.transcript, taskId: state.ref.taskId } };\n}\n\n/** Promise rejections, setup throws and consumer exceptions may be arbitrary JavaScript values. */\nfunction rejectionMessage<T>(reason: T): string {\n\ttry {\n\t\tconst message = reason instanceof Error ? reason.message : reason;\n\t\treturn typeof message === \"string\" ? message : String(message);\n\t} catch {\n\t\treturn \"Unprintable JavaScript rejection\";\n\t}\n}\nfunction mapped<T, U, Code extends string>(\n\tresult: C.Result<T, native.TaskFailure>,\n\tconvert: (value: T) => U,\n\tcodes: readonly Code[],\n): C.Result<U, C.Failure<Code>> {\n\tif (result.ok) return { ok: true, value: convert(result.value) };\n\tconst code = codes.find((candidate) => candidate === result.error.code);\n\tif (!code) throw new Error(`Unexpected native task refusal: ${result.error.code}: ${result.error.message}`);\n\treturn { ok: false, error: { code, message: result.error.message } };\n}\nconst ownerErrors = [\"ScopeMismatch\", \"EnvironmentClosing\"] as const;\nconst startErrors = [\n\t\"OwnerClosing\",\n\t\"UnknownAgent\",\n\t\"InvalidCwd\",\n\t\"DepthExceeded\",\n\t\"CapacityExhausted\",\n\t\"DispatchGuardBusy\",\n\t\"OperationConflict\",\n\t\"RunnerUnavailable\",\n\t\"SpawnFailed\",\n\t\"ContainmentUnavailable\",\n] as const;\nconst waitErrors = [\"UnknownTask\", \"OwnerClosed\", \"EnvironmentClosing\", \"ScopeMismatch\", \"ObserverCancelled\"] as const;\nconst reportErrors = [\"StaleAttempt\", \"OwnerClosing\", \"TaskTerminal\", \"ReportConflict\"] as const;\nconst watchErrors = [\"OwnerClosed\", \"StaleGeneration\", \"EnvironmentClosing\"] as const;\nfunction reference(value: native.NativeTaskRef): C.NativeTaskRef {\n\treturn {\n\t\townerId: value.ownerId as C.OwnerId,\n\t\ttaskId: value.taskId as C.TaskId,\n\t\tattemptId: value.attemptId as C.AttemptId,\n\t\tgeneration: value.generation as C.Generation,\n\t};\n}\nfunction cursor(value: native.Cursor): C.Cursor {\n\treturn { generation: value.generation as C.Generation, sequence: value.sequence as C.Sequence };\n}\nfunction output(value: native.OutputRef): C.OutputRef {\n\treturn {\n\t\townerId: value.ownerId as C.OwnerId,\n\t\ttaskId: value.taskId as C.TaskId,\n\t\tartifactId: value.artifactId,\n\t\tbyteCount: value.byteCount,\n\t\tomittedRanges: value.omittedRanges.map(({ start, end }) => ({ start, end })),\n\t};\n}\nfunction taskResult(value: native.TaskResult): C.TaskResult {\n\tswitch (value.kind) {\n\t\tcase \"completed\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\toutput: output(value.output),\n\t\t\t\t...(value.exitCode === undefined ? {} : { exitCode: value.exitCode }),\n\t\t\t};\n\t\tcase \"failed\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\tcode: value.code,\n\t\t\t\tmessage: value.message,\n\t\t\t\t...(value.output === undefined ? {} : { output: output(value.output) }),\n\t\t\t\t...(value.exitCode === undefined ? {} : { exitCode: value.exitCode }),\n\t\t\t};\n\t\tcase \"cancelled\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\tcause: value.cause,\n\t\t\t\t...(value.output === undefined ? {} : { output: output(value.output) }),\n\t\t\t};\n\t}\n}\nfunction execution(value: native.Execution): C.Execution {\n\treturn value.kind === \"settled\" ? { kind: \"settled\", result: taskResult(value.result) } : value;\n}\nfunction observation(value: native.HostObservation): C.HostObservation {\n\tif (value.kind === \"foreground\") return { kind: value.kind, waitId: value.waitId as C.WaitId };\n\tif (value.kind === \"none\" && (value.reason === \"task-settled\" || value.reason === \"owner-closing\"))\n\t\treturn { kind: value.kind, reason: value.reason };\n\tconst reasons = [\n\t\t\"explicit\",\n\t\t\"default-background\",\n\t\t\"elapsed\",\n\t\t\"intercom-coordination\",\n\t\t\"input-needed\",\n\t\t\"not-observed\",\n\t\t\"observer-cancelled\",\n\t] as const;\n\tconst reason = reasons.find((reason) => reason === value.reason);\n\tif (value.kind === \"background\" && reason) return { kind: value.kind, reason };\n\tthrow new Error(\"Invalid native host observation\");\n}\nfunction record(value: native.TaskRecord): C.TaskRecord {\n\tif (value.kind !== \"agent\" && value.kind !== \"command\") throw new Error(`Invalid native task kind: ${value.kind}`);\n\treturn {\n\t\tref: reference(value.ref),\n\t\tlaunchOperationId: value.launchOperationId as C.OperationId,\n\t\t...(value.parentTaskId === undefined ? {} : { parentTaskId: value.parentTaskId as C.TaskId }),\n\t\t...(value.launchGroupId === undefined ? {} : { launchGroupId: value.launchGroupId }),\n\t\tlaunchOrdinal: value.launchOrdinal,\n\t\tkind: value.kind,\n\t\ttitle: value.title,\n\t\t...(value.agentName === undefined ? {} : { agentName: value.agentName }),\n\t\t...(value.model === undefined ? {} : { model: value.model }),\n\t\t...(value.thinking === undefined ? {} : { thinking: value.thinking }),\n\t\texecution: execution(value.execution),\n\t\tobservation: observation(value.observation),\n\t\t...(value.wasBackground === undefined ? {} : { wasBackground: value.wasBackground }),\n\t\tattention: value.attention,\n\t\tcleanup: value.cleanup,\n\t\t...(value.currentAction === undefined\n\t\t\t? {}\n\t\t\t: { currentAction: { tool: value.currentAction.tool, text: value.currentAction.text } }),\n\t\t...(value.metrics === undefined\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tmetrics: {\n\t\t\t\t\t\t...(value.metrics.elapsedMs === undefined ? {} : { elapsedMs: value.metrics.elapsedMs }),\n\t\t\t\t\t\t...(value.metrics.toolCount === undefined ? {} : { toolCount: value.metrics.toolCount }),\n\t\t\t\t\t\t...(value.metrics.tokenCount === undefined ? {} : { tokenCount: value.metrics.tokenCount }),\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\toutput: output(value.output),\n\t};\n}\nfunction snapshot(value: native.OwnerSnapshot): C.OwnerSnapshot {\n\tif (value.state !== \"open\" && value.state !== \"closing\" && value.state !== \"closed\")\n\t\tthrow new Error(`Invalid native owner state: ${value.state}`);\n\treturn {\n\t\townerId: value.ownerId as C.OwnerId,\n\t\tscope: value.scope,\n\t\tgeneration: value.generation as C.Generation,\n\t\tstate: value.state,\n\t\ttasks: value.tasks.map(record),\n\t\tcursor: cursor(value.cursor),\n\t};\n}\nfunction activity(value: native.ActivityReport): C.ActivityReport {\n\tif (value.change.kind === \"attention-set\" && value.change.attention.kind === \"none\")\n\t\tthrow new Error(\"Native attention-set cannot clear attention\");\n\t// Native tagged variants are owned wire data; only attention-set has a wider generated declaration.\n\treturn value as C.ActivityReport;\n}\nfunction payload(value: native.TaskEvent): C.TaskEvent {\n\tswitch (value.kind) {\n\t\tcase \"task-admitted\":\n\t\t\treturn { kind: value.kind, task: record(value.task) };\n\t\tcase \"task-started\":\n\t\t\treturn { kind: value.kind, ref: reference(value.ref) };\n\t\tcase \"wait-started\": {\n\t\t\tif (value.observer !== \"sdk\" && value.observer !== \"host\") throw new Error(\"Invalid native observer\");\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\tref: reference(value.ref),\n\t\t\t\twaitId: value.waitId as C.WaitId,\n\t\t\t\tobserver: value.observer,\n\t\t\t};\n\t\t}\n\t\tcase \"wait-yielded\":\n\t\t\treturn { kind: value.kind, ref: reference(value.ref), waitId: value.waitId as C.WaitId, reason: value.reason };\n\t\tcase \"host-observation-changed\":\n\t\t\treturn { kind: value.kind, ref: reference(value.ref), observation: observation(value.observation) };\n\t\tcase \"task-activity\":\n\t\t\treturn { kind: value.kind, ref: reference(value.ref), activity: activity(value.activity) };\n\t\tcase \"task-cancelling\":\n\t\t\treturn { kind: value.kind, ref: reference(value.ref), cause: value.cause };\n\t\tcase \"task-settled\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\tref: reference(value.ref),\n\t\t\t\tresult: taskResult(value.result),\n\t\t\t\tcompletionId: value.completionId,\n\t\t\t};\n\t\tcase \"cleanup-changed\":\n\t\t\treturn { kind: value.kind, ref: reference(value.ref), cleanup: value.cleanup };\n\t\tcase \"owner-closing\":\n\t\tcase \"owner-closed\":\n\t\t\treturn { kind: value.kind };\n\t}\n}\nfunction event(value: native.NativeEvent): C.NativeEvent {\n\tif (value.schemaVersion !== 1) throw new Error(\"Unsupported native task event schema\");\n\treturn {\n\t\tschemaVersion: 1,\n\t\tcursor: cursor(value.cursor),\n\t\townerId: value.ownerId as C.OwnerId,\n\t\t...(value.taskId === undefined ? {} : { taskId: value.taskId as C.TaskId }),\n\t\tpayload: payload(value.payload),\n\t};\n}\nfunction waitOutcome(value: native.WaitOutcome): C.WaitOutcome {\n\treturn value.kind === \"settled\"\n\t\t? { kind: value.kind, taskId: value.taskId as C.TaskId, result: taskResult(value.result) }\n\t\t: { kind: value.kind, taskId: value.taskId as C.TaskId, waitId: value.waitId as C.WaitId, reason: value.reason };\n}\nfunction cancelReceipt(value: native.CancelReceipt): C.CancelReceipt {\n\tif (value.decision !== \"already-settled\" && value.decision !== \"cancellation-requested\")\n\t\tthrow new Error(\"Invalid cancellation decision\");\n\treturn {\n\t\ttaskId: value.taskId as C.TaskId,\n\t\tdecision: value.decision,\n\t\texecution: execution(value.execution),\n\t\tcleanup: value.cleanup,\n\t};\n}\n\nfunction reportReceipt(value: native.ReportReceipt): C.ReportReceipt {\n\tif (value.disposition !== \"accepted\" && value.disposition !== \"duplicate\")\n\t\tthrow new Error(\"Invalid report disposition\");\n\treturn { reportId: value.reportId, cursor: cursor(value.cursor), disposition: value.disposition };\n}\n/** Projection only: native ordering remains the sole lifecycle authority. */\nfunction applyEvent(current: C.OwnerSnapshot, value: C.NativeEvent): C.OwnerSnapshot {\n\tconst next: C.OwnerSnapshot = { ...current, tasks: [...current.tasks], cursor: value.cursor };\n\tconst change = value.payload;\n\tif (change.kind === \"owner-closing\") {\n\t\tnext.state = \"closing\";\n\t\tnext.tasks = next.tasks.map((task) =>\n\t\t\ttask.execution.kind === \"settled\" ? task : { ...task, attention: { kind: \"none\" } },\n\t\t);\n\t\treturn next;\n\t}\n\tif (change.kind === \"owner-closed\") {\n\t\tnext.state = \"closed\";\n\t\treturn next;\n\t}\n\tif (change.kind === \"task-admitted\") {\n\t\tnext.tasks.push(change.task);\n\t\treturn next;\n\t}\n\tconst index = next.tasks.findIndex((task) => task.ref.taskId === change.ref.taskId);\n\tif (index < 0) throw new Error(\"Native delta references a task absent from its snapshot\");\n\tconst task: C.TaskRecord = { ...next.tasks[index] };\n\tnext.tasks[index] = task;\n\tswitch (change.kind) {\n\t\tcase \"task-started\":\n\t\t\ttask.execution = { kind: \"running\" };\n\t\t\tbreak;\n\t\tcase \"host-observation-changed\":\n\t\t\ttask.observation = change.observation;\n\t\t\tif (change.observation.kind === \"background\" && change.observation.reason !== \"not-observed\")\n\t\t\t\ttask.wasBackground = true;\n\t\t\tbreak;\n\t\tcase \"task-cancelling\":\n\t\t\ttask.execution = { kind: \"cancelling\", cause: change.cause };\n\t\t\tbreak;\n\t\tcase \"task-settled\":\n\t\t\ttask.execution = { kind: \"settled\", result: change.result };\n\t\t\ttask.attention = { kind: \"none\" };\n\t\t\tif (change.result.output !== undefined) task.output = change.result.output;\n\t\t\tbreak;\n\t\tcase \"cleanup-changed\":\n\t\t\ttask.cleanup = change.cleanup;\n\t\t\tbreak;\n\t\tcase \"task-activity\": {\n\t\t\tconst activity = change.activity.change;\n\t\t\tswitch (activity.kind) {\n\t\t\t\tcase \"action\":\n\t\t\t\t\ttask.currentAction = { tool: activity.tool, text: activity.text };\n\t\t\t\t\tif (task.attention.kind === \"no-recent-activity\") task.attention = { kind: \"none\" };\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"model\":\n\t\t\t\t\ttask.model = activity.model;\n\t\t\t\t\ttask.thinking = activity.thinking;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"metrics\":\n\t\t\t\t\ttask.metrics = {\n\t\t\t\t\t\t...task.metrics,\n\t\t\t\t\t\t...(activity.elapsedMs === undefined ? {} : { elapsedMs: activity.elapsedMs }),\n\t\t\t\t\t\t...(activity.toolCount === undefined ? {} : { toolCount: activity.toolCount }),\n\t\t\t\t\t\t...(activity.tokenCount === undefined ? {} : { tokenCount: activity.tokenCount }),\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"attention-set\":\n\t\t\t\t\ttask.attention = activity.attention;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"attention-clear\":\n\t\t\t\t\tif (task.attention.kind === \"input-needed\" && task.attention.requestId === activity.requestId)\n\t\t\t\t\t\ttask.attention = { kind: \"none\" };\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"output\":\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"wait-started\":\n\t\tcase \"wait-yielded\":\n\t\t\tbreak;\n\t}\n\treturn next;\n}\n/** One bounded wake poll per live subscription, including a journal with no retained event. */\nconst RECONCILE_INTERVAL_MS = 25;\nconst MAX_PENDING_EVENTS = 64;\nexport class TaskSubscription {\n\t#native: native.TaskSupervisor;\n\t#lease: native.SubscriptionLease;\n\t#resource = new AsyncResource(\"TaskSubscription\");\n\t#timer?: ReturnType<typeof setTimeout>;\n\t#queue: C.NativeEvent[] = [];\n\t#epoch = 0;\n\t#next?: (value: IteratorResult<C.NativeEvent>) => void;\n\t#disposed = false;\n\t#snapshot: C.OwnerSnapshot;\n\t#cursor: C.Cursor;\n\t/** Reconciliation supplements the RFC snapshot/cursor/iterable contract. */\n\tonReconcile: (snapshot: C.OwnerSnapshot) => void = () => {};\n\t#onDispose: () => void;\n\t#failure?: Error;\n\treadonly events: AsyncIterable<C.NativeEvent>;\n\treadonly lease: SubscriptionLease = new SubscriptionCapability();\n\n\tconstructor(actor: native.TaskSupervisor, initial: native.NativeTaskSubscription, onDispose: () => void) {\n\t\tObject.freeze(this.lease);\n\t\tthis.#native = actor;\n\t\tthis.#lease = initial.lease;\n\t\tthis.#snapshot = snapshot(initial.snapshot);\n\t\tthis.#cursor = cursor(initial.cursor);\n\t\tthis.#onDispose = onDispose;\n\t\tthis.events = {\n\t\t\t[Symbol.asyncIterator]: () => {\n\t\t\t\tconst epoch = this.#epoch;\n\t\t\t\treturn {\n\t\t\t\t\tnext: () => {\n\t\t\t\t\t\tif (epoch !== this.#epoch) return Promise.resolve({ done: true, value: undefined });\n\t\t\t\t\t\tconst value = this.#queue.shift();\n\t\t\t\t\t\tif (value) return Promise.resolve({ done: false, value });\n\t\t\t\t\t\tif (this.#disposed) return Promise.resolve({ done: true, value: undefined });\n\t\t\t\t\t\tif (this.#next) return Promise.reject(new Error(\"Only one pending subscription read is supported\"));\n\t\t\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\t\t\tthis.#next = resolve;\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\treturn: async () => {\n\t\t\t\t\t\tif (epoch === this.#epoch) this.dispose();\n\t\t\t\t\t\treturn { done: true, value: undefined };\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t\tthis.#arm();\n\t}\n\tget snapshot(): C.OwnerSnapshot {\n\t\treturn this.#snapshot;\n\t}\n\tget cursor(): C.Cursor {\n\t\treturn this.#cursor;\n\t}\n\t/** Consumer exceptions are observable without breaking the native wake or fallback poll. */\n\tget failure(): Error | undefined {\n\t\treturn this.#failure;\n\t}\n\t/** Callback payloads are authentic hints; only the journal/snapshot is authoritative. */\n\twake(_hint: native.NativeEvent): void {\n\t\tthis.#resource.runInAsyncScope(() => this.drain());\n\t}\n\t#arm(): void {\n\t\tif (this.#disposed || this.#timer) return;\n\t\tthis.#timer = setTimeout(() => {\n\t\t\tthis.#timer = undefined;\n\t\t\tthis.#resource.runInAsyncScope(() => this.drain());\n\t\t\tthis.#arm();\n\t\t}, RECONCILE_INTERVAL_MS);\n\t\tthis.#timer.unref();\n\t}\n\tdrain(): void {\n\t\tif (this.#disposed) return;\n\t\tconst drained = this.#native.drainOwnerTasks(this.#lease);\n\t\tif (!drained.ok) {\n\t\t\tthis.dispose();\n\t\t\treturn;\n\t\t}\n\t\tconst events = drained.value.events.map(event);\n\t\tif (drained.value.snapshot) this.#snapshot = snapshot(drained.value.snapshot);\n\t\tfor (const value of events) {\n\t\t\tif (BigInt(value.cursor.sequence) > BigInt(this.#snapshot.cursor.sequence))\n\t\t\t\tthis.#snapshot = applyEvent(this.#snapshot, value);\n\t\t}\n\t\tthis.#cursor = cursor(drained.value.cursor);\n\t\tthis.#snapshot = { ...this.#snapshot, cursor: this.#cursor };\n\t\tconst overflow = this.#queue.length + events.length > MAX_PENDING_EVENTS;\n\t\tconst reset = drained.value.reset || overflow;\n\t\tif (reset) {\n\t\t\tthis.#queue = [];\n\t\t\tthis.#epoch++;\n\t\t\t// End the old iterator only after publishing the authoritative snapshot/cursor.\n\t\t\t// A new iterator on the same iterable observes subsequent authentic deltas.\n\t\t\tthis.#next?.({ done: true, value: undefined });\n\t\t\tthis.#next = undefined;\n\t\t}\n\t\tif (drained.value.snapshot || events.length) {\n\t\t\ttry {\n\t\t\t\tthis.#resource.runInAsyncScope(this.onReconcile, undefined, this.#snapshot);\n\t\t\t} catch (error) {\n\t\t\t\tthis.#failure = new Error(rejectionMessage(error));\n\t\t\t}\n\t\t}\n\t\tif (this.#disposed) return;\n\t\tif (!reset)\n\t\t\tfor (const value of events) {\n\t\t\t\tif (this.#next) {\n\t\t\t\t\tconst next = this.#next;\n\t\t\t\t\tthis.#next = undefined;\n\t\t\t\t\tnext({ done: false, value });\n\t\t\t\t} else this.#queue.push(value);\n\t\t\t}\n\t\tif (this.#snapshot.state === \"closed\") this.dispose(false);\n\t}\n\tdispose(clear = true): void {\n\t\tif (this.#disposed) return;\n\t\tthis.#disposed = true;\n\t\tif (this.#timer) clearTimeout(this.#timer);\n\t\tthis.#timer = undefined;\n\t\tthis.#native.disposeSubscription(this.#lease);\n\t\tif (clear) this.#queue = [];\n\t\tthis.#next?.({ done: true, value: undefined });\n\t\tthis.#next = undefined;\n\t\tthis.#resource.emitDestroy();\n\t\tthis.#onDispose();\n\t}\n}\n\nexport class TaskSupervisor {\n\t#native = new (createModuleRequire(import.meta.url)(\"@bastani/atomic-natives\") as typeof native).TaskSupervisor();\n\t#hosts = environment.hosts;\n\t#owners = environment.owners;\n\t#tasks = environment.tasks;\n\t#waits = environment.waits;\n\t#waitRegistry = environment.waitRegistry;\n\t#ownerIds = environment.ownerIds;\n\tbindHostSession(binding: TrustedTaskHost): HostSession {\n\t\tconst host = new HostCapability();\n\t\tObject.freeze(host);\n\t\tthis.#hosts.set(host, { native: this.#native.bindHostSession(binding.scope), binding });\n\t\treturn host;\n\t}\n\topenTaskOwner(host: HostSession, scope: C.OwnerScope): C.Result<OwnerLease, C.OwnerError> {\n\t\tconst state = this.#host(host);\n\t\treturn mapped(\n\t\t\tthis.#native.openTaskOwner(state.native, scope),\n\t\t\t(lease) => {\n\t\t\t\tconst probe = this.#native.watchOwnerTasks(lease, (_hint) => {});\n\t\t\t\tif (!probe.ok) throw new Error(probe.error.message);\n\t\t\t\tconst id = probe.value.snapshot.ownerId as C.OwnerId;\n\t\t\t\tthis.#native.disposeSubscription(probe.value.lease);\n\t\t\t\tconst existing = this.#ownerIds.get(id);\n\t\t\t\tif (existing) return existing;\n\t\t\t\tconst owner = new OwnerCapability();\n\t\t\t\tObject.freeze(owner);\n\t\t\t\tconst ownerState: OwnerState = {\n\t\t\t\t\tnative: lease,\n\t\t\t\t\thost: state,\n\t\t\t\t\ttasks: new Map(),\n\t\t\t\t\twatches: new Set(),\n\t\t\t\t\tsettledTasks: new Set(),\n\t\t\t\t};\n\t\t\t\tthis.#owners.set(owner, ownerState);\n\t\t\t\tthis.#ownerIds.set(id, owner);\n\t\t\t\tconst watched = this.watchOwnerTasks(owner);\n\t\t\t\tif (!watched.ok) throw new Error(watched.error.message);\n\t\t\t\twatched.value.onReconcile = (projection) => {\n\t\t\t\t\tif (projection.state === \"closed\") this.#ownerIds.delete(projection.ownerId);\n\t\t\t\t\tfor (const record of projection.tasks) {\n\t\t\t\t\t\tconst cause =\n\t\t\t\t\t\t\trecord.execution.kind === \"cancelling\"\n\t\t\t\t\t\t\t\t? record.execution.cause\n\t\t\t\t\t\t\t\t: projection.state !== \"open\" && record.cleanup.kind !== \"reaped\"\n\t\t\t\t\t\t\t\t\t? \"owner-close\"\n\t\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tif (!cause) continue;\n\t\t\t\t\t\tconst task = this.#owner(owner).tasks.get(record.ref.taskId);\n\t\t\t\t\t\tif (task) this.#task(task).controller.abort(cause);\n\t\t\t\t\t}\n\t\t\t\t\tlet failure: Error | undefined;\n\t\t\t\t\tfor (const record of projection.tasks) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\trecord.execution.kind !== \"settled\" ||\n\t\t\t\t\t\t\townerState.settledTasks.has(record.ref.taskId) ||\n\t\t\t\t\t\t\t!state.binding.onTaskSettled\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Cancellation settles at cleanup (or while queued), without a runner outcome.\n\t\t\t\t\t\t\t// Recover its authentic receipt even when the bounded journal has reset.\n\t\t\t\t\t\t\tconst task = this.#native.lookupTask(lease, record.ref.taskId);\n\t\t\t\t\t\t\tif (!task.ok) throw new Error(task.error.message);\n\t\t\t\t\t\t\tconst settled = this.#native.taskSettlement(task.value);\n\t\t\t\t\t\t\tif (!settled.ok) throw new Error(settled.error.message);\n\t\t\t\t\t\t\tthis.#notifyTaskSettled(ownerState, record.ref, settled.value);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tfailure ??= new Error(rejectionMessage(error));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (failure) throw failure;\n\t\t\t\t};\n\t\t\t\twatched.value.onReconcile(watched.value.snapshot);\n\t\t\t\treturn owner;\n\t\t\t},\n\t\t\townerErrors,\n\t\t);\n\t}\n\t#notifyTaskSettled(state: OwnerState, ref: C.NativeTaskRef, receipt: native.SettlementReceipt): void {\n\t\tif (!state.host.binding.onTaskSettled || state.settledTasks.has(ref.taskId)) return;\n\t\t// Runner outcomes and snapshot recovery share one delivery door. Mark before\n\t\t// host code so reentrant drains or callback failures cannot redeliver.\n\t\tstate.settledTasks.add(ref.taskId);\n\t\tstate.host.binding.onTaskSettled(ref, {\n\t\t\ttaskId: receipt.taskId as C.TaskId,\n\t\t\tcursor: cursor(receipt.cursor),\n\t\t\tresult: taskResult(receipt.result),\n\t\t\tcompletionId: receipt.completionId,\n\t\t});\n\t}\n\tasync startCommandTask(\n\t\towner: OwnerLease,\n\t\tintent: C.CommandIntent,\n\t\toperation: C.OperationId,\n\t): Promise<C.Result<TaskLease, C.StartFailure>> {\n\t\tconst state = this.#owner(owner);\n\t\tstate.host.binding.authorizeCommandLaunch?.(intent);\n\t\tconst admitted = mapped(\n\t\t\tawait this.#native.startCommandTask(state.native, intent, operation),\n\t\t\t(lease) => lease,\n\t\t\tstartErrors,\n\t\t);\n\t\tif (!admitted.ok) return admitted;\n\t\tconst ref = this.#native.taskReference(admitted.value);\n\t\tif (!ref.ok) throw new Error(ref.error.message);\n\t\tconst id = ref.value.taskId as C.TaskId;\n\t\tconst existing = state.tasks.get(id);\n\t\tif (existing) return { ok: true, value: existing };\n\t\tconst task = new TaskCapability();\n\t\tthis.#tasks.set(task, {\n\t\t\tnative: admitted.value,\n\t\t\towner: state,\n\t\t\tref: reference(ref.value),\n\t\t\tcontroller: new AbortController(),\n\t\t\tkind: \"command\",\n\t\t});\n\t\tstate.tasks.set(id, task);\n\t\treturn { ok: true, value: task };\n\t}\n\ttaskStdin(task: TaskLease): C.Result<StdinLease, C.InputError> {\n\t\treturn mapped(\n\t\t\tthis.#native.taskStdin(this.#task(task).native),\n\t\t\t(input) => {\n\t\t\t\tconst lease = new StdinCapability();\n\t\t\t\tenvironment.inputs.set(lease, input);\n\t\t\t\treturn lease;\n\t\t\t},\n\t\t\t[\"TaskTerminal\", \"StdinClosed\", \"UnknownTask\", \"OutputUnavailable\"] as const,\n\t\t);\n\t}\n\tasync writeTaskInput(\n\t\tinput: StdinLease,\n\t\toperation: C.OperationId,\n\t\tdata: C.InputData,\n\t): Promise<C.Result<C.InputReceipt, C.InputError>> {\n\t\tconst lease = environment.inputs.get(input);\n\t\tif (!lease) throw new TypeError(\"Foreign stdin capability\");\n\t\treturn mapped(\n\t\t\tawait this.#native.writeTaskInput(\n\t\t\t\tlease,\n\t\t\t\toperation,\n\t\t\t\tdata.kind === \"bytes\" ? { kind: \"bytes\", bytes: Buffer.from(data.bytes) } : data,\n\t\t\t),\n\t\t\t(value) => ({\n\t\t\t\toperationId: value.operationId as C.OperationId,\n\t\t\t\tacceptedBytes: value.acceptedBytes,\n\t\t\t\tkind: value.kind as \"bytes\" | \"eof\",\n\t\t\t}),\n\t\t\t[\"TaskTerminal\", \"StdinClosed\", \"InputBackpressure\", \"OperationConflict\", \"InputDeliveryUnknown\"] as const,\n\t\t);\n\t}\n\tasync readTaskOutput(task: TaskLease, range: C.OutputRange): Promise<C.Result<C.OutputPage, C.OutputError>> {\n\t\treturn mapped(\n\t\t\tawait this.#native.readTaskOutput(this.#task(task).native, range),\n\t\t\t(page) => ({\n\t\t\t\trequested: page.requested,\n\t\t\t\tchunks: page.chunks.map((chunk) => ({ offsets: chunk.offsets, bytes: new Uint8Array(chunk.bytes) })),\n\t\t\t\tomittedRanges: page.omittedRanges,\n\t\t\t\t...(page.nextOffset === undefined ? {} : { nextOffset: page.nextOffset }),\n\t\t\t}),\n\t\t\t[\"UnknownTask\", \"OutputUnavailable\"] as const,\n\t\t);\n\t}\n\tasync startAgentTask(\n\t\towner: OwnerLease,\n\t\tintent: C.AgentIntent,\n\t\toperation: C.OperationId,\n\t\tschedule?: (dispatch: () => Promise<void>) => void,\n\t): Promise<C.Result<TaskLease, C.StartFailure>> {\n\t\tconst state = this.#owner(owner);\n\t\tstate.host.binding.authorizeLaunch(intent);\n\t\tconst admitted = mapped(\n\t\t\tthis.#native.startAgentTask(state.native, intent, operation),\n\t\t\t(lease) => lease,\n\t\t\tstartErrors,\n\t\t);\n\t\tif (!admitted.ok) return admitted;\n\t\tconst ref = this.#native.taskReference(admitted.value);\n\t\tif (!ref.ok) throw new Error(ref.error.message);\n\t\tconst id = ref.value.taskId as C.TaskId;\n\t\tconst existing = state.tasks.get(id);\n\t\tif (existing) return { ok: true, value: existing };\n\t\tconst task = new TaskCapability();\n\t\tObject.freeze(task);\n\t\tconst taskState: TaskState = {\n\t\t\tnative: admitted.value,\n\t\t\towner: state,\n\t\t\tref: reference(ref.value),\n\t\t\tcontroller: new AbortController(),\n\t\t};\n\t\tthis.#tasks.set(task, taskState);\n\t\tstate.tasks.set(id, task);\n\t\tconst dispatch = AsyncResource.bind(async () => {\n\t\t\tif (taskState.controller.signal.aborted) return;\n\t\t\tconst runner = mapped(this.#native.claimTaskRunner(admitted.value), (lease) => lease, startErrors);\n\t\t\tif (!runner.ok) throw new Error(`${runner.error.code}: ${runner.error.message}`);\n\t\t\tlet execution: FakeExecution;\n\t\t\ttry {\n\t\t\t\texecution = state.host.binding.createRunner(\n\t\t\t\t\t{\n\t\t\t\t\t\tref: reference(taskState.ref),\n\t\t\t\t\t\tsignal: taskState.controller.signal,\n\t\t\t\t\t\tbindTranscript: (session) => {\n\t\t\t\t\t\t\ttaskState.transcript = session;\n\t\t\t\t\t\t},\n\t\t\t\t\t\treportActivity: (report) =>\n\t\t\t\t\t\t\tmapped(this.#native.reportTaskActivity(runner.value, report), reportReceipt, reportErrors),\n\t\t\t\t\t},\n\t\t\t\t\tintent,\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = rejectionMessage(error);\n\t\t\t\texecution = {\n\t\t\t\t\tresult: Promise.resolve({ kind: \"failed\", code: \"SpawnFailed\", message }),\n\t\t\t\t\tcleanup: Promise.resolve({\n\t\t\t\t\t\tkind: \"failed\",\n\t\t\t\t\t\tresources: [{ resource: \"fake-runner-setup\", code: \"CleanupUnconfirmed\", message }],\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst outcome = execution.result\n\t\t\t\t.catch((error) => ({ kind: \"failed\" as const, code: \"RunnerFailed\", message: rejectionMessage(error) }))\n\t\t\t\t.then((result) => {\n\t\t\t\t\treturn mapped(\n\t\t\t\t\t\tthis.#native.reportRunnerOutcome(runner.value, result),\n\t\t\t\t\t\t(receipt) => this.#notifyTaskSettled(state, taskState.ref, receipt),\n\t\t\t\t\t\treportErrors,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\tconst cleanup = execution.cleanup.catch(\n\t\t\t\t(error): C.Cleanup => ({\n\t\t\t\t\tkind: \"failed\",\n\t\t\t\t\tresources: [{ resource: \"fake-runner\", code: \"CleanupFailed\", message: rejectionMessage(error) }],\n\t\t\t\t}),\n\t\t\t);\n\t\t\ttaskState.execution = cleanup.then(async (evidence) => {\n\t\t\t\t// Natural reaping follows its outcome; cancellation needs only confirmed stop.\n\t\t\t\t// A result may never arrive after abort, including when cleanup arrived first.\n\t\t\t\tconst signal = taskState.controller.signal;\n\t\t\t\tlet stopped!: () => void;\n\t\t\t\tconst cancelled = new Promise<undefined>((resolve) => {\n\t\t\t\t\tstopped = () => resolve(undefined);\n\t\t\t\t\tif (signal.aborted) stopped();\n\t\t\t\t\telse signal.addEventListener(\"abort\", stopped, { once: true });\n\t\t\t\t});\n\t\t\t\tconst reported = await Promise.race([outcome, cancelled]).finally(() => {\n\t\t\t\t\tsignal.removeEventListener(\"abort\", stopped);\n\t\t\t\t});\n\t\t\t\tconst acknowledged = mapped(\n\t\t\t\t\tthis.#native.acknowledgeTaskCleanup(runner.value, evidence),\n\t\t\t\t\t(cleanup) => cleanup,\n\t\t\t\t\treportErrors,\n\t\t\t\t);\n\t\t\t\tif (reported && !reported.ok && !(signal.aborted && reported.error.code === \"ReportConflict\"))\n\t\t\t\t\treturn reported;\n\t\t\t\treturn acknowledged;\n\t\t\t});\n\t\t\tawait taskState.execution;\n\t\t});\n\t\tif (schedule) schedule(dispatch);\n\t\telse void dispatch();\n\t\t// Setup is complete. Do not await execution; ready terminal microtasks may win observation.\n\t\tawait Promise.resolve();\n\t\treturn { ok: true, value: task };\n\t}\n\ttaskReference(task: TaskLease): C.NativeTaskRef {\n\t\treturn reference(this.#task(task).ref);\n\t}\n\tasync waitForTask(\n\t\ttask: TaskLease,\n\t\tbudgetMs?: number,\n\t\tdesignation?: HostSession,\n\t): Promise<C.Result<C.WaitOutcome, C.WaitError>> {\n\t\tconst registered = mapped(\n\t\t\tthis.#native.waitForTask(\n\t\t\t\tthis.#task(task).native,\n\t\t\t\tthis.#agentBudget(this.#task(task).owner, budgetMs, this.#task(task).kind === \"command\"),\n\t\t\t\tdesignation ? this.#host(designation).native : undefined,\n\t\t\t),\n\t\t\t(lease) => this.#register(lease),\n\t\t\twaitErrors,\n\t\t);\n\t\treturn registered.ok ? this.observeTaskWait(registered.value) : registered;\n\t}\n\t/** Resolve only a task admitted under this live owner; IDs alone confer no authority. */\n\tlookupTask(owner: OwnerLease, taskId: C.TaskId): C.Result<TaskLease, C.WaitError> {\n\t\tconst state = this.#owner(owner);\n\t\tconst found = mapped(this.#native.lookupTask(state.native, taskId), () => state.tasks.get(taskId), waitErrors);\n\t\tif (!found.ok) return found;\n\t\tif (!found.value) return { ok: false, error: { code: \"UnknownTask\", message: \"No agent runner bound to task\" } };\n\t\treturn { ok: true, value: found.value };\n\t}\n\n\tasync waitForTaskId(\n\t\towner: OwnerLease,\n\t\ttaskId: C.TaskId,\n\t\tbudgetMs?: number,\n\t): Promise<C.Result<C.WaitOutcome, C.WaitError>> {\n\t\tconst found = mapped(this.#native.lookupTask(this.#owner(owner).native, taskId), (lease) => lease, waitErrors);\n\t\tif (!found.ok) return found;\n\t\tconst known = this.#owner(owner).tasks.get(taskId);\n\t\tconst registered = mapped(\n\t\t\tthis.#native.waitForTask(\n\t\t\t\tfound.value,\n\t\t\t\tthis.#agentBudget(\n\t\t\t\t\tthis.#owner(owner),\n\t\t\t\t\tbudgetMs,\n\t\t\t\t\tknown !== undefined && this.#task(known).kind === \"command\",\n\t\t\t\t),\n\t\t\t),\n\t\t\t(lease) => this.#register(lease),\n\t\t\twaitErrors,\n\t\t);\n\t\treturn registered.ok ? this.observeTaskWait(registered.value) : registered;\n\t}\n\tasync foregroundTask(task: TaskLease, budgetMs?: number): Promise<C.Result<C.WaitOutcome, C.ForegroundError>> {\n\t\tconst state = this.#task(task);\n\t\tconst errors = [\"TaskTerminal\", \"OwnerClosing\", \"UnknownTask\", \"ObserverCancelled\"] as const;\n\t\tconst registered = mapped(\n\t\t\tthis.#native.foregroundTask(\n\t\t\t\tstate.native,\n\t\t\t\tstate.owner.host.native,\n\t\t\t\tthis.#agentBudget(state.owner, budgetMs, state.kind === \"command\"),\n\t\t\t),\n\t\t\t(lease) => this.#register(lease),\n\t\t\terrors,\n\t\t);\n\t\treturn registered.ok\n\t\t\t? mapped(await this.observeTaskWait(registered.value), (outcome) => outcome, errors)\n\t\t\t: registered;\n\t}\n\twaitId(wait: WaitLease): C.WaitId {\n\t\treturn this.#wait(wait).native.waitId as C.WaitId;\n\t}\n\tfindWait(id: C.WaitId): WaitLease | undefined {\n\t\treturn this.#waitRegistry.get(id);\n\t}\n\tobserveTaskWait(wait: WaitLease): Promise<C.Result<C.WaitOutcome, C.WaitError>> {\n\t\treturn this.#wait(wait).outcome;\n\t}\n\tyieldTaskWait(wait: WaitLease, reason: C.YieldReason): C.Result<C.WaitOutcome, C.YieldError> {\n\t\treturn mapped(this.#native.yieldTaskWait(this.#wait(wait).native, reason), waitOutcome, [\n\t\t\t\"UnknownWait\",\n\t\t\t\"StaleGeneration\",\n\t\t\t\"ObserverCancelled\",\n\t\t]);\n\t}\n\tdisposeTaskWait(wait: WaitLease): C.Result<void, C.WaitError> {\n\t\treturn mapped(this.#native.disposeTaskWait(this.#wait(wait).native), () => undefined, waitErrors);\n\t}\n\tasync initialObservation(\n\t\ttask: TaskLease,\n\t\tpolicy?: C.WaitPolicy,\n\t\tonRegistered?: (wait: WaitLease) => void,\n\t): Promise<C.Result<C.WaitOutcome, C.WaitError>> {\n\t\tconst state = this.#task(task);\n\t\tpolicy ??= state.kind === \"command\" ? { kind: \"foreground\" } : undefined;\n\t\tconst registered = mapped(\n\t\t\tthis.#native.waitForTask(\n\t\t\t\tstate.native,\n\t\t\t\tpolicy?.kind === \"foreground\"\n\t\t\t\t\t? this.#agentBudget(state.owner, policy.budgetMs, state.kind === \"command\")\n\t\t\t\t\t: undefined,\n\t\t\t\tstate.owner.host.native,\n\t\t\t),\n\t\t\t(lease) => this.#register(lease),\n\t\t\twaitErrors,\n\t\t);\n\t\tif (!registered.ok) return registered;\n\t\tonRegistered?.(registered.value);\n\t\tif (policy?.kind !== \"foreground\")\n\t\t\tthis.yieldTaskWait(registered.value, policy ? \"explicit\" : \"default-background\");\n\t\treturn this.observeTaskWait(registered.value);\n\t}\n\tasync cancelTask(task: TaskLease, cause: C.CancelCause): Promise<C.Result<C.CancelReceipt, C.CancelError>> {\n\t\tconst state = this.#task(task);\n\t\tconst result = mapped(this.#native.cancelTask(state.native, cause), cancelReceipt, [\n\t\t\t\"UnknownTask\",\n\t\t\t\"CleanupFailed\",\n\t\t]);\n\t\tif (result.ok && result.value.decision === \"cancellation-requested\") state.controller.abort(cause);\n\t\treturn result;\n\t}\n\tasync closeTaskOwner(\n\t\towner: OwnerLease,\n\t\tcause: C.OwnerCloseCause,\n\t): Promise<C.Result<C.OwnerCloseReceipt, C.CloseError>> {\n\t\tconst state = this.#owner(owner);\n\t\tconst closing = this.#native.closeTaskOwner(state.native, cause);\n\t\tfor (const task of state.tasks.values()) this.#task(task).controller.abort(\"owner-close\");\n\t\tconst result = mapped(\n\t\t\tawait closing,\n\t\t\t(receipt): C.OwnerCloseReceipt => ({\n\t\t\t\townerId: receipt.ownerId as C.OwnerId,\n\t\t\t\tstate: \"closed\",\n\t\t\t\ttasks: receipt.tasks.map(cancelReceipt),\n\t\t\t}),\n\t\t\t[\"CleanupFailed\", \"EnvironmentClosing\"],\n\t\t);\n\t\tif (result.ok)\n\t\t\tfor (const task of state.tasks.values()) {\n\t\t\t\tconst completed = await this.#task(task).execution;\n\t\t\t\tif (completed && !completed.ok)\n\t\t\t\t\tthrow new Error(`Runner protocol failed: ${completed.error.code}: ${completed.error.message}`);\n\t\t\t}\n\t\tif (result.ok)\n\t\t\tfor (const watch of state.watches) {\n\t\t\t\twatch.drain();\n\t\t\t\twatch.dispose(false);\n\t\t\t}\n\t\treturn result;\n\t}\n\t/**\n\t * The bounded stream carries only authentic deltas. Overflow/native reset publishes\n\t * snapshot/cursor then ends the current iterator, even with no surviving delta.\n\t * Reconcile on completion; obtain a new iterator on the same events iterable to\n\t * continue observing. Apply snapshots first and ignore deltas at/below their cursor.\n\t * onReconcile is optional; consumer failures never disable the fallback poll.\n\t */\n\twatchOwnerTasks(owner: OwnerLease, from?: C.Cursor): C.Result<TaskSubscription, C.WatchError> {\n\t\tconst state = this.#owner(owner);\n\t\tlet subscription: TaskSubscription | undefined;\n\t\treturn mapped(\n\t\t\tthis.#native.watchOwnerTasks(state.native, (hint) => subscription?.wake(hint), from),\n\t\t\t(initial) => {\n\t\t\t\tsubscription = new TaskSubscription(this.#native, initial, () => {\n\t\t\t\t\tif (subscription) state.watches.delete(subscription);\n\t\t\t\t});\n\t\t\t\tstate.watches.add(subscription);\n\t\t\t\treturn subscription;\n\t\t\t},\n\t\t\twatchErrors,\n\t\t);\n\t}\n\t#agentBudget(owner: OwnerState, budgetMs?: number, command = false): number | undefined {\n\t\tif (budgetMs !== undefined) return budgetMs;\n\t\tconst configuration = owner.host.binding.tasks?.wait;\n\t\tif (configuration?.kind === \"until-settled\") return undefined;\n\t\treturn command\n\t\t\t? (configuration?.commandBudgetMs ?? COMMAND_FOREGROUND_BUDGET_MS)\n\t\t\t: (configuration?.agentBudgetMs ?? DEFAULT_AGENT_WAIT_BUDGET_MS);\n\t}\n\t#register(lease: native.WaitLease): WaitLease {\n\t\tconst wait = new WaitCapability();\n\t\tObject.freeze(wait);\n\t\tconst id = lease.waitId as C.WaitId;\n\t\tthis.#waitRegistry.set(id, wait);\n\t\tconst outcome = this.#native\n\t\t\t.observeTaskWait(lease)\n\t\t\t.then((result) => mapped(result, waitOutcome, waitErrors))\n\t\t\t.finally(() => {\n\t\t\t\tthis.#waitRegistry.delete(id);\n\t\t\t});\n\t\tthis.#waits.set(wait, { native: lease, outcome });\n\t\treturn wait;\n\t}\n\t#host(host: HostSession): HostState {\n\t\tconst state = this.#hosts.get(host);\n\t\tif (!state) throw new TypeError(\"Foreign host capability\");\n\t\treturn state;\n\t}\n\t#owner(owner: OwnerLease): OwnerState {\n\t\tconst state = this.#owners.get(owner);\n\t\tif (!state) throw new TypeError(\"Foreign owner capability\");\n\t\treturn state;\n\t}\n\t#task(task: TaskLease): TaskState {\n\t\tconst state = this.#tasks.get(task);\n\t\tif (!state) throw new TypeError(\"Foreign task capability\");\n\t\treturn state;\n\t}\n\t#wait(wait: WaitLease): WaitState {\n\t\tconst state = this.#waits.get(wait);\n\t\tif (!state) throw new TypeError(\"Foreign wait capability\");\n\t\treturn state;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Failure, Result } from "./contracts.js";
|
|
2
|
+
import { type TaskLease } from "./supervisor.js";
|
|
3
|
+
export type TaskTranscriptItem = {
|
|
4
|
+
id: string;
|
|
5
|
+
kind: "prompt" | "assistant" | "tool-call" | "tool-result" | "response";
|
|
6
|
+
source: {
|
|
7
|
+
sessionId: string;
|
|
8
|
+
entryId: string;
|
|
9
|
+
contentIndex?: number;
|
|
10
|
+
};
|
|
11
|
+
toolCallId?: string;
|
|
12
|
+
};
|
|
13
|
+
export type TaskTranscriptPage = {
|
|
14
|
+
items: Array<TaskTranscriptItem>;
|
|
15
|
+
nextCursor?: string;
|
|
16
|
+
omittedEarlier: boolean;
|
|
17
|
+
};
|
|
18
|
+
export type TranscriptError = "UnknownTask" | "ScopeMismatch" | "TranscriptUnavailable";
|
|
19
|
+
/** References existing session entries; never copies message text into task history. */
|
|
20
|
+
export declare function readTaskTranscript(task: TaskLease, cursor?: string): Promise<Result<TaskTranscriptPage, Failure<TranscriptError>>>;
|
|
21
|
+
/** Synchronous history read lets an in-process viewer subscribe without an await gap. */
|
|
22
|
+
export declare function readTaskTranscriptSnapshot(task: TaskLease, cursor?: string): Result<TaskTranscriptPage, Failure<TranscriptError>>;
|
|
23
|
+
//# sourceMappingURL=transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/transcript.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,KAAK,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAEvE,MAAM,MAAM,kBAAkB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,UAAU,CAAC;IACxE,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG;IAChC,KAAK,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;CACxB,CAAC;AACF,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,eAAe,GAAG,uBAAuB,CAAC;AAGxF,wFAAwF;AACxF,wBAAsB,kBAAkB,CACvC,IAAI,EAAE,SAAS,EACf,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAE/D;AAED,yFAAyF;AACzF,wBAAgB,0BAA0B,CACzC,IAAI,EAAE,SAAS,EACf,MAAM,CAAC,EAAE,MAAM,GACb,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CA0DtD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { taskTranscriptSource } from "./supervisor.js";
|
|
3
|
+
const PAGE_ITEMS = 100;
|
|
4
|
+
/** References existing session entries; never copies message text into task history. */
|
|
5
|
+
export async function readTaskTranscript(task, cursor) {
|
|
6
|
+
return readTaskTranscriptSnapshot(task, cursor);
|
|
7
|
+
}
|
|
8
|
+
/** Synchronous history read lets an in-process viewer subscribe without an await gap. */
|
|
9
|
+
export function readTaskTranscriptSnapshot(task, cursor) {
|
|
10
|
+
const bound = taskTranscriptSource(task);
|
|
11
|
+
if (!bound.ok)
|
|
12
|
+
return bound;
|
|
13
|
+
const { session, taskId } = bound.value;
|
|
14
|
+
const sessionId = session.getSessionId();
|
|
15
|
+
const scope = `${taskId}\n${sessionId}\n`;
|
|
16
|
+
let before;
|
|
17
|
+
if (cursor !== undefined) {
|
|
18
|
+
const decoded = Buffer.from(cursor, "base64url").toString("utf8");
|
|
19
|
+
if (!decoded.startsWith(scope)) {
|
|
20
|
+
return {
|
|
21
|
+
ok: false,
|
|
22
|
+
error: { code: "ScopeMismatch", message: "Transcript cursor belongs to another task or session" },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
before = decoded.slice(scope.length);
|
|
26
|
+
}
|
|
27
|
+
const items = [];
|
|
28
|
+
const seen = new Set();
|
|
29
|
+
const add = (item) => {
|
|
30
|
+
if (seen.has(item.id))
|
|
31
|
+
return;
|
|
32
|
+
seen.add(item.id);
|
|
33
|
+
items.push(item);
|
|
34
|
+
};
|
|
35
|
+
for (const entry of session.getEntries()) {
|
|
36
|
+
if (entry.type !== "message")
|
|
37
|
+
continue;
|
|
38
|
+
const message = entry.message;
|
|
39
|
+
const source = { sessionId, entryId: entry.id };
|
|
40
|
+
if (message.role === "user") {
|
|
41
|
+
add({ id: entry.id, kind: "prompt", source });
|
|
42
|
+
}
|
|
43
|
+
else if (message.role === "toolResult") {
|
|
44
|
+
add({ id: entry.id, kind: "tool-result", source, toolCallId: message.toolCallId });
|
|
45
|
+
}
|
|
46
|
+
else if (message.role === "assistant") {
|
|
47
|
+
for (const [contentIndex, block] of message.content.entries()) {
|
|
48
|
+
const identity = { id: `${entry.id}:${contentIndex}`, source: { ...source, contentIndex } };
|
|
49
|
+
if (block.type === "toolCall") {
|
|
50
|
+
add({ ...identity, kind: "tool-call", toolCallId: block.id });
|
|
51
|
+
}
|
|
52
|
+
else if (block.type === "text") {
|
|
53
|
+
add({ ...identity, kind: message.stopReason === "stop" ? "response" : "assistant" });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (items.length === 0) {
|
|
59
|
+
return { ok: false, error: { code: "TranscriptUnavailable", message: "Transcript unavailable" } };
|
|
60
|
+
}
|
|
61
|
+
const found = before === undefined ? items.length : items.findIndex((item) => item.id === before);
|
|
62
|
+
const end = found < 0 ? items.length : found;
|
|
63
|
+
const start = Math.max(0, end - PAGE_ITEMS);
|
|
64
|
+
const page = items.slice(start, end);
|
|
65
|
+
return {
|
|
66
|
+
ok: true,
|
|
67
|
+
value: {
|
|
68
|
+
items: page,
|
|
69
|
+
omittedEarlier: start > 0,
|
|
70
|
+
...(start > 0 ? { nextCursor: Buffer.from(`${scope}${page[0].id}`).toString("base64url") } : {}),
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../src/core/tasks/transcript.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport type { Failure, Result } from \"./contracts.js\";\nimport { type TaskLease, taskTranscriptSource } from \"./supervisor.js\";\n\nexport type TaskTranscriptItem = {\n\tid: string;\n\tkind: \"prompt\" | \"assistant\" | \"tool-call\" | \"tool-result\" | \"response\";\n\tsource: { sessionId: string; entryId: string; contentIndex?: number };\n\ttoolCallId?: string;\n};\nexport type TaskTranscriptPage = {\n\titems: Array<TaskTranscriptItem>;\n\tnextCursor?: string;\n\tomittedEarlier: boolean;\n};\nexport type TranscriptError = \"UnknownTask\" | \"ScopeMismatch\" | \"TranscriptUnavailable\";\nconst PAGE_ITEMS = 100;\n\n/** References existing session entries; never copies message text into task history. */\nexport async function readTaskTranscript(\n\ttask: TaskLease,\n\tcursor?: string,\n): Promise<Result<TaskTranscriptPage, Failure<TranscriptError>>> {\n\treturn readTaskTranscriptSnapshot(task, cursor);\n}\n\n/** Synchronous history read lets an in-process viewer subscribe without an await gap. */\nexport function readTaskTranscriptSnapshot(\n\ttask: TaskLease,\n\tcursor?: string,\n): Result<TaskTranscriptPage, Failure<TranscriptError>> {\n\tconst bound = taskTranscriptSource(task);\n\tif (!bound.ok) return bound;\n\tconst { session, taskId } = bound.value;\n\tconst sessionId = session.getSessionId();\n\tconst scope = `${taskId}\\n${sessionId}\\n`;\n\tlet before: string | undefined;\n\tif (cursor !== undefined) {\n\t\tconst decoded = Buffer.from(cursor, \"base64url\").toString(\"utf8\");\n\t\tif (!decoded.startsWith(scope)) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: { code: \"ScopeMismatch\", message: \"Transcript cursor belongs to another task or session\" },\n\t\t\t};\n\t\t}\n\t\tbefore = decoded.slice(scope.length);\n\t}\n\tconst items: TaskTranscriptItem[] = [];\n\tconst seen = new Set<string>();\n\tconst add = (item: TaskTranscriptItem) => {\n\t\tif (seen.has(item.id)) return;\n\t\tseen.add(item.id);\n\t\titems.push(item);\n\t};\n\tfor (const entry of session.getEntries()) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tconst message = entry.message;\n\t\tconst source = { sessionId, entryId: entry.id };\n\t\tif (message.role === \"user\") {\n\t\t\tadd({ id: entry.id, kind: \"prompt\", source });\n\t\t} else if (message.role === \"toolResult\") {\n\t\t\tadd({ id: entry.id, kind: \"tool-result\", source, toolCallId: message.toolCallId });\n\t\t} else if (message.role === \"assistant\") {\n\t\t\tfor (const [contentIndex, block] of message.content.entries()) {\n\t\t\t\tconst identity = { id: `${entry.id}:${contentIndex}`, source: { ...source, contentIndex } };\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tadd({ ...identity, kind: \"tool-call\", toolCallId: block.id });\n\t\t\t\t} else if (block.type === \"text\") {\n\t\t\t\t\tadd({ ...identity, kind: message.stopReason === \"stop\" ? \"response\" : \"assistant\" });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (items.length === 0) {\n\t\treturn { ok: false, error: { code: \"TranscriptUnavailable\", message: \"Transcript unavailable\" } };\n\t}\n\tconst found = before === undefined ? items.length : items.findIndex((item) => item.id === before);\n\tconst end = found < 0 ? items.length : found;\n\tconst start = Math.max(0, end - PAGE_ITEMS);\n\tconst page = items.slice(start, end);\n\treturn {\n\t\tok: true,\n\t\tvalue: {\n\t\t\titems: page,\n\t\t\tomittedEarlier: start > 0,\n\t\t\t...(start > 0 ? { nextCursor: Buffer.from(`${scope}${page[0].id}`).toString(\"base64url\") } : {}),\n\t\t},\n\t};\n}\n"]}
|
|
@@ -25,8 +25,8 @@ import type { WrappingSelectItem } from "./view/components/wrapping-select.ts";
|
|
|
25
25
|
export declare const QUESTIONNAIRE_OVERLAY_OPTIONS: OverlayOptions;
|
|
26
26
|
export declare function buildItemsForQuestion(question: QuestionData): WrappingSelectItem[];
|
|
27
27
|
export declare const askUserQuestionToolSystemPromptContribution: Readonly<{
|
|
28
|
-
readonly snippet: "Ask
|
|
29
|
-
readonly guidelines: readonly ["
|
|
28
|
+
readonly snippet: "Ask all user questions through this tool, including clarifications and approvals; up to 4 questions with 2-4 options each";
|
|
29
|
+
readonly guidelines: readonly ["When ask_user_question or an equivalent question tool is available, all questions to the user must use that tool instead of plain text, including clarifications, preferences, confirmations, approvals, and permission to proceed. Prefer ask_user_question when available. In these sessions, do not end a progress update or final response with a prose-only question such as 'Proceed?'.", "Ask only when a decision is needed; do not seek approval again for already-authorized work. For a confirmation, put the concrete action and its scope in the question and offer explicit proceed and decline options. A cancelled or unanswered question is not approval.", "Each question MUST have 2-4 options. Every option requires a concise label (1-5 words) and a description explaining what the choice means or its trade-offs. The user can additionally type a custom answer (\"Type something.\" row is appended automatically to single-select questions) or pick \"Chat about this\" to abandon the questionnaire.", "Set multiSelect: true when multiple answers are valid; this suppresses the \"Type something.\" row. Provide an options[].preview markdown string when an option benefits from richer side-by-side context (mockups, code snippets, diagrams, configs) — single-select only. NOTE: any non-empty preview on a single-select question ALSO suppresses the \"Type something.\" row (no room in the side-by-side layout); \"Chat about this\" remains the escape hatch. If you recommend a specific option, make it the first option and append \"(Recommended)\" to its label.", "Do not stack multiple ask_user_question calls back-to-back — group all clarifying questions into one invocation.", "If ask_user_question is unavailable, use an equivalent available question tool with its supported schema. If no usable question tool is available, continue autonomously using best judgment and state evidence-backed assumptions. Tool unavailability alone is not a blocker; preserve safety and authorization constraints."];
|
|
30
30
|
}>;
|
|
31
31
|
export declare function createAskUserQuestionToolDefinition(options?: {
|
|
32
32
|
readonly chatAsOption?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-user-question.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/ask-user-question/ask-user-question.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIhE,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAIN,KAAK,YAAY,EAGjB,oBAAoB,EACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAI/E;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,6BAA6B,EAAE,cAG3C,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,GAAG,kBAAkB,EAAE,CAWlF;AAED,eAAO,MAAM,2CAA2C;;;
|
|
1
|
+
{"version":3,"file":"ask-user-question.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/ask-user-question/ask-user-question.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIhE,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAIN,KAAK,YAAY,EAGjB,oBAAoB,EACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAI/E;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,6BAA6B,EAAE,cAG3C,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,GAAG,kBAAkB,EAAE,CAWlF;AAED,eAAO,MAAM,2CAA2C;;;EAU7C,CAAC;AAEZ,wBAAgB,mCAAmC,CAAC,OAAO,CAAC,EAAE;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CAChC,GAAG,cAAc,CAAC,OAAO,oBAAoB,EAAE,OAAO,CAAC,CAqFvD;AAED,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -42,12 +42,14 @@ export function buildItemsForQuestion(question) {
|
|
|
42
42
|
return items;
|
|
43
43
|
}
|
|
44
44
|
export const askUserQuestionToolSystemPromptContribution = Object.freeze({
|
|
45
|
-
snippet: `Ask
|
|
45
|
+
snippet: `Ask all user questions through this tool, including clarifications and approvals; up to ${MAX_QUESTIONS} questions with ${MIN_OPTIONS}-${MAX_OPTIONS} options each`,
|
|
46
46
|
guidelines: Object.freeze([
|
|
47
|
-
|
|
47
|
+
"When ask_user_question or an equivalent question tool is available, all questions to the user must use that tool instead of plain text, including clarifications, preferences, confirmations, approvals, and permission to proceed. Prefer ask_user_question when available. In these sessions, do not end a progress update or final response with a prose-only question such as 'Proceed?'.",
|
|
48
|
+
"Ask only when a decision is needed; do not seek approval again for already-authorized work. For a confirmation, put the concrete action and its scope in the question and offer explicit proceed and decline options. A cancelled or unanswered question is not approval.",
|
|
48
49
|
`Each question MUST have ${MIN_OPTIONS}-${MAX_OPTIONS} options. Every option requires a concise label (1-5 words) and a description explaining what the choice means or its trade-offs. The user can additionally type a custom answer ("Type something." row is appended automatically to single-select questions) or pick "Chat about this" to abandon the questionnaire.`,
|
|
49
50
|
`Set multiSelect: true when multiple answers are valid; this suppresses the "Type something." row. Provide an options[].preview markdown string when an option benefits from richer side-by-side context (mockups, code snippets, diagrams, configs) — single-select only. NOTE: any non-empty preview on a single-select question ALSO suppresses the "Type something." row (no room in the side-by-side layout); "Chat about this" remains the escape hatch. If you recommend a specific option, make it the first option and append "(Recommended)" to its label.`,
|
|
50
51
|
"Do not stack multiple ask_user_question calls back-to-back — group all clarifying questions into one invocation.",
|
|
52
|
+
"If ask_user_question is unavailable, use an equivalent available question tool with its supported schema. If no usable question tool is available, continue autonomously using best judgment and state evidence-backed assumptions. Tool unavailability alone is not a blocker; preserve safety and authorization constraints.",
|
|
51
53
|
]),
|
|
52
54
|
});
|
|
53
55
|
export function createAskUserQuestionToolDefinition(options) {
|
|
@@ -55,13 +57,15 @@ export function createAskUserQuestionToolDefinition(options) {
|
|
|
55
57
|
return {
|
|
56
58
|
name: "ask_user_question",
|
|
57
59
|
label: "Ask User Question",
|
|
58
|
-
description: `Ask the user one or more structured questions during execution. Use when you need to:
|
|
60
|
+
description: `Ask the user one or more structured questions during execution. When ask_user_question or an equivalent question tool is available, all questions to the user must use that tool instead of plain text, including a short 'Proceed?' confirmation. Prefer ask_user_question when available. Use when you need to:
|
|
59
61
|
1. Gather user preferences or requirements
|
|
60
62
|
2. Clarify ambiguous instructions
|
|
61
63
|
3. Get decisions on implementation choices as you work
|
|
62
|
-
4.
|
|
64
|
+
4. Request confirmation, approval, or permission to proceed
|
|
63
65
|
|
|
64
66
|
Usage notes:
|
|
67
|
+
- Ask only for decisions that are needed; do not re-request existing authorization. State the exact action and scope, with explicit proceed and decline options for confirmations. A cancelled or unanswered question is not approval.
|
|
68
|
+
- If ask_user_question is unavailable, use an equivalent available question tool with its supported schema. If no usable question tool is available, continue autonomously using best judgment and state evidence-backed assumptions. Tool unavailability alone is not a blocker; preserve safety and authorization constraints.
|
|
65
69
|
- Users will always be able to type a custom answer ("Type something." row is appended automatically to every single-select question) or pick "Chat about this" to abandon the questionnaire and continue in free-form conversation. Do NOT author "Other" / "Type something." / "Chat about this" labels yourself — duplicates are rejected at runtime.
|
|
66
70
|
- Use multiSelect: true to allow multiple answers to be selected for a question. The "Type something." row is suppressed on multi-select questions, and is ALSO suppressed on single-select questions where any option carries a \`preview\` (the side-by-side layout has no room for inline custom text — "Chat about this" remains as the free-form escape hatch).
|
|
67
71
|
- If you recommend a specific option, make that the first option in the list and add "(Recommended)" at the end of the label.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-user-question.js","sourceRoot":"","sources":["../../../../src/core/tools/ask-user-question/ask-user-question.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OverlayOptions } from \"@earendil-works/pi-tui\";\nimport { experimentalToolSamplingProperty } from \"../../experimental.ts\";\nimport type { ToolDefinition } from \"../../extensions/types.ts\";\nimport { loadConfig, validateGuidanceFields } from \"./config.ts\";\nimport { QuestionnaireSession } from \"./state/questionnaire-session.ts\";\nimport { ROW_INTENT_META, sentinelsToAppend } from \"./state/row-intent.ts\";\nimport { buildQuestionnaireResponse, buildToolResult } from \"./tool/response-envelope.ts\";\nimport {\n\tMAX_OPTIONS,\n\tMAX_QUESTIONS,\n\tMIN_OPTIONS,\n\ttype QuestionData,\n\ttype QuestionnaireResult,\n\ttype QuestionParams,\n\tQuestionParamsSchema,\n} from \"./tool/types.ts\";\nimport { validateQuestionnaire } from \"./tool/validate-questionnaire.ts\";\nimport type { WrappingSelectItem } from \"./view/components/wrapping-select.ts\";\n\nconst ERROR_NO_UI = \"Error: UI not available (running in non-interactive mode)\";\n\n/**\n * Mount options for the blocking questionnaire (#2378).\n *\n * The dialog used to mount inline, inside the fullscreen dock, where it is a\n * flex sibling of the transcript `ScrollView`. A tall side-by-side dialog then\n * took the transcript's rows: on a 40-row terminal the transcript viewport\n * collapsed from 34 rows to 6, and pi-tui derives its page step from that\n * viewport (`viewportHeight - PAGE_SCROLL_OVERLAP`), so PageUp crawled two\n * lines at a time through a six-line window.\n *\n * A bottom-anchored overlay is composited over the bottom rows instead of being\n * measured into the layout, so the transcript keeps its full viewport height\n * and its full page step. `reserveTranscriptRows` is what makes those rows\n * observable rather than merely addressable: the host bounds this overlay so a\n * transcript strip always survives, and extends the transcript's scroll extent\n * by the rows the overlay still covers, so the newest output can be raised into\n * that strip. No `maxHeight` — the host's bound is tighter, and letting pi-tui\n * slice as well would make the measured overlay height wrong.\n */\nexport const QUESTIONNAIRE_OVERLAY_OPTIONS: OverlayOptions = {\n\tanchor: \"bottom-center\",\n\twidth: \"100%\",\n};\n\nexport function buildItemsForQuestion(question: QuestionData): WrappingSelectItem[] {\n\tconst items: WrappingSelectItem[] = question.options.map((o) => ({\n\t\tkind: \"option\",\n\t\tlabel: o.label,\n\t\tdescription: o.description,\n\t}));\n\tconst hasAnyPreview = question.options.some((o) => typeof o.preview === \"string\" && o.preview.length > 0);\n\tfor (const kind of sentinelsToAppend(question, hasAnyPreview)) {\n\t\titems.push({ kind, label: ROW_INTENT_META[kind].label });\n\t}\n\treturn items;\n}\n\nexport const askUserQuestionToolSystemPromptContribution = Object.freeze({\n\tsnippet: `Ask the user up to ${MAX_QUESTIONS} structured questions (${MIN_OPTIONS}-${MAX_OPTIONS} options each) when requirements are ambiguous`,\n\tguidelines: Object.freeze([\n\t\t`Use ask_user_question whenever the user's request is underspecified and you cannot proceed without concrete decisions — you can ask up to ${MAX_QUESTIONS} questions per invocation.`,\n\t\t`Each question MUST have ${MIN_OPTIONS}-${MAX_OPTIONS} options. Every option requires a concise label (1-5 words) and a description explaining what the choice means or its trade-offs. The user can additionally type a custom answer (\"Type something.\" row is appended automatically to single-select questions) or pick \"Chat about this\" to abandon the questionnaire.`,\n\t\t`Set multiSelect: true when multiple answers are valid; this suppresses the \"Type something.\" row. Provide an options[].preview markdown string when an option benefits from richer side-by-side context (mockups, code snippets, diagrams, configs) — single-select only. NOTE: any non-empty preview on a single-select question ALSO suppresses the \"Type something.\" row (no room in the side-by-side layout); \"Chat about this\" remains the escape hatch. If you recommend a specific option, make it the first option and append \"(Recommended)\" to its label.`,\n\t\t\"Do not stack multiple ask_user_question calls back-to-back — group all clarifying questions into one invocation.\",\n\t] as const),\n} as const);\n\nexport function createAskUserQuestionToolDefinition(options?: {\n\treadonly chatAsOption?: boolean;\n}): ToolDefinition<typeof QuestionParamsSchema, unknown> {\n\tconst guidance = validateGuidanceFields(loadConfig().guidance);\n\treturn {\n\t\tname: \"ask_user_question\",\n\t\tlabel: \"Ask User Question\",\n\t\tdescription: `Ask the user one or more structured questions during execution. Use when you need to:\n1. Gather user preferences or requirements\n2. Clarify ambiguous instructions\n3. Get decisions on implementation choices as you work\n4. Offer choices to the user about what direction to take\n\nUsage notes:\n- Users will always be able to type a custom answer (\"Type something.\" row is appended automatically to every single-select question) or pick \"Chat about this\" to abandon the questionnaire and continue in free-form conversation. Do NOT author \"Other\" / \"Type something.\" / \"Chat about this\" labels yourself — duplicates are rejected at runtime.\n- Use multiSelect: true to allow multiple answers to be selected for a question. The \"Type something.\" row is suppressed on multi-select questions, and is ALSO suppressed on single-select questions where any option carries a \\`preview\\` (the side-by-side layout has no room for inline custom text — \"Chat about this\" remains as the free-form escape hatch).\n- If you recommend a specific option, make that the first option in the list and add \"(Recommended)\" at the end of the label.\n\nPreview feature:\nUse the optional \\`preview\\` field on options when presenting concrete artifacts that users need to visually compare:\n- ASCII mockups of UI layouts or components\n- Code snippets showing different implementations\n- Diagram variations\n- Configuration examples\n\nPreview content is rendered as markdown in a monospace box. Multi-line text with newlines is supported. When any option has a preview, the UI switches to a side-by-side layout with a vertical option list on the left and preview on the right. Do not use previews for simple preference questions where labels and descriptions suffice. Note: previews are only supported for single-select questions (not multiSelect).`,\n\t\tpromptSnippet: guidance.promptSnippet ?? askUserQuestionToolSystemPromptContribution.snippet,\n\t\tpromptGuidelines: guidance.promptGuidelines ?? [...askUserQuestionToolSystemPromptContribution.guidelines],\n\t\t...experimentalToolSamplingProperty(),\n\t\tparameters: QuestionParamsSchema,\n\n\t\tasync execute(_toolCallId, params, signal, _onUpdate, ctx) {\n\t\t\tconst typed = params as unknown as QuestionParams;\n\t\t\tif (!ctx.hasUI) return buildToolResult(ERROR_NO_UI, { answers: [], cancelled: true, error: \"no_ui\" });\n\n\t\t\tconst validation = validateQuestionnaire(typed);\n\t\t\tif (!validation.ok) {\n\t\t\t\treturn buildToolResult(validation.message, {\n\t\t\t\t\tanswers: [],\n\t\t\t\t\tcancelled: true,\n\t\t\t\t\terror: validation.error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst itemsByTab: WrappingSelectItem[][] = typed.questions.map((q) => buildItemsForQuestion(q));\n\n\t\t\t// Suspend the animated working loader for the lifetime of the blocking dialog.\n\t\t\t//\n\t\t\t// The loader ticks every ~88ms and calls `requestRender()` on each frame, and it\n\t\t\t// conveys nothing while we are blocked on human input. Hiding it for the duration\n\t\t\t// keeps the frame behind the dialog static and avoids the differential renderer\n\t\t\t// falling back to a full clear+replay (`\\x1b[2J\\x1b[H\\x1b[3J`) on every tick.\n\t\t\t// Restored once the dialog closes (on every path).\n\t\t\t//\n\t\t\t// Guarded: some hosts (e.g. the workflow stage-UI broker) pass a minimal UI\n\t\t\t// context that only implements `custom`, so treat a missing loader control as a\n\t\t\t// no-op rather than throwing.\n\t\t\tctx.ui.setWorkingVisible?.(false);\n\t\t\ttry {\n\t\t\t\tconst result = await ctx.ui.custom<QuestionnaireResult>(\n\t\t\t\t\t(tui, theme, _kb, done) => {\n\t\t\t\t\t\tconst session = new QuestionnaireSession({\n\t\t\t\t\t\t\ttui,\n\t\t\t\t\t\t\ttheme,\n\t\t\t\t\t\t\tparams: typed,\n\t\t\t\t\t\t\titemsByTab,\n\t\t\t\t\t\t\tdone,\n\t\t\t\t\t\t\t...(options?.chatAsOption === true ? { chatAsOption: true } : {}),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn session.component;\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\toverlay: true,\n\t\t\t\t\t\treserveTranscriptRows: true,\n\t\t\t\t\t\toverlayOptions: QUESTIONNAIRE_OVERLAY_OPTIONS,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\treturn buildQuestionnaireResponse(result, typed);\n\t\t\t} finally {\n\t\t\t\tctx.ui.setWorkingVisible?.(true);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { buildQuestionnaireResponse, buildToolResult };\n"]}
|
|
1
|
+
{"version":3,"file":"ask-user-question.js","sourceRoot":"","sources":["../../../../src/core/tools/ask-user-question/ask-user-question.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OverlayOptions } from \"@earendil-works/pi-tui\";\nimport { experimentalToolSamplingProperty } from \"../../experimental.ts\";\nimport type { ToolDefinition } from \"../../extensions/types.ts\";\nimport { loadConfig, validateGuidanceFields } from \"./config.ts\";\nimport { QuestionnaireSession } from \"./state/questionnaire-session.ts\";\nimport { ROW_INTENT_META, sentinelsToAppend } from \"./state/row-intent.ts\";\nimport { buildQuestionnaireResponse, buildToolResult } from \"./tool/response-envelope.ts\";\nimport {\n\tMAX_OPTIONS,\n\tMAX_QUESTIONS,\n\tMIN_OPTIONS,\n\ttype QuestionData,\n\ttype QuestionnaireResult,\n\ttype QuestionParams,\n\tQuestionParamsSchema,\n} from \"./tool/types.ts\";\nimport { validateQuestionnaire } from \"./tool/validate-questionnaire.ts\";\nimport type { WrappingSelectItem } from \"./view/components/wrapping-select.ts\";\n\nconst ERROR_NO_UI = \"Error: UI not available (running in non-interactive mode)\";\n\n/**\n * Mount options for the blocking questionnaire (#2378).\n *\n * The dialog used to mount inline, inside the fullscreen dock, where it is a\n * flex sibling of the transcript `ScrollView`. A tall side-by-side dialog then\n * took the transcript's rows: on a 40-row terminal the transcript viewport\n * collapsed from 34 rows to 6, and pi-tui derives its page step from that\n * viewport (`viewportHeight - PAGE_SCROLL_OVERLAP`), so PageUp crawled two\n * lines at a time through a six-line window.\n *\n * A bottom-anchored overlay is composited over the bottom rows instead of being\n * measured into the layout, so the transcript keeps its full viewport height\n * and its full page step. `reserveTranscriptRows` is what makes those rows\n * observable rather than merely addressable: the host bounds this overlay so a\n * transcript strip always survives, and extends the transcript's scroll extent\n * by the rows the overlay still covers, so the newest output can be raised into\n * that strip. No `maxHeight` — the host's bound is tighter, and letting pi-tui\n * slice as well would make the measured overlay height wrong.\n */\nexport const QUESTIONNAIRE_OVERLAY_OPTIONS: OverlayOptions = {\n\tanchor: \"bottom-center\",\n\twidth: \"100%\",\n};\n\nexport function buildItemsForQuestion(question: QuestionData): WrappingSelectItem[] {\n\tconst items: WrappingSelectItem[] = question.options.map((o) => ({\n\t\tkind: \"option\",\n\t\tlabel: o.label,\n\t\tdescription: o.description,\n\t}));\n\tconst hasAnyPreview = question.options.some((o) => typeof o.preview === \"string\" && o.preview.length > 0);\n\tfor (const kind of sentinelsToAppend(question, hasAnyPreview)) {\n\t\titems.push({ kind, label: ROW_INTENT_META[kind].label });\n\t}\n\treturn items;\n}\n\nexport const askUserQuestionToolSystemPromptContribution = Object.freeze({\n\tsnippet: `Ask all user questions through this tool, including clarifications and approvals; up to ${MAX_QUESTIONS} questions with ${MIN_OPTIONS}-${MAX_OPTIONS} options each`,\n\tguidelines: Object.freeze([\n\t\t\"When ask_user_question or an equivalent question tool is available, all questions to the user must use that tool instead of plain text, including clarifications, preferences, confirmations, approvals, and permission to proceed. Prefer ask_user_question when available. In these sessions, do not end a progress update or final response with a prose-only question such as 'Proceed?'.\",\n\t\t\"Ask only when a decision is needed; do not seek approval again for already-authorized work. For a confirmation, put the concrete action and its scope in the question and offer explicit proceed and decline options. A cancelled or unanswered question is not approval.\",\n\t\t`Each question MUST have ${MIN_OPTIONS}-${MAX_OPTIONS} options. Every option requires a concise label (1-5 words) and a description explaining what the choice means or its trade-offs. The user can additionally type a custom answer (\"Type something.\" row is appended automatically to single-select questions) or pick \"Chat about this\" to abandon the questionnaire.`,\n\t\t`Set multiSelect: true when multiple answers are valid; this suppresses the \"Type something.\" row. Provide an options[].preview markdown string when an option benefits from richer side-by-side context (mockups, code snippets, diagrams, configs) — single-select only. NOTE: any non-empty preview on a single-select question ALSO suppresses the \"Type something.\" row (no room in the side-by-side layout); \"Chat about this\" remains the escape hatch. If you recommend a specific option, make it the first option and append \"(Recommended)\" to its label.`,\n\t\t\"Do not stack multiple ask_user_question calls back-to-back — group all clarifying questions into one invocation.\",\n\t\t\"If ask_user_question is unavailable, use an equivalent available question tool with its supported schema. If no usable question tool is available, continue autonomously using best judgment and state evidence-backed assumptions. Tool unavailability alone is not a blocker; preserve safety and authorization constraints.\",\n\t] as const),\n} as const);\n\nexport function createAskUserQuestionToolDefinition(options?: {\n\treadonly chatAsOption?: boolean;\n}): ToolDefinition<typeof QuestionParamsSchema, unknown> {\n\tconst guidance = validateGuidanceFields(loadConfig().guidance);\n\treturn {\n\t\tname: \"ask_user_question\",\n\t\tlabel: \"Ask User Question\",\n\t\tdescription: `Ask the user one or more structured questions during execution. When ask_user_question or an equivalent question tool is available, all questions to the user must use that tool instead of plain text, including a short 'Proceed?' confirmation. Prefer ask_user_question when available. Use when you need to:\n1. Gather user preferences or requirements\n2. Clarify ambiguous instructions\n3. Get decisions on implementation choices as you work\n4. Request confirmation, approval, or permission to proceed\n\nUsage notes:\n- Ask only for decisions that are needed; do not re-request existing authorization. State the exact action and scope, with explicit proceed and decline options for confirmations. A cancelled or unanswered question is not approval.\n- If ask_user_question is unavailable, use an equivalent available question tool with its supported schema. If no usable question tool is available, continue autonomously using best judgment and state evidence-backed assumptions. Tool unavailability alone is not a blocker; preserve safety and authorization constraints.\n- Users will always be able to type a custom answer (\"Type something.\" row is appended automatically to every single-select question) or pick \"Chat about this\" to abandon the questionnaire and continue in free-form conversation. Do NOT author \"Other\" / \"Type something.\" / \"Chat about this\" labels yourself — duplicates are rejected at runtime.\n- Use multiSelect: true to allow multiple answers to be selected for a question. The \"Type something.\" row is suppressed on multi-select questions, and is ALSO suppressed on single-select questions where any option carries a \\`preview\\` (the side-by-side layout has no room for inline custom text — \"Chat about this\" remains as the free-form escape hatch).\n- If you recommend a specific option, make that the first option in the list and add \"(Recommended)\" at the end of the label.\n\nPreview feature:\nUse the optional \\`preview\\` field on options when presenting concrete artifacts that users need to visually compare:\n- ASCII mockups of UI layouts or components\n- Code snippets showing different implementations\n- Diagram variations\n- Configuration examples\n\nPreview content is rendered as markdown in a monospace box. Multi-line text with newlines is supported. When any option has a preview, the UI switches to a side-by-side layout with a vertical option list on the left and preview on the right. Do not use previews for simple preference questions where labels and descriptions suffice. Note: previews are only supported for single-select questions (not multiSelect).`,\n\t\tpromptSnippet: guidance.promptSnippet ?? askUserQuestionToolSystemPromptContribution.snippet,\n\t\tpromptGuidelines: guidance.promptGuidelines ?? [...askUserQuestionToolSystemPromptContribution.guidelines],\n\t\t...experimentalToolSamplingProperty(),\n\t\tparameters: QuestionParamsSchema,\n\n\t\tasync execute(_toolCallId, params, signal, _onUpdate, ctx) {\n\t\t\tconst typed = params as unknown as QuestionParams;\n\t\t\tif (!ctx.hasUI) return buildToolResult(ERROR_NO_UI, { answers: [], cancelled: true, error: \"no_ui\" });\n\n\t\t\tconst validation = validateQuestionnaire(typed);\n\t\t\tif (!validation.ok) {\n\t\t\t\treturn buildToolResult(validation.message, {\n\t\t\t\t\tanswers: [],\n\t\t\t\t\tcancelled: true,\n\t\t\t\t\terror: validation.error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst itemsByTab: WrappingSelectItem[][] = typed.questions.map((q) => buildItemsForQuestion(q));\n\n\t\t\t// Suspend the animated working loader for the lifetime of the blocking dialog.\n\t\t\t//\n\t\t\t// The loader ticks every ~88ms and calls `requestRender()` on each frame, and it\n\t\t\t// conveys nothing while we are blocked on human input. Hiding it for the duration\n\t\t\t// keeps the frame behind the dialog static and avoids the differential renderer\n\t\t\t// falling back to a full clear+replay (`\\x1b[2J\\x1b[H\\x1b[3J`) on every tick.\n\t\t\t// Restored once the dialog closes (on every path).\n\t\t\t//\n\t\t\t// Guarded: some hosts (e.g. the workflow stage-UI broker) pass a minimal UI\n\t\t\t// context that only implements `custom`, so treat a missing loader control as a\n\t\t\t// no-op rather than throwing.\n\t\t\tctx.ui.setWorkingVisible?.(false);\n\t\t\ttry {\n\t\t\t\tconst result = await ctx.ui.custom<QuestionnaireResult>(\n\t\t\t\t\t(tui, theme, _kb, done) => {\n\t\t\t\t\t\tconst session = new QuestionnaireSession({\n\t\t\t\t\t\t\ttui,\n\t\t\t\t\t\t\ttheme,\n\t\t\t\t\t\t\tparams: typed,\n\t\t\t\t\t\t\titemsByTab,\n\t\t\t\t\t\t\tdone,\n\t\t\t\t\t\t\t...(options?.chatAsOption === true ? { chatAsOption: true } : {}),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn session.component;\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\toverlay: true,\n\t\t\t\t\t\treserveTranscriptRows: true,\n\t\t\t\t\t\toverlayOptions: QUESTIONNAIRE_OVERLAY_OPTIONS,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\treturn buildQuestionnaireResponse(result, typed);\n\t\t\t} finally {\n\t\t\t\tctx.ui.setWorkingVisible?.(true);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { buildQuestionnaireResponse, buildToolResult };\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Input } from "@earendil-works/pi-tui";
|
|
2
|
-
import { type Theme } from "../../../../modes/interactive/theme/theme.
|
|
2
|
+
import { type Theme } from "../../../../modes/interactive/theme/theme.js";
|
|
3
3
|
import type { QuestionData } from "../tool/types.ts";
|
|
4
4
|
import type { WrappingSelectItem } from "../view/components/wrapping-select.ts";
|
|
5
5
|
import { QuestionnairePropsAdapter } from "../view/props-adapter.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-questionnaire.js","sourceRoot":"","sources":["../../../../../src/core/tools/ask-user-question/state/build-questionnaire.ts"],"names":[],"mappings":"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","sourcesContent":["import { Input } from \"@earendil-works/pi-tui\";\nimport { getMarkdownTheme, type Theme } from \"../../../../modes/interactive/theme/theme.ts\";\nimport type { QuestionData } from \"../tool/types.ts\";\nimport {\n\ttype BoundGlobalBinding,\n\ttype BoundPerTabBinding,\n\tglobalBinding,\n\tperTabBinding,\n} from \"../view/component-binding.ts\";\nimport { ChatRowView } from \"../view/components/chat-row-view.ts\";\nimport { MultiSelectView } from \"../view/components/multi-select-view.ts\";\nimport { OptionListView } from \"../view/components/option-list-view.ts\";\nimport { PreviewBlockRenderer } from \"../view/components/preview/preview-block-renderer.ts\";\nimport { crossTabLeftWidthWithDonation } from \"../view/components/preview/preview-layout-decider.ts\";\nimport type { PreviewPaneProps } from \"../view/components/preview/preview-pane.ts\";\nimport { PreviewPane } from \"../view/components/preview/preview-pane.ts\";\nimport { SubmitPicker } from \"../view/components/submit-picker.ts\";\nimport { TabBar } from \"../view/components/tab-bar.ts\";\nimport type { WrappingSelectItem, WrappingSelectTheme } from \"../view/components/wrapping-select.ts\";\nimport { DialogView } from \"../view/dialog-builder.ts\";\nimport { QuestionnairePropsAdapter } from \"../view/props-adapter.ts\";\nimport type { StatefulView } from \"../view/stateful-view.ts\";\nimport type { TabBodyHeights, TabComponents } from \"../view/tab-components.ts\";\nimport { ROW_INTENT_META } from \"./row-intent.ts\";\nimport type { PerTabSelector } from \"./selectors/contract.ts\";\nimport { selectActivePreviewPaneIndex } from \"./selectors/derivations.ts\";\nimport {\n\tselectChatRowProps,\n\tselectDialogProps,\n\tselectMultiSelectProps,\n\tselectOptionListProps,\n\tselectPreviewPaneProps,\n\tselectSubmitPickerProps,\n\tselectTabBarProps,\n} from \"./selectors/projections.ts\";\nimport type { QuestionnaireState } from \"./state.ts\";\n\nexport interface QuestionnaireBuildConfig {\n\ttui: { terminal: { columns: number }; requestRender(): void };\n\ttheme: Theme;\n\tquestions: readonly QuestionData[];\n\titemsByTab: ReadonlyArray<readonly WrappingSelectItem[]>;\n\tisMulti: boolean;\n\tinitialState: QuestionnaireState;\n\tgetCurrentTab: () => number;\n\tchatAsOption?: boolean;\n}\n\nexport interface QuestionnaireBuilt {\n\tadapter: QuestionnairePropsAdapter;\n\tnotesInput: Input;\n\tinlineInput: Input;\n\trender: (width: number) => string[];\n\tinvalidate: () => void;\n}\n\ninterface HeightComputers {\n\tglobal: (width: number) => number;\n\tcurrent: (width: number) => number;\n}\n\nfunction previewBodyHeights(pane: PreviewPane): (width: number) => TabBodyHeights {\n\treturn (width) => ({\n\t\tcurrent: pane.naturalHeight(width),\n\t\tmax: pane.maxNaturalHeight(width),\n\t});\n}\n\nfunction multiSelectBodyHeights(view: MultiSelectView): (width: number) => TabBodyHeights {\n\treturn (width) => {\n\t\tconst h = view.naturalHeight(width);\n\t\treturn { current: h, max: h };\n\t};\n}\n\nconst isActiveTab: PerTabSelector<boolean> = (s, ctx) =>\n\tctx.i === selectActivePreviewPaneIndex(s.currentTab, ctx.totalQuestions);\n\n/**\n * Pure factory: assembles every TUI component, the props adapter, and a\n * lifecycle handle. Session-state dependencies arrive via `getCurrentTab` and\n * the `inputBuffer` cell. Initial paint is delegated to\n * `adapter.apply(initialState)` (called by the session at construction-end);\n * no selector is invoked here.\n */\nexport function buildQuestionnaire(config: QuestionnaireBuildConfig): QuestionnaireBuilt {\n\treturn new QuestionnaireBuilder(config).build();\n}\n\n/**\n * Programming-by-intention assembly: each private method names one\n * construction step from `build()`. Read top-down; the class is build-only and\n * discarded once the handle is returned.\n */\nclass QuestionnaireBuilder {\n\tprivate readonly tui: QuestionnaireBuildConfig[\"tui\"];\n\tprivate readonly theme: Theme;\n\tprivate readonly questions: readonly QuestionData[];\n\tprivate readonly itemsByTab: ReadonlyArray<readonly WrappingSelectItem[]>;\n\tprivate readonly isMulti: boolean;\n\tprivate readonly initialState: QuestionnaireState;\n\tprivate readonly getCurrentTab: () => number;\n\n\tprivate readonly selectTheme: WrappingSelectTheme;\n\tprivate readonly markdownTheme = getMarkdownTheme();\n\tprivate readonly chatRow: ChatRowView;\n\tprivate readonly notesInput = new Input();\n\tprivate readonly inlineInput = new Input();\n\tprivate readonly getTerminalWidth = () => this.tui.terminal.columns;\n\n\tconstructor(config: QuestionnaireBuildConfig) {\n\t\tthis.tui = config.tui;\n\t\tthis.theme = config.theme;\n\t\tthis.questions = config.questions;\n\t\tthis.itemsByTab = config.itemsByTab;\n\t\tthis.isMulti = config.isMulti;\n\t\tthis.initialState = config.initialState;\n\t\tthis.getCurrentTab = config.getCurrentTab;\n\n\t\tthis.selectTheme = this.makeSelectTheme();\n\t\tthis.chatRow = new ChatRowView({\n\t\t\titem: { kind: \"chat\", label: ROW_INTENT_META.chat.label },\n\t\t\ttheme: this.selectTheme,\n\t\t\tinlineInputEnabled: config.chatAsOption !== true,\n\t\t});\n\t}\n\n\tbuild(): QuestionnaireBuilt {\n\t\tconst tabs = this.buildTabComponents();\n\t\tthis.injectGlobalLeftWidth(tabs);\n\t\tconst submitPicker = this.buildSubmitPicker();\n\t\tconst tabBar = this.buildTabBar();\n\t\tconst heights = this.buildHeightComputers(tabs);\n\t\tconst dialog = this.buildDialog(tabs, submitPicker, tabBar, heights);\n\t\tconst globalBindings = this.buildGlobalBindings(dialog, submitPicker, tabBar);\n\t\tconst perTabBindings = this.buildPerTabBindings();\n\t\tconst adapter = this.buildAdapter(tabs, globalBindings, perTabBindings);\n\t\treturn this.handle(adapter, dialog);\n\t}\n\n\tprivate makeSelectTheme(): WrappingSelectTheme {\n\t\tconst t = this.theme;\n\t\treturn {\n\t\t\tselectedText: (s) => t.fg(\"accent\", t.bold(s)),\n\t\t\tdescription: (s) => t.fg(\"muted\", s),\n\t\t\tscrollInfo: (s) => t.fg(\"dim\", s),\n\t\t};\n\t}\n\n\tprivate buildTabComponents(): ReadonlyArray<TabComponents> {\n\t\treturn this.questions.map((q, i) => this.buildTabFor(q, i));\n\t}\n\n\tprivate buildTabFor(question: QuestionData, index: number): TabComponents {\n\t\tconst optionList = new OptionListView({\n\t\t\titems: this.itemsByTab[index] ?? [],\n\t\t\ttheme: this.selectTheme,\n\t\t});\n\t\tconst previewBlock = new PreviewBlockRenderer({\n\t\t\tquestion,\n\t\t\ttheme: this.theme,\n\t\t\tmarkdownTheme: this.markdownTheme,\n\t\t});\n\t\tconst preview = new PreviewPane({\n\t\t\tquestion,\n\t\t\tgetTerminalWidth: this.getTerminalWidth,\n\t\t\toptionListView: optionList,\n\t\t\tpreviewBlock,\n\t\t});\n\t\tconst multiSelect = question.multiSelect ? new MultiSelectView(this.theme, question) : undefined;\n\t\tconst bodyHeights = this.buildBodyHeights(question, preview, multiSelect);\n\t\treturn { optionList, preview, multiSelect, bodyHeights };\n\t}\n\n\tprivate buildBodyHeights(\n\t\tquestion: QuestionData,\n\t\tpreview: PreviewPane,\n\t\tmultiSelect: MultiSelectView | undefined,\n\t): (width: number) => TabBodyHeights {\n\t\treturn question.multiSelect ? multiSelectBodyHeights(multiSelect!) : previewBodyHeights(preview);\n\t}\n\n\t/**\n\t * Compute cross-tab max adaptive left width and inject into each PreviewPane.\n\t * Mirrors buildHeightComputers pattern — iterates all tabs, takes max.\n\t * Called after buildTabComponents, before buildDialog (so setGlobalLeftWidth\n\t * is set before any rendering occurs).\n\t */\n\tprivate injectGlobalLeftWidth(tabs: ReadonlyArray<TabComponents>): void {\n\t\tconst questions = this.questions;\n\t\tconst itemsByTab = this.itemsByTab;\n\t\tconst tabsDescriptor = questions.map((q) => ({ multiSelect: q.multiSelect }));\n\t\tconst globalLeftWidth = (paneWidth: number): number =>\n\t\t\tcrossTabLeftWidthWithDonation(tabsDescriptor, itemsByTab, questions, paneWidth);\n\t\tfor (const tab of tabs) {\n\t\t\ttab.preview.setGlobalLeftWidth(globalLeftWidth);\n\t\t}\n\t}\n\n\tprivate buildSubmitPicker(): SubmitPicker | undefined {\n\t\treturn this.isMulti ? new SubmitPicker(this.theme) : undefined;\n\t}\n\n\tprivate buildTabBar(): TabBar | undefined {\n\t\treturn this.isMulti ? new TabBar(this.theme) : undefined;\n\t}\n\n\tprivate buildHeightComputers(tabs: ReadonlyArray<TabComponents>): HeightComputers {\n\t\tconst global = (width: number): number => {\n\t\t\tlet max = 0;\n\t\t\tfor (const tab of tabs) {\n\t\t\t\tconst h = tab.bodyHeights(width).max;\n\t\t\t\tif (h > max) max = h;\n\t\t\t}\n\t\t\treturn Math.max(1, max);\n\t\t};\n\t\tconst current = (width: number): number => {\n\t\t\tconst idx = Math.min(this.getCurrentTab(), tabs.length - 1);\n\t\t\treturn Math.max(0, tabs[idx]?.bodyHeights(width).current ?? 0);\n\t\t};\n\t\treturn { global, current };\n\t}\n\n\tprivate pickInitialActivePreview(tabs: ReadonlyArray<TabComponents>): StatefulView<PreviewPaneProps> {\n\t\tconst idx = selectActivePreviewPaneIndex(this.initialState.currentTab, this.questions.length);\n\t\treturn tabs[idx]?.preview ?? tabs[0]!.preview;\n\t}\n\n\tprivate buildDialog(\n\t\ttabs: ReadonlyArray<TabComponents>,\n\t\tsubmitPicker: SubmitPicker | undefined,\n\t\ttabBar: TabBar | undefined,\n\t\theights: HeightComputers,\n\t): DialogView {\n\t\treturn new DialogView(\n\t\t\t{\n\t\t\t\ttheme: this.theme,\n\t\t\t\tquestions: this.questions,\n\t\t\t\ttabBar,\n\t\t\t\tnotesInput: this.notesInput,\n\t\t\t\tchatRow: this.chatRow,\n\t\t\t\tisMulti: this.isMulti,\n\t\t\t\ttabsByIndex: tabs,\n\t\t\t\tsubmitPicker,\n\t\t\t\tgetBodyHeight: heights.global,\n\t\t\t\tgetCurrentBodyHeight: heights.current,\n\t\t\t},\n\t\t\t{ state: this.initialState, activePreviewPane: this.pickInitialActivePreview(tabs) },\n\t\t);\n\t}\n\n\tprivate buildGlobalBindings(\n\t\tdialog: DialogView,\n\t\tsubmitPicker: SubmitPicker | undefined,\n\t\ttabBar: TabBar | undefined,\n\t): ReadonlyArray<BoundGlobalBinding> {\n\t\treturn [\n\t\t\tglobalBinding({ component: dialog, select: selectDialogProps }),\n\t\t\tglobalBinding({ component: this.chatRow, select: selectChatRowProps }),\n\t\t\t...(submitPicker ? [globalBinding({ component: submitPicker, select: selectSubmitPickerProps })] : []),\n\t\t\t...(tabBar ? [globalBinding({ component: tabBar, select: selectTabBarProps })] : []),\n\t\t];\n\t}\n\n\tprivate buildPerTabBindings(): ReadonlyArray<BoundPerTabBinding> {\n\t\treturn [\n\t\t\tperTabBinding({\n\t\t\t\tresolve: (tab) => tab.optionList,\n\t\t\t\tpredicate: isActiveTab,\n\t\t\t\tselect: selectOptionListProps,\n\t\t\t}),\n\t\t\tperTabBinding({\n\t\t\t\tresolve: (tab) => tab.preview,\n\t\t\t\tpredicate: isActiveTab,\n\t\t\t\tselect: selectPreviewPaneProps,\n\t\t\t}),\n\t\t\tperTabBinding({\n\t\t\t\tresolve: (tab) => tab.multiSelect,\n\t\t\t\tselect: selectMultiSelectProps,\n\t\t\t}),\n\t\t];\n\t}\n\n\tprivate buildAdapter(\n\t\ttabs: ReadonlyArray<TabComponents>,\n\t\tglobalBindings: ReadonlyArray<BoundGlobalBinding>,\n\t\tperTabBindings: ReadonlyArray<BoundPerTabBinding>,\n\t): QuestionnairePropsAdapter {\n\t\treturn new QuestionnairePropsAdapter({\n\t\t\ttui: this.tui,\n\t\t\tquestions: this.questions,\n\t\t\titemsByTab: this.itemsByTab,\n\t\t\ttabsByIndex: tabs,\n\t\t\tinlineInput: this.inlineInput,\n\t\t\tglobalBindings,\n\t\t\tperTabBindings,\n\t\t\textraInvalidatables: [this.notesInput],\n\t\t});\n\t}\n\n\tprivate handle(adapter: QuestionnairePropsAdapter, dialog: DialogView): QuestionnaireBuilt {\n\t\treturn {\n\t\t\tadapter,\n\t\t\tnotesInput: this.notesInput,\n\t\t\tinlineInput: this.inlineInput,\n\t\t\trender: (w) => dialog.render(w),\n\t\t\tinvalidate: () => adapter.invalidate(),\n\t\t};\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"build-questionnaire.js","sourceRoot":"","sources":["../../../../../src/core/tools/ask-user-question/state/build-questionnaire.ts"],"names":[],"mappings":"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","sourcesContent":["import { Input } from \"@earendil-works/pi-tui\";\nimport { getMarkdownTheme, type Theme } from \"../../../../modes/interactive/theme/theme.js\";\nimport type { QuestionData } from \"../tool/types.ts\";\nimport {\n\ttype BoundGlobalBinding,\n\ttype BoundPerTabBinding,\n\tglobalBinding,\n\tperTabBinding,\n} from \"../view/component-binding.ts\";\nimport { ChatRowView } from \"../view/components/chat-row-view.ts\";\nimport { MultiSelectView } from \"../view/components/multi-select-view.ts\";\nimport { OptionListView } from \"../view/components/option-list-view.ts\";\nimport { PreviewBlockRenderer } from \"../view/components/preview/preview-block-renderer.ts\";\nimport { crossTabLeftWidthWithDonation } from \"../view/components/preview/preview-layout-decider.ts\";\nimport type { PreviewPaneProps } from \"../view/components/preview/preview-pane.ts\";\nimport { PreviewPane } from \"../view/components/preview/preview-pane.ts\";\nimport { SubmitPicker } from \"../view/components/submit-picker.ts\";\nimport { TabBar } from \"../view/components/tab-bar.ts\";\nimport type { WrappingSelectItem, WrappingSelectTheme } from \"../view/components/wrapping-select.ts\";\nimport { DialogView } from \"../view/dialog-builder.ts\";\nimport { QuestionnairePropsAdapter } from \"../view/props-adapter.ts\";\nimport type { StatefulView } from \"../view/stateful-view.ts\";\nimport type { TabBodyHeights, TabComponents } from \"../view/tab-components.ts\";\nimport { ROW_INTENT_META } from \"./row-intent.ts\";\nimport type { PerTabSelector } from \"./selectors/contract.ts\";\nimport { selectActivePreviewPaneIndex } from \"./selectors/derivations.ts\";\nimport {\n\tselectChatRowProps,\n\tselectDialogProps,\n\tselectMultiSelectProps,\n\tselectOptionListProps,\n\tselectPreviewPaneProps,\n\tselectSubmitPickerProps,\n\tselectTabBarProps,\n} from \"./selectors/projections.ts\";\nimport type { QuestionnaireState } from \"./state.ts\";\n\nexport interface QuestionnaireBuildConfig {\n\ttui: { terminal: { columns: number }; requestRender(): void };\n\ttheme: Theme;\n\tquestions: readonly QuestionData[];\n\titemsByTab: ReadonlyArray<readonly WrappingSelectItem[]>;\n\tisMulti: boolean;\n\tinitialState: QuestionnaireState;\n\tgetCurrentTab: () => number;\n\tchatAsOption?: boolean;\n}\n\nexport interface QuestionnaireBuilt {\n\tadapter: QuestionnairePropsAdapter;\n\tnotesInput: Input;\n\tinlineInput: Input;\n\trender: (width: number) => string[];\n\tinvalidate: () => void;\n}\n\ninterface HeightComputers {\n\tglobal: (width: number) => number;\n\tcurrent: (width: number) => number;\n}\n\nfunction previewBodyHeights(pane: PreviewPane): (width: number) => TabBodyHeights {\n\treturn (width) => ({\n\t\tcurrent: pane.naturalHeight(width),\n\t\tmax: pane.maxNaturalHeight(width),\n\t});\n}\n\nfunction multiSelectBodyHeights(view: MultiSelectView): (width: number) => TabBodyHeights {\n\treturn (width) => {\n\t\tconst h = view.naturalHeight(width);\n\t\treturn { current: h, max: h };\n\t};\n}\n\nconst isActiveTab: PerTabSelector<boolean> = (s, ctx) =>\n\tctx.i === selectActivePreviewPaneIndex(s.currentTab, ctx.totalQuestions);\n\n/**\n * Pure factory: assembles every TUI component, the props adapter, and a\n * lifecycle handle. Session-state dependencies arrive via `getCurrentTab` and\n * the `inputBuffer` cell. Initial paint is delegated to\n * `adapter.apply(initialState)` (called by the session at construction-end);\n * no selector is invoked here.\n */\nexport function buildQuestionnaire(config: QuestionnaireBuildConfig): QuestionnaireBuilt {\n\treturn new QuestionnaireBuilder(config).build();\n}\n\n/**\n * Programming-by-intention assembly: each private method names one\n * construction step from `build()`. Read top-down; the class is build-only and\n * discarded once the handle is returned.\n */\nclass QuestionnaireBuilder {\n\tprivate readonly tui: QuestionnaireBuildConfig[\"tui\"];\n\tprivate readonly theme: Theme;\n\tprivate readonly questions: readonly QuestionData[];\n\tprivate readonly itemsByTab: ReadonlyArray<readonly WrappingSelectItem[]>;\n\tprivate readonly isMulti: boolean;\n\tprivate readonly initialState: QuestionnaireState;\n\tprivate readonly getCurrentTab: () => number;\n\n\tprivate readonly selectTheme: WrappingSelectTheme;\n\tprivate readonly markdownTheme = getMarkdownTheme();\n\tprivate readonly chatRow: ChatRowView;\n\tprivate readonly notesInput = new Input();\n\tprivate readonly inlineInput = new Input();\n\tprivate readonly getTerminalWidth = () => this.tui.terminal.columns;\n\n\tconstructor(config: QuestionnaireBuildConfig) {\n\t\tthis.tui = config.tui;\n\t\tthis.theme = config.theme;\n\t\tthis.questions = config.questions;\n\t\tthis.itemsByTab = config.itemsByTab;\n\t\tthis.isMulti = config.isMulti;\n\t\tthis.initialState = config.initialState;\n\t\tthis.getCurrentTab = config.getCurrentTab;\n\n\t\tthis.selectTheme = this.makeSelectTheme();\n\t\tthis.chatRow = new ChatRowView({\n\t\t\titem: { kind: \"chat\", label: ROW_INTENT_META.chat.label },\n\t\t\ttheme: this.selectTheme,\n\t\t\tinlineInputEnabled: config.chatAsOption !== true,\n\t\t});\n\t}\n\n\tbuild(): QuestionnaireBuilt {\n\t\tconst tabs = this.buildTabComponents();\n\t\tthis.injectGlobalLeftWidth(tabs);\n\t\tconst submitPicker = this.buildSubmitPicker();\n\t\tconst tabBar = this.buildTabBar();\n\t\tconst heights = this.buildHeightComputers(tabs);\n\t\tconst dialog = this.buildDialog(tabs, submitPicker, tabBar, heights);\n\t\tconst globalBindings = this.buildGlobalBindings(dialog, submitPicker, tabBar);\n\t\tconst perTabBindings = this.buildPerTabBindings();\n\t\tconst adapter = this.buildAdapter(tabs, globalBindings, perTabBindings);\n\t\treturn this.handle(adapter, dialog);\n\t}\n\n\tprivate makeSelectTheme(): WrappingSelectTheme {\n\t\tconst t = this.theme;\n\t\treturn {\n\t\t\tselectedText: (s) => t.fg(\"accent\", t.bold(s)),\n\t\t\tdescription: (s) => t.fg(\"muted\", s),\n\t\t\tscrollInfo: (s) => t.fg(\"dim\", s),\n\t\t};\n\t}\n\n\tprivate buildTabComponents(): ReadonlyArray<TabComponents> {\n\t\treturn this.questions.map((q, i) => this.buildTabFor(q, i));\n\t}\n\n\tprivate buildTabFor(question: QuestionData, index: number): TabComponents {\n\t\tconst optionList = new OptionListView({\n\t\t\titems: this.itemsByTab[index] ?? [],\n\t\t\ttheme: this.selectTheme,\n\t\t});\n\t\tconst previewBlock = new PreviewBlockRenderer({\n\t\t\tquestion,\n\t\t\ttheme: this.theme,\n\t\t\tmarkdownTheme: this.markdownTheme,\n\t\t});\n\t\tconst preview = new PreviewPane({\n\t\t\tquestion,\n\t\t\tgetTerminalWidth: this.getTerminalWidth,\n\t\t\toptionListView: optionList,\n\t\t\tpreviewBlock,\n\t\t});\n\t\tconst multiSelect = question.multiSelect ? new MultiSelectView(this.theme, question) : undefined;\n\t\tconst bodyHeights = this.buildBodyHeights(question, preview, multiSelect);\n\t\treturn { optionList, preview, multiSelect, bodyHeights };\n\t}\n\n\tprivate buildBodyHeights(\n\t\tquestion: QuestionData,\n\t\tpreview: PreviewPane,\n\t\tmultiSelect: MultiSelectView | undefined,\n\t): (width: number) => TabBodyHeights {\n\t\treturn question.multiSelect ? multiSelectBodyHeights(multiSelect!) : previewBodyHeights(preview);\n\t}\n\n\t/**\n\t * Compute cross-tab max adaptive left width and inject into each PreviewPane.\n\t * Mirrors buildHeightComputers pattern — iterates all tabs, takes max.\n\t * Called after buildTabComponents, before buildDialog (so setGlobalLeftWidth\n\t * is set before any rendering occurs).\n\t */\n\tprivate injectGlobalLeftWidth(tabs: ReadonlyArray<TabComponents>): void {\n\t\tconst questions = this.questions;\n\t\tconst itemsByTab = this.itemsByTab;\n\t\tconst tabsDescriptor = questions.map((q) => ({ multiSelect: q.multiSelect }));\n\t\tconst globalLeftWidth = (paneWidth: number): number =>\n\t\t\tcrossTabLeftWidthWithDonation(tabsDescriptor, itemsByTab, questions, paneWidth);\n\t\tfor (const tab of tabs) {\n\t\t\ttab.preview.setGlobalLeftWidth(globalLeftWidth);\n\t\t}\n\t}\n\n\tprivate buildSubmitPicker(): SubmitPicker | undefined {\n\t\treturn this.isMulti ? new SubmitPicker(this.theme) : undefined;\n\t}\n\n\tprivate buildTabBar(): TabBar | undefined {\n\t\treturn this.isMulti ? new TabBar(this.theme) : undefined;\n\t}\n\n\tprivate buildHeightComputers(tabs: ReadonlyArray<TabComponents>): HeightComputers {\n\t\tconst global = (width: number): number => {\n\t\t\tlet max = 0;\n\t\t\tfor (const tab of tabs) {\n\t\t\t\tconst h = tab.bodyHeights(width).max;\n\t\t\t\tif (h > max) max = h;\n\t\t\t}\n\t\t\treturn Math.max(1, max);\n\t\t};\n\t\tconst current = (width: number): number => {\n\t\t\tconst idx = Math.min(this.getCurrentTab(), tabs.length - 1);\n\t\t\treturn Math.max(0, tabs[idx]?.bodyHeights(width).current ?? 0);\n\t\t};\n\t\treturn { global, current };\n\t}\n\n\tprivate pickInitialActivePreview(tabs: ReadonlyArray<TabComponents>): StatefulView<PreviewPaneProps> {\n\t\tconst idx = selectActivePreviewPaneIndex(this.initialState.currentTab, this.questions.length);\n\t\treturn tabs[idx]?.preview ?? tabs[0]!.preview;\n\t}\n\n\tprivate buildDialog(\n\t\ttabs: ReadonlyArray<TabComponents>,\n\t\tsubmitPicker: SubmitPicker | undefined,\n\t\ttabBar: TabBar | undefined,\n\t\theights: HeightComputers,\n\t): DialogView {\n\t\treturn new DialogView(\n\t\t\t{\n\t\t\t\ttheme: this.theme,\n\t\t\t\tquestions: this.questions,\n\t\t\t\ttabBar,\n\t\t\t\tnotesInput: this.notesInput,\n\t\t\t\tchatRow: this.chatRow,\n\t\t\t\tisMulti: this.isMulti,\n\t\t\t\ttabsByIndex: tabs,\n\t\t\t\tsubmitPicker,\n\t\t\t\tgetBodyHeight: heights.global,\n\t\t\t\tgetCurrentBodyHeight: heights.current,\n\t\t\t},\n\t\t\t{ state: this.initialState, activePreviewPane: this.pickInitialActivePreview(tabs) },\n\t\t);\n\t}\n\n\tprivate buildGlobalBindings(\n\t\tdialog: DialogView,\n\t\tsubmitPicker: SubmitPicker | undefined,\n\t\ttabBar: TabBar | undefined,\n\t): ReadonlyArray<BoundGlobalBinding> {\n\t\treturn [\n\t\t\tglobalBinding({ component: dialog, select: selectDialogProps }),\n\t\t\tglobalBinding({ component: this.chatRow, select: selectChatRowProps }),\n\t\t\t...(submitPicker ? [globalBinding({ component: submitPicker, select: selectSubmitPickerProps })] : []),\n\t\t\t...(tabBar ? [globalBinding({ component: tabBar, select: selectTabBarProps })] : []),\n\t\t];\n\t}\n\n\tprivate buildPerTabBindings(): ReadonlyArray<BoundPerTabBinding> {\n\t\treturn [\n\t\t\tperTabBinding({\n\t\t\t\tresolve: (tab) => tab.optionList,\n\t\t\t\tpredicate: isActiveTab,\n\t\t\t\tselect: selectOptionListProps,\n\t\t\t}),\n\t\t\tperTabBinding({\n\t\t\t\tresolve: (tab) => tab.preview,\n\t\t\t\tpredicate: isActiveTab,\n\t\t\t\tselect: selectPreviewPaneProps,\n\t\t\t}),\n\t\t\tperTabBinding({\n\t\t\t\tresolve: (tab) => tab.multiSelect,\n\t\t\t\tselect: selectMultiSelectProps,\n\t\t\t}),\n\t\t];\n\t}\n\n\tprivate buildAdapter(\n\t\ttabs: ReadonlyArray<TabComponents>,\n\t\tglobalBindings: ReadonlyArray<BoundGlobalBinding>,\n\t\tperTabBindings: ReadonlyArray<BoundPerTabBinding>,\n\t): QuestionnairePropsAdapter {\n\t\treturn new QuestionnairePropsAdapter({\n\t\t\ttui: this.tui,\n\t\t\tquestions: this.questions,\n\t\t\titemsByTab: this.itemsByTab,\n\t\t\ttabsByIndex: tabs,\n\t\t\tinlineInput: this.inlineInput,\n\t\t\tglobalBindings,\n\t\t\tperTabBindings,\n\t\t\textraInvalidatables: [this.notesInput],\n\t\t});\n\t}\n\n\tprivate handle(adapter: QuestionnairePropsAdapter, dialog: DialogView): QuestionnaireBuilt {\n\t\treturn {\n\t\t\tadapter,\n\t\t\tnotesInput: this.notesInput,\n\t\t\tinlineInput: this.inlineInput,\n\t\t\trender: (w) => dialog.render(w),\n\t\t\tinvalidate: () => adapter.invalidate(),\n\t\t};\n\t}\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Theme } from "../../../../modes/interactive/theme/theme.
|
|
1
|
+
import type { Theme } from "../../../../modes/interactive/theme/theme.js";
|
|
2
2
|
import type { QuestionnaireResult, QuestionParams } from "../tool/types.ts";
|
|
3
3
|
import type { WrappingSelectItem } from "../view/components/wrapping-select.ts";
|
|
4
4
|
export interface QuestionnaireSessionConfig {
|