@xingular/harness 0.1.7 → 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 +97 -1
- package/LICENSE +202 -0
- package/NOTICE.md +22 -0
- package/README.md +187 -85
- package/THIRD_PARTY_LICENSES.md +942 -0
- package/dist/cli.js +13701 -13498
- 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 +808 -151
- package/docs/README.md +22 -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-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 +473 -56
- package/package.json +43 -13
- package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
- package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
- package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
- package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
- package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
- package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
- package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
- package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
- package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
- package/src/accounts/accounts.test.ts +0 -333
- package/src/accounts/accounts.ts +0 -658
- package/src/accounts/env.test.ts +0 -95
- package/src/accounts/env.ts +0 -338
- package/src/accounts/secrets.ts +0 -50
- package/src/accounts/store.ts +0 -338
- package/src/capabilities/api.ts +0 -75
- package/src/capabilities/runSnapshot.ts +0 -59
- package/src/capabilities/types.ts +0 -34
- package/src/cli.ts +0 -118
- package/src/core/bus.ts +0 -34
- package/src/core/changes.ts +0 -33
- package/src/core/env.ts +0 -27
- package/src/core/errors.ts +0 -32
- package/src/core/frontmatter.ts +0 -47
- package/src/core/fs.test.ts +0 -38
- package/src/core/fs.ts +0 -92
- package/src/core/index.ts +0 -193
- package/src/core/path.test.ts +0 -14
- package/src/core/path.ts +0 -79
- package/src/core/projects.ts +0 -90
- package/src/core/text.ts +0 -39
- package/src/harness.ts +0 -312
- package/src/hub/catalog.json +0 -123
- package/src/hub/cli.ts +0 -59
- package/src/hub/hub.test.ts +0 -205
- package/src/hub/hub.ts +0 -256
- package/src/hub/schema.ts +0 -81
- package/src/index.ts +0 -75
- package/src/mcp/connections.ts +0 -614
- package/src/mcp/manager.ts +0 -130
- package/src/mcp/oauth.ts +0 -195
- package/src/mcp/scopeMigration.test.ts +0 -79
- package/src/mcp/scopeMigration.ts +0 -204
- package/src/mcp/service.test.ts +0 -376
- package/src/mcp/service.ts +0 -549
- package/src/mcp/types.ts +0 -108
- package/src/memory/api.test.ts +0 -82
- package/src/memory/api.ts +0 -303
- package/src/memory/blocks.test.ts +0 -78
- package/src/memory/blocks.ts +0 -408
- package/src/memory/caller.ts +0 -69
- package/src/memory/curation.test.ts +0 -163
- package/src/memory/curation.ts +0 -64
- package/src/memory/dispatch.ts +0 -59
- package/src/memory/facts.test.ts +0 -41
- package/src/memory/facts.ts +0 -248
- package/src/memory/graph.ts +0 -103
- package/src/memory/health.test.ts +0 -130
- package/src/memory/health.ts +0 -74
- package/src/memory/maintainer.ts +0 -272
- package/src/memory/maintenance.test.ts +0 -176
- package/src/memory/maintenance.ts +0 -518
- package/src/memory/migrate.ts +0 -79
- package/src/memory/operations.ts +0 -150
- package/src/memory/proposals.test.ts +0 -168
- package/src/memory/proposals.ts +0 -584
- package/src/memory/recall.test.ts +0 -115
- package/src/memory/recall.ts +0 -278
- package/src/memory/references.ts +0 -77
- package/src/memory/runContext.ts +0 -93
- package/src/memory/secrets.ts +0 -6
- package/src/memory/store.test.ts +0 -66
- package/src/memory/store.ts +0 -385
- package/src/memory/wiki.test.ts +0 -47
- package/src/memory/wiki.ts +0 -422
- package/src/memory/wikiIndex.test.ts +0 -88
- package/src/memory/wikiIndex.ts +0 -116
- package/src/plugins/api.ts +0 -181
- package/src/plugins/attachments.test.ts +0 -84
- package/src/plugins/attachments.ts +0 -141
- package/src/plugins/builtin.ts +0 -82
- package/src/plugins/catalogue.test.ts +0 -254
- package/src/plugins/catalogue.ts +0 -251
- package/src/plugins/cli.ts +0 -184
- package/src/plugins/discover.ts +0 -151
- package/src/plugins/firstParty.test.ts +0 -143
- package/src/plugins/firstParty.ts +0 -129
- package/src/plugins/hooks.test.ts +0 -250
- package/src/plugins/hooks.ts +0 -239
- package/src/plugins/identity.ts +0 -37
- package/src/plugins/install.test.ts +0 -107
- package/src/plugins/install.ts +0 -106
- package/src/plugins/inventory.ts +0 -123
- package/src/plugins/manifest.ts +0 -76
- package/src/plugins/plugins.test.ts +0 -205
- package/src/plugins/plugins.ts +0 -189
- package/src/plugins/proposal.ts +0 -121
- package/src/plugins/runtime.test.ts +0 -40
- package/src/plugins/runtime.ts +0 -82
- package/src/plugins/trust.ts +0 -142
- package/src/plugins/types.ts +0 -149
- package/src/prompt/compile.test.ts +0 -261
- package/src/prompt/compile.ts +0 -732
- package/src/server/methods.ts +0 -349
- package/src/server/remote.ts +0 -77
- package/src/server/rpc.ts +0 -116
- package/src/server/serve.ts +0 -28
- package/src/server/server.test.ts +0 -174
- package/src/sessions/approvals.ts +0 -118
- package/src/sessions/contracts.ts +0 -336
- package/src/sessions/conversation.test.ts +0 -177
- package/src/sessions/extensionSession.test.ts +0 -74
- package/src/sessions/extensionUi.test.ts +0 -65
- package/src/sessions/extensionUi.ts +0 -102
- package/src/sessions/history.ts +0 -51
- package/src/sessions/lineageJoin.ts +0 -75
- package/src/sessions/policy.ts +0 -36
- package/src/sessions/pricing.ts +0 -60
- package/src/sessions/questionBatches.test.ts +0 -110
- package/src/sessions/reasoningSummaries.ts +0 -59
- package/src/sessions/registry.ts +0 -381
- package/src/sessions/runIndex.ts +0 -99
- package/src/sessions/runStore.test.ts +0 -152
- package/src/sessions/runStore.ts +0 -332
- package/src/sessions/runner.ts +0 -604
- package/src/sessions/runtimeResources.test.ts +0 -61
- package/src/sessions/sessions.test.ts +0 -549
- package/src/sessions/sessions.ts +0 -339
- package/src/skills/registry.test.ts +0 -104
- package/src/skills/registry.ts +0 -413
- package/src/terminal/accountsMenu.test.ts +0 -225
- package/src/terminal/accountsMenu.ts +0 -382
- package/src/terminal/cli.ts +0 -149
- package/src/terminal/client.ts +0 -74
- package/src/terminal/control.test.ts +0 -23
- package/src/terminal/control.ts +0 -23
- package/src/terminal/controller.ts +0 -291
- package/src/terminal/hubMenu.ts +0 -24
- package/src/terminal/launch.test.ts +0 -25
- package/src/terminal/launch.ts +0 -48
- package/src/terminal/piExtension.lifecycle.test.ts +0 -55
- package/src/terminal/piExtension.ts +0 -259
- package/src/terminal/pluginControl.test.ts +0 -146
- package/src/terminal/pluginMenu.ts +0 -112
- package/src/terminal/socket.test.ts +0 -71
- package/src/terminal/socket.ts +0 -232
- package/src/terminal/standalone.test.ts +0 -167
- package/src/terminal/standalone.ts +0 -153
- package/src/terminal/terminal.test.ts +0 -399
- package/src/terminal/terminals.ts +0 -553
- package/src/terminal/tui/application.test.ts +0 -114
- package/src/terminal/tui/application.ts +0 -491
- package/src/terminal/tui/commands.test.ts +0 -218
- package/src/terminal/tui/commands.ts +0 -361
- package/src/terminal/tui/dialogs.ts +0 -301
- package/src/terminal/tui/editor.test.ts +0 -84
- package/src/terminal/tui/editor.ts +0 -79
- package/src/terminal/tui/keybindings.test.ts +0 -22
- package/src/terminal/tui/keybindings.ts +0 -50
- package/src/terminal/tui/piAdapter.ts +0 -62
- package/src/terminal/tui/presentation.test.ts +0 -79
- package/src/terminal/tui/questions.test.ts +0 -41
- package/src/terminal/tui/questions.ts +0 -47
- package/src/terminal/tui/runtime.socket.test.ts +0 -104
- package/src/terminal/tui/runtime.test.ts +0 -215
- package/src/terminal/tui/runtime.ts +0 -388
- package/src/terminal/tui/sessionUi.ts +0 -24
- package/src/terminal/tui/settings.test.ts +0 -150
- package/src/terminal/tui/settings.ts +0 -188
- package/src/terminal/tui/status.test.ts +0 -70
- package/src/terminal/tui/status.ts +0 -109
- package/src/terminal/tui/theme.ts +0 -174
- package/src/terminal/tui/tools.test.ts +0 -145
- package/src/terminal/tui/tools.ts +0 -142
- package/src/terminal/tui/transcript.test.ts +0 -25
- package/src/terminal/tui/transcript.ts +0 -124
- package/src/terminal/tui/ui.test.ts +0 -313
- package/src/terminal/tui/ui.ts +0 -166
- package/src/terminal/tui/welcome.ts +0 -102
- package/src/tools/askUser.test.ts +0 -69
- package/src/tools/askUser.ts +0 -59
- package/src/tools/definitions.ts +0 -187
- package/src/tools/maintenance.ts +0 -24
- package/src/tools/memoryTools.ts +0 -22
- package/src/tools/pluginPropose.ts +0 -41
- package/src/tools/registryWrite.test.ts +0 -101
- package/src/tools/registryWrite.ts +0 -182
- package/src/tools/spawnSubagent.ts +0 -92
- package/src/tools/types.ts +0 -39
- package/src/web/safeRequest.ts +0 -171
- package/src/web/text.ts +0 -53
- package/src/web/tools.ts +0 -134
- package/src/web/web.test.ts +0 -141
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Wide comparison matrix
|
|
2
|
+
|
|
3
|
+
One row per source per arm; ≤12 words per cell, verbs first. Detail and
|
|
4
|
+
citations live in the arm docs; this page is an index, not the analysis.
|
|
5
|
+
|
|
6
|
+
| Arm | this harness | opencode | omp (pi fork) | dsh | harness² | swe-agent | openhands SDK | kimi-cli | smolagents | claude-code |
|
|
7
|
+
|---|---|---|---|---|---|---|---|---|---|---|
|
|
8
|
+
| 01 prompt | compile.ts only; stable prefix + hidden context updates | template + deltas appended to history | parallel compiler; two-block cache; static invariant | ordered per-step sections + user snapshot | tree IS prompt, capped always-on | yaml config templates | pending | pending | step-log replay | CLAUDE.md hierarchy (pending) |
|
|
9
|
+
| 02 tools | providers + per-call gate; `{product}` | Effect plugins, codemode, MCP names | 30 rich builtin tools, tiers | defineTool registry, PTC mode | editable c4 guidance | YAML string bundles | pending | kosong abstract layer (archived) | code actions, @tool | descriptions answer how (pending) |
|
|
10
|
+
| 03 subagents | fresh run children + delivery receipts | subagent tool, fresh sessions, description route | task tool, worktree isolation, speculative | spawn/fork service, continuable | c5 own-context text agents | runs only | per-container opens | pending | none in-source | agents files (pending) |
|
|
11
|
+
| 04 skills | c6 tree skills, trust-gated loader | depth-6 scan, skill lazy-load | manage_skill; memory writes skills | durable capped catalog + skill tool | trigger lines validated | procedures via bundles | microagents (pending) | klips dir | prompt templates | SKILL.md (pending) |
|
|
12
|
+
| 05 context | context message + budgets | compaction agent, fixed template, verbatim tail | method ladder, snapcompact deterministic | formula trigger, prune first, FTS5 query | replica-era limits, trim-to-pay | bounded single shots | condensers pending | pending | full replay memory | auto-compact (pending) |
|
|
13
|
+
| 06 memory | wiki notes on file writes; guarded refine lane | none visible | 5 backends, two-phase consolidation, MEMORY.md | durability only: spill/todo/deliverables | per-domain experience library | none | pending | pending | step log | memory files (pending) |
|
|
14
|
+
| 07 governance | gate last; standing + single-use | per-leaf asserts, always/deny/ask | tier×policy, fails closed | pre-execute pipeline + guard | substrate-dependent | curated blocklists | confirmation policy | archived | executor = gate | permission modes (pending) |
|
|
15
|
+
| 08 execution | account-isolated sessions; host PTY | shell tool + separate pty daemon | in-process rust unix env | sandbox classes + single executor | substrate workspace | container env | workspace containers | kaos (archived) | intercepted exec | desktop app (pending) |
|
|
16
|
+
| 09 observability | runStore-only validated events | bus + UsageRecorded | stats dashboard + ledgers | OTel transport only, FEEDBACK_ONLY | runmark + reports | trajectories + inspector | event stream | klips vis | monitor.py | sentry optional |
|
|
17
|
+
| 10 refinement | ported harness² core (arm 10) | none | autoresearch hillclimb loop | none found | editor→probe→compose + reflector | IC design lessons | none found | archived | none | plan mode only |
|
|
18
|
+
|
|
19
|
+
Fill rule for later passes: replace `pending` from each source note's audit;
|
|
20
|
+
mark archived designs and reference the note.
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Arm 01 — System prompt / context assembly
|
|
2
|
+
|
|
3
|
+
Status: **core four audited** (opencode, omp, dsh, harness²); swe-agent,
|
|
4
|
+
openhands, kimi-cli, smolagents, claude-code pending.
|
|
5
|
+
Sources audited by explorer agents with citations; my own spot-checks marked.
|
|
6
|
+
|
|
7
|
+
Shape: design space → per-source comparison → trade-offs → adoption candidates.
|
|
8
|
+
|
|
9
|
+
## 1. Design space
|
|
10
|
+
|
|
11
|
+
Where the model's instructions come from when a session starts, and how they
|
|
12
|
+
evolve mid-session. Sub-decisions:
|
|
13
|
+
|
|
14
|
+
1. **Assembly location** — one compiler, a grid-like assembler, or a template
|
|
15
|
+
engine? Who is *allowed* to contribute (core only, plugins, file discovery)?
|
|
16
|
+
2. **Static vs dynamic** — what is identical across calls of a session (or across
|
|
17
|
+
sessions, for cross-session cache) vs what must be refreshed; and *where* each
|
|
18
|
+
is injected (system message at node 0, later system messages, user messages
|
|
19
|
+
after history, synthetic messages inside history).
|
|
20
|
+
3. **Reach of instructions** — always-on prose vs skills vs hooks vs scripts;
|
|
21
|
+
caps and budget language.
|
|
22
|
+
4. **Cache discipline** — prefix stability, cache breakpoints, proactive
|
|
23
|
+
warming, append-only updates.
|
|
24
|
+
5. **Editability/versioning** — how the tree of instruction files is versioned
|
|
25
|
+
or validated (this harness: never edit, only supersede).
|
|
26
|
+
|
|
27
|
+
## 2. Comparison
|
|
28
|
+
|
|
29
|
+
### this harness (reference point)
|
|
30
|
+
|
|
31
|
+
- The prompt is assembled only in `src/prompt/compile.ts`; sessions launch with a
|
|
32
|
+
stable system prefix plus a hidden `xingular-context` message appended to
|
|
33
|
+
native history for changing state (repo rules; `AGENTS.md`). Tree sections
|
|
34
|
+
c1–c8 are versioned; c1–c4 always-on and capped/validated (`tree/tree.ts`);
|
|
35
|
+
a version is never edited, only superseded (`tree/store.ts`).
|
|
36
|
+
|
|
37
|
+
### opencode — compiler + instruction deltas
|
|
38
|
+
|
|
39
|
+
- Small text template with a tool-guidance placeholder, rendered per tool list
|
|
40
|
+
(`external/opencode/packages/core/src/session/system-prompt.ts:9-27`; the
|
|
41
|
+
template is `session/runner/prompt/system.txt`).
|
|
42
|
+
- Per-step transcript: system = agent template **plus an instruction baseline as
|
|
43
|
+
a second system part**; messages = history (`.../session/model-request.ts:99-119`).
|
|
44
|
+
- Instruction sources composed in a fixed order (codemode catalog, MCP,
|
|
45
|
+
references, skills, AGENTS.md discovery, builtins, API entries) with a comment
|
|
46
|
+
stating the order keeps "a reusable prompt-cache prefix"
|
|
47
|
+
(`.../session/context.ts:137-166`, comment at 152-154).
|
|
48
|
+
- Dynamic updates are **appended as system messages after history, before the
|
|
49
|
+
new user prompt**: AGENTS.md changes render as a unidiff patch or a full
|
|
50
|
+
rewrite; date/env/codeMode changes likewise (`.../session/generate.ts:53-57`,
|
|
51
|
+
`.../session/instruction-discovery.ts:127-149`, `.../session/builtins.ts:30-52`).
|
|
52
|
+
- Discovery: global file, ancestor walk, configured globs/URLs, watcher-driven
|
|
53
|
+
reload; **no size caps found** in the discovered files (auditor: unverified
|
|
54
|
+
beyond those files) (`.../config/plugin/instruction.ts:51-62,143-225`).
|
|
55
|
+
- On-demand AGENTS.md: the `read` tool injects ancestors as synthetic history
|
|
56
|
+
messages deduped by metadata (`.../tool/plugin/read.ts:82-104` →
|
|
57
|
+
`.../session/instructions.ts:74-79`).
|
|
58
|
+
- Cache hygiene: stable `promptCacheKey` from session affinity
|
|
59
|
+
(`.../model-request.ts:294-295`), tool definitions kept on the final step to
|
|
60
|
+
preserve the prefix (`.../runner/llm.ts:237`), prefix-stable image elision
|
|
61
|
+
(`.../model-request.ts:199-207`).
|
|
62
|
+
- Plugins get a per-request hook over `system`, `messages`, `tools`, `options`,
|
|
63
|
+
with tool-identity matching to prevent hook-invented tools
|
|
64
|
+
(`.../model-request.ts:236-320`, `packages/plugin/src/effect/session.ts:25-36`).
|
|
65
|
+
|
|
66
|
+
### omp (oh-my-pi) — parallel compiler with deadlines, two-block cache
|
|
67
|
+
|
|
68
|
+
- `buildSystemPrompt` fans out **timed, parallel** preparation (project context
|
|
69
|
+
files, skills, workspace tree, active-repo context, personality; each with a
|
|
70
|
+
deadline fallback) (`external/omp/packages/coding-agent/src/system-prompt.ts:630,723-848,954-1009`).
|
|
71
|
+
- All prompt text lives in `.md` Handlebars templates, imported `{type:"text"}` —
|
|
72
|
+
repo rule "Prompts never in code"
|
|
73
|
+
(`.../system-prompt.ts:24-31`, `.../prompts/system/system-prompt.md`).
|
|
74
|
+
- **Stable prefix is a separate entry**: the default body renders as block 0;
|
|
75
|
+
`<project-context>` is appended as a *second prompt entry* so the static
|
|
76
|
+
prefix is shared across directories — with the comment that the Anthropic head
|
|
77
|
+
cache breakpoint lands right before it (`.../system-prompt.ts:1026-1036`).
|
|
78
|
+
- **Volatile content (date/cwd) was deliberately moved out of the system
|
|
79
|
+
prompt** because it "invalidated the whole tool array"; now injected onto the
|
|
80
|
+
first user turn per request, append-only, with a synthetic developer turn when
|
|
81
|
+
no new user turn exists (`.../session/date-cwd-reminder.ts:1-11,50-129`;
|
|
82
|
+
wired at `.../sdk.ts:4333-4340`).
|
|
83
|
+
**Verified in person**: `.../date-cwd-reminder.ts:1-12` — header comment states
|
|
84
|
+
the reason (open-weight chat templates render tool schemas *after* system
|
|
85
|
+
content, so a volatile tail invalidates the whole tool array), and lines 44-48
|
|
86
|
+
guarantee append-only injection: changed values attach to a newly appended
|
|
87
|
+
user turn, leaving every earlier message byte-identical.
|
|
88
|
+
- Instructions arrive via a **capability API**, not hard-coding:
|
|
89
|
+
`contextFileCapability` (project AGENTS.md family with dedupe), `systemPromptCapability`
|
|
90
|
+
(SYSTEM.md override), `instructionCapability` — extensions add content through
|
|
91
|
+
named slots (`.../capability/context-file.ts:26-56`,
|
|
92
|
+
`.../capability/system-prompt.ts:31`).
|
|
93
|
+
- Cache: `CacheWarmer` replays requests at ~90% of cache lifetime when savings
|
|
94
|
+
clear a floor (`.../session/cache-warmer.ts:1-17`); per-component token
|
|
95
|
+
usage breakdown (`systemPromptTokens`, `skillsTokens`, …,
|
|
96
|
+
`.../session/agent-session-types.ts:529-535`); truncating MCP server
|
|
97
|
+
instructions invalidates the tools cache breakpoint (`.../sdk.ts:1374-1375`).
|
|
98
|
+
- `metaharness` is **not** runtime prompt machinery: it is their benchmark
|
|
99
|
+
manager (Harbor/SnapCompact experiments over one SQLite store; runner note at
|
|
100
|
+
`.../packages/metaharness/src/runner.ts:1257-1258`). Their word "harness" in
|
|
101
|
+
`metaharness` = a harness around the harness, for measurement.
|
|
102
|
+
|
|
103
|
+
### deepseek-harness (dsh) — ordered sections, snapshot-as-user-message
|
|
104
|
+
|
|
105
|
+
- Own package `packages/core/system-prompt`; assembled **per step** via an
|
|
106
|
+
ordered "waterfall" of sections/context entries
|
|
107
|
+
(`external/deepseek-harness/packages/core/system-prompt/src/index.ts:429,677-680`,
|
|
108
|
+
`.../agent-loop/src/agent.ts:272,407`).
|
|
109
|
+
- **Plugin contribution contract**: `ctx.systemPrompt.section()`, `.context()`,
|
|
110
|
+
`.tools(provider)`, `.variable(name, provider)` — sections are sorted by
|
|
111
|
+
numeric `order` then name, duplicates throw, scoped entries shadow globals,
|
|
112
|
+
and a `complete: true` section replaces everything else
|
|
113
|
+
(`.../system-prompt/src/index.ts:53-76,131-179,478-570,653-686`; shadowing
|
|
114
|
+
tested in `.../system-prompt/tests/scoped.spec.ts:33`).
|
|
115
|
+
- Static = section text at node 0 (identity fixed in code, `index.ts:449-466`);
|
|
116
|
+
dynamic facts (cwd, sandbox policy, time, plan) are `PromptContext` entries,
|
|
117
|
+
re-resolved per request and appended as a **durable user-role message**
|
|
118
|
+
headed "Current runtime context. This snapshot supersedes earlier…"
|
|
119
|
+
(`.../index.ts:314-318,582-602`, `.../agent-loop/src/agent.ts:411,429-440`).
|
|
120
|
+
- Workspace instructions also inject into history as sourced `user/message`
|
|
121
|
+
events, not system text (`.../packages/context/agent-instructions/README.md:88-103,158-186`).
|
|
122
|
+
- Tool ordering is part of prompt assembly: providers' tools are `structuredClone`d
|
|
123
|
+
and ordered by configured `toolOrder` with an `<unlisted-tools>` rest marker
|
|
124
|
+
(`.../system-prompt/src/index.ts:208-240,633-651,674`).
|
|
125
|
+
- Token metering as a service with fixed-density estimates
|
|
126
|
+
(`.../packages/llm/token-meter/src/index.ts:4-35`, `estimate.ts:16-27`).
|
|
127
|
+
|
|
128
|
+
### harness² — the tree is the prompt; caps and economics
|
|
129
|
+
|
|
130
|
+
- Their editable tree per substrate (here for opencode): `systemprompt.md` (c1),
|
|
131
|
+
always-on files with caps, skills loaded on demand, subagents in own context,
|
|
132
|
+
scripts, and a plugin acting inside the tool loop
|
|
133
|
+
(`external/harness2/harness2/core/prompts.py:424-453`).
|
|
134
|
+
- Always-on prose is framed as an **output-budget** cost: "ALWAYS-ON PROSE IS THE
|
|
135
|
+
EXPENSIVE OPTION… the most costly failure on this work is a run that reasons
|
|
136
|
+
until the budget is gone and produces nothing" (`.../prompts.py:129-146,455-458`).
|
|
137
|
+
- Validation discards a whole harness for: a skill without a trigger line naming
|
|
138
|
+
it in always-on text; template braces in always-on text (Jinja StrictUndefined);
|
|
139
|
+
a named script that is missing (`.../prompts.py:148-167`,
|
|
140
|
+
`.../core/tree.py:15-21` — caps, frontmatter rules per `SurfaceSpec`).
|
|
141
|
+
- Notably, their opencode-surface table labels components **c1–c8** — the same
|
|
142
|
+
eight-component numbering this harness uses (`.../prompts.py:424-431`). Both
|
|
143
|
+
projects have converged on the same tree taxonomy; treat as confirmation of
|
|
144
|
+
shape, not shared code.
|
|
145
|
+
- Instruction-bearing text is data, not branches: "Benchmark text arrives as
|
|
146
|
+
values, never as branches" (`.../prompts.py:15-20`) — prompt templates are
|
|
147
|
+
parameterized by a `BenchPrompts` value, and each new benchmark gets slots,
|
|
148
|
+
not edits. Answer-free framing is literally part of the prompt
|
|
149
|
+
(`ANSWER_FREE`, `.../prompts.py:38-44`).
|
|
150
|
+
|
|
151
|
+
### claude-code (from public material, no clone) — pending
|
|
152
|
+
|
|
153
|
+
CLAUDE.md hierarchy + `@` imports + `#` quick-memory; tool descriptions as the
|
|
154
|
+
home of usage guidance. To be filled with dated citations.
|
|
155
|
+
|
|
156
|
+
### swe-agent / openhands / kimi-cli / smolagents — pending
|
|
157
|
+
|
|
158
|
+
## 3. Trade-offs
|
|
159
|
+
|
|
160
|
+
- **Stable prefix vs fresh state.** Everyone converges on stable static +
|
|
161
|
+
appended dynamic. Two designs for the dynamic: (a) appended *system* messages
|
|
162
|
+
rendering deltas (opencode), (b) appended *user-role* context snapshot whose
|
|
163
|
+
text supersedes earlier ones (dsh). (a) is precise (a unidiff names what
|
|
164
|
+
changed); (b) is simpler and carries whole state per turn, at the cost of
|
|
165
|
+
re-sending unchanged facts.
|
|
166
|
+
- **Where volatile values live.** omp's lesson is the strongest: even one line
|
|
167
|
+
of date/cwd inside the system prompt invalidates far more than itself (it
|
|
168
|
+
invalidated the whole tool-array cache). Moving it into the user turn costs a
|
|
169
|
+
message but saves the prefix. dsh's snapshot approach (user message) has the
|
|
170
|
+
same property w.r.t. the system node.
|
|
171
|
+
- **Who may contribute.** Ordered, deterministic contribution with declared
|
|
172
|
+
order + name ties (dsh) vs deployment-order composition with a cache comment
|
|
173
|
+
(opencode) vs capability slots with dedupe (omp). The deterministic-order end
|
|
174
|
+
is friendlier to caching and to reasoning about plugins; the discovery end is
|
|
175
|
+
friendlier to "just drop a file in the repo" workflows but needs watcher-driven
|
|
176
|
+
reload and dedupe, and risks unbounded size (opencode has no caps).
|
|
177
|
+
- **Economics of always-on text.** harness² puts the sharpest numbers-language on
|
|
178
|
+
it: always-on prose competes with output budget; prefer on-demand forms. This
|
|
179
|
+
matches this harness's capped c1–c4, with the difference that harness² enforces
|
|
180
|
+
the "cut to pay" rule by validation and this harness by editor review.
|
|
181
|
+
- **Templates in code vs files.** omp keeps every word of prompt text in `.md`
|
|
182
|
+
templates; harness² inlines exact prompts as Python constants but keeps
|
|
183
|
+
benchmark text as values; dsh fixes identity prose in the constructor. Pure
|
|
184
|
+
style until a person wants to review/audit prompt diffs — then files win
|
|
185
|
+
(reviewable without code knowledge).
|
|
186
|
+
|
|
187
|
+
## 4. Adoption candidates (Tier 1 unless noted)
|
|
188
|
+
|
|
189
|
+
| # | Idea | From | Land as | Notes |
|
|
190
|
+
|---|---|---|---|---|
|
|
191
|
+
| A1 | Move volatile date/cwd out of the stable prefix into the first user turn (or the appended context message) | omp `date-cwd-reminder.ts` | prompt sections change in `src/prompt/compile.ts` | **verify our current placement first**; high cache value if our prefix carries date |
|
|
192
|
+
| A2 | Named, ordered prompt sections with deterministic order-name ties and duplicate-name rejection; scoped shadowing | dsh `system-prompt` contract | a rule inside plugin prompt sections (existing surface) | makes section ordering a contract instead of an implementation detail |
|
|
193
|
+
| A3 | Render instruction deltas as unidiff-style "what changed" text in the appended context message | opencode `instruction-state.ts` | the `xingular-context` hidden message mechanism | our channel exists; this is a rendering upgrade |
|
|
194
|
+
| A4 | Proactive cache warming near the provider's cache TTL | omp `cache-warmer.ts` | *not* a harness surface — host/app concern | Tier 2; needs measurement harness first (`probe-chat-cache-app.py` in the App) |
|
|
195
|
+
| A5 | Memory/prompts in reviewable template files rather than inline strings | omp rule | none now — style guidance for future prompt text | Tier 2, low cost, no behavior change |
|
|
196
|
+
|
|
197
|
+
Carry later: opencode's "no caps on discovered instructions" as an anti-pattern to
|
|
198
|
+
contrast with c1–c4 caps; harness²'s three discard rules (trigger line, no
|
|
199
|
+
template braces, shipped scripts) when tree validation is next touched (arm 04).
|
|
200
|
+
Also carry:
|
|
201
|
+
- **Model-conditioned policy as data.** omp forbids model-conditional branching in
|
|
202
|
+
code entirely — no `id.includes("claude")`; all model/provider policy lives in a
|
|
203
|
+
declarative KDL rule tree compiled to `rules.json`
|
|
204
|
+
(`external/omp/AGENTS.md` — "Model/Provider Policy Lives in KDL"). opencode
|
|
205
|
+
instead ships per-model prompt adjustments as *plugins*
|
|
206
|
+
(`external/opencode/packages/plugin/plugin/optimize.ts:16-86` — confirmed by
|
|
207
|
+
explorer audit). Same problem (per-model prompt/policy deltas), two answers:
|
|
208
|
+
data tables vs evaluated plugins.
|
|
209
|
+
- omp's **judge-questions convention** — per-feature JSON mapping question ids →
|
|
210
|
+
`{instructions, criteria?}` — is source material for arm 10 (refinement) and
|
|
211
|
+
its answer-free selector.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Arm 02 — Tools
|
|
2
|
+
|
|
3
|
+
Status: **core four audited** (opencode, omp, dsh + harness²/tree, smolagents,
|
|
4
|
+
swe-agent in person); kimi-cli archived; claude-code openhands pending.
|
|
5
|
+
|
|
6
|
+
## Design space
|
|
7
|
+
|
|
8
|
+
How tools are declared (interface & schema origin), described (who writes the
|
|
9
|
+
model-facing guidance), provided (core vs provider vs plugin vs MCP), named and
|
|
10
|
+
ordered (namespacing, `toolOrder`), gated (tier/policy/event pipeline), and
|
|
11
|
+
whether tools are JSON calls at all — or the model writes code that calls them
|
|
12
|
+
(codemode / PTC / CodeAct).
|
|
13
|
+
|
|
14
|
+
## 1. Comparison
|
|
15
|
+
|
|
16
|
+
| Source | Declaration | Gating | Calls |
|
|
17
|
+
|---|---|---|---|
|
|
18
|
+
| this harness | provider extension points; `describeTool` fills `{product}`; definitions in `src/tools/definitions.ts`, dispatch in `src/tools/dispatch.ts` | per-call gate, last extension to see a call | JSON + limited code tool |
|
|
19
|
+
| opencode | internal Effect plugins registering via `ctx.tool.transform(editor.add)`; `Tool.Info{input,execute,output,options{namespace,permission,codemode,pinned}}` | per-leaf `Permission.assert` (`allow\|deny\|ask`, `findLast` wildcard match, default ask; agent rules∪session; missing agent denies) | JSON by default, `codemode:true` folds tools into a code catalog |
|
|
20
|
+
| omp | 30 builtins; rich `AgentTool` (approval tier read\|write\|exec, loadMode, docTopics, per-call concurrency, speculation) | tier × per-tool policy `allow\|deny\|prompt`, modes `always-ask\|write\|yolo`; **fails closed** | JSON; speculative pre-dispatch |
|
|
21
|
+
| dsh | `defineTool` into `ctx.tools`; ToolRuntime self-feeds the system prompt via `.tools(provider)` | fixed pipeline `pre-execute(allow/deny/ask) → ctx.tools.guard() → execute → post-execute → result` | `mode: native` (all schemas) vs `ptc` (model sees only `run_code` + SDK) |
|
|
22
|
+
| harness² | tools = part of the editable tree, c4 tool guidance prose | whatever the agent's substrate does | JSON (substrate tools) |
|
|
23
|
+
| swe-agent | YAML bundles: `signature`/`docstring`/arguments; string parsing; `state_command` for interface state | curated blocklists in bundles | text commands into a stateful shell |
|
|
24
|
+
| smolagents | `@tool` decorated functions, schema from type hints, validated at init | none in-source (executor sandbox is the gate) | **code actions**; MCP tools bridged into code |
|
|
25
|
+
| kimi-cli | kosong async tool-orchestration abstraction (archived) | — | JSON |
|
|
26
|
+
|
|
27
|
+
Citations: opencode `external/opencode/packages/core/src/tool/plugin/subagent.ts:100-107`,
|
|
28
|
+
`.../tool.ts:161-291,233,293-296`, `.../permission.ts:87-97,158-172`,
|
|
29
|
+
`.../tool/runtime.ts:276-281`, `.../tool/mcp.ts:20-21,52-75`;
|
|
30
|
+
omp `external/omp/packages/agent/src/types.ts:1129-1243`,
|
|
31
|
+
`.../tools/approval.ts:17-18,53-84,100`, `.../tools/builtin-names.ts:1-36`;
|
|
32
|
+
dsh `external/deepseek-harness/packages/core/tools/README.md:30-109`,
|
|
33
|
+
`.../core/tools/src/index.ts:608-612,857,1513-1527`,
|
|
34
|
+
`.../core/system-prompt/README.md:50-52`; swe-agent
|
|
35
|
+
`external/swe-agent/tools/windowed/config.yaml:1-40`; smolagents
|
|
36
|
+
`external/smolagents/src/smolagents/tools.py` (init validation),
|
|
37
|
+
`.../tool_validation.py`.
|
|
38
|
+
|
|
39
|
+
Instruction-bearing descriptions: opencode embeds whole prose instructions in
|
|
40
|
+
tool descriptions, e.g. the never-poll rule for subagents
|
|
41
|
+
(`.../tool/plugin/subagent.ts:44-47`) and todo's full-file description imported
|
|
42
|
+
verbatim (`.../tool/todowrite.txt`, `.../tool/plugin/todo.ts:12`) — matching
|
|
43
|
+
the claude-code school. omp instead renders descriptions from static `.md`
|
|
44
|
+
templates (`.../tools/read.ts:975-996`; "prompts never in code"). dsh's `ptc`
|
|
45
|
+
moves *all* tool knowledge out of schemas into a generated SDK plus
|
|
46
|
+
`executionInstructions` (`.../core/tools/README.md:68-81`).
|
|
47
|
+
|
|
48
|
+
## 2. Trade-offs
|
|
49
|
+
|
|
50
|
+
- **Tool descriptions = prime instruction real estate.** Every source pushes how-to
|
|
51
|
+
into descriptions; the divergence is *where the text lives*: inline strings
|
|
52
|
+
(opencode), md templates (omp, self-documenting diffs), schema-erased SDKs (dsh
|
|
53
|
+
ptc). md templates are cheapest to audit; inline is cheapest to write.
|
|
54
|
+
- **Gate taxonomies.** omp's declared tier × policy is the most legible to users;
|
|
55
|
+
opencode's per-leaf asserts are the most composable (plugins wrap calls);
|
|
56
|
+
dsh's pipeline events generalize hooks at the cost of indirection. All three
|
|
57
|
+
(and ours) converge on `ask` as a first-class outcome that surfaces to a person.
|
|
58
|
+
- **`toolOrder`/namespacing.** dsh validates order config at assembly with a
|
|
59
|
+
reserved rest margin; opencode mints `server_tool` names with dotted→underscore
|
|
60
|
+
namespaces; omp caps length at 64. Namespacing rules should be one place; ours
|
|
61
|
+
has MCP namespaces via the harness's own MCP integration — worth a contract
|
|
62
|
+
test, not new machinery.
|
|
63
|
+
- **Code-as-action in three strengths.** Full CodeAct (smolagents), opt-out
|
|
64
|
+
codemode (opencode), mode-switched PTC with SDK (dsh). All reduce schema token
|
|
65
|
+
cost and multi-call latency, all concentrate risk into the executor. For this
|
|
66
|
+
harness the gate is per-call and synchronous — free-form code actions are a
|
|
67
|
+
deliberate non-goal, but `codemode`-style *internal* catalogs remain open
|
|
68
|
+
behind existing tool providers.
|
|
69
|
+
|
|
70
|
+
## 3. Adoption candidates
|
|
71
|
+
| # | Idea | From | Land as | Tier |
|
|
72
|
+
|---|---|---|---|---|
|
|
73
|
+
| A1 | Per-tool **approval tier declaration** (read/write/exec) on the harness ToolSpec; gate consults it when policy is silent | omp `AgentTool.approval` | `ToolPolicy` surface + `src/tools/types.ts` | T1 |
|
|
74
|
+
| A2 | Tool **descriptions from template files** rendered per `{product}` (`.md` in repo, imported `type:"text"`) instead of inline string literals in tool definitions | omp | tool definitions (`src/tools/*`) | T1 |
|
|
75
|
+
| A3 | `toolOrder`-style validated ordering when a caller pins an explicit tool set (fail loudly on unknowns/missing rest-marker) | dsh | capability freezing at `sessions.run` | T2 |
|
|
76
|
+
| A4 | Restrict allow/deny masks scoped to a subexpression that intersect and lift on dispose | dsh `ctx.tools.restrict` | child-run capability narrowing (`capabilities.intersect` already does this — verify equivalence before adding) | T2 verify-first |
|
|
77
|
+
|
|
78
|
+
Anti-candidates: open-ended code-as-action for model-driven tools (gate model);
|
|
79
|
+
moving gating into per-tool hooks (gate stays the final authority layer).
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Arm 03 — Subagents
|
|
2
|
+
|
|
3
|
+
Status: **core four audited** (opencode, omp, dsh, plus our ADR-0003 lineage);
|
|
4
|
+
openhands/claude-code pending.
|
|
5
|
+
|
|
6
|
+
## Design space
|
|
7
|
+
|
|
8
|
+
Spawn model (tool vs scheduler vs server), child context (fresh, forked, or
|
|
9
|
+
continuable), isolation primitives (separate session, separate history, own
|
|
10
|
+
worktree/capabilities), delivery (block vs background + receipts), routing
|
|
11
|
+
(manual naming vs description-based auto-selection), and depth/capacity limits.
|
|
12
|
+
|
|
13
|
+
## Comparison
|
|
14
|
+
|
|
15
|
+
**this harness.** `spawn_subagent` + `wait_subagents` tools
|
|
16
|
+
(`src/tools/spawnSubagent.ts`): child is "a fresh child run for independent
|
|
17
|
+
work… no conversation history and no more capabilities than you"; spawn returns
|
|
18
|
+
the child run id immediately; results arrive **automatically before you finish**
|
|
19
|
+
(native-history delivery receipts per ADR-0003); 24k per-report cap
|
|
20
|
+
(`spawnSubagent.ts` `reported()`); depth limits live in
|
|
21
|
+
`src/sessions/subagents.ts` (exported constants). Architectural statement:
|
|
22
|
+
Architectural statement:
|
|
23
|
+
opaque-run children (runStore writes, opaque ids).
|
|
24
|
+
|
|
25
|
+
**opencode — subagent is a tool, not a scheduler.** Agents registry
|
|
26
|
+
(`mode: primary|subagent`) with selectability excluding subagents from direct
|
|
27
|
+
conversation (`.../core/src/agent.ts:74-75`). The `subagent` tool rejects
|
|
28
|
+
primaries/unknowns, enforces depth via config, asserts permission, then creates
|
|
29
|
+
a child session and prompts it "You are a subagent spawned by another session."
|
|
30
|
+
— **fresh context, nothing inherited** (`.../tool/plugin/subagent.ts:129-218`).
|
|
31
|
+
Foreground variant blocks and wraps the final text in
|
|
32
|
+
`<subagent sessionID=… state="completed">`; background replies immediately with
|
|
33
|
+
an explicit **never-poll instruction** and completion notification
|
|
34
|
+
(`.../subagent.ts:19-27,229-265`). **Routing is description-based**: a context
|
|
35
|
+
hook appends "Available subagents:" with each agent's own description to the
|
|
36
|
+
tool description (`.../subagent.ts:282-309`).
|
|
37
|
+
|
|
38
|
+
**omp — spawn machinery with isolation budgets.** The `task` tool; agent
|
|
39
|
+
definitions from bundled + `~/.omp/agent/agents/*.md` + `.omp/agents/*.md`
|
|
40
|
+
(`.../task/index.ts:4-10`). `SpawnRun` holds a semaphore permit and streams
|
|
41
|
+
progress; the owner adopts binding abort signal/sinks
|
|
42
|
+
(`.../task/spawn-run.ts:47-88`). **Speculative launch starts the child while
|
|
43
|
+
the `tasks[]` argument is still streaming** (`.../task/speculative-launch.ts`).
|
|
44
|
+
Isolation: pinned settings, advisor forced off, **mid-turn compaction forced on
|
|
45
|
+
(whole assignment is one turn)**, isolated runs get their own **worktree** and
|
|
46
|
+
may not expose roots outside it (`.../task/executor.ts:1132,4033-4055,4339`).
|
|
47
|
+
Structured children get `yield` to stream partial results
|
|
48
|
+
(`docs/task-agent-discovery.md:38`).
|
|
49
|
+
|
|
50
|
+
**dsh — services + backends, two child topologies.** `ctx.subagents` +
|
|
51
|
+
provider backends (local, ACP, Codex, Claude DSH-SDK) + a tool plugin
|
|
52
|
+
(`.../packages/subagent/README.md:27-35`). Spawn returns `started subagent
|
|
53
|
+
<childId>` immediately; a completion notice delivery later
|
|
54
|
+
(`.../tool-subagent/README.md:59`). `spawn` = fresh child; **`fork` = seeded
|
|
55
|
+
from the parent's completed history** (`.../subagent/README.md:28-29` — the one
|
|
56
|
+
source with tree-history in context children). Local children **continue
|
|
57
|
+
accepting messages** (cold-resume); external backends "execute once"
|
|
58
|
+
(`:12,61`). Defaults: 8 active, depth 1 (`.../subagent/README.md:53,49`).
|
|
59
|
+
The model names presets from an enum allowlist; **no description routing**
|
|
60
|
+
(`.../tool-subagent/README.md:52,68`).
|
|
61
|
+
|
|
62
|
+
**openhands (pending)** conversation-per-container REST server;
|
|
63
|
+
**claude-code (pending)** `.claude/agents/*.md` description routing.
|
|
64
|
+
|
|
65
|
+
## Trade-offs
|
|
66
|
+
|
|
67
|
+
- **Receipts vs block.** Ours receipts-then-auto-deliver; opencode's
|
|
68
|
+
foreground blocks and the background variant needs a no-poll instruction to
|
|
69
|
+
stop wasted loops — our "results arrive automatically" tool description does
|
|
70
|
+
the same thing natively. block variants pay latency, buy simplicity.
|
|
71
|
+
- **What the child sees.** Everyone defaults fresh. dsh's `fork` (parent history
|
|
72
|
+
as seed) is the only in-history-inherited design — powerful for "continue in
|
|
73
|
+
the main context's condition", dangerous for either prosecution
|
|
74
|
+
side-venting or slow joins; ours rejects it by `"no more capabilities than
|
|
75
|
+
you"` + fresh-run rule.
|
|
76
|
+
- **Isolation granularity.** worktree (omp isolated runs) is the strongest
|
|
77
|
+
world-isolation; ours ties isolation to account and run records instead. The
|
|
78
|
+
`tools` CSV narrowing idea maps to our `capabilities.intersect` — same
|
|
79
|
+
primitive, different vocabulary.
|
|
80
|
+
- **Routing.** Description-based auto-pick (opencode, and claude-code's docs)
|
|
81
|
+
puts all selection power in the model's reading; ours requires named briefs
|
|
82
|
+
and a Directory when names exist, which matches the opaque-id
|
|
83
|
+
contract (no names in the harness; names arrive via Directory).
|
|
84
|
+
|
|
85
|
+
## Adoption candidates
|
|
86
|
+
|
|
87
|
+
| # | Idea | From | Land as | Tier |
|
|
88
|
+
|---|---|---|---|---|
|
|
89
|
+
| S1 | Inject capability-set summaries (slots "Current subagents") into the tool description **when names exist via Directory**, instead of static description | opencode context hook | tool provider building the spawn tool's description | T2 (only if app supplies names) |
|
|
90
|
+
| S2 | Receipt text carries child tool limits next to the 24k cap (`reported()` already does this only implicitly; make the receipt self-describing) | ours (deficiency) | `spawnSubagent.ts` | T1 |
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Arm 04 — Skills & loading
|
|
2
|
+
|
|
3
|
+
Status: **three sources audited** (dsh, opencode, harness² + our tree);
|
|
4
|
+
omp's skill tool verified as builtin only (`manage_skill`); claude-code/openhands pending.
|
|
5
|
+
|
|
6
|
+
## Design space
|
|
7
|
+
|
|
8
|
+
Skill format and discovery, what ships in context (name+description only vs
|
|
9
|
+
whole body), how bodies are fetched (tool call vs command), trust (does loading
|
|
10
|
+
run code?), and the ruling constraint here: the harness is the only loader, with
|
|
11
|
+
extension discovery switched off.
|
|
12
|
+
|
|
13
|
+
## Comparison
|
|
14
|
+
|
|
15
|
+
**this harness.** Skills are part of the versioned tree (c6), loaded only when
|
|
16
|
+
their exact code is trusted (`src/tree/trust.ts`), surfaced via tree sections
|
|
17
|
+
and `Plugins.loading` (src/plugins/) — extension discovery is disabled; the
|
|
18
|
+
seed includes an `autotrigger` mechanism (`src/tree/tree.ts`, used by
|
|
19
|
+
`src/tree/seed.ts`) — skills may carry trigger conditions compiled into
|
|
20
|
+
always-on text.
|
|
21
|
+
|
|
22
|
+
**opencode.** `SKILL.md` files found by a depth-6 scan
|
|
23
|
+
(`.../core/src/config/plugin/skill-scan.ts:3,29`), also fetched from URL
|
|
24
|
+
indexes into a global dir (`.../skill/discovery.ts:112,194`); availability is
|
|
25
|
+
permission-gated (`.../skill.ts:33-34`). Progressive disclosure: instructions
|
|
26
|
+
list skills in system context; the `skill` tool lazily loads the body "when
|
|
27
|
+
the task at hand matches its description", including a sampled file list
|
|
28
|
+
(`.../tool/plugin/skill.ts:19-33`).
|
|
29
|
+
|
|
30
|
+
**omp.** `manage_skill` builtin (30 builtins list,
|
|
31
|
+
`.../tools/builtin-names.ts:24`); skills also **emitted as a product of memory
|
|
32
|
+
consolidation** (`docs/memory.md:78-88` — learned lessons land in `skills/` on
|
|
33
|
+
disk), an unusual write-back path. Trust/approval per separate ability loading
|
|
34
|
+
unverified.
|
|
35
|
+
|
|
36
|
+
**dsh.** The cleanest contract: before the first request the model receives a
|
|
37
|
+
**durable catalog** — "available skill names and capped descriptions"
|
|
38
|
+
(default cap 500 chars) — and loads body instructions through the `skill` tool;
|
|
39
|
+
`/name` invocation injects the same instructions the user named;
|
|
40
|
+
catalog changes append a **complete replacement** message, empty catalog retires
|
|
41
|
+
old names (`.../packages/skill/tool-skill/README.md:12,54-57`).
|
|
42
|
+
|
|
43
|
+
**harness² — the validation-first school.** Frontmatter requires `name:`
|
|
44
|
+
matching the directory and a `description:`; a malformed file is silently dropped
|
|
45
|
+
load if malformed (`.../core/prompts.py:113-115` in the tts pack: naming rules,
|
|
46
|
+
and `.../prompts.py:151-157`: "An unnamed skill is never opened anyway").
|
|
47
|
+
Its three discard rules (trigger line naming the skill in always-on text; no
|
|
48
|
+
template braces; shipped scripts travel with the skill,
|
|
49
|
+
`.../prompts.py:148-167`, `.../core/tree.py` validation) turn prompt-prose
|
|
50
|
+
conventions into machine-checks — the same philosophy as our `validate()`.
|
|
51
|
+
|
|
52
|
+
**claude-code / openhands (pending).** SKILL.md progressive disclosure spec and
|
|
53
|
+
SDK microagents respectively.
|
|
54
|
+
|
|
55
|
+
## Trade-offs
|
|
56
|
+
|
|
57
|
+
- **Catalog hygiene.** dsh's "complete replacement + empty retires" keeps
|
|
58
|
+
staleness windows near-zero on a cheap message; opencode's rescan keeps
|
|
59
|
+
file-truth simplicity. The durable-catalog variant is the better fit for our
|
|
60
|
+
file truth. The durable-catalog variant is the better fit for our
|
|
61
|
+
stable-prefix diagnostics (context updates could carry skill deltas).
|
|
62
|
+
- **Validation turns conventions into gates.** harness² proves skill trigger
|
|
63
|
+
lines and shipped scripts can be enforced mechanically; ours additionally
|
|
64
|
+
require trust for *code* — the sharpest position (everything model-visible is
|
|
65
|
+
a plugin, c8 loads only trusted content).
|
|
66
|
+
- **Cost shape.** Everyone: bodies are free until invoked; naming is the true
|
|
67
|
+
gate. An unnamed skill is dead weight in all four.
|
|
68
|
+
|
|
69
|
+
## Adoption candidates
|
|
70
|
+
|
|
71
|
+
| # | Idea | From | Land as | Tier |
|
|
72
|
+
|---|---|---|---|---|
|
|
73
|
+
| K1 | Emit a **skill catalog delta** (name + capped description) in the hidden `xingular-context` message instead of relying on static tree text alone, when trees change mid-run | dsh durable-catalog + our context-update channel | `src/prompt/compile.ts` context update contents | T2 |
|
|
74
|
+
| K2 | Adopt harness²'s three validation rules into `validate()` (trigger-line presence for skills; script existence paths already enforced, re-verify) | harness² | tree validation + tests | T1 verify-first |
|
|
75
|
+
| K3 | **Enforce skill trigger lines mechanically** (autotrigger already carries triggers; keep prose+code in sync) | both | `src/tree/tree.ts` validation | T1 verify-first |
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Arm 05 — Context management
|
|
2
|
+
|
|
3
|
+
Status: **core three audited** (opencode, omp, dsh); smolagents skeleton;
|
|
4
|
+
ours=pending inventory beyond contracts; claude-code/openhands pending.
|
|
5
|
+
|
|
6
|
+
## Design space
|
|
7
|
+
|
|
8
|
+
What is sent per turn vs fetched on demand; compaction triggers and strategies;
|
|
9
|
+
where summarization sits relative to the cache; truncation of tool outputs;
|
|
10
|
+
token accounting granularity (uncached input / cache read+write separation).
|
|
11
|
+
|
|
12
|
+
## Comparison
|
|
13
|
+
|
|
14
|
+
**this harness (contracts).** Stable system prefix + hidden `xingular-context`
|
|
15
|
+
native-history message for changing state; usage accounting: `inputTokens` is
|
|
16
|
+
uncached input, cache reads/writes separate, reasoning inside output,
|
|
17
|
+
`usage.updated` cumulative per run (repo contracts). Compaction story pending
|
|
18
|
+
inventory (whether sessions rely on Pi native history management + context
|
|
19
|
+
updates).
|
|
20
|
+
|
|
21
|
+
**opencode — summarizer as a resident agent.** Triggers: `auto` when estimated
|
|
22
|
+
context ≥ ceiling (window − max(15%, 16k) reserve), `overflow` after provider
|
|
23
|
+
rejection, `manual` (`.../session/compaction.ts:53-57,93-101,849-856`); auto
|
|
24
|
+
skips until a fresh provider measurement exists (`:245-253`).
|
|
25
|
+
Strategy: a dedicated compaction agent/model summarizes every dialog into a
|
|
26
|
+
**fixed template** (Objective / Requirements / Decision / Work State / Next
|
|
27
|
+
Move / Relevant Files) while keeping the newest `keep` tokens verbatim as a
|
|
28
|
+
`<conversation-checkpoint>`; **the whole conversation is sent to the
|
|
29
|
+
summarizer to reuse the prefix cache** (`:107-138,256-332`). Rejection retries
|
|
30
|
+
at 70/50/35% of the rejected size (`:455-461`). Generic ToolOutput truncation to
|
|
31
|
+
maxLines/maxBytes with `metadata.truncated`
|
|
32
|
+
(`.../core/src/tool-output.ts:28-88`); shell saves full output to a file and
|
|
33
|
+
returns a bounded tail (`.../tool/plugin/shell.ts:42-43`).
|
|
34
|
+
Accounting: latest assistant response is the anchor
|
|
35
|
+
(`input+cacheRead+cacheWrite+output+reasoning` measured) plus an estimate of
|
|
36
|
+
unmeasured since (`:812-842`); 4 chars/token estimate ±15%
|
|
37
|
+
(`.../session/model-request.ts:53-54`).
|
|
38
|
+
|
|
39
|
+
**omp — the strategy ladder + deterministic frontier.** Trigger points: post-turn
|
|
40
|
+
over `resolveThresholdTokens`, mid-turn, idle, overflow-recovery
|
|
41
|
+
(`.../session/session-maintenance.ts:626,2147,2246,2412`).
|
|
42
|
+
`compaction.methodOrder` ladder: LLM summarize (regular/handoff), `shake`
|
|
43
|
+
(local mechanical elision to `artifact://` refs), `snapcompact`
|
|
44
|
+
(`docs/compaction.md:202-215`). **Snapcompact is local/deterministic, no LLM**:
|
|
45
|
+
discarded history serialized with per-result caps into provider-aware PNG
|
|
46
|
+
bitmap frames (typography per provider family), persisted and re-attached each
|
|
47
|
+
rebuild (`packages/snapcompact/README.md:3-29,44-68`). Budgets: kept context
|
|
48
|
+
≤60% of threshold, target ≤80% (`docs/compaction.md:217,221`). Cache care:
|
|
49
|
+
pruning blanks outputs only within the model's `prompt-cache-lookback`
|
|
50
|
+
(`docs/compaction.md:248`); summaries drop whole call/result pairs (`:250`).
|
|
51
|
+
Byte-stable system prompt between turns is an invariant
|
|
52
|
+
(`.../session/agent-session.ts:2607`).
|
|
53
|
+
|
|
54
|
+
**dsh — formulas + query-ability.** `compaction-basic` trigger:
|
|
55
|
+
`floor(min(W×0.8, W−O−headroom))`, headroom 65_536, keeps newest 16% of the
|
|
56
|
+
usable window, one extra model request, summary-only retention
|
|
57
|
+
(`.../packages/compaction/compaction-basic/README.md:12,32,62-68`).
|
|
58
|
+
Oversized tool results pruned first; images offloaded to placeholders
|
|
59
|
+
(`.../packages/compaction/README.md:31-32`). `session-query` = SQLite FTS5
|
|
60
|
+
full-text search over the durable log, independent of compaction
|
|
61
|
+
(`.../packages/session-query/README.md:12,30`).
|
|
62
|
+
|
|
63
|
+
**smolagents.** `AgentMemory` is a step log (ToolCall/ActionStep/PlanningStep/
|
|
64
|
+
FinalAnswer) rebuilt to messages with `summary_mode` each step — replay-style,
|
|
65
|
+
no incremental fades (`external/smolagents/src/smolagents/memory.py:25,46,92,206-229`).
|
|
66
|
+
|
|
67
|
+
## Trade-offs
|
|
68
|
+
|
|
69
|
+
- **Summarizer economics.** opencode sends the *whole transcript* to the
|
|
70
|
+
summarizer to reuse the prefix cache — larger paid input per compression, but
|
|
71
|
+
cache-discounted and higher-fidelity. dsh keeps only the summary (cheapest
|
|
72
|
+
retention). The choice hinges on whether compaction runs once or repeatedly.
|
|
73
|
+
- **A deterministic rung is the safety net.** omp's ladder means a compaction
|
|
74
|
+
never fully depends on a slow/failing LLM pass (shake/snapcompact). That
|
|
75
|
+
resilience has no counterpart in opencode/dsh (dsh retries on overflow).
|
|
76
|
+
- **Searching beats re-shipping.** dsh's session-query (and omp's shard
|
|
77
|
+
omp's shard-style retrieval in `shake`) treat old context as a database, not a
|
|
78
|
+
transcript; "retrieve details through tools when needed" matches our
|
|
79
|
+
CONTEXT_GUIDANCE wording (`src/prompt/compile.ts:333`).
|
|
80
|
+
- **Accounting honesty.** opencode's anchor-measured + estimated-elsewhere and
|
|
81
|
+
our uncached/cached split are compatible; the 4-chars/token estimate is the
|
|
82
|
+
common fixed-density fallback (dsh token-meter identical semantics).
|
|
83
|
+
|
|
84
|
+
## Adoption candidates
|
|
85
|
+
|
|
86
|
+
| # | Idea | From | Land as | Tier |
|
|
87
|
+
|---|---|---|---|---|
|
|
88
|
+
| C1 | A fixed-template summary shape (named sections) for any summarization run, so restored context is predictable and diffable | opencode compaction template | refine/trajectory or session docs; needs Pi-native compaction knowledge first | T2 verify-first |
|
|
89
|
+
| C2 | Prune-first ordering (oversized tool outputs) before any summarization | dsh + omp | facet of the context update path | T2 verify-first (what already trims?) |
|
|
90
|
+
| C3 | Keep a verbatim tail checkpoint marker in any summary | opencode | same home as C1 | T2 |
|