@ouro.bot/cli 0.1.0-alpha.78 → 0.1.0-alpha.780

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 (608) 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 +4994 -17
  15. package/deploy/unraid/Dockerfile +48 -0
  16. package/deploy/unraid/README.txt +2523 -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 +176 -0
  25. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  26. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -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 +2030 -0
  31. package/deploy/unraid/sanctuary-unit16-run.sh +560 -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 +10 -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 +27 -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 +360 -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 -29
  75. package/dist/heart/agent-entry.js +253 -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 +18 -0
  85. package/dist/heart/attachments/sources/telegram.js +71 -0
  86. package/dist/heart/attachments/store.js +132 -0
  87. package/dist/heart/attachments/types.js +93 -0
  88. package/dist/heart/auth/auth-flow.js +495 -0
  89. package/dist/heart/autonomy-budget.js +478 -0
  90. package/dist/heart/awaiting/await-alert.js +148 -0
  91. package/dist/heart/awaiting/await-expiry.js +143 -0
  92. package/dist/heart/awaiting/await-loader.js +91 -0
  93. package/dist/heart/awaiting/await-parser.js +149 -0
  94. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  95. package/dist/heart/awaiting/await-scheduler.js +382 -0
  96. package/dist/heart/background-operations.js +281 -0
  97. package/dist/heart/bridges/manager.js +137 -17
  98. package/dist/heart/bridges/store.js +14 -2
  99. package/dist/heart/bundle-state.js +168 -0
  100. package/dist/heart/commitments.js +64 -18
  101. package/dist/heart/config-registry.js +331 -0
  102. package/dist/heart/config.js +128 -129
  103. package/dist/heart/context-loss-gauntlet.js +387 -0
  104. package/dist/heart/context-loss-sentinel.js +1157 -0
  105. package/dist/heart/core.js +2014 -469
  106. package/dist/heart/cross-chat-delivery.js +9 -22
  107. package/dist/heart/daemon/agent-config-check.js +451 -0
  108. package/dist/heart/daemon/agent-discovery.js +185 -3
  109. package/dist/heart/daemon/agent-service.js +542 -0
  110. package/dist/heart/daemon/agentic-repair.js +547 -0
  111. package/dist/heart/daemon/await-private-wake.js +59 -0
  112. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  113. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  114. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  115. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  116. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  117. package/dist/heart/daemon/cadence.js +180 -0
  118. package/dist/heart/daemon/cli-defaults.js +836 -0
  119. package/dist/heart/daemon/cli-desk.js +322 -0
  120. package/dist/heart/daemon/cli-exec.js +8730 -0
  121. package/dist/heart/daemon/cli-help.js +710 -0
  122. package/dist/heart/daemon/cli-parse.js +2719 -0
  123. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  124. package/dist/heart/daemon/cli-render.js +777 -0
  125. package/dist/heart/daemon/cli-types.js +8 -0
  126. package/dist/heart/daemon/connect-bay.js +323 -0
  127. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  128. package/dist/heart/daemon/container-healthcheck.js +96 -0
  129. package/dist/heart/daemon/container-runtime.js +97 -0
  130. package/dist/heart/daemon/container-spec-auditor-main.js +160 -0
  131. package/dist/heart/daemon/container-spec-auditor.js +176 -0
  132. package/dist/heart/daemon/daemon-bootstrap-startup.js +77 -0
  133. package/dist/heart/daemon/daemon-cli.js +29 -2181
  134. package/dist/heart/daemon/daemon-entry.js +907 -10
  135. package/dist/heart/daemon/daemon-health.js +186 -0
  136. package/dist/heart/daemon/daemon-rollup.js +57 -0
  137. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  138. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  139. package/dist/heart/daemon/daemon.js +1988 -88
  140. package/dist/heart/daemon/dns-workflow.js +394 -0
  141. package/dist/heart/daemon/doctor-types.js +8 -0
  142. package/dist/heart/daemon/doctor.js +1755 -0
  143. package/dist/heart/daemon/freshness.js +345 -0
  144. package/dist/heart/daemon/habit-private-wake.js +61 -0
  145. package/dist/heart/daemon/health-monitor.js +142 -11
  146. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  147. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  148. package/dist/heart/daemon/http-health-probe.js +80 -0
  149. package/dist/heart/daemon/human-command-screens.js +234 -0
  150. package/dist/heart/daemon/human-readiness.js +114 -0
  151. package/dist/heart/daemon/inner-status.js +78 -0
  152. package/dist/heart/daemon/interactive-repair.js +394 -0
  153. package/dist/heart/daemon/launchd.js +37 -8
  154. package/dist/heart/daemon/log-tailer.js +79 -10
  155. package/dist/heart/daemon/logs-prune.js +132 -0
  156. package/dist/heart/daemon/mcp-canary.js +524 -0
  157. package/dist/heart/daemon/message-router.js +45 -5
  158. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  159. package/dist/heart/daemon/os-cron-deps.js +135 -0
  160. package/dist/heart/daemon/os-cron.js +22 -14
  161. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  162. package/dist/heart/daemon/ouro-entry.js +3 -1
  163. package/dist/heart/daemon/plugin-cli.js +432 -0
  164. package/dist/heart/daemon/process-manager.js +733 -61
  165. package/dist/heart/daemon/provider-discovery.js +137 -0
  166. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  167. package/dist/heart/daemon/prunable-bundle.js +144 -0
  168. package/dist/heart/daemon/pulse.js +511 -0
  169. package/dist/heart/daemon/readiness-repair.js +365 -0
  170. package/dist/heart/daemon/run-hooks.js +2 -0
  171. package/dist/heart/daemon/runtime-logging.js +47 -14
  172. package/dist/heart/daemon/runtime-metadata.js +2 -30
  173. package/dist/heart/daemon/runtime-mode.js +13 -2
  174. package/dist/heart/daemon/safe-mode.js +161 -0
  175. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2609 -0
  176. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1866 -0
  177. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  178. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +976 -0
  179. package/dist/heart/daemon/sanctuary-bundle-migration.js +398 -0
  180. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  181. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  182. package/dist/heart/daemon/sense-manager.js +689 -48
  183. package/dist/heart/daemon/session-id-resolver.js +131 -0
  184. package/dist/heart/daemon/skill-management-installer.js +1 -1
  185. package/dist/heart/daemon/socket-client.js +180 -12
  186. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  187. package/dist/heart/daemon/startup-tui.js +339 -0
  188. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  189. package/dist/heart/daemon/task-scheduler.js +117 -39
  190. package/dist/heart/daemon/terminal-ui.js +499 -0
  191. package/dist/heart/daemon/thoughts.js +138 -54
  192. package/dist/heart/daemon/up-progress.js +366 -0
  193. package/dist/heart/daemon/vault-items.js +56 -0
  194. package/dist/heart/delegation.js +1 -4
  195. package/dist/heart/external-events/router.js +1414 -0
  196. package/dist/heart/habits/habit-cancel.js +810 -0
  197. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  198. package/dist/heart/habits/habit-migration.js +194 -0
  199. package/dist/heart/habits/habit-parser.js +278 -0
  200. package/dist/heart/habits/habit-runtime-state.js +93 -0
  201. package/dist/heart/habits/habit-scheduler.js +653 -0
  202. package/dist/heart/habits/habit-session-summary.js +318 -0
  203. package/dist/heart/habits/habit-session.js +636 -0
  204. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  205. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  206. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  207. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  208. package/dist/heart/identity.js +184 -59
  209. package/dist/heart/kept-notes.js +289 -0
  210. package/dist/heart/kicks.js +1 -1
  211. package/dist/heart/machine-identity.js +161 -0
  212. package/dist/heart/mail-import-discovery.js +353 -0
  213. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  214. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  215. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  216. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  217. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  218. package/dist/heart/mailbox/mailbox-http.js +99 -0
  219. package/dist/heart/mailbox/mailbox-read.js +39 -0
  220. package/dist/heart/mailbox/mailbox-types.js +27 -0
  221. package/dist/heart/mailbox/mailbox-view.js +197 -0
  222. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  223. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  224. package/dist/heart/mailbox/readers/mail.js +375 -0
  225. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  226. package/dist/heart/mailbox/readers/sessions.js +232 -0
  227. package/dist/heart/mailbox/readers/shared.js +111 -0
  228. package/dist/heart/mcp/mcp-server.js +696 -0
  229. package/dist/heart/migrate-config.js +100 -0
  230. package/dist/heart/model-capabilities.js +11 -0
  231. package/dist/heart/orientation-frame.js +345 -0
  232. package/dist/heart/platform.js +81 -0
  233. package/dist/heart/primitives.js +1 -1
  234. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  235. package/dist/heart/private-runtime/index.js +18 -0
  236. package/dist/heart/private-runtime/ledger.js +221 -0
  237. package/dist/heart/private-runtime/policy.js +228 -0
  238. package/dist/heart/private-runtime/types.js +2 -0
  239. package/dist/heart/progress-story.js +1 -1
  240. package/dist/heart/provider-attempt.js +137 -0
  241. package/dist/heart/provider-binding-resolver.js +273 -0
  242. package/dist/heart/provider-credentials.js +449 -0
  243. package/dist/heart/provider-failover.js +311 -0
  244. package/dist/heart/provider-models.js +96 -0
  245. package/dist/heart/provider-ping.js +265 -0
  246. package/dist/heart/provider-readiness-cache.js +119 -0
  247. package/dist/heart/provider-visibility.js +188 -0
  248. package/dist/heart/providers/anthropic-token.js +131 -0
  249. package/dist/heart/providers/anthropic.js +173 -60
  250. package/dist/heart/providers/azure.js +23 -11
  251. package/dist/heart/providers/error-classification.js +127 -0
  252. package/dist/heart/providers/github-copilot.js +34 -38
  253. package/dist/heart/providers/minimax-vlm.js +189 -0
  254. package/dist/heart/providers/minimax.js +26 -8
  255. package/dist/heart/providers/openai-codex-token.js +349 -0
  256. package/dist/heart/providers/openai-codex.js +55 -40
  257. package/dist/heart/providers/openai-compatible.js +177 -0
  258. package/dist/heart/run-ledger.js +247 -0
  259. package/dist/heart/runtime-capability-check.js +170 -0
  260. package/dist/heart/runtime-credentials.js +607 -0
  261. package/dist/heart/runtime-cwd.js +87 -0
  262. package/dist/heart/sense-truth.js +22 -4
  263. package/dist/heart/session-activity.js +90 -24
  264. package/dist/heart/session-events.js +1318 -0
  265. package/dist/heart/session-playback-cli-main.js +5 -0
  266. package/dist/heart/session-playback-cli.js +36 -0
  267. package/dist/heart/session-playback.js +231 -0
  268. package/dist/heart/session-stats-cli-main.js +5 -0
  269. package/dist/heart/session-stats.js +182 -0
  270. package/dist/heart/session-transcript.js +133 -0
  271. package/dist/heart/start-of-turn-packet.js +372 -0
  272. package/dist/heart/steward-policy.js +302 -0
  273. package/dist/heart/streaming.js +604 -207
  274. package/dist/heart/structured-output.js +196 -0
  275. package/dist/heart/sync-classification.js +176 -0
  276. package/dist/heart/sync.js +449 -0
  277. package/dist/heart/target-resolution.js +11 -7
  278. package/dist/heart/tempo.js +93 -0
  279. package/dist/heart/temporal-view.js +41 -0
  280. package/dist/heart/timeouts.js +101 -0
  281. package/dist/heart/tool-activity-callbacks.js +59 -0
  282. package/dist/heart/tool-approval.js +342 -0
  283. package/dist/heart/tool-description.js +155 -0
  284. package/dist/heart/tool-friction.js +55 -0
  285. package/dist/heart/tool-loop.js +200 -0
  286. package/dist/heart/turn-context.js +481 -0
  287. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  288. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  289. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  290. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  291. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  292. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  293. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  294. package/dist/heart/versioning/update-hooks.js +154 -0
  295. package/dist/heart/versioning/version-intent.js +114 -0
  296. package/dist/heart/work-card.js +380 -0
  297. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  298. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  299. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  300. package/dist/mailbox-ui/index.html +16 -0
  301. package/dist/mailroom/attention.js +167 -0
  302. package/dist/mailroom/autonomy.js +209 -0
  303. package/dist/mailroom/blob-store.js +889 -0
  304. package/dist/mailroom/body-cache.js +61 -0
  305. package/dist/mailroom/cache-sync-cli.js +58 -0
  306. package/dist/mailroom/core.js +803 -0
  307. package/dist/mailroom/entry.js +160 -0
  308. package/dist/mailroom/file-store.js +568 -0
  309. package/dist/mailroom/hosted-cache-sync.js +384 -0
  310. package/dist/mailroom/mbox-import.js +393 -0
  311. package/dist/mailroom/migration.js +164 -0
  312. package/dist/mailroom/outbound.js +380 -0
  313. package/dist/mailroom/policy.js +263 -0
  314. package/dist/mailroom/reader.js +292 -0
  315. package/dist/mailroom/search-cache.js +513 -0
  316. package/dist/mailroom/search-relevance.js +319 -0
  317. package/dist/mailroom/smtp-ingress.js +176 -0
  318. package/dist/mailroom/source-state.js +176 -0
  319. package/dist/mailroom/thread.js +109 -0
  320. package/dist/mailroom/travel-extract.js +89 -0
  321. package/dist/mind/bundle-manifest.js +24 -2
  322. package/dist/mind/context.js +278 -111
  323. package/dist/mind/desk-section.js +362 -0
  324. package/dist/mind/diary-integrity.js +60 -0
  325. package/dist/mind/{memory.js → diary.js} +68 -77
  326. package/dist/mind/embedding-provider.js +60 -0
  327. package/dist/mind/file-state.js +179 -0
  328. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  329. package/dist/mind/obligation-steering.js +227 -0
  330. package/dist/mind/pending.js +34 -8
  331. package/dist/mind/prompt-budget.js +479 -0
  332. package/dist/mind/prompt-refresh.js +3 -2
  333. package/dist/mind/prompt.js +1058 -187
  334. package/dist/mind/provenance-trust.js +26 -0
  335. package/dist/mind/record-paths.js +312 -0
  336. package/dist/mind/scrutiny.js +173 -0
  337. package/dist/mind/session-transaction.js +415 -0
  338. package/dist/nerves/cli-logging.js +7 -1
  339. package/dist/nerves/coverage/audit-rules.js +15 -6
  340. package/dist/nerves/coverage/audit.js +28 -2
  341. package/dist/nerves/coverage/cli.js +1 -1
  342. package/dist/nerves/coverage/contract.js +5 -5
  343. package/dist/nerves/coverage/file-completeness.js +139 -5
  344. package/dist/nerves/coverage/run-artifacts.js +55 -35
  345. package/dist/nerves/coverage/source-scanner.js +4 -4
  346. package/dist/nerves/event-buffer.js +111 -0
  347. package/dist/nerves/index.js +293 -9
  348. package/dist/nerves/observation.js +20 -0
  349. package/dist/nerves/redact.js +79 -0
  350. package/dist/nerves/review/cli-main.js +5 -0
  351. package/dist/nerves/review/cli.js +156 -0
  352. package/dist/nerves/review/core.js +159 -0
  353. package/dist/nerves/runtime.js +17 -1
  354. package/dist/repertoire/ado-client.js +15 -56
  355. package/dist/repertoire/ado-semantic.js +16 -10
  356. package/dist/repertoire/api-client.js +97 -0
  357. package/dist/repertoire/bitwarden-store.js +1045 -0
  358. package/dist/repertoire/bundle-templates.js +71 -0
  359. package/dist/repertoire/bw-installer.js +180 -0
  360. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  361. package/dist/repertoire/coding/context-pack.js +331 -0
  362. package/dist/repertoire/coding/feedback.js +218 -30
  363. package/dist/repertoire/coding/index.js +15 -3
  364. package/dist/repertoire/coding/manager.js +166 -10
  365. package/dist/repertoire/coding/spawner.js +58 -11
  366. package/dist/repertoire/coding/tools.js +242 -14
  367. package/dist/repertoire/coding/workbench-client.js +272 -0
  368. package/dist/repertoire/coding/workbench-manager.js +346 -0
  369. package/dist/repertoire/commerce-errors.js +109 -0
  370. package/dist/repertoire/commerce-self-test.js +156 -0
  371. package/dist/repertoire/credential-access.js +178 -0
  372. package/dist/repertoire/desk/classifier.js +362 -0
  373. package/dist/repertoire/duffel-client.js +185 -0
  374. package/dist/repertoire/github-client.js +14 -55
  375. package/dist/repertoire/graph-client.js +11 -52
  376. package/dist/repertoire/guardrails.js +813 -18
  377. package/dist/repertoire/mcp-client.js +44 -3
  378. package/dist/repertoire/mcp-manager.js +259 -20
  379. package/dist/repertoire/mcp-tools.js +83 -0
  380. package/dist/repertoire/plugin-mcp.js +175 -0
  381. package/dist/repertoire/plugins.js +253 -0
  382. package/dist/repertoire/relationship-authorization.js +194 -0
  383. package/dist/repertoire/shell-sessions.js +133 -0
  384. package/dist/repertoire/skills.js +48 -4
  385. package/dist/repertoire/stripe-client.js +131 -0
  386. package/dist/repertoire/tool-arguments.js +143 -0
  387. package/dist/repertoire/tool-results.js +29 -0
  388. package/dist/repertoire/tools-a2a.js +699 -0
  389. package/dist/repertoire/tools-attachments.js +322 -0
  390. package/dist/repertoire/tools-awaiting.js +575 -0
  391. package/dist/repertoire/tools-base.js +82 -1139
  392. package/dist/repertoire/tools-bluebubbles.js +2 -0
  393. package/dist/repertoire/tools-bridge.js +144 -0
  394. package/dist/repertoire/tools-bundle.js +993 -0
  395. package/dist/repertoire/tools-commerce.js +253 -0
  396. package/dist/repertoire/tools-config.js +186 -0
  397. package/dist/repertoire/tools-continuity.js +574 -0
  398. package/dist/repertoire/tools-credential.js +383 -0
  399. package/dist/repertoire/tools-evolution.js +527 -0
  400. package/dist/repertoire/tools-files.js +344 -0
  401. package/dist/repertoire/tools-flight.js +290 -0
  402. package/dist/repertoire/tools-flow.js +119 -0
  403. package/dist/repertoire/tools-github.js +3 -8
  404. package/dist/repertoire/tools-habits.js +103 -0
  405. package/dist/repertoire/tools-mail.js +1828 -0
  406. package/dist/repertoire/tools-notes.js +485 -0
  407. package/dist/repertoire/tools-obligations.js +182 -0
  408. package/dist/repertoire/tools-orientation.js +31 -0
  409. package/dist/repertoire/tools-record.js +482 -0
  410. package/dist/repertoire/tools-rsvp.js +139 -0
  411. package/dist/repertoire/tools-runtime.js +150 -0
  412. package/dist/repertoire/tools-session.js +1096 -0
  413. package/dist/repertoire/tools-shell.js +133 -0
  414. package/dist/repertoire/tools-steward-policy.js +95 -0
  415. package/dist/repertoire/tools-stripe.js +224 -0
  416. package/dist/repertoire/tools-surface.js +355 -0
  417. package/dist/repertoire/tools-teams.js +12 -39
  418. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  419. package/dist/repertoire/tools-travel.js +125 -0
  420. package/dist/repertoire/tools-trip.js +982 -0
  421. package/dist/repertoire/tools-unraid.js +459 -0
  422. package/dist/repertoire/tools-user-profile.js +146 -0
  423. package/dist/repertoire/tools-vault.js +40 -0
  424. package/dist/repertoire/tools-voice.js +145 -0
  425. package/dist/repertoire/tools.js +377 -80
  426. package/dist/repertoire/travel-api-client.js +360 -0
  427. package/dist/repertoire/unraid-client.js +155 -0
  428. package/dist/repertoire/unraid-restart.js +212 -0
  429. package/dist/repertoire/user-profile.js +131 -0
  430. package/dist/repertoire/vault-setup.js +246 -0
  431. package/dist/repertoire/vault-unlock.js +628 -0
  432. package/dist/rsvp/aisleplanner-client.js +354 -0
  433. package/dist/rsvp/cli.js +926 -0
  434. package/dist/rsvp/config.js +327 -0
  435. package/dist/rsvp/cutover.js +433 -0
  436. package/dist/rsvp/diagnostics.js +232 -0
  437. package/dist/rsvp/diff-renderer.js +176 -0
  438. package/dist/rsvp/habit-policy.js +110 -0
  439. package/dist/rsvp/habit-stage.js +123 -0
  440. package/dist/rsvp/incident-bundle.js +97 -0
  441. package/dist/rsvp/migration.js +204 -0
  442. package/dist/rsvp/native-habit-runner.js +630 -0
  443. package/dist/rsvp/outbound-state.js +628 -0
  444. package/dist/rsvp/query.js +118 -0
  445. package/dist/rsvp/replay.js +233 -0
  446. package/dist/rsvp/snapshot.js +232 -0
  447. package/dist/rsvp/spend-ledger.js +175 -0
  448. package/dist/scripts/claude-code-hook.js +41 -0
  449. package/dist/scripts/claude-code-stop-hook.js +47 -0
  450. package/dist/senses/a2a-entry.js +115 -0
  451. package/dist/senses/attention-queue.js +186 -0
  452. package/dist/senses/await-turn-message.js +58 -0
  453. package/dist/senses/bluebubbles/active-turns.js +216 -0
  454. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  455. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  456. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  457. package/dist/senses/bluebubbles/context-packet.js +207 -0
  458. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  459. package/dist/senses/bluebubbles/entry.js +90 -0
  460. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  461. package/dist/senses/bluebubbles/index.js +3839 -0
  462. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  463. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  464. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  465. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  466. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  467. package/dist/senses/bluebubbles/processed-log.js +133 -0
  468. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  469. package/dist/senses/bluebubbles/replay.js +284 -0
  470. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  471. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  472. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  473. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  474. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  475. package/dist/senses/cli/bracketed-paste.js +82 -0
  476. package/dist/senses/cli/image-paste.js +287 -0
  477. package/dist/senses/cli/image-ref-navigation.js +75 -0
  478. package/dist/senses/cli/ink-app.js +156 -0
  479. package/dist/senses/cli/inline-diff.js +64 -0
  480. package/dist/senses/cli/input-keys.js +174 -0
  481. package/dist/senses/cli/kill-ring.js +86 -0
  482. package/dist/senses/cli/message-list.js +51 -0
  483. package/dist/senses/cli/ouro-tui.js +607 -0
  484. package/dist/senses/cli/spinner-imperative.js +135 -0
  485. package/dist/senses/cli/spinner.js +101 -0
  486. package/dist/senses/cli/status-line.js +60 -0
  487. package/dist/senses/cli/streaming-markdown.js +526 -0
  488. package/dist/senses/cli/tool-display.js +85 -0
  489. package/dist/senses/cli/tool-render.js +85 -0
  490. package/dist/senses/cli/tui-store.js +241 -0
  491. package/dist/senses/cli/virtual-list.js +35 -0
  492. package/dist/senses/cli-entry.js +60 -8
  493. package/dist/senses/cli.js +600 -317
  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 +1081 -204
  503. package/dist/senses/private-runtime-worker.js +859 -0
  504. package/dist/senses/private-runtime.js +1496 -0
  505. package/dist/senses/proactive-content-guard.js +51 -0
  506. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  507. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  508. package/dist/senses/sanctuary-grounding.js +118 -0
  509. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  510. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  511. package/dist/senses/sanctuary-health-runner.js +101 -0
  512. package/dist/senses/sanctuary-health.js +408 -0
  513. package/dist/senses/sanctuary-interactive-control.js +306 -0
  514. package/dist/senses/sanctuary-media-optimization.js +436 -0
  515. package/dist/senses/sanctuary-runtime.js +330 -0
  516. package/dist/senses/sanctuary-sab.js +85 -0
  517. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  518. package/dist/senses/shared-turn.js +488 -0
  519. package/dist/senses/surface-tool.js +109 -0
  520. package/dist/senses/teams-entry.js +60 -8
  521. package/dist/senses/teams.js +515 -217
  522. package/dist/senses/telegram-admission.js +711 -0
  523. package/dist/senses/telegram-approval-runtime.js +566 -0
  524. package/dist/senses/telegram-attachments.js +182 -0
  525. package/dist/senses/telegram-audit-ledger.js +220 -0
  526. package/dist/senses/telegram-client.js +1676 -0
  527. package/dist/senses/telegram-effect-adapter.js +796 -0
  528. package/dist/senses/telegram-entry.js +83 -0
  529. package/dist/senses/telegram.js +2018 -0
  530. package/dist/senses/trust-gate.js +104 -9
  531. package/dist/senses/voice/audio-playback.js +237 -0
  532. package/dist/senses/voice/audio-routing.js +119 -0
  533. package/dist/senses/voice/elevenlabs.js +202 -0
  534. package/dist/senses/voice/floor-control.js +431 -0
  535. package/dist/senses/voice/floor-controller.js +115 -0
  536. package/dist/senses/voice/golden-path.js +116 -0
  537. package/dist/senses/voice/index.js +29 -0
  538. package/dist/senses/voice/meeting.js +113 -0
  539. package/dist/senses/voice/outbound.js +190 -0
  540. package/dist/senses/voice/phone.js +33 -0
  541. package/dist/senses/voice/playback.js +139 -0
  542. package/dist/senses/voice/realtime-eval.js +496 -0
  543. package/dist/senses/voice/realtime-trace.js +531 -0
  544. package/dist/senses/voice/transcript.js +70 -0
  545. package/dist/senses/voice/turn.js +191 -0
  546. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  547. package/dist/senses/voice/twilio-phone.js +5081 -0
  548. package/dist/senses/voice/types.js +2 -0
  549. package/dist/senses/voice/whisper.js +161 -0
  550. package/dist/senses/voice-entry.js +81 -0
  551. package/dist/senses/voice-realtime-eval-command.js +99 -0
  552. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  553. package/dist/senses/voice-twilio-entry.js +87 -0
  554. package/dist/trips/core.js +138 -0
  555. package/dist/trips/store.js +265 -0
  556. package/dist/util/frontmatter.js +69 -0
  557. package/npm-shrinkwrap.json +8144 -0
  558. package/package.json +72 -13
  559. package/skills/agent-commerce.md +113 -0
  560. package/skills/browser-navigation.md +117 -0
  561. package/skills/commerce-setup-guide.md +116 -0
  562. package/skills/commerce-setup.md +84 -0
  563. package/skills/configure-dev-tools.md +99 -0
  564. package/skills/travel-planning.md +138 -0
  565. package/dist/heart/daemon/auth-flow.js +0 -430
  566. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  567. package/dist/heart/daemon/update-hooks.js +0 -138
  568. package/dist/heart/obligations.js +0 -141
  569. package/dist/heart/safe-workspace.js +0 -228
  570. package/dist/heart/session-recall.js +0 -116
  571. package/dist/mind/friends/channel.js +0 -84
  572. package/dist/mind/friends/group-context.js +0 -144
  573. package/dist/mind/friends/resolver.js +0 -84
  574. package/dist/mind/friends/store-file.js +0 -190
  575. package/dist/mind/friends/store.js +0 -4
  576. package/dist/mind/friends/tokens.js +0 -26
  577. package/dist/mind/friends/trust-explanation.js +0 -74
  578. package/dist/mind/friends/types.js +0 -29
  579. package/dist/repertoire/tasks/board.js +0 -134
  580. package/dist/repertoire/tasks/index.js +0 -224
  581. package/dist/repertoire/tasks/lifecycle.js +0 -80
  582. package/dist/repertoire/tasks/middleware.js +0 -65
  583. package/dist/repertoire/tasks/parser.js +0 -173
  584. package/dist/repertoire/tasks/scanner.js +0 -132
  585. package/dist/repertoire/tasks/transitions.js +0 -144
  586. package/dist/senses/bluebubbles-entry.js +0 -13
  587. package/dist/senses/bluebubbles.js +0 -1181
  588. package/dist/senses/debug-activity.js +0 -154
  589. package/dist/senses/inner-dialog-worker.js +0 -90
  590. package/dist/senses/inner-dialog.js +0 -525
  591. package/subagents/README.md +0 -7
  592. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  593. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  594. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  595. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  596. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  597. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  598. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  599. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  600. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  601. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  602. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  603. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  604. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  605. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  606. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  607. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  608. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,575 @@
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.awaitingToolDefinitions = void 0;
37
+ exports.readAwaitDefinition = readAwaitDefinition;
38
+ exports.setAwaitToolDeps = setAwaitToolDeps;
39
+ exports.resetAwaitToolDeps = resetAwaitToolDeps;
40
+ exports.cancelAwaitTool = cancelAwaitTool;
41
+ exports.cancelStaleAwait = cancelStaleAwait;
42
+ exports.inspectRelationshipFollowUp = inspectRelationshipFollowUp;
43
+ exports.hasActiveRelationshipFollowUp = hasActiveRelationshipFollowUp;
44
+ exports.hasActiveExternalEventAwait = hasActiveExternalEventAwait;
45
+ exports.inspectExternalEventAwait = inspectExternalEventAwait;
46
+ exports.cancelRelationshipFollowUps = cancelRelationshipFollowUps;
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ const identity_1 = require("../heart/identity");
50
+ const session_events_1 = require("../heart/session-events");
51
+ const runtime_1 = require("../nerves/runtime");
52
+ const await_parser_1 = require("../heart/awaiting/await-parser");
53
+ const await_alert_1 = require("../heart/awaiting/await-alert");
54
+ const pending_1 = require("../mind/pending");
55
+ const router_1 = require("../heart/external-events/router");
56
+ const obligations_1 = require("../arc/obligations");
57
+ const cadence_1 = require("../heart/daemon/cadence");
58
+ /**
59
+ * Bundle-root-relative locations.
60
+ * - `awaiting/<name>.md` — active awaits (status: pending)
61
+ * - `awaiting/.done/<name>.md` — terminal awaits (resolved/expired/canceled)
62
+ */
63
+ function awaitingDir(agentRoot) {
64
+ return path.join(agentRoot, "awaiting");
65
+ }
66
+ function awaitingDoneDir(agentRoot) {
67
+ return path.join(awaitingDir(agentRoot), ".done");
68
+ }
69
+ function awaitFilePath(agentRoot, name) {
70
+ return path.join(awaitingDir(agentRoot), `${name}.md`);
71
+ }
72
+ function awaitDoneFilePath(agentRoot, name) {
73
+ return path.join(awaitingDoneDir(agentRoot), `${name}.md`);
74
+ }
75
+ const VALID_NAME = /^[A-Za-z0-9_-]+$/;
76
+ function validateName(name) {
77
+ if (!name)
78
+ return "name is required";
79
+ if (!VALID_NAME.test(name))
80
+ return "name must be alphanumeric, underscores, or hyphens";
81
+ return null;
82
+ }
83
+ function readAwaitDefinition(agentRoot, name) {
84
+ const filePath = awaitFilePath(agentRoot, name);
85
+ try {
86
+ const content = fs.readFileSync(filePath, "utf-8");
87
+ return (0, await_parser_1.parseAwaitFile)(content, filePath);
88
+ }
89
+ catch {
90
+ return null;
91
+ }
92
+ }
93
+ /**
94
+ * Default delivery deps for the await alert path used from the tool.
95
+ * Mirrors the proactive-outreach pattern: queue to the private-runtime pending
96
+ * dir when no live deliverer is registered.
97
+ */
98
+ function defaultDeliveryDeps(agentName) {
99
+ const pendingDir = (0, pending_1.getPrivateRuntimePendingDir)(agentName);
100
+ return {
101
+ agentName,
102
+ queuePending: (message) => {
103
+ // Mirror the write-as-pending convention from tools-session.
104
+ fs.mkdirSync(pendingDir, { recursive: true });
105
+ const filename = `${message.timestamp}-${Math.random().toString(36).slice(2, 10)}.json`;
106
+ fs.writeFileSync(path.join(pendingDir, filename), JSON.stringify({ ...message, content: (0, session_events_1.capStructuredRecordString)(message.content) }, null, 2), "utf-8");
107
+ },
108
+ };
109
+ }
110
+ let injected = {};
111
+ function setAwaitToolDeps(deps) {
112
+ injected = deps;
113
+ }
114
+ function resetAwaitToolDeps() {
115
+ injected = {};
116
+ }
117
+ function resolveDeliveryDeps(agentName) {
118
+ if (injected.buildDeliveryDeps)
119
+ return injected.buildDeliveryDeps(agentName);
120
+ return defaultDeliveryDeps(agentName);
121
+ }
122
+ function fileAwait(args, agentRoot, agentName, sessionFriendId, sessionChannel, sessionKey, requestId) {
123
+ const nameError = validateName(args.name);
124
+ if (nameError)
125
+ return JSON.stringify({ error: nameError });
126
+ if (!args.condition || !args.condition.trim()) {
127
+ return JSON.stringify({ error: "condition is required" });
128
+ }
129
+ if (!args.cadence || !args.cadence.trim()) {
130
+ return JSON.stringify({ error: "cadence is required" });
131
+ }
132
+ if (args.wake_at && (!Number.isFinite(Date.parse(args.wake_at)) || new Date(args.wake_at).toISOString() !== args.wake_at)) {
133
+ return JSON.stringify({ error: "wake_at must be a canonical ISO timestamp" });
134
+ }
135
+ const filePath = awaitFilePath(agentRoot, args.name);
136
+ if (fs.existsSync(filePath)) {
137
+ return JSON.stringify({ error: `await "${args.name}" already exists` });
138
+ }
139
+ const mode = args.mode === "quick" ? "quick" : "full";
140
+ const alert = sessionChannel === "external-event" ? null : args.alert ?? sessionChannel ?? null;
141
+ const frontmatter = {
142
+ condition: (0, session_events_1.capStructuredRecordString)(args.condition.trim()),
143
+ cadence: (0, session_events_1.capStructuredRecordString)(args.cadence.trim()),
144
+ alert,
145
+ mode,
146
+ max_age: typeof args.max_age === "string" ? (0, session_events_1.capStructuredRecordString)(args.max_age) : null,
147
+ wake_at: typeof args.wake_at === "string" ? (0, session_events_1.capStructuredRecordString)(args.wake_at) : null,
148
+ status: "pending",
149
+ created_at: new Date().toISOString(),
150
+ filed_from: sessionChannel ?? "unknown",
151
+ filed_for_friend_id: sessionFriendId ?? null,
152
+ filed_from_key: sessionKey,
153
+ request_id: requestId,
154
+ };
155
+ let obligationId = null;
156
+ if (requestId && sessionFriendId && sessionChannel && sessionKey) {
157
+ const obligation = (0, obligations_1.createObligation)(agentRoot, {
158
+ origin: { friendId: sessionFriendId, channel: sessionChannel, key: sessionKey },
159
+ owedTo: { friendId: sessionFriendId, channel: sessionChannel, key: sessionKey },
160
+ requestId,
161
+ content: args.condition.trim(),
162
+ });
163
+ (0, obligations_1.advanceObligation)(agentRoot, obligation.id, {
164
+ currentSurface: { kind: "session", label: `${sessionChannel}/${sessionKey}` },
165
+ currentArtifact: `awaiting/${args.name}.md`,
166
+ nextAction: args.condition.trim(),
167
+ });
168
+ obligationId = obligation.id;
169
+ frontmatter.obligation_id = obligation.id;
170
+ }
171
+ const rendered = (0, await_parser_1.renderAwaitFile)(frontmatter, (0, session_events_1.capStructuredRecordString)(args.body ?? ""));
172
+ fs.mkdirSync(awaitingDir(agentRoot), { recursive: true });
173
+ try {
174
+ fs.writeFileSync(filePath, rendered, "utf-8");
175
+ }
176
+ catch (error) {
177
+ if (obligationId)
178
+ (0, obligations_1.fulfillObligation)(agentRoot, obligationId);
179
+ throw error;
180
+ }
181
+ (0, runtime_1.emitNervesEvent)({
182
+ component: "repertoire",
183
+ event: "repertoire.await_filed",
184
+ message: "filed new await",
185
+ meta: { agent: agentName, name: args.name, cadence: args.cadence, alert },
186
+ });
187
+ return JSON.stringify({ filed: args.name, path: filePath });
188
+ }
189
+ function archiveAwait(agentRoot, name, updates) {
190
+ const source = awaitFilePath(agentRoot, name);
191
+ /* v8 ignore start -- defensive: callers (resolve/cancel) already verify the file exists via readAwaitDefinition; this guards the file-disappears-between-calls race @preserve */
192
+ if (!fs.existsSync(source)) {
193
+ return { ok: false, error: `await "${name}" not found in awaiting/` };
194
+ }
195
+ /* v8 ignore stop */
196
+ const content = fs.readFileSync(source, "utf-8");
197
+ const current = (0, await_parser_1.parseAwaitFile)(content, source);
198
+ // merge frontmatter from the parsed file with updates
199
+ const merged = {
200
+ condition: current.condition,
201
+ cadence: current.cadence,
202
+ alert: current.alert,
203
+ mode: current.mode,
204
+ max_age: current.max_age,
205
+ wake_at: current.wake_at ?? null,
206
+ status: current.status,
207
+ created_at: current.created_at,
208
+ filed_from: current.filed_from,
209
+ filed_for_friend_id: current.filed_for_friend_id,
210
+ filed_from_key: current.filed_from_key,
211
+ request_id: current.request_id,
212
+ obligation_id: current.obligation_id,
213
+ ...updates,
214
+ };
215
+ const cappedMerged = Object.fromEntries(Object.entries(merged).map(([key, value]) => [
216
+ key,
217
+ typeof value === "string" ? (0, session_events_1.capStructuredRecordString)(value) : value,
218
+ ]));
219
+ const rendered = (0, await_parser_1.renderAwaitFile)(cappedMerged, (0, session_events_1.capStructuredRecordString)(current.body));
220
+ fs.mkdirSync(awaitingDoneDir(agentRoot), { recursive: true });
221
+ fs.writeFileSync(awaitDoneFilePath(agentRoot, name), rendered, "utf-8");
222
+ fs.unlinkSync(source);
223
+ // re-parse the archived file so callers see merged fields (e.g. resolution_observation)
224
+ const archivedContent = fs.readFileSync(awaitDoneFilePath(agentRoot, name), "utf-8");
225
+ const archived = (0, await_parser_1.parseAwaitFile)(archivedContent, awaitDoneFilePath(agentRoot, name));
226
+ return { ok: true, file: archived };
227
+ }
228
+ function fulfillAwaitObligation(agentRoot, awaitFile) {
229
+ if (awaitFile.obligation_id)
230
+ (0, obligations_1.fulfillObligation)(agentRoot, awaitFile.obligation_id);
231
+ }
232
+ async function resolveAwaitTool(name, verdict, observation, agentRoot, agentName) {
233
+ const nameError = validateName(name);
234
+ if (nameError)
235
+ return JSON.stringify({ error: nameError });
236
+ const existing = readAwaitDefinition(agentRoot, name);
237
+ if (!existing) {
238
+ return JSON.stringify({ error: `await "${name}" not found in awaiting/` });
239
+ }
240
+ if (existing.status !== "pending") {
241
+ return JSON.stringify({ error: `await "${name}" is not pending (status: ${existing.status})` });
242
+ }
243
+ if (verdict !== "yes" && verdict !== "no") {
244
+ return JSON.stringify({ error: "verdict must be 'yes' or 'no'" });
245
+ }
246
+ if (!observation || !observation.trim()) {
247
+ return JSON.stringify({ error: "observation is required" });
248
+ }
249
+ if (verdict === "no") {
250
+ // Update runtime state via recordAwaitCheck-style write
251
+ const { recordAwaitCheck } = await Promise.resolve().then(() => __importStar(require("../heart/awaiting/await-runtime-state")));
252
+ recordAwaitCheck(agentRoot, name, observation.trim(), new Date().toISOString());
253
+ (0, runtime_1.emitNervesEvent)({
254
+ component: "repertoire",
255
+ event: "repertoire.await_check_no",
256
+ message: "await checked, not yet ready",
257
+ meta: { agent: agentName, name },
258
+ });
259
+ return JSON.stringify({ verdict: "no", recorded: true });
260
+ }
261
+ // Request-bound returns stay active through Telegram prepare/send authorization.
262
+ let alert = null;
263
+ if (existing.request_id && existing.filed_from !== "external-event") {
264
+ try {
265
+ alert = await (0, await_alert_1.deliverAwaitAlert)({ awaitFile: existing, reason: "resolved", observation: observation.trim(), agentRoot, agentName, deliveryDeps: resolveDeliveryDeps(agentName) });
266
+ }
267
+ catch (error) {
268
+ (0, runtime_1.emitNervesEvent)({ level: "error", component: "repertoire", event: "repertoire.await_alert_error", message: "await alert delivery threw", meta: { agent: agentName, name, error: error instanceof Error ? error.message : String(error) } });
269
+ }
270
+ if (alert?.delivery?.status !== "delivered_now") {
271
+ return JSON.stringify({ verdict: "yes", archived: null, alert: alert ? { attempted: alert.attempted, status: alert.delivery?.status ?? null, skipped: alert.skipped ?? null } : null, advancedExternalEvents: [] });
272
+ }
273
+ }
274
+ const advancedEvents = existing.filed_from === "external-event" && existing.filed_from_key && existing.wake_at
275
+ ? (() => {
276
+ if (!hasActiveExternalEventAwait(agentName, { recordPath: existing.filed_from_key, awaitName: name, wakeAt: existing.wake_at }))
277
+ throw new Error("External event await authority changed before resolution");
278
+ const record = (0, router_1.readExternalEventRecord)(existing.filed_from_key);
279
+ if (record.agent !== agentName || record.recordPath !== existing.filed_from_key || record.executionState !== "handled"
280
+ || record.disposition?.awaitId !== name || record.disposition.nextWake.kind !== "at" || record.disposition.nextWake.at !== existing.wake_at) {
281
+ throw new Error("External event await authority changed before resolution");
282
+ }
283
+ return [(0, router_1.advanceExternalEventFromAwait)(record.recordPath, { awaitId: name, expectedVersion: record.version, expectedGeneration: record.generation })];
284
+ })()
285
+ : [];
286
+ const archive = archiveAwait(agentRoot, name, {
287
+ status: "resolved",
288
+ resolved_at: new Date().toISOString(),
289
+ resolution_observation: observation.trim(),
290
+ });
291
+ /* v8 ignore next -- defensive: archiveAwait only fails on the file-disappears-mid-call race already covered by v8 ignore inside archiveAwait @preserve */
292
+ if (!archive.ok)
293
+ return JSON.stringify({ error: archive.error });
294
+ fulfillAwaitObligation(agentRoot, archive.file);
295
+ (0, runtime_1.emitNervesEvent)({
296
+ component: "repertoire",
297
+ event: "repertoire.await_resolved",
298
+ message: "await resolved",
299
+ meta: { agent: agentName, name },
300
+ });
301
+ if (!existing.request_id) {
302
+ try {
303
+ alert = await (0, await_alert_1.deliverAwaitAlert)({ awaitFile: archive.file, reason: "resolved", observation: observation.trim(), agentRoot, agentName, deliveryDeps: resolveDeliveryDeps(agentName) });
304
+ }
305
+ catch (error) {
306
+ (0, runtime_1.emitNervesEvent)({ level: "error", component: "repertoire", event: "repertoire.await_alert_error", message: "await alert delivery threw", meta: { agent: agentName, name, error: error instanceof Error ? error.message : String(error) } });
307
+ }
308
+ }
309
+ return JSON.stringify({
310
+ verdict: "yes",
311
+ archived: awaitDoneFilePath(agentRoot, name),
312
+ alert: alert ? { attempted: alert.attempted, status: alert.delivery?.status ?? null, skipped: alert.skipped ?? null } : null,
313
+ advancedExternalEvents: advancedEvents.map((event) => event.recordPath),
314
+ });
315
+ }
316
+ function cancelAwaitTool(name, reason, agentRoot, agentName) {
317
+ const nameError = validateName(name);
318
+ if (nameError)
319
+ return JSON.stringify({ error: nameError });
320
+ const existing = readAwaitDefinition(agentRoot, name);
321
+ if (!existing) {
322
+ return JSON.stringify({ error: `await "${name}" not found in awaiting/` });
323
+ }
324
+ if (existing.status !== "pending") {
325
+ return JSON.stringify({ error: `await "${name}" is not pending (status: ${existing.status})` });
326
+ }
327
+ const updates = {
328
+ status: "canceled",
329
+ canceled_at: new Date().toISOString(),
330
+ };
331
+ if (reason && reason.trim()) {
332
+ updates.cancel_reason = reason.trim();
333
+ }
334
+ const archive = archiveAwait(agentRoot, name, updates);
335
+ /* v8 ignore next -- defensive: archiveAwait only fails on the file-disappears-mid-call race already covered by v8 ignore inside archiveAwait @preserve */
336
+ if (!archive.ok)
337
+ return JSON.stringify({ error: archive.error });
338
+ fulfillAwaitObligation(agentRoot, archive.file);
339
+ (0, runtime_1.emitNervesEvent)({
340
+ component: "repertoire",
341
+ event: "repertoire.await_canceled",
342
+ message: "await canceled",
343
+ meta: { agent: agentName, name },
344
+ });
345
+ return JSON.stringify({ canceled: name, archived: awaitDoneFilePath(agentRoot, name) });
346
+ }
347
+ function exactFileIsMissing(filePath) {
348
+ try {
349
+ fs.lstatSync(filePath);
350
+ return false;
351
+ }
352
+ catch (error) {
353
+ if (error.code === "ENOENT")
354
+ return true;
355
+ throw error;
356
+ }
357
+ }
358
+ function cancelStaleAwait(agentRoot, agentName, name, reason) {
359
+ const result = JSON.parse(cancelAwaitTool(name, reason, agentRoot, agentName));
360
+ if (result.canceled !== name)
361
+ throw new Error(`Stale await could not be archived for repair: ${result.error ?? name}`);
362
+ }
363
+ function inspectRelationshipFollowUp(agentRoot, input) {
364
+ const awaiting = readAwaitDefinition(agentRoot, input.awaitName);
365
+ if (!awaiting)
366
+ throw new Error(`Await ${input.awaitName} could not be verified`);
367
+ if (!awaiting.obligation_id)
368
+ return { active: false, reason: "request obligation is missing" };
369
+ const obligationPath = path.join(agentRoot, "arc", "obligations", `${awaiting.obligation_id}.json`);
370
+ const obligation = (0, obligations_1.readVerifiedObligations)(agentRoot).find((candidate) => candidate.id === awaiting.obligation_id);
371
+ if (!obligation) {
372
+ if (exactFileIsMissing(obligationPath))
373
+ return { active: false, reason: "request obligation is missing" };
374
+ throw new Error(`Request obligation ${awaiting.obligation_id} exists but could not be verified`);
375
+ }
376
+ if (obligation.status === "fulfilled")
377
+ return { active: false, reason: "request obligation is no longer active" };
378
+ const matches = obligation.requestId === input.requestId
379
+ && obligation.origin.friendId === input.friendId && obligation.origin.channel === input.channel && obligation.origin.key === input.key
380
+ && obligation.owedTo?.friendId === input.friendId && obligation.owedTo.channel === input.channel && obligation.owedTo.key === input.key
381
+ && obligation.currentArtifact === `awaiting/${input.awaitName}.md`
382
+ && awaiting.status === "pending" && awaiting.obligation_id === obligation.id && awaiting.request_id === input.requestId
383
+ && awaiting.filed_for_friend_id === input.friendId && awaiting.filed_from === input.channel && awaiting.filed_from_key === input.key;
384
+ if (!matches)
385
+ return { active: false, reason: "request obligation binding no longer matches" };
386
+ const maxAge = (0, cadence_1.parseCadenceToMs)(awaiting.max_age);
387
+ if (input.allowElapsed !== true && maxAge !== null && awaiting.created_at && (input.now ?? Date.now()) >= Date.parse(awaiting.created_at) + maxAge) {
388
+ return { active: false, reason: "request obligation await expired" };
389
+ }
390
+ return { active: true };
391
+ }
392
+ function hasActiveRelationshipFollowUp(agentRoot, input) {
393
+ if (input.awaitName)
394
+ return inspectRelationshipFollowUp(agentRoot, { ...input, awaitName: input.awaitName }).active;
395
+ const obligation = (0, obligations_1.readVerifiedPendingObligations)(agentRoot).find((candidate) => candidate.requestId === input.requestId
396
+ && candidate.origin.friendId === input.friendId && candidate.origin.channel === input.channel && candidate.origin.key === input.key
397
+ && candidate.owedTo?.friendId === input.friendId && candidate.owedTo.channel === input.channel && candidate.owedTo.key === input.key
398
+ && candidate.currentArtifact?.startsWith("awaiting/") && candidate.currentArtifact.endsWith(".md")
399
+ && (!input.awaitName || candidate.currentArtifact === `awaiting/${input.awaitName}.md`));
400
+ if (!obligation)
401
+ return false;
402
+ const name = path.basename(obligation.currentArtifact, ".md");
403
+ if (!VALID_NAME.test(name) || obligation.currentArtifact !== `awaiting/${name}.md`)
404
+ return false;
405
+ const awaiting = readAwaitDefinition(agentRoot, name);
406
+ if (!awaiting || awaiting.status !== "pending" || awaiting.obligation_id !== obligation.id || awaiting.request_id !== input.requestId
407
+ || awaiting.filed_for_friend_id !== input.friendId || awaiting.filed_from !== input.channel || awaiting.filed_from_key !== input.key)
408
+ return false;
409
+ const maxAge = (0, cadence_1.parseCadenceToMs)(awaiting.max_age);
410
+ return input.allowElapsed === true || maxAge === null || !awaiting.created_at || (input.now ?? Date.now()) < Date.parse(awaiting.created_at) + maxAge;
411
+ }
412
+ function hasActiveExternalEventAwait(agentName, input, root = (0, router_1.getExternalEventRoot)()) {
413
+ return inspectExternalEventAwait(agentName, input, root).active;
414
+ }
415
+ function inspectExternalEventAwait(agentName, input, root = (0, router_1.getExternalEventRoot)()) {
416
+ const relative = path.relative(path.resolve(root), path.resolve(input.recordPath));
417
+ if (relative.startsWith("..") || path.isAbsolute(relative))
418
+ throw new Error("External event await record is outside the event root");
419
+ let record;
420
+ try {
421
+ record = (0, router_1.readExternalEventRecord)(input.recordPath);
422
+ }
423
+ catch (error) {
424
+ if (error.code === "ENOENT")
425
+ return { active: false, reason: "external event disposition is missing" };
426
+ throw error;
427
+ }
428
+ const active = record.agent === agentName && record.recordPath === input.recordPath && record.executionState === "handled"
429
+ && record.disposition?.awaitId === input.awaitName && record.disposition.nextWake.kind === "at" && record.disposition.nextWake.at === input.wakeAt;
430
+ return active ? { active: true } : { active: false, reason: "external event disposition is no longer active" };
431
+ }
432
+ function cancelRelationshipFollowUps(agentRoot, agentName, input) {
433
+ const obligations = (0, obligations_1.readVerifiedPendingObligations)(agentRoot).filter((candidate) => candidate.owedTo?.friendId === input.friendId
434
+ && candidate.owedTo.channel === input.channel && candidate.owedTo.key === input.key);
435
+ for (const obligation of obligations) {
436
+ const artifact = obligation.currentArtifact;
437
+ const name = artifact?.startsWith("awaiting/") && artifact.endsWith(".md") ? path.basename(artifact, ".md") : null;
438
+ if (name && VALID_NAME.test(name) && artifact === `awaiting/${name}.md` && readAwaitDefinition(agentRoot, name)) {
439
+ cancelAwaitTool(name, "relationship revoked", agentRoot, agentName);
440
+ }
441
+ else {
442
+ (0, obligations_1.fulfillObligation)(agentRoot, obligation.id);
443
+ }
444
+ }
445
+ }
446
+ exports.awaitingToolDefinitions = [
447
+ {
448
+ tool: {
449
+ type: "function",
450
+ function: {
451
+ name: "await_condition",
452
+ description: "File a one-shot waiting condition. The daemon polls on cadence; on each tick I evaluate the condition and call resolve_await. When the condition becomes true, an alert fires via my outward channel.",
453
+ parameters: {
454
+ type: "object",
455
+ properties: {
456
+ name: { type: "string", description: "Filename stem (alphanumeric/underscore/hyphen). Must be unique." },
457
+ condition: { type: "string", description: "Natural-language condition to watch for." },
458
+ cadence: { type: "string", description: "Polling cadence (e.g. '5m', '1h')." },
459
+ alert: { type: "string", description: "Channel to alert on (e.g. 'bluebubbles', 'teams'). Defaults to filing session's channel." },
460
+ mode: { type: "string", description: "'full' or 'quick'. Defaults 'full'." },
461
+ max_age: { type: "string", description: "Optional auto-expiry (e.g. '24h')." },
462
+ wake_at: { type: "string", description: "Optional exact canonical ISO time this Await supports." },
463
+ body: { type: "string", description: "Optional notes: why I filed this, what 'ready' looks like." },
464
+ },
465
+ required: ["name", "condition", "cadence"],
466
+ },
467
+ },
468
+ },
469
+ handler: (a, ctx) => {
470
+ const agentRoot = (0, identity_1.getAgentRoot)();
471
+ const agentName = (0, identity_1.getAgentName)();
472
+ const event = ctx?.currentExternalEvent;
473
+ const eventFriendId = event ? ctx?.context?.friend.id ?? null : null;
474
+ if (event && !eventFriendId)
475
+ return JSON.stringify({ error: "external event await authority has no exact owner relationship" });
476
+ return fileAwait({
477
+ name: a.name,
478
+ condition: a.condition,
479
+ cadence: a.cadence,
480
+ alert: a.alert,
481
+ mode: a.mode,
482
+ max_age: a.max_age,
483
+ wake_at: a.wake_at,
484
+ body: a.body,
485
+ }, agentRoot, agentName, eventFriendId ?? ctx?.currentSession?.friendId ?? null, event ? "external-event" : ctx?.currentSession?.channel ?? null, event ? event.recordPath : ctx?.currentSession?.key ?? null, event ? null : ctx?.relationshipAuthorization?.requestId ?? null);
486
+ },
487
+ riskProfile: { mutates: "durable_state_write", risk: "high", reason: "files a durable await condition" },
488
+ },
489
+ {
490
+ tool: {
491
+ type: "function",
492
+ function: {
493
+ name: "resolve_await",
494
+ description: "Resolve a pending await with a verdict. verdict='yes' archives and fires the alert. verdict='no' records the observation and continues polling.",
495
+ parameters: {
496
+ type: "object",
497
+ properties: {
498
+ name: { type: "string", description: "Await name (filename stem)." },
499
+ verdict: { type: "string", description: "'yes' if the condition is met, 'no' otherwise." },
500
+ observation: { type: "string", description: "One-line summary of what I saw this tick." },
501
+ },
502
+ required: ["name", "verdict", "observation"],
503
+ },
504
+ },
505
+ },
506
+ handler: async (a, ctx) => {
507
+ const agentRoot = (0, identity_1.getAgentRoot)();
508
+ const agentName = (0, identity_1.getAgentName)();
509
+ if (ctx?.relationshipAuthorization) {
510
+ const session = ctx.currentSession;
511
+ const requestId = ctx.relationshipAuthorization.requestId;
512
+ const existing = readAwaitDefinition(agentRoot, String(a.name ?? ""));
513
+ const awaitName = String(a.name ?? "");
514
+ let binding = null;
515
+ if (session?.channel === "external-event" && existing?.wake_at) {
516
+ binding = inspectExternalEventAwait(agentName, { recordPath: session.key, awaitName, wakeAt: existing.wake_at });
517
+ }
518
+ else if (session && requestId) {
519
+ if (existing?.filed_for_friend_id !== session.friendId || existing.filed_from !== session.channel
520
+ || existing.filed_from_key !== session.key || existing.request_id !== requestId) {
521
+ return JSON.stringify({ error: "resolve_await is limited to the current relationship request or bound external event" });
522
+ }
523
+ binding = inspectRelationshipFollowUp(agentRoot, { friendId: session.friendId, channel: session.channel, key: session.key, requestId, awaitName });
524
+ }
525
+ if (binding && !binding.active) {
526
+ cancelStaleAwait(agentRoot, agentName, awaitName, binding.reason);
527
+ return JSON.stringify({ error: binding.reason });
528
+ }
529
+ if (!binding?.active)
530
+ return JSON.stringify({ error: "resolve_await is limited to the current relationship request or bound external event" });
531
+ }
532
+ return resolveAwaitTool(a.name, a.verdict, a.observation, agentRoot, agentName);
533
+ },
534
+ riskProfile: {
535
+ mutates: ["durable_state_write", "external_side_effect"],
536
+ risk: "high",
537
+ reason: "records await observations and may deliver an alert",
538
+ },
539
+ },
540
+ {
541
+ tool: {
542
+ type: "function",
543
+ function: {
544
+ name: "cancel_await",
545
+ description: "Cancel a pending await without alerting. Archives with status: canceled.",
546
+ parameters: {
547
+ type: "object",
548
+ properties: {
549
+ name: { type: "string", description: "Await name (filename stem)." },
550
+ reason: { type: "string", description: "Optional cancel reason." },
551
+ },
552
+ required: ["name"],
553
+ },
554
+ },
555
+ },
556
+ handler: (a, ctx) => {
557
+ const agentRoot = (0, identity_1.getAgentRoot)();
558
+ const agentName = (0, identity_1.getAgentName)();
559
+ if (ctx?.relationshipAuthorization) {
560
+ const session = ctx.currentSession;
561
+ const requestId = ctx.relationshipAuthorization.requestId;
562
+ if (!session || !requestId || !hasActiveRelationshipFollowUp(agentRoot, {
563
+ friendId: session.friendId,
564
+ channel: session.channel,
565
+ key: session.key,
566
+ requestId,
567
+ awaitName: String(a.name ?? ""),
568
+ }))
569
+ return JSON.stringify({ error: "cancel_await is limited to the current relationship request" });
570
+ }
571
+ return cancelAwaitTool(a.name, a.reason, agentRoot, agentName);
572
+ },
573
+ riskProfile: { mutates: "durable_state_write", risk: "high", reason: "archives a durable await condition" },
574
+ },
575
+ ];