@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.
Files changed (624) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -176
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/SerpentGuide.ouro/agent.json +83 -0
  11. package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
  13. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  14. package/assets/bluebubbles-host +264 -0
  15. package/assets/ouroboros.png +0 -0
  16. package/changelog.json +5563 -0
  17. package/deploy/unraid/Dockerfile +48 -0
  18. package/deploy/unraid/README.txt +3012 -0
  19. package/deploy/unraid/audit-container-spec.sh +4 -0
  20. package/deploy/unraid/container-runtime.json +1 -0
  21. package/deploy/unraid/docker-man-template-transaction.mjs +526 -0
  22. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  23. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  24. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  25. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  26. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  27. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  28. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  29. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  30. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  31. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  32. package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
  33. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  34. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2030 -0
  35. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  36. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  37. package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
  38. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  39. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  40. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  41. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  42. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  43. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  44. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +11 -0
  45. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
  46. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +11 -0
  47. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  48. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +23 -0
  49. package/deploy/unraid/sanctuary.xml +27 -0
  50. package/dist/a2a/card.js +57 -0
  51. package/dist/a2a/client.js +180 -0
  52. package/dist/a2a/config.js +50 -0
  53. package/dist/a2a/delegation-stores.js +56 -0
  54. package/dist/a2a/did-resolution.js +93 -0
  55. package/dist/a2a/identity.js +170 -0
  56. package/dist/a2a/inbound-share.js +107 -0
  57. package/dist/a2a/mission-result-wire.js +196 -0
  58. package/dist/a2a/onboarding.js +115 -0
  59. package/dist/a2a/pin-store.js +132 -0
  60. package/dist/a2a/seen-ledger.js +120 -0
  61. package/dist/a2a/server.js +604 -0
  62. package/dist/a2a/task-store.js +69 -0
  63. package/dist/a2a/transport.js +45 -0
  64. package/dist/a2a/types.js +3 -0
  65. package/dist/arc/attention-types.js +8 -0
  66. package/dist/arc/cares.js +360 -0
  67. package/dist/arc/episodes.js +118 -0
  68. package/dist/arc/evolution.js +490 -0
  69. package/dist/arc/flight-recorder.js +1034 -0
  70. package/dist/arc/intentions.js +134 -0
  71. package/dist/arc/json-store.js +117 -0
  72. package/dist/arc/obligations.js +386 -0
  73. package/dist/arc/packets.js +336 -0
  74. package/dist/arc/presence.js +185 -0
  75. package/dist/arc/task-lifecycle.js +57 -0
  76. package/dist/commerce/store.js +755 -0
  77. package/dist/commerce/types.js +3 -0
  78. package/dist/heart/active-work.js +1009 -0
  79. package/dist/heart/agent-entry.js +252 -3
  80. package/dist/heart/approval-files.js +113 -0
  81. package/dist/heart/approval-store.js +950 -0
  82. package/dist/heart/attachments/image-normalize.js +194 -0
  83. package/dist/heart/attachments/materialize.js +97 -0
  84. package/dist/heart/attachments/originals.js +88 -0
  85. package/dist/heart/attachments/render.js +29 -0
  86. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  87. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  88. package/dist/heart/attachments/sources/index.js +18 -0
  89. package/dist/heart/attachments/sources/telegram.js +71 -0
  90. package/dist/heart/attachments/store.js +132 -0
  91. package/dist/heart/attachments/types.js +93 -0
  92. package/dist/heart/auth/auth-flow.js +495 -0
  93. package/dist/heart/autonomy-budget.js +478 -0
  94. package/dist/heart/awaiting/await-alert.js +148 -0
  95. package/dist/heart/awaiting/await-expiry.js +143 -0
  96. package/dist/heart/awaiting/await-loader.js +91 -0
  97. package/dist/heart/awaiting/await-parser.js +149 -0
  98. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  99. package/dist/heart/awaiting/await-scheduler.js +382 -0
  100. package/dist/heart/background-operations.js +281 -0
  101. package/dist/heart/bridges/manager.js +478 -0
  102. package/dist/heart/bridges/state-machine.js +135 -0
  103. package/dist/heart/bridges/store.js +135 -0
  104. package/dist/heart/bundle-state.js +168 -0
  105. package/dist/heart/commitments.js +135 -0
  106. package/dist/heart/config-registry.js +331 -0
  107. package/dist/heart/config.js +195 -137
  108. package/dist/heart/context-loss-gauntlet.js +387 -0
  109. package/dist/heart/context-loss-sentinel.js +1157 -0
  110. package/dist/heart/core.js +2257 -338
  111. package/dist/heart/cross-chat-delivery.js +133 -0
  112. package/dist/heart/daemon/agent-config-check.js +451 -0
  113. package/dist/heart/daemon/agent-discovery.js +263 -0
  114. package/dist/heart/daemon/agent-service.js +542 -0
  115. package/dist/heart/daemon/agentic-repair.js +547 -0
  116. package/dist/heart/daemon/await-private-wake.js +59 -0
  117. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  118. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  119. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  120. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  121. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  122. package/dist/heart/daemon/cadence.js +180 -0
  123. package/dist/heart/daemon/cli-defaults.js +836 -0
  124. package/dist/heart/daemon/cli-desk.js +322 -0
  125. package/dist/heart/daemon/cli-exec.js +8730 -0
  126. package/dist/heart/daemon/cli-help.js +710 -0
  127. package/dist/heart/daemon/cli-parse.js +2719 -0
  128. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  129. package/dist/heart/daemon/cli-render.js +777 -0
  130. package/dist/heart/daemon/cli-types.js +8 -0
  131. package/dist/heart/daemon/connect-bay.js +323 -0
  132. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  133. package/dist/heart/daemon/container-healthcheck.js +112 -0
  134. package/dist/heart/daemon/container-runtime.js +97 -0
  135. package/dist/heart/daemon/container-spec-auditor-main.js +170 -0
  136. package/dist/heart/daemon/container-spec-auditor.js +236 -0
  137. package/dist/heart/daemon/daemon-bootstrap-startup.js +107 -0
  138. package/dist/heart/daemon/daemon-cli.js +30 -786
  139. package/dist/heart/daemon/daemon-entry.js +971 -13
  140. package/dist/heart/daemon/daemon-health.js +186 -0
  141. package/dist/heart/daemon/daemon-rollup.js +57 -0
  142. package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
  143. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  144. package/dist/heart/daemon/daemon.js +2156 -28
  145. package/dist/heart/daemon/dns-workflow.js +394 -0
  146. package/dist/heart/daemon/doctor-types.js +8 -0
  147. package/dist/heart/daemon/doctor.js +1755 -0
  148. package/dist/heart/daemon/freshness.js +345 -0
  149. package/dist/heart/daemon/habit-private-wake.js +61 -0
  150. package/dist/heart/daemon/health-monitor.js +142 -11
  151. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  152. package/dist/heart/daemon/hooks/bundle-meta.js +226 -0
  153. package/dist/heart/daemon/http-health-probe.js +80 -0
  154. package/dist/heart/daemon/human-command-screens.js +234 -0
  155. package/dist/heart/daemon/human-readiness.js +114 -0
  156. package/dist/heart/daemon/inner-status.js +78 -0
  157. package/dist/heart/daemon/interactive-repair.js +394 -0
  158. package/dist/heart/daemon/launchd.js +188 -0
  159. package/dist/heart/daemon/log-tailer.js +82 -12
  160. package/dist/heart/daemon/logs-prune.js +132 -0
  161. package/dist/heart/daemon/mcp-canary.js +524 -0
  162. package/dist/heart/daemon/message-router.js +80 -11
  163. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  164. package/dist/heart/daemon/os-cron-deps.js +135 -0
  165. package/dist/heart/daemon/os-cron.js +22 -14
  166. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  167. package/dist/heart/daemon/ouro-entry.js +3 -1
  168. package/dist/heart/daemon/plugin-cli.js +432 -0
  169. package/dist/heart/daemon/process-manager.js +739 -54
  170. package/dist/heart/daemon/provider-discovery.js +137 -0
  171. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  172. package/dist/heart/daemon/prunable-bundle.js +144 -0
  173. package/dist/heart/daemon/pulse.js +511 -0
  174. package/dist/heart/daemon/readiness-repair.js +365 -0
  175. package/dist/heart/daemon/run-hooks.js +39 -0
  176. package/dist/heart/daemon/runtime-logging.js +92 -16
  177. package/dist/heart/daemon/runtime-metadata.js +191 -0
  178. package/dist/{repertoire/tasks/lifecycle.js → heart/daemon/runtime-mode.js} +37 -39
  179. package/dist/heart/daemon/safe-mode.js +161 -0
  180. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2609 -0
  181. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1866 -0
  182. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  183. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +976 -0
  184. package/dist/heart/daemon/sanctuary-bundle-migration.js +728 -0
  185. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  186. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  187. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  188. package/dist/heart/daemon/sense-manager.js +948 -0
  189. package/dist/heart/daemon/session-id-resolver.js +131 -0
  190. package/dist/heart/daemon/skill-management-installer.js +94 -0
  191. package/dist/heart/daemon/socket-client.js +370 -0
  192. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  193. package/dist/heart/daemon/startup-tui.js +339 -0
  194. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  195. package/dist/heart/daemon/task-scheduler.js +117 -39
  196. package/dist/heart/daemon/terminal-ui.js +499 -0
  197. package/dist/heart/daemon/thoughts.js +591 -0
  198. package/dist/heart/daemon/up-progress.js +366 -0
  199. package/dist/heart/daemon/vault-items.js +56 -0
  200. package/dist/heart/delegation.js +59 -0
  201. package/dist/heart/external-events/router.js +1414 -0
  202. package/dist/heart/habits/habit-cancel.js +810 -0
  203. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  204. package/dist/heart/habits/habit-migration.js +194 -0
  205. package/dist/heart/habits/habit-parser.js +278 -0
  206. package/dist/heart/habits/habit-runtime-state.js +93 -0
  207. package/dist/heart/habits/habit-scheduler.js +653 -0
  208. package/dist/heart/habits/habit-session-summary.js +318 -0
  209. package/dist/heart/habits/habit-session.js +636 -0
  210. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  211. package/dist/heart/{daemon → hatch}/hatch-flow.js +57 -139
  212. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  213. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  214. package/dist/heart/hatch/specialist-prompt.js +102 -0
  215. package/dist/heart/hatch/specialist-tools.js +318 -0
  216. package/dist/heart/identity.js +297 -67
  217. package/dist/heart/kept-notes.js +289 -0
  218. package/dist/heart/kicks.js +2 -20
  219. package/dist/heart/machine-identity.js +161 -0
  220. package/dist/heart/mail-import-discovery.js +353 -0
  221. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  222. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  223. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  224. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  225. package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
  226. package/dist/heart/mailbox/mailbox-http.js +99 -0
  227. package/dist/heart/mailbox/mailbox-read.js +39 -0
  228. package/dist/heart/mailbox/mailbox-types.js +27 -0
  229. package/dist/heart/mailbox/mailbox-view.js +197 -0
  230. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  231. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  232. package/dist/heart/mailbox/readers/mail.js +375 -0
  233. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  234. package/dist/heart/mailbox/readers/sessions.js +232 -0
  235. package/dist/heart/mailbox/readers/shared.js +111 -0
  236. package/dist/heart/mcp/mcp-server.js +696 -0
  237. package/dist/heart/migrate-config.js +100 -0
  238. package/dist/heart/model-capabilities.js +59 -0
  239. package/dist/heart/orientation-frame.js +345 -0
  240. package/dist/heart/platform.js +81 -0
  241. package/dist/heart/primitives.js +1 -1
  242. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  243. package/dist/heart/private-runtime/index.js +18 -0
  244. package/dist/heart/private-runtime/ledger.js +221 -0
  245. package/dist/heart/private-runtime/policy.js +252 -0
  246. package/dist/heart/private-runtime/types.js +2 -0
  247. package/dist/heart/progress-story.js +42 -0
  248. package/dist/heart/provider-attempt.js +137 -0
  249. package/dist/heart/provider-binding-resolver.js +273 -0
  250. package/dist/heart/provider-credentials.js +449 -0
  251. package/dist/heart/provider-failover.js +311 -0
  252. package/dist/heart/provider-models.js +96 -0
  253. package/dist/heart/provider-ping.js +265 -0
  254. package/dist/heart/provider-readiness-cache.js +119 -0
  255. package/dist/heart/provider-visibility.js +188 -0
  256. package/dist/heart/providers/anthropic-token.js +131 -0
  257. package/dist/heart/providers/anthropic.js +236 -58
  258. package/dist/heart/providers/azure.js +104 -13
  259. package/dist/heart/providers/error-classification.js +127 -0
  260. package/dist/heart/providers/github-copilot.js +145 -0
  261. package/dist/heart/providers/minimax-vlm.js +189 -0
  262. package/dist/heart/providers/minimax.js +29 -7
  263. package/dist/heart/providers/openai-codex-token.js +349 -0
  264. package/dist/heart/providers/openai-codex.js +63 -39
  265. package/dist/heart/providers/openai-compatible.js +177 -0
  266. package/dist/heart/run-ledger.js +247 -0
  267. package/dist/heart/runtime-capability-check.js +170 -0
  268. package/dist/heart/runtime-credentials.js +607 -0
  269. package/dist/heart/runtime-cwd.js +87 -0
  270. package/dist/heart/sense-truth.js +79 -0
  271. package/dist/heart/session-activity.js +235 -0
  272. package/dist/heart/session-events.js +1318 -0
  273. package/dist/heart/session-playback-cli-main.js +5 -0
  274. package/dist/heart/session-playback-cli.js +36 -0
  275. package/dist/heart/session-playback.js +231 -0
  276. package/dist/heart/session-stats-cli-main.js +5 -0
  277. package/dist/heart/session-stats.js +182 -0
  278. package/dist/heart/session-transcript.js +133 -0
  279. package/dist/heart/start-of-turn-packet.js +372 -0
  280. package/dist/heart/steward-policy.js +302 -0
  281. package/dist/heart/streaming.js +682 -207
  282. package/dist/heart/structured-output.js +196 -0
  283. package/dist/heart/sync-classification.js +176 -0
  284. package/dist/heart/sync.js +449 -0
  285. package/dist/heart/target-resolution.js +127 -0
  286. package/dist/heart/tempo.js +93 -0
  287. package/dist/heart/temporal-view.js +41 -0
  288. package/dist/heart/timeouts.js +101 -0
  289. package/dist/heart/tool-activity-callbacks.js +59 -0
  290. package/dist/heart/tool-approval.js +342 -0
  291. package/dist/heart/tool-description.js +155 -0
  292. package/dist/heart/tool-friction.js +55 -0
  293. package/dist/heart/tool-loop.js +200 -0
  294. package/dist/heart/turn-context.js +481 -0
  295. package/dist/heart/turn-coordinator.js +28 -0
  296. package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
  297. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  298. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  299. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  300. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  301. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  302. package/dist/heart/versioning/staged-restart.js +146 -0
  303. package/dist/heart/versioning/update-checker.js +116 -0
  304. package/dist/heart/versioning/update-hooks.js +154 -0
  305. package/dist/heart/versioning/version-intent.js +114 -0
  306. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  307. package/dist/heart/work-card.js +380 -0
  308. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  309. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  310. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  311. package/dist/mailbox-ui/index.html +16 -0
  312. package/dist/mailroom/attention.js +167 -0
  313. package/dist/mailroom/autonomy.js +209 -0
  314. package/dist/mailroom/blob-store.js +889 -0
  315. package/dist/mailroom/body-cache.js +61 -0
  316. package/dist/mailroom/cache-sync-cli.js +58 -0
  317. package/dist/mailroom/core.js +803 -0
  318. package/dist/mailroom/entry.js +160 -0
  319. package/dist/mailroom/file-store.js +568 -0
  320. package/dist/mailroom/hosted-cache-sync.js +384 -0
  321. package/dist/mailroom/mbox-import.js +393 -0
  322. package/dist/mailroom/migration.js +164 -0
  323. package/dist/mailroom/outbound.js +380 -0
  324. package/dist/mailroom/policy.js +263 -0
  325. package/dist/mailroom/reader.js +292 -0
  326. package/dist/mailroom/search-cache.js +513 -0
  327. package/dist/mailroom/search-relevance.js +319 -0
  328. package/dist/mailroom/smtp-ingress.js +176 -0
  329. package/dist/mailroom/source-state.js +176 -0
  330. package/dist/mailroom/thread.js +109 -0
  331. package/dist/mailroom/travel-extract.js +89 -0
  332. package/dist/mind/bundle-manifest.js +93 -1
  333. package/dist/mind/context.js +287 -104
  334. package/dist/mind/desk-section.js +362 -0
  335. package/dist/mind/diary-integrity.js +60 -0
  336. package/dist/mind/{memory.js → diary.js} +90 -98
  337. package/dist/mind/embedding-provider.js +60 -0
  338. package/dist/mind/file-state.js +179 -0
  339. package/dist/mind/first-impressions.js +16 -2
  340. package/dist/mind/{associative-recall.js → note-search.js} +61 -60
  341. package/dist/mind/obligation-steering.js +227 -0
  342. package/dist/mind/pending.js +102 -9
  343. package/dist/mind/phrases.js +1 -0
  344. package/dist/mind/prompt-budget.js +479 -0
  345. package/dist/mind/prompt-refresh.js +3 -2
  346. package/dist/mind/prompt.js +1377 -140
  347. package/dist/mind/provenance-trust.js +26 -0
  348. package/dist/mind/record-paths.js +312 -0
  349. package/dist/mind/scrutiny.js +173 -0
  350. package/dist/mind/session-transaction.js +415 -0
  351. package/dist/mind/token-estimate.js +8 -12
  352. package/dist/nerves/cli-logging.js +22 -3
  353. package/dist/nerves/coverage/audit-rules.js +15 -6
  354. package/dist/nerves/coverage/audit.js +28 -2
  355. package/dist/nerves/coverage/cli.js +1 -1
  356. package/dist/nerves/coverage/contract.js +5 -5
  357. package/dist/nerves/coverage/file-completeness.js +139 -5
  358. package/dist/nerves/coverage/run-artifacts.js +56 -36
  359. package/dist/nerves/coverage/source-scanner.js +4 -4
  360. package/dist/nerves/event-buffer.js +111 -0
  361. package/dist/nerves/index.js +305 -9
  362. package/dist/nerves/observation.js +20 -0
  363. package/dist/nerves/redact.js +79 -0
  364. package/dist/nerves/review/cli-main.js +5 -0
  365. package/dist/nerves/review/cli.js +156 -0
  366. package/dist/nerves/review/core.js +159 -0
  367. package/dist/nerves/runtime.js +17 -1
  368. package/dist/repertoire/ado-client.js +17 -56
  369. package/dist/repertoire/ado-semantic.js +16 -10
  370. package/dist/repertoire/api-client.js +97 -0
  371. package/dist/repertoire/bitwarden-store.js +1045 -0
  372. package/dist/repertoire/bundle-templates.js +71 -0
  373. package/dist/repertoire/bw-installer.js +180 -0
  374. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  375. package/dist/repertoire/coding/context-pack.js +331 -0
  376. package/dist/repertoire/coding/feedback.js +322 -0
  377. package/dist/repertoire/coding/index.js +18 -3
  378. package/dist/repertoire/coding/manager.js +228 -14
  379. package/dist/repertoire/coding/spawner.js +61 -14
  380. package/dist/repertoire/coding/tools.js +279 -12
  381. package/dist/repertoire/coding/workbench-client.js +272 -0
  382. package/dist/repertoire/coding/workbench-manager.js +346 -0
  383. package/dist/repertoire/commerce-errors.js +109 -0
  384. package/dist/repertoire/commerce-self-test.js +156 -0
  385. package/dist/repertoire/credential-access.js +178 -0
  386. package/dist/repertoire/data/ado-endpoints.json +188 -0
  387. package/dist/repertoire/desk/classifier.js +362 -0
  388. package/dist/repertoire/duffel-client.js +185 -0
  389. package/dist/repertoire/github-client.js +14 -55
  390. package/dist/repertoire/graph-client.js +11 -52
  391. package/dist/repertoire/guardrails.js +1083 -0
  392. package/dist/repertoire/mcp-client.js +295 -0
  393. package/dist/repertoire/mcp-manager.js +434 -0
  394. package/dist/repertoire/mcp-tools.js +83 -0
  395. package/dist/repertoire/plugin-mcp.js +175 -0
  396. package/dist/repertoire/plugins.js +253 -0
  397. package/dist/repertoire/relationship-authorization.js +194 -0
  398. package/dist/repertoire/shell-sessions.js +133 -0
  399. package/dist/repertoire/skills.js +45 -24
  400. package/dist/repertoire/stripe-client.js +131 -0
  401. package/dist/repertoire/tool-arguments.js +148 -0
  402. package/dist/repertoire/tool-results.js +29 -0
  403. package/dist/repertoire/tools-a2a.js +699 -0
  404. package/dist/repertoire/tools-attachments.js +322 -0
  405. package/dist/repertoire/tools-awaiting.js +575 -0
  406. package/dist/repertoire/tools-base.js +85 -707
  407. package/dist/repertoire/tools-bluebubbles.js +95 -0
  408. package/dist/repertoire/tools-bridge.js +144 -0
  409. package/dist/repertoire/tools-bundle.js +993 -0
  410. package/dist/repertoire/tools-commerce.js +253 -0
  411. package/dist/repertoire/tools-config.js +186 -0
  412. package/dist/repertoire/tools-continuity.js +575 -0
  413. package/dist/repertoire/tools-credential.js +383 -0
  414. package/dist/repertoire/tools-evolution.js +527 -0
  415. package/dist/repertoire/tools-files.js +344 -0
  416. package/dist/repertoire/tools-flight.js +290 -0
  417. package/dist/repertoire/tools-flow.js +119 -0
  418. package/dist/repertoire/tools-github.js +3 -8
  419. package/dist/repertoire/tools-habits.js +103 -0
  420. package/dist/repertoire/tools-mail.js +1828 -0
  421. package/dist/repertoire/tools-notes.js +485 -0
  422. package/dist/repertoire/tools-obligations.js +182 -0
  423. package/dist/repertoire/tools-orientation.js +31 -0
  424. package/dist/repertoire/tools-record.js +482 -0
  425. package/dist/repertoire/tools-rsvp.js +139 -0
  426. package/dist/repertoire/tools-runtime.js +150 -0
  427. package/dist/repertoire/tools-session.js +1108 -0
  428. package/dist/repertoire/tools-shell.js +133 -0
  429. package/dist/repertoire/tools-steward-policy.js +95 -0
  430. package/dist/repertoire/tools-stripe.js +224 -0
  431. package/dist/repertoire/tools-surface.js +369 -0
  432. package/dist/repertoire/tools-teams.js +67 -61
  433. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  434. package/dist/repertoire/tools-travel.js +125 -0
  435. package/dist/repertoire/tools-trip.js +982 -0
  436. package/dist/repertoire/tools-unraid.js +484 -0
  437. package/dist/repertoire/tools-user-profile.js +146 -0
  438. package/dist/repertoire/tools-vault.js +40 -0
  439. package/dist/repertoire/tools-voice.js +145 -0
  440. package/dist/repertoire/tools.js +441 -102
  441. package/dist/repertoire/travel-api-client.js +360 -0
  442. package/dist/repertoire/unraid-client.js +155 -0
  443. package/dist/repertoire/unraid-restart.js +212 -0
  444. package/dist/repertoire/user-profile.js +131 -0
  445. package/dist/repertoire/vault-setup.js +246 -0
  446. package/dist/repertoire/vault-unlock.js +628 -0
  447. package/dist/rsvp/aisleplanner-client.js +354 -0
  448. package/dist/rsvp/cli.js +926 -0
  449. package/dist/rsvp/config.js +327 -0
  450. package/dist/rsvp/cutover.js +433 -0
  451. package/dist/rsvp/diagnostics.js +232 -0
  452. package/dist/rsvp/diff-renderer.js +176 -0
  453. package/dist/rsvp/habit-policy.js +110 -0
  454. package/dist/rsvp/habit-stage.js +123 -0
  455. package/dist/rsvp/incident-bundle.js +97 -0
  456. package/dist/rsvp/migration.js +204 -0
  457. package/dist/rsvp/native-habit-runner.js +630 -0
  458. package/dist/rsvp/outbound-state.js +628 -0
  459. package/dist/rsvp/query.js +118 -0
  460. package/dist/rsvp/replay.js +233 -0
  461. package/dist/rsvp/snapshot.js +232 -0
  462. package/dist/rsvp/spend-ledger.js +175 -0
  463. package/dist/scripts/claude-code-hook.js +41 -0
  464. package/dist/scripts/claude-code-stop-hook.js +47 -0
  465. package/dist/senses/a2a-entry.js +115 -0
  466. package/dist/senses/attention-queue.js +186 -0
  467. package/dist/senses/await-turn-message.js +58 -0
  468. package/dist/senses/bluebubbles/active-turns.js +216 -0
  469. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  470. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  471. package/dist/senses/bluebubbles/client.js +799 -0
  472. package/dist/senses/bluebubbles/context-packet.js +207 -0
  473. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  474. package/dist/senses/bluebubbles/entry.js +90 -0
  475. package/dist/senses/bluebubbles/inbound-log.js +127 -0
  476. package/dist/senses/bluebubbles/index.js +3839 -0
  477. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  478. package/dist/senses/bluebubbles/media.js +389 -0
  479. package/dist/senses/bluebubbles/model.js +392 -0
  480. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +57 -6
  481. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  482. package/dist/senses/bluebubbles/processed-log.js +133 -0
  483. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  484. package/dist/senses/bluebubbles/replay.js +284 -0
  485. package/dist/senses/bluebubbles/runtime-state.js +137 -0
  486. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  487. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  488. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  489. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  490. package/dist/senses/cli/bracketed-paste.js +82 -0
  491. package/dist/senses/cli/image-paste.js +287 -0
  492. package/dist/senses/cli/image-ref-navigation.js +75 -0
  493. package/dist/senses/cli/ink-app.js +156 -0
  494. package/dist/senses/cli/inline-diff.js +64 -0
  495. package/dist/senses/cli/input-keys.js +174 -0
  496. package/dist/senses/cli/kill-ring.js +86 -0
  497. package/dist/senses/cli/message-list.js +51 -0
  498. package/dist/senses/cli/ouro-tui.js +607 -0
  499. package/dist/senses/cli/spinner-imperative.js +135 -0
  500. package/dist/senses/cli/spinner.js +101 -0
  501. package/dist/senses/cli/status-line.js +60 -0
  502. package/dist/senses/cli/streaming-markdown.js +526 -0
  503. package/dist/senses/cli/tool-display.js +85 -0
  504. package/dist/senses/cli/tool-render.js +85 -0
  505. package/dist/senses/cli/tui-store.js +241 -0
  506. package/dist/senses/cli/virtual-list.js +35 -0
  507. package/dist/senses/cli-entry.js +60 -8
  508. package/dist/senses/cli-layout.js +187 -0
  509. package/dist/senses/cli.js +813 -281
  510. package/dist/senses/commands.js +66 -3
  511. package/dist/senses/context-packet-ledger.js +371 -0
  512. package/dist/senses/context-packets.js +154 -0
  513. package/dist/senses/continuity.js +94 -0
  514. package/dist/senses/habit-lifecycle-guard.js +24 -0
  515. package/dist/senses/habit-turn-message.js +160 -0
  516. package/dist/senses/ingress-evidence.js +2 -0
  517. package/dist/senses/mail-entry.js +66 -0
  518. package/dist/senses/mail.js +524 -0
  519. package/dist/senses/pipeline.js +1213 -0
  520. package/dist/senses/private-runtime-worker.js +859 -0
  521. package/dist/senses/private-runtime.js +1496 -0
  522. package/dist/senses/proactive-content-guard.js +51 -0
  523. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  524. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  525. package/dist/senses/sanctuary-grounding.js +118 -0
  526. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  527. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  528. package/dist/senses/sanctuary-health-runner.js +101 -0
  529. package/dist/senses/sanctuary-health.js +408 -0
  530. package/dist/senses/sanctuary-interactive-control.js +306 -0
  531. package/dist/senses/sanctuary-media-catalog-contract.js +235 -0
  532. package/dist/senses/sanctuary-media-optimization.js +514 -0
  533. package/dist/senses/sanctuary-runtime.js +338 -0
  534. package/dist/senses/sanctuary-sab.js +85 -0
  535. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  536. package/dist/senses/shared-turn.js +571 -0
  537. package/dist/senses/surface-tool.js +109 -0
  538. package/dist/senses/teams-entry.js +60 -8
  539. package/dist/senses/teams.js +953 -211
  540. package/dist/senses/telegram-admission.js +711 -0
  541. package/dist/senses/telegram-approval-runtime.js +566 -0
  542. package/dist/senses/telegram-attachments.js +182 -0
  543. package/dist/senses/telegram-audit-ledger.js +220 -0
  544. package/dist/senses/telegram-client.js +1677 -0
  545. package/dist/senses/telegram-effect-adapter.js +859 -0
  546. package/dist/senses/telegram-entry.js +83 -0
  547. package/dist/senses/telegram.js +2026 -0
  548. package/dist/senses/trust-gate.js +207 -2
  549. package/dist/senses/voice/audio-playback.js +237 -0
  550. package/dist/senses/voice/audio-routing.js +119 -0
  551. package/dist/senses/voice/elevenlabs.js +202 -0
  552. package/dist/senses/voice/floor-control.js +431 -0
  553. package/dist/senses/voice/floor-controller.js +115 -0
  554. package/dist/senses/voice/golden-path.js +116 -0
  555. package/dist/senses/voice/index.js +29 -0
  556. package/dist/senses/voice/meeting.js +113 -0
  557. package/dist/senses/voice/outbound.js +190 -0
  558. package/dist/senses/voice/phone.js +33 -0
  559. package/dist/senses/voice/playback.js +139 -0
  560. package/dist/senses/voice/realtime-eval.js +496 -0
  561. package/dist/senses/voice/realtime-trace.js +531 -0
  562. package/dist/senses/voice/transcript.js +70 -0
  563. package/dist/senses/voice/turn.js +191 -0
  564. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  565. package/dist/senses/voice/twilio-phone.js +5081 -0
  566. package/dist/senses/voice/types.js +2 -0
  567. package/dist/senses/voice/whisper.js +161 -0
  568. package/dist/senses/voice-entry.js +81 -0
  569. package/dist/senses/voice-realtime-eval-command.js +99 -0
  570. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  571. package/dist/senses/voice-twilio-entry.js +87 -0
  572. package/dist/trips/core.js +138 -0
  573. package/dist/trips/store.js +265 -0
  574. package/dist/util/frontmatter.js +69 -0
  575. package/npm-shrinkwrap.json +8144 -0
  576. package/package.json +82 -12
  577. package/skills/agent-commerce.md +113 -0
  578. package/skills/browser-navigation.md +117 -0
  579. package/skills/commerce-setup-guide.md +116 -0
  580. package/skills/commerce-setup.md +84 -0
  581. package/skills/configure-dev-tools.md +99 -0
  582. package/skills/travel-planning.md +138 -0
  583. package/AdoptionSpecialist.ouro/agent.json +0 -20
  584. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  585. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  586. package/dist/heart/daemon/specialist-prompt.js +0 -47
  587. package/dist/heart/daemon/specialist-session.js +0 -142
  588. package/dist/heart/daemon/specialist-tools.js +0 -132
  589. package/dist/heart/daemon/subagent-installer.js +0 -125
  590. package/dist/inner-worker-entry.js +0 -4
  591. package/dist/mind/friends/channel.js +0 -49
  592. package/dist/mind/friends/resolver.js +0 -84
  593. package/dist/mind/friends/store-file.js +0 -171
  594. package/dist/mind/friends/store.js +0 -4
  595. package/dist/mind/friends/tokens.js +0 -26
  596. package/dist/mind/friends/types.js +0 -21
  597. package/dist/repertoire/tasks/board.js +0 -122
  598. package/dist/repertoire/tasks/index.js +0 -210
  599. package/dist/repertoire/tasks/middleware.js +0 -65
  600. package/dist/repertoire/tasks/parser.js +0 -173
  601. package/dist/repertoire/tasks/scanner.js +0 -132
  602. package/dist/repertoire/tasks/transitions.js +0 -145
  603. package/dist/senses/bluebubbles-client.js +0 -279
  604. package/dist/senses/bluebubbles-entry.js +0 -11
  605. package/dist/senses/bluebubbles-model.js +0 -253
  606. package/dist/senses/bluebubbles.js +0 -332
  607. package/dist/senses/inner-dialog-worker.js +0 -61
  608. package/dist/senses/inner-dialog.js +0 -231
  609. package/subagents/README.md +0 -73
  610. package/subagents/work-doer.md +0 -233
  611. package/subagents/work-merger.md +0 -624
  612. package/subagents/work-planner.md +0 -373
  613. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  614. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  615. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  616. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  617. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  618. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  619. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  620. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  621. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  622. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  623. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  624. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
