@ouro.bot/cli 0.1.0-alpha.79 → 0.1.0-alpha.791

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 (610) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/changelog.json +5060 -16
  15. package/deploy/unraid/Dockerfile +48 -0
  16. package/deploy/unraid/README.txt +2523 -0
  17. package/deploy/unraid/audit-container-spec.sh +4 -0
  18. package/deploy/unraid/container-runtime.json +1 -0
  19. package/deploy/unraid/migrate-sanctuary-bundle.mjs +21 -0
  20. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  21. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  22. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  23. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  24. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  25. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  26. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  27. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  28. package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
  29. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  30. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2030 -0
  31. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  32. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  33. package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
  34. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  35. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  36. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  37. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  38. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  39. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  40. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +11 -0
  41. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +11 -0
  42. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +11 -0
  43. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  44. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +23 -0
  45. package/deploy/unraid/sanctuary.xml +27 -0
  46. package/dist/a2a/card.js +57 -0
  47. package/dist/a2a/client.js +180 -0
  48. package/dist/a2a/config.js +50 -0
  49. package/dist/a2a/delegation-stores.js +56 -0
  50. package/dist/a2a/did-resolution.js +93 -0
  51. package/dist/a2a/identity.js +170 -0
  52. package/dist/a2a/inbound-share.js +107 -0
  53. package/dist/a2a/mission-result-wire.js +196 -0
  54. package/dist/a2a/onboarding.js +115 -0
  55. package/dist/a2a/pin-store.js +132 -0
  56. package/dist/a2a/seen-ledger.js +120 -0
  57. package/dist/a2a/server.js +604 -0
  58. package/dist/a2a/task-store.js +69 -0
  59. package/dist/a2a/transport.js +45 -0
  60. package/dist/a2a/types.js +3 -0
  61. package/dist/arc/attention-types.js +8 -0
  62. package/dist/arc/cares.js +360 -0
  63. package/dist/arc/episodes.js +118 -0
  64. package/dist/arc/evolution.js +490 -0
  65. package/dist/arc/flight-recorder.js +1034 -0
  66. package/dist/arc/intentions.js +134 -0
  67. package/dist/arc/json-store.js +117 -0
  68. package/dist/arc/obligations.js +386 -0
  69. package/dist/arc/packets.js +336 -0
  70. package/dist/arc/presence.js +185 -0
  71. package/dist/arc/task-lifecycle.js +57 -0
  72. package/dist/commerce/store.js +755 -0
  73. package/dist/commerce/types.js +3 -0
  74. package/dist/heart/active-work.js +820 -29
  75. package/dist/heart/agent-entry.js +252 -3
  76. package/dist/heart/approval-files.js +113 -0
  77. package/dist/heart/approval-store.js +950 -0
  78. package/dist/heart/attachments/image-normalize.js +194 -0
  79. package/dist/heart/attachments/materialize.js +97 -0
  80. package/dist/heart/attachments/originals.js +88 -0
  81. package/dist/heart/attachments/render.js +29 -0
  82. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  83. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  84. package/dist/heart/attachments/sources/index.js +18 -0
  85. package/dist/heart/attachments/sources/telegram.js +71 -0
  86. package/dist/heart/attachments/store.js +132 -0
  87. package/dist/heart/attachments/types.js +93 -0
  88. package/dist/heart/auth/auth-flow.js +495 -0
  89. package/dist/heart/autonomy-budget.js +478 -0
  90. package/dist/heart/awaiting/await-alert.js +148 -0
  91. package/dist/heart/awaiting/await-expiry.js +143 -0
  92. package/dist/heart/awaiting/await-loader.js +91 -0
  93. package/dist/heart/awaiting/await-parser.js +149 -0
  94. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  95. package/dist/heart/awaiting/await-scheduler.js +382 -0
  96. package/dist/heart/background-operations.js +281 -0
  97. package/dist/heart/bridges/manager.js +137 -17
  98. package/dist/heart/bridges/store.js +14 -2
  99. package/dist/heart/bundle-state.js +168 -0
  100. package/dist/heart/commitments.js +64 -18
  101. package/dist/heart/config-registry.js +331 -0
  102. package/dist/heart/config.js +142 -129
  103. package/dist/heart/context-loss-gauntlet.js +387 -0
  104. package/dist/heart/context-loss-sentinel.js +1157 -0
  105. package/dist/heart/core.js +2014 -469
  106. package/dist/heart/cross-chat-delivery.js +9 -22
  107. package/dist/heart/daemon/agent-config-check.js +451 -0
  108. package/dist/heart/daemon/agent-discovery.js +185 -3
  109. package/dist/heart/daemon/agent-service.js +542 -0
  110. package/dist/heart/daemon/agentic-repair.js +547 -0
  111. package/dist/heart/daemon/await-private-wake.js +59 -0
  112. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  113. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  114. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  115. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  116. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  117. package/dist/heart/daemon/cadence.js +180 -0
  118. package/dist/heart/daemon/cli-defaults.js +836 -0
  119. package/dist/heart/daemon/cli-desk.js +322 -0
  120. package/dist/heart/daemon/cli-exec.js +8730 -0
  121. package/dist/heart/daemon/cli-help.js +710 -0
  122. package/dist/heart/daemon/cli-parse.js +2719 -0
  123. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  124. package/dist/heart/daemon/cli-render.js +777 -0
  125. package/dist/heart/daemon/cli-types.js +8 -0
  126. package/dist/heart/daemon/connect-bay.js +323 -0
  127. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  128. package/dist/heart/daemon/container-healthcheck.js +96 -0
  129. package/dist/heart/daemon/container-runtime.js +97 -0
  130. package/dist/heart/daemon/container-spec-auditor-main.js +160 -0
  131. package/dist/heart/daemon/container-spec-auditor.js +176 -0
  132. package/dist/heart/daemon/daemon-bootstrap-startup.js +77 -0
  133. package/dist/heart/daemon/daemon-cli.js +29 -2284
  134. package/dist/heart/daemon/daemon-entry.js +907 -10
  135. package/dist/heart/daemon/daemon-health.js +186 -0
  136. package/dist/heart/daemon/daemon-rollup.js +57 -0
  137. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  138. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  139. package/dist/heart/daemon/daemon.js +2010 -88
  140. package/dist/heart/daemon/dns-workflow.js +394 -0
  141. package/dist/heart/daemon/doctor-types.js +8 -0
  142. package/dist/heart/daemon/doctor.js +1755 -0
  143. package/dist/heart/daemon/freshness.js +345 -0
  144. package/dist/heart/daemon/habit-private-wake.js +61 -0
  145. package/dist/heart/daemon/health-monitor.js +142 -11
  146. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  147. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  148. package/dist/heart/daemon/http-health-probe.js +80 -0
  149. package/dist/heart/daemon/human-command-screens.js +234 -0
  150. package/dist/heart/daemon/human-readiness.js +114 -0
  151. package/dist/heart/daemon/inner-status.js +78 -0
  152. package/dist/heart/daemon/interactive-repair.js +394 -0
  153. package/dist/heart/daemon/launchd.js +37 -8
  154. package/dist/heart/daemon/log-tailer.js +79 -10
  155. package/dist/heart/daemon/logs-prune.js +132 -0
  156. package/dist/heart/daemon/mcp-canary.js +524 -0
  157. package/dist/heart/daemon/message-router.js +65 -5
  158. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  159. package/dist/heart/daemon/os-cron-deps.js +135 -0
  160. package/dist/heart/daemon/os-cron.js +22 -14
  161. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  162. package/dist/heart/daemon/ouro-entry.js +3 -1
  163. package/dist/heart/daemon/plugin-cli.js +432 -0
  164. package/dist/heart/daemon/process-manager.js +733 -61
  165. package/dist/heart/daemon/provider-discovery.js +137 -0
  166. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  167. package/dist/heart/daemon/prunable-bundle.js +144 -0
  168. package/dist/heart/daemon/pulse.js +511 -0
  169. package/dist/heart/daemon/readiness-repair.js +365 -0
  170. package/dist/heart/daemon/run-hooks.js +2 -0
  171. package/dist/heart/daemon/runtime-logging.js +47 -14
  172. package/dist/heart/daemon/runtime-metadata.js +2 -30
  173. package/dist/heart/daemon/runtime-mode.js +13 -2
  174. package/dist/heart/daemon/safe-mode.js +161 -0
  175. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2609 -0
  176. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1866 -0
  177. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  178. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +976 -0
  179. package/dist/heart/daemon/sanctuary-bundle-migration.js +398 -0
  180. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  181. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  182. package/dist/heart/daemon/sense-manager.js +689 -48
  183. package/dist/heart/daemon/session-id-resolver.js +131 -0
  184. package/dist/heart/daemon/skill-management-installer.js +1 -1
  185. package/dist/heart/daemon/socket-client.js +180 -12
  186. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  187. package/dist/heart/daemon/startup-tui.js +339 -0
  188. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  189. package/dist/heart/daemon/task-scheduler.js +117 -39
  190. package/dist/heart/daemon/terminal-ui.js +499 -0
  191. package/dist/heart/daemon/thoughts.js +138 -54
  192. package/dist/heart/daemon/up-progress.js +366 -0
  193. package/dist/heart/daemon/vault-items.js +56 -0
  194. package/dist/heart/delegation.js +1 -4
  195. package/dist/heart/external-events/router.js +1414 -0
  196. package/dist/heart/habits/habit-cancel.js +810 -0
  197. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  198. package/dist/heart/habits/habit-migration.js +194 -0
  199. package/dist/heart/habits/habit-parser.js +278 -0
  200. package/dist/heart/habits/habit-runtime-state.js +93 -0
  201. package/dist/heart/habits/habit-scheduler.js +653 -0
  202. package/dist/heart/habits/habit-session-summary.js +318 -0
  203. package/dist/heart/habits/habit-session.js +636 -0
  204. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  205. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  206. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  207. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  208. package/dist/heart/identity.js +184 -59
  209. package/dist/heart/kept-notes.js +289 -0
  210. package/dist/heart/kicks.js +1 -1
  211. package/dist/heart/machine-identity.js +161 -0
  212. package/dist/heart/mail-import-discovery.js +353 -0
  213. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  214. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  215. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  216. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  217. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  218. package/dist/heart/mailbox/mailbox-http.js +99 -0
  219. package/dist/heart/mailbox/mailbox-read.js +39 -0
  220. package/dist/heart/mailbox/mailbox-types.js +27 -0
  221. package/dist/heart/mailbox/mailbox-view.js +197 -0
  222. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  223. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  224. package/dist/heart/mailbox/readers/mail.js +375 -0
  225. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  226. package/dist/heart/mailbox/readers/sessions.js +232 -0
  227. package/dist/heart/mailbox/readers/shared.js +111 -0
  228. package/dist/heart/mcp/mcp-server.js +696 -0
  229. package/dist/heart/migrate-config.js +100 -0
  230. package/dist/heart/model-capabilities.js +11 -0
  231. package/dist/heart/orientation-frame.js +345 -0
  232. package/dist/heart/platform.js +81 -0
  233. package/dist/heart/primitives.js +1 -1
  234. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  235. package/dist/heart/private-runtime/index.js +18 -0
  236. package/dist/heart/private-runtime/ledger.js +221 -0
  237. package/dist/heart/private-runtime/policy.js +252 -0
  238. package/dist/heart/private-runtime/types.js +2 -0
  239. package/dist/heart/progress-story.js +1 -1
  240. package/dist/heart/provider-attempt.js +137 -0
  241. package/dist/heart/provider-binding-resolver.js +273 -0
  242. package/dist/heart/provider-credentials.js +449 -0
  243. package/dist/heart/provider-failover.js +311 -0
  244. package/dist/heart/provider-models.js +96 -0
  245. package/dist/heart/provider-ping.js +265 -0
  246. package/dist/heart/provider-readiness-cache.js +119 -0
  247. package/dist/heart/provider-visibility.js +188 -0
  248. package/dist/heart/providers/anthropic-token.js +131 -0
  249. package/dist/heart/providers/anthropic.js +173 -60
  250. package/dist/heart/providers/azure.js +23 -11
  251. package/dist/heart/providers/error-classification.js +127 -0
  252. package/dist/heart/providers/github-copilot.js +34 -38
  253. package/dist/heart/providers/minimax-vlm.js +189 -0
  254. package/dist/heart/providers/minimax.js +26 -8
  255. package/dist/heart/providers/openai-codex-token.js +349 -0
  256. package/dist/heart/providers/openai-codex.js +55 -40
  257. package/dist/heart/providers/openai-compatible.js +177 -0
  258. package/dist/heart/run-ledger.js +247 -0
  259. package/dist/heart/runtime-capability-check.js +170 -0
  260. package/dist/heart/runtime-credentials.js +607 -0
  261. package/dist/heart/runtime-cwd.js +87 -0
  262. package/dist/heart/sense-truth.js +22 -4
  263. package/dist/heart/session-activity.js +90 -24
  264. package/dist/heart/session-events.js +1318 -0
  265. package/dist/heart/session-playback-cli-main.js +5 -0
  266. package/dist/heart/session-playback-cli.js +36 -0
  267. package/dist/heart/session-playback.js +231 -0
  268. package/dist/heart/session-stats-cli-main.js +5 -0
  269. package/dist/heart/session-stats.js +182 -0
  270. package/dist/heart/session-transcript.js +133 -0
  271. package/dist/heart/start-of-turn-packet.js +372 -0
  272. package/dist/heart/steward-policy.js +302 -0
  273. package/dist/heart/streaming.js +604 -207
  274. package/dist/heart/structured-output.js +196 -0
  275. package/dist/heart/sync-classification.js +176 -0
  276. package/dist/heart/sync.js +449 -0
  277. package/dist/heart/target-resolution.js +11 -7
  278. package/dist/heart/tempo.js +93 -0
  279. package/dist/heart/temporal-view.js +41 -0
  280. package/dist/heart/timeouts.js +101 -0
  281. package/dist/heart/tool-activity-callbacks.js +59 -0
  282. package/dist/heart/tool-approval.js +342 -0
  283. package/dist/heart/tool-description.js +155 -0
  284. package/dist/heart/tool-friction.js +55 -0
  285. package/dist/heart/tool-loop.js +200 -0
  286. package/dist/heart/turn-context.js +481 -0
  287. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  288. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  289. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  290. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  291. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  292. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  293. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  294. package/dist/heart/versioning/update-hooks.js +154 -0
  295. package/dist/heart/versioning/version-intent.js +114 -0
  296. package/dist/heart/work-card.js +380 -0
  297. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  298. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  299. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  300. package/dist/mailbox-ui/index.html +16 -0
  301. package/dist/mailroom/attention.js +167 -0
  302. package/dist/mailroom/autonomy.js +209 -0
  303. package/dist/mailroom/blob-store.js +889 -0
  304. package/dist/mailroom/body-cache.js +61 -0
  305. package/dist/mailroom/cache-sync-cli.js +58 -0
  306. package/dist/mailroom/core.js +803 -0
  307. package/dist/mailroom/entry.js +160 -0
  308. package/dist/mailroom/file-store.js +568 -0
  309. package/dist/mailroom/hosted-cache-sync.js +384 -0
  310. package/dist/mailroom/mbox-import.js +393 -0
  311. package/dist/mailroom/migration.js +164 -0
  312. package/dist/mailroom/outbound.js +380 -0
  313. package/dist/mailroom/policy.js +263 -0
  314. package/dist/mailroom/reader.js +292 -0
  315. package/dist/mailroom/search-cache.js +513 -0
  316. package/dist/mailroom/search-relevance.js +319 -0
  317. package/dist/mailroom/smtp-ingress.js +176 -0
  318. package/dist/mailroom/source-state.js +176 -0
  319. package/dist/mailroom/thread.js +109 -0
  320. package/dist/mailroom/travel-extract.js +89 -0
  321. package/dist/mind/bundle-manifest.js +24 -2
  322. package/dist/mind/context.js +278 -111
  323. package/dist/mind/desk-section.js +362 -0
  324. package/dist/mind/diary-integrity.js +60 -0
  325. package/dist/mind/{memory.js → diary.js} +68 -77
  326. package/dist/mind/embedding-provider.js +60 -0
  327. package/dist/mind/file-state.js +179 -0
  328. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  329. package/dist/mind/obligation-steering.js +227 -0
  330. package/dist/mind/pending.js +34 -8
  331. package/dist/mind/prompt-budget.js +479 -0
  332. package/dist/mind/prompt-refresh.js +3 -2
  333. package/dist/mind/prompt.js +1056 -187
  334. package/dist/mind/provenance-trust.js +26 -0
  335. package/dist/mind/record-paths.js +312 -0
  336. package/dist/mind/scrutiny.js +173 -0
  337. package/dist/mind/session-transaction.js +415 -0
  338. package/dist/nerves/cli-logging.js +7 -1
  339. package/dist/nerves/coverage/audit-rules.js +15 -6
  340. package/dist/nerves/coverage/audit.js +28 -2
  341. package/dist/nerves/coverage/cli.js +1 -1
  342. package/dist/nerves/coverage/contract.js +5 -5
  343. package/dist/nerves/coverage/file-completeness.js +139 -5
  344. package/dist/nerves/coverage/run-artifacts.js +55 -35
  345. package/dist/nerves/coverage/source-scanner.js +4 -4
  346. package/dist/nerves/event-buffer.js +111 -0
  347. package/dist/nerves/index.js +293 -9
  348. package/dist/nerves/observation.js +20 -0
  349. package/dist/nerves/redact.js +79 -0
  350. package/dist/nerves/review/cli-main.js +5 -0
  351. package/dist/nerves/review/cli.js +156 -0
  352. package/dist/nerves/review/core.js +159 -0
  353. package/dist/nerves/runtime.js +17 -1
  354. package/dist/repertoire/ado-client.js +15 -56
  355. package/dist/repertoire/ado-semantic.js +16 -10
  356. package/dist/repertoire/api-client.js +97 -0
  357. package/dist/repertoire/bitwarden-store.js +1045 -0
  358. package/dist/repertoire/bundle-templates.js +71 -0
  359. package/dist/repertoire/bw-installer.js +180 -0
  360. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  361. package/dist/repertoire/coding/context-pack.js +331 -0
  362. package/dist/repertoire/coding/feedback.js +218 -30
  363. package/dist/repertoire/coding/index.js +15 -3
  364. package/dist/repertoire/coding/manager.js +166 -10
  365. package/dist/repertoire/coding/spawner.js +58 -11
  366. package/dist/repertoire/coding/tools.js +242 -14
  367. package/dist/repertoire/coding/workbench-client.js +272 -0
  368. package/dist/repertoire/coding/workbench-manager.js +346 -0
  369. package/dist/repertoire/commerce-errors.js +109 -0
  370. package/dist/repertoire/commerce-self-test.js +156 -0
  371. package/dist/repertoire/credential-access.js +178 -0
  372. package/dist/repertoire/desk/classifier.js +362 -0
  373. package/dist/repertoire/duffel-client.js +185 -0
  374. package/dist/repertoire/github-client.js +14 -55
  375. package/dist/repertoire/graph-client.js +11 -52
  376. package/dist/repertoire/guardrails.js +811 -18
  377. package/dist/repertoire/mcp-client.js +44 -3
  378. package/dist/repertoire/mcp-manager.js +259 -20
  379. package/dist/repertoire/mcp-tools.js +83 -0
  380. package/dist/repertoire/plugin-mcp.js +175 -0
  381. package/dist/repertoire/plugins.js +253 -0
  382. package/dist/repertoire/relationship-authorization.js +194 -0
  383. package/dist/repertoire/shell-sessions.js +133 -0
  384. package/dist/repertoire/skills.js +48 -4
  385. package/dist/repertoire/stripe-client.js +131 -0
  386. package/dist/repertoire/tool-arguments.js +148 -0
  387. package/dist/repertoire/tool-results.js +29 -0
  388. package/dist/repertoire/tools-a2a.js +699 -0
  389. package/dist/repertoire/tools-attachments.js +322 -0
  390. package/dist/repertoire/tools-awaiting.js +575 -0
  391. package/dist/repertoire/tools-base.js +82 -1139
  392. package/dist/repertoire/tools-bluebubbles.js +2 -0
  393. package/dist/repertoire/tools-bridge.js +144 -0
  394. package/dist/repertoire/tools-bundle.js +993 -0
  395. package/dist/repertoire/tools-commerce.js +253 -0
  396. package/dist/repertoire/tools-config.js +186 -0
  397. package/dist/repertoire/tools-continuity.js +575 -0
  398. package/dist/repertoire/tools-credential.js +383 -0
  399. package/dist/repertoire/tools-evolution.js +527 -0
  400. package/dist/repertoire/tools-files.js +344 -0
  401. package/dist/repertoire/tools-flight.js +290 -0
  402. package/dist/repertoire/tools-flow.js +119 -0
  403. package/dist/repertoire/tools-github.js +3 -8
  404. package/dist/repertoire/tools-habits.js +103 -0
  405. package/dist/repertoire/tools-mail.js +1828 -0
  406. package/dist/repertoire/tools-notes.js +485 -0
  407. package/dist/repertoire/tools-obligations.js +182 -0
  408. package/dist/repertoire/tools-orientation.js +31 -0
  409. package/dist/repertoire/tools-record.js +482 -0
  410. package/dist/repertoire/tools-rsvp.js +139 -0
  411. package/dist/repertoire/tools-runtime.js +150 -0
  412. package/dist/repertoire/tools-session.js +1108 -0
  413. package/dist/repertoire/tools-shell.js +133 -0
  414. package/dist/repertoire/tools-steward-policy.js +95 -0
  415. package/dist/repertoire/tools-stripe.js +224 -0
  416. package/dist/repertoire/tools-surface.js +369 -0
  417. package/dist/repertoire/tools-teams.js +12 -39
  418. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  419. package/dist/repertoire/tools-travel.js +125 -0
  420. package/dist/repertoire/tools-trip.js +982 -0
  421. package/dist/repertoire/tools-unraid.js +483 -0
  422. package/dist/repertoire/tools-user-profile.js +146 -0
  423. package/dist/repertoire/tools-vault.js +40 -0
  424. package/dist/repertoire/tools-voice.js +145 -0
  425. package/dist/repertoire/tools.js +377 -80
  426. package/dist/repertoire/travel-api-client.js +360 -0
  427. package/dist/repertoire/unraid-client.js +155 -0
  428. package/dist/repertoire/unraid-restart.js +212 -0
  429. package/dist/repertoire/user-profile.js +131 -0
  430. package/dist/repertoire/vault-setup.js +246 -0
  431. package/dist/repertoire/vault-unlock.js +628 -0
  432. package/dist/rsvp/aisleplanner-client.js +354 -0
  433. package/dist/rsvp/cli.js +926 -0
  434. package/dist/rsvp/config.js +327 -0
  435. package/dist/rsvp/cutover.js +433 -0
  436. package/dist/rsvp/diagnostics.js +232 -0
  437. package/dist/rsvp/diff-renderer.js +176 -0
  438. package/dist/rsvp/habit-policy.js +110 -0
  439. package/dist/rsvp/habit-stage.js +123 -0
  440. package/dist/rsvp/incident-bundle.js +97 -0
  441. package/dist/rsvp/migration.js +204 -0
  442. package/dist/rsvp/native-habit-runner.js +630 -0
  443. package/dist/rsvp/outbound-state.js +628 -0
  444. package/dist/rsvp/query.js +118 -0
  445. package/dist/rsvp/replay.js +233 -0
  446. package/dist/rsvp/snapshot.js +232 -0
  447. package/dist/rsvp/spend-ledger.js +175 -0
  448. package/dist/scripts/claude-code-hook.js +41 -0
  449. package/dist/scripts/claude-code-stop-hook.js +47 -0
  450. package/dist/senses/a2a-entry.js +115 -0
  451. package/dist/senses/attention-queue.js +186 -0
  452. package/dist/senses/await-turn-message.js +58 -0
  453. package/dist/senses/bluebubbles/active-turns.js +216 -0
  454. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  455. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  456. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  457. package/dist/senses/bluebubbles/context-packet.js +207 -0
  458. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  459. package/dist/senses/bluebubbles/entry.js +90 -0
  460. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  461. package/dist/senses/bluebubbles/index.js +3839 -0
  462. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  463. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  464. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  465. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  466. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  467. package/dist/senses/bluebubbles/processed-log.js +133 -0
  468. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  469. package/dist/senses/bluebubbles/replay.js +284 -0
  470. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  471. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  472. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  473. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  474. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  475. package/dist/senses/cli/bracketed-paste.js +82 -0
  476. package/dist/senses/cli/image-paste.js +287 -0
  477. package/dist/senses/cli/image-ref-navigation.js +75 -0
  478. package/dist/senses/cli/ink-app.js +156 -0
  479. package/dist/senses/cli/inline-diff.js +64 -0
  480. package/dist/senses/cli/input-keys.js +174 -0
  481. package/dist/senses/cli/kill-ring.js +86 -0
  482. package/dist/senses/cli/message-list.js +51 -0
  483. package/dist/senses/cli/ouro-tui.js +607 -0
  484. package/dist/senses/cli/spinner-imperative.js +135 -0
  485. package/dist/senses/cli/spinner.js +101 -0
  486. package/dist/senses/cli/status-line.js +60 -0
  487. package/dist/senses/cli/streaming-markdown.js +526 -0
  488. package/dist/senses/cli/tool-display.js +85 -0
  489. package/dist/senses/cli/tool-render.js +85 -0
  490. package/dist/senses/cli/tui-store.js +241 -0
  491. package/dist/senses/cli/virtual-list.js +35 -0
  492. package/dist/senses/cli-entry.js +60 -8
  493. package/dist/senses/cli.js +600 -317
  494. package/dist/senses/commands.js +66 -3
  495. package/dist/senses/context-packet-ledger.js +371 -0
  496. package/dist/senses/context-packets.js +154 -0
  497. package/dist/senses/habit-lifecycle-guard.js +24 -0
  498. package/dist/senses/habit-turn-message.js +160 -0
  499. package/dist/senses/ingress-evidence.js +2 -0
  500. package/dist/senses/mail-entry.js +66 -0
  501. package/dist/senses/mail.js +524 -0
  502. package/dist/senses/pipeline.js +1110 -204
  503. package/dist/senses/private-runtime-worker.js +859 -0
  504. package/dist/senses/private-runtime.js +1496 -0
  505. package/dist/senses/proactive-content-guard.js +51 -0
  506. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  507. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  508. package/dist/senses/sanctuary-grounding.js +118 -0
  509. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  510. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  511. package/dist/senses/sanctuary-health-runner.js +101 -0
  512. package/dist/senses/sanctuary-health.js +408 -0
  513. package/dist/senses/sanctuary-interactive-control.js +306 -0
  514. package/dist/senses/sanctuary-media-catalog-contract.js +39 -0
  515. package/dist/senses/sanctuary-media-optimization.js +501 -0
  516. package/dist/senses/sanctuary-runtime.js +331 -0
  517. package/dist/senses/sanctuary-sab.js +85 -0
  518. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  519. package/dist/senses/shared-turn.js +494 -0
  520. package/dist/senses/surface-tool.js +109 -0
  521. package/dist/senses/teams-entry.js +60 -8
  522. package/dist/senses/teams.js +515 -217
  523. package/dist/senses/telegram-admission.js +711 -0
  524. package/dist/senses/telegram-approval-runtime.js +566 -0
  525. package/dist/senses/telegram-attachments.js +182 -0
  526. package/dist/senses/telegram-audit-ledger.js +220 -0
  527. package/dist/senses/telegram-client.js +1676 -0
  528. package/dist/senses/telegram-effect-adapter.js +845 -0
  529. package/dist/senses/telegram-entry.js +83 -0
  530. package/dist/senses/telegram.js +2026 -0
  531. package/dist/senses/trust-gate.js +104 -9
  532. package/dist/senses/voice/audio-playback.js +237 -0
  533. package/dist/senses/voice/audio-routing.js +119 -0
  534. package/dist/senses/voice/elevenlabs.js +202 -0
  535. package/dist/senses/voice/floor-control.js +431 -0
  536. package/dist/senses/voice/floor-controller.js +115 -0
  537. package/dist/senses/voice/golden-path.js +116 -0
  538. package/dist/senses/voice/index.js +29 -0
  539. package/dist/senses/voice/meeting.js +113 -0
  540. package/dist/senses/voice/outbound.js +190 -0
  541. package/dist/senses/voice/phone.js +33 -0
  542. package/dist/senses/voice/playback.js +139 -0
  543. package/dist/senses/voice/realtime-eval.js +496 -0
  544. package/dist/senses/voice/realtime-trace.js +531 -0
  545. package/dist/senses/voice/transcript.js +70 -0
  546. package/dist/senses/voice/turn.js +191 -0
  547. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  548. package/dist/senses/voice/twilio-phone.js +5081 -0
  549. package/dist/senses/voice/types.js +2 -0
  550. package/dist/senses/voice/whisper.js +161 -0
  551. package/dist/senses/voice-entry.js +81 -0
  552. package/dist/senses/voice-realtime-eval-command.js +99 -0
  553. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  554. package/dist/senses/voice-twilio-entry.js +87 -0
  555. package/dist/trips/core.js +138 -0
  556. package/dist/trips/store.js +265 -0
  557. package/dist/util/frontmatter.js +69 -0
  558. package/npm-shrinkwrap.json +8144 -0
  559. package/package.json +72 -13
  560. package/skills/agent-commerce.md +113 -0
  561. package/skills/browser-navigation.md +117 -0
  562. package/skills/commerce-setup-guide.md +116 -0
  563. package/skills/commerce-setup.md +84 -0
  564. package/skills/configure-dev-tools.md +99 -0
  565. package/skills/travel-planning.md +138 -0
  566. package/dist/heart/daemon/auth-flow.js +0 -430
  567. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  568. package/dist/heart/daemon/ouro-version-manager.js +0 -164
  569. package/dist/heart/daemon/update-hooks.js +0 -138
  570. package/dist/heart/obligations.js +0 -141
  571. package/dist/heart/safe-workspace.js +0 -228
  572. package/dist/heart/session-recall.js +0 -116
  573. package/dist/mind/friends/channel.js +0 -84
  574. package/dist/mind/friends/group-context.js +0 -144
  575. package/dist/mind/friends/resolver.js +0 -84
  576. package/dist/mind/friends/store-file.js +0 -190
  577. package/dist/mind/friends/store.js +0 -4
  578. package/dist/mind/friends/tokens.js +0 -26
  579. package/dist/mind/friends/trust-explanation.js +0 -74
  580. package/dist/mind/friends/types.js +0 -29
  581. package/dist/repertoire/tasks/board.js +0 -134
  582. package/dist/repertoire/tasks/index.js +0 -224
  583. package/dist/repertoire/tasks/lifecycle.js +0 -80
  584. package/dist/repertoire/tasks/middleware.js +0 -65
  585. package/dist/repertoire/tasks/parser.js +0 -173
  586. package/dist/repertoire/tasks/scanner.js +0 -132
  587. package/dist/repertoire/tasks/transitions.js +0 -144
  588. package/dist/senses/bluebubbles-entry.js +0 -13
  589. package/dist/senses/bluebubbles.js +0 -1181
  590. package/dist/senses/debug-activity.js +0 -154
  591. package/dist/senses/inner-dialog-worker.js +0 -90
  592. package/dist/senses/inner-dialog.js +0 -525
  593. package/subagents/README.md +0 -7
  594. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  595. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  596. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  597. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  598. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  599. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  600. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  601. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  602. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  603. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  604. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  605. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  606. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  607. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  608. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  609. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  610. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,415 @@
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.acquireSessionTurnLease = acquireSessionTurnLease;
41
+ exports.withSessionTurnLease = withSessionTurnLease;
42
+ exports.withImmediateSessionTurnLease = withImmediateSessionTurnLease;
43
+ exports.currentSessionTurnLease = currentSessionTurnLease;
44
+ exports.assertSessionTurnLease = assertSessionTurnLease;
45
+ exports.readSessionTransaction = readSessionTransaction;
46
+ exports.writeSessionTransaction = writeSessionTransaction;
47
+ exports.deleteSessionTransaction = deleteSessionTransaction;
48
+ const node_async_hooks_1 = require("node:async_hooks");
49
+ const node_crypto_1 = require("node:crypto");
50
+ const fs = __importStar(require("node:fs"));
51
+ const path = __importStar(require("node:path"));
52
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
53
+ const runtime_1 = require("../nerves/runtime");
54
+ const habit_lifecycle_1 = require("../heart/habits/habit-lifecycle");
55
+ class SessionTurnBusyError extends Error {
56
+ retryable = true;
57
+ constructor(message = "session turn is busy") {
58
+ super(message);
59
+ this.name = "SessionTurnBusyError";
60
+ }
61
+ }
62
+ exports.SessionTurnBusyError = SessionTurnBusyError;
63
+ class SessionTransactionError extends Error {
64
+ constructor(message) {
65
+ super(message);
66
+ this.name = "SessionTransactionError";
67
+ }
68
+ }
69
+ exports.SessionTransactionError = SessionTransactionError;
70
+ const heldLeases = new Map();
71
+ const leaseContext = new node_async_hooks_1.AsyncLocalStorage();
72
+ function canonicalSessionPath(sessionPath) {
73
+ return path.resolve(sessionPath);
74
+ }
75
+ function revision(bytes) {
76
+ return (0, node_crypto_1.createHash)("sha256").update(bytes, "utf8").digest("hex");
77
+ }
78
+ function processAlive(pid) {
79
+ try {
80
+ process.kill(pid, 0);
81
+ return true;
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ function sleep(ms) {
88
+ return new Promise((resolve) => setTimeout(resolve, ms));
89
+ }
90
+ function isSqliteBusy(error) {
91
+ return error instanceof Error && "code" in error
92
+ && error.code === "SQLITE_BUSY";
93
+ }
94
+ function openLeaseDatabase(lockPath, busyTimeoutMs = 0) {
95
+ const database = new better_sqlite3_1.default(lockPath);
96
+ database.pragma(`busy_timeout = ${busyTimeoutMs}`);
97
+ database.exec(`
98
+ CREATE TABLE IF NOT EXISTS session_turn_lease (
99
+ singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
100
+ pid INTEGER NOT NULL,
101
+ owner_id TEXT NOT NULL,
102
+ owner_token TEXT NOT NULL
103
+ )
104
+ `);
105
+ const columns = new Set(database.prepare(`PRAGMA table_info(session_turn_lease)`).all().map((column) => column.name));
106
+ if (!columns.has("boot_identity"))
107
+ database.exec(`ALTER TABLE session_turn_lease ADD COLUMN boot_identity TEXT`);
108
+ if (!columns.has("process_started_at"))
109
+ database.exec(`ALTER TABLE session_turn_lease ADD COLUMN process_started_at TEXT`);
110
+ return database;
111
+ }
112
+ function acquisitionRecord(options) {
113
+ const pid = options.pid ?? process.pid;
114
+ const bootIdentity = (options.getBootIdentity ?? habit_lifecycle_1.probeHabitBootIdentity)();
115
+ const processStartedAt = (options.getProcessStartedAt ?? habit_lifecycle_1.probeHabitProcessStartedAt)(pid);
116
+ if (!bootIdentity || !processStartedAt)
117
+ throw new SessionTransactionError("current process identity is unavailable");
118
+ return {
119
+ pid,
120
+ ownerId: options.ownerId ?? (0, node_crypto_1.randomUUID)(),
121
+ ownerToken: options.ownerToken ?? (0, node_crypto_1.randomUUID)(),
122
+ bootIdentity,
123
+ processStartedAt,
124
+ };
125
+ }
126
+ function claimLeaseRecord(lockPath, record, isProcessAlive, getProcessStartedAt) {
127
+ const database = openLeaseDatabase(lockPath);
128
+ try {
129
+ return database.transaction(() => {
130
+ const current = database.prepare(`
131
+ SELECT pid, owner_id, owner_token, boot_identity, process_started_at FROM session_turn_lease WHERE singleton = 1
132
+ `).get();
133
+ if (!current) {
134
+ database.prepare(`
135
+ INSERT INTO session_turn_lease (singleton, pid, owner_id, owner_token, boot_identity, process_started_at) VALUES (1, ?, ?, ?, ?, ?)
136
+ `).run(record.pid, record.ownerId, record.ownerToken, record.bootIdentity, record.processStartedAt);
137
+ return { acquired: true, stale: null };
138
+ }
139
+ if (!Number.isSafeInteger(current.pid) || current.pid <= 0
140
+ || typeof current.owner_id !== "string" || current.owner_id.length === 0
141
+ || typeof current.owner_token !== "string" || current.owner_token.length === 0
142
+ || !((current.boot_identity === null && current.process_started_at === null)
143
+ || (typeof current.boot_identity === "string" && current.boot_identity.length > 0
144
+ && typeof current.process_started_at === "string" && current.process_started_at.length > 0))) {
145
+ throw new SessionTransactionError("invalid session lease record");
146
+ }
147
+ const observed = {
148
+ pid: current.pid,
149
+ ownerId: current.owner_id,
150
+ ownerToken: current.owner_token,
151
+ bootIdentity: current.boot_identity,
152
+ processStartedAt: current.process_started_at,
153
+ };
154
+ const differentBoot = observed.bootIdentity !== null && observed.bootIdentity !== record.bootIdentity;
155
+ let differentProcess = false;
156
+ if (observed.bootIdentity !== null && !differentBoot) {
157
+ const liveStartedAt = getProcessStartedAt(observed.pid);
158
+ differentProcess = liveStartedAt !== null && liveStartedAt !== observed.processStartedAt;
159
+ if (liveStartedAt === observed.processStartedAt)
160
+ return { acquired: false, stale: null };
161
+ }
162
+ if (!differentBoot && !differentProcess && isProcessAlive(observed.pid))
163
+ return { acquired: false, stale: null };
164
+ const changed = database.prepare(`
165
+ UPDATE session_turn_lease SET pid = ?, owner_id = ?, owner_token = ?, boot_identity = ?, process_started_at = ?
166
+ WHERE singleton = 1 AND pid = ? AND owner_id = ? AND owner_token = ?
167
+ AND boot_identity IS ? AND process_started_at IS ?
168
+ `).run(record.pid, record.ownerId, record.ownerToken, record.bootIdentity, record.processStartedAt, observed.pid, observed.ownerId, observed.ownerToken, observed.bootIdentity, observed.processStartedAt).changes;
169
+ return changed === 1 ? { acquired: true, stale: observed } : { acquired: false, stale: null };
170
+ })();
171
+ }
172
+ finally {
173
+ database.close();
174
+ }
175
+ }
176
+ function releaseLeaseRecord(lockPath, record) {
177
+ const database = openLeaseDatabase(lockPath, 5_000);
178
+ try {
179
+ return database.prepare(`
180
+ DELETE FROM session_turn_lease WHERE singleton = 1 AND pid = ? AND owner_id = ? AND owner_token = ?
181
+ AND boot_identity IS ? AND process_started_at IS ?
182
+ `).run(record.pid, record.ownerId, record.ownerToken, record.bootIdentity, record.processStartedAt).changes === 1;
183
+ }
184
+ finally {
185
+ database.close();
186
+ }
187
+ }
188
+ function makeLease(held) {
189
+ let localReleased = false;
190
+ return {
191
+ sessionPath: held.sessionPath,
192
+ ownerId: held.ownerId,
193
+ ownerToken: held.ownerToken,
194
+ release: async () => {
195
+ if (localReleased)
196
+ return;
197
+ localReleased = true;
198
+ held.depth -= 1;
199
+ if (held.depth > 0 || held.released)
200
+ return;
201
+ held.released = true;
202
+ releaseLeaseRecord(held.lockPath, held);
203
+ heldLeases.delete(held.sessionPath);
204
+ (0, runtime_1.emitNervesEvent)({
205
+ component: "mind",
206
+ event: "mind.session_turn_lease_released",
207
+ message: "released session turn lease",
208
+ meta: { sessionPath: held.sessionPath, ownerId: held.ownerId },
209
+ });
210
+ },
211
+ };
212
+ }
213
+ async function acquireSessionTurnLease(sessionPath, options = {}) {
214
+ const canonical = canonicalSessionPath(sessionPath);
215
+ const existing = heldLeases.get(canonical);
216
+ if (existing && !existing.released) {
217
+ if (options.ownerId === existing.ownerId && options.ownerToken === existing.ownerToken) {
218
+ existing.depth += 1;
219
+ return makeLease(existing);
220
+ }
221
+ }
222
+ const record = acquisitionRecord(options);
223
+ const { ownerId } = record;
224
+ const timeoutMs = options.timeoutMs ?? 5_000;
225
+ const pollIntervalMs = options.pollIntervalMs ?? 10;
226
+ const isProcessAlive = options.isProcessAlive ?? processAlive;
227
+ const lockPath = `${canonical}.turn.lock`;
228
+ const started = Date.now();
229
+ fs.mkdirSync(path.dirname(canonical), { recursive: true });
230
+ for (;;) {
231
+ let claim = null;
232
+ try {
233
+ claim = claimLeaseRecord(lockPath, record, isProcessAlive, options.getProcessStartedAt ?? habit_lifecycle_1.probeHabitProcessStartedAt);
234
+ }
235
+ catch (error) {
236
+ if (!isSqliteBusy(error))
237
+ throw error;
238
+ }
239
+ if (claim?.acquired) {
240
+ const held = { sessionPath: canonical, lockPath, ...record, depth: 1, released: false };
241
+ heldLeases.set(canonical, held);
242
+ (0, runtime_1.emitNervesEvent)({
243
+ component: "mind",
244
+ event: "mind.session_turn_lease_acquired",
245
+ message: "acquired session turn lease",
246
+ meta: { sessionPath: canonical, ownerId },
247
+ });
248
+ if (claim.stale) {
249
+ options.onStaleLease?.(claim.stale);
250
+ (0, runtime_1.emitNervesEvent)({
251
+ level: "warn",
252
+ component: "mind",
253
+ event: "mind.session_turn_lease_stolen",
254
+ message: "stole stale session turn lease",
255
+ meta: { sessionPath: canonical, stalePid: claim.stale.pid, staleOwnerId: claim.stale.ownerId },
256
+ });
257
+ }
258
+ return makeLease(held);
259
+ }
260
+ if (Date.now() - started >= timeoutMs) {
261
+ (0, runtime_1.emitNervesEvent)({
262
+ level: "warn",
263
+ component: "mind",
264
+ event: "mind.session_turn_lease_busy",
265
+ message: "session turn lease acquisition timed out",
266
+ meta: { sessionPath: canonical, ownerId, timeoutMs },
267
+ });
268
+ throw new SessionTurnBusyError(`session turn busy: ${canonical}`);
269
+ }
270
+ await sleep(pollIntervalMs);
271
+ }
272
+ }
273
+ async function withSessionTurnLease(sessionPath, work, options = {}) {
274
+ const lease = await acquireSessionTurnLease(sessionPath, options);
275
+ try {
276
+ return await leaseContext.run(lease, () => work(lease));
277
+ }
278
+ finally {
279
+ await lease.release();
280
+ }
281
+ }
282
+ function withImmediateSessionTurnLease(sessionPath, work, options = {}) {
283
+ const canonical = canonicalSessionPath(sessionPath);
284
+ const contextual = currentSessionTurnLease(canonical);
285
+ if (contextual)
286
+ return work(contextual);
287
+ const record = acquisitionRecord(options);
288
+ const lockPath = `${canonical}.turn.lock`;
289
+ fs.mkdirSync(path.dirname(canonical), { recursive: true });
290
+ const tryAcquire = () => {
291
+ let claim;
292
+ try {
293
+ claim = claimLeaseRecord(lockPath, record, options.isProcessAlive ?? processAlive, options.getProcessStartedAt ?? habit_lifecycle_1.probeHabitProcessStartedAt);
294
+ }
295
+ catch (error) {
296
+ if (isSqliteBusy(error))
297
+ return null;
298
+ throw error;
299
+ }
300
+ if (claim.acquired) {
301
+ const held = { sessionPath: canonical, lockPath, ...record, depth: 1, released: false };
302
+ heldLeases.set(canonical, held);
303
+ if (claim.stale) {
304
+ options.onStaleLease?.(claim.stale);
305
+ (0, runtime_1.emitNervesEvent)({
306
+ level: "warn",
307
+ component: "mind",
308
+ event: "mind.session_turn_lease_stolen",
309
+ message: "stole stale session turn lease",
310
+ meta: { sessionPath: canonical, stalePid: claim.stale.pid, staleOwnerId: claim.stale.ownerId },
311
+ });
312
+ }
313
+ return held;
314
+ }
315
+ return null;
316
+ };
317
+ const held = tryAcquire();
318
+ if (!held)
319
+ throw new SessionTurnBusyError(`session turn busy: ${canonical}`);
320
+ const lease = makeLease(held);
321
+ try {
322
+ return leaseContext.run(lease, () => work(lease));
323
+ }
324
+ finally {
325
+ void lease.release();
326
+ }
327
+ }
328
+ function currentSessionTurnLease(sessionPath) {
329
+ const lease = leaseContext.getStore();
330
+ return lease && lease.sessionPath === canonicalSessionPath(sessionPath) ? lease : null;
331
+ }
332
+ function assertSessionTurnLease(sessionPath, lease) {
333
+ const canonical = canonicalSessionPath(sessionPath);
334
+ if (lease.sessionPath !== canonical)
335
+ throw new SessionTransactionError("leased session path mismatch");
336
+ const held = heldLeases.get(canonical);
337
+ if (!held || held.released || held.ownerId !== lease.ownerId || held.ownerToken !== lease.ownerToken) {
338
+ throw new SessionTransactionError("session lease owner token mismatch");
339
+ }
340
+ }
341
+ function readSessionTransaction(sessionPath, lease) {
342
+ assertSessionTurnLease(sessionPath, lease);
343
+ let bytes = "";
344
+ try {
345
+ bytes = fs.readFileSync(canonicalSessionPath(sessionPath), "utf8");
346
+ }
347
+ catch (error) {
348
+ if (!(error instanceof Error) || error.code !== "ENOENT")
349
+ throw error;
350
+ }
351
+ return { bytes, value: bytes ? JSON.parse(bytes) : null, revision: revision(bytes) };
352
+ }
353
+ function writeSessionTransaction(sessionPath, value, options) {
354
+ assertSessionTurnLease(sessionPath, options.lease);
355
+ const canonical = canonicalSessionPath(sessionPath);
356
+ const current = readSessionTransaction(canonical, options.lease);
357
+ if (current.revision !== options.expectedRevision)
358
+ throw new SessionTransactionError("session revision changed");
359
+ fs.mkdirSync(path.dirname(canonical), { recursive: true });
360
+ const bytes = JSON.stringify(value, null, 2);
361
+ const tempPath = path.join(path.dirname(canonical), `.${path.basename(canonical)}.tmp-${process.pid}-${(0, node_crypto_1.randomUUID)()}`);
362
+ let fd = null;
363
+ try {
364
+ fd = fs.openSync(tempPath, "wx", 0o600);
365
+ fs.writeFileSync(fd, bytes, "utf8");
366
+ fs.fsyncSync(fd);
367
+ fs.closeSync(fd);
368
+ fd = null;
369
+ options.hooks?.beforeRename?.();
370
+ fs.renameSync(tempPath, canonical);
371
+ const directoryFd = fs.openSync(path.dirname(canonical), "r");
372
+ try {
373
+ fs.fsyncSync(directoryFd);
374
+ }
375
+ finally {
376
+ fs.closeSync(directoryFd);
377
+ }
378
+ }
379
+ catch (error) {
380
+ /* v8 ignore next -- fd-close failure after a prior node:fs failure is best-effort cleanup @preserve */
381
+ if (fd !== null)
382
+ try {
383
+ fs.closeSync(fd);
384
+ }
385
+ catch { /* best effort */ }
386
+ try {
387
+ fs.unlinkSync(tempPath);
388
+ }
389
+ catch { /* best effort */ }
390
+ throw error;
391
+ }
392
+ (0, runtime_1.emitNervesEvent)({
393
+ component: "mind",
394
+ event: "mind.session_transaction_written",
395
+ message: "durably replaced session envelope",
396
+ meta: { sessionPath: canonical, ownerId: options.lease.ownerId },
397
+ });
398
+ return revision(bytes);
399
+ }
400
+ function deleteSessionTransaction(sessionPath, lease) {
401
+ assertSessionTurnLease(sessionPath, lease);
402
+ try {
403
+ fs.unlinkSync(canonicalSessionPath(sessionPath));
404
+ }
405
+ catch (error) {
406
+ if (!(error instanceof Error) || error.code !== "ENOENT")
407
+ throw error;
408
+ }
409
+ (0, runtime_1.emitNervesEvent)({
410
+ component: "mind",
411
+ event: "mind.session_transaction_deleted",
412
+ message: "deleted session under turn lease",
413
+ meta: { sessionPath: canonicalSessionPath(sessionPath), ownerId: lease.ownerId },
414
+ });
415
+ }
@@ -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`);
@@ -69,12 +69,38 @@ function readPerTestData(perTestPath) {
69
69
  if (!perTestPath || !(0, fs_1.existsSync)(perTestPath))
70
70
  return null;
71
71
  try {
72
- return JSON.parse((0, fs_1.readFileSync)(perTestPath, "utf8"));
72
+ const raw = (0, fs_1.readFileSync)(perTestPath, "utf8").trim();
73
+ if (!raw)
74
+ return null;
75
+ try {
76
+ const parsed = JSON.parse(raw);
77
+ if (isPerTestRecord(parsed)) {
78
+ return { [parsed.testName]: parsed.events };
79
+ }
80
+ return parsed;
81
+ }
82
+ catch {
83
+ const perTestData = {};
84
+ for (const line of raw.split("\n").map((entry) => entry.trim()).filter(Boolean)) {
85
+ const parsed = JSON.parse(line);
86
+ if (!isPerTestRecord(parsed))
87
+ return null;
88
+ const existing = perTestData[parsed.testName] ?? [];
89
+ perTestData[parsed.testName] = existing.concat(parsed.events);
90
+ }
91
+ return perTestData;
92
+ }
73
93
  }
74
94
  catch {
75
95
  return null;
76
96
  }
77
97
  }
98
+ function isPerTestRecord(value) {
99
+ if (!value || typeof value !== "object")
100
+ return false;
101
+ const record = value;
102
+ return typeof record.testName === "string" && Array.isArray(record.events);
103
+ }
78
104
  function scanSourceFiles(sourceRoot) {
79
105
  const filesWithKeys = new Map();
80
106
  const fileContents = new Map();
@@ -92,7 +118,7 @@ function scanSourceFiles(sourceRoot) {
92
118
  continue;
93
119
  walkDir(full);
94
120
  }
95
- else if (entry.name.endsWith(".ts")) {
121
+ else if (entry.name.endsWith(".ts") && !entry.name.endsWith(".d.ts")) {
96
122
  const content = (0, fs_1.readFileSync)(full, "utf8");
97
123
  const relPath = full.slice(root.length - "src".length);
98
124
  fileContents.set(relPath, content);
@@ -35,7 +35,7 @@ function runAuditCli(argv) {
35
35
  return 2;
36
36
  }
37
37
  const eventsPath = args.eventsPath ?? (0, path_1.join)(runDir, "vitest-events.ndjson");
38
- const perTestPath = args.perTestPath ?? (0, path_1.join)(runDir, "vitest-events-per-test.json");
38
+ const perTestPath = args.perTestPath ?? (0, path_1.join)(runDir, "vitest-events-per-test.ndjson");
39
39
  const sourceRoot = args.sourceRoot ?? (0, path_1.resolve)("src");
40
40
  const outputPath = args.output ?? (0, path_1.join)(runDir, "nerves-coverage.json");
41
41
  const report = (0, audit_1.auditNervesCoverage)({
@@ -12,11 +12,11 @@ exports.REQUIRED_ENVELOPE_FIELDS = [
12
12
  "meta",
13
13
  ];
14
14
  exports.SENSITIVE_PATTERNS = [
15
- /\btoken\s*[:=]/i,
16
- /\bapi[_-]?key\b/i,
17
- /\bpassword\b/i,
18
- /\bsecret\b/i,
19
- /\bauthorization\b/i,
15
+ /\btoken\b["']?\s*[:=]/i,
16
+ /\bapi[_-]?key\b["']?\s*[:=]/i,
17
+ /\bpassword\b["']?\s*[:=]/i,
18
+ /\bsecret\b["']?\s*[:=]/i,
19
+ /\bauthorization\b["']?\s*[:=]/i,
20
20
  ];
21
21
  function eventKey(component, event) {
22
22
  return `${component}:${event}`;