@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
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
// The memory lifecycle. Imported sources and eligible settled runs become jobs; one job runs at
|
|
2
|
-
// a time, so the Wiki has a single writer. A job asks the maintainer session for proposals,
|
|
3
|
-
// checks every one against the evidence, applies the valid ones as one undoable operation, and
|
|
4
|
-
// sends the rest to the Inbox. When no job arrives for a while, memory blocks that are close to
|
|
5
|
-
// their limit are condensed.
|
|
6
|
-
import { readFileSync } from 'node:fs'
|
|
7
|
-
import { join } from 'node:path'
|
|
8
|
-
|
|
9
|
-
import type { Accounts } from '../accounts/accounts'
|
|
10
|
-
import { log, type Bus } from '../core/bus'
|
|
11
|
-
import type { HarnessEnv } from '../core/env'
|
|
12
|
-
import { newId, now, readJsonOr } from '../core/fs'
|
|
13
|
-
import { findProject } from '../core/projects'
|
|
14
|
-
import { charCount, takeChars } from '../core/text'
|
|
15
|
-
import type { RunEvent } from '../sessions/contracts'
|
|
16
|
-
import { findRun, readEvents } from '../sessions/runStore'
|
|
17
|
-
import { evidenceText, transcript } from './api'
|
|
18
|
-
import * as blocks from './blocks'
|
|
19
|
-
import { callerBlocks, type CallerContext } from './caller'
|
|
20
|
-
import * as facts from './facts'
|
|
21
|
-
import { piMaintainerFactory, runMaintenance, type ExistingBlock, type ExistingMemory, type ExistingPage, type MaintainerFactory, type MaintenanceRequest } from './maintainer'
|
|
22
|
-
import { inbox, undo } from './operations'
|
|
23
|
-
import { accept, apply, captureHashes, describeTrigger, parseProposalSet, writeIndex, type Evidence, type Trigger } from './proposals'
|
|
24
|
-
import { looksSecret } from './secrets'
|
|
25
|
-
import * as store from './store'
|
|
26
|
-
import { namespaces, searchEntries } from './wiki'
|
|
27
|
-
import { reindexQuietly } from './wikiIndex'
|
|
28
|
-
|
|
29
|
-
export type Job = { kind: 'ingest'; namespace: string; sourceId: string } | { kind: 'run'; runId: string } | { kind: 'consolidate'; blockIds: string[] }
|
|
30
|
-
|
|
31
|
-
const FULL_PAGES = 5
|
|
32
|
-
const FULL_PAGE_LIMIT = 6000
|
|
33
|
-
/** A block this full is condensed when nothing else is happening. */
|
|
34
|
-
const NEAR_LIMIT_PERCENT = 90
|
|
35
|
-
const IDLE_CHECK_MS = 600_000
|
|
36
|
-
|
|
37
|
-
/** Conversations belong to no project, so only this setting can pause them. Absent means on. */
|
|
38
|
-
export function chatUpdatesPaused(settings: unknown): boolean {
|
|
39
|
-
return (settings as { autoMaintenanceChat?: unknown } | null)?.autoMaintenanceChat === false
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/** Where a settled run's knowledge is filed and what the job reads of it; throws the reason it is not eligible. */
|
|
43
|
-
function runEvidence(root: string, runId: string): { namespace: string; transcript: string } {
|
|
44
|
-
const run = findRun(root, runId)
|
|
45
|
-
if (!run) throw new Error('Run was not found.')
|
|
46
|
-
const settings = readJsonOr<{ excludedSourceIds?: unknown } | null>(join(root, 'config/settings.json'), null)
|
|
47
|
-
if (Array.isArray(settings?.excludedSourceIds) && settings.excludedSourceIds.includes(runId)) throw new Error('run excluded in settings')
|
|
48
|
-
const projectId = run.mode === 'chat' || run.mode === 'code' ? run.projectId : null
|
|
49
|
-
let namespace: string
|
|
50
|
-
if (projectId) {
|
|
51
|
-
const project = findProject(root, projectId)
|
|
52
|
-
if (!project.autoMaintenance) throw new Error('automatic updates are paused for this project')
|
|
53
|
-
namespace = project.wikiNamespace
|
|
54
|
-
} else if (run.mode === 'chat') {
|
|
55
|
-
if (chatUpdatesPaused(settings)) throw new Error('automatic updates are paused for Chat')
|
|
56
|
-
namespace = store.LIBRARY_NAMESPACE
|
|
57
|
-
} else {
|
|
58
|
-
throw new Error('run has no project')
|
|
59
|
-
}
|
|
60
|
-
const text = transcript(run.goal ?? '', readEvents(root, runId))
|
|
61
|
-
if (!text.includes('Assistant:')) throw new Error('no recorded assistant output to use as evidence')
|
|
62
|
-
if (looksSecret(text)) throw new Error('the run contains text that looks like a credential')
|
|
63
|
-
return { namespace, transcript: text }
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* The blocks attached to a run, which its consolidation may rewrite: an agent's blocks for its
|
|
68
|
-
* own conversation, or the `user` block and the project's brief for a session in a project.
|
|
69
|
-
*/
|
|
70
|
-
function runBlocks(env: HarnessEnv, runId: string): blocks.Block[] {
|
|
71
|
-
const run = findRun(env.root, runId)
|
|
72
|
-
if (!run) return []
|
|
73
|
-
const chat = run.mode === 'chat'
|
|
74
|
-
// What the session was told it is when it started, when that was recorded.
|
|
75
|
-
const recorded = readJsonOr<CallerContext | null>(join(env.root, 'runs', run.id, 'caller.json'), null)
|
|
76
|
-
const context: CallerContext = recorded ?? {
|
|
77
|
-
runId: run.id,
|
|
78
|
-
sessionId: run.sessionId,
|
|
79
|
-
projectId: run.projectId,
|
|
80
|
-
// A conversation's run names its agent; older records rely on the session being the agent's own.
|
|
81
|
-
agentId: chat ? (run.agentId ?? (env.directory.agentName(run.sessionId) !== null ? run.sessionId : null)) : null,
|
|
82
|
-
actor: chat ? 'Chat' : 'Code'
|
|
83
|
-
}
|
|
84
|
-
let attached: blocks.Block[]
|
|
85
|
-
try {
|
|
86
|
-
attached = callerBlocks(env, context).attached
|
|
87
|
-
} catch {
|
|
88
|
-
// A run with no single agent has only the shared user block attached.
|
|
89
|
-
attached = [blocks.ensureUser(store.wikiDir(env.root))]
|
|
90
|
-
}
|
|
91
|
-
return attached.filter((block) => !block.front.readOnly)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* What the job sees of the Wiki: the target namespace's pages, entries relevant to the
|
|
96
|
-
* evidence from anywhere (the closest few in full), and the facts that apply.
|
|
97
|
-
*/
|
|
98
|
-
function maintainerContext(root: string, namespace: string, evidence: string): { pages: ExistingPage[]; memories: ExistingMemory[] } {
|
|
99
|
-
const wiki = store.wikiDir(root)
|
|
100
|
-
const pages = store.loadPages(wiki)
|
|
101
|
-
const query = evidence.split(/\s+/).filter((word) => Buffer.byteLength(word) > 4).slice(0, 12).join(' ')
|
|
102
|
-
const ranked = searchEntries(root, query, { kinds: ['page'], limit: 30 }).map((hit) => hit.id)
|
|
103
|
-
const inFull = new Set(ranked.slice(0, FULL_PAGES))
|
|
104
|
-
const small = pages.filter((page) => page.location.namespace === namespace).length <= FULL_PAGES
|
|
105
|
-
return {
|
|
106
|
-
pages: pages
|
|
107
|
-
.filter((page) => page.location.namespace === namespace || ranked.includes(page.frontmatter.id))
|
|
108
|
-
.slice(0, 150)
|
|
109
|
-
.map((page) => ({
|
|
110
|
-
id: page.frontmatter.id,
|
|
111
|
-
title: page.frontmatter.title,
|
|
112
|
-
type: page.frontmatter.type,
|
|
113
|
-
path: page.location.path,
|
|
114
|
-
summary: store.firstParagraph(page.body),
|
|
115
|
-
// An update replaces the whole body, so the job must see what the page says now.
|
|
116
|
-
...(inFull.has(page.frontmatter.id) || (page.location.namespace === namespace && small) ? { body: takeChars(page.body, FULL_PAGE_LIMIT) } : {})
|
|
117
|
-
})),
|
|
118
|
-
memories: facts
|
|
119
|
-
.loadMemories(wiki)
|
|
120
|
-
.filter((memory) => facts.appliesTo(memory.front, store.projectNamespaceOf(namespace)))
|
|
121
|
-
.slice(0, 60)
|
|
122
|
-
.map((memory) => ({ id: memory.front.id, title: memory.front.title, kind: memory.front.kind, namespace: memory.front.namespace, body: takeChars(memory.body, 300) }))
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/** Blocks at or over `NEAR_LIMIT_PERCENT` of their limit that have not been tried in this state. */
|
|
127
|
-
export function fullBlocks(wiki: string, tried: Set<string>): string[] {
|
|
128
|
-
return blocks
|
|
129
|
-
.loadAll(wiki)
|
|
130
|
-
.filter((block) => !block.front.readOnly && block.front.limit > 0 && charCount(block.body) * 100 >= block.front.limit * NEAR_LIMIT_PERCENT)
|
|
131
|
-
.filter((block) => {
|
|
132
|
-
const key = `${block.id}\u0000${store.currentRevision(wiki, block.id) ?? ''}`
|
|
133
|
-
return !tried.has(key) && Boolean(tried.add(key))
|
|
134
|
-
})
|
|
135
|
-
.map((block) => block.id)
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const blockValues = (found: readonly blocks.Block[]): ExistingBlock[] => found.map((block) => ({ id: block.id, label: block.front.label, description: block.front.description, limit: block.front.limit, body: block.body }))
|
|
139
|
-
|
|
140
|
-
export interface MaintenanceOptions {
|
|
141
|
-
env: HarnessEnv
|
|
142
|
-
bus: Bus
|
|
143
|
-
accounts: Accounts
|
|
144
|
-
factory?: MaintainerFactory
|
|
145
|
-
/** How long the queue stays empty before full blocks are condensed. */
|
|
146
|
-
idleMs?: number
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export class Maintenance {
|
|
150
|
-
private chain: Promise<void> = Promise.resolve()
|
|
151
|
-
private idle: ReturnType<typeof setTimeout> | null = null
|
|
152
|
-
private readonly tried = new Set<string>()
|
|
153
|
-
private stopped = false
|
|
154
|
-
|
|
155
|
-
constructor(private readonly options: MaintenanceOptions) {}
|
|
156
|
-
|
|
157
|
-
/** Starts the idle check. Jobs can be queued whether or not it runs. */
|
|
158
|
-
start(): void {
|
|
159
|
-
this.stopped = false
|
|
160
|
-
this.rest()
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
stop(): void {
|
|
164
|
-
this.stopped = true
|
|
165
|
-
if (this.idle) clearTimeout(this.idle)
|
|
166
|
-
this.idle = null
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/** Resolves when every queued job has finished. */
|
|
170
|
-
settled(): Promise<void> {
|
|
171
|
-
return this.chain
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
private rest(): void {
|
|
175
|
-
if (this.idle) clearTimeout(this.idle)
|
|
176
|
-
if (this.stopped) return
|
|
177
|
-
this.idle = setTimeout(() => {
|
|
178
|
-
try {
|
|
179
|
-
const blockIds = fullBlocks(store.wikiDir(this.options.env.root), this.tried)
|
|
180
|
-
if (blockIds.length) this.enqueue({ kind: 'consolidate', blockIds })
|
|
181
|
-
else this.rest()
|
|
182
|
-
} catch {
|
|
183
|
-
this.rest()
|
|
184
|
-
}
|
|
185
|
-
}, this.options.idleMs ?? IDLE_CHECK_MS)
|
|
186
|
-
this.idle.unref?.()
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
enqueue(job: Job): void {
|
|
190
|
-
if (this.idle) clearTimeout(this.idle)
|
|
191
|
-
this.chain = this.chain
|
|
192
|
-
.then(() => this.process(job))
|
|
193
|
-
.catch((error) => log('maintenance', error instanceof Error ? error.message : String(error)))
|
|
194
|
-
.then(() => this.rest())
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/** A settled run is evidence; whether it is eligible is decided when its job runs. */
|
|
198
|
-
onRunEvent(event: RunEvent): void {
|
|
199
|
-
if (event.type === 'completed') this.enqueue({ kind: 'run', runId: event.runId })
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
private async process(job: Job): Promise<void> {
|
|
203
|
-
const { env, bus } = this.options
|
|
204
|
-
const root = env.root
|
|
205
|
-
const wiki = store.wikiDir(root)
|
|
206
|
-
const evidence: Evidence = {}
|
|
207
|
-
let attached: blocks.Block[] = []
|
|
208
|
-
let namespace: string
|
|
209
|
-
let trigger: Trigger
|
|
210
|
-
let request: MaintenanceRequest['trigger']
|
|
211
|
-
let shown = ''
|
|
212
|
-
if (job.kind === 'ingest') {
|
|
213
|
-
const directory = join(wiki, 'raw', job.sourceId)
|
|
214
|
-
const name = readJsonOr<{ name?: unknown } | null>(join(directory, 'meta.json'), null)?.name
|
|
215
|
-
const sourceName = typeof name === 'string' ? name : 'source'
|
|
216
|
-
let text: string | null = null
|
|
217
|
-
try {
|
|
218
|
-
text = new TextDecoder('utf-8', { fatal: true }).decode(readFileSync(join(directory, sourceName)))
|
|
219
|
-
} catch {
|
|
220
|
-
text = null
|
|
221
|
-
}
|
|
222
|
-
if (text === null) {
|
|
223
|
-
inbox(wiki, 'unresolved', `${sourceName} was imported but not summarized`, 'Only text sources can be synthesized automatically right now.', [])
|
|
224
|
-
bus.emit({ type: 'wiki.changed' })
|
|
225
|
-
return
|
|
226
|
-
}
|
|
227
|
-
shown = takeChars(text, 60_000)
|
|
228
|
-
evidence.sourceText = text
|
|
229
|
-
namespace = job.namespace
|
|
230
|
-
trigger = { kind: 'ingest', sourceId: job.sourceId, sourceName }
|
|
231
|
-
request = { kind: 'ingest', sourceId: job.sourceId, sourceName, text: shown }
|
|
232
|
-
} else if (job.kind === 'run') {
|
|
233
|
-
let found: ReturnType<typeof runEvidence>
|
|
234
|
-
try {
|
|
235
|
-
found = runEvidence(root, job.runId)
|
|
236
|
-
} catch (error) {
|
|
237
|
-
log(`maintenance skipped run ${job.runId}: ${error instanceof Error ? error.message : String(error)}`)
|
|
238
|
-
return
|
|
239
|
-
}
|
|
240
|
-
evidence.runText = evidenceText(root, job.runId)
|
|
241
|
-
attached = runBlocks(env, job.runId)
|
|
242
|
-
shown = found.transcript
|
|
243
|
-
namespace = found.namespace
|
|
244
|
-
trigger = { kind: 'run', runId: job.runId }
|
|
245
|
-
request = { kind: 'run', runId: job.runId, transcript: shown }
|
|
246
|
-
} else {
|
|
247
|
-
attached = job.blockIds.flatMap((id) => {
|
|
248
|
-
try {
|
|
249
|
-
const block = blocks.find(wiki, id)
|
|
250
|
-
return block.front.readOnly ? [] : [block]
|
|
251
|
-
} catch {
|
|
252
|
-
return []
|
|
253
|
-
}
|
|
254
|
-
})
|
|
255
|
-
if (!attached.length) return
|
|
256
|
-
namespace = store.LIBRARY_NAMESPACE
|
|
257
|
-
trigger = { kind: 'consolidate' }
|
|
258
|
-
request = { kind: 'consolidate' }
|
|
259
|
-
}
|
|
260
|
-
evidence.blocks = attached.map((block) => block.id)
|
|
261
|
-
const captured = captureHashes(wiki)
|
|
262
|
-
const context = trigger.kind === 'consolidate' ? { pages: [], memories: [] } : maintainerContext(root, namespace, shown)
|
|
263
|
-
let index = ''
|
|
264
|
-
try {
|
|
265
|
-
index = takeChars(readFileSync(join(wiki, 'index.md'), 'utf8'), 8000)
|
|
266
|
-
} catch {
|
|
267
|
-
index = ''
|
|
268
|
-
}
|
|
269
|
-
const described = describeTrigger(trigger)
|
|
270
|
-
try {
|
|
271
|
-
// The job runs on the default account.
|
|
272
|
-
const account = this.options.accounts.context(this.options.accounts.resolve())
|
|
273
|
-
const proposed = await runMaintenance(
|
|
274
|
-
{ jobId: newId(), namespace, trigger: request, pages: context.pages, memories: context.memories, blocks: blockValues(attached), namespaces: namespaces(root), index },
|
|
275
|
-
{ cwd: wiki, product: env.productName, account, runtime: () => this.options.accounts.runtime(account) },
|
|
276
|
-
this.options.factory ?? piMaintainerFactory
|
|
277
|
-
)
|
|
278
|
-
const outcome = apply(wiki, namespace, trigger, parseProposalSet(proposed), captured, evidence)
|
|
279
|
-
reindexQuietly(root)
|
|
280
|
-
if (outcome.operation) {
|
|
281
|
-
const count = outcome.operation.pages.length
|
|
282
|
-
bus.emit({ type: 'wiki.maintenance', namespace, title: `Wiki updated ${count} entr${count === 1 ? 'y' : 'ies'}`, detail: `From ${described}. ${outcome.parked} parked, ${outcome.flagged} flagged for review.` })
|
|
283
|
-
}
|
|
284
|
-
} catch (error) {
|
|
285
|
-
const message = error instanceof Error ? error.message : String(error)
|
|
286
|
-
try {
|
|
287
|
-
inbox(wiki, 'blocked', `Consolidation for ${described} did not finish`, message, [])
|
|
288
|
-
store.log(wiki, `- ${now()} · Sleep-time · ${described} · failed: ${message}`)
|
|
289
|
-
} catch {
|
|
290
|
-
// The failure is still logged by the queue.
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
bus.emit({ type: 'wiki.changed' })
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
// ---- What a person does from the Inbox -------------------------------------------------------
|
|
297
|
-
|
|
298
|
-
/** Reverts an applied operation through new revisions. */
|
|
299
|
-
undoOperation(operationId: string): void {
|
|
300
|
-
const { root } = this.options.env
|
|
301
|
-
const wiki = store.wikiDir(root)
|
|
302
|
-
const operation = undo(wiki, operationId)
|
|
303
|
-
writeIndex(wiki)
|
|
304
|
-
const count = operation.pages.length
|
|
305
|
-
inbox(wiki, 'applied', `Undid an update to ${count} entr${count === 1 ? 'y' : 'ies'}`, "Earlier content was restored as new revisions; created entries moved to the Wiki's trash folder.", operation.pages.map((page) => page.pageId))
|
|
306
|
-
reindexQuietly(root)
|
|
307
|
-
this.options.bus.emit({ type: 'wiki.changed' })
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
/** Accepts a parked proposal with the user as the authority. */
|
|
311
|
-
acceptInboxItem(itemId: string): string {
|
|
312
|
-
const { root } = this.options.env
|
|
313
|
-
const message = accept(root, itemId)
|
|
314
|
-
reindexQuietly(root)
|
|
315
|
-
this.options.bus.emit({ type: 'wiki.changed' })
|
|
316
|
-
return message
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
/** Imports a file as an immutable source and queues the job that reads it. */
|
|
320
|
-
ingest(name: string, bytes: Uint8Array, namespace: string = store.LIBRARY_NAMESPACE): store.WikiSource {
|
|
321
|
-
const { root } = this.options.env
|
|
322
|
-
const wiki = store.wikiDir(root)
|
|
323
|
-
store.namespaceDir(wiki, namespace)
|
|
324
|
-
const source = store.importSource(wiki, name.replace(/[/\\]/g, '_'), bytes)
|
|
325
|
-
reindexQuietly(root)
|
|
326
|
-
this.enqueue({ kind: 'ingest', namespace, sourceId: source.id })
|
|
327
|
-
return source
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
package/src/memory/migrate.ts
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
// Storage migration to version 3: memory blocks, facts, and the Library.
|
|
2
|
-
//
|
|
3
|
-
// Version 3 starts from an empty Wiki. Whatever came before is kept whole as a backup and is
|
|
4
|
-
// not carried over: a version 2 `wiki/` becomes `wiki.pre-v3/`, and a version 1 `knowledge/`
|
|
5
|
-
// becomes `knowledge.pre-v2/`. The new tree is staged in `wiki.migrating/` before anything is
|
|
6
|
-
// renamed; on failure the staged tree is removed and the earlier Wiki is left in place.
|
|
7
|
-
import { existsSync, renameSync, rmSync } from 'node:fs'
|
|
8
|
-
import { join } from 'node:path'
|
|
9
|
-
|
|
10
|
-
import type { HarnessEnv } from '../core/env'
|
|
11
|
-
import { HarnessError } from '../core/errors'
|
|
12
|
-
import { now, readJsonOr, writeJson } from '../core/fs'
|
|
13
|
-
import { listProjects } from '../core/projects'
|
|
14
|
-
import * as registry from '../skills/registry'
|
|
15
|
-
import * as blocks from './blocks'
|
|
16
|
-
import { writeIndex } from './proposals'
|
|
17
|
-
import * as store from './store'
|
|
18
|
-
|
|
19
|
-
export const WIKI_VERSION = 3
|
|
20
|
-
|
|
21
|
-
const storagePath = (root: string): string => join(root, 'config/storage.json')
|
|
22
|
-
|
|
23
|
-
export function version(root: string): number {
|
|
24
|
-
const stored = readJsonOr<{ wikiVersion?: unknown } | null>(storagePath(root), null)?.wikiVersion
|
|
25
|
-
if (typeof stored === 'number' && Number.isInteger(stored) && stored >= 0) return stored
|
|
26
|
-
const wiki = store.wikiDir(root)
|
|
27
|
-
if (store.isDir(join(root, 'knowledge'))) return 1
|
|
28
|
-
// A version 2 Wiki whose marker is missing still has its old folders and no blocks.
|
|
29
|
-
if (!existsSync(join(wiki, 'blocks')) && (store.isDir(join(wiki, 'docs')) || store.isDir(join(wiki, 'memory')))) return 2
|
|
30
|
-
return WIKI_VERSION
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const stamp = (): string => now().replace(/[:.]/g, '-')
|
|
34
|
-
|
|
35
|
-
/** Moves `from` to `<name>` beside it, or `<name>-<time>` when that backup already exists. */
|
|
36
|
-
function backUp(root: string, from: string, name: string): void {
|
|
37
|
-
if (!existsSync(from)) return
|
|
38
|
-
renameSync(from, existsSync(join(root, name)) ? join(root, `${name}-${stamp()}`) : join(root, name))
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Brings a data root to the current Wiki layout. Safe to call on every start. `agentIds` are
|
|
43
|
-
* the agents that get their own blocks. Returns whether a migration happened.
|
|
44
|
-
*/
|
|
45
|
-
export function run(env: HarnessEnv, agentIds: readonly string[] = []): boolean {
|
|
46
|
-
const { root } = env
|
|
47
|
-
if (version(root) >= WIKI_VERSION) return false
|
|
48
|
-
const failed = (detail: string): HarnessError => new HarnessError('migration_failed', `The Wiki was not migrated to version 3; your Wiki is unchanged. ${detail}`)
|
|
49
|
-
const staging = join(root, 'wiki.migrating')
|
|
50
|
-
rmSync(staging, { recursive: true, force: true })
|
|
51
|
-
try {
|
|
52
|
-
store.ensureLayoutAt(staging, env.productName)
|
|
53
|
-
blocks.ensureUser(staging)
|
|
54
|
-
for (const agentId of agentIds) blocks.ensureAgent(staging, agentId)
|
|
55
|
-
for (const project of listProjects(root)) blocks.ensureProject(staging, project.slug, project.name)
|
|
56
|
-
store.log(staging, `- ${now()} · ${env.productName} · started storage version 3; the earlier Wiki is kept as a backup beside it`)
|
|
57
|
-
backUp(root, store.wikiDir(root), 'wiki.pre-v3')
|
|
58
|
-
} catch (error) {
|
|
59
|
-
rmSync(staging, { recursive: true, force: true })
|
|
60
|
-
throw failed(error instanceof Error ? error.message : String(error))
|
|
61
|
-
}
|
|
62
|
-
renameSync(staging, store.wikiDir(root))
|
|
63
|
-
backUp(root, join(root, 'knowledge'), 'knowledge.pre-v2')
|
|
64
|
-
|
|
65
|
-
store.ensureLayout(root, env.productName)
|
|
66
|
-
for (const project of listProjects(root)) store.ensureProjectNamespace(root, project.slug, project.name)
|
|
67
|
-
// Registry items that version 1 enabled for personal agents are enabled for everyone.
|
|
68
|
-
const enablement = registry.enablement(root)
|
|
69
|
-
if ('personal' in enablement) {
|
|
70
|
-
const ids = registry.enablementIds(enablement, registry.GLOBAL_KEY)
|
|
71
|
-
for (const id of registry.enablementIds(enablement, 'personal')) if (!ids.includes(id)) ids.push(id)
|
|
72
|
-
delete enablement.personal
|
|
73
|
-
enablement[registry.GLOBAL_KEY] = ids
|
|
74
|
-
writeJson(join(root, 'config/registry-enabled.json'), enablement)
|
|
75
|
-
}
|
|
76
|
-
writeIndex(store.wikiDir(root))
|
|
77
|
-
writeJson(storagePath(root), { wikiVersion: WIKI_VERSION, migratedAt: now() })
|
|
78
|
-
return true
|
|
79
|
-
}
|
package/src/memory/operations.ts
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
// Operations: one applied change to the Wiki, recorded so it can be undone. Undo writes new
|
|
2
|
-
// revisions and never erases history. The Inbox holds what was applied, parked, or flagged.
|
|
3
|
-
import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync } from 'node:fs'
|
|
4
|
-
import { join } from 'node:path'
|
|
5
|
-
|
|
6
|
-
import { noteChange } from '../core/changes'
|
|
7
|
-
import { invalid, notFound } from '../core/errors'
|
|
8
|
-
import { atomicWrite, newId, now, readJson, safeId, writeJson } from '../core/fs'
|
|
9
|
-
import { compareText } from '../core/text'
|
|
10
|
-
import * as store from './store'
|
|
11
|
-
|
|
12
|
-
export interface OperationPage {
|
|
13
|
-
pageId: string
|
|
14
|
-
path: string
|
|
15
|
-
/** Revision holding the content before this operation; `null` when the entry was created. */
|
|
16
|
-
beforeRevisionId: string | null
|
|
17
|
-
afterRevisionId: string
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface Operation {
|
|
21
|
-
id: string
|
|
22
|
-
createdAt: string
|
|
23
|
-
trigger: string
|
|
24
|
-
pages: OperationPage[]
|
|
25
|
-
undone: boolean
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function operationsDir(wiki: string): string {
|
|
29
|
-
return join(wiki, 'operations')
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function listOperations(wiki: string): Operation[] {
|
|
33
|
-
let names: string[]
|
|
34
|
-
try {
|
|
35
|
-
names = readdirSync(operationsDir(wiki))
|
|
36
|
-
} catch {
|
|
37
|
-
return []
|
|
38
|
-
}
|
|
39
|
-
const operations: Operation[] = []
|
|
40
|
-
for (const name of names) {
|
|
41
|
-
try {
|
|
42
|
-
const operation = readJson<Operation>(join(operationsDir(wiki), name))
|
|
43
|
-
if (operation && typeof operation.id === 'string' && Array.isArray(operation.pages)) operations.push({ ...operation, undone: operation.undone ?? false })
|
|
44
|
-
} catch {
|
|
45
|
-
// Not an operation record.
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return operations
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function lastOperationAt(wiki: string): string | null {
|
|
52
|
-
return listOperations(wiki).map((operation) => operation.createdAt).sort(compareText).at(-1) ?? null
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface InboxItem {
|
|
56
|
-
id: string
|
|
57
|
-
kind: string
|
|
58
|
-
title: string
|
|
59
|
-
detail: string
|
|
60
|
-
pageIds: string[]
|
|
61
|
-
createdAt: string
|
|
62
|
-
/** Operation this item reports, so it can be undone from the Inbox. */
|
|
63
|
-
operationId: string | null
|
|
64
|
-
/** A parked proposal the user can accept (`kind`, `proposal`, `namespace`). */
|
|
65
|
-
payload?: unknown
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export function inbox(wiki: string, kind: string, title: string, detail: string, pageIds: string[], operationId: string | null = null, payload?: unknown): void {
|
|
69
|
-
const item: InboxItem = { id: newId(), kind, title, detail, pageIds, createdAt: now(), operationId, ...(payload === undefined || payload === null ? {} : { payload }) }
|
|
70
|
-
writeJson(join(wiki, 'inbox', `${item.id}.json`), item)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/** Inbox items, newest first. */
|
|
74
|
-
export function listInbox(wiki: string): InboxItem[] {
|
|
75
|
-
let names: string[]
|
|
76
|
-
try {
|
|
77
|
-
names = readdirSync(join(wiki, 'inbox'))
|
|
78
|
-
} catch {
|
|
79
|
-
return []
|
|
80
|
-
}
|
|
81
|
-
const items: InboxItem[] = []
|
|
82
|
-
for (const name of names) {
|
|
83
|
-
try {
|
|
84
|
-
const item = readJson<InboxItem>(join(wiki, 'inbox', name))
|
|
85
|
-
if (item && typeof item.id === 'string' && typeof item.kind === 'string') items.push({ ...item, operationId: item.operationId ?? null })
|
|
86
|
-
} catch {
|
|
87
|
-
// Folders (`dismissed/`) and unreadable files are not items.
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return items.sort((left, right) => compareText(right.createdAt, left.createdAt))
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export function dismissInboxItem(wiki: string, itemId: string): void {
|
|
94
|
-
const source = join(wiki, 'inbox', `${safeId(itemId)}.json`)
|
|
95
|
-
const target = join(wiki, 'inbox', 'dismissed')
|
|
96
|
-
mkdirSync(target, { recursive: true })
|
|
97
|
-
try {
|
|
98
|
-
renameSync(source, join(target, `${itemId}.json`))
|
|
99
|
-
} catch {
|
|
100
|
-
throw notFound('Inbox item')
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/** Reverts an operation through new revisions. Entries it created move to `trash/`. */
|
|
105
|
-
export function undo(wiki: string, operationId: string): Operation {
|
|
106
|
-
const path = join(operationsDir(wiki), `${safeId(operationId)}.json`)
|
|
107
|
-
const operation = readJson<Operation>(path)
|
|
108
|
-
if (!operation) throw notFound('Maintenance operation')
|
|
109
|
-
if (operation.undone) throw invalid('This operation was already undone.')
|
|
110
|
-
const short = operation.id.slice(0, 8)
|
|
111
|
-
for (const page of operation.pages) {
|
|
112
|
-
let current = ''
|
|
113
|
-
try {
|
|
114
|
-
current = readFileSync(page.path, 'utf8')
|
|
115
|
-
} catch {
|
|
116
|
-
current = ''
|
|
117
|
-
}
|
|
118
|
-
if (page.beforeRevisionId) {
|
|
119
|
-
const previous = store.revisionText(wiki, page.pageId, page.beforeRevisionId)
|
|
120
|
-
store.snapshot(wiki, page.pageId, current, 'user', `Before undo of ${short}`)
|
|
121
|
-
atomicWrite(page.path, previous)
|
|
122
|
-
store.snapshot(wiki, page.pageId, previous, 'user', `Undo of update ${short}`)
|
|
123
|
-
noteChange({ wiki, id: page.pageId, path: page.path, text: previous, actor: 'user', reason: 'Undid an update' })
|
|
124
|
-
} else {
|
|
125
|
-
const trash = join(wiki, 'trash')
|
|
126
|
-
mkdirSync(trash, { recursive: true })
|
|
127
|
-
if (existsSync(page.path)) {
|
|
128
|
-
const target = join(trash, `${page.pageId}-${now().replace(/[:.]/g, '-')}.md`)
|
|
129
|
-
mkdirSync(join(target, '..'), { recursive: true })
|
|
130
|
-
renameSync(page.path, target)
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
operation.undone = true
|
|
135
|
-
writeJson(path, operation)
|
|
136
|
-
store.log(wiki, `- ${now()} · user · undo · op \`${operation.id}\``)
|
|
137
|
-
return operation
|
|
138
|
-
}
|