@ouro.bot/cli 0.1.0-alpha.83 → 0.1.0-alpha.831

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (647) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/assets/sanctuary-host-launcher.sh +16 -0
  15. package/changelog.json +5308 -16
  16. package/deploy/unraid/Dockerfile +54 -0
  17. package/deploy/unraid/README.txt +2983 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  21. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  22. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  23. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  24. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  25. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  26. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  27. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  28. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  29. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  30. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  31. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  32. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  33. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  34. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  35. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2084 -0
  36. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  37. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  38. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  39. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  40. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  41. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  42. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +795 -0
  43. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  44. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  45. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  46. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +15 -0
  47. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +15 -0
  49. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  50. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +135 -0
  51. package/deploy/unraid/sanctuary.xml +28 -0
  52. package/dist/a2a/card.js +57 -0
  53. package/dist/a2a/client.js +180 -0
  54. package/dist/a2a/config.js +50 -0
  55. package/dist/a2a/delegation-stores.js +56 -0
  56. package/dist/a2a/did-resolution.js +93 -0
  57. package/dist/a2a/identity.js +170 -0
  58. package/dist/a2a/inbound-share.js +107 -0
  59. package/dist/a2a/mission-result-wire.js +196 -0
  60. package/dist/a2a/onboarding.js +115 -0
  61. package/dist/a2a/pin-store.js +132 -0
  62. package/dist/a2a/seen-ledger.js +120 -0
  63. package/dist/a2a/server.js +604 -0
  64. package/dist/a2a/task-store.js +69 -0
  65. package/dist/a2a/transport.js +45 -0
  66. package/dist/a2a/types.js +3 -0
  67. package/dist/arc/attention-types.js +8 -0
  68. package/dist/arc/cares.js +360 -0
  69. package/dist/arc/episodes.js +118 -0
  70. package/dist/arc/evolution.js +490 -0
  71. package/dist/arc/flight-recorder.js +1034 -0
  72. package/dist/arc/intentions.js +134 -0
  73. package/dist/arc/json-store.js +117 -0
  74. package/dist/arc/obligations.js +386 -0
  75. package/dist/arc/packets.js +336 -0
  76. package/dist/arc/presence.js +185 -0
  77. package/dist/arc/task-lifecycle.js +57 -0
  78. package/dist/commerce/store.js +755 -0
  79. package/dist/commerce/types.js +3 -0
  80. package/dist/heart/active-work.js +798 -40
  81. package/dist/heart/agent-entry.js +252 -3
  82. package/dist/heart/approval-files.js +113 -0
  83. package/dist/heart/approval-store.js +960 -0
  84. package/dist/heart/attachments/image-normalize.js +194 -0
  85. package/dist/heart/attachments/materialize.js +97 -0
  86. package/dist/heart/attachments/originals.js +88 -0
  87. package/dist/heart/attachments/render.js +29 -0
  88. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  89. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  90. package/dist/heart/attachments/sources/index.js +18 -0
  91. package/dist/heart/attachments/sources/telegram.js +71 -0
  92. package/dist/heart/attachments/store.js +132 -0
  93. package/dist/heart/attachments/types.js +93 -0
  94. package/dist/heart/auth/auth-flow.js +495 -0
  95. package/dist/heart/autonomy-budget.js +478 -0
  96. package/dist/heart/awaiting/await-alert.js +148 -0
  97. package/dist/heart/awaiting/await-expiry.js +143 -0
  98. package/dist/heart/awaiting/await-loader.js +91 -0
  99. package/dist/heart/awaiting/await-parser.js +149 -0
  100. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  101. package/dist/heart/awaiting/await-scheduler.js +382 -0
  102. package/dist/heart/background-operations.js +281 -0
  103. package/dist/heart/bridges/manager.js +137 -17
  104. package/dist/heart/bridges/store.js +14 -2
  105. package/dist/heart/bundle-state.js +168 -0
  106. package/dist/heart/commitments.js +44 -18
  107. package/dist/heart/config-registry.js +331 -0
  108. package/dist/heart/config.js +174 -131
  109. package/dist/heart/context-loss-gauntlet.js +387 -0
  110. package/dist/heart/context-loss-sentinel.js +1157 -0
  111. package/dist/heart/core.js +2169 -581
  112. package/dist/heart/cross-chat-delivery.js +9 -22
  113. package/dist/heart/daemon/agent-config-check.js +451 -0
  114. package/dist/heart/daemon/agent-discovery.js +185 -3
  115. package/dist/heart/daemon/agent-service.js +542 -0
  116. package/dist/heart/daemon/agentic-repair.js +547 -0
  117. package/dist/heart/daemon/await-private-wake.js +59 -0
  118. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  119. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  120. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  121. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  122. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  123. package/dist/heart/daemon/cadence.js +180 -0
  124. package/dist/heart/daemon/cli-defaults.js +854 -0
  125. package/dist/heart/daemon/cli-desk.js +322 -0
  126. package/dist/heart/daemon/cli-exec.js +8822 -0
  127. package/dist/heart/daemon/cli-help.js +716 -0
  128. package/dist/heart/daemon/cli-parse.js +2771 -0
  129. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  130. package/dist/heart/daemon/cli-render.js +777 -0
  131. package/dist/heart/daemon/cli-types.js +8 -0
  132. package/dist/heart/daemon/connect-bay.js +323 -0
  133. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  134. package/dist/heart/daemon/container-healthcheck.js +112 -0
  135. package/dist/heart/daemon/container-runtime.js +97 -0
  136. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  137. package/dist/heart/daemon/container-spec-auditor.js +229 -0
  138. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  139. package/dist/heart/daemon/daemon-cli.js +29 -2349
  140. package/dist/heart/daemon/daemon-entry.js +930 -11
  141. package/dist/heart/daemon/daemon-health.js +186 -0
  142. package/dist/heart/daemon/daemon-rollup.js +57 -0
  143. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  144. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  145. package/dist/heart/daemon/daemon.js +2084 -105
  146. package/dist/heart/daemon/dns-workflow.js +394 -0
  147. package/dist/heart/daemon/doctor-types.js +8 -0
  148. package/dist/heart/daemon/doctor.js +1755 -0
  149. package/dist/heart/daemon/freshness.js +345 -0
  150. package/dist/heart/daemon/habit-private-wake.js +61 -0
  151. package/dist/heart/daemon/health-monitor.js +142 -11
  152. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  153. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  154. package/dist/heart/daemon/http-health-probe.js +80 -0
  155. package/dist/heart/daemon/human-command-screens.js +234 -0
  156. package/dist/heart/daemon/human-readiness.js +114 -0
  157. package/dist/heart/daemon/inner-status.js +78 -0
  158. package/dist/heart/daemon/interactive-repair.js +394 -0
  159. package/dist/heart/daemon/launchd.js +37 -8
  160. package/dist/heart/daemon/log-tailer.js +79 -10
  161. package/dist/heart/daemon/logs-prune.js +132 -0
  162. package/dist/heart/daemon/mcp-canary.js +524 -0
  163. package/dist/heart/daemon/message-router.js +65 -5
  164. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  165. package/dist/heart/daemon/os-cron-deps.js +135 -0
  166. package/dist/heart/daemon/os-cron.js +22 -14
  167. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  168. package/dist/heart/daemon/ouro-entry.js +3 -1
  169. package/dist/heart/daemon/plugin-cli.js +432 -0
  170. package/dist/heart/daemon/process-manager.js +733 -61
  171. package/dist/heart/daemon/provider-discovery.js +137 -0
  172. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  173. package/dist/heart/daemon/prunable-bundle.js +144 -0
  174. package/dist/heart/daemon/pulse.js +511 -0
  175. package/dist/heart/daemon/readiness-repair.js +365 -0
  176. package/dist/heart/daemon/run-hooks.js +2 -0
  177. package/dist/heart/daemon/runtime-logging.js +47 -14
  178. package/dist/heart/daemon/runtime-metadata.js +2 -30
  179. package/dist/heart/daemon/runtime-mode.js +13 -2
  180. package/dist/heart/daemon/safe-mode.js +161 -0
  181. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  182. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  183. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  184. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  185. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  186. package/dist/heart/daemon/sanctuary-authority-epoch.js +256 -0
  187. package/dist/heart/daemon/sanctuary-authority-installation.js +140 -0
  188. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  189. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +819 -0
  190. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  191. package/dist/heart/daemon/sanctuary-bundle-migration.js +729 -0
  192. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  193. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +494 -0
  194. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  195. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  196. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  197. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  198. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  199. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  200. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  201. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +445 -0
  202. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  203. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +630 -0
  204. package/dist/heart/daemon/sense-manager.js +699 -48
  205. package/dist/heart/daemon/session-id-resolver.js +131 -0
  206. package/dist/heart/daemon/skill-management-installer.js +1 -1
  207. package/dist/heart/daemon/socket-client.js +180 -12
  208. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  209. package/dist/heart/daemon/startup-tui.js +339 -0
  210. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  211. package/dist/heart/daemon/task-scheduler.js +117 -39
  212. package/dist/heart/daemon/terminal-ui.js +499 -0
  213. package/dist/heart/daemon/thoughts.js +138 -54
  214. package/dist/heart/daemon/up-progress.js +366 -0
  215. package/dist/heart/daemon/vault-items.js +56 -0
  216. package/dist/heart/delegation.js +1 -4
  217. package/dist/heart/external-events/router.js +1430 -0
  218. package/dist/heart/frontend-approval-runtime.js +506 -0
  219. package/dist/heart/frontend-journal.js +215 -0
  220. package/dist/heart/frontend-session-service.js +237 -0
  221. package/dist/heart/frontend-socket-client.js +164 -0
  222. package/dist/heart/frontend-socket.js +400 -0
  223. package/dist/heart/habits/habit-cancel.js +810 -0
  224. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  225. package/dist/heart/habits/habit-migration.js +194 -0
  226. package/dist/heart/habits/habit-parser.js +278 -0
  227. package/dist/heart/habits/habit-runtime-state.js +93 -0
  228. package/dist/heart/habits/habit-scheduler.js +653 -0
  229. package/dist/heart/habits/habit-session-summary.js +318 -0
  230. package/dist/heart/habits/habit-session.js +636 -0
  231. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  232. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  233. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  234. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  235. package/dist/heart/identity.js +196 -59
  236. package/dist/heart/kept-notes.js +289 -0
  237. package/dist/heart/kicks.js +1 -1
  238. package/dist/heart/machine-identity.js +161 -0
  239. package/dist/heart/mail-import-discovery.js +356 -0
  240. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  241. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  242. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  243. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  244. package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
  245. package/dist/heart/mailbox/mailbox-http.js +99 -0
  246. package/dist/heart/mailbox/mailbox-read.js +39 -0
  247. package/dist/heart/mailbox/mailbox-types.js +27 -0
  248. package/dist/heart/mailbox/mailbox-view.js +197 -0
  249. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  250. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  251. package/dist/heart/mailbox/readers/mail.js +375 -0
  252. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  253. package/dist/heart/mailbox/readers/sessions.js +231 -0
  254. package/dist/heart/mailbox/readers/shared.js +111 -0
  255. package/dist/heart/mcp/mcp-server.js +696 -0
  256. package/dist/heart/migrate-config.js +100 -0
  257. package/dist/heart/model-capabilities.js +11 -0
  258. package/dist/heart/orientation-frame.js +345 -0
  259. package/dist/heart/platform.js +81 -0
  260. package/dist/heart/primitives.js +1 -1
  261. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  262. package/dist/heart/private-runtime/index.js +18 -0
  263. package/dist/heart/private-runtime/ledger.js +221 -0
  264. package/dist/heart/private-runtime/policy.js +252 -0
  265. package/dist/heart/private-runtime/types.js +2 -0
  266. package/dist/heart/progress-story.js +1 -1
  267. package/dist/heart/provider-attempt.js +137 -0
  268. package/dist/heart/provider-binding-resolver.js +273 -0
  269. package/dist/heart/provider-credentials.js +449 -0
  270. package/dist/heart/provider-failover.js +311 -0
  271. package/dist/heart/provider-models.js +96 -0
  272. package/dist/heart/provider-ping.js +265 -0
  273. package/dist/heart/provider-readiness-cache.js +119 -0
  274. package/dist/heart/provider-visibility.js +188 -0
  275. package/dist/heart/providers/anthropic-token.js +131 -0
  276. package/dist/heart/providers/anthropic.js +173 -60
  277. package/dist/heart/providers/azure.js +23 -11
  278. package/dist/heart/providers/error-classification.js +127 -0
  279. package/dist/heart/providers/github-copilot.js +34 -38
  280. package/dist/heart/providers/minimax-vlm.js +189 -0
  281. package/dist/heart/providers/minimax.js +26 -8
  282. package/dist/heart/providers/openai-codex-token.js +349 -0
  283. package/dist/heart/providers/openai-codex.js +55 -40
  284. package/dist/heart/providers/openai-compatible.js +177 -0
  285. package/dist/heart/run-ledger.js +247 -0
  286. package/dist/heart/runtime-capability-check.js +170 -0
  287. package/dist/heart/runtime-credentials.js +607 -0
  288. package/dist/heart/runtime-cwd.js +87 -0
  289. package/dist/heart/sense-truth.js +22 -4
  290. package/dist/heart/session-activity.js +92 -24
  291. package/dist/heart/session-events.js +1504 -0
  292. package/dist/heart/session-playback-cli-main.js +5 -0
  293. package/dist/heart/session-playback-cli.js +36 -0
  294. package/dist/heart/session-playback.js +231 -0
  295. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  296. package/dist/heart/session-redaction-repair.js +552 -0
  297. package/dist/heart/session-stats-cli-main.js +5 -0
  298. package/dist/heart/session-stats.js +183 -0
  299. package/dist/heart/session-transcript.js +133 -0
  300. package/dist/heart/start-of-turn-packet.js +372 -0
  301. package/dist/heart/steward-policy.js +618 -0
  302. package/dist/heart/streaming.js +604 -207
  303. package/dist/heart/structured-output.js +196 -0
  304. package/dist/heart/sync-classification.js +176 -0
  305. package/dist/heart/sync.js +449 -0
  306. package/dist/heart/target-resolution.js +11 -7
  307. package/dist/heart/tempo.js +93 -0
  308. package/dist/heart/temporal-view.js +41 -0
  309. package/dist/heart/timeouts.js +101 -0
  310. package/dist/heart/tool-activity-callbacks.js +59 -0
  311. package/dist/heart/tool-approval.js +382 -0
  312. package/dist/heart/tool-description.js +155 -0
  313. package/dist/heart/tool-friction.js +55 -0
  314. package/dist/heart/tool-loop.js +200 -0
  315. package/dist/heart/turn-context.js +482 -0
  316. package/dist/heart/turn-execution-lease.js +30 -0
  317. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  318. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  319. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  320. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  321. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  322. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  323. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  324. package/dist/heart/versioning/update-hooks.js +154 -0
  325. package/dist/heart/versioning/version-intent.js +114 -0
  326. package/dist/heart/work-card.js +380 -0
  327. package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
  328. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  329. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  330. package/dist/mailbox-ui/index.html +16 -0
  331. package/dist/mailroom/attention.js +167 -0
  332. package/dist/mailroom/autonomy.js +209 -0
  333. package/dist/mailroom/blob-store.js +889 -0
  334. package/dist/mailroom/body-cache.js +61 -0
  335. package/dist/mailroom/cache-sync-cli.js +58 -0
  336. package/dist/mailroom/core.js +803 -0
  337. package/dist/mailroom/entry.js +160 -0
  338. package/dist/mailroom/file-store.js +568 -0
  339. package/dist/mailroom/hosted-cache-sync.js +384 -0
  340. package/dist/mailroom/mbox-import.js +393 -0
  341. package/dist/mailroom/migration.js +164 -0
  342. package/dist/mailroom/outbound.js +380 -0
  343. package/dist/mailroom/policy.js +263 -0
  344. package/dist/mailroom/reader.js +292 -0
  345. package/dist/mailroom/search-cache.js +513 -0
  346. package/dist/mailroom/search-relevance.js +319 -0
  347. package/dist/mailroom/smtp-ingress.js +176 -0
  348. package/dist/mailroom/source-state.js +176 -0
  349. package/dist/mailroom/thread.js +109 -0
  350. package/dist/mailroom/travel-extract.js +89 -0
  351. package/dist/mind/bundle-manifest.js +24 -2
  352. package/dist/mind/context.js +309 -111
  353. package/dist/mind/desk-section.js +362 -0
  354. package/dist/mind/diary-integrity.js +60 -0
  355. package/dist/mind/{memory.js → diary.js} +68 -77
  356. package/dist/mind/embedding-provider.js +60 -0
  357. package/dist/mind/file-state.js +179 -0
  358. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  359. package/dist/mind/obligation-steering.js +199 -3
  360. package/dist/mind/pending.js +36 -10
  361. package/dist/mind/prompt-budget.js +479 -0
  362. package/dist/mind/prompt-refresh.js +3 -2
  363. package/dist/mind/prompt.js +1050 -189
  364. package/dist/mind/provenance-trust.js +26 -0
  365. package/dist/mind/record-paths.js +312 -0
  366. package/dist/mind/scrutiny.js +173 -0
  367. package/dist/mind/session-transaction.js +564 -0
  368. package/dist/nerves/cli-logging.js +7 -1
  369. package/dist/nerves/coverage/audit-rules.js +15 -6
  370. package/dist/nerves/coverage/audit.js +28 -2
  371. package/dist/nerves/coverage/cli.js +1 -1
  372. package/dist/nerves/coverage/contract.js +5 -5
  373. package/dist/nerves/coverage/file-completeness.js +139 -5
  374. package/dist/nerves/coverage/run-artifacts.js +55 -35
  375. package/dist/nerves/coverage/source-scanner.js +4 -4
  376. package/dist/nerves/event-buffer.js +111 -0
  377. package/dist/nerves/index.js +293 -9
  378. package/dist/nerves/observation.js +20 -0
  379. package/dist/nerves/redact.js +79 -0
  380. package/dist/nerves/review/cli-main.js +5 -0
  381. package/dist/nerves/review/cli.js +156 -0
  382. package/dist/nerves/review/core.js +159 -0
  383. package/dist/nerves/runtime.js +17 -1
  384. package/dist/repertoire/ado-client.js +15 -56
  385. package/dist/repertoire/ado-semantic.js +16 -10
  386. package/dist/repertoire/api-client.js +97 -0
  387. package/dist/repertoire/bitwarden-store.js +1045 -0
  388. package/dist/repertoire/bundle-templates.js +71 -0
  389. package/dist/repertoire/bw-installer.js +180 -0
  390. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  391. package/dist/repertoire/coding/context-pack.js +331 -0
  392. package/dist/repertoire/coding/feedback.js +174 -32
  393. package/dist/repertoire/coding/index.js +15 -3
  394. package/dist/repertoire/coding/manager.js +159 -10
  395. package/dist/repertoire/coding/spawner.js +58 -11
  396. package/dist/repertoire/coding/tools.js +221 -15
  397. package/dist/repertoire/coding/workbench-client.js +272 -0
  398. package/dist/repertoire/coding/workbench-manager.js +346 -0
  399. package/dist/repertoire/commerce-errors.js +109 -0
  400. package/dist/repertoire/commerce-self-test.js +156 -0
  401. package/dist/repertoire/credential-access.js +178 -0
  402. package/dist/repertoire/desk/classifier.js +362 -0
  403. package/dist/repertoire/duffel-client.js +185 -0
  404. package/dist/repertoire/github-client.js +14 -55
  405. package/dist/repertoire/graph-client.js +11 -52
  406. package/dist/repertoire/guardrails.js +811 -18
  407. package/dist/repertoire/mcp-client.js +44 -3
  408. package/dist/repertoire/mcp-manager.js +427 -139
  409. package/dist/repertoire/mcp-tools.js +124 -0
  410. package/dist/repertoire/plugin-mcp.js +175 -0
  411. package/dist/repertoire/plugins.js +253 -0
  412. package/dist/repertoire/relationship-authorization.js +322 -0
  413. package/dist/repertoire/shell-sessions.js +134 -0
  414. package/dist/repertoire/skills.js +48 -4
  415. package/dist/repertoire/stripe-client.js +131 -0
  416. package/dist/repertoire/tool-arguments.js +170 -0
  417. package/dist/repertoire/tool-results.js +29 -0
  418. package/dist/repertoire/tools-a2a.js +699 -0
  419. package/dist/repertoire/tools-attachments.js +322 -0
  420. package/dist/repertoire/tools-awaiting.js +575 -0
  421. package/dist/repertoire/tools-base.js +77 -1138
  422. package/dist/repertoire/tools-bluebubbles.js +2 -0
  423. package/dist/repertoire/tools-bridge.js +144 -0
  424. package/dist/repertoire/tools-bundle.js +993 -0
  425. package/dist/repertoire/tools-commerce.js +253 -0
  426. package/dist/repertoire/tools-config.js +186 -0
  427. package/dist/repertoire/tools-continuity.js +575 -0
  428. package/dist/repertoire/tools-credential.js +383 -0
  429. package/dist/repertoire/tools-evolution.js +527 -0
  430. package/dist/repertoire/tools-files.js +344 -0
  431. package/dist/repertoire/tools-flight.js +290 -0
  432. package/dist/repertoire/tools-flow.js +119 -0
  433. package/dist/repertoire/tools-github.js +3 -8
  434. package/dist/repertoire/tools-habits.js +103 -0
  435. package/dist/repertoire/tools-mail.js +1828 -0
  436. package/dist/repertoire/tools-notes.js +485 -0
  437. package/dist/repertoire/tools-obligations.js +182 -0
  438. package/dist/repertoire/tools-orientation.js +31 -0
  439. package/dist/repertoire/tools-record.js +482 -0
  440. package/dist/repertoire/tools-rsvp.js +139 -0
  441. package/dist/repertoire/tools-runtime.js +150 -0
  442. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  443. package/dist/repertoire/tools-session.js +1133 -0
  444. package/dist/repertoire/tools-shell.js +149 -0
  445. package/dist/repertoire/tools-steward-policy.js +119 -0
  446. package/dist/repertoire/tools-stripe.js +224 -0
  447. package/dist/repertoire/tools-surface.js +369 -0
  448. package/dist/repertoire/tools-teams.js +12 -39
  449. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  450. package/dist/repertoire/tools-travel.js +125 -0
  451. package/dist/repertoire/tools-trip.js +982 -0
  452. package/dist/repertoire/tools-unraid.js +531 -0
  453. package/dist/repertoire/tools-user-profile.js +146 -0
  454. package/dist/repertoire/tools-vault.js +40 -0
  455. package/dist/repertoire/tools-voice.js +145 -0
  456. package/dist/repertoire/tools.js +494 -148
  457. package/dist/repertoire/travel-api-client.js +360 -0
  458. package/dist/repertoire/unraid-client.js +155 -0
  459. package/dist/repertoire/unraid-restart.js +339 -0
  460. package/dist/repertoire/user-profile.js +131 -0
  461. package/dist/repertoire/vault-setup.js +246 -0
  462. package/dist/repertoire/vault-unlock.js +628 -0
  463. package/dist/rsvp/aisleplanner-client.js +354 -0
  464. package/dist/rsvp/cli.js +926 -0
  465. package/dist/rsvp/config.js +327 -0
  466. package/dist/rsvp/cutover.js +433 -0
  467. package/dist/rsvp/diagnostics.js +232 -0
  468. package/dist/rsvp/diff-renderer.js +176 -0
  469. package/dist/rsvp/habit-policy.js +110 -0
  470. package/dist/rsvp/habit-stage.js +123 -0
  471. package/dist/rsvp/incident-bundle.js +97 -0
  472. package/dist/rsvp/migration.js +204 -0
  473. package/dist/rsvp/native-habit-runner.js +630 -0
  474. package/dist/rsvp/outbound-state.js +628 -0
  475. package/dist/rsvp/query.js +118 -0
  476. package/dist/rsvp/replay.js +233 -0
  477. package/dist/rsvp/snapshot.js +232 -0
  478. package/dist/rsvp/spend-ledger.js +175 -0
  479. package/dist/scripts/claude-code-hook.js +41 -0
  480. package/dist/scripts/claude-code-stop-hook.js +47 -0
  481. package/dist/senses/a2a-entry.js +115 -0
  482. package/dist/senses/acp-server.js +386 -0
  483. package/dist/senses/attention-queue.js +186 -0
  484. package/dist/senses/await-turn-message.js +58 -0
  485. package/dist/senses/bluebubbles/active-turns.js +216 -0
  486. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  487. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  488. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  489. package/dist/senses/bluebubbles/context-packet.js +207 -0
  490. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  491. package/dist/senses/bluebubbles/entry.js +90 -0
  492. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  493. package/dist/senses/bluebubbles/index.js +3841 -0
  494. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  495. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  496. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  497. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  498. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  499. package/dist/senses/bluebubbles/processed-log.js +133 -0
  500. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  501. package/dist/senses/bluebubbles/replay.js +284 -0
  502. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  503. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  504. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  505. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  506. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  507. package/dist/senses/cli/bracketed-paste.js +82 -0
  508. package/dist/senses/cli/image-paste.js +287 -0
  509. package/dist/senses/cli/image-ref-navigation.js +75 -0
  510. package/dist/senses/cli/ink-app.js +156 -0
  511. package/dist/senses/cli/inline-diff.js +64 -0
  512. package/dist/senses/cli/input-keys.js +174 -0
  513. package/dist/senses/cli/kill-ring.js +86 -0
  514. package/dist/senses/cli/message-list.js +51 -0
  515. package/dist/senses/cli/ouro-tui.js +607 -0
  516. package/dist/senses/cli/spinner-imperative.js +135 -0
  517. package/dist/senses/cli/spinner.js +101 -0
  518. package/dist/senses/cli/status-line.js +60 -0
  519. package/dist/senses/cli/streaming-markdown.js +526 -0
  520. package/dist/senses/cli/tool-display.js +85 -0
  521. package/dist/senses/cli/tool-render.js +85 -0
  522. package/dist/senses/cli/tui-store.js +241 -0
  523. package/dist/senses/cli/virtual-list.js +35 -0
  524. package/dist/senses/cli-entry.js +60 -8
  525. package/dist/senses/cli.js +604 -320
  526. package/dist/senses/commands.js +66 -3
  527. package/dist/senses/context-packet-ledger.js +371 -0
  528. package/dist/senses/context-packets.js +154 -0
  529. package/dist/senses/habit-lifecycle-guard.js +24 -0
  530. package/dist/senses/habit-turn-message.js +160 -0
  531. package/dist/senses/ingress-evidence.js +2 -0
  532. package/dist/senses/mail-entry.js +66 -0
  533. package/dist/senses/mail.js +524 -0
  534. package/dist/senses/pipeline.js +1115 -204
  535. package/dist/senses/private-runtime-worker.js +859 -0
  536. package/dist/senses/private-runtime.js +1517 -0
  537. package/dist/senses/proactive-content-guard.js +51 -0
  538. package/dist/senses/root-host-approval-port.js +345 -0
  539. package/dist/senses/root-host-approval-runtime.js +393 -0
  540. package/dist/senses/sanctuary-authority-resident.js +102 -0
  541. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  542. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  543. package/dist/senses/sanctuary-grounding.js +118 -0
  544. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  545. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  546. package/dist/senses/sanctuary-health-runner.js +100 -0
  547. package/dist/senses/sanctuary-health.js +408 -0
  548. package/dist/senses/sanctuary-install-state-contract.js +126 -0
  549. package/dist/senses/sanctuary-interactive-control.js +410 -0
  550. package/dist/senses/sanctuary-media-catalog-contract.js +297 -0
  551. package/dist/senses/sanctuary-media-optimization.js +514 -0
  552. package/dist/senses/sanctuary-runtime.js +340 -0
  553. package/dist/senses/sanctuary-sab.js +85 -0
  554. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  555. package/dist/senses/shared-turn.js +772 -0
  556. package/dist/senses/surface-tool.js +109 -0
  557. package/dist/senses/teams-entry.js +60 -8
  558. package/dist/senses/teams.js +519 -218
  559. package/dist/senses/telegram-admission.js +718 -0
  560. package/dist/senses/telegram-approval-runtime.js +793 -0
  561. package/dist/senses/telegram-attachments.js +186 -0
  562. package/dist/senses/telegram-audit-ledger.js +220 -0
  563. package/dist/senses/telegram-authority-transport.js +231 -0
  564. package/dist/senses/telegram-client.js +1749 -0
  565. package/dist/senses/telegram-effect-adapter.js +896 -0
  566. package/dist/senses/telegram-entry.js +83 -0
  567. package/dist/senses/telegram.js +2324 -0
  568. package/dist/senses/trust-gate.js +104 -9
  569. package/dist/senses/voice/audio-playback.js +237 -0
  570. package/dist/senses/voice/audio-routing.js +119 -0
  571. package/dist/senses/voice/elevenlabs.js +202 -0
  572. package/dist/senses/voice/floor-control.js +431 -0
  573. package/dist/senses/voice/floor-controller.js +115 -0
  574. package/dist/senses/voice/golden-path.js +116 -0
  575. package/dist/senses/voice/index.js +29 -0
  576. package/dist/senses/voice/meeting.js +113 -0
  577. package/dist/senses/voice/outbound.js +190 -0
  578. package/dist/senses/voice/phone.js +33 -0
  579. package/dist/senses/voice/playback.js +139 -0
  580. package/dist/senses/voice/realtime-eval.js +496 -0
  581. package/dist/senses/voice/realtime-trace.js +531 -0
  582. package/dist/senses/voice/transcript.js +70 -0
  583. package/dist/senses/voice/turn.js +191 -0
  584. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  585. package/dist/senses/voice/twilio-phone.js +5031 -0
  586. package/dist/senses/voice/types.js +2 -0
  587. package/dist/senses/voice/whisper.js +161 -0
  588. package/dist/senses/voice-entry.js +81 -0
  589. package/dist/senses/voice-realtime-eval-command.js +99 -0
  590. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  591. package/dist/senses/voice-twilio-entry.js +87 -0
  592. package/dist/trips/core.js +138 -0
  593. package/dist/trips/store.js +265 -0
  594. package/dist/util/frontmatter.js +69 -0
  595. package/npm-shrinkwrap.json +8138 -0
  596. package/package.json +72 -13
  597. package/skills/agent-commerce.md +113 -0
  598. package/skills/browser-navigation.md +117 -0
  599. package/skills/commerce-setup-guide.md +116 -0
  600. package/skills/commerce-setup.md +84 -0
  601. package/skills/configure-dev-tools.md +99 -0
  602. package/skills/travel-planning.md +138 -0
  603. package/dist/heart/daemon/auth-flow.js +0 -430
  604. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  605. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  606. package/dist/heart/daemon/update-hooks.js +0 -138
  607. package/dist/heart/obligations.js +0 -191
  608. package/dist/heart/safe-workspace.js +0 -228
  609. package/dist/heart/session-recall.js +0 -116
  610. package/dist/mind/friends/channel.js +0 -84
  611. package/dist/mind/friends/group-context.js +0 -144
  612. package/dist/mind/friends/resolver.js +0 -84
  613. package/dist/mind/friends/store-file.js +0 -190
  614. package/dist/mind/friends/store.js +0 -4
  615. package/dist/mind/friends/tokens.js +0 -26
  616. package/dist/mind/friends/trust-explanation.js +0 -74
  617. package/dist/mind/friends/types.js +0 -29
  618. package/dist/repertoire/tasks/board.js +0 -134
  619. package/dist/repertoire/tasks/index.js +0 -224
  620. package/dist/repertoire/tasks/lifecycle.js +0 -80
  621. package/dist/repertoire/tasks/middleware.js +0 -65
  622. package/dist/repertoire/tasks/parser.js +0 -173
  623. package/dist/repertoire/tasks/scanner.js +0 -132
  624. package/dist/repertoire/tasks/transitions.js +0 -144
  625. package/dist/senses/bluebubbles-entry.js +0 -13
  626. package/dist/senses/bluebubbles.js +0 -1181
  627. package/dist/senses/debug-activity.js +0 -154
  628. package/dist/senses/inner-dialog-worker.js +0 -90
  629. package/dist/senses/inner-dialog.js +0 -525
  630. package/subagents/README.md +0 -7
  631. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  632. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  633. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  634. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  635. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  636. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  637. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  638. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  639. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  640. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  641. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  642. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  643. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  644. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  645. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  646. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  647. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -1,5 +1,39 @@
