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

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 +6085 -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 +872 -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,622 @@
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.SessionTransactionError = exports.SessionTurnBusyError = void 0;
40
+ exports.admitSessionActivity = admitSessionActivity;
41
+ exports.acquireSessionTurnLease = acquireSessionTurnLease;
42
+ exports.withSessionTurnLease = withSessionTurnLease;
43
+ exports.withImmediateSessionTurnLease = withImmediateSessionTurnLease;
44
+ exports.currentSessionTurnLease = currentSessionTurnLease;
45
+ exports.assertSessionTurnLease = assertSessionTurnLease;
46
+ exports.readSessionTransaction = readSessionTransaction;
47
+ exports.writeSessionTransaction = writeSessionTransaction;
48
+ exports.deleteSessionTransaction = deleteSessionTransaction;
49
+ const node_async_hooks_1 = require("node:async_hooks");
50
+ const node_crypto_1 = require("node:crypto");
51
+ const fs = __importStar(require("node:fs"));
52
+ const path = __importStar(require("node:path"));
53
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
54
+ const runtime_1 = require("../nerves/runtime");
55
+ const habit_lifecycle_1 = require("../heart/habits/habit-lifecycle");
56
+ class SessionTurnBusyError extends Error {
57
+ retryable = true;
58
+ constructor(message = "session turn is busy") {
59
+ super(message);
60
+ this.name = "SessionTurnBusyError";
61
+ }
62
+ }
63
+ exports.SessionTurnBusyError = SessionTurnBusyError;
64
+ class SessionTransactionError extends Error {
65
+ constructor(message) {
66
+ super(message);
67
+ this.name = "SessionTransactionError";
68
+ }
69
+ }
70
+ exports.SessionTransactionError = SessionTransactionError;
71
+ const heldLeases = new Map();
72
+ const leaseContext = new node_async_hooks_1.AsyncLocalStorage();
73
+ function canonicalSessionPath(sessionPath) {
74
+ return path.resolve(sessionPath);
75
+ }
76
+ function revision(bytes) {
77
+ return (0, node_crypto_1.createHash)("sha256").update(bytes, "utf8").digest("hex");
78
+ }
79
+ function processAlive(pid) {
80
+ try {
81
+ process.kill(pid, 0);
82
+ return true;
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ function sleep(ms) {
89
+ return new Promise((resolve) => setTimeout(resolve, ms));
90
+ }
91
+ function isSqliteBusy(error) {
92
+ return error instanceof Error && "code" in error
93
+ && error.code === "SQLITE_BUSY";
94
+ }
95
+ function refuseConfinement() {
96
+ (0, runtime_1.emitNervesEvent)({
97
+ level: "warn", component: "mind", event: "mind.session_confinement_refused",
98
+ message: "session confinement is invalid or changed", meta: { action: "refused" },
99
+ });
100
+ throw new SessionTransactionError("session confinement is invalid or changed");
101
+ }
102
+ function confinedFile(filePath) {
103
+ let stat;
104
+ try {
105
+ stat = fs.lstatSync(filePath, { bigint: true });
106
+ }
107
+ catch (error) {
108
+ if (error?.code === "ENOENT")
109
+ return null;
110
+ return refuseConfinement();
111
+ }
112
+ if (!stat.isFile() || stat.isSymbolicLink())
113
+ return refuseConfinement();
114
+ return stat;
115
+ }
116
+ function checkConfinement(pin) {
117
+ if (!pin)
118
+ return;
119
+ for (const directory of pin.directories) {
120
+ let stat;
121
+ try {
122
+ stat = fs.lstatSync(directory.path, { bigint: true });
123
+ }
124
+ catch {
125
+ return refuseConfinement();
126
+ }
127
+ if (!stat.isDirectory() || stat.isSymbolicLink() || stat.dev !== directory.dev || stat.ino !== directory.ino)
128
+ return refuseConfinement();
129
+ }
130
+ for (const suffix of ["", ".turn.lock", ".turn.lock-journal", ".turn.lock-wal", ".turn.lock-shm"]) {
131
+ confinedFile(`${pin.sessionPath}${suffix}`);
132
+ }
133
+ }
134
+ function pinConfinement(sessionPath, root) {
135
+ if (root === undefined)
136
+ return null;
137
+ if (typeof root !== "string" || !path.isAbsolute(root) || path.resolve(root) !== root)
138
+ return refuseConfinement();
139
+ const relative = path.relative(root, sessionPath);
140
+ if (!relative || relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))
141
+ return refuseConfinement();
142
+ const parent = path.dirname(sessionPath);
143
+ const volumeRoot = path.parse(parent).root;
144
+ let current = volumeRoot;
145
+ const paths = [current];
146
+ for (const segment of parent.slice(volumeRoot.length).split(path.sep).filter(Boolean)) {
147
+ current = path.join(current, segment);
148
+ paths.push(current);
149
+ }
150
+ const directories = paths.map((directory) => {
151
+ let stat;
152
+ try {
153
+ stat = fs.lstatSync(directory, { bigint: true });
154
+ }
155
+ catch {
156
+ return refuseConfinement();
157
+ }
158
+ if (!stat.isDirectory() || stat.isSymbolicLink())
159
+ return refuseConfinement();
160
+ return { path: directory, dev: stat.dev, ino: stat.ino };
161
+ });
162
+ const pin = { root, sessionPath, directories };
163
+ checkConfinement(pin);
164
+ return pin;
165
+ }
166
+ function retainConfinement(held, requestedRoot) {
167
+ if (requestedRoot !== undefined && requestedRoot !== held.confinement?.root)
168
+ return refuseConfinement();
169
+ checkConfinement(held.confinement);
170
+ }
171
+ function checkTemporary(pin, filePath, identity) {
172
+ checkConfinement(pin);
173
+ const current = confinedFile(filePath);
174
+ if (!current || !identity || current.dev !== identity.dev || current.ino !== identity.ino)
175
+ return refuseConfinement();
176
+ }
177
+ function openLeaseDatabase(lockPath, busyTimeoutMs = 0, confinement = null) {
178
+ checkConfinement(confinement);
179
+ const database = new better_sqlite3_1.default(lockPath);
180
+ try {
181
+ database.pragma(`busy_timeout = ${busyTimeoutMs}`);
182
+ database.transaction(() => {
183
+ database.exec(`
184
+ CREATE TABLE IF NOT EXISTS session_turn_lease (
185
+ singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
186
+ pid INTEGER NOT NULL,
187
+ owner_id TEXT NOT NULL,
188
+ owner_token TEXT NOT NULL
189
+ )
190
+ `);
191
+ const columns = new Set(database.prepare(`PRAGMA table_info(session_turn_lease)`).all().map((column) => column.name));
192
+ if (!columns.has("boot_identity"))
193
+ database.exec(`ALTER TABLE session_turn_lease ADD COLUMN boot_identity TEXT`);
194
+ if (!columns.has("process_started_at"))
195
+ database.exec(`ALTER TABLE session_turn_lease ADD COLUMN process_started_at TEXT`);
196
+ }).immediate();
197
+ return database;
198
+ }
199
+ catch (error) {
200
+ database.close();
201
+ throw error;
202
+ }
203
+ }
204
+ /** Immutable admission, not proof of execution or delivery. Unknown effects must never be replayed. */
205
+ function admitSessionActivity(sessionPath, input) {
206
+ if (typeof input.namespace !== "string" || !input.namespace.trim() || Buffer.byteLength(input.namespace) > 4096
207
+ || typeof input.activityId !== "string" || !input.activityId.trim() || Buffer.byteLength(input.activityId) > 1024
208
+ || typeof input.payloadDigest !== "string" || !/^[a-f0-9]{64}$/.test(input.payloadDigest)) {
209
+ throw new SessionTransactionError("invalid session activity admission");
210
+ }
211
+ const canonical = canonicalSessionPath(sessionPath);
212
+ const lockPath = `${canonical}.turn.lock`;
213
+ fs.mkdirSync(path.dirname(canonical), { recursive: true, mode: 0o700 });
214
+ const receiptId = revision(JSON.stringify([input.namespace, input.activityId]));
215
+ const database = openLeaseDatabase(lockPath, 1000);
216
+ try {
217
+ database.pragma("synchronous = FULL");
218
+ const state = database.transaction(() => {
219
+ database.exec(`
220
+ CREATE TABLE IF NOT EXISTS session_activity_receipts (
221
+ receipt_id TEXT PRIMARY KEY,
222
+ payload_digest TEXT NOT NULL,
223
+ admitted_at TEXT NOT NULL
224
+ )
225
+ `);
226
+ const existing = database.prepare("SELECT payload_digest FROM session_activity_receipts WHERE receipt_id = ?")
227
+ .get(receiptId);
228
+ if (existing) {
229
+ if (typeof existing.payload_digest !== "string" || !/^[a-f0-9]{64}$/.test(existing.payload_digest)) {
230
+ throw new SessionTransactionError("invalid session activity receipt");
231
+ }
232
+ if (existing.payload_digest !== input.payloadDigest)
233
+ throw new SessionTransactionError("conflicting session activity payload");
234
+ return "duplicate";
235
+ }
236
+ // Never evict an admission: losing its identity would authorize uncertain work again.
237
+ if (fs.statSync(lockPath).size >= 64 * 1024 * 1024)
238
+ throw new SessionTransactionError("session activity receipt capacity exceeded");
239
+ database.prepare("INSERT INTO session_activity_receipts (receipt_id, payload_digest, admitted_at) VALUES (?, ?, ?)")
240
+ .run(receiptId, input.payloadDigest, new Date().toISOString());
241
+ return "admitted";
242
+ }).immediate();
243
+ (0, runtime_1.emitNervesEvent)({
244
+ component: "mind", event: "mind.session_activity_admission", message: "recorded session activity admission decision",
245
+ meta: { receiptId, state },
246
+ });
247
+ return { state, receiptId };
248
+ }
249
+ finally {
250
+ database.close();
251
+ }
252
+ }
253
+ function acquisitionRecord(options) {
254
+ const pid = options.pid ?? process.pid;
255
+ const bootIdentity = (options.getBootIdentity ?? habit_lifecycle_1.probeHabitBootIdentity)();
256
+ const processStartedAt = (options.getProcessStartedAt ?? habit_lifecycle_1.probeHabitProcessStartedAt)(pid);
257
+ if (!bootIdentity || !processStartedAt)
258
+ throw new SessionTransactionError("current process identity is unavailable");
259
+ return {
260
+ pid,
261
+ ownerId: options.ownerId ?? (0, node_crypto_1.randomUUID)(),
262
+ ownerToken: options.ownerToken ?? (0, node_crypto_1.randomUUID)(),
263
+ bootIdentity,
264
+ processStartedAt,
265
+ };
266
+ }
267
+ function claimLeaseRecord(lockPath, record, isProcessAlive, getProcessStartedAt, confinement) {
268
+ const database = openLeaseDatabase(lockPath, 0, confinement);
269
+ try {
270
+ return database.transaction(() => {
271
+ const current = database.prepare(`
272
+ SELECT pid, owner_id, owner_token, boot_identity, process_started_at FROM session_turn_lease WHERE singleton = 1
273
+ `).get();
274
+ if (!current) {
275
+ checkConfinement(confinement);
276
+ database.prepare(`
277
+ INSERT INTO session_turn_lease (singleton, pid, owner_id, owner_token, boot_identity, process_started_at) VALUES (1, ?, ?, ?, ?, ?)
278
+ `).run(record.pid, record.ownerId, record.ownerToken, record.bootIdentity, record.processStartedAt);
279
+ return { acquired: true, stale: null };
280
+ }
281
+ if (!Number.isSafeInteger(current.pid) || current.pid <= 0
282
+ || typeof current.owner_id !== "string" || current.owner_id.length === 0
283
+ || typeof current.owner_token !== "string" || current.owner_token.length === 0
284
+ || !((current.boot_identity === null && current.process_started_at === null)
285
+ || (typeof current.boot_identity === "string" && current.boot_identity.length > 0
286
+ && typeof current.process_started_at === "string" && current.process_started_at.length > 0))) {
287
+ throw new SessionTransactionError("invalid session lease record");
288
+ }
289
+ const observed = {
290
+ pid: current.pid,
291
+ ownerId: current.owner_id,
292
+ ownerToken: current.owner_token,
293
+ bootIdentity: current.boot_identity,
294
+ processStartedAt: current.process_started_at,
295
+ };
296
+ const differentBoot = observed.bootIdentity !== null && observed.bootIdentity !== record.bootIdentity;
297
+ let differentProcess = false;
298
+ if (observed.bootIdentity !== null && !differentBoot) {
299
+ const liveStartedAt = getProcessStartedAt(observed.pid);
300
+ differentProcess = liveStartedAt !== null && liveStartedAt !== observed.processStartedAt;
301
+ if (liveStartedAt === observed.processStartedAt)
302
+ return { acquired: false, stale: null };
303
+ }
304
+ if (!differentBoot && !differentProcess && isProcessAlive(observed.pid))
305
+ return { acquired: false, stale: null };
306
+ checkConfinement(confinement);
307
+ const changed = database.prepare(`
308
+ UPDATE session_turn_lease SET pid = ?, owner_id = ?, owner_token = ?, boot_identity = ?, process_started_at = ?
309
+ WHERE singleton = 1 AND pid = ? AND owner_id = ? AND owner_token = ?
310
+ AND boot_identity IS ? AND process_started_at IS ?
311
+ `).run(record.pid, record.ownerId, record.ownerToken, record.bootIdentity, record.processStartedAt, observed.pid, observed.ownerId, observed.ownerToken, observed.bootIdentity, observed.processStartedAt).changes;
312
+ return changed === 1 ? { acquired: true, stale: observed } : { acquired: false, stale: null };
313
+ })();
314
+ }
315
+ finally {
316
+ database.close();
317
+ }
318
+ }
319
+ function releaseLeaseRecord(lockPath, record) {
320
+ const database = openLeaseDatabase(lockPath, 5_000, record.confinement);
321
+ try {
322
+ return database.prepare(`
323
+ DELETE FROM session_turn_lease WHERE singleton = 1 AND pid = ? AND owner_id = ? AND owner_token = ?
324
+ AND boot_identity IS ? AND process_started_at IS ?
325
+ `).run(record.pid, record.ownerId, record.ownerToken, record.bootIdentity, record.processStartedAt).changes === 1;
326
+ }
327
+ finally {
328
+ database.close();
329
+ }
330
+ }
331
+ function makeLease(held) {
332
+ let localReleased = false;
333
+ const release = () => {
334
+ if (localReleased)
335
+ return;
336
+ localReleased = true;
337
+ held.depth -= 1;
338
+ if (held.depth > 0 || held.released)
339
+ return;
340
+ held.released = true;
341
+ try {
342
+ releaseLeaseRecord(held.lockPath, held);
343
+ }
344
+ catch (error) {
345
+ (0, runtime_1.emitNervesEvent)({
346
+ level: "warn", component: "mind", event: "mind.session_turn_lease_release_failed",
347
+ message: "durable lease release failed; original recovery evidence retained",
348
+ meta: { sessionPath: held.sessionPath, ownerId: held.ownerId },
349
+ });
350
+ throw error;
351
+ }
352
+ finally {
353
+ if (heldLeases.get(held.sessionPath) === held)
354
+ heldLeases.delete(held.sessionPath);
355
+ }
356
+ (0, runtime_1.emitNervesEvent)({
357
+ component: "mind",
358
+ event: "mind.session_turn_lease_released",
359
+ message: "released session turn lease",
360
+ meta: { sessionPath: held.sessionPath, ownerId: held.ownerId },
361
+ });
362
+ };
363
+ return {
364
+ lease: {
365
+ sessionPath: held.sessionPath, ownerId: held.ownerId, ownerToken: held.ownerToken,
366
+ release: async () => release(),
367
+ },
368
+ release,
369
+ };
370
+ }
371
+ async function acquireSessionTurnLease(sessionPath, options = {}) {
372
+ const canonical = canonicalSessionPath(sessionPath);
373
+ const existing = heldLeases.get(canonical);
374
+ if (existing && !existing.released) {
375
+ if (options.ownerId === existing.ownerId && options.ownerToken === existing.ownerToken) {
376
+ retainConfinement(existing, options.confinementRoot);
377
+ existing.depth += 1;
378
+ return makeLease(existing).lease;
379
+ }
380
+ }
381
+ const confinement = pinConfinement(canonical, options.confinementRoot);
382
+ const record = acquisitionRecord(options);
383
+ const { ownerId } = record;
384
+ const timeoutMs = options.timeoutMs ?? 5_000;
385
+ const pollIntervalMs = options.pollIntervalMs ?? 10;
386
+ const isProcessAlive = options.isProcessAlive ?? processAlive;
387
+ const lockPath = `${canonical}.turn.lock`;
388
+ const started = Date.now();
389
+ checkConfinement(confinement);
390
+ fs.mkdirSync(path.dirname(canonical), { recursive: true });
391
+ for (;;) {
392
+ let claim = null;
393
+ try {
394
+ claim = claimLeaseRecord(lockPath, record, isProcessAlive, options.getProcessStartedAt ?? habit_lifecycle_1.probeHabitProcessStartedAt, confinement);
395
+ }
396
+ catch (error) {
397
+ if (!isSqliteBusy(error))
398
+ throw error;
399
+ }
400
+ if (claim?.acquired) {
401
+ const held = { sessionPath: canonical, lockPath, ...record, depth: 1, released: false, confinement };
402
+ heldLeases.set(canonical, held);
403
+ (0, runtime_1.emitNervesEvent)({
404
+ component: "mind",
405
+ event: "mind.session_turn_lease_acquired",
406
+ message: "acquired session turn lease",
407
+ meta: { sessionPath: canonical, ownerId },
408
+ });
409
+ if (claim.stale) {
410
+ options.onStaleLease?.(claim.stale);
411
+ (0, runtime_1.emitNervesEvent)({
412
+ level: "warn",
413
+ component: "mind",
414
+ event: "mind.session_turn_lease_stolen",
415
+ message: "stole stale session turn lease",
416
+ meta: { sessionPath: canonical, stalePid: claim.stale.pid, staleOwnerId: claim.stale.ownerId },
417
+ });
418
+ }
419
+ return makeLease(held).lease;
420
+ }
421
+ if (Date.now() - started >= timeoutMs) {
422
+ (0, runtime_1.emitNervesEvent)({
423
+ level: "warn",
424
+ component: "mind",
425
+ event: "mind.session_turn_lease_busy",
426
+ message: "session turn lease acquisition timed out",
427
+ meta: { sessionPath: canonical, ownerId, timeoutMs },
428
+ });
429
+ throw new SessionTurnBusyError(`session turn busy: ${canonical}`);
430
+ }
431
+ await sleep(pollIntervalMs);
432
+ }
433
+ }
434
+ async function withSessionTurnLease(sessionPath, work, options = {}) {
435
+ const lease = await acquireSessionTurnLease(sessionPath, options);
436
+ let failed = false;
437
+ try {
438
+ return await leaseContext.run(lease, () => work(lease));
439
+ }
440
+ catch (error) {
441
+ failed = true;
442
+ throw error;
443
+ }
444
+ finally {
445
+ try {
446
+ await lease.release();
447
+ }
448
+ catch (error) {
449
+ if (!failed)
450
+ throw error;
451
+ }
452
+ }
453
+ }
454
+ function withImmediateSessionTurnLease(sessionPath, work, options = {}) {
455
+ const canonical = canonicalSessionPath(sessionPath);
456
+ const contextual = currentSessionTurnLease(canonical);
457
+ if (contextual) {
458
+ const held = heldLeases.get(canonical);
459
+ if (!held || held.released)
460
+ throw new SessionTransactionError("session lease owner token mismatch");
461
+ retainConfinement(held, options.confinementRoot);
462
+ return work(contextual);
463
+ }
464
+ const confinement = pinConfinement(canonical, options.confinementRoot);
465
+ const record = acquisitionRecord(options);
466
+ const lockPath = `${canonical}.turn.lock`;
467
+ checkConfinement(confinement);
468
+ fs.mkdirSync(path.dirname(canonical), { recursive: true });
469
+ const tryAcquire = () => {
470
+ let claim;
471
+ try {
472
+ claim = claimLeaseRecord(lockPath, record, options.isProcessAlive ?? processAlive, options.getProcessStartedAt ?? habit_lifecycle_1.probeHabitProcessStartedAt, confinement);
473
+ }
474
+ catch (error) {
475
+ if (isSqliteBusy(error))
476
+ return null;
477
+ throw error;
478
+ }
479
+ if (claim.acquired) {
480
+ const held = { sessionPath: canonical, lockPath, ...record, depth: 1, released: false, confinement };
481
+ heldLeases.set(canonical, held);
482
+ if (claim.stale) {
483
+ options.onStaleLease?.(claim.stale);
484
+ (0, runtime_1.emitNervesEvent)({
485
+ level: "warn",
486
+ component: "mind",
487
+ event: "mind.session_turn_lease_stolen",
488
+ message: "stole stale session turn lease",
489
+ meta: { sessionPath: canonical, stalePid: claim.stale.pid, staleOwnerId: claim.stale.ownerId },
490
+ });
491
+ }
492
+ return held;
493
+ }
494
+ return null;
495
+ };
496
+ const held = tryAcquire();
497
+ if (!held)
498
+ throw new SessionTurnBusyError(`session turn busy: ${canonical}`);
499
+ const { lease, release } = makeLease(held);
500
+ let failed = false;
501
+ try {
502
+ return leaseContext.run(lease, () => work(lease));
503
+ }
504
+ catch (error) {
505
+ failed = true;
506
+ throw error;
507
+ }
508
+ finally {
509
+ try {
510
+ release();
511
+ }
512
+ catch (error) {
513
+ if (!failed)
514
+ throw error;
515
+ }
516
+ }
517
+ }
518
+ function currentSessionTurnLease(sessionPath) {
519
+ const lease = leaseContext.getStore();
520
+ return lease && lease.sessionPath === canonicalSessionPath(sessionPath) ? lease : null;
521
+ }
522
+ function assertSessionTurnLease(sessionPath, lease) {
523
+ const canonical = canonicalSessionPath(sessionPath);
524
+ if (lease.sessionPath !== canonical)
525
+ throw new SessionTransactionError("leased session path mismatch");
526
+ const held = heldLeases.get(canonical);
527
+ if (!held || held.released || held.ownerId !== lease.ownerId || held.ownerToken !== lease.ownerToken) {
528
+ throw new SessionTransactionError("session lease owner token mismatch");
529
+ }
530
+ checkConfinement(held.confinement);
531
+ }
532
+ function readSessionTransaction(sessionPath, lease) {
533
+ assertSessionTurnLease(sessionPath, lease);
534
+ let bytes = "";
535
+ try {
536
+ bytes = fs.readFileSync(canonicalSessionPath(sessionPath), "utf8");
537
+ }
538
+ catch (error) {
539
+ if (!(error instanceof Error) || error.code !== "ENOENT")
540
+ throw error;
541
+ }
542
+ return { bytes, value: bytes ? JSON.parse(bytes) : null, revision: revision(bytes) };
543
+ }
544
+ function writeSessionTransaction(sessionPath, value, options) {
545
+ assertSessionTurnLease(sessionPath, options.lease);
546
+ const canonical = canonicalSessionPath(sessionPath);
547
+ const confinement = heldLeases.get(canonical).confinement;
548
+ const current = readSessionTransaction(canonical, options.lease);
549
+ if (current.revision !== options.expectedRevision)
550
+ throw new SessionTransactionError("session revision changed");
551
+ fs.mkdirSync(path.dirname(canonical), { recursive: true });
552
+ const bytes = JSON.stringify(value, null, 2);
553
+ const tempPath = path.join(path.dirname(canonical), `.${path.basename(canonical)}.tmp-${process.pid}-${(0, node_crypto_1.randomUUID)()}`);
554
+ let fd = null;
555
+ let temporaryIdentity = null;
556
+ try {
557
+ fd = fs.openSync(tempPath, "wx", 0o600);
558
+ if (confinement)
559
+ temporaryIdentity = fs.fstatSync(fd, { bigint: true });
560
+ fs.writeFileSync(fd, bytes, "utf8");
561
+ fs.fsyncSync(fd);
562
+ fs.closeSync(fd);
563
+ fd = null;
564
+ options.hooks?.beforeRename?.();
565
+ if (confinement)
566
+ checkTemporary(confinement, tempPath, temporaryIdentity);
567
+ fs.renameSync(tempPath, canonical);
568
+ checkConfinement(confinement);
569
+ const directoryFd = fs.openSync(path.dirname(canonical), "r");
570
+ try {
571
+ fs.fsyncSync(directoryFd);
572
+ }
573
+ finally {
574
+ fs.closeSync(directoryFd);
575
+ }
576
+ }
577
+ catch (error) {
578
+ /* v8 ignore next -- fd-close failure after a prior node:fs failure is best-effort cleanup @preserve */
579
+ if (fd !== null)
580
+ try {
581
+ fs.closeSync(fd);
582
+ }
583
+ catch { /* best effort */ }
584
+ try {
585
+ if (confinement)
586
+ checkTemporary(confinement, tempPath, temporaryIdentity);
587
+ fs.unlinkSync(tempPath);
588
+ }
589
+ catch {
590
+ if (confinement)
591
+ (0, runtime_1.emitNervesEvent)({
592
+ level: "warn", component: "mind", event: "mind.session_transaction_cleanup_refused",
593
+ message: "temporary cleanup unavailable; original evidence retained",
594
+ meta: { sessionPath: canonical },
595
+ });
596
+ }
597
+ throw error;
598
+ }
599
+ (0, runtime_1.emitNervesEvent)({
600
+ component: "mind",
601
+ event: "mind.session_transaction_written",
602
+ message: "durably replaced session envelope",
603
+ meta: { sessionPath: canonical, ownerId: options.lease.ownerId },
604
+ });
605
+ return revision(bytes);
606
+ }
607
+ function deleteSessionTransaction(sessionPath, lease) {
608
+ assertSessionTurnLease(sessionPath, lease);
609
+ try {
610
+ fs.unlinkSync(canonicalSessionPath(sessionPath));
611
+ }
612
+ catch (error) {
613
+ if (!(error instanceof Error) || error.code !== "ENOENT")
614
+ throw error;
615
+ }
616
+ (0, runtime_1.emitNervesEvent)({
617
+ component: "mind",
618
+ event: "mind.session_transaction_deleted",
619
+ message: "deleted session under turn lease",
620
+ meta: { sessionPath: canonicalSessionPath(sessionPath), ownerId: lease.ownerId },
621
+ });
622
+ }
@@ -28,7 +28,13 @@ function configureCliRuntimeLogger(_friendId, options = {}) {
28
28
  // for an interactive session. Full detail goes to the ndjson file.
29
29
  return filterSink((0, nerves_1.createTerminalSink)(), "warn");
30
30
  }
31
- return (0, nerves_1.createNdjsonFileSink)((0, config_1.logPath)("cli", "runtime"));
31
+ // Rotation policy for the CLI runtime sink (Unit 1c):
32
+ // 25 MB x 5 gzipped generations, matching the daemon stream policy.
33
+ return (0, nerves_1.createNdjsonFileSink)((0, config_1.logPath)("cli", "runtime"), {
34
+ maxSizeBytes: 25 * 1024 * 1024,
35
+ maxGenerations: 5,
36
+ compress: true,
37
+ });
32
38
  });
