@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,101 @@
1
+ "use strict";
2
+ /**
3
+ * Soft/hard timeout pattern for boot-path operations — Layer 2.
4
+ *
5
+ * Soft timeout = "log a warning, keep going". The op continues; the consumer
6
+ * records the warning and moves on.
7
+ * Hard timeout = "abort the op via AbortSignal". The underlying op is
8
+ * expected to honour the signal (Node child_process accepts `{ signal }`,
9
+ * fetch accepts `{ signal }`, etc.). When the signal aborts, the op should
10
+ * reject with an AbortError, and the wrapper returns
11
+ * `{ classification: "timeout-hard" }` rather than re-throwing.
12
+ *
13
+ Two optional env overrides (currently only `GIT` is consumed):
14
+ * - `OURO_BOOT_TIMEOUT_GIT_SOFT` / `OURO_BOOT_TIMEOUT_GIT_HARD` — boot
15
+ * git operations (fetch / pull). Used when `envKey === "GIT"`.
16
+ *
17
+ * Env values are parsed as integer milliseconds. Non-numeric or non-positive
18
+ * values are ignored (the explicit `softMs` / `hardMs` defaults from the
19
+ * caller win in that case).
20
+ *
21
+ * Pattern guarantee: timers cleared on resolve / reject so the function
22
+ * holds no refs after settlement. Important because `ouro up` chains
23
+ * many of these and a leaking timer would block process exit.
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.runWithTimeouts = runWithTimeouts;
27
+ function readEnvMs(name) {
28
+ const raw = process.env[name];
29
+ if (raw === undefined || raw === null)
30
+ return null;
31
+ const parsed = Number.parseInt(raw, 10);
32
+ if (!Number.isFinite(parsed) || parsed <= 0)
33
+ return null;
34
+ return parsed;
35
+ }
36
+ function resolveTimeouts(options) {
37
+ let softMs = options.softMs;
38
+ let hardMs = options.hardMs;
39
+ if (options.envKey === "GIT") {
40
+ const envSoft = readEnvMs("OURO_BOOT_TIMEOUT_GIT_SOFT");
41
+ if (envSoft !== null)
42
+ softMs = envSoft;
43
+ const envHard = readEnvMs("OURO_BOOT_TIMEOUT_GIT_HARD");
44
+ if (envHard !== null)
45
+ hardMs = envHard;
46
+ }
47
+ return { softMs, hardMs };
48
+ }
49
+ /**
50
+ * Run `fn` with soft and hard timeouts.
51
+ *
52
+ * - Returns `{ result }` on success.
53
+ * - Returns `{ classification: "timeout-hard", warnings }` when aborted.
54
+ * - Returns `{ result, warnings: [...] }` when soft tripped but op completed.
55
+ * - Rejects when `fn` throws a non-abort error (callers can wrap with
56
+ * classifier).
57
+ */
58
+ async function runWithTimeouts(fn, options) {
59
+ const { softMs, hardMs } = resolveTimeouts(options);
60
+ const controller = new AbortController();
61
+ const warnings = [];
62
+ let softTimer = setTimeout(() => {
63
+ softTimer = null;
64
+ warnings.push(`${options.label}: soft timeout exceeded (${softMs}ms) — warning, continuing until hard cut`);
65
+ }, softMs);
66
+ let hardTimer = setTimeout(() => {
67
+ hardTimer = null;
68
+ controller.abort();
69
+ }, hardMs);
70
+ const cleanup = () => {
71
+ if (softTimer !== null) {
72
+ clearTimeout(softTimer);
73
+ softTimer = null;
74
+ }
75
+ if (hardTimer !== null) {
76
+ clearTimeout(hardTimer);
77
+ hardTimer = null;
78
+ }
79
+ };
80
+ try {
81
+ const result = await fn(controller.signal);
82
+ cleanup();
83
+ // If the abort fired and the op resolved gracefully (e.g., the inner
84
+ // function caught the AbortError and returned a structured result), we
85
+ // still classify the outcome as timeout-hard — the op was aborted from
86
+ // the caller's perspective even if no exception propagated. The caller
87
+ // can ignore the classification and use `result` if both are present.
88
+ if (controller.signal.aborted) {
89
+ return { classification: "timeout-hard", warnings };
90
+ }
91
+ return { result, warnings };
92
+ }
93
+ catch (err) {
94
+ cleanup();
95
+ if (controller.signal.aborted) {
96
+ // Hard timeout fired — abort wins over whatever error the op threw.
97
+ return { classification: "timeout-hard", warnings };
98
+ }
99
+ throw err;
100
+ }
101
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createToolActivityCallbacks = createToolActivityCallbacks;
4
+ const tool_description_1 = require("./tool-description");
5
+ const runtime_1 = require("../nerves/runtime");
6
+ function createToolActivityCallbacks(options) {
7
+ (0, runtime_1.emitNervesEvent)({
8
+ component: "engine",
9
+ event: "engine.tool_activity_callbacks_created",
10
+ message: "tool activity callbacks initialized",
11
+ meta: {},
12
+ });
13
+ // Track the last description so we can reference it in END messages
14
+ let lastDescription = null;
15
+ // Track in-flight hidden tools so onToolEnd can SYMMETRICALLY suppress
16
+ // emission for the same tools that onToolStart already suppresses.
17
+ // Without this, a rejected hidden tool (e.g. settle blocked by the
18
+ // mustResolveBeforeHandoff gate or the private-runtime attention-queue gate)
19
+ // would emit "✗ <previous visible tool's description> — <hidden tool's args summary>"
20
+ // because lastDescription persists across calls and the hidden tool's summary
21
+ // (built via summarizeArgs) leaks args like settle's `answer`/`intent` into
22
+ // the visible chat. Counter map (not bool) so concurrent hidden starts don't
23
+ // underflow if ends arrive in any order.
24
+ const hiddenInFlight = new Map();
25
+ return {
26
+ onToolStart(name, args) {
27
+ const description = (0, tool_description_1.humanReadableToolDescription)(name, args);
28
+ if (description === null) {
29
+ // hidden tool (settle, rest, descend, observe, speak) — track so the
30
+ // matching onToolEnd is also suppressed symmetrically.
31
+ hiddenInFlight.set(name, (hiddenInFlight.get(name) ?? 0) + 1);
32
+ return;
33
+ }
34
+ lastDescription = description;
35
+ options.onDescription(description);
36
+ },
37
+ onToolEnd(name, summary, success) {
38
+ const hiddenCount = hiddenInFlight.get(name) ?? 0;
39
+ if (hiddenCount > 0) {
40
+ // Hidden tool's start was suppressed; suppress its end too.
41
+ if (hiddenCount === 1)
42
+ hiddenInFlight.delete(name);
43
+ else
44
+ hiddenInFlight.set(name, hiddenCount - 1);
45
+ return;
46
+ }
47
+ const desc = lastDescription ?? name;
48
+ // Strip trailing "..." from description for the result line
49
+ const cleanDesc = desc.endsWith("...") ? desc.slice(0, -3) : desc;
50
+ if (!success) {
51
+ options.onFailure(`✗ ${cleanDesc} — ${summary}`);
52
+ return;
53
+ }
54
+ if (options.isDebug()) {
55
+ options.onResult(`✓ ${cleanDesc}`);
56
+ }
57
+ },
58
+ };
59
+ }
@@ -0,0 +1,382 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApprovalExecutionFailedError = exports.ApprovalExecutionIndeterminateError = void 0;
4
+ exports.coordinateApprovalDecision = coordinateApprovalDecision;
5
+ exports.digestApprovalSuspensionCheckpointPayload = digestApprovalSuspensionCheckpointPayload;
6
+ exports.commitApprovalProposal = commitApprovalProposal;
7
+ exports.recoverApprovalProposals = recoverApprovalProposals;
8
+ exports.digestApprovalToolDefinition = digestApprovalToolDefinition;
9
+ exports.executeApprovalDecision = executeApprovalDecision;
10
+ exports.recoverClaimedApproval = recoverClaimedApproval;
11
+ exports.recoverAttemptedApproval = recoverAttemptedApproval;
12
+ const node_crypto_1 = require("node:crypto");
13
+ const approval_store_1 = require("./approval-store");
14
+ const runtime_1 = require("../nerves/runtime");
15
+ const tool_arguments_1 = require("../repertoire/tool-arguments");
16
+ class ApprovalExecutionIndeterminateError extends Error {
17
+ constructor(message) {
18
+ super(message);
19
+ this.name = "ApprovalExecutionIndeterminateError";
20
+ }
21
+ }
22
+ exports.ApprovalExecutionIndeterminateError = ApprovalExecutionIndeterminateError;
23
+ class ApprovalExecutionFailedError extends Error {
24
+ constructor(message) {
25
+ super(message);
26
+ this.name = "ApprovalExecutionFailedError";
27
+ }
28
+ }
29
+ exports.ApprovalExecutionFailedError = ApprovalExecutionFailedError;
30
+ async function coordinateApprovalDecision(options) {
31
+ return options.withSessionLease(async (lease) => {
32
+ let currentSessionRevision = options.readCurrentRevision();
33
+ const record = await options.decideAndExecute({
34
+ currentSessionRevision,
35
+ lease,
36
+ hooks: {
37
+ afterClaim: async () => {
38
+ currentSessionRevision = options.readCurrentRevision();
39
+ },
40
+ },
41
+ });
42
+ await options.persist?.(record);
43
+ await options.resume(record);
44
+ (0, runtime_1.emitNervesEvent)({
45
+ component: "engine",
46
+ event: "engine.approval_decision_coordinated",
47
+ message: "approval decision coordinated under session turn lease",
48
+ meta: { approvalId: record.approvalId, state: record.state },
49
+ });
50
+ return { record };
51
+ });
52
+ }
53
+ function checkpointMatches(record, checkpoint) {
54
+ return checkpoint.approvalId === record.approvalId
55
+ && checkpoint.checkpointDigest === record.checkpointDigest
56
+ && checkpoint.baseSessionRevision === record.baseSessionRevision
57
+ && (record.state === "preparing" || checkpoint.suspendedSessionRevision === record.suspendedSessionRevision)
58
+ && checkpoint.argumentDigest === record.argumentDigest
59
+ && checkpoint.schemaDigest === record.schemaDigest
60
+ && checkpoint.toolDigest === record.toolDigest
61
+ && checkpoint.policyDigest === record.policyDigest
62
+ && checkpoint.preCallDigest === digestTranscript(checkpoint.preCallMessages)
63
+ && record.checkpointDigest === digestApprovalSuspensionCheckpointPayload(checkpoint)
64
+ && JSON.stringify(checkpoint.frozenAssistantMessage) === JSON.stringify(record.frozenAssistantMessage);
65
+ }
66
+ function frozenCallMatches(record, checkpoint) {
67
+ const message = checkpoint.frozenAssistantMessage;
68
+ if (message.role !== "assistant")
69
+ return false;
70
+ if (!Array.isArray(message.tool_calls) || message.tool_calls.length !== 1)
71
+ return false;
72
+ const call = message.tool_calls[0];
73
+ if (!call || typeof call !== "object" || Array.isArray(call))
74
+ return false;
75
+ const callRecord = call;
76
+ if (callRecord.type !== "function")
77
+ return false;
78
+ const fn = callRecord.function;
79
+ if (!fn || typeof fn !== "object" || Array.isArray(fn))
80
+ return false;
81
+ const functionRecord = fn;
82
+ if (callRecord.id !== record.toolCallId || functionRecord.name !== record.toolName || typeof functionRecord.arguments !== "string")
83
+ return false;
84
+ try {
85
+ const parsed = JSON.parse(functionRecord.arguments);
86
+ return JSON.stringify(parsed) === JSON.stringify(record.arguments);
87
+ }
88
+ catch {
89
+ return false;
90
+ }
91
+ }
92
+ function digestTranscript(messages) {
93
+ return (0, node_crypto_1.createHash)("sha256").update(JSON.stringify(messages), "utf8").digest("hex");
94
+ }
95
+ function digestApprovalSuspensionCheckpointPayload(checkpoint) {
96
+ return (0, node_crypto_1.createHash)("sha256").update(JSON.stringify({
97
+ baseSessionRevision: checkpoint.baseSessionRevision,
98
+ argumentDigest: checkpoint.argumentDigest,
99
+ schemaDigest: checkpoint.schemaDigest,
100
+ toolDigest: checkpoint.toolDigest,
101
+ policyDigest: checkpoint.policyDigest,
102
+ preCallDigest: checkpoint.preCallDigest,
103
+ preCallMessages: checkpoint.preCallMessages,
104
+ frozenAssistantMessage: checkpoint.frozenAssistantMessage,
105
+ }), "utf8").digest("hex");
106
+ }
107
+ function digestDecisionToken(token) {
108
+ return (0, node_crypto_1.createHash)("sha256").update(token, "utf8").digest("hex");
109
+ }
110
+ function commitApprovalProposal(options) {
111
+ (0, runtime_1.emitNervesEvent)({
112
+ component: "engine",
113
+ event: "engine.approval_proposal_commit_start",
114
+ message: "approval proposal commit started",
115
+ meta: { toolName: options.proposal.toolName, toolCallId: options.proposal.toolCallId },
116
+ });
117
+ const preCallDigest = digestTranscript(options.preCallMessages);
118
+ const checkpointDigest = digestApprovalSuspensionCheckpointPayload({
119
+ baseSessionRevision: options.proposal.baseSessionRevision,
120
+ argumentDigest: (0, approval_store_1.canonicalApprovalArguments)(options.proposal.arguments).digest,
121
+ schemaDigest: options.proposal.schemaDigest,
122
+ toolDigest: options.proposal.toolDigest,
123
+ policyDigest: options.proposal.policyDigest,
124
+ preCallDigest,
125
+ preCallMessages: options.preCallMessages,
126
+ frozenAssistantMessage: options.proposal.frozenAssistantMessage,
127
+ });
128
+ const prepared = options.approvalStore.prepare({ ...options.proposal, checkpointDigest });
129
+ options.hooks?.afterJournalPrepare?.();
130
+ options.tokenStore.put(prepared.record.approvalId, prepared.decisionToken);
131
+ options.hooks?.afterTokenPersist?.();
132
+ const attestation = options.checkpointStore.write({
133
+ approvalId: prepared.record.approvalId,
134
+ baseSessionRevision: prepared.record.baseSessionRevision,
135
+ argumentDigest: prepared.record.argumentDigest,
136
+ schemaDigest: prepared.record.schemaDigest,
137
+ toolDigest: prepared.record.toolDigest,
138
+ policyDigest: prepared.record.policyDigest,
139
+ preCallDigest,
140
+ preCallMessages: structuredClone(options.preCallMessages),
141
+ frozenAssistantMessage: structuredClone(prepared.record.frozenAssistantMessage),
142
+ });
143
+ options.hooks?.afterCheckpointWrite?.();
144
+ if (attestation.checkpointDigest !== prepared.record.checkpointDigest) {
145
+ options.tokenStore.remove(prepared.record.approvalId);
146
+ options.checkpointStore.remove(prepared.record.approvalId);
147
+ options.approvalStore.recoverPreparing({
148
+ approvalId: prepared.record.approvalId,
149
+ state: "drifted",
150
+ reason: "checkpoint attestation digest mismatch",
151
+ });
152
+ (0, runtime_1.emitNervesEvent)({
153
+ level: "error",
154
+ component: "engine",
155
+ event: "engine.approval_checkpoint_attestation_mismatch",
156
+ message: "approval checkpoint durability attestation did not match proposal",
157
+ meta: { approvalId: prepared.record.approvalId },
158
+ });
159
+ throw new approval_store_1.ApprovalStoreError("checkpoint_attestation_mismatch");
160
+ }
161
+ const record = options.approvalStore.activate({
162
+ approvalId: prepared.record.approvalId,
163
+ checkpointDigest: attestation.checkpointDigest,
164
+ suspendedSessionRevision: attestation.suspendedSessionRevision,
165
+ });
166
+ (0, runtime_1.emitNervesEvent)({
167
+ component: "engine",
168
+ event: "engine.approval_proposal_commit_end",
169
+ message: "approval proposal checkpoint activated",
170
+ meta: { approvalId: record.approvalId },
171
+ });
172
+ return { record, decisionToken: prepared.decisionToken };
173
+ }
174
+ function recoverApprovalProposals(options) {
175
+ const recovered = [];
176
+ const preparing = options.approvalStore.listPreparing();
177
+ const preparingIds = new Set(preparing.map((record) => record.approvalId));
178
+ for (const checkpoint of options.checkpointStore.list()) {
179
+ if (preparingIds.has(checkpoint.approvalId) || options.approvalStore.read(checkpoint.approvalId))
180
+ continue;
181
+ options.checkpointStore.remove(checkpoint.approvalId);
182
+ recovered.push({ approvalId: checkpoint.approvalId, state: "orphan_checkpoint_removed" });
183
+ (0, runtime_1.emitNervesEvent)({
184
+ level: "warn",
185
+ component: "engine",
186
+ event: "engine.approval_orphan_checkpoint_removed",
187
+ message: "removed approval checkpoint with no journal authority",
188
+ meta: { approvalId: checkpoint.approvalId },
189
+ });
190
+ }
191
+ for (const record of preparing) {
192
+ const checkpoint = options.checkpointStore.read(record.approvalId);
193
+ const token = options.tokenStore.get(record.approvalId);
194
+ const hasToken = token !== null;
195
+ const tokenMatches = token !== null && digestDecisionToken(token) === record.decisionTokenDigest;
196
+ if (checkpoint && tokenMatches && checkpointMatches(record, checkpoint)) {
197
+ const activated = options.approvalStore.activate({
198
+ approvalId: record.approvalId,
199
+ checkpointDigest: checkpoint.checkpointDigest,
200
+ suspendedSessionRevision: checkpoint.suspendedSessionRevision,
201
+ });
202
+ recovered.push({ approvalId: record.approvalId, state: activated.state });
203
+ continue;
204
+ }
205
+ options.tokenStore.remove(record.approvalId);
206
+ if (checkpoint)
207
+ options.checkpointStore.remove(record.approvalId);
208
+ const checkpointMismatch = checkpoint !== null && !checkpointMatches(record, checkpoint);
209
+ const tokenMismatch = hasToken && !tokenMatches;
210
+ const mismatch = checkpointMismatch || tokenMismatch;
211
+ const terminal = options.approvalStore.recoverPreparing({
212
+ approvalId: record.approvalId,
213
+ state: mismatch ? "drifted" : "abandoned_before_attempt",
214
+ reason: tokenMismatch ? "decision token evidence mismatch" : mismatch ? "checkpoint evidence mismatch" : "incomplete proposal commit",
215
+ });
216
+ recovered.push({ approvalId: record.approvalId, state: terminal.state });
217
+ }
218
+ (0, runtime_1.emitNervesEvent)({
219
+ component: "engine",
220
+ event: "engine.approval_proposal_recovery",
221
+ message: "approval proposal recovery scan completed",
222
+ meta: { recoveredCount: recovered.length },
223
+ });
224
+ return recovered;
225
+ }
226
+ function terminalizeClaimed(store, claimed, state, reason) {
227
+ (0, runtime_1.emitNervesEvent)({
228
+ level: "warn",
229
+ component: "engine",
230
+ event: "engine.approval_pre_attempt_terminalized",
231
+ message: "approval stopped during live revalidation",
232
+ meta: { approvalId: claimed.approvalId, state, reason },
233
+ });
234
+ return store.terminalizeBeforeAttempt({
235
+ approvalId: claimed.approvalId,
236
+ ownerId: claimed.ownerId,
237
+ epoch: claimed.epoch,
238
+ state,
239
+ reason,
240
+ });
241
+ }
242
+ function digestApprovalToolDefinition(definition, schemaDigest, policyId) {
243
+ const binding = definition.mcpBinding;
244
+ return (0, tool_arguments_1.digestJson)({
245
+ name: definition.tool.function.name, schemaDigest, policyId, advertisedTool: JSON.parse(JSON.stringify(definition.tool)),
246
+ ...(binding ? { mcp: {
247
+ agentName: binding.agentName, agentRoot: binding.agentRoot,
248
+ server: binding.server, rawName: binding.rawName, surfacedName: binding.surfacedName,
249
+ source: binding.source, pluginId: binding.pluginId ?? null,
250
+ configDigest: binding.configDigest,
251
+ } } : {}),
252
+ });
253
+ }
254
+ async function resolveApprovalTool(options, decided) {
255
+ const definition = await options.resolveTool(decided.toolName);
256
+ if (!definition || definition.tool.function.name !== decided.toolName) {
257
+ return { ok: false, reason: "tool identity drift" };
258
+ }
259
+ const schema = definition.tool.function.parameters;
260
+ if (!schema || typeof schema !== "object") {
261
+ return { ok: false, reason: "advertised schema missing" };
262
+ }
263
+ const validated = (0, tool_arguments_1.validateAdvertisedToolArguments)(JSON.stringify(decided.arguments), schema);
264
+ if (!validated.ok || validated.value.argumentDigest !== decided.argumentDigest
265
+ || validated.value.schemaDigest !== decided.schemaDigest) {
266
+ return { ok: false, reason: "tool arguments or schema drift" };
267
+ }
268
+ const policy = await options.resolveApprovalPolicy?.(decided.toolName, validated.value.arguments)
269
+ ?? definition.approvalPolicy?.(validated.value.arguments)
270
+ ?? { kind: "not_required" };
271
+ if (policy.kind !== "required") {
272
+ return { ok: false, reason: "approval policy no longer requires approval" };
273
+ }
274
+ const toolDigest = digestApprovalToolDefinition(definition, validated.value.schemaDigest, policy.policyId);
275
+ const policyDigest = (0, tool_arguments_1.digestJson)({ policyId: policy.policyId, actionClass: policy.actionClass, classification: "required" });
276
+ if (policy.policyId !== decided.policyId || toolDigest !== decided.toolDigest || policyDigest !== decided.policyDigest) {
277
+ return { ok: false, reason: "approval policy or tool digest drift" };
278
+ }
279
+ return { ok: true, definition, arguments: validated.value.arguments };
280
+ }
281
+ async function executeApprovalDecision(options) {
282
+ const decided = options.approvalStore.decide({ ...options.decision, ownerId: options.ownerId });
283
+ if (decided.state !== "claimed")
284
+ return decided;
285
+ await options.hooks?.afterClaim?.();
286
+ let currentSessionRevision;
287
+ try {
288
+ currentSessionRevision = typeof options.currentSessionRevision === "function" ? options.currentSessionRevision() : options.currentSessionRevision;
289
+ }
290
+ catch {
291
+ return terminalizeClaimed(options.approvalStore, decided, "drifted", "current session revision is unavailable");
292
+ }
293
+ if (currentSessionRevision !== decided.suspendedSessionRevision) {
294
+ return terminalizeClaimed(options.approvalStore, decided, "session_head_changed", "suspended session revision changed");
295
+ }
296
+ const checkpoint = options.checkpointStore.read(decided.approvalId);
297
+ if (!checkpoint || !checkpointMatches(decided, checkpoint) || !frozenCallMatches(decided, checkpoint)) {
298
+ return terminalizeClaimed(options.approvalStore, decided, "drifted", "checkpoint evidence drift");
299
+ }
300
+ const current = await resolveApprovalTool(options, decided);
301
+ if (!current.ok)
302
+ return terminalizeClaimed(options.approvalStore, decided, "drifted", current.reason);
303
+ const context = {
304
+ record: structuredClone(decided),
305
+ checkpoint: structuredClone(checkpoint),
306
+ definition: current.definition,
307
+ arguments: structuredClone(current.arguments),
308
+ };
309
+ const guard = await options.liveGuard(context);
310
+ if (!guard.ok)
311
+ return terminalizeClaimed(options.approvalStore, decided, "drifted", guard.reason);
312
+ const risk = await options.liveRisk(context);
313
+ if (!risk.ok)
314
+ return terminalizeClaimed(options.approvalStore, decided, "drifted", risk.reason);
315
+ const fresh = await resolveApprovalTool(options, decided);
316
+ if (!fresh.ok)
317
+ return terminalizeClaimed(options.approvalStore, decided, "drifted", fresh.reason);
318
+ const preflight = options.preflight
319
+ ? await options.preflight({ ...context, definition: fresh.definition, arguments: structuredClone(fresh.arguments) })
320
+ : { ok: false, reason: "canonical tool preflight is unavailable" };
321
+ if (!preflight.ok)
322
+ return terminalizeClaimed(options.approvalStore, decided, "drifted", preflight.reason);
323
+ const attempted = options.approvalStore.markAttempted({
324
+ approvalId: decided.approvalId,
325
+ ownerId: decided.ownerId,
326
+ epoch: decided.epoch,
327
+ });
328
+ await options.hooks?.afterAttempt?.();
329
+ let result;
330
+ try {
331
+ result = await options.execute(attempted.toolName, structuredClone(attempted.arguments));
332
+ }
333
+ catch (error) {
334
+ if (!(error instanceof ApprovalExecutionFailedError))
335
+ throw error;
336
+ result = { kind: "handler_failed", text: `error: ${error.message}`, error };
337
+ }
338
+ if (!result || typeof result.text !== "string"
339
+ || !["rejected_before_handler", "handler_succeeded", "handler_failed", "handler_indeterminate"].includes(result.kind)) {
340
+ throw new ApprovalExecutionIndeterminateError("executor returned an invalid typed outcome; action was not retried");
341
+ }
342
+ const state = result.kind === "handler_succeeded" ? "succeeded"
343
+ : result.kind === "handler_indeterminate" ? "attempted_indeterminate" : "failed";
344
+ const emptyText = {
345
+ rejected_before_handler: "tool preflight rejected execution",
346
+ handler_succeeded: "action completed without output",
347
+ handler_failed: "action failed without details",
348
+ handler_indeterminate: "execution outcome is indeterminate; action was not retried",
349
+ };
350
+ const text = result.text.trim() ? result.text : emptyText[result.kind];
351
+ await options.hooks?.afterHandler?.();
352
+ return options.approvalStore.complete({
353
+ approvalId: attempted.approvalId,
354
+ ownerId: attempted.ownerId,
355
+ epoch: attempted.epoch,
356
+ state,
357
+ result: result.kind === "rejected_before_handler" ? `no action was taken: ${text}` : text,
358
+ });
359
+ }
360
+ function recoverClaimedApproval(options) {
361
+ const record = options.approvalStore.read(options.approvalId);
362
+ if (!record || record.state !== "claimed" || !record.ownerId)
363
+ throw new approval_store_1.ApprovalStoreError("claimed_recovery_not_eligible");
364
+ return options.approvalStore.abandonBeforeAttempt({
365
+ approvalId: record.approvalId,
366
+ ownerId: record.ownerId,
367
+ epoch: record.epoch,
368
+ reason: options.reason,
369
+ });
370
+ }
371
+ function recoverAttemptedApproval(options) {
372
+ const record = options.approvalStore.read(options.approvalId);
373
+ if (!record || record.state !== "attempted" || !record.ownerId)
374
+ throw new approval_store_1.ApprovalStoreError("attempted_recovery_not_eligible");
375
+ return options.approvalStore.complete({
376
+ approvalId: record.approvalId,
377
+ ownerId: record.ownerId,
378
+ epoch: record.epoch,
379
+ state: "attempted_indeterminate",
380
+ result: "execution outcome is indeterminate after restart; action was not retried",
381
+ });
382
+ }