1
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
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DEFAULT_MAX_GENERATIONS = exports.DEFAULT_MAX_LOG_SIZE_BYTES = void 0;
3
37
  exports.createTraceId = createTraceId;
4
38
  exports.ensureTraceId = ensureTraceId;
5
39
  exports.createFanoutSink = createFanoutSink;
@@ -7,18 +41,44 @@ exports.formatTerminalEntry = formatTerminalEntry;
7
41
  exports.registerSpinnerHooks = registerSpinnerHooks;
8
42
  exports.createTerminalSink = createTerminalSink;
9
43
  exports.createStderrSink = createStderrSink;
44
+ exports.rotateIfNeeded = rotateIfNeeded;
10
45
  exports.createNdjsonFileSink = createNdjsonFileSink;
11
46
  exports.registerGlobalLogSink = registerGlobalLogSink;
12
47
  exports.createLogger = createLogger;
13
48
  const fs_1 = require("fs");
14
49
  const path_1 = require("path");
15
50
  const crypto_1 = require("crypto");
51
+ const zlib = __importStar(require("zlib"));
52
+ // NOTE: runtime.ts imports `createLogger` and `ensureTraceId` from this file.
53
+ // The cycle is safe in CommonJS because runtime.ts only uses those values
54
+ // lazily inside `getRuntimeLogger()`, and we only call `emitNervesEvent` from
55
+ // inside `rotateIfNeeded` — never at module top level.
56
+ const runtime_1 = require("./runtime");
57
+ const redact_1 = require("./redact");
16
58
  const LEVEL_PRIORITY = {
17
59
  debug: 10,
18
60
  info: 20,
19
61
  warn: 30,
20
62
  error: 40,
21
63
  };
