@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,47 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { HarnessError, invalid } from "../core/errors.js";
|
|
4
|
+
import { readJson, safeId, writeJson } from "../core/fs.js";
|
|
5
|
+
const path = (root, runId) => join(root, 'runs', safeId(runId), 'capabilities.json');
|
|
6
|
+
function strings(value) {
|
|
7
|
+
return Array.isArray(value) ? [...new Set(value.filter((item) => typeof item === 'string' && item.length > 0))] : [];
|
|
8
|
+
}
|
|
9
|
+
export function capabilitySet(value) {
|
|
10
|
+
if (!value || typeof value !== 'object' || value.version !== 1)
|
|
11
|
+
throw invalid('A capability set must use version 1.');
|
|
12
|
+
const record = value;
|
|
13
|
+
return { version: 1, tools: strings(record.tools), connectors: strings(record.connectors), contributions: strings(record.contributions) };
|
|
14
|
+
}
|
|
15
|
+
/** Writes a run's capability set once. A resumed or duplicate launch cannot replace it. */
|
|
16
|
+
export function freezeRun(root, runId, caller, set) {
|
|
17
|
+
const target = path(root, runId);
|
|
18
|
+
const snapshot = {
|
|
19
|
+
version: 1,
|
|
20
|
+
caller: { agentId: caller.agentId ?? null, projectId: caller.projectId ?? null },
|
|
21
|
+
tools: strings(set.tools),
|
|
22
|
+
connectors: strings(set.connectors),
|
|
23
|
+
contributions: strings(set.contributions)
|
|
24
|
+
};
|
|
25
|
+
const existing = existsSync(target) ? readJson(target) : null;
|
|
26
|
+
if (existing) {
|
|
27
|
+
if (JSON.stringify(existing) !== JSON.stringify(snapshot))
|
|
28
|
+
throw new HarnessError('capabilities_frozen', 'This run already has a different frozen capability set.');
|
|
29
|
+
return existing;
|
|
30
|
+
}
|
|
31
|
+
writeJson(target, snapshot);
|
|
32
|
+
return snapshot;
|
|
33
|
+
}
|
|
34
|
+
export function loadRun(root, runId) {
|
|
35
|
+
const stored = readJson(path(root, runId));
|
|
36
|
+
if (!stored || typeof stored !== 'object' || stored.version !== 1)
|
|
37
|
+
return null;
|
|
38
|
+
const record = stored;
|
|
39
|
+
const caller = record.caller && typeof record.caller === 'object' ? record.caller : {};
|
|
40
|
+
return {
|
|
41
|
+
version: 1,
|
|
42
|
+
caller: { agentId: typeof caller.agentId === 'string' ? caller.agentId : null, projectId: typeof caller.projectId === 'string' ? caller.projectId : null },
|
|
43
|
+
tools: strings(record.tools),
|
|
44
|
+
connectors: strings(record.connectors),
|
|
45
|
+
contributions: strings(record.contributions)
|
|
46
|
+
};
|
|
47
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AttachScope, Attachment } from "../plugins/attachments.js";
|
|
2
|
+
import type { ContributionKind, ContributionState, PluginSource } from "../plugins/types.js";
|
|
3
|
+
export type CapabilityKind = ContributionKind | 'plugin';
|
|
4
|
+
/** One item the caller can switch on or off, or that a plugin makes available. */
|
|
5
|
+
export interface Capability {
|
|
6
|
+
id: string;
|
|
7
|
+
pluginId: string;
|
|
8
|
+
kind: CapabilityKind;
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
source: PluginSource;
|
|
12
|
+
state: ContributionState;
|
|
13
|
+
attachment: Attachment | null;
|
|
14
|
+
}
|
|
15
|
+
export interface CapabilityCatalogue {
|
|
16
|
+
plugins: import("../plugins/types.js").Plugin[];
|
|
17
|
+
capabilities: Capability[];
|
|
18
|
+
}
|
|
19
|
+
/** The callable capabilities a run starts with. Permission to run still goes through the gate. */
|
|
20
|
+
export interface CapabilitySet {
|
|
21
|
+
version: 1;
|
|
22
|
+
tools: string[];
|
|
23
|
+
connectors: string[];
|
|
24
|
+
contributions: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface CapabilityScope extends AttachScope {
|
|
27
|
+
cwd?: string | null;
|
|
28
|
+
accountId?: string | null;
|
|
29
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/sdk/cli.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// The `xharness` command.
|
|
3
|
+
//
|
|
4
|
+
// xharness serve --state <dir> [--data <dir>] [--name <product>] [--builtins <dir>]…
|
|
5
|
+
// [--host-secrets] [--host-policy] [--host-tools] [--host-directory]
|
|
6
|
+
// Serves the harness to a host process over stdin/stdout (newline-delimited JSON).
|
|
7
|
+
// xharness wiki <command> Project notes, skills and history, from inside a terminal session.
|
|
8
|
+
// xharness refine <command> Refine a variant from evidence (refine demo needs no model).
|
|
9
|
+
// xharness mcp <command> Connected apps, from inside a terminal session.
|
|
10
|
+
// xharness plugins <command> List, install, switch and trust plugins.
|
|
11
|
+
// xharness web <command> Search keys for web_search.
|
|
12
|
+
// xharness browser <command> How the agent's browser runs.
|
|
13
|
+
import { resolve } from 'node:path';
|
|
14
|
+
import manifest from "../../package.json" with { type: 'json' };
|
|
15
|
+
import { log } from "./core/bus.js";
|
|
16
|
+
import { createHarness } from "./harness.js";
|
|
17
|
+
import { runPluginsCli, terminalAsk } from "./plugins/cli.js";
|
|
18
|
+
import { runHubCli } from "./hub/cli.js";
|
|
19
|
+
import { runRefineCli } from "./refine/cli.js";
|
|
20
|
+
import { runBrowserCli, runWebCli } from "./world/cli.js";
|
|
21
|
+
import { remoteDirectory, remotePolicy, remoteSecrets, remoteTools } from "./server/remote.js";
|
|
22
|
+
import { RpcPeer, stdioTransport } from "./server/rpc.js";
|
|
23
|
+
import { attach } from "./server/serve.js";
|
|
24
|
+
import { runAppsCli, runWikiCli } from "./terminal/cli.js";
|
|
25
|
+
import { runStandaloneTerminal, standaloneArguments } from "./terminal/standalone.js";
|
|
26
|
+
const USAGE = `Usage: xharness [--data <dir>] [--state <dir>]
|
|
27
|
+
xharness <terminal | serve | wiki | mcp | plugins | hub | refine | web | browser> [arguments]
|
|
28
|
+
|
|
29
|
+
--version Print the package version
|
|
30
|
+
(no command) Start the interactive Harness terminal
|
|
31
|
+
terminal Start the interactive Harness terminal
|
|
32
|
+
serve --state <dir> [--data <dir>] [--name <product>] [--builtins <dir>]
|
|
33
|
+
[--host-secrets] [--host-policy] [--host-tools] [--host-directory]
|
|
34
|
+
Serve the harness over newline-delimited JSON
|
|
35
|
+
wiki <command> Wiki, skill and history commands for a terminal session
|
|
36
|
+
mcp <command> Connected-app commands for a terminal session
|
|
37
|
+
plugins <command> List, install, switch and trust plugins (plugins help)
|
|
38
|
+
hub <command> Browse and install curated items (hub help)
|
|
39
|
+
refine <command> Refine a harness from evidence (refine demo, refine run)
|
|
40
|
+
web <command> Search keys for the web tools (web help)
|
|
41
|
+
browser <command> How the agent's browser runs (browser help)
|
|
42
|
+
|
|
43
|
+
Standalone terminal options:
|
|
44
|
+
--data <dir> Data directory (installed default: ~/.xingular-harness/data;
|
|
45
|
+
npm run dev default: ~/.xingular-harness-dev/data)
|
|
46
|
+
--state <dir> State directory (installed default: ~/.xingular-harness/state;
|
|
47
|
+
npm run dev default: ~/.xingular-harness-dev/state)
|
|
48
|
+
`;
|
|
49
|
+
function flags(argv) {
|
|
50
|
+
const values = {};
|
|
51
|
+
const switches = new Set();
|
|
52
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
53
|
+
const name = argv[index];
|
|
54
|
+
if (!name.startsWith('--'))
|
|
55
|
+
continue;
|
|
56
|
+
const next = argv[index + 1];
|
|
57
|
+
if (next !== undefined && !next.startsWith('--')) {
|
|
58
|
+
;
|
|
59
|
+
(values[name.slice(2)] ??= []).push(next);
|
|
60
|
+
index += 1;
|
|
61
|
+
}
|
|
62
|
+
else
|
|
63
|
+
switches.add(name.slice(2));
|
|
64
|
+
}
|
|
65
|
+
return { values, switches };
|
|
66
|
+
}
|
|
67
|
+
function serveCommand(argv) {
|
|
68
|
+
const { values, switches } = flags(argv);
|
|
69
|
+
const stateArgument = values.state?.[0];
|
|
70
|
+
if (!stateArgument) {
|
|
71
|
+
process.stderr.write('serve needs --state <dir>.\n');
|
|
72
|
+
return Promise.resolve(2);
|
|
73
|
+
}
|
|
74
|
+
// The socket path is built from this folder, so a relative one would depend on where the host ran.
|
|
75
|
+
const stateDir = resolve(stateArgument);
|
|
76
|
+
const peer = new RpcPeer(stdioTransport());
|
|
77
|
+
const options = {
|
|
78
|
+
stateDir,
|
|
79
|
+
dataRoot: values.data?.[0] ? resolve(values.data[0]) : null,
|
|
80
|
+
productName: values.name?.[0],
|
|
81
|
+
builtins: values.builtins,
|
|
82
|
+
...(switches.has('host-secrets') ? { secrets: remoteSecrets(peer) } : {}),
|
|
83
|
+
...(switches.has('host-policy') ? { policy: remotePolicy(peer) } : {}),
|
|
84
|
+
...(switches.has('host-directory') ? { directory: remoteDirectory(peer) } : {})
|
|
85
|
+
};
|
|
86
|
+
const harness = createHarness(options);
|
|
87
|
+
if (switches.has('host-tools'))
|
|
88
|
+
harness.sessions.provide(remoteTools(peer));
|
|
89
|
+
attach(harness, peer);
|
|
90
|
+
return new Promise((resolve) => {
|
|
91
|
+
let closing = false;
|
|
92
|
+
const shutdown = () => {
|
|
93
|
+
if (closing)
|
|
94
|
+
return;
|
|
95
|
+
closing = true;
|
|
96
|
+
void Promise.race([harness.close(), new Promise((done) => setTimeout(done, 5000))]).then(() => resolve(0));
|
|
97
|
+
};
|
|
98
|
+
peer.handle('harness.shutdown', () => void setImmediate(shutdown));
|
|
99
|
+
process.stdin.on('end', shutdown);
|
|
100
|
+
process.on('SIGTERM', shutdown);
|
|
101
|
+
process.on('SIGINT', shutdown);
|
|
102
|
+
peer.send({ notice: { type: 'ready' } });
|
|
103
|
+
log('ready');
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async function main() {
|
|
107
|
+
const argv = process.argv.slice(2);
|
|
108
|
+
if (argv.length === 1 && (argv[0] === '--version' || argv[0] === '-v')) {
|
|
109
|
+
process.stdout.write(`${manifest.version}\n`);
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
const [command, ...rest] = argv;
|
|
113
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
114
|
+
process.stdout.write(USAGE);
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
const terminalArgs = standaloneArguments(argv);
|
|
118
|
+
if (terminalArgs !== null)
|
|
119
|
+
return runStandaloneTerminal(terminalArgs);
|
|
120
|
+
if (command === 'serve')
|
|
121
|
+
return serveCommand(rest);
|
|
122
|
+
if (command === 'wiki')
|
|
123
|
+
return runWikiCli(rest);
|
|
124
|
+
if (command === 'mcp')
|
|
125
|
+
return runAppsCli(rest);
|
|
126
|
+
if (command === 'plugins')
|
|
127
|
+
return runPluginsCli(rest, { ask: terminalAsk() });
|
|
128
|
+
if (command === 'hub')
|
|
129
|
+
return runHubCli(rest);
|
|
130
|
+
if (command === 'refine')
|
|
131
|
+
return runRefineCli(rest);
|
|
132
|
+
if (command === 'web')
|
|
133
|
+
return runWebCli(rest);
|
|
134
|
+
if (command === 'browser')
|
|
135
|
+
return runBrowserCli(rest);
|
|
136
|
+
process.stdout.write(USAGE);
|
|
137
|
+
return command ? 2 : 0;
|
|
138
|
+
}
|
|
139
|
+
void main().then((code) => process.exit(code), (error) => {
|
|
140
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
141
|
+
process.exit(1);
|
|
142
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface Notice {
|
|
2
|
+
/** `accounts.changed`, `accounts.login`, `accounts.loginEvent`, `wiki.changed`, `wiki.maintenance`, … */
|
|
3
|
+
type: string;
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
}
|
|
6
|
+
export type NoticeListener = (notice: Notice) => void;
|
|
7
|
+
export declare class Bus {
|
|
8
|
+
private readonly listeners;
|
|
9
|
+
on(listener: NoticeListener): () => void;
|
|
10
|
+
emit(notice: Notice): void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Sends diagnostics somewhere other than stderr, or back to stderr with `null`. A host whose stderr is
|
|
14
|
+
* the terminal a frontend is drawing on must not write into it, so it sets a sink.
|
|
15
|
+
*/
|
|
16
|
+
export declare function setLogSink(sink: ((text: string) => void) | null): void;
|
|
17
|
+
/** One line of diagnostics. Diagnostics go to stderr by default; stdout may be carrying a protocol. */
|
|
18
|
+
export declare function logLine(text: string): void;
|
|
19
|
+
/** Redacts common credentials and URL query values before diagnostic text is persisted or shown. */
|
|
20
|
+
export declare function redactLogText(text: string): string;
|
|
21
|
+
/** Records useful failure detail without persisting credentials or response bodies. */
|
|
22
|
+
export declare function logDiagnostic(scope: string, error: unknown, metadata?: Record<string, unknown>): void;
|
|
23
|
+
export declare function log(...parts: unknown[]): void;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Notices: what the harness tells whoever embeds it. Run events travel separately, through the
|
|
2
|
+
// run tracker; a notice says that some state changed and should be read again.
|
|
3
|
+
export class Bus {
|
|
4
|
+
listeners = new Set();
|
|
5
|
+
on(listener) {
|
|
6
|
+
this.listeners.add(listener);
|
|
7
|
+
return () => this.listeners.delete(listener);
|
|
8
|
+
}
|
|
9
|
+
emit(notice) {
|
|
10
|
+
for (const listener of this.listeners) {
|
|
11
|
+
try {
|
|
12
|
+
listener(notice);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
log('a notice listener failed', error instanceof Error ? error.message : String(error));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
let logSink = null;
|
|
21
|
+
/**
|
|
22
|
+
* Sends diagnostics somewhere other than stderr, or back to stderr with `null`. A host whose stderr is
|
|
23
|
+
* the terminal a frontend is drawing on must not write into it, so it sets a sink.
|
|
24
|
+
*/
|
|
25
|
+
export function setLogSink(sink) {
|
|
26
|
+
logSink = sink;
|
|
27
|
+
}
|
|
28
|
+
/** One line of diagnostics. Diagnostics go to stderr by default; stdout may be carrying a protocol. */
|
|
29
|
+
export function logLine(text) {
|
|
30
|
+
if (logSink)
|
|
31
|
+
logSink(text);
|
|
32
|
+
else
|
|
33
|
+
process.stderr.write(`${text}\n`);
|
|
34
|
+
}
|
|
35
|
+
/** Redacts common credentials and URL query values before diagnostic text is persisted or shown. */
|
|
36
|
+
export function redactLogText(text) {
|
|
37
|
+
return text
|
|
38
|
+
.replace(/\bBearer\s+\S+/gi, 'Bearer [redacted]')
|
|
39
|
+
.replace(/(["']?(?:authorization|proxy-authorization|cookie|set-cookie|x-[\w-]*(?:token|key)|[\w-]*(?:api[_-]?key|access[_-]?token|refresh[_-]?token|id[_-]?token|token|secret|password|client[_-]?secret))["']?\s*[:=]\s*["']?)[^"'\s,;]+/gi, '$1[redacted]')
|
|
40
|
+
.replace(/\b(?:sk|sess)-[A-Za-z0-9_-]{16,}\b/gi, '[redacted]')
|
|
41
|
+
.replace(/\bhttps?:\/\/[^\s"'<>]+/gi, (raw) => {
|
|
42
|
+
const punctuation = /[),.;!?]+$/.exec(raw)?.[0] ?? '';
|
|
43
|
+
const address = punctuation ? raw.slice(0, -punctuation.length) : raw;
|
|
44
|
+
try {
|
|
45
|
+
const url = new URL(address);
|
|
46
|
+
url.username = '';
|
|
47
|
+
url.password = '';
|
|
48
|
+
url.search = '';
|
|
49
|
+
url.hash = '';
|
|
50
|
+
return `${url.href}${punctuation}`;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return raw;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** Records useful failure detail without persisting credentials or response bodies. */
|
|
58
|
+
export function logDiagnostic(scope, error, metadata = {}) {
|
|
59
|
+
const failure = error instanceof Error ? error : new Error(String(error));
|
|
60
|
+
const details = {
|
|
61
|
+
...metadata,
|
|
62
|
+
message: failure.message,
|
|
63
|
+
...(failure.stack ? { stack: failure.stack } : {})
|
|
64
|
+
};
|
|
65
|
+
let serialized;
|
|
66
|
+
try {
|
|
67
|
+
serialized = JSON.stringify(details);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
serialized = JSON.stringify({ message: failure.message, stack: failure.stack });
|
|
71
|
+
}
|
|
72
|
+
logLine(`[harness] ${redactLogText(scope)} ${redactLogText(serialized)}`);
|
|
73
|
+
}
|
|
74
|
+
export function log(...parts) {
|
|
75
|
+
logLine(`[harness] ${parts.map((part) => (typeof part === 'string' ? part : JSON.stringify(part))).join(' ')}`);
|
|
76
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Project } from "./projects.js";
|
|
2
|
+
export interface CallerContext {
|
|
3
|
+
/** Opaque, host-owned policy data frozen when this session starts. The harness only forwards it to the embedding app's tool policy. */
|
|
4
|
+
policyContext?: unknown;
|
|
5
|
+
runId?: string | null;
|
|
6
|
+
sessionId?: string | null;
|
|
7
|
+
projectId?: string | null;
|
|
8
|
+
/** The caller: decides which plugins and connectors reach it, and whose history it recalls. */
|
|
9
|
+
agentId?: string | null;
|
|
10
|
+
/** Callers whose conversations this one may not recall (opaque ids from the embedding host). */
|
|
11
|
+
recallExcludeAgents?: string[] | null;
|
|
12
|
+
/** The caller's name, recorded on what it writes. */
|
|
13
|
+
agentName?: string | null;
|
|
14
|
+
/** `Chat` for an agent's own conversation, `Code` for a session in a project. */
|
|
15
|
+
actor?: string | null;
|
|
16
|
+
/** `cli` when the caller reaches the harness through a terminal command. */
|
|
17
|
+
surface?: string | null;
|
|
18
|
+
}
|
|
19
|
+
export declare const isSession: (context: CallerContext) => boolean;
|
|
20
|
+
export declare const actorOf: (context: CallerContext) => string;
|
|
21
|
+
export declare const usesCli: (context: CallerContext) => boolean;
|
|
22
|
+
export declare function projectOf(root: string, context: CallerContext): Project | null;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Who a session works as. The embedding application supplies this when a session starts; the
|
|
2
|
+
// harness never looks an agent up by itself. The ids are opaque to the harness.
|
|
3
|
+
import { findProject } from "./projects.js";
|
|
4
|
+
export const isSession = (context) => context.actor === 'Code';
|
|
5
|
+
export const actorOf = (context) => (isSession(context) ? 'Code' : 'Chat');
|
|
6
|
+
export const usesCli = (context) => context.surface === 'cli';
|
|
7
|
+
export function projectOf(root, context) {
|
|
8
|
+
if (!context.projectId)
|
|
9
|
+
return null;
|
|
10
|
+
try {
|
|
11
|
+
return findProject(root, context.projectId);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface Change {
|
|
2
|
+
/** The Wiki folder the entry is in. */
|
|
3
|
+
wiki: string;
|
|
4
|
+
id: string;
|
|
5
|
+
/** The file that was written. */
|
|
6
|
+
path: string;
|
|
7
|
+
/** Its new contents, front matter included. */
|
|
8
|
+
text: string;
|
|
9
|
+
actor: string;
|
|
10
|
+
reason: string;
|
|
11
|
+
}
|
|
12
|
+
type Listener = (change: Change) => void;
|
|
13
|
+
export declare function noteChange(change: Change): void;
|
|
14
|
+
export declare function onChange(listener: Listener): () => void;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const listeners = new Set();
|
|
2
|
+
export function noteChange(change) {
|
|
3
|
+
for (const listener of listeners) {
|
|
4
|
+
try {
|
|
5
|
+
listener(change);
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
// A listener must never break the write it is told about.
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function onChange(listener) {
|
|
13
|
+
listeners.add(listener);
|
|
14
|
+
return () => void listeners.delete(listener);
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const EFFORTS = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Names the harness shows but does not own. Every lookup may answer `null`. */
|
|
2
|
+
export interface Directory {
|
|
3
|
+
/** An agent's display name. */
|
|
4
|
+
agentName(agentId: string): string | null;
|
|
5
|
+
/** The agent a conversation belongs to, when the session id is not the agent's own id. */
|
|
6
|
+
sessionAgent(sessionId: string): string | null;
|
|
7
|
+
}
|
|
8
|
+
/** The name used when an application gives none. */
|
|
9
|
+
export declare const DEFAULT_PRODUCT_NAME = "Xingular Harness";
|
|
10
|
+
export declare const EMPTY_DIRECTORY: Directory;
|
|
11
|
+
export interface HarnessEnv {
|
|
12
|
+
/** The data root: `wiki/`, `registry/`, `runs/`, `config/`, `index.sqlite`. */
|
|
13
|
+
root: string;
|
|
14
|
+
directory: Directory;
|
|
15
|
+
/** How the harness names itself to a model and in the Wiki it creates. */
|
|
16
|
+
productName: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function createEnv(root: string, options?: Partial<Omit<HarnessEnv, 'root'>>): HarnessEnv;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// What every harness module is given: where the data lives, and what the embedding application
|
|
2
|
+
// knows that the harness does not.
|
|
3
|
+
/** The name used when an application gives none. */
|
|
4
|
+
export const DEFAULT_PRODUCT_NAME = 'Xingular Harness';
|
|
5
|
+
export const EMPTY_DIRECTORY = { agentName: () => null, sessionAgent: () => null };
|
|
6
|
+
export function createEnv(root, options = {}) {
|
|
7
|
+
return { root, directory: options.directory ?? EMPTY_DIRECTORY, productName: options.productName ?? DEFAULT_PRODUCT_NAME };
|
|
8
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** A typed failure: a stable code, a message a person can read, and an optional hint on what to do next. */
|
|
2
|
+
export declare class HarnessError extends Error {
|
|
3
|
+
readonly code: string;
|
|
4
|
+
readonly retryHint: string | null;
|
|
5
|
+
constructor(code: string, message: string, retryHint?: string | null);
|
|
6
|
+
withHint(hint: string): HarnessError;
|
|
7
|
+
}
|
|
8
|
+
export declare const invalid: (message: string) => HarnessError;
|
|
9
|
+
export declare const notFound: (what: string) => HarnessError;
|
|
10
|
+
export interface ErrorShape {
|
|
11
|
+
code: string;
|
|
12
|
+
message: string;
|
|
13
|
+
retryHint?: string | null;
|
|
14
|
+
}
|
|
15
|
+
export declare function toErrorShape(error: unknown, fallbackCode?: string): ErrorShape;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** A typed failure: a stable code, a message a person can read, and an optional hint on what to do next. */
|
|
2
|
+
export class HarnessError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
retryHint;
|
|
5
|
+
constructor(code, message, retryHint = null) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'HarnessError';
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.retryHint = retryHint;
|
|
10
|
+
}
|
|
11
|
+
withHint(hint) {
|
|
12
|
+
return new HarnessError(this.code, this.message, hint);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export const invalid = (message) => new HarnessError('invalid_request', message);
|
|
16
|
+
export const notFound = (what) => new HarnessError('not_found', `${what} was not found.`);
|
|
17
|
+
export function toErrorShape(error, fallbackCode = 'harness_error') {
|
|
18
|
+
if (error instanceof HarnessError)
|
|
19
|
+
return { code: error.code, message: error.message, retryHint: error.retryHint };
|
|
20
|
+
const code = error?.code;
|
|
21
|
+
if (error instanceof Error && typeof code === 'string' && code.startsWith('E'))
|
|
22
|
+
return { code: 'io_error', message: error.message };
|
|
23
|
+
return { code: fallbackCode, message: error instanceof Error ? error.message : String(error) };
|
|
24
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function split(text: string): {
|
|
2
|
+
yaml: string;
|
|
3
|
+
body: string;
|
|
4
|
+
} | null;
|
|
5
|
+
/** The frontmatter as a plain object and the body, or `null` when the block is missing or is not a mapping. */
|
|
6
|
+
export declare function parse(text: string): {
|
|
7
|
+
front: Record<string, unknown>;
|
|
8
|
+
body: string;
|
|
9
|
+
} | null;
|
|
10
|
+
/** The text after a readable frontmatter block, or the whole text when there is none. */
|
|
11
|
+
export declare function bodyOf(text: string): string;
|
|
12
|
+
export declare function serialize(front: Record<string, unknown>, body: string): string;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Markdown files with a YAML frontmatter block (`---` … `---`), used by Wiki pages, facts, blocks and registry items.
|
|
2
|
+
import { parse as parseYaml, stringify } from 'yaml';
|
|
3
|
+
import { HarnessError } from "./errors.js";
|
|
4
|
+
export function split(text) {
|
|
5
|
+
const rest = text.startsWith('---\n') ? text.slice(4) : text.startsWith('---\r\n') ? text.slice(5) : null;
|
|
6
|
+
if (rest === null)
|
|
7
|
+
return null;
|
|
8
|
+
const end = rest.indexOf('\n---');
|
|
9
|
+
if (end < 0)
|
|
10
|
+
return null;
|
|
11
|
+
return { yaml: rest.slice(0, end), body: rest.slice(end + 4).replace(/^[\r\n]+/, '') };
|
|
12
|
+
}
|
|
13
|
+
/** The frontmatter as a plain object and the body, or `null` when the block is missing or is not a mapping. */
|
|
14
|
+
export function parse(text) {
|
|
15
|
+
const parts = split(text);
|
|
16
|
+
if (!parts)
|
|
17
|
+
return null;
|
|
18
|
+
try {
|
|
19
|
+
const front = parseYaml(parts.yaml);
|
|
20
|
+
if (!front || typeof front !== 'object' || Array.isArray(front))
|
|
21
|
+
return null;
|
|
22
|
+
return { front: front, body: parts.body };
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** The text after a readable frontmatter block, or the whole text when there is none. */
|
|
29
|
+
export function bodyOf(text) {
|
|
30
|
+
const parts = split(text);
|
|
31
|
+
if (!parts)
|
|
32
|
+
return text;
|
|
33
|
+
try {
|
|
34
|
+
parseYaml(parts.yaml);
|
|
35
|
+
return parts.body;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return text;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function serialize(front, body) {
|
|
42
|
+
let yaml;
|
|
43
|
+
try {
|
|
44
|
+
yaml = stringify(front, { lineWidth: 0 });
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
throw new HarnessError('invalid_data', error instanceof Error ? error.message : String(error));
|
|
48
|
+
}
|
|
49
|
+
return `---\n${yaml}---\n\n${body.trimEnd()}\n`;
|
|
50
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Writes through a temporary sibling file and renames it into place so readers never see a partial file. */
|
|
2
|
+
export declare function atomicWrite(path: string, contents: string | Uint8Array): void;
|
|
3
|
+
export declare function writeJson(path: string, value: unknown): void;
|
|
4
|
+
/** `null` when the file does not exist; a file that exists but does not parse is an error. */
|
|
5
|
+
export declare function readJson<T>(path: string): T | null;
|
|
6
|
+
/** `readJson` for callers that treat an unreadable file like a missing one. */
|
|
7
|
+
export declare function readJsonOr<T>(path: string, fallback: T): T;
|
|
8
|
+
export declare function readText(path: string): string | null;
|
|
9
|
+
export declare function appendLine(path: string, line: string): void;
|
|
10
|
+
/** Accepts only IDs that are safe as a single path segment. */
|
|
11
|
+
export declare function safeId(id: string): string;
|
|
12
|
+
/** Accepts a relative path that stays inside its base directory. */
|
|
13
|
+
export declare function safeRelative(path: string): string;
|
|
14
|
+
/** Millisecond UTC timestamp, the format every record uses. */
|
|
15
|
+
export declare function now(): string;
|
|
16
|
+
export declare function newId(): string;
|
|
17
|
+
export declare function isDir(path: string): boolean;
|
|
18
|
+
export declare function isFile(path: string): boolean;
|