@@ -35,21 +35,16 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.CodingSessionManager = void 0;
37
37
  const fs = __importStar(require("fs"));
38
- const os = __importStar(require("os"));
39
38
  const path = __importStar(require("path"));
40
39
  const identity_1 = require("../../heart/identity");
40
+ const session_events_1 = require("../../heart/session-events");
41
41
  const runtime_1 = require("../../nerves/runtime");
42
42
  const spawner_1 = require("./spawner");
43
- function safeAgentName() {
44
- try {
45
- return (0, identity_1.getAgentName)();
46
- }
47
- catch {
48
- return "default";
49
- }
50
- }
51
43
  function defaultStateFilePath(agentName) {
52
- return path.join(os.homedir(), ".agentstate", agentName, "coding", "sessions.json");
44
+ return path.join((0, identity_1.getAgentRoot)(agentName), "state", "coding", "sessions.json");
45
+ }
46
+ function defaultArtifactDirPath(agentName) {
47
+ return path.join((0, identity_1.getAgentRoot)(agentName), "state", "coding", "sessions");
53
48
  }
54
49
  function isPidAlive(pid) {
55
50
  try {
@@ -63,6 +58,11 @@ function isPidAlive(pid) {
63
58
  function cloneSession(session) {
64
59
  return {
65
60
  ...session,
61
+ originSession: session.originSession ? { ...session.originSession } : undefined,
62
+ checkpoint: session.checkpoint ?? null,
63
+ artifactPath: session.artifactPath,
64
+ stdoutTail: session.stdoutTail,
65
+ stderrTail: session.stderrTail,
66
66
  failure: session.failure
67
67
  ? {
68
68
  ...session.failure,
@@ -84,6 +84,46 @@ function appendTail(existing, nextChunk, maxLength = 2000) {
84
84
  const combined = `${existing}${nextChunk}`;
85
85
  return combined.length <= maxLength ? combined : combined.slice(combined.length - maxLength);
86
86
  }
87
+ function compactText(text) {
88
+ return text.replace(/\s+/g, " ").trim();
89
+ }
90
+ function clipText(text, maxLength = 240) {
91
+ return text.length <= maxLength ? text : `${text.slice(0, maxLength - 3)}...`;
92
+ }
93
+ function latestMeaningfulLine(text) {
94
+ const lines = text
95
+ .split(/\r?\n/)
96
+ .map((line) => compactText(line))
97
+ .filter(Boolean);
98
+ if (lines.length === 0)
99
+ return null;
100
+ return clipText(lines.at(-1));
101
+ }
102
+ function fallbackCheckpoint(status, code, signal) {
103
+ switch (status) {
104
+ case "waiting_input":
105
+ return "needs input";
106
+ case "stalled":
107
+ return "no recent output";
108
+ case "completed":
109
+ return "completed";
110
+ case "failed":
111
+ if (code !== null)
112
+ return `exit code ${code}`;
113
+ if (signal)
114
+ return `terminated by ${signal}`;
115
+ return "failed";
116
+ case "killed":
117
+ return "terminated by parent agent";
118
+ default:
119
+ return null;
120
+ }
121
+ }
122
+ function deriveCheckpoint(session) {
123
+ return (latestMeaningfulLine(session.stderrTail)
124
+ ?? latestMeaningfulLine(session.stdoutTail)
125
+ ?? fallbackCheckpoint(session.status, session.lastExitCode, session.lastSignal));
126
+ }
87
127
  function isSpawnCodingResult(value) {
88
128
  return typeof value === "object" && value !== null && "process" in value;
89
129
  }
@@ -115,11 +155,13 @@ function defaultFailureDiagnostics(code, signal, command, args, stdoutTail, stde
115
155
  }
116
156
  class CodingSessionManager {
117
157
  records = new Map();
158
+ listeners = new Map();
118
159
  spawnProcess;
119
160
  nowIso;
120
161
  maxRestarts;
121
162
  defaultStallThresholdMs;
122
163
  stateFilePath;
164
+ artifactDirPath;
123
165
  existsSync;
124
166
  readFileSync;
125
167
  writeFileSync;
@@ -137,8 +179,19 @@ class CodingSessionManager {
137
179
  this.writeFileSync = options.writeFileSync ?? fs.writeFileSync;
138
180
  this.mkdirSync = options.mkdirSync ?? fs.mkdirSync;
139
181
  this.pidAlive = options.pidAlive ?? isPidAlive;
140
- this.agentName = options.agentName ?? safeAgentName();
182
+ // No silent fallback to "default" — if there's no agentName and no
183
+ // explicit option, getAgentName() throws. The previous `safeAgentName`
184
+ // helper fell back to "default" and ended up writing coding session
185
+ // state to `~/AgentBundles/default.ouro/state/coding/sessions.json` on
186
+ // every vitest run because the coding manager singleton constructs with
187
+ // `{}`. That leaked real-fs state into the developer's home directory
188
+ // on every coverage run. Production callers always pass via argv (see
189
+ // getAgentName); test callers must either pass `agentName` explicitly
190
+ // or mock `../../heart/identity`.
191
+ this.agentName = options.agentName ?? (0, identity_1.getAgentName)();
141
192
  this.stateFilePath = options.stateFilePath ?? defaultStateFilePath(this.agentName);
193
+ this.artifactDirPath = options.artifactDirPath
194
+ ?? (options.stateFilePath ? path.dirname(options.stateFilePath) : defaultArtifactDirPath(this.agentName));
142
195
  this.loadPersistedState();
143
196
  }
144
197
  async spawnSession(request) {
@@ -155,9 +208,16 @@ class CodingSessionManager {
155
208
  runner: normalizedRequest.runner,
156
209
  workdir: normalizedRequest.workdir,
157
210
  taskRef: normalizedRequest.taskRef,
211
+ originSession: normalizedRequest.originSession ? { ...normalizedRequest.originSession } : undefined,
212
+ obligationId: normalizedRequest.obligationId,
213
+ evolutionCaseId: normalizedRequest.evolutionCaseId,
158
214
  scopeFile: normalizedRequest.scopeFile,
159
215
  stateFile: normalizedRequest.stateFile,
216
+ checkpoint: null,
217
+ artifactPath: this.artifactPathFor(id),
160
218
  status: "spawning",
219
+ stdoutTail: "",
220
+ stderrTail: "",
161
221
  pid: null,
162
222
  startedAt: now,
163
223
  lastActivityAt: now,
@@ -188,6 +248,7 @@ class CodingSessionManager {
188
248
  meta: { id, runner: normalizedRequest.runner, pid: session.pid },
189
249
  });
190
250
  this.persistState();
251
+ this.notifyListeners(id, { kind: "spawned", session: cloneSession(session) });
191
252
  return cloneSession(session);
192
253
  }
193
254
  listSessions() {
@@ -199,6 +260,20 @@ class CodingSessionManager {
199
260
  const record = this.records.get(sessionId);
200
261
  return record ? cloneSession(record.session) : null;
201
262
  }
263
+ subscribe(sessionId, listener) {
264
+ const listeners = this.listeners.get(sessionId) ?? new Set();
265
+ listeners.add(listener);
266
+ this.listeners.set(sessionId, listeners);
267
+ return () => {
268
+ const current = this.listeners.get(sessionId);
269
+ if (!current)
270
+ return;
271
+ current.delete(listener);
272
+ if (current.size === 0) {
273
+ this.listeners.delete(sessionId);
274
+ }
275
+ };
276
+ }
202
277
  sendInput(sessionId, input) {
203
278
  const record = this.records.get(sessionId);
204
279
  if (!record || !record.process) {
@@ -226,6 +301,7 @@ class CodingSessionManager {
226
301
  record.process.kill("SIGTERM");
227
302
  record.process = null;
228
303
  record.session.status = "killed";
304
+ record.session.checkpoint = "terminated by parent agent";
229
305
  record.session.endedAt = this.nowIso();
230
306
  (0, runtime_1.emitNervesEvent)({
231
307
  component: "repertoire",
@@ -234,6 +310,7 @@ class CodingSessionManager {
234
310
  meta: { id: sessionId },
235
311
  });
236
312
  this.persistState();
313
+ this.notifyListeners(sessionId, { kind: "killed", session: cloneSession(record.session) });
237
314
  return { ok: true, message: `killed ${sessionId}` };
238
315
  }
239
316
  checkStalls(nowMs = Date.now()) {
@@ -247,6 +324,7 @@ class CodingSessionManager {
247
324
  continue;
248
325
  stalled += 1;
249
326
  record.session.status = "stalled";
327
+ record.session.checkpoint = deriveCheckpoint(record.session);
250
328
  (0, runtime_1.emitNervesEvent)({
251
329
  level: "warn",
252
330
  component: "repertoire",
@@ -254,6 +332,7 @@ class CodingSessionManager {
254
332
  message: "coding session stalled",
255
333
  meta: { id: record.session.id, elapsedMs: elapsed },
256
334
  });
335
+ this.notifyListeners(record.session.id, { kind: "stalled", session: cloneSession(record.session) });
257
336
  if (record.request.autoRestartOnStall !== false && record.session.restartCount < this.maxRestarts) {
258
337
  this.restartSession(record, "stalled");
259
338
  }
@@ -271,6 +350,7 @@ class CodingSessionManager {
271
350
  record.process = null;
272
351
  if (record.session.status === "running" || record.session.status === "spawning") {
273
352
  record.session.status = "killed";
353
+ record.session.checkpoint = "terminated during manager shutdown";
274
354
  record.session.endedAt = this.nowIso();
275
355
  }
276
356
  }
@@ -297,18 +377,30 @@ class CodingSessionManager {
297
377
  }
298
378
  onOutput(record, text, stream) {
299
379
  record.session.lastActivityAt = this.nowIso();
380
+ let updateKind = "progress";
300
381
  if (stream === "stdout") {
301
382
  record.stdoutTail = appendTail(record.stdoutTail, text);
383
+ record.session.stdoutTail = record.stdoutTail;
302
384
  }
303
385
  else {
304
386
  record.stderrTail = appendTail(record.stderrTail, text);
387
+ record.session.stderrTail = record.stderrTail;
305
388
  }
306
389
  if (text.includes("status: NEEDS_REVIEW") || text.includes("❌ blocked")) {
307
390
  record.session.status = "waiting_input";
391
+ updateKind = "waiting_input";
308
392
  }
309
393
  if (text.includes("✅ all units complete")) {
310
394
  record.session.status = "completed";
311
395
  record.session.endedAt = this.nowIso();
396
+ updateKind = "completed";
397
+ }
398
+ const checkpoint = latestMeaningfulLine(text);
399
+ if (checkpoint) {
400
+ record.session.checkpoint = checkpoint;
401
+ }
402
+ else if (!record.session.checkpoint) {
403
+ record.session.checkpoint = deriveCheckpoint(record.session);
312
404
  }
313
405
  (0, runtime_1.emitNervesEvent)({
314
406
  component: "repertoire",
@@ -317,6 +409,12 @@ class CodingSessionManager {
317
409
  meta: { id: record.session.id, status: record.session.status },
318
410
  });
319
411
  this.persistState();
412
+ this.notifyListeners(record.session.id, {
413
+ kind: updateKind,
414
+ session: cloneSession(record.session),
415
+ stream,
416
+ text,
417
+ });
320
418
  }
321
419
  onExit(record, code, signal) {
322
420
  if (!record.process)
@@ -327,13 +425,16 @@ class CodingSessionManager {
327
425
  record.session.lastSignal = signal;
328
426
  if (record.session.status === "killed" || record.session.status === "completed") {
329
427
  record.session.endedAt = this.nowIso();
428
+ record.session.checkpoint = deriveCheckpoint(record.session);
330
429
  this.persistState();
331
430
  return;
332
431
  }
333
432
  if (code === 0) {
334
433
  record.session.status = "completed";
335
434
  record.session.endedAt = this.nowIso();
435
+ record.session.checkpoint = deriveCheckpoint(record.session);
336
436
  this.persistState();
437
+ this.notifyListeners(record.session.id, { kind: "completed", session: cloneSession(record.session) });
337
438
  return;
338
439
  }
339
440
  if (record.request.autoRestartOnCrash !== false && record.session.restartCount < this.maxRestarts) {
@@ -343,6 +444,7 @@ class CodingSessionManager {
343
444
  record.session.status = "failed";
344
445
  record.session.endedAt = this.nowIso();
345
446
  record.session.failure = defaultFailureDiagnostics(code, signal, record.command, record.args, record.stdoutTail, record.stderrTail);
447
+ record.session.checkpoint = deriveCheckpoint(record.session);
346
448
  (0, runtime_1.emitNervesEvent)({
347
449
  level: "error",
348
450
  component: "repertoire",
@@ -351,6 +453,7 @@ class CodingSessionManager {
351
453
  meta: { id: record.session.id, code, signal, command: record.command },
352
454
  });
353
455
  this.persistState();
456
+ this.notifyListeners(record.session.id, { kind: "failed", session: cloneSession(record.session) });
354
457
  }
355
458
  restartSession(record, reason) {
356
459
  const replacement = normalizeSpawnResult(this.spawnProcess(record.request));
@@ -359,12 +462,15 @@ class CodingSessionManager {
359
462
  record.args = [...replacement.args];
360
463
  record.stdoutTail = "";
361
464
  record.stderrTail = "";
465
+ record.session.stdoutTail = "";
466
+ record.session.stderrTail = "";
362
467
  record.session.pid = replacement.process.pid ?? null;
363
468
  record.session.restartCount += 1;
364
469
  record.session.status = "running";
365
470
  record.session.lastActivityAt = this.nowIso();
366
471
  record.session.endedAt = null;
367
472
  record.session.failure = null;
473
+ record.session.checkpoint = `restarted after ${reason}`;
368
474
  this.attachProcessListeners(record);
369
475
  (0, runtime_1.emitNervesEvent)({
370
476
  level: "warn",
@@ -375,6 +481,26 @@ class CodingSessionManager {
375
481
  });
376
482
  this.persistState();
377
483
  }
484
+ notifyListeners(sessionId, update) {
485
+ const listeners = this.listeners.get(sessionId);
486
+ if (!listeners || listeners.size === 0)
487
+ return;
488
+ for (const listener of listeners) {
489
+ void Promise.resolve(listener(update)).catch((error) => {
490
+ (0, runtime_1.emitNervesEvent)({
491
+ level: "warn",
492
+ component: "repertoire",
493
+ event: "repertoire.coding_feedback_listener_error",
494
+ message: "coding session listener failed",
495
+ meta: {
496
+ sessionId,
497
+ kind: update.kind,
498
+ reason: error instanceof Error ? error.message : String(error),
499
+ },
500
+ });
501
+ });
502
+ }
503
+ }
378
504
  loadPersistedState() {
379
505
  if (!this.existsSync(this.stateFilePath)) {
380
506
  return;
@@ -426,13 +552,22 @@ class CodingSessionManager {
426
552
  }
427
553
  const normalizedRequest = {
428
554
  ...request,
555
+ originSession: request.originSession ? { ...request.originSession } : undefined,
429
556
  sessionId: request.sessionId ?? session.id,
557
+ obligationId: request.obligationId,
430
558
  parentAgent: request.parentAgent ?? this.agentName,
431
559
  };
432
560
  const normalizedSession = {
433
561
  ...session,
434
562
  taskRef: session.taskRef ?? normalizedRequest.taskRef,
563
+ originSession: session.originSession ?? normalizedRequest.originSession,
564
+ obligationId: session.obligationId ?? normalizedRequest.obligationId,
565
+ evolutionCaseId: session.evolutionCaseId ?? normalizedRequest.evolutionCaseId,
435
566
  failure: session.failure ?? null,
567
+ stdoutTail: session.stdoutTail ?? session.failure?.stdoutTail ?? "",
568
+ stderrTail: session.stderrTail ?? session.failure?.stderrTail ?? "",
569
+ checkpoint: typeof session.checkpoint === "string" ? session.checkpoint : null,
570
+ artifactPath: typeof session.artifactPath === "string" ? session.artifactPath : this.artifactPathFor(session.id),
436
571
  };
437
572
  if (typeof normalizedSession.pid === "number") {
438
573
  const alive = this.pidAlive(normalizedSession.pid);
@@ -445,14 +580,15 @@ class CodingSessionManager {
445
580
  normalizedSession.pid = null;
446
581
  }
447
582
  }
583
+ normalizedSession.checkpoint = normalizedSession.checkpoint ?? deriveCheckpoint(normalizedSession);
448
584
  this.records.set(normalizedSession.id, {
449
585
  request: normalizedRequest,
450
586
  session: normalizedSession,
451
587
  process: null,
452
588
  command: normalizedSession.failure?.command ?? "restored",
453
589
  args: normalizedSession.failure ? [...normalizedSession.failure.args] : [],
454
- stdoutTail: normalizedSession.failure?.stdoutTail ?? "",
455
- stderrTail: normalizedSession.failure?.stderrTail ?? "",
590
+ stdoutTail: normalizedSession.stdoutTail,
591
+ stderrTail: normalizedSession.stderrTail,
456
592
  });
457
593
  this.sequence = Math.max(this.sequence, extractSequence(normalizedSession.id));
458
594
  }
@@ -467,7 +603,10 @@ class CodingSessionManager {
467
603
  const payload = {
468
604
  sequence: this.sequence,
469
605
  records: [...this.records.values()].map((record) => ({
470
- request: record.request,
606
+ request: {
607
+ ...record.request,
608
+ prompt: (0, session_events_1.capStructuredRecordString)(record.request.prompt),
609
+ },
471
610
  session: record.session,
472
611
  })),
473
612
  };
@@ -484,6 +623,81 @@ class CodingSessionManager {
484
623
  meta: { path: this.stateFilePath, reason: error instanceof Error ? error.message : String(error) },
485
624
  });
486
625
  }
626
+ this.persistArtifacts();
627
+ }
628
+ artifactPathFor(sessionId) {
629
+ return path.join(this.artifactDirPath, `${sessionId}.md`);
630
+ }
631
+ renderArtifact(record) {
632
+ const { request, session } = record;
633
+ const stdout = session.stdoutTail.trim() || "(empty)";
634
+ const stderr = session.stderrTail.trim() || "(empty)";
635
+ const lines = [
636
+ "# Coding Session Artifact",
637
+ "",
638
+ "## Session",
639
+ `id: ${session.id}`,
640
+ `runner: ${session.runner}`,
641
+ `status: ${session.status}`,
642
+ `taskRef: ${session.taskRef ?? "unassigned"}`,
643
+ `evolutionCaseId: ${session.evolutionCaseId ?? "none"}`,
644
+ `workdir: ${session.workdir}`,
645
+ `startedAt: ${session.startedAt}`,
646
+ `lastActivityAt: ${session.lastActivityAt}`,
647
+ `endedAt: ${session.endedAt ?? "active"}`,
648
+ `pid: ${session.pid ?? "none"}`,
649
+ `restarts: ${session.restartCount}`,
650
+ `checkpoint: ${session.checkpoint ?? "none"}`,
651
+ `scopeFile: ${session.scopeFile ?? "none"}`,
652
+ `stateFile: ${session.stateFile ?? "none"}`,
653
+ "",
654
+ "## Request",
655
+ (0, session_events_1.capStructuredRecordString)(request.prompt),
656
+ "",
657
+ "## Stdout Tail",
658
+ stdout,
659
+ "",
660
+ "## Stderr Tail",
661
+ stderr,
662
+ ];
663
+ if (session.failure) {
664
+ lines.push("", "## Failure", `command: ${session.failure.command}`, `args: ${session.failure.args.join(" ") || "(none)"}`, `code: ${session.failure.code ?? "null"}`, `signal: ${session.failure.signal ?? "null"}`);
665
+ }
666
+ return `${lines.join("\n")}\n`;
667
+ }
668
+ persistArtifacts() {
669
+ try {
670
+ this.mkdirSync(this.artifactDirPath, { recursive: true });
671
+ }
672
+ catch (error) {
673
+ (0, runtime_1.emitNervesEvent)({
674
+ level: "warn",
675
+ component: "repertoire",
676
+ event: "repertoire.coding_artifact_persist_error",
677
+ message: "failed preparing coding artifact directory",
678
+ meta: { path: this.artifactDirPath, reason: error instanceof Error ? error.message : String(error) },
679
+ });
680
+ return;
681
+ }
682
+ for (const record of this.records.values()) {
683
+ try {
684
+ record.session.artifactPath = record.session.artifactPath ?? this.artifactPathFor(record.session.id);
685
+ this.writeFileSync(record.session.artifactPath, this.renderArtifact(record), "utf-8");
686
+ }
687
+ catch (error) {
688
+ (0, runtime_1.emitNervesEvent)({
689
+ level: "warn",
690
+ component: "repertoire",
691
+ event: "repertoire.coding_artifact_persist_error",
692
+ message: "failed writing coding session artifact",
693
+ meta: {
694
+ id: record.session.id,
695
+ path: record.session.artifactPath ?? this.artifactPathFor(record.session.id),
696
+ reason: error instanceof Error ? error.message : String(error),
697
+ },
698
+ });
699
+ }
700
+ }
487
701
  }
488
702
  }
489
703
  exports.CodingSessionManager = CodingSessionManager;
@@ -33,45 +33,88 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.buildCodingPrompt = buildCodingPrompt;
36
37
  exports.spawnCodingProcess = spawnCodingProcess;
37
38
  const child_process_1 = require("child_process");
38
39
  const fs = __importStar(require("fs"));
40
+ const os = __importStar(require("os"));
41
+ const path = __importStar(require("path"));
39
42
  const runtime_1 = require("../../nerves/runtime");
40
- function buildCommandArgs(runner, workdir) {
43
+ function buildCommandArgs(runner, workdir, parentAgent) {
41
44
  if (runner === "claude") {
42
45
  return {
43
46
  command: "claude",
44
47
  args: [
45
48
  "-p",
49
+ "--verbose",
50
+ "--no-session-persistence",
46
51
  "--dangerously-skip-permissions",
47
52
  "--add-dir",
48
53
  workdir,
49
- "--input-format",
50
- "stream-json",
51
54
  "--output-format",
52
55
  "stream-json",
53
56
  ],
54
57
  };
55
58
  }
59
+ const agent = parentAgent ?? "unknown";
60
+ // Use absolute path to ouro-entry.js so MCP works in both dev and installed mode
61
+ // __dirname at runtime is dist/repertoire/coding/ — go up 2 levels to dist/
62
+ const distRoot = path.resolve(__dirname, "..", "..");
63
+ const ouroEntryPath = path.join(distRoot, "heart", "daemon", "ouro-entry.js");
56
64
  return {
57
65
  command: "codex",
58
- args: ["exec", "--skip-git-repo-check", "--cd", workdir],
66
+ args: [
67
+ "exec",
68
+ "--skip-git-repo-check",
69
+ "--cd",
70
+ workdir,
71
+ "--ephemeral",
72
+ "--json",
73
+ "-c",
74
+ `mcp_servers.ouro.command=node`,
75
+ "-c",
76
+ `mcp_servers.ouro.args=["${ouroEntryPath}","mcp-serve","--agent","${agent}"]`,
77
+ ],
78
+ };
79
+ }
80
+ function buildSpawnEnv(baseEnv, homeDir) {
81
+ const binDir = path.join(homeDir, ".ouro-cli", "bin");
82
+ const existingPath = baseEnv.PATH ?? "";
83
+ const pathEntries = existingPath.split(path.delimiter).filter((entry) => entry.length > 0);
84
+ if (!pathEntries.includes(binDir)) {
85
+ pathEntries.unshift(binDir);
86
+ }
87
+ return {
88
+ ...baseEnv,
89
+ PATH: pathEntries.join(path.delimiter),
59
90
  };
60
91
  }
61
- function buildPrompt(request, deps) {
92
+ function appendFileSection(sections, label, filePath, deps) {
93
+ if (!filePath || !deps.existsSync(filePath))
94
+ return;
95
+ const content = deps.readFileSync(filePath, "utf-8").trim();
96
+ if (content.length === 0)
97
+ return;
98
+ sections.push(`${label} (${filePath}):\n${content}`);
99
+ }
100
+ function buildCodingPrompt(request, deps) {
62
101
  const sections = [];
102
+ sections.push([
103
+ "Execution contract:",
104
+ "- You are a subordinate coding session launched by a parent Ouro agent.",
105
+ "- Execute the concrete request in the supplied workdir directly.",
106
+ "- Do not switch into planning/doing workflows, approval gates, or repo-management rituals unless the request explicitly asks for them.",
107
+ "- Treat the request, scope file, and state file as the authoritative briefing for this session.",
108
+ "- Prefer direct execution and verification over narration.",
109
+ ].join("\n"));
63
110
  sections.push([
64
111
  "Coding session metadata:",
65
112
  `sessionId: ${request.sessionId ?? "pending"}`,
66
113
  `parentAgent: ${request.parentAgent ?? "unknown"}`,
67
114
  `taskRef: ${request.taskRef ?? "unassigned"}`,
68
115
  ].join("\n"));
69
- if (request.stateFile && deps.existsSync(request.stateFile)) {
70
- const stateContent = deps.readFileSync(request.stateFile, "utf-8").trim();
71
- if (stateContent.length > 0) {
72
- sections.push(`State file (${request.stateFile}):\n${stateContent}`);
73
- }
74
- }
116
+ appendFileSection(sections, "Scope file", request.scopeFile, deps);
117
+ appendFileSection(sections, "State file", request.stateFile, deps);
75
118
  sections.push(request.prompt);
76
119
  return sections.join("\n\n---\n\n");
77
120
  }
@@ -79,8 +122,11 @@ function spawnCodingProcess(request, deps = {}) {
79
122
  const spawnFn = deps.spawnFn ?? ((command, args, options) => (0, child_process_1.spawn)(command, args, options));
80
123
  const existsSync = deps.existsSync ?? fs.existsSync;
81
124
  const readFileSync = deps.readFileSync ?? fs.readFileSync;
82
- const prompt = buildPrompt(request, { existsSync, readFileSync });
83
- const { command, args } = buildCommandArgs(request.runner, request.workdir);
125
+ const homeDir = deps.homeDir ?? os.homedir();
126
+ const baseEnv = deps.baseEnv ?? process.env;
127
+ const prompt = buildCodingPrompt(request, { existsSync, readFileSync });
128
+ const { command, args } = buildCommandArgs(request.runner, request.workdir, request.parentAgent);
129
+ const env = buildSpawnEnv(baseEnv, homeDir);
84
130
  (0, runtime_1.emitNervesEvent)({
85
131
  component: "repertoire",
86
132
  event: "repertoire.coding_spawn_start",
@@ -89,9 +135,10 @@ function spawnCodingProcess(request, deps = {}) {
89
135
  });
90
136
  const proc = spawnFn(command, args, {
91
137
  cwd: request.workdir,
138
+ env,
92
139
  stdio: ["pipe", "pipe", "pipe"],
93
140
  });
94
- proc.stdin.write(`${prompt}\n`);
141
+ proc.stdin.end(`${prompt}\n`);
95
142
  (0, runtime_1.emitNervesEvent)({
96
143
  component: "repertoire",
97
144
  event: "repertoire.coding_spawn_end",