33
39
  const logger = (0, nerves_1.createLogger)({
34
40
  level,
@@ -2,16 +2,25 @@
2
2
  /**
3
3
  * Per-test audit rules for nerves event coverage.
4
4
  *
5
- * Rule 1: every-test-emits -- every test must emit at least one event
6
- * Rule 2: start/end pairing -- _start events must have matching _end or _error
5
+ * Rule 1: every-test-emits -- every captured test must emit at least one event
6
+ * Rule 2: lifecycle start/end pairing -- process-scoped _start events must have matching _end or _error
7
7
  * Rule 3: error context -- error-level events must have non-empty meta
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.LIFECYCLE_PAIRED_STARTS = void 0;
10
11
  exports.checkEveryTestEmits = checkEveryTestEmits;
11
12
  exports.checkStartEndPairing = checkStartEndPairing;
12
13
  exports.checkErrorContext = checkErrorContext;
14
+ // Only these starts represent process-scoped lifecycle contracts. Most nerves
15
+ // `_start` events are local operation markers that can be legitimately observed
16
+ // by a narrow unit test without driving the whole operation to completion.
17
+ exports.LIFECYCLE_PAIRED_STARTS = new Set([
18
+ "daemon.server_start",
19
+ "daemon.update_checker_start",
20
+ "daemon.apply_pending_updates_start",
21
+ ]);
13
22
  /**
14
- * Rule 1: Every test must emit at least one nerves event.
23
+ * Rule 1: Every captured test must emit at least one nerves event.
15
24
  */
16
25
  function checkEveryTestEmits(data) {
17
26
  if (!data || typeof data !== "object") {
@@ -22,13 +31,13 @@ function checkEveryTestEmits(data) {
22
31
  .filter(([, events]) => !Array.isArray(events) || events.length === 0)
23
32
  .map(([name]) => name);
24
33
  return {
25
- status: silent.length === 0 ? "pass" : "fail",
34
+ status: entries.length > 0 && silent.length === 0 ? "pass" : "fail",
26
35
  total_tests: entries.length,
27
36
  silent_tests: silent,
28
37
  };
29
38
  }
30
39
  /**
31
- * Rule 2: _start events must have matching _end or _error within the same test.
40
+ * Rule 2: Process-scoped lifecycle _start events must have matching _end or _error within the same test.
32
41
  */
33
42
  function checkStartEndPairing(data) {
34
43
  if (!data || typeof data !== "object") {
@@ -39,7 +48,7 @@ function checkStartEndPairing(data) {
39
48
  if (!Array.isArray(events))
40
49
  continue;
41
50
  const eventNames = events.map((e) => e.event);
42
- const startEvents = eventNames.filter((name) => name.endsWith("_start"));
51
+ const startEvents = eventNames.filter((name) => exports.LIFECYCLE_PAIRED_STARTS.has(name));
43
52
  for (const startEvent of startEvents) {
44
53
  const prefix = startEvent.slice(0, -"_start".length);
45
54
  const hasEnd = eventNames.some((name) => name === `${prefix}_end`);