@ouro.bot/cli 0.1.0-alpha.61 → 0.1.0-alpha.612

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 (418) hide show
  1. package/README.md +127 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +3912 -0
  13. package/dist/arc/attention-types.js +8 -0
  14. package/dist/arc/cares.js +144 -0
  15. package/dist/arc/episodes.js +118 -0
  16. package/dist/arc/intentions.js +134 -0
  17. package/dist/arc/json-store.js +117 -0
  18. package/dist/arc/obligations.js +266 -0
  19. package/dist/arc/packets.js +194 -0
  20. package/dist/arc/presence.js +185 -0
  21. package/dist/arc/task-lifecycle.js +65 -0
  22. package/dist/heart/active-work.js +837 -26
  23. package/dist/heart/agent-entry.js +69 -3
  24. package/dist/heart/attachments/image-normalize.js +194 -0
  25. package/dist/heart/attachments/materialize.js +97 -0
  26. package/dist/heart/attachments/originals.js +88 -0
  27. package/dist/heart/attachments/render.js +29 -0
  28. package/dist/heart/attachments/sources/adapter.js +2 -0
  29. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  30. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  31. package/dist/heart/attachments/sources/index.js +16 -0
  32. package/dist/heart/attachments/store.js +103 -0
  33. package/dist/heart/attachments/types.js +93 -0
  34. package/dist/heart/auth/auth-flow.js +479 -0
  35. package/dist/heart/awaiting/await-alert.js +146 -0
  36. package/dist/heart/awaiting/await-expiry.js +108 -0
  37. package/dist/heart/awaiting/await-loader.js +91 -0
  38. package/dist/heart/awaiting/await-parser.js +141 -0
  39. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  40. package/dist/heart/awaiting/await-scheduler.js +377 -0
  41. package/dist/heart/background-operations.js +281 -0
  42. package/dist/heart/bridges/store.js +14 -2
  43. package/dist/heart/bundle-state.js +168 -0
  44. package/dist/heart/commitments.js +142 -0
  45. package/dist/heart/config-registry.js +322 -0
  46. package/dist/heart/config.js +114 -119
  47. package/dist/heart/core.js +909 -246
  48. package/dist/heart/cross-chat-delivery.js +3 -18
  49. package/dist/heart/daemon/agent-config-check.js +419 -0
  50. package/dist/heart/daemon/agent-discovery.js +102 -3
  51. package/dist/heart/daemon/agent-service.js +522 -0
  52. package/dist/heart/daemon/agentic-repair.js +547 -0
  53. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  54. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  55. package/dist/heart/daemon/cadence.js +70 -0
  56. package/dist/heart/daemon/cli-defaults.js +776 -0
  57. package/dist/heart/daemon/cli-exec.js +7579 -0
  58. package/dist/heart/daemon/cli-help.js +498 -0
  59. package/dist/heart/daemon/cli-parse.js +1599 -0
  60. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  61. package/dist/heart/daemon/cli-render.js +763 -0
  62. package/dist/heart/daemon/cli-types.js +8 -0
  63. package/dist/heart/daemon/connect-bay.js +323 -0
  64. package/dist/heart/daemon/daemon-cli.js +29 -1700
  65. package/dist/heart/daemon/daemon-entry.js +485 -2
  66. package/dist/heart/daemon/daemon-health.js +176 -0
  67. package/dist/heart/daemon/daemon-rollup.js +57 -0
  68. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  69. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  70. package/dist/heart/daemon/daemon.js +904 -70
  71. package/dist/heart/daemon/dns-workflow.js +394 -0
  72. package/dist/heart/daemon/doctor-types.js +8 -0
  73. package/dist/heart/daemon/doctor.js +873 -0
  74. package/dist/heart/daemon/health-monitor.js +122 -1
  75. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  76. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  77. package/dist/heart/daemon/http-health-probe.js +80 -0
  78. package/dist/heart/daemon/human-command-screens.js +234 -0
  79. package/dist/heart/daemon/human-readiness.js +114 -0
  80. package/dist/heart/daemon/inner-status.js +89 -0
  81. package/dist/heart/daemon/interactive-repair.js +394 -0
  82. package/dist/heart/daemon/launchd.js +37 -8
  83. package/dist/heart/daemon/log-tailer.js +78 -9
  84. package/dist/heart/daemon/logs-prune.js +110 -0
  85. package/dist/heart/daemon/mcp-canary.js +297 -0
  86. package/dist/heart/daemon/os-cron-deps.js +135 -0
  87. package/dist/heart/daemon/os-cron.js +14 -12
  88. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  89. package/dist/heart/daemon/ouro-entry.js +3 -1
  90. package/dist/heart/daemon/process-manager.js +463 -34
  91. package/dist/heart/daemon/provider-discovery.js +137 -0
  92. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  93. package/dist/heart/daemon/pulse.js +475 -0
  94. package/dist/heart/daemon/readiness-repair.js +365 -0
  95. package/dist/heart/daemon/run-hooks.js +2 -0
  96. package/dist/heart/daemon/runtime-logging.js +10 -2
  97. package/dist/heart/daemon/runtime-metadata.js +2 -30
  98. package/dist/heart/daemon/safe-mode.js +161 -0
  99. package/dist/heart/daemon/sense-manager.js +493 -38
  100. package/dist/heart/daemon/session-id-resolver.js +131 -0
  101. package/dist/heart/daemon/skill-management-installer.js +28 -7
  102. package/dist/heart/daemon/socket-client.js +158 -11
  103. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  104. package/dist/heart/daemon/startup-tui.js +330 -0
  105. package/dist/heart/daemon/task-scheduler.js +3 -25
  106. package/dist/heart/daemon/terminal-ui.js +499 -0
  107. package/dist/heart/daemon/thoughts.js +229 -17
  108. package/dist/heart/daemon/up-progress.js +366 -0
  109. package/dist/heart/daemon/vault-items.js +56 -0
  110. package/dist/heart/delegation.js +1 -1
  111. package/dist/heart/habits/habit-migration.js +189 -0
  112. package/dist/heart/habits/habit-parser.js +140 -0
  113. package/dist/heart/habits/habit-runtime-state.js +100 -0
  114. package/dist/heart/habits/habit-scheduler.js +372 -0
  115. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  116. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  117. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  118. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  119. package/dist/heart/identity.js +166 -55
  120. package/dist/heart/kept-notes.js +357 -0
  121. package/dist/heart/kicks.js +1 -1
  122. package/dist/heart/machine-identity.js +161 -0
  123. package/dist/heart/mail-import-discovery.js +353 -0
  124. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  125. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  126. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  127. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  128. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  129. package/dist/heart/mailbox/mailbox-http.js +99 -0
  130. package/dist/heart/mailbox/mailbox-read.js +31 -0
  131. package/dist/heart/mailbox/mailbox-types.js +27 -0
  132. package/dist/heart/mailbox/mailbox-view.js +197 -0
  133. package/dist/heart/mailbox/readers/agent-machine.js +425 -0
  134. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  135. package/dist/heart/mailbox/readers/mail.js +375 -0
  136. package/dist/heart/mailbox/readers/runtime-readers.js +756 -0
  137. package/dist/heart/mailbox/readers/sessions.js +232 -0
  138. package/dist/heart/mailbox/readers/shared.js +111 -0
  139. package/dist/heart/mcp/mcp-server.js +656 -0
  140. package/dist/heart/migrate-config.js +100 -0
  141. package/dist/heart/model-capabilities.js +19 -0
  142. package/dist/heart/platform.js +81 -0
  143. package/dist/heart/provider-attempt.js +134 -0
  144. package/dist/heart/provider-binding-resolver.js +267 -0
  145. package/dist/heart/provider-credentials.js +425 -0
  146. package/dist/heart/provider-failover.js +301 -0
  147. package/dist/heart/provider-models.js +81 -0
  148. package/dist/heart/provider-ping.js +262 -0
  149. package/dist/heart/provider-readiness-cache.js +40 -0
  150. package/dist/heart/provider-visibility.js +188 -0
  151. package/dist/heart/providers/anthropic-token.js +131 -0
  152. package/dist/heart/providers/anthropic.js +139 -52
  153. package/dist/heart/providers/azure.js +23 -11
  154. package/dist/heart/providers/error-classification.js +127 -0
  155. package/dist/heart/providers/github-copilot.js +145 -0
  156. package/dist/heart/providers/minimax-vlm.js +189 -0
  157. package/dist/heart/providers/minimax.js +26 -8
  158. package/dist/heart/providers/openai-codex.js +55 -40
  159. package/dist/heart/runtime-capability-check.js +170 -0
  160. package/dist/heart/runtime-credentials.js +367 -0
  161. package/dist/heart/runtime-cwd.js +87 -0
  162. package/dist/heart/sense-truth.js +13 -4
  163. package/dist/heart/session-activity.js +48 -24
  164. package/dist/heart/session-events.js +1156 -0
  165. package/dist/heart/session-playback-cli-main.js +5 -0
  166. package/dist/heart/session-playback-cli.js +36 -0
  167. package/dist/heart/session-playback.js +231 -0
  168. package/dist/heart/session-stats-cli-main.js +5 -0
  169. package/dist/heart/session-stats.js +182 -0
  170. package/dist/heart/session-transcript.js +133 -0
  171. package/dist/heart/start-of-turn-packet.js +345 -0
  172. package/dist/heart/streaming.js +44 -27
  173. package/dist/heart/sync-classification.js +176 -0
  174. package/dist/heart/sync.js +449 -0
  175. package/dist/heart/target-resolution.js +9 -5
  176. package/dist/heart/tempo.js +93 -0
  177. package/dist/heart/temporal-view.js +41 -0
  178. package/dist/heart/timeouts.js +101 -0
  179. package/dist/heart/tool-activity-callbacks.js +59 -0
  180. package/dist/heart/tool-description.js +143 -0
  181. package/dist/heart/tool-friction.js +55 -0
  182. package/dist/heart/tool-loop.js +200 -0
  183. package/dist/heart/turn-context.js +421 -0
  184. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  185. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  186. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  187. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  188. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  189. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  190. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  191. package/dist/mailbox-ui/assets/index-9-AxCxuB.js +61 -0
  192. package/dist/mailbox-ui/assets/index-CWzt267f.css +1 -0
  193. package/dist/mailbox-ui/index.html +15 -0
  194. package/dist/mailroom/attention.js +167 -0
  195. package/dist/mailroom/autonomy.js +209 -0
  196. package/dist/mailroom/blob-store.js +712 -0
  197. package/dist/mailroom/body-cache.js +61 -0
  198. package/dist/mailroom/core.js +788 -0
  199. package/dist/mailroom/entry.js +160 -0
  200. package/dist/mailroom/file-store.js +460 -0
  201. package/dist/mailroom/mbox-import.js +393 -0
  202. package/dist/mailroom/migration.js +164 -0
  203. package/dist/mailroom/outbound.js +380 -0
  204. package/dist/mailroom/policy.js +263 -0
  205. package/dist/mailroom/reader.js +233 -0
  206. package/dist/mailroom/search-cache.js +268 -0
  207. package/dist/mailroom/search-relevance.js +319 -0
  208. package/dist/mailroom/smtp-ingress.js +176 -0
  209. package/dist/mailroom/source-state.js +176 -0
  210. package/dist/mailroom/thread.js +109 -0
  211. package/dist/mailroom/travel-extract.js +89 -0
  212. package/dist/mind/bundle-manifest.js +7 -1
  213. package/dist/mind/context.js +250 -101
  214. package/dist/mind/diary-integrity.js +60 -0
  215. package/dist/mind/{memory.js → diary.js} +68 -76
  216. package/dist/mind/embedding-provider.js +60 -0
  217. package/dist/mind/file-state.js +179 -0
  218. package/dist/mind/friends/channel.js +39 -0
  219. package/dist/mind/friends/resolver.js +54 -2
  220. package/dist/mind/friends/store-file.js +48 -4
  221. package/dist/mind/friends/types.js +2 -2
  222. package/dist/mind/journal-index.js +162 -0
  223. package/dist/mind/note-search.js +268 -0
  224. package/dist/mind/obligation-steering.js +221 -0
  225. package/dist/mind/pending.js +6 -1
  226. package/dist/mind/prompt-refresh.js +3 -2
  227. package/dist/mind/prompt.js +1051 -135
  228. package/dist/mind/provenance-trust.js +26 -0
  229. package/dist/mind/scrutiny.js +173 -0
  230. package/dist/nerves/cli-logging.js +7 -1
  231. package/dist/nerves/coverage/audit-rules.js +15 -6
  232. package/dist/nerves/coverage/audit.js +28 -2
  233. package/dist/nerves/coverage/cli.js +1 -1
  234. package/dist/nerves/coverage/contract.js +5 -5
  235. package/dist/nerves/coverage/file-completeness.js +129 -5
  236. package/dist/nerves/event-buffer.js +111 -0
  237. package/dist/nerves/index.js +224 -4
  238. package/dist/nerves/observation.js +20 -0
  239. package/dist/nerves/redact.js +79 -0
  240. package/dist/nerves/review/cli-main.js +5 -0
  241. package/dist/nerves/review/cli.js +156 -0
  242. package/dist/nerves/review/core.js +152 -0
  243. package/dist/nerves/runtime.js +5 -1
  244. package/dist/repertoire/ado-client.js +15 -56
  245. package/dist/repertoire/ado-semantic.js +11 -10
  246. package/dist/repertoire/api-client.js +97 -0
  247. package/dist/repertoire/bitwarden-store.js +997 -0
  248. package/dist/repertoire/bundle-templates.js +72 -0
  249. package/dist/repertoire/bw-installer.js +180 -0
  250. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  251. package/dist/repertoire/coding/context-pack.js +331 -0
  252. package/dist/repertoire/coding/feedback.js +197 -30
  253. package/dist/repertoire/coding/manager.js +163 -10
  254. package/dist/repertoire/coding/spawner.js +55 -9
  255. package/dist/repertoire/coding/tools.js +170 -7
  256. package/dist/repertoire/commerce-errors.js +109 -0
  257. package/dist/repertoire/commerce-self-test.js +156 -0
  258. package/dist/repertoire/credential-access.js +178 -0
  259. package/dist/repertoire/duffel-client.js +185 -0
  260. package/dist/repertoire/github-client.js +14 -55
  261. package/dist/repertoire/graph-client.js +11 -52
  262. package/dist/repertoire/guardrails.js +396 -0
  263. package/dist/repertoire/mcp-client.js +295 -0
  264. package/dist/repertoire/mcp-manager.js +362 -0
  265. package/dist/repertoire/mcp-tools.js +63 -0
  266. package/dist/repertoire/shell-sessions.js +133 -0
  267. package/dist/repertoire/skills.js +18 -4
  268. package/dist/repertoire/stripe-client.js +131 -0
  269. package/dist/repertoire/tasks/board.js +31 -5
  270. package/dist/repertoire/tasks/fix.js +182 -0
  271. package/dist/repertoire/tasks/index.js +16 -4
  272. package/dist/repertoire/tasks/lifecycle.js +2 -2
  273. package/dist/repertoire/tasks/parser.js +3 -2
  274. package/dist/repertoire/tasks/scanner.js +194 -37
  275. package/dist/repertoire/tasks/transitions.js +16 -78
  276. package/dist/repertoire/tool-results.js +29 -0
  277. package/dist/repertoire/tools-attachments.js +317 -0
  278. package/dist/repertoire/tools-awaiting.js +365 -0
  279. package/dist/repertoire/tools-base.js +55 -1082
  280. package/dist/repertoire/tools-bluebubbles.js +1 -0
  281. package/dist/repertoire/tools-bridge.js +141 -0
  282. package/dist/repertoire/tools-bundle.js +984 -0
  283. package/dist/repertoire/tools-config.js +185 -0
  284. package/dist/repertoire/tools-continuity.js +248 -0
  285. package/dist/repertoire/tools-credential.js +381 -0
  286. package/dist/repertoire/tools-files.js +342 -0
  287. package/dist/repertoire/tools-flight.js +224 -0
  288. package/dist/repertoire/tools-flow.js +119 -0
  289. package/dist/repertoire/tools-github.js +1 -7
  290. package/dist/repertoire/tools-mail.js +1916 -0
  291. package/dist/repertoire/tools-notes.js +421 -0
  292. package/dist/repertoire/tools-obligations.js +142 -0
  293. package/dist/repertoire/tools-record.js +463 -0
  294. package/dist/repertoire/tools-runtime.js +148 -0
  295. package/dist/repertoire/tools-session.js +781 -0
  296. package/dist/repertoire/tools-shell.js +120 -0
  297. package/dist/repertoire/tools-stripe.js +180 -0
  298. package/dist/repertoire/tools-surface.js +345 -0
  299. package/dist/repertoire/tools-teams.js +9 -39
  300. package/dist/repertoire/tools-travel.js +125 -0
  301. package/dist/repertoire/tools-trip.js +604 -0
  302. package/dist/repertoire/tools-user-profile.js +144 -0
  303. package/dist/repertoire/tools-vault.js +40 -0
  304. package/dist/repertoire/tools-voice.js +144 -0
  305. package/dist/repertoire/tools.js +115 -103
  306. package/dist/repertoire/travel-api-client.js +360 -0
  307. package/dist/repertoire/user-profile.js +131 -0
  308. package/dist/repertoire/vault-setup.js +246 -0
  309. package/dist/repertoire/vault-unlock.js +594 -0
  310. package/dist/scripts/claude-code-hook.js +41 -0
  311. package/dist/scripts/claude-code-stop-hook.js +47 -0
  312. package/dist/senses/attention-queue.js +116 -0
  313. package/dist/senses/await-turn-message.js +58 -0
  314. package/dist/senses/bluebubbles/active-turns.js +216 -0
  315. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  316. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  317. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  318. package/dist/senses/bluebubbles/entry.js +77 -0
  319. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  320. package/dist/senses/bluebubbles/index.js +2613 -0
  321. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  322. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  323. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  324. package/dist/senses/bluebubbles/processed-log.js +133 -0
  325. package/dist/senses/bluebubbles/replay.js +137 -0
  326. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  327. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  328. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  329. package/dist/senses/cli/bracketed-paste.js +82 -0
  330. package/dist/senses/cli/image-paste.js +287 -0
  331. package/dist/senses/cli/image-ref-navigation.js +75 -0
  332. package/dist/senses/cli/ink-app.js +156 -0
  333. package/dist/senses/cli/inline-diff.js +64 -0
  334. package/dist/senses/cli/input-keys.js +174 -0
  335. package/dist/senses/cli/kill-ring.js +86 -0
  336. package/dist/senses/cli/message-list.js +51 -0
  337. package/dist/senses/cli/ouro-tui.js +607 -0
  338. package/dist/senses/cli/spinner-imperative.js +135 -0
  339. package/dist/senses/cli/spinner.js +101 -0
  340. package/dist/senses/cli/status-line.js +60 -0
  341. package/dist/senses/cli/streaming-markdown.js +526 -0
  342. package/dist/senses/cli/tool-display.js +85 -0
  343. package/dist/senses/cli/tool-render.js +85 -0
  344. package/dist/senses/cli/tui-store.js +240 -0
  345. package/dist/senses/cli/virtual-list.js +35 -0
  346. package/dist/senses/cli-entry.js +60 -8
  347. package/dist/senses/cli-layout.js +100 -0
  348. package/dist/senses/cli.js +516 -204
  349. package/dist/senses/commands.js +66 -3
  350. package/dist/senses/habit-turn-message.js +108 -0
  351. package/dist/senses/inner-dialog-worker.js +185 -21
  352. package/dist/senses/inner-dialog.js +469 -39
  353. package/dist/senses/mail-entry.js +66 -0
  354. package/dist/senses/mail.js +379 -0
  355. package/dist/senses/pipeline.js +654 -181
  356. package/dist/senses/proactive-content-guard.js +51 -0
  357. package/dist/senses/shared-turn.js +392 -0
  358. package/dist/senses/surface-tool.js +70 -0
  359. package/dist/senses/teams-entry.js +60 -8
  360. package/dist/senses/teams.js +387 -98
  361. package/dist/senses/trust-gate.js +100 -5
  362. package/dist/senses/voice/audio-playback.js +237 -0
  363. package/dist/senses/voice/audio-routing.js +119 -0
  364. package/dist/senses/voice/elevenlabs.js +202 -0
  365. package/dist/senses/voice/floor-control.js +431 -0
  366. package/dist/senses/voice/floor-controller.js +115 -0
  367. package/dist/senses/voice/golden-path.js +116 -0
  368. package/dist/senses/voice/index.js +29 -0
  369. package/dist/senses/voice/meeting.js +113 -0
  370. package/dist/senses/voice/outbound.js +190 -0
  371. package/dist/senses/voice/phone.js +33 -0
  372. package/dist/senses/voice/playback.js +139 -0
  373. package/dist/senses/voice/realtime-eval.js +496 -0
  374. package/dist/senses/voice/realtime-trace.js +531 -0
  375. package/dist/senses/voice/transcript.js +70 -0
  376. package/dist/senses/voice/turn.js +191 -0
  377. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  378. package/dist/senses/voice/twilio-phone.js +5079 -0
  379. package/dist/senses/voice/types.js +2 -0
  380. package/dist/senses/voice/whisper.js +161 -0
  381. package/dist/senses/voice-entry.js +81 -0
  382. package/dist/senses/voice-realtime-eval-command.js +99 -0
  383. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  384. package/dist/senses/voice-twilio-entry.js +87 -0
  385. package/dist/trips/core.js +138 -0
  386. package/dist/trips/store.js +265 -0
  387. package/package.json +41 -7
  388. package/skills/agent-commerce.md +106 -0
  389. package/skills/browser-navigation.md +117 -0
  390. package/skills/commerce-setup-guide.md +116 -0
  391. package/skills/commerce-setup.md +84 -0
  392. package/skills/configure-dev-tools.md +99 -0
  393. package/skills/travel-planning.md +138 -0
  394. package/dist/heart/daemon/auth-flow.js +0 -351
  395. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  396. package/dist/heart/safe-workspace.js +0 -228
  397. package/dist/heart/session-recall.js +0 -116
  398. package/dist/mind/associative-recall.js +0 -209
  399. package/dist/senses/bluebubbles-entry.js +0 -13
  400. package/dist/senses/bluebubbles.js +0 -1177
  401. package/dist/senses/debug-activity.js +0 -148
  402. package/subagents/README.md +0 -7
  403. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  404. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  405. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  406. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  407. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  408. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  409. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  410. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  411. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  412. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  413. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  414. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  415. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  416. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  417. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  418. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -2,8 +2,20 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.formatCodingTail = formatCodingTail;
