@ouro.bot/cli 0.1.0-alpha.83 → 0.1.0-alpha.831

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 (647) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/assets/sanctuary-host-launcher.sh +16 -0
  15. package/changelog.json +5308 -16
  16. package/deploy/unraid/Dockerfile +54 -0
  17. package/deploy/unraid/README.txt +2983 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  21. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  22. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  23. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  24. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  25. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  26. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  27. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  28. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  29. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  30. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  31. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  32. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  33. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  34. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  35. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2084 -0
  36. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  37. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  38. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  39. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  40. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  41. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  42. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +795 -0
  43. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  44. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  45. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  46. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +15 -0
  47. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +15 -0
  49. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  50. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +135 -0
  51. package/deploy/unraid/sanctuary.xml +28 -0
  52. package/dist/a2a/card.js +57 -0
  53. package/dist/a2a/client.js +180 -0
  54. package/dist/a2a/config.js +50 -0
  55. package/dist/a2a/delegation-stores.js +56 -0
  56. package/dist/a2a/did-resolution.js +93 -0
  57. package/dist/a2a/identity.js +170 -0
  58. package/dist/a2a/inbound-share.js +107 -0
  59. package/dist/a2a/mission-result-wire.js +196 -0
  60. package/dist/a2a/onboarding.js +115 -0
  61. package/dist/a2a/pin-store.js +132 -0
  62. package/dist/a2a/seen-ledger.js +120 -0
  63. package/dist/a2a/server.js +604 -0
  64. package/dist/a2a/task-store.js +69 -0
  65. package/dist/a2a/transport.js +45 -0
  66. package/dist/a2a/types.js +3 -0
  67. package/dist/arc/attention-types.js +8 -0
  68. package/dist/arc/cares.js +360 -0
  69. package/dist/arc/episodes.js +118 -0
  70. package/dist/arc/evolution.js +490 -0
  71. package/dist/arc/flight-recorder.js +1034 -0
  72. package/dist/arc/intentions.js +134 -0
  73. package/dist/arc/json-store.js +117 -0
  74. package/dist/arc/obligations.js +386 -0
  75. package/dist/arc/packets.js +336 -0
  76. package/dist/arc/presence.js +185 -0
  77. package/dist/arc/task-lifecycle.js +57 -0
  78. package/dist/commerce/store.js +755 -0
  79. package/dist/commerce/types.js +3 -0
  80. package/dist/heart/active-work.js +798 -40
  81. package/dist/heart/agent-entry.js +252 -3
  82. package/dist/heart/approval-files.js +113 -0
  83. package/dist/heart/approval-store.js +960 -0
  84. package/dist/heart/attachments/image-normalize.js +194 -0
  85. package/dist/heart/attachments/materialize.js +97 -0
  86. package/dist/heart/attachments/originals.js +88 -0
  87. package/dist/heart/attachments/render.js +29 -0
  88. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  89. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  90. package/dist/heart/attachments/sources/index.js +18 -0
  91. package/dist/heart/attachments/sources/telegram.js +71 -0
  92. package/dist/heart/attachments/store.js +132 -0
  93. package/dist/heart/attachments/types.js +93 -0
  94. package/dist/heart/auth/auth-flow.js +495 -0
  95. package/dist/heart/autonomy-budget.js +478 -0
  96. package/dist/heart/awaiting/await-alert.js +148 -0
  97. package/dist/heart/awaiting/await-expiry.js +143 -0
  98. package/dist/heart/awaiting/await-loader.js +91 -0
  99. package/dist/heart/awaiting/await-parser.js +149 -0
  100. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  101. package/dist/heart/awaiting/await-scheduler.js +382 -0
  102. package/dist/heart/background-operations.js +281 -0
  103. package/dist/heart/bridges/manager.js +137 -17
  104. package/dist/heart/bridges/store.js +14 -2
  105. package/dist/heart/bundle-state.js +168 -0
  106. package/dist/heart/commitments.js +44 -18
  107. package/dist/heart/config-registry.js +331 -0
  108. package/dist/heart/config.js +174 -131
  109. package/dist/heart/context-loss-gauntlet.js +387 -0
  110. package/dist/heart/context-loss-sentinel.js +1157 -0
  111. package/dist/heart/core.js +2169 -581
  112. package/dist/heart/cross-chat-delivery.js +9 -22
  113. package/dist/heart/daemon/agent-config-check.js +451 -0
  114. package/dist/heart/daemon/agent-discovery.js +185 -3
  115. package/dist/heart/daemon/agent-service.js +542 -0
  116. package/dist/heart/daemon/agentic-repair.js +547 -0
  117. package/dist/heart/daemon/await-private-wake.js +59 -0
  118. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  119. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  120. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  121. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  122. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  123. package/dist/heart/daemon/cadence.js +180 -0
  124. package/dist/heart/daemon/cli-defaults.js +854 -0
  125. package/dist/heart/daemon/cli-desk.js +322 -0
  126. package/dist/heart/daemon/cli-exec.js +8822 -0
  127. package/dist/heart/daemon/cli-help.js +716 -0
  128. package/dist/heart/daemon/cli-parse.js +2771 -0
  129. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  130. package/dist/heart/daemon/cli-render.js +777 -0
  131. package/dist/heart/daemon/cli-types.js +8 -0
  132. package/dist/heart/daemon/connect-bay.js +323 -0
  133. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  134. package/dist/heart/daemon/container-healthcheck.js +112 -0
  135. package/dist/heart/daemon/container-runtime.js +97 -0
  136. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  137. package/dist/heart/daemon/container-spec-auditor.js +229 -0
  138. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  139. package/dist/heart/daemon/daemon-cli.js +29 -2349
  140. package/dist/heart/daemon/daemon-entry.js +930 -11
  141. package/dist/heart/daemon/daemon-health.js +186 -0
  142. package/dist/heart/daemon/daemon-rollup.js +57 -0
  143. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  144. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  145. package/dist/heart/daemon/daemon.js +2084 -105
  146. package/dist/heart/daemon/dns-workflow.js +394 -0
  147. package/dist/heart/daemon/doctor-types.js +8 -0
  148. package/dist/heart/daemon/doctor.js +1755 -0
  149. package/dist/heart/daemon/freshness.js +345 -0
  150. package/dist/heart/daemon/habit-private-wake.js +61 -0
  151. package/dist/heart/daemon/health-monitor.js +142 -11
  152. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  153. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  154. package/dist/heart/daemon/http-health-probe.js +80 -0
  155. package/dist/heart/daemon/human-command-screens.js +234 -0
  156. package/dist/heart/daemon/human-readiness.js +114 -0
  157. package/dist/heart/daemon/inner-status.js +78 -0
  158. package/dist/heart/daemon/interactive-repair.js +394 -0
  159. package/dist/heart/daemon/launchd.js +37 -8
  160. package/dist/heart/daemon/log-tailer.js +79 -10
  161. package/dist/heart/daemon/logs-prune.js +132 -0
  162. package/dist/heart/daemon/mcp-canary.js +524 -0
  163. package/dist/heart/daemon/message-router.js +65 -5
  164. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  165. package/dist/heart/daemon/os-cron-deps.js +135 -0
  166. package/dist/heart/daemon/os-cron.js +22 -14
  167. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  168. package/dist/heart/daemon/ouro-entry.js +3 -1
  169. package/dist/heart/daemon/plugin-cli.js +432 -0
  170. package/dist/heart/daemon/process-manager.js +733 -61
  171. package/dist/heart/daemon/provider-discovery.js +137 -0
  172. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  173. package/dist/heart/daemon/prunable-bundle.js +144 -0
  174. package/dist/heart/daemon/pulse.js +511 -0
  175. package/dist/heart/daemon/readiness-repair.js +365 -0
  176. package/dist/heart/daemon/run-hooks.js +2 -0
  177. package/dist/heart/daemon/runtime-logging.js +47 -14
  178. package/dist/heart/daemon/runtime-metadata.js +2 -30
  179. package/dist/heart/daemon/runtime-mode.js +13 -2
  180. package/dist/heart/daemon/safe-mode.js +161 -0
  181. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  182. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  183. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  184. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  185. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  186. package/dist/heart/daemon/sanctuary-authority-epoch.js +256 -0
  187. package/dist/heart/daemon/sanctuary-authority-installation.js +140 -0
  188. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  189. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +819 -0
  190. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  191. package/dist/heart/daemon/sanctuary-bundle-migration.js +729 -0
  192. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  193. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +494 -0
  194. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  195. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  196. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  197. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  198. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  199. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  200. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  201. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +445 -0
  202. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  203. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +630 -0
  204. package/dist/heart/daemon/sense-manager.js +699 -48
  205. package/dist/heart/daemon/session-id-resolver.js +131 -0
  206. package/dist/heart/daemon/skill-management-installer.js +1 -1
  207. package/dist/heart/daemon/socket-client.js +180 -12
  208. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  209. package/dist/heart/daemon/startup-tui.js +339 -0
  210. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  211. package/dist/heart/daemon/task-scheduler.js +117 -39
  212. package/dist/heart/daemon/terminal-ui.js +499 -0
  213. package/dist/heart/daemon/thoughts.js +138 -54
  214. package/dist/heart/daemon/up-progress.js +366 -0
  215. package/dist/heart/daemon/vault-items.js +56 -0
  216. package/dist/heart/delegation.js +1 -4
  217. package/dist/heart/external-events/router.js +1430 -0
  218. package/dist/heart/frontend-approval-runtime.js +506 -0
  219. package/dist/heart/frontend-journal.js +215 -0
  220. package/dist/heart/frontend-session-service.js +237 -0
  221. package/dist/heart/frontend-socket-client.js +164 -0
  222. package/dist/heart/frontend-socket.js +400 -0
  223. package/dist/heart/habits/habit-cancel.js +810 -0
  224. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  225. package/dist/heart/habits/habit-migration.js +194 -0
  226. package/dist/heart/habits/habit-parser.js +278 -0
  227. package/dist/heart/habits/habit-runtime-state.js +93 -0
  228. package/dist/heart/habits/habit-scheduler.js +653 -0
  229. package/dist/heart/habits/habit-session-summary.js +318 -0
  230. package/dist/heart/habits/habit-session.js +636 -0
  231. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  232. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  233. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  234. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  235. package/dist/heart/identity.js +196 -59
  236. package/dist/heart/kept-notes.js +289 -0
  237. package/dist/heart/kicks.js +1 -1
  238. package/dist/heart/machine-identity.js +161 -0
  239. package/dist/heart/mail-import-discovery.js +356 -0
  240. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  241. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  242. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  243. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  244. package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
  245. package/dist/heart/mailbox/mailbox-http.js +99 -0
  246. package/dist/heart/mailbox/mailbox-read.js +39 -0
  247. package/dist/heart/mailbox/mailbox-types.js +27 -0
  248. package/dist/heart/mailbox/mailbox-view.js +197 -0
  249. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  250. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  251. package/dist/heart/mailbox/readers/mail.js +375 -0
  252. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  253. package/dist/heart/mailbox/readers/sessions.js +231 -0
  254. package/dist/heart/mailbox/readers/shared.js +111 -0
  255. package/dist/heart/mcp/mcp-server.js +696 -0
  256. package/dist/heart/migrate-config.js +100 -0
  257. package/dist/heart/model-capabilities.js +11 -0
  258. package/dist/heart/orientation-frame.js +345 -0
  259. package/dist/heart/platform.js +81 -0
  260. package/dist/heart/primitives.js +1 -1
  261. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  262. package/dist/heart/private-runtime/index.js +18 -0
  263. package/dist/heart/private-runtime/ledger.js +221 -0
  264. package/dist/heart/private-runtime/policy.js +252 -0
  265. package/dist/heart/private-runtime/types.js +2 -0
  266. package/dist/heart/progress-story.js +1 -1
  267. package/dist/heart/provider-attempt.js +137 -0
  268. package/dist/heart/provider-binding-resolver.js +273 -0
  269. package/dist/heart/provider-credentials.js +449 -0
  270. package/dist/heart/provider-failover.js +311 -0
  271. package/dist/heart/provider-models.js +96 -0
  272. package/dist/heart/provider-ping.js +265 -0
  273. package/dist/heart/provider-readiness-cache.js +119 -0
  274. package/dist/heart/provider-visibility.js +188 -0
  275. package/dist/heart/providers/anthropic-token.js +131 -0
  276. package/dist/heart/providers/anthropic.js +173 -60
  277. package/dist/heart/providers/azure.js +23 -11
  278. package/dist/heart/providers/error-classification.js +127 -0
  279. package/dist/heart/providers/github-copilot.js +34 -38
  280. package/dist/heart/providers/minimax-vlm.js +189 -0
  281. package/dist/heart/providers/minimax.js +26 -8
  282. package/dist/heart/providers/openai-codex-token.js +349 -0
  283. package/dist/heart/providers/openai-codex.js +55 -40
  284. package/dist/heart/providers/openai-compatible.js +177 -0
  285. package/dist/heart/run-ledger.js +247 -0
  286. package/dist/heart/runtime-capability-check.js +170 -0
  287. package/dist/heart/runtime-credentials.js +607 -0
  288. package/dist/heart/runtime-cwd.js +87 -0
  289. package/dist/heart/sense-truth.js +22 -4
  290. package/dist/heart/session-activity.js +92 -24
  291. package/dist/heart/session-events.js +1504 -0
  292. package/dist/heart/session-playback-cli-main.js +5 -0
  293. package/dist/heart/session-playback-cli.js +36 -0
  294. package/dist/heart/session-playback.js +231 -0
  295. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  296. package/dist/heart/session-redaction-repair.js +552 -0
  297. package/dist/heart/session-stats-cli-main.js +5 -0
  298. package/dist/heart/session-stats.js +183 -0
  299. package/dist/heart/session-transcript.js +133 -0
  300. package/dist/heart/start-of-turn-packet.js +372 -0
  301. package/dist/heart/steward-policy.js +618 -0
  302. package/dist/heart/streaming.js +604 -207
  303. package/dist/heart/structured-output.js +196 -0
  304. package/dist/heart/sync-classification.js +176 -0
  305. package/dist/heart/sync.js +449 -0
  306. package/dist/heart/target-resolution.js +11 -7
  307. package/dist/heart/tempo.js +93 -0
  308. package/dist/heart/temporal-view.js +41 -0
  309. package/dist/heart/timeouts.js +101 -0
  310. package/dist/heart/tool-activity-callbacks.js +59 -0
  311. package/dist/heart/tool-approval.js +382 -0
  312. package/dist/heart/tool-description.js +155 -0
  313. package/dist/heart/tool-friction.js +55 -0
  314. package/dist/heart/tool-loop.js +200 -0
  315. package/dist/heart/turn-context.js +482 -0
  316. package/dist/heart/turn-execution-lease.js +30 -0
  317. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  318. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  319. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  320. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  321. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  322. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  323. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  324. package/dist/heart/versioning/update-hooks.js +154 -0
  325. package/dist/heart/versioning/version-intent.js +114 -0
  326. package/dist/heart/work-card.js +380 -0
  327. package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
  328. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  329. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  330. package/dist/mailbox-ui/index.html +16 -0
  331. package/dist/mailroom/attention.js +167 -0
  332. package/dist/mailroom/autonomy.js +209 -0
  333. package/dist/mailroom/blob-store.js +889 -0
  334. package/dist/mailroom/body-cache.js +61 -0
  335. package/dist/mailroom/cache-sync-cli.js +58 -0
  336. package/dist/mailroom/core.js +803 -0
  337. package/dist/mailroom/entry.js +160 -0
  338. package/dist/mailroom/file-store.js +568 -0
  339. package/dist/mailroom/hosted-cache-sync.js +384 -0
  340. package/dist/mailroom/mbox-import.js +393 -0
  341. package/dist/mailroom/migration.js +164 -0
  342. package/dist/mailroom/outbound.js +380 -0
  343. package/dist/mailroom/policy.js +263 -0
  344. package/dist/mailroom/reader.js +292 -0
  345. package/dist/mailroom/search-cache.js +513 -0
  346. package/dist/mailroom/search-relevance.js +319 -0
  347. package/dist/mailroom/smtp-ingress.js +176 -0
  348. package/dist/mailroom/source-state.js +176 -0
  349. package/dist/mailroom/thread.js +109 -0
  350. package/dist/mailroom/travel-extract.js +89 -0
  351. package/dist/mind/bundle-manifest.js +24 -2
  352. package/dist/mind/context.js +309 -111
  353. package/dist/mind/desk-section.js +362 -0
  354. package/dist/mind/diary-integrity.js +60 -0
  355. package/dist/mind/{memory.js → diary.js} +68 -77
  356. package/dist/mind/embedding-provider.js +60 -0
  357. package/dist/mind/file-state.js +179 -0
  358. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  359. package/dist/mind/obligation-steering.js +199 -3
  360. package/dist/mind/pending.js +36 -10
  361. package/dist/mind/prompt-budget.js +479 -0
  362. package/dist/mind/prompt-refresh.js +3 -2
  363. package/dist/mind/prompt.js +1050 -189
  364. package/dist/mind/provenance-trust.js +26 -0
  365. package/dist/mind/record-paths.js +312 -0
  366. package/dist/mind/scrutiny.js +173 -0
  367. package/dist/mind/session-transaction.js +564 -0
  368. package/dist/nerves/cli-logging.js +7 -1
  369. package/dist/nerves/coverage/audit-rules.js +15 -6
  370. package/dist/nerves/coverage/audit.js +28 -2
  371. package/dist/nerves/coverage/cli.js +1 -1
  372. package/dist/nerves/coverage/contract.js +5 -5
  373. package/dist/nerves/coverage/file-completeness.js +139 -5
  374. package/dist/nerves/coverage/run-artifacts.js +55 -35
  375. package/dist/nerves/coverage/source-scanner.js +4 -4
  376. package/dist/nerves/event-buffer.js +111 -0
  377. package/dist/nerves/index.js +293 -9
  378. package/dist/nerves/observation.js +20 -0
  379. package/dist/nerves/redact.js +79 -0
  380. package/dist/nerves/review/cli-main.js +5 -0
  381. package/dist/nerves/review/cli.js +156 -0
  382. package/dist/nerves/review/core.js +159 -0
  383. package/dist/nerves/runtime.js +17 -1
  384. package/dist/repertoire/ado-client.js +15 -56
  385. package/dist/repertoire/ado-semantic.js +16 -10
  386. package/dist/repertoire/api-client.js +97 -0
  387. package/dist/repertoire/bitwarden-store.js +1045 -0
  388. package/dist/repertoire/bundle-templates.js +71 -0
  389. package/dist/repertoire/bw-installer.js +180 -0
  390. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  391. package/dist/repertoire/coding/context-pack.js +331 -0
  392. package/dist/repertoire/coding/feedback.js +174 -32
  393. package/dist/repertoire/coding/index.js +15 -3
  394. package/dist/repertoire/coding/manager.js +159 -10
  395. package/dist/repertoire/coding/spawner.js +58 -11
  396. package/dist/repertoire/coding/tools.js +221 -15
  397. package/dist/repertoire/coding/workbench-client.js +272 -0
  398. package/dist/repertoire/coding/workbench-manager.js +346 -0
  399. package/dist/repertoire/commerce-errors.js +109 -0
  400. package/dist/repertoire/commerce-self-test.js +156 -0
  401. package/dist/repertoire/credential-access.js +178 -0
  402. package/dist/repertoire/desk/classifier.js +362 -0
  403. package/dist/repertoire/duffel-client.js +185 -0
  404. package/dist/repertoire/github-client.js +14 -55
  405. package/dist/repertoire/graph-client.js +11 -52
  406. package/dist/repertoire/guardrails.js +811 -18
  407. package/dist/repertoire/mcp-client.js +44 -3
  408. package/dist/repertoire/mcp-manager.js +427 -139
  409. package/dist/repertoire/mcp-tools.js +124 -0
  410. package/dist/repertoire/plugin-mcp.js +175 -0
  411. package/dist/repertoire/plugins.js +253 -0
  412. package/dist/repertoire/relationship-authorization.js +322 -0
  413. package/dist/repertoire/shell-sessions.js +134 -0
  414. package/dist/repertoire/skills.js +48 -4
  415. package/dist/repertoire/stripe-client.js +131 -0
  416. package/dist/repertoire/tool-arguments.js +170 -0
  417. package/dist/repertoire/tool-results.js +29 -0
  418. package/dist/repertoire/tools-a2a.js +699 -0
  419. package/dist/repertoire/tools-attachments.js +322 -0
  420. package/dist/repertoire/tools-awaiting.js +575 -0
  421. package/dist/repertoire/tools-base.js +77 -1138
  422. package/dist/repertoire/tools-bluebubbles.js +2 -0
  423. package/dist/repertoire/tools-bridge.js +144 -0
  424. package/dist/repertoire/tools-bundle.js +993 -0
  425. package/dist/repertoire/tools-commerce.js +253 -0
  426. package/dist/repertoire/tools-config.js +186 -0
  427. package/dist/repertoire/tools-continuity.js +575 -0
  428. package/dist/repertoire/tools-credential.js +383 -0
  429. package/dist/repertoire/tools-evolution.js +527 -0
  430. package/dist/repertoire/tools-files.js +344 -0
  431. package/dist/repertoire/tools-flight.js +290 -0
  432. package/dist/repertoire/tools-flow.js +119 -0
  433. package/dist/repertoire/tools-github.js +3 -8
  434. package/dist/repertoire/tools-habits.js +103 -0
  435. package/dist/repertoire/tools-mail.js +1828 -0
  436. package/dist/repertoire/tools-notes.js +485 -0
  437. package/dist/repertoire/tools-obligations.js +182 -0
  438. package/dist/repertoire/tools-orientation.js +31 -0
  439. package/dist/repertoire/tools-record.js +482 -0
  440. package/dist/repertoire/tools-rsvp.js +139 -0
  441. package/dist/repertoire/tools-runtime.js +150 -0
  442. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  443. package/dist/repertoire/tools-session.js +1133 -0
  444. package/dist/repertoire/tools-shell.js +149 -0
  445. package/dist/repertoire/tools-steward-policy.js +119 -0
  446. package/dist/repertoire/tools-stripe.js +224 -0
  447. package/dist/repertoire/tools-surface.js +369 -0
  448. package/dist/repertoire/tools-teams.js +12 -39
  449. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  450. package/dist/repertoire/tools-travel.js +125 -0
  451. package/dist/repertoire/tools-trip.js +982 -0
  452. package/dist/repertoire/tools-unraid.js +531 -0
  453. package/dist/repertoire/tools-user-profile.js +146 -0
  454. package/dist/repertoire/tools-vault.js +40 -0
  455. package/dist/repertoire/tools-voice.js +145 -0
  456. package/dist/repertoire/tools.js +494 -148
  457. package/dist/repertoire/travel-api-client.js +360 -0
  458. package/dist/repertoire/unraid-client.js +155 -0
  459. package/dist/repertoire/unraid-restart.js +339 -0
  460. package/dist/repertoire/user-profile.js +131 -0
  461. package/dist/repertoire/vault-setup.js +246 -0
  462. package/dist/repertoire/vault-unlock.js +628 -0
  463. package/dist/rsvp/aisleplanner-client.js +354 -0
  464. package/dist/rsvp/cli.js +926 -0
  465. package/dist/rsvp/config.js +327 -0
  466. package/dist/rsvp/cutover.js +433 -0
  467. package/dist/rsvp/diagnostics.js +232 -0
  468. package/dist/rsvp/diff-renderer.js +176 -0
  469. package/dist/rsvp/habit-policy.js +110 -0
  470. package/dist/rsvp/habit-stage.js +123 -0
  471. package/dist/rsvp/incident-bundle.js +97 -0
  472. package/dist/rsvp/migration.js +204 -0
  473. package/dist/rsvp/native-habit-runner.js +630 -0
  474. package/dist/rsvp/outbound-state.js +628 -0
  475. package/dist/rsvp/query.js +118 -0
  476. package/dist/rsvp/replay.js +233 -0
  477. package/dist/rsvp/snapshot.js +232 -0
  478. package/dist/rsvp/spend-ledger.js +175 -0
  479. package/dist/scripts/claude-code-hook.js +41 -0
  480. package/dist/scripts/claude-code-stop-hook.js +47 -0
  481. package/dist/senses/a2a-entry.js +115 -0
  482. package/dist/senses/acp-server.js +386 -0
  483. package/dist/senses/attention-queue.js +186 -0
  484. package/dist/senses/await-turn-message.js +58 -0
  485. package/dist/senses/bluebubbles/active-turns.js +216 -0
  486. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  487. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  488. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  489. package/dist/senses/bluebubbles/context-packet.js +207 -0
  490. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  491. package/dist/senses/bluebubbles/entry.js +90 -0
  492. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  493. package/dist/senses/bluebubbles/index.js +3841 -0
  494. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  495. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  496. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  497. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  498. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  499. package/dist/senses/bluebubbles/processed-log.js +133 -0
  500. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  501. package/dist/senses/bluebubbles/replay.js +284 -0
  502. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  503. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  504. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  505. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  506. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  507. package/dist/senses/cli/bracketed-paste.js +82 -0
  508. package/dist/senses/cli/image-paste.js +287 -0
  509. package/dist/senses/cli/image-ref-navigation.js +75 -0
  510. package/dist/senses/cli/ink-app.js +156 -0
  511. package/dist/senses/cli/inline-diff.js +64 -0
  512. package/dist/senses/cli/input-keys.js +174 -0
  513. package/dist/senses/cli/kill-ring.js +86 -0
  514. package/dist/senses/cli/message-list.js +51 -0
  515. package/dist/senses/cli/ouro-tui.js +607 -0
  516. package/dist/senses/cli/spinner-imperative.js +135 -0
  517. package/dist/senses/cli/spinner.js +101 -0
  518. package/dist/senses/cli/status-line.js +60 -0
  519. package/dist/senses/cli/streaming-markdown.js +526 -0
  520. package/dist/senses/cli/tool-display.js +85 -0
  521. package/dist/senses/cli/tool-render.js +85 -0
  522. package/dist/senses/cli/tui-store.js +241 -0
  523. package/dist/senses/cli/virtual-list.js +35 -0
  524. package/dist/senses/cli-entry.js +60 -8
  525. package/dist/senses/cli.js +604 -320
  526. package/dist/senses/commands.js +66 -3
  527. package/dist/senses/context-packet-ledger.js +371 -0
  528. package/dist/senses/context-packets.js +154 -0
  529. package/dist/senses/habit-lifecycle-guard.js +24 -0
  530. package/dist/senses/habit-turn-message.js +160 -0
  531. package/dist/senses/ingress-evidence.js +2 -0
  532. package/dist/senses/mail-entry.js +66 -0
  533. package/dist/senses/mail.js +524 -0
  534. package/dist/senses/pipeline.js +1115 -204
  535. package/dist/senses/private-runtime-worker.js +859 -0
  536. package/dist/senses/private-runtime.js +1517 -0
  537. package/dist/senses/proactive-content-guard.js +51 -0
  538. package/dist/senses/root-host-approval-port.js +345 -0
  539. package/dist/senses/root-host-approval-runtime.js +393 -0
  540. package/dist/senses/sanctuary-authority-resident.js +102 -0
  541. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  542. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  543. package/dist/senses/sanctuary-grounding.js +118 -0
  544. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  545. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  546. package/dist/senses/sanctuary-health-runner.js +100 -0
  547. package/dist/senses/sanctuary-health.js +408 -0
  548. package/dist/senses/sanctuary-install-state-contract.js +126 -0
  549. package/dist/senses/sanctuary-interactive-control.js +410 -0
  550. package/dist/senses/sanctuary-media-catalog-contract.js +297 -0
  551. package/dist/senses/sanctuary-media-optimization.js +514 -0
  552. package/dist/senses/sanctuary-runtime.js +340 -0
  553. package/dist/senses/sanctuary-sab.js +85 -0
  554. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  555. package/dist/senses/shared-turn.js +772 -0
  556. package/dist/senses/surface-tool.js +109 -0
  557. package/dist/senses/teams-entry.js +60 -8
  558. package/dist/senses/teams.js +519 -218
  559. package/dist/senses/telegram-admission.js +718 -0
  560. package/dist/senses/telegram-approval-runtime.js +793 -0
  561. package/dist/senses/telegram-attachments.js +186 -0
  562. package/dist/senses/telegram-audit-ledger.js +220 -0
  563. package/dist/senses/telegram-authority-transport.js +231 -0
  564. package/dist/senses/telegram-client.js +1749 -0
  565. package/dist/senses/telegram-effect-adapter.js +896 -0
  566. package/dist/senses/telegram-entry.js +83 -0
  567. package/dist/senses/telegram.js +2324 -0
  568. package/dist/senses/trust-gate.js +104 -9
  569. package/dist/senses/voice/audio-playback.js +237 -0
  570. package/dist/senses/voice/audio-routing.js +119 -0
  571. package/dist/senses/voice/elevenlabs.js +202 -0
  572. package/dist/senses/voice/floor-control.js +431 -0
  573. package/dist/senses/voice/floor-controller.js +115 -0
  574. package/dist/senses/voice/golden-path.js +116 -0
  575. package/dist/senses/voice/index.js +29 -0
  576. package/dist/senses/voice/meeting.js +113 -0
  577. package/dist/senses/voice/outbound.js +190 -0
  578. package/dist/senses/voice/phone.js +33 -0
  579. package/dist/senses/voice/playback.js +139 -0
  580. package/dist/senses/voice/realtime-eval.js +496 -0
  581. package/dist/senses/voice/realtime-trace.js +531 -0
  582. package/dist/senses/voice/transcript.js +70 -0
  583. package/dist/senses/voice/turn.js +191 -0
  584. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  585. package/dist/senses/voice/twilio-phone.js +5031 -0
  586. package/dist/senses/voice/types.js +2 -0
  587. package/dist/senses/voice/whisper.js +161 -0
  588. package/dist/senses/voice-entry.js +81 -0
  589. package/dist/senses/voice-realtime-eval-command.js +99 -0
  590. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  591. package/dist/senses/voice-twilio-entry.js +87 -0
  592. package/dist/trips/core.js +138 -0
  593. package/dist/trips/store.js +265 -0
  594. package/dist/util/frontmatter.js +69 -0
  595. package/npm-shrinkwrap.json +8138 -0
  596. package/package.json +72 -13
  597. package/skills/agent-commerce.md +113 -0
  598. package/skills/browser-navigation.md +117 -0
  599. package/skills/commerce-setup-guide.md +116 -0
  600. package/skills/commerce-setup.md +84 -0
  601. package/skills/configure-dev-tools.md +99 -0
  602. package/skills/travel-planning.md +138 -0
  603. package/dist/heart/daemon/auth-flow.js +0 -430
  604. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  605. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  606. package/dist/heart/daemon/update-hooks.js +0 -138
  607. package/dist/heart/obligations.js +0 -191
  608. package/dist/heart/safe-workspace.js +0 -228
  609. package/dist/heart/session-recall.js +0 -116
  610. package/dist/mind/friends/channel.js +0 -84
  611. package/dist/mind/friends/group-context.js +0 -144
  612. package/dist/mind/friends/resolver.js +0 -84
  613. package/dist/mind/friends/store-file.js +0 -190
  614. package/dist/mind/friends/store.js +0 -4
  615. package/dist/mind/friends/tokens.js +0 -26
  616. package/dist/mind/friends/trust-explanation.js +0 -74
  617. package/dist/mind/friends/types.js +0 -29
  618. package/dist/repertoire/tasks/board.js +0 -134
  619. package/dist/repertoire/tasks/index.js +0 -224
  620. package/dist/repertoire/tasks/lifecycle.js +0 -80
  621. package/dist/repertoire/tasks/middleware.js +0 -65
  622. package/dist/repertoire/tasks/parser.js +0 -173
  623. package/dist/repertoire/tasks/scanner.js +0 -132
  624. package/dist/repertoire/tasks/transitions.js +0 -144
  625. package/dist/senses/bluebubbles-entry.js +0 -13
  626. package/dist/senses/bluebubbles.js +0 -1181
  627. package/dist/senses/debug-activity.js +0 -154
  628. package/dist/senses/inner-dialog-worker.js +0 -90
  629. package/dist/senses/inner-dialog.js +0 -525
  630. package/subagents/README.md +0 -7
  631. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  632. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  633. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  634. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  635. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  636. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  637. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  638. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  639. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  640. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  641. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  642. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  643. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  644. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  645. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  646. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  647. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -3,9 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.formatCodingTail = formatCodingTail;
