@ouro.bot/cli 0.1.0-alpha.8 → 0.1.0-alpha.800

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 (624) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -176
  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/SerpentGuide.ouro/agent.json +83 -0
  11. package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
  13. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  14. package/assets/bluebubbles-host +264 -0
  15. package/assets/ouroboros.png +0 -0
  16. package/changelog.json +5563 -0
  17. package/deploy/unraid/Dockerfile +48 -0
  18. package/deploy/unraid/README.txt +3012 -0
  19. package/deploy/unraid/audit-container-spec.sh +4 -0
  20. package/deploy/unraid/container-runtime.json +1 -0
  21. package/deploy/unraid/docker-man-template-transaction.mjs +526 -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-deployment-target.mjs +709 -0
  33. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  34. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2030 -0
  35. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  36. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  37. package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
  38. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  39. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  40. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  41. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  42. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  43. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  44. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +11 -0
  45. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
  46. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +11 -0
  47. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  48. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +23 -0
  49. package/deploy/unraid/sanctuary.xml +27 -0
  50. package/dist/a2a/card.js +57 -0
  51. package/dist/a2a/client.js +180 -0
  52. package/dist/a2a/config.js +50 -0
  53. package/dist/a2a/delegation-stores.js +56 -0
  54. package/dist/a2a/did-resolution.js +93 -0
  55. package/dist/a2a/identity.js +170 -0
  56. package/dist/a2a/inbound-share.js +107 -0
  57. package/dist/a2a/mission-result-wire.js +196 -0
  58. package/dist/a2a/onboarding.js +115 -0
  59. package/dist/a2a/pin-store.js +132 -0
  60. package/dist/a2a/seen-ledger.js +120 -0
  61. package/dist/a2a/server.js +604 -0
  62. package/dist/a2a/task-store.js +69 -0
  63. package/dist/a2a/transport.js +45 -0
  64. package/dist/a2a/types.js +3 -0
  65. package/dist/arc/attention-types.js +8 -0
  66. package/dist/arc/cares.js +360 -0
  67. package/dist/arc/episodes.js +118 -0
  68. package/dist/arc/evolution.js +490 -0
  69. package/dist/arc/flight-recorder.js +1034 -0
  70. package/dist/arc/intentions.js +134 -0
  71. package/dist/arc/json-store.js +117 -0
  72. package/dist/arc/obligations.js +386 -0
  73. package/dist/arc/packets.js +336 -0
  74. package/dist/arc/presence.js +185 -0
  75. package/dist/arc/task-lifecycle.js +57 -0
  76. package/dist/commerce/store.js +755 -0
  77. package/dist/commerce/types.js +3 -0
  78. package/dist/heart/active-work.js +1009 -0
  79. package/dist/heart/agent-entry.js +252 -3
  80. package/dist/heart/approval-files.js +113 -0
  81. package/dist/heart/approval-store.js +950 -0
  82. package/dist/heart/attachments/image-normalize.js +194 -0
  83. package/dist/heart/attachments/materialize.js +97 -0
  84. package/dist/heart/attachments/originals.js +88 -0
  85. package/dist/heart/attachments/render.js +29 -0
  86. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  87. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  88. package/dist/heart/attachments/sources/index.js +18 -0
  89. package/dist/heart/attachments/sources/telegram.js +71 -0
  90. package/dist/heart/attachments/store.js +132 -0
  91. package/dist/heart/attachments/types.js +93 -0
  92. package/dist/heart/auth/auth-flow.js +495 -0
  93. package/dist/heart/autonomy-budget.js +478 -0
  94. package/dist/heart/awaiting/await-alert.js +148 -0
  95. package/dist/heart/awaiting/await-expiry.js +143 -0
  96. package/dist/heart/awaiting/await-loader.js +91 -0
  97. package/dist/heart/awaiting/await-parser.js +149 -0
  98. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  99. package/dist/heart/awaiting/await-scheduler.js +382 -0
  100. package/dist/heart/background-operations.js +281 -0
  101. package/dist/heart/bridges/manager.js +478 -0
  102. package/dist/heart/bridges/state-machine.js +135 -0
  103. package/dist/heart/bridges/store.js +135 -0
  104. package/dist/heart/bundle-state.js +168 -0
  105. package/dist/heart/commitments.js +135 -0
  106. package/dist/heart/config-registry.js +331 -0
  107. package/dist/heart/config.js +195 -137
  108. package/dist/heart/context-loss-gauntlet.js +387 -0
  109. package/dist/heart/context-loss-sentinel.js +1157 -0
  110. package/dist/heart/core.js +2257 -338
  111. package/dist/heart/cross-chat-delivery.js +133 -0
  112. package/dist/heart/daemon/agent-config-check.js +451 -0
  113. package/dist/heart/daemon/agent-discovery.js +263 -0
  114. package/dist/heart/daemon/agent-service.js +542 -0
  115. package/dist/heart/daemon/agentic-repair.js +547 -0
  116. package/dist/heart/daemon/await-private-wake.js +59 -0
  117. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  118. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  119. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  120. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  121. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  122. package/dist/heart/daemon/cadence.js +180 -0
  123. package/dist/heart/daemon/cli-defaults.js +836 -0
  124. package/dist/heart/daemon/cli-desk.js +322 -0
  125. package/dist/heart/daemon/cli-exec.js +8730 -0
  126. package/dist/heart/daemon/cli-help.js +710 -0
  127. package/dist/heart/daemon/cli-parse.js +2719 -0
  128. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  129. package/dist/heart/daemon/cli-render.js +777 -0
  130. package/dist/heart/daemon/cli-types.js +8 -0
  131. package/dist/heart/daemon/connect-bay.js +323 -0
  132. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  133. package/dist/heart/daemon/container-healthcheck.js +112 -0
  134. package/dist/heart/daemon/container-runtime.js +97 -0
  135. package/dist/heart/daemon/container-spec-auditor-main.js +170 -0
  136. package/dist/heart/daemon/container-spec-auditor.js +236 -0
  137. package/dist/heart/daemon/daemon-bootstrap-startup.js +107 -0
  138. package/dist/heart/daemon/daemon-cli.js +30 -786
  139. package/dist/heart/daemon/daemon-entry.js +971 -13
  140. package/dist/heart/daemon/daemon-health.js +186 -0
  141. package/dist/heart/daemon/daemon-rollup.js +57 -0
  142. package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
  143. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  144. package/dist/heart/daemon/daemon.js +2156 -28
  145. package/dist/heart/daemon/dns-workflow.js +394 -0
  146. package/dist/heart/daemon/doctor-types.js +8 -0
  147. package/dist/heart/daemon/doctor.js +1755 -0
  148. package/dist/heart/daemon/freshness.js +345 -0
  149. package/dist/heart/daemon/habit-private-wake.js +61 -0
  150. package/dist/heart/daemon/health-monitor.js +142 -11
  151. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  152. package/dist/heart/daemon/hooks/bundle-meta.js +226 -0
  153. package/dist/heart/daemon/http-health-probe.js +80 -0
  154. package/dist/heart/daemon/human-command-screens.js +234 -0
  155. package/dist/heart/daemon/human-readiness.js +114 -0
  156. package/dist/heart/daemon/inner-status.js +78 -0
  157. package/dist/heart/daemon/interactive-repair.js +394 -0
  158. package/dist/heart/daemon/launchd.js +188 -0
  159. package/dist/heart/daemon/log-tailer.js +82 -12
  160. package/dist/heart/daemon/logs-prune.js +132 -0
  161. package/dist/heart/daemon/mcp-canary.js +524 -0
  162. package/dist/heart/daemon/message-router.js +80 -11
  163. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  164. package/dist/heart/daemon/os-cron-deps.js +135 -0
  165. package/dist/heart/daemon/os-cron.js +22 -14
  166. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  167. package/dist/heart/daemon/ouro-entry.js +3 -1
  168. package/dist/heart/daemon/plugin-cli.js +432 -0
  169. package/dist/heart/daemon/process-manager.js +739 -54
  170. package/dist/heart/daemon/provider-discovery.js +137 -0
  171. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  172. package/dist/heart/daemon/prunable-bundle.js +144 -0
  173. package/dist/heart/daemon/pulse.js +511 -0
  174. package/dist/heart/daemon/readiness-repair.js +365 -0
  175. package/dist/heart/daemon/run-hooks.js +39 -0
  176. package/dist/heart/daemon/runtime-logging.js +92 -16
  177. package/dist/heart/daemon/runtime-metadata.js +191 -0
  178. package/dist/{repertoire/tasks/lifecycle.js → heart/daemon/runtime-mode.js} +37 -39
  179. package/dist/heart/daemon/safe-mode.js +161 -0
  180. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2609 -0
  181. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1866 -0
  182. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  183. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +976 -0
  184. package/dist/heart/daemon/sanctuary-bundle-migration.js +728 -0
  185. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  186. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  187. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  188. package/dist/heart/daemon/sense-manager.js +948 -0
  189. package/dist/heart/daemon/session-id-resolver.js +131 -0
  190. package/dist/heart/daemon/skill-management-installer.js +94 -0
  191. package/dist/heart/daemon/socket-client.js +370 -0
  192. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  193. package/dist/heart/daemon/startup-tui.js +339 -0
  194. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  195. package/dist/heart/daemon/task-scheduler.js +117 -39
  196. package/dist/heart/daemon/terminal-ui.js +499 -0
  197. package/dist/heart/daemon/thoughts.js +591 -0
  198. package/dist/heart/daemon/up-progress.js +366 -0
  199. package/dist/heart/daemon/vault-items.js +56 -0
  200. package/dist/heart/delegation.js +59 -0
  201. package/dist/heart/external-events/router.js +1414 -0
  202. package/dist/heart/habits/habit-cancel.js +810 -0
  203. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  204. package/dist/heart/habits/habit-migration.js +194 -0
  205. package/dist/heart/habits/habit-parser.js +278 -0
  206. package/dist/heart/habits/habit-runtime-state.js +93 -0
  207. package/dist/heart/habits/habit-scheduler.js +653 -0
  208. package/dist/heart/habits/habit-session-summary.js +318 -0
  209. package/dist/heart/habits/habit-session.js +636 -0
  210. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  211. package/dist/heart/{daemon → hatch}/hatch-flow.js +57 -139
  212. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  213. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  214. package/dist/heart/hatch/specialist-prompt.js +102 -0
  215. package/dist/heart/hatch/specialist-tools.js +318 -0
  216. package/dist/heart/identity.js +297 -67
  217. package/dist/heart/kept-notes.js +289 -0
  218. package/dist/heart/kicks.js +2 -20
  219. package/dist/heart/machine-identity.js +161 -0
  220. package/dist/heart/mail-import-discovery.js +353 -0
  221. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  222. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  223. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  224. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  225. package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
  226. package/dist/heart/mailbox/mailbox-http.js +99 -0
  227. package/dist/heart/mailbox/mailbox-read.js +39 -0
  228. package/dist/heart/mailbox/mailbox-types.js +27 -0
  229. package/dist/heart/mailbox/mailbox-view.js +197 -0
  230. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  231. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  232. package/dist/heart/mailbox/readers/mail.js +375 -0
  233. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  234. package/dist/heart/mailbox/readers/sessions.js +232 -0
  235. package/dist/heart/mailbox/readers/shared.js +111 -0
  236. package/dist/heart/mcp/mcp-server.js +696 -0
  237. package/dist/heart/migrate-config.js +100 -0
  238. package/dist/heart/model-capabilities.js +59 -0
  239. package/dist/heart/orientation-frame.js +345 -0
  240. package/dist/heart/platform.js +81 -0
  241. package/dist/heart/primitives.js +1 -1
  242. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  243. package/dist/heart/private-runtime/index.js +18 -0
  244. package/dist/heart/private-runtime/ledger.js +221 -0
  245. package/dist/heart/private-runtime/policy.js +252 -0
  246. package/dist/heart/private-runtime/types.js +2 -0
  247. package/dist/heart/progress-story.js +42 -0
  248. package/dist/heart/provider-attempt.js +137 -0
  249. package/dist/heart/provider-binding-resolver.js +273 -0
  250. package/dist/heart/provider-credentials.js +449 -0
  251. package/dist/heart/provider-failover.js +311 -0
  252. package/dist/heart/provider-models.js +96 -0
  253. package/dist/heart/provider-ping.js +265 -0
  254. package/dist/heart/provider-readiness-cache.js +119 -0
  255. package/dist/heart/provider-visibility.js +188 -0
  256. package/dist/heart/providers/anthropic-token.js +131 -0
  257. package/dist/heart/providers/anthropic.js +236 -58
  258. package/dist/heart/providers/azure.js +104 -13
  259. package/dist/heart/providers/error-classification.js +127 -0
  260. package/dist/heart/providers/github-copilot.js +145 -0
  261. package/dist/heart/providers/minimax-vlm.js +189 -0
  262. package/dist/heart/providers/minimax.js +29 -7
  263. package/dist/heart/providers/openai-codex-token.js +349 -0
  264. package/dist/heart/providers/openai-codex.js +63 -39
  265. package/dist/heart/providers/openai-compatible.js +177 -0
  266. package/dist/heart/run-ledger.js +247 -0
  267. package/dist/heart/runtime-capability-check.js +170 -0
  268. package/dist/heart/runtime-credentials.js +607 -0
  269. package/dist/heart/runtime-cwd.js +87 -0
  270. package/dist/heart/sense-truth.js +79 -0
  271. package/dist/heart/session-activity.js +235 -0
  272. package/dist/heart/session-events.js +1318 -0
  273. package/dist/heart/session-playback-cli-main.js +5 -0
  274. package/dist/heart/session-playback-cli.js +36 -0
  275. package/dist/heart/session-playback.js +231 -0
  276. package/dist/heart/session-stats-cli-main.js +5 -0
  277. package/dist/heart/session-stats.js +182 -0
  278. package/dist/heart/session-transcript.js +133 -0
  279. package/dist/heart/start-of-turn-packet.js +372 -0
  280. package/dist/heart/steward-policy.js +302 -0
  281. package/dist/heart/streaming.js +682 -207
  282. package/dist/heart/structured-output.js +196 -0
  283. package/dist/heart/sync-classification.js +176 -0
  284. package/dist/heart/sync.js +449 -0
  285. package/dist/heart/target-resolution.js +127 -0
  286. package/dist/heart/tempo.js +93 -0
  287. package/dist/heart/temporal-view.js +41 -0
  288. package/dist/heart/timeouts.js +101 -0
  289. package/dist/heart/tool-activity-callbacks.js +59 -0
  290. package/dist/heart/tool-approval.js +342 -0
  291. package/dist/heart/tool-description.js +155 -0
  292. package/dist/heart/tool-friction.js +55 -0
  293. package/dist/heart/tool-loop.js +200 -0
  294. package/dist/heart/turn-context.js +481 -0
  295. package/dist/heart/turn-coordinator.js +28 -0
  296. package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
  297. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  298. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  299. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  300. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  301. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  302. package/dist/heart/versioning/staged-restart.js +146 -0
  303. package/dist/heart/versioning/update-checker.js +116 -0
  304. package/dist/heart/versioning/update-hooks.js +154 -0
  305. package/dist/heart/versioning/version-intent.js +114 -0
  306. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  307. package/dist/heart/work-card.js +380 -0
  308. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  309. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  310. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  311. package/dist/mailbox-ui/index.html +16 -0
  312. package/dist/mailroom/attention.js +167 -0
  313. package/dist/mailroom/autonomy.js +209 -0
  314. package/dist/mailroom/blob-store.js +889 -0
  315. package/dist/mailroom/body-cache.js +61 -0
  316. package/dist/mailroom/cache-sync-cli.js +58 -0
  317. package/dist/mailroom/core.js +803 -0
  318. package/dist/mailroom/entry.js +160 -0
  319. package/dist/mailroom/file-store.js +568 -0
  320. package/dist/mailroom/hosted-cache-sync.js +384 -0
  321. package/dist/mailroom/mbox-import.js +393 -0
  322. package/dist/mailroom/migration.js +164 -0
  323. package/dist/mailroom/outbound.js +380 -0
  324. package/dist/mailroom/policy.js +263 -0
  325. package/dist/mailroom/reader.js +292 -0
  326. package/dist/mailroom/search-cache.js +513 -0
  327. package/dist/mailroom/search-relevance.js +319 -0
  328. package/dist/mailroom/smtp-ingress.js +176 -0
  329. package/dist/mailroom/source-state.js +176 -0
  330. package/dist/mailroom/thread.js +109 -0
  331. package/dist/mailroom/travel-extract.js +89 -0
  332. package/dist/mind/bundle-manifest.js +93 -1
  333. package/dist/mind/context.js +287 -104
  334. package/dist/mind/desk-section.js +362 -0
  335. package/dist/mind/diary-integrity.js +60 -0
  336. package/dist/mind/{memory.js → diary.js} +90 -98
  337. package/dist/mind/embedding-provider.js +60 -0
  338. package/dist/mind/file-state.js +179 -0
  339. package/dist/mind/first-impressions.js +16 -2
  340. package/dist/mind/{associative-recall.js → note-search.js} +61 -60
  341. package/dist/mind/obligation-steering.js +227 -0
  342. package/dist/mind/pending.js +102 -9
  343. package/dist/mind/phrases.js +1 -0
  344. package/dist/mind/prompt-budget.js +479 -0
  345. package/dist/mind/prompt-refresh.js +3 -2
  346. package/dist/mind/prompt.js +1377 -140
  347. package/dist/mind/provenance-trust.js +26 -0
  348. package/dist/mind/record-paths.js +312 -0
  349. package/dist/mind/scrutiny.js +173 -0
  350. package/dist/mind/session-transaction.js +415 -0
  351. package/dist/mind/token-estimate.js +8 -12
  352. package/dist/nerves/cli-logging.js +22 -3
  353. package/dist/nerves/coverage/audit-rules.js +15 -6
  354. package/dist/nerves/coverage/audit.js +28 -2
  355. package/dist/nerves/coverage/cli.js +1 -1
  356. package/dist/nerves/coverage/contract.js +5 -5
  357. package/dist/nerves/coverage/file-completeness.js +139 -5
  358. package/dist/nerves/coverage/run-artifacts.js +56 -36
  359. package/dist/nerves/coverage/source-scanner.js +4 -4
  360. package/dist/nerves/event-buffer.js +111 -0
  361. package/dist/nerves/index.js +305 -9
  362. package/dist/nerves/observation.js +20 -0
  363. package/dist/nerves/redact.js +79 -0
  364. package/dist/nerves/review/cli-main.js +5 -0
  365. package/dist/nerves/review/cli.js +156 -0
  366. package/dist/nerves/review/core.js +159 -0
  367. package/dist/nerves/runtime.js +17 -1
  368. package/dist/repertoire/ado-client.js +17 -56
  369. package/dist/repertoire/ado-semantic.js +16 -10
  370. package/dist/repertoire/api-client.js +97 -0
  371. package/dist/repertoire/bitwarden-store.js +1045 -0
  372. package/dist/repertoire/bundle-templates.js +71 -0
  373. package/dist/repertoire/bw-installer.js +180 -0
  374. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  375. package/dist/repertoire/coding/context-pack.js +331 -0
  376. package/dist/repertoire/coding/feedback.js +322 -0
  377. package/dist/repertoire/coding/index.js +18 -3
  378. package/dist/repertoire/coding/manager.js +228 -14
  379. package/dist/repertoire/coding/spawner.js +61 -14
  380. package/dist/repertoire/coding/tools.js +279 -12
  381. package/dist/repertoire/coding/workbench-client.js +272 -0
  382. package/dist/repertoire/coding/workbench-manager.js +346 -0
  383. package/dist/repertoire/commerce-errors.js +109 -0
  384. package/dist/repertoire/commerce-self-test.js +156 -0
  385. package/dist/repertoire/credential-access.js +178 -0
  386. package/dist/repertoire/data/ado-endpoints.json +188 -0
  387. package/dist/repertoire/desk/classifier.js +362 -0
  388. package/dist/repertoire/duffel-client.js +185 -0
  389. package/dist/repertoire/github-client.js +14 -55
  390. package/dist/repertoire/graph-client.js +11 -52
  391. package/dist/repertoire/guardrails.js +1083 -0
  392. package/dist/repertoire/mcp-client.js +295 -0
  393. package/dist/repertoire/mcp-manager.js +434 -0
  394. package/dist/repertoire/mcp-tools.js +83 -0
  395. package/dist/repertoire/plugin-mcp.js +175 -0
  396. package/dist/repertoire/plugins.js +253 -0
  397. package/dist/repertoire/relationship-authorization.js +194 -0
  398. package/dist/repertoire/shell-sessions.js +133 -0
  399. package/dist/repertoire/skills.js +45 -24
  400. package/dist/repertoire/stripe-client.js +131 -0
  401. package/dist/repertoire/tool-arguments.js +148 -0
  402. package/dist/repertoire/tool-results.js +29 -0
  403. package/dist/repertoire/tools-a2a.js +699 -0
  404. package/dist/repertoire/tools-attachments.js +322 -0
  405. package/dist/repertoire/tools-awaiting.js +575 -0
  406. package/dist/repertoire/tools-base.js +85 -707
  407. package/dist/repertoire/tools-bluebubbles.js +95 -0
  408. package/dist/repertoire/tools-bridge.js +144 -0
  409. package/dist/repertoire/tools-bundle.js +993 -0
  410. package/dist/repertoire/tools-commerce.js +253 -0
  411. package/dist/repertoire/tools-config.js +186 -0
  412. package/dist/repertoire/tools-continuity.js +575 -0
  413. package/dist/repertoire/tools-credential.js +383 -0
  414. package/dist/repertoire/tools-evolution.js +527 -0
  415. package/dist/repertoire/tools-files.js +344 -0
  416. package/dist/repertoire/tools-flight.js +290 -0
  417. package/dist/repertoire/tools-flow.js +119 -0
  418. package/dist/repertoire/tools-github.js +3 -8
  419. package/dist/repertoire/tools-habits.js +103 -0
  420. package/dist/repertoire/tools-mail.js +1828 -0
  421. package/dist/repertoire/tools-notes.js +485 -0
  422. package/dist/repertoire/tools-obligations.js +182 -0
  423. package/dist/repertoire/tools-orientation.js +31 -0
  424. package/dist/repertoire/tools-record.js +482 -0
  425. package/dist/repertoire/tools-rsvp.js +139 -0
  426. package/dist/repertoire/tools-runtime.js +150 -0
  427. package/dist/repertoire/tools-session.js +1108 -0
  428. package/dist/repertoire/tools-shell.js +133 -0
  429. package/dist/repertoire/tools-steward-policy.js +95 -0
  430. package/dist/repertoire/tools-stripe.js +224 -0
  431. package/dist/repertoire/tools-surface.js +369 -0
  432. package/dist/repertoire/tools-teams.js +67 -61
  433. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  434. package/dist/repertoire/tools-travel.js +125 -0
  435. package/dist/repertoire/tools-trip.js +982 -0
  436. package/dist/repertoire/tools-unraid.js +484 -0
  437. package/dist/repertoire/tools-user-profile.js +146 -0
  438. package/dist/repertoire/tools-vault.js +40 -0
  439. package/dist/repertoire/tools-voice.js +145 -0
  440. package/dist/repertoire/tools.js +441 -102
  441. package/dist/repertoire/travel-api-client.js +360 -0
  442. package/dist/repertoire/unraid-client.js +155 -0
  443. package/dist/repertoire/unraid-restart.js +212 -0
  444. package/dist/repertoire/user-profile.js +131 -0
  445. package/dist/repertoire/vault-setup.js +246 -0
  446. package/dist/repertoire/vault-unlock.js +628 -0
  447. package/dist/rsvp/aisleplanner-client.js +354 -0
  448. package/dist/rsvp/cli.js +926 -0
  449. package/dist/rsvp/config.js +327 -0
  450. package/dist/rsvp/cutover.js +433 -0
  451. package/dist/rsvp/diagnostics.js +232 -0
  452. package/dist/rsvp/diff-renderer.js +176 -0
  453. package/dist/rsvp/habit-policy.js +110 -0
  454. package/dist/rsvp/habit-stage.js +123 -0
  455. package/dist/rsvp/incident-bundle.js +97 -0
  456. package/dist/rsvp/migration.js +204 -0
  457. package/dist/rsvp/native-habit-runner.js +630 -0
  458. package/dist/rsvp/outbound-state.js +628 -0
  459. package/dist/rsvp/query.js +118 -0
  460. package/dist/rsvp/replay.js +233 -0
  461. package/dist/rsvp/snapshot.js +232 -0
  462. package/dist/rsvp/spend-ledger.js +175 -0
  463. package/dist/scripts/claude-code-hook.js +41 -0
  464. package/dist/scripts/claude-code-stop-hook.js +47 -0
  465. package/dist/senses/a2a-entry.js +115 -0
  466. package/dist/senses/attention-queue.js +186 -0
  467. package/dist/senses/await-turn-message.js +58 -0
  468. package/dist/senses/bluebubbles/active-turns.js +216 -0
  469. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  470. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  471. package/dist/senses/bluebubbles/client.js +799 -0
  472. package/dist/senses/bluebubbles/context-packet.js +207 -0
  473. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  474. package/dist/senses/bluebubbles/entry.js +90 -0
  475. package/dist/senses/bluebubbles/inbound-log.js +127 -0
  476. package/dist/senses/bluebubbles/index.js +3839 -0
  477. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  478. package/dist/senses/bluebubbles/media.js +389 -0
  479. package/dist/senses/bluebubbles/model.js +392 -0
  480. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +57 -6
  481. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  482. package/dist/senses/bluebubbles/processed-log.js +133 -0
  483. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  484. package/dist/senses/bluebubbles/replay.js +284 -0
  485. package/dist/senses/bluebubbles/runtime-state.js +137 -0
  486. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  487. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  488. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  489. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  490. package/dist/senses/cli/bracketed-paste.js +82 -0
  491. package/dist/senses/cli/image-paste.js +287 -0
  492. package/dist/senses/cli/image-ref-navigation.js +75 -0
  493. package/dist/senses/cli/ink-app.js +156 -0
  494. package/dist/senses/cli/inline-diff.js +64 -0
  495. package/dist/senses/cli/input-keys.js +174 -0
  496. package/dist/senses/cli/kill-ring.js +86 -0
  497. package/dist/senses/cli/message-list.js +51 -0
  498. package/dist/senses/cli/ouro-tui.js +607 -0
  499. package/dist/senses/cli/spinner-imperative.js +135 -0
  500. package/dist/senses/cli/spinner.js +101 -0
  501. package/dist/senses/cli/status-line.js +60 -0
  502. package/dist/senses/cli/streaming-markdown.js +526 -0
  503. package/dist/senses/cli/tool-display.js +85 -0
  504. package/dist/senses/cli/tool-render.js +85 -0
  505. package/dist/senses/cli/tui-store.js +241 -0
  506. package/dist/senses/cli/virtual-list.js +35 -0
  507. package/dist/senses/cli-entry.js +60 -8
  508. package/dist/senses/cli-layout.js +187 -0
  509. package/dist/senses/cli.js +813 -281
  510. package/dist/senses/commands.js +66 -3
  511. package/dist/senses/context-packet-ledger.js +371 -0
  512. package/dist/senses/context-packets.js +154 -0
  513. package/dist/senses/continuity.js +94 -0
  514. package/dist/senses/habit-lifecycle-guard.js +24 -0
  515. package/dist/senses/habit-turn-message.js +160 -0
  516. package/dist/senses/ingress-evidence.js +2 -0
  517. package/dist/senses/mail-entry.js +66 -0
  518. package/dist/senses/mail.js +524 -0
  519. package/dist/senses/pipeline.js +1213 -0
  520. package/dist/senses/private-runtime-worker.js +859 -0
  521. package/dist/senses/private-runtime.js +1496 -0
  522. package/dist/senses/proactive-content-guard.js +51 -0
  523. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  524. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  525. package/dist/senses/sanctuary-grounding.js +118 -0
  526. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  527. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  528. package/dist/senses/sanctuary-health-runner.js +101 -0
  529. package/dist/senses/sanctuary-health.js +408 -0
  530. package/dist/senses/sanctuary-interactive-control.js +306 -0
  531. package/dist/senses/sanctuary-media-catalog-contract.js +235 -0
  532. package/dist/senses/sanctuary-media-optimization.js +514 -0
  533. package/dist/senses/sanctuary-runtime.js +338 -0
  534. package/dist/senses/sanctuary-sab.js +85 -0
  535. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  536. package/dist/senses/shared-turn.js +571 -0
  537. package/dist/senses/surface-tool.js +109 -0
  538. package/dist/senses/teams-entry.js +60 -8
  539. package/dist/senses/teams.js +953 -211
  540. package/dist/senses/telegram-admission.js +711 -0
  541. package/dist/senses/telegram-approval-runtime.js +566 -0
  542. package/dist/senses/telegram-attachments.js +182 -0
  543. package/dist/senses/telegram-audit-ledger.js +220 -0
  544. package/dist/senses/telegram-client.js +1677 -0
  545. package/dist/senses/telegram-effect-adapter.js +859 -0
  546. package/dist/senses/telegram-entry.js +83 -0
  547. package/dist/senses/telegram.js +2026 -0
  548. package/dist/senses/trust-gate.js +207 -2
  549. package/dist/senses/voice/audio-playback.js +237 -0
  550. package/dist/senses/voice/audio-routing.js +119 -0
  551. package/dist/senses/voice/elevenlabs.js +202 -0
  552. package/dist/senses/voice/floor-control.js +431 -0
  553. package/dist/senses/voice/floor-controller.js +115 -0
  554. package/dist/senses/voice/golden-path.js +116 -0
  555. package/dist/senses/voice/index.js +29 -0
  556. package/dist/senses/voice/meeting.js +113 -0
  557. package/dist/senses/voice/outbound.js +190 -0
  558. package/dist/senses/voice/phone.js +33 -0
  559. package/dist/senses/voice/playback.js +139 -0
  560. package/dist/senses/voice/realtime-eval.js +496 -0
  561. package/dist/senses/voice/realtime-trace.js +531 -0
  562. package/dist/senses/voice/transcript.js +70 -0
  563. package/dist/senses/voice/turn.js +191 -0
  564. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  565. package/dist/senses/voice/twilio-phone.js +5081 -0
  566. package/dist/senses/voice/types.js +2 -0
  567. package/dist/senses/voice/whisper.js +161 -0
  568. package/dist/senses/voice-entry.js +81 -0
  569. package/dist/senses/voice-realtime-eval-command.js +99 -0
  570. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  571. package/dist/senses/voice-twilio-entry.js +87 -0
  572. package/dist/trips/core.js +138 -0
  573. package/dist/trips/store.js +265 -0
  574. package/dist/util/frontmatter.js +69 -0
  575. package/npm-shrinkwrap.json +8144 -0
  576. package/package.json +82 -12
  577. package/skills/agent-commerce.md +113 -0
  578. package/skills/browser-navigation.md +117 -0
  579. package/skills/commerce-setup-guide.md +116 -0
  580. package/skills/commerce-setup.md +84 -0
  581. package/skills/configure-dev-tools.md +99 -0
  582. package/skills/travel-planning.md +138 -0
  583. package/AdoptionSpecialist.ouro/agent.json +0 -20
  584. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  585. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  586. package/dist/heart/daemon/specialist-prompt.js +0 -47
  587. package/dist/heart/daemon/specialist-session.js +0 -142
  588. package/dist/heart/daemon/specialist-tools.js +0 -132
  589. package/dist/heart/daemon/subagent-installer.js +0 -125
  590. package/dist/inner-worker-entry.js +0 -4
  591. package/dist/mind/friends/channel.js +0 -49
  592. package/dist/mind/friends/resolver.js +0 -84
  593. package/dist/mind/friends/store-file.js +0 -171
  594. package/dist/mind/friends/store.js +0 -4
  595. package/dist/mind/friends/tokens.js +0 -26
  596. package/dist/mind/friends/types.js +0 -21
  597. package/dist/repertoire/tasks/board.js +0 -122
  598. package/dist/repertoire/tasks/index.js +0 -210
  599. package/dist/repertoire/tasks/middleware.js +0 -65
  600. package/dist/repertoire/tasks/parser.js +0 -173
  601. package/dist/repertoire/tasks/scanner.js +0 -132
  602. package/dist/repertoire/tasks/transitions.js +0 -145
  603. package/dist/senses/bluebubbles-client.js +0 -279
  604. package/dist/senses/bluebubbles-entry.js +0 -11
  605. package/dist/senses/bluebubbles-model.js +0 -253
  606. package/dist/senses/bluebubbles.js +0 -332
  607. package/dist/senses/inner-dialog-worker.js +0 -61
  608. package/dist/senses/inner-dialog.js +0 -231
  609. package/subagents/README.md +0 -73
  610. package/subagents/work-doer.md +0 -233
  611. package/subagents/work-merger.md +0 -624
  612. package/subagents/work-planner.md +0 -373
  613. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  614. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  615. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  616. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  617. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  618. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  619. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  620. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  621. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  622. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  623. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  624. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.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
