@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,335 @@
|
|
|
1
|
+
// Canonical run records and their event logs.
|
|
2
|
+
//
|
|
3
|
+
// `<data root>/runs/<run id>/run.json` holds the run's fields; `events.jsonl` is the
|
|
4
|
+
// append-only, validated event log. The harness is the only writer of both.
|
|
5
|
+
import { appendFileSync, copyFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { notFound } from "../core/errors.js";
|
|
8
|
+
import { newId, now, readJson, readJsonOr, safeId, writeJson } from "../core/fs.js";
|
|
9
|
+
import { compareText, lines } from "../core/text.js";
|
|
10
|
+
import { isActiveStatus, runEventSchema, runRecordSchema, upgradeRunRecord, usagePayloadSchema } from "./contracts.js";
|
|
11
|
+
import { readAllRuns, recordRun, runsForSession } from "./runIndex.js";
|
|
12
|
+
export function runDir(root, runId) {
|
|
13
|
+
return join(root, 'runs', safeId(runId));
|
|
14
|
+
}
|
|
15
|
+
const recordPath = (root, runId) => join(runDir(root, runId), 'run.json');
|
|
16
|
+
// Field order of the file, so a record written here reads the same as one written before.
|
|
17
|
+
function ordered(record) {
|
|
18
|
+
return {
|
|
19
|
+
resumedFromRunId: record.resumedFromRunId,
|
|
20
|
+
parentRunId: record.parentRunId,
|
|
21
|
+
relation: record.relation,
|
|
22
|
+
terminalReason: record.terminalReason,
|
|
23
|
+
id: record.id,
|
|
24
|
+
projectId: record.projectId,
|
|
25
|
+
mode: record.mode,
|
|
26
|
+
harness: record.harness,
|
|
27
|
+
sessionType: record.sessionType,
|
|
28
|
+
sessionId: record.sessionId,
|
|
29
|
+
nativeSessionId: record.nativeSessionId,
|
|
30
|
+
workingDirectory: record.workingDirectory,
|
|
31
|
+
worktreeId: record.worktreeId,
|
|
32
|
+
goal: record.goal,
|
|
33
|
+
attachmentCount: record.attachmentCount,
|
|
34
|
+
startedAt: record.startedAt,
|
|
35
|
+
endedAt: record.endedAt,
|
|
36
|
+
status: record.status,
|
|
37
|
+
exitCode: record.exitCode,
|
|
38
|
+
handoffId: record.handoffId,
|
|
39
|
+
accountId: record.accountId,
|
|
40
|
+
agentId: record.agentId,
|
|
41
|
+
trigger: record.trigger,
|
|
42
|
+
...(record.variantScope ? { variantScope: record.variantScope } : {}),
|
|
43
|
+
...(record.variantVersion ? { variantVersion: record.variantVersion } : {})
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function write(root, record) {
|
|
47
|
+
writeJson(recordPath(root, record.id), ordered(record));
|
|
48
|
+
if (isActiveStatus(record.status))
|
|
49
|
+
claimOwner(root, record.id);
|
|
50
|
+
recordRun(root, record);
|
|
51
|
+
}
|
|
52
|
+
// The process that is driving an active run. Startup recovery leaves such a run alone while that process lives.
|
|
53
|
+
const ownerPath = (root, runId) => join(runDir(root, runId), 'owner.json');
|
|
54
|
+
function claimOwner(root, runId) {
|
|
55
|
+
const path = ownerPath(root, runId);
|
|
56
|
+
if (readJsonOr(path, null)?.pid === process.pid)
|
|
57
|
+
return;
|
|
58
|
+
writeJson(path, { pid: process.pid });
|
|
59
|
+
}
|
|
60
|
+
/** True only when a different live process owns the run. No marker, or a dead owner, means nothing holds it. */
|
|
61
|
+
function ownedElsewhere(root, runId) {
|
|
62
|
+
const pid = readJsonOr(ownerPath(root, runId), null)?.pid;
|
|
63
|
+
if (typeof pid !== 'number' || pid <= 0 || pid === process.pid)
|
|
64
|
+
return false;
|
|
65
|
+
try {
|
|
66
|
+
process.kill(pid, 0);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
return error.code === 'EPERM';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export function saveRun(root, record) {
|
|
74
|
+
write(root, record);
|
|
75
|
+
}
|
|
76
|
+
function readRecord(path) {
|
|
77
|
+
const parsed = runRecordSchema.safeParse(upgradeRunRecord(readJson(path)));
|
|
78
|
+
return parsed.success ? parsed.data : null;
|
|
79
|
+
}
|
|
80
|
+
export function loadRun(root, runId) {
|
|
81
|
+
const record = readRecord(recordPath(root, runId));
|
|
82
|
+
if (!record)
|
|
83
|
+
throw notFound('Run');
|
|
84
|
+
return record;
|
|
85
|
+
}
|
|
86
|
+
export function findRun(root, runId) {
|
|
87
|
+
try {
|
|
88
|
+
return loadRun(root, runId);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** A parent's reserved child IDs survive a crash before the spawn tool returns. */
|
|
95
|
+
export function recordSubagent(root, parentRunId, childRunId) {
|
|
96
|
+
loadRun(root, parentRunId);
|
|
97
|
+
const ids = recordedSubagents(root, parentRunId);
|
|
98
|
+
if (!ids.includes(childRunId))
|
|
99
|
+
writeJson(join(runDir(root, parentRunId), 'subagents.json'), [...ids, childRunId]);
|
|
100
|
+
}
|
|
101
|
+
export function recordedSubagents(root, parentRunId) {
|
|
102
|
+
const value = readJson(join(runDir(root, parentRunId), 'subagents.json'));
|
|
103
|
+
if (value === null)
|
|
104
|
+
return [];
|
|
105
|
+
if (!Array.isArray(value) || value.some(id => typeof id !== 'string'))
|
|
106
|
+
throw new Error('Recorded subagent ownership is unreadable.');
|
|
107
|
+
return value;
|
|
108
|
+
}
|
|
109
|
+
/** Changes a run's record. A settled run keeps its outcome whatever the change says. */
|
|
110
|
+
export function updateRun(root, runId, update) {
|
|
111
|
+
const record = readRecord(recordPath(root, runId));
|
|
112
|
+
if (!record)
|
|
113
|
+
return;
|
|
114
|
+
const { status, endedAt, terminalReason } = record;
|
|
115
|
+
update(record);
|
|
116
|
+
if (!isActiveStatus(status))
|
|
117
|
+
Object.assign(record, { status, endedAt, terminalReason });
|
|
118
|
+
write(root, record);
|
|
119
|
+
}
|
|
120
|
+
export function terminalStatus(event) {
|
|
121
|
+
if (event.type === 'completed')
|
|
122
|
+
return 'completed';
|
|
123
|
+
if (event.type === 'failed')
|
|
124
|
+
return 'failed';
|
|
125
|
+
if (event.type !== 'status.changed')
|
|
126
|
+
return null;
|
|
127
|
+
const status = event.payload?.status;
|
|
128
|
+
return status === 'interrupted' || status === 'failed' || status === 'completed' ? status : null;
|
|
129
|
+
}
|
|
130
|
+
function reasonOf(event) {
|
|
131
|
+
const payload = event.payload;
|
|
132
|
+
const reason = payload?.reason ?? payload?.message;
|
|
133
|
+
return typeof reason === 'string' ? reason : null;
|
|
134
|
+
}
|
|
135
|
+
export function appendEvent(root, event) {
|
|
136
|
+
const directory = runDir(root, event.runId);
|
|
137
|
+
mkdirSync(directory, { recursive: true });
|
|
138
|
+
// O_APPEND with a single write keeps each line intact.
|
|
139
|
+
appendFileSync(join(directory, 'events.jsonl'), `${JSON.stringify(event)}\n`);
|
|
140
|
+
}
|
|
141
|
+
/** A stored event as it was written: structurally an event, whatever its payload. */
|
|
142
|
+
function storedEvent(line) {
|
|
143
|
+
try {
|
|
144
|
+
const value = JSON.parse(line);
|
|
145
|
+
const valid = value && typeof value.id === 'string' && typeof value.runId === 'string' && typeof value.sessionId === 'string' && Number.isInteger(value.sequence) && value.sequence >= 0 && typeof value.timestamp === 'string' && typeof value.type === 'string' && value.payload !== undefined;
|
|
146
|
+
return valid ? value : null;
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/** A torn final line (a crash mid-write) is skipped rather than failing the whole log. */
|
|
153
|
+
export function readEvents(root, runId) {
|
|
154
|
+
let text;
|
|
155
|
+
try {
|
|
156
|
+
text = readFileSync(join(runDir(root, runId), 'events.jsonl'), 'utf8');
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
if (error.code === 'ENOENT')
|
|
160
|
+
return [];
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
return lines(text).flatMap((line) => storedEvent(line) ?? []);
|
|
164
|
+
}
|
|
165
|
+
/** An incoming event that passes the contract, or `null`. */
|
|
166
|
+
export function parseEvent(value) {
|
|
167
|
+
const parsed = runEventSchema.safeParse(value);
|
|
168
|
+
if (!parsed.success)
|
|
169
|
+
return null;
|
|
170
|
+
try {
|
|
171
|
+
safeId(parsed.data.runId);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
return parsed.data;
|
|
177
|
+
}
|
|
178
|
+
/** The events that affected execution; what arrived after the outcome stays in the raw log as evidence. */
|
|
179
|
+
export function executionEvents(events) {
|
|
180
|
+
const end = events.findIndex((event) => terminalStatus(event) !== null);
|
|
181
|
+
return events.slice(0, end < 0 ? events.length : end + 1).filter((event) => event.native?.hostIgnored === undefined);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Appends an event and applies it to the run record. An event that arrives after the run
|
|
185
|
+
* settled is kept as evidence and returns `false`: it is never applied or relayed.
|
|
186
|
+
*/
|
|
187
|
+
export function persistEvent(root, event) {
|
|
188
|
+
const record = loadRun(root, event.runId);
|
|
189
|
+
if (!isActiveStatus(record.status)) {
|
|
190
|
+
event.native = { hostIgnored: 'run_already_ended', event: event.native ?? null };
|
|
191
|
+
appendEvent(root, event);
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
appendEvent(root, event);
|
|
195
|
+
// Most events (text deltas above all) leave the record as it is; it is rewritten only when it changes.
|
|
196
|
+
let changed = false;
|
|
197
|
+
const outcome = terminalStatus(event);
|
|
198
|
+
if (outcome) {
|
|
199
|
+
record.status = outcome;
|
|
200
|
+
record.endedAt = event.timestamp;
|
|
201
|
+
record.terminalReason = reasonOf(event);
|
|
202
|
+
changed = true;
|
|
203
|
+
}
|
|
204
|
+
else if (event.type === 'status.changed') {
|
|
205
|
+
const status = event.payload.status;
|
|
206
|
+
if (typeof status === 'string' && status !== record.status) {
|
|
207
|
+
record.status = status;
|
|
208
|
+
changed = true;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const payload = event.payload;
|
|
212
|
+
if (event.type === 'message.completed' && payload.role === 'user' && record.mode === 'code' && !record.goal) {
|
|
213
|
+
record.goal = typeof payload.text === 'string' ? payload.text : null;
|
|
214
|
+
changed = true;
|
|
215
|
+
}
|
|
216
|
+
if (changed)
|
|
217
|
+
write(root, record);
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
const STOPPED = 'The harness stopped before the run settled.';
|
|
221
|
+
/** Startup reconciliation for every run that did not settle before the process stopped. */
|
|
222
|
+
export function markInterruptedRuns(root, reason = STOPPED) {
|
|
223
|
+
const interrupted = [];
|
|
224
|
+
for (const record of readAllRuns(root)) {
|
|
225
|
+
const path = recordPath(root, record.id);
|
|
226
|
+
const events = readEvents(root, record.id);
|
|
227
|
+
const settled = events.find((event) => terminalStatus(event) !== null);
|
|
228
|
+
if (settled) {
|
|
229
|
+
const status = terminalStatus(settled);
|
|
230
|
+
const settledReason = reasonOf(settled);
|
|
231
|
+
if (record.status !== status || record.endedAt !== settled.timestamp || record.terminalReason !== settledReason) {
|
|
232
|
+
const backup = `${path}.before-outcome-repair`;
|
|
233
|
+
if (!existsSync(backup))
|
|
234
|
+
copyFileSync(path, backup);
|
|
235
|
+
Object.assign(record, { status, endedAt: settled.timestamp, terminalReason: settledReason });
|
|
236
|
+
write(root, record);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (!isActiveStatus(record.status))
|
|
240
|
+
continue;
|
|
241
|
+
// Another live Harness on the same data folder is still running this; it is not an orphan.
|
|
242
|
+
if (ownedElsewhere(root, record.id))
|
|
243
|
+
continue;
|
|
244
|
+
record.status = 'interrupted';
|
|
245
|
+
record.terminalReason = reason;
|
|
246
|
+
record.endedAt ??= now();
|
|
247
|
+
const last = events.reduce((highest, event) => Math.max(highest, event.sequence), -1);
|
|
248
|
+
appendEvent(root, { id: newId(), runId: record.id, sessionId: record.sessionId, sequence: last + 1, timestamp: now(), type: 'status.changed', payload: { status: 'interrupted', reason } });
|
|
249
|
+
write(root, record);
|
|
250
|
+
interrupted.push(record.id);
|
|
251
|
+
}
|
|
252
|
+
return interrupted;
|
|
253
|
+
}
|
|
254
|
+
/** The run's unanswered approvals and questions, oldest first. */
|
|
255
|
+
export function pendingDecisions(events) {
|
|
256
|
+
const pending = [];
|
|
257
|
+
for (const requested of events) {
|
|
258
|
+
const shape = requested.type === 'approval.requested' ? ['approval', 'approvalId', 'approval.resolved'] : requested.type === 'question.requested' ? ['question', 'questionId', 'question.answered'] : null;
|
|
259
|
+
if (!shape)
|
|
260
|
+
continue;
|
|
261
|
+
const [kind, key, answered] = shape;
|
|
262
|
+
const id = requested.payload[key];
|
|
263
|
+
if (typeof id !== 'string')
|
|
264
|
+
continue;
|
|
265
|
+
if (events.some((entry) => entry.type === answered && entry.payload[key] === id))
|
|
266
|
+
continue;
|
|
267
|
+
pending.push({ kind, id, eventId: requested.id, payload: requested.payload });
|
|
268
|
+
}
|
|
269
|
+
return pending;
|
|
270
|
+
}
|
|
271
|
+
function belongsToRoot(record, rootRunId, records) {
|
|
272
|
+
const visited = new Set();
|
|
273
|
+
let current = record;
|
|
274
|
+
while (current && !visited.has(current.id)) {
|
|
275
|
+
if (current.id === rootRunId)
|
|
276
|
+
return true;
|
|
277
|
+
visited.add(current.id);
|
|
278
|
+
current = current.parentRunId ? records.get(current.parentRunId) : undefined;
|
|
279
|
+
}
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
/** A root run and all descendants linked through opaque parent-run metadata. */
|
|
283
|
+
export function runFamily(root, runId) {
|
|
284
|
+
const all = readAllRuns(root);
|
|
285
|
+
const byId = new Map(all.map((record) => [record.id, record]));
|
|
286
|
+
const target = byId.get(runId);
|
|
287
|
+
if (!target)
|
|
288
|
+
throw notFound('Run');
|
|
289
|
+
let familyRoot = target;
|
|
290
|
+
const ancestors = new Set([target.id]);
|
|
291
|
+
while (familyRoot.parentRunId) {
|
|
292
|
+
const parent = byId.get(familyRoot.parentRunId);
|
|
293
|
+
if (!parent || ancestors.has(parent.id))
|
|
294
|
+
break;
|
|
295
|
+
ancestors.add(parent.id);
|
|
296
|
+
familyRoot = parent;
|
|
297
|
+
}
|
|
298
|
+
const members = all.filter((record) => belongsToRoot(record, familyRoot.id, byId))
|
|
299
|
+
.sort((left, right) => compareText(left.startedAt, right.startedAt));
|
|
300
|
+
const runs = members.map((run) => {
|
|
301
|
+
const events = executionEvents(readEvents(root, run.id));
|
|
302
|
+
const lastUsage = events.filter((event) => event.type === 'usage.updated').at(-1)?.payload;
|
|
303
|
+
const parsed = usagePayloadSchema.safeParse(lastUsage);
|
|
304
|
+
return { run, usage: parsed.success ? parsed.data : null };
|
|
305
|
+
});
|
|
306
|
+
const counters = ['inputTokens', 'outputTokens', 'cacheReadTokens', 'cacheWriteTokens', 'reasoningTokens', 'costUsd', 'requests'];
|
|
307
|
+
const usage = Object.fromEntries(counters.map((counter) => {
|
|
308
|
+
const values = runs.map(({ usage: current }) => current?.[counter]);
|
|
309
|
+
return [counter, values.every((value) => typeof value === 'number') ? values.reduce((total, value) => total + value, 0) : null];
|
|
310
|
+
}));
|
|
311
|
+
return { rootRunId: familyRoot.id, runs, usage, settled: runs.every(({ run }) => !isActiveStatus(run.status)) };
|
|
312
|
+
}
|
|
313
|
+
export function snapshot(root, runId) {
|
|
314
|
+
const run = loadRun(root, runId);
|
|
315
|
+
const events = executionEvents(readEvents(root, runId));
|
|
316
|
+
return { run, events, lastSequence: events.reduce((highest, event) => Math.max(highest, event.sequence), -1) };
|
|
317
|
+
}
|
|
318
|
+
/** A session's history comes from the index; other filters scan run records. At most 200, newest first. */
|
|
319
|
+
export function listRuns(root, filter) {
|
|
320
|
+
if (filter.sessionId) {
|
|
321
|
+
try {
|
|
322
|
+
const records = runsForSession(root, filter.sessionId, 200).flatMap((id) => findRun(root, id) ?? []);
|
|
323
|
+
return filter.activeOnly ? records.filter((record) => isActiveStatus(record.status)) : records;
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// Fall through to the files.
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return readAllRuns(root)
|
|
330
|
+
.filter((record) => !filter.projectId || record.projectId === filter.projectId)
|
|
331
|
+
.filter((record) => !filter.sessionId || record.sessionId === filter.sessionId)
|
|
332
|
+
.filter((record) => !filter.activeOnly || isActiveStatus(record.status))
|
|
333
|
+
.sort((left, right) => compareText(right.startedAt, left.startedAt))
|
|
334
|
+
.slice(0, 200);
|
|
335
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import type { ModelRuntime, SettingsManager } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import { EFFORTS, type Effort } from "../core/effort.js";
|
|
3
|
+
import type { AccountContext } from "../accounts/env.js";
|
|
4
|
+
import type { InlineExtension } from "../plugins/firstParty.js";
|
|
5
|
+
import type { Loading, Registered } from "../plugins/plugins.js";
|
|
6
|
+
import { type ContextUpdate } from "../prompt/compile.js";
|
|
7
|
+
import type { ToolSpec } from "../tools/types.js";
|
|
8
|
+
import { type ExtensionHost } from "./extensionUi.js";
|
|
9
|
+
import type { ActiveRun } from "./registry.js";
|
|
10
|
+
export { EFFORTS };
|
|
11
|
+
export type { Effort };
|
|
12
|
+
/** What one turn needs once its prompt is compiled and its tools are chosen. */
|
|
13
|
+
export interface TurnParams {
|
|
14
|
+
runId: string;
|
|
15
|
+
/** Child runs may not gain tools registered by extensions outside their snapshot. */
|
|
16
|
+
restrictTools?: boolean;
|
|
17
|
+
settle?: () => Promise<void>;
|
|
18
|
+
cwd: string;
|
|
19
|
+
sessionDir: string;
|
|
20
|
+
/** The native history to open, or `null` to start a fresh one. */
|
|
21
|
+
historyFile: string | null;
|
|
22
|
+
model: string | null;
|
|
23
|
+
effort?: Effort | null;
|
|
24
|
+
text: string;
|
|
25
|
+
/** A user-requested shell command to run before the model sees the request. */
|
|
26
|
+
initialBashCommand?: string;
|
|
27
|
+
/** A prior run's Bash attempt and result, supplied when retrying a ! command. */
|
|
28
|
+
initialBashContext?: {
|
|
29
|
+
runId: string;
|
|
30
|
+
status: 'completed' | 'incomplete' | 'unknown';
|
|
31
|
+
ok?: boolean;
|
|
32
|
+
output?: string;
|
|
33
|
+
};
|
|
34
|
+
/** Whether Bash is present in this run's frozen capability snapshot. */
|
|
35
|
+
initialBashAvailable?: boolean;
|
|
36
|
+
/** The same gate used for model-issued tools. */
|
|
37
|
+
gate?: ToolGate;
|
|
38
|
+
images?: {
|
|
39
|
+
mediaType: string;
|
|
40
|
+
data: string;
|
|
41
|
+
}[];
|
|
42
|
+
requiresImageInput?: boolean;
|
|
43
|
+
/** App-origin notes placed before the text of the request. */
|
|
44
|
+
preamble?: string | null;
|
|
45
|
+
/** Unattended: no project extensions, no context files, settings held in memory. */
|
|
46
|
+
automatic?: boolean;
|
|
47
|
+
account: AccountContext;
|
|
48
|
+
/** Skills and prompt templates to load natively: the variant's skills folder. */
|
|
49
|
+
resources?: {
|
|
50
|
+
ids: string[];
|
|
51
|
+
skillPaths: string[];
|
|
52
|
+
promptPaths: string[];
|
|
53
|
+
};
|
|
54
|
+
/** Pi extensions from the variant (c8) that may load: trusted code, or a probe the person allowed. */
|
|
55
|
+
variantExtensions?: string[];
|
|
56
|
+
/**
|
|
57
|
+
* What the harness found for this session to load, and where it reports what loaded. Pi's own
|
|
58
|
+
* discovery is off whenever this is set, so only these paths and the registry's reach the session.
|
|
59
|
+
*/
|
|
60
|
+
plugins?: {
|
|
61
|
+
loading(): Promise<Loading>;
|
|
62
|
+
loaded(extensions: Registered[]): void;
|
|
63
|
+
};
|
|
64
|
+
/** The harness's own switched-on extensions. They are code in this process, so they load in every kind of run. */
|
|
65
|
+
inline?: InlineExtension[];
|
|
66
|
+
/** The stable part of the compiled prompt: the only text added to Pi's own. */
|
|
67
|
+
system: string;
|
|
68
|
+
/** Changed state, saved as a hidden message in native history before the request. */
|
|
69
|
+
update: ContextUpdate | null;
|
|
70
|
+
}
|
|
71
|
+
/** Structural view of the Pi events the harness consumes. */
|
|
72
|
+
export type PiEvent = {
|
|
73
|
+
type: 'message_start';
|
|
74
|
+
message: {
|
|
75
|
+
role: string;
|
|
76
|
+
};
|
|
77
|
+
} | {
|
|
78
|
+
type: 'message_update';
|
|
79
|
+
message: {
|
|
80
|
+
role: string;
|
|
81
|
+
};
|
|
82
|
+
assistantMessageEvent: {
|
|
83
|
+
type: string;
|
|
84
|
+
delta?: string;
|
|
85
|
+
};
|
|
86
|
+
} | {
|
|
87
|
+
type: 'message_end';
|
|
88
|
+
message: {
|
|
89
|
+
role: string;
|
|
90
|
+
content?: Array<{
|
|
91
|
+
type: string;
|
|
92
|
+
text?: string;
|
|
93
|
+
thinkingSignature?: string;
|
|
94
|
+
}>;
|
|
95
|
+
api?: string;
|
|
96
|
+
usage?: {
|
|
97
|
+
input?: number;
|
|
98
|
+
output?: number;
|
|
99
|
+
cacheRead?: number;
|
|
100
|
+
cacheWrite?: number;
|
|
101
|
+
reasoning?: number;
|
|
102
|
+
cost?: {
|
|
103
|
+
total?: number;
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
model?: string;
|
|
107
|
+
provider?: string;
|
|
108
|
+
responseId?: string;
|
|
109
|
+
stopReason?: string;
|
|
110
|
+
errorMessage?: string;
|
|
111
|
+
};
|
|
112
|
+
} | {
|
|
113
|
+
type: 'tool_execution_start';
|
|
114
|
+
toolCallId: string;
|
|
115
|
+
toolName: string;
|
|
116
|
+
args: unknown;
|
|
117
|
+
} | {
|
|
118
|
+
type: 'tool_execution_end';
|
|
119
|
+
toolCallId: string;
|
|
120
|
+
toolName: string;
|
|
121
|
+
isError: boolean;
|
|
122
|
+
result?: unknown;
|
|
123
|
+
} | {
|
|
124
|
+
type: string;
|
|
125
|
+
};
|
|
126
|
+
export interface PiSessionLike {
|
|
127
|
+
sessionId: string;
|
|
128
|
+
readonly sessionName?: string;
|
|
129
|
+
setSessionName?(name: string): void;
|
|
130
|
+
sessionManager?: {
|
|
131
|
+
getBranch(): unknown[];
|
|
132
|
+
};
|
|
133
|
+
thinkingLevel?: Effort;
|
|
134
|
+
systemPrompt?: string;
|
|
135
|
+
extensionCommands?: readonly string[];
|
|
136
|
+
model?: {
|
|
137
|
+
input: string[];
|
|
138
|
+
contextWindow?: number;
|
|
139
|
+
id?: string;
|
|
140
|
+
provider?: string;
|
|
141
|
+
};
|
|
142
|
+
getActiveToolNames?(): string[];
|
|
143
|
+
getAllTools?(): Array<{
|
|
144
|
+
name: string;
|
|
145
|
+
description?: string;
|
|
146
|
+
parameters?: unknown;
|
|
147
|
+
}>;
|
|
148
|
+
subscribe(listener: (event: PiEvent) => void): () => void;
|
|
149
|
+
prompt(text: string, options?: {
|
|
150
|
+
images?: unknown[];
|
|
151
|
+
}): Promise<void>;
|
|
152
|
+
executeBash?(command: string, onChunk?: (chunk: string) => void, options?: {
|
|
153
|
+
id?: string;
|
|
154
|
+
excludeFromContext?: boolean;
|
|
155
|
+
}): Promise<{
|
|
156
|
+
output: string;
|
|
157
|
+
exitCode: number | undefined;
|
|
158
|
+
cancelled: boolean;
|
|
159
|
+
truncated: boolean;
|
|
160
|
+
fullOutputPath?: string;
|
|
161
|
+
}>;
|
|
162
|
+
abortBash?(): void;
|
|
163
|
+
/** Queues a message for the model after the current step. Resolves `handled` when Pi takes it without queueing. */
|
|
164
|
+
steer?(text: string): Promise<'handled' | 'queued'>;
|
|
165
|
+
/** Drops queued messages Pi has not delivered. */
|
|
166
|
+
clearQueue?(): unknown;
|
|
167
|
+
sendCustomMessage?(message: {
|
|
168
|
+
customType: string;
|
|
169
|
+
content: string;
|
|
170
|
+
display: boolean;
|
|
171
|
+
details: unknown;
|
|
172
|
+
}, options: {
|
|
173
|
+
triggerTurn: boolean;
|
|
174
|
+
}): Promise<void>;
|
|
175
|
+
abort(): Promise<void>;
|
|
176
|
+
dispose(): void;
|
|
177
|
+
}
|
|
178
|
+
export interface ToolGate {
|
|
179
|
+
/** Resolves to a block reason, or null to let the call run. */
|
|
180
|
+
check(toolName: string, input: unknown): Promise<string | null>;
|
|
181
|
+
/** Makes these tools ask before each call. Used for tools an extension brought, which no one switched on by name. */
|
|
182
|
+
ask?(toolNames: readonly string[]): void;
|
|
183
|
+
}
|
|
184
|
+
export type SessionFactory = (input: {
|
|
185
|
+
params: TurnParams;
|
|
186
|
+
/** Pi's own tools and the custom tools switched on for this turn, in order. */
|
|
187
|
+
allow: string[];
|
|
188
|
+
gate: ToolGate;
|
|
189
|
+
/** Custom tools already bound to this run. */
|
|
190
|
+
tools: ToolSpec[];
|
|
191
|
+
runtime: () => Promise<ModelRuntime>;
|
|
192
|
+
/** Where a loaded extension's dialogs and notices go. Without it extensions have no interface. */
|
|
193
|
+
extensions?: ExtensionHost;
|
|
194
|
+
}) => Promise<PiSessionLike>;
|
|
195
|
+
/** A one-line description of a tool call, for an approval request or the activity list. */
|
|
196
|
+
export declare function summarize(input: unknown, toolName?: string): string;
|
|
197
|
+
/** How much text a tool handed back to the model: what its result adds to every later request. */
|
|
198
|
+
export declare function resultSize(result: unknown): number | null;
|
|
199
|
+
/** Streams one request through a Pi session, translating events for the run. */
|
|
200
|
+
export declare function runTurn(run: ActiveRun, session: PiSessionLike, params: TurnParams): Promise<void>;
|
|
201
|
+
/**
|
|
202
|
+
* Loads what a session may use besides its tools: Pi's context files, the registry's skills and
|
|
203
|
+
* prompts, and what the harness found for it. `gate` is loaded after every extension on disk.
|
|
204
|
+
*/
|
|
205
|
+
export declare function loadResources(pi: typeof import('@earendil-works/pi-coding-agent'), params: Pick<TurnParams, 'cwd' | 'account' | 'automatic' | 'resources' | 'variantExtensions' | 'plugins' | 'system' | 'inline'>, gate: unknown, automaticSettings?: SettingsManager): Promise<import("@earendil-works/pi-coding-agent").DefaultResourceLoader>;
|
|
206
|
+
/** What each extension on disk registered when it was loaded. The harness's own gate is not one of them. */
|
|
207
|
+
export declare function registeredBy(loader: {
|
|
208
|
+
getExtensions(): {
|
|
209
|
+
extensions: readonly unknown[];
|
|
210
|
+
};
|
|
211
|
+
}): Registered[];
|
|
212
|
+
/** Opens a Pi session for one turn: the account's runtime, the compiled prompt, and the gated tools. */
|
|
213
|
+
export declare const piSessionFactory: SessionFactory;
|