4
4
  exports.attachCodingSessionFeedback = attachCodingSessionFeedback;
5
5
  const identity_1 = require("../../heart/identity");
6
- const obligations_1 = require("../../heart/obligations");
6
+ const socket_client_1 = require("../../heart/daemon/socket-client");
7
+ const obligations_1 = require("../../arc/obligations");
7
8
  const runtime_1 = require("../../nerves/runtime");
8
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;
9
19
  function clip(text, maxLength = 280) {
10
20
  const trimmed = text.trim();
11
21
  if (trimmed.length <= maxLength)
@@ -49,23 +59,128 @@ function formatSessionLabel(session) {
49
59
  : "";
50
60
  return `${session.runner} ${session.id}${origin}`;
51
61
  }
62
+ function codingFeedbackOriginSessionId(session) {
63
+ return session.originSession
64
+ ? `${session.originSession.friendId}/${session.originSession.channel}/${session.originSession.key}`
65
+ : "detached";
66
+ }
67
+ function buildCodingFeedbackPrivateWakeOptions(input) {
68
+ return {
69
+ reason: "coding feedback private attention",
70
+ triggerSource: "coding-feedback",
71
+ budgetClass: "interactive",
72
+ idempotencyKey: `coding-feedback:${input.agentName}:${input.obligationId}:${input.update.session.id}:${input.update.kind}`,
73
+ originRefs: [
74
+ { kind: "coding-session", id: input.update.session.id },
75
+ { kind: "coding-update", id: input.update.kind },
76
+ { kind: "obligation", id: input.obligationId },
77
+ { kind: "session", id: codingFeedbackOriginSessionId(input.update.session) },
78
+ ],
79
+ };
80
+ }
81
+ function extractPullRequestLabel(snippet) {
82
+ if (!snippet)
83
+ return null;
84
+ const numberMatch = snippet.match(PULL_REQUEST_NUMBER_PATTERN);
85
+ if (numberMatch)
86
+ return `PR #${numberMatch[1]}`;
87
+ const urlMatch = snippet.match(PULL_REQUEST_URL_PATTERN);
88
+ if (urlMatch)
89
+ return `PR #${urlMatch[1]}`;
90
+ return null;
91
+ }
92
+ function isMergedPullRequestSnippet(snippet) {
93
+ return /\bmerged\b/i.test(snippet) || /\blanded\b/i.test(snippet);
94
+ }
95
+ function deriveObligationMilestone(update) {
96
+ const snippet = pickUpdateSnippet(update);
97
+ const pullRequest = extractPullRequestLabel(snippet);
98
+ if (update.kind === "completed" && snippet && pullRequest && isMergedPullRequestSnippet(snippet)) {
99
+ return {
100
+ status: "updating_runtime",
101
+ currentSurface: { kind: "runtime", label: "ouro up" },
102
+ currentArtifact: pullRequest,
103
+ nextAction: "update runtime, verify version/changelog, then re-observe",
104
+ };
105
+ }
106
+ if (update.kind === "completed" && pullRequest) {
107
+ return {
108
+ status: "waiting_for_merge",
109
+ currentSurface: { kind: "merge", label: pullRequest },
110
+ currentArtifact: pullRequest,
111
+ nextAction: `wait for checks, merge ${pullRequest}, then update runtime`,
112
+ };
113
+ }
114
+ if (update.kind === "waiting_input") {
115
+ return {
116
+ status: "investigating",
117
+ currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
118
+ nextAction: `answer ${update.session.runner} ${update.session.id} and continue`,
119
+ };
120
+ }
121
+ if (update.kind === "stalled") {
122
+ return {
123
+ status: "investigating",
124
+ currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
125
+ nextAction: `unstick ${update.session.runner} ${update.session.id} and continue`,
126
+ };
127
+ }
128
+ if (update.kind === "progress" || update.kind === "spawned" || update.kind === "failed" || update.kind === "killed" || update.kind === "completed") {
129
+ return {
130
+ status: "investigating",
131
+ currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
132
+ };
133
+ }
134
+ return null;
135
+ }
52
136
  function isSafeProgressSnippet(snippet) {
137
+ const normalized = snippet.trim();
53
138
  const wordCount = snippet.split(/\s+/).filter(Boolean).length;
54
- return (snippet.length <= 80
139
+ return (normalized.length <= 80
140
+ && wordCount >= 2
55
141
  && wordCount <= 8
56
- && !snippet.includes(":")
57
- && !snippet.startsWith("**")
58
- && !/^Respond with\b/i.test(snippet)
59
- && !/^Coding session metadata\b/i.test(snippet)
60
- && !/^sessionId\b/i.test(snippet)
61
- && !/^taskRef\b/i.test(snippet)
62
- && !/^parentAgent\b/i.test(snippet));
142
+ && /[A-Za-z]{3,}/.test(normalized)
143
+ && !normalized.includes(":")
144
+ && !/[{}\[\]();]/.test(normalized)
145
+ && !normalized.startsWith("**")
146
+ && !/^Respond with\b/i.test(normalized)
147
+ && !/^Coding session metadata\b/i.test(normalized)
148
+ && !/^sessionId\b/i.test(normalized)
149
+ && !/^taskRef\b/i.test(normalized)
150
+ && !/^parentAgent\b/i.test(normalized));
63
151
  }
64
152
  function pickUpdateSnippet(update) {
65
- return (lastMeaningfulLine(update.text)
153
+ const checkpoint = update.session.checkpoint?.trim() || null;
154
+ return (checkpoint
155
+ ?? lastMeaningfulLine(update.text)
66
156
  ?? lastMeaningfulLine(update.session.stderrTail)
67
157
  ?? lastMeaningfulLine(update.session.stdoutTail));
68
158
  }
159
+ function renderValue(text) {
160
+ const trimmed = text?.trim();
161
+ return trimmed && trimmed.length > 0 ? trimmed : "(empty)";
162
+ }
163
+ function renderPath(text) {
164
+ return text && text.trim().length > 0 ? text : "(none)";
165
+ }
166
+ function formatCodingTail(session) {
167
+ const stdout = renderValue(session.stdoutTail);
168
+ const stderr = renderValue(session.stderrTail);
169
+ return [
170
+ `sessionId: ${session.id}`,
171
+ `runner: ${session.runner}`,
172
+ `status: ${session.status}`,
173
+ `checkpoint: ${renderValue(session.checkpoint ?? undefined)}`,
174
+ `artifactPath: ${renderPath(session.artifactPath)}`,
175
+ `workdir: ${session.workdir}`,
176
+ "",
177
+ "[stdout]",
178
+ stdout,
179
+ "",
180
+ "[stderr]",
181
+ stderr,
182
+ ].join("\n");
183
+ }
69
184
  function formatUpdateMessage(update) {
70
185
  const label = formatSessionLabel(update.session);
71
186
  const snippet = pickUpdateSnippet(update);
@@ -86,6 +201,22 @@ function formatUpdateMessage(update) {
86
201
  return `${label} started`;
87
202
  }
88
203
  }
204
+ function formatReportBackMessage(update, baseMessage) {
205
+ if (!baseMessage)
206
+ return null;
207
+ if (!update.session.obligationId || !update.session.originSession) {
208
+ return baseMessage;
209
+ }
210
+ const milestone = deriveObligationMilestone(update);
211
+ const extraLines = [];
212
+ if (milestone?.currentArtifact) {
213
+ extraLines.push(`current artifact: ${milestone.currentArtifact}`);
214
+ }
215
+ if (milestone?.nextAction) {
216
+ extraLines.push(`next: ${milestone.nextAction}`);
217
+ }
218
+ return extraLines.length > 0 ? `${baseMessage}\n${extraLines.join("\n")}` : baseMessage;
219
+ }
89
220
  function obligationNoteFromUpdate(update) {
90
221
  const snippet = pickUpdateSnippet(update);
91
222
  switch (update.kind) {
@@ -113,10 +244,13 @@ function syncObligationFromUpdate(update) {
113
244
  const obligationId = update.session.obligationId;
114
245
  if (!obligationId)
115
246
  return;
247
+ const milestone = deriveObligationMilestone(update);
116
248
  try {
117
249
  (0, obligations_1.advanceObligation)((0, identity_1.getAgentRoot)(), obligationId, {
118
- status: "investigating",
119
- currentSurface: { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
250
+ status: milestone?.status ?? "investigating",
251
+ currentSurface: milestone?.currentSurface ?? { kind: "coding", label: `${update.session.runner} ${update.session.id}` },
252
+ currentArtifact: milestone?.currentArtifact,
253
+ nextAction: milestone?.nextAction,
120
254
  latestNote: obligationNoteFromUpdate(update) ?? undefined,
121
255
  });
122
256
  }
@@ -124,26 +258,33 @@ function syncObligationFromUpdate(update) {
124
258
  // Detached feedback should still reach the human even if obligation sync is unavailable.
125
259
  }
126
260
  }
127
- function formatCodingTail(session) {
128
- const stdout = session.stdoutTail.trim() || "(empty)";
129
- const stderr = session.stderrTail.trim() || "(empty)";
130
- return [
131
- `sessionId: ${session.id}`,
132
- `runner: ${session.runner}`,
133
- `status: ${session.status}`,
134
- `workdir: ${session.workdir}`,
135
- "",
136
- "[stdout]",
137
- stdout,
138
- "",
139
- "[stderr]",
140
- stderr,
141
- ].join("\n");
261
+ async function requestPrivateWakeForObligation(update) {
262
+ const obligationId = update.session.obligationId;
263
+ if (!obligationId || !OBLIGATION_WAKE_UPDATE_KINDS.has(update.kind)) {
264
+ return;
265
+ }
266
+ try {
267
+ const agentName = (0, identity_1.getAgentName)();
268
+ await (0, socket_client_1.requestPrivateWake)(agentName, undefined, buildCodingFeedbackPrivateWakeOptions({ agentName, obligationId, update }));
269
+ }
270
+ catch (error) {
271
+ (0, runtime_1.emitNervesEvent)({
272
+ level: "warn",
273
+ component: "repertoire",
274
+ event: "repertoire.coding_feedback_wake_error",
275
+ message: "coding feedback wake request failed",
276
+ meta: {
277
+ sessionId: update.session.id,
278
+ kind: update.kind,
279
+ reason: error instanceof Error ? error.message : String(error),
280
+ },
281
+ });
282
+ }
142
283
  }
143
284
  function attachCodingSessionFeedback(manager, session, target) {
144
285
  let lastMessage = "";
145
286
  let closed = false;
146
- let unsubscribe = () => { };
287
+ let unsubscribe = null;
147
288
  const sendMessage = (message) => {
148
289
  if (closed || !message || message === lastMessage) {
149
290
  return;
@@ -164,17 +305,18 @@ function attachCodingSessionFeedback(manager, session, target) {
164
305
  };
165
306
  const spawnedUpdate = { kind: "spawned", session };
166
307
  syncObligationFromUpdate(spawnedUpdate);
167
- sendMessage(formatUpdateMessage(spawnedUpdate));
308
+ sendMessage(formatReportBackMessage(spawnedUpdate, formatUpdateMessage(spawnedUpdate)));
168
309
  unsubscribe = manager.subscribe(session.id, async (update) => {
169
310
  syncObligationFromUpdate(update);
170
- sendMessage(formatUpdateMessage(update));
311
+ sendMessage(formatReportBackMessage(update, formatUpdateMessage(update)));
312
+ await requestPrivateWakeForObligation(update);
171
313
  if (TERMINAL_UPDATE_KINDS.has(update.kind)) {
172
314
  closed = true;
173
- unsubscribe();
315
+ unsubscribe?.();
174
316
  }
175
317
  });
176
318
  return () => {
177
319
  closed = true;
178
- unsubscribe();
320
+ unsubscribe?.();
179
321
  };
180
322
  }
@@ -1,19 +1,27 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatCodingTail = exports.attachCodingSessionFeedback = exports.formatCodingMonitorReport = exports.CodingSessionMonitor = exports.CodingSessionManager = void 0;
3
+ exports.formatCodingTail = exports.attachCodingSessionFeedback = exports.formatCodingMonitorReport = exports.CodingSessionMonitor = exports.WorkbenchMcpClient = exports.WorkbenchCodingSessionManager = exports.CodingSessionManager = void 0;
4
4
  exports.getCodingSessionManager = getCodingSessionManager;
5
5
  exports.resetCodingSessionManager = resetCodingSessionManager;
6
6
  const runtime_1 = require("../../nerves/runtime");
7
+ const config_1 = require("../../heart/config");
8
+ const identity_1 = require("../../heart/identity");
7
9
  const manager_1 = require("./manager");
10
+ const workbench_manager_1 = require("./workbench-manager");
11
+ const workbench_client_1 = require("./workbench-client");
8
12
  let manager = null;
9
13
  function getCodingSessionManager() {
10
14
  if (!manager) {
11
- manager = new manager_1.CodingSessionManager({});
15
+ const config = (0, config_1.loadConfig)();
16
+ const backend = config.features.workbenchCoding ? "workbench" : "process";
17
+ manager = config.features.workbenchCoding
18
+ ? new workbench_manager_1.WorkbenchCodingSessionManager({ agentName: (0, identity_1.getAgentName)(), client: new workbench_client_1.WorkbenchMcpClient() })
19
+ : new manager_1.CodingSessionManager({});
12
20
  (0, runtime_1.emitNervesEvent)({
13
21
  component: "repertoire",
14
22
  event: "repertoire.coding_manager_init",
15
23
  message: "initialized coding session manager singleton",
16
- meta: {},
24
+ meta: { backend },
17
25
  });
18
26
  }
19
27
  return manager;
@@ -30,6 +38,10 @@ function resetCodingSessionManager() {
30
38
  }
31
39
  var manager_2 = require("./manager");
32
40
  Object.defineProperty(exports, "CodingSessionManager", { enumerable: true, get: function () { return manager_2.CodingSessionManager; } });
41
+ var workbench_manager_2 = require("./workbench-manager");
42
+ Object.defineProperty(exports, "WorkbenchCodingSessionManager", { enumerable: true, get: function () { return workbench_manager_2.WorkbenchCodingSessionManager; } });
43
+ var workbench_client_2 = require("./workbench-client");
44
+ Object.defineProperty(exports, "WorkbenchMcpClient", { enumerable: true, get: function () { return workbench_client_2.WorkbenchMcpClient; } });
33
45
  var monitor_1 = require("./monitor");
34
46
  Object.defineProperty(exports, "CodingSessionMonitor", { enumerable: true, get: function () { return monitor_1.CodingSessionMonitor; } });
35
47
  var reporter_1 = require("./reporter");
@@ -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);
@@ -63,6 +59,8 @@ function cloneSession(session) {
63
59
  return {
64
60
  ...session,
65
61
  originSession: session.originSession ? { ...session.originSession } : undefined,
62
+ checkpoint: session.checkpoint ?? null,
63
+ artifactPath: session.artifactPath,
66
64
  stdoutTail: session.stdoutTail,
67
65
  stderrTail: session.stderrTail,
68
66
  failure: session.failure
@@ -86,6 +84,46 @@ function appendTail(existing, nextChunk, maxLength = 2000) {
86
84
  const combined = `${existing}${nextChunk}`;
87
85
  return combined.length <= maxLength ? combined : combined.slice(combined.length - maxLength);
88
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
+ }
89
127
  function isSpawnCodingResult(value) {
90
128
  return typeof value === "object" && value !== null && "process" in value;
91
129
  }
@@ -123,6 +161,7 @@ class CodingSessionManager {
123
161
  maxRestarts;
124
162
  defaultStallThresholdMs;
125
163
  stateFilePath;
164
+ artifactDirPath;
126
165
  existsSync;
127
166
  readFileSync;
128
167
  writeFileSync;
@@ -140,8 +179,19 @@ class CodingSessionManager {
140
179
  this.writeFileSync = options.writeFileSync ?? fs.writeFileSync;
141
180
  this.mkdirSync = options.mkdirSync ?? fs.mkdirSync;
142
181
  this.pidAlive = options.pidAlive ?? isPidAlive;
143
- 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)();
144
192
  this.stateFilePath = options.stateFilePath ?? defaultStateFilePath(this.agentName);
193
+ this.artifactDirPath = options.artifactDirPath
194
+ ?? (options.stateFilePath ? path.dirname(options.stateFilePath) : defaultArtifactDirPath(this.agentName));
145
195
  this.loadPersistedState();
146
196
  }
147
197
  async spawnSession(request) {
@@ -160,8 +210,11 @@ class CodingSessionManager {
160
210
  taskRef: normalizedRequest.taskRef,
161
211
  originSession: normalizedRequest.originSession ? { ...normalizedRequest.originSession } : undefined,
162
212
  obligationId: normalizedRequest.obligationId,
213
+ evolutionCaseId: normalizedRequest.evolutionCaseId,
163
214
  scopeFile: normalizedRequest.scopeFile,
164
215
  stateFile: normalizedRequest.stateFile,
216
+ checkpoint: null,
217
+ artifactPath: this.artifactPathFor(id),
165
218
  status: "spawning",
166
219
  stdoutTail: "",
167
220
  stderrTail: "",
@@ -248,6 +301,7 @@ class CodingSessionManager {
248
301
  record.process.kill("SIGTERM");
249
302
  record.process = null;
250
303
  record.session.status = "killed";
304
+ record.session.checkpoint = "terminated by parent agent";
251
305
  record.session.endedAt = this.nowIso();
252
306
  (0, runtime_1.emitNervesEvent)({
253
307
  component: "repertoire",
@@ -270,6 +324,7 @@ class CodingSessionManager {
270
324
  continue;
271
325
  stalled += 1;
272
326
  record.session.status = "stalled";
327
+ record.session.checkpoint = deriveCheckpoint(record.session);
273
328
  (0, runtime_1.emitNervesEvent)({
274
329
  level: "warn",
275
330
  component: "repertoire",
@@ -295,6 +350,7 @@ class CodingSessionManager {
295
350
  record.process = null;
296
351
  if (record.session.status === "running" || record.session.status === "spawning") {
297
352
  record.session.status = "killed";
353
+ record.session.checkpoint = "terminated during manager shutdown";
298
354
  record.session.endedAt = this.nowIso();
299
355
  }
300
356
  }
@@ -339,6 +395,13 @@ class CodingSessionManager {
339
395
  record.session.endedAt = this.nowIso();
340
396
  updateKind = "completed";
341
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
+ }
342
405
  (0, runtime_1.emitNervesEvent)({
343
406
  component: "repertoire",
344
407
  event: "repertoire.coding_session_output",
@@ -362,12 +425,14 @@ class CodingSessionManager {
362
425
  record.session.lastSignal = signal;
363
426
  if (record.session.status === "killed" || record.session.status === "completed") {
364
427
  record.session.endedAt = this.nowIso();
428
+ record.session.checkpoint = deriveCheckpoint(record.session);
365
429
  this.persistState();
366
430
  return;
367
431
  }
368
432
  if (code === 0) {
369
433
  record.session.status = "completed";
370
434
  record.session.endedAt = this.nowIso();
435
+ record.session.checkpoint = deriveCheckpoint(record.session);
371
436
  this.persistState();
372
437
  this.notifyListeners(record.session.id, { kind: "completed", session: cloneSession(record.session) });
373
438
  return;
@@ -379,6 +444,7 @@ class CodingSessionManager {
379
444
  record.session.status = "failed";
380
445
  record.session.endedAt = this.nowIso();
381
446
  record.session.failure = defaultFailureDiagnostics(code, signal, record.command, record.args, record.stdoutTail, record.stderrTail);
447
+ record.session.checkpoint = deriveCheckpoint(record.session);
382
448
  (0, runtime_1.emitNervesEvent)({
383
449
  level: "error",
384
450
  component: "repertoire",
@@ -404,6 +470,7 @@ class CodingSessionManager {
404
470
  record.session.lastActivityAt = this.nowIso();
405
471
  record.session.endedAt = null;
406
472
  record.session.failure = null;
473
+ record.session.checkpoint = `restarted after ${reason}`;
407
474
  this.attachProcessListeners(record);
408
475
  (0, runtime_1.emitNervesEvent)({
409
476
  level: "warn",
@@ -495,9 +562,12 @@ class CodingSessionManager {
495
562
  taskRef: session.taskRef ?? normalizedRequest.taskRef,
496
563
  originSession: session.originSession ?? normalizedRequest.originSession,
497
564
  obligationId: session.obligationId ?? normalizedRequest.obligationId,
565
+ evolutionCaseId: session.evolutionCaseId ?? normalizedRequest.evolutionCaseId,
498
566
  failure: session.failure ?? null,
499
567
  stdoutTail: session.stdoutTail ?? session.failure?.stdoutTail ?? "",
500
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),
501
571
  };
502
572
  if (typeof normalizedSession.pid === "number") {
503
573
  const alive = this.pidAlive(normalizedSession.pid);
@@ -510,6 +580,7 @@ class CodingSessionManager {
510
580
  normalizedSession.pid = null;
511
581
  }
512
582
  }
583
+ normalizedSession.checkpoint = normalizedSession.checkpoint ?? deriveCheckpoint(normalizedSession);
513
584
  this.records.set(normalizedSession.id, {
514
585
  request: normalizedRequest,
515
586
  session: normalizedSession,
@@ -532,7 +603,10 @@ class CodingSessionManager {
532
603
  const payload = {
533
604
  sequence: this.sequence,
534
605
  records: [...this.records.values()].map((record) => ({
535
- request: record.request,
606
+ request: {
607
+ ...record.request,
608
+ prompt: (0, session_events_1.capStructuredRecordString)(record.request.prompt),
609
+ },
536
610
  session: record.session,
537
611
  })),
538
612
  };
@@ -549,6 +623,81 @@ class CodingSessionManager {
549
623
  meta: { path: this.stateFilePath, reason: error instanceof Error ? error.message : String(error) },
550
624
  });
551
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
+ }
552
701
  }
553
702
  }
554
703
  exports.CodingSessionManager = CodingSessionManager;