+ }
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.__internal = void 0;
4
3
  exports.estimateTokensForMessage = estimateTokensForMessage;
5
4
  exports.estimateTokensForMessages = estimateTokensForMessages;
6
5
  const runtime_1 = require("../nerves/runtime");
@@ -53,7 +52,7 @@ function countCharsInContent(content) {
53
52
  return c.text.length;
54
53
  if (typeof c.content === "string")
55
54
  return c.content.length;
56
- return safeStringify(content).length;
55
+ return safeStringify(c).length;
57
56
  }
58
57
  return 0;
59
58
  }
@@ -70,12 +69,13 @@ function countCharsInToolCalls(toolCalls) {
70
69
  if (typeof t.type === "string")
71
70
  total += t.type.length;
72
71
  if (t.function && typeof t.function === "object") {
73
- if (typeof t.function.name === "string")
74
- total += t.function.name.length;
75
- if (typeof t.function.arguments === "string")
76
- total += t.function.arguments.length;
77
- else if (t.function.arguments != null)
78
- total += safeStringify(t.function.arguments).length;
72
+ const fn = t.function;
73
+ if (typeof fn.name === "string")
74
+ total += fn.name.length;
75
+ if (typeof fn.arguments === "string")
76
+ total += fn.arguments.length;
77
+ else if (fn.arguments != null)
78
+ total += safeStringify(fn.arguments).length;
79
79
  }
80
80
  }
