@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,247 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { loadRun as loadCapabilities } from "../capabilities/runSnapshot.js";
|
|
4
|
+
import { HarnessError, invalid } from "../core/errors.js";
|
|
5
|
+
import { now } from "../core/fs.js";
|
|
6
|
+
import { takeChars } from "../core/text.js";
|
|
7
|
+
import { isActiveStatus } from "./contracts.js";
|
|
8
|
+
import { subagentOf } from "../variant/materialise.js";
|
|
9
|
+
import { findRun, loadRun, readEvents, recordedSubagents, recordSubagent, saveRun } from "./runStore.js";
|
|
10
|
+
import { SPAWN_SUBAGENT, SUBAGENT_RELATION, SUBAGENT_OWNER, SUBAGENT_RECEIPT, SUBAGENT_RESULTS, subagentHistory } from "./subagents.js";
|
|
11
|
+
function until(promise, signal) {
|
|
12
|
+
if (signal.aborted) {
|
|
13
|
+
void promise.catch(() => { });
|
|
14
|
+
return Promise.reject(new HarnessError('run_not_active', 'The parent run stopped.'));
|
|
15
|
+
}
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
const abort = () => reject(new HarnessError('run_not_active', 'The parent run stopped.'));
|
|
18
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
19
|
+
promise.then(resolve, reject).finally(() => signal.removeEventListener('abort', abort));
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/** One owner of native child execution and delivery, shared by SDK and terminal adapters. */
|
|
23
|
+
export class Subagents {
|
|
24
|
+
env;
|
|
25
|
+
runs;
|
|
26
|
+
launch;
|
|
27
|
+
parents = new Map();
|
|
28
|
+
constructor(env, runs, launch) {
|
|
29
|
+
this.env = env;
|
|
30
|
+
this.runs = runs;
|
|
31
|
+
this.launch = launch;
|
|
32
|
+
runs.listen((event) => {
|
|
33
|
+
if (event.type !== 'completed' && event.type !== 'failed' && !(event.type === 'status.changed' && event.payload.status === 'interrupted'))
|
|
34
|
+
return;
|
|
35
|
+
this.parents.get(event.runId)?.stopped.abort();
|
|
36
|
+
this.parents.delete(event.runId);
|
|
37
|
+
if (event.type !== 'completed')
|
|
38
|
+
for (const id of runs.activeRunIds()) {
|
|
39
|
+
const child = findRun(this.env.root, id);
|
|
40
|
+
if (child?.relation === SUBAGENT_RELATION && child.parentRunId === event.runId)
|
|
41
|
+
void runs.interrupt(id).catch(() => { });
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** Internal adapter contract: context comes from a live run, never from model arguments. */
|
|
46
|
+
register(input, accountId, capabilities, deferUntilPrompt = false) {
|
|
47
|
+
if (!this.runs.active(input.run.id))
|
|
48
|
+
throw new HarnessError('run_not_active', 'The parent run is not active.');
|
|
49
|
+
if (this.parents.has(input.run.id))
|
|
50
|
+
return;
|
|
51
|
+
const frozen = loadCapabilities(this.env.root, input.run.id);
|
|
52
|
+
if (!frozen)
|
|
53
|
+
throw invalid('A native parent requires a frozen capability snapshot.');
|
|
54
|
+
const ceiling = {
|
|
55
|
+
version: 1,
|
|
56
|
+
tools: capabilities.tools.filter(name => frozen.tools.includes(name)),
|
|
57
|
+
connectors: capabilities.connectors.filter(id => frozen.connectors.includes(id)),
|
|
58
|
+
contributions: capabilities.contributions.filter(id => frozen.contributions.includes(id))
|
|
59
|
+
};
|
|
60
|
+
let started;
|
|
61
|
+
const ready = new Promise(resolve => { started = resolve; });
|
|
62
|
+
if (!deferUntilPrompt)
|
|
63
|
+
started();
|
|
64
|
+
this.parents.set(input.run.id, { ready, started, input: structuredClone({ ...input, text: '', images: undefined, requiresImageInput: false, preamble: null, resume: null }), accountId, capabilities: ceiling, stopped: new AbortController(), recovered: new Set(), launching: new Map() });
|
|
65
|
+
}
|
|
66
|
+
resolvedModel(runId, model, effort) {
|
|
67
|
+
const parent = this.parents.get(runId);
|
|
68
|
+
if (parent) {
|
|
69
|
+
parent.input.model = model;
|
|
70
|
+
parent.input.effort = effort ?? parent.input.effort;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
parent(runId) {
|
|
74
|
+
const parent = this.parents.get(runId);
|
|
75
|
+
if (!parent || !this.runs.active(runId))
|
|
76
|
+
throw new HarnessError('run_not_active', 'The parent run is not accepting subagents.');
|
|
77
|
+
return parent;
|
|
78
|
+
}
|
|
79
|
+
async spawn(request) {
|
|
80
|
+
const parent = this.parent(request.parentRunId);
|
|
81
|
+
const { input, accountId, capabilities } = parent;
|
|
82
|
+
if (!capabilities.tools.includes(SPAWN_SUBAGENT))
|
|
83
|
+
throw invalid('Subagents are not enabled for this run.');
|
|
84
|
+
const brief = typeof request.brief === 'string' ? request.brief.trim() : '';
|
|
85
|
+
if (!brief)
|
|
86
|
+
throw invalid('Give the subagent a brief.');
|
|
87
|
+
if (request.wait !== undefined && typeof request.wait !== 'boolean')
|
|
88
|
+
throw invalid('wait must be a boolean.');
|
|
89
|
+
if (request.tools !== undefined && (!Array.isArray(request.tools) || request.tools.some((name) => typeof name !== 'string')))
|
|
90
|
+
throw invalid('Tools must be an array of tool names.');
|
|
91
|
+
const outside = request.tools?.filter((name) => !capabilities.tools.includes(name)) ?? [];
|
|
92
|
+
if (outside.length)
|
|
93
|
+
throw invalid(`A subagent cannot have tools you do not have: ${outside.join(', ')}.`);
|
|
94
|
+
const tools = capabilities.tools.filter((name) => !request.tools || request.tools.includes(name));
|
|
95
|
+
await until(parent.ready, parent.stopped.signal);
|
|
96
|
+
let variant = input.variant ?? null;
|
|
97
|
+
let launch = input.launch;
|
|
98
|
+
if (request.agent !== undefined) {
|
|
99
|
+
if (typeof request.agent !== 'string' || !request.agent.trim())
|
|
100
|
+
throw invalid('agent must be the name of one of your subagents.');
|
|
101
|
+
const dir = variant && 'dir' in variant ? variant.dir : null;
|
|
102
|
+
const definition = dir ? subagentOf(dir, request.agent.trim()) : null;
|
|
103
|
+
if (!definition)
|
|
104
|
+
throw invalid(`There is no subagent named ${request.agent.trim()}.`);
|
|
105
|
+
// A named subagent works from its own definition, not from the parent's instructions.
|
|
106
|
+
variant = null;
|
|
107
|
+
launch = { ...(input.launch ?? {}), sections: [...(input.launch?.sections ?? []).filter((section) => section.id !== 'subagent'), { id: 'subagent', title: `Your role: ${definition.name}`, body: definition.instructions || definition.description, budget: 16_000, order: 22 }] };
|
|
108
|
+
}
|
|
109
|
+
const runId = randomUUID();
|
|
110
|
+
const sessionId = randomUUID();
|
|
111
|
+
recordSubagent(this.env.root, request.parentRunId, runId);
|
|
112
|
+
const child = {
|
|
113
|
+
...input,
|
|
114
|
+
run: { ...input.run, id: runId, sessionId, parentRunId: request.parentRunId, relation: SUBAGENT_RELATION, goal: takeChars(brief, 4000), attachmentCount: 0, resumedFromRunId: null, handoffId: null },
|
|
115
|
+
accountId, poolId: null, sessionDir: join(input.sessionDir, 'subagents', runId), resume: null,
|
|
116
|
+
text: brief, images: undefined, requiresImageInput: false, preamble: null,
|
|
117
|
+
caller: { ...input.caller, runId: undefined, sessionId },
|
|
118
|
+
tools: { allow: tools, gated: (input.tools.gated ?? []).filter((name) => tools.includes(name)) },
|
|
119
|
+
capabilities: { ...capabilities, tools }, depth: (input.depth ?? 0) + 1,
|
|
120
|
+
variant, launch
|
|
121
|
+
};
|
|
122
|
+
const started = this.launch(child).catch((error) => {
|
|
123
|
+
if (!findRun(this.env.root, runId)) {
|
|
124
|
+
const source = loadRun(this.env.root, request.parentRunId);
|
|
125
|
+
saveRun(this.env.root, { ...source, id: runId, sessionId, parentRunId: request.parentRunId, relation: SUBAGENT_RELATION, nativeSessionId: null, resumedFromRunId: null, handoffId: null, exitCode: null, goal: takeChars(brief, 4000), attachmentCount: 0, status: 'failed', startedAt: now(), endedAt: now(), terminalReason: error instanceof HarnessError ? error.message : 'Subagent startup failed before its session opened.' });
|
|
126
|
+
}
|
|
127
|
+
return { runId, nativeSessionId: null };
|
|
128
|
+
});
|
|
129
|
+
parent.launching.set(runId, started);
|
|
130
|
+
void started.finally(() => parent.launching.delete(runId));
|
|
131
|
+
const result = await until(started, parent.stopped.signal);
|
|
132
|
+
if (request.wait)
|
|
133
|
+
await this.wait({ parentRunId: request.parentRunId, runIds: [runId] });
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
selected(selection, parent) {
|
|
137
|
+
const owned = new Set([...recordedSubagents(this.env.root, selection.parentRunId), ...(parent?.recovered ?? [])]);
|
|
138
|
+
if (selection.runIds !== undefined && (!Array.isArray(selection.runIds) || selection.runIds.some((id) => typeof id !== 'string')))
|
|
139
|
+
throw invalid('runIds must be an array of child run IDs.');
|
|
140
|
+
const ids = [...new Set(selection.runIds ?? [...owned])];
|
|
141
|
+
if (ids.some((id) => !owned.has(id)))
|
|
142
|
+
throw invalid('Select only subagents owned by this parent.');
|
|
143
|
+
return ids;
|
|
144
|
+
}
|
|
145
|
+
results(selection) {
|
|
146
|
+
loadRun(this.env.root, selection.parentRunId);
|
|
147
|
+
const parent = this.parents.get(selection.parentRunId);
|
|
148
|
+
return this.selected(selection, parent).map((runId) => {
|
|
149
|
+
const run = findRun(this.env.root, runId);
|
|
150
|
+
const reply = run && readEvents(this.env.root, runId).filter((event) => event.type === 'message.completed' && event.payload.role === 'assistant').at(-1);
|
|
151
|
+
const payload = reply?.payload;
|
|
152
|
+
return { runId, status: run?.status ?? 'queued', text: takeChars(payload?.text ?? '', 16_000), terminalReason: run?.terminalReason ?? null };
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
async wait(selection, signal) {
|
|
156
|
+
const parent = this.parent(selection.parentRunId);
|
|
157
|
+
const ids = this.selected(selection, parent);
|
|
158
|
+
const abort = signal ? AbortSignal.any([signal, parent.stopped.signal]) : parent.stopped.signal;
|
|
159
|
+
await until(Promise.all(ids.map(async (id) => {
|
|
160
|
+
const starting = parent.launching.get(id);
|
|
161
|
+
if (starting)
|
|
162
|
+
await starting;
|
|
163
|
+
const run = findRun(this.env.root, id);
|
|
164
|
+
if (run && isActiveStatus(run.status))
|
|
165
|
+
await this.runs.wait(id, abort);
|
|
166
|
+
})), abort);
|
|
167
|
+
return this.results({ ...selection, runIds: ids });
|
|
168
|
+
}
|
|
169
|
+
/** Reconcile only owners present on the selected native branch, with matching account and caller. */
|
|
170
|
+
restore(parentRunId, history) {
|
|
171
|
+
const parent = this.parent(parentRunId);
|
|
172
|
+
const current = loadRun(this.env.root, parentRunId);
|
|
173
|
+
for (const owner of history.owners) {
|
|
174
|
+
if (owner === parentRunId)
|
|
175
|
+
continue;
|
|
176
|
+
const old = findRun(this.env.root, owner);
|
|
177
|
+
if (!old || old.sessionId !== current.sessionId || old.accountId !== current.accountId || old.agentId !== current.agentId || old.projectId !== current.projectId || old.workingDirectory !== current.workingDirectory || !old.nativeSessionId || old.nativeSessionId !== current.nativeSessionId)
|
|
178
|
+
continue;
|
|
179
|
+
for (const id of recordedSubagents(this.env.root, owner)) {
|
|
180
|
+
let child = findRun(this.env.root, id);
|
|
181
|
+
if (!child) {
|
|
182
|
+
// The process can die after reserving ownership but before sessions.run saves the child.
|
|
183
|
+
saveRun(this.env.root, { ...old, id, sessionId: id, parentRunId: owner, relation: SUBAGENT_RELATION, nativeSessionId: null, resumedFromRunId: null, handoffId: null, exitCode: null, goal: null, attachmentCount: 0, status: 'interrupted', startedAt: now(), endedAt: now(), terminalReason: 'Subagent startup was interrupted before its session opened.' });
|
|
184
|
+
child = findRun(this.env.root, id);
|
|
185
|
+
}
|
|
186
|
+
if (child?.parentRunId === owner && child.relation === SUBAGENT_RELATION && child.accountId === current.accountId)
|
|
187
|
+
parent.recovered.add(id);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async delivery(parentRunId, history, settle, signal) {
|
|
192
|
+
const parent = this.parent(parentRunId);
|
|
193
|
+
this.restore(parentRunId, history);
|
|
194
|
+
if (settle) {
|
|
195
|
+
// A host may start another child while earlier children are settling.
|
|
196
|
+
for (;;) {
|
|
197
|
+
await this.wait({ parentRunId }, signal);
|
|
198
|
+
if (!parent.launching.size && this.results({ parentRunId }).every((result) => !isActiveStatus(result.status)))
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const delivered = new Set(history.receipts.flatMap((receipt) => receipt.delivered ?? []));
|
|
203
|
+
const pending = this.results({ parentRunId }).filter((result) => !isActiveStatus(result.status) && !delivered.has(result.runId));
|
|
204
|
+
const chunks = [];
|
|
205
|
+
const ids = [];
|
|
206
|
+
let size = 0;
|
|
207
|
+
for (const result of pending) {
|
|
208
|
+
const text = `Subagent run ${result.runId} · ${result.status}\n${result.text || result.terminalReason || 'No written reply.'}`;
|
|
209
|
+
if (size + text.length > 32_000 && ids.length)
|
|
210
|
+
break;
|
|
211
|
+
chunks.push(text);
|
|
212
|
+
ids.push(result.runId);
|
|
213
|
+
size += text.length;
|
|
214
|
+
}
|
|
215
|
+
return ids.length ? { text: chunks.join('\n\n'), receipt: { version: 1, ownerRunId: parentRunId, delivered: ids } } : null;
|
|
216
|
+
}
|
|
217
|
+
/** A broken adapter must fail visibly rather than complete with an undelivered child result. */
|
|
218
|
+
async verify(parentRunId, history) {
|
|
219
|
+
if (history)
|
|
220
|
+
this.restore(parentRunId, history);
|
|
221
|
+
await this.wait({ parentRunId });
|
|
222
|
+
if (history && await this.delivery(parentRunId, history, false))
|
|
223
|
+
throw new HarnessError('subagent_delivery_failed', 'A child result was not persisted in this conversation. Resume this reply to recover it.');
|
|
224
|
+
}
|
|
225
|
+
extension(runId) {
|
|
226
|
+
return { name: 'native-subagents', factory: (pi) => {
|
|
227
|
+
pi.on('before_agent_start', (_event, ctx) => {
|
|
228
|
+
if (!this.parents.has(runId))
|
|
229
|
+
return;
|
|
230
|
+
this.restore(runId, subagentHistory(ctx.sessionManager.getBranch()));
|
|
231
|
+
pi.appendEntry(SUBAGENT_OWNER, { runId });
|
|
232
|
+
this.parent(runId).started();
|
|
233
|
+
});
|
|
234
|
+
const deliver = async (event, ctx, settle) => {
|
|
235
|
+
if (!this.parents.has(runId) || (settle && event.outcome !== 'completed') || ctx.signal?.aborted)
|
|
236
|
+
return;
|
|
237
|
+
const history = subagentHistory([...ctx.sessionManager.getBranch(), ...event.entries]);
|
|
238
|
+
const result = await this.delivery(runId, history, settle, ctx.signal);
|
|
239
|
+
if (!result)
|
|
240
|
+
return;
|
|
241
|
+
return { entries: [...event.entries, { type: 'custom_message', customType: SUBAGENT_RESULTS, content: result.text, display: false, details: { [SUBAGENT_RECEIPT]: result.receipt } }], continue: true };
|
|
242
|
+
};
|
|
243
|
+
pi.on('turn_end', (event, ctx) => deliver(event, ctx, false));
|
|
244
|
+
pi.on('agent_before_settle', (event, ctx) => deliver(event, ctx, true));
|
|
245
|
+
} };
|
|
246
|
+
}
|
|
247
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export declare const SPAWN_SUBAGENT = "spawn_subagent";
|
|
2
|
+
export declare const WAIT_SUBAGENTS = "wait_subagents";
|
|
3
|
+
export declare const SUBAGENT_RELATION = "subagent";
|
|
4
|
+
/** How deep subagents may nest when the caller does not say. */
|
|
5
|
+
export declare const DEFAULT_SUBAGENT_DEPTH = 1;
|
|
6
|
+
export declare const MAX_SUBAGENT_DEPTH = 3;
|
|
7
|
+
export interface SubagentOptions {
|
|
8
|
+
/** Maximum consecutive native subagent levels below a caller (1 to 3). */
|
|
9
|
+
maxDepth?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function subagentDepth(options: SubagentOptions | undefined): number;
|
|
12
|
+
export interface SubagentInput {
|
|
13
|
+
parentRunId: string;
|
|
14
|
+
brief: string;
|
|
15
|
+
tools?: string[];
|
|
16
|
+
wait?: boolean;
|
|
17
|
+
/** One of the parent harness's subagents (c5) by name; its instructions frame the child. */
|
|
18
|
+
agent?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SubagentSelection {
|
|
21
|
+
parentRunId: string;
|
|
22
|
+
runIds?: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface SubagentResult {
|
|
25
|
+
runId: string;
|
|
26
|
+
status: string;
|
|
27
|
+
text: string;
|
|
28
|
+
terminalReason: string | null;
|
|
29
|
+
}
|
|
30
|
+
export interface SubagentReceipt {
|
|
31
|
+
version: 1;
|
|
32
|
+
ownerRunId: string;
|
|
33
|
+
spawned?: string[];
|
|
34
|
+
delivered?: string[];
|
|
35
|
+
}
|
|
36
|
+
export declare const SUBAGENT_RECEIPT = "xingularSubagents";
|
|
37
|
+
export declare const SUBAGENT_OWNER = "xingular-subagent-owner";
|
|
38
|
+
export declare const SUBAGENT_RESULTS = "xingular-subagent-results";
|
|
39
|
+
/** Read explicit native metadata, including entries retained before compaction. */
|
|
40
|
+
export declare function subagentHistory(entries: readonly unknown[]): {
|
|
41
|
+
owners: string[];
|
|
42
|
+
receipts: SubagentReceipt[];
|
|
43
|
+
};
|
|
44
|
+
/** Native nesting is independent of a host's other uses of the generic caller depth. */
|
|
45
|
+
export declare function subagentNesting(root: string, run: {
|
|
46
|
+
relation?: string | null;
|
|
47
|
+
parentRunId?: string | null;
|
|
48
|
+
}): number;
|
|
49
|
+
/** The child's final reply, or why it ended without one. */
|
|
50
|
+
export declare function subagentReport(root: string, runId: string): string;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { takeChars } from "../core/text.js";
|
|
2
|
+
import { findRun, loadRun, readEvents } from "./runStore.js";
|
|
3
|
+
export const SPAWN_SUBAGENT = 'spawn_subagent';
|
|
4
|
+
export const WAIT_SUBAGENTS = 'wait_subagents';
|
|
5
|
+
export const SUBAGENT_RELATION = 'subagent';
|
|
6
|
+
/** How deep subagents may nest when the caller does not say. */
|
|
7
|
+
export const DEFAULT_SUBAGENT_DEPTH = 1;
|
|
8
|
+
export const MAX_SUBAGENT_DEPTH = 3;
|
|
9
|
+
export function subagentDepth(options) {
|
|
10
|
+
const value = Math.trunc(options?.maxDepth ?? DEFAULT_SUBAGENT_DEPTH);
|
|
11
|
+
return Math.min(MAX_SUBAGENT_DEPTH, Math.max(1, Number.isFinite(value) ? value : DEFAULT_SUBAGENT_DEPTH));
|
|
12
|
+
}
|
|
13
|
+
export const SUBAGENT_RECEIPT = 'xingularSubagents';
|
|
14
|
+
export const SUBAGENT_OWNER = 'xingular-subagent-owner';
|
|
15
|
+
export const SUBAGENT_RESULTS = 'xingular-subagent-results';
|
|
16
|
+
/** Read explicit native metadata, including entries retained before compaction. */
|
|
17
|
+
export function subagentHistory(entries) {
|
|
18
|
+
const owners = [];
|
|
19
|
+
const receipts = [];
|
|
20
|
+
for (const raw of entries) {
|
|
21
|
+
if (!raw || typeof raw !== 'object')
|
|
22
|
+
continue;
|
|
23
|
+
const entry = raw;
|
|
24
|
+
if (entry.type === 'custom' && entry.customType === SUBAGENT_OWNER && typeof entry.data?.runId === 'string')
|
|
25
|
+
owners.push(entry.data.runId);
|
|
26
|
+
const message = entry.type === 'message' ? entry.message : entry;
|
|
27
|
+
const receipt = message?.details?.[SUBAGENT_RECEIPT];
|
|
28
|
+
if (!receipt || receipt.version !== 1 || typeof receipt.ownerRunId !== 'string')
|
|
29
|
+
continue;
|
|
30
|
+
const strings = (value) => Array.isArray(value) && value.every((id) => typeof id === 'string');
|
|
31
|
+
if ((receipt.spawned !== undefined && !strings(receipt.spawned)) || (receipt.delivered !== undefined && !strings(receipt.delivered)))
|
|
32
|
+
continue;
|
|
33
|
+
receipts.push(receipt);
|
|
34
|
+
}
|
|
35
|
+
return { owners, receipts };
|
|
36
|
+
}
|
|
37
|
+
/** Native nesting is independent of a host's other uses of the generic caller depth. */
|
|
38
|
+
export function subagentNesting(root, run) {
|
|
39
|
+
let current = run;
|
|
40
|
+
let depth = 0;
|
|
41
|
+
const visited = new Set();
|
|
42
|
+
while (current.relation === SUBAGENT_RELATION) {
|
|
43
|
+
const parent = current.parentRunId;
|
|
44
|
+
if (!parent || visited.has(parent))
|
|
45
|
+
return MAX_SUBAGENT_DEPTH;
|
|
46
|
+
visited.add(parent);
|
|
47
|
+
depth++;
|
|
48
|
+
const record = findRun(root, parent);
|
|
49
|
+
if (!record)
|
|
50
|
+
return MAX_SUBAGENT_DEPTH;
|
|
51
|
+
current = record;
|
|
52
|
+
}
|
|
53
|
+
return depth;
|
|
54
|
+
}
|
|
55
|
+
/** The child's final reply, or why it ended without one. */
|
|
56
|
+
export function subagentReport(root, runId) {
|
|
57
|
+
const run = loadRun(root, runId);
|
|
58
|
+
const reply = readEvents(root, runId).filter((event) => event.type === 'message.completed' && event.payload.role === 'assistant').at(-1);
|
|
59
|
+
const text = typeof reply?.payload?.text === 'string' ? takeChars(reply.payload.text, 16_000) : '';
|
|
60
|
+
const lines = [`Subagent run ${runId} · ${run.status}`];
|
|
61
|
+
if (text)
|
|
62
|
+
lines.push(`Result:\n${text}`);
|
|
63
|
+
else if (run.status === 'completed')
|
|
64
|
+
lines.push('It finished without a written reply.');
|
|
65
|
+
if (run.status !== 'completed' && run.terminalReason)
|
|
66
|
+
lines.push(`Stopped because: ${run.terminalReason}`);
|
|
67
|
+
return lines.join('\n');
|
|
68
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { AccountsOverview, AccountView } from "../accounts/store.js";
|
|
2
|
+
import type { MenuUi } from "./pluginMenu.js";
|
|
3
|
+
export interface AccountsUi extends MenuUi {
|
|
4
|
+
input(title: string, placeholder?: string): Promise<string | undefined>;
|
|
5
|
+
}
|
|
6
|
+
/** `accounts.*` over the session socket, with the session's control key. */
|
|
7
|
+
export type AccountsCall = <T = unknown>(method: string, params?: Record<string, unknown>) => Promise<T>;
|
|
8
|
+
/** The account this session is on, from `accounts.session`. */
|
|
9
|
+
export interface SessionAccount {
|
|
10
|
+
accountId: string;
|
|
11
|
+
label: string;
|
|
12
|
+
}
|
|
13
|
+
/** One entry of `accounts.providers`. */
|
|
14
|
+
export interface ProviderOption {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
oauth: boolean;
|
|
18
|
+
oauthLabel: string | null;
|
|
19
|
+
apiKey: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** The same words the app shows for each health state (`App/src/modes/accounts/accountModel.ts`). */
|
|
22
|
+
export declare const HEALTH: Record<string, string>;
|
|
23
|
+
/** A short "in 2h 5m" from an ISO time, or the time itself when it has passed. */
|
|
24
|
+
export declare function resetIn(resetsAt: string, now?: number): string;
|
|
25
|
+
/** One line per account, numbered so two accounts with the same name stay distinct in the menu. */
|
|
26
|
+
export declare function accountRows(overview: AccountsOverview, session: SessionAccount | null): {
|
|
27
|
+
label: string;
|
|
28
|
+
account: AccountView;
|
|
29
|
+
}[];
|
|
30
|
+
/** What `Details` shows for one account. */
|
|
31
|
+
export declare function accountDetails(account: AccountView): string;
|
|
32
|
+
/** The whole `/accounts` conversation. Returns `'relaunch'` when the person chose to switch this session's account. */
|
|
33
|
+
export declare function runAccountsMenu(ui: AccountsUi, call: AccountsCall, session: SessionAccount): Promise<'relaunch' | void>;
|
|
34
|
+
export declare function addAccount(ui: AccountsUi, call: AccountsCall): Promise<void>;
|
|
35
|
+
/** What can be done with one account; `details` is left out where the screen already shows them. */
|
|
36
|
+
export declare function accountActions(account: AccountView, isSession: boolean, details?: boolean): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Runs one chosen action. `'relaunch'` means the session is switching to this account; `'gone'` that the
|
|
39
|
+
* account was removed. Anything the person declines or that fails leaves everything as it was.
|
|
40
|
+
*/
|
|
41
|
+
export declare function runAccountAction(ui: AccountsUi, call: AccountsCall, overview: AccountsOverview, account: AccountView, action: string): Promise<'relaunch' | 'gone' | void>;
|
|
42
|
+
export declare function editPool(ui: AccountsUi, call: AccountsCall, overview: AccountsOverview, pool: {
|
|
43
|
+
id: string;
|
|
44
|
+
label: string;
|
|
45
|
+
accountIds: string[];
|
|
46
|
+
} | null): Promise<void>;
|