64
+ function fsyncFileAndDirectory(filePath) {
65
+ if ((0, fs_1.existsSync)(filePath)) {
66
+ const fileDescriptor = (0, fs_1.openSync)(filePath, "r");
67
+ try {
68
+ (0, fs_1.fsyncSync)(fileDescriptor);
69
+ }
70
+ finally {
71
+ (0, fs_1.closeSync)(fileDescriptor);
72
+ }
73
+ }
74
+ const directoryDescriptor = (0, fs_1.openSync)((0, path_1.dirname)(filePath), "r");
75
+ try {
76
+ (0, fs_1.fsyncSync)(directoryDescriptor);
77
+ }
78
+ finally {
79
+ (0, fs_1.closeSync)(directoryDescriptor);
80
+ }
81
+ }
22
82
  const GLOBAL_SINKS_KEY = Symbol.for("ouroboros.nerves.global-sinks");
23
83
  function resolveGlobalSinks() {
24
84
  const scope = globalThis;
@@ -82,7 +142,10 @@ function registerSpinnerHooks(pause, resume) {
82
142
  _pauseSpinner = pause;
83
143
  _resumeSpinner = resume;
84
144
  }
85
- function createTerminalSink(write = (chunk) => process.stderr.write(chunk), colorize = true) {
145
+ function createTerminalSink(write = (chunk) => { try {
146
+ process.stderr.write(chunk);
147
+ }
148
+ catch { /* EPIPE: daemon detached, no terminal */ } }, colorize = true) {
86
149
  return (entry) => {
87
150
  _pauseSpinner?.();
88
151
  const line = formatTerminalEntry(entry);
@@ -96,27 +159,241 @@ function createTerminalSink(write = (chunk) => process.stderr.write(chunk), colo
96
159
  _resumeSpinner?.();
97
160
  };
98
161
  }
99
- function createStderrSink(write = (chunk) => process.stderr.write(chunk)) {
162
+ function createStderrSink(write) {
100
163
  return createTerminalSink(write);
101
164
  }
102
- function createNdjsonFileSink(filePath) {
165
+ exports.DEFAULT_MAX_LOG_SIZE_BYTES = 25 * 1024 * 1024; // 25 MB per active stream
166
+ exports.DEFAULT_MAX_GENERATIONS = 5; // keep 5 gzipped historical generations
167
+ const DEFAULT_ROTATION_CHECK_INTERVAL_BYTES = 1024 * 1024; // ~1MB between stat checks
168
+ /** Internal: compute the gzipped generation path for a given ndjson file. */
169
+ function generationGzPath(base, ext, n) {
170
+ return ext === ".ndjson" ? `${base}.${n}.ndjson.gz` : `${base}.${n}.gz`;
171
+ }
172
+ /** Internal: compute the legacy uncompressed generation path for a given file. */
173
+ function generationPlainPath(base, ext, n) {
174
+ return ext === ".ndjson" ? `${base}.${n}.ndjson` : `${base}.${n}`;
175
+ }
176
+ /**
177
+ * Rotate a log file in place.
178
+ *
179
+ * Scheme (25 MB × 5 gzipped generations by default):
180
+ * active : foo.ndjson
181
+ * newest gen : foo.1.ndjson.gz
182
+ * oldest gen : foo.5.ndjson.gz (dropped on next rotation)
183
+ *
184
+ * Legacy tolerance: uncompressed `foo.1.ndjson` / `foo.2.ndjson` files from the
185
+ * old scheme are treated as the corresponding generation and gzipped on first
186
+ * rotation.
187
+ *
188
+ * Concurrent-writer safety: the active file is renamed (inode stays alive for
189
+ * any open writer fd) then gzipped at the renamed path. An active writer
190
+ * continues writing to its original fd; on the next write cycle it sees the
191
+ * old path is missing and creates a fresh file.
192
+ *
193
+ * Backwards-compatible signature: passing a `number` as the second argument
194
+ * (the old API) is still accepted and interpreted as `maxSizeBytes`.
195
+ */
196
+ function rotateIfNeeded(filePath, optionsOrMaxSize) {
197
+ const options = typeof optionsOrMaxSize === "number"
198
+ ? { maxSizeBytes: optionsOrMaxSize }
199
+ : optionsOrMaxSize ?? {};
200
+ const maxSizeBytes = options.maxSizeBytes ?? exports.DEFAULT_MAX_LOG_SIZE_BYTES;
201
+ const maxGenerations = options.maxGenerations ?? exports.DEFAULT_MAX_GENERATIONS;
202
+ const compress = options.compress ?? true;
203
+ let size;
204
+ try {
205
+ size = (0, fs_1.statSync)(filePath).size;
206
+ }
207
+ catch {
208
+ return false;
209
+ }
210
+ if (size < maxSizeBytes)
211
+ return false;
212
+ const ext = filePath.endsWith(".ndjson") ? ".ndjson" : "";
213
+ const base = ext ? filePath.slice(0, -ext.length) : filePath;
214
+ const traceId = (0, crypto_1.randomUUID)();
215
+ (0, runtime_1.emitNervesEvent)({
216
+ component: "nerves",
217
+ event: "nerves.rotation_start",
218
+ trace_id: traceId,
219
+ message: "rotating log file",
220
+ meta: { path: filePath, currentSize: size, threshold: maxSizeBytes, generation: 1 },
221
+ });
222
+ let completed = false;
223
+ try {
224
+ // Step 1: drop / shift existing generations starting from the oldest.
225
+ // For each slot N (maxGenerations..2), find whatever occupies slot (N-1)
226
+ // (as .gz or legacy uncompressed) and move it to slot N. Slot N occupants
227
+ // get overwritten (oldest is dropped). Non-existent slots are skipped.
228
+ for (let n = maxGenerations; n >= 2; n--) {
229
+ const destGz = generationGzPath(base, ext, n);
230
+ const srcGz = generationGzPath(base, ext, n - 1);
231
+ const srcPlain = generationPlainPath(base, ext, n - 1);
232
+ // Drop whatever currently occupies the destination slot (oldest generation).
233
+ if ((0, fs_1.existsSync)(destGz)) {
234
+ (0, fs_1.unlinkSync)(destGz);
235
+ }
236
+ const destPlain = generationPlainPath(base, ext, n);
237
+ if ((0, fs_1.existsSync)(destPlain)) {
238
+ (0, fs_1.unlinkSync)(destPlain);
239
+ }
240
+ // Prefer moving .gz → .gz (cheap rename).
241
+ if ((0, fs_1.existsSync)(srcGz)) {
242
+ (0, fs_1.renameSync)(srcGz, destGz);
243
+ continue;
244
+ }
245
+ // Legacy migration: if a plain .ndjson generation file exists from the
246
+ // old scheme, read it, gzip it into the destination slot, and delete
247
+ // the plain source.
248
+ if ((0, fs_1.existsSync)(srcPlain)) {
249
+ if (compress) {
250
+ const buf = (0, fs_1.readFileSync)(srcPlain);
251
+ const compressed = zlib.gzipSync(buf);
252
+ (0, fs_1.writeFileSync)(destGz, compressed);
253
+ (0, fs_1.unlinkSync)(srcPlain);
254
+ }
255
+ else {
256
+ // compress=false: just rename
257
+ (0, fs_1.renameSync)(srcPlain, destPlain);
258
+ }
259
+ }
260
+ }
261
+ // Step 2: rename the active file to the generation-1 plain path. The
262
+ // active writer keeps its open fd; the file path now points elsewhere.
263
+ const plain1 = generationPlainPath(base, ext, 1);
264
+ // If a stale .1 plain path exists (e.g. a previous compress=false run),
265
+ // remove it so the rename can claim the slot cleanly.
266
+ if ((0, fs_1.existsSync)(plain1)) {
267
+ (0, fs_1.unlinkSync)(plain1);
268
+ }
269
+ fsyncFileAndDirectory(filePath);
270
+ (0, fs_1.renameSync)(filePath, plain1);
271
+ // Step 3: gzip (or keep plain) the renamed file into the .1 generation.
272
+ if (compress) {
273
+ const gz1 = generationGzPath(base, ext, 1);
274
+ // Remove any lingering .1.ndjson.gz to avoid "file exists" on write.
275
+ if ((0, fs_1.existsSync)(gz1)) {
276
+ (0, fs_1.unlinkSync)(gz1);
277
+ }
278
+ const buf = (0, fs_1.readFileSync)(plain1);
279
+ const compressed = zlib.gzipSync(buf);
280
+ (0, fs_1.writeFileSync)(gz1, compressed);
281
+ fsyncFileAndDirectory(gz1);
282
+ (0, fs_1.unlinkSync)(plain1);
283
+ }
284
+ fsyncFileAndDirectory(compress ? generationGzPath(base, ext, 1) : plain1);
285
+ completed = true;
286
+ (0, runtime_1.emitNervesEvent)({
287
+ component: "nerves",
288
+ event: "nerves.rotation_end",
289
+ trace_id: traceId,
290
+ message: "log rotation complete",
291
+ meta: { path: filePath, compressedPath: compress ? generationGzPath(base, ext, 1) : plain1, bytesFreed: size },
292
+ });
293
+ return true;
294
+ }
295
+ catch (err) {
296
+ /* v8 ignore next -- defensive: completed=true only reached after the try block's return @preserve */
297
+ if (!completed) {
298
+ /* v8 ignore next -- defensive: fs ops throw real Errors @preserve */
299
+ const reason = err instanceof Error ? err.message : String(err);
300
+ (0, runtime_1.emitNervesEvent)({
301
+ component: "nerves",
302
+ event: "nerves.rotation_error",
303
+ trace_id: traceId,
304
+ level: "error",
305
+ message: "log rotation failed",
306
+ meta: { path: filePath, error: reason },
307
+ });
308
+ }
309
+ throw err;
310
+ }
311
+ }
312
+ function createNdjsonFileSink(filePath, optionsOrMaxSize) {
103
313
  (0, fs_1.mkdirSync)((0, path_1.dirname)(filePath), { recursive: true });
314
+ const options = typeof optionsOrMaxSize === "number"
315
+ ? { maxSizeBytes: optionsOrMaxSize }
316
+ : optionsOrMaxSize ?? {};
317
+ const rotationCheckInterval = options.rotationCheckIntervalBytes ?? DEFAULT_ROTATION_CHECK_INTERVAL_BYTES;
318
+ const verbose = process.env.OURO_LOG_VERBOSE === "1";
104
319
  const queue = [];
105
320
  let flushing = false;
321
+ let bytesSinceCheck = 0;
322
+ let enqueued = 0;
323
+ let completed = 0;
324
+ let appendFailure = null;
325
+ const barriers = [];
326
+ function settleBarriers() {
327
+ const ready = barriers.filter((barrier) => barrier.target <= completed);
328
+ if (ready.length === 0)
329
+ return;
330
+ for (const barrier of ready)
331
+ barriers.splice(barriers.indexOf(barrier), 1);
332
+ if (appendFailure) {
333
+ for (const barrier of ready)
334
+ barrier.reject(appendFailure);
335
+ return;
336
+ }
337
+ try {
338
+ fsyncFileAndDirectory(filePath);
339
+ for (const barrier of ready)
340
+ barrier.resolve();
341
+ }
342
+ catch (error) {
343
+ const failure = error instanceof Error ? error : new Error(String(error));
344
+ appendFailure = failure;
345
+ for (const barrier of ready)
346
+ barrier.reject(failure);
347
+ }
348
+ }
106
349
  function flush() {
107
350
  if (flushing || queue.length === 0)
108
351
  return;
109
352
  flushing = true;
110
353
  const line = queue.shift();
111
- (0, fs_1.appendFile)(filePath, line, "utf8", () => {
354
+ const checkBeforeAppend = bytesSinceCheck >= rotationCheckInterval;
355
+ const checkAfterAppend = checkBeforeAppend || line.length >= rotationCheckInterval;
356
+ if (checkBeforeAppend) {
357
+ bytesSinceCheck = 0;
358
+ try {
359
+ rotateIfNeeded(filePath, options);
360
+ }
361
+ catch (rotationError) {
362
+ appendFailure ??= rotationError instanceof Error ? rotationError : new Error(String(rotationError));
363
+ }
364
+ }
365
+ (0, fs_1.appendFile)(filePath, line, "utf8", (error) => {
366
+ completed += 1;
367
+ if (error)
368
+ appendFailure ??= error;
369
+ if (checkAfterAppend) {
370
+ try {
371
+ fsyncFileAndDirectory(filePath);
372
+ rotateIfNeeded(filePath, options);
373
+ }
374
+ catch (rotationError) {
375
+ appendFailure ??= rotationError instanceof Error ? rotationError : new Error(String(rotationError));
376
+ }
377
+ }
378
+ settleBarriers();
112
379
  flushing = false;
113
380
  flush();
114
381
  });
115
382
  }
116
- return (entry) => {
117
- queue.push(`${JSON.stringify(entry)}\n`);
383
+ const sink = ((entry) => {
384
+ const line = verbose
385
+ ? `${JSON.stringify(entry)}\n`
386
+ : `${(0, redact_1.redactString)(JSON.stringify((0, redact_1.redactLogEntry)(entry)))}\n`;
387
+ bytesSinceCheck += line.length;
388
+ enqueued += 1;
389
+ queue.push(line);
118
390
  flush();
119
- };
391
+ });
392
+ sink.barrier = () => new Promise((resolve, reject) => {
393
+ barriers.push({ target: enqueued, resolve, reject });
394
+ settleBarriers();
395
+ });
396
+ return sink;
120
397
  }
121
398
  function registerGlobalLogSink(sink) {
122
399
  globalSinks.add(sink);
@@ -138,9 +415,10 @@ function createLogger(options = {}) {
138
415
  const configuredLevel = options.level ?? "info";
139
416
  const sinks = options.sinks ?? [createStderrSink()];
140
417
  const sink = createFanoutSink(sinks);
418
+ const durableSinks = sinks.filter((candidate) => "barrier" in candidate && typeof candidate.barrier === "function");
141
419
  const now = options.now ?? (() => new Date());
142
- function emit(level, entry) {
143
- if (!shouldEmit(configuredLevel, level)) {
420
+ function emit(level, entry, force = false) {
421
+ if (!force && !shouldEmit(configuredLevel, level)) {
144
422
  return;
145
423
  }
146
424
  const payload = {
@@ -160,5 +438,11 @@ function createLogger(options = {}) {
160
438
  info: (entry) => emit("info", entry),
161
439
  warn: (entry) => emit("warn", entry),
162
440
  error: (entry) => emit("error", entry),
441
+ durabilityBarrier: async () => {
442
+ if (durableSinks.length === 0)
443
+ throw new Error("No durable Nerves sink is configured");
444
+ await Promise.all(durableSinks.map((durableSink) => durableSink.barrier()));
445
+ },
446
+ emitDurable: (level, entry) => emit(level, entry, true),
163
447
  };
164
448
  }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /**
3
+ * Nerves observation layer — shared typed readers for runtime state.
4
+ *
5
+ * This module re-exports domain types that multiple consumers need
6
+ * (Mailbox, CLI, agent tools) so they don't maintain parallel type universes.
7
+ *
8
+ * The Mailbox UI consumes these through the HTTP API, but the same
9
+ * observation functions back CLI commands and future native clients.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ /* v8 ignore start — module-level observability event */
13
+ const runtime_1 = require("./runtime");
14
+ (0, runtime_1.emitNervesEvent)({
15
+ component: "nerves",
16
+ event: "nerves.observation_loaded",
17
+ message: "observation layer loaded",
18
+ meta: {},
19
+ });
20
+ /* v8 ignore stop */
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SENSITIVE_PATTERNS = exports.SENSITIVE_KEYS = void 0;
4
+ exports.redactMeta = redactMeta;
5
+ exports.redactString = redactString;
6
+ exports.redactLogEntry = redactLogEntry;
7
+ /**
8
+ * Lowercase key names that trigger structured redaction.
9
+ * Matched case-insensitively against meta object keys.
10
+ */
11
+ exports.SENSITIVE_KEYS = new Set([
12
+ "password",
13
+ "secret",
14
+ "token",
15
+ "accesstoken",
16
+ "refreshtoken",
17
+ "clientsecret",
18
+ "apikey",
19
+ "oauthaccesstoken",
20
+ "authorization",
21
+ "cookie",
22
+ "set-cookie",
23
+ ]);
24
+ /**
25
+ * Regex patterns for string-level fallback redaction.
26
+ * Applied in order; each match is replaced with `[REDACTED:name]`.
27
+ */
28
+ exports.SENSITIVE_PATTERNS = [
29
+ { name: "anthropic_key", pattern: /sk-ant-[A-Za-z0-9_-]+/g },
30
+ { name: "openai_key", pattern: /sk-proj-[A-Za-z0-9_-]+/g },
31
+ { name: "bearer_token", pattern: /Bearer [A-Za-z0-9\-_.]+/g },
32
+ { name: "api_key_assignment", pattern: /api[_-]?key[=:]\s*["']?[A-Za-z0-9\-_.]+/g },
33
+ { name: "url_token", pattern: /[?&](?:token|key|api_key|access_token)=[A-Za-z0-9\-_.%]+/g },
34
+ ];
35
+ /**
36
+ * Deep-clone meta and replace values at sensitive keys with `[REDACTED:key_name]`.
37
+ * Recurses into nested objects. Case-insensitive key matching.
38
+ */
39
+ function redactMeta(meta) {
40
+ const result = {};
41
+ for (const key of Object.keys(meta)) {
42
+ const value = meta[key];
43
+ if (exports.SENSITIVE_KEYS.has(key.toLowerCase())) {
44
+ result[key] = `[REDACTED:${key}]`;
45
+ }
46
+ else if (value !== null && typeof value === "object" && !Array.isArray(value)) {
47
+ result[key] = redactMeta(value);
48
+ }
49
+ else {
50
+ result[key] = value;
51
+ }
52
+ }
53
+ return result;
54
+ }
55
+ /**
56
+ * Apply all regex patterns to a string, replacing matches with `[REDACTED:pattern_name]`.
57
+ */
58
+ function redactString(text) {
59
+ let result = text;
60
+ for (const { name, pattern } of exports.SENSITIVE_PATTERNS) {
61
+ // Reset lastIndex for global regexes reused across calls
62
+ pattern.lastIndex = 0;
63
+ result = result.replace(pattern, `[REDACTED:${name}]`);
64
+ }
65
+ return result;
66
+ }
67
+ /**
68
+ * Full redaction pipeline: redact meta (structured keys), then redact message (regex patterns).
69
+ * Returns a new LogEvent -- never mutates the input.
70
+ */
71
+ function redactLogEntry(entry) {
72
+ const redactedMeta = redactMeta(entry.meta);
73
+ const redactedMessage = redactString(entry.message);
74
+ return {
75
+ ...entry,
76
+ meta: redactedMeta,
77
+ message: redactedMessage,
78
+ };
79
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const cli_1 = require("./cli");
4
+ const code = (0, cli_1.runNervesReviewCli)(process.argv.slice(2));
5
+ process.exit(code);
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runNervesReviewCli = runNervesReviewCli;
37
+ const path = __importStar(require("node:path"));
38
+ const identity_1 = require("../../heart/identity");
39
+ const core_1 = require("./core");
40
+ function parseArgs(argv) {
41
+ const args = { process: core_1.DEFAULT_NERVES_PROCESS, json: false, help: false };
42
+ for (let i = 0; i < argv.length; i++) {
43
+ const token = argv[i];
44
+ const next = argv[i + 1];
45
+ switch (token) {
46
+ case "--help":
47
+ case "-h":
48
+ args.help = true;
49
+ break;
50
+ case "--process":
51
+ if (next)
52
+ args.process = next;
53
+ i++;
54
+ break;
55
+ case "--agent":
56
+ if (next)
57
+ args.agent = next;
58
+ i++;
59
+ break;
60
+ case "--component":
61
+ if (next)
62
+ args.componentSubstring = next;
63
+ i++;
64
+ break;
65
+ case "--event":
66
+ if (next)
67
+ args.eventSubstring = next;
68
+ i++;
69
+ break;
70
+ case "--level":
71
+ if (next)
72
+ args.level = next;
73
+ i++;
74
+ break;
75
+ case "--since":
76
+ if (next)
77
+ args.since = next;
78
+ i++;
79
+ break;
80
+ case "--limit":
81
+ if (next) {
82
+ const parsed = Number.parseInt(next, 10);
83
+ if (Number.isFinite(parsed) && parsed > 0)
84
+ args.limit = parsed;
85
+ }
86
+ i++;
87
+ break;
88
+ case "--json":
89
+ args.json = true;
90
+ break;
91
+ }
92
+ }
93
+ return args;
94
+ }
95
+ function printHelp() {
96
+ // eslint-disable-next-line no-console -- meta-tooling
97
+ console.log([
98
+ "usage: ouro nerves-review [options]",
99
+ "",
100
+ "Tail the agent's nerves ndjson and filter recent events. Read-only.",
101
+ "",
102
+ "options:",
103
+ ` --process <name> log stream to read (default: ${core_1.DEFAULT_NERVES_PROCESS})`,
104
+ " --agent <name> agent bundle to read from (default: current)",
105
+ " --component <substr> filter by component substring (case-insensitive)",
106
+ " --event <substr> filter by event-name substring (case-insensitive)",
107
+ " --level <level> filter by exact level (debug|info|warn|error)",
108
+ " --since <duration> only events newer than e.g. 5m, 2h, 1d",
109
+ " --limit <N> cap returned events (default: 50)",
110
+ " --json output one JSON object per line",
111
+ ].join("\n"));
112
+ }
113
+ function runNervesReviewCli(argv) {
114
+ const args = parseArgs(argv);
115
+ if (args.help) {
116
+ printHelp();
117
+ return 0;
118
+ }
119
+ let sinceMs;
120
+ if (args.since) {
121
+ const parsed = (0, core_1.parseDuration)(args.since);
122
+ if (parsed === null) {
123
+ // eslint-disable-next-line no-console -- meta-tooling
124
+ console.error(`nerves-review: --since '${args.since}' is not a valid duration (e.g. 5m, 2h, 1d)`);
125
+ return 2;
126
+ }
127
+ sinceMs = parsed;
128
+ }
129
+ const logsDir = (0, identity_1.getAgentDaemonLogsDir)(args.agent);
130
+ const filePath = path.join(logsDir, `${args.process}.ndjson`);
131
+ const filter = {
132
+ componentSubstring: args.componentSubstring,
133
+ eventSubstring: args.eventSubstring,
134
+ level: args.level,
135
+ sinceMs,
136
+ limit: args.limit,
137
+ nowMs: Date.now(),
138
+ };
139
+ const entries = (0, core_1.reviewNerveEvents)(filePath, filter);
140
+ if (entries.length === 0) {
141
+ // eslint-disable-next-line no-console -- meta-tooling
142
+ console.log(`(no matching nerves events in ${filePath})`);
143
+ return 0;
144
+ }
145
+ for (const entry of entries) {
146
+ if (args.json) {
147
+ // eslint-disable-next-line no-console -- meta-tooling
148
+ console.log(entry.raw);
149
+ }
150
+ else {
151
+ // eslint-disable-next-line no-console -- meta-tooling
152
+ console.log((0, core_1.formatNerveEntry)(entry));
153
+ }
154
+ }
155
+ return 0;
156
+ }