4
4
  exports.attachCodingSessionFeedback = attachCodingSessionFeedback;
5
+ const identity_1 = require("../../heart/identity");
6
+ const socket_client_1 = require("../../heart/daemon/socket-client");
7
+ const obligations_1 = require("../../arc/obligations");
5
8
  const runtime_1 = require("../../nerves/runtime");
6
9
  const TERMINAL_UPDATE_KINDS = new Set(["completed", "failed", "killed"]);
10
+ const OBLIGATION_WAKE_UPDATE_KINDS = new Set([
11
+ "waiting_input",
12
+ "stalled",
13
+ "completed",
14
+ "failed",
15
+ "killed",
16
+ ]);
17
+ const PULL_REQUEST_NUMBER_PATTERN = /\bPR\s*#(\d+)\b/i;
18
+ const PULL_REQUEST_URL_PATTERN = /\/pull\/(\d+)(?:\b|\/)?/i;
7
19
  function clip(text, maxLength = 280) {
8
20
  const trimmed = text.trim();
9
21
  if (trimmed.length <= maxLength)
@@ -42,25 +54,114 @@ function lastMeaningfulLine(text) {
42
54
  return clip(lines.at(-1));
43
55
  }
44
56
  function formatSessionLabel(session) {
45
- return `${session.runner} ${session.id}`;
57
+ const origin = session.originSession
58
+ ? ` for ${session.originSession.channel}/${session.originSession.key}`
59
+ : "";
60
+ return `${session.runner} ${session.id}${origin}`;
61
+ }
62
+ function extractPullRequestLabel(snippet) {
63
+ if (!snippet)
64
+ return null;
65
+ const numberMatch = snippet.match(PULL_REQUEST_NUMBER_PATTERN);
66
+ if (numberMatch)
67
+ return `PR #${numberMatch[1]}`;
68
+ const urlMatch = snippet.match(PULL_REQUEST_URL_PATTERN);
69
+ if (urlMatch)
70
+ return `PR #${urlMatch[1]}`;
71
+ return null;
72
+ }
73
+ function isMergedPullRequestSnippet(snippet) {
74
+ return /\bmerged\b/i.test(snippet) || /\blanded\b/i.test(snippet);
75
+ }
76
+ function deriveObligationMilestone(update) {
77
+ const snippet = pickUpdateSnippet(update);
78
+ const pullRequest = extractPullRequestLabel(snippet);
79
+ if (update.kind === "completed" && snippet && pullRequest && isMergedPullRequestSnippet(snippet)) {
80
+ return {
81
+ status: "updating_runtime",
82
+ currentSurface: { kind: "runtime", label: "ouro up" },
83
+ currentArtifact: pullRequest,
84
+ nextAction: "update runtime, verify version/changelog, then re-observe",
85
+ };
86
+ }
87
+ if (update.kind === "completed" && pullRequest) {
88
+ return {
89
+ status: "waiting_for_merge",
90
+ currentSurface: { kind: "merge", label: pullRequest },
91
+ currentArtifact: pullRequest,
92
+ nextAction: `wait for checks, merge ${pullRequest}, then update runtime`,
93
+ };
94
+ }
95
+ if (update.kind === "waiting_input") {
96
+ return {
97
+ status: "investigating",
98
+ currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
99
+ nextAction: `answer ${update.session.runner} ${update.session.id} and continue`,
100
+ };
101
+ }
102
+ if (update.kind === "stalled") {
103
+ return {
104
+ status: "investigating",
105
+ currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
106
+ nextAction: `unstick ${update.session.runner} ${update.session.id} and continue`,
107
+ };
108
+ }
109
+ if (update.kind === "progress" || update.kind === "spawned" || update.kind === "failed" || update.kind === "killed" || update.kind === "completed") {
110
+ return {
111
+ status: "investigating",
112
+ currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
113
+ };
114
+ }
115
+ return null;
46
116
  }
47
117
  function isSafeProgressSnippet(snippet) {
118
+ const normalized = snippet.trim();
48
119
  const wordCount = snippet.split(/\s+/).filter(Boolean).length;
49
- return (snippet.length <= 80
120
+ return (normalized.length <= 80
121
+ && wordCount >= 2
50
122
  && wordCount <= 8
51
- && !snippet.includes(":")
52
- && !snippet.startsWith("**")
53
- && !/^Respond with\b/i.test(snippet)
54
- && !/^Coding session metadata\b/i.test(snippet)
55
- && !/^sessionId\b/i.test(snippet)
56
- && !/^taskRef\b/i.test(snippet)
57
- && !/^parentAgent\b/i.test(snippet));
123
+ && /[A-Za-z]{3,}/.test(normalized)
124
+ && !normalized.includes(":")
125
+ && !/[{}\[\]();]/.test(normalized)
126
+ && !normalized.startsWith("**")
127
+ && !/^Respond with\b/i.test(normalized)
128
+ && !/^Coding session metadata\b/i.test(normalized)
129
+ && !/^sessionId\b/i.test(normalized)
130
+ && !/^taskRef\b/i.test(normalized)
131
+ && !/^parentAgent\b/i.test(normalized));
58
132
  }
59
133
  function pickUpdateSnippet(update) {
60
- return (lastMeaningfulLine(update.text)
134
+ const checkpoint = update.session.checkpoint?.trim() || null;
135
+ return (checkpoint
136
+ ?? lastMeaningfulLine(update.text)
61
137
  ?? lastMeaningfulLine(update.session.stderrTail)
62
138
  ?? lastMeaningfulLine(update.session.stdoutTail));
63
139
  }
140
+ function renderValue(text) {
141
+ const trimmed = text?.trim();
142
+ return trimmed && trimmed.length > 0 ? trimmed : "(empty)";
143
+ }
144
+ function renderPath(text) {
145
+ return text && text.trim().length > 0 ? text : "(none)";
146
+ }
147
+ function formatCodingTail(session) {
148
+ const stdout = renderValue(session.stdoutTail);
149
+ const stderr = renderValue(session.stderrTail);
150
+ return [
151
+ `sessionId: ${session.id}`,
152
+ `runner: ${session.runner}`,
153
+ `status: ${session.status}`,
154
+ `checkpoint: ${renderValue(session.checkpoint ?? undefined)}`,
155
+ `artifactPath: ${renderPath(session.artifactPath)}`,
156
+ `workdir: ${session.workdir}`,
157
+ "",
158
+ "[stdout]",
159
+ stdout,
160
+ "",
161
+ "[stderr]",
162
+ stderr,
163
+ ].join("\n");
164
+ }
64
165
  function formatUpdateMessage(update) {
65
166
  const label = formatSessionLabel(update.session);
66
167
  const snippet = pickUpdateSnippet(update);
@@ -81,26 +182,88 @@ function formatUpdateMessage(update) {
81
182
  return `${label} started`;
82
183
  }
83
184
  }
84
- function formatCodingTail(session) {
85
- const stdout = session.stdoutTail.trim() || "(empty)";
86
- const stderr = session.stderrTail.trim() || "(empty)";
87
- return [
88
- `sessionId: ${session.id}`,
89
- `runner: ${session.runner}`,
90
- `status: ${session.status}`,
91
- `workdir: ${session.workdir}`,
92
- "",
93
- "[stdout]",
94
- stdout,
95
- "",
96
- "[stderr]",
97
- stderr,
98
- ].join("\n");
185
+ function formatReportBackMessage(update, baseMessage) {
186
+ if (!baseMessage)
187
+ return null;
188
+ if (!update.session.obligationId || !update.session.originSession) {
189
+ return baseMessage;
190
+ }
191
+ const milestone = deriveObligationMilestone(update);
192
+ const extraLines = [];
193
+ if (milestone?.currentArtifact) {
194
+ extraLines.push(`current artifact: ${milestone.currentArtifact}`);
195
+ }
196
+ if (milestone?.nextAction) {
197
+ extraLines.push(`next: ${milestone.nextAction}`);
198
+ }
199
+ return extraLines.length > 0 ? `${baseMessage}\n${extraLines.join("\n")}` : baseMessage;
200
+ }
201
+ function obligationNoteFromUpdate(update) {
202
+ const snippet = pickUpdateSnippet(update);
203
+ switch (update.kind) {
204
+ case "spawned":
205
+ return update.session.originSession
206
+ ? `coding session started for ${update.session.originSession.channel}/${update.session.originSession.key}`
207
+ : "coding session started";
208
+ case "progress":
209
+ return snippet ? `coding session progress: ${snippet}` : null;
210
+ case "waiting_input":
211
+ return snippet ? `coding session waiting: ${snippet}` : "coding session waiting for input";
212
+ case "stalled":
213
+ return snippet ? `coding session stalled: ${snippet}` : "coding session stalled";
214
+ case "completed":
215
+ return snippet
216
+ ? `coding session completed: ${snippet}; merge/update still pending`
217
+ : "coding session completed; merge/update still pending";
218
+ case "failed":
219
+ return snippet ? `coding session failed: ${snippet}` : "coding session failed";
220
+ case "killed":
221
+ return "coding session killed";
222
+ }
223
+ }
224
+ function syncObligationFromUpdate(update) {
225
+ const obligationId = update.session.obligationId;
226
+ if (!obligationId)
227
+ return;
228
+ const milestone = deriveObligationMilestone(update);
229
+ try {
230
+ (0, obligations_1.advanceObligation)((0, identity_1.getAgentRoot)(), obligationId, {
231
+ status: milestone?.status ?? "investigating",
232
+ currentSurface: milestone?.currentSurface ?? { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
233
+ currentArtifact: milestone?.currentArtifact,
234
+ nextAction: milestone?.nextAction,
235
+ latestNote: obligationNoteFromUpdate(update) ?? undefined,
236
+ });
237
+ }
238
+ catch {
239
+ // Detached feedback should still reach the human even if obligation sync is unavailable.
240
+ }
241
+ }
242
+ async function wakeInnerDialogForObligation(update) {
243
+ if (!update.session.obligationId || !OBLIGATION_WAKE_UPDATE_KINDS.has(update.kind)) {
244
+ return;
245
+ }
246
+ try {
247
+ await (0, socket_client_1.requestInnerWake)((0, identity_1.getAgentName)());
248
+ }
249
+ catch (error) {
250
+ (0, runtime_1.emitNervesEvent)({
251
+ level: "warn",
252
+ component: "repertoire",
253
+ event: "repertoire.coding_feedback_wake_error",
254
+ message: "coding feedback wake request failed",
255
+ meta: {
256
+ sessionId: update.session.id,
257
+ kind: update.kind,
258
+ reason: error instanceof Error ? error.message : String(error),
259
+ },
260
+ });
261
+ }
99
262
  }
100
263
  function attachCodingSessionFeedback(manager, session, target) {
101
264
  let lastMessage = "";
102
265
  let closed = false;
103
- let unsubscribe = () => { };
266
+ let unsubscribe = null;
104
267
  const sendMessage = (message) => {
105
268
  if (closed || !message || message === lastMessage) {
106
269
  return;
@@ -119,16 +282,20 @@ function attachCodingSessionFeedback(manager, session, target) {
119
282
  });
120
283
  });
121
284
  };
122
- sendMessage(formatUpdateMessage({ kind: "spawned", session }));
285
+ const spawnedUpdate = { kind: "spawned", session };
286
+ syncObligationFromUpdate(spawnedUpdate);
287
+ sendMessage(formatReportBackMessage(spawnedUpdate, formatUpdateMessage(spawnedUpdate)));
123
288
  unsubscribe = manager.subscribe(session.id, async (update) => {
124
- sendMessage(formatUpdateMessage(update));
289
+ syncObligationFromUpdate(update);
290
+ sendMessage(formatReportBackMessage(update, formatUpdateMessage(update)));
291
+ await wakeInnerDialogForObligation(update);
125
292
  if (TERMINAL_UPDATE_KINDS.has(update.kind)) {
126
293
  closed = true;
127
- unsubscribe();
294
+ unsubscribe?.();
128
295
  }
129
296
  });
130
297
  return () => {
131
298
  closed = true;
132
- unsubscribe();
299
+ unsubscribe?.();
133
300
  };
134
301
  }
@@ -37,19 +37,15 @@ exports.CodingSessionManager = void 0;
37
37
  const fs = __importStar(require("fs"));
38
38
  const path = __importStar(require("path"));
39
39
  const identity_1 = require("../../heart/identity");
40
+ const session_events_1 = require("../../heart/session-events");
40
41
  const runtime_1 = require("../../nerves/runtime");
41
42
  const spawner_1 = require("./spawner");
42
- function safeAgentName() {
43
- try {
44
- return (0, identity_1.getAgentName)();
45
- }
46
- catch {
47
- return "default";
48
- }
49
- }
50
43
  function defaultStateFilePath(agentName) {
51
44
  return path.join((0, identity_1.getAgentRoot)(agentName), "state", "coding", "sessions.json");
52
45
  }
46
+ function defaultArtifactDirPath(agentName) {
47
+ return path.join((0, identity_1.getAgentRoot)(agentName), "state", "coding", "sessions");
48
+ }
53
49
  function isPidAlive(pid) {
54
50
  try {
55
51
  process.kill(pid, 0);
@@ -62,6 +58,9 @@ function isPidAlive(pid) {
62
58
  function cloneSession(session) {
63
59
  return {
64
60
  ...session,
61
+ originSession: session.originSession ? { ...session.originSession } : undefined,
62
+ checkpoint: session.checkpoint ?? null,
63
+ artifactPath: session.artifactPath,
65
64
  stdoutTail: session.stdoutTail,
66
65
  stderrTail: session.stderrTail,
67
66
  failure: session.failure
@@ -85,6 +84,46 @@ function appendTail(existing, nextChunk, maxLength = 2000) {
85
84
  const combined = `${existing}${nextChunk}`;
86
85
  return combined.length <= maxLength ? combined : combined.slice(combined.length - maxLength);
87
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
+ }
88
127
  function isSpawnCodingResult(value) {
89
128
  return typeof value === "object" && value !== null && "process" in value;
90
129
  }
@@ -122,6 +161,7 @@ class CodingSessionManager {
122
161
  maxRestarts;
123
162
  defaultStallThresholdMs;
124
163
  stateFilePath;
164
+ artifactDirPath;
125
165
  existsSync;
126
166
  readFileSync;
127
167
  writeFileSync;
@@ -139,8 +179,19 @@ class CodingSessionManager {
139
179
  this.writeFileSync = options.writeFileSync ?? fs.writeFileSync;
140
180
  this.mkdirSync = options.mkdirSync ?? fs.mkdirSync;
141
181
  this.pidAlive = options.pidAlive ?? isPidAlive;
142
- 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)();
143
192
  this.stateFilePath = options.stateFilePath ?? defaultStateFilePath(this.agentName);
193
+ this.artifactDirPath = options.artifactDirPath
194
+ ?? (options.stateFilePath ? path.dirname(options.stateFilePath) : defaultArtifactDirPath(this.agentName));
144
195
  this.loadPersistedState();
145
196
  }
146
197
  async spawnSession(request) {
@@ -157,8 +208,12 @@ class CodingSessionManager {
157
208
  runner: normalizedRequest.runner,
158
209
  workdir: normalizedRequest.workdir,
159
210
  taskRef: normalizedRequest.taskRef,
211
+ originSession: normalizedRequest.originSession ? { ...normalizedRequest.originSession } : undefined,
212
+ obligationId: normalizedRequest.obligationId,
160
213
  scopeFile: normalizedRequest.scopeFile,
161
214
  stateFile: normalizedRequest.stateFile,
215
+ checkpoint: null,
216
+ artifactPath: this.artifactPathFor(id),
162
217
  status: "spawning",
163
218
  stdoutTail: "",
164
219
  stderrTail: "",
@@ -245,6 +300,7 @@ class CodingSessionManager {
245
300
  record.process.kill("SIGTERM");
246
301
  record.process = null;
247
302
  record.session.status = "killed";
303
+ record.session.checkpoint = "terminated by parent agent";
248
304
  record.session.endedAt = this.nowIso();
249
305
  (0, runtime_1.emitNervesEvent)({
250
306
  component: "repertoire",
@@ -267,6 +323,7 @@ class CodingSessionManager {
267
323
  continue;
268
324
  stalled += 1;
269
325
  record.session.status = "stalled";
326
+ record.session.checkpoint = deriveCheckpoint(record.session);
270
327
  (0, runtime_1.emitNervesEvent)({
271
328
  level: "warn",
272
329
  component: "repertoire",
@@ -292,6 +349,7 @@ class CodingSessionManager {
292
349
  record.process = null;
293
350
  if (record.session.status === "running" || record.session.status === "spawning") {
294
351
  record.session.status = "killed";
352
+ record.session.checkpoint = "terminated during manager shutdown";
295
353
  record.session.endedAt = this.nowIso();
296
354
  }
297
355
  }
@@ -336,6 +394,13 @@ class CodingSessionManager {
336
394
  record.session.endedAt = this.nowIso();
337
395
  updateKind = "completed";
338
396
  }
397
+ const checkpoint = latestMeaningfulLine(text);
398
+ if (checkpoint) {
399
+ record.session.checkpoint = checkpoint;
400
+ }
401
+ else if (!record.session.checkpoint) {
402
+ record.session.checkpoint = deriveCheckpoint(record.session);
403
+ }
339
404
  (0, runtime_1.emitNervesEvent)({
340
405
  component: "repertoire",
341
406
  event: "repertoire.coding_session_output",
@@ -359,12 +424,14 @@ class CodingSessionManager {
359
424
  record.session.lastSignal = signal;
360
425
  if (record.session.status === "killed" || record.session.status === "completed") {
361
426
  record.session.endedAt = this.nowIso();
427
+ record.session.checkpoint = deriveCheckpoint(record.session);
362
428
  this.persistState();
363
429
  return;
364
430
  }
365
431
  if (code === 0) {
366
432
  record.session.status = "completed";
367
433
  record.session.endedAt = this.nowIso();
434
+ record.session.checkpoint = deriveCheckpoint(record.session);
368
435
  this.persistState();
369
436
  this.notifyListeners(record.session.id, { kind: "completed", session: cloneSession(record.session) });
370
437
  return;
@@ -376,6 +443,7 @@ class CodingSessionManager {
376
443
  record.session.status = "failed";
377
444
  record.session.endedAt = this.nowIso();
378
445
  record.session.failure = defaultFailureDiagnostics(code, signal, record.command, record.args, record.stdoutTail, record.stderrTail);
446
+ record.session.checkpoint = deriveCheckpoint(record.session);
379
447
  (0, runtime_1.emitNervesEvent)({
380
448
  level: "error",
381
449
  component: "repertoire",
@@ -401,6 +469,7 @@ class CodingSessionManager {
401
469
  record.session.lastActivityAt = this.nowIso();
402
470
  record.session.endedAt = null;
403
471
  record.session.failure = null;
472
+ record.session.checkpoint = `restarted after ${reason}`;
404
473
  this.attachProcessListeners(record);
405
474
  (0, runtime_1.emitNervesEvent)({
406
475
  level: "warn",
@@ -482,15 +551,21 @@ class CodingSessionManager {
482
551
  }
483
552
  const normalizedRequest = {
484
553
  ...request,
554
+ originSession: request.originSession ? { ...request.originSession } : undefined,
485
555
  sessionId: request.sessionId ?? session.id,
556
+ obligationId: request.obligationId,
486
557
  parentAgent: request.parentAgent ?? this.agentName,
487
558
  };
488
559
  const normalizedSession = {
489
560
  ...session,
490
561
  taskRef: session.taskRef ?? normalizedRequest.taskRef,
562
+ originSession: session.originSession ?? normalizedRequest.originSession,
563
+ obligationId: session.obligationId ?? normalizedRequest.obligationId,
491
564
  failure: session.failure ?? null,
492
565
  stdoutTail: session.stdoutTail ?? session.failure?.stdoutTail ?? "",
493
566
  stderrTail: session.stderrTail ?? session.failure?.stderrTail ?? "",
567
+ checkpoint: typeof session.checkpoint === "string" ? session.checkpoint : null,
568
+ artifactPath: typeof session.artifactPath === "string" ? session.artifactPath : this.artifactPathFor(session.id),
494
569
  };
495
570
  if (typeof normalizedSession.pid === "number") {
496
571
  const alive = this.pidAlive(normalizedSession.pid);
@@ -503,6 +578,7 @@ class CodingSessionManager {
503
578
  normalizedSession.pid = null;
504
579
  }
505
580
  }
581
+ normalizedSession.checkpoint = normalizedSession.checkpoint ?? deriveCheckpoint(normalizedSession);
506
582
  this.records.set(normalizedSession.id, {
507
583
  request: normalizedRequest,
508
584
  session: normalizedSession,
@@ -525,7 +601,10 @@ class CodingSessionManager {
525
601
  const payload = {
526
602
  sequence: this.sequence,
527
603
  records: [...this.records.values()].map((record) => ({
528
- request: record.request,
604
+ request: {
605
+ ...record.request,
606
+ prompt: (0, session_events_1.capStructuredRecordString)(record.request.prompt),
607
+ },
529
608
  session: record.session,
530
609
  })),
531
610
  };
@@ -542,6 +621,80 @@ class CodingSessionManager {
542
621
  meta: { path: this.stateFilePath, reason: error instanceof Error ? error.message : String(error) },
543
622
  });
544
623
  }
624
+ this.persistArtifacts();
625
+ }
626
+ artifactPathFor(sessionId) {
627
+ return path.join(this.artifactDirPath, `${sessionId}.md`);
628
+ }
629
+ renderArtifact(record) {
630
+ const { request, session } = record;
631
+ const stdout = session.stdoutTail.trim() || "(empty)";
632
+ const stderr = session.stderrTail.trim() || "(empty)";
633
+ const lines = [
634
+ "# Coding Session Artifact",
635
+ "",
636
+ "## Session",
637
+ `id: ${session.id}`,
638
+ `runner: ${session.runner}`,
639
+ `status: ${session.status}`,
640
+ `taskRef: ${session.taskRef ?? "unassigned"}`,
641
+ `workdir: ${session.workdir}`,
642
+ `startedAt: ${session.startedAt}`,
643
+ `lastActivityAt: ${session.lastActivityAt}`,
644
+ `endedAt: ${session.endedAt ?? "active"}`,
645
+ `pid: ${session.pid ?? "none"}`,
646
+ `restarts: ${session.restartCount}`,
647
+ `checkpoint: ${session.checkpoint ?? "none"}`,
648
+ `scopeFile: ${session.scopeFile ?? "none"}`,
649
+ `stateFile: ${session.stateFile ?? "none"}`,
650
+ "",
651
+ "## Request",
652
+ (0, session_events_1.capStructuredRecordString)(request.prompt),
653
+ "",
654
+ "## Stdout Tail",
655
+ stdout,
656
+ "",
657
+ "## Stderr Tail",
658
+ stderr,
659
+ ];
660
+ if (session.failure) {
661
+ lines.push("", "## Failure", `command: ${session.failure.command}`, `args: ${session.failure.args.join(" ") || "(none)"}`, `code: ${session.failure.code ?? "null"}`, `signal: ${session.failure.signal ?? "null"}`);
662
+ }
663
+ return `${lines.join("\n")}\n`;
664
+ }
665
+ persistArtifacts() {
666
+ try {
667
+ this.mkdirSync(this.artifactDirPath, { recursive: true });
668
+ }
669
+ catch (error) {
670
+ (0, runtime_1.emitNervesEvent)({
671
+ level: "warn",
672
+ component: "repertoire",
673
+ event: "repertoire.coding_artifact_persist_error",
674
+ message: "failed preparing coding artifact directory",
675
+ meta: { path: this.artifactDirPath, reason: error instanceof Error ? error.message : String(error) },
676
+ });
677
+ return;
678
+ }
679
+ for (const record of this.records.values()) {
680
+ try {
681
+ record.session.artifactPath = record.session.artifactPath ?? this.artifactPathFor(record.session.id);
682
+ this.writeFileSync(record.session.artifactPath, this.renderArtifact(record), "utf-8");
683
+ }
684
+ catch (error) {
685
+ (0, runtime_1.emitNervesEvent)({
686
+ level: "warn",
687
+ component: "repertoire",
688
+ event: "repertoire.coding_artifact_persist_error",
689
+ message: "failed writing coding session artifact",
690
+ meta: {
691
+ id: record.session.id,
692
+ path: record.session.artifactPath ?? this.artifactPathFor(record.session.id),
693
+ reason: error instanceof Error ? error.message : String(error),
694
+ },
695
+ });
696
+ }
697
+ }
545
698
  }
546
699
  }
547
700
  exports.CodingSessionManager = CodingSessionManager;