@ouro.bot/cli 0.1.0-alpha.75 → 0.1.0-alpha.750

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 (602) 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/changelog.json +4812 -16
  15. package/deploy/unraid/Dockerfile +48 -0
  16. package/deploy/unraid/README.txt +2373 -0
  17. package/deploy/unraid/audit-container-spec.sh +4 -0
  18. package/deploy/unraid/container-runtime.json +1 -0
  19. package/deploy/unraid/migrate-sanctuary-bundle.mjs +21 -0
  20. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  21. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  22. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  23. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  24. package/deploy/unraid/ouro-events/usenet-health.sh +178 -0
  25. package/deploy/unraid/sanctuary-acceptance-adapter.sh +37 -0
  26. package/deploy/unraid/sanctuary-acceptance-contract.json +201 -0
  27. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  28. package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
  29. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  30. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +1800 -0
  31. package/deploy/unraid/sanctuary-unit16-run.sh +520 -0
  32. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  33. package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
  34. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  35. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  36. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  37. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  38. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  39. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  40. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +9 -0
  41. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +9 -0
  42. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +9 -0
  43. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  44. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +23 -0
  45. package/deploy/unraid/sanctuary.xml +28 -0
  46. package/dist/a2a/card.js +57 -0
  47. package/dist/a2a/client.js +180 -0
  48. package/dist/a2a/config.js +50 -0
  49. package/dist/a2a/delegation-stores.js +56 -0
  50. package/dist/a2a/did-resolution.js +93 -0
  51. package/dist/a2a/identity.js +170 -0
  52. package/dist/a2a/inbound-share.js +107 -0
  53. package/dist/a2a/mission-result-wire.js +196 -0
  54. package/dist/a2a/onboarding.js +115 -0
  55. package/dist/a2a/pin-store.js +132 -0
  56. package/dist/a2a/seen-ledger.js +120 -0
  57. package/dist/a2a/server.js +604 -0
  58. package/dist/a2a/task-store.js +69 -0
  59. package/dist/a2a/transport.js +45 -0
  60. package/dist/a2a/types.js +3 -0
  61. package/dist/arc/attention-types.js +8 -0
  62. package/dist/arc/cares.js +278 -0
  63. package/dist/arc/episodes.js +118 -0
  64. package/dist/arc/evolution.js +490 -0
  65. package/dist/arc/flight-recorder.js +1034 -0
  66. package/dist/arc/intentions.js +134 -0
  67. package/dist/arc/json-store.js +117 -0
  68. package/dist/arc/obligations.js +386 -0
  69. package/dist/arc/packets.js +336 -0
  70. package/dist/arc/presence.js +185 -0
  71. package/dist/arc/task-lifecycle.js +57 -0
  72. package/dist/commerce/store.js +755 -0
  73. package/dist/commerce/types.js +3 -0
  74. package/dist/heart/active-work.js +820 -28
  75. package/dist/heart/agent-entry.js +190 -3
  76. package/dist/heart/approval-files.js +113 -0
  77. package/dist/heart/approval-store.js +950 -0
  78. package/dist/heart/attachments/image-normalize.js +194 -0
  79. package/dist/heart/attachments/materialize.js +97 -0
  80. package/dist/heart/attachments/originals.js +88 -0
  81. package/dist/heart/attachments/render.js +29 -0
  82. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  83. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  84. package/dist/heart/attachments/sources/index.js +16 -0
  85. package/dist/heart/attachments/store.js +103 -0
  86. package/dist/heart/attachments/types.js +93 -0
  87. package/dist/heart/auth/auth-flow.js +495 -0
  88. package/dist/heart/autonomy-budget.js +477 -0
  89. package/dist/heart/awaiting/await-alert.js +148 -0
  90. package/dist/heart/awaiting/await-expiry.js +143 -0
  91. package/dist/heart/awaiting/await-loader.js +91 -0
  92. package/dist/heart/awaiting/await-parser.js +149 -0
  93. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  94. package/dist/heart/awaiting/await-scheduler.js +382 -0
  95. package/dist/heart/background-operations.js +281 -0
  96. package/dist/heart/bridges/manager.js +137 -17
  97. package/dist/heart/bridges/store.js +14 -2
  98. package/dist/heart/bundle-state.js +168 -0
  99. package/dist/heart/commitments.js +68 -15
  100. package/dist/heart/config-registry.js +331 -0
  101. package/dist/heart/config.js +128 -129
  102. package/dist/heart/context-loss-gauntlet.js +383 -0
  103. package/dist/heart/context-loss-sentinel.js +1157 -0
  104. package/dist/heart/core.js +1761 -456
  105. package/dist/heart/cross-chat-delivery.js +9 -22
  106. package/dist/heart/daemon/agent-config-check.js +451 -0
  107. package/dist/heart/daemon/agent-discovery.js +185 -3
  108. package/dist/heart/daemon/agent-service.js +542 -0
  109. package/dist/heart/daemon/agentic-repair.js +547 -0
  110. package/dist/heart/daemon/await-private-wake.js +59 -0
  111. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  112. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  113. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  114. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  115. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  116. package/dist/heart/daemon/cadence.js +180 -0
  117. package/dist/heart/daemon/cli-defaults.js +832 -0
  118. package/dist/heart/daemon/cli-desk.js +322 -0
  119. package/dist/heart/daemon/cli-exec.js +8692 -0
  120. package/dist/heart/daemon/cli-help.js +710 -0
  121. package/dist/heart/daemon/cli-parse.js +2714 -0
  122. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  123. package/dist/heart/daemon/cli-render.js +777 -0
  124. package/dist/heart/daemon/cli-types.js +8 -0
  125. package/dist/heart/daemon/connect-bay.js +323 -0
  126. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  127. package/dist/heart/daemon/container-healthcheck.js +96 -0
  128. package/dist/heart/daemon/container-runtime.js +97 -0
  129. package/dist/heart/daemon/container-spec-auditor-main.js +160 -0
  130. package/dist/heart/daemon/container-spec-auditor.js +178 -0
  131. package/dist/heart/daemon/daemon-bootstrap-startup.js +41 -0
  132. package/dist/heart/daemon/daemon-cli.js +29 -2144
  133. package/dist/heart/daemon/daemon-entry.js +944 -10
  134. package/dist/heart/daemon/daemon-health.js +186 -0
  135. package/dist/heart/daemon/daemon-rollup.js +57 -0
  136. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  137. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  138. package/dist/heart/daemon/daemon.js +1830 -88
  139. package/dist/heart/daemon/dns-workflow.js +394 -0
  140. package/dist/heart/daemon/doctor-types.js +8 -0
  141. package/dist/heart/daemon/doctor.js +1755 -0
  142. package/dist/heart/daemon/freshness.js +345 -0
  143. package/dist/heart/daemon/habit-private-wake.js +61 -0
  144. package/dist/heart/daemon/health-monitor.js +142 -11
  145. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  146. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  147. package/dist/heart/daemon/http-health-probe.js +80 -0
  148. package/dist/heart/daemon/human-command-screens.js +234 -0
  149. package/dist/heart/daemon/human-readiness.js +114 -0
  150. package/dist/heart/daemon/inner-status.js +78 -0
  151. package/dist/heart/daemon/interactive-repair.js +394 -0
  152. package/dist/heart/daemon/launchd.js +37 -8
  153. package/dist/heart/daemon/log-tailer.js +79 -10
  154. package/dist/heart/daemon/logs-prune.js +132 -0
  155. package/dist/heart/daemon/mcp-canary.js +524 -0
  156. package/dist/heart/daemon/message-router.js +45 -5
  157. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  158. package/dist/heart/daemon/os-cron-deps.js +135 -0
  159. package/dist/heart/daemon/os-cron.js +22 -14
  160. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  161. package/dist/heart/daemon/ouro-entry.js +3 -1
  162. package/dist/heart/daemon/plugin-cli.js +432 -0
  163. package/dist/heart/daemon/process-manager.js +624 -61
  164. package/dist/heart/daemon/provider-discovery.js +137 -0
  165. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  166. package/dist/heart/daemon/prunable-bundle.js +144 -0
  167. package/dist/heart/daemon/pulse.js +511 -0
  168. package/dist/heart/daemon/readiness-repair.js +365 -0
  169. package/dist/heart/daemon/run-hooks.js +2 -0
  170. package/dist/heart/daemon/runtime-logging.js +47 -14
  171. package/dist/heart/daemon/runtime-metadata.js +2 -30
  172. package/dist/heart/daemon/runtime-mode.js +13 -2
  173. package/dist/heart/daemon/safe-mode.js +161 -0
  174. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2426 -0
  175. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1621 -0
  176. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  177. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +976 -0
  178. package/dist/heart/daemon/sanctuary-bundle-migration.js +398 -0
  179. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  180. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  181. package/dist/heart/daemon/sense-manager.js +689 -48
  182. package/dist/heart/daemon/session-id-resolver.js +131 -0
  183. package/dist/heart/daemon/skill-management-installer.js +1 -1
  184. package/dist/heart/daemon/socket-client.js +180 -12
  185. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  186. package/dist/heart/daemon/startup-tui.js +338 -0
  187. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  188. package/dist/heart/daemon/task-scheduler.js +117 -39
  189. package/dist/heart/daemon/terminal-ui.js +499 -0
  190. package/dist/heart/daemon/thoughts.js +138 -54
  191. package/dist/heart/daemon/up-progress.js +366 -0
  192. package/dist/heart/daemon/vault-items.js +56 -0
  193. package/dist/heart/delegation.js +1 -4
  194. package/dist/heart/external-events/router.js +1103 -0
  195. package/dist/heart/habits/habit-cancel.js +810 -0
  196. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  197. package/dist/heart/habits/habit-migration.js +194 -0
  198. package/dist/heart/habits/habit-parser.js +278 -0
  199. package/dist/heart/habits/habit-runtime-state.js +93 -0
  200. package/dist/heart/habits/habit-scheduler.js +653 -0
  201. package/dist/heart/habits/habit-session-summary.js +318 -0
  202. package/dist/heart/habits/habit-session.js +636 -0
  203. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  204. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  205. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  206. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  207. package/dist/heart/identity.js +184 -59
  208. package/dist/heart/kept-notes.js +289 -0
  209. package/dist/heart/kicks.js +1 -1
  210. package/dist/heart/machine-identity.js +161 -0
  211. package/dist/heart/mail-import-discovery.js +353 -0
  212. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  213. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  214. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  215. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  216. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  217. package/dist/heart/mailbox/mailbox-http.js +99 -0
  218. package/dist/heart/mailbox/mailbox-read.js +39 -0
  219. package/dist/heart/mailbox/mailbox-types.js +27 -0
  220. package/dist/heart/mailbox/mailbox-view.js +197 -0
  221. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  222. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  223. package/dist/heart/mailbox/readers/mail.js +375 -0
  224. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  225. package/dist/heart/mailbox/readers/sessions.js +232 -0
  226. package/dist/heart/mailbox/readers/shared.js +111 -0
  227. package/dist/heart/mcp/mcp-server.js +696 -0
  228. package/dist/heart/migrate-config.js +100 -0
  229. package/dist/heart/model-capabilities.js +11 -0
  230. package/dist/heart/orientation-frame.js +345 -0
  231. package/dist/heart/platform.js +81 -0
  232. package/dist/heart/primitives.js +1 -1
  233. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  234. package/dist/heart/private-runtime/index.js +18 -0
  235. package/dist/heart/private-runtime/ledger.js +218 -0
  236. package/dist/heart/private-runtime/policy.js +214 -0
  237. package/dist/heart/private-runtime/types.js +2 -0
  238. package/dist/heart/progress-story.js +1 -1
  239. package/dist/heart/provider-attempt.js +137 -0
  240. package/dist/heart/provider-binding-resolver.js +273 -0
  241. package/dist/heart/provider-credentials.js +449 -0
  242. package/dist/heart/provider-failover.js +311 -0
  243. package/dist/heart/provider-models.js +96 -0
  244. package/dist/heart/provider-ping.js +265 -0
  245. package/dist/heart/provider-readiness-cache.js +119 -0
  246. package/dist/heart/provider-visibility.js +188 -0
  247. package/dist/heart/providers/anthropic-token.js +131 -0
  248. package/dist/heart/providers/anthropic.js +173 -60
  249. package/dist/heart/providers/azure.js +23 -11
  250. package/dist/heart/providers/error-classification.js +127 -0
  251. package/dist/heart/providers/github-copilot.js +34 -38
  252. package/dist/heart/providers/minimax-vlm.js +189 -0
  253. package/dist/heart/providers/minimax.js +26 -8
  254. package/dist/heart/providers/openai-codex-token.js +349 -0
  255. package/dist/heart/providers/openai-codex.js +55 -40
  256. package/dist/heart/providers/openai-compatible.js +177 -0
  257. package/dist/heart/run-ledger.js +247 -0
  258. package/dist/heart/runtime-capability-check.js +170 -0
  259. package/dist/heart/runtime-credentials.js +607 -0
  260. package/dist/heart/runtime-cwd.js +87 -0
  261. package/dist/heart/sense-truth.js +22 -4
  262. package/dist/heart/session-activity.js +90 -24
  263. package/dist/heart/session-events.js +1318 -0
  264. package/dist/heart/session-playback-cli-main.js +5 -0
  265. package/dist/heart/session-playback-cli.js +36 -0
  266. package/dist/heart/session-playback.js +231 -0
  267. package/dist/heart/session-stats-cli-main.js +5 -0
  268. package/dist/heart/session-stats.js +182 -0
  269. package/dist/heart/session-transcript.js +133 -0
  270. package/dist/heart/start-of-turn-packet.js +368 -0
  271. package/dist/heart/steward-policy.js +302 -0
  272. package/dist/heart/streaming.js +604 -207
  273. package/dist/heart/structured-output.js +196 -0
  274. package/dist/heart/sync-classification.js +176 -0
  275. package/dist/heart/sync.js +449 -0
  276. package/dist/heart/target-resolution.js +11 -7
  277. package/dist/heart/tempo.js +93 -0
  278. package/dist/heart/temporal-view.js +41 -0
  279. package/dist/heart/timeouts.js +101 -0
  280. package/dist/heart/tool-activity-callbacks.js +59 -0
  281. package/dist/heart/tool-approval.js +342 -0
  282. package/dist/heart/tool-description.js +155 -0
  283. package/dist/heart/tool-friction.js +55 -0
  284. package/dist/heart/tool-loop.js +200 -0
  285. package/dist/heart/turn-context.js +481 -0
  286. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  287. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  288. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  289. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  290. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  291. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  292. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  293. package/dist/heart/versioning/update-hooks.js +154 -0
  294. package/dist/heart/versioning/version-intent.js +114 -0
  295. package/dist/heart/work-card.js +380 -0
  296. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  297. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  298. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  299. package/dist/mailbox-ui/index.html +16 -0
  300. package/dist/mailroom/attention.js +167 -0
  301. package/dist/mailroom/autonomy.js +209 -0
  302. package/dist/mailroom/blob-store.js +889 -0
  303. package/dist/mailroom/body-cache.js +61 -0
  304. package/dist/mailroom/cache-sync-cli.js +58 -0
  305. package/dist/mailroom/core.js +803 -0
  306. package/dist/mailroom/entry.js +160 -0
  307. package/dist/mailroom/file-store.js +568 -0
  308. package/dist/mailroom/hosted-cache-sync.js +384 -0
  309. package/dist/mailroom/mbox-import.js +393 -0
  310. package/dist/mailroom/migration.js +164 -0
  311. package/dist/mailroom/outbound.js +380 -0
  312. package/dist/mailroom/policy.js +263 -0
  313. package/dist/mailroom/reader.js +292 -0
  314. package/dist/mailroom/search-cache.js +513 -0
  315. package/dist/mailroom/search-relevance.js +319 -0
  316. package/dist/mailroom/smtp-ingress.js +176 -0
  317. package/dist/mailroom/source-state.js +176 -0
  318. package/dist/mailroom/thread.js +109 -0
  319. package/dist/mailroom/travel-extract.js +89 -0
  320. package/dist/mind/bundle-manifest.js +24 -2
  321. package/dist/mind/context.js +278 -111
  322. package/dist/mind/desk-section.js +362 -0
  323. package/dist/mind/diary-integrity.js +60 -0
  324. package/dist/mind/{memory.js → diary.js} +68 -77
  325. package/dist/mind/embedding-provider.js +60 -0
  326. package/dist/mind/file-state.js +179 -0
  327. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  328. package/dist/mind/obligation-steering.js +227 -0
  329. package/dist/mind/pending.js +34 -8
  330. package/dist/mind/prompt-budget.js +479 -0
  331. package/dist/mind/prompt-refresh.js +3 -2
  332. package/dist/mind/prompt.js +1050 -187
  333. package/dist/mind/provenance-trust.js +26 -0
  334. package/dist/mind/record-paths.js +312 -0
  335. package/dist/mind/scrutiny.js +173 -0
  336. package/dist/mind/session-transaction.js +379 -0
  337. package/dist/nerves/cli-logging.js +7 -1
  338. package/dist/nerves/coverage/audit-rules.js +15 -6
  339. package/dist/nerves/coverage/audit.js +28 -2
  340. package/dist/nerves/coverage/cli.js +1 -1
  341. package/dist/nerves/coverage/contract.js +5 -5
  342. package/dist/nerves/coverage/file-completeness.js +139 -5
  343. package/dist/nerves/coverage/run-artifacts.js +55 -35
  344. package/dist/nerves/coverage/source-scanner.js +4 -4
  345. package/dist/nerves/event-buffer.js +111 -0
  346. package/dist/nerves/index.js +293 -9
  347. package/dist/nerves/observation.js +20 -0
  348. package/dist/nerves/redact.js +79 -0
  349. package/dist/nerves/review/cli-main.js +5 -0
  350. package/dist/nerves/review/cli.js +156 -0
  351. package/dist/nerves/review/core.js +159 -0
  352. package/dist/nerves/runtime.js +17 -1
  353. package/dist/repertoire/ado-client.js +15 -56
  354. package/dist/repertoire/ado-semantic.js +16 -10
  355. package/dist/repertoire/api-client.js +97 -0
  356. package/dist/repertoire/bitwarden-store.js +1045 -0
  357. package/dist/repertoire/bundle-templates.js +71 -0
  358. package/dist/repertoire/bw-installer.js +180 -0
  359. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  360. package/dist/repertoire/coding/context-pack.js +331 -0
  361. package/dist/repertoire/coding/feedback.js +218 -30
  362. package/dist/repertoire/coding/index.js +15 -3
  363. package/dist/repertoire/coding/manager.js +166 -10
  364. package/dist/repertoire/coding/spawner.js +58 -11
  365. package/dist/repertoire/coding/tools.js +242 -14
  366. package/dist/repertoire/coding/workbench-client.js +272 -0
  367. package/dist/repertoire/coding/workbench-manager.js +346 -0
  368. package/dist/repertoire/commerce-errors.js +109 -0
  369. package/dist/repertoire/commerce-self-test.js +156 -0
  370. package/dist/repertoire/credential-access.js +178 -0
  371. package/dist/repertoire/desk/classifier.js +362 -0
  372. package/dist/repertoire/duffel-client.js +185 -0
  373. package/dist/repertoire/github-client.js +14 -55
  374. package/dist/repertoire/graph-client.js +11 -52
  375. package/dist/repertoire/guardrails.js +813 -18
  376. package/dist/repertoire/mcp-client.js +44 -3
  377. package/dist/repertoire/mcp-manager.js +259 -20
  378. package/dist/repertoire/mcp-tools.js +83 -0
  379. package/dist/repertoire/plugin-mcp.js +175 -0
  380. package/dist/repertoire/plugins.js +253 -0
  381. package/dist/repertoire/relationship-authorization.js +194 -0
  382. package/dist/repertoire/shell-sessions.js +133 -0
  383. package/dist/repertoire/skills.js +48 -4
  384. package/dist/repertoire/stripe-client.js +131 -0
  385. package/dist/repertoire/tool-arguments.js +143 -0
  386. package/dist/repertoire/tool-results.js +29 -0
  387. package/dist/repertoire/tools-a2a.js +699 -0
  388. package/dist/repertoire/tools-attachments.js +317 -0
  389. package/dist/repertoire/tools-awaiting.js +575 -0
  390. package/dist/repertoire/tools-base.js +82 -1124
  391. package/dist/repertoire/tools-bluebubbles.js +2 -0
  392. package/dist/repertoire/tools-bridge.js +144 -0
  393. package/dist/repertoire/tools-bundle.js +993 -0
  394. package/dist/repertoire/tools-commerce.js +253 -0
  395. package/dist/repertoire/tools-config.js +186 -0
  396. package/dist/repertoire/tools-continuity.js +507 -0
  397. package/dist/repertoire/tools-credential.js +383 -0
  398. package/dist/repertoire/tools-evolution.js +527 -0
  399. package/dist/repertoire/tools-files.js +344 -0
  400. package/dist/repertoire/tools-flight.js +290 -0
  401. package/dist/repertoire/tools-flow.js +119 -0
  402. package/dist/repertoire/tools-github.js +3 -8
  403. package/dist/repertoire/tools-habits.js +103 -0
  404. package/dist/repertoire/tools-mail.js +1828 -0
  405. package/dist/repertoire/tools-notes.js +485 -0
  406. package/dist/repertoire/tools-obligations.js +182 -0
  407. package/dist/repertoire/tools-orientation.js +31 -0
  408. package/dist/repertoire/tools-record.js +482 -0
  409. package/dist/repertoire/tools-rsvp.js +139 -0
  410. package/dist/repertoire/tools-runtime.js +150 -0
  411. package/dist/repertoire/tools-session.js +1096 -0
  412. package/dist/repertoire/tools-shell.js +133 -0
  413. package/dist/repertoire/tools-steward-policy.js +88 -0
  414. package/dist/repertoire/tools-stripe.js +224 -0
  415. package/dist/repertoire/tools-surface.js +355 -0
  416. package/dist/repertoire/tools-teams.js +12 -39
  417. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  418. package/dist/repertoire/tools-travel.js +125 -0
  419. package/dist/repertoire/tools-trip.js +982 -0
  420. package/dist/repertoire/tools-unraid.js +460 -0
  421. package/dist/repertoire/tools-user-profile.js +146 -0
  422. package/dist/repertoire/tools-vault.js +40 -0
  423. package/dist/repertoire/tools-voice.js +145 -0
  424. package/dist/repertoire/tools.js +371 -80
  425. package/dist/repertoire/travel-api-client.js +360 -0
  426. package/dist/repertoire/unraid-client.js +155 -0
  427. package/dist/repertoire/unraid-restart.js +212 -0
  428. package/dist/repertoire/user-profile.js +131 -0
  429. package/dist/repertoire/vault-setup.js +246 -0
  430. package/dist/repertoire/vault-unlock.js +628 -0
  431. package/dist/rsvp/aisleplanner-client.js +354 -0
  432. package/dist/rsvp/cli.js +926 -0
  433. package/dist/rsvp/config.js +327 -0
  434. package/dist/rsvp/cutover.js +433 -0
  435. package/dist/rsvp/diagnostics.js +232 -0
  436. package/dist/rsvp/diff-renderer.js +176 -0
  437. package/dist/rsvp/habit-policy.js +110 -0
  438. package/dist/rsvp/habit-stage.js +123 -0
  439. package/dist/rsvp/incident-bundle.js +97 -0
  440. package/dist/rsvp/migration.js +204 -0
  441. package/dist/rsvp/native-habit-runner.js +630 -0
  442. package/dist/rsvp/outbound-state.js +628 -0
  443. package/dist/rsvp/query.js +118 -0
  444. package/dist/rsvp/replay.js +233 -0
  445. package/dist/rsvp/snapshot.js +232 -0
  446. package/dist/rsvp/spend-ledger.js +175 -0
  447. package/dist/scripts/claude-code-hook.js +41 -0
  448. package/dist/scripts/claude-code-stop-hook.js +47 -0
  449. package/dist/senses/a2a-entry.js +115 -0
  450. package/dist/senses/attention-queue.js +186 -0
  451. package/dist/senses/await-turn-message.js +58 -0
  452. package/dist/senses/bluebubbles/active-turns.js +216 -0
  453. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  454. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  455. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  456. package/dist/senses/bluebubbles/context-packet.js +207 -0
  457. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  458. package/dist/senses/bluebubbles/entry.js +90 -0
  459. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  460. package/dist/senses/bluebubbles/index.js +3839 -0
  461. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  462. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  463. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  464. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  465. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  466. package/dist/senses/bluebubbles/processed-log.js +133 -0
  467. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  468. package/dist/senses/bluebubbles/replay.js +284 -0
  469. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  470. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  471. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  472. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  473. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  474. package/dist/senses/cli/bracketed-paste.js +82 -0
  475. package/dist/senses/cli/image-paste.js +287 -0
  476. package/dist/senses/cli/image-ref-navigation.js +75 -0
  477. package/dist/senses/cli/ink-app.js +156 -0
  478. package/dist/senses/cli/inline-diff.js +64 -0
  479. package/dist/senses/cli/input-keys.js +174 -0
  480. package/dist/senses/cli/kill-ring.js +86 -0
  481. package/dist/senses/cli/message-list.js +51 -0
  482. package/dist/senses/cli/ouro-tui.js +607 -0
  483. package/dist/senses/cli/spinner-imperative.js +135 -0
  484. package/dist/senses/cli/spinner.js +101 -0
  485. package/dist/senses/cli/status-line.js +60 -0
  486. package/dist/senses/cli/streaming-markdown.js +526 -0
  487. package/dist/senses/cli/tool-display.js +85 -0
  488. package/dist/senses/cli/tool-render.js +85 -0
  489. package/dist/senses/cli/tui-store.js +241 -0
  490. package/dist/senses/cli/virtual-list.js +35 -0
  491. package/dist/senses/cli-entry.js +60 -8
  492. package/dist/senses/cli-layout.js +100 -0
  493. package/dist/senses/cli.js +621 -321
  494. package/dist/senses/commands.js +66 -3
  495. package/dist/senses/context-packet-ledger.js +371 -0
  496. package/dist/senses/context-packets.js +154 -0
  497. package/dist/senses/habit-lifecycle-guard.js +24 -0
  498. package/dist/senses/habit-turn-message.js +160 -0
  499. package/dist/senses/ingress-evidence.js +2 -0
  500. package/dist/senses/mail-entry.js +66 -0
  501. package/dist/senses/mail.js +524 -0
  502. package/dist/senses/pipeline.js +1074 -193
  503. package/dist/senses/private-runtime-worker.js +774 -0
  504. package/dist/senses/private-runtime.js +1459 -0
  505. package/dist/senses/proactive-content-guard.js +51 -0
  506. package/dist/senses/sanctuary-grounding.js +118 -0
  507. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  508. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  509. package/dist/senses/sanctuary-health-runner.js +101 -0
  510. package/dist/senses/sanctuary-health.js +408 -0
  511. package/dist/senses/sanctuary-interactive-control.js +306 -0
  512. package/dist/senses/sanctuary-runtime.js +240 -0
  513. package/dist/senses/sanctuary-sab.js +80 -0
  514. package/dist/senses/shared-turn.js +487 -0
  515. package/dist/senses/surface-tool.js +109 -0
  516. package/dist/senses/teams-entry.js +60 -8
  517. package/dist/senses/teams.js +515 -217
  518. package/dist/senses/telegram-admission.js +695 -0
  519. package/dist/senses/telegram-approval-runtime.js +566 -0
  520. package/dist/senses/telegram-audit-ledger.js +220 -0
  521. package/dist/senses/telegram-client.js +1635 -0
  522. package/dist/senses/telegram-effect-adapter.js +787 -0
  523. package/dist/senses/telegram-entry.js +83 -0
  524. package/dist/senses/telegram.js +1914 -0
  525. package/dist/senses/trust-gate.js +104 -9
  526. package/dist/senses/voice/audio-playback.js +237 -0
  527. package/dist/senses/voice/audio-routing.js +119 -0
  528. package/dist/senses/voice/elevenlabs.js +202 -0
  529. package/dist/senses/voice/floor-control.js +431 -0
  530. package/dist/senses/voice/floor-controller.js +115 -0
  531. package/dist/senses/voice/golden-path.js +116 -0
  532. package/dist/senses/voice/index.js +29 -0
  533. package/dist/senses/voice/meeting.js +113 -0
  534. package/dist/senses/voice/outbound.js +190 -0
  535. package/dist/senses/voice/phone.js +33 -0
  536. package/dist/senses/voice/playback.js +139 -0
  537. package/dist/senses/voice/realtime-eval.js +496 -0
  538. package/dist/senses/voice/realtime-trace.js +531 -0
  539. package/dist/senses/voice/transcript.js +70 -0
  540. package/dist/senses/voice/turn.js +191 -0
  541. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  542. package/dist/senses/voice/twilio-phone.js +5081 -0
  543. package/dist/senses/voice/types.js +2 -0
  544. package/dist/senses/voice/whisper.js +161 -0
  545. package/dist/senses/voice-entry.js +81 -0
  546. package/dist/senses/voice-realtime-eval-command.js +99 -0
  547. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  548. package/dist/senses/voice-twilio-entry.js +87 -0
  549. package/dist/trips/core.js +138 -0
  550. package/dist/trips/store.js +265 -0
  551. package/dist/util/frontmatter.js +69 -0
  552. package/npm-shrinkwrap.json +8129 -0
  553. package/package.json +71 -12
  554. package/skills/agent-commerce.md +113 -0
  555. package/skills/browser-navigation.md +117 -0
  556. package/skills/commerce-setup-guide.md +116 -0
  557. package/skills/commerce-setup.md +84 -0
  558. package/skills/configure-dev-tools.md +99 -0
  559. package/skills/travel-planning.md +138 -0
  560. package/dist/heart/daemon/auth-flow.js +0 -430
  561. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  562. package/dist/heart/daemon/update-hooks.js +0 -138
  563. package/dist/heart/safe-workspace.js +0 -228
  564. package/dist/heart/session-recall.js +0 -116
  565. package/dist/mind/friends/channel.js +0 -84
  566. package/dist/mind/friends/group-context.js +0 -144
  567. package/dist/mind/friends/resolver.js +0 -84
  568. package/dist/mind/friends/store-file.js +0 -190
  569. package/dist/mind/friends/store.js +0 -4
  570. package/dist/mind/friends/tokens.js +0 -26
  571. package/dist/mind/friends/trust-explanation.js +0 -74
  572. package/dist/mind/friends/types.js +0 -29
  573. package/dist/repertoire/tasks/board.js +0 -134
  574. package/dist/repertoire/tasks/index.js +0 -224
  575. package/dist/repertoire/tasks/lifecycle.js +0 -80
  576. package/dist/repertoire/tasks/middleware.js +0 -65
  577. package/dist/repertoire/tasks/parser.js +0 -173
  578. package/dist/repertoire/tasks/scanner.js +0 -132
  579. package/dist/repertoire/tasks/transitions.js +0 -144
  580. package/dist/senses/bluebubbles-entry.js +0 -13
  581. package/dist/senses/bluebubbles.js +0 -1180
  582. package/dist/senses/debug-activity.js +0 -148
  583. package/dist/senses/inner-dialog-worker.js +0 -90
  584. package/dist/senses/inner-dialog.js +0 -509
  585. package/subagents/README.md +0 -7
  586. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  587. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  588. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  589. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  590. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  591. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  592. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  593. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  594. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  595. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  596. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  597. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  598. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  599. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  600. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  601. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  602. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,368 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.buildCapabilitiesSection = buildCapabilitiesSection;
