@ouro.bot/cli 0.1.0-alpha.8 → 0.1.0-alpha.800
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/LICENSE +21 -0
- package/README.md +249 -176
- package/RepairGuide.ouro/agent.json +5 -0
- package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
- package/RepairGuide.ouro/psyche/SOUL.md +55 -0
- package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
- package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
- package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
- package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
- package/SerpentGuide.ouro/agent.json +83 -0
- package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/assets/bluebubbles-host +264 -0
- package/assets/ouroboros.png +0 -0
- package/changelog.json +5563 -0
- package/deploy/unraid/Dockerfile +48 -0
- package/deploy/unraid/README.txt +3012 -0
- package/deploy/unraid/audit-container-spec.sh +4 -0
- package/deploy/unraid/container-runtime.json +1 -0
- package/deploy/unraid/docker-man-template-transaction.mjs +526 -0
- package/deploy/unraid/docker-man-template-xml.cjs +105 -0
- package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
- package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
- package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
- package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
- package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
- package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
- package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
- package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
- package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
- package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
- package/deploy/unraid/sanctuary-safe-rename.py +24 -0
- package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2030 -0
- package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
- package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
- package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
- package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
- package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
- package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
- package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
- package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +11 -0
- package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
- package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +11 -0
- package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
- package/deploy/unraid/sanctuary.ouro/tool-profiles.json +23 -0
- package/deploy/unraid/sanctuary.xml +27 -0
- package/dist/a2a/card.js +57 -0
- package/dist/a2a/client.js +180 -0
- package/dist/a2a/config.js +50 -0
- package/dist/a2a/delegation-stores.js +56 -0
- package/dist/a2a/did-resolution.js +93 -0
- package/dist/a2a/identity.js +170 -0
- package/dist/a2a/inbound-share.js +107 -0
- package/dist/a2a/mission-result-wire.js +196 -0
- package/dist/a2a/onboarding.js +115 -0
- package/dist/a2a/pin-store.js +132 -0
- package/dist/a2a/seen-ledger.js +120 -0
- package/dist/a2a/server.js +604 -0
- package/dist/a2a/task-store.js +69 -0
- package/dist/a2a/transport.js +45 -0
- package/dist/a2a/types.js +3 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +360 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/evolution.js +490 -0
- package/dist/arc/flight-recorder.js +1034 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +386 -0
- package/dist/arc/packets.js +336 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +57 -0
- package/dist/commerce/store.js +755 -0
- package/dist/commerce/types.js +3 -0
- package/dist/heart/active-work.js +1009 -0
- package/dist/heart/agent-entry.js +252 -3
- package/dist/heart/approval-files.js +113 -0
- package/dist/heart/approval-store.js +950 -0
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +18 -0
- package/dist/heart/attachments/sources/telegram.js +71 -0
- package/dist/heart/attachments/store.js +132 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +495 -0
- package/dist/heart/autonomy-budget.js +478 -0
- package/dist/heart/awaiting/await-alert.js +148 -0
- package/dist/heart/awaiting/await-expiry.js +143 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +149 -0
- package/dist/heart/awaiting/await-runtime-state.js +100 -0
- package/dist/heart/awaiting/await-scheduler.js +382 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +478 -0
- package/dist/heart/bridges/state-machine.js +135 -0
- package/dist/heart/bridges/store.js +135 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +135 -0
- package/dist/heart/config-registry.js +331 -0
- package/dist/heart/config.js +195 -137
- package/dist/heart/context-loss-gauntlet.js +387 -0
- package/dist/heart/context-loss-sentinel.js +1157 -0
- package/dist/heart/core.js +2257 -338
- package/dist/heart/cross-chat-delivery.js +133 -0
- package/dist/heart/daemon/agent-config-check.js +451 -0
- package/dist/heart/daemon/agent-discovery.js +263 -0
- package/dist/heart/daemon/agent-service.js +542 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/await-private-wake.js +59 -0
- package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
- package/dist/heart/daemon/bluebubbles-host.js +273 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +180 -0
- package/dist/heart/daemon/cli-defaults.js +836 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +8730 -0
- package/dist/heart/daemon/cli-help.js +710 -0
- package/dist/heart/daemon/cli-parse.js +2719 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +777 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
- package/dist/heart/daemon/container-healthcheck.js +112 -0
- package/dist/heart/daemon/container-runtime.js +97 -0
- package/dist/heart/daemon/container-spec-auditor-main.js +170 -0
- package/dist/heart/daemon/container-spec-auditor.js +236 -0
- package/dist/heart/daemon/daemon-bootstrap-startup.js +107 -0
- package/dist/heart/daemon/daemon-cli.js +30 -786
- package/dist/heart/daemon/daemon-entry.js +971 -13
- package/dist/heart/daemon/daemon-health.js +186 -0
- package/dist/heart/daemon/daemon-rollup.js +57 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +2156 -28
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +1755 -0
- package/dist/heart/daemon/freshness.js +345 -0
- package/dist/heart/daemon/habit-private-wake.js +61 -0
- package/dist/heart/daemon/health-monitor.js +142 -11
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +226 -0
- package/dist/heart/daemon/http-health-probe.js +80 -0
- package/dist/heart/daemon/human-command-screens.js +234 -0
- package/dist/heart/daemon/human-readiness.js +114 -0
- package/dist/heart/daemon/inner-status.js +78 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +188 -0
- package/dist/heart/daemon/log-tailer.js +82 -12
- package/dist/heart/daemon/logs-prune.js +132 -0
- package/dist/heart/daemon/mcp-canary.js +524 -0
- package/dist/heart/daemon/message-router.js +80 -11
- package/dist/heart/daemon/migrate-to-desk.js +848 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +22 -14
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/plugin-cli.js +432 -0
- package/dist/heart/daemon/process-manager.js +739 -54
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/prunable-bundle.js +144 -0
- package/dist/heart/daemon/pulse.js +511 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +39 -0
- package/dist/heart/daemon/runtime-logging.js +92 -16
- package/dist/heart/daemon/runtime-metadata.js +191 -0
- package/dist/{repertoire/tasks/lifecycle.js → heart/daemon/runtime-mode.js} +37 -39
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2609 -0
- package/dist/heart/daemon/sanctuary-acceptance-harness.js +1866 -0
- package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
- package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +976 -0
- package/dist/heart/daemon/sanctuary-bundle-migration.js +728 -0
- package/dist/heart/daemon/sanctuary-package-management.js +103 -0
- package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
- package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
- package/dist/heart/daemon/sense-manager.js +948 -0
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +94 -0
- package/dist/heart/daemon/socket-client.js +370 -0
- package/dist/heart/daemon/stale-bundle-prune.js +113 -0
- package/dist/heart/daemon/startup-tui.js +339 -0
- package/dist/heart/daemon/supercronic-supervisor.js +282 -0
- package/dist/heart/daemon/task-scheduler.js +117 -39
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +591 -0
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +59 -0
- package/dist/heart/external-events/router.js +1414 -0
- package/dist/heart/habits/habit-cancel.js +810 -0
- package/dist/heart/habits/habit-lifecycle.js +1327 -0
- package/dist/heart/habits/habit-migration.js +194 -0
- package/dist/heart/habits/habit-parser.js +278 -0
- package/dist/heart/habits/habit-runtime-state.js +93 -0
- package/dist/heart/habits/habit-scheduler.js +653 -0
- package/dist/heart/habits/habit-session-summary.js +318 -0
- package/dist/heart/habits/habit-session.js +636 -0
- package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
- package/dist/heart/{daemon → hatch}/hatch-flow.js +57 -139
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/hatch/specialist-orchestrator.js +129 -0
- package/dist/heart/hatch/specialist-prompt.js +102 -0
- package/dist/heart/hatch/specialist-tools.js +318 -0
- package/dist/heart/identity.js +297 -67
- package/dist/heart/kept-notes.js +289 -0
- package/dist/heart/kicks.js +2 -20
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +353 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +39 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +197 -0
- package/dist/heart/mailbox/readers/agent-machine.js +428 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
- package/dist/heart/mailbox/readers/sessions.js +232 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +696 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +59 -0
- package/dist/heart/orientation-frame.js +345 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/primitives.js +1 -1
- package/dist/heart/private-runtime/decision-renderer.js +158 -0
- package/dist/heart/private-runtime/index.js +18 -0
- package/dist/heart/private-runtime/ledger.js +221 -0
- package/dist/heart/private-runtime/policy.js +252 -0
- package/dist/heart/private-runtime/types.js +2 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-attempt.js +137 -0
- package/dist/heart/provider-binding-resolver.js +273 -0
- package/dist/heart/provider-credentials.js +449 -0
- package/dist/heart/provider-failover.js +311 -0
- package/dist/heart/provider-models.js +96 -0
- package/dist/heart/provider-ping.js +265 -0
- package/dist/heart/provider-readiness-cache.js +119 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +236 -58
- package/dist/heart/providers/azure.js +104 -13
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +145 -0
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +29 -7
- package/dist/heart/providers/openai-codex-token.js +349 -0
- package/dist/heart/providers/openai-codex.js +63 -39
- package/dist/heart/providers/openai-compatible.js +177 -0
- package/dist/heart/run-ledger.js +247 -0
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +607 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +79 -0
- package/dist/heart/session-activity.js +235 -0
- package/dist/heart/session-events.js +1318 -0
- package/dist/heart/session-playback-cli-main.js +5 -0
- package/dist/heart/session-playback-cli.js +36 -0
- package/dist/heart/session-playback.js +231 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +182 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/start-of-turn-packet.js +372 -0
- package/dist/heart/steward-policy.js +302 -0
- package/dist/heart/streaming.js +682 -207
- package/dist/heart/structured-output.js +196 -0
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +127 -0
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-approval.js +342 -0
- package/dist/heart/tool-description.js +155 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +481 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +432 -0
- package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
- package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
- package/dist/heart/versioning/ouro-version-manager.js +409 -0
- package/dist/heart/versioning/staged-restart.js +146 -0
- package/dist/heart/versioning/update-checker.js +116 -0
- package/dist/heart/versioning/update-hooks.js +154 -0
- package/dist/heart/versioning/version-intent.js +114 -0
- package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
- package/dist/heart/work-card.js +380 -0
- package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
- package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
- package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
- package/dist/mailbox-ui/index.html +16 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +889 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/cache-sync-cli.js +58 -0
- package/dist/mailroom/core.js +803 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +568 -0
- package/dist/mailroom/hosted-cache-sync.js +384 -0
- package/dist/mailroom/mbox-import.js +393 -0
- package/dist/mailroom/migration.js +164 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +292 -0
- package/dist/mailroom/search-cache.js +513 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +93 -1
- package/dist/mind/context.js +287 -104
- package/dist/mind/desk-section.js +362 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +90 -98
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/first-impressions.js +16 -2
- package/dist/mind/{associative-recall.js → note-search.js} +61 -60
- package/dist/mind/obligation-steering.js +227 -0
- package/dist/mind/pending.js +102 -9
- package/dist/mind/phrases.js +1 -0
- package/dist/mind/prompt-budget.js +479 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1377 -140
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/record-paths.js +312 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/session-transaction.js +415 -0
- package/dist/mind/token-estimate.js +8 -12
- package/dist/nerves/cli-logging.js +22 -3
- package/dist/nerves/coverage/audit-rules.js +15 -6
- package/dist/nerves/coverage/audit.js +28 -2
- package/dist/nerves/coverage/cli.js +1 -1
- package/dist/nerves/coverage/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +139 -5
- package/dist/nerves/coverage/run-artifacts.js +56 -36
- package/dist/nerves/coverage/source-scanner.js +4 -4
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +305 -9
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/review/cli-main.js +5 -0
- package/dist/nerves/review/cli.js +156 -0
- package/dist/nerves/review/core.js +159 -0
- package/dist/nerves/runtime.js +17 -1
- package/dist/repertoire/ado-client.js +17 -56
- package/dist/repertoire/ado-semantic.js +16 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +1045 -0
- package/dist/repertoire/bundle-templates.js +71 -0
- package/dist/repertoire/bw-installer.js +180 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +331 -0
- package/dist/repertoire/coding/feedback.js +322 -0
- package/dist/repertoire/coding/index.js +18 -3
- package/dist/repertoire/coding/manager.js +228 -14
- package/dist/repertoire/coding/spawner.js +61 -14
- package/dist/repertoire/coding/tools.js +279 -12
- package/dist/repertoire/coding/workbench-client.js +272 -0
- package/dist/repertoire/coding/workbench-manager.js +346 -0
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +178 -0
- package/dist/repertoire/data/ado-endpoints.json +188 -0
- package/dist/repertoire/desk/classifier.js +362 -0
- package/dist/repertoire/duffel-client.js +185 -0
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +1083 -0
- package/dist/repertoire/mcp-client.js +295 -0
- package/dist/repertoire/mcp-manager.js +434 -0
- package/dist/repertoire/mcp-tools.js +83 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/relationship-authorization.js +194 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +45 -24
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-arguments.js +148 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +699 -0
- package/dist/repertoire/tools-attachments.js +322 -0
- package/dist/repertoire/tools-awaiting.js +575 -0
- package/dist/repertoire/tools-base.js +85 -707
- package/dist/repertoire/tools-bluebubbles.js +95 -0
- package/dist/repertoire/tools-bridge.js +144 -0
- package/dist/repertoire/tools-bundle.js +993 -0
- package/dist/repertoire/tools-commerce.js +253 -0
- package/dist/repertoire/tools-config.js +186 -0
- package/dist/repertoire/tools-continuity.js +575 -0
- package/dist/repertoire/tools-credential.js +383 -0
- package/dist/repertoire/tools-evolution.js +527 -0
- package/dist/repertoire/tools-files.js +344 -0
- package/dist/repertoire/tools-flight.js +290 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-habits.js +103 -0
- package/dist/repertoire/tools-mail.js +1828 -0
- package/dist/repertoire/tools-notes.js +485 -0
- package/dist/repertoire/tools-obligations.js +182 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +482 -0
- package/dist/repertoire/tools-rsvp.js +139 -0
- package/dist/repertoire/tools-runtime.js +150 -0
- package/dist/repertoire/tools-session.js +1108 -0
- package/dist/repertoire/tools-shell.js +133 -0
- package/dist/repertoire/tools-steward-policy.js +95 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +369 -0
- package/dist/repertoire/tools-teams.js +67 -61
- package/dist/repertoire/tools-telegram-contacts.js +37 -0
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -0
- package/dist/repertoire/tools-unraid.js +484 -0
- package/dist/repertoire/tools-user-profile.js +146 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice.js +145 -0
- package/dist/repertoire/tools.js +441 -102
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/unraid-client.js +155 -0
- package/dist/repertoire/unraid-restart.js +212 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +628 -0
- package/dist/rsvp/aisleplanner-client.js +354 -0
- package/dist/rsvp/cli.js +926 -0
- package/dist/rsvp/config.js +327 -0
- package/dist/rsvp/cutover.js +433 -0
- package/dist/rsvp/diagnostics.js +232 -0
- package/dist/rsvp/diff-renderer.js +176 -0
- package/dist/rsvp/habit-policy.js +110 -0
- package/dist/rsvp/habit-stage.js +123 -0
- package/dist/rsvp/incident-bundle.js +97 -0
- package/dist/rsvp/migration.js +204 -0
- package/dist/rsvp/native-habit-runner.js +630 -0
- package/dist/rsvp/outbound-state.js +628 -0
- package/dist/rsvp/query.js +118 -0
- package/dist/rsvp/replay.js +233 -0
- package/dist/rsvp/snapshot.js +232 -0
- package/dist/rsvp/spend-ledger.js +175 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/a2a-entry.js +115 -0
- package/dist/senses/attention-queue.js +186 -0
- package/dist/senses/await-turn-message.js +58 -0
- package/dist/senses/bluebubbles/active-turns.js +216 -0
- package/dist/senses/bluebubbles/attachment-cache.js +53 -0
- package/dist/senses/bluebubbles/attachment-download.js +137 -0
- package/dist/senses/bluebubbles/client.js +799 -0
- package/dist/senses/bluebubbles/context-packet.js +207 -0
- package/dist/senses/bluebubbles/context-smoke.js +144 -0
- package/dist/senses/bluebubbles/entry.js +90 -0
- package/dist/senses/bluebubbles/inbound-log.js +127 -0
- package/dist/senses/bluebubbles/index.js +3839 -0
- package/dist/senses/bluebubbles/latest-turn.js +311 -0
- package/dist/senses/bluebubbles/media.js +389 -0
- package/dist/senses/bluebubbles/model.js +392 -0
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +57 -6
- package/dist/senses/bluebubbles/outbound-state.js +308 -0
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/reaction-policy.js +47 -0
- package/dist/senses/bluebubbles/replay.js +284 -0
- package/dist/senses/bluebubbles/runtime-state.js +137 -0
- package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
- package/dist/senses/bluebubbles/session-cleanup.js +72 -0
- package/dist/senses/bluebubbles/webhook-registration.js +228 -0
- package/dist/senses/bluebubbles-meta-guard.js +39 -0
- package/dist/senses/cli/bracketed-paste.js +82 -0
- package/dist/senses/cli/image-paste.js +287 -0
- package/dist/senses/cli/image-ref-navigation.js +75 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/input-keys.js +174 -0
- package/dist/senses/cli/kill-ring.js +86 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +607 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +85 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +241 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli-layout.js +187 -0
- package/dist/senses/cli.js +813 -281
- package/dist/senses/commands.js +66 -3
- package/dist/senses/context-packet-ledger.js +371 -0
- package/dist/senses/context-packets.js +154 -0
- package/dist/senses/continuity.js +94 -0
- package/dist/senses/habit-lifecycle-guard.js +24 -0
- package/dist/senses/habit-turn-message.js +160 -0
- package/dist/senses/ingress-evidence.js +2 -0
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +524 -0
- package/dist/senses/pipeline.js +1213 -0
- package/dist/senses/private-runtime-worker.js +859 -0
- package/dist/senses/private-runtime.js +1496 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
- package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
- package/dist/senses/sanctuary-grounding.js +118 -0
- package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
- package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
- package/dist/senses/sanctuary-health-runner.js +101 -0
- package/dist/senses/sanctuary-health.js +408 -0
- package/dist/senses/sanctuary-interactive-control.js +306 -0
- package/dist/senses/sanctuary-media-catalog-contract.js +235 -0
- package/dist/senses/sanctuary-media-optimization.js +514 -0
- package/dist/senses/sanctuary-runtime.js +338 -0
- package/dist/senses/sanctuary-sab.js +85 -0
- package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
- package/dist/senses/shared-turn.js +571 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +953 -211
- package/dist/senses/telegram-admission.js +711 -0
- package/dist/senses/telegram-approval-runtime.js +566 -0
- package/dist/senses/telegram-attachments.js +182 -0
- package/dist/senses/telegram-audit-ledger.js +220 -0
- package/dist/senses/telegram-client.js +1677 -0
- package/dist/senses/telegram-effect-adapter.js +859 -0
- package/dist/senses/telegram-entry.js +83 -0
- package/dist/senses/telegram.js +2026 -0
- package/dist/senses/trust-gate.js +207 -2
- package/dist/senses/voice/audio-playback.js +237 -0
- package/dist/senses/voice/audio-routing.js +119 -0
- package/dist/senses/voice/elevenlabs.js +202 -0
- package/dist/senses/voice/floor-control.js +431 -0
- package/dist/senses/voice/floor-controller.js +115 -0
- package/dist/senses/voice/golden-path.js +116 -0
- package/dist/senses/voice/index.js +29 -0
- package/dist/senses/voice/meeting.js +113 -0
- package/dist/senses/voice/outbound.js +190 -0
- package/dist/senses/voice/phone.js +33 -0
- package/dist/senses/voice/playback.js +139 -0
- package/dist/senses/voice/realtime-eval.js +496 -0
- package/dist/senses/voice/realtime-trace.js +531 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +191 -0
- package/dist/senses/voice/twilio-phone-runtime.js +807 -0
- package/dist/senses/voice/twilio-phone.js +5081 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +81 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/dist/util/frontmatter.js +69 -0
- package/npm-shrinkwrap.json +8144 -0
- package/package.json +82 -12
- package/skills/agent-commerce.md +113 -0
- package/skills/browser-navigation.md +117 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +99 -0
- package/skills/travel-planning.md +138 -0
- package/AdoptionSpecialist.ouro/agent.json +0 -20
- package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
- package/dist/heart/daemon/specialist-orchestrator.js +0 -160
- package/dist/heart/daemon/specialist-prompt.js +0 -47
- package/dist/heart/daemon/specialist-session.js +0 -142
- package/dist/heart/daemon/specialist-tools.js +0 -132
- package/dist/heart/daemon/subagent-installer.js +0 -125
- package/dist/inner-worker-entry.js +0 -4
- package/dist/mind/friends/channel.js +0 -49
- package/dist/mind/friends/resolver.js +0 -84
- package/dist/mind/friends/store-file.js +0 -171
- package/dist/mind/friends/store.js +0 -4
- package/dist/mind/friends/tokens.js +0 -26
- package/dist/mind/friends/types.js +0 -21
- package/dist/repertoire/tasks/board.js +0 -122
- package/dist/repertoire/tasks/index.js +0 -210
- package/dist/repertoire/tasks/middleware.js +0 -65
- package/dist/repertoire/tasks/parser.js +0 -173
- package/dist/repertoire/tasks/scanner.js +0 -132
- package/dist/repertoire/tasks/transitions.js +0 -145
- package/dist/senses/bluebubbles-client.js +0 -279
- package/dist/senses/bluebubbles-entry.js +0 -11
- package/dist/senses/bluebubbles-model.js +0 -253
- package/dist/senses/bluebubbles.js +0 -332
- package/dist/senses/inner-dialog-worker.js +0 -61
- package/dist/senses/inner-dialog.js +0 -231
- package/subagents/README.md +0 -73
- package/subagents/work-doer.md +0 -233
- package/subagents/work-merger.md +0 -624
- package/subagents/work-planner.md +0 -373
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.codingToolDefinitions = void 0;
|
|
4
|
+
exports.countFilesInSessionOutput = countFilesInSessionOutput;
|
|
4
5
|
const index_1 = require("./index");
|
|
6
|
+
const context_pack_1 = require("./context-pack");
|
|
7
|
+
const identity_1 = require("../../heart/identity");
|
|
8
|
+
const obligations_1 = require("../../arc/obligations");
|
|
9
|
+
const evolution_1 = require("../../arc/evolution");
|
|
5
10
|
const runtime_1 = require("../../nerves/runtime");
|
|
11
|
+
const scrutiny_1 = require("../../mind/scrutiny");
|
|
6
12
|
const RUNNERS = ["claude", "codex"];
|
|
7
13
|
function requireArg(args, key) {
|
|
8
14
|
const value = args[key];
|
|
@@ -29,11 +35,152 @@ function emitCodingToolEvent(toolName) {
|
|
|
29
35
|
meta: { toolName },
|
|
30
36
|
});
|
|
31
37
|
}
|
|
38
|
+
function isRefreshableCodingSessionManager(manager) {
|
|
39
|
+
return typeof manager.refreshSessions === "function"
|
|
40
|
+
&& typeof manager.refreshSession === "function";
|
|
41
|
+
}
|
|
42
|
+
async function listCodingSessions(manager) {
|
|
43
|
+
return isRefreshableCodingSessionManager(manager) ? manager.refreshSessions() : manager.listSessions();
|
|
44
|
+
}
|
|
45
|
+
async function getCodingSession(manager, sessionId) {
|
|
46
|
+
return isRefreshableCodingSessionManager(manager) ? manager.refreshSession(sessionId) : manager.getSession(sessionId);
|
|
47
|
+
}
|
|
48
|
+
async function sendCodingInput(manager, sessionId, input) {
|
|
49
|
+
return manager.sendInput(sessionId, input);
|
|
50
|
+
}
|
|
51
|
+
async function killCodingSession(manager, sessionId) {
|
|
52
|
+
return manager.killSession(sessionId);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Count distinct file paths mentioned in a coding session's stdout output.
|
|
56
|
+
* Looks for path-like tokens (containing / and a file extension).
|
|
57
|
+
* Returns the count of unique paths found.
|
|
58
|
+
*/
|
|
59
|
+
function countFilesInSessionOutput(session) {
|
|
60
|
+
const text = `${session.stdoutTail}\n${session.stderrTail}`;
|
|
61
|
+
// Match path-like tokens: contain at least one / and a file extension
|
|
62
|
+
const pathPattern = /(?:^|\s)((?:\/|\.\/|\.\.\/)?(?:[\w.@-]+\/)+[\w.-]+\.[\w]+)/gm;
|
|
63
|
+
const paths = new Set();
|
|
64
|
+
let match;
|
|
65
|
+
while ((match = pathPattern.exec(text)) !== null) {
|
|
66
|
+
paths.add(match[1]);
|
|
67
|
+
}
|
|
68
|
+
return paths.size;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* If a coding session is completed, append scrutiny to the result.
|
|
72
|
+
* Returns the original result with scrutiny appended, or unchanged if
|
|
73
|
+
* the session is not completed or has no file changes.
|
|
74
|
+
*/
|
|
75
|
+
function appendCompletionScrutiny(result, session) {
|
|
76
|
+
if (session.status !== "completed")
|
|
77
|
+
return result;
|
|
78
|
+
const fileCount = countFilesInSessionOutput(session);
|
|
79
|
+
const scrutiny = (0, scrutiny_1.getCodingCompletionScrutiny)(fileCount);
|
|
80
|
+
return scrutiny ? `${result}\n\n${scrutiny}` : result;
|
|
81
|
+
}
|
|
82
|
+
function sameOriginSession(left, right) {
|
|
83
|
+
if (!left && !right)
|
|
84
|
+
return true;
|
|
85
|
+
if (!left || !right)
|
|
86
|
+
return false;
|
|
87
|
+
return left.friendId === right.friendId && left.channel === right.channel && left.key === right.key;
|
|
88
|
+
}
|
|
89
|
+
function matchesReusableCodingSession(session, request) {
|
|
90
|
+
if (session.status !== "spawning" && session.status !== "running" && session.status !== "waiting_input" && session.status !== "stalled") {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
const scopeMatches = request.scopeFile ? session.scopeFile === request.scopeFile : true;
|
|
94
|
+
const stateMatches = request.stateFile ? session.stateFile === request.stateFile : true;
|
|
95
|
+
const evolutionCaseMatches = request.evolutionCaseId ? session.evolutionCaseId === request.evolutionCaseId : true;
|
|
96
|
+
return (session.runner === request.runner &&
|
|
97
|
+
session.workdir === request.workdir &&
|
|
98
|
+
session.taskRef === request.taskRef &&
|
|
99
|
+
scopeMatches &&
|
|
100
|
+
stateMatches &&
|
|
101
|
+
evolutionCaseMatches &&
|
|
102
|
+
session.obligationId === request.obligationId &&
|
|
103
|
+
sameOriginSession(request.originSession, session.originSession));
|
|
104
|
+
}
|
|
105
|
+
function latestSessionFirst(left, right) {
|
|
106
|
+
const lastActivityDelta = Date.parse(right.lastActivityAt) - Date.parse(left.lastActivityAt);
|
|
107
|
+
if (lastActivityDelta !== 0)
|
|
108
|
+
return lastActivityDelta;
|
|
109
|
+
return right.id.localeCompare(left.id);
|
|
110
|
+
}
|
|
111
|
+
function findReusableCodingSession(sessions, request) {
|
|
112
|
+
const matches = sessions.filter((session) => matchesReusableCodingSession(session, request)).sort(latestSessionFirst);
|
|
113
|
+
return matches[0] ?? null;
|
|
114
|
+
}
|
|
115
|
+
function isLiveCodingStatus(status) {
|
|
116
|
+
return status === "spawning" || status === "running" || status === "waiting_input" || status === "stalled";
|
|
117
|
+
}
|
|
118
|
+
function rankCodingStatusSession(session, currentSession) {
|
|
119
|
+
return sameOriginSession({
|
|
120
|
+
friendId: currentSession.friendId,
|
|
121
|
+
channel: currentSession.channel,
|
|
122
|
+
key: currentSession.key,
|
|
123
|
+
}, session.originSession)
|
|
124
|
+
? 0
|
|
125
|
+
: 1;
|
|
126
|
+
}
|
|
127
|
+
function selectCodingStatusSessions(sessions, currentSession) {
|
|
128
|
+
if (sessions.length === 0)
|
|
129
|
+
return [];
|
|
130
|
+
if (!currentSession) {
|
|
131
|
+
return sessions;
|
|
132
|
+
}
|
|
133
|
+
const activeSessions = sessions.filter((session) => isLiveCodingStatus(session.status)).sort(latestSessionFirst);
|
|
134
|
+
if (activeSessions.length > 0) {
|
|
135
|
+
return activeSessions.sort((left, right) => {
|
|
136
|
+
const rankDelta = rankCodingStatusSession(left, currentSession) - rankCodingStatusSession(right, currentSession);
|
|
137
|
+
if (rankDelta !== 0)
|
|
138
|
+
return rankDelta;
|
|
139
|
+
return latestSessionFirst(left, right);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
const matchingClosedSessions = sessions
|
|
143
|
+
.filter((session) => sameOriginSession({
|
|
144
|
+
friendId: currentSession.friendId,
|
|
145
|
+
channel: currentSession.channel,
|
|
146
|
+
key: currentSession.key,
|
|
147
|
+
}, session.originSession))
|
|
148
|
+
.sort(latestSessionFirst);
|
|
149
|
+
if (matchingClosedSessions.length > 0) {
|
|
150
|
+
return matchingClosedSessions;
|
|
151
|
+
}
|
|
152
|
+
return [...sessions].sort(latestSessionFirst);
|
|
153
|
+
}
|
|
154
|
+
function buildCodingObligationContent(taskRef) {
|
|
155
|
+
return `finish ${taskRef} and bring the result back`;
|
|
156
|
+
}
|
|
157
|
+
function blockedEvolutionSpawnResult(evolutionCaseId, decision) {
|
|
158
|
+
return JSON.stringify({
|
|
159
|
+
ok: false,
|
|
160
|
+
blocked: true,
|
|
161
|
+
action: "spawn_coding",
|
|
162
|
+
evolutionCaseId,
|
|
163
|
+
code: decision.code,
|
|
164
|
+
reason: decision.reason,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function recordBlockedEvolutionSpawn(agentRoot, evolutionCaseId, decision) {
|
|
168
|
+
if (decision.code === "case_not_found")
|
|
169
|
+
return;
|
|
170
|
+
try {
|
|
171
|
+
(0, evolution_1.consumeEvolutionBudget)(agentRoot, evolutionCaseId, "spawn_coding", {
|
|
172
|
+
reason: `coding_spawn blocked: ${decision.reason}`,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// consumeEvolutionBudget records the block before throwing.
|
|
177
|
+
}
|
|
178
|
+
}
|
|
32
179
|
const codingSpawnTool = {
|
|
33
180
|
type: "function",
|
|
34
181
|
function: {
|
|
35
182
|
name: "coding_spawn",
|
|
36
|
-
description: "
|
|
183
|
+
description: "Spawn a coding session using claude or codex with task-threaded guidance. The coding session runs as a separate process with its own context. Give it a COMPLETE, SELF-CONTAINED task description -- it cannot see this conversation, doesn't know what you've tried, doesn't understand the broader context. Include: what to do, why, what files are involved, what 'done' looks like. Never delegate understanding -- don't write 'based on the conversation, fix the bug.' Write the specific file paths, line numbers, and what to change. Include any required verification steps or tests in the task description so the coding session knows how to prove the work is done.",
|
|
37
184
|
parameters: {
|
|
38
185
|
type: "object",
|
|
39
186
|
properties: {
|
|
@@ -43,6 +190,7 @@ const codingSpawnTool = {
|
|
|
43
190
|
taskRef: { type: "string" },
|
|
44
191
|
scopeFile: { type: "string" },
|
|
45
192
|
stateFile: { type: "string" },
|
|
193
|
+
evolutionCaseId: { type: "string" },
|
|
46
194
|
},
|
|
47
195
|
required: ["runner", "workdir", "prompt", "taskRef"],
|
|
48
196
|
},
|
|
@@ -52,12 +200,26 @@ const codingStatusTool = {
|
|
|
52
200
|
type: "function",
|
|
53
201
|
function: {
|
|
54
202
|
name: "coding_status",
|
|
55
|
-
description: "
|
|
203
|
+
description: "Inspect coding sessions. Omit sessionId to list all active/known sessions with their status. Use this to check progress before asking the human for a status update.",
|
|
204
|
+
parameters: {
|
|
205
|
+
type: "object",
|
|
206
|
+
properties: {
|
|
207
|
+
sessionId: { type: "string" },
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
const codingTailTool = {
|
|
213
|
+
type: "function",
|
|
214
|
+
function: {
|
|
215
|
+
name: "coding_tail",
|
|
216
|
+
description: "Show recent stdout/stderr output from a coding session. Use this to understand what the session is doing or why it might be stuck. Read the actual output before reporting status -- don't guess.",
|
|
56
217
|
parameters: {
|
|
57
218
|
type: "object",
|
|
58
219
|
properties: {
|
|
59
220
|
sessionId: { type: "string" },
|
|
60
221
|
},
|
|
222
|
+
required: ["sessionId"],
|
|
61
223
|
},
|
|
62
224
|
},
|
|
63
225
|
};
|
|
@@ -93,7 +255,7 @@ const codingKillTool = {
|
|
|
93
255
|
exports.codingToolDefinitions = [
|
|
94
256
|
{
|
|
95
257
|
tool: codingSpawnTool,
|
|
96
|
-
handler: async (args) => {
|
|
258
|
+
handler: async (args, ctx) => {
|
|
97
259
|
emitCodingToolEvent("coding_spawn");
|
|
98
260
|
const rawRunner = requireArg(args, "runner");
|
|
99
261
|
if (!rawRunner)
|
|
@@ -116,34 +278,135 @@ exports.codingToolDefinitions = [
|
|
|
116
278
|
prompt,
|
|
117
279
|
taskRef,
|
|
118
280
|
};
|
|
281
|
+
const evolutionCaseId = optionalArg(args, "evolutionCaseId");
|
|
282
|
+
if (evolutionCaseId)
|
|
283
|
+
request.evolutionCaseId = evolutionCaseId;
|
|
284
|
+
if (ctx?.currentSession && ctx.currentSession.channel !== "inner") {
|
|
285
|
+
request.originSession = {
|
|
286
|
+
friendId: ctx.currentSession.friendId,
|
|
287
|
+
channel: ctx.currentSession.channel,
|
|
288
|
+
key: ctx.currentSession.key,
|
|
289
|
+
};
|
|
290
|
+
const obligation = (0, obligations_1.findPendingObligationForOrigin)((0, identity_1.getAgentRoot)(), request.originSession);
|
|
291
|
+
if (obligation) {
|
|
292
|
+
request.obligationId = obligation.id;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
119
295
|
const scopeFile = optionalArg(args, "scopeFile");
|
|
120
296
|
if (scopeFile)
|
|
121
297
|
request.scopeFile = scopeFile;
|
|
122
298
|
const stateFile = optionalArg(args, "stateFile");
|
|
123
299
|
if (stateFile)
|
|
124
300
|
request.stateFile = stateFile;
|
|
125
|
-
const
|
|
301
|
+
const manager = (0, index_1.getCodingSessionManager)();
|
|
302
|
+
const existingSessions = await listCodingSessions(manager);
|
|
303
|
+
const existingSession = findReusableCodingSession(existingSessions, request);
|
|
304
|
+
if (existingSession) {
|
|
305
|
+
(0, runtime_1.emitNervesEvent)({
|
|
306
|
+
component: "repertoire",
|
|
307
|
+
event: "repertoire.coding_session_reused",
|
|
308
|
+
message: "reused active coding session",
|
|
309
|
+
meta: { id: existingSession.id, runner: existingSession.runner, taskRef: existingSession.taskRef },
|
|
310
|
+
});
|
|
311
|
+
if (ctx?.codingFeedback) {
|
|
312
|
+
(0, index_1.attachCodingSessionFeedback)(manager, existingSession, ctx.codingFeedback);
|
|
313
|
+
}
|
|
314
|
+
return JSON.stringify({ ...existingSession, reused: true });
|
|
315
|
+
}
|
|
316
|
+
if (request.evolutionCaseId) {
|
|
317
|
+
const decision = (0, evolution_1.evaluateEvolutionAction)((0, identity_1.getAgentRoot)(), request.evolutionCaseId, "spawn_coding");
|
|
318
|
+
if (!decision.allowed) {
|
|
319
|
+
recordBlockedEvolutionSpawn((0, identity_1.getAgentRoot)(), request.evolutionCaseId, decision);
|
|
320
|
+
return blockedEvolutionSpawnResult(request.evolutionCaseId, decision);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (request.originSession && !request.obligationId) {
|
|
324
|
+
const created = (0, obligations_1.createObligation)((0, identity_1.getAgentRoot)(), {
|
|
325
|
+
origin: request.originSession,
|
|
326
|
+
content: buildCodingObligationContent(taskRef),
|
|
327
|
+
});
|
|
328
|
+
request.obligationId = created.id;
|
|
329
|
+
}
|
|
330
|
+
if (!request.scopeFile || !request.stateFile) {
|
|
331
|
+
const generated = (0, context_pack_1.prepareCodingContextPack)({
|
|
332
|
+
request: { ...request },
|
|
333
|
+
existingSessions,
|
|
334
|
+
activeWorkFrame: ctx?.activeWorkFrame,
|
|
335
|
+
});
|
|
336
|
+
if (!request.scopeFile)
|
|
337
|
+
request.scopeFile = generated.scopeFile;
|
|
338
|
+
if (!request.stateFile)
|
|
339
|
+
request.stateFile = generated.stateFile;
|
|
340
|
+
}
|
|
341
|
+
const session = await manager.spawnSession(request);
|
|
342
|
+
if (request.evolutionCaseId) {
|
|
343
|
+
(0, evolution_1.consumeEvolutionBudget)((0, identity_1.getAgentRoot)(), request.evolutionCaseId, "spawn_coding", {
|
|
344
|
+
target: session.id,
|
|
345
|
+
reason: `coding session ${session.id} spawned`,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
if (session.obligationId) {
|
|
349
|
+
(0, obligations_1.advanceObligation)((0, identity_1.getAgentRoot)(), session.obligationId, {
|
|
350
|
+
status: "investigating",
|
|
351
|
+
currentSurface: { kind: "coding", label: `${session.runner} ${session.id}` },
|
|
352
|
+
latestNote: session.originSession
|
|
353
|
+
? `coding session started for ${session.originSession.channel}/${session.originSession.key}`
|
|
354
|
+
: "coding session started",
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
if (args.runner === "codex" && args.taskRef) {
|
|
358
|
+
(0, runtime_1.emitNervesEvent)({
|
|
359
|
+
component: "repertoire",
|
|
360
|
+
event: "repertoire.coding_codex_spawned",
|
|
361
|
+
message: "spawned codex coding session",
|
|
362
|
+
meta: { sessionId: session.id, taskRef: args.taskRef },
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
if (ctx?.codingFeedback) {
|
|
366
|
+
(0, index_1.attachCodingSessionFeedback)(manager, session, ctx.codingFeedback);
|
|
367
|
+
}
|
|
126
368
|
return JSON.stringify(session);
|
|
127
369
|
},
|
|
370
|
+
summaryKeys: ["runner", "workdir", "taskRef"],
|
|
371
|
+
riskProfile: {
|
|
372
|
+
mutates: ["durable_state_write", "external_side_effect"],
|
|
373
|
+
risk: "high",
|
|
374
|
+
reason: "spawns a separate coding process and may create obligations",
|
|
375
|
+
},
|
|
128
376
|
},
|
|
129
377
|
{
|
|
130
378
|
tool: codingStatusTool,
|
|
131
|
-
handler: (args) => {
|
|
379
|
+
handler: async (args, ctx) => {
|
|
132
380
|
emitCodingToolEvent("coding_status");
|
|
133
381
|
const manager = (0, index_1.getCodingSessionManager)();
|
|
134
382
|
const sessionId = requireArg(args, "sessionId");
|
|
135
383
|
if (!sessionId) {
|
|
136
|
-
return JSON.stringify(manager
|
|
384
|
+
return JSON.stringify(selectCodingStatusSessions(await listCodingSessions(manager), ctx?.currentSession));
|
|
137
385
|
}
|
|
138
|
-
const session = manager
|
|
386
|
+
const session = await getCodingSession(manager, sessionId);
|
|
139
387
|
if (!session)
|
|
140
388
|
return `session not found: ${sessionId}`;
|
|
141
|
-
return JSON.stringify(session);
|
|
389
|
+
return appendCompletionScrutiny(JSON.stringify(session), session);
|
|
142
390
|
},
|
|
391
|
+
summaryKeys: ["sessionId"],
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
tool: codingTailTool,
|
|
395
|
+
handler: async (args) => {
|
|
396
|
+
emitCodingToolEvent("coding_tail");
|
|
397
|
+
const sessionId = requireArg(args, "sessionId");
|
|
398
|
+
if (!sessionId)
|
|
399
|
+
return "sessionId is required";
|
|
400
|
+
const session = await getCodingSession((0, index_1.getCodingSessionManager)(), sessionId);
|
|
401
|
+
if (!session)
|
|
402
|
+
return `session not found: ${sessionId}`;
|
|
403
|
+
return appendCompletionScrutiny((0, index_1.formatCodingTail)(session), session);
|
|
404
|
+
},
|
|
405
|
+
summaryKeys: ["sessionId"],
|
|
143
406
|
},
|
|
144
407
|
{
|
|
145
408
|
tool: codingSendInputTool,
|
|
146
|
-
handler: (args) => {
|
|
409
|
+
handler: async (args) => {
|
|
147
410
|
emitCodingToolEvent("coding_send_input");
|
|
148
411
|
const sessionId = requireArg(args, "sessionId");
|
|
149
412
|
if (!sessionId)
|
|
@@ -151,17 +414,21 @@ exports.codingToolDefinitions = [
|
|
|
151
414
|
const input = requireArg(args, "input");
|
|
152
415
|
if (!input)
|
|
153
416
|
return "input is required";
|
|
154
|
-
return JSON.stringify((0, index_1.getCodingSessionManager)()
|
|
417
|
+
return JSON.stringify(await sendCodingInput((0, index_1.getCodingSessionManager)(), sessionId, input));
|
|
155
418
|
},
|
|
419
|
+
summaryKeys: ["sessionId", "input"],
|
|
420
|
+
riskProfile: { mutates: "external_side_effect", risk: "high", reason: "sends input to a live coding process" },
|
|
156
421
|
},
|
|
157
422
|
{
|
|
158
423
|
tool: codingKillTool,
|
|
159
|
-
handler: (args) => {
|
|
424
|
+
handler: async (args) => {
|
|
160
425
|
emitCodingToolEvent("coding_kill");
|
|
161
426
|
const sessionId = requireArg(args, "sessionId");
|
|
162
427
|
if (!sessionId)
|
|
163
428
|
return "sessionId is required";
|
|
164
|
-
return JSON.stringify((0, index_1.getCodingSessionManager)()
|
|
429
|
+
return JSON.stringify(await killCodingSession((0, index_1.getCodingSessionManager)(), sessionId));
|
|
165
430
|
},
|
|
431
|
+
summaryKeys: ["sessionId"],
|
|
432
|
+
riskProfile: { mutates: "external_side_effect", risk: "high", reason: "terminates a live coding process" },
|
|
166
433
|
},
|
|
167
434
|
];
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.WorkbenchMcpClient = void 0;
|
|
37
|
+
exports.defaultWorkbenchMcpCandidates = defaultWorkbenchMcpCandidates;
|
|
38
|
+
exports.resolveWorkbenchMcpPath = resolveWorkbenchMcpPath;
|
|
39
|
+
const child_process_1 = require("child_process");
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const os = __importStar(require("os"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
44
|
+
function defaultWorkbenchMcpCandidates(homeDir = os.homedir()) {
|
|
45
|
+
return [
|
|
46
|
+
path.join(homeDir, "Applications", "Ouro Workbench.app", "Contents", "MacOS", "OuroWorkbenchMCP"),
|
|
47
|
+
path.join("/Applications", "Ouro Workbench.app", "Contents", "MacOS", "OuroWorkbenchMCP"),
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
function resolveWorkbenchMcpPath(options = {}) {
|
|
51
|
+
const existsSync = options.existsSync ?? fs.existsSync;
|
|
52
|
+
const candidates = [
|
|
53
|
+
...(options.executablePath ? [options.executablePath] : []),
|
|
54
|
+
...defaultWorkbenchMcpCandidates(options.homeDir),
|
|
55
|
+
];
|
|
56
|
+
return candidates.find((candidate) => existsSync(candidate)) ?? null;
|
|
57
|
+
}
|
|
58
|
+
function sleep(ms) {
|
|
59
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
60
|
+
}
|
|
61
|
+
function parseJson(text, toolName) {
|
|
62
|
+
try {
|
|
63
|
+
return JSON.parse(text);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
throw new Error(`Workbench MCP ${toolName} returned non-JSON text: ${String(error)}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function responseIdMatches(response, id) {
|
|
70
|
+
return response.id === id || response.id === String(id);
|
|
71
|
+
}
|
|
72
|
+
function responseText(response, toolName) {
|
|
73
|
+
if (response.error) {
|
|
74
|
+
throw new Error(response.error.message ?? `Workbench MCP ${toolName} returned an RPC error`);
|
|
75
|
+
}
|
|
76
|
+
const text = response.result?.content?.map((item) => item.text ?? "").join("\n") ?? "";
|
|
77
|
+
if (response.result?.isError) {
|
|
78
|
+
throw new Error(text.trim() || `Workbench MCP ${toolName} returned an error`);
|
|
79
|
+
}
|
|
80
|
+
return text;
|
|
81
|
+
}
|
|
82
|
+
function isBrokenPipe(error) {
|
|
83
|
+
return error.code === "EPIPE";
|
|
84
|
+
}
|
|
85
|
+
class WorkbenchMcpClient {
|
|
86
|
+
executablePath;
|
|
87
|
+
spawnFn;
|
|
88
|
+
timeoutMs;
|
|
89
|
+
pollIntervalMs;
|
|
90
|
+
createTimeoutMs;
|
|
91
|
+
actionTimeoutMs;
|
|
92
|
+
constructor(options = {}) {
|
|
93
|
+
const executablePath = resolveWorkbenchMcpPath(options);
|
|
94
|
+
if (!executablePath) {
|
|
95
|
+
throw new Error("OuroWorkbenchMCP not found in ~/Applications or /Applications");
|
|
96
|
+
}
|
|
97
|
+
this.executablePath = executablePath;
|
|
98
|
+
this.spawnFn = options.spawnFn ?? ((command, args, spawnOptions) => (0, child_process_1.spawn)(command, args, spawnOptions));
|
|
99
|
+
this.timeoutMs = options.timeoutMs ?? 10_000;
|
|
100
|
+
this.pollIntervalMs = options.pollIntervalMs ?? 250;
|
|
101
|
+
this.createTimeoutMs = options.createTimeoutMs ?? 10_000;
|
|
102
|
+
this.actionTimeoutMs = options.actionTimeoutMs ?? 10_000;
|
|
103
|
+
}
|
|
104
|
+
get commandPath() {
|
|
105
|
+
return this.executablePath;
|
|
106
|
+
}
|
|
107
|
+
async callToolText(name, args) {
|
|
108
|
+
(0, runtime_1.emitNervesEvent)({
|
|
109
|
+
component: "repertoire",
|
|
110
|
+
event: "repertoire.workbench_mcp_call_start",
|
|
111
|
+
message: "calling Workbench MCP tool",
|
|
112
|
+
meta: { name },
|
|
113
|
+
});
|
|
114
|
+
const child = this.spawnFn(this.executablePath, [], {
|
|
115
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
116
|
+
});
|
|
117
|
+
const stderrChunks = [];
|
|
118
|
+
const stdoutChunks = [];
|
|
119
|
+
child.stderr.on("data", (chunk) => stderrChunks.push(chunk));
|
|
120
|
+
const result = await new Promise((resolve, reject) => {
|
|
121
|
+
let settled = false;
|
|
122
|
+
let timer;
|
|
123
|
+
const settle = (fn) => {
|
|
124
|
+
if (settled)
|
|
125
|
+
return;
|
|
126
|
+
settled = true;
|
|
127
|
+
clearTimeout(timer);
|
|
128
|
+
fn();
|
|
129
|
+
};
|
|
130
|
+
timer = setTimeout(() => {
|
|
131
|
+
settle(() => {
|
|
132
|
+
child.kill("SIGTERM");
|
|
133
|
+
reject(new Error(`Workbench MCP ${name} timed out after ${this.timeoutMs}ms`));
|
|
134
|
+
});
|
|
135
|
+
}, this.timeoutMs);
|
|
136
|
+
child.on("error", (error) => {
|
|
137
|
+
settle(() => reject(error));
|
|
138
|
+
});
|
|
139
|
+
child.stdin.on("error", (error) => {
|
|
140
|
+
if (isBrokenPipe(error))
|
|
141
|
+
return;
|
|
142
|
+
settle(() => reject(error));
|
|
143
|
+
});
|
|
144
|
+
child.on("exit", () => {
|
|
145
|
+
const stderr = Buffer.concat(stderrChunks).toString("utf-8").trim();
|
|
146
|
+
const stdout = Buffer.concat(stdoutChunks).toString("utf-8");
|
|
147
|
+
if (!settled) {
|
|
148
|
+
if (stderr.length > 0 && stdout.trim().length === 0) {
|
|
149
|
+
settle(() => reject(new Error(stderr)));
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
settle(() => reject(new Error(`Workbench MCP ${name} exited before returning a response`)));
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
child.stdout.on("data", (chunk) => {
|
|
156
|
+
stdoutChunks.push(chunk);
|
|
157
|
+
for (const line of Buffer.concat(stdoutChunks).toString("utf-8").split(/\r?\n/)) {
|
|
158
|
+
if (!line.trim())
|
|
159
|
+
continue;
|
|
160
|
+
let response;
|
|
161
|
+
try {
|
|
162
|
+
response = JSON.parse(line);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (!responseIdMatches(response, 2))
|
|
168
|
+
continue;
|
|
169
|
+
settle(() => {
|
|
170
|
+
try {
|
|
171
|
+
resolve(responseText(response, name));
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
reject(error);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
const initialize = { jsonrpc: "2.0", id: 1, method: "initialize", params: {} };
|
|
180
|
+
const toolCall = { jsonrpc: "2.0", id: 2, method: "tools/call", params: { name, arguments: args } };
|
|
181
|
+
child.stdin.write(`${JSON.stringify(initialize)}\n`);
|
|
182
|
+
child.stdin.write(`${JSON.stringify(toolCall)}\n`);
|
|
183
|
+
child.stdin.end();
|
|
184
|
+
}).finally(() => {
|
|
185
|
+
if (!child.killed) {
|
|
186
|
+
child.kill("SIGTERM");
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
(0, runtime_1.emitNervesEvent)({
|
|
190
|
+
component: "repertoire",
|
|
191
|
+
event: "repertoire.workbench_mcp_call_end",
|
|
192
|
+
message: "Workbench MCP tool returned",
|
|
193
|
+
meta: { name },
|
|
194
|
+
});
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
async callToolJson(name, args) {
|
|
198
|
+
return parseJson(await this.callToolText(name, args), name);
|
|
199
|
+
}
|
|
200
|
+
async createSession(args) {
|
|
201
|
+
return this.callToolJson("workbench_create_session", { ...args, format: "json" });
|
|
202
|
+
}
|
|
203
|
+
async listSessions(args = {}) {
|
|
204
|
+
const result = await this.callToolJson("workbench_sessions", args);
|
|
205
|
+
return Array.isArray(result.sessions) ? result.sessions : [];
|
|
206
|
+
}
|
|
207
|
+
async transcriptTail(entry, maxBytes = 64_000) {
|
|
208
|
+
return this.callToolText("workbench_transcript_tail", { entry, maxBytes });
|
|
209
|
+
}
|
|
210
|
+
async requestAction(args) {
|
|
211
|
+
return this.callToolJson("workbench_request_action", { ...args, format: "json" });
|
|
212
|
+
}
|
|
213
|
+
async actionResult(requestId) {
|
|
214
|
+
return this.callToolJson("workbench_action_result", { requestId });
|
|
215
|
+
}
|
|
216
|
+
async createCodingSession(request) {
|
|
217
|
+
const source = request.source ?? "ouro-coding";
|
|
218
|
+
const group = request.group ?? path.basename(request.workingDirectory);
|
|
219
|
+
const createAck = await this.createSession({
|
|
220
|
+
owner: request.owner,
|
|
221
|
+
name: request.name,
|
|
222
|
+
command: request.command,
|
|
223
|
+
workingDirectory: request.workingDirectory,
|
|
224
|
+
group,
|
|
225
|
+
createGroupIfMissing: true,
|
|
226
|
+
trust: request.trust ?? "trusted",
|
|
227
|
+
autoResume: request.autoResume ?? true,
|
|
228
|
+
source,
|
|
229
|
+
});
|
|
230
|
+
const session = await this.waitForSession({
|
|
231
|
+
owner: request.owner,
|
|
232
|
+
name: request.name,
|
|
233
|
+
timeoutMs: this.createTimeoutMs,
|
|
234
|
+
});
|
|
235
|
+
const promptAck = await this.requestAction({
|
|
236
|
+
source,
|
|
237
|
+
action: "sendInput",
|
|
238
|
+
entry: session.id,
|
|
239
|
+
text: request.prompt,
|
|
240
|
+
appendNewline: true,
|
|
241
|
+
});
|
|
242
|
+
const promptResult = promptAck.requestId
|
|
243
|
+
? await this.waitForAction(promptAck.requestId, this.actionTimeoutMs)
|
|
244
|
+
: undefined;
|
|
245
|
+
return { session, createAck, promptAck, promptResult };
|
|
246
|
+
}
|
|
247
|
+
async waitForSession(input) {
|
|
248
|
+
const deadline = Date.now() + (input.timeoutMs ?? this.createTimeoutMs);
|
|
249
|
+
let lastSessions = [];
|
|
250
|
+
while (Date.now() <= deadline) {
|
|
251
|
+
lastSessions = await this.listSessions({ owner: input.owner, name: input.name, includeArchived: true });
|
|
252
|
+
const match = lastSessions.find((session) => session.name.toLowerCase() === input.name.toLowerCase()
|
|
253
|
+
&& (session.owner?.name === input.owner || !session.owner?.name));
|
|
254
|
+
if (match)
|
|
255
|
+
return match;
|
|
256
|
+
await sleep(this.pollIntervalMs);
|
|
257
|
+
}
|
|
258
|
+
throw new Error(`Workbench did not create session "${input.name}" for ${input.owner}; last matches=${lastSessions.length}`);
|
|
259
|
+
}
|
|
260
|
+
async waitForAction(requestId, timeoutMs = this.actionTimeoutMs) {
|
|
261
|
+
const deadline = Date.now() + timeoutMs;
|
|
262
|
+
let latest = null;
|
|
263
|
+
while (Date.now() <= deadline) {
|
|
264
|
+
latest = await this.actionResult(requestId);
|
|
265
|
+
if (latest.state !== "queued")
|
|
266
|
+
return latest;
|
|
267
|
+
await sleep(this.pollIntervalMs);
|
|
268
|
+
}
|
|
269
|
+
return latest ?? { requestId, state: "queued" };
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
exports.WorkbenchMcpClient = WorkbenchMcpClient;
|