@xingular/harness 0.1.7 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +97 -1
- package/LICENSE +202 -0
- package/NOTICE.md +22 -0
- package/README.md +187 -85
- package/THIRD_PARTY_LICENSES.md +942 -0
- package/dist/cli.js +13701 -13498
- package/dist/sdk/accounts/accounts.d.ts +165 -0
- package/dist/sdk/accounts/accounts.js +730 -0
- package/dist/sdk/accounts/choices.d.ts +23 -0
- package/dist/sdk/accounts/choices.js +62 -0
- package/dist/sdk/accounts/env.d.ts +78 -0
- package/dist/sdk/accounts/env.js +294 -0
- package/dist/sdk/accounts/secrets.d.ts +16 -0
- package/dist/sdk/accounts/secrets.js +40 -0
- package/dist/sdk/accounts/store.d.ts +114 -0
- package/dist/sdk/accounts/store.js +255 -0
- package/dist/sdk/browser/config.d.ts +16 -0
- package/dist/sdk/browser/config.js +22 -0
- package/dist/sdk/browser/diagnostics.d.ts +4 -0
- package/dist/sdk/browser/diagnostics.js +38 -0
- package/dist/sdk/browser/index.d.ts +17 -0
- package/dist/sdk/browser/index.js +65 -0
- package/dist/sdk/browser/network.d.ts +10 -0
- package/dist/sdk/browser/network.js +59 -0
- package/dist/sdk/browser/session.d.ts +84 -0
- package/dist/sdk/browser/session.js +192 -0
- package/dist/sdk/browser/tools.d.ts +8 -0
- package/dist/sdk/browser/tools.js +329 -0
- package/dist/sdk/capabilities/api.d.ts +22 -0
- package/dist/sdk/capabilities/api.js +54 -0
- package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
- package/dist/sdk/capabilities/runSnapshot.js +47 -0
- package/dist/sdk/capabilities/types.d.ts +29 -0
- package/dist/sdk/capabilities/types.js +1 -0
- package/dist/sdk/cli.d.ts +2 -0
- package/dist/sdk/cli.js +142 -0
- package/dist/sdk/core/bus.d.ts +23 -0
- package/dist/sdk/core/bus.js +76 -0
- package/dist/sdk/core/caller.d.ts +22 -0
- package/dist/sdk/core/caller.js +16 -0
- package/dist/sdk/core/changes.d.ts +15 -0
- package/dist/sdk/core/changes.js +15 -0
- package/dist/sdk/core/effort.d.ts +2 -0
- package/dist/sdk/core/effort.js +1 -0
- package/dist/sdk/core/env.d.ts +18 -0
- package/dist/sdk/core/env.js +8 -0
- package/dist/sdk/core/errors.d.ts +15 -0
- package/dist/sdk/core/errors.js +24 -0
- package/dist/sdk/core/frontmatter.d.ts +12 -0
- package/dist/sdk/core/frontmatter.js +50 -0
- package/dist/sdk/core/fs.d.ts +18 -0
- package/dist/sdk/core/fs.js +106 -0
- package/dist/sdk/core/index.d.ts +24 -0
- package/dist/sdk/core/index.js +187 -0
- package/dist/sdk/core/path.d.ts +7 -0
- package/dist/sdk/core/path.js +79 -0
- package/dist/sdk/core/projects.d.ts +18 -0
- package/dist/sdk/core/projects.js +67 -0
- package/dist/sdk/core/secrets.d.ts +2 -0
- package/dist/sdk/core/secrets.js +5 -0
- package/dist/sdk/core/text.d.ts +7 -0
- package/dist/sdk/core/text.js +40 -0
- package/dist/sdk/doctor/checks.d.ts +5 -0
- package/dist/sdk/doctor/checks.js +208 -0
- package/dist/sdk/doctor/probe.d.ts +4 -0
- package/dist/sdk/doctor/probe.js +92 -0
- package/dist/sdk/doctor/service.d.ts +23 -0
- package/dist/sdk/doctor/service.js +144 -0
- package/dist/sdk/doctor/types.d.ts +141 -0
- package/dist/sdk/doctor/types.js +29 -0
- package/dist/sdk/harness.d.ts +133 -0
- package/dist/sdk/harness.js +299 -0
- package/dist/sdk/history/lessonPrompt.d.ts +2 -0
- package/dist/sdk/history/lessonPrompt.js +15 -0
- package/dist/sdk/history/lessons.d.ts +52 -0
- package/dist/sdk/history/lessons.js +173 -0
- package/dist/sdk/history/recall.d.ts +68 -0
- package/dist/sdk/history/recall.js +199 -0
- package/dist/sdk/history/trajectory.d.ts +7 -0
- package/dist/sdk/history/trajectory.js +216 -0
- package/dist/sdk/hub/catalog.json +123 -0
- package/dist/sdk/hub/cli.d.ts +7 -0
- package/dist/sdk/hub/cli.js +81 -0
- package/dist/sdk/hub/hub.d.ts +74 -0
- package/dist/sdk/hub/hub.js +474 -0
- package/dist/sdk/hub/schema.d.ts +280 -0
- package/dist/sdk/hub/schema.js +78 -0
- package/dist/sdk/index.d.ts +63 -0
- package/dist/sdk/index.js +48 -0
- package/dist/sdk/mcp/connections.d.ts +83 -0
- package/dist/sdk/mcp/connections.js +669 -0
- package/dist/sdk/mcp/manager.d.ts +26 -0
- package/dist/sdk/mcp/manager.js +124 -0
- package/dist/sdk/mcp/oauth.d.ts +35 -0
- package/dist/sdk/mcp/oauth.js +171 -0
- package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
- package/dist/sdk/mcp/scopeMigration.js +198 -0
- package/dist/sdk/mcp/service.d.ts +160 -0
- package/dist/sdk/mcp/service.js +510 -0
- package/dist/sdk/mcp/types.d.ts +131 -0
- package/dist/sdk/mcp/types.js +49 -0
- package/dist/sdk/pi/runtime.d.ts +13 -0
- package/dist/sdk/pi/runtime.js +31 -0
- package/dist/sdk/plugins/api.d.ts +66 -0
- package/dist/sdk/plugins/api.js +155 -0
- package/dist/sdk/plugins/attachments.d.ts +46 -0
- package/dist/sdk/plugins/attachments.js +111 -0
- package/dist/sdk/plugins/builtin.d.ts +6 -0
- package/dist/sdk/plugins/builtin.js +68 -0
- package/dist/sdk/plugins/catalogue.d.ts +29 -0
- package/dist/sdk/plugins/catalogue.js +196 -0
- package/dist/sdk/plugins/cli.d.ts +13 -0
- package/dist/sdk/plugins/cli.js +187 -0
- package/dist/sdk/plugins/discover.d.ts +42 -0
- package/dist/sdk/plugins/discover.js +115 -0
- package/dist/sdk/plugins/firstParty.d.ts +50 -0
- package/dist/sdk/plugins/firstParty.js +113 -0
- package/dist/sdk/plugins/hooks.d.ts +94 -0
- package/dist/sdk/plugins/hooks.js +162 -0
- package/dist/sdk/plugins/identity.d.ts +19 -0
- package/dist/sdk/plugins/identity.js +48 -0
- package/dist/sdk/plugins/install.d.ts +20 -0
- package/dist/sdk/plugins/install.js +110 -0
- package/dist/sdk/plugins/inventory.d.ts +22 -0
- package/dist/sdk/plugins/inventory.js +110 -0
- package/dist/sdk/plugins/manifest.d.ts +13 -0
- package/dist/sdk/plugins/manifest.js +56 -0
- package/dist/sdk/plugins/plugins.d.ts +104 -0
- package/dist/sdk/plugins/plugins.js +164 -0
- package/dist/sdk/plugins/runtime.d.ts +9 -0
- package/dist/sdk/plugins/runtime.js +95 -0
- package/dist/sdk/plugins/trust.d.ts +44 -0
- package/dist/sdk/plugins/trust.js +120 -0
- package/dist/sdk/plugins/types.d.ts +159 -0
- package/dist/sdk/plugins/types.js +7 -0
- package/dist/sdk/prompt/compile.d.ts +174 -0
- package/dist/sdk/prompt/compile.js +396 -0
- package/dist/sdk/refine/cli.d.ts +4 -0
- package/dist/sdk/refine/cli.js +186 -0
- package/dist/sdk/refine/demo.d.ts +21 -0
- package/dist/sdk/refine/demo.js +114 -0
- package/dist/sdk/refine/evidence.d.ts +55 -0
- package/dist/sdk/refine/evidence.js +330 -0
- package/dist/sdk/refine/host.d.ts +51 -0
- package/dist/sdk/refine/host.js +76 -0
- package/dist/sdk/refine/ledger.d.ts +48 -0
- package/dist/sdk/refine/ledger.js +76 -0
- package/dist/sdk/refine/library.d.ts +55 -0
- package/dist/sdk/refine/library.js +177 -0
- package/dist/sdk/refine/pi.d.ts +72 -0
- package/dist/sdk/refine/pi.js +248 -0
- package/dist/sdk/refine/prompts.d.ts +45 -0
- package/dist/sdk/refine/prompts.js +390 -0
- package/dist/sdk/refine/recursion.d.ts +113 -0
- package/dist/sdk/refine/recursion.js +258 -0
- package/dist/sdk/refine/runner.d.ts +81 -0
- package/dist/sdk/refine/runner.js +150 -0
- package/dist/sdk/refine/selection.d.ts +57 -0
- package/dist/sdk/refine/selection.js +251 -0
- package/dist/sdk/refine/service.d.ts +84 -0
- package/dist/sdk/refine/service.js +165 -0
- package/dist/sdk/refine/suite.d.ts +67 -0
- package/dist/sdk/refine/suite.js +174 -0
- package/dist/sdk/refine/trajectory.d.ts +9 -0
- package/dist/sdk/refine/trajectory.js +68 -0
- package/dist/sdk/refine/types.d.ts +77 -0
- package/dist/sdk/refine/types.js +10 -0
- package/dist/sdk/server/methods.d.ts +3 -0
- package/dist/sdk/server/methods.js +370 -0
- package/dist/sdk/server/remote.d.ts +19 -0
- package/dist/sdk/server/remote.js +84 -0
- package/dist/sdk/server/rpc.d.ts +20 -0
- package/dist/sdk/server/rpc.js +102 -0
- package/dist/sdk/server/serve.d.ts +10 -0
- package/dist/sdk/server/serve.js +18 -0
- package/dist/sdk/sessions/approvals.d.ts +47 -0
- package/dist/sdk/sessions/approvals.js +119 -0
- package/dist/sdk/sessions/continuation.d.ts +48 -0
- package/dist/sdk/sessions/continuation.js +85 -0
- package/dist/sdk/sessions/contracts.d.ts +534 -0
- package/dist/sdk/sessions/contracts.js +299 -0
- package/dist/sdk/sessions/extensionUi.d.ts +19 -0
- package/dist/sdk/sessions/extensionUi.js +64 -0
- package/dist/sdk/sessions/history.d.ts +16 -0
- package/dist/sdk/sessions/history.js +68 -0
- package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
- package/dist/sdk/sessions/lineageJoin.js +61 -0
- package/dist/sdk/sessions/planMode.d.ts +36 -0
- package/dist/sdk/sessions/planMode.js +84 -0
- package/dist/sdk/sessions/policy.d.ts +43 -0
- package/dist/sdk/sessions/policy.js +1 -0
- package/dist/sdk/sessions/pricing.d.ts +34 -0
- package/dist/sdk/sessions/pricing.js +40 -0
- package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
- package/dist/sdk/sessions/reasoningSummaries.js +61 -0
- package/dist/sdk/sessions/registry.d.ts +102 -0
- package/dist/sdk/sessions/registry.js +383 -0
- package/dist/sdk/sessions/runIndex.d.ts +21 -0
- package/dist/sdk/sessions/runIndex.js +65 -0
- package/dist/sdk/sessions/runStore.d.ts +66 -0
- package/dist/sdk/sessions/runStore.js +335 -0
- package/dist/sdk/sessions/runner.d.ts +213 -0
- package/dist/sdk/sessions/runner.js +589 -0
- package/dist/sdk/sessions/sessions.d.ts +140 -0
- package/dist/sdk/sessions/sessions.js +394 -0
- package/dist/sdk/sessions/subagentService.d.ts +41 -0
- package/dist/sdk/sessions/subagentService.js +247 -0
- package/dist/sdk/sessions/subagents.d.ts +50 -0
- package/dist/sdk/sessions/subagents.js +68 -0
- package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
- package/dist/sdk/terminal/accountsMenu.js +392 -0
- package/dist/sdk/terminal/cli.d.ts +20 -0
- package/dist/sdk/terminal/cli.js +121 -0
- package/dist/sdk/terminal/client.d.ts +15 -0
- package/dist/sdk/terminal/client.js +126 -0
- package/dist/sdk/terminal/control.d.ts +4 -0
- package/dist/sdk/terminal/control.js +25 -0
- package/dist/sdk/terminal/controller.d.ts +72 -0
- package/dist/sdk/terminal/controller.js +351 -0
- package/dist/sdk/terminal/hubMenu.d.ts +10 -0
- package/dist/sdk/terminal/hubMenu.js +34 -0
- package/dist/sdk/terminal/launch.d.ts +5 -0
- package/dist/sdk/terminal/launch.js +27 -0
- package/dist/sdk/terminal/logs.d.ts +14 -0
- package/dist/sdk/terminal/logs.js +59 -0
- package/dist/sdk/terminal/piExtension.d.ts +6 -0
- package/dist/sdk/terminal/piExtension.js +392 -0
- package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
- package/dist/sdk/terminal/pluginMenu.js +101 -0
- package/dist/sdk/terminal/socket.d.ts +70 -0
- package/dist/sdk/terminal/socket.js +256 -0
- package/dist/sdk/terminal/standalone.d.ts +18 -0
- package/dist/sdk/terminal/standalone.js +146 -0
- package/dist/sdk/terminal/terminals.d.ts +176 -0
- package/dist/sdk/terminal/terminals.js +767 -0
- package/dist/sdk/terminal/trajectory.d.ts +10 -0
- package/dist/sdk/terminal/trajectory.js +30 -0
- package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
- package/dist/sdk/terminal/tui/chrome.js +169 -0
- package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
- package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
- package/dist/sdk/terminal/tui/commandPages.d.ts +7 -0
- package/dist/sdk/terminal/tui/commandPages.js +63 -0
- package/dist/sdk/terminal/tui/commands.d.ts +42 -0
- package/dist/sdk/terminal/tui/commands.js +276 -0
- package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
- package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
- package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
- package/dist/sdk/terminal/tui/dialogs.js +363 -0
- package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
- package/dist/sdk/terminal/tui/keybindings.js +49 -0
- package/dist/sdk/terminal/tui/list.d.ts +73 -0
- package/dist/sdk/terminal/tui/list.js +196 -0
- package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
- package/dist/sdk/terminal/tui/modeChoices.js +70 -0
- package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
- package/dist/sdk/terminal/tui/modelPicker.js +155 -0
- package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
- package/dist/sdk/terminal/tui/mouse.js +3 -0
- package/dist/sdk/terminal/tui/page.d.ts +14 -0
- package/dist/sdk/terminal/tui/page.js +1 -0
- package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
- package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +37 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
- package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
- package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
- package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
- package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
- package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
- package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
- package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
- package/dist/sdk/terminal/tui/piAdapter.js +48 -0
- package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
- package/dist/sdk/terminal/tui/planMode.js +2 -0
- package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
- package/dist/sdk/terminal/tui/questionPicker.js +150 -0
- package/dist/sdk/terminal/tui/questions.d.ts +19 -0
- package/dist/sdk/terminal/tui/questions.js +42 -0
- package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
- package/dist/sdk/terminal/tui/runtime.js +441 -0
- package/dist/sdk/terminal/tui/search.d.ts +22 -0
- package/dist/sdk/terminal/tui/search.js +60 -0
- package/dist/sdk/terminal/tui/selection.d.ts +16 -0
- package/dist/sdk/terminal/tui/selection.js +16 -0
- package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
- package/dist/sdk/terminal/tui/sessionUi.js +30 -0
- package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
- package/dist/sdk/terminal/tui/settingsModel.js +84 -0
- package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
- package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
- package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
- package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
- package/dist/sdk/terminal/tui/status.d.ts +18 -0
- package/dist/sdk/terminal/tui/status.js +67 -0
- package/dist/sdk/terminal/tui/theme.d.ts +45 -0
- package/dist/sdk/terminal/tui/theme.js +176 -0
- package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
- package/dist/sdk/terminal/tui/treeModel.js +483 -0
- package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
- package/dist/sdk/terminal/tui/treePicker.js +251 -0
- package/dist/sdk/terminal/tui/ui.d.ts +47 -0
- package/dist/sdk/terminal/tui/ui.js +148 -0
- package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
- package/dist/sdk/terminal/tui/workingStatus.js +229 -0
- package/dist/sdk/tools/askUser.d.ts +6 -0
- package/dist/sdk/tools/askUser.js +74 -0
- package/dist/sdk/tools/checklist.d.ts +9 -0
- package/dist/sdk/tools/checklist.js +54 -0
- package/dist/sdk/tools/definitions.d.ts +30 -0
- package/dist/sdk/tools/definitions.js +117 -0
- package/dist/sdk/tools/dispatch.d.ts +16 -0
- package/dist/sdk/tools/dispatch.js +67 -0
- package/dist/sdk/tools/harnessTools.d.ts +6 -0
- package/dist/sdk/tools/harnessTools.js +20 -0
- package/dist/sdk/tools/sessionName.d.ts +7 -0
- package/dist/sdk/tools/sessionName.js +31 -0
- package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
- package/dist/sdk/tools/spawnSubagent.js +49 -0
- package/dist/sdk/tools/types.d.ts +48 -0
- package/dist/sdk/tools/types.js +1 -0
- package/dist/sdk/variant/components.d.ts +34 -0
- package/dist/sdk/variant/components.js +230 -0
- package/dist/sdk/variant/materialise.d.ts +66 -0
- package/dist/sdk/variant/materialise.js +81 -0
- package/dist/sdk/variant/migrate.d.ts +4 -0
- package/dist/sdk/variant/migrate.js +41 -0
- package/dist/sdk/variant/seed.d.ts +20 -0
- package/dist/sdk/variant/seed.js +116 -0
- package/dist/sdk/variant/store.d.ts +82 -0
- package/dist/sdk/variant/store.js +151 -0
- package/dist/sdk/variant/surface.d.ts +56 -0
- package/dist/sdk/variant/surface.js +81 -0
- package/dist/sdk/variant/trust.d.ts +27 -0
- package/dist/sdk/variant/trust.js +64 -0
- package/dist/sdk/variant/variant.d.ts +71 -0
- package/dist/sdk/variant/variant.js +331 -0
- package/dist/sdk/web/markdown.d.ts +10 -0
- package/dist/sdk/web/markdown.js +66 -0
- package/dist/sdk/web/safeRequest.d.ts +34 -0
- package/dist/sdk/web/safeRequest.js +175 -0
- package/dist/sdk/web/search.d.ts +53 -0
- package/dist/sdk/web/search.js +168 -0
- package/dist/sdk/web/text.d.ts +2 -0
- package/dist/sdk/web/text.js +7 -0
- package/dist/sdk/web/tools.d.ts +22 -0
- package/dist/sdk/web/tools.js +195 -0
- package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
- package/dist/sdk/wiki/notes.d.ts +68 -0
- package/dist/sdk/wiki/notes.js +297 -0
- package/dist/sdk/world/actions.d.ts +23 -0
- package/dist/sdk/world/actions.js +31 -0
- package/dist/sdk/world/cli.d.ts +12 -0
- package/dist/sdk/world/cli.js +166 -0
- package/dist/sdk/world/images.d.ts +20 -0
- package/dist/sdk/world/images.js +48 -0
- package/dist/sdk/world/untrusted.d.ts +12 -0
- package/dist/sdk/world/untrusted.js +20 -0
- package/dist/sdk/world/world.d.ts +65 -0
- package/dist/sdk/world/world.js +80 -0
- package/dist/terminal-opentui.js +13612 -0
- package/dist/terminal-pi.js +808 -151
- package/docs/README.md +22 -0
- package/docs/architecture/00-overview.md +159 -0
- package/docs/architecture/01-extension-points.md +78 -0
- package/docs/architecture/02-sessions-and-runs.md +146 -0
- package/docs/architecture/03-variants.md +95 -0
- package/docs/architecture/04-prompt.md +102 -0
- package/docs/architecture/05-refinement.md +107 -0
- package/docs/architecture/06-plugins-and-capabilities.md +93 -0
- package/docs/architecture/07-tools-and-gate.md +88 -0
- package/docs/architecture/08-memory-and-history.md +94 -0
- package/docs/architecture/09-accounts-and-connectors.md +90 -0
- package/docs/architecture/10-server-protocol.md +84 -0
- package/docs/architecture/11-terminal.md +81 -0
- package/docs/architecture/12-storage.md +61 -0
- package/docs/architecture/13-world-tools.md +23 -0
- package/docs/architecture/README.md +114 -0
- package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
- package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
- package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
- package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
- package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
- package/docs/architecture/proposals/PROP-0006-run-checklist.md +68 -0
- package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
- package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
- package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
- package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
- package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
- package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
- package/docs/architecture/proposals/README.md +76 -0
- package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
- package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
- package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
- package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
- package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
- package/docs/decisions/ADR-0007-reporting-section.md +33 -0
- package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
- package/docs/decisions/ADR-0009-xharness-command.md +38 -0
- package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
- package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
- package/docs/decisions/ADR-0012-native-session-names.md +34 -0
- package/docs/decisions/ADR-0013-doctor.md +27 -0
- package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
- package/docs/doctor.md +74 -0
- package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
- package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
- package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
- package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
- package/docs/features/README.md +20 -0
- package/docs/features/automations/README.md +41 -0
- package/docs/features/cores/README.md +39 -0
- package/docs/features/google-harness2/README.md +52 -0
- package/docs/features/integrations/README.md +40 -0
- package/docs/features/interfaces/README.md +29 -0
- package/docs/features/memory/README.md +28 -0
- package/docs/releases/1.0.0.md +40 -0
- package/docs/releases/README.md +36 -0
- package/docs/study/00-index.md +78 -0
- package/docs/study/arms/00-matrix.md +20 -0
- package/docs/study/arms/01-system-prompt.md +211 -0
- package/docs/study/arms/02-tools.md +79 -0
- package/docs/study/arms/03-subagents.md +90 -0
- package/docs/study/arms/04-skills.md +75 -0
- package/docs/study/arms/05-context-management.md +90 -0
- package/docs/study/arms/06-memory.md +90 -0
- package/docs/study/arms/07-governance.md +71 -0
- package/docs/study/arms/08-execution.md +69 -0
- package/docs/study/arms/09-observability.md +60 -0
- package/docs/study/arms/10-refinement.md +110 -0
- package/docs/study/btw-comparison.md +37 -0
- package/docs/study/feature-gap-review.md +42 -0
- package/docs/study/insights.md +123 -0
- package/docs/study/roadmap.md +72 -0
- package/docs/study/sources/claude-code.md +44 -0
- package/docs/study/sources/deepseek-harness.md +102 -0
- package/docs/study/sources/harness2.md +50 -0
- package/docs/study/sources/kimi-cli.md +42 -0
- package/docs/study/sources/omp.md +93 -0
- package/docs/study/sources/opencode.md +43 -0
- package/docs/study/sources/openhands.md +46 -0
- package/docs/study/sources/smolagents.md +40 -0
- package/docs/study/sources/swe-agent.md +34 -0
- package/docs/system-prompt-design.md +196 -0
- package/docs/terminal-tui.md +473 -56
- package/package.json +43 -13
- package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
- package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
- package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
- package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
- package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
- package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
- package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
- package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
- package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
- package/src/accounts/accounts.test.ts +0 -333
- package/src/accounts/accounts.ts +0 -658
- package/src/accounts/env.test.ts +0 -95
- package/src/accounts/env.ts +0 -338
- package/src/accounts/secrets.ts +0 -50
- package/src/accounts/store.ts +0 -338
- package/src/capabilities/api.ts +0 -75
- package/src/capabilities/runSnapshot.ts +0 -59
- package/src/capabilities/types.ts +0 -34
- package/src/cli.ts +0 -118
- package/src/core/bus.ts +0 -34
- package/src/core/changes.ts +0 -33
- package/src/core/env.ts +0 -27
- package/src/core/errors.ts +0 -32
- package/src/core/frontmatter.ts +0 -47
- package/src/core/fs.test.ts +0 -38
- package/src/core/fs.ts +0 -92
- package/src/core/index.ts +0 -193
- package/src/core/path.test.ts +0 -14
- package/src/core/path.ts +0 -79
- package/src/core/projects.ts +0 -90
- package/src/core/text.ts +0 -39
- package/src/harness.ts +0 -312
- package/src/hub/catalog.json +0 -123
- package/src/hub/cli.ts +0 -59
- package/src/hub/hub.test.ts +0 -205
- package/src/hub/hub.ts +0 -256
- package/src/hub/schema.ts +0 -81
- package/src/index.ts +0 -75
- package/src/mcp/connections.ts +0 -614
- package/src/mcp/manager.ts +0 -130
- package/src/mcp/oauth.ts +0 -195
- package/src/mcp/scopeMigration.test.ts +0 -79
- package/src/mcp/scopeMigration.ts +0 -204
- package/src/mcp/service.test.ts +0 -376
- package/src/mcp/service.ts +0 -549
- package/src/mcp/types.ts +0 -108
- package/src/memory/api.test.ts +0 -82
- package/src/memory/api.ts +0 -303
- package/src/memory/blocks.test.ts +0 -78
- package/src/memory/blocks.ts +0 -408
- package/src/memory/caller.ts +0 -69
- package/src/memory/curation.test.ts +0 -163
- package/src/memory/curation.ts +0 -64
- package/src/memory/dispatch.ts +0 -59
- package/src/memory/facts.test.ts +0 -41
- package/src/memory/facts.ts +0 -248
- package/src/memory/graph.ts +0 -103
- package/src/memory/health.test.ts +0 -130
- package/src/memory/health.ts +0 -74
- package/src/memory/maintainer.ts +0 -272
- package/src/memory/maintenance.test.ts +0 -176
- package/src/memory/maintenance.ts +0 -518
- package/src/memory/migrate.ts +0 -79
- package/src/memory/operations.ts +0 -150
- package/src/memory/proposals.test.ts +0 -168
- package/src/memory/proposals.ts +0 -584
- package/src/memory/recall.test.ts +0 -115
- package/src/memory/recall.ts +0 -278
- package/src/memory/references.ts +0 -77
- package/src/memory/runContext.ts +0 -93
- package/src/memory/secrets.ts +0 -6
- package/src/memory/store.test.ts +0 -66
- package/src/memory/store.ts +0 -385
- package/src/memory/wiki.test.ts +0 -47
- package/src/memory/wiki.ts +0 -422
- package/src/memory/wikiIndex.test.ts +0 -88
- package/src/memory/wikiIndex.ts +0 -116
- package/src/plugins/api.ts +0 -181
- package/src/plugins/attachments.test.ts +0 -84
- package/src/plugins/attachments.ts +0 -141
- package/src/plugins/builtin.ts +0 -82
- package/src/plugins/catalogue.test.ts +0 -254
- package/src/plugins/catalogue.ts +0 -251
- package/src/plugins/cli.ts +0 -184
- package/src/plugins/discover.ts +0 -151
- package/src/plugins/firstParty.test.ts +0 -143
- package/src/plugins/firstParty.ts +0 -129
- package/src/plugins/hooks.test.ts +0 -250
- package/src/plugins/hooks.ts +0 -239
- package/src/plugins/identity.ts +0 -37
- package/src/plugins/install.test.ts +0 -107
- package/src/plugins/install.ts +0 -106
- package/src/plugins/inventory.ts +0 -123
- package/src/plugins/manifest.ts +0 -76
- package/src/plugins/plugins.test.ts +0 -205
- package/src/plugins/plugins.ts +0 -189
- package/src/plugins/proposal.ts +0 -121
- package/src/plugins/runtime.test.ts +0 -40
- package/src/plugins/runtime.ts +0 -82
- package/src/plugins/trust.ts +0 -142
- package/src/plugins/types.ts +0 -149
- package/src/prompt/compile.test.ts +0 -261
- package/src/prompt/compile.ts +0 -732
- package/src/server/methods.ts +0 -349
- package/src/server/remote.ts +0 -77
- package/src/server/rpc.ts +0 -116
- package/src/server/serve.ts +0 -28
- package/src/server/server.test.ts +0 -174
- package/src/sessions/approvals.ts +0 -118
- package/src/sessions/contracts.ts +0 -336
- package/src/sessions/conversation.test.ts +0 -177
- package/src/sessions/extensionSession.test.ts +0 -74
- package/src/sessions/extensionUi.test.ts +0 -65
- package/src/sessions/extensionUi.ts +0 -102
- package/src/sessions/history.ts +0 -51
- package/src/sessions/lineageJoin.ts +0 -75
- package/src/sessions/policy.ts +0 -36
- package/src/sessions/pricing.ts +0 -60
- package/src/sessions/questionBatches.test.ts +0 -110
- package/src/sessions/reasoningSummaries.ts +0 -59
- package/src/sessions/registry.ts +0 -381
- package/src/sessions/runIndex.ts +0 -99
- package/src/sessions/runStore.test.ts +0 -152
- package/src/sessions/runStore.ts +0 -332
- package/src/sessions/runner.ts +0 -604
- package/src/sessions/runtimeResources.test.ts +0 -61
- package/src/sessions/sessions.test.ts +0 -549
- package/src/sessions/sessions.ts +0 -339
- package/src/skills/registry.test.ts +0 -104
- package/src/skills/registry.ts +0 -413
- package/src/terminal/accountsMenu.test.ts +0 -225
- package/src/terminal/accountsMenu.ts +0 -382
- package/src/terminal/cli.ts +0 -149
- package/src/terminal/client.ts +0 -74
- package/src/terminal/control.test.ts +0 -23
- package/src/terminal/control.ts +0 -23
- package/src/terminal/controller.ts +0 -291
- package/src/terminal/hubMenu.ts +0 -24
- package/src/terminal/launch.test.ts +0 -25
- package/src/terminal/launch.ts +0 -48
- package/src/terminal/piExtension.lifecycle.test.ts +0 -55
- package/src/terminal/piExtension.ts +0 -259
- package/src/terminal/pluginControl.test.ts +0 -146
- package/src/terminal/pluginMenu.ts +0 -112
- package/src/terminal/socket.test.ts +0 -71
- package/src/terminal/socket.ts +0 -232
- package/src/terminal/standalone.test.ts +0 -167
- package/src/terminal/standalone.ts +0 -153
- package/src/terminal/terminal.test.ts +0 -399
- package/src/terminal/terminals.ts +0 -553
- package/src/terminal/tui/application.test.ts +0 -114
- package/src/terminal/tui/application.ts +0 -491
- package/src/terminal/tui/commands.test.ts +0 -218
- package/src/terminal/tui/commands.ts +0 -361
- package/src/terminal/tui/dialogs.ts +0 -301
- package/src/terminal/tui/editor.test.ts +0 -84
- package/src/terminal/tui/editor.ts +0 -79
- package/src/terminal/tui/keybindings.test.ts +0 -22
- package/src/terminal/tui/keybindings.ts +0 -50
- package/src/terminal/tui/piAdapter.ts +0 -62
- package/src/terminal/tui/presentation.test.ts +0 -79
- package/src/terminal/tui/questions.test.ts +0 -41
- package/src/terminal/tui/questions.ts +0 -47
- package/src/terminal/tui/runtime.socket.test.ts +0 -104
- package/src/terminal/tui/runtime.test.ts +0 -215
- package/src/terminal/tui/runtime.ts +0 -388
- package/src/terminal/tui/sessionUi.ts +0 -24
- package/src/terminal/tui/settings.test.ts +0 -150
- package/src/terminal/tui/settings.ts +0 -188
- package/src/terminal/tui/status.test.ts +0 -70
- package/src/terminal/tui/status.ts +0 -109
- package/src/terminal/tui/theme.ts +0 -174
- package/src/terminal/tui/tools.test.ts +0 -145
- package/src/terminal/tui/tools.ts +0 -142
- package/src/terminal/tui/transcript.test.ts +0 -25
- package/src/terminal/tui/transcript.ts +0 -124
- package/src/terminal/tui/ui.test.ts +0 -313
- package/src/terminal/tui/ui.ts +0 -166
- package/src/terminal/tui/welcome.ts +0 -102
- package/src/tools/askUser.test.ts +0 -69
- package/src/tools/askUser.ts +0 -59
- package/src/tools/definitions.ts +0 -187
- package/src/tools/maintenance.ts +0 -24
- package/src/tools/memoryTools.ts +0 -22
- package/src/tools/pluginPropose.ts +0 -41
- package/src/tools/registryWrite.test.ts +0 -101
- package/src/tools/registryWrite.ts +0 -182
- package/src/tools/spawnSubagent.ts +0 -92
- package/src/tools/types.ts +0 -39
- package/src/web/safeRequest.ts +0 -171
- package/src/web/text.ts +0 -53
- package/src/web/tools.ts +0 -134
- package/src/web/web.test.ts +0 -141
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { Accounts } from "../accounts/accounts.js";
|
|
2
|
+
import type { CapabilitySet } from "../capabilities/types.js";
|
|
3
|
+
import type { CallerContext } from "../core/caller.js";
|
|
4
|
+
import type { DispatchEnv } from "../tools/dispatch.js";
|
|
5
|
+
import type { Plugins } from "../plugins/plugins.js";
|
|
6
|
+
import { type Launch } from "../prompt/compile.js";
|
|
7
|
+
import { type VariantChoice } from "../variant/materialise.js";
|
|
8
|
+
import type { VariantTrust } from "../variant/trust.js";
|
|
9
|
+
import type { ToolProvider, ToolSession, ToolSpec } from "../tools/types.js";
|
|
10
|
+
import type { RunRecord } from "./contracts.js";
|
|
11
|
+
import { type SubagentInput, type SubagentOptions } from "./subagents.js";
|
|
12
|
+
import type { Subagents } from "./subagentService.js";
|
|
13
|
+
import type { ToolPolicy } from "./policy.js";
|
|
14
|
+
import type { ActiveRun, RunRegistry } from "./registry.js";
|
|
15
|
+
import { type Effort, type SessionFactory, type ToolGate } from "./runner.js";
|
|
16
|
+
/** The fields of a run record the caller decides; the harness fills in the rest. */
|
|
17
|
+
export type RunFields = Pick<RunRecord, 'id' | 'sessionId'> & Partial<Pick<RunRecord, 'mode' | 'harness' | 'sessionType' | 'projectId' | 'agentId' | 'trigger' | 'goal' | 'attachmentCount' | 'resumedFromRunId' | 'parentRunId' | 'relation' | 'worktreeId' | 'handoffId'>>;
|
|
18
|
+
export interface SessionRunInput {
|
|
19
|
+
run: RunFields;
|
|
20
|
+
/** The account this session is pinned to. A new session may name a pool, or neither for the default. */
|
|
21
|
+
accountId?: string | null;
|
|
22
|
+
poolId?: string | null;
|
|
23
|
+
model?: string | null;
|
|
24
|
+
effort?: Effort | null;
|
|
25
|
+
cwd: string;
|
|
26
|
+
/** Where this session's native history lives. */
|
|
27
|
+
sessionDir: string;
|
|
28
|
+
/** Continue exactly this recorded history; never another one. */
|
|
29
|
+
resume?: {
|
|
30
|
+
sessionFile?: string | null;
|
|
31
|
+
nativeSessionId?: string | null;
|
|
32
|
+
} | null;
|
|
33
|
+
text: string;
|
|
34
|
+
/** Run this user-authored Bash command before prompting the model. */
|
|
35
|
+
initialBashCommand?: string;
|
|
36
|
+
/** A prior run's Bash attempt and result, supplied when retrying a ! command. */
|
|
37
|
+
initialBashContext?: {
|
|
38
|
+
runId: string;
|
|
39
|
+
status: 'completed' | 'incomplete' | 'unknown';
|
|
40
|
+
ok?: boolean;
|
|
41
|
+
output?: string;
|
|
42
|
+
};
|
|
43
|
+
images?: {
|
|
44
|
+
mediaType: string;
|
|
45
|
+
data: string;
|
|
46
|
+
}[];
|
|
47
|
+
/** Reject a resolved model that cannot inspect image content. */
|
|
48
|
+
requiresImageInput?: boolean;
|
|
49
|
+
preamble?: string | null;
|
|
50
|
+
/** Unattended: no project extensions, no context files, nothing may ask a person. */
|
|
51
|
+
automatic?: boolean;
|
|
52
|
+
/** Who the session works as, for history, the Wiki and the prompt. */
|
|
53
|
+
caller: CallerContext;
|
|
54
|
+
/**
|
|
55
|
+
* The variant the session runs: a scope's head (or a version of it), or a variant on disk.
|
|
56
|
+
* Its version is pinned for the whole run and recorded on it.
|
|
57
|
+
*/
|
|
58
|
+
variant?: VariantChoice | null;
|
|
59
|
+
/** What the application adds to the prompt, and which tools it describes. */
|
|
60
|
+
launch?: Launch;
|
|
61
|
+
/** The tools switched on, in the order the model sees them, and those that ask before each call. */
|
|
62
|
+
tools: {
|
|
63
|
+
allow: string[];
|
|
64
|
+
gated?: string[];
|
|
65
|
+
};
|
|
66
|
+
/** Give the session the connected-apps broker. */
|
|
67
|
+
connections?: boolean | {
|
|
68
|
+
readOnly?: boolean;
|
|
69
|
+
};
|
|
70
|
+
/** Optional narrower set for a child run; the harness intersects it with current availability. */
|
|
71
|
+
capabilities?: CapabilitySet;
|
|
72
|
+
/** Hops from the user to this session (0 when the user started it). */
|
|
73
|
+
depth?: number;
|
|
74
|
+
/** Interactive default: native child tools. Null disables; unattended callers must opt in. */
|
|
75
|
+
subagents?: SubagentOptions | null;
|
|
76
|
+
/** Ask the application's tool providers for tools (the default). False runs with the harness's own tools only. */
|
|
77
|
+
providers?: boolean;
|
|
78
|
+
/** Give the session the harness's own tools: History, the Wiki, skills, and asking the user (the default). */
|
|
79
|
+
harnessTools?: boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Plan mode: the run may only read, search, recall and ask, and is told to end with a
|
|
82
|
+
* `<proposed_plan>` block. Other calls are refused at the gate; the tool list is unchanged.
|
|
83
|
+
*/
|
|
84
|
+
plan?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Continue a run that stopped before it finished: the earlier run's id. The new run reopens its
|
|
87
|
+
* native history and pins its account, variant version and capability set, and the model is told
|
|
88
|
+
* where it stopped. The harness never does this by itself; the application asks for it.
|
|
89
|
+
*/
|
|
90
|
+
continueFrom?: string | null;
|
|
91
|
+
}
|
|
92
|
+
/** The connected-apps broker, as a session sees it. */
|
|
93
|
+
export interface SessionBroker {
|
|
94
|
+
toolNames: readonly string[];
|
|
95
|
+
tools(session: ToolSession, options: {
|
|
96
|
+
readOnly: boolean;
|
|
97
|
+
}): ToolSpec[];
|
|
98
|
+
}
|
|
99
|
+
export interface SessionsOptions {
|
|
100
|
+
subagents: Subagents;
|
|
101
|
+
env: DispatchEnv;
|
|
102
|
+
accounts: Accounts;
|
|
103
|
+
runs: RunRegistry;
|
|
104
|
+
policy: ToolPolicy;
|
|
105
|
+
broker?: SessionBroker | null;
|
|
106
|
+
/** Chooses what a session loads. Without it Pi discovers extensions and skills on its own. */
|
|
107
|
+
plugins?: Plugins;
|
|
108
|
+
/** Resolves the caller's capability set from the harness's stores. */
|
|
109
|
+
resolveCapabilities?: (caller: CallerContext, tools: readonly string[], cwd: string) => Promise<CapabilitySet>;
|
|
110
|
+
factory?: SessionFactory;
|
|
111
|
+
/** Which plugin code in variants a person trusted. */
|
|
112
|
+
trust?: VariantTrust | null;
|
|
113
|
+
}
|
|
114
|
+
export declare class Sessions {
|
|
115
|
+
private readonly options;
|
|
116
|
+
private readonly providers;
|
|
117
|
+
private readonly factory;
|
|
118
|
+
constructor(options: SessionsOptions);
|
|
119
|
+
private get env();
|
|
120
|
+
/** Adds tools an application provides. Providers are asked in the order they were added. */
|
|
121
|
+
provide(provider: ToolProvider): void;
|
|
122
|
+
diagnostics(context: import("../doctor/types.js").DoctorContext): Promise<import("../doctor/types.js").DoctorCheck[]>;
|
|
123
|
+
/** The same registered providers used by real runs; no native Pi session is constructed. */
|
|
124
|
+
diagnosticTools(session: import("../tools/types.js").ToolSession): Promise<import("../tools/types.js").ToolSpec[]>;
|
|
125
|
+
diagnosticGate(run: ActiveRun, caller: CallerContext): ToolGate;
|
|
126
|
+
private gate;
|
|
127
|
+
/** Compatibility alias for the shared native service. */
|
|
128
|
+
spawnSubagent(request: SubagentInput): Promise<{
|
|
129
|
+
runId: string;
|
|
130
|
+
nativeSessionId: string | null;
|
|
131
|
+
}>;
|
|
132
|
+
/**
|
|
133
|
+
* Starts one turn. Returns once the Pi session is open; the reply arrives as run events. A
|
|
134
|
+
* session that cannot be opened ends its run as failed and returns no native session id.
|
|
135
|
+
*/
|
|
136
|
+
run(input: SessionRunInput): Promise<{
|
|
137
|
+
runId: string;
|
|
138
|
+
nativeSessionId: string | null;
|
|
139
|
+
}>;
|
|
140
|
+
}
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
// Starting a session turn: the account, the run record, the compiled prompt, the tools and
|
|
2
|
+
// their gate, then Pi. Everything before Pi answers is synchronous with the caller; the reply
|
|
3
|
+
// itself streams as run events.
|
|
4
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { log } from "../core/bus.js";
|
|
7
|
+
import { HarnessError, invalid } from "../core/errors.js";
|
|
8
|
+
import { capabilitySet as parseCapabilitySet, freezeRun } from "../capabilities/runSnapshot.js";
|
|
9
|
+
import { now, writeJson } from "../core/fs.js";
|
|
10
|
+
import { takeChars } from "../core/text.js";
|
|
11
|
+
import { sessionLaunch } from "../prompt/compile.js";
|
|
12
|
+
import * as attachments from "../plugins/attachments.js";
|
|
13
|
+
import { FIRST_PARTY_PLUGINS, firstPartyExtensions } from "../plugins/firstParty.js";
|
|
14
|
+
import { imagePruning } from "../world/images.js";
|
|
15
|
+
import { materialise } from "../variant/materialise.js";
|
|
16
|
+
import { ASK_USER, askUserTool } from "../tools/askUser.js";
|
|
17
|
+
import { CHECKLIST_WRITE, checklistTool } from "../tools/checklist.js";
|
|
18
|
+
import { SESSION_NAME, sessionNameTool } from "../tools/sessionName.js";
|
|
19
|
+
import { subagentTools } from "../tools/spawnSubagent.js";
|
|
20
|
+
import { DEFAULT_TOOL_NAMES } from "../tools/definitions.js";
|
|
21
|
+
import { harnessTools } from "../tools/harnessTools.js";
|
|
22
|
+
import { SPAWN_SUBAGENT, WAIT_SUBAGENTS, subagentDepth, subagentHistory, subagentNesting } from "./subagents.js";
|
|
23
|
+
import { selectHistory } from "./history.js";
|
|
24
|
+
import { runLineageJoin } from "./lineageJoin.js";
|
|
25
|
+
import { piSessionFactory, runTurn, summarize } from "./runner.js";
|
|
26
|
+
import { loadRun, runDir, saveRun, updateRun } from "./runStore.js";
|
|
27
|
+
import { planRefusal, planSection } from "./planMode.js";
|
|
28
|
+
import { CONTINUATION_SECTION_ID, continuationOf, continuationSection } from "./continuation.js";
|
|
29
|
+
import { deliveredSnapshot } from "../prompt/compile.js";
|
|
30
|
+
const CONTINUE_TEXT = 'Continue from where you stopped.';
|
|
31
|
+
/** Fills a continuing run's input from the run it continues, refusing anything that would differ. */
|
|
32
|
+
function continueInput(root, input) {
|
|
33
|
+
const continuation = continuationOf(root, input.continueFrom, input.sessionDir);
|
|
34
|
+
if (!continuation.resumable || !continuation.resume)
|
|
35
|
+
throw new HarnessError('continuation_unavailable', `Run ${input.continueFrom} cannot be continued (${continuation.reason ?? 'history_missing'}).`);
|
|
36
|
+
const mismatch = (what) => new HarnessError('continuation_mismatch', `A continuation keeps the earlier run's ${what}.`);
|
|
37
|
+
if (continuation.sessionId !== input.run.sessionId)
|
|
38
|
+
throw mismatch('session');
|
|
39
|
+
if (input.resume?.nativeSessionId && input.resume.nativeSessionId !== continuation.resume.nativeSessionId)
|
|
40
|
+
throw mismatch('history');
|
|
41
|
+
if (input.accountId && input.accountId !== continuation.accountId)
|
|
42
|
+
throw mismatch('account');
|
|
43
|
+
const pinned = continuation.variant;
|
|
44
|
+
const chosen = input.variant ?? null;
|
|
45
|
+
if (chosen && (!pinned || 'dir' in chosen || chosen.scope !== pinned.scope || (chosen.version && chosen.version !== pinned.version)))
|
|
46
|
+
throw mismatch('harness version');
|
|
47
|
+
input.resume = continuation.resume;
|
|
48
|
+
input.run.resumedFromRunId ??= continuation.runId;
|
|
49
|
+
input.accountId = continuation.accountId;
|
|
50
|
+
input.poolId = null;
|
|
51
|
+
if (pinned)
|
|
52
|
+
input.variant = { scope: pinned.scope, version: pinned.version };
|
|
53
|
+
if (!input.capabilities && continuation.capabilities)
|
|
54
|
+
input.capabilities = continuation.capabilities;
|
|
55
|
+
if (!input.text.trim())
|
|
56
|
+
input.text = CONTINUE_TEXT;
|
|
57
|
+
return continuation;
|
|
58
|
+
}
|
|
59
|
+
/** The harness's own plugins a person switched on for this caller, with the numbers they set. */
|
|
60
|
+
function firstPartyFor(root, contributions) {
|
|
61
|
+
const choices = attachments.load(root);
|
|
62
|
+
const allowed = new Set(contributions);
|
|
63
|
+
return firstPartyExtensions((id) => FIRST_PARTY_PLUGINS.find((plugin) => plugin.id === id)?.code?.some((code) => allowed.has(`${id}/code/${code.name}`)) ?? false, choices.settings);
|
|
64
|
+
}
|
|
65
|
+
export class Sessions {
|
|
66
|
+
options;
|
|
67
|
+
providers = [];
|
|
68
|
+
factory;
|
|
69
|
+
constructor(options) {
|
|
70
|
+
this.options = options;
|
|
71
|
+
this.factory = options.factory ?? piSessionFactory;
|
|
72
|
+
}
|
|
73
|
+
get env() {
|
|
74
|
+
return this.options.env;
|
|
75
|
+
}
|
|
76
|
+
/** Adds tools an application provides. Providers are asked in the order they were added. */
|
|
77
|
+
provide(provider) {
|
|
78
|
+
this.providers.push(provider);
|
|
79
|
+
}
|
|
80
|
+
async diagnostics(context) {
|
|
81
|
+
const results = await Promise.allSettled(this.providers.map(provider => Promise.resolve().then(() => provider.diagnostics?.(context) ?? [])));
|
|
82
|
+
return results.flatMap((result, index) => result.status === 'fulfilled' ? result.value : [{
|
|
83
|
+
id: `provider.${index}`, category: 'tools', title: 'Provider diagnostics',
|
|
84
|
+
local: async () => ({ status: 'fail', evidence: 'This provider could not describe its readiness checks.', remedy: 'Review the provider configuration.' })
|
|
85
|
+
}]);
|
|
86
|
+
}
|
|
87
|
+
/** The same registered providers used by real runs; no native Pi session is constructed. */
|
|
88
|
+
async diagnosticTools(session) {
|
|
89
|
+
return (await Promise.all(this.providers.map(provider => provider(session)))).flat();
|
|
90
|
+
}
|
|
91
|
+
diagnosticGate(run, caller) {
|
|
92
|
+
return this.gate(run, caller, new Set(), true);
|
|
93
|
+
}
|
|
94
|
+
gate(run, caller, gated, diagnostic = false) {
|
|
95
|
+
const { policy } = this.options;
|
|
96
|
+
return {
|
|
97
|
+
ask: (names) => {
|
|
98
|
+
for (const name of names)
|
|
99
|
+
gated.add(name);
|
|
100
|
+
},
|
|
101
|
+
check: async (tool, args) => {
|
|
102
|
+
const call = { run: loadRun(this.env.root, run.runId), caller, tool, args };
|
|
103
|
+
const scope = (await policy.scope?.(call)) ?? { allowed: true };
|
|
104
|
+
if (!scope.allowed && (scope.automatic || !scope.requiresApproval))
|
|
105
|
+
return scope.reason ?? 'Outside the approved work scope.';
|
|
106
|
+
try {
|
|
107
|
+
await policy.authorize?.(call);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
return error instanceof Error ? error.message : 'Tool unavailable in the app settings.';
|
|
111
|
+
}
|
|
112
|
+
if (scope.allowed && !scope.humanOnly && (scope.automatic || !gated.has(tool)))
|
|
113
|
+
return null;
|
|
114
|
+
if (diagnostic)
|
|
115
|
+
return 'This diagnostic call requires a separate per-call approval.';
|
|
116
|
+
// Refinement and reflection runs have nobody to ask: what would need a person is refused, never queued.
|
|
117
|
+
if (call.run.trigger === 'probe' || call.run.trigger === 'improver')
|
|
118
|
+
return scope.reason ? `Refused in a refinement run: ${scope.reason}` : 'Refused in a refinement run: this call needs a person to approve it.';
|
|
119
|
+
if (call.run.trigger === 'reflection')
|
|
120
|
+
return scope.reason ? `Refused in a reflection run: ${scope.reason}` : 'Refused in a reflection run: this call needs a person to approve it.';
|
|
121
|
+
// A call outside the scope is approved one at a time; a gated tool may be remembered, unless only a person may decide it.
|
|
122
|
+
const decision = await run.requestApproval({
|
|
123
|
+
target: tool,
|
|
124
|
+
action: summarize(args),
|
|
125
|
+
operation: { tool, args: (args && typeof args === 'object' ? args : {}) },
|
|
126
|
+
rememberable: scope.allowed && !scope.humanOnly,
|
|
127
|
+
standing: scope.humanOnly ? (scope.allowGlobalApproval ? 'switch' : 'none') : undefined
|
|
128
|
+
});
|
|
129
|
+
if (decision !== 'approved')
|
|
130
|
+
return 'The user denied this action. Ask how they would like to proceed.';
|
|
131
|
+
try {
|
|
132
|
+
await policy.authorize?.(call);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
return error instanceof Error ? error.message : 'Tool was disabled while waiting.';
|
|
136
|
+
}
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/** Compatibility alias for the shared native service. */
|
|
142
|
+
spawnSubagent(request) {
|
|
143
|
+
return this.options.subagents.spawn(request);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Starts one turn. Returns once the Pi session is open; the reply arrives as run events. A
|
|
147
|
+
* session that cannot be opened ends its run as failed and returns no native session id.
|
|
148
|
+
*/
|
|
149
|
+
async run(input) {
|
|
150
|
+
const { root } = this.env;
|
|
151
|
+
if (!input?.run?.id || !input.run.sessionId || typeof input.text !== 'string')
|
|
152
|
+
throw invalid('A session turn needs a run id, a session, and text.');
|
|
153
|
+
input = structuredClone(input);
|
|
154
|
+
if ((input.initialBashCommand !== undefined && input.initialBashCommand !== null) || (input.initialBashContext !== undefined && input.initialBashContext !== null)) {
|
|
155
|
+
const request = input.text.trimStart();
|
|
156
|
+
const requestedCommand = /^!\s*([\s\S]+)$/u.exec(request)?.[1];
|
|
157
|
+
if (!requestedCommand?.trim())
|
|
158
|
+
throw invalid('An initial Bash command must match a non-empty leading ! command in the user text.');
|
|
159
|
+
if (input.initialBashCommand != null) {
|
|
160
|
+
const matchesRequest = requestedCommand === input.initialBashCommand || requestedCommand.startsWith(`${input.initialBashCommand}\n\nAttached saved file references:`);
|
|
161
|
+
if (!input.initialBashCommand.trim() || !matchesRequest)
|
|
162
|
+
throw invalid('An initial Bash command must match a non-empty leading ! command in the user text.');
|
|
163
|
+
}
|
|
164
|
+
if (input.initialBashContext != null && (input.initialBashCommand != null
|
|
165
|
+
|| typeof input.initialBashContext.runId !== 'string'
|
|
166
|
+
|| !input.initialBashContext.runId.trim()
|
|
167
|
+
|| input.initialBashContext.runId.length > 256
|
|
168
|
+
|| typeof input.initialBashContext.status !== 'string'
|
|
169
|
+
|| !['completed', 'incomplete', 'unknown'].includes(input.initialBashContext.status)
|
|
170
|
+
|| input.initialBashContext.output !== undefined && typeof input.initialBashContext.output !== 'string'
|
|
171
|
+
|| (input.initialBashContext.output?.length ?? 0) > 24_000
|
|
172
|
+
|| input.initialBashContext.ok !== undefined && typeof input.initialBashContext.ok !== 'boolean')) {
|
|
173
|
+
throw invalid('A prior Bash result must be bounded and must not be combined with a new initial Bash command.');
|
|
174
|
+
}
|
|
175
|
+
if (input.automatic || input.plan || input.resume || input.continueFrom || input.run.relation || input.run.trigger != null && input.run.trigger !== 'user') {
|
|
176
|
+
throw invalid('An initial Bash command is available only for a new interactive user turn.');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const continuation = input.continueFrom ? continueInput(root, input) : null;
|
|
180
|
+
const historyFile = selectHistory({ sessionDir: input.sessionDir, resume: input.resume });
|
|
181
|
+
const account = this.options.accounts.resolve(input.accountId, input.poolId);
|
|
182
|
+
const context = this.options.accounts.context(account);
|
|
183
|
+
const runId = input.run.id;
|
|
184
|
+
const caller = { ...input.caller, runId, sessionId: input.caller.sessionId ?? input.run.sessionId };
|
|
185
|
+
const broker = input.connections ? this.options.broker : null;
|
|
186
|
+
const depth = input.depth ?? 0;
|
|
187
|
+
const canSpawn = input.subagents !== null && (!input.automatic || input.subagents !== undefined) && subagentNesting(root, input.run) < subagentDepth(input.subagents ?? undefined);
|
|
188
|
+
const requestedTools = [...new Set([
|
|
189
|
+
...input.tools.allow.filter((name) => name !== SPAWN_SUBAGENT && name !== WAIT_SUBAGENTS),
|
|
190
|
+
...(input.harnessTools === false ? [] : [ASK_USER, CHECKLIST_WRITE, SESSION_NAME, ...DEFAULT_TOOL_NAMES]),
|
|
191
|
+
...(broker?.toolNames ?? []),
|
|
192
|
+
...(canSpawn ? [SPAWN_SUBAGENT, WAIT_SUBAGENTS] : [])
|
|
193
|
+
])];
|
|
194
|
+
const available = this.options.resolveCapabilities
|
|
195
|
+
? await this.options.resolveCapabilities(caller, requestedTools, input.cwd)
|
|
196
|
+
: { version: 1, tools: requestedTools, connectors: [], contributions: [] };
|
|
197
|
+
const requested = input.capabilities ? parseCapabilitySet(input.capabilities) : available;
|
|
198
|
+
const capabilities = {
|
|
199
|
+
version: 1,
|
|
200
|
+
tools: available.tools.filter((tool) => requested.tools.includes(tool)),
|
|
201
|
+
connectors: available.connectors.filter((id) => requested.connectors.includes(id)),
|
|
202
|
+
contributions: available.contributions.filter((id) => requested.contributions.includes(id))
|
|
203
|
+
};
|
|
204
|
+
freezeRun(root, runId, caller, capabilities);
|
|
205
|
+
// The harness is resolved once and pinned: a child run or a later turn of this run uses the
|
|
206
|
+
// same files even if the head moves meanwhile.
|
|
207
|
+
let variant = null;
|
|
208
|
+
if (input.variant) {
|
|
209
|
+
const scope = input.variant.scope ?? null;
|
|
210
|
+
const trust = this.options.trust ?? null;
|
|
211
|
+
variant = materialise(root, input.variant, { trust, probeCode: input.run.trigger === 'probe' && Boolean(scope && trust?.probeCode(scope)), subagents: capabilities.tools.includes(SPAWN_SUBAGENT) });
|
|
212
|
+
input.variant = { dir: variant.dir, scope: variant.scope };
|
|
213
|
+
}
|
|
214
|
+
saveRun(root, {
|
|
215
|
+
resumedFromRunId: input.run.resumedFromRunId ?? null,
|
|
216
|
+
parentRunId: input.run.parentRunId ?? null,
|
|
217
|
+
relation: input.run.relation ?? null,
|
|
218
|
+
terminalReason: null,
|
|
219
|
+
id: runId,
|
|
220
|
+
projectId: input.run.projectId ?? caller.projectId ?? null,
|
|
221
|
+
mode: input.run.mode ?? 'chat',
|
|
222
|
+
harness: input.run.harness ?? 'pi',
|
|
223
|
+
sessionType: input.run.sessionType ?? 'structured',
|
|
224
|
+
sessionId: input.run.sessionId,
|
|
225
|
+
nativeSessionId: null,
|
|
226
|
+
workingDirectory: input.cwd,
|
|
227
|
+
worktreeId: input.run.worktreeId ?? null,
|
|
228
|
+
goal: input.run.goal ?? takeChars(input.text, 4000),
|
|
229
|
+
attachmentCount: input.run.attachmentCount ?? 0,
|
|
230
|
+
startedAt: now(),
|
|
231
|
+
endedAt: null,
|
|
232
|
+
status: 'queued',
|
|
233
|
+
exitCode: null,
|
|
234
|
+
handoffId: input.run.handoffId ?? null,
|
|
235
|
+
accountId: account.id,
|
|
236
|
+
agentId: input.run.agentId ?? caller.agentId ?? null,
|
|
237
|
+
trigger: input.run.trigger ?? null,
|
|
238
|
+
variantScope: variant?.scope ?? null,
|
|
239
|
+
variantVersion: variant?.fingerprint ?? null
|
|
240
|
+
});
|
|
241
|
+
// What the session is, kept with the run so later consolidation knows which memory it had.
|
|
242
|
+
try {
|
|
243
|
+
writeJson(join(runDir(root, runId), 'caller.json'), caller);
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
// Consolidation falls back to what the run record says.
|
|
247
|
+
}
|
|
248
|
+
const fail = (error, code = 'provider_unavailable') => {
|
|
249
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
250
|
+
updateRun(root, runId, (record) => Object.assign(record, { status: 'failed', endedAt: now(), terminalReason: message }));
|
|
251
|
+
log(`session ${runId} did not start: ${message}`, code);
|
|
252
|
+
};
|
|
253
|
+
let system;
|
|
254
|
+
let update;
|
|
255
|
+
try {
|
|
256
|
+
if (!existsSync(input.sessionDir))
|
|
257
|
+
mkdirSync(input.sessionDir, { recursive: true });
|
|
258
|
+
const launch = input.launch ?? {};
|
|
259
|
+
const plan = planSection(input.plan === true, historyFile);
|
|
260
|
+
const delivered = historyFile ? deliveredSnapshot(historyFile) : null;
|
|
261
|
+
const resumed = continuationSection(continuation, delivered?.some((entry) => entry.id === CONTINUATION_SECTION_ID) ?? false);
|
|
262
|
+
const own = [plan, resumed].filter((section) => section !== null);
|
|
263
|
+
const effectiveLaunch = {
|
|
264
|
+
...launch,
|
|
265
|
+
sections: own.length ? [...(launch.sections ?? []).filter((section) => !own.some((entry) => entry.id === section.id)), ...own] : launch.sections,
|
|
266
|
+
tools: capabilities.tools,
|
|
267
|
+
connectionTools: (launch.connectionTools ?? []).filter((name) => capabilities.tools.includes(name)),
|
|
268
|
+
toolGroups: launch.toolGroups?.map((group) => ({ ...group, tools: group.tools.filter((name) => capabilities.tools.includes(name)) })).filter((group) => group.tools.length > 0)
|
|
269
|
+
};
|
|
270
|
+
({ system, update } = sessionLaunch(this.env, caller, effectiveLaunch, historyFile, variant));
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
fail(error);
|
|
274
|
+
throw error;
|
|
275
|
+
}
|
|
276
|
+
const run = this.options.runs.start(input.run.sessionId, runId);
|
|
277
|
+
if (run.finished)
|
|
278
|
+
return { runId, nativeSessionId: null };
|
|
279
|
+
if (variant?.untrustedPlugins.length) {
|
|
280
|
+
run.emit('extension.notice', { kind: 'notify', level: 'warning', text: `Harness plugins not loaded until their code is trusted: ${variant.untrustedPlugins.join(', ')}.` });
|
|
281
|
+
}
|
|
282
|
+
// What every session has, after the tools the caller switched on and in a fixed order.
|
|
283
|
+
const allow = capabilities.tools;
|
|
284
|
+
const session = { run, caller, allow, depth, cwd: input.cwd, capabilities };
|
|
285
|
+
const { plugins } = this.options;
|
|
286
|
+
let pi;
|
|
287
|
+
const naming = sessionNameTool(() => {
|
|
288
|
+
const current = pi;
|
|
289
|
+
if (!current?.setSessionName)
|
|
290
|
+
return undefined;
|
|
291
|
+
return {
|
|
292
|
+
get sessionName() { return current.sessionName; },
|
|
293
|
+
setSessionName: name => current.setSessionName(name)
|
|
294
|
+
};
|
|
295
|
+
});
|
|
296
|
+
try {
|
|
297
|
+
const tools = [
|
|
298
|
+
...(broker ? broker.tools(session, { readOnly: typeof input.connections === 'object' && input.connections.readOnly === true }) : []),
|
|
299
|
+
...(input.harnessTools === false ? [] : [...harnessTools(this.options.env, caller, { variantDir: variant?.dir ?? null }), askUserTool(run), checklistTool(run), naming]),
|
|
300
|
+
...subagentTools(this.options.subagents, runId).filter(tool => allow.includes(tool.name))
|
|
301
|
+
];
|
|
302
|
+
if (input.providers !== false) {
|
|
303
|
+
const named = new Set(tools.map((tool) => tool.name));
|
|
304
|
+
for (const provider of this.providers) {
|
|
305
|
+
for (const tool of await provider(session)) {
|
|
306
|
+
// The first tool of a name wins: the harness's own world tools are asked first.
|
|
307
|
+
if (named.has(tool.name))
|
|
308
|
+
continue;
|
|
309
|
+
named.add(tool.name);
|
|
310
|
+
tools.push(tool);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
const readOnly = new Set(tools.filter((tool) => tool.readOnly).map((tool) => tool.name));
|
|
315
|
+
const planModeSafety = new Map();
|
|
316
|
+
for (const tool of tools)
|
|
317
|
+
if (tool.planModeSafe)
|
|
318
|
+
planModeSafety.set(tool.name, tool.planModeSafe);
|
|
319
|
+
const gate = (() => {
|
|
320
|
+
const baseGate = this.gate(run, caller, new Set((input.tools.gated ?? []).filter((name) => capabilities.tools.includes(name))));
|
|
321
|
+
return {
|
|
322
|
+
...baseGate,
|
|
323
|
+
check: (name, args) => {
|
|
324
|
+
if (input.run.relation === 'subagent' && !capabilities.tools.includes(name))
|
|
325
|
+
return Promise.resolve('This tool is outside the child capability snapshot.');
|
|
326
|
+
const refusal = input.plan ? planRefusal(name, readOnly, args, planModeSafety.get(name)) : null;
|
|
327
|
+
return refusal ? Promise.resolve(refusal) : baseGate.check(name, args);
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
})();
|
|
331
|
+
const params = {
|
|
332
|
+
runId,
|
|
333
|
+
...(input.initialBashCommand !== undefined && input.initialBashCommand !== null ? { initialBashCommand: input.initialBashCommand, initialBashAvailable: capabilities.tools.includes('bash') } : {}),
|
|
334
|
+
...(input.initialBashContext !== undefined && input.initialBashContext !== null ? { initialBashContext: input.initialBashContext } : {}),
|
|
335
|
+
gate,
|
|
336
|
+
restrictTools: input.run.relation === 'subagent',
|
|
337
|
+
cwd: input.cwd,
|
|
338
|
+
sessionDir: input.sessionDir,
|
|
339
|
+
historyFile,
|
|
340
|
+
model: input.model ?? null,
|
|
341
|
+
effort: input.effort ?? null,
|
|
342
|
+
text: input.text,
|
|
343
|
+
images: input.images,
|
|
344
|
+
requiresImageInput: input.requiresImageInput,
|
|
345
|
+
preamble: input.preamble ?? null,
|
|
346
|
+
automatic: input.automatic,
|
|
347
|
+
account: context,
|
|
348
|
+
resources: { ids: [], skillPaths: variant?.skillPaths ?? [], promptPaths: [] },
|
|
349
|
+
variantExtensions: variant?.extensionPaths ?? [],
|
|
350
|
+
inline: [...firstPartyFor(root, capabilities.contributions), runLineageJoin(root, runId), this.options.subagents.extension(runId), { name: 'image-pruning', factory: imagePruning() }],
|
|
351
|
+
...(plugins ? { plugins: { loading: () => plugins.loading({ cwd: input.cwd, agentDir: context.configDir, install: true, caller: { agentId: caller.agentId ?? null, projectId: caller.projectId ?? null }, contributions: capabilities.contributions }), loaded: (extensions) => plugins.loaded(extensions) } } : {}),
|
|
352
|
+
system,
|
|
353
|
+
update
|
|
354
|
+
};
|
|
355
|
+
pi = await this.factory({
|
|
356
|
+
params,
|
|
357
|
+
allow,
|
|
358
|
+
gate,
|
|
359
|
+
tools,
|
|
360
|
+
runtime: () => this.options.accounts.runtime(context),
|
|
361
|
+
// An unattended run loads no extension, so it has nobody to relay for.
|
|
362
|
+
...(input.automatic ? {} : { extensions: { ask: (question) => run.requestAnswer(question), notice: (notice) => run.emit('extension.notice', notice) } })
|
|
363
|
+
});
|
|
364
|
+
if (run.finished) {
|
|
365
|
+
pi.dispose();
|
|
366
|
+
return { runId, nativeSessionId: null };
|
|
367
|
+
}
|
|
368
|
+
if ((input.requiresImageInput || input.images?.length) && !pi.model?.input.includes('image')) {
|
|
369
|
+
throw new HarnessError('image_input_unsupported', 'Choose a model that supports images, or remove the image attachments and send again.');
|
|
370
|
+
}
|
|
371
|
+
if (input.resume?.nativeSessionId && pi.sessionId !== input.resume.nativeSessionId) {
|
|
372
|
+
run.finish('failed', { code: 'native_resume_unavailable', message: 'The saved conversation could not be restored.' });
|
|
373
|
+
throw new HarnessError('native_resume_unavailable', 'The saved conversation could not be restored.');
|
|
374
|
+
}
|
|
375
|
+
const opened = pi;
|
|
376
|
+
updateRun(root, runId, (record) => void (record.nativeSessionId = opened.sessionId));
|
|
377
|
+
this.options.subagents.register(input, account.id, capabilities, Boolean(pi.sessionManager));
|
|
378
|
+
if (pi.model?.id && pi.model.provider)
|
|
379
|
+
this.options.subagents.resolvedModel(runId, `${pi.model.provider}/${pi.model.id}`, pi.thinkingLevel);
|
|
380
|
+
params.settle = () => this.options.subagents.verify(runId, opened.sessionManager ? subagentHistory(opened.sessionManager.getBranch()) : undefined);
|
|
381
|
+
void runTurn(run, pi, params);
|
|
382
|
+
return { runId, nativeSessionId: pi.sessionId };
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
pi?.dispose();
|
|
386
|
+
if (error instanceof HarnessError && error.code === 'native_resume_unavailable')
|
|
387
|
+
throw error;
|
|
388
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
389
|
+
log('session failed to start', message);
|
|
390
|
+
run.finish('failed', { code: error instanceof HarnessError ? error.code : 'provider_unavailable', message });
|
|
391
|
+
return { runId, nativeSessionId: null };
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { CapabilitySet } from "../capabilities/types.js";
|
|
2
|
+
import type { HarnessEnv } from "../core/env.js";
|
|
3
|
+
import type { InlineExtension } from "../plugins/firstParty.js";
|
|
4
|
+
import type { RunRegistry } from "./registry.js";
|
|
5
|
+
import type { Effort } from "./runner.js";
|
|
6
|
+
import type { SessionRunInput } from "./sessions.js";
|
|
7
|
+
import { type SubagentInput, type SubagentReceipt, type SubagentResult, type SubagentSelection } from "./subagents.js";
|
|
8
|
+
type Started = {
|
|
9
|
+
runId: string;
|
|
10
|
+
nativeSessionId: string | null;
|
|
11
|
+
};
|
|
12
|
+
export interface SubagentHistory {
|
|
13
|
+
owners: string[];
|
|
14
|
+
receipts: SubagentReceipt[];
|
|
15
|
+
}
|
|
16
|
+
/** One owner of native child execution and delivery, shared by SDK and terminal adapters. */
|
|
17
|
+
export declare class Subagents {
|
|
18
|
+
private readonly env;
|
|
19
|
+
private readonly runs;
|
|
20
|
+
private readonly launch;
|
|
21
|
+
private readonly parents;
|
|
22
|
+
constructor(env: HarnessEnv, runs: RunRegistry, launch: (input: SessionRunInput) => Promise<Started>);
|
|
23
|
+
/** Internal adapter contract: context comes from a live run, never from model arguments. */
|
|
24
|
+
register(input: SessionRunInput, accountId: string, capabilities: CapabilitySet, deferUntilPrompt?: boolean): void;
|
|
25
|
+
resolvedModel(runId: string, model: string, effort?: Effort): void;
|
|
26
|
+
private parent;
|
|
27
|
+
spawn(request: SubagentInput): Promise<Started>;
|
|
28
|
+
private selected;
|
|
29
|
+
results(selection: SubagentSelection): SubagentResult[];
|
|
30
|
+
wait(selection: SubagentSelection, signal?: AbortSignal): Promise<SubagentResult[]>;
|
|
31
|
+
/** Reconcile only owners present on the selected native branch, with matching account and caller. */
|
|
32
|
+
restore(parentRunId: string, history: SubagentHistory): void;
|
|
33
|
+
delivery(parentRunId: string, history: SubagentHistory, settle: boolean, signal?: AbortSignal): Promise<{
|
|
34
|
+
text: string;
|
|
35
|
+
receipt: SubagentReceipt;
|
|
36
|
+
} | null>;
|
|
37
|
+
/** A broken adapter must fail visibly rather than complete with an undelivered child result. */
|
|
38
|
+
verify(parentRunId: string, history?: SubagentHistory): Promise<void>;
|
|
39
|
+
extension(runId: string): InlineExtension;
|
|
40
|
+
}
|
|
41
|
+
export {};
|