81
81
  return total;
@@ -113,7 +113,3 @@ function estimateTokensForMessages(msgs) {
113
113
  total += estimateTokensForMessage(msg);
114
114
  return total;
115
115
  }
116
- exports.__internal = {
117
- CHARS_PER_TOKEN,
118
- PER_MESSAGE_OVERHEAD_TOKENS,
119
- };
@@ -5,20 +5,39 @@ const config_1 = require("../heart/config");
5
5
  const nerves_1 = require("../nerves");
6
6
  const runtime_1 = require("./runtime");
7
7
  const runtime_2 = require("./runtime");
8
+ const LEVEL_PRIORITY = { debug: 10, info: 20, warn: 30, error: 40 };
9
+ /** Wrap a sink so it only receives events at or above the given level. */
10
+ /* v8 ignore start -- internal filter plumbing, exercised via integration @preserve */
11
+ function filterSink(sink, minLevel) {
12
+ const minPriority = LEVEL_PRIORITY[minLevel] ?? 0;
13
+ return (entry) => {
14
+ if ((LEVEL_PRIORITY[entry.level] ?? 0) >= minPriority)
15
+ sink(entry);
16
+ };
17
+ }
8
18
  function resolveCliSinks(sinks) {
9
19
  const requested = sinks && sinks.length > 0 ? sinks : ["terminal", "ndjson"];
10
20
  return [...new Set(requested)];
11
21
  }
12
22
  function configureCliRuntimeLogger(_friendId, options = {}) {
13
23
  const sinkKinds = resolveCliSinks(options.sinks);
24
+ const level = options.level ?? "info";
14
25
  const sinks = sinkKinds.map((sinkKind) => {
15
26
  if (sinkKind === "terminal") {
16
- return (0, nerves_1.createTerminalSink)();
27
+ // Terminal only shows warnings and errors — INFO is too noisy
28
+ // for an interactive session. Full detail goes to the ndjson file.
29
+ return filterSink((0, nerves_1.createTerminalSink)(), "warn");
17
30
  }
18
- 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
+ });
19
38
  });
20
39
  const logger = (0, nerves_1.createLogger)({
21
- level: options.level ?? "info",
40
+ level,
22
41
  sinks,
23
42
  });
24
43
  (0, runtime_2.setRuntimeLogger)(logger);
@@ -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}`;