@ouro.bot/cli 0.1.0-alpha.96 → 0.1.0-alpha.961

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 (759) 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 +6091 -16
  16. package/deploy/unraid/Dockerfile +58 -0
  17. package/deploy/unraid/README.txt +2997 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/credit-gateway.md +95 -0
  21. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  22. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  23. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  24. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  25. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  26. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  27. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  28. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  29. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  30. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  31. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  32. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  33. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  34. package/deploy/unraid/sanctuary-butler-upgrade.mjs +1274 -0
  35. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  36. package/deploy/unraid/sanctuary-replay-gate.mjs +1760 -0
  37. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  38. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2086 -0
  39. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  40. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  41. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  42. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  43. package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
  44. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  45. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  46. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2245 -0
  47. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  49. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  50. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +33 -0
  51. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +27 -0
  52. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +22 -0
  53. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  54. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +232 -0
  55. package/deploy/unraid/sanctuary.xml +30 -0
  56. package/dist/a2a/card.js +57 -0
  57. package/dist/a2a/client.js +250 -0
  58. package/dist/a2a/config.js +50 -0
  59. package/dist/a2a/delegated-command-grants.js +93 -0
  60. package/dist/a2a/delegated-command.js +197 -0
  61. package/dist/a2a/delegation-stores.js +56 -0
  62. package/dist/a2a/did-resolution.js +93 -0
  63. package/dist/a2a/escalation-grants.js +84 -0
  64. package/dist/a2a/escalation-wiring.js +60 -0
  65. package/dist/a2a/identity.js +258 -0
  66. package/dist/a2a/inbound-share.js +110 -0
  67. package/dist/a2a/mission-result-wire.js +196 -0
  68. package/dist/a2a/onboarding.js +133 -0
  69. package/dist/a2a/operator-trust.js +399 -0
  70. package/dist/a2a/outbox-client.js +57 -0
  71. package/dist/a2a/outbox-store.js +188 -0
  72. package/dist/a2a/outbox-wire.js +95 -0
  73. package/dist/a2a/pin-store.js +132 -0
  74. package/dist/a2a/replay-grant-holders.js +33 -0
  75. package/dist/a2a/replay-harness.js +188 -0
  76. package/dist/a2a/resolution-proof.js +53 -0
  77. package/dist/a2a/sealed-chat.js +113 -0
  78. package/dist/a2a/seen-ledger.js +120 -0
  79. package/dist/a2a/server.js +771 -0
  80. package/dist/a2a/task-store.js +69 -0
  81. package/dist/a2a/transport.js +45 -0
  82. package/dist/a2a/trust-commands.js +203 -0
  83. package/dist/a2a/trusted-files.js +185 -0
  84. package/dist/a2a/types.js +3 -0
  85. package/dist/arc/attention-types.js +8 -0
  86. package/dist/arc/cares.js +360 -0
  87. package/dist/arc/episodes.js +118 -0
  88. package/dist/arc/evolution.js +490 -0
  89. package/dist/arc/flight-recorder.js +1034 -0
  90. package/dist/arc/intentions.js +134 -0
  91. package/dist/arc/json-store.js +117 -0
  92. package/dist/arc/obligations.js +386 -0
  93. package/dist/arc/packets.js +336 -0
  94. package/dist/arc/presence.js +185 -0
  95. package/dist/arc/task-lifecycle.js +57 -0
  96. package/dist/commerce/store.js +755 -0
  97. package/dist/commerce/types.js +3 -0
  98. package/dist/gateway/keys.js +117 -0
  99. package/dist/gateway/server.js +429 -0
  100. package/dist/heart/active-work.js +798 -40
  101. package/dist/heart/agent-entry.js +252 -3
  102. package/dist/heart/approval-files.js +113 -0
  103. package/dist/heart/approval-store.js +960 -0
  104. package/dist/heart/attachments/image-normalize.js +201 -0
  105. package/dist/heart/attachments/materialize.js +97 -0
  106. package/dist/heart/attachments/originals.js +88 -0
  107. package/dist/heart/attachments/render.js +29 -0
  108. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  109. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  110. package/dist/heart/attachments/sources/index.js +18 -0
  111. package/dist/heart/attachments/sources/telegram.js +71 -0
  112. package/dist/heart/attachments/store.js +132 -0
  113. package/dist/heart/attachments/types.js +93 -0
  114. package/dist/heart/auth/auth-flow.js +511 -0
  115. package/dist/heart/autonomy-budget.js +478 -0
  116. package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
  117. package/dist/heart/awaiting/await-alert.js +152 -0
  118. package/dist/heart/awaiting/await-expiry.js +143 -0
  119. package/dist/heart/awaiting/await-loader.js +91 -0
  120. package/dist/heart/awaiting/await-parser.js +152 -0
  121. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  122. package/dist/heart/awaiting/await-scheduler.js +391 -0
  123. package/dist/heart/background-operations.js +281 -0
  124. package/dist/heart/bluebubbles-host-account.js +78 -0
  125. package/dist/heart/bridges/manager.js +137 -17
  126. package/dist/heart/bridges/store.js +14 -2
  127. package/dist/heart/bundle-state.js +168 -0
  128. package/dist/heart/commitments.js +44 -18
  129. package/dist/heart/config-registry.js +331 -0
  130. package/dist/heart/config.js +178 -131
  131. package/dist/heart/context-loss-gauntlet.js +387 -0
  132. package/dist/heart/context-loss-sentinel.js +1159 -0
  133. package/dist/heart/core.js +2377 -586
  134. package/dist/heart/cross-chat-delivery.js +9 -22
  135. package/dist/heart/daemon/agent-config-check.js +474 -0
  136. package/dist/heart/daemon/agent-discovery.js +283 -3
  137. package/dist/heart/daemon/agent-home.js +319 -0
  138. package/dist/heart/daemon/agent-service.js +542 -0
  139. package/dist/heart/daemon/agentic-repair.js +547 -0
  140. package/dist/heart/daemon/await-private-wake.js +59 -0
  141. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  142. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  143. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  144. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  145. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  146. package/dist/heart/daemon/cadence.js +180 -0
  147. package/dist/heart/daemon/cli-arg-redaction.js +26 -0
  148. package/dist/heart/daemon/cli-defaults.js +881 -0
  149. package/dist/heart/daemon/cli-desk.js +322 -0
  150. package/dist/heart/daemon/cli-exec.js +9260 -0
  151. package/dist/heart/daemon/cli-help.js +754 -0
  152. package/dist/heart/daemon/cli-parse.js +3319 -0
  153. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  154. package/dist/heart/daemon/cli-render.js +819 -0
  155. package/dist/heart/daemon/cli-types.js +8 -0
  156. package/dist/heart/daemon/connect-bay.js +323 -0
  157. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  158. package/dist/heart/daemon/container-healthcheck.js +112 -0
  159. package/dist/heart/daemon/container-runtime.js +97 -0
  160. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  161. package/dist/heart/daemon/container-spec-auditor.js +235 -0
  162. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  163. package/dist/heart/daemon/daemon-cli.js +29 -2360
  164. package/dist/heart/daemon/daemon-entry.js +953 -11
  165. package/dist/heart/daemon/daemon-health.js +186 -0
  166. package/dist/heart/daemon/daemon-rollup.js +57 -0
  167. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  168. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  169. package/dist/heart/daemon/daemon.js +2110 -104
  170. package/dist/heart/daemon/dns-workflow.js +394 -0
  171. package/dist/heart/daemon/doctor-types.js +8 -0
  172. package/dist/heart/daemon/doctor.js +1766 -0
  173. package/dist/heart/daemon/freshness.js +345 -0
  174. package/dist/heart/daemon/habit-private-wake.js +61 -0
  175. package/dist/heart/daemon/health-monitor.js +154 -11
  176. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  177. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  178. package/dist/heart/daemon/http-health-probe.js +80 -0
  179. package/dist/heart/daemon/human-command-screens.js +234 -0
  180. package/dist/heart/daemon/human-readiness.js +114 -0
  181. package/dist/heart/daemon/inner-status.js +78 -0
  182. package/dist/heart/daemon/interactive-repair.js +394 -0
  183. package/dist/heart/daemon/launchd.js +37 -8
  184. package/dist/heart/daemon/log-tailer.js +79 -10
  185. package/dist/heart/daemon/logs-prune.js +132 -0
  186. package/dist/heart/daemon/mcp-canary.js +524 -0
  187. package/dist/heart/daemon/message-router.js +65 -5
  188. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  189. package/dist/heart/daemon/os-cron-deps.js +135 -0
  190. package/dist/heart/daemon/os-cron.js +22 -14
  191. package/dist/heart/daemon/ouro-bot-entry.js +6 -3
  192. package/dist/heart/daemon/ouro-entry.js +9 -3
  193. package/dist/heart/daemon/plugin-cli.js +432 -0
  194. package/dist/heart/daemon/process-manager.js +760 -61
  195. package/dist/heart/daemon/provider-discovery.js +137 -0
  196. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  197. package/dist/heart/daemon/prunable-bundle.js +144 -0
  198. package/dist/heart/daemon/pulse.js +511 -0
  199. package/dist/heart/daemon/readiness-repair.js +365 -0
  200. package/dist/heart/daemon/run-hooks.js +2 -0
  201. package/dist/heart/daemon/runtime-logging.js +47 -14
  202. package/dist/heart/daemon/runtime-metadata.js +2 -30
  203. package/dist/heart/daemon/runtime-mode.js +13 -2
  204. package/dist/heart/daemon/safe-mode.js +161 -0
  205. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  206. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  207. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  208. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  209. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  210. package/dist/heart/daemon/sanctuary-authority-epoch.js +281 -0
  211. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  212. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  213. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1282 -0
  214. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  215. package/dist/heart/daemon/sanctuary-bundle-migration.js +730 -0
  216. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  217. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  218. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  219. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  220. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  221. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  222. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  223. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  224. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  225. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
  226. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  227. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
  228. package/dist/heart/daemon/sense-manager.js +786 -48
  229. package/dist/heart/daemon/session-id-resolver.js +131 -0
  230. package/dist/heart/daemon/skill-management-installer.js +1 -1
  231. package/dist/heart/daemon/socket-client.js +180 -12
  232. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  233. package/dist/heart/daemon/startup-tui.js +339 -0
  234. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  235. package/dist/heart/daemon/task-scheduler.js +117 -39
  236. package/dist/heart/daemon/terminal-ui.js +503 -0
  237. package/dist/heart/daemon/thoughts.js +138 -54
  238. package/dist/heart/daemon/up-progress.js +366 -0
  239. package/dist/heart/daemon/vault-items.js +56 -0
  240. package/dist/heart/delegation.js +1 -4
  241. package/dist/heart/external-events/router.js +1531 -0
  242. package/dist/heart/failure-reports.js +336 -0
  243. package/dist/heart/file-lock.js +109 -0
  244. package/dist/heart/frontend-approval-runtime.js +506 -0
  245. package/dist/heart/frontend-journal.js +215 -0
  246. package/dist/heart/frontend-session-service.js +271 -0
  247. package/dist/heart/frontend-socket-client.js +173 -0
  248. package/dist/heart/frontend-socket.js +434 -0
  249. package/dist/heart/frontend-turn-errors.js +20 -0
  250. package/dist/heart/habits/habit-cancel.js +810 -0
  251. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  252. package/dist/heart/habits/habit-migration.js +194 -0
  253. package/dist/heart/habits/habit-parser.js +278 -0
  254. package/dist/heart/habits/habit-runtime-state.js +93 -0
  255. package/dist/heart/habits/habit-scheduler.js +653 -0
  256. package/dist/heart/habits/habit-session-summary.js +318 -0
  257. package/dist/heart/habits/habit-session.js +636 -0
  258. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  259. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  260. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  261. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  262. package/dist/heart/identity.js +239 -59
  263. package/dist/heart/kept-notes.js +289 -0
  264. package/dist/heart/kicks.js +1 -1
  265. package/dist/heart/machine-identity.js +175 -0
  266. package/dist/heart/mail-import-discovery.js +356 -0
  267. package/dist/heart/mailbox/mailbox-http-hooks.js +99 -0
  268. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  269. package/dist/heart/mailbox/mailbox-http-routes.js +406 -0
  270. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  271. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  272. package/dist/heart/mailbox/mailbox-http.js +99 -0
  273. package/dist/heart/mailbox/mailbox-read.js +41 -0
  274. package/dist/heart/mailbox/mailbox-supervision.js +131 -0
  275. package/dist/heart/mailbox/mailbox-types.js +27 -0
  276. package/dist/heart/mailbox/mailbox-view.js +197 -0
  277. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  278. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  279. package/dist/heart/mailbox/readers/mail.js +375 -0
  280. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  281. package/dist/heart/mailbox/readers/sessions.js +231 -0
  282. package/dist/heart/mailbox/readers/shared.js +111 -0
  283. package/dist/heart/mcp/mcp-server.js +760 -0
  284. package/dist/heart/migrate-config.js +100 -0
  285. package/dist/heart/model-capabilities.js +83 -16
  286. package/dist/heart/orientation-frame.js +345 -0
  287. package/dist/heart/platform.js +81 -0
  288. package/dist/heart/primitives.js +1 -1
  289. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  290. package/dist/heart/private-runtime/index.js +18 -0
  291. package/dist/heart/private-runtime/ledger.js +221 -0
  292. package/dist/heart/private-runtime/policy.js +260 -0
  293. package/dist/heart/private-runtime/types.js +2 -0
  294. package/dist/heart/progress-story.js +1 -1
  295. package/dist/heart/provider-attempt.js +137 -0
  296. package/dist/heart/provider-binding-resolver.js +273 -0
  297. package/dist/heart/provider-credentials.js +449 -0
  298. package/dist/heart/provider-failover.js +311 -0
  299. package/dist/heart/provider-models.js +96 -0
  300. package/dist/heart/provider-ping.js +266 -0
  301. package/dist/heart/provider-readiness-cache.js +119 -0
  302. package/dist/heart/provider-visibility.js +188 -0
  303. package/dist/heart/providers/anthropic-token.js +131 -0
  304. package/dist/heart/providers/anthropic.js +248 -67
  305. package/dist/heart/providers/azure.js +23 -11
  306. package/dist/heart/providers/error-classification.js +129 -0
  307. package/dist/heart/providers/github-copilot.js +38 -39
  308. package/dist/heart/providers/minimax-vlm.js +189 -0
  309. package/dist/heart/providers/minimax.js +26 -8
  310. package/dist/heart/providers/openai-codex-token.js +349 -0
  311. package/dist/heart/providers/openai-codex.js +55 -40
  312. package/dist/heart/providers/openai-compatible.js +177 -0
  313. package/dist/heart/reach-channel.js +85 -0
  314. package/dist/heart/reply-style.js +52 -0
  315. package/dist/heart/run-ledger.js +247 -0
  316. package/dist/heart/runtime-capability-check.js +170 -0
  317. package/dist/heart/runtime-credentials.js +608 -0
  318. package/dist/heart/runtime-cwd.js +87 -0
  319. package/dist/heart/sense-truth.js +24 -4
  320. package/dist/heart/session-activity.js +94 -24
  321. package/dist/heart/session-events.js +1521 -0
  322. package/dist/heart/session-playback-cli-main.js +5 -0
  323. package/dist/heart/session-playback-cli.js +36 -0
  324. package/dist/heart/session-playback.js +231 -0
  325. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  326. package/dist/heart/session-redaction-repair.js +552 -0
  327. package/dist/heart/session-stats-cli-main.js +5 -0
  328. package/dist/heart/session-stats.js +183 -0
  329. package/dist/heart/session-transcript.js +133 -0
  330. package/dist/heart/shelf-claims.js +78 -0
  331. package/dist/heart/shepherd/custody-types.js +2 -0
  332. package/dist/heart/shepherd/mandates.js +352 -0
  333. package/dist/heart/shepherd/operation-commands.js +19 -0
  334. package/dist/heart/shepherd/operations.js +135 -0
  335. package/dist/heart/shepherd/supervision.js +114 -0
  336. package/dist/heart/shepherd/types.js +2 -0
  337. package/dist/heart/shepherd-config.js +123 -0
  338. package/dist/heart/source-grounding.js +302 -0
  339. package/dist/heart/start-of-turn-packet.js +372 -0
  340. package/dist/heart/steward-policy.js +656 -0
  341. package/dist/heart/streaming.js +631 -207
  342. package/dist/heart/structured-output.js +196 -0
  343. package/dist/heart/sync-classification.js +176 -0
  344. package/dist/heart/sync-health.js +152 -0
  345. package/dist/heart/sync.js +726 -0
  346. package/dist/heart/target-resolution.js +11 -7
  347. package/dist/heart/tempo.js +93 -0
  348. package/dist/heart/temporal-view.js +41 -0
  349. package/dist/heart/timeouts.js +101 -0
  350. package/dist/heart/tool-activity-callbacks.js +59 -0
  351. package/dist/heart/tool-approval.js +382 -0
  352. package/dist/heart/tool-description.js +155 -0
  353. package/dist/heart/tool-friction.js +55 -0
  354. package/dist/heart/tool-loop.js +206 -0
  355. package/dist/heart/turn-context.js +496 -0
  356. package/dist/heart/turn-execution-lease.js +30 -0
  357. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  358. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  359. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  360. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  361. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  362. package/dist/heart/versioning/release-sources.js +173 -0
  363. package/dist/heart/versioning/self-update-defaults.js +294 -0
  364. package/dist/heart/versioning/self-update.js +196 -0
  365. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  366. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  367. package/dist/heart/versioning/update-hooks.js +154 -0
  368. package/dist/heart/versioning/update-state.js +126 -0
  369. package/dist/heart/versioning/updater-launchd.js +150 -0
  370. package/dist/heart/versioning/version-intent.js +114 -0
  371. package/dist/heart/work-card.js +380 -0
  372. package/dist/mailbox-ui/assets/index-Dbska1tZ.js +1 -0
  373. package/dist/mailbox-ui/assets/index-DsiKaPyH.css +1 -0
  374. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  375. package/dist/mailbox-ui/index.html +16 -0
  376. package/dist/mailroom/attention.js +167 -0
  377. package/dist/mailroom/autonomy.js +209 -0
  378. package/dist/mailroom/blob-store.js +889 -0
  379. package/dist/mailroom/body-cache.js +61 -0
  380. package/dist/mailroom/cache-sync-cli.js +58 -0
  381. package/dist/mailroom/core.js +803 -0
  382. package/dist/mailroom/entry.js +160 -0
  383. package/dist/mailroom/file-store.js +568 -0
  384. package/dist/mailroom/hosted-cache-sync.js +384 -0
  385. package/dist/mailroom/mbox-import.js +393 -0
  386. package/dist/mailroom/migration.js +164 -0
  387. package/dist/mailroom/outbound.js +380 -0
  388. package/dist/mailroom/policy.js +263 -0
  389. package/dist/mailroom/reader.js +292 -0
  390. package/dist/mailroom/search-cache.js +513 -0
  391. package/dist/mailroom/search-relevance.js +319 -0
  392. package/dist/mailroom/smtp-ingress.js +176 -0
  393. package/dist/mailroom/source-state.js +176 -0
  394. package/dist/mailroom/thread.js +109 -0
  395. package/dist/mailroom/travel-extract.js +89 -0
  396. package/dist/mind/bundle-manifest.js +24 -2
  397. package/dist/mind/context.js +328 -139
  398. package/dist/mind/desk-section.js +362 -0
  399. package/dist/mind/diary-integrity.js +60 -0
  400. package/dist/mind/{memory.js → diary.js} +68 -77
  401. package/dist/mind/embedding-provider.js +60 -0
  402. package/dist/mind/file-state.js +179 -0
  403. package/dist/mind/friend-link-codes.js +209 -0
  404. package/dist/mind/friend-merge.js +336 -0
  405. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  406. package/dist/mind/obligation-steering.js +199 -3
  407. package/dist/mind/outbound-record.js +168 -0
  408. package/dist/mind/pending.js +36 -10
  409. package/dist/mind/prompt-budget.js +479 -0
  410. package/dist/mind/prompt-refresh.js +3 -2
  411. package/dist/mind/prompt.js +1085 -198
  412. package/dist/mind/provenance-trust.js +26 -0
  413. package/dist/mind/record-paths.js +312 -0
  414. package/dist/mind/scrutiny.js +173 -0
  415. package/dist/mind/session-transaction.js +622 -0
  416. package/dist/nerves/cli-logging.js +7 -1
  417. package/dist/nerves/coverage/audit-rules.js +15 -6
  418. package/dist/nerves/coverage/audit.js +28 -2
  419. package/dist/nerves/coverage/cli.js +1 -1
  420. package/dist/nerves/coverage/contract.js +5 -5
  421. package/dist/nerves/coverage/file-completeness.js +143 -5
  422. package/dist/nerves/coverage/run-artifacts.js +55 -35
  423. package/dist/nerves/coverage/source-scanner.js +4 -4
  424. package/dist/nerves/event-buffer.js +111 -0
  425. package/dist/nerves/index.js +293 -9
  426. package/dist/nerves/observation.js +20 -0
  427. package/dist/nerves/redact.js +79 -0
  428. package/dist/nerves/review/cli-main.js +5 -0
  429. package/dist/nerves/review/cli.js +156 -0
  430. package/dist/nerves/review/core.js +159 -0
  431. package/dist/nerves/runtime.js +17 -1
  432. package/dist/repertoire/ado-client.js +15 -56
  433. package/dist/repertoire/ado-semantic.js +16 -10
  434. package/dist/repertoire/api-client.js +97 -0
  435. package/dist/repertoire/bitwarden-store.js +1201 -0
  436. package/dist/repertoire/bundle-templates.js +71 -0
  437. package/dist/repertoire/bw-installer.js +231 -0
  438. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  439. package/dist/repertoire/coding/context-pack.js +331 -0
  440. package/dist/repertoire/coding/feedback.js +174 -32
  441. package/dist/repertoire/coding/index.js +15 -3
  442. package/dist/repertoire/coding/manager.js +159 -10
  443. package/dist/repertoire/coding/spawner.js +40 -11
  444. package/dist/repertoire/coding/tools.js +182 -18
  445. package/dist/repertoire/coding/workbench-client.js +272 -0
  446. package/dist/repertoire/coding/workbench-manager.js +346 -0
  447. package/dist/repertoire/commerce-errors.js +109 -0
  448. package/dist/repertoire/commerce-self-test.js +156 -0
  449. package/dist/repertoire/credential-access.js +183 -0
  450. package/dist/repertoire/desk/classifier.js +362 -0
  451. package/dist/repertoire/duffel-client.js +185 -0
  452. package/dist/repertoire/github-client.js +14 -55
  453. package/dist/repertoire/graph-client.js +11 -52
  454. package/dist/repertoire/guardrails.js +971 -20
  455. package/dist/repertoire/house-sweep.js +471 -0
  456. package/dist/repertoire/mcp-client.js +58 -5
  457. package/dist/repertoire/mcp-manager.js +427 -139
  458. package/dist/repertoire/mcp-tools.js +132 -0
  459. package/dist/repertoire/mcp-write-guard.js +46 -0
  460. package/dist/repertoire/plugin-mcp.js +175 -0
  461. package/dist/repertoire/plugins.js +253 -0
  462. package/dist/repertoire/relationship-authorization.js +322 -0
  463. package/dist/repertoire/sanctuary-container-policy.js +46 -0
  464. package/dist/repertoire/shell-sessions.js +134 -0
  465. package/dist/repertoire/skills.js +48 -4
  466. package/dist/repertoire/stripe-client.js +131 -0
  467. package/dist/repertoire/tool-arguments.js +182 -0
  468. package/dist/repertoire/tool-results.js +29 -0
  469. package/dist/repertoire/tools-a2a.js +699 -0
  470. package/dist/repertoire/tools-attachments.js +322 -0
  471. package/dist/repertoire/tools-awaiting.js +891 -0
  472. package/dist/repertoire/tools-base.js +83 -1168
  473. package/dist/repertoire/tools-bluebubbles.js +2 -0
  474. package/dist/repertoire/tools-bridge.js +144 -0
  475. package/dist/repertoire/tools-bundle.js +995 -0
  476. package/dist/repertoire/tools-commerce.js +253 -0
  477. package/dist/repertoire/tools-config.js +186 -0
  478. package/dist/repertoire/tools-continuity.js +588 -0
  479. package/dist/repertoire/tools-credential.js +383 -0
  480. package/dist/repertoire/tools-escalation.js +84 -0
  481. package/dist/repertoire/tools-evolution.js +527 -0
  482. package/dist/repertoire/tools-files.js +344 -0
  483. package/dist/repertoire/tools-flight.js +290 -0
  484. package/dist/repertoire/tools-flow.js +119 -0
  485. package/dist/repertoire/tools-friend-link.js +57 -0
  486. package/dist/repertoire/tools-github.js +3 -8
  487. package/dist/repertoire/tools-habits.js +103 -0
  488. package/dist/repertoire/tools-house-care.js +174 -0
  489. package/dist/repertoire/tools-mail.js +1828 -0
  490. package/dist/repertoire/tools-notes.js +501 -0
  491. package/dist/repertoire/tools-obligations.js +182 -0
  492. package/dist/repertoire/tools-orientation.js +31 -0
  493. package/dist/repertoire/tools-record.js +482 -0
  494. package/dist/repertoire/tools-rsvp.js +139 -0
  495. package/dist/repertoire/tools-runtime.js +238 -0
  496. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  497. package/dist/repertoire/tools-session.js +1141 -0
  498. package/dist/repertoire/tools-shell.js +154 -0
  499. package/dist/repertoire/tools-shepherd-guidance.js +171 -0
  500. package/dist/repertoire/tools-shepherd.js +325 -0
  501. package/dist/repertoire/tools-steward-policy.js +147 -0
  502. package/dist/repertoire/tools-stripe.js +224 -0
  503. package/dist/repertoire/tools-surface.js +369 -0
  504. package/dist/repertoire/tools-teams.js +50 -39
  505. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  506. package/dist/repertoire/tools-travel.js +125 -0
  507. package/dist/repertoire/tools-trip.js +982 -0
  508. package/dist/repertoire/tools-unraid.js +556 -0
  509. package/dist/repertoire/tools-user-profile.js +146 -0
  510. package/dist/repertoire/tools-vault.js +40 -0
  511. package/dist/repertoire/tools-voice-local.js +198 -0
  512. package/dist/repertoire/tools-voice.js +145 -0
  513. package/dist/repertoire/tools.js +518 -156
  514. package/dist/repertoire/travel-api-client.js +360 -0
  515. package/dist/repertoire/unraid-client.js +155 -0
  516. package/dist/repertoire/unraid-restart.js +339 -0
  517. package/dist/repertoire/user-profile.js +131 -0
  518. package/dist/repertoire/vault-setup.js +246 -0
  519. package/dist/repertoire/vault-unlock.js +686 -0
  520. package/dist/rsvp/aisleplanner-client.js +354 -0
  521. package/dist/rsvp/cli.js +936 -0
  522. package/dist/rsvp/config.js +327 -0
  523. package/dist/rsvp/cutover.js +433 -0
  524. package/dist/rsvp/diagnostics.js +232 -0
  525. package/dist/rsvp/diff-renderer.js +176 -0
  526. package/dist/rsvp/habit-policy.js +110 -0
  527. package/dist/rsvp/habit-stage.js +123 -0
  528. package/dist/rsvp/incident-bundle.js +97 -0
  529. package/dist/rsvp/migration.js +204 -0
  530. package/dist/rsvp/native-habit-runner.js +630 -0
  531. package/dist/rsvp/outbound-state.js +628 -0
  532. package/dist/rsvp/query.js +118 -0
  533. package/dist/rsvp/replay.js +233 -0
  534. package/dist/rsvp/snapshot.js +232 -0
  535. package/dist/rsvp/spend-ledger.js +175 -0
  536. package/dist/scripts/claude-code-hook.js +41 -0
  537. package/dist/scripts/claude-code-stop-hook.js +47 -0
  538. package/dist/senses/a2a-entry.js +132 -0
  539. package/dist/senses/acp-server.js +386 -0
  540. package/dist/senses/attention-queue.js +186 -0
  541. package/dist/senses/await-turn-message.js +65 -0
  542. package/dist/senses/bluebubbles/active-turns.js +216 -0
  543. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  544. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  545. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +385 -43
  546. package/dist/senses/bluebubbles/context-packet.js +207 -0
  547. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  548. package/dist/senses/bluebubbles/entry.js +90 -0
  549. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  550. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  551. package/dist/senses/bluebubbles/index.js +4040 -0
  552. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  553. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  554. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  555. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  556. package/dist/senses/bluebubbles/outbound-state.js +335 -0
  557. package/dist/senses/bluebubbles/processed-log.js +133 -0
  558. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  559. package/dist/senses/bluebubbles/replay.js +284 -0
  560. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  561. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  562. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  563. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  564. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  565. package/dist/senses/cli/bracketed-paste.js +82 -0
  566. package/dist/senses/cli/image-paste.js +287 -0
  567. package/dist/senses/cli/image-ref-navigation.js +75 -0
  568. package/dist/senses/cli/ink-app.js +156 -0
  569. package/dist/senses/cli/inline-diff.js +64 -0
  570. package/dist/senses/cli/input-keys.js +174 -0
  571. package/dist/senses/cli/kill-ring.js +86 -0
  572. package/dist/senses/cli/message-list.js +51 -0
  573. package/dist/senses/cli/ouro-tui.js +607 -0
  574. package/dist/senses/cli/spinner-imperative.js +135 -0
  575. package/dist/senses/cli/spinner.js +101 -0
  576. package/dist/senses/cli/status-line.js +60 -0
  577. package/dist/senses/cli/streaming-markdown.js +526 -0
  578. package/dist/senses/cli/tool-display.js +85 -0
  579. package/dist/senses/cli/tool-render.js +85 -0
  580. package/dist/senses/cli/tui-store.js +241 -0
  581. package/dist/senses/cli/virtual-list.js +35 -0
  582. package/dist/senses/cli-entry.js +60 -8
  583. package/dist/senses/cli.js +570 -309
  584. package/dist/senses/commands.js +66 -3
  585. package/dist/senses/context-packet-ledger.js +371 -0
  586. package/dist/senses/context-packets.js +154 -0
  587. package/dist/senses/habit-lifecycle-guard.js +24 -0
  588. package/dist/senses/habit-turn-message.js +160 -0
  589. package/dist/senses/ingress-evidence.js +2 -0
  590. package/dist/senses/mail-entry.js +66 -0
  591. package/dist/senses/mail.js +524 -0
  592. package/dist/senses/pipeline.js +1158 -204
  593. package/dist/senses/private-runtime-worker.js +857 -0
  594. package/dist/senses/private-runtime.js +1627 -0
  595. package/dist/senses/proactive-content-guard.js +51 -0
  596. package/dist/senses/root-host-approval-port.js +345 -0
  597. package/dist/senses/root-host-approval-runtime.js +393 -0
  598. package/dist/senses/sanctuary-authority-resident.js +102 -0
  599. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  600. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  601. package/dist/senses/sanctuary-grounding.js +118 -0
  602. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  603. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  604. package/dist/senses/sanctuary-health-runner.js +104 -0
  605. package/dist/senses/sanctuary-health.js +448 -0
  606. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  607. package/dist/senses/sanctuary-interactive-control.js +410 -0
  608. package/dist/senses/sanctuary-media-catalog-contract.js +268 -0
  609. package/dist/senses/sanctuary-media-optimization.js +514 -0
  610. package/dist/senses/sanctuary-runtime.js +369 -0
  611. package/dist/senses/sanctuary-sab.js +85 -0
  612. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  613. package/dist/senses/shared-turn.js +804 -0
  614. package/dist/senses/shepherd/agent-presentation.js +88 -0
  615. package/dist/senses/shepherd/attention-page.js +166 -0
  616. package/dist/senses/shepherd/attention-sidebar.js +76 -0
  617. package/dist/senses/shepherd/attention.js +295 -0
  618. package/dist/senses/shepherd/checkin-config.js +76 -0
  619. package/dist/senses/shepherd/checkin-store.js +386 -0
  620. package/dist/senses/shepherd/client.js +196 -0
  621. package/dist/senses/shepherd/cmux.js +483 -0
  622. package/dist/senses/shepherd/composer.js +336 -0
  623. package/dist/senses/shepherd/copilot-app.js +648 -0
  624. package/dist/senses/shepherd/feedback-reply.js +108 -0
  625. package/dist/senses/shepherd/feedback-source.js +20 -0
  626. package/dist/senses/shepherd/feedback-store.js +331 -0
  627. package/dist/senses/shepherd/feedback-submit.js +182 -0
  628. package/dist/senses/shepherd/feedback-worker.js +208 -0
  629. package/dist/senses/shepherd/guidance.js +273 -0
  630. package/dist/senses/shepherd/herdr.js +427 -0
  631. package/dist/senses/shepherd/host.js +17 -0
  632. package/dist/senses/shepherd/human-decision-guard.js +29 -0
  633. package/dist/senses/shepherd/judge-evaluation-command.js +183 -0
  634. package/dist/senses/shepherd/judge-evaluation-entry.js +13 -0
  635. package/dist/senses/shepherd/judge-evaluation.js +155 -0
  636. package/dist/senses/shepherd/judge.js +202 -0
  637. package/dist/senses/shepherd/notice-outbox.js +262 -0
  638. package/dist/senses/shepherd/observation-publisher.js +320 -0
  639. package/dist/senses/shepherd/operations-defaults.js +86 -0
  640. package/dist/senses/shepherd/operations.js +159 -0
  641. package/dist/senses/shepherd/owner-notice.js +467 -0
  642. package/dist/senses/shepherd/prompt-state.js +60 -0
  643. package/dist/senses/shepherd/recovery.js +543 -0
  644. package/dist/senses/shepherd/redact.js +66 -0
  645. package/dist/senses/shepherd/returns.js +79 -0
  646. package/dist/senses/shepherd/sense.js +821 -0
  647. package/dist/senses/shepherd/shepherd-judge-corpus-v1.json +170 -0
  648. package/dist/senses/shepherd/surface.js +123 -0
  649. package/dist/senses/shepherd/target-binding.js +13 -0
  650. package/dist/senses/shepherd/terminal-process.js +147 -0
  651. package/dist/senses/shepherd-entry.js +98 -0
  652. package/dist/senses/surface-tool.js +109 -0
  653. package/dist/senses/teams-entry.js +68 -8
  654. package/dist/senses/teams-image.js +119 -0
  655. package/dist/senses/teams.js +949 -337
  656. package/dist/senses/telegram-admission.js +718 -0
  657. package/dist/senses/telegram-approval-runtime.js +793 -0
  658. package/dist/senses/telegram-attachments.js +186 -0
  659. package/dist/senses/telegram-audit-ledger.js +220 -0
  660. package/dist/senses/telegram-authority-transport.js +231 -0
  661. package/dist/senses/telegram-client.js +1749 -0
  662. package/dist/senses/telegram-effect-adapter.js +904 -0
  663. package/dist/senses/telegram-entry.js +83 -0
  664. package/dist/senses/telegram-handoff.js +154 -0
  665. package/dist/senses/telegram.js +2466 -0
  666. package/dist/senses/trust-gate.js +104 -9
  667. package/dist/senses/voice/audio-playback.js +237 -0
  668. package/dist/senses/voice/audio-routing.js +119 -0
  669. package/dist/senses/voice/call-auth.js +250 -0
  670. package/dist/senses/voice/elevenlabs.js +202 -0
  671. package/dist/senses/voice/floor-control.js +431 -0
  672. package/dist/senses/voice/floor-controller.js +115 -0
  673. package/dist/senses/voice/golden-path.js +116 -0
  674. package/dist/senses/voice/index.js +29 -0
  675. package/dist/senses/voice/local-audio-control.js +344 -0
  676. package/dist/senses/voice/local-audio-devices.js +516 -0
  677. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  678. package/dist/senses/voice/local-audio-identity.js +103 -0
  679. package/dist/senses/voice/local-audio-join.js +325 -0
  680. package/dist/senses/voice/local-audio-mute.js +199 -0
  681. package/dist/senses/voice/local-audio-notify.js +124 -0
  682. package/dist/senses/voice/local-audio-prompts.js +116 -0
  683. package/dist/senses/voice/local-audio-transport.js +427 -0
  684. package/dist/senses/voice/local-audio.js +281 -0
  685. package/dist/senses/voice/local-media-stream.js +145 -0
  686. package/dist/senses/voice/meeting.js +113 -0
  687. package/dist/senses/voice/outbound.js +190 -0
  688. package/dist/senses/voice/phone.js +33 -0
  689. package/dist/senses/voice/playback.js +139 -0
  690. package/dist/senses/voice/process-guards.js +51 -0
  691. package/dist/senses/voice/realtime-eval.js +496 -0
  692. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  693. package/dist/senses/voice/realtime-trace.js +531 -0
  694. package/dist/senses/voice/transcript.js +70 -0
  695. package/dist/senses/voice/turn.js +191 -0
  696. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  697. package/dist/senses/voice/twilio-phone.js +5454 -0
  698. package/dist/senses/voice/types.js +2 -0
  699. package/dist/senses/voice/whisper.js +161 -0
  700. package/dist/senses/voice-entry.js +83 -0
  701. package/dist/senses/voice-realtime-eval-command.js +99 -0
  702. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  703. package/dist/senses/voice-twilio-entry.js +87 -0
  704. package/dist/trips/core.js +138 -0
  705. package/dist/trips/store.js +265 -0
  706. package/dist/util/frontmatter.js +69 -0
  707. package/npm-shrinkwrap.json +8165 -0
  708. package/package.json +75 -13
  709. package/skills/agent-commerce.md +113 -0
  710. package/skills/browser-navigation.md +117 -0
  711. package/skills/commerce-setup-guide.md +116 -0
  712. package/skills/commerce-setup.md +84 -0
  713. package/skills/configure-dev-tools.md +99 -0
  714. package/skills/travel-planning.md +138 -0
  715. package/dist/heart/daemon/auth-flow.js +0 -430
  716. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  717. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  718. package/dist/heart/daemon/update-hooks.js +0 -138
  719. package/dist/heart/obligations.js +0 -191
  720. package/dist/heart/safe-workspace.js +0 -381
  721. package/dist/heart/session-recall.js +0 -116
  722. package/dist/mind/friends/channel.js +0 -84
  723. package/dist/mind/friends/group-context.js +0 -144
  724. package/dist/mind/friends/resolver.js +0 -84
  725. package/dist/mind/friends/store-file.js +0 -190
  726. package/dist/mind/friends/store.js +0 -4
  727. package/dist/mind/friends/tokens.js +0 -26
  728. package/dist/mind/friends/trust-explanation.js +0 -74
  729. package/dist/mind/friends/types.js +0 -29
  730. package/dist/repertoire/tasks/board.js +0 -134
  731. package/dist/repertoire/tasks/index.js +0 -224
  732. package/dist/repertoire/tasks/lifecycle.js +0 -80
  733. package/dist/repertoire/tasks/middleware.js +0 -65
  734. package/dist/repertoire/tasks/parser.js +0 -173
  735. package/dist/repertoire/tasks/scanner.js +0 -132
  736. package/dist/repertoire/tasks/transitions.js +0 -144
  737. package/dist/senses/bluebubbles-entry.js +0 -13
  738. package/dist/senses/bluebubbles.js +0 -1181
  739. package/dist/senses/debug-activity.js +0 -154
  740. package/dist/senses/inner-dialog-worker.js +0 -90
  741. package/dist/senses/inner-dialog.js +0 -525
  742. package/subagents/README.md +0 -7
  743. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  744. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  745. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  746. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  747. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  748. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  749. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  750. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  751. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  752. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  753. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  754. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  755. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  756. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  757. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  758. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  759. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,76 @@
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.normalizeShepherdCheckInMinutes = normalizeShepherdCheckInMinutes;
37
+ exports.readShepherdCheckInMinutes = readShepherdCheckInMinutes;
38
+ const fs = __importStar(require("node:fs"));
39
+ const path = __importStar(require("node:path"));
40
+ const runtime_1 = require("../../nerves/runtime");
41
+ function normalizeShepherdCheckInMinutes(value) {
42
+ if (value === undefined)
43
+ return 60;
44
+ if (typeof value === "number" && Number.isInteger(value) && (value === 0 || value >= 30 && value <= 1440))
45
+ return value;
46
+ (0, runtime_1.emitNervesEvent)({
47
+ level: "error", component: "config/identity", event: "config_identity.error",
48
+ message: "agent config has invalid Shepherd check-in cadence", meta: { field: "senses.shepherd.checkInMinutes" },
49
+ });
50
+ throw new Error("senses.shepherd.checkInMinutes must be 0 or an integer from 30 through 1440");
51
+ }
52
+ function object(value) {
53
+ return !!value && typeof value === "object" && !Array.isArray(value);
54
+ }
55
+ function readShepherdCheckInMinutes(agentRoot) {
56
+ try {
57
+ let value = JSON.parse(fs.readFileSync(path.join(agentRoot, "agent.json"), "utf8"));
58
+ for (const key of ["senses", "shepherd"]) {
59
+ if (!object(value))
60
+ throw new Error("agent.json has invalid Shepherd check-in config");
61
+ value = value[key];
62
+ if (value === undefined)
63
+ return normalizeShepherdCheckInMinutes(undefined);
64
+ }
65
+ if (!object(value))
66
+ throw new Error("agent.json has invalid Shepherd check-in config");
67
+ return normalizeShepherdCheckInMinutes(value.checkInMinutes);
68
+ }
69
+ catch (error) {
70
+ (0, runtime_1.emitNervesEvent)({
71
+ level: "error", component: "config/identity", event: "config_identity.error",
72
+ message: "could not read Shepherd check-in configuration", meta: { operation: "read_check_in_config" },
73
+ });
74
+ throw error;
75
+ }
76
+ }
@@ -0,0 +1,386 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.refuseCustody = refuseCustody;
40
+ exports.validCustodyInputReceipt = validCustodyInputReceipt;
41
+ exports.copyCustodyInputReceipt = copyCustodyInputReceipt;
42
+ exports.parseCustodyDispatch = parseCustodyDispatch;
43
+ exports.validateCustodyDirectory = validateCustodyDirectory;
44
+ exports.checkInStorePath = checkInStorePath;
45
+ exports.assertNoCustodyMaintenance = assertNoCustodyMaintenance;
46
+ exports.custodyCapacity = custodyCapacity;
47
+ exports.custodyRevision = custodyRevision;
48
+ exports.advanceCustodyRevision = advanceCustodyRevision;
49
+ exports.hasRetiredCustodyInstance = hasRetiredCustodyInstance;
50
+ exports.retiredCustodyKey = retiredCustodyKey;
51
+ exports.readRetiredCustodyRecord = readRetiredCustodyRecord;
52
+ exports.openCustodyDatabase = openCustodyDatabase;
53
+ exports.openCheckInStore = openCheckInStore;
54
+ const node_crypto_1 = require("node:crypto");
55
+ const fs = __importStar(require("node:fs"));
56
+ const path = __importStar(require("node:path"));
57
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
58
+ const runtime_1 = require("../../nerves/runtime");
59
+ const returns_1 = require("./returns");
60
+ const MAX_ROW = 4096;
61
+ const COMPLETION_HEADROOM = 2300;
62
+ const MAX_DB = 64 * 1024 * 1024;
63
+ const WARN_DB = 48 * 1024 * 1024;
64
+ const warnedDatabases = new WeakSet();
65
+ const bytes = (value) => Buffer.byteLength(JSON.stringify(value));
66
+ const text = (value) => typeof value === "string" && value.length > 0;
67
+ const object = (value) => !!value && typeof value === "object" && !Array.isArray(value);
68
+ const timestamp = (value) => text(value) && Number.isFinite(Date.parse(value));
69
+ function refuseCustody(reason) {
70
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "senses", event: "senses.shepherd_checkin_store_refused",
71
+ message: "check-in custody operation refused", meta: { reason } });
72
+ throw new Error(`Shepherd check-in custody: ${reason}`);
73
+ }
74
+ const refuse = refuseCustody;
75
+ function bounded(value, limit, field) {
76
+ if (!text(value) || bytes(value) > limit)
77
+ refuse(`${field} byte limit or type`);
78
+ }
79
+ function validInput(value) {
80
+ return object(value) && ["host", "session", "screenFingerprint", "guidanceRevision", "reply", "transition"].every(key => text(value[key])) &&
81
+ (value.instance === null || text(value.instance)) && ["immediate", "network", "periodic"].includes(String(value.trigger)) && timestamp(value.at);
82
+ }
83
+ function dispatchId(input) {
84
+ return (0, node_crypto_1.createHash)("sha256").update(JSON.stringify([
85
+ input.host, input.session, input.instance, input.screenFingerprint, input.guidanceRevision,
86
+ ])).digest("hex");
87
+ }
88
+ function validClaim(value) {
89
+ return object(value) && validInput(value) && text(value.owner) && bytes(value.owner) <= 256 &&
90
+ ["claimed", "sent", "not_sent", "unknown"].includes(String(value.state)) &&
91
+ (value.reason === undefined || text(value.reason) && bytes(value.reason) <= 1024)
92
+ && (value.receipt === undefined || validCustodyInputReceipt(value.receipt)
93
+ && value.receipt.requestId === value.id && value.receipt.surfaceId === value.session && value.receipt.processInstance === value.instance
94
+ && receiptMatchesOutcome(value.state, value.receipt));
95
+ }
96
+ function validCustodyInputReceipt(value) {
97
+ return object(value) && ["requestId", "surfaceId", "workspaceId", "processInstance"].every(key => text(value[key]) && bytes(value[key]) <= 256)
98
+ && typeof value.pasteAdmitted === "boolean" && typeof value.submitAdmitted === "boolean"
99
+ && (!value.submitAdmitted || value.pasteAdmitted);
100
+ }
101
+ function copyCustodyInputReceipt(receipt) {
102
+ const { requestId, surfaceId, workspaceId, processInstance, pasteAdmitted, submitAdmitted } = receipt;
103
+ return { requestId, surfaceId, workspaceId, processInstance, pasteAdmitted, submitAdmitted };
104
+ }
105
+ function receiptMatchesOutcome(state, receipt) {
106
+ return state === "sent" ? receipt.pasteAdmitted && receipt.submitAdmitted : state !== "not_sent" || !receipt.pasteAdmitted && !receipt.submitAdmitted;
107
+ }
108
+ function parseCustodyDispatch(row) {
109
+ if (Buffer.byteLength(row.data) > MAX_ROW)
110
+ refuse("record byte limit");
111
+ const value = JSON.parse(row.data);
112
+ if (!validClaim(value) || value.id !== row.id || dispatchId(value) !== row.id || value.host !== row.host ||
113
+ value.session !== row.session || value.instance !== row.instance)
114
+ refuse("invalid dispatch schema");
115
+ return value;
116
+ }
117
+ const parseDispatch = parseCustodyDispatch;
118
+ function validateCustodyDirectory(directory, create) {
119
+ const uid = process.getuid();
120
+ for (let candidate = directory; candidate !== path.dirname(candidate); candidate = path.dirname(candidate)) {
121
+ const stat = fs.lstatSync(candidate, { throwIfNoEntry: false });
122
+ if (stat?.isSymbolicLink())
123
+ refuse("private directory ancestor is a link");
124
+ if (stat && (!stat.isDirectory() || stat.uid !== 0 && stat.uid !== uid
125
+ || (stat.mode & 0o022) !== 0 && !(stat.uid === 0 && (stat.mode & 0o1000) !== 0)))
126
+ refuse("private directory ancestor ownership or mode");
127
+ }
128
+ if (create)
129
+ fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
130
+ if (!fs.lstatSync(directory, { throwIfNoEntry: false }))
131
+ return false;
132
+ const stat = fs.lstatSync(directory);
133
+ if (!stat.isDirectory() || (stat.mode & 0o7777) !== 0o700 || stat.uid !== uid)
134
+ refuse("private directory ownership or mode; require 0700");
135
+ return true;
136
+ }
137
+ function privateFile(file) {
138
+ const stat = fs.lstatSync(file);
139
+ if (!stat.isFile() || stat.nlink !== 1 || (stat.mode & 0o7777) !== 0o600 || stat.uid !== process.getuid())
140
+ refuse("private file ownership or mode");
141
+ }
142
+ function checkInStorePath(agentRoot) {
143
+ return path.join((0, returns_1.shepherdStateDir)(agentRoot), "checkins", "custody.sqlite");
144
+ }
145
+ function assertNoCustodyMaintenance(file) {
146
+ if (fs.lstatSync(`${file}.maintenance.json`, { throwIfNoEntry: false }))
147
+ refuse("interrupted or active maintenance; resume the exact owner maintenance request");
148
+ }
149
+ function custodyCapacity(database, writing = false) {
150
+ const size = Number(database.pragma("page_count", { simple: true })) * Number(database.pragma("page_size", { simple: true }));
151
+ if (size > MAX_DB || writing && size + 65536 > MAX_DB)
152
+ refuse("database capacity; no input authorized");
153
+ if (!warnedDatabases.has(database) && size >= WARN_DB) {
154
+ warnedDatabases.add(database);
155
+ (0, runtime_1.emitNervesEvent)({ level: "warn", component: "senses", event: "senses.shepherd_checkin_capacity_warning",
156
+ message: "check-in custody is approaching capacity", meta: { bytes: size, limit: MAX_DB } });
157
+ }
158
+ return { bytes: size, capacity: size + 65536 > MAX_DB ? "refused" : size >= WARN_DB ? "warning" : "normal" };
159
+ }
160
+ function custodyRevision(database) {
161
+ const row = database.prepare("SELECT revision FROM custody_meta WHERE singleton=1").get();
162
+ if (!row || typeof row.revision !== "number" || !Number.isSafeInteger(row.revision) || row.revision < 0)
163
+ refuse("invalid custody revision schema");
164
+ return row.revision;
165
+ }
166
+ function advanceCustodyRevision(database) {
167
+ const revision = custodyRevision(database) + 1;
168
+ if (!Number.isSafeInteger(revision))
169
+ refuse("custody revision capacity");
170
+ database.prepare("UPDATE custody_meta SET revision=? WHERE singleton=1").run(revision);
171
+ return revision;
172
+ }
173
+ function hasRetiredCustodyInstance(database, input) {
174
+ const row = database.prepare(`SELECT key,host,session,instance,data FROM retired_instances WHERE host=? AND session=?
175
+ AND (instance IS NULL OR ? IS NULL OR instance=?) LIMIT 1`).get(input.host, input.session, input.instance, input.instance);
176
+ if (!row)
177
+ return false;
178
+ validateRetiredRow(row);
179
+ return true;
180
+ }
181
+ function retiredCustodyKey(input) {
182
+ return (0, node_crypto_1.createHash)("sha256").update(JSON.stringify([input.host, input.session, input.instance])).digest("hex");
183
+ }
184
+ function readRetiredCustodyRecord(database, input) {
185
+ const row = database.prepare("SELECT key,host,session,instance,data FROM retired_instances WHERE key=?").get(retiredCustodyKey(input));
186
+ return row ? validateRetiredRow(row) : null;
187
+ }
188
+ function validateRetiredRow(row) {
189
+ if (Buffer.byteLength(row.data) > MAX_ROW)
190
+ refuse("retired instance index capacity");
191
+ const data = JSON.parse(row.data);
192
+ const expectedKey = retiredCustodyKey(row);
193
+ if (!object(data) || !object(data.proof) || row.key !== expectedKey || data.proof.kind !== "host_process_inventory"
194
+ || data.proof.host !== row.host || data.proof.session !== row.session || data.proof.instance !== row.instance
195
+ || data.proof.gone !== true || !timestamp(data.proof.checkedAt) || typeof data.proof.wholeSessionRetired !== "boolean"
196
+ || row.instance === null && !data.proof.wholeSessionRetired)
197
+ refuse("invalid retired instance schema");
198
+ if (data.archive !== undefined && (!object(data.archive) || typeof data.archive.path !== "string" || !path.isAbsolute(data.archive.path)
199
+ || typeof data.archive.digest !== "string" || !/^[a-f0-9]{64}$/.test(data.archive.digest)))
200
+ refuse("invalid retired archive reference schema");
201
+ return data;
202
+ }
203
+ function openCustodyDatabase(file, mode) {
204
+ const readonly = mode === "read" || mode === "maintenance-read";
205
+ if (!path.isAbsolute(file) || path.normalize(file) !== file)
206
+ refuse("database path");
207
+ if (mode !== "maintenance" && mode !== "maintenance-read")
208
+ assertNoCustodyMaintenance(file);
209
+ if (!validateCustodyDirectory(path.dirname(file), !readonly))
210
+ return null;
211
+ if (readonly) {
212
+ if (!fs.lstatSync(file, { throwIfNoEntry: false }))
213
+ return null;
214
+ }
215
+ else {
216
+ try {
217
+ const fd = fs.openSync(file, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_NOFOLLOW, 0o600);
218
+ fs.closeSync(fd);
219
+ }
220
+ catch (error) {
221
+ if (error.code !== "EEXIST")
222
+ throw error;
223
+ }
224
+ }
225
+ privateFile(file);
226
+ for (const suffix of ["-journal", "-wal", "-shm"])
227
+ if (fs.lstatSync(`${file}${suffix}`, { throwIfNoEntry: false }))
228
+ privateFile(`${file}${suffix}`);
229
+ const database = new better_sqlite3_1.default(file, { fileMustExist: true, readonly });
230
+ try {
231
+ const version = database.pragma("user_version", { simple: true });
232
+ if (![0, 1, 2].includes(Number(version)) || version === 0 && readonly)
233
+ refuse("unsupported database schema");
234
+ custodyCapacity(database);
235
+ database.pragma("busy_timeout = 1000");
236
+ if (version !== 0) {
237
+ database.prepare("SELECT id,host,session,instance,data FROM dispatches LIMIT 0").all();
238
+ database.prepare("SELECT signature,data FROM notices LIMIT 0").all();
239
+ }
240
+ if (readonly) {
241
+ if (version === 2)
242
+ validateCustodyV2(database);
243
+ return database;
244
+ }
245
+ database.pragma("journal_mode = DELETE");
246
+ database.pragma("synchronous = FULL");
247
+ database.pragma(`max_page_count = ${Math.floor(MAX_DB / Number(database.pragma("page_size", { simple: true })))}`);
248
+ if (version !== 2)
249
+ database.transaction(() => {
250
+ if (database.pragma("user_version", { simple: true }) === 2)
251
+ return;
252
+ database.exec(`CREATE TABLE IF NOT EXISTS dispatches (
253
+ id TEXT PRIMARY KEY NOT NULL, host TEXT NOT NULL, session TEXT NOT NULL, instance TEXT, data TEXT NOT NULL
254
+ );
255
+ CREATE INDEX IF NOT EXISTS dispatch_barriers ON dispatches(host,session,instance);
256
+ CREATE TABLE IF NOT EXISTS notices (signature TEXT PRIMARY KEY NOT NULL, data TEXT NOT NULL);
257
+ CREATE TABLE custody_meta (singleton INTEGER PRIMARY KEY CHECK(singleton=1), revision INTEGER NOT NULL);
258
+ INSERT INTO custody_meta VALUES(1,0);
259
+ CREATE TABLE custody_requests (actor_id TEXT NOT NULL,request_id TEXT NOT NULL,hash TEXT NOT NULL,receipt TEXT NOT NULL,PRIMARY KEY(actor_id,request_id));
260
+ CREATE TABLE reconciliations (id TEXT PRIMARY KEY,dispatch_id TEXT NOT NULL,data TEXT NOT NULL);
261
+ CREATE INDEX reconciliation_dispatch ON reconciliations(dispatch_id);
262
+ CREATE TABLE retired_instances (key TEXT PRIMARY KEY,host TEXT NOT NULL,session TEXT NOT NULL,instance TEXT,data TEXT NOT NULL);
263
+ CREATE INDEX retired_scope ON retired_instances(host,session,instance);
264
+ CREATE TABLE custody_migrations (version INTEGER PRIMARY KEY,data TEXT NOT NULL);`);
265
+ for (const row of database.prepare("SELECT id,host,session,instance,data FROM dispatches").iterate())
266
+ parseDispatch(row);
267
+ const counts = database.prepare("SELECT COUNT(*) AS count FROM dispatches").get();
268
+ database.prepare("INSERT INTO custody_migrations VALUES(2,?)").run(JSON.stringify({ fromVersion: version, at: new Date().toISOString(), preservedDispatches: counts.count }));
269
+ database.pragma("user_version = 2");
270
+ }).immediate();
271
+ validateCustodyV2(database);
272
+ for (const row of database.prepare("SELECT id,host,session,instance,data FROM dispatches").iterate())
273
+ parseDispatch(row);
274
+ }
275
+ catch (error) {
276
+ database.close();
277
+ throw error;
278
+ }
279
+ return database;
280
+ }
281
+ function validateCustodyV2(database) {
282
+ custodyRevision(database);
283
+ for (const query of [
284
+ "SELECT actor_id,request_id,hash,receipt FROM custody_requests LIMIT 0",
285
+ "SELECT id,dispatch_id,data FROM reconciliations LIMIT 0",
286
+ "SELECT key,host,session,instance,data FROM retired_instances LIMIT 0",
287
+ "SELECT version,data FROM custody_migrations LIMIT 0",
288
+ ])
289
+ database.prepare(query).all();
290
+ for (const row of database.prepare("SELECT key,host,session,instance,data FROM retired_instances").iterate())
291
+ validateRetiredRow(row);
292
+ }
293
+ function openCheckInStore(file) {
294
+ const database = openCustodyDatabase(file, "write");
295
+ const transact = (work) => database.transaction(() => {
296
+ assertNoCustodyMaintenance(file);
297
+ custodyCapacity(database, true);
298
+ return work();
299
+ }).immediate();
300
+ function write(record) {
301
+ const data = JSON.stringify(record);
302
+ if (Buffer.byteLength(data) > MAX_ROW)
303
+ refuse("record byte limit");
304
+ database.prepare(`INSERT INTO dispatches(id,host,session,instance,data) VALUES(?,?,?,?,?)
305
+ ON CONFLICT(id) DO UPDATE SET data=excluded.data`).run(record.id, record.host, record.session, record.instance, data);
306
+ advanceCustodyRevision(database);
307
+ }
308
+ function notice(signature) {
309
+ bounded(signature, MAX_ROW - 128, "signature");
310
+ const row = database.prepare("SELECT data FROM notices WHERE signature=?").get(signature);
311
+ if (!row)
312
+ return null;
313
+ if (Buffer.byteLength(row.data) > MAX_ROW)
314
+ refuse("notice byte limit");
315
+ const value = JSON.parse(row.data);
316
+ if (!object(value) || value.signature !== signature || !timestamp(value.at))
317
+ refuse("invalid notice schema");
318
+ return { signature, at: value.at };
319
+ }
320
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.shepherd_checkin_store_opened",
321
+ message: "opened private check-in custody", meta: { status: "ready" } });
322
+ return {
323
+ claimDispatch(input, owner) {
324
+ if (!validInput(input))
325
+ refuse("invalid dispatch input schema");
326
+ bounded(owner, 256, "owner");
327
+ const record = { ...input, id: dispatchId(input), owner, state: "claimed" };
328
+ if (bytes(record) + COMPLETION_HEADROOM > MAX_ROW)
329
+ refuse("reserved record byte limit");
330
+ return transact(() => {
331
+ if (hasRetiredCustodyInstance(database, input))
332
+ return null;
333
+ const rows = database.prepare(`SELECT id,host,session,instance,data FROM dispatches
334
+ WHERE id=? OR (host=? AND session=? AND (instance IS NULL OR ? IS NULL OR instance=?))`)
335
+ .all(record.id, input.host, input.session, input.instance, input.instance);
336
+ for (const row of rows) {
337
+ const prior = parseDispatch(row);
338
+ if (prior.state === "claimed" || prior.state === "unknown" || prior.id === record.id && prior.state === "sent")
339
+ return null;
340
+ }
341
+ write(record);
342
+ return record;
343
+ });
344
+ },
345
+ completeDispatch(id, owner, result) {
346
+ bounded(owner, 256, "owner");
347
+ if (!object(result) || !["sent", "not_sent", "unknown"].includes(result.state))
348
+ refuse("invalid completion state");
349
+ if (result.reason !== undefined)
350
+ bounded(result.reason, 1024, "reason");
351
+ if (result.receipt !== undefined && !validCustodyInputReceipt(result.receipt))
352
+ refuse("invalid host receipt schema");
353
+ if (result.receipt && !receiptMatchesOutcome(result.state, result.receipt))
354
+ refuse("host receipt contradicts completion outcome");
355
+ transact(() => {
356
+ const row = database.prepare("SELECT id,host,session,instance,data FROM dispatches WHERE id=?").get(id);
357
+ if (!row)
358
+ refuse("unknown dispatch owner");
359
+ const prior = parseDispatch(row);
360
+ if (prior.owner !== owner || prior.state !== "claimed")
361
+ refuse("dispatch owner or phase mismatch");
362
+ if (result.receipt && (result.receipt.requestId !== id || result.receipt.surfaceId !== prior.session
363
+ || result.receipt.processInstance !== prior.instance))
364
+ refuse("host receipt identity mismatch");
365
+ write({ ...prior, state: result.state, ...(result.reason === undefined ? {} : { reason: result.reason }),
366
+ ...(result.receipt === undefined ? {} : { receipt: copyCustodyInputReceipt(result.receipt) }) });
367
+ });
368
+ },
369
+ shouldNotify(signature) { return notice(signature) === null; },
370
+ markNotified(signature, at) {
371
+ bounded(signature, MAX_ROW - 128, "signature");
372
+ if (!timestamp(at))
373
+ refuse("invalid notification timestamp");
374
+ const data = JSON.stringify({ signature, at });
375
+ if (Buffer.byteLength(data) > MAX_ROW)
376
+ refuse("notice byte limit");
377
+ transact(() => {
378
+ if (!notice(signature)) {
379
+ database.prepare("INSERT INTO notices(signature,data) VALUES(?,?)").run(signature, data);
380
+ advanceCustodyRevision(database);
381
+ }
382
+ });
383
+ },
384
+ close() { database.close(); },
385
+ };
386
+ }
@@ -0,0 +1,196 @@
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.CmuxSocketError = void 0;
37
+ exports.createCmuxClient = createCmuxClient;
38
+ const node_crypto_1 = require("node:crypto");
39
+ const net = __importStar(require("node:net"));
40
+ const shepherd_config_1 = require("../../heart/shepherd-config");
41
+ const runtime_1 = require("../../nerves/runtime");
42
+ class CmuxSocketError extends Error {
43
+ code;
44
+ constructor(code, message) {
45
+ super(message);
46
+ this.code = code;
47
+ this.name = "CmuxSocketError";
48
+ }
49
+ }
50
+ exports.CmuxSocketError = CmuxSocketError;
51
+ const ACCESS_REFUSED = /access denied|authentication required|invalid password|not authorized|unauthori[sz]ed/i;
52
+ function isRecord(value) {
53
+ return !!value && typeof value === "object" && !Array.isArray(value);
54
+ }
55
+ function parseRecord(line) {
56
+ try {
57
+ const value = JSON.parse(line);
58
+ return isRecord(value) ? value : null;
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ function createCmuxClient(connection, options = {}) {
65
+ const timeoutMs = options.timeoutMs ?? 5_000;
66
+ const repair = (0, shepherd_config_1.shepherdRepairHint)(options.agentName ?? "<agent>");
67
+ const wrap = (line) => connection.auth.kind === "capability"
68
+ ? `_cmux_capability_v1 ${connection.auth.token} ${line}`
69
+ : line;
70
+ const refusal = (text) => text.startsWith("ERROR:") && ACCESS_REFUSED.test(text)
71
+ ? new CmuxSocketError("auth", `cmux refused the socket connection (${text.slice(0, 200)}); ${repair}`)
72
+ : null;
73
+ const connectError = (error) => new CmuxSocketError("unavailable", `cmux socket is not reachable at ${connection.socketPath} (${String(error.code)}); is cmux running?`);
74
+ /** Opens a connection, runs the password handshake when needed, and hands back a line reader. */
75
+ function open(onLine, onEnd) {
76
+ return new Promise((resolve) => {
77
+ const socket = net.createConnection(connection.socketPath);
78
+ let buffer = "";
79
+ let handshake = connection.auth.kind === "password";
80
+ socket.setEncoding("utf-8");
81
+ socket.on("error", (error) => onEnd(connectError(error)));
82
+ socket.on("close", () => onEnd());
83
+ socket.on("data", (chunk) => {
84
+ buffer += chunk;
85
+ let index = buffer.indexOf("\n");
86
+ while (index >= 0) {
87
+ const line = buffer.slice(0, index).trim();
88
+ buffer = buffer.slice(index + 1);
89
+ index = buffer.indexOf("\n");
90
+ if (!line)
91
+ continue;
92
+ if (handshake) {
93
+ handshake = false;
94
+ if (line.startsWith("ERROR:") && !line.includes("Unknown command 'auth'")) {
95
+ socket.destroy();
96
+ onEnd(new CmuxSocketError("auth", `cmux rejected the socket password (${line.slice(0, 200)}); ${repair}`));
97
+ continue;
98
+ }
99
+ resolve(socket);
100
+ continue;
101
+ }
102
+ onLine(line);
103
+ }
104
+ });
105
+ socket.on("connect", () => {
106
+ if (connection.auth.kind === "password")
107
+ socket.write(`auth ${connection.auth.password}\n`);
108
+ else
109
+ resolve(socket);
110
+ });
111
+ });
112
+ }
113
+ function request(line) {
114
+ return new Promise((resolve, reject) => {
115
+ let settled = false;
116
+ let socket = null;
117
+ const finish = (error, value) => {
118
+ if (settled)
119
+ return;
120
+ settled = true;
121
+ clearTimeout(timer);
122
+ socket?.destroy();
123
+ if (error)
124
+ reject(error);
125
+ else
126
+ resolve(value);
127
+ };
128
+ const timer = setTimeout(() => finish(new CmuxSocketError("timeout", `cmux did not answer within ${timeoutMs} ms`)), timeoutMs);
129
+ void open((response) => finish(refusal(response), response), (error) => finish(error ?? new CmuxSocketError("unavailable", "cmux closed the socket before answering"))).then((opened) => {
130
+ socket = opened;
131
+ opened.write(`${wrap(line)}\n`);
132
+ });
133
+ });
134
+ }
135
+ const v2Line = (method, params) => JSON.stringify({ id: (0, node_crypto_1.randomUUID)(), method, params });
136
+ function parseV2(text) {
137
+ const parsed = parseRecord(text);
138
+ if (!parsed)
139
+ throw new CmuxSocketError(text.startsWith("ERROR:") ? "command_failed" : "protocol", `unexpected cmux response: ${text.slice(0, 200)}`);
140
+ if (parsed.ok === true)
141
+ return isRecord(parsed.result) ? parsed.result : {};
142
+ const error = isRecord(parsed.error) ? parsed.error : {};
143
+ throw new CmuxSocketError(typeof error.code === "string" ? error.code : "error", typeof error.message === "string" && error.message ? error.message : "cmux error");
144
+ }
145
+ return {
146
+ async call(method, params = {}) {
147
+ const text = await request(v2Line(method, params));
148
+ const result = parseV2(text);
149
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.shepherd_call", message: "cmux socket call answered", meta: { method } });
150
+ return result;
151
+ },
152
+ async command(line) {
153
+ const text = await request(line);
154
+ if (text.startsWith("ERROR:"))
155
+ throw new CmuxSocketError("command_failed", text.slice(0, 500));
156
+ return text;
157
+ },
158
+ stream(params, handlers) {
159
+ let closed = false;
160
+ let socket = null;
161
+ const end = (error) => {
162
+ if (closed)
163
+ return;
164
+ closed = true;
165
+ socket?.destroy();
166
+ handlers.onClose(error);
167
+ };
168
+ void open((line) => {
169
+ if (closed)
170
+ return;
171
+ const refused = refusal(line);
172
+ if (refused)
173
+ return end(refused);
174
+ const frame = parseRecord(line);
175
+ if (!frame)
176
+ return end(new CmuxSocketError("protocol", `unexpected cmux event frame: ${line.slice(0, 200)}`));
177
+ if (frame.ok === false) {
178
+ try {
179
+ parseV2(line);
180
+ }
181
+ catch (error) {
182
+ return end(error);
183
+ }
184
+ }
185
+ handlers.onFrame(frame);
186
+ }, end).then((opened) => {
187
+ socket = opened;
188
+ if (closed)
189
+ opened.destroy();
190
+ else
191
+ opened.write(`${wrap(v2Line("events.stream", params))}\n`);
192
+ });
193
+ return { close: () => end() };
194
+ },
195
+ };
196
+ }