@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,104 @@
|
|
|
1
|
+
import type { Bus } from "../core/bus.js";
|
|
2
|
+
import { type Attachments, type AttachScope } from "./attachments.js";
|
|
3
|
+
import { type Found, type ResolveInput, type Resolver } from "./discover.js";
|
|
4
|
+
import { Trust, type ProjectCode } from "./trust.js";
|
|
5
|
+
/** What one session or terminal loads besides the registry's own items. */
|
|
6
|
+
export interface Loading {
|
|
7
|
+
/** Extension files and folders, in the order Pi would have loaded them. */
|
|
8
|
+
extensionPaths: string[];
|
|
9
|
+
skillPaths: string[];
|
|
10
|
+
promptPaths: string[];
|
|
11
|
+
themePaths: string[];
|
|
12
|
+
/** The `pi` command's own extensions left on, as `builtin:<name>`. Only a terminal has them. */
|
|
13
|
+
builtins: string[];
|
|
14
|
+
/** Hooks files the harness runs itself. Pi is never given them. */
|
|
15
|
+
hooks: {
|
|
16
|
+
path: string;
|
|
17
|
+
packageRoot: string;
|
|
18
|
+
hash: string;
|
|
19
|
+
}[];
|
|
20
|
+
/** Everything found, loaded or not. */
|
|
21
|
+
found: Found[];
|
|
22
|
+
/** Paths of found items a person switched off for this caller. */
|
|
23
|
+
detached: string[];
|
|
24
|
+
/** Applies the same attachment policy to resources supplied by a trusted extension. */
|
|
25
|
+
resourceAllowed?: (item: Found) => boolean;
|
|
26
|
+
/** Code the working folder brings, and whether a person trusted it. */
|
|
27
|
+
projectCode: (ProjectCode & {
|
|
28
|
+
trusted: boolean;
|
|
29
|
+
}) | null;
|
|
30
|
+
/** Each installed package that brings code, by its folder, and whether a person trusted it. */
|
|
31
|
+
packageCode: Record<string, ProjectCode & {
|
|
32
|
+
trusted: boolean;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
/** What one loaded extension added to a session. */
|
|
36
|
+
export interface Registered {
|
|
37
|
+
path: string;
|
|
38
|
+
hooks: string[];
|
|
39
|
+
tools: string[];
|
|
40
|
+
commands: string[];
|
|
41
|
+
flags: string[];
|
|
42
|
+
shortcuts: string[];
|
|
43
|
+
/** Fingerprint at observation time; stale registrations are not presented as current. */
|
|
44
|
+
hash?: string | null;
|
|
45
|
+
seenAt?: string;
|
|
46
|
+
resources?: RuntimeResource[];
|
|
47
|
+
}
|
|
48
|
+
export interface RuntimeResource {
|
|
49
|
+
kind: 'skill' | 'command' | 'theme';
|
|
50
|
+
name: string;
|
|
51
|
+
path: string;
|
|
52
|
+
chars: number | null;
|
|
53
|
+
}
|
|
54
|
+
export interface PluginsOptions {
|
|
55
|
+
stateDir: string;
|
|
56
|
+
bus: Bus;
|
|
57
|
+
resolver?: Resolver;
|
|
58
|
+
/** The choices a person made about what is switched on, or `null` while there is no data root. */
|
|
59
|
+
attachments?: () => Attachments | null;
|
|
60
|
+
/** The folder of packages kept with a person's data, or `null` while there is no data root. */
|
|
61
|
+
packagesDir?: () => string | null;
|
|
62
|
+
}
|
|
63
|
+
/** The package folders inside a folder: each direct child that is a folder and not hidden. */
|
|
64
|
+
export declare function packageFolders(directory: string | null): string[];
|
|
65
|
+
export interface LoadingInput extends ResolveInput {
|
|
66
|
+
/** Who the session is for. Something switched off for this agent or project does not load. */
|
|
67
|
+
caller?: AttachScope;
|
|
68
|
+
/** The contributions frozen for a run. When present, this snapshot governs loading. */
|
|
69
|
+
contributions?: readonly string[];
|
|
70
|
+
}
|
|
71
|
+
/** Which code a person trusted: the working folder's as a whole, and each installed package's. */
|
|
72
|
+
export interface Trusted {
|
|
73
|
+
project: boolean;
|
|
74
|
+
/** Folders of installed packages whose code is not trusted. */
|
|
75
|
+
untrustedPackages: ReadonlySet<string>;
|
|
76
|
+
}
|
|
77
|
+
export declare const trustedBy: (loading: Pick<Loading, "projectCode" | "packageCode"> | null) => Trusted;
|
|
78
|
+
/**
|
|
79
|
+
* Whether a found item loads: it is on in Pi's settings, and if it is code, a person trusted it.
|
|
80
|
+
* A loose file in the shared folder was put there by hand and needs no trust. Text always loads.
|
|
81
|
+
*/
|
|
82
|
+
export declare function loads(item: Found, trusted: Trusted): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Whether a person left a found item switched on for a caller. Pi reads its instruction files
|
|
85
|
+
* itself and its command owns its built-in extensions, so neither can be switched off here.
|
|
86
|
+
*/
|
|
87
|
+
export declare function switchable(item: Found): boolean;
|
|
88
|
+
export declare class Plugins {
|
|
89
|
+
private readonly options;
|
|
90
|
+
readonly trust: Trust;
|
|
91
|
+
private readonly resolver;
|
|
92
|
+
private readonly registeredPath;
|
|
93
|
+
constructor(options: PluginsOptions);
|
|
94
|
+
/** Finds what Pi would load in this folder, and chooses what does. */
|
|
95
|
+
loading(input: LoadingInput): Promise<Loading>;
|
|
96
|
+
/** What each extension registered the last time a session loaded it. */
|
|
97
|
+
registered(): Record<string, Registered & {
|
|
98
|
+
seenAt: string;
|
|
99
|
+
}>;
|
|
100
|
+
/** Records what a session's extensions registered, so the list can show it without loading code. */
|
|
101
|
+
loaded(extensions: readonly Registered[]): void;
|
|
102
|
+
}
|
|
103
|
+
/** Removes the skill links an earlier version of the harness kept in a Pi agent folder's `skills/`. */
|
|
104
|
+
export declare function removeLinkedSkills(skillsDir: string): void;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// The harness decides what a Pi session loads. Pi's own discovery is switched off for sessions
|
|
2
|
+
// and terminals; they receive the paths chosen here, so nothing reaches a model unlisted.
|
|
3
|
+
import { chmodSync, lstatSync, readdirSync, rmSync, unlinkSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { now, readJsonOr, writeJson } from "../core/fs.js";
|
|
6
|
+
import { attached } from "./attachments.js";
|
|
7
|
+
import { piResolver } from "./discover.js";
|
|
8
|
+
import { foundIds, pluginIdOf } from "./identity.js";
|
|
9
|
+
import { packageCode, projectCode, Trust } from "./trust.js";
|
|
10
|
+
/** The package folders inside a folder: each direct child that is a folder and not hidden. */
|
|
11
|
+
export function packageFolders(directory) {
|
|
12
|
+
if (!directory)
|
|
13
|
+
return [];
|
|
14
|
+
try {
|
|
15
|
+
return readdirSync(directory, { withFileTypes: true }).filter((entry) => entry.isDirectory() && !entry.name.startsWith('.')).map((entry) => join(directory, entry.name)).sort();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export const trustedBy = (loading) => ({
|
|
22
|
+
project: !!loading?.projectCode?.trusted,
|
|
23
|
+
untrustedPackages: new Set(Object.entries(loading?.packageCode ?? {}).filter(([, code]) => !code.trusted).map(([root]) => root))
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* Whether a found item loads: it is on in Pi's settings, and if it is code, a person trusted it.
|
|
27
|
+
* A loose file in the shared folder was put there by hand and needs no trust. Text always loads.
|
|
28
|
+
*/
|
|
29
|
+
export function loads(item, trusted) {
|
|
30
|
+
if (!item.enabled)
|
|
31
|
+
return false;
|
|
32
|
+
if (item.kind !== 'extension' && item.kind !== 'hook')
|
|
33
|
+
return true;
|
|
34
|
+
if (item.project)
|
|
35
|
+
return trusted.project;
|
|
36
|
+
return !(item.packageRoot && trusted.untrustedPackages.has(item.packageRoot));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Whether a person left a found item switched on for a caller. Pi reads its instruction files
|
|
40
|
+
* itself and its command owns its built-in extensions, so neither can be switched off here.
|
|
41
|
+
*/
|
|
42
|
+
export function switchable(item) {
|
|
43
|
+
return item.kind !== 'context' && item.origin !== 'builtin';
|
|
44
|
+
}
|
|
45
|
+
export class Plugins {
|
|
46
|
+
options;
|
|
47
|
+
trust;
|
|
48
|
+
resolver;
|
|
49
|
+
registeredPath;
|
|
50
|
+
constructor(options) {
|
|
51
|
+
this.options = options;
|
|
52
|
+
this.trust = new Trust(options.stateDir, options.bus);
|
|
53
|
+
this.resolver = options.resolver ?? piResolver;
|
|
54
|
+
this.registeredPath = join(options.stateDir, 'plugin-registered.json');
|
|
55
|
+
}
|
|
56
|
+
/** Finds what Pi would load in this folder, and chooses what does. */
|
|
57
|
+
async loading(input) {
|
|
58
|
+
// Links an earlier version put in the shared skills folder would be found as skills again.
|
|
59
|
+
removeLinkedSkills(join(input.agentDir, 'skills'));
|
|
60
|
+
const found = await this.resolver({ ...input, packages: packageFolders(this.options.packagesDir?.() ?? null) });
|
|
61
|
+
const code = projectCode(found, input.cwd);
|
|
62
|
+
const packages = packageCode(found);
|
|
63
|
+
// Packages that loaded before trust was asked per package keep loading: they are taken over once.
|
|
64
|
+
if (!this.trust.adopted)
|
|
65
|
+
this.trust.adopt([...packages].map(([folder, packaged]) => ({ code: packaged, folder })));
|
|
66
|
+
const trustedHashes = new Set(this.trust.list().map((record) => record.hash));
|
|
67
|
+
const projectCodeState = code ? { ...code, trusted: trustedHashes.has(code.hash) } : null;
|
|
68
|
+
const packageCodeState = Object.fromEntries([...packages].map(([folder, packaged]) => [folder, { ...packaged, trusted: trustedHashes.has(packaged.hash) }]));
|
|
69
|
+
const trusted = trustedBy({ projectCode: projectCodeState, packageCode: packageCodeState });
|
|
70
|
+
const choices = this.options.attachments?.() ?? null;
|
|
71
|
+
const off = (item) => {
|
|
72
|
+
if (!choices || !switchable(item))
|
|
73
|
+
return false;
|
|
74
|
+
// A hook runs for everyone or not at all, so only its plugin's switch for everyone counts.
|
|
75
|
+
if (item.kind === 'hook')
|
|
76
|
+
return !attached(choices, [pluginIdOf(item)], {}, true);
|
|
77
|
+
return !attached(choices, foundIds(item), input.caller ?? {}, true);
|
|
78
|
+
};
|
|
79
|
+
const allowed = (item) => input.contributions === undefined
|
|
80
|
+
? !off(item)
|
|
81
|
+
: input.contributions.includes(foundIds(item)[0]);
|
|
82
|
+
const detached = found.filter((item) => !allowed(item)).map((item) => item.path);
|
|
83
|
+
const chosen = found.filter((item) => loads(item, trusted) && allowed(item));
|
|
84
|
+
const paths = (kind, builtin) => chosen.filter((item) => item.kind === kind && (item.origin === 'builtin') === builtin).map((item) => item.path);
|
|
85
|
+
return {
|
|
86
|
+
extensionPaths: paths('extension', false),
|
|
87
|
+
skillPaths: paths('skill', false),
|
|
88
|
+
promptPaths: paths('prompt', false),
|
|
89
|
+
themePaths: paths('theme', false),
|
|
90
|
+
builtins: paths('extension', true),
|
|
91
|
+
hooks: chosen.filter((item) => item.kind === 'hook' && item.packageRoot).map((item) => ({ path: item.path, packageRoot: item.packageRoot, hash: packageCodeState[item.packageRoot]?.hash ?? '' })),
|
|
92
|
+
found,
|
|
93
|
+
detached,
|
|
94
|
+
resourceAllowed: allowed,
|
|
95
|
+
projectCode: projectCodeState,
|
|
96
|
+
packageCode: packageCodeState
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** What each extension registered the last time a session loaded it. */
|
|
100
|
+
registered() {
|
|
101
|
+
return readJsonOr(this.registeredPath, {});
|
|
102
|
+
}
|
|
103
|
+
/** Records what a session's extensions registered, so the list can show it without loading code. */
|
|
104
|
+
loaded(extensions) {
|
|
105
|
+
if (!extensions.length)
|
|
106
|
+
return;
|
|
107
|
+
const stored = this.registered();
|
|
108
|
+
let changed = false;
|
|
109
|
+
for (const extension of extensions) {
|
|
110
|
+
const { seenAt: _seenAt, ...before } = stored[extension.path] ?? {};
|
|
111
|
+
if (JSON.stringify(before) === JSON.stringify(extension))
|
|
112
|
+
continue;
|
|
113
|
+
stored[extension.path] = { ...extension, seenAt: now() };
|
|
114
|
+
changed = true;
|
|
115
|
+
}
|
|
116
|
+
if (!changed)
|
|
117
|
+
return;
|
|
118
|
+
writeJson(this.registeredPath, stored);
|
|
119
|
+
chmodSync(this.registeredPath, 0o600);
|
|
120
|
+
this.options.bus.emit({ type: 'plugins.changed' });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Prefix of the entries an earlier version of the harness linked into a Pi agent folder's `skills/`.
|
|
124
|
+
const LINKED_SKILL_PREFIX = 'agentx-';
|
|
125
|
+
function isLinkedSkill(path) {
|
|
126
|
+
let meta;
|
|
127
|
+
try {
|
|
128
|
+
meta = lstatSync(path);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
if (meta.isSymbolicLink())
|
|
134
|
+
return true;
|
|
135
|
+
if (!meta.isDirectory())
|
|
136
|
+
return false;
|
|
137
|
+
// A single-file skill was linked as `agentx-<name>/SKILL.md` inside a folder the harness made.
|
|
138
|
+
try {
|
|
139
|
+
const entries = readdirSync(path);
|
|
140
|
+
return entries.length === 1 && entries[0] === 'SKILL.md' && lstatSync(join(path, 'SKILL.md')).isSymbolicLink();
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Removes the skill links an earlier version of the harness kept in a Pi agent folder's `skills/`. */
|
|
147
|
+
export function removeLinkedSkills(skillsDir) {
|
|
148
|
+
let names;
|
|
149
|
+
try {
|
|
150
|
+
names = readdirSync(skillsDir);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
for (const name of names) {
|
|
156
|
+
const path = join(skillsDir, name);
|
|
157
|
+
if (!name.startsWith(LINKED_SKILL_PREFIX) || !isLinkedSkill(path))
|
|
158
|
+
continue;
|
|
159
|
+
if (lstatSync(path).isSymbolicLink())
|
|
160
|
+
unlinkSync(path);
|
|
161
|
+
else
|
|
162
|
+
rmSync(path, { recursive: true, force: true });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type * as Pi from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import type { Found } from "./discover.js";
|
|
3
|
+
import type { Loading, Registered, RuntimeResource } from "./plugins.js";
|
|
4
|
+
export declare function runtimeOwner(loading: Loading, path: string): Found | undefined;
|
|
5
|
+
export declare function registrationHash(loading: Loading, path: string): string | null;
|
|
6
|
+
/** A discovered resource has the same identity for its switch, catalogue and load decision. */
|
|
7
|
+
export declare function resourceOf(owner: Found, kind: 'skill' | 'prompt' | 'theme', path: string): RuntimeResource;
|
|
8
|
+
/** Wrap each handler separately so identical extension basenames never lose their owner. */
|
|
9
|
+
export declare function observeResources(pi: typeof Pi, loader: Pi.DefaultResourceLoader, loading: Loading, records: Registered[], publish: () => void): void;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// Observe Pi's structured resource discovery without running code while the catalogue is read.
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { readFileSync, readdirSync, statSync } from 'node:fs';
|
|
4
|
+
import { dirname, resolve } from 'node:path';
|
|
5
|
+
import { charCount } from "../core/text.js";
|
|
6
|
+
import { FOUND_KINDS, describeFound } from "./identity.js";
|
|
7
|
+
export function runtimeOwner(loading, path) {
|
|
8
|
+
return loading.found.find((item) => item.kind === 'extension' && (item.path === path || path.startsWith(`${item.path}/`)));
|
|
9
|
+
}
|
|
10
|
+
export function registrationHash(loading, path) {
|
|
11
|
+
const owner = runtimeOwner(loading, path);
|
|
12
|
+
if (owner?.project)
|
|
13
|
+
return loading.projectCode?.hash ?? null;
|
|
14
|
+
if (owner?.packageRoot)
|
|
15
|
+
return loading.packageCode[owner.packageRoot]?.hash ?? null;
|
|
16
|
+
try {
|
|
17
|
+
return createHash('sha256').update(readFileSync(path)).digest('hex');
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** A discovered resource has the same identity for its switch, catalogue and load decision. */
|
|
24
|
+
export function resourceOf(owner, kind, path) {
|
|
25
|
+
const found = { ...owner, kind, path };
|
|
26
|
+
const described = describeFound(found);
|
|
27
|
+
let chars = null;
|
|
28
|
+
try {
|
|
29
|
+
chars = charCount(readFileSync(path, 'utf8'));
|
|
30
|
+
}
|
|
31
|
+
catch { /* Missing files remain observable. */ }
|
|
32
|
+
return { kind: FOUND_KINDS[kind], name: described.name, path, chars };
|
|
33
|
+
}
|
|
34
|
+
/** Wrap each handler separately so identical extension basenames never lose their owner. */
|
|
35
|
+
export function observeResources(pi, loader, loading, records, publish) {
|
|
36
|
+
for (const extension of loader.getExtensions().extensions) {
|
|
37
|
+
if (extension.hidden)
|
|
38
|
+
continue;
|
|
39
|
+
const path = extension.resolvedPath || extension.path;
|
|
40
|
+
const owner = runtimeOwner(loading, path);
|
|
41
|
+
const record = records.find((entry) => entry.path === path);
|
|
42
|
+
if (!owner || !record)
|
|
43
|
+
continue;
|
|
44
|
+
const handlers = extension.handlers.get('resources_discover');
|
|
45
|
+
if (!handlers)
|
|
46
|
+
continue;
|
|
47
|
+
const observations = new Map();
|
|
48
|
+
extension.handlers.set('resources_discover', handlers.map((handler, index) => async (event, context) => {
|
|
49
|
+
const result = await handler(event, context);
|
|
50
|
+
if (!result) {
|
|
51
|
+
observations.delete(index);
|
|
52
|
+
record.resources = [...observations.values()].flat();
|
|
53
|
+
publish();
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
const collected = [];
|
|
57
|
+
const allowed = (kind, resourcePath) => {
|
|
58
|
+
const resource = resourceOf(owner, kind, resourcePath);
|
|
59
|
+
collected.push(resource);
|
|
60
|
+
return loading.resourceAllowed?.({ ...owner, kind, path: resourcePath }) !== false;
|
|
61
|
+
};
|
|
62
|
+
const absolute = (entry) => resolve(dirname(path), entry);
|
|
63
|
+
const skills = pi.loadSkills({ cwd: dirname(path), agentDir: dirname(path), includeDefaults: false, skillPaths: (result.skillPaths ?? []).map(absolute) }).skills;
|
|
64
|
+
const scanner = new pi.DefaultResourceLoader({ cwd: dirname(path), agentDir: dirname(path), settingsManager: pi.SettingsManager.inMemory({}), noExtensions: true, noSkills: true, noThemes: true, noContextFiles: true, noPromptTemplates: true, additionalPromptTemplatePaths: (result.promptPaths ?? []).map(absolute) });
|
|
65
|
+
await scanner.reload();
|
|
66
|
+
const prompts = scanner.getPrompts().prompts;
|
|
67
|
+
const themes = (result.themePaths ?? []).map(absolute).flatMap((theme) => {
|
|
68
|
+
try {
|
|
69
|
+
if (statSync(theme).isDirectory())
|
|
70
|
+
return readdirSync(theme).filter((name) => {
|
|
71
|
+
if (!name.endsWith('.json'))
|
|
72
|
+
return false;
|
|
73
|
+
try {
|
|
74
|
+
return statSync(resolve(theme, name)).isFile();
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}).map((name) => resolve(theme, name));
|
|
80
|
+
}
|
|
81
|
+
catch { /* Preserve missing paths for Pi's diagnostics. */ }
|
|
82
|
+
return [theme];
|
|
83
|
+
});
|
|
84
|
+
const filtered = {
|
|
85
|
+
skillPaths: skills.filter((skill) => allowed('skill', skill.filePath)).map((skill) => skill.filePath),
|
|
86
|
+
promptPaths: prompts.filter((prompt) => allowed('prompt', prompt.filePath)).map((prompt) => prompt.filePath),
|
|
87
|
+
themePaths: themes.filter((theme) => allowed('theme', theme))
|
|
88
|
+
};
|
|
89
|
+
observations.set(index, collected);
|
|
90
|
+
record.resources = [...new Map([...observations.values()].flat().map((entry) => [`${entry.kind}:${entry.path}`, entry])).values()];
|
|
91
|
+
publish();
|
|
92
|
+
return filtered;
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Bus } from "../core/bus.js";
|
|
2
|
+
import type { Found } from "./discover.js";
|
|
3
|
+
export interface ProjectCode {
|
|
4
|
+
/** SHA-256 over every file's name and contents. */
|
|
5
|
+
hash: string;
|
|
6
|
+
/** The files, named from the working folder where they are inside it. */
|
|
7
|
+
files: string[];
|
|
8
|
+
}
|
|
9
|
+
/** The code the working folder brings, or `null` when it brings none. */
|
|
10
|
+
export declare function projectCode(found: readonly Found[], cwd: string): ProjectCode | null;
|
|
11
|
+
/**
|
|
12
|
+
* Each package a person installed that brings code, by its folder: the whole package is hashed,
|
|
13
|
+
* so a changed skill or manifest asks again as well. A working folder's packages are part of
|
|
14
|
+
* `projectCode`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function packageCode(found: readonly Found[]): Map<string, ProjectCode>;
|
|
17
|
+
export interface TrustRecord {
|
|
18
|
+
hash: string;
|
|
19
|
+
/** The working folder it was trusted in. */
|
|
20
|
+
folder: string;
|
|
21
|
+
files: string[];
|
|
22
|
+
trustedAt: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class Trust {
|
|
25
|
+
private readonly bus;
|
|
26
|
+
private readonly path;
|
|
27
|
+
constructor(stateDir: string, bus: Bus);
|
|
28
|
+
private read;
|
|
29
|
+
list(): TrustRecord[];
|
|
30
|
+
/** Whether the packages that loaded before trust was asked per package were taken over as trusted. */
|
|
31
|
+
get adopted(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Trusts the packages present the first time this runs, so nothing that loaded before stops.
|
|
34
|
+
* It happens once; a package installed later, or one of these after a change, waits for a person.
|
|
35
|
+
*/
|
|
36
|
+
adopt(codes: readonly {
|
|
37
|
+
code: ProjectCode;
|
|
38
|
+
folder: string;
|
|
39
|
+
}[]): void;
|
|
40
|
+
has(hash: string): boolean;
|
|
41
|
+
private save;
|
|
42
|
+
grant(code: ProjectCode, folder: string): void;
|
|
43
|
+
revoke(hash: string): void;
|
|
44
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Code a person did not write into the shared folder by hand loads only after they trusted it:
|
|
2
|
+
// a working folder's own (its `.pi/extensions`, or a package its settings name), and every
|
|
3
|
+
// installed package. Trust belongs to the code, not the folder: it is a hash of the files, so a
|
|
4
|
+
// copy of the same code elsewhere is trusted too and a changed file asks again.
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
import { chmodSync, lstatSync, readdirSync, readFileSync } from 'node:fs';
|
|
7
|
+
import { basename, dirname, join, relative, sep } from 'node:path';
|
|
8
|
+
import { now, readJsonOr, writeJson } from "../core/fs.js";
|
|
9
|
+
import { compareText } from "../core/text.js";
|
|
10
|
+
// Dependencies and version control are left out: the hash says whether the code a person
|
|
11
|
+
// read has changed, and is not a seal on everything that code can import.
|
|
12
|
+
const SKIPPED = new Set(['node_modules', '.git']);
|
|
13
|
+
const MAX_FILES = 5000;
|
|
14
|
+
function walk(path, into) {
|
|
15
|
+
if (into.length >= MAX_FILES)
|
|
16
|
+
return;
|
|
17
|
+
let meta;
|
|
18
|
+
try {
|
|
19
|
+
meta = lstatSync(path);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (meta.isSymbolicLink())
|
|
25
|
+
return;
|
|
26
|
+
if (meta.isFile()) {
|
|
27
|
+
into.push(path);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!meta.isDirectory())
|
|
31
|
+
return;
|
|
32
|
+
for (const name of readdirSync(path).sort(compareText))
|
|
33
|
+
if (!SKIPPED.has(name))
|
|
34
|
+
walk(join(path, name), into);
|
|
35
|
+
}
|
|
36
|
+
/** The folder or file that holds one extension: its package, its own folder, or the file. */
|
|
37
|
+
const unit = (item) => item.packageRoot ?? (basename(item.path).startsWith('index.') ? dirname(item.path) : item.path);
|
|
38
|
+
/** A hash over the files of some folders and files, each named from `base` where it is inside it. */
|
|
39
|
+
function hashOf(units, base) {
|
|
40
|
+
const paths = [];
|
|
41
|
+
for (const path of [...units].sort(compareText))
|
|
42
|
+
walk(path, paths);
|
|
43
|
+
const name = (path) => {
|
|
44
|
+
const within = relative(base, path);
|
|
45
|
+
return within && !within.startsWith('..') ? within.split(sep).join('/') : path;
|
|
46
|
+
};
|
|
47
|
+
const hash = createHash('sha256');
|
|
48
|
+
const files = [];
|
|
49
|
+
for (const path of [...new Set(paths)].sort(compareText)) {
|
|
50
|
+
let contents;
|
|
51
|
+
try {
|
|
52
|
+
contents = readFileSync(path);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
files.push(name(path));
|
|
58
|
+
hash.update(`${name(path)}\0${contents.length}\0`).update(contents);
|
|
59
|
+
}
|
|
60
|
+
return { hash: hash.digest('hex'), files };
|
|
61
|
+
}
|
|
62
|
+
/** The code the working folder brings, or `null` when it brings none. */
|
|
63
|
+
export function projectCode(found, cwd) {
|
|
64
|
+
const units = [...new Set(found.filter((item) => item.project && item.kind === 'extension' && item.enabled).map(unit))];
|
|
65
|
+
return units.length ? hashOf(units, cwd) : null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Each package a person installed that brings code, by its folder: the whole package is hashed,
|
|
69
|
+
* so a changed skill or manifest asks again as well. A working folder's packages are part of
|
|
70
|
+
* `projectCode`.
|
|
71
|
+
*/
|
|
72
|
+
export function packageCode(found) {
|
|
73
|
+
const roots = [...new Set(found.filter((item) => !item.project && (item.kind === 'extension' || item.kind === 'hook') && item.packageRoot).map((item) => item.packageRoot))];
|
|
74
|
+
return new Map(roots.map((root) => [root, hashOf([root], root)]));
|
|
75
|
+
}
|
|
76
|
+
export class Trust {
|
|
77
|
+
bus;
|
|
78
|
+
path;
|
|
79
|
+
constructor(stateDir, bus) {
|
|
80
|
+
this.bus = bus;
|
|
81
|
+
this.path = join(stateDir, 'plugin-trust.json');
|
|
82
|
+
}
|
|
83
|
+
read() {
|
|
84
|
+
return readJsonOr(this.path, {});
|
|
85
|
+
}
|
|
86
|
+
list() {
|
|
87
|
+
const stored = this.read();
|
|
88
|
+
return Array.isArray(stored.trusted) ? stored.trusted.filter((record) => typeof record?.hash === 'string') : [];
|
|
89
|
+
}
|
|
90
|
+
/** Whether the packages that loaded before trust was asked per package were taken over as trusted. */
|
|
91
|
+
get adopted() {
|
|
92
|
+
return this.read().adopted === true;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Trusts the packages present the first time this runs, so nothing that loaded before stops.
|
|
96
|
+
* It happens once; a package installed later, or one of these after a change, waits for a person.
|
|
97
|
+
*/
|
|
98
|
+
adopt(codes) {
|
|
99
|
+
const records = this.list();
|
|
100
|
+
for (const { code, folder } of codes)
|
|
101
|
+
if (!records.some((record) => record.hash === code.hash))
|
|
102
|
+
records.push({ hash: code.hash, folder, files: code.files, trustedAt: now() });
|
|
103
|
+
writeJson(this.path, { trusted: records, adopted: true });
|
|
104
|
+
chmodSync(this.path, 0o600);
|
|
105
|
+
}
|
|
106
|
+
has(hash) {
|
|
107
|
+
return this.list().some((record) => record.hash === hash);
|
|
108
|
+
}
|
|
109
|
+
save(records) {
|
|
110
|
+
writeJson(this.path, { trusted: records, ...(this.adopted ? { adopted: true } : {}) });
|
|
111
|
+
chmodSync(this.path, 0o600);
|
|
112
|
+
this.bus.emit({ type: 'plugins.changed' });
|
|
113
|
+
}
|
|
114
|
+
grant(code, folder) {
|
|
115
|
+
this.save([...this.list().filter((record) => record.hash !== code.hash), { hash: code.hash, folder, files: code.files, trustedAt: now() }]);
|
|
116
|
+
}
|
|
117
|
+
revoke(hash) {
|
|
118
|
+
this.save(this.list().filter((record) => record.hash !== hash));
|
|
119
|
+
}
|
|
120
|
+
}
|