@xingular/harness 0.1.6 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +107 -0
- package/LICENSE +202 -0
- package/NOTICE.md +60 -0
- package/README.md +265 -71
- package/THIRD_PARTY_LICENSES.md +942 -0
- package/dist/cli.js +14842 -9445
- package/dist/sdk/accounts/accounts.d.ts +165 -0
- package/dist/sdk/accounts/accounts.js +730 -0
- package/dist/sdk/accounts/choices.d.ts +23 -0
- package/dist/sdk/accounts/choices.js +62 -0
- package/dist/sdk/accounts/env.d.ts +78 -0
- package/dist/sdk/accounts/env.js +294 -0
- package/dist/sdk/accounts/secrets.d.ts +16 -0
- package/dist/sdk/accounts/secrets.js +40 -0
- package/dist/sdk/accounts/store.d.ts +114 -0
- package/dist/sdk/accounts/store.js +255 -0
- package/dist/sdk/browser/config.d.ts +16 -0
- package/dist/sdk/browser/config.js +22 -0
- package/dist/sdk/browser/diagnostics.d.ts +4 -0
- package/dist/sdk/browser/diagnostics.js +38 -0
- package/dist/sdk/browser/index.d.ts +17 -0
- package/dist/sdk/browser/index.js +65 -0
- package/dist/sdk/browser/network.d.ts +10 -0
- package/dist/sdk/browser/network.js +59 -0
- package/dist/sdk/browser/session.d.ts +84 -0
- package/dist/sdk/browser/session.js +192 -0
- package/dist/sdk/browser/tools.d.ts +8 -0
- package/dist/sdk/browser/tools.js +329 -0
- package/dist/sdk/capabilities/api.d.ts +22 -0
- package/dist/sdk/capabilities/api.js +54 -0
- package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
- package/dist/sdk/capabilities/runSnapshot.js +47 -0
- package/dist/sdk/capabilities/types.d.ts +29 -0
- package/dist/sdk/capabilities/types.js +1 -0
- package/dist/sdk/cli.d.ts +2 -0
- package/dist/sdk/cli.js +142 -0
- package/dist/sdk/core/bus.d.ts +23 -0
- package/dist/sdk/core/bus.js +76 -0
- package/dist/sdk/core/caller.d.ts +22 -0
- package/dist/sdk/core/caller.js +16 -0
- package/dist/sdk/core/changes.d.ts +15 -0
- package/dist/sdk/core/changes.js +15 -0
- package/dist/sdk/core/effort.d.ts +2 -0
- package/dist/sdk/core/effort.js +1 -0
- package/dist/sdk/core/env.d.ts +18 -0
- package/dist/sdk/core/env.js +8 -0
- package/dist/sdk/core/errors.d.ts +15 -0
- package/dist/sdk/core/errors.js +24 -0
- package/dist/sdk/core/frontmatter.d.ts +12 -0
- package/dist/sdk/core/frontmatter.js +50 -0
- package/dist/sdk/core/fs.d.ts +18 -0
- package/dist/sdk/core/fs.js +106 -0
- package/dist/sdk/core/index.d.ts +24 -0
- package/dist/sdk/core/index.js +187 -0
- package/dist/sdk/core/path.d.ts +7 -0
- package/dist/sdk/core/path.js +79 -0
- package/dist/sdk/core/projects.d.ts +18 -0
- package/dist/sdk/core/projects.js +67 -0
- package/dist/sdk/core/secrets.d.ts +2 -0
- package/dist/sdk/core/secrets.js +5 -0
- package/dist/sdk/core/text.d.ts +7 -0
- package/dist/sdk/core/text.js +40 -0
- package/dist/sdk/doctor/checks.d.ts +5 -0
- package/dist/sdk/doctor/checks.js +208 -0
- package/dist/sdk/doctor/probe.d.ts +4 -0
- package/dist/sdk/doctor/probe.js +92 -0
- package/dist/sdk/doctor/service.d.ts +23 -0
- package/dist/sdk/doctor/service.js +144 -0
- package/dist/sdk/doctor/types.d.ts +141 -0
- package/dist/sdk/doctor/types.js +29 -0
- package/dist/sdk/harness.d.ts +133 -0
- package/dist/sdk/harness.js +299 -0
- package/dist/sdk/history/lessonPrompt.d.ts +2 -0
- package/dist/sdk/history/lessonPrompt.js +15 -0
- package/dist/sdk/history/lessons.d.ts +52 -0
- package/dist/sdk/history/lessons.js +173 -0
- package/dist/sdk/history/recall.d.ts +68 -0
- package/dist/sdk/history/recall.js +199 -0
- package/dist/sdk/history/trajectory.d.ts +7 -0
- package/dist/sdk/history/trajectory.js +216 -0
- package/dist/sdk/hub/catalog.json +123 -0
- package/dist/sdk/hub/cli.d.ts +7 -0
- package/dist/sdk/hub/cli.js +81 -0
- package/dist/sdk/hub/hub.d.ts +74 -0
- package/dist/sdk/hub/hub.js +474 -0
- package/dist/sdk/hub/schema.d.ts +280 -0
- package/dist/sdk/hub/schema.js +78 -0
- package/dist/sdk/index.d.ts +63 -0
- package/dist/sdk/index.js +48 -0
- package/dist/sdk/mcp/connections.d.ts +83 -0
- package/dist/sdk/mcp/connections.js +669 -0
- package/dist/sdk/mcp/manager.d.ts +26 -0
- package/dist/sdk/mcp/manager.js +124 -0
- package/dist/sdk/mcp/oauth.d.ts +35 -0
- package/dist/sdk/mcp/oauth.js +171 -0
- package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
- package/dist/sdk/mcp/scopeMigration.js +198 -0
- package/dist/sdk/mcp/service.d.ts +160 -0
- package/dist/sdk/mcp/service.js +510 -0
- package/dist/sdk/mcp/types.d.ts +131 -0
- package/dist/sdk/mcp/types.js +49 -0
- package/dist/sdk/pi/runtime.d.ts +13 -0
- package/dist/sdk/pi/runtime.js +31 -0
- package/dist/sdk/plugins/api.d.ts +66 -0
- package/dist/sdk/plugins/api.js +155 -0
- package/dist/sdk/plugins/attachments.d.ts +46 -0
- package/dist/sdk/plugins/attachments.js +111 -0
- package/dist/sdk/plugins/builtin.d.ts +6 -0
- package/dist/sdk/plugins/builtin.js +68 -0
- package/dist/sdk/plugins/catalogue.d.ts +29 -0
- package/dist/sdk/plugins/catalogue.js +196 -0
- package/dist/sdk/plugins/cli.d.ts +13 -0
- package/dist/sdk/plugins/cli.js +187 -0
- package/dist/sdk/plugins/discover.d.ts +42 -0
- package/dist/sdk/plugins/discover.js +115 -0
- package/dist/sdk/plugins/firstParty.d.ts +50 -0
- package/dist/sdk/plugins/firstParty.js +113 -0
- package/dist/sdk/plugins/hooks.d.ts +94 -0
- package/dist/sdk/plugins/hooks.js +162 -0
- package/dist/sdk/plugins/identity.d.ts +19 -0
- package/dist/sdk/plugins/identity.js +48 -0
- package/dist/sdk/plugins/install.d.ts +20 -0
- package/dist/sdk/plugins/install.js +110 -0
- package/dist/sdk/plugins/inventory.d.ts +22 -0
- package/dist/sdk/plugins/inventory.js +110 -0
- package/dist/sdk/plugins/manifest.d.ts +13 -0
- package/dist/sdk/plugins/manifest.js +56 -0
- package/dist/sdk/plugins/plugins.d.ts +104 -0
- package/dist/sdk/plugins/plugins.js +164 -0
- package/dist/sdk/plugins/runtime.d.ts +9 -0
- package/dist/sdk/plugins/runtime.js +95 -0
- package/dist/sdk/plugins/trust.d.ts +44 -0
- package/dist/sdk/plugins/trust.js +120 -0
- package/dist/sdk/plugins/types.d.ts +159 -0
- package/dist/sdk/plugins/types.js +7 -0
- package/dist/sdk/prompt/compile.d.ts +174 -0
- package/dist/sdk/prompt/compile.js +396 -0
- package/dist/sdk/refine/cli.d.ts +4 -0
- package/dist/sdk/refine/cli.js +186 -0
- package/dist/sdk/refine/demo.d.ts +21 -0
- package/dist/sdk/refine/demo.js +114 -0
- package/dist/sdk/refine/evidence.d.ts +55 -0
- package/dist/sdk/refine/evidence.js +330 -0
- package/dist/sdk/refine/host.d.ts +51 -0
- package/dist/sdk/refine/host.js +76 -0
- package/dist/sdk/refine/ledger.d.ts +48 -0
- package/dist/sdk/refine/ledger.js +76 -0
- package/dist/sdk/refine/library.d.ts +55 -0
- package/dist/sdk/refine/library.js +177 -0
- package/dist/sdk/refine/pi.d.ts +72 -0
- package/dist/sdk/refine/pi.js +248 -0
- package/dist/sdk/refine/prompts.d.ts +45 -0
- package/dist/sdk/refine/prompts.js +390 -0
- package/dist/sdk/refine/recursion.d.ts +113 -0
- package/dist/sdk/refine/recursion.js +258 -0
- package/dist/sdk/refine/runner.d.ts +81 -0
- package/dist/sdk/refine/runner.js +150 -0
- package/dist/sdk/refine/selection.d.ts +57 -0
- package/dist/sdk/refine/selection.js +251 -0
- package/dist/sdk/refine/service.d.ts +84 -0
- package/dist/sdk/refine/service.js +165 -0
- package/dist/sdk/refine/suite.d.ts +67 -0
- package/dist/sdk/refine/suite.js +174 -0
- package/dist/sdk/refine/trajectory.d.ts +9 -0
- package/dist/sdk/refine/trajectory.js +68 -0
- package/dist/sdk/refine/types.d.ts +77 -0
- package/dist/sdk/refine/types.js +10 -0
- package/dist/sdk/server/methods.d.ts +3 -0
- package/dist/sdk/server/methods.js +370 -0
- package/dist/sdk/server/remote.d.ts +19 -0
- package/dist/sdk/server/remote.js +84 -0
- package/dist/sdk/server/rpc.d.ts +20 -0
- package/dist/sdk/server/rpc.js +102 -0
- package/dist/sdk/server/serve.d.ts +10 -0
- package/dist/sdk/server/serve.js +18 -0
- package/dist/sdk/sessions/approvals.d.ts +47 -0
- package/dist/sdk/sessions/approvals.js +119 -0
- package/dist/sdk/sessions/continuation.d.ts +48 -0
- package/dist/sdk/sessions/continuation.js +85 -0
- package/dist/sdk/sessions/contracts.d.ts +534 -0
- package/dist/sdk/sessions/contracts.js +299 -0
- package/dist/sdk/sessions/extensionUi.d.ts +19 -0
- package/dist/sdk/sessions/extensionUi.js +64 -0
- package/dist/sdk/sessions/history.d.ts +16 -0
- package/dist/sdk/sessions/history.js +68 -0
- package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
- package/dist/sdk/sessions/lineageJoin.js +61 -0
- package/dist/sdk/sessions/planMode.d.ts +36 -0
- package/dist/sdk/sessions/planMode.js +84 -0
- package/dist/sdk/sessions/policy.d.ts +43 -0
- package/dist/sdk/sessions/policy.js +1 -0
- package/dist/sdk/sessions/pricing.d.ts +34 -0
- package/dist/sdk/sessions/pricing.js +40 -0
- package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
- package/dist/sdk/sessions/reasoningSummaries.js +61 -0
- package/dist/sdk/sessions/registry.d.ts +102 -0
- package/dist/sdk/sessions/registry.js +383 -0
- package/dist/sdk/sessions/runIndex.d.ts +21 -0
- package/dist/sdk/sessions/runIndex.js +65 -0
- package/dist/sdk/sessions/runStore.d.ts +66 -0
- package/dist/sdk/sessions/runStore.js +335 -0
- package/dist/sdk/sessions/runner.d.ts +213 -0
- package/dist/sdk/sessions/runner.js +589 -0
- package/dist/sdk/sessions/sessions.d.ts +140 -0
- package/dist/sdk/sessions/sessions.js +394 -0
- package/dist/sdk/sessions/subagentService.d.ts +41 -0
- package/dist/sdk/sessions/subagentService.js +247 -0
- package/dist/sdk/sessions/subagents.d.ts +50 -0
- package/dist/sdk/sessions/subagents.js +68 -0
- package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
- package/dist/sdk/terminal/accountsMenu.js +392 -0
- package/dist/sdk/terminal/cli.d.ts +20 -0
- package/dist/sdk/terminal/cli.js +121 -0
- package/dist/sdk/terminal/client.d.ts +15 -0
- package/dist/sdk/terminal/client.js +126 -0
- package/dist/sdk/terminal/control.d.ts +4 -0
- package/dist/sdk/terminal/control.js +25 -0
- package/dist/sdk/terminal/controller.d.ts +72 -0
- package/dist/sdk/terminal/controller.js +351 -0
- package/dist/sdk/terminal/hubMenu.d.ts +10 -0
- package/dist/sdk/terminal/hubMenu.js +34 -0
- package/dist/sdk/terminal/launch.d.ts +5 -0
- package/dist/sdk/terminal/launch.js +27 -0
- package/dist/sdk/terminal/logs.d.ts +14 -0
- package/dist/sdk/terminal/logs.js +59 -0
- package/dist/sdk/terminal/piExtension.d.ts +6 -0
- package/dist/sdk/terminal/piExtension.js +392 -0
- package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
- package/dist/sdk/terminal/pluginMenu.js +101 -0
- package/dist/sdk/terminal/socket.d.ts +70 -0
- package/dist/sdk/terminal/socket.js +256 -0
- package/dist/sdk/terminal/standalone.d.ts +18 -0
- package/dist/sdk/terminal/standalone.js +146 -0
- package/dist/sdk/terminal/terminals.d.ts +176 -0
- package/dist/sdk/terminal/terminals.js +767 -0
- package/dist/sdk/terminal/trajectory.d.ts +10 -0
- package/dist/sdk/terminal/trajectory.js +30 -0
- package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
- package/dist/sdk/terminal/tui/chrome.js +169 -0
- package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
- package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
- package/dist/sdk/terminal/tui/commandPages.d.ts +7 -0
- package/dist/sdk/terminal/tui/commandPages.js +63 -0
- package/dist/sdk/terminal/tui/commands.d.ts +42 -0
- package/dist/sdk/terminal/tui/commands.js +276 -0
- package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
- package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
- package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
- package/dist/sdk/terminal/tui/dialogs.js +363 -0
- package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
- package/dist/sdk/terminal/tui/keybindings.js +49 -0
- package/dist/sdk/terminal/tui/list.d.ts +73 -0
- package/dist/sdk/terminal/tui/list.js +196 -0
- package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
- package/dist/sdk/terminal/tui/modeChoices.js +70 -0
- package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
- package/dist/sdk/terminal/tui/modelPicker.js +155 -0
- package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
- package/dist/sdk/terminal/tui/mouse.js +3 -0
- package/dist/sdk/terminal/tui/page.d.ts +14 -0
- package/dist/sdk/terminal/tui/page.js +1 -0
- package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
- package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +37 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
- package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
- package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
- package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
- package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
- package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
- package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
- package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
- package/dist/sdk/terminal/tui/piAdapter.js +48 -0
- package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
- package/dist/sdk/terminal/tui/planMode.js +2 -0
- package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
- package/dist/sdk/terminal/tui/questionPicker.js +150 -0
- package/dist/sdk/terminal/tui/questions.d.ts +19 -0
- package/dist/sdk/terminal/tui/questions.js +42 -0
- package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
- package/dist/sdk/terminal/tui/runtime.js +441 -0
- package/dist/sdk/terminal/tui/search.d.ts +22 -0
- package/dist/sdk/terminal/tui/search.js +60 -0
- package/dist/sdk/terminal/tui/selection.d.ts +16 -0
- package/dist/sdk/terminal/tui/selection.js +16 -0
- package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
- package/dist/sdk/terminal/tui/sessionUi.js +30 -0
- package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
- package/dist/sdk/terminal/tui/settingsModel.js +84 -0
- package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
- package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
- package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
- package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
- package/dist/sdk/terminal/tui/status.d.ts +18 -0
- package/dist/sdk/terminal/tui/status.js +67 -0
- package/dist/sdk/terminal/tui/theme.d.ts +45 -0
- package/dist/sdk/terminal/tui/theme.js +176 -0
- package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
- package/dist/sdk/terminal/tui/treeModel.js +483 -0
- package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
- package/dist/sdk/terminal/tui/treePicker.js +251 -0
- package/dist/sdk/terminal/tui/ui.d.ts +47 -0
- package/dist/sdk/terminal/tui/ui.js +148 -0
- package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
- package/dist/sdk/terminal/tui/workingStatus.js +229 -0
- package/dist/sdk/tools/askUser.d.ts +6 -0
- package/dist/sdk/tools/askUser.js +74 -0
- package/dist/sdk/tools/checklist.d.ts +9 -0
- package/dist/sdk/tools/checklist.js +54 -0
- package/dist/sdk/tools/definitions.d.ts +30 -0
- package/dist/sdk/tools/definitions.js +117 -0
- package/dist/sdk/tools/dispatch.d.ts +16 -0
- package/dist/sdk/tools/dispatch.js +67 -0
- package/dist/sdk/tools/harnessTools.d.ts +6 -0
- package/dist/sdk/tools/harnessTools.js +20 -0
- package/dist/sdk/tools/sessionName.d.ts +7 -0
- package/dist/sdk/tools/sessionName.js +31 -0
- package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
- package/dist/sdk/tools/spawnSubagent.js +49 -0
- package/dist/sdk/tools/types.d.ts +48 -0
- package/dist/sdk/tools/types.js +1 -0
- package/dist/sdk/variant/components.d.ts +34 -0
- package/dist/sdk/variant/components.js +230 -0
- package/dist/sdk/variant/materialise.d.ts +66 -0
- package/dist/sdk/variant/materialise.js +81 -0
- package/dist/sdk/variant/migrate.d.ts +4 -0
- package/dist/sdk/variant/migrate.js +41 -0
- package/dist/sdk/variant/seed.d.ts +20 -0
- package/dist/sdk/variant/seed.js +116 -0
- package/dist/sdk/variant/store.d.ts +82 -0
- package/dist/sdk/variant/store.js +151 -0
- package/dist/sdk/variant/surface.d.ts +56 -0
- package/dist/sdk/variant/surface.js +81 -0
- package/dist/sdk/variant/trust.d.ts +27 -0
- package/dist/sdk/variant/trust.js +64 -0
- package/dist/sdk/variant/variant.d.ts +71 -0
- package/dist/sdk/variant/variant.js +331 -0
- package/dist/sdk/web/markdown.d.ts +10 -0
- package/dist/sdk/web/markdown.js +66 -0
- package/dist/sdk/web/safeRequest.d.ts +34 -0
- package/dist/sdk/web/safeRequest.js +175 -0
- package/dist/sdk/web/search.d.ts +53 -0
- package/dist/sdk/web/search.js +168 -0
- package/dist/sdk/web/text.d.ts +2 -0
- package/dist/sdk/web/text.js +7 -0
- package/dist/sdk/web/tools.d.ts +22 -0
- package/dist/sdk/web/tools.js +195 -0
- package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
- package/dist/sdk/wiki/notes.d.ts +68 -0
- package/dist/sdk/wiki/notes.js +297 -0
- package/dist/sdk/world/actions.d.ts +23 -0
- package/dist/sdk/world/actions.js +31 -0
- package/dist/sdk/world/cli.d.ts +12 -0
- package/dist/sdk/world/cli.js +166 -0
- package/dist/sdk/world/images.d.ts +20 -0
- package/dist/sdk/world/images.js +48 -0
- package/dist/sdk/world/untrusted.d.ts +12 -0
- package/dist/sdk/world/untrusted.js +20 -0
- package/dist/sdk/world/world.d.ts +65 -0
- package/dist/sdk/world/world.js +80 -0
- package/dist/terminal-opentui.js +13612 -0
- package/dist/terminal-pi.js +1170 -62
- package/docs/README.md +34 -0
- package/docs/architecture/00-overview.md +159 -0
- package/docs/architecture/01-extension-points.md +78 -0
- package/docs/architecture/02-sessions-and-runs.md +146 -0
- package/docs/architecture/03-variants.md +95 -0
- package/docs/architecture/04-prompt.md +102 -0
- package/docs/architecture/05-refinement.md +107 -0
- package/docs/architecture/06-plugins-and-capabilities.md +93 -0
- package/docs/architecture/07-tools-and-gate.md +88 -0
- package/docs/architecture/08-memory-and-history.md +94 -0
- package/docs/architecture/09-accounts-and-connectors.md +90 -0
- package/docs/architecture/10-server-protocol.md +84 -0
- package/docs/architecture/11-terminal.md +81 -0
- package/docs/architecture/12-storage.md +61 -0
- package/docs/architecture/13-world-tools.md +23 -0
- package/docs/architecture/README.md +114 -0
- package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
- package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
- package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
- package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
- package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
- package/docs/architecture/proposals/PROP-0006-run-checklist.md +68 -0
- package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
- package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
- package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
- package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
- package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
- package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
- package/docs/architecture/proposals/README.md +76 -0
- package/docs/decisions/ADR-0001-owned-terminal.md +87 -0
- package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
- package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
- package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
- package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
- package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
- package/docs/decisions/ADR-0007-reporting-section.md +33 -0
- package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
- package/docs/decisions/ADR-0009-xharness-command.md +38 -0
- package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
- package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
- package/docs/decisions/ADR-0012-native-session-names.md +34 -0
- package/docs/decisions/ADR-0013-doctor.md +27 -0
- package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
- package/docs/doctor.md +74 -0
- package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
- package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
- package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
- package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
- package/docs/features/README.md +20 -0
- package/docs/features/automations/README.md +41 -0
- package/docs/features/cores/README.md +39 -0
- package/docs/features/google-harness2/README.md +52 -0
- package/docs/features/integrations/README.md +40 -0
- package/docs/features/interfaces/README.md +29 -0
- package/docs/features/memory/README.md +28 -0
- package/docs/releases/1.0.0.md +40 -0
- package/docs/releases/README.md +36 -0
- package/docs/study/00-index.md +78 -0
- package/docs/study/arms/00-matrix.md +20 -0
- package/docs/study/arms/01-system-prompt.md +211 -0
- package/docs/study/arms/02-tools.md +79 -0
- package/docs/study/arms/03-subagents.md +90 -0
- package/docs/study/arms/04-skills.md +75 -0
- package/docs/study/arms/05-context-management.md +90 -0
- package/docs/study/arms/06-memory.md +90 -0
- package/docs/study/arms/07-governance.md +71 -0
- package/docs/study/arms/08-execution.md +69 -0
- package/docs/study/arms/09-observability.md +60 -0
- package/docs/study/arms/10-refinement.md +110 -0
- package/docs/study/btw-comparison.md +37 -0
- package/docs/study/feature-gap-review.md +42 -0
- package/docs/study/insights.md +123 -0
- package/docs/study/roadmap.md +72 -0
- package/docs/study/sources/claude-code.md +44 -0
- package/docs/study/sources/deepseek-harness.md +102 -0
- package/docs/study/sources/harness2.md +50 -0
- package/docs/study/sources/kimi-cli.md +42 -0
- package/docs/study/sources/omp.md +93 -0
- package/docs/study/sources/opencode.md +43 -0
- package/docs/study/sources/openhands.md +46 -0
- package/docs/study/sources/smolagents.md +40 -0
- package/docs/study/sources/swe-agent.md +34 -0
- package/docs/system-prompt-design.md +196 -0
- package/docs/terminal-tui.md +671 -0
- package/package.json +48 -12
- package/src/accounts/accounts.test.ts +0 -223
- package/src/accounts/accounts.ts +0 -522
- 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 -114
- 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 -299
- package/src/index.ts +0 -70
- 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 -289
- package/src/memory/blocks.test.ts +0 -78
- package/src/memory/blocks.ts +0 -406
- package/src/memory/caller.ts +0 -57
- 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 -330
- package/src/memory/migrate.ts +0 -79
- package/src/memory/operations.ts +0 -138
- package/src/memory/proposals.test.ts +0 -168
- package/src/memory/proposals.ts +0 -576
- package/src/memory/recall.test.ts +0 -104
- package/src/memory/recall.ts +0 -271
- 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 -314
- 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 -310
- package/src/sessions/conversation.test.ts +0 -150
- 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 -32
- package/src/sessions/pricing.ts +0 -60
- package/src/sessions/reasoningSummaries.ts +0 -59
- package/src/sessions/registry.ts +0 -294
- 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 -569
- package/src/sessions/runtimeResources.test.ts +0 -61
- package/src/sessions/sessions.test.ts +0 -455
- package/src/sessions/sessions.ts +0 -295
- package/src/skills/registry.test.ts +0 -104
- package/src/skills/registry.ts +0 -407
- package/src/terminal/cli.ts +0 -149
- package/src/terminal/client.ts +0 -74
- package/src/terminal/controller.ts +0 -227
- package/src/terminal/launch.test.ts +0 -34
- package/src/terminal/launch.ts +0 -88
- package/src/terminal/piExtension.ts +0 -210
- 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 -221
- package/src/terminal/standalone.test.ts +0 -130
- package/src/terminal/standalone.ts +0 -144
- package/src/terminal/terminal.test.ts +0 -330
- package/src/terminal/terminals.ts +0 -443
- package/src/tools/askUser.ts +0 -45
- package/src/tools/definitions.ts +0 -187
- package/src/tools/memoryTools.ts +0 -22
- package/src/tools/pluginPropose.ts +0 -41
- 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,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
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import type { Attachment } from "./attachments.js";
|
|
2
|
+
import type { Registered } from "./plugins.js";
|
|
3
|
+
import type { ProjectCode } from "./trust.js";
|
|
4
|
+
export declare const CONTRIBUTION_KINDS: readonly ["instruction", "skill", "command", "tool", "connection", "code", "theme"];
|
|
5
|
+
export type ContributionKind = (typeof CONTRIBUTION_KINDS)[number];
|
|
6
|
+
/**
|
|
7
|
+
* Where a plugin comes from: the harness itself, the embedding application, Pi, a person's own
|
|
8
|
+
* registry, the folder every account shares, an installed package, the working folder, or the
|
|
9
|
+
* home folder.
|
|
10
|
+
*/
|
|
11
|
+
export declare const PLUGIN_SOURCES: readonly ["builtin", "application", "pi", "yours", "shared", "package", "project", "home"];
|
|
12
|
+
export type PluginSource = (typeof PLUGIN_SOURCES)[number];
|
|
13
|
+
/** `untrusted` is code that is found and does not load until a person trusts it. */
|
|
14
|
+
export type ContributionState = 'on' | 'off' | 'untrusted';
|
|
15
|
+
export interface Contribution {
|
|
16
|
+
/** `<plugin id>/<kind>/<name>`. */
|
|
17
|
+
id: string;
|
|
18
|
+
kind: ContributionKind;
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
path: string | null;
|
|
22
|
+
state: ContributionState;
|
|
23
|
+
/** Who it is switched on for, in words: "Everywhere", a project's name, "2 agents". */
|
|
24
|
+
scope: string | null;
|
|
25
|
+
/** Where it is switched on and off, or `null` when it cannot be switched on its own. */
|
|
26
|
+
attachment: Attachment | null;
|
|
27
|
+
/** What a code contribution registered the last time a session loaded it. */
|
|
28
|
+
registered: Registered | null;
|
|
29
|
+
/** What went wrong the last time it ran, for code the harness runs itself. */
|
|
30
|
+
problem: string | null;
|
|
31
|
+
/** Code the harness runs itself after a change, for everyone, outside any session. */
|
|
32
|
+
background: boolean;
|
|
33
|
+
}
|
|
34
|
+
/** Where a person changes a plugin today. */
|
|
35
|
+
export type PluginManage = 'registry' | 'tools' | 'connections' | 'files';
|
|
36
|
+
export interface Plugin {
|
|
37
|
+
id: string;
|
|
38
|
+
title: string;
|
|
39
|
+
description: string;
|
|
40
|
+
version: string | null;
|
|
41
|
+
source: PluginSource;
|
|
42
|
+
path: string | null;
|
|
43
|
+
runsCode: boolean;
|
|
44
|
+
trust: 'none' | 'trusted' | 'untrusted';
|
|
45
|
+
/** The code a person is asked to trust, for a working folder's own. */
|
|
46
|
+
code: ProjectCode | null;
|
|
47
|
+
/**
|
|
48
|
+
* How a person installed it, when it can be removed here: named in the settings every account
|
|
49
|
+
* shares (`source` is the name there), or a folder kept with their data (`source` is its path).
|
|
50
|
+
*/
|
|
51
|
+
install: {
|
|
52
|
+
kind: 'settings' | 'folder';
|
|
53
|
+
source: string;
|
|
54
|
+
} | null;
|
|
55
|
+
/** The parts it adds to, by plugin id: a package that says it extends Memory, the Wiki or History. */
|
|
56
|
+
extends: string[];
|
|
57
|
+
/** Why it cannot be removed, or `null` when it can. */
|
|
58
|
+
required: string | null;
|
|
59
|
+
manage: PluginManage | null;
|
|
60
|
+
/** Numbers a person can set on it, each with its current value. */
|
|
61
|
+
settings: (PluginSetting & {
|
|
62
|
+
value: number;
|
|
63
|
+
})[];
|
|
64
|
+
/** Declarative connector setup templates; listing one never creates or enables a connection. */
|
|
65
|
+
connectorTemplates: ConnectorTemplate[];
|
|
66
|
+
/** Where the whole plugin is switched on and off, or `null` when only its parts are, or nothing is. */
|
|
67
|
+
attachment: Attachment | null;
|
|
68
|
+
contributions: Contribution[];
|
|
69
|
+
}
|
|
70
|
+
/** A number a person can set on a plugin, such as a limit. */
|
|
71
|
+
export interface PluginSetting {
|
|
72
|
+
key: string;
|
|
73
|
+
label: string;
|
|
74
|
+
description: string;
|
|
75
|
+
default: number;
|
|
76
|
+
min: number;
|
|
77
|
+
max: number;
|
|
78
|
+
}
|
|
79
|
+
/** A remote connector setup form. It contains no endpoint credentials or saved connection state. */
|
|
80
|
+
export interface ConnectorTemplate {
|
|
81
|
+
id: string;
|
|
82
|
+
name: string;
|
|
83
|
+
description: string;
|
|
84
|
+
url: string;
|
|
85
|
+
auth: 'none' | 'headers' | 'oauth';
|
|
86
|
+
oauthClient: 'dynamic' | 'user' | null;
|
|
87
|
+
oauthScopes: string[];
|
|
88
|
+
docsUrl: string | null;
|
|
89
|
+
fields: {
|
|
90
|
+
header: string;
|
|
91
|
+
label: string;
|
|
92
|
+
prefix: string;
|
|
93
|
+
help: string;
|
|
94
|
+
}[];
|
|
95
|
+
setup: string[];
|
|
96
|
+
notice: string | null;
|
|
97
|
+
}
|
|
98
|
+
/** What a part of the harness, or the embedding application, says about itself. Data only. */
|
|
99
|
+
export interface PluginDescriptor {
|
|
100
|
+
id: string;
|
|
101
|
+
title: string;
|
|
102
|
+
description: string;
|
|
103
|
+
/** Why it cannot be removed. */
|
|
104
|
+
required?: string;
|
|
105
|
+
manage?: PluginManage;
|
|
106
|
+
tools?: {
|
|
107
|
+
name: string;
|
|
108
|
+
description?: string;
|
|
109
|
+
}[];
|
|
110
|
+
/** The prompt sections it writes. */
|
|
111
|
+
sections?: {
|
|
112
|
+
id: string;
|
|
113
|
+
name: string;
|
|
114
|
+
description?: string;
|
|
115
|
+
}[];
|
|
116
|
+
/** The tool groups whose paragraph in the tools section it writes. */
|
|
117
|
+
toolGroups?: string[];
|
|
118
|
+
/** It ships with the harness and a person may switch it. `on` is its state until they do. */
|
|
119
|
+
switchable?: {
|
|
120
|
+
on: boolean;
|
|
121
|
+
};
|
|
122
|
+
/** Numbers a person can set on it. */
|
|
123
|
+
settings?: PluginSetting[];
|
|
124
|
+
/** Remote connector setup templates; users must add, configure and enable each connection. */
|
|
125
|
+
connectorTemplates?: ConnectorTemplate[];
|
|
126
|
+
/** Code of its own that runs in a session. */
|
|
127
|
+
code?: {
|
|
128
|
+
name: string;
|
|
129
|
+
description: string;
|
|
130
|
+
}[];
|
|
131
|
+
}
|
|
132
|
+
export type Delivery = 'system' | 'context' | 'tool' | 'on-demand' | 'code' | 'background';
|
|
133
|
+
/** One thing that reaches a caller. */
|
|
134
|
+
export interface InventoryItem {
|
|
135
|
+
pluginId: string;
|
|
136
|
+
contributionId: string | null;
|
|
137
|
+
kind: ContributionKind;
|
|
138
|
+
name: string;
|
|
139
|
+
/** `system` is the stable prefix, `context` an update sent with a request, `on-demand` text a tool loads, `background` code the harness runs after a change. */
|
|
140
|
+
delivery: Delivery;
|
|
141
|
+
/** Characters it adds to what the model is told, when that is known. */
|
|
142
|
+
chars: number | null;
|
|
143
|
+
/** Its text was cut to fit a budget. */
|
|
144
|
+
cut: boolean;
|
|
145
|
+
}
|
|
146
|
+
export interface Inventory {
|
|
147
|
+
/** The plugins the items belong to. */
|
|
148
|
+
plugins: Plugin[];
|
|
149
|
+
/** Every other plugin, with nothing reaching this caller: what could still be switched on for it. */
|
|
150
|
+
others: Plugin[];
|
|
151
|
+
items: InventoryItem[];
|
|
152
|
+
/** Prompt sections, tool groups and tools that no plugin accounts for. */
|
|
153
|
+
unattributed: {
|
|
154
|
+
kind: 'section' | 'toolGroup' | 'tool';
|
|
155
|
+
id: string;
|
|
156
|
+
}[];
|
|
157
|
+
systemChars: number;
|
|
158
|
+
contextChars: number;
|
|
159
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const CONTRIBUTION_KINDS = ['instruction', 'skill', 'command', 'tool', 'connection', 'code', 'theme'];
|
|
2
|
+
/**
|
|
3
|
+
* Where a plugin comes from: the harness itself, the embedding application, Pi, a person's own
|
|
4
|
+
* registry, the folder every account shares, an installed package, the working folder, or the
|
|
5
|
+
* home folder.
|
|
6
|
+
*/
|
|
7
|
+
export const PLUGIN_SOURCES = ['builtin', 'application', 'pi', 'yours', 'shared', 'package', 'project', 'home'];
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { type CallerContext } from "../core/caller.js";
|
|
2
|
+
import type { HarnessEnv } from "../core/env.js";
|
|
3
|
+
import type { Materialised } from "../variant/materialise.js";
|
|
4
|
+
export declare const REFERENCES_BUDGET = 12000;
|
|
5
|
+
/** Where the harness's own sections sit; an application's sections are placed among them by `order`. */
|
|
6
|
+
export declare const SECTION_ORDER: {
|
|
7
|
+
readonly system: 25;
|
|
8
|
+
readonly guardrails: 40;
|
|
9
|
+
readonly memory: 45;
|
|
10
|
+
readonly references: 50;
|
|
11
|
+
readonly subagents: 64;
|
|
12
|
+
readonly scripts: 66;
|
|
13
|
+
readonly wiki: 80;
|
|
14
|
+
readonly tools: 90;
|
|
15
|
+
readonly reporting: 95;
|
|
16
|
+
};
|
|
17
|
+
/** Where a section's text came from. */
|
|
18
|
+
export interface Source {
|
|
19
|
+
id: string;
|
|
20
|
+
kind: string;
|
|
21
|
+
revision?: string | null;
|
|
22
|
+
}
|
|
23
|
+
export interface Section {
|
|
24
|
+
/** `identity`, `role`, `system`, `guardrails`, `memory`, `references`, `subagents`, `scripts`, `wiki`, `tools`, or an application's own. */
|
|
25
|
+
id: string;
|
|
26
|
+
title: string;
|
|
27
|
+
body: string;
|
|
28
|
+
sources: Source[];
|
|
29
|
+
budget: number;
|
|
30
|
+
/** Characters in `body`. */
|
|
31
|
+
size: number;
|
|
32
|
+
cut: boolean;
|
|
33
|
+
}
|
|
34
|
+
/** One group of the tool manifest. */
|
|
35
|
+
export interface ToolGroup {
|
|
36
|
+
group: string;
|
|
37
|
+
tools: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface ContextPack {
|
|
40
|
+
runId: string | null;
|
|
41
|
+
/** Who the pack is for, in the application's own words; `agent` or `session` when it gives none. */
|
|
42
|
+
profile: string;
|
|
43
|
+
sections: Section[];
|
|
44
|
+
/** The tools the pack describes, by group. */
|
|
45
|
+
toolGroups: ToolGroup[];
|
|
46
|
+
/** The variant the session ran, when it ran one. */
|
|
47
|
+
variant?: {
|
|
48
|
+
scope: string | null;
|
|
49
|
+
fingerprint: string;
|
|
50
|
+
} | null;
|
|
51
|
+
compiledAt: string;
|
|
52
|
+
delivery?: Delivery;
|
|
53
|
+
}
|
|
54
|
+
export interface Delivery {
|
|
55
|
+
systemSectionIds: string[];
|
|
56
|
+
updatedSectionIds: string[];
|
|
57
|
+
}
|
|
58
|
+
/** A section the embedding application writes. */
|
|
59
|
+
export interface HostSection {
|
|
60
|
+
id: string;
|
|
61
|
+
title: string;
|
|
62
|
+
/** `null` declares the slot without filling it, so a withdrawn dynamic section is announced. */
|
|
63
|
+
body: string | null;
|
|
64
|
+
budget: number;
|
|
65
|
+
/** Appended when the body is cut. */
|
|
66
|
+
pointer?: string;
|
|
67
|
+
/** Position among the sections; the harness's own are in `SECTION_ORDER`. */
|
|
68
|
+
order: number;
|
|
69
|
+
/** Changing state: delivered as a context update, never in the system prompt. */
|
|
70
|
+
dynamic?: boolean;
|
|
71
|
+
/** Text placed before the body. */
|
|
72
|
+
pinned?: {
|
|
73
|
+
text: string;
|
|
74
|
+
pointer?: string;
|
|
75
|
+
} | null;
|
|
76
|
+
}
|
|
77
|
+
/** A group of tools the application provides, with the paragraph that explains it. */
|
|
78
|
+
export interface HostToolGroup {
|
|
79
|
+
group: string;
|
|
80
|
+
tools: string[];
|
|
81
|
+
guidance: string;
|
|
82
|
+
order: number;
|
|
83
|
+
}
|
|
84
|
+
/** One selected reference: a Wiki note, or a line the application writes about something it selected. */
|
|
85
|
+
export type Reference = {
|
|
86
|
+
kind: 'note';
|
|
87
|
+
path: string;
|
|
88
|
+
label?: string;
|
|
89
|
+
} | {
|
|
90
|
+
kind: 'line';
|
|
91
|
+
id: string;
|
|
92
|
+
label: string;
|
|
93
|
+
text: string;
|
|
94
|
+
};
|
|
95
|
+
/** What the compiler needs beyond the caller. */
|
|
96
|
+
export interface Launch {
|
|
97
|
+
/** The paragraph about connected apps, when the session has that broker. */
|
|
98
|
+
connections?: string | null;
|
|
99
|
+
/** The tools the Connections group lists. */
|
|
100
|
+
connectionTools?: string[];
|
|
101
|
+
/** The tools switched on for the caller. The pack only describes tools the caller can call. */
|
|
102
|
+
tools?: string[] | null;
|
|
103
|
+
references?: Reference[];
|
|
104
|
+
sections?: HostSection[];
|
|
105
|
+
toolGroups?: HostToolGroup[];
|
|
106
|
+
/** Appended to the tools section when it is cut. */
|
|
107
|
+
toolsPointer?: string;
|
|
108
|
+
/** Recorded with the pack: the application's name for who it is for. Defaults to `agent` or `session`. */
|
|
109
|
+
profile?: string;
|
|
110
|
+
}
|
|
111
|
+
/** How a run's final reply is shaped. Fixed text: it sits in the stable prefix of every pack. */
|
|
112
|
+
export declare const REPORTING_GUIDANCE = "When you finish work, write the final reply for a person who did not watch you work.\n\n- Start with the answer or outcome in one or two sentences. If they asked a question, answer it first.\n- Keep it concise and use only headings or structure that help explain the outcome; do not force a fixed set of report headings.\n- When work involves files, identify the relevant paths and briefly state what changed or mattered. Use `path:line` references where useful, and a table (File | Change | Why) when there are three or more changed files.\n- Include blockers, risks, or next steps only when they are concrete and relevant.\n- Use **Need human inspection** only when a concrete verification requires a person because you could not perform or observe it. State what remains unverified, why you could not verify it, and the specific check the person should make. Do not use this for checks you ran or generic risks.\n- Name only checks actually run and their results; never claim a check you did not run.\n- Use a Markdown table when comparing options, listing several items with the same fields, or reporting the results of several checks. Use prose or bullets otherwise.\n- A one-line question gets a one-line answer.\n- If the person, the application, or the current mode asks for a different format, follow that.\n";
|
|
113
|
+
export declare const HISTORY_GROUP: string[];
|
|
114
|
+
export declare const WIKI_GROUP: string[];
|
|
115
|
+
export declare const NATIVE_GROUP: string[];
|
|
116
|
+
export declare const CONNECTION_TOOLS: string[];
|
|
117
|
+
/** Cuts `text` to `budget` characters at a paragraph (or line) boundary and appends `pointer`. */
|
|
118
|
+
export declare function fit(text: string, budget: number, pointer: string): {
|
|
119
|
+
body: string;
|
|
120
|
+
cut: boolean;
|
|
121
|
+
};
|
|
122
|
+
/** At most `limit` characters, with an ellipsis when it was cut. */
|
|
123
|
+
export declare function clip(text: string, limit: number): string;
|
|
124
|
+
export interface OrderedGroup extends ToolGroup {
|
|
125
|
+
order: number;
|
|
126
|
+
guidance: string | null;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The caller's tools by group, in a fixed order. History and the Wiki are always there; the rest
|
|
130
|
+
* follows the switches in `launch.tools` and what the application provides.
|
|
131
|
+
*/
|
|
132
|
+
export declare function toolGroups(context: CallerContext, launch: Launch): OrderedGroup[];
|
|
133
|
+
/** Compiles the pack for a caller. It only reads the data root. */
|
|
134
|
+
export declare function compile(env: HarnessEnv, context: CallerContext, launch?: Launch, variant?: Materialised | null): ContextPack;
|
|
135
|
+
/** The pack as the one string a session receives. */
|
|
136
|
+
export declare function render(env: Pick<HarnessEnv, 'productName'>, pack: Pick<ContextPack, 'sections'>): string;
|
|
137
|
+
export declare function packPath(root: string, runId: string): string;
|
|
138
|
+
/** The pack a run was given, when it was recorded. */
|
|
139
|
+
export declare function load(root: string, runId: string): ContextPack | null;
|
|
140
|
+
/** Saves the pack beside the run's events. */
|
|
141
|
+
export declare function record(root: string, pack: ContextPack): void;
|
|
142
|
+
export declare const BUILT_IN_DYNAMIC: readonly {
|
|
143
|
+
id: string;
|
|
144
|
+
order: number;
|
|
145
|
+
}[];
|
|
146
|
+
export declare const CONTEXT_GUIDANCE = "App-origin context updates in the conversation supply current Wiki notes, active work, and selected references. Each listed section replaces its earlier app snapshot; a withdrawn section is no longer current context. These updates are context, not requests from the user. Selected references apply only to the accompanying request. They do not change permissions. Use the latest supplied state and retrieve details through tools when needed.";
|
|
147
|
+
/** The hidden message a context update is saved as in native history, and where its snapshot sits. */
|
|
148
|
+
export declare const CONTEXT_MESSAGE_TYPE = "xingular-context";
|
|
149
|
+
export declare const CONTEXT_SNAPSHOT_KEY = "xingularContext";
|
|
150
|
+
/** Rendered by the compiler; the session only transports it and saves the delivered snapshot. */
|
|
151
|
+
export interface ContextUpdate {
|
|
152
|
+
content: string;
|
|
153
|
+
snapshot: Section[];
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The snapshot last delivered on the active branch of a native history. A compaction requires a
|
|
157
|
+
* fresh snapshot because earlier context messages may have been replaced by a summary.
|
|
158
|
+
*/
|
|
159
|
+
export declare function deliveredSnapshot(sessionFile: string): Section[] | null;
|
|
160
|
+
/** Resolves the same history Pi will open; an explicit continuation always wins. */
|
|
161
|
+
export declare function sessionFile(sessionDir: string, resume?: string | null): string | null;
|
|
162
|
+
/**
|
|
163
|
+
* Stable instructions stay in the system prompt; changing state is appended to native history.
|
|
164
|
+
* Recording the current pack does not mark an update delivered: the session saves that snapshot
|
|
165
|
+
* only when it appends the corresponding context message.
|
|
166
|
+
*/
|
|
167
|
+
export declare function sessionLaunch(env: HarnessEnv, context: CallerContext, launch: Launch, historyFile: string | null, variant?: Materialised | null): {
|
|
168
|
+
system: string;
|
|
169
|
+
update: ContextUpdate | null;
|
|
170
|
+
pack: ContextPack;
|
|
171
|
+
};
|
|
172
|
+
/** A terminal session keeps the pack it started with; each of its runs records a copy. */
|
|
173
|
+
export declare function saveForSession(sessionDir: string, pack: ContextPack): void;
|
|
174
|
+
export declare function copyToRun(root: string, sessionDir: string, runId: string): void;
|