@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,255 @@
|
|
|
1
|
+
// Accounts. One profile (settings, registry, memory) and any number of Pi accounts, each with
|
|
2
|
+
// its own isolated agent folder, stored credentials, sign-in state, limits, health, and audit
|
|
3
|
+
// trail.
|
|
4
|
+
//
|
|
5
|
+
// Device-local layout under `<state dir>/accounts/`:
|
|
6
|
+
// accounts.json accounts, the default, pools (no secrets)
|
|
7
|
+
// <id>/state.json health, plan, limits, last error (no secrets)
|
|
8
|
+
// <id>/home/pi/ Pi's own agent folder for this account
|
|
9
|
+
// _shared/pi/ settings, skills, prompts linked into every account's agent folder
|
|
10
|
+
// audit.jsonl append-only account actions (secrets scrubbed)
|
|
11
|
+
//
|
|
12
|
+
// Switching is always manual. A pool only chooses an account when a session starts; a running
|
|
13
|
+
// or resumed session keeps the account it started with.
|
|
14
|
+
import { mkdirSync, readFileSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { HarnessError, invalid, notFound } from "../core/errors.js";
|
|
17
|
+
import { appendLine, newId, now, readJsonOr, safeId, writeJson } from "../core/fs.js";
|
|
18
|
+
import { charCount, compareText, lines, takeChars } from "../core/text.js";
|
|
19
|
+
/** The only provider the harness runs. Records of other providers are kept in the file and ignored. */
|
|
20
|
+
export const PROVIDER = 'pi';
|
|
21
|
+
export const emptyState = () => ({ health: 'unknown', signedIn: null, authMethod: null, plan: null, identity: null, limits: [], lastError: null, lastCheckedAt: null, cliVersion: null, capabilities: [], piProviders: [] });
|
|
22
|
+
// ---- Files ------------------------------------------------------------------------------
|
|
23
|
+
const registryPath = (dir) => join(dir, 'accounts.json');
|
|
24
|
+
const statePath = (dir, accountId) => join(dir, safeId(accountId), 'state.json');
|
|
25
|
+
export function loadRegistry(dir) {
|
|
26
|
+
const stored = readJsonOr(registryPath(dir), {}) ?? {};
|
|
27
|
+
return { accounts: stored.accounts ?? [], defaults: stored.defaults ?? {}, pools: stored.pools ?? [], migratedProviderKeys: stored.migratedProviderKeys ?? false };
|
|
28
|
+
}
|
|
29
|
+
export function saveRegistry(dir, registry) {
|
|
30
|
+
mkdirSync(dir, { recursive: true });
|
|
31
|
+
writeJson(registryPath(dir), registry);
|
|
32
|
+
}
|
|
33
|
+
export function loadState(dir, accountId) {
|
|
34
|
+
try {
|
|
35
|
+
return { ...emptyState(), ...(readJsonOr(statePath(dir, accountId), {}) ?? {}) };
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return emptyState();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function saveState(dir, accountId, state) {
|
|
42
|
+
writeJson(statePath(dir, accountId), state);
|
|
43
|
+
}
|
|
44
|
+
/** Replaces anything that looks like a token so audit lines and stored errors never hold secrets. */
|
|
45
|
+
export function scrub(text) {
|
|
46
|
+
const words = text.split(' ').map((word) => {
|
|
47
|
+
const bytes = Buffer.byteLength(word);
|
|
48
|
+
const tokenLike = bytes >= 24 && (word.match(/[A-Za-z0-9]/g)?.length ?? 0) * 10 >= bytes * 8;
|
|
49
|
+
return tokenLike || word.startsWith('sk-') || word.startsWith('sess-') ? '[redacted]' : word;
|
|
50
|
+
});
|
|
51
|
+
return takeChars(words.join(' '), 500);
|
|
52
|
+
}
|
|
53
|
+
export function audit(dir, accountId, action, detail) {
|
|
54
|
+
try {
|
|
55
|
+
mkdirSync(dir, { recursive: true });
|
|
56
|
+
appendLine(join(dir, 'audit.jsonl'), JSON.stringify({ at: now(), accountId, action, detail: scrub(detail) }));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// An audit line that cannot be written never fails the action it describes.
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** The newest audit entries first, optionally for one account. */
|
|
63
|
+
export function readAudit(dir, accountId, limit = 100) {
|
|
64
|
+
let text = '';
|
|
65
|
+
try {
|
|
66
|
+
text = readFileSync(join(dir, 'audit.jsonl'), 'utf8');
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
text = '';
|
|
70
|
+
}
|
|
71
|
+
const entries = lines(text).flatMap((line) => {
|
|
72
|
+
try {
|
|
73
|
+
const entry = JSON.parse(line);
|
|
74
|
+
return entry && typeof entry.at === 'string' && typeof entry.action === 'string' && (!accountId || entry.accountId === accountId) ? [entry] : [];
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
return entries.reverse().slice(0, Math.min(limit, 1000));
|
|
81
|
+
}
|
|
82
|
+
// ---- Health -----------------------------------------------------------------------------
|
|
83
|
+
function inFuture(timestamp) {
|
|
84
|
+
const time = timestamp ? Date.parse(timestamp) : Number.NaN;
|
|
85
|
+
return !Number.isNaN(time) && time > Date.now();
|
|
86
|
+
}
|
|
87
|
+
// How long a limit error that came without a reset time keeps the account limited. Providers
|
|
88
|
+
// report no limit windows, so nothing else would ever lift it.
|
|
89
|
+
const UNTIMED_LIMIT_ERROR_SECS = 3600;
|
|
90
|
+
export const isLimitCategory = (category) => category === 'rate_limited' || category === 'quota';
|
|
91
|
+
/**
|
|
92
|
+
* Whether a `rate_limited` or `quota` error still counts. With a reset time it counts until
|
|
93
|
+
* then; without one it counts for a short while after it was recorded.
|
|
94
|
+
*/
|
|
95
|
+
export function limitErrorActive(issue) {
|
|
96
|
+
if (issue.resetsAt)
|
|
97
|
+
return inFuture(issue.resetsAt);
|
|
98
|
+
const at = Date.parse(issue.at);
|
|
99
|
+
return !Number.isNaN(at) && Math.trunc((Date.now() - at) / 1000) < UNTIMED_LIMIT_ERROR_SECS;
|
|
100
|
+
}
|
|
101
|
+
export function deriveHealth(state) {
|
|
102
|
+
const limitedByWindow = state.limits.some((limit) => (limit.status === 'rejected' || (limit.usedPercent ?? 0) >= 100) && (!limit.resetsAt || inFuture(limit.resetsAt)));
|
|
103
|
+
const issue = state.lastError;
|
|
104
|
+
if (issue?.category === 'auth_expired')
|
|
105
|
+
return 'auth_expired';
|
|
106
|
+
if (issue && isLimitCategory(issue.category) && limitErrorActive(issue))
|
|
107
|
+
return 'limited';
|
|
108
|
+
if (state.signedIn === false)
|
|
109
|
+
return 'signed_out';
|
|
110
|
+
if (limitedByWindow)
|
|
111
|
+
return 'limited';
|
|
112
|
+
if (issue && !isLimitCategory(issue.category))
|
|
113
|
+
return 'error';
|
|
114
|
+
return state.signedIn === true ? 'ok' : 'unknown';
|
|
115
|
+
}
|
|
116
|
+
/** Read-modify-write on one account's state. Returns the previous health and the new state. */
|
|
117
|
+
export function updateState(dir, accountId, change) {
|
|
118
|
+
const state = loadState(dir, accountId);
|
|
119
|
+
const previous = state.health;
|
|
120
|
+
change(state);
|
|
121
|
+
state.health = deriveHealth(state);
|
|
122
|
+
saveState(dir, accountId, state);
|
|
123
|
+
return { previous, state };
|
|
124
|
+
}
|
|
125
|
+
// ---- Lookup and pinning -----------------------------------------------------------------
|
|
126
|
+
export function find(dir, accountId) {
|
|
127
|
+
const account = loadRegistry(dir).accounts.find((entry) => entry.id === accountId);
|
|
128
|
+
if (!account)
|
|
129
|
+
throw new HarnessError('account_required', "This session's account was removed.", 'Choose another account for it.');
|
|
130
|
+
return account;
|
|
131
|
+
}
|
|
132
|
+
const usable = (state) => state.health === 'ok' || state.health === 'unknown';
|
|
133
|
+
/**
|
|
134
|
+
* Chooses the account for a new session: the explicit account, else the pool's first usable
|
|
135
|
+
* account, else the default, else the first account. It never skips to another one silently.
|
|
136
|
+
*/
|
|
137
|
+
export function resolve(dir, accountId, poolId) {
|
|
138
|
+
const registry = loadRegistry(dir);
|
|
139
|
+
if (accountId) {
|
|
140
|
+
const account = find(dir, accountId);
|
|
141
|
+
if (account.provider !== PROVIDER)
|
|
142
|
+
throw invalid('That account belongs to another provider.');
|
|
143
|
+
return account;
|
|
144
|
+
}
|
|
145
|
+
if (poolId) {
|
|
146
|
+
const pool = registry.pools.find((entry) => entry.id === poolId);
|
|
147
|
+
if (!pool)
|
|
148
|
+
throw notFound('Pool');
|
|
149
|
+
const members = pool.accountIds.flatMap((id) => registry.accounts.find((account) => account.id === id) ?? []);
|
|
150
|
+
const ready = members.find((account) => usable(loadState(dir, account.id)));
|
|
151
|
+
if (ready)
|
|
152
|
+
return ready;
|
|
153
|
+
const resets = members.flatMap((account) => {
|
|
154
|
+
const state = loadState(dir, account.id);
|
|
155
|
+
return [...state.limits.map((limit) => limit.resetsAt), state.lastError?.resetsAt].filter((reset) => Boolean(reset));
|
|
156
|
+
});
|
|
157
|
+
const earliest = resets.sort(compareText)[0];
|
|
158
|
+
throw new HarnessError('account_unavailable', `Every account in ${pool.label} is unavailable.`, earliest ? `The earliest reset is ${earliest}.` : 'Reauthenticate an account in Accounts.');
|
|
159
|
+
}
|
|
160
|
+
const account = registry.accounts.find((entry) => entry.id === registry.defaults[PROVIDER]) ?? registry.accounts.find((entry) => entry.provider === PROVIDER);
|
|
161
|
+
if (!account)
|
|
162
|
+
throw new HarnessError('account_required', 'Add a Pi account first.', 'Open Accounts (⌘4) to sign in.');
|
|
163
|
+
return account;
|
|
164
|
+
}
|
|
165
|
+
/** The default account, if any exists. */
|
|
166
|
+
export function defaultAccount(dir) {
|
|
167
|
+
try {
|
|
168
|
+
return resolve(dir);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
export function summaryAuthentication(dir) {
|
|
175
|
+
const states = loadRegistry(dir).accounts.filter((account) => account.provider === PROVIDER).map((account) => loadState(dir, account.id));
|
|
176
|
+
if (states.some((state) => state.signedIn === true))
|
|
177
|
+
return 'authenticated';
|
|
178
|
+
return states.some((state) => state.signedIn === false) ? 'unauthenticated' : 'unknown';
|
|
179
|
+
}
|
|
180
|
+
export function overview(dir) {
|
|
181
|
+
const registry = loadRegistry(dir);
|
|
182
|
+
return {
|
|
183
|
+
accounts: registry.accounts.filter((account) => account.provider === PROVIDER).map((account) => ({ ...account, isDefault: registry.defaults[account.provider] === account.id, state: loadState(dir, account.id) })),
|
|
184
|
+
pools: registry.pools.filter((pool) => pool.provider === PROVIDER),
|
|
185
|
+
defaults: registry.defaults
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
// ---- Changes ----------------------------------------------------------------------------
|
|
189
|
+
export function cleanLabel(label) {
|
|
190
|
+
const cleaned = label.trim();
|
|
191
|
+
if (!cleaned || charCount(cleaned) > 60)
|
|
192
|
+
throw invalid('Give the account a name of 1–60 characters.');
|
|
193
|
+
return cleaned;
|
|
194
|
+
}
|
|
195
|
+
export function addAccount(dir, label, authKind) {
|
|
196
|
+
if (authKind !== 'subscription' && authKind !== 'apiKey')
|
|
197
|
+
throw invalid('Unknown sign-in type.');
|
|
198
|
+
const account = { id: newId(), provider: PROVIDER, label: cleanLabel(label), authKind, credentialStore: 'keyring', createdAt: now() };
|
|
199
|
+
const registry = loadRegistry(dir);
|
|
200
|
+
registry.defaults[PROVIDER] ??= account.id;
|
|
201
|
+
registry.accounts.push(account);
|
|
202
|
+
saveRegistry(dir, registry);
|
|
203
|
+
return account;
|
|
204
|
+
}
|
|
205
|
+
export function renameAccount(dir, accountId, label) {
|
|
206
|
+
const cleaned = cleanLabel(label);
|
|
207
|
+
const registry = loadRegistry(dir);
|
|
208
|
+
const account = registry.accounts.find((entry) => entry.id === accountId);
|
|
209
|
+
if (!account)
|
|
210
|
+
throw notFound('Account');
|
|
211
|
+
account.label = cleaned;
|
|
212
|
+
saveRegistry(dir, registry);
|
|
213
|
+
}
|
|
214
|
+
export function setDefault(dir, accountId) {
|
|
215
|
+
const account = find(dir, accountId);
|
|
216
|
+
const registry = loadRegistry(dir);
|
|
217
|
+
registry.defaults[account.provider] = account.id;
|
|
218
|
+
saveRegistry(dir, registry);
|
|
219
|
+
return account;
|
|
220
|
+
}
|
|
221
|
+
/** Drops the account from the registry, its pools, and the default. Its folder and secrets are the caller's to remove. */
|
|
222
|
+
export function forgetAccount(dir, account) {
|
|
223
|
+
const registry = loadRegistry(dir);
|
|
224
|
+
registry.accounts = registry.accounts.filter((entry) => entry.id !== account.id);
|
|
225
|
+
if (registry.defaults[account.provider] === account.id) {
|
|
226
|
+
const next = registry.accounts.find((entry) => entry.provider === account.provider);
|
|
227
|
+
if (next)
|
|
228
|
+
registry.defaults[account.provider] = next.id;
|
|
229
|
+
else
|
|
230
|
+
delete registry.defaults[account.provider];
|
|
231
|
+
}
|
|
232
|
+
for (const pool of registry.pools)
|
|
233
|
+
pool.accountIds = pool.accountIds.filter((id) => id !== account.id);
|
|
234
|
+
saveRegistry(dir, registry);
|
|
235
|
+
}
|
|
236
|
+
export function savePool(dir, pool) {
|
|
237
|
+
const label = cleanLabel(pool.label);
|
|
238
|
+
const registry = loadRegistry(dir);
|
|
239
|
+
for (const id of pool.accountIds) {
|
|
240
|
+
const account = registry.accounts.find((entry) => entry.id === id);
|
|
241
|
+
if (!account)
|
|
242
|
+
throw notFound('Account');
|
|
243
|
+
if (account.provider !== PROVIDER)
|
|
244
|
+
throw invalid('A pool holds accounts of one provider.');
|
|
245
|
+
}
|
|
246
|
+
const next = { id: pool.id ? safeId(pool.id) : newId(), provider: PROVIDER, label, accountIds: [...pool.accountIds] };
|
|
247
|
+
registry.pools = [...registry.pools.filter((existing) => existing.id !== next.id), next];
|
|
248
|
+
saveRegistry(dir, registry);
|
|
249
|
+
return next;
|
|
250
|
+
}
|
|
251
|
+
export function removePool(dir, poolId) {
|
|
252
|
+
const registry = loadRegistry(dir);
|
|
253
|
+
registry.pools = registry.pools.filter((pool) => pool.id !== poolId);
|
|
254
|
+
saveRegistry(dir, registry);
|
|
255
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const RECALL = ['history_search', 'history_read', 'trajectory_search', 'trajectory_read', 'wiki_search', 'wiki_read', 'wiki_list', 'skill_load'];
|
|
2
|
+
const PROGRESS = ['checklist_write', 'session_name'];
|
|
3
|
+
const WEB = ['web_search', 'web_fetch'];
|
|
4
|
+
export const BUILTIN_PROFILES = [
|
|
5
|
+
{
|
|
6
|
+
name: 'worker',
|
|
7
|
+
description: 'Carries out a well-defined change: reads, edits and writes files and runs commands.',
|
|
8
|
+
color: 'green',
|
|
9
|
+
instructions: [
|
|
10
|
+
'You carry out one piece of work from your brief, end to end.',
|
|
11
|
+
'- Read the code you change first and follow the conventions you find.',
|
|
12
|
+
'- Keep a checklist with checklist_write when the brief has more than one step, and name your session with session_name.',
|
|
13
|
+
'- Make the change, then check it: run the relevant tests, type checks or commands.',
|
|
14
|
+
'- Stay inside the brief. If something outside it blocks you, stop and say so instead of widening the change.',
|
|
15
|
+
'- Finish with a short report: what you changed (files), how you checked it, and anything left open.'
|
|
16
|
+
].join('\n'),
|
|
17
|
+
tools: ['read', 'grep', 'find', 'ls', 'edit', 'write', 'bash', ...PROGRESS, ...RECALL, ...WEB],
|
|
18
|
+
plugins: null, variant: null, model: null, effort: null
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'explorer',
|
|
22
|
+
description: 'Finds and explains code, files and history without changing anything.',
|
|
23
|
+
color: 'cyan',
|
|
24
|
+
instructions: [
|
|
25
|
+
'You answer a question about the code, files or history in your brief. You never change anything.',
|
|
26
|
+
'- Search broadly first, then read the parts that matter.',
|
|
27
|
+
'- Keep a checklist with checklist_write when the search has several parts, and name your session with session_name.',
|
|
28
|
+
'- Cite what you found as path:line.',
|
|
29
|
+
'- Return conclusions, not file dumps: what you found, where, and how sure you are.'
|
|
30
|
+
].join('\n'),
|
|
31
|
+
tools: ['read', 'grep', 'find', 'ls', ...PROGRESS, ...RECALL, ...WEB],
|
|
32
|
+
plugins: null, variant: null, model: null, effort: null
|
|
33
|
+
}
|
|
34
|
+
];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CapabilitySet } from "../capabilities/types.js";
|
|
2
|
+
import type { PluginDescriptor } from "../plugins/types.js";
|
|
3
|
+
import type { AgentProfile } from "./profiles.js";
|
|
4
|
+
export interface NarrowedCapabilities {
|
|
5
|
+
capabilities: CapabilitySet;
|
|
6
|
+
/** Tools the profile names that the parent does not have here. */
|
|
7
|
+
unavailable: string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The parent's set narrowed by the profile's tools and plugins and by the tools the spawn call
|
|
11
|
+
* asked for. A required plugin always stays; a tool whose plugin was dropped goes with it.
|
|
12
|
+
*/
|
|
13
|
+
export declare function narrowForProfile(parent: CapabilitySet, profile: Pick<AgentProfile, 'tools' | 'plugins'> | null, requested: readonly string[] | undefined, descriptors: readonly PluginDescriptor[]): NarrowedCapabilities;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
function pluginOf(id) {
|
|
2
|
+
return id.split('/')[0] ?? '';
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* The parent's set narrowed by the profile's tools and plugins and by the tools the spawn call
|
|
6
|
+
* asked for. A required plugin always stays; a tool whose plugin was dropped goes with it.
|
|
7
|
+
*/
|
|
8
|
+
export function narrowForProfile(parent, profile, requested, descriptors) {
|
|
9
|
+
let tools = parent.tools.filter((name) => !requested || requested.includes(name));
|
|
10
|
+
let contributions = parent.contributions;
|
|
11
|
+
const unavailable = profile?.tools?.filter((name) => !parent.tools.includes(name)) ?? [];
|
|
12
|
+
if (profile?.tools)
|
|
13
|
+
tools = tools.filter((name) => profile.tools.includes(name));
|
|
14
|
+
if (profile?.plugins) {
|
|
15
|
+
const allowed = new Set([...profile.plugins, ...descriptors.filter((descriptor) => descriptor.required).map((descriptor) => descriptor.id)]);
|
|
16
|
+
contributions = contributions.filter((id) => allowed.has(pluginOf(id)));
|
|
17
|
+
const owner = new Map();
|
|
18
|
+
for (const descriptor of descriptors)
|
|
19
|
+
for (const tool of descriptor.tools ?? [])
|
|
20
|
+
owner.set(tool.name, descriptor.id);
|
|
21
|
+
for (const id of parent.contributions) {
|
|
22
|
+
const [plugin, kind, name] = id.split('/');
|
|
23
|
+
if (kind === 'tool' && plugin && name)
|
|
24
|
+
owner.set(name, plugin);
|
|
25
|
+
}
|
|
26
|
+
tools = tools.filter((name) => !owner.has(name) || allowed.has(owner.get(name)));
|
|
27
|
+
}
|
|
28
|
+
return { capabilities: { ...parent, tools, contributions }, unavailable };
|
|
29
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { type Effort } from "../core/effort.js";
|
|
2
|
+
export declare const PROFILE_NAME: RegExp;
|
|
3
|
+
export declare const PROFILE_COLORS: readonly ["blue", "green", "yellow", "red", "magenta", "cyan", "orange", "purple"];
|
|
4
|
+
export type ProfileColor = (typeof PROFILE_COLORS)[number];
|
|
5
|
+
export type ProfileSource = 'builtin' | 'global' | 'project' | 'variant';
|
|
6
|
+
/** Where a person's own profile file lives. */
|
|
7
|
+
export type ProfileScope = 'global' | 'project';
|
|
8
|
+
/** Which variant a profile's subagent runs: a scope's head or version, none, or the parent's (null). */
|
|
9
|
+
export type ProfileVariant = {
|
|
10
|
+
scope: string;
|
|
11
|
+
version: string | null;
|
|
12
|
+
} | 'none' | null;
|
|
13
|
+
export interface AgentProfile {
|
|
14
|
+
name: string;
|
|
15
|
+
description: string;
|
|
16
|
+
color: ProfileColor;
|
|
17
|
+
/** The role instructions: the file's body. */
|
|
18
|
+
instructions: string;
|
|
19
|
+
/** Tool allowlist; null keeps every tool the parent has. */
|
|
20
|
+
tools: string[] | null;
|
|
21
|
+
/** Plugin ids whose contributions the subagent keeps; null keeps all. Required plugins always stay. */
|
|
22
|
+
plugins: string[] | null;
|
|
23
|
+
variant: ProfileVariant;
|
|
24
|
+
model: string | null;
|
|
25
|
+
effort: Effort | null;
|
|
26
|
+
source: ProfileSource;
|
|
27
|
+
/** The file it was read from; null for built-ins. */
|
|
28
|
+
path: string | null;
|
|
29
|
+
}
|
|
30
|
+
export interface ProfileProblem {
|
|
31
|
+
name: string;
|
|
32
|
+
source: ProfileSource;
|
|
33
|
+
path: string;
|
|
34
|
+
error: string;
|
|
35
|
+
}
|
|
36
|
+
export interface ProfileListing {
|
|
37
|
+
profiles: AgentProfile[];
|
|
38
|
+
problems: ProfileProblem[];
|
|
39
|
+
}
|
|
40
|
+
/** The built-in profile definitions, before a source is attached. */
|
|
41
|
+
export type ProfileDefinition = Omit<AgentProfile, 'source' | 'path'>;
|
|
42
|
+
/** Nearest folder above `cwd` that holds `.git`, or `cwd` itself. */
|
|
43
|
+
export declare function projectRoot(cwd: string): string;
|
|
44
|
+
export declare function profileDirs(root: string, cwd?: string | null): {
|
|
45
|
+
global: string;
|
|
46
|
+
project: string | null;
|
|
47
|
+
};
|
|
48
|
+
export declare function parseVariant(value: unknown): ProfileVariant;
|
|
49
|
+
export declare function formatVariant(variant: ProfileVariant): string | null;
|
|
50
|
+
/** Reads one profile file. Throws an `invalid_request` error that names what is wrong. */
|
|
51
|
+
export declare function parseProfile(text: string, name: string, source: ProfileSource, path: string | null): AgentProfile;
|
|
52
|
+
/** The file text for a profile, as `createProfile` writes it. */
|
|
53
|
+
export declare function profileText(profile: ProfileDefinition): string;
|
|
54
|
+
/**
|
|
55
|
+
* Every profile a session in `cwd` can use. An unreadable file is reported in `problems`; it hides
|
|
56
|
+
* nothing, so a broken project file leaves the global or built-in profile of that name in force.
|
|
57
|
+
*/
|
|
58
|
+
export declare function listProfiles(root: string, cwd?: string | null, variantDir?: string | null): ProfileListing;
|
|
59
|
+
export declare function resolveProfile(root: string, cwd: string | null | undefined, name: string, variantDir?: string | null): AgentProfile | null;
|
|
60
|
+
/** Writes a new profile file from the template, or a copy of `from`. Refuses to overwrite one. */
|
|
61
|
+
export declare function createProfile(root: string, cwd: string | null | undefined, input: {
|
|
62
|
+
name: string;
|
|
63
|
+
scope: ProfileScope;
|
|
64
|
+
from?: string | null;
|
|
65
|
+
}): AgentProfile;
|
|
66
|
+
/** Deletes a person's own profile file. Built-ins and variant subagents cannot be removed here. */
|
|
67
|
+
export declare function removeProfile(root: string, cwd: string | null | undefined, input: {
|
|
68
|
+
name: string;
|
|
69
|
+
scope: ProfileScope;
|
|
70
|
+
}): void;
|
|
71
|
+
/** Where the profile list sits among the prompt sections: the slot a variant's subagents used. */
|
|
72
|
+
export declare const PROFILE_SECTION_ORDER = 64;
|
|
73
|
+
/** The prompt section that lists the profiles a run can start subagents from. */
|
|
74
|
+
export declare function profileSection(root: string, cwd: string | null | undefined, variantDir?: string | null): {
|
|
75
|
+
id: string;
|
|
76
|
+
title: string;
|
|
77
|
+
body: string;
|
|
78
|
+
budget: number;
|
|
79
|
+
order: number;
|
|
80
|
+
};
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
// Agent profiles (PROP-0029): named bundles a subagent starts from, with its instructions, colour,
|
|
2
|
+
// tools, plugins, variant, model and effort. They come from four places, later ones winning:
|
|
3
|
+
// built-ins in code, `<data root>/agents/*.md`, `<project>/.xingular/agents/*.md`; a variant's own
|
|
4
|
+
// c5 subagents fill in names nobody else took. Profiles only narrow what the parent has.
|
|
5
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync } from 'node:fs';
|
|
6
|
+
import { dirname, join } from 'node:path';
|
|
7
|
+
import { EFFORTS } from "../core/effort.js";
|
|
8
|
+
import { invalid, notFound } from "../core/errors.js";
|
|
9
|
+
import { parse, serialize } from "../core/frontmatter.js";
|
|
10
|
+
import { atomicWrite } from "../core/fs.js";
|
|
11
|
+
import { subagentOf } from "../variant/materialise.js";
|
|
12
|
+
import { BUILTIN_PROFILES } from "./builtin.js";
|
|
13
|
+
export const PROFILE_NAME = /^[a-z0-9][a-z0-9_-]*$/;
|
|
14
|
+
export const PROFILE_COLORS = ['blue', 'green', 'yellow', 'red', 'magenta', 'cyan', 'orange', 'purple'];
|
|
15
|
+
/** Nearest folder above `cwd` that holds `.git`, or `cwd` itself. */
|
|
16
|
+
export function projectRoot(cwd) {
|
|
17
|
+
let dir = cwd;
|
|
18
|
+
for (;;) {
|
|
19
|
+
if (existsSync(join(dir, '.git')))
|
|
20
|
+
return dir;
|
|
21
|
+
const parent = dirname(dir);
|
|
22
|
+
if (parent === dir)
|
|
23
|
+
return cwd;
|
|
24
|
+
dir = parent;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function profileDirs(root, cwd) {
|
|
28
|
+
return { global: join(root, 'agents'), project: cwd ? join(projectRoot(cwd), '.xingular', 'agents') : null };
|
|
29
|
+
}
|
|
30
|
+
function stringList(value, field) {
|
|
31
|
+
if (value === undefined || value === null)
|
|
32
|
+
return null;
|
|
33
|
+
const list = typeof value === 'string' ? value.split(/[\s,]+/u) : value;
|
|
34
|
+
if (!Array.isArray(list) || list.some(item => typeof item !== 'string'))
|
|
35
|
+
throw invalid(`${field} must be a list of names.`);
|
|
36
|
+
return [...new Set(list.map(item => item.trim()).filter(Boolean))];
|
|
37
|
+
}
|
|
38
|
+
function optionalText(value, field) {
|
|
39
|
+
if (value === undefined || value === null || value === '')
|
|
40
|
+
return null;
|
|
41
|
+
if (typeof value !== 'string')
|
|
42
|
+
throw invalid(`${field} must be text.`);
|
|
43
|
+
return value.trim() || null;
|
|
44
|
+
}
|
|
45
|
+
export function parseVariant(value) {
|
|
46
|
+
const text = optionalText(value, 'variant');
|
|
47
|
+
if (!text)
|
|
48
|
+
return null;
|
|
49
|
+
if (text === 'none')
|
|
50
|
+
return 'none';
|
|
51
|
+
const [scope, version, ...rest] = text.split('@');
|
|
52
|
+
if (!scope || rest.length || (version !== undefined && !version))
|
|
53
|
+
throw invalid('variant must be <scope>, <scope>@<version> or none.');
|
|
54
|
+
return { scope, version: version ?? null };
|
|
55
|
+
}
|
|
56
|
+
export function formatVariant(variant) {
|
|
57
|
+
if (!variant)
|
|
58
|
+
return null;
|
|
59
|
+
if (variant === 'none')
|
|
60
|
+
return 'none';
|
|
61
|
+
return variant.version ? `${variant.scope}@${variant.version}` : variant.scope;
|
|
62
|
+
}
|
|
63
|
+
/** Reads one profile file. Throws an `invalid_request` error that names what is wrong. */
|
|
64
|
+
export function parseProfile(text, name, source, path) {
|
|
65
|
+
if (!PROFILE_NAME.test(name))
|
|
66
|
+
throw invalid('A profile name uses lowercase letters, digits, - and _, and starts with a letter or digit.');
|
|
67
|
+
const parsed = parse(text);
|
|
68
|
+
if (!parsed)
|
|
69
|
+
throw invalid('The profile needs a frontmatter block between --- lines.');
|
|
70
|
+
const front = parsed.front;
|
|
71
|
+
if (front.name !== undefined && front.name !== name)
|
|
72
|
+
throw invalid(`The file is named ${name} but its frontmatter says ${String(front.name)}.`);
|
|
73
|
+
const description = optionalText(front.description, 'description');
|
|
74
|
+
if (!description)
|
|
75
|
+
throw invalid('The profile needs a description.');
|
|
76
|
+
const color = optionalText(front.color, 'color') ?? 'blue';
|
|
77
|
+
if (!PROFILE_COLORS.includes(color))
|
|
78
|
+
throw invalid(`color must be one of ${PROFILE_COLORS.join(', ')}.`);
|
|
79
|
+
const effort = optionalText(front.effort, 'effort');
|
|
80
|
+
if (effort && !EFFORTS.includes(effort))
|
|
81
|
+
throw invalid(`effort must be one of ${EFFORTS.join(', ')}.`);
|
|
82
|
+
return {
|
|
83
|
+
name, description, color: color, instructions: parsed.body.trim(),
|
|
84
|
+
tools: stringList(front.tools, 'tools'), plugins: stringList(front.plugins, 'plugins'),
|
|
85
|
+
variant: parseVariant(front.variant), model: optionalText(front.model, 'model'), effort: effort,
|
|
86
|
+
source, path
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** The file text for a profile, as `createProfile` writes it. */
|
|
90
|
+
export function profileText(profile) {
|
|
91
|
+
const front = { name: profile.name, description: profile.description, color: profile.color };
|
|
92
|
+
if (profile.tools)
|
|
93
|
+
front.tools = profile.tools;
|
|
94
|
+
if (profile.plugins)
|
|
95
|
+
front.plugins = profile.plugins;
|
|
96
|
+
const variant = formatVariant(profile.variant);
|
|
97
|
+
if (variant)
|
|
98
|
+
front.variant = variant;
|
|
99
|
+
if (profile.model)
|
|
100
|
+
front.model = profile.model;
|
|
101
|
+
if (profile.effort)
|
|
102
|
+
front.effort = profile.effort;
|
|
103
|
+
return serialize(front, profile.instructions);
|
|
104
|
+
}
|
|
105
|
+
function readFolder(dir, source, into, problems) {
|
|
106
|
+
if (!dir || !existsSync(dir))
|
|
107
|
+
return;
|
|
108
|
+
for (const file of readdirSync(dir).filter(entry => entry.endsWith('.md')).sort()) {
|
|
109
|
+
const path = join(dir, file);
|
|
110
|
+
const name = file.slice(0, -3);
|
|
111
|
+
try {
|
|
112
|
+
if (!statSync(path).isFile())
|
|
113
|
+
continue;
|
|
114
|
+
into.set(name, parseProfile(readFileSync(path, 'utf8'), name, source, path));
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
problems.push({ name, source, path, error: error instanceof Error ? error.message : String(error) });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function variantDefinitions(variantDir) {
|
|
122
|
+
const folder = variantDir ? join(variantDir, 'sub_agents') : null;
|
|
123
|
+
if (!folder || !existsSync(folder))
|
|
124
|
+
return [];
|
|
125
|
+
return readdirSync(folder).sort().flatMap(name => {
|
|
126
|
+
const definition = subagentOf(variantDir, name);
|
|
127
|
+
if (!definition)
|
|
128
|
+
return [];
|
|
129
|
+
return [{
|
|
130
|
+
name, description: definition.description || name, color: 'blue', instructions: definition.instructions || definition.description,
|
|
131
|
+
tools: null, plugins: null, variant: null, model: null, effort: null,
|
|
132
|
+
source: 'variant', path: join(folder, name, 'AGENT.md')
|
|
133
|
+
}];
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Every profile a session in `cwd` can use. An unreadable file is reported in `problems`; it hides
|
|
138
|
+
* nothing, so a broken project file leaves the global or built-in profile of that name in force.
|
|
139
|
+
*/
|
|
140
|
+
export function listProfiles(root, cwd, variantDir) {
|
|
141
|
+
const profiles = new Map();
|
|
142
|
+
const problems = [];
|
|
143
|
+
for (const definition of BUILTIN_PROFILES)
|
|
144
|
+
profiles.set(definition.name, { ...definition, source: 'builtin', path: null });
|
|
145
|
+
const dirs = profileDirs(root, cwd);
|
|
146
|
+
readFolder(dirs.global, 'global', profiles, problems);
|
|
147
|
+
readFolder(dirs.project, 'project', profiles, problems);
|
|
148
|
+
for (const definition of variantDefinitions(variantDir))
|
|
149
|
+
if (!profiles.has(definition.name))
|
|
150
|
+
profiles.set(definition.name, definition);
|
|
151
|
+
return { profiles: [...profiles.values()].sort((left, right) => left.name.localeCompare(right.name)), problems };
|
|
152
|
+
}
|
|
153
|
+
export function resolveProfile(root, cwd, name, variantDir) {
|
|
154
|
+
if (!PROFILE_NAME.test(name))
|
|
155
|
+
return null;
|
|
156
|
+
return listProfiles(root, cwd, variantDir).profiles.find(profile => profile.name === name) ?? null;
|
|
157
|
+
}
|
|
158
|
+
function scopeDir(root, cwd, scope) {
|
|
159
|
+
const dirs = profileDirs(root, cwd);
|
|
160
|
+
if (scope === 'global')
|
|
161
|
+
return dirs.global;
|
|
162
|
+
if (!dirs.project)
|
|
163
|
+
throw invalid('A project profile needs a working folder.');
|
|
164
|
+
return dirs.project;
|
|
165
|
+
}
|
|
166
|
+
const TEMPLATE = {
|
|
167
|
+
description: 'What this agent is for, in one line.',
|
|
168
|
+
color: 'blue',
|
|
169
|
+
instructions: 'Describe how this agent should work: what to do with a brief, what to avoid, and what to report back.',
|
|
170
|
+
tools: null, plugins: null, variant: null, model: null, effort: null
|
|
171
|
+
};
|
|
172
|
+
/** Writes a new profile file from the template, or a copy of `from`. Refuses to overwrite one. */
|
|
173
|
+
export function createProfile(root, cwd, input) {
|
|
174
|
+
const name = typeof input.name === 'string' ? input.name.trim() : '';
|
|
175
|
+
if (!PROFILE_NAME.test(name))
|
|
176
|
+
throw invalid('A profile name uses lowercase letters, digits, - and _, and starts with a letter or digit.');
|
|
177
|
+
if (input.scope !== 'global' && input.scope !== 'project')
|
|
178
|
+
throw invalid('scope must be global or project.');
|
|
179
|
+
const dir = scopeDir(root, cwd, input.scope);
|
|
180
|
+
const path = join(dir, `${name}.md`);
|
|
181
|
+
if (existsSync(path))
|
|
182
|
+
throw invalid(`There is already a ${input.scope} profile named ${name}.`);
|
|
183
|
+
let source = { ...TEMPLATE, name };
|
|
184
|
+
if (input.from) {
|
|
185
|
+
const original = resolveProfile(root, cwd, input.from);
|
|
186
|
+
if (!original)
|
|
187
|
+
throw notFound(`The profile ${input.from}`);
|
|
188
|
+
source = { ...original, name };
|
|
189
|
+
}
|
|
190
|
+
mkdirSync(dir, { recursive: true });
|
|
191
|
+
const text = profileText(source);
|
|
192
|
+
atomicWrite(path, text);
|
|
193
|
+
return parseProfile(text, name, input.scope, path);
|
|
194
|
+
}
|
|
195
|
+
/** Deletes a person's own profile file. Built-ins and variant subagents cannot be removed here. */
|
|
196
|
+
export function removeProfile(root, cwd, input) {
|
|
197
|
+
if (!PROFILE_NAME.test(input.name))
|
|
198
|
+
throw invalid('That is not a profile name.');
|
|
199
|
+
if (input.scope !== 'global' && input.scope !== 'project')
|
|
200
|
+
throw invalid('scope must be global or project.');
|
|
201
|
+
const path = join(scopeDir(root, cwd, input.scope), `${input.name}.md`);
|
|
202
|
+
if (!existsSync(path))
|
|
203
|
+
throw notFound(`The ${input.scope} profile ${input.name}`);
|
|
204
|
+
rmSync(path);
|
|
205
|
+
}
|
|
206
|
+
/** Where the profile list sits among the prompt sections: the slot a variant's subagents used. */
|
|
207
|
+
export const PROFILE_SECTION_ORDER = 64;
|
|
208
|
+
/** The prompt section that lists the profiles a run can start subagents from. */
|
|
209
|
+
export function profileSection(root, cwd, variantDir) {
|
|
210
|
+
const { profiles } = listProfiles(root, cwd, variantDir);
|
|
211
|
+
return {
|
|
212
|
+
id: 'subagents',
|
|
213
|
+
title: 'Subagents',
|
|
214
|
+
body: [
|
|
215
|
+
'Start one with spawn_subagent and agent set to a profile name, or omit agent for a copy of yourself. Each works in its own context with a complete brief from you, keeps its own checklist the user can follow, and returns text. A profile can only narrow your tools.',
|
|
216
|
+
...profiles.map((profile) => `- ${profile.name} — ${profile.description}`)
|
|
217
|
+
].join('\n'),
|
|
218
|
+
budget: 6_000,
|
|
219
|
+
order: PROFILE_SECTION_ORDER
|
|
220
|
+
};
|
|
221
|
+
}
|