@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,258 @@
|
|
|
1
|
+
// Task-level recursion, parallel and sequential. Each mode schedules 4k rollouts and 3k
|
|
2
|
+
// improvement stages, including the shared base executions. An invalid proposal gets one retry
|
|
3
|
+
// with the validator's message, then inherits the current harness.
|
|
4
|
+
//
|
|
5
|
+
// Ported from Harness² (Apache-2.0, Google LLC; `harness2/core/recursion.py`).
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { PI_SURFACE } from "../variant/surface.js";
|
|
9
|
+
import { autotrigger, diversity, isUnchanged, readVariant, VariantError, validate, writeVariant } from "../variant/variant.js";
|
|
10
|
+
import * as evidence from "./evidence.js";
|
|
11
|
+
import { Ledger } from "./ledger.js";
|
|
12
|
+
import * as P from "./prompts.js";
|
|
13
|
+
import { ImproverError } from "./types.js";
|
|
14
|
+
export const STAGE_ATTEMPTS = 2;
|
|
15
|
+
export function modeRecord(result) {
|
|
16
|
+
return {
|
|
17
|
+
mode: result.mode,
|
|
18
|
+
taskId: result.taskId,
|
|
19
|
+
k: result.k,
|
|
20
|
+
finals: result.finals,
|
|
21
|
+
ok: result.finals.length > 0 && result.errors.length === 0,
|
|
22
|
+
fellBack: result.stages.filter((stage) => stage.fellBack).map((stage) => stage.label),
|
|
23
|
+
keptBase: result.stages.filter((stage) => stage.keptBase).map((stage) => stage.label),
|
|
24
|
+
stages: result.stages.map(({ variant: _tree, ...rest }) => ({ ...rest, error: rest.error.slice(0, 400) })),
|
|
25
|
+
similarity: result.similarity,
|
|
26
|
+
ledger: result.ledger.toRecord(),
|
|
27
|
+
errors: result.errors
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** Runs `fn` over `items` with at most `width` at a time, keeping input order in the result. */
|
|
31
|
+
export async function mapLimit(items, width, fn) {
|
|
32
|
+
const out = new Array(items.length);
|
|
33
|
+
let next = 0;
|
|
34
|
+
const workers = Array.from({ length: Math.max(1, Math.min(width, items.length)) }, async () => {
|
|
35
|
+
while (next < items.length) {
|
|
36
|
+
const i = next++;
|
|
37
|
+
out[i] = await fn(items[i]);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
await Promise.all(workers);
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
function checkAborted(signal) {
|
|
44
|
+
if (signal?.aborted)
|
|
45
|
+
throw new Error('Refinement was cancelled.');
|
|
46
|
+
}
|
|
47
|
+
/** Repairs, then validates, a proposed variant. Returns whether it equals the fallback and any error. */
|
|
48
|
+
export function acceptVariant(task, executor, next, fallback) {
|
|
49
|
+
autotrigger(PI_SURFACE, next);
|
|
50
|
+
const keptBase = isUnchanged(PI_SURFACE, fallback, next);
|
|
51
|
+
try {
|
|
52
|
+
validate(PI_SURFACE, next, { allowSubagents: task.allowSubagents !== false });
|
|
53
|
+
executor.validateVariant?.(task, next);
|
|
54
|
+
evidence.assertVariantHasNoGraderVerdicts(next);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return { keptBase, error: error instanceof VariantError ? error.problems.join(' | ') : error instanceof Error ? error.message : String(error) };
|
|
58
|
+
}
|
|
59
|
+
return { keptBase, error: '' };
|
|
60
|
+
}
|
|
61
|
+
/** Builds evidence, asks for an edit, and retries an invalid one once. Never throws. */
|
|
62
|
+
export async function runStage(ctx, input) {
|
|
63
|
+
const { label, dim, fallback } = input;
|
|
64
|
+
ctx.onEvent?.({ type: 'stage.started', label, dim });
|
|
65
|
+
const finish = (stage) => {
|
|
66
|
+
ctx.onEvent?.({ type: 'stage.finished', label, dim, fellBack: stage.fellBack, keptBase: stage.keptBase, error: stage.error });
|
|
67
|
+
return stage;
|
|
68
|
+
};
|
|
69
|
+
let folder;
|
|
70
|
+
let mission;
|
|
71
|
+
try {
|
|
72
|
+
folder = evidence.build(join(ctx.workDir, 'context', label), {
|
|
73
|
+
task: ctx.task,
|
|
74
|
+
executor: ctx.executor,
|
|
75
|
+
rollouts: input.rollouts,
|
|
76
|
+
variantDir: input.variantDir,
|
|
77
|
+
libraryDir: ctx.libraryDir,
|
|
78
|
+
pool: input.pool,
|
|
79
|
+
decisions: input.decisions
|
|
80
|
+
});
|
|
81
|
+
mission = evidence.mission(folder, input.job);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
return finish({ label, dim, variant: { ...fallback }, keptBase: false, fellBack: true, error: `could not build evidence: ${error instanceof Error ? error.message : String(error)}`.slice(0, 400), usd: 0, attempts: 0, cached: false, notes: '' });
|
|
85
|
+
}
|
|
86
|
+
let err = '';
|
|
87
|
+
let usd = 0;
|
|
88
|
+
let attempts = 0;
|
|
89
|
+
let allCached = true;
|
|
90
|
+
for (let attempt = 1; attempt <= STAGE_ATTEMPTS; attempt++) {
|
|
91
|
+
if (ctx.signal?.aborted) {
|
|
92
|
+
err = 'cancelled';
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
let reply;
|
|
96
|
+
try {
|
|
97
|
+
reply = await ctx.improver.call({
|
|
98
|
+
mission: mission + (err ? `\n\n# YOUR PREVIOUS ATTEMPT WAS REJECTED\n\n${err}\n\nFix it in \`context/harness/\` and reply again.` : ''),
|
|
99
|
+
contextDir: folder.root,
|
|
100
|
+
label: `${label}.a${attempt}`,
|
|
101
|
+
harvest: 'context/harness',
|
|
102
|
+
signal: ctx.signal
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
err = error instanceof Error ? error.message : String(error);
|
|
107
|
+
attempts += error instanceof ImproverError ? error.attempts || 1 : 1;
|
|
108
|
+
usd += error instanceof ImproverError ? error.costUsd : 0;
|
|
109
|
+
allCached = false;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
usd += reply.costUsd;
|
|
113
|
+
attempts += reply.cached ? 0 : Math.max(1, reply.attempts);
|
|
114
|
+
allCached = allCached && reply.cached;
|
|
115
|
+
if (!reply.workspace || !existsSync(reply.workspace)) {
|
|
116
|
+
err = 'the harness directory did not come back from the session; edit the files in `context/harness/` in place';
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const rejected = [];
|
|
120
|
+
const next = readVariant(PI_SURFACE, reply.workspace, rejected);
|
|
121
|
+
if (!Object.keys(next).length) {
|
|
122
|
+
err = '`context/harness/` came back empty -- edit the files, do not delete them all';
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (rejected.length) {
|
|
126
|
+
err = `these files are off the editable surface and were not applied: ${rejected.sort().slice(0, 6).join(', ')}. Component names must be lowercase letters, digits, \`_\` or \`-\` (e.g. \`skills/doc_review/SKILL.md\`, \`scripts/check_totals.py\`).`;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const accepted = acceptVariant(ctx.task, ctx.executor, next, fallback);
|
|
130
|
+
if (accepted.error) {
|
|
131
|
+
err = accepted.error;
|
|
132
|
+
// The next attempt edits what came back, so it fixes rather than restarts.
|
|
133
|
+
writeVariant(PI_SURFACE, next, join(folder.root, 'harness'));
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const notes = /<notes>([\s\S]*?)<\/notes>/.exec(reply.text)?.[1]?.trim() ?? reply.text.trim();
|
|
137
|
+
return finish({ label, dim, variant: next, keptBase: accepted.keptBase, fellBack: false, error: '', usd, attempts, cached: allCached, notes });
|
|
138
|
+
}
|
|
139
|
+
return finish({ label, dim, variant: { ...fallback }, keptBase: false, fellBack: true, error: err.slice(0, 400), usd, attempts, cached: allCached, notes: '' });
|
|
140
|
+
}
|
|
141
|
+
function recordSessions(ledger, stages) {
|
|
142
|
+
for (const stage of stages)
|
|
143
|
+
ledger.session(stage.label, stage.usd, { cached: stage.cached, attempts: stage.attempts });
|
|
144
|
+
}
|
|
145
|
+
/** Writes a harness and rolls it once. A dead rollout is recorded, never thrown. */
|
|
146
|
+
async function roll(ctx, label, variant) {
|
|
147
|
+
const variantDir = writeVariant(PI_SURFACE, variant, join(ctx.workDir, 'variants', label));
|
|
148
|
+
const runId = ctx.runIdOf(label);
|
|
149
|
+
ctx.onEvent?.({ type: 'rollout.started', label });
|
|
150
|
+
let rollout;
|
|
151
|
+
try {
|
|
152
|
+
checkAborted(ctx.signal);
|
|
153
|
+
rollout = await ctx.executor.execute(ctx.task, variantDir, label, runId);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
rollout = { label, runId, dir: join(ctx.workDir, 'missing', label), ok: false, delivered: false, costUsd: 0, wallMs: 0, error: error instanceof Error ? error.message : String(error) };
|
|
157
|
+
}
|
|
158
|
+
ctx.onEvent?.({ type: 'rollout.finished', label, ok: rollout.ok, delivered: rollout.delivered, error: rollout.error });
|
|
159
|
+
return rollout;
|
|
160
|
+
}
|
|
161
|
+
/** Rolls independent harnesses concurrently, then records them in the caller's order. */
|
|
162
|
+
async function rollMany(ctx, ledger, items) {
|
|
163
|
+
const got = await mapLimit(items, ctx.rolloutWidth ?? 4, ([label, variant]) => roll(ctx, label, variant));
|
|
164
|
+
const out = {};
|
|
165
|
+
items.forEach(([label], i) => {
|
|
166
|
+
ledger.rollout(label, got[i].costUsd);
|
|
167
|
+
out[label] = got[i];
|
|
168
|
+
});
|
|
169
|
+
return out;
|
|
170
|
+
}
|
|
171
|
+
function newResult(mode, ctx, k, base) {
|
|
172
|
+
const ledger = new Ledger(mode, ctx.task.id, k);
|
|
173
|
+
for (const rollout of base)
|
|
174
|
+
ledger.rollout(rollout.label, rollout.costUsd);
|
|
175
|
+
return { mode, taskId: ctx.task.id, k, stages: [], variants: {}, rollouts: Object.fromEntries(base.map((rollout) => [rollout.label, rollout])), finals: [], ledger, similarity: null, errors: [] };
|
|
176
|
+
}
|
|
177
|
+
const variantPath = (ctx, label) => join(ctx.workDir, 'variants', label);
|
|
178
|
+
/** WIDTH: 2k independent candidates from shared evidence, then k independent compositions. */
|
|
179
|
+
export async function runParallel(ctx, k, base) {
|
|
180
|
+
const result = newResult('agg', ctx, k, base);
|
|
181
|
+
const prompts = ctx.task.prompts ?? defaultPrompts();
|
|
182
|
+
const baseDir = writeVariant(PI_SURFACE, ctx.baseVariant, variantPath(ctx, 'base'));
|
|
183
|
+
const specs = [];
|
|
184
|
+
for (let i = 1; i <= k; i++)
|
|
185
|
+
for (const dim of ['INV', 'DOM'])
|
|
186
|
+
specs.push([`${dim.toLowerCase()}${i}`, dim, i]);
|
|
187
|
+
const stages = await mapLimit(specs, ctx.proposeWidth ?? 4, ([label, dim, index]) => runStage(ctx, { label, dim, job: P.propose(prompts, dim, { k, index }), fallback: ctx.baseVariant, rollouts: base, variantDir: baseDir }));
|
|
188
|
+
recordSessions(result.ledger, stages);
|
|
189
|
+
for (const stage of stages) {
|
|
190
|
+
result.stages.push(stage);
|
|
191
|
+
result.variants[stage.label] = stage.variant;
|
|
192
|
+
}
|
|
193
|
+
Object.assign(result.rollouts, await rollMany(ctx, result.ledger, stages.map((stage) => [stage.label, stage.variant])));
|
|
194
|
+
const pool = stages.map((stage) => ({ label: stage.label, variantDir: variantPath(ctx, stage.label), rollout: result.rollouts[stage.label] ?? null }));
|
|
195
|
+
const decisions = Object.fromEntries(stages.map((stage) => [stage.label, stage.notes || stage.error]));
|
|
196
|
+
const aggs = await mapLimit(Array.from({ length: k }, (_, i) => i + 1), ctx.proposeWidth ?? 4, (index) => runStage(ctx, { label: `agg${index}`, dim: 'AGG', job: P.aggregate(prompts, { k, index }), fallback: ctx.baseVariant, rollouts: base, variantDir: baseDir, pool, decisions }));
|
|
197
|
+
recordSessions(result.ledger, aggs);
|
|
198
|
+
for (const stage of aggs) {
|
|
199
|
+
result.stages.push(stage);
|
|
200
|
+
result.variants[stage.label] = stage.variant;
|
|
201
|
+
result.finals.push(stage.label);
|
|
202
|
+
}
|
|
203
|
+
Object.assign(result.rollouts, await rollMany(ctx, result.ledger, aggs.map((stage) => [stage.label, stage.variant])));
|
|
204
|
+
result.similarity = diversity(Object.fromEntries(aggs.map((stage) => [stage.label, stage.variant])));
|
|
205
|
+
result.ledger.assertIdentity();
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
/** DEPTH: k nested passes over the same shared base evidence. */
|
|
209
|
+
export async function runSequential(ctx, k, base) {
|
|
210
|
+
const result = newResult('seq', ctx, k, base);
|
|
211
|
+
const prompts = ctx.task.prompts ?? defaultPrompts();
|
|
212
|
+
let current = { ...ctx.baseVariant };
|
|
213
|
+
let history = [];
|
|
214
|
+
for (let t = 1; t <= k; t++) {
|
|
215
|
+
checkAborted(ctx.signal);
|
|
216
|
+
const currentLabel = t > 1 ? `c${t - 1}` : 'base';
|
|
217
|
+
const currentDir = writeVariant(PI_SURFACE, current, variantPath(ctx, currentLabel));
|
|
218
|
+
const decisions = () => Object.fromEntries(result.stages.map((stage) => [stage.label, stage.notes || stage.error]));
|
|
219
|
+
const specs = [[`inv${t}`, 'INV'], [`dom${t}`, 'DOM']];
|
|
220
|
+
const before = decisions();
|
|
221
|
+
const fallback = current;
|
|
222
|
+
const stages = await mapLimit(specs, Math.min(2, ctx.proposeWidth ?? 2), ([label, dim]) => runStage(ctx, { label, dim, job: P.propose(prompts, dim, { k, index: t, roundT: k > 1 ? t : null }), fallback, rollouts: base, variantDir: currentDir, pool: [...history], decisions: before }));
|
|
223
|
+
recordSessions(result.ledger, stages);
|
|
224
|
+
for (const stage of stages) {
|
|
225
|
+
result.stages.push(stage);
|
|
226
|
+
result.variants[stage.label] = stage.variant;
|
|
227
|
+
}
|
|
228
|
+
Object.assign(result.rollouts, await rollMany(ctx, result.ledger, stages.map((stage) => [stage.label, stage.variant])));
|
|
229
|
+
const roundPool = [...history, ...stages.map((stage) => ({ label: stage.label, variantDir: variantPath(ctx, stage.label), rollout: result.rollouts[stage.label] ?? null }))];
|
|
230
|
+
const ck = `c${t}`;
|
|
231
|
+
const job = k === 1 ? P.aggregate(prompts, { k: 1, index: 1 }) : P.composeRound(prompts, { t, k });
|
|
232
|
+
const comp = await runStage(ctx, { label: ck, dim: 'COMPOSE', job, fallback: current, rollouts: base, variantDir: currentDir, pool: roundPool, decisions: decisions() });
|
|
233
|
+
recordSessions(result.ledger, [comp]);
|
|
234
|
+
result.stages.push(comp);
|
|
235
|
+
result.variants[ck] = comp.variant;
|
|
236
|
+
const rolled = await roll(ctx, ck, comp.variant);
|
|
237
|
+
result.ledger.rollout(ck, rolled.costUsd);
|
|
238
|
+
result.rollouts[ck] = rolled;
|
|
239
|
+
history = [...roundPool, { label: ck, variantDir: variantPath(ctx, ck), rollout: rolled }];
|
|
240
|
+
current = comp.variant;
|
|
241
|
+
}
|
|
242
|
+
result.finals = Array.from({ length: k }, (_, i) => `c${i + 1}`);
|
|
243
|
+
result.ledger.assertIdentity();
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
export function defaultPrompts() {
|
|
247
|
+
return {
|
|
248
|
+
work: 'The work is the request in `context/task.md`, done for the person who asked for it, with the tools this agent has.',
|
|
249
|
+
domainWord: 'area'
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
export function runMode(mode, ctx, k, base) {
|
|
253
|
+
return mode === 'parallel' ? runParallel(ctx, k, base) : runSequential(ctx, k, base);
|
|
254
|
+
}
|
|
255
|
+
/** Reads a harness a stage wrote, for callers that hold only labels. */
|
|
256
|
+
export function stageVariant(workDir, label) {
|
|
257
|
+
return readVariant(PI_SURFACE, variantPath({ workDir }, label));
|
|
258
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { type Variant } from "../variant/surface.js";
|
|
2
|
+
import { type Experience } from "./library.js";
|
|
3
|
+
import type { LedgerRecord } from "./ledger.js";
|
|
4
|
+
import { type ModeRecord, type RecursionEvent } from "./recursion.js";
|
|
5
|
+
import { type Selection } from "./selection.js";
|
|
6
|
+
import type { Executor, Improver, RecursionMode, RefineTask } from "./types.js";
|
|
7
|
+
export type RefineStatus = 'running' | 'ok' | 'partial' | 'failed' | 'cancelled';
|
|
8
|
+
export interface RefineSummary {
|
|
9
|
+
id: string;
|
|
10
|
+
taskId: string;
|
|
11
|
+
scope: string;
|
|
12
|
+
area: string;
|
|
13
|
+
k: number;
|
|
14
|
+
mode: RecursionMode;
|
|
15
|
+
status: RefineStatus;
|
|
16
|
+
startedAt: string;
|
|
17
|
+
endedAt: string | null;
|
|
18
|
+
/** The head the refinement started from. */
|
|
19
|
+
baseFingerprint: string;
|
|
20
|
+
base: {
|
|
21
|
+
label: string;
|
|
22
|
+
runId: string;
|
|
23
|
+
ok: boolean;
|
|
24
|
+
delivered: boolean;
|
|
25
|
+
error: string;
|
|
26
|
+
}[];
|
|
27
|
+
recursion: ModeRecord | null;
|
|
28
|
+
selection: Selection | null;
|
|
29
|
+
/** The chosen harness, saved as a version of the scope without moving its head; null when it is the base. */
|
|
30
|
+
chosenFingerprint: string | null;
|
|
31
|
+
chosenIsBase: boolean;
|
|
32
|
+
libraryEntry: string | null;
|
|
33
|
+
experience: Partial<Experience> | null;
|
|
34
|
+
usd: number;
|
|
35
|
+
errors: string[];
|
|
36
|
+
/** The executor and improver settings the refinement was started with (PROP-0003). Run records hold what each run resolved. */
|
|
37
|
+
settings?: {
|
|
38
|
+
executor: RefineSettings | null;
|
|
39
|
+
improver: RefineSettings | null;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export interface RefineSettings {
|
|
43
|
+
model?: string | null;
|
|
44
|
+
effort?: string | null;
|
|
45
|
+
accountId?: string | null;
|
|
46
|
+
poolId?: string | null;
|
|
47
|
+
}
|
|
48
|
+
export type RefineEvent = RecursionEvent | {
|
|
49
|
+
type: 'phase';
|
|
50
|
+
phase: 'base' | 'recursion' | 'selection' | 'reflection' | 'done';
|
|
51
|
+
} | {
|
|
52
|
+
type: 'summary';
|
|
53
|
+
summary: RefineSummary;
|
|
54
|
+
};
|
|
55
|
+
export interface RefineRunInput {
|
|
56
|
+
root: string;
|
|
57
|
+
id: string;
|
|
58
|
+
task: RefineTask;
|
|
59
|
+
k: number;
|
|
60
|
+
mode: RecursionMode;
|
|
61
|
+
executor: Executor;
|
|
62
|
+
improver: Improver;
|
|
63
|
+
/** The selector; defaults to the improver. */
|
|
64
|
+
selector?: Improver;
|
|
65
|
+
/** The harness to start from. Defaults to the scope's head. */
|
|
66
|
+
baseVariant?: Variant;
|
|
67
|
+
proposeWidth?: number;
|
|
68
|
+
rolloutWidth?: number;
|
|
69
|
+
/** Recorded on the summary only; the executor and improver already carry them. */
|
|
70
|
+
settings?: {
|
|
71
|
+
executor: RefineSettings | null;
|
|
72
|
+
improver: RefineSettings | null;
|
|
73
|
+
};
|
|
74
|
+
onEvent?: (event: RefineEvent) => void;
|
|
75
|
+
signal?: AbortSignal;
|
|
76
|
+
}
|
|
77
|
+
export declare function refineDir(root: string, id: string): string;
|
|
78
|
+
export declare function readSummary(root: string, id: string): RefineSummary | null;
|
|
79
|
+
/** Runs one refinement to the end. Failures are recorded on the summary; only bad input throws. */
|
|
80
|
+
export declare function runRefinement(input: RefineRunInput): Promise<RefineSummary>;
|
|
81
|
+
export type { LedgerRecord };
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// One refinement: k shared base executions on the current harness, one recursion mode, blind
|
|
2
|
+
// selection of a final, reflection, and a library entry. Everything is written under
|
|
3
|
+
// `<data>/refine/<id>/` as it happens; `summary.json` is the record a person or an application
|
|
4
|
+
// reads.
|
|
5
|
+
//
|
|
6
|
+
// Shaped after Harness² (Apache-2.0, Google LLC; `harness2/core/schedule.py::run_task`).
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { now, readJson, safeId, writeJson } from "../core/fs.js";
|
|
9
|
+
import * as store from "../variant/store.js";
|
|
10
|
+
import { PI_SURFACE } from "../variant/surface.js";
|
|
11
|
+
import { isUnchanged, writeVariant } from "../variant/variant.js";
|
|
12
|
+
import { Library, hasExperience } from "./library.js";
|
|
13
|
+
import { mapLimit, modeRecord, runMode } from "./recursion.js";
|
|
14
|
+
import { reflectAdoption, runSelection, selectionPool, trivialSelection } from "./selection.js";
|
|
15
|
+
export function refineDir(root, id) {
|
|
16
|
+
return join(root, 'refine', safeId(id));
|
|
17
|
+
}
|
|
18
|
+
export function readSummary(root, id) {
|
|
19
|
+
return readJson(join(refineDir(root, id), 'summary.json'));
|
|
20
|
+
}
|
|
21
|
+
const modeToken = (mode) => (mode === 'parallel' ? 'agg' : 'seq');
|
|
22
|
+
/** Runs one refinement to the end. Failures are recorded on the summary; only bad input throws. */
|
|
23
|
+
export async function runRefinement(input) {
|
|
24
|
+
const { root, id, task, k, mode, executor, improver } = input;
|
|
25
|
+
if (!Number.isInteger(k) || k < 1 || k > 8)
|
|
26
|
+
throw new Error('k must be a whole number from 1 to 8.');
|
|
27
|
+
safeId(task.scope);
|
|
28
|
+
const workDir = refineDir(root, id);
|
|
29
|
+
const area = task.domain ?? task.scope;
|
|
30
|
+
const baseVariant = input.baseVariant ?? store.headVariant(root, task.scope)?.variant;
|
|
31
|
+
if (!baseVariant)
|
|
32
|
+
throw new Error(`The harness '${task.scope}' has no version to start from.`);
|
|
33
|
+
const baseFingerprint = store.fingerprint(baseVariant);
|
|
34
|
+
const library = new Library(root, task.scope, area);
|
|
35
|
+
const runIdOf = (label) => `${id}-${label}`;
|
|
36
|
+
const emit = (event) => input.onEvent?.(event);
|
|
37
|
+
const summary = {
|
|
38
|
+
id,
|
|
39
|
+
taskId: task.id,
|
|
40
|
+
scope: task.scope,
|
|
41
|
+
area,
|
|
42
|
+
k,
|
|
43
|
+
mode,
|
|
44
|
+
status: 'running',
|
|
45
|
+
startedAt: now(),
|
|
46
|
+
endedAt: null,
|
|
47
|
+
baseFingerprint,
|
|
48
|
+
base: [],
|
|
49
|
+
recursion: null,
|
|
50
|
+
selection: null,
|
|
51
|
+
chosenFingerprint: null,
|
|
52
|
+
chosenIsBase: false,
|
|
53
|
+
libraryEntry: null,
|
|
54
|
+
experience: null,
|
|
55
|
+
usd: 0,
|
|
56
|
+
errors: [],
|
|
57
|
+
...(input.settings ? { settings: input.settings } : {})
|
|
58
|
+
};
|
|
59
|
+
const save = () => {
|
|
60
|
+
writeJson(join(workDir, 'summary.json'), summary);
|
|
61
|
+
emit({ type: 'summary', summary: structuredClone(summary) });
|
|
62
|
+
};
|
|
63
|
+
const finish = (status) => {
|
|
64
|
+
summary.status = input.signal?.aborted ? 'cancelled' : status;
|
|
65
|
+
summary.endedAt = now();
|
|
66
|
+
save();
|
|
67
|
+
emit({ type: 'phase', phase: 'done' });
|
|
68
|
+
return summary;
|
|
69
|
+
};
|
|
70
|
+
writeJson(join(workDir, 'task.json'), { task, k, mode });
|
|
71
|
+
save();
|
|
72
|
+
// The library a refinement reads is the one before it, so the record of what it read is stable.
|
|
73
|
+
const libraryDir = library.contextDir();
|
|
74
|
+
emit({ type: 'phase', phase: 'base' });
|
|
75
|
+
const baseDir = writeVariant(PI_SURFACE, baseVariant, join(workDir, 'variants', 'base'));
|
|
76
|
+
const labels = Array.from({ length: k }, (_, i) => `base${i + 1}`);
|
|
77
|
+
const base = await mapLimit(labels, input.rolloutWidth ?? 4, async (label) => {
|
|
78
|
+
emit({ type: 'rollout.started', label });
|
|
79
|
+
let rollout;
|
|
80
|
+
try {
|
|
81
|
+
if (input.signal?.aborted)
|
|
82
|
+
throw new Error('Refinement was cancelled.');
|
|
83
|
+
rollout = await executor.execute(task, baseDir, label, runIdOf(label));
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
rollout = { label, runId: runIdOf(label), dir: join(workDir, 'missing', label), ok: false, delivered: false, costUsd: 0, wallMs: 0, error: error instanceof Error ? error.message : String(error) };
|
|
87
|
+
}
|
|
88
|
+
emit({ type: 'rollout.finished', label, ok: rollout.ok, delivered: rollout.delivered, error: rollout.error });
|
|
89
|
+
return rollout;
|
|
90
|
+
});
|
|
91
|
+
summary.base = base.map((r) => ({ label: r.label, runId: r.runId, ok: r.ok, delivered: r.delivered, error: r.error }));
|
|
92
|
+
if (!base.some((rollout) => rollout.ok)) {
|
|
93
|
+
summary.errors.push('no base rollout produced anything');
|
|
94
|
+
summary.usd = base.reduce((sum, r) => sum + r.costUsd, 0);
|
|
95
|
+
return finish('failed');
|
|
96
|
+
}
|
|
97
|
+
save();
|
|
98
|
+
emit({ type: 'phase', phase: 'recursion' });
|
|
99
|
+
let result;
|
|
100
|
+
try {
|
|
101
|
+
result = await runMode(mode, { task, executor, improver, workDir, runIdOf, baseVariant, libraryDir, proposeWidth: input.proposeWidth, rolloutWidth: input.rolloutWidth, onEvent: emit, signal: input.signal }, k, base);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
summary.errors.push(`${mode}: ${error instanceof Error ? error.message : String(error)}`);
|
|
105
|
+
return finish(input.signal?.aborted ? 'cancelled' : 'failed');
|
|
106
|
+
}
|
|
107
|
+
summary.recursion = modeRecord(result);
|
|
108
|
+
summary.usd = result.ledger.usd();
|
|
109
|
+
save();
|
|
110
|
+
emit({ type: 'phase', phase: 'selection' });
|
|
111
|
+
const token = modeToken(mode);
|
|
112
|
+
const candidates = selectionPool(token, k, result.rollouts);
|
|
113
|
+
const sel = k === 1
|
|
114
|
+
? trivialSelection({ task, k, mode: token, candidates, executor, workDir })
|
|
115
|
+
: await runSelection({ task, k, mode: token, candidates, executor, improver: input.selector ?? improver, workDir, signal: input.signal });
|
|
116
|
+
summary.selection = sel;
|
|
117
|
+
if (!sel.ok)
|
|
118
|
+
summary.errors.push(`${mode}: selection failed: ${sel.error}`);
|
|
119
|
+
const chosen = candidates[sel.chosenLabel];
|
|
120
|
+
if (chosen && !chosen.delivered)
|
|
121
|
+
summary.errors.push(`${mode}: selected run ${chosen.runId} produced no deliverable`);
|
|
122
|
+
const chosenVariant = result.variants[sel.chosenLabel] ?? baseVariant;
|
|
123
|
+
summary.chosenIsBase = isUnchanged(PI_SURFACE, baseVariant, chosenVariant);
|
|
124
|
+
if (sel.chosenLabel && !summary.chosenIsBase) {
|
|
125
|
+
try {
|
|
126
|
+
summary.chosenFingerprint = store.commit(root, task.scope, chosenVariant, { kind: 'refinement', refineId: id, label: sel.chosenLabel, note: sel.why.slice(0, 500) }, { moveHead: false }).fingerprint;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
summary.errors.push(`could not save the chosen harness: ${error instanceof Error ? error.message : String(error)}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
save();
|
|
133
|
+
if (sel.ok) {
|
|
134
|
+
emit({ type: 'phase', phase: 'reflection' });
|
|
135
|
+
const decisions = Object.fromEntries(result.stages.map((stage) => [stage.label, stage.notes || stage.error]));
|
|
136
|
+
const experience = await reflectAdoption({ task, selection: sel, rollouts: result.rollouts, executor, improver: input.selector ?? improver, workDir, baseVariant, decisions, signal: input.signal });
|
|
137
|
+
summary.experience = Object.keys(experience).length ? experience : null;
|
|
138
|
+
if (hasExperience(experience)) {
|
|
139
|
+
try {
|
|
140
|
+
summary.libraryEntry = library.add(task.id, chosenVariant, { why: sel.why, label: sel.chosenLabel, runId: sel.chosenRunId, experience });
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
summary.errors.push(`could not add to the library: ${error instanceof Error ? error.message : String(error)}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
summary.usd = Math.round((result.ledger.usd() + sel.usd) * 1e6) / 1e6;
|
|
148
|
+
const ok = summary.recursion.ok && sel.ok && Boolean(sel.chosenLabel) && !summary.errors.length;
|
|
149
|
+
return finish(ok ? 'ok' : sel.chosenLabel ? 'partial' : 'failed');
|
|
150
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type Variant } from "../variant/surface.js";
|
|
2
|
+
import type { Experience } from "./library.js";
|
|
3
|
+
import { type Executor, type Improver, type RefineTask, type Rollout } from "./types.js";
|
|
4
|
+
export interface Selection {
|
|
5
|
+
taskId: string;
|
|
6
|
+
mode: 'agg' | 'seq';
|
|
7
|
+
k: number;
|
|
8
|
+
chosenId: string;
|
|
9
|
+
chosenLabel: string;
|
|
10
|
+
chosenRunId: string;
|
|
11
|
+
chosenDir: string;
|
|
12
|
+
why: string;
|
|
13
|
+
idMap: Record<string, string>;
|
|
14
|
+
dropped: string[];
|
|
15
|
+
candidates: number;
|
|
16
|
+
ok: boolean;
|
|
17
|
+
fallback: boolean;
|
|
18
|
+
trivial: boolean;
|
|
19
|
+
error: string;
|
|
20
|
+
usd: number;
|
|
21
|
+
experience: Partial<Experience>;
|
|
22
|
+
}
|
|
23
|
+
/** A..Z, AA..AZ, BA...: always accepted by the choice parser. */
|
|
24
|
+
export declare function anonId(index: number): string;
|
|
25
|
+
/** anon id → label, by canonical sort then a seeded shuffle. */
|
|
26
|
+
export declare function assignIds(labels: readonly string[], taskId: string, k: number, mode: string): Record<string, string>;
|
|
27
|
+
/** Exactly the k finals of a mode: agg1..aggk or c1..ck. The base executions are never in it. */
|
|
28
|
+
export declare function selectionPool(mode: 'agg' | 'seq', k: number, rollouts: Record<string, Rollout>): Record<string, Rollout>;
|
|
29
|
+
export interface SelectInput {
|
|
30
|
+
task: RefineTask;
|
|
31
|
+
k: number;
|
|
32
|
+
mode: 'agg' | 'seq';
|
|
33
|
+
candidates: Record<string, Rollout>;
|
|
34
|
+
executor: Executor;
|
|
35
|
+
improver: Improver;
|
|
36
|
+
workDir: string;
|
|
37
|
+
signal?: AbortSignal;
|
|
38
|
+
}
|
|
39
|
+
/** Picks one output. A selector failure falls back to the first final and never throws. */
|
|
40
|
+
export declare function runSelection(input: SelectInput): Promise<Selection>;
|
|
41
|
+
/** Delivers the single k=1 final without a selector session. */
|
|
42
|
+
export declare function trivialSelection(input: Omit<SelectInput, 'improver' | 'signal'>): Selection;
|
|
43
|
+
export interface ReflectInput {
|
|
44
|
+
task: RefineTask;
|
|
45
|
+
selection: Selection;
|
|
46
|
+
rollouts: Record<string, Rollout>;
|
|
47
|
+
executor: Executor;
|
|
48
|
+
improver: Improver;
|
|
49
|
+
workDir: string;
|
|
50
|
+
baseVariant: Variant;
|
|
51
|
+
decisions?: Record<string, string>;
|
|
52
|
+
signal?: AbortSignal;
|
|
53
|
+
}
|
|
54
|
+
/** Learns from the edits, decisions, trajectories and outputs after adoption. Never throws. */
|
|
55
|
+
export declare function reflectAdoption(input: ReflectInput): Promise<Partial<Experience>>;
|
|
56
|
+
/** Reads `<edits>` and `<experience>` blocks. A reply without a supported lesson gives only the edits. */
|
|
57
|
+
export declare function parseExperience(text: string): Partial<Experience>;
|