@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
@@ -0,0 +1,134 @@
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.captureIntention = captureIntention;
37
+ exports.readOpenIntentions = readOpenIntentions;
38
+ exports.resolveIntention = resolveIntention;
39
+ exports.dismissIntention = dismissIntention;
40
+ const path = __importStar(require("path"));
41
+ const session_events_1 = require("../heart/session-events");
42
+ const runtime_1 = require("../nerves/runtime");
43
+ const json_store_1 = require("./json-store");
44
+ function intentionsDir(agentRoot) {
45
+ return path.join(agentRoot, "arc", "intentions");
46
+ }
47
+ const SALIENCE_ORDER = {
48
+ high: 3,
49
+ medium: 2,
50
+ low: 1,
51
+ };
52
+ function salienceRank(salience) {
53
+ if (!salience)
54
+ return 0;
55
+ return SALIENCE_ORDER[salience] ?? 0;
56
+ }
57
+ function captureIntention(agentRoot, input) {
58
+ const now = new Date().toISOString();
59
+ const id = (0, json_store_1.generateTimestampId)("int");
60
+ const intention = {
61
+ id,
62
+ content: (0, session_events_1.capStructuredRecordString)(input.content),
63
+ status: "open",
64
+ createdAt: now,
65
+ updatedAt: now,
66
+ ...(input.salience ? { salience: input.salience } : {}),
67
+ source: input.source,
68
+ ...(input.relatedFriendId ? { relatedFriendId: input.relatedFriendId } : {}),
69
+ ...(input.relatedObligationId ? { relatedObligationId: input.relatedObligationId } : {}),
70
+ ...(input.relatedCareId ? { relatedCareId: input.relatedCareId } : {}),
71
+ ...(input.nudgeAfter ? { nudgeAfter: input.nudgeAfter } : {}),
72
+ };
73
+ (0, json_store_1.writeJsonFile)(intentionsDir(agentRoot), id, intention);
74
+ (0, runtime_1.emitNervesEvent)({
75
+ component: "heart",
76
+ event: "heart.intention_captured",
77
+ message: `intention captured: ${input.content.slice(0, 60)}`,
78
+ meta: { intentionId: id, source: input.source, salience: input.salience },
79
+ });
80
+ return intention;
81
+ }
82
+ function readOpenIntentions(agentRoot, options) {
83
+ const dir = intentionsDir(agentRoot);
84
+ const all = (0, json_store_1.readJsonDir)(dir);
85
+ const limit = options?.limit ?? 20;
86
+ const intentions = all.filter((i) => i.status === "open");
87
+ // Sort by salience descending, then createdAt descending
88
+ intentions.sort((a, b) => {
89
+ const salienceDiff = salienceRank(b.salience) - salienceRank(a.salience);
90
+ if (salienceDiff !== 0)
91
+ return salienceDiff;
92
+ return b.createdAt.localeCompare(a.createdAt);
93
+ });
94
+ const result = intentions.slice(0, limit);
95
+ (0, runtime_1.emitNervesEvent)({
96
+ component: "heart",
97
+ event: "heart.intentions_read",
98
+ message: `read ${result.length} open intentions`,
99
+ meta: { count: result.length, total: intentions.length, limit },
100
+ });
101
+ return result;
102
+ }
103
+ function readIntentionFile(agentRoot, id) {
104
+ return (0, json_store_1.readJsonFileOrThrow)(intentionsDir(agentRoot), id, "Intention");
105
+ }
106
+ function writeIntentionFile(agentRoot, intention) {
107
+ (0, json_store_1.writeJsonFile)(intentionsDir(agentRoot), intention.id, intention);
108
+ }
109
+ function resolveIntention(agentRoot, id) {
110
+ const intention = readIntentionFile(agentRoot, id);
111
+ intention.status = "done";
112
+ intention.updatedAt = new Date().toISOString();
113
+ writeIntentionFile(agentRoot, intention);
114
+ (0, runtime_1.emitNervesEvent)({
115
+ component: "heart",
116
+ event: "heart.intention_resolved",
117
+ message: `intention resolved: ${intention.content.slice(0, 60)}`,
118
+ meta: { intentionId: id },
119
+ });
120
+ return intention;
121
+ }
122
+ function dismissIntention(agentRoot, id) {
123
+ const intention = readIntentionFile(agentRoot, id);
124
+ intention.status = "dismissed";
125
+ intention.updatedAt = new Date().toISOString();
126
+ writeIntentionFile(agentRoot, intention);
127
+ (0, runtime_1.emitNervesEvent)({
128
+ component: "heart",
129
+ event: "heart.intention_dismissed",
130
+ message: `intention dismissed: ${intention.content.slice(0, 60)}`,
131
+ meta: { intentionId: id },
132
+ });
133
+ return intention;
134
+ }
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /**
3
+ * Shared JSON file store helpers for arc/ modules.
4
+ *
5
+ * obligations.ts, cares.ts, and intentions.ts all use the same pattern:
6
+ * individual JSON files in a directory, with read-all / read-one / write-one
7
+ * operations. This module extracts those patterns.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.generateTimestampId = generateTimestampId;
44
+ exports.readJsonDir = readJsonDir;
45
+ exports.readJsonFile = readJsonFile;
46
+ exports.readJsonFileOrThrow = readJsonFileOrThrow;
47
+ exports.writeJsonFile = writeJsonFile;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ /**
51
+ * Generate a timestamped random ID.
52
+ * @param prefix Optional prefix (e.g. "care", "int"). Omit for plain timestamp IDs.
53
+ */
54
+ function generateTimestampId(prefix) {
55
+ const timestamp = Date.now();
56
+ const random = Math.random().toString(36).slice(2, 10);
57
+ return prefix ? `${prefix}-${timestamp}-${random}` : `${timestamp}-${random}`;
58
+ }
59
+ /**
60
+ * Read all JSON files from a directory, parse each, and return an array.
61
+ * Silently skips malformed files. Returns empty array if directory is missing.
62
+ */
63
+ function readJsonDir(dir) {
64
+ if (!fs.existsSync(dir))
65
+ return [];
66
+ let entries;
67
+ try {
68
+ entries = fs.readdirSync(dir);
69
+ }
70
+ catch {
71
+ /* v8 ignore next -- defensive: readdirSync race after existsSync @preserve */
72
+ return [];
73
+ }
74
+ const jsonFiles = entries.filter((entry) => entry.endsWith(".json")).sort();
75
+ const records = [];
76
+ for (const file of jsonFiles) {
77
+ try {
78
+ const raw = fs.readFileSync(path.join(dir, file), "utf-8");
79
+ records.push(JSON.parse(raw));
80
+ }
81
+ catch {
82
+ // Skip malformed JSON files
83
+ }
84
+ }
85
+ return records;
86
+ }
87
+ /**
88
+ * Read a single JSON file by ID from a directory.
89
+ * Returns null if the file doesn't exist or is unparseable.
90
+ */
91
+ function readJsonFile(dir, id) {
92
+ try {
93
+ const raw = fs.readFileSync(path.join(dir, `${id}.json`), "utf-8");
94
+ return JSON.parse(raw);
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ /**
101
+ * Read a single JSON file by ID, throwing if not found.
102
+ */
103
+ function readJsonFileOrThrow(dir, id, label) {
104
+ const filePath = path.join(dir, `${id}.json`);
105
+ if (!fs.existsSync(filePath)) {
106
+ throw new Error(`${label} not found: ${id}`);
107
+ }
108
+ return JSON.parse(fs.readFileSync(filePath, "utf-8"));
109
+ }
110
+ /**
111
+ * Write a record to a JSON file, creating the directory if needed.
112
+ */
113
+ function writeJsonFile(dir, id, record) {
114
+ fs.mkdirSync(dir, { recursive: true });
115
+ const filePath = path.join(dir, `${id}.json`);
116
+ fs.writeFileSync(filePath, JSON.stringify(record, null, 2), "utf-8");
117
+ }
@@ -0,0 +1,386 @@
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.readObligation = readObligation;
37
+ exports.isOpenObligationStatus = isOpenObligationStatus;
38
+ exports.isOpenObligation = isOpenObligation;
39
+ exports.createObligation = createObligation;
40
+ exports.readObligations = readObligations;
41
+ exports.readPendingObligations = readPendingObligations;
42
+ exports.readVerifiedObligations = readVerifiedObligations;
43
+ exports.readVerifiedPendingObligations = readVerifiedPendingObligations;
44
+ exports.advanceObligation = advanceObligation;
45
+ exports.fulfillObligation = fulfillObligation;
46
+ exports.markObligationReturnReady = markObligationReturnReady;
47
+ exports.findPendingObligationForOrigin = findPendingObligationForOrigin;
48
+ exports.findPendingObligationForRequest = findPendingObligationForRequest;
49
+ exports.enrichObligation = enrichObligation;
50
+ exports.generateObligationId = generateObligationId;
51
+ exports.getReturnObligationsDir = getReturnObligationsDir;
52
+ exports.getReturnObligationsDirForRoot = getReturnObligationsDirForRoot;
53
+ exports.createReturnObligation = createReturnObligation;
54
+ exports.readReturnObligation = readReturnObligation;
55
+ exports.readReturnObligationForRoot = readReturnObligationForRoot;
56
+ exports.advanceReturnObligation = advanceReturnObligation;
57
+ exports.isActiveReturnObligationStatus = isActiveReturnObligationStatus;
58
+ exports.listReturnObligationsForRoot = listReturnObligationsForRoot;
59
+ exports.isActiveReturnObligationRecord = isActiveReturnObligationRecord;
60
+ exports.listActiveReturnObligations = listActiveReturnObligations;
61
+ exports.listActiveReturnObligationsForRoot = listActiveReturnObligationsForRoot;
62
+ const path = __importStar(require("path"));
63
+ const identity_1 = require("../heart/identity");
64
+ const session_events_1 = require("../heart/session-events");
65
+ const runtime_1 = require("../nerves/runtime");
66
+ const json_store_1 = require("./json-store");
67
+ function obligationsDir(agentRoot) {
68
+ return path.join(agentRoot, "arc", "obligations");
69
+ }
70
+ function readObligation(agentRoot, obligationId) {
71
+ return (0, json_store_1.readJsonFile)(obligationsDir(agentRoot), obligationId);
72
+ }
73
+ function isOpenObligationStatus(status) {
74
+ return status !== "fulfilled";
75
+ }
76
+ function isOpenObligation(obligation) {
77
+ return isOpenObligationStatus(obligation.status);
78
+ }
79
+ function isReadableObligation(value) {
80
+ if (!value || typeof value !== "object" || Array.isArray(value))
81
+ return false;
82
+ const obligation = value;
83
+ return typeof obligation.id === "string"
84
+ && typeof obligation.content === "string";
85
+ }
86
+ function isVerifiedObligationStatus(value) {
87
+ return value === "pending"
88
+ || value === "investigating"
89
+ || value === "waiting_for_merge"
90
+ || value === "updating_runtime"
91
+ || value === "fulfilled";
92
+ }
93
+ function isVerifiedObligation(value) {
94
+ if (!isReadableObligation(value))
95
+ return false;
96
+ const obligation = value;
97
+ return isVerifiedObligationStatus(obligation.status)
98
+ && typeof obligation.createdAt === "string"
99
+ && !!obligation.origin
100
+ && typeof obligation.origin.friendId === "string"
101
+ && typeof obligation.origin.channel === "string"
102
+ && typeof obligation.origin.key === "string";
103
+ }
104
+ function createObligation(agentRoot, input) {
105
+ if (input.sourceProvenance?.kind === "machine_evidence" && !input.owedTo) {
106
+ throw new Error("Machine evidence cannot create an obligation without a person owed a return");
107
+ }
108
+ const now = new Date().toISOString();
109
+ const id = (0, json_store_1.generateTimestampId)();
110
+ const obligation = {
111
+ id,
112
+ origin: input.origin,
113
+ sourceProvenance: input.sourceProvenance ?? {
114
+ kind: "human_request",
115
+ source: input.origin.channel,
116
+ ref: input.origin.key,
117
+ },
118
+ owedTo: input.owedTo ?? input.origin,
119
+ ...(input.requestId ? { requestId: (0, session_events_1.capStructuredRecordString)(input.requestId) } : {}),
120
+ ...(input.bridgeId ? { bridgeId: input.bridgeId } : {}),
121
+ content: (0, session_events_1.capStructuredRecordString)(input.content),
122
+ status: "pending",
123
+ createdAt: now,
124
+ updatedAt: now,
125
+ };
126
+ (0, json_store_1.writeJsonFile)(obligationsDir(agentRoot), id, obligation);
127
+ (0, runtime_1.emitNervesEvent)({
128
+ component: "engine",
129
+ event: "engine.obligation_created",
130
+ message: "obligation created",
131
+ meta: {
132
+ obligationId: id,
133
+ friendId: input.origin.friendId,
134
+ channel: input.origin.channel,
135
+ key: input.origin.key,
136
+ },
137
+ });
138
+ return obligation;
139
+ }
140
+ function readObligations(agentRoot) {
141
+ const all = (0, json_store_1.readJsonDir)(obligationsDir(agentRoot));
142
+ return all.filter(isReadableObligation);
143
+ }
144
+ function readPendingObligations(agentRoot) {
145
+ return readObligations(agentRoot).filter(isOpenObligation);
146
+ }
147
+ function readVerifiedObligations(agentRoot) {
148
+ const all = (0, json_store_1.readJsonDir)(obligationsDir(agentRoot));
149
+ return all.filter(isVerifiedObligation);
150
+ }
151
+ function readVerifiedPendingObligations(agentRoot) {
152
+ return readVerifiedObligations(agentRoot).filter(isOpenObligation);
153
+ }
154
+ function advanceObligation(agentRoot, obligationId, update) {
155
+ const dir = obligationsDir(agentRoot);
156
+ const obligation = (0, json_store_1.readJsonFile)(dir, obligationId);
157
+ if (!obligation)
158
+ return;
159
+ const previousStatus = obligation.status;
160
+ if (update.status) {
161
+ obligation.status = update.status;
162
+ if (update.status === "fulfilled") {
163
+ obligation.fulfilledAt = new Date().toISOString();
164
+ }
165
+ }
166
+ if (update.currentSurface) {
167
+ obligation.currentSurface = update.currentSurface;
168
+ }
169
+ if (typeof update.currentArtifact === "string") {
170
+ obligation.currentArtifact = (0, session_events_1.capStructuredRecordString)(update.currentArtifact);
171
+ }
172
+ if (typeof update.nextAction === "string") {
173
+ obligation.nextAction = (0, session_events_1.capStructuredRecordString)(update.nextAction);
174
+ }
175
+ if (typeof update.latestNote === "string") {
176
+ obligation.latestNote = (0, session_events_1.capStructuredRecordString)(update.latestNote);
177
+ }
178
+ obligation.updatedAt = new Date().toISOString();
179
+ (0, json_store_1.writeJsonFile)(dir, obligationId, obligation);
180
+ (0, runtime_1.emitNervesEvent)({
181
+ component: "engine",
182
+ event: "engine.obligation_advanced",
183
+ message: "obligation advanced",
184
+ meta: {
185
+ obligationId,
186
+ previousStatus,
187
+ status: obligation.status,
188
+ friendId: obligation.origin.friendId,
189
+ channel: obligation.origin.channel,
190
+ key: obligation.origin.key,
191
+ surfaceKind: obligation.currentSurface?.kind ?? null,
192
+ surfaceLabel: obligation.currentSurface?.label ?? null,
193
+ },
194
+ });
195
+ }
196
+ function fulfillObligation(agentRoot, obligationId) {
197
+ advanceObligation(agentRoot, obligationId, { status: "fulfilled" });
198
+ const obligation = (0, json_store_1.readJsonFile)(obligationsDir(agentRoot), obligationId);
199
+ if (!obligation)
200
+ return;
201
+ (0, runtime_1.emitNervesEvent)({
202
+ component: "engine",
203
+ event: "engine.obligation_fulfilled",
204
+ message: "obligation fulfilled",
205
+ meta: {
206
+ obligationId,
207
+ friendId: obligation.origin.friendId,
208
+ channel: obligation.origin.channel,
209
+ key: obligation.origin.key,
210
+ },
211
+ });
212
+ }
213
+ function markObligationReturnReady(agentRoot, obligationId, evidenceRef) {
214
+ const dir = obligationsDir(agentRoot);
215
+ const obligation = (0, json_store_1.readJsonFile)(dir, obligationId);
216
+ if (!obligation || !isOpenObligation(obligation))
217
+ throw new Error(`Open obligation not found: ${obligationId}`);
218
+ const ref = (0, session_events_1.capStructuredRecordString)(evidenceRef).trim();
219
+ if (!ref)
220
+ throw new Error("Obligation return evidence is required");
221
+ if (obligation.returnReadyAt) {
222
+ if (obligation.returnEvidenceRef !== ref)
223
+ throw new Error(`Obligation return evidence is already bound: ${obligationId}`);
224
+ return obligation;
225
+ }
226
+ obligation.returnReadyAt = new Date().toISOString();
227
+ obligation.returnEvidenceRef = ref;
228
+ obligation.updatedAt = obligation.returnReadyAt;
229
+ (0, json_store_1.writeJsonFile)(dir, obligationId, obligation);
230
+ (0, runtime_1.emitNervesEvent)({ component: "engine", event: "engine.obligation_return_ready", message: "obligation is ready for an exact recorded return", meta: { obligationId, friendId: obligation.owedTo?.friendId ?? obligation.origin.friendId } });
231
+ return obligation;
232
+ }
233
+ function findPendingObligationForOrigin(agentRoot, origin) {
234
+ return readPendingObligations(agentRoot).find((ob) => ob.origin.friendId === origin.friendId
235
+ && ob.origin.channel === origin.channel
236
+ && ob.origin.key === origin.key);
237
+ }
238
+ function findPendingObligationForRequest(agentRoot, input) {
239
+ return readPendingObligations(agentRoot).find((obligation) => obligation.requestId === input.requestId
240
+ && obligation.owedTo?.friendId === input.owedTo.friendId
241
+ && obligation.owedTo.channel === input.owedTo.channel
242
+ && obligation.owedTo.key === input.owedTo.key);
243
+ }
244
+ function enrichObligation(agentRoot, id, meaning) {
245
+ const dir = obligationsDir(agentRoot);
246
+ const existing = (0, json_store_1.readJsonFile)(dir, id);
247
+ if (!existing) {
248
+ throw new Error(`Obligation not found: ${id}`);
249
+ }
250
+ const obligation = existing;
251
+ obligation.meaning = {
252
+ ...meaning,
253
+ ...(typeof meaning.careReason === "string" ? { careReason: (0, session_events_1.capStructuredRecordString)(meaning.careReason) } : {}),
254
+ ...(typeof meaning.resumeHint === "string" ? { resumeHint: (0, session_events_1.capStructuredRecordString)(meaning.resumeHint) } : {}),
255
+ ...(meaning.waitingOn
256
+ ? { waitingOn: { ...meaning.waitingOn, detail: (0, session_events_1.capStructuredRecordString)(meaning.waitingOn.detail) } }
257
+ : {}),
258
+ };
259
+ obligation.updatedAt = new Date().toISOString();
260
+ (0, json_store_1.writeJsonFile)(dir, id, obligation);
261
+ (0, runtime_1.emitNervesEvent)({
262
+ component: "engine",
263
+ event: "engine.obligation_enriched",
264
+ message: "obligation enriched with meaning",
265
+ meta: {
266
+ obligationId: id,
267
+ salience: meaning.salience,
268
+ stalenessClass: meaning.stalenessClass,
269
+ },
270
+ });
271
+ return obligation;
272
+ }
273
+ function generateObligationId(timestamp) {
274
+ return `${timestamp}-${Math.random().toString(36).slice(2, 10)}`;
275
+ }
276
+ function getReturnObligationsDir(agentName) {
277
+ return path.join((0, identity_1.getAgentRoot)(agentName), "arc", "obligations", "inner");
278
+ }
279
+ function getReturnObligationsDirForRoot(agentRoot) {
280
+ return path.join(agentRoot, "arc", "obligations", "inner");
281
+ }
282
+ function createReturnObligation(agentName, obligation) {
283
+ const dir = getReturnObligationsDir(agentName);
284
+ const cappedObligation = {
285
+ ...obligation,
286
+ delegatedContent: (0, session_events_1.capStructuredRecordString)(obligation.delegatedContent),
287
+ };
288
+ (0, json_store_1.writeJsonFile)(dir, obligation.id, cappedObligation);
289
+ const filePath = path.join(dir, `${obligation.id}.json`);
290
+ (0, runtime_1.emitNervesEvent)({
291
+ event: "mind.obligation_created",
292
+ component: "mind",
293
+ message: "return obligation created",
294
+ meta: {
295
+ obligationId: obligation.id,
296
+ origin: `${obligation.origin.friendId}/${obligation.origin.channel}/${obligation.origin.key}`,
297
+ status: obligation.status,
298
+ },
299
+ });
300
+ return filePath;
301
+ }
302
+ function readReturnObligation(agentName, obligationId) {
303
+ return (0, json_store_1.readJsonFile)(getReturnObligationsDir(agentName), obligationId);
304
+ }
305
+ function readReturnObligationForRoot(agentRoot, obligationId) {
306
+ return (0, json_store_1.readJsonFile)(getReturnObligationsDirForRoot(agentRoot), obligationId);
307
+ }
308
+ function advanceReturnObligation(agentName, obligationId, update) {
309
+ const existing = readReturnObligation(agentName, obligationId);
310
+ if (!existing)
311
+ return null;
312
+ const updated = {
313
+ ...existing,
314
+ status: update.status,
315
+ ...(update.startedAt !== undefined ? { startedAt: update.startedAt } : {}),
316
+ ...(update.returnedAt !== undefined ? { returnedAt: update.returnedAt } : {}),
317
+ ...(update.returnTarget !== undefined ? { returnTarget: update.returnTarget } : {}),
318
+ };
319
+ (0, json_store_1.writeJsonFile)(getReturnObligationsDir(agentName), obligationId, updated);
320
+ (0, runtime_1.emitNervesEvent)({
321
+ event: "mind.obligation_advanced",
322
+ component: "mind",
323
+ message: `obligation advanced to ${update.status}`,
324
+ meta: {
325
+ obligationId,
326
+ status: update.status,
327
+ ...(update.returnTarget ? { returnTarget: update.returnTarget } : {}),
328
+ },
329
+ });
330
+ return updated;
331
+ }
332
+ // Private-runtime return obligations that have been sitting in queued/running state
333
+ // longer than this are auto-pruned from the "held work items" injection.
334
+ // Anything older is overwhelmingly noise: the agent has had many turns to
335
+ // resolve them and has not, and reinjecting them every turn just burns
336
+ // attention without producing progress. The file stays on disk and can
337
+ // still be inspected or surfaced explicitly; it just no longer gets
338
+ // re-piped into the active prompt.
339
+ const RETURN_OBLIGATION_INJECTION_MAX_AGE_MS = 14 * 24 * 60 * 60 * 1000;
340
+ // Strict allow-list of statuses that should appear in the "held work items"
341
+ // section. Anything else (including legacy/migrated `"fulfilled"` values left
342
+ // over from before the ObligationStatus → ReturnObligationStatus split, plus
343
+ // any future invalid value that slips past the `as any` casts at the
344
+ // surface-tool boundary) is treated as terminal — i.e., we do not re-inject
345
+ // it. This is a read-time defense; the underlying file is left as-is.
346
+ const ACTIVE_RETURN_OBLIGATION_STATUSES = new Set(["queued", "running"]);
347
+ function isActiveReturnObligationStatus(status) {
348
+ return ACTIVE_RETURN_OBLIGATION_STATUSES.has(status);
349
+ }
350
+ function isSelfInnerReturnObligation(obligation) {
351
+ return obligation.origin?.friendId === "self" && obligation.origin.channel === "inner";
352
+ }
353
+ function isReturnObligationRecord(value) {
354
+ if (!value || typeof value !== "object")
355
+ return false;
356
+ const candidate = value;
357
+ return typeof candidate.id === "string"
358
+ && typeof candidate.status === "string"
359
+ && typeof candidate.delegatedContent === "string"
360
+ && typeof candidate.createdAt === "number"
361
+ && !!candidate.origin
362
+ && typeof candidate.origin.friendId === "string"
363
+ && typeof candidate.origin.channel === "string"
364
+ && typeof candidate.origin.key === "string";
365
+ }
366
+ function listReturnObligationsForRoot(agentRoot) {
367
+ return (0, json_store_1.readJsonDir)(getReturnObligationsDirForRoot(agentRoot))
368
+ .filter(isReturnObligationRecord);
369
+ }
370
+ function isActiveReturnObligationRecord(value, options = {}) {
371
+ if (!isReturnObligationRecord(value))
372
+ return false;
373
+ const nowMs = (options.now ?? Date.now)();
374
+ return isActiveReturnObligationStatus(value.status)
375
+ && !isSelfInnerReturnObligation(value)
376
+ && nowMs - value.createdAt <= RETURN_OBLIGATION_INJECTION_MAX_AGE_MS;
377
+ }
378
+ function listActiveReturnObligations(agentName, options = {}) {
379
+ return listActiveReturnObligationsForRoot((0, identity_1.getAgentRoot)(agentName), options);
380
+ }
381
+ function listActiveReturnObligationsForRoot(agentRoot, options = {}) {
382
+ const nowMs = (options.now ?? Date.now)();
383
+ return listReturnObligationsForRoot(agentRoot)
384
+ .filter((parsed) => isActiveReturnObligationRecord(parsed, { now: () => nowMs }))
385
+ .sort((a, b) => a.createdAt - b.createdAt);
386
+ }