@ouro.bot/cli 0.1.0-alpha.62 → 0.1.0-alpha.637

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 (432) 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 +4087 -13
  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/evolution.js +487 -0
  17. package/dist/arc/intentions.js +134 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +270 -0
  20. package/dist/arc/packets.js +288 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +57 -0
  23. package/dist/heart/active-work.js +860 -43
  24. package/dist/heart/agent-entry.js +69 -3
  25. package/dist/heart/attachments/image-normalize.js +194 -0
  26. package/dist/heart/attachments/materialize.js +97 -0
  27. package/dist/heart/attachments/originals.js +88 -0
  28. package/dist/heart/attachments/render.js +29 -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/manager.js +137 -17
  43. package/dist/heart/bridges/store.js +14 -2
  44. package/dist/heart/bundle-state.js +168 -0
  45. package/dist/heart/commitments.js +135 -0
  46. package/dist/heart/config-registry.js +322 -0
  47. package/dist/heart/config.js +114 -119
  48. package/dist/heart/core.js +1028 -248
  49. package/dist/heart/cross-chat-delivery.js +3 -18
  50. package/dist/heart/daemon/agent-config-check.js +419 -0
  51. package/dist/heart/daemon/agent-discovery.js +102 -3
  52. package/dist/heart/daemon/agent-service.js +522 -0
  53. package/dist/heart/daemon/agentic-repair.js +547 -0
  54. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  55. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  56. package/dist/heart/daemon/cadence.js +70 -0
  57. package/dist/heart/daemon/cli-defaults.js +776 -0
  58. package/dist/heart/daemon/cli-desk.js +322 -0
  59. package/dist/heart/daemon/cli-exec.js +7468 -0
  60. package/dist/heart/daemon/cli-help.js +505 -0
  61. package/dist/heart/daemon/cli-parse.js +1554 -0
  62. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  63. package/dist/heart/daemon/cli-render.js +763 -0
  64. package/dist/heart/daemon/cli-types.js +8 -0
  65. package/dist/heart/daemon/connect-bay.js +323 -0
  66. package/dist/heart/daemon/daemon-cli.js +29 -1700
  67. package/dist/heart/daemon/daemon-entry.js +485 -2
  68. package/dist/heart/daemon/daemon-health.js +176 -0
  69. package/dist/heart/daemon/daemon-rollup.js +57 -0
  70. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  71. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  72. package/dist/heart/daemon/daemon.js +906 -71
  73. package/dist/heart/daemon/dns-workflow.js +394 -0
  74. package/dist/heart/daemon/doctor-types.js +8 -0
  75. package/dist/heart/daemon/doctor.js +873 -0
  76. package/dist/heart/daemon/health-monitor.js +122 -1
  77. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  78. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  79. package/dist/heart/daemon/http-health-probe.js +80 -0
  80. package/dist/heart/daemon/human-command-screens.js +234 -0
  81. package/dist/heart/daemon/human-readiness.js +114 -0
  82. package/dist/heart/daemon/inner-status.js +89 -0
  83. package/dist/heart/daemon/interactive-repair.js +394 -0
  84. package/dist/heart/daemon/launchd.js +37 -8
  85. package/dist/heart/daemon/log-tailer.js +79 -10
  86. package/dist/heart/daemon/logs-prune.js +110 -0
  87. package/dist/heart/daemon/mcp-canary.js +297 -0
  88. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  89. package/dist/heart/daemon/os-cron-deps.js +135 -0
  90. package/dist/heart/daemon/os-cron.js +14 -12
  91. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  92. package/dist/heart/daemon/ouro-entry.js +3 -1
  93. package/dist/heart/daemon/plugin-cli.js +432 -0
  94. package/dist/heart/daemon/process-manager.js +501 -35
  95. package/dist/heart/daemon/provider-discovery.js +137 -0
  96. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  97. package/dist/heart/daemon/pulse.js +475 -0
  98. package/dist/heart/daemon/readiness-repair.js +365 -0
  99. package/dist/heart/daemon/run-hooks.js +2 -0
  100. package/dist/heart/daemon/runtime-logging.js +11 -3
  101. package/dist/heart/daemon/runtime-metadata.js +2 -30
  102. package/dist/heart/daemon/safe-mode.js +161 -0
  103. package/dist/heart/daemon/sense-manager.js +493 -38
  104. package/dist/heart/daemon/session-id-resolver.js +131 -0
  105. package/dist/heart/daemon/skill-management-installer.js +22 -9
  106. package/dist/heart/daemon/socket-client.js +158 -11
  107. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  108. package/dist/heart/daemon/startup-tui.js +330 -0
  109. package/dist/heart/daemon/task-scheduler.js +117 -39
  110. package/dist/heart/daemon/terminal-ui.js +499 -0
  111. package/dist/heart/daemon/thoughts.js +229 -17
  112. package/dist/heart/daemon/up-progress.js +366 -0
  113. package/dist/heart/daemon/vault-items.js +56 -0
  114. package/dist/heart/delegation.js +1 -4
  115. package/dist/heart/habits/habit-migration.js +189 -0
  116. package/dist/heart/habits/habit-parser.js +140 -0
  117. package/dist/heart/habits/habit-runtime-state.js +100 -0
  118. package/dist/heart/habits/habit-scheduler.js +372 -0
  119. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  120. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  121. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  122. package/dist/heart/{daemon → hatch}/specialist-tools.js +37 -14
  123. package/dist/heart/identity.js +168 -57
  124. package/dist/heart/kept-notes.js +357 -0
  125. package/dist/heart/kicks.js +1 -1
  126. package/dist/heart/machine-identity.js +161 -0
  127. package/dist/heart/mail-import-discovery.js +353 -0
  128. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  129. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  130. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  131. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  132. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  133. package/dist/heart/mailbox/mailbox-http.js +99 -0
  134. package/dist/heart/mailbox/mailbox-read.js +31 -0
  135. package/dist/heart/mailbox/mailbox-types.js +27 -0
  136. package/dist/heart/mailbox/mailbox-view.js +197 -0
  137. package/dist/heart/mailbox/readers/agent-machine.js +418 -0
  138. package/dist/heart/mailbox/readers/continuity-readers.js +319 -0
  139. package/dist/heart/mailbox/readers/mail.js +375 -0
  140. package/dist/heart/mailbox/readers/runtime-readers.js +756 -0
  141. package/dist/heart/mailbox/readers/sessions.js +232 -0
  142. package/dist/heart/mailbox/readers/shared.js +111 -0
  143. package/dist/heart/mcp/mcp-server.js +692 -0
  144. package/dist/heart/migrate-config.js +100 -0
  145. package/dist/heart/model-capabilities.js +19 -0
  146. package/dist/heart/orientation-frame.js +217 -0
  147. package/dist/heart/platform.js +81 -0
  148. package/dist/heart/provider-attempt.js +134 -0
  149. package/dist/heart/provider-binding-resolver.js +272 -0
  150. package/dist/heart/provider-credentials.js +425 -0
  151. package/dist/heart/provider-failover.js +301 -0
  152. package/dist/heart/provider-models.js +81 -0
  153. package/dist/heart/provider-ping.js +262 -0
  154. package/dist/heart/provider-readiness-cache.js +40 -0
  155. package/dist/heart/provider-visibility.js +188 -0
  156. package/dist/heart/providers/anthropic-token.js +131 -0
  157. package/dist/heart/providers/anthropic.js +139 -52
  158. package/dist/heart/providers/azure.js +23 -11
  159. package/dist/heart/providers/error-classification.js +127 -0
  160. package/dist/heart/providers/github-copilot.js +145 -0
  161. package/dist/heart/providers/minimax-vlm.js +189 -0
  162. package/dist/heart/providers/minimax.js +26 -8
  163. package/dist/heart/providers/openai-codex.js +55 -40
  164. package/dist/heart/runtime-capability-check.js +170 -0
  165. package/dist/heart/runtime-credentials.js +367 -0
  166. package/dist/heart/runtime-cwd.js +87 -0
  167. package/dist/heart/sense-truth.js +13 -4
  168. package/dist/heart/session-activity.js +48 -24
  169. package/dist/heart/session-events.js +1163 -0
  170. package/dist/heart/session-playback-cli-main.js +5 -0
  171. package/dist/heart/session-playback-cli.js +36 -0
  172. package/dist/heart/session-playback.js +231 -0
  173. package/dist/heart/session-stats-cli-main.js +5 -0
  174. package/dist/heart/session-stats.js +182 -0
  175. package/dist/heart/session-transcript.js +133 -0
  176. package/dist/heart/start-of-turn-packet.js +345 -0
  177. package/dist/heart/streaming.js +44 -27
  178. package/dist/heart/structured-output.js +196 -0
  179. package/dist/heart/sync-classification.js +176 -0
  180. package/dist/heart/sync.js +449 -0
  181. package/dist/heart/target-resolution.js +9 -5
  182. package/dist/heart/tempo.js +93 -0
  183. package/dist/heart/temporal-view.js +41 -0
  184. package/dist/heart/timeouts.js +101 -0
  185. package/dist/heart/tool-activity-callbacks.js +59 -0
  186. package/dist/heart/tool-description.js +143 -0
  187. package/dist/heart/tool-friction.js +55 -0
  188. package/dist/heart/tool-loop.js +200 -0
  189. package/dist/heart/turn-context.js +389 -0
  190. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  191. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  192. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  193. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  194. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  195. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  196. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  197. package/dist/mailbox-ui/assets/index-9-AxCxuB.js +61 -0
  198. package/dist/mailbox-ui/assets/index-CWzt267f.css +1 -0
  199. package/dist/mailbox-ui/index.html +15 -0
  200. package/dist/mailroom/attention.js +167 -0
  201. package/dist/mailroom/autonomy.js +209 -0
  202. package/dist/mailroom/blob-store.js +715 -0
  203. package/dist/mailroom/body-cache.js +61 -0
  204. package/dist/mailroom/core.js +788 -0
  205. package/dist/mailroom/entry.js +160 -0
  206. package/dist/mailroom/file-store.js +568 -0
  207. package/dist/mailroom/mbox-import.js +393 -0
  208. package/dist/mailroom/migration.js +164 -0
  209. package/dist/mailroom/outbound.js +380 -0
  210. package/dist/mailroom/policy.js +263 -0
  211. package/dist/mailroom/reader.js +233 -0
  212. package/dist/mailroom/search-cache.js +334 -0
  213. package/dist/mailroom/search-relevance.js +319 -0
  214. package/dist/mailroom/smtp-ingress.js +176 -0
  215. package/dist/mailroom/source-state.js +176 -0
  216. package/dist/mailroom/thread.js +109 -0
  217. package/dist/mailroom/travel-extract.js +89 -0
  218. package/dist/mind/bundle-manifest.js +14 -1
  219. package/dist/mind/context.js +251 -101
  220. package/dist/mind/desk-section.js +310 -0
  221. package/dist/mind/diary-integrity.js +60 -0
  222. package/dist/mind/{memory.js → diary.js} +68 -76
  223. package/dist/mind/embedding-provider.js +60 -0
  224. package/dist/mind/file-state.js +179 -0
  225. package/dist/mind/friends/channel.js +39 -0
  226. package/dist/mind/friends/resolver.js +54 -2
  227. package/dist/mind/friends/store-file.js +48 -4
  228. package/dist/mind/friends/types.js +2 -2
  229. package/dist/mind/journal-index.js +162 -0
  230. package/dist/mind/note-search.js +268 -0
  231. package/dist/mind/obligation-steering.js +221 -0
  232. package/dist/mind/pending.js +6 -1
  233. package/dist/mind/prompt-refresh.js +3 -2
  234. package/dist/mind/prompt.js +1075 -146
  235. package/dist/mind/provenance-trust.js +26 -0
  236. package/dist/mind/scrutiny.js +173 -0
  237. package/dist/nerves/cli-logging.js +7 -1
  238. package/dist/nerves/coverage/audit-rules.js +15 -6
  239. package/dist/nerves/coverage/audit.js +28 -2
  240. package/dist/nerves/coverage/cli.js +1 -1
  241. package/dist/nerves/coverage/contract.js +5 -5
  242. package/dist/nerves/coverage/file-completeness.js +139 -5
  243. package/dist/nerves/event-buffer.js +111 -0
  244. package/dist/nerves/index.js +224 -4
  245. package/dist/nerves/observation.js +20 -0
  246. package/dist/nerves/redact.js +79 -0
  247. package/dist/nerves/review/cli-main.js +5 -0
  248. package/dist/nerves/review/cli.js +156 -0
  249. package/dist/nerves/review/core.js +152 -0
  250. package/dist/nerves/runtime.js +5 -1
  251. package/dist/repertoire/ado-client.js +15 -56
  252. package/dist/repertoire/ado-semantic.js +16 -10
  253. package/dist/repertoire/api-client.js +97 -0
  254. package/dist/repertoire/bitwarden-store.js +1040 -0
  255. package/dist/repertoire/bundle-templates.js +72 -0
  256. package/dist/repertoire/bw-installer.js +180 -0
  257. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  258. package/dist/repertoire/coding/context-pack.js +331 -0
  259. package/dist/repertoire/coding/feedback.js +197 -30
  260. package/dist/repertoire/coding/manager.js +166 -10
  261. package/dist/repertoire/coding/spawner.js +55 -9
  262. package/dist/repertoire/coding/tools.js +219 -7
  263. package/dist/repertoire/commerce-errors.js +109 -0
  264. package/dist/repertoire/commerce-self-test.js +156 -0
  265. package/dist/repertoire/credential-access.js +178 -0
  266. package/dist/repertoire/desk/classifier.js +362 -0
  267. package/dist/repertoire/duffel-client.js +185 -0
  268. package/dist/repertoire/github-client.js +14 -55
  269. package/dist/repertoire/graph-client.js +11 -52
  270. package/dist/repertoire/guardrails.js +385 -0
  271. package/dist/repertoire/mcp-client.js +295 -0
  272. package/dist/repertoire/mcp-manager.js +403 -0
  273. package/dist/repertoire/mcp-tools.js +83 -0
  274. package/dist/repertoire/plugin-mcp.js +175 -0
  275. package/dist/repertoire/plugins.js +253 -0
  276. package/dist/repertoire/shell-sessions.js +133 -0
  277. package/dist/repertoire/skills.js +48 -4
  278. package/dist/repertoire/stripe-client.js +131 -0
  279. package/dist/repertoire/tool-results.js +29 -0
  280. package/dist/repertoire/tools-attachments.js +317 -0
  281. package/dist/repertoire/tools-awaiting.js +372 -0
  282. package/dist/repertoire/tools-base.js +59 -1082
  283. package/dist/repertoire/tools-bluebubbles.js +2 -0
  284. package/dist/repertoire/tools-bridge.js +144 -0
  285. package/dist/repertoire/tools-bundle.js +993 -0
  286. package/dist/repertoire/tools-config.js +186 -0
  287. package/dist/repertoire/tools-continuity.js +252 -0
  288. package/dist/repertoire/tools-credential.js +383 -0
  289. package/dist/repertoire/tools-evolution.js +527 -0
  290. package/dist/repertoire/tools-files.js +344 -0
  291. package/dist/repertoire/tools-flight.js +227 -0
  292. package/dist/repertoire/tools-flow.js +119 -0
  293. package/dist/repertoire/tools-github.js +3 -8
  294. package/dist/repertoire/tools-mail.js +1975 -0
  295. package/dist/repertoire/tools-notes.js +438 -0
  296. package/dist/repertoire/tools-obligations.js +143 -0
  297. package/dist/repertoire/tools-orientation.js +31 -0
  298. package/dist/repertoire/tools-record.js +464 -0
  299. package/dist/repertoire/tools-runtime.js +150 -0
  300. package/dist/repertoire/tools-session.js +766 -0
  301. package/dist/repertoire/tools-shell.js +120 -0
  302. package/dist/repertoire/tools-stripe.js +182 -0
  303. package/dist/repertoire/tools-surface.js +344 -0
  304. package/dist/repertoire/tools-teams.js +12 -39
  305. package/dist/repertoire/tools-travel.js +125 -0
  306. package/dist/repertoire/tools-trip.js +982 -0
  307. package/dist/repertoire/tools-user-profile.js +146 -0
  308. package/dist/repertoire/tools-vault.js +40 -0
  309. package/dist/repertoire/tools-voice.js +145 -0
  310. package/dist/repertoire/tools.js +215 -103
  311. package/dist/repertoire/travel-api-client.js +360 -0
  312. package/dist/repertoire/user-profile.js +131 -0
  313. package/dist/repertoire/vault-setup.js +246 -0
  314. package/dist/repertoire/vault-unlock.js +594 -0
  315. package/dist/scripts/claude-code-hook.js +41 -0
  316. package/dist/scripts/claude-code-stop-hook.js +47 -0
  317. package/dist/senses/attention-queue.js +186 -0
  318. package/dist/senses/await-turn-message.js +58 -0
  319. package/dist/senses/bluebubbles/active-turns.js +216 -0
  320. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  321. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  322. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  323. package/dist/senses/bluebubbles/entry.js +77 -0
  324. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  325. package/dist/senses/bluebubbles/index.js +2737 -0
  326. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  327. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  328. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  329. package/dist/senses/bluebubbles/processed-log.js +133 -0
  330. package/dist/senses/bluebubbles/replay.js +137 -0
  331. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  332. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  333. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  334. package/dist/senses/cli/bracketed-paste.js +82 -0
  335. package/dist/senses/cli/image-paste.js +287 -0
  336. package/dist/senses/cli/image-ref-navigation.js +75 -0
  337. package/dist/senses/cli/ink-app.js +156 -0
  338. package/dist/senses/cli/inline-diff.js +64 -0
  339. package/dist/senses/cli/input-keys.js +174 -0
  340. package/dist/senses/cli/kill-ring.js +86 -0
  341. package/dist/senses/cli/message-list.js +51 -0
  342. package/dist/senses/cli/ouro-tui.js +607 -0
  343. package/dist/senses/cli/spinner-imperative.js +135 -0
  344. package/dist/senses/cli/spinner.js +101 -0
  345. package/dist/senses/cli/status-line.js +60 -0
  346. package/dist/senses/cli/streaming-markdown.js +526 -0
  347. package/dist/senses/cli/tool-display.js +85 -0
  348. package/dist/senses/cli/tool-render.js +85 -0
  349. package/dist/senses/cli/tui-store.js +240 -0
  350. package/dist/senses/cli/virtual-list.js +35 -0
  351. package/dist/senses/cli-entry.js +60 -8
  352. package/dist/senses/cli-layout.js +100 -0
  353. package/dist/senses/cli.js +517 -204
  354. package/dist/senses/commands.js +66 -3
  355. package/dist/senses/habit-turn-message.js +108 -0
  356. package/dist/senses/inner-dialog-worker.js +254 -22
  357. package/dist/senses/inner-dialog.js +505 -40
  358. package/dist/senses/mail-entry.js +66 -0
  359. package/dist/senses/mail.js +379 -0
  360. package/dist/senses/pipeline.js +666 -181
  361. package/dist/senses/proactive-content-guard.js +51 -0
  362. package/dist/senses/shared-turn.js +393 -0
  363. package/dist/senses/surface-tool.js +108 -0
  364. package/dist/senses/teams-entry.js +60 -8
  365. package/dist/senses/teams.js +388 -98
  366. package/dist/senses/trust-gate.js +100 -5
  367. package/dist/senses/voice/audio-playback.js +237 -0
  368. package/dist/senses/voice/audio-routing.js +119 -0
  369. package/dist/senses/voice/elevenlabs.js +202 -0
  370. package/dist/senses/voice/floor-control.js +431 -0
  371. package/dist/senses/voice/floor-controller.js +115 -0
  372. package/dist/senses/voice/golden-path.js +116 -0
  373. package/dist/senses/voice/index.js +29 -0
  374. package/dist/senses/voice/meeting.js +113 -0
  375. package/dist/senses/voice/outbound.js +190 -0
  376. package/dist/senses/voice/phone.js +33 -0
  377. package/dist/senses/voice/playback.js +139 -0
  378. package/dist/senses/voice/realtime-eval.js +496 -0
  379. package/dist/senses/voice/realtime-trace.js +531 -0
  380. package/dist/senses/voice/transcript.js +70 -0
  381. package/dist/senses/voice/turn.js +191 -0
  382. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  383. package/dist/senses/voice/twilio-phone.js +5079 -0
  384. package/dist/senses/voice/types.js +2 -0
  385. package/dist/senses/voice/whisper.js +161 -0
  386. package/dist/senses/voice-entry.js +81 -0
  387. package/dist/senses/voice-realtime-eval-command.js +99 -0
  388. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  389. package/dist/senses/voice-twilio-entry.js +87 -0
  390. package/dist/trips/core.js +138 -0
  391. package/dist/trips/store.js +265 -0
  392. package/dist/util/frontmatter.js +53 -0
  393. package/package.json +48 -8
  394. package/skills/agent-commerce.md +106 -0
  395. package/skills/browser-navigation.md +117 -0
  396. package/skills/commerce-setup-guide.md +116 -0
  397. package/skills/commerce-setup.md +84 -0
  398. package/skills/configure-dev-tools.md +99 -0
  399. package/skills/travel-planning.md +138 -0
  400. package/dist/heart/daemon/auth-flow.js +0 -351
  401. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  402. package/dist/heart/safe-workspace.js +0 -228
  403. package/dist/heart/session-recall.js +0 -116
  404. package/dist/mind/associative-recall.js +0 -209
  405. package/dist/repertoire/tasks/board.js +0 -134
  406. package/dist/repertoire/tasks/index.js +0 -224
  407. package/dist/repertoire/tasks/lifecycle.js +0 -80
  408. package/dist/repertoire/tasks/middleware.js +0 -65
  409. package/dist/repertoire/tasks/parser.js +0 -173
  410. package/dist/repertoire/tasks/scanner.js +0 -132
  411. package/dist/repertoire/tasks/transitions.js +0 -144
  412. package/dist/senses/bluebubbles-entry.js +0 -13
  413. package/dist/senses/bluebubbles.js +0 -1177
  414. package/dist/senses/debug-activity.js +0 -148
  415. package/subagents/README.md +0 -7
  416. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  417. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  418. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  419. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  420. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  421. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  422. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  423. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  424. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  425. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  426. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  427. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  428. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  429. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  430. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  431. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  432. /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,13 @@ 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,
