@xingular/harness 0.1.7 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +125 -1
- package/LICENSE +202 -0
- package/NOTICE.md +22 -0
- package/README.md +239 -86
- package/THIRD_PARTY_LICENSES.md +942 -0
- package/dist/cli.js +17853 -13114
- 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/agents/builtin.d.ts +2 -0
- package/dist/sdk/agents/builtin.js +34 -0
- package/dist/sdk/agents/narrow.d.ts +13 -0
- package/dist/sdk/agents/narrow.js +29 -0
- package/dist/sdk/agents/profiles.d.ts +80 -0
- package/dist/sdk/agents/profiles.js +221 -0
- package/dist/sdk/annotations/bridge.d.ts +42 -0
- package/dist/sdk/annotations/bridge.js +264 -0
- package/dist/sdk/annotations/capture.d.ts +116 -0
- package/dist/sdk/annotations/capture.js +308 -0
- package/dist/sdk/annotations/delivery.d.ts +72 -0
- package/dist/sdk/annotations/delivery.js +130 -0
- package/dist/sdk/annotations/inspect.d.ts +10 -0
- package/dist/sdk/annotations/inspect.js +33 -0
- package/dist/sdk/annotations/isolated.d.ts +6 -0
- package/dist/sdk/annotations/isolated.js +51 -0
- package/dist/sdk/annotations/pageScript.d.ts +28 -0
- package/dist/sdk/annotations/pageScript.js +570 -0
- package/dist/sdk/annotations/part.d.ts +10 -0
- package/dist/sdk/annotations/part.js +144 -0
- package/dist/sdk/annotations/queue.d.ts +4 -0
- package/dist/sdk/annotations/queue.js +40 -0
- package/dist/sdk/annotations/serverMethods.d.ts +3 -0
- package/dist/sdk/annotations/serverMethods.js +62 -0
- package/dist/sdk/annotations/store.d.ts +160 -0
- package/dist/sdk/annotations/store.js +386 -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 +28 -0
- package/dist/sdk/browser/index.js +72 -0
- package/dist/sdk/browser/network.d.ts +10 -0
- package/dist/sdk/browser/network.js +59 -0
- package/dist/sdk/browser/serverMethods.d.ts +3 -0
- package/dist/sdk/browser/serverMethods.js +7 -0
- package/dist/sdk/browser/session.d.ts +85 -0
- package/dist/sdk/browser/session.js +228 -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 +150 -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/serverMethods.d.ts +3 -0
- package/dist/sdk/doctor/serverMethods.js +8 -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 +148 -0
- package/dist/sdk/harness.js +338 -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/serverMethods.d.ts +3 -0
- package/dist/sdk/history/serverMethods.js +8 -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/hub/serverMethods.d.ts +3 -0
- package/dist/sdk/hub/serverMethods.js +11 -0
- package/dist/sdk/index.d.ts +73 -0
- package/dist/sdk/index.js +55 -0
- package/dist/sdk/mcp/connections.d.ts +83 -0
- package/dist/sdk/mcp/connections.js +676 -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/serverMethods.d.ts +3 -0
- package/dist/sdk/mcp/serverMethods.js +22 -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 +7 -0
- package/dist/sdk/plugins/builtin.js +163 -0
- package/dist/sdk/plugins/builtinRegistry.d.ts +53 -0
- package/dist/sdk/plugins/builtinRegistry.js +49 -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 +188 -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 +177 -0
- package/dist/sdk/prompt/compile.js +413 -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/serverMethods.d.ts +3 -0
- package/dist/sdk/refine/serverMethods.js +20 -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 +293 -0
- package/dist/sdk/server/params.d.ts +4 -0
- package/dist/sdk/server/params.js +11 -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 +551 -0
- package/dist/sdk/sessions/contracts.js +338 -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 +39 -0
- package/dist/sdk/sessions/planMode.js +93 -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 +103 -0
- package/dist/sdk/sessions/registry.js +386 -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 +337 -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 +152 -0
- package/dist/sdk/sessions/sessions.js +461 -0
- package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
- package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
- package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
- package/dist/sdk/sessions/sideQuestions.js +290 -0
- package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
- package/dist/sdk/sessions/subagentServerMethods.js +41 -0
- package/dist/sdk/sessions/subagentService.d.ts +52 -0
- package/dist/sdk/sessions/subagentService.js +265 -0
- package/dist/sdk/sessions/subagents.d.ts +58 -0
- package/dist/sdk/sessions/subagents.js +87 -0
- package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
- package/dist/sdk/terminal/accountsMenu.js +392 -0
- package/dist/sdk/terminal/browser.d.ts +62 -0
- package/dist/sdk/terminal/browser.js +41 -0
- package/dist/sdk/terminal/browserControl.d.ts +29 -0
- package/dist/sdk/terminal/browserControl.js +186 -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/commandHelp.d.ts +17 -0
- package/dist/sdk/terminal/commandHelp.js +20 -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 +78 -0
- package/dist/sdk/terminal/controller.js +383 -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/opentui/subagentsWidget.d.ts +28 -0
- package/dist/sdk/terminal/opentui/subagentsWidget.js +52 -0
- package/dist/sdk/terminal/piExtension.d.ts +6 -0
- package/dist/sdk/terminal/piExtension.js +377 -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 +73 -0
- package/dist/sdk/terminal/socket.js +287 -0
- package/dist/sdk/terminal/standalone.d.ts +20 -0
- package/dist/sdk/terminal/standalone.js +186 -0
- package/dist/sdk/terminal/subagentMonitor.d.ts +38 -0
- package/dist/sdk/terminal/subagentMonitor.js +121 -0
- package/dist/sdk/terminal/terminals.d.ts +212 -0
- package/dist/sdk/terminal/terminals.js +1108 -0
- package/dist/sdk/terminal/trajectory.d.ts +10 -0
- package/dist/sdk/terminal/trajectory.js +30 -0
- package/dist/sdk/terminal/tui/annotateCommand.d.ts +3 -0
- package/dist/sdk/terminal/tui/annotateCommand.js +22 -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 +11 -0
- package/dist/sdk/terminal/tui/commandPages.js +111 -0
- package/dist/sdk/terminal/tui/commands.d.ts +46 -0
- package/dist/sdk/terminal/tui/commands.js +399 -0
- package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
- package/dist/sdk/terminal/tui/dialogGeometry.js +52 -0
- package/dist/sdk/terminal/tui/dialogs.d.ts +80 -0
- package/dist/sdk/terminal/tui/dialogs.js +370 -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 +150 -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 +17 -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 +156 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +76 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.js +409 -0
- package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
- package/dist/sdk/terminal/tui/pages/agentsPage.js +190 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +94 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.js +341 -0
- package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
- package/dist/sdk/terminal/tui/pages/browserPage.js +738 -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 +39 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.js +233 -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/notesPage.d.ts +75 -0
- package/dist/sdk/terminal/tui/pages/notesPage.js +201 -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 +63 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.js +103 -0
- package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +23 -0
- package/dist/sdk/terminal/tui/pages/subagentsPage.js +70 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +65 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.js +450 -0
- package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
- package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -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/pluginCommands.d.ts +14 -0
- package/dist/sdk/terminal/tui/pluginCommands.js +27 -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 +21 -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 +443 -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 +14 -0
- package/dist/sdk/terminal/tui/settingsModel.js +114 -0
- package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
- package/dist/sdk/terminal/tui/sideQuestion.js +230 -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 +49 -0
- package/dist/sdk/terminal/tui/ui.js +149 -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 +92 -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 +8 -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 +58 -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/part.d.ts +10 -0
- package/dist/sdk/web/part.js +6 -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/serverMethods.d.ts +3 -0
- package/dist/sdk/web/serverMethods.js +7 -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/wiki/serverMethods.d.ts +3 -0
- package/dist/sdk/wiki/serverMethods.js +26 -0
- package/dist/sdk/worktrees/cli.d.ts +11 -0
- package/dist/sdk/worktrees/cli.js +146 -0
- package/dist/sdk/worktrees/copy.d.ts +9 -0
- package/dist/sdk/worktrees/copy.js +111 -0
- package/dist/sdk/worktrees/git.d.ts +16 -0
- package/dist/sdk/worktrees/git.js +81 -0
- package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
- package/dist/sdk/worktrees/serverMethods.js +30 -0
- package/dist/sdk/worktrees/service.d.ts +73 -0
- package/dist/sdk/worktrees/service.js +483 -0
- package/dist/sdk/worktrees/setup.d.ts +23 -0
- package/dist/sdk/worktrees/setup.js +65 -0
- package/dist/sdk/worktrees/types.d.ts +91 -0
- package/dist/sdk/worktrees/types.js +1 -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 +67 -0
- package/dist/sdk/world/world.js +79 -0
- package/dist/terminal-opentui.js +20778 -0
- package/dist/terminal-pi.js +794 -518
- package/docs/README.md +42 -0
- package/docs/architecture/00-overview.md +171 -0
- package/docs/architecture/01-extension-points.md +78 -0
- package/docs/architecture/02-sessions-and-runs.md +203 -0
- package/docs/architecture/03-variants.md +103 -0
- package/docs/architecture/04-prompt.md +122 -0
- package/docs/architecture/05-refinement.md +107 -0
- package/docs/architecture/06-plugins-and-capabilities.md +129 -0
- package/docs/architecture/07-tools-and-gate.md +103 -0
- package/docs/architecture/08-memory-and-history.md +94 -0
- package/docs/architecture/09-accounts-and-connectors.md +98 -0
- package/docs/architecture/10-server-protocol.md +193 -0
- package/docs/architecture/11-terminal.md +261 -0
- package/docs/architecture/12-storage.md +75 -0
- package/docs/architecture/13-world-tools.md +45 -0
- package/docs/architecture/14-surfaces-and-parity.md +89 -0
- package/docs/architecture/README.md +125 -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 +70 -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/PROP-0013-resource-browser.md +58 -0
- package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
- package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
- package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
- package/docs/architecture/proposals/PROP-0017-page-annotations.md +127 -0
- package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +179 -0
- package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
- package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
- package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
- package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
- package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
- package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
- package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
- package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +94 -0
- package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
- package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
- package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
- package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
- package/docs/architecture/proposals/README.md +101 -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 +39 -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 +22 -0
- package/docs/decisions/ADR-0015-resource-browser.md +28 -0
- package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
- package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
- package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
- package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
- package/docs/decisions/ADR-0020-page-annotations.md +37 -0
- package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
- package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
- package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
- package/docs/decisions/ADR-0024-xagent-command.md +40 -0
- package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
- package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
- package/docs/decisions/ADR-0027-connected-sketch-display.md +60 -0
- package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
- package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
- package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
- package/docs/doctor.md +80 -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 +46 -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/future-work.md +48 -0
- package/docs/parity.md +78 -0
- package/docs/releases/1.0.0.md +40 -0
- package/docs/releases/4.0.0.md +46 -0
- package/docs/releases/README.md +41 -0
- package/docs/study/00-index.md +83 -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/autonomous-engineering-sources.md +277 -0
- package/docs/study/autonomy-sources.md +147 -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/proactive-autonomy.md +408 -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/study/tui-resource-browser.md +78 -0
- package/docs/system-prompt-design.md +196 -0
- package/docs/terminal-tui.md +707 -58
- 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,11 @@
|
|
|
1
|
+
import { invalid } from "../core/errors.js";
|
|
2
|
+
export const text = (params, name) => {
|
|
3
|
+
const value = params[name];
|
|
4
|
+
if (typeof value !== 'string' || !value)
|
|
5
|
+
throw invalid(`${name} is required.`);
|
|
6
|
+
return value;
|
|
7
|
+
};
|
|
8
|
+
export const optional = (params, name) => (typeof params[name] === 'string' && params[name] ? params[name] : null);
|
|
9
|
+
export function pick(params, keys) {
|
|
10
|
+
return Object.fromEntries(keys.filter(key => key in params).map(key => [key, params[key]]));
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SecretStore } from "../accounts/secrets.js";
|
|
2
|
+
import type { Directory } from "../core/env.js";
|
|
3
|
+
import type { ToolPolicy } from "../sessions/policy.js";
|
|
4
|
+
import type { ToolProvider } from "../tools/types.js";
|
|
5
|
+
import type { RpcPeer } from "./rpc.js";
|
|
6
|
+
/** `secrets.get`, `secrets.set`, `secrets.delete` on the host. */
|
|
7
|
+
export declare function remoteSecrets(peer: RpcPeer): SecretStore;
|
|
8
|
+
/** `policy.scope`, `policy.authorize`, `policy.approval`, `policy.connections` on the host. */
|
|
9
|
+
export declare function remotePolicy(peer: RpcPeer): ToolPolicy;
|
|
10
|
+
/**
|
|
11
|
+
* Names the host knows and the harness shows in what it writes. The host pushes them with the
|
|
12
|
+
* `directory.set` method, because the lookups are synchronous.
|
|
13
|
+
*/
|
|
14
|
+
export declare function remoteDirectory(peer: RpcPeer): Directory;
|
|
15
|
+
/**
|
|
16
|
+
* Tools the host registers with `tools.register` and runs when the harness calls `tools.call`
|
|
17
|
+
* back. A session is given those its `allow` list names.
|
|
18
|
+
*/
|
|
19
|
+
export declare function remoteTools(peer: RpcPeer): ToolProvider;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// What a host that is not a Node program supplies over the protocol instead of in-process:
|
|
2
|
+
// its secret store, its policy, its names for agents, and its own tools. Each is a call to the
|
|
3
|
+
// host; the harness works without any of them.
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { findingSchema } from "../doctor/types.js";
|
|
6
|
+
/** `secrets.get`, `secrets.set`, `secrets.delete` on the host. */
|
|
7
|
+
export function remoteSecrets(peer) {
|
|
8
|
+
return {
|
|
9
|
+
get: (key) => peer.callHost('secrets.get', { key }),
|
|
10
|
+
set: async (key, value) => void (await peer.callHost('secrets.set', { key, value })),
|
|
11
|
+
delete: async (key) => void (await peer.callHost('secrets.delete', { key }))
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** `policy.scope`, `policy.authorize`, `policy.approval`, `policy.connections` on the host. */
|
|
15
|
+
export function remotePolicy(peer) {
|
|
16
|
+
const identify = (call) => ({ runId: call.run.id, sessionId: call.run.sessionId, caller: call.caller, tool: call.tool, args: call.args });
|
|
17
|
+
return {
|
|
18
|
+
scope: (call) => peer.callHost('policy.scope', identify(call), 90_000),
|
|
19
|
+
authorize: async (call) => void (await peer.callHost('policy.authorize', identify(call), 90_000)),
|
|
20
|
+
approval: (input) => peer.callHost('policy.approval', { runId: input.run.id, sessionId: input.run.sessionId, target: input.target, operation: input.operation ?? null }),
|
|
21
|
+
connections: (input) => peer.callHost('policy.connections', input)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Names the host knows and the harness shows in what it writes. The host pushes them with the
|
|
26
|
+
* `directory.set` method, because the lookups are synchronous.
|
|
27
|
+
*/
|
|
28
|
+
export function remoteDirectory(peer) {
|
|
29
|
+
let agents = {};
|
|
30
|
+
let sessions = {};
|
|
31
|
+
peer.handle('directory.set', (params) => {
|
|
32
|
+
if (params.agents)
|
|
33
|
+
agents = params.agents;
|
|
34
|
+
if (params.sessions)
|
|
35
|
+
sessions = { ...sessions, ...params.sessions };
|
|
36
|
+
});
|
|
37
|
+
return { agentName: (id) => agents[id] ?? null, sessionAgent: (id) => sessions[id] ?? null };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Tools the host registers with `tools.register` and runs when the harness calls `tools.call`
|
|
41
|
+
* back. A session is given those its `allow` list names.
|
|
42
|
+
*/
|
|
43
|
+
export function remoteTools(peer) {
|
|
44
|
+
let registered = [];
|
|
45
|
+
const descriptor = z.object({
|
|
46
|
+
id: z.string().min(1), category: z.string(), title: z.string(), tools: z.array(z.string()),
|
|
47
|
+
probe: z.object({ notice: z.string(), tool: z.string(), input: z.record(z.string(), z.unknown()), contains: z.string().min(1) }).optional()
|
|
48
|
+
});
|
|
49
|
+
let diagnostics = [];
|
|
50
|
+
peer.handle('tools.register', (params) => {
|
|
51
|
+
diagnostics = z.array(descriptor).parse(params.diagnostics ?? []);
|
|
52
|
+
registered = Array.isArray(params.tools) ? params.tools : [];
|
|
53
|
+
return { registered: registered.map((tool) => tool.name) };
|
|
54
|
+
});
|
|
55
|
+
const provider = (session) => registered
|
|
56
|
+
.filter((tool) => session.allow.includes(tool.name))
|
|
57
|
+
.map((tool) => ({
|
|
58
|
+
name: tool.name,
|
|
59
|
+
label: tool.label ?? tool.name,
|
|
60
|
+
description: tool.description,
|
|
61
|
+
parameters: (Type) => Type.Unsafe(tool.parameters),
|
|
62
|
+
execute: async (input) => {
|
|
63
|
+
const result = await peer.callHost('tools.call', { name: tool.name, input, runId: session.run.runId, sessionId: session.run.sessionId, caller: session.caller, depth: session.depth, cwd: session.cwd }, 1_230_000);
|
|
64
|
+
return typeof result === 'string' ? result : JSON.stringify(result);
|
|
65
|
+
}
|
|
66
|
+
}));
|
|
67
|
+
provider.diagnostics = context => diagnostics.map(check => ({
|
|
68
|
+
id: `host.${check.id}`, category: check.category, title: check.title, tools: check.tools,
|
|
69
|
+
local: async (signal) => {
|
|
70
|
+
signal.throwIfAborted();
|
|
71
|
+
const result = await peer.callHost('tools.diagnose', { id: check.id, context }, 8000);
|
|
72
|
+
return findingSchema.pick({ status: true, evidence: true, remedy: true }).parse(result);
|
|
73
|
+
},
|
|
74
|
+
live: check.probe ? {
|
|
75
|
+
notice: check.probe.notice,
|
|
76
|
+
run: async (probe) => {
|
|
77
|
+
const result = await probe.call(check.probe.tool, check.probe.input);
|
|
78
|
+
const text = typeof result === 'string' ? result : result.text;
|
|
79
|
+
return { status: text.includes(check.probe.contains) ? 'pass' : 'fail', evidence: 'The registered host tool probe completed; the expected response marker was checked.' };
|
|
80
|
+
}
|
|
81
|
+
} : undefined
|
|
82
|
+
}));
|
|
83
|
+
return provider;
|
|
84
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const PROTOCOL_VERSION = 1;
|
|
2
|
+
export type Handler = (params: any) => Promise<unknown> | unknown;
|
|
3
|
+
export interface Transport {
|
|
4
|
+
write(line: string): void;
|
|
5
|
+
onLine(listener: (line: string) => void): void;
|
|
6
|
+
}
|
|
7
|
+
export declare function stdioTransport(): Transport;
|
|
8
|
+
export declare class RpcPeer {
|
|
9
|
+
private readonly transport;
|
|
10
|
+
private readonly handlers;
|
|
11
|
+
private readonly pendingCalls;
|
|
12
|
+
private nextCallId;
|
|
13
|
+
constructor(transport: Transport);
|
|
14
|
+
handle(method: string, handler: Handler): void;
|
|
15
|
+
methods(): string[];
|
|
16
|
+
send(message: Record<string, unknown>): void;
|
|
17
|
+
/** Asks the host to perform a named operation. */
|
|
18
|
+
callHost<T = unknown>(call: string, params: unknown, timeoutMs?: number): Promise<T>;
|
|
19
|
+
private receive;
|
|
20
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// Newline-delimited JSON between the harness and a host process that embeds it.
|
|
2
|
+
//
|
|
3
|
+
// host → harness { v, id, method, params } request
|
|
4
|
+
// harness → host { v, id, result } | { v, id, error }
|
|
5
|
+
// harness → host { v, event } run event (validated before sending)
|
|
6
|
+
// harness → host { v, notice } some state changed and should be read again
|
|
7
|
+
// harness → host { v, id, call, params } the harness asks the host for a named operation
|
|
8
|
+
// host → harness { v, id, result } | { v, id, error } reply to a call
|
|
9
|
+
//
|
|
10
|
+
// stdout carries only protocol lines; diagnostics go to stderr.
|
|
11
|
+
import { createInterface } from 'node:readline';
|
|
12
|
+
import { log } from "../core/bus.js";
|
|
13
|
+
import { HarnessError, toErrorShape } from "../core/errors.js";
|
|
14
|
+
export const PROTOCOL_VERSION = 1;
|
|
15
|
+
export function stdioTransport() {
|
|
16
|
+
const reader = createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
17
|
+
return {
|
|
18
|
+
write: (line) => void process.stdout.write(`${line}\n`),
|
|
19
|
+
onLine: (listener) => void reader.on('line', listener)
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export class RpcPeer {
|
|
23
|
+
transport;
|
|
24
|
+
handlers = new Map();
|
|
25
|
+
pendingCalls = new Map();
|
|
26
|
+
nextCallId = 0;
|
|
27
|
+
constructor(transport) {
|
|
28
|
+
this.transport = transport;
|
|
29
|
+
transport.onLine((line) => void this.receive(line));
|
|
30
|
+
}
|
|
31
|
+
handle(method, handler) {
|
|
32
|
+
this.handlers.set(method, handler);
|
|
33
|
+
}
|
|
34
|
+
methods() {
|
|
35
|
+
return [...this.handlers.keys()].sort();
|
|
36
|
+
}
|
|
37
|
+
send(message) {
|
|
38
|
+
this.transport.write(JSON.stringify({ v: PROTOCOL_VERSION, ...message }));
|
|
39
|
+
}
|
|
40
|
+
/** Asks the host to perform a named operation. */
|
|
41
|
+
callHost(call, params, timeoutMs = 30_000) {
|
|
42
|
+
const id = `s${++this.nextCallId}`;
|
|
43
|
+
return new Promise((resolve, reject) => {
|
|
44
|
+
const timer = setTimeout(() => {
|
|
45
|
+
this.pendingCalls.delete(id);
|
|
46
|
+
reject(new HarnessError('host_timeout', `The host did not answer ${call}.`));
|
|
47
|
+
}, timeoutMs);
|
|
48
|
+
this.pendingCalls.set(id, {
|
|
49
|
+
resolve: (value) => {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
resolve(value);
|
|
52
|
+
},
|
|
53
|
+
reject: (error) => {
|
|
54
|
+
clearTimeout(timer);
|
|
55
|
+
reject(error);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
this.send({ id, call, params });
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async receive(line) {
|
|
62
|
+
let message;
|
|
63
|
+
try {
|
|
64
|
+
message = JSON.parse(line);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
log('ignored a non-JSON line');
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (message.v !== PROTOCOL_VERSION || typeof message.id !== 'string') {
|
|
71
|
+
log('ignored a message with an unknown version or no id');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const id = message.id;
|
|
75
|
+
if (typeof message.method === 'string') {
|
|
76
|
+
const handler = this.handlers.get(message.method);
|
|
77
|
+
if (!handler) {
|
|
78
|
+
this.send({ id, error: { code: 'unknown_method', message: `Unknown method ${message.method}.` } });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const result = await handler(message.params ?? {});
|
|
83
|
+
this.send({ id, result: result ?? null });
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
this.send({ id, error: toErrorShape(error) });
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const pending = this.pendingCalls.get(id);
|
|
91
|
+
if (pending) {
|
|
92
|
+
this.pendingCalls.delete(id);
|
|
93
|
+
if (message.error) {
|
|
94
|
+
const shape = message.error;
|
|
95
|
+
pending.reject(new HarnessError(shape.code, shape.message, shape.retryHint ?? null));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
pending.resolve(message.result);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Harness } from "../harness.js";
|
|
2
|
+
import { RpcPeer, type Transport } from "./rpc.js";
|
|
3
|
+
export interface Served {
|
|
4
|
+
peer: RpcPeer;
|
|
5
|
+
/** Stops live work and releases what the harness holds. */
|
|
6
|
+
shutdown(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
/** Registers the method table on `peer` and forwards events and notices to it. */
|
|
9
|
+
export declare function attach(harness: Harness, peer: RpcPeer): void;
|
|
10
|
+
export declare function serve(harness: Harness, transport: Transport): Served;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { methods } from "./methods.js";
|
|
2
|
+
import { RpcPeer } from "./rpc.js";
|
|
3
|
+
/** Registers the method table on `peer` and forwards events and notices to it. */
|
|
4
|
+
export function attach(harness, peer) {
|
|
5
|
+
for (const [name, handler] of Object.entries(methods(harness)))
|
|
6
|
+
peer.handle(name, handler);
|
|
7
|
+
peer.handle('harness.methods', () => peer.methods());
|
|
8
|
+
harness.runs.listen((event) => peer.send({ event }));
|
|
9
|
+
harness.bus.on((notice) => peer.send({ notice }));
|
|
10
|
+
}
|
|
11
|
+
export function serve(harness, transport) {
|
|
12
|
+
const peer = new RpcPeer(transport);
|
|
13
|
+
attach(harness, peer);
|
|
14
|
+
let closing = null;
|
|
15
|
+
const shutdown = () => (closing ??= harness.close());
|
|
16
|
+
peer.handle('harness.shutdown', () => shutdown());
|
|
17
|
+
return { peer, shutdown };
|
|
18
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Bus } from "../core/bus.js";
|
|
2
|
+
import type { RunRecord } from "./contracts.js";
|
|
3
|
+
/** Kinds of session with a switch: an agent's own conversations, and sessions in a project. */
|
|
4
|
+
export declare const APPROVAL_KEYS: readonly ["chat", "pi"];
|
|
5
|
+
export interface ApprovalPolicy {
|
|
6
|
+
/** Switch key → every approval is granted without asking. */
|
|
7
|
+
auto: Record<string, boolean>;
|
|
8
|
+
/** Approval key → tools allowed across sessions that share this local state directory. */
|
|
9
|
+
globalTools: Record<string, string[]>;
|
|
10
|
+
/** Session id → approval targets always allowed there. */
|
|
11
|
+
remembered: Record<string, string[]>;
|
|
12
|
+
}
|
|
13
|
+
/** Why a request is granted without asking. */
|
|
14
|
+
export type AutomaticReason = 'always' | 'remembered' | 'scope';
|
|
15
|
+
/** What only the embedding application knows about a pending approval. */
|
|
16
|
+
export interface ApprovalFacts {
|
|
17
|
+
/** Unattended work keeps to its saved scope whatever the switches say. */
|
|
18
|
+
unattended?: boolean;
|
|
19
|
+
/** The session may not change anything; the switch must not approve its way out of that. */
|
|
20
|
+
readOnly?: boolean;
|
|
21
|
+
/** The application's own scope already covers this exact operation. */
|
|
22
|
+
inScope?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** Why the standing choices grant this request, if they do. */
|
|
25
|
+
export declare function decide(policy: ApprovalPolicy, key: string, sessionId: string, target: string): AutomaticReason | null;
|
|
26
|
+
export declare function grant(policy: ApprovalPolicy, key: string, sessionId: string, target: string, facts?: ApprovalFacts): AutomaticReason | null;
|
|
27
|
+
/** A conversation's runs share one switch whatever model they use; other runs follow their own. */
|
|
28
|
+
export declare const approvalKey: (run: Pick<RunRecord, "mode" | "harness">) => string;
|
|
29
|
+
export declare class Approvals {
|
|
30
|
+
private readonly bus;
|
|
31
|
+
private readonly path;
|
|
32
|
+
constructor(stateDir: string, bus: Bus);
|
|
33
|
+
read(): ApprovalPolicy;
|
|
34
|
+
private change;
|
|
35
|
+
isAuto(key: string): boolean;
|
|
36
|
+
/** Why this run's approval for `target` can be granted without asking, if it can. */
|
|
37
|
+
automatic(run: RunRecord, target: string, facts?: ApprovalFacts): AutomaticReason | null;
|
|
38
|
+
setAuto(key: string, on: boolean): ApprovalPolicy;
|
|
39
|
+
/** Always allow `target` for every session in this approval profile and state directory. */
|
|
40
|
+
allowTool(key: string, target: string): ApprovalPolicy;
|
|
41
|
+
revokeTool(key: string, target: string): ApprovalPolicy;
|
|
42
|
+
/** Always allow `target` in this session. */
|
|
43
|
+
remember(sessionId: string, target: string): ApprovalPolicy;
|
|
44
|
+
forget(sessionId: string, target: string): ApprovalPolicy;
|
|
45
|
+
/** Forgets what was remembered for a session that no longer exists. */
|
|
46
|
+
forgetSession(sessionId: string): void;
|
|
47
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// What the user has chosen to stop being asked about: an "always approve" switch, tools allowed
|
|
2
|
+
// across a harness state directory, and tools remembered for one session.
|
|
3
|
+
import { chmodSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { invalid } from "../core/errors.js";
|
|
6
|
+
import { readJson, writeJson } from "../core/fs.js";
|
|
7
|
+
/** Kinds of session with a switch: an agent's own conversations, and sessions in a project. */
|
|
8
|
+
export const APPROVAL_KEYS = ['chat', 'pi'];
|
|
9
|
+
/** Why the standing choices grant this request, if they do. */
|
|
10
|
+
export function decide(policy, key, sessionId, target) {
|
|
11
|
+
if (policy.auto[key])
|
|
12
|
+
return 'always';
|
|
13
|
+
if (policy.globalTools[key]?.includes(target))
|
|
14
|
+
return 'remembered';
|
|
15
|
+
return policy.remembered[sessionId]?.includes(target) ? 'remembered' : null;
|
|
16
|
+
}
|
|
17
|
+
export function grant(policy, key, sessionId, target, facts = {}) {
|
|
18
|
+
if (facts.unattended)
|
|
19
|
+
return null;
|
|
20
|
+
// "Always approve" must not let a read-only session approve its way out of read-only mode.
|
|
21
|
+
return decide(facts.readOnly ? { auto: {}, globalTools: {}, remembered: policy.remembered } : policy, key, sessionId, target);
|
|
22
|
+
}
|
|
23
|
+
/** A conversation's runs share one switch whatever model they use; other runs follow their own. */
|
|
24
|
+
export const approvalKey = (run) => (run.mode === 'chat' ? 'chat' : run.harness);
|
|
25
|
+
export class Approvals {
|
|
26
|
+
bus;
|
|
27
|
+
path;
|
|
28
|
+
constructor(stateDir, bus) {
|
|
29
|
+
this.bus = bus;
|
|
30
|
+
this.path = join(stateDir, 'approvals.json');
|
|
31
|
+
}
|
|
32
|
+
read() {
|
|
33
|
+
const stored = readJson(this.path) ?? {};
|
|
34
|
+
return { auto: stored.auto ?? {}, globalTools: stored.globalTools ?? {}, remembered: stored.remembered ?? {} };
|
|
35
|
+
}
|
|
36
|
+
change(update) {
|
|
37
|
+
const policy = this.read();
|
|
38
|
+
update(policy);
|
|
39
|
+
writeJson(this.path, policy);
|
|
40
|
+
try {
|
|
41
|
+
chmodSync(this.path, 0o600);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// The file was written; a mode that cannot be set is not worth failing the change.
|
|
45
|
+
}
|
|
46
|
+
this.bus.emit({ type: 'approvals.changed' });
|
|
47
|
+
return policy;
|
|
48
|
+
}
|
|
49
|
+
isAuto(key) {
|
|
50
|
+
try {
|
|
51
|
+
return Boolean(this.read().auto[key]);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Why this run's approval for `target` can be granted without asking, if it can. */
|
|
58
|
+
automatic(run, target, facts = {}) {
|
|
59
|
+
// What the application's own scope already covers needs neither the switch nor the user.
|
|
60
|
+
return grant(this.read(), approvalKey(run), run.sessionId, target, facts) ?? (!facts.unattended && facts.inScope ? 'scope' : null);
|
|
61
|
+
}
|
|
62
|
+
setAuto(key, on) {
|
|
63
|
+
if (!APPROVAL_KEYS.includes(key))
|
|
64
|
+
throw invalid('Unknown harness.');
|
|
65
|
+
return this.change((policy) => void (policy.auto[key] = on));
|
|
66
|
+
}
|
|
67
|
+
/** Always allow `target` for every session in this approval profile and state directory. */
|
|
68
|
+
allowTool(key, target) {
|
|
69
|
+
if (!APPROVAL_KEYS.includes(key))
|
|
70
|
+
throw invalid('Unknown harness.');
|
|
71
|
+
if (!target.trim())
|
|
72
|
+
throw invalid('A tool is required.');
|
|
73
|
+
return this.change((policy) => {
|
|
74
|
+
const targets = (policy.globalTools[key] ??= []);
|
|
75
|
+
if (!targets.includes(target))
|
|
76
|
+
targets.push(target);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
revokeTool(key, target) {
|
|
80
|
+
if (!APPROVAL_KEYS.includes(key))
|
|
81
|
+
throw invalid('Unknown harness.');
|
|
82
|
+
return this.change((policy) => {
|
|
83
|
+
const targets = policy.globalTools[key]?.filter((item) => item !== target) ?? [];
|
|
84
|
+
if (targets.length)
|
|
85
|
+
policy.globalTools[key] = targets;
|
|
86
|
+
else
|
|
87
|
+
delete policy.globalTools[key];
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/** Always allow `target` in this session. */
|
|
91
|
+
remember(sessionId, target) {
|
|
92
|
+
if (!target.trim())
|
|
93
|
+
throw invalid('A tool is required.');
|
|
94
|
+
return this.change((policy) => {
|
|
95
|
+
const targets = (policy.remembered[sessionId] ??= []);
|
|
96
|
+
if (!targets.includes(target))
|
|
97
|
+
targets.push(target);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
forget(sessionId, target) {
|
|
101
|
+
return this.change((policy) => {
|
|
102
|
+
const targets = policy.remembered[sessionId]?.filter((item) => item !== target) ?? [];
|
|
103
|
+
if (targets.length)
|
|
104
|
+
policy.remembered[sessionId] = targets;
|
|
105
|
+
else
|
|
106
|
+
delete policy.remembered[sessionId];
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/** Forgets what was remembered for a session that no longer exists. */
|
|
110
|
+
forgetSession(sessionId) {
|
|
111
|
+
try {
|
|
112
|
+
if (sessionId in this.read().remembered)
|
|
113
|
+
this.change((policy) => void delete policy.remembered[sessionId]);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Nothing recorded.
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { CapabilitySet } from "../capabilities/types.js";
|
|
2
|
+
import type { HostSection } from "../prompt/compile.js";
|
|
3
|
+
import { type ChecklistItem } from "./contracts.js";
|
|
4
|
+
import { type PendingDecision } from "./runStore.js";
|
|
5
|
+
export declare const CONTINUATION_SECTION_ID = "continuation";
|
|
6
|
+
/** Right after the plan section, before the variant's own sections. */
|
|
7
|
+
export declare const CONTINUATION_SECTION_ORDER = 26;
|
|
8
|
+
/** Why a run cannot be continued. */
|
|
9
|
+
export type ContinuationBlock = 'not_found' | 'active' | 'completed' | 'no_history' | 'history_missing';
|
|
10
|
+
export interface Continuation {
|
|
11
|
+
runId: string;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
status: string;
|
|
14
|
+
resumable: boolean;
|
|
15
|
+
reason: ContinuationBlock | null;
|
|
16
|
+
/** The exact native history to reopen; set when it was found in the session folder. */
|
|
17
|
+
resume: {
|
|
18
|
+
sessionFile: string;
|
|
19
|
+
nativeSessionId: string;
|
|
20
|
+
} | null;
|
|
21
|
+
accountId: string | null;
|
|
22
|
+
/** The variant the run pinned; a continuation pins the same version. */
|
|
23
|
+
variant: {
|
|
24
|
+
scope: string;
|
|
25
|
+
version: string | null;
|
|
26
|
+
} | null;
|
|
27
|
+
capabilities: CapabilitySet | null;
|
|
28
|
+
stoppedAt: string | null;
|
|
29
|
+
terminalReason: string | null;
|
|
30
|
+
checklist: ChecklistItem[];
|
|
31
|
+
pending: PendingDecision[];
|
|
32
|
+
/** The last tool the run started, and whether it finished. */
|
|
33
|
+
lastTool: {
|
|
34
|
+
name: string;
|
|
35
|
+
finished: boolean;
|
|
36
|
+
} | null;
|
|
37
|
+
/** Child runs that did not finish. */
|
|
38
|
+
unfinishedSubagents: string[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* What a new run needs to continue `runId`. With `sessionDir` the native history is looked up in
|
|
42
|
+
* it; without, `resume` stays null and the run reads as not resumable only when it has no history.
|
|
43
|
+
*/
|
|
44
|
+
export declare function continuationOf(root: string, runId: string, sessionDir?: string | null): Continuation;
|
|
45
|
+
/** The text that tells the model where the earlier run stopped. */
|
|
46
|
+
export declare function continuationBody(continuation: Continuation): string;
|
|
47
|
+
/** The dynamic section for a continuation; on a later run, the empty slot withdraws it. */
|
|
48
|
+
export declare function continuationSection(continuation: Continuation | null, delivered: boolean): HostSection | null;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Continuing a run that stopped before it finished. The harness never restarts model work on its
|
|
2
|
+
// own (INV-RUN-4); it says whether a run can be continued and, when the application starts a new
|
|
3
|
+
// run with `continueFrom`, tells the model where the earlier one stopped.
|
|
4
|
+
import { loadRun as loadCapabilities } from "../capabilities/runSnapshot.js";
|
|
5
|
+
import { checklistOf, describeChecklist } from "../tools/checklist.js";
|
|
6
|
+
import { isActiveStatus } from "./contracts.js";
|
|
7
|
+
import { findHistory } from "./history.js";
|
|
8
|
+
import { findRun, pendingDecisions, readEvents, recordedSubagents } from "./runStore.js";
|
|
9
|
+
export const CONTINUATION_SECTION_ID = 'continuation';
|
|
10
|
+
/** Right after the plan section, before the variant's own sections. */
|
|
11
|
+
export const CONTINUATION_SECTION_ORDER = 26;
|
|
12
|
+
const CONTINUATION_BUDGET = 2000;
|
|
13
|
+
/**
|
|
14
|
+
* What a new run needs to continue `runId`. With `sessionDir` the native history is looked up in
|
|
15
|
+
* it; without, `resume` stays null and the run reads as not resumable only when it has no history.
|
|
16
|
+
*/
|
|
17
|
+
export function continuationOf(root, runId, sessionDir) {
|
|
18
|
+
const record = findRun(root, runId);
|
|
19
|
+
if (!record) {
|
|
20
|
+
return { runId, sessionId: '', status: 'missing', resumable: false, reason: 'not_found', resume: null, accountId: null, variant: null, capabilities: null, stoppedAt: null, terminalReason: null, checklist: [], pending: [], lastTool: null, unfinishedSubagents: [] };
|
|
21
|
+
}
|
|
22
|
+
const events = readEvents(root, runId);
|
|
23
|
+
const started = events.filter((event) => event.type === 'tool.started').at(-1);
|
|
24
|
+
const startedPayload = started?.payload;
|
|
25
|
+
const lastTool = startedPayload?.name
|
|
26
|
+
? { name: startedPayload.name, finished: events.some((event) => event.type === 'tool.completed' && event.payload.toolCallId === startedPayload.toolCallId) }
|
|
27
|
+
: null;
|
|
28
|
+
const snapshot = loadCapabilities(root, runId);
|
|
29
|
+
const capabilities = snapshot ? { version: 1, tools: snapshot.tools, connectors: snapshot.connectors, contributions: snapshot.contributions } : null;
|
|
30
|
+
const sessionFile = sessionDir && record.nativeSessionId ? findHistory(sessionDir, record.nativeSessionId) : null;
|
|
31
|
+
const reason = isActiveStatus(record.status) ? 'active'
|
|
32
|
+
: record.status === 'completed' ? 'completed'
|
|
33
|
+
: !record.nativeSessionId ? 'no_history'
|
|
34
|
+
: sessionDir && !sessionFile ? 'history_missing'
|
|
35
|
+
: null;
|
|
36
|
+
return {
|
|
37
|
+
runId,
|
|
38
|
+
sessionId: record.sessionId,
|
|
39
|
+
status: record.status,
|
|
40
|
+
resumable: reason === null,
|
|
41
|
+
reason,
|
|
42
|
+
resume: sessionFile && record.nativeSessionId ? { sessionFile, nativeSessionId: record.nativeSessionId } : null,
|
|
43
|
+
accountId: record.accountId,
|
|
44
|
+
variant: record.variantScope ? { scope: record.variantScope, version: record.variantVersion ?? null } : null,
|
|
45
|
+
capabilities,
|
|
46
|
+
stoppedAt: record.endedAt,
|
|
47
|
+
terminalReason: record.terminalReason,
|
|
48
|
+
checklist: checklistOf(events),
|
|
49
|
+
pending: pendingDecisions(events),
|
|
50
|
+
lastTool,
|
|
51
|
+
unfinishedSubagents: recordedSubagents(root, runId).filter((id) => {
|
|
52
|
+
const child = findRun(root, id);
|
|
53
|
+
return !child || child.status !== 'completed';
|
|
54
|
+
})
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const describePending = (decision) => {
|
|
58
|
+
const payload = decision.payload;
|
|
59
|
+
if (decision.kind === 'approval')
|
|
60
|
+
return `- An approval for ${typeof payload.target === 'string' ? payload.target : 'a tool call'}${typeof payload.action === 'string' && payload.action ? ` (${payload.action})` : ''} was never answered.`;
|
|
61
|
+
const question = typeof payload.question === 'string' ? payload.question : Array.isArray(payload.questions) && typeof payload.questions[0]?.question === 'string' ? payload.questions[0].question : 'a question';
|
|
62
|
+
return `- A question to the user was never answered: ${question}`;
|
|
63
|
+
};
|
|
64
|
+
/** The text that tells the model where the earlier run stopped. */
|
|
65
|
+
export function continuationBody(continuation) {
|
|
66
|
+
const lines = [
|
|
67
|
+
`The previous run (${continuation.runId}) stopped before it finished${continuation.stoppedAt ? ` at ${continuation.stoppedAt}` : ''}${continuation.terminalReason ? `: ${continuation.terminalReason}` : '.'}`,
|
|
68
|
+
'Its conversation above is intact up to that point. Check the current state before you repeat any step: work may be partly done.'
|
|
69
|
+
];
|
|
70
|
+
if (continuation.lastTool)
|
|
71
|
+
lines.push(continuation.lastTool.finished ? `Its last tool call, ${continuation.lastTool.name}, finished.` : `Its last tool call, ${continuation.lastTool.name}, did not finish; its effect is unknown.`);
|
|
72
|
+
if (continuation.checklist.length)
|
|
73
|
+
lines.push('', 'Its checklist when it stopped:', describeChecklist(continuation.checklist));
|
|
74
|
+
if (continuation.pending.length)
|
|
75
|
+
lines.push('', 'Unanswered when it stopped (ask again if still needed; never assume an answer):', ...continuation.pending.map(describePending));
|
|
76
|
+
if (continuation.unfinishedSubagents.length)
|
|
77
|
+
lines.push('', `Subagents that did not finish: ${continuation.unfinishedSubagents.join(', ')}. Start them again if their work is still needed.`);
|
|
78
|
+
return lines.join('\n');
|
|
79
|
+
}
|
|
80
|
+
/** The dynamic section for a continuation; on a later run, the empty slot withdraws it. */
|
|
81
|
+
export function continuationSection(continuation, delivered) {
|
|
82
|
+
if (continuation)
|
|
83
|
+
return { id: CONTINUATION_SECTION_ID, title: 'Continuing', body: continuationBody(continuation), budget: CONTINUATION_BUDGET, order: CONTINUATION_SECTION_ORDER, dynamic: true };
|
|
84
|
+
return delivered ? { id: CONTINUATION_SECTION_ID, title: 'Continuing', body: null, budget: CONTINUATION_BUDGET, order: CONTINUATION_SECTION_ORDER, dynamic: true } : null;
|
|
85
|
+
}
|