37
+ exports.buildStartOfTurnPacket = buildStartOfTurnPacket;
38
+ exports.renderStartOfTurnPacket = renderStartOfTurnPacket;
39
+ exports.renderCompactStartOfTurnPacket = renderCompactStartOfTurnPacket;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const runtime_1 = require("../nerves/runtime");
43
+ const bundle_state_1 = require("./bundle-state");
44
+ const tempo_1 = require("./tempo");
45
+ const flight_recorder_1 = require("../arc/flight-recorder");
46
+ const context_loss_sentinel_1 = require("./context-loss-sentinel");
47
+ const orientation_frame_1 = require("./orientation-frame");
48
+ function estimateTokens(text) {
49
+ return Math.ceil(text.length / 4);
50
+ }
51
+ // --- Section builders (pure derivation from authored data, no embellishment) ---
52
+ function buildPlotLine(episodes, tempo) {
53
+ if (episodes.length === 0)
54
+ return "";
55
+ const limit = tempo === "crisis" ? 3 : tempo === "brief" ? 2 : 5;
56
+ const selected = episodes.slice(0, limit);
57
+ const lines = selected.map((ep) => {
58
+ const parts = [`- ${ep.summary}`];
59
+ if (ep.whyItMattered && tempo !== "brief") {
60
+ parts[0] += ` (${ep.whyItMattered})`;
61
+ }
62
+ return parts[0];
63
+ });
64
+ return lines.join("\n");
65
+ }
66
+ function buildObligationsSection(obligations) {
67
+ if (obligations.length === 0)
68
+ return "";
69
+ return obligations
70
+ .map((ob) => {
71
+ const parts = [`- ${ob.content}`];
72
+ if (ob.meaning?.resumeHint) {
73
+ parts.push(` [hint: ${ob.meaning.resumeHint}]`);
74
+ }
75
+ if (ob.meaning?.stalenessClass && ob.meaning.stalenessClass !== "fresh") {
76
+ parts.push(` (${ob.meaning.stalenessClass})`);
77
+ }
78
+ if (ob.meaning?.waitingOn) {
79
+ parts.push(` waiting on ${ob.meaning.waitingOn.kind}: ${ob.meaning.waitingOn.target}`);
80
+ }
81
+ return parts.join("");
82
+ })
83
+ .join("\n");
84
+ }
85
+ function buildCaresSection(cares) {
86
+ if (cares.length === 0)
87
+ return "";
88
+ return cares
89
+ .map((c) => {
90
+ const parts = [`- ${c.label}`];
91
+ if (c.salience !== "low") {
92
+ parts.push(` [${c.salience}]`);
93
+ }
94
+ if (c.currentRisk) {
95
+ parts.push(` risk: ${c.currentRisk}`);
96
+ }
97
+ return parts.join("");
98
+ })
99
+ .join("\n");
100
+ }
101
+ function buildPresenceSection(peers) {
102
+ if (peers.length === 0)
103
+ return "";
104
+ return peers
105
+ .map((p) => `- ${p.agentName}: ${p.availability}/${p.lane}`)
106
+ .join("\n");
107
+ }
108
+ function buildResumeHint(view, obligations) {
109
+ // Compose from authored obligation resumeHints and top intentions
110
+ const hints = [];
111
+ const effectiveObligations = obligations ?? view.activeObligations;
112
+ for (const ob of effectiveObligations) {
113
+ if (ob.meaning?.resumeHint) {
114
+ hints.push(ob.meaning.resumeHint);
115
+ }
116
+ }
117
+ for (const intent of view.openIntentions.slice(0, 3)) {
118
+ hints.push(intent.content);
119
+ }
120
+ if (hints.length === 0) {
121
+ // Fall back to top obligation content
122
+ if (effectiveObligations.length > 0) {
123
+ hints.push(effectiveObligations[0].content);
124
+ }
125
+ }
126
+ if (hints.length === 0)
127
+ return "";
128
+ return hints.join("; ");
129
+ }
130
+ /**
131
+ * Build a compact summary of capability changes between runtime versions.
132
+ * Reads bundle-meta.json for version info and changelog.json for change descriptions.
133
+ * Returns undefined if no version change detected or files are missing/malformed.
134
+ */
135
+ function buildCapabilitiesSection(bundleRoot) {
136
+ let meta;
137
+ try {
138
+ const raw = fs.readFileSync(path.join(bundleRoot, "bundle-meta.json"), "utf-8");
139
+ meta = JSON.parse(raw);
140
+ }
141
+ catch {
142
+ (0, runtime_1.emitNervesEvent)({
143
+ component: "heart",
144
+ event: "heart.capabilities_check",
145
+ message: "bundle-meta.json missing or malformed",
146
+ meta: { bundleRoot },
147
+ });
148
+ return undefined;
149
+ }
150
+ const currentVersion = meta.runtimeVersion;
151
+ const previousVersion = meta.previousRuntimeVersion;
152
+ if (typeof currentVersion !== "string" || typeof previousVersion !== "string") {
153
+ return undefined;
154
+ }
155
+ if (currentVersion === previousVersion) {
156
+ return undefined;
157
+ }
158
+ (0, runtime_1.emitNervesEvent)({
159
+ component: "heart",
160
+ event: "heart.capabilities_version_change",
161
+ message: `runtime version changed from ${previousVersion} to ${currentVersion}`,
162
+ meta: { previousVersion, currentVersion },
163
+ });
164
+ let changelog;
165
+ try {
166
+ const raw = fs.readFileSync(path.join(bundleRoot, "changelog.json"), "utf-8");
167
+ changelog = JSON.parse(raw);
168
+ }
169
+ catch {
170
+ // changelog missing -- still report the version change
171
+ }
172
+ const parts = [`Updated from ${previousVersion} to ${currentVersion}`];
173
+ if (changelog && Array.isArray(changelog)) {
174
+ const relevantChanges = [];
175
+ for (const entry of changelog) {
176
+ if (entry.version === previousVersion)
177
+ break;
178
+ if (Array.isArray(entry.changes)) {
179
+ relevantChanges.push(...entry.changes);
180
+ }
181
+ }
182
+ if (relevantChanges.length > 0) {
183
+ parts.push(`: ${relevantChanges.join("; ")}`);
184
+ }
185
+ }
186
+ return parts.join("");
187
+ }
188
+ function buildStartOfTurnPacket(view, opts) {
189
+ const tempo = view.tempo;
190
+ const tokenBudget = tempo_1.TEMPO_BUDGETS[tempo];
191
+ const effectiveObligations = opts?.canonicalObligations ? opts.canonicalObligations.all : view.activeObligations;
192
+ const packet = {
193
+ plotLine: buildPlotLine(view.recentEpisodes, tempo),
194
+ obligations: buildObligationsSection(effectiveObligations),
195
+ cares: buildCaresSection(view.activeCares),
196
+ presence: buildPresenceSection(view.peerPresence),
197
+ arcResume: opts?.flightRecorderResume ? (0, flight_recorder_1.formatFlightRecorderResume)(opts.flightRecorderResume) : undefined,
198
+ recoverySentinel: opts?.recoverySentinel,
199
+ resumeHint: buildResumeHint(view, opts?.canonicalObligations ? effectiveObligations : undefined),
200
+ currentSessionTiming: opts?.currentSessionTiming,
201
+ friendContactTiming: opts?.friendContactTiming,
202
+ tempo,
203
+ tokenBudget,
204
+ assembledAt: new Date().toISOString(),
205
+ };
206
+ (0, runtime_1.emitNervesEvent)({
207
+ component: "heart",
208
+ event: "heart.start_of_turn_packet_built",
209
+ message: `start-of-turn packet built: tempo=${tempo}`,
210
+ meta: {
211
+ tempo,
212
+ plotLineTokens: estimateTokens(packet.plotLine),
213
+ obligationsTokens: estimateTokens(packet.obligations),
214
+ caresTokens: estimateTokens(packet.cares),
215
+ presenceTokens: estimateTokens(packet.presence),
216
+ resumeHintTokens: estimateTokens(packet.resumeHint),
217
+ },
218
+ });
219
+ return packet;
220
+ }
221
+ /**
222
+ * Renders a start-of-turn packet to prompt text, respecting token budget.
223
+ * Truncation priority (last truncated first):
224
+ * resumeHint (PROTECTED) > obligations > cares > plotLine > presence
225
+ * So presence is truncated first, then plotLine, then cares, then obligations.
226
+ * resumeHint is never truncated.
227
+ */
228
+ function renderStartOfTurnPacket(packet, options = {}) {
229
+ const budget = packet.tokenBudget;
230
+ const resumePriorWork = options.resumePriorWork === true;
231
+ // Assemble sections in priority order (highest priority first for budget allocation)
232
+ // Each section is { label, content, priority } where lower priority number = truncated first
233
+ const sections = [
234
+ // bundleState and syncFailure share the top remediation tier — both
235
+ // are actionable "fix your git" signals. bundleState is preferred
236
+ // because it's structured (array of enum values) while syncFailure is
237
+ // a legacy free-form string; both render when populated.
238
+ { label: "provider", content: packet.providerSelection ?? "", priority: 8 },
239
+ { label: "bundleState", content: (0, bundle_state_1.renderBundleStateHint)(packet.bundleState ?? []), priority: 7 },
240
+ { label: "syncFailure", content: packet.syncFailure ?? "", priority: 7 },
241
+ { label: "arc", content: packet.arcResume ?? "", priority: 7 },
242
+ { label: "recoverySentinel", content: packet.recoverySentinel ? (0, context_loss_sentinel_1.formatContextLossSentinelText)(packet.recoverySentinel) : "", priority: 7 },
243
+ { label: "resume", content: packet.resumeHint, priority: 6 },
244
+ { label: "friendContact", content: packet.friendContactTiming ?? "", priority: 6 },
245
+ { label: "sessionTiming", content: packet.currentSessionTiming ?? "", priority: 5 },
246
+ { label: "obligations", content: packet.obligations, priority: 5 },
247
+ { label: "cares", content: packet.cares, priority: 4 },
248
+ { label: "plot", content: packet.plotLine, priority: 3 },
249
+ { label: "capabilities", content: packet.capabilities ?? "", priority: 2 },
250
+ { label: "presence", content: packet.presence, priority: 1 },
251
+ ].filter((s) => s.content.length > 0);
252
+ if (sections.length === 0) {
253
+ (0, runtime_1.emitNervesEvent)({
254
+ component: "heart",
255
+ event: "heart.start_of_turn_packet_rendered",
256
+ message: "start-of-turn packet rendered: empty",
257
+ meta: { tokens: 0, tempo: packet.tempo },
258
+ });
259
+ return "";
260
+ }
261
+ // Build the rendered output, truncating lower-priority sections first
262
+ let rendered = formatSections(sections, resumePriorWork);
263
+ let tokens = estimateTokens(rendered);
264
+ // Truncate sections from lowest priority until we fit budget
265
+ const sortedByPriority = [...sections].sort((a, b) => a.priority - b.priority);
266
+ for (const section of sortedByPriority) {
267
+ if (tokens <= budget.max)
268
+ break;
269
+ // Skip continuity sections — they are protected.
270
+ if (section.label === "resume" || section.label === "arc" || section.label === "recoverySentinel" || section.label === "friendContact" || section.label === "sessionTiming")
271
+ continue;
272
+ // Remove this section entirely
273
+ const idx = sections.findIndex((s) => s.label === section.label);
274
+ sections.splice(idx, 1);
275
+ rendered = formatSections(sections, resumePriorWork);
276
+ tokens = estimateTokens(rendered);
277
+ }
278
+ // If still over budget after removing all non-protected sections, trim what's left
279
+ if (tokens > budget.max) {
280
+ const maxChars = budget.max * 4;
281
+ rendered = rendered.slice(0, maxChars);
282
+ }
283
+ (0, runtime_1.emitNervesEvent)({
284
+ component: "heart",
285
+ event: "heart.start_of_turn_packet_rendered",
286
+ message: `start-of-turn packet rendered: ${tokens} tokens`,
287
+ meta: { tokens, tempo: packet.tempo, sectionCount: sections.length },
288
+ });
289
+ return rendered;
290
+ }
291
+ function formatSections(sections, resumePriorWork) {
292
+ const parts = [];
293
+ for (const section of sections) {
294
+ switch (section.label) {
295
+ case "resume":
296
+ parts.push((0, orientation_frame_1.labelPriorWorkSurface)(`**Next:**\n${section.content}`, resumePriorWork));
297
+ break;
298
+ case "arc":
299
+ parts.push((0, orientation_frame_1.labelPriorWorkSurface)(`**Arc:**\n${section.content}`, resumePriorWork));
300
+ break;
301
+ case "recoverySentinel":
302
+ parts.push((0, orientation_frame_1.labelPriorWorkSurface)(`**Recovery Sentinel:**\n${section.content}`, resumePriorWork));
303
+ break;
304
+ case "sessionTiming":
305
+ parts.push(`**Thread timing:** ${section.content}`);
306
+ break;
307
+ case "friendContact":
308
+ parts.push(`**Recent contact:** ${section.content}`);
309
+ break;
310
+ case "obligations":
311
+ parts.push((0, orientation_frame_1.labelPriorWorkSurface)(`**Owed:**\n${section.content}`, resumePriorWork));
312
+ break;
313
+ case "cares":
314
+ parts.push(`**Cares:**\n${section.content}`);
315
+ break;
316
+ case "plot":
317
+ parts.push(`**Recent:**\n${section.content}`);
318
+ break;
319
+ case "presence":
320
+ parts.push(`**Peers:**\n${section.content}`);
321
+ break;
322
+ case "capabilities":
323
+ parts.push(`**Capabilities:** ${section.content}`);
324
+ break;
325
+ case "syncFailure":
326
+ parts.push(`**Sync warning:** ${section.content}`);
327
+ break;
328
+ case "bundleState":
329
+ parts.push(`**Bundle:** ${section.content}`);
330
+ break;
331
+ case "provider":
332
+ parts.push(`**Provider:**\n${section.content}`);
333
+ break;
334
+ }
335
+ }
336
+ return parts.join("\n\n");
337
+ }
338
+ /**
339
+ * Ultra-compact version for coding context (max 200 tokens).
340
+ * Just resumeHint + top obligation + top care, single-line bullets.
341
+ */
342
+ function renderCompactStartOfTurnPacket(packet, options = {}) {
343
+ const parts = [];
344
+ const instruction = (0, orientation_frame_1.priorWorkInstruction)(options.resumePriorWork === true);
345
+ if (packet.resumeHint) {
346
+ parts.push(`next:\n${instruction}\n${packet.resumeHint}`);
347
+ }
348
+ if (packet.obligations) {
349
+ // Just first line of obligations
350
+ const firstOb = packet.obligations.split("\n")[0];
351
+ parts.push(`owed:\n${instruction}\n${firstOb.replace(/^- /, "")}`);
352
+ }
353
+ if (packet.cares) {
354
+ const firstCare = packet.cares.split("\n")[0];
355
+ parts.push(`care: ${firstCare.replace(/^- /, "")}`);
356
+ }
357
+ const compact = parts.join(" | ");
358
+ // Hard cap at 200 tokens (800 chars)
359
+ const maxChars = 200 * 4;
360
+ const result = compact.length > maxChars ? compact.slice(0, maxChars) : compact;
361
+ (0, runtime_1.emitNervesEvent)({
362
+ component: "heart",
363
+ event: "heart.start_of_turn_packet_compact_rendered",
364
+ message: `compact start-of-turn packet: ${estimateTokens(result)} tokens`,
365
+ meta: { tokens: estimateTokens(result) },
366
+ });
367
+ return result;
368
+ }
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.readStewardPolicy = readStewardPolicy;
37
+ exports.updateStewardPolicy = updateStewardPolicy;
38
+ exports.readRoutineActionReceipts = readRoutineActionReceipts;
39
+ exports.inspectRoutineActionGrant = inspectRoutineActionGrant;
40
+ exports.consumeRoutineActionGrant = consumeRoutineActionGrant;
41
+ exports.transitionRoutineActionReceipt = transitionRoutineActionReceipt;
42
+ exports.recoverRoutineActionReceipts = recoverRoutineActionReceipts;
43
+ const fs = __importStar(require("node:fs"));
44
+ const path = __importStar(require("node:path"));
45
+ const node_crypto_1 = require("node:crypto");
46
+ const runtime_1 = require("../nerves/runtime");
47
+ const session_transaction_1 = require("../mind/session-transaction");
48
+ const EMPTY_POLICY = { schemaVersion: 1, version: 0, desiredStates: {}, routineActionGrants: {}, updatedAt: null };
49
+ function policyDir(agentRoot) {
50
+ return path.join(agentRoot, "state", "policy");
51
+ }
52
+ function policyPath(agentRoot) {
53
+ return path.join(policyDir(agentRoot), "steward.json");
54
+ }
55
+ function receiptsPath(agentRoot) {
56
+ return path.join(policyDir(agentRoot), "action-receipts.ndjson");
57
+ }
58
+ function auditPath(agentRoot) {
59
+ return path.join(policyDir(agentRoot), "policy-audit.ndjson");
60
+ }
61
+ function ensureDirectory(agentRoot) {
62
+ fs.mkdirSync(policyDir(agentRoot), { recursive: true, mode: 0o700 });
63
+ fs.chmodSync(policyDir(agentRoot), 0o700);
64
+ }
65
+ function appendReceipt(filePath, value) {
66
+ const creating = !fs.existsSync(filePath);
67
+ const fd = fs.openSync(filePath, "a", 0o600);
68
+ try {
69
+ fs.writeFileSync(fd, `${JSON.stringify(value)}\n`, "utf8");
70
+ fs.fsyncSync(fd);
71
+ }
72
+ finally {
73
+ fs.closeSync(fd);
74
+ }
75
+ fs.chmodSync(filePath, 0o600);
76
+ if (creating) {
77
+ const directory = fs.openSync(path.dirname(filePath), fs.constants.O_RDONLY | fs.constants.O_DIRECTORY | fs.constants.O_NOFOLLOW);
78
+ try {
79
+ fs.fsyncSync(directory);
80
+ }
81
+ finally {
82
+ fs.closeSync(directory);
83
+ }
84
+ }
85
+ }
86
+ function requireText(value, label) {
87
+ const result = value.trim();
88
+ if (!result)
89
+ throw new Error(`${label} must be nonempty`);
90
+ return result;
91
+ }
92
+ function optionalExpiry(value, now) {
93
+ if (!value)
94
+ return undefined;
95
+ const epoch = Date.parse(value);
96
+ if (!Number.isFinite(epoch) || new Date(epoch).toISOString() !== value || epoch <= Date.parse(now))
97
+ throw new Error("policy expiry must be a future canonical timestamp");
98
+ return value;
99
+ }
100
+ function validateStewardPolicy(value) {
101
+ if (!value || typeof value !== "object" || Array.isArray(value))
102
+ throw new Error("steward policy is invalid");
103
+ const candidate = value;
104
+ if (candidate.schemaVersion !== 1 || !Number.isInteger(candidate.version) || candidate.version < 0 || typeof candidate.desiredStates !== "object" || !candidate.desiredStates || typeof candidate.routineActionGrants !== "object" || !candidate.routineActionGrants) {
105
+ throw new Error("steward policy is invalid");
106
+ }
107
+ return candidate;
108
+ }
109
+ function readStewardPolicy(agentRoot) {
110
+ const filePath = policyPath(agentRoot);
111
+ if (!fs.existsSync(filePath))
112
+ return structuredClone(EMPTY_POLICY);
113
+ return validateStewardPolicy(JSON.parse(fs.readFileSync(filePath, "utf8")));
114
+ }
115
+ function updateStewardPolicy(agentRoot, input) {
116
+ if (input.actor.trustLevel !== "family")
117
+ throw new Error("steward policy mutation requires family authority");
118
+ const authorizingSessionEvent = requireText(input.actor.sessionEventId, "authorizing session event");
119
+ const issuer = requireText(input.actor.friendId, "issuer");
120
+ return (0, session_transaction_1.withImmediateSessionTurnLease)(policyPath(agentRoot), (lease) => {
121
+ const snapshot = (0, session_transaction_1.readSessionTransaction)(policyPath(agentRoot), lease);
122
+ const current = snapshot.value === null ? structuredClone(EMPTY_POLICY) : validateStewardPolicy(snapshot.value);
123
+ if (current.version !== input.expectedVersion)
124
+ throw new Error(`steward policy version changed: expected ${input.expectedVersion}, got ${current.version}`);
125
+ const now = input.now ?? new Date().toISOString();
126
+ const expiresAt = optionalExpiry(input.mutation.expiresAt, now);
127
+ const version = current.version + 1;
128
+ const next = { ...current, version, desiredStates: { ...current.desiredStates }, routineActionGrants: { ...current.routineActionGrants }, updatedAt: now };
129
+ if (input.mutation.kind === "set_desired_state") {
130
+ next.desiredStates[requireText(input.mutation.key, "desired state key")] = {
131
+ value: requireText(input.mutation.value, "desired state value"),
132
+ provenance: input.mutation.provenance,
133
+ version,
134
+ source: requireText(input.mutation.source, "desired state source"),
135
+ ...(expiresAt ? { expiresAt } : {}),
136
+ };
137
+ }
138
+ else {
139
+ if (input.mutation.provenance !== "stated" && input.mutation.provenance !== "installed_explicit_policy")
140
+ throw new Error("routine action grants require explicit authority");
141
+ if (!Number.isInteger(input.mutation.maxCount) || input.mutation.maxCount < 1 || !Number.isFinite(input.mutation.windowMs) || input.mutation.windowMs <= 0)
142
+ throw new Error("routine action grant bounds are invalid");
143
+ if (!input.mutation.verificationRequired)
144
+ throw new Error("routine action grants require post-action verification");
145
+ const targets = [...new Set(input.mutation.targets.map((value) => requireText(value, "routine action target")))];
146
+ if (targets.length === 0)
147
+ throw new Error("routine action grant requires a target");
148
+ next.routineActionGrants[requireText(input.mutation.key, "routine action key")] = {
149
+ action: requireText(input.mutation.action, "routine action"), targets, maxCount: input.mutation.maxCount, windowMs: input.mutation.windowMs,
150
+ verificationRequired: input.mutation.verificationRequired, exclusions: [...new Set(input.mutation.exclusions)], provenance: input.mutation.provenance,
151
+ issuer, authorizedAt: now, authorizingSessionEvent, version, ...(expiresAt ? { expiresAt } : {}),
152
+ };
153
+ }
154
+ ensureDirectory(agentRoot);
155
+ (0, session_transaction_1.writeSessionTransaction)(policyPath(agentRoot), next, { lease, expectedRevision: snapshot.revision });
156
+ appendReceipt(auditPath(agentRoot), { schemaVersion: 1, policyVersion: version, issuer, authorizingSessionEvent, mutationKind: input.mutation.kind, at: now });
157
+ (0, runtime_1.emitNervesEvent)({ component: "heart", event: "heart.steward_policy_updated", message: "updated steward policy", meta: { version, mutationKind: input.mutation.kind, issuer } });
158
+ return next;
159
+ });
160
+ }
161
+ function readActionReceiptHistory(agentRoot) {
162
+ const filePath = receiptsPath(agentRoot);
163
+ if (!fs.existsSync(filePath))
164
+ return [];
165
+ return fs.readFileSync(filePath, "utf8").split("\n").filter(Boolean).map((line) => JSON.parse(line));
166
+ }
167
+ function readRoutineActionReceipts(agentRoot) {
168
+ const latest = new Map();
169
+ for (const receipt of readActionReceiptHistory(agentRoot))
170
+ latest.set(receipt.id, receipt);
171
+ return [...latest.values()];
172
+ }
173
+ function expectedOff(policy, target, now) {
174
+ const desired = policy.desiredStates[`container:${target}`];
175
+ if (!desired || (desired.expiresAt && Date.parse(desired.expiresAt) <= Date.parse(now)))
176
+ return false;
177
+ return /^(?:off|disabled|paused|intentionally_off|intentionally_paused)$/u.test(desired.value.trim().toLowerCase());
178
+ }
179
+ const UNRESOLVED_ACTION_STATES = new Set(["reserved", "attempting", "effect_acknowledged", "recovery_pending", "indeterminate"]);
180
+ function inspectRoutineActionGrantSnapshot(policy, receipts, input) {
181
+ if (input.expectedPolicyVersion !== undefined && policy.version !== input.expectedPolicyVersion)
182
+ return { allowed: false, reason: "routine action policy version changed" };
183
+ const grant = policy.routineActionGrants[input.key];
184
+ if (!grant)
185
+ return { allowed: false, reason: "routine action grant is missing" };
186
+ if (grant.action !== input.action)
187
+ return { allowed: false, reason: "routine action does not match the grant" };
188
+ if (!grant.targets.includes(input.target) || grant.exclusions.includes(input.target))
189
+ return { allowed: false, reason: "routine action target is not authorized" };
190
+ const now = input.now ?? new Date().toISOString();
191
+ if (grant.expiresAt && Date.parse(grant.expiresAt) <= Date.parse(now))
192
+ return { allowed: false, reason: "routine action grant expired" };
193
+ if (expectedOff(policy, input.target, now))
194
+ return { allowed: false, reason: "container is expected off" };
195
+ if (receipts.some((receipt) => receipt.action === input.action && receipt.target === input.target && UNRESOLVED_ACTION_STATES.has(receipt.state))) {
196
+ return { allowed: false, reason: "routine action has an unresolved receipt for this target" };
197
+ }
198
+ return { allowed: true, policyVersion: policy.version, grantVersion: grant.version, key: input.key, action: grant.action, target: input.target };
199
+ }
200
+ function inspectRoutineActionGrant(agentRoot, input) {
201
+ try {
202
+ const policy = readStewardPolicy(agentRoot);
203
+ return inspectRoutineActionGrantSnapshot(policy, readRoutineActionReceipts(agentRoot), input);
204
+ }
205
+ catch (error) {
206
+ return { allowed: false, reason: error instanceof Error ? error.message : "routine action policy is unavailable" };
207
+ }
208
+ }
209
+ function consumeRoutineActionGrant(agentRoot, input) {
210
+ return (0, session_transaction_1.withImmediateSessionTurnLease)(policyPath(agentRoot), (lease) => {
211
+ const snapshot = (0, session_transaction_1.readSessionTransaction)(policyPath(agentRoot), lease);
212
+ const policy = snapshot.value === null ? structuredClone(EMPTY_POLICY) : validateStewardPolicy(snapshot.value);
213
+ const grant = policy.routineActionGrants[input.key];
214
+ const now = input.now ?? new Date().toISOString();
215
+ const action = input.action ?? grant?.action ?? "";
216
+ const receipts = readRoutineActionReceipts(agentRoot);
217
+ const decision = inspectRoutineActionGrantSnapshot(policy, receipts, { key: input.key, action, target: input.target, expectedPolicyVersion: input.expectedPolicyVersion, now });
218
+ if (!decision.allowed)
219
+ throw new Error(decision.reason);
220
+ ensureDirectory(agentRoot);
221
+ const windowStart = Date.parse(now) - grant.windowMs;
222
+ const used = receipts.filter((receipt) => receipt.key === input.key && Date.parse(receipt.reservedAt) > windowStart).length;
223
+ if (used >= grant.maxCount)
224
+ throw new Error("routine action rate limit reached");
225
+ const id = `action-${(0, node_crypto_1.randomUUID)()}`;
226
+ const receipt = {
227
+ schemaVersion: 2,
228
+ id,
229
+ state: "reserved",
230
+ key: input.key,
231
+ action,
232
+ target: input.target,
233
+ policyVersion: policy.version,
234
+ grantVersion: grant.version,
235
+ reservedAt: now,
236
+ updatedAt: now,
237
+ authorizationReceiptId: input.authorizationReceiptId ?? `policy-${grant.issuer}-${grant.authorizingSessionEvent}`,
238
+ authorizationVersion: input.authorizationVersion ?? grant.version,
239
+ attemptId: input.attemptId ?? `attempt-${(0, node_crypto_1.randomUUID)()}`,
240
+ attempt: 1,
241
+ expectedBeforeState: input.expectedBeforeState ?? null,
242
+ resolvedTarget: input.resolvedTarget ?? { id: "unresolved", name: input.target },
243
+ effect: input.effect ?? { operation: action, targetId: input.resolvedTarget?.id ?? "unresolved" },
244
+ effectReceipt: null,
245
+ verifiedAfterState: null,
246
+ recoveryState: { state: "not_needed", compensation: "none" },
247
+ };
248
+ appendReceipt(receiptsPath(agentRoot), receipt);
249
+ (0, runtime_1.emitNervesEvent)({ component: "heart", event: "heart.routine_action_reserved", message: "reserved routine action grant", meta: { key: input.key, target: input.target, policyVersion: policy.version } });
250
+ return receipt;
251
+ });
252
+ }
253
+ function transitionRoutineActionReceipt(agentRoot, input) {
254
+ return (0, session_transaction_1.withImmediateSessionTurnLease)(policyPath(agentRoot), () => {
255
+ const current = readRoutineActionReceipts(agentRoot).find((receipt) => receipt.id === input.id);
256
+ if (!current)
257
+ throw new Error("routine action receipt is missing");
258
+ if (current.state !== input.expectedState)
259
+ throw new Error(`routine action receipt state changed: expected ${input.expectedState}, got ${current.state}`);
260
+ const now = input.at ?? new Date().toISOString();
261
+ const recoveryState = input.recoveryState ?? current.recoveryState;
262
+ const next = {
263
+ ...current,
264
+ state: input.state,
265
+ updatedAt: now,
266
+ ...(input.effectReceipt !== undefined ? { effectReceipt: input.effectReceipt } : {}),
267
+ ...(input.verifiedAfterState !== undefined ? { verifiedAfterState: input.verifiedAfterState } : {}),
268
+ recoveryState,
269
+ };
270
+ appendReceipt(receiptsPath(agentRoot), next);
271
+ (0, runtime_1.emitNervesEvent)({ component: "heart", event: "heart.routine_action_transitioned", message: "transitioned routine action receipt", meta: { id: next.id, state: next.state, target: next.target } });
272
+ return next;
273
+ });
274
+ }
275
+ async function recoverRoutineActionReceipts(agentRoot, options) {
276
+ const recovered = [];
277
+ for (const receipt of readRoutineActionReceipts(agentRoot)) {
278
+ if (receipt.state === "reserved") {
279
+ recovered.push(transitionRoutineActionReceipt(agentRoot, { id: receipt.id, expectedState: "reserved", state: "recovered_no_effect", recoveryState: { state: "completed", compensation: "none" } }));
280
+ continue;
281
+ }
282
+ if (receipt.state === "attempting") {
283
+ recovered.push(transitionRoutineActionReceipt(agentRoot, { id: receipt.id, expectedState: "attempting", state: "indeterminate", recoveryState: { state: "manual_inspection_required", compensation: "none" } }));
284
+ continue;
285
+ }
286
+ if (receipt.state !== "effect_acknowledged" && receipt.state !== "recovery_pending")
287
+ continue;
288
+ const pending = receipt.state === "effect_acknowledged"
289
+ ? transitionRoutineActionReceipt(agentRoot, { id: receipt.id, expectedState: "effect_acknowledged", state: "recovery_pending", recoveryState: { state: "pending", compensation: "none" } })
290
+ : receipt;
291
+ options.afterRecoveryClaim?.(pending);
292
+ const observed = await options.observeTarget(pending.resolvedTarget);
293
+ if (observed.id === pending.resolvedTarget.id && observed.name === pending.resolvedTarget.name && observed.state === "running") {
294
+ recovered.push(transitionRoutineActionReceipt(agentRoot, { id: pending.id, expectedState: "recovery_pending", state: "verified", verifiedAfterState: observed.state, recoveryState: { state: "completed", compensation: "none" } }));
295
+ }
296
+ else {
297
+ recovered.push(transitionRoutineActionReceipt(agentRoot, { id: pending.id, expectedState: "recovery_pending", state: "indeterminate", recoveryState: { state: "manual_inspection_required", compensation: "none" } }));
298
+ }
299
+ }
300
+ (0, runtime_1.emitNervesEvent)({ component: "heart", event: "heart.routine_action_recovery", message: "reconciled interrupted routine action receipts", meta: { recoveredCount: recovered.length } });
301
+ return recovered;
302
+ }