213
+ evolutionCaseId: normalizedRequest.evolutionCaseId,
160
214
  scopeFile: normalizedRequest.scopeFile,
161
215
  stateFile: normalizedRequest.stateFile,
216
+ checkpoint: null,
217
+ artifactPath: this.artifactPathFor(id),
162
218
  status: "spawning",
163
219
  stdoutTail: "",
164
220
  stderrTail: "",
@@ -245,6 +301,7 @@ class CodingSessionManager {
245
301
  record.process.kill("SIGTERM");
246
302
  record.process = null;
247
303
  record.session.status = "killed";
304
+ record.session.checkpoint = "terminated by parent agent";
248
305
  record.session.endedAt = this.nowIso();
249
306
  (0, runtime_1.emitNervesEvent)({
250
307
  component: "repertoire",
@@ -267,6 +324,7 @@ class CodingSessionManager {
267
324
  continue;
268
325
  stalled += 1;
269
326
  record.session.status = "stalled";
327
+ record.session.checkpoint = deriveCheckpoint(record.session);
270
328
  (0, runtime_1.emitNervesEvent)({
271
329
  level: "warn",
272
330
  component: "repertoire",
@@ -292,6 +350,7 @@ class CodingSessionManager {
292
350
  record.process = null;
293
351
  if (record.session.status === "running" || record.session.status === "spawning") {
294
352
  record.session.status = "killed";
353
+ record.session.checkpoint = "terminated during manager shutdown";
295
354
  record.session.endedAt = this.nowIso();
296
355
  }
297
356
  }
@@ -336,6 +395,13 @@ class CodingSessionManager {
336
395
  record.session.endedAt = this.nowIso();
337
396
  updateKind = "completed";
338
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);
404
+ }
339
405
  (0, runtime_1.emitNervesEvent)({
340
406
  component: "repertoire",
341
407
  event: "repertoire.coding_session_output",
@@ -359,12 +425,14 @@ class CodingSessionManager {
359
425
  record.session.lastSignal = signal;
360
426
  if (record.session.status === "killed" || record.session.status === "completed") {
361
427
  record.session.endedAt = this.nowIso();
428
+ record.session.checkpoint = deriveCheckpoint(record.session);
362
429
  this.persistState();
363
430
  return;
364
431
  }
365
432
  if (code === 0) {
366
433
  record.session.status = "completed";
367
434
  record.session.endedAt = this.nowIso();
435
+ record.session.checkpoint = deriveCheckpoint(record.session);
368
436
  this.persistState();
369
437
  this.notifyListeners(record.session.id, { kind: "completed", session: cloneSession(record.session) });
370
438
  return;
@@ -376,6 +444,7 @@ class CodingSessionManager {
376
444
  record.session.status = "failed";
377
445
  record.session.endedAt = this.nowIso();
378
446
  record.session.failure = defaultFailureDiagnostics(code, signal, record.command, record.args, record.stdoutTail, record.stderrTail);
447
+ record.session.checkpoint = deriveCheckpoint(record.session);
379
448
  (0, runtime_1.emitNervesEvent)({
380
449
  level: "error",
381
450
  component: "repertoire",
@@ -401,6 +470,7 @@ class CodingSessionManager {
401
470
  record.session.lastActivityAt = this.nowIso();
402
471
  record.session.endedAt = null;
403
472
  record.session.failure = null;
473
+ record.session.checkpoint = `restarted after ${reason}`;
404
474
  this.attachProcessListeners(record);
405
475
  (0, runtime_1.emitNervesEvent)({
406
476
  level: "warn",
@@ -482,15 +552,22 @@ class CodingSessionManager {
482
552
  }
483
553
  const normalizedRequest = {
484
554
  ...request,
555
+ originSession: request.originSession ? { ...request.originSession } : undefined,
485
556
  sessionId: request.sessionId ?? session.id,
557
+ obligationId: request.obligationId,
486
558
  parentAgent: request.parentAgent ?? this.agentName,
487
559
  };
488
560
  const normalizedSession = {
489
561
  ...session,
490
562
  taskRef: session.taskRef ?? normalizedRequest.taskRef,
563
+ originSession: session.originSession ?? normalizedRequest.originSession,
564
+ obligationId: session.obligationId ?? normalizedRequest.obligationId,
565
+ evolutionCaseId: session.evolutionCaseId ?? normalizedRequest.evolutionCaseId,
491
566
  failure: session.failure ?? null,
492
567
  stdoutTail: session.stdoutTail ?? session.failure?.stdoutTail ?? "",
493
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),
494
571
  };
495
572
  if (typeof normalizedSession.pid === "number") {
496
573
  const alive = this.pidAlive(normalizedSession.pid);
@@ -503,6 +580,7 @@ class CodingSessionManager {
503
580
  normalizedSession.pid = null;
504
581
  }
505
582
  }
583
+ normalizedSession.checkpoint = normalizedSession.checkpoint ?? deriveCheckpoint(normalizedSession);
506
584
  this.records.set(normalizedSession.id, {
507
585
  request: normalizedRequest,
508
586
  session: normalizedSession,
@@ -525,7 +603,10 @@ class CodingSessionManager {
525
603
  const payload = {
526
604
  sequence: this.sequence,
527
605
  records: [...this.records.values()].map((record) => ({
528
- request: record.request,
606
+ request: {
607
+ ...record.request,
608
+ prompt: (0, session_events_1.capStructuredRecordString)(record.request.prompt),
609
+ },
529
610
  session: record.session,
530
611
  })),
531
612
  };
@@ -542,6 +623,81 @@ class CodingSessionManager {
542
623
  meta: { path: this.stateFilePath, reason: error instanceof Error ? error.message : String(error) },
543
624
  });
544
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
+ }
545
701
  }
546
702
  }
547
703
  exports.CodingSessionManager = CodingSessionManager;