@ouro.bot/cli 0.1.0-alpha.70 → 0.1.0-alpha.701

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 (501) hide show
  1. package/README.md +133 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +4461 -14
  13. package/dist/a2a/card.js +57 -0
  14. package/dist/a2a/client.js +180 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/delegation-stores.js +56 -0
  17. package/dist/a2a/did-resolution.js +93 -0
  18. package/dist/a2a/identity.js +170 -0
  19. package/dist/a2a/inbound-share.js +107 -0
  20. package/dist/a2a/mission-result-wire.js +196 -0
  21. package/dist/a2a/onboarding.js +115 -0
  22. package/dist/a2a/pin-store.js +132 -0
  23. package/dist/a2a/seen-ledger.js +120 -0
  24. package/dist/a2a/server.js +604 -0
  25. package/dist/a2a/task-store.js +69 -0
  26. package/dist/a2a/transport.js +45 -0
  27. package/dist/a2a/types.js +3 -0
  28. package/dist/arc/attention-types.js +8 -0
  29. package/dist/arc/cares.js +144 -0
  30. package/dist/arc/episodes.js +118 -0
  31. package/dist/arc/evolution.js +490 -0
  32. package/dist/arc/flight-recorder.js +928 -0
  33. package/dist/arc/intentions.js +134 -0
  34. package/dist/arc/json-store.js +117 -0
  35. package/dist/arc/obligations.js +348 -0
  36. package/dist/arc/packets.js +336 -0
  37. package/dist/arc/presence.js +185 -0
  38. package/dist/arc/task-lifecycle.js +57 -0
  39. package/dist/commerce/store.js +755 -0
  40. package/dist/commerce/types.js +3 -0
  41. package/dist/heart/active-work.js +867 -43
  42. package/dist/heart/agent-entry.js +190 -3
  43. package/dist/heart/attachments/image-normalize.js +194 -0
  44. package/dist/heart/attachments/materialize.js +97 -0
  45. package/dist/heart/attachments/originals.js +88 -0
  46. package/dist/heart/attachments/render.js +29 -0
  47. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  48. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  49. package/dist/heart/attachments/sources/index.js +16 -0
  50. package/dist/heart/attachments/store.js +103 -0
  51. package/dist/heart/attachments/types.js +93 -0
  52. package/dist/heart/auth/auth-flow.js +479 -0
  53. package/dist/heart/autonomy-budget.js +434 -0
  54. package/dist/heart/awaiting/await-alert.js +146 -0
  55. package/dist/heart/awaiting/await-expiry.js +108 -0
  56. package/dist/heart/awaiting/await-loader.js +91 -0
  57. package/dist/heart/awaiting/await-parser.js +141 -0
  58. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  59. package/dist/heart/awaiting/await-scheduler.js +378 -0
  60. package/dist/heart/background-operations.js +281 -0
  61. package/dist/heart/bridges/manager.js +137 -17
  62. package/dist/heart/bridges/store.js +14 -2
  63. package/dist/heart/bundle-state.js +168 -0
  64. package/dist/heart/commitments.js +135 -0
  65. package/dist/heart/config-registry.js +331 -0
  66. package/dist/heart/config.js +119 -127
  67. package/dist/heart/context-loss-gauntlet.js +354 -0
  68. package/dist/heart/context-loss-sentinel.js +1155 -0
  69. package/dist/heart/core.js +1306 -278
  70. package/dist/heart/cross-chat-delivery.js +8 -22
  71. package/dist/heart/daemon/agent-config-check.js +451 -0
  72. package/dist/heart/daemon/agent-discovery.js +185 -3
  73. package/dist/heart/daemon/agent-service.js +523 -0
  74. package/dist/heart/daemon/agentic-repair.js +547 -0
  75. package/dist/heart/daemon/await-private-wake.js +59 -0
  76. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  77. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  78. package/dist/heart/daemon/cadence.js +180 -0
  79. package/dist/heart/daemon/cli-defaults.js +825 -0
  80. package/dist/heart/daemon/cli-desk.js +322 -0
  81. package/dist/heart/daemon/cli-exec.js +8142 -0
  82. package/dist/heart/daemon/cli-help.js +675 -0
  83. package/dist/heart/daemon/cli-parse.js +2461 -0
  84. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  85. package/dist/heart/daemon/cli-render.js +770 -0
  86. package/dist/heart/daemon/cli-types.js +8 -0
  87. package/dist/heart/daemon/connect-bay.js +323 -0
  88. package/dist/heart/daemon/daemon-cli.js +29 -1930
  89. package/dist/heart/daemon/daemon-entry.js +822 -10
  90. package/dist/heart/daemon/daemon-health.js +176 -0
  91. package/dist/heart/daemon/daemon-rollup.js +57 -0
  92. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  93. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  94. package/dist/heart/daemon/daemon.js +1264 -84
  95. package/dist/heart/daemon/dns-workflow.js +394 -0
  96. package/dist/heart/daemon/doctor-types.js +8 -0
  97. package/dist/heart/daemon/doctor.js +1126 -0
  98. package/dist/heart/daemon/habit-private-wake.js +56 -0
  99. package/dist/heart/daemon/health-monitor.js +142 -11
  100. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  101. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  102. package/dist/heart/daemon/http-health-probe.js +80 -0
  103. package/dist/heart/daemon/human-command-screens.js +234 -0
  104. package/dist/heart/daemon/human-readiness.js +114 -0
  105. package/dist/heart/daemon/inner-status.js +78 -0
  106. package/dist/heart/daemon/interactive-repair.js +394 -0
  107. package/dist/heart/daemon/launchd.js +37 -8
  108. package/dist/heart/daemon/log-tailer.js +79 -10
  109. package/dist/heart/daemon/logs-prune.js +110 -0
  110. package/dist/heart/daemon/mcp-canary.js +297 -0
  111. package/dist/heart/daemon/message-router.js +45 -5
  112. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  113. package/dist/heart/daemon/os-cron-deps.js +135 -0
  114. package/dist/heart/daemon/os-cron.js +22 -14
  115. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  116. package/dist/heart/daemon/ouro-entry.js +3 -1
  117. package/dist/heart/daemon/plugin-cli.js +432 -0
  118. package/dist/heart/daemon/process-manager.js +519 -40
  119. package/dist/heart/daemon/provider-discovery.js +137 -0
  120. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  121. package/dist/heart/daemon/pulse.js +511 -0
  122. package/dist/heart/daemon/readiness-repair.js +365 -0
  123. package/dist/heart/daemon/run-hooks.js +2 -0
  124. package/dist/heart/daemon/runtime-logging.js +41 -14
  125. package/dist/heart/daemon/runtime-metadata.js +2 -30
  126. package/dist/heart/daemon/safe-mode.js +161 -0
  127. package/dist/heart/daemon/sense-manager.js +670 -48
  128. package/dist/heart/daemon/session-id-resolver.js +131 -0
  129. package/dist/heart/daemon/skill-management-installer.js +1 -1
  130. package/dist/heart/daemon/socket-client.js +171 -12
  131. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  132. package/dist/heart/daemon/startup-tui.js +338 -0
  133. package/dist/heart/daemon/task-scheduler.js +117 -39
  134. package/dist/heart/daemon/terminal-ui.js +499 -0
  135. package/dist/heart/daemon/thoughts.js +255 -43
  136. package/dist/heart/daemon/up-progress.js +366 -0
  137. package/dist/heart/daemon/vault-items.js +56 -0
  138. package/dist/heart/delegation.js +1 -4
  139. package/dist/heart/external-events/router.js +121 -0
  140. package/dist/heart/habits/habit-migration.js +189 -0
  141. package/dist/heart/habits/habit-parser.js +214 -0
  142. package/dist/heart/habits/habit-runtime-state.js +114 -0
  143. package/dist/heart/habits/habit-scheduler.js +431 -0
  144. package/dist/heart/habits/habit-session-summary.js +318 -0
  145. package/dist/heart/habits/habit-session.js +617 -0
  146. package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -60
  147. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  148. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  149. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  150. package/dist/heart/identity.js +174 -59
  151. package/dist/heart/kept-notes.js +289 -0
  152. package/dist/heart/kicks.js +1 -1
  153. package/dist/heart/machine-identity.js +161 -0
  154. package/dist/heart/mail-import-discovery.js +353 -0
  155. package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
  156. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  157. package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
  158. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  159. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  160. package/dist/heart/mailbox/mailbox-http.js +99 -0
  161. package/dist/heart/mailbox/mailbox-read.js +37 -0
  162. package/dist/heart/mailbox/mailbox-types.js +27 -0
  163. package/dist/heart/mailbox/mailbox-view.js +197 -0
  164. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  165. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  166. package/dist/heart/mailbox/readers/mail.js +375 -0
  167. package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
  168. package/dist/heart/mailbox/readers/sessions.js +232 -0
  169. package/dist/heart/mailbox/readers/shared.js +111 -0
  170. package/dist/heart/mcp/mcp-server.js +696 -0
  171. package/dist/heart/migrate-config.js +100 -0
  172. package/dist/heart/model-capabilities.js +11 -0
  173. package/dist/heart/orientation-frame.js +217 -0
  174. package/dist/heart/platform.js +81 -0
  175. package/dist/heart/primitives.js +1 -1
  176. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  177. package/dist/heart/private-runtime/index.js +18 -0
  178. package/dist/heart/private-runtime/ledger.js +218 -0
  179. package/dist/heart/private-runtime/policy.js +214 -0
  180. package/dist/heart/private-runtime/types.js +2 -0
  181. package/dist/heart/progress-story.js +1 -1
  182. package/dist/heart/provider-attempt.js +134 -0
  183. package/dist/heart/provider-binding-resolver.js +273 -0
  184. package/dist/heart/provider-credentials.js +441 -0
  185. package/dist/heart/provider-failover.js +311 -0
  186. package/dist/heart/provider-models.js +81 -0
  187. package/dist/heart/provider-ping.js +262 -0
  188. package/dist/heart/provider-readiness-cache.js +119 -0
  189. package/dist/heart/provider-visibility.js +188 -0
  190. package/dist/heart/providers/anthropic-token.js +131 -0
  191. package/dist/heart/providers/anthropic.js +139 -52
  192. package/dist/heart/providers/azure.js +23 -11
  193. package/dist/heart/providers/error-classification.js +127 -0
  194. package/dist/heart/providers/github-copilot.js +34 -38
  195. package/dist/heart/providers/minimax-vlm.js +189 -0
  196. package/dist/heart/providers/minimax.js +26 -8
  197. package/dist/heart/providers/openai-codex-token.js +349 -0
  198. package/dist/heart/providers/openai-codex.js +55 -40
  199. package/dist/heart/run-ledger.js +247 -0
  200. package/dist/heart/runtime-capability-check.js +170 -0
  201. package/dist/heart/runtime-credentials.js +398 -0
  202. package/dist/heart/runtime-cwd.js +87 -0
  203. package/dist/heart/sense-truth.js +20 -4
  204. package/dist/heart/session-activity.js +90 -24
  205. package/dist/heart/session-events.js +1133 -0
  206. package/dist/heart/session-playback-cli-main.js +5 -0
  207. package/dist/heart/session-playback-cli.js +36 -0
  208. package/dist/heart/session-playback.js +231 -0
  209. package/dist/heart/session-stats-cli-main.js +5 -0
  210. package/dist/heart/session-stats.js +182 -0
  211. package/dist/heart/session-transcript.js +133 -0
  212. package/dist/heart/start-of-turn-packet.js +365 -0
  213. package/dist/heart/streaming.js +44 -27
  214. package/dist/heart/structured-output.js +196 -0
  215. package/dist/heart/sync-classification.js +176 -0
  216. package/dist/heart/sync.js +449 -0
  217. package/dist/heart/target-resolution.js +11 -7
  218. package/dist/heart/tempo.js +93 -0
  219. package/dist/heart/temporal-view.js +41 -0
  220. package/dist/heart/timeouts.js +101 -0
  221. package/dist/heart/tool-activity-callbacks.js +59 -0
  222. package/dist/heart/tool-description.js +155 -0
  223. package/dist/heart/tool-friction.js +55 -0
  224. package/dist/heart/tool-loop.js +200 -0
  225. package/dist/heart/turn-context.js +472 -0
  226. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  227. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  228. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  229. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  230. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  231. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  232. package/dist/heart/versioning/update-hooks.js +154 -0
  233. package/dist/heart/work-card.js +380 -0
  234. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  235. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  236. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  237. package/dist/mailbox-ui/index.html +16 -0
  238. package/dist/mailroom/attention.js +167 -0
  239. package/dist/mailroom/autonomy.js +209 -0
  240. package/dist/mailroom/blob-store.js +715 -0
  241. package/dist/mailroom/body-cache.js +61 -0
  242. package/dist/mailroom/core.js +788 -0
  243. package/dist/mailroom/entry.js +160 -0
  244. package/dist/mailroom/file-store.js +568 -0
  245. package/dist/mailroom/mbox-import.js +393 -0
  246. package/dist/mailroom/migration.js +164 -0
  247. package/dist/mailroom/outbound.js +380 -0
  248. package/dist/mailroom/policy.js +263 -0
  249. package/dist/mailroom/reader.js +233 -0
  250. package/dist/mailroom/search-cache.js +334 -0
  251. package/dist/mailroom/search-relevance.js +319 -0
  252. package/dist/mailroom/smtp-ingress.js +176 -0
  253. package/dist/mailroom/source-state.js +176 -0
  254. package/dist/mailroom/thread.js +109 -0
  255. package/dist/mailroom/travel-extract.js +89 -0
  256. package/dist/mind/bundle-manifest.js +24 -2
  257. package/dist/mind/context.js +250 -101
  258. package/dist/mind/desk-section.js +362 -0
  259. package/dist/mind/diary-integrity.js +60 -0
  260. package/dist/mind/{memory.js → diary.js} +68 -77
  261. package/dist/mind/embedding-provider.js +60 -0
  262. package/dist/mind/file-state.js +179 -0
  263. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  264. package/dist/mind/obligation-steering.js +221 -0
  265. package/dist/mind/pending.js +13 -8
  266. package/dist/mind/prompt-budget.js +380 -0
  267. package/dist/mind/prompt-refresh.js +3 -2
  268. package/dist/mind/prompt.js +1028 -169
  269. package/dist/mind/provenance-trust.js +26 -0
  270. package/dist/mind/record-paths.js +312 -0
  271. package/dist/mind/scrutiny.js +173 -0
  272. package/dist/nerves/cli-logging.js +7 -1
  273. package/dist/nerves/coverage/audit-rules.js +15 -6
  274. package/dist/nerves/coverage/audit.js +28 -2
  275. package/dist/nerves/coverage/cli.js +1 -1
  276. package/dist/nerves/coverage/contract.js +5 -5
  277. package/dist/nerves/coverage/file-completeness.js +139 -5
  278. package/dist/nerves/event-buffer.js +111 -0
  279. package/dist/nerves/index.js +234 -4
  280. package/dist/nerves/observation.js +20 -0
  281. package/dist/nerves/redact.js +79 -0
  282. package/dist/nerves/review/cli-main.js +5 -0
  283. package/dist/nerves/review/cli.js +156 -0
  284. package/dist/nerves/review/core.js +152 -0
  285. package/dist/nerves/runtime.js +5 -1
  286. package/dist/repertoire/ado-client.js +15 -56
  287. package/dist/repertoire/ado-semantic.js +16 -10
  288. package/dist/repertoire/api-client.js +97 -0
  289. package/dist/repertoire/bitwarden-store.js +1042 -0
  290. package/dist/repertoire/bundle-templates.js +71 -0
  291. package/dist/repertoire/bw-installer.js +180 -0
  292. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  293. package/dist/repertoire/coding/context-pack.js +331 -0
  294. package/dist/repertoire/coding/feedback.js +218 -30
  295. package/dist/repertoire/coding/index.js +15 -3
  296. package/dist/repertoire/coding/manager.js +166 -10
  297. package/dist/repertoire/coding/spawner.js +58 -11
  298. package/dist/repertoire/coding/tools.js +242 -14
  299. package/dist/repertoire/coding/workbench-client.js +272 -0
  300. package/dist/repertoire/coding/workbench-manager.js +346 -0
  301. package/dist/repertoire/commerce-errors.js +109 -0
  302. package/dist/repertoire/commerce-self-test.js +156 -0
  303. package/dist/repertoire/credential-access.js +178 -0
  304. package/dist/repertoire/desk/classifier.js +362 -0
  305. package/dist/repertoire/duffel-client.js +185 -0
  306. package/dist/repertoire/github-client.js +14 -55
  307. package/dist/repertoire/graph-client.js +11 -52
  308. package/dist/repertoire/guardrails.js +156 -27
  309. package/dist/repertoire/mcp-client.js +44 -3
  310. package/dist/repertoire/mcp-manager.js +259 -20
  311. package/dist/repertoire/mcp-tools.js +83 -0
  312. package/dist/repertoire/plugin-mcp.js +175 -0
  313. package/dist/repertoire/plugins.js +253 -0
  314. package/dist/repertoire/shell-sessions.js +133 -0
  315. package/dist/repertoire/skills.js +48 -4
  316. package/dist/repertoire/stripe-client.js +131 -0
  317. package/dist/repertoire/tool-results.js +29 -0
  318. package/dist/repertoire/tools-a2a.js +699 -0
  319. package/dist/repertoire/tools-attachments.js +317 -0
  320. package/dist/repertoire/tools-awaiting.js +372 -0
  321. package/dist/repertoire/tools-base.js +65 -1095
  322. package/dist/repertoire/tools-bluebubbles.js +2 -0
  323. package/dist/repertoire/tools-bridge.js +144 -0
  324. package/dist/repertoire/tools-bundle.js +993 -0
  325. package/dist/repertoire/tools-commerce.js +253 -0
  326. package/dist/repertoire/tools-config.js +186 -0
  327. package/dist/repertoire/tools-continuity.js +252 -0
  328. package/dist/repertoire/tools-credential.js +383 -0
  329. package/dist/repertoire/tools-evolution.js +527 -0
  330. package/dist/repertoire/tools-files.js +344 -0
  331. package/dist/repertoire/tools-flight.js +290 -0
  332. package/dist/repertoire/tools-flow.js +119 -0
  333. package/dist/repertoire/tools-github.js +3 -8
  334. package/dist/repertoire/tools-mail.js +1975 -0
  335. package/dist/repertoire/tools-notes.js +459 -0
  336. package/dist/repertoire/tools-obligations.js +182 -0
  337. package/dist/repertoire/tools-orientation.js +31 -0
  338. package/dist/repertoire/tools-record.js +482 -0
  339. package/dist/repertoire/tools-rsvp.js +139 -0
  340. package/dist/repertoire/tools-runtime.js +150 -0
  341. package/dist/repertoire/tools-session.js +881 -0
  342. package/dist/repertoire/tools-shell.js +120 -0
  343. package/dist/repertoire/tools-stripe.js +224 -0
  344. package/dist/repertoire/tools-surface.js +355 -0
  345. package/dist/repertoire/tools-teams.js +12 -39
  346. package/dist/repertoire/tools-travel.js +125 -0
  347. package/dist/repertoire/tools-trip.js +982 -0
  348. package/dist/repertoire/tools-user-profile.js +146 -0
  349. package/dist/repertoire/tools-vault.js +40 -0
  350. package/dist/repertoire/tools-voice.js +145 -0
  351. package/dist/repertoire/tools.js +250 -80
  352. package/dist/repertoire/travel-api-client.js +360 -0
  353. package/dist/repertoire/user-profile.js +131 -0
  354. package/dist/repertoire/vault-setup.js +246 -0
  355. package/dist/repertoire/vault-unlock.js +594 -0
  356. package/dist/rsvp/aisleplanner-client.js +354 -0
  357. package/dist/rsvp/cli.js +704 -0
  358. package/dist/rsvp/config.js +327 -0
  359. package/dist/rsvp/cutover.js +431 -0
  360. package/dist/rsvp/diagnostics.js +222 -0
  361. package/dist/rsvp/diff-renderer.js +161 -0
  362. package/dist/rsvp/habit-policy.js +85 -0
  363. package/dist/rsvp/habit-stage.js +93 -0
  364. package/dist/rsvp/incident-bundle.js +97 -0
  365. package/dist/rsvp/migration.js +204 -0
  366. package/dist/rsvp/outbound-state.js +254 -0
  367. package/dist/rsvp/query.js +118 -0
  368. package/dist/rsvp/replay.js +233 -0
  369. package/dist/rsvp/snapshot.js +232 -0
  370. package/dist/scripts/claude-code-hook.js +41 -0
  371. package/dist/scripts/claude-code-stop-hook.js +47 -0
  372. package/dist/senses/a2a-entry.js +115 -0
  373. package/dist/senses/attention-queue.js +186 -0
  374. package/dist/senses/await-turn-message.js +58 -0
  375. package/dist/senses/bluebubbles/active-turns.js +216 -0
  376. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  377. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  378. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +226 -19
  379. package/dist/senses/bluebubbles/entry.js +77 -0
  380. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  381. package/dist/senses/bluebubbles/index.js +2937 -0
  382. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  383. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  384. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  385. package/dist/senses/bluebubbles/outbound-state.js +304 -0
  386. package/dist/senses/bluebubbles/processed-log.js +133 -0
  387. package/dist/senses/bluebubbles/replay.js +284 -0
  388. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  389. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  390. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  391. package/dist/senses/cli/bracketed-paste.js +82 -0
  392. package/dist/senses/cli/image-paste.js +287 -0
  393. package/dist/senses/cli/image-ref-navigation.js +75 -0
  394. package/dist/senses/cli/ink-app.js +156 -0
  395. package/dist/senses/cli/inline-diff.js +64 -0
  396. package/dist/senses/cli/input-keys.js +174 -0
  397. package/dist/senses/cli/kill-ring.js +86 -0
  398. package/dist/senses/cli/message-list.js +51 -0
  399. package/dist/senses/cli/ouro-tui.js +607 -0
  400. package/dist/senses/cli/spinner-imperative.js +135 -0
  401. package/dist/senses/cli/spinner.js +101 -0
  402. package/dist/senses/cli/status-line.js +60 -0
  403. package/dist/senses/cli/streaming-markdown.js +526 -0
  404. package/dist/senses/cli/tool-display.js +85 -0
  405. package/dist/senses/cli/tool-render.js +85 -0
  406. package/dist/senses/cli/tui-store.js +240 -0
  407. package/dist/senses/cli/virtual-list.js +35 -0
  408. package/dist/senses/cli-entry.js +60 -8
  409. package/dist/senses/cli-layout.js +100 -0
  410. package/dist/senses/cli.js +521 -214
  411. package/dist/senses/commands.js +66 -3
  412. package/dist/senses/context-packet-ledger.js +245 -0
  413. package/dist/senses/context-packets.js +154 -0
  414. package/dist/senses/habit-turn-message.js +160 -0
  415. package/dist/senses/mail-entry.js +66 -0
  416. package/dist/senses/mail.js +395 -0
  417. package/dist/senses/pipeline.js +952 -178
  418. package/dist/senses/private-runtime-worker.js +723 -0
  419. package/dist/senses/private-runtime.js +1157 -0
  420. package/dist/senses/proactive-content-guard.js +51 -0
  421. package/dist/senses/shared-turn.js +416 -0
  422. package/dist/senses/surface-tool.js +109 -0
  423. package/dist/senses/teams-entry.js +60 -8
  424. package/dist/senses/teams.js +397 -112
  425. package/dist/senses/trust-gate.js +104 -9
  426. package/dist/senses/voice/audio-playback.js +237 -0
  427. package/dist/senses/voice/audio-routing.js +119 -0
  428. package/dist/senses/voice/elevenlabs.js +202 -0
  429. package/dist/senses/voice/floor-control.js +431 -0
  430. package/dist/senses/voice/floor-controller.js +115 -0
  431. package/dist/senses/voice/golden-path.js +116 -0
  432. package/dist/senses/voice/index.js +29 -0
  433. package/dist/senses/voice/meeting.js +113 -0
  434. package/dist/senses/voice/outbound.js +190 -0
  435. package/dist/senses/voice/phone.js +33 -0
  436. package/dist/senses/voice/playback.js +139 -0
  437. package/dist/senses/voice/realtime-eval.js +496 -0
  438. package/dist/senses/voice/realtime-trace.js +531 -0
  439. package/dist/senses/voice/transcript.js +70 -0
  440. package/dist/senses/voice/turn.js +191 -0
  441. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  442. package/dist/senses/voice/twilio-phone.js +5081 -0
  443. package/dist/senses/voice/types.js +2 -0
  444. package/dist/senses/voice/whisper.js +161 -0
  445. package/dist/senses/voice-entry.js +81 -0
  446. package/dist/senses/voice-realtime-eval-command.js +99 -0
  447. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  448. package/dist/senses/voice-twilio-entry.js +87 -0
  449. package/dist/trips/core.js +138 -0
  450. package/dist/trips/store.js +265 -0
  451. package/dist/util/frontmatter.js +69 -0
  452. package/package.json +57 -12
  453. package/skills/agent-commerce.md +113 -0
  454. package/skills/browser-navigation.md +117 -0
  455. package/skills/commerce-setup-guide.md +116 -0
  456. package/skills/commerce-setup.md +84 -0
  457. package/skills/configure-dev-tools.md +99 -0
  458. package/skills/travel-planning.md +138 -0
  459. package/dist/heart/daemon/auth-flow.js +0 -409
  460. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  461. package/dist/heart/daemon/update-hooks.js +0 -138
  462. package/dist/heart/safe-workspace.js +0 -228
  463. package/dist/heart/session-recall.js +0 -116
  464. package/dist/mind/friends/channel.js +0 -84
  465. package/dist/mind/friends/group-context.js +0 -144
  466. package/dist/mind/friends/resolver.js +0 -84
  467. package/dist/mind/friends/store-file.js +0 -190
  468. package/dist/mind/friends/store.js +0 -4
  469. package/dist/mind/friends/tokens.js +0 -26
  470. package/dist/mind/friends/trust-explanation.js +0 -74
  471. package/dist/mind/friends/types.js +0 -29
  472. package/dist/repertoire/tasks/board.js +0 -134
  473. package/dist/repertoire/tasks/index.js +0 -224
  474. package/dist/repertoire/tasks/lifecycle.js +0 -80
  475. package/dist/repertoire/tasks/middleware.js +0 -65
  476. package/dist/repertoire/tasks/parser.js +0 -173
  477. package/dist/repertoire/tasks/scanner.js +0 -132
  478. package/dist/repertoire/tasks/transitions.js +0 -144
  479. package/dist/senses/bluebubbles-entry.js +0 -13
  480. package/dist/senses/bluebubbles.js +0 -1180
  481. package/dist/senses/debug-activity.js +0 -148
  482. package/dist/senses/inner-dialog-worker.js +0 -90
  483. package/dist/senses/inner-dialog.js +0 -480
  484. package/subagents/README.md +0 -7
  485. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  486. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  487. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  488. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  489. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  490. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  491. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  492. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  493. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  494. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  495. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  496. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  497. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  498. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  499. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  500. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  501. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ // Pluggable session ID resolver for MCP conversations.
3
+ // Tries tool-specific methods first, falls back to UUID.
4
+ //
5
+ // Claude Code: walks parent PID chain -> reads ~/.claude/sessions/{pid}.json
6
+ // Codex: reads thread_id from env (future)
7
+ // Fallback: generates UUID
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.resolveSessionId = resolveSessionId;
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const os = __importStar(require("os"));
46
+ const crypto_1 = require("crypto");
47
+ const runtime_1 = require("../../nerves/runtime");
48
+ const DEFAULT_CLAUDE_SESSIONS_DIR = path.join(os.homedir(), ".claude", "sessions");
49
+ const MAX_PID_WALK_DEPTH = 10;
50
+ /**
51
+ * Try to read a Claude Code session ID from a PID-keyed session file.
52
+ * Returns the sessionId if found, null otherwise.
53
+ */
54
+ function tryReadClaudeSession(sessionsDir, pid) {
55
+ const sessionFile = path.join(sessionsDir, `${pid}.json`);
56
+ if (!fs.existsSync(sessionFile))
57
+ return null;
58
+ try {
59
+ const raw = fs.readFileSync(sessionFile, "utf-8");
60
+ const data = JSON.parse(raw);
61
+ if (typeof data.sessionId === "string" && data.sessionId.length > 0) {
62
+ return data.sessionId;
63
+ }
64
+ return null;
65
+ }
66
+ catch {
67
+ return null;
68
+ }
69
+ }
70
+ /**
71
+ * Walk the parent PID chain looking for a Claude Code session file.
72
+ * Starts at the current process PID, walks up to parent, grandparent, etc.
73
+ * Returns the session ID from the first matching file, or null.
74
+ */
75
+ function walkPidChain(sessionsDir) {
76
+ let currentPid = process.pid;
77
+ for (let depth = 0; depth < MAX_PID_WALK_DEPTH; depth++) {
78
+ const sessionId = tryReadClaudeSession(sessionsDir, currentPid);
79
+ if (sessionId) {
80
+ (0, runtime_1.emitNervesEvent)({
81
+ component: "daemon",
82
+ event: "daemon.session_id_pid_walk_hit",
83
+ message: "found Claude session via PID walk",
84
+ meta: { pid: currentPid, depth, sessionId },
85
+ });
86
+ return sessionId;
87
+ }
88
+ // Walk to parent PID
89
+ // On macOS/Linux, process.ppid gives the parent. For deeper ancestry,
90
+ // we'd need /proc/{pid}/stat or ps -o ppid=. For now, we check current + parent.
91
+ if (depth === 0) {
92
+ currentPid = process.ppid;
93
+ }
94
+ else {
95
+ // Cannot walk further without OS-specific process tree APIs
96
+ break;
97
+ }
98
+ }
99
+ return null;
100
+ }
101
+ /**
102
+ * Resolve a session ID for the current MCP connection.
103
+ * Returns a stable identifier that ties MCP tool calls to a conversation session.
104
+ *
105
+ * Resolution order:
106
+ * 1. Claude Code PID walk: check ~/.claude/sessions/{pid}.json for current + parent PID
107
+ * 2. UUID fallback: generate a random UUID
108
+ */
109
+ function resolveSessionId(options) {
110
+ const sessionsDir = options?.claudeSessionsDir ?? DEFAULT_CLAUDE_SESSIONS_DIR;
111
+ // Try Claude Code PID walk
112
+ const claudeSessionId = walkPidChain(sessionsDir);
113
+ if (claudeSessionId) {
114
+ (0, runtime_1.emitNervesEvent)({
115
+ component: "daemon",
116
+ event: "daemon.session_id_resolved",
117
+ message: "session ID resolved via Claude Code PID walk",
118
+ meta: { sessionId: claudeSessionId, method: "claude-pid-walk" },
119
+ });
120
+ return claudeSessionId;
121
+ }
122
+ // Fallback: UUID
123
+ const sessionId = (0, crypto_1.randomUUID)();
124
+ (0, runtime_1.emitNervesEvent)({
125
+ component: "daemon",
126
+ event: "daemon.session_id_resolved",
127
+ message: "session ID resolved via UUID fallback",
128
+ meta: { sessionId, method: "uuid-fallback" },
129
+ });
130
+ return sessionId;
131
+ }
@@ -38,7 +38,7 @@ const fs = __importStar(require("fs"));
38
38
  const path = __importStar(require("path"));
39
39
  const runtime_1 = require("../../nerves/runtime");
40
40
  const identity_1 = require("../identity");
41
- const SKILL_MANAGEMENT_URL = "https://raw.githubusercontent.com/ouroborosbot/ouroboros-skills/main/skills/skill-management/SKILL.md";
41
+ const SKILL_MANAGEMENT_URL = "https://raw.githubusercontent.com/ourostack/ouroboros-skills/main/skills/skill-management/SKILL.md";
42
42
  async function ensureSkillManagement() {
43
43
  const bundlesRoot = (0, identity_1.getAgentBundlesRoot)();
44
44
  if (!fs.existsSync(bundlesRoot))
@@ -33,15 +33,92 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.DEFAULT_DAEMON_SOCKET_PATH = void 0;
36
+ exports.DEFAULT_DAEMON_COMMAND_TIMEOUT_MS = exports.DEFAULT_DAEMON_SOCKET_PATH = void 0;
37
+ exports.__bypassVitestGuardForTests = __bypassVitestGuardForTests;
37
38
  exports.sendDaemonCommand = sendDaemonCommand;
38
39
  exports.checkDaemonSocketAlive = checkDaemonSocketAlive;
39
40
  exports.requestInnerWake = requestInnerWake;
41
+ exports.requestPrivateWake = requestPrivateWake;
40
42
  const fs = __importStar(require("fs"));
41
43
  const net = __importStar(require("net"));
42
44
  const runtime_1 = require("../../nerves/runtime");
43
45
  exports.DEFAULT_DAEMON_SOCKET_PATH = "/tmp/ouroboros-daemon.sock";
44
- function sendDaemonCommand(socketPath, command) {
46
+ exports.DEFAULT_DAEMON_COMMAND_TIMEOUT_MS = 10 * 60 * 1000;
47
+ /**
48
+ * Defense-in-depth: detect if we're running under vitest. Tests that forget
49
+ * to `vi.mock("../../heart/daemon/socket-client")` would otherwise leak real
50
+ * `inner.wake` commands (with whatever literal agent name the test uses,
51
+ * commonly "testagent") into whichever real daemon happens to be running on
52
+ * the developer's machine. That has caused real outages when test loops
53
+ * flooded the production-on-localhost daemon.
54
+ *
55
+ * We detect vitest via `process.argv` (not env vars — the project bans those)
56
+ * and convert all socket operations into safe no-ops. Individual tests are
57
+ * still expected to vi.mock this module so they can assert on call counts,
58
+ * but this guard guarantees that "I forgot to mock" can never again take
59
+ * down the daemon.
60
+ *
61
+ * The socket-client's OWN tests (which exercise the real functions against a
62
+ * test socket) call `__bypassVitestGuardForTests(true)` to opt out of the
63
+ * guard. We persist that flag on globalThis so it survives `vi.resetModules`
64
+ * (which clears the module cache between tests).
65
+ *
66
+ * HARDENING (cross-file leak protection): the bypass flag lives on globalThis
67
+ * and is process-wide. With vitest's default `fileParallelism: true`,
68
+ * concurrently-running test files in the same worker can have the bypass on
69
+ * even though they didn't ask for it — and any test that uses
70
+ * `name: "testagent"` and exercises a code path through this module will
71
+ * leak `inner.wake testagent` to the production daemon socket. We saw this
72
+ * cause a real outage on 2026-04-08 (daemon SIGTERMed mid-validation).
73
+ *
74
+ * Defense: even when the bypass flag is set, we ALWAYS hard-block calls that
75
+ * target the production daemon socket path. Test files that legitimately
76
+ * exercise the real socket-client code paths use a synthetic socket path like
77
+ * `/tmp/daemon.sock` or `/tmp/some-real-daemon.sock` — those keep working.
78
+ * Calls to `/tmp/ouroboros-daemon.sock` (DEFAULT_DAEMON_SOCKET_PATH) under
79
+ * vitest are unconditionally blocked, regardless of bypass state. This makes
80
+ * the cross-file leak vector impossible without restricting legitimate
81
+ * socket-client unit tests.
82
+ */
83
+ const BYPASS_KEY = "__ouro_socket_client_bypass_vitest_guard__";
84
+ /** ONLY for socket-client.test.ts. Do not call from any other test or production code. */
85
+ function __bypassVitestGuardForTests(bypass) {
86
+ ;
87
+ globalThis[BYPASS_KEY] = bypass;
88
+ }
89
+ function isVitestProcess() {
90
+ /* v8 ignore next -- defensive: process and process.argv always exist in node @preserve */
91
+ if (typeof process === "undefined" || !Array.isArray(process.argv))
92
+ return false;
93
+ return process.argv.some((arg) => typeof arg === "string" && arg.includes("vitest"));
94
+ }
95
+ function isProductionDaemonSocket(socketPath) {
96
+ return socketPath === exports.DEFAULT_DAEMON_SOCKET_PATH;
97
+ }
98
+ /**
99
+ * Returns true when this socket call should be converted into a safe no-op
100
+ * because we're under vitest and the call would otherwise leak into a real
101
+ * daemon. The bypass flag short-circuits the guard for non-production socket
102
+ * paths only — production socket paths are ALWAYS blocked under vitest.
103
+ */
104
+ function shouldSuppressSocketCall(socketPath) {
105
+ if (!isVitestProcess())
106
+ return false;
107
+ if (isProductionDaemonSocket(socketPath))
108
+ return true;
109
+ return globalThis[BYPASS_KEY] !== true;
110
+ }
111
+ function sendDaemonCommand(socketPath, command, options = {}) {
112
+ if (shouldSuppressSocketCall(socketPath)) {
113
+ (0, runtime_1.emitNervesEvent)({
114
+ level: "warn",
115
+ component: "daemon",
116
+ event: "daemon.socket_command_test_blocked",
117
+ message: "blocked socket command from leaking into real daemon under vitest",
118
+ meta: { socketPath, kind: command.kind, isProductionSocket: isProductionDaemonSocket(socketPath) },
119
+ });
120
+ return Promise.resolve({ ok: true, message: "test mode: socket call suppressed" });
121
+ }
45
122
  (0, runtime_1.emitNervesEvent)({
46
123
  component: "daemon",
47
124
  event: "daemon.socket_command_start",
@@ -51,14 +128,67 @@ function sendDaemonCommand(socketPath, command) {
51
128
  return new Promise((resolve, reject) => {
52
129
  const client = net.createConnection(socketPath);
53
130
  let raw = "";
131
+ let settled = false;
132
+ const timeoutMs = options.timeoutMs ?? exports.DEFAULT_DAEMON_COMMAND_TIMEOUT_MS;
133
+ const resolveOnce = (response) => {
134
+ /* v8 ignore next -- duplicate settlement guard; callers also guard event handlers before reaching this helper @preserve */
135
+ if (settled)
136
+ return;
137
+ settled = true;
138
+ resolve(response);
139
+ };
140
+ const rejectOnce = (error) => {
141
+ /* v8 ignore next -- duplicate timeout/error races should not re-reject the command promise @preserve */
142
+ if (settled)
143
+ return;
144
+ settled = true;
145
+ reject(error);
146
+ };
147
+ if ("setTimeout" in client && typeof client.setTimeout === "function") {
148
+ client.setTimeout(timeoutMs, () => {
149
+ const error = new Error(`Daemon command ${command.kind} timed out after ${timeoutMs}ms waiting for a response.`);
150
+ (0, runtime_1.emitNervesEvent)({
151
+ level: "error",
152
+ component: "daemon",
153
+ event: "daemon.socket_command_timeout",
154
+ message: "daemon socket command timed out",
155
+ meta: {
156
+ socketPath,
157
+ kind: command.kind,
158
+ timeoutMs,
159
+ error: error.message,
160
+ },
161
+ });
162
+ client.destroy();
163
+ rejectOnce(error);
164
+ });
165
+ }
54
166
  client.on("connect", () => {
55
- client.write(JSON.stringify(command));
56
- client.end();
167
+ // Write the command + newline delimiter. DO NOT call client.end()
168
+ // afterwards — the server closes the connection once it has written
169
+ // its response, which triggers our on("end") handler with the full
170
+ // response in `raw`.
171
+ //
172
+ // Calling client.end() here half-closes the TCP connection. The
173
+ // daemon server uses net.createServer() with the default
174
+ // allowHalfOpen: false, so when the server sees the client's FIN it
175
+ // auto-closes its own writable side — and any response the server
176
+ // tries to write after processing a long-running command (like
177
+ // agent.senseTurn, which runs a full LLM turn) gets dropped on the
178
+ // floor. Verified via repro: with client.end(), agent.senseTurn
179
+ // returns empty in ~149ms; without it, the same call returns the real
180
+ // response in ~5.8s. This is a regression of the fix in #303 that
181
+ // was silently reverted by 253e4b1f (commit titled "socket half-close
182
+ // fix" but actually *added* the half-close back).
183
+ client.write(JSON.stringify(command) + "\n");
57
184
  });
58
185
  client.on("data", (chunk) => {
59
186
  raw += chunk.toString("utf-8");
60
187
  });
61
188
  client.on("error", (error) => {
189
+ /* v8 ignore next -- duplicate post-settlement socket errors are ignored defensively @preserve */
190
+ if (settled)
191
+ return;
62
192
  (0, runtime_1.emitNervesEvent)({
63
193
  level: "error",
64
194
  component: "daemon",
@@ -70,9 +200,12 @@ function sendDaemonCommand(socketPath, command) {
70
200
  error: error.message,
71
201
  },
72
202
  });
73
- reject(error);
203
+ rejectOnce(error);
74
204
  });
75
205
  client.on("end", () => {
206
+ /* v8 ignore next -- duplicate post-settlement socket end events are ignored defensively @preserve */
207
+ if (settled)
208
+ return;
76
209
  const trimmed = raw.trim();
77
210
  if (trimmed.length === 0 && command.kind === "daemon.stop") {
78
211
  (0, runtime_1.emitNervesEvent)({
@@ -81,7 +214,7 @@ function sendDaemonCommand(socketPath, command) {
81
214
  message: "daemon socket command completed",
82
215
  meta: { socketPath, kind: command.kind, ok: true },
83
216
  });
84
- resolve({ ok: true, message: "daemon stopped" });
217
+ resolveOnce({ ok: true, message: "daemon stopped" });
85
218
  return;
86
219
  }
87
220
  if (trimmed.length === 0) {
@@ -97,7 +230,7 @@ function sendDaemonCommand(socketPath, command) {
97
230
  error: error.message,
98
231
  },
99
232
  });
100
- reject(error);
233
+ rejectOnce(error);
101
234
  return;
102
235
  }
103
236
  try {
@@ -112,7 +245,7 @@ function sendDaemonCommand(socketPath, command) {
112
245
  ok: parsed.ok,
113
246
  },
114
247
  });
115
- resolve(parsed);
248
+ resolveOnce(parsed);
116
249
  }
117
250
  catch (error) {
118
251
  (0, runtime_1.emitNervesEvent)({
@@ -126,12 +259,15 @@ function sendDaemonCommand(socketPath, command) {
126
259
  error: error instanceof Error ? error.message : String(error),
127
260
  },
128
261
  });
129
- reject(error);
262
+ rejectOnce(error);
130
263
  }
131
264
  });
132
265
  });
133
266
  }
134
267
  function checkDaemonSocketAlive(socketPath) {
268
+ if (shouldSuppressSocketCall(socketPath)) {
269
+ return Promise.resolve(false);
270
+ }
135
271
  (0, runtime_1.emitNervesEvent)({
136
272
  component: "daemon",
137
273
  event: "daemon.socket_alive_check_start",
@@ -161,8 +297,10 @@ function checkDaemonSocketAlive(socketPath) {
161
297
  });
162
298
  }
163
299
  client.on("connect", () => {
164
- client.write(JSON.stringify({ kind: "daemon.status" }));
165
- client.end();
300
+ // Same half-close rationale as sendDaemonCommand: do NOT call
301
+ // client.end() here. The server closes after responding and that
302
+ // triggers the on("end") handler below.
303
+ client.write(JSON.stringify({ kind: "daemon.status" }) + "\n");
166
304
  });
167
305
  client.on("data", (chunk) => {
168
306
  raw += chunk.toString("utf-8");
@@ -184,11 +322,21 @@ function checkDaemonSocketAlive(socketPath) {
184
322
  });
185
323
  }
186
324
  async function requestInnerWake(agent, socketPath = exports.DEFAULT_DAEMON_SOCKET_PATH) {
325
+ if (shouldSuppressSocketCall(socketPath)) {
326
+ (0, runtime_1.emitNervesEvent)({
327
+ level: "warn",
328
+ component: "daemon",
329
+ event: "daemon.inner_wake_test_blocked",
330
+ message: "blocked legacy private-runtime wake alias from leaking into real daemon under vitest",
331
+ meta: { agent, socketPath, isProductionSocket: isProductionDaemonSocket(socketPath) },
332
+ });
333
+ return null;
334
+ }
187
335
  const socketAvailable = fs.existsSync(socketPath);
188
336
  (0, runtime_1.emitNervesEvent)({
189
337
  component: "daemon",
190
338
  event: "daemon.inner_wake_request",
191
- message: "requesting daemon-managed inner wake",
339
+ message: "requesting daemon-managed legacy private-runtime wake alias",
192
340
  meta: {
193
341
  agent,
194
342
  socketPath,
@@ -200,3 +348,14 @@ async function requestInnerWake(agent, socketPath = exports.DEFAULT_DAEMON_SOCKE
200
348
  }
201
349
  return sendDaemonCommand(socketPath, { kind: "inner.wake", agent });
202
350
  }
351
+ async function requestPrivateWake(agent, socketPath = exports.DEFAULT_DAEMON_SOCKET_PATH, options = {}) {
352
+ if (shouldSuppressSocketCall(socketPath))
353
+ return null;
354
+ if (!fs.existsSync(socketPath))
355
+ return null;
356
+ return sendDaemonCommand(socketPath, {
357
+ kind: "private.wake",
358
+ agent,
359
+ ...options,
360
+ });
361
+ }
@@ -0,0 +1,113 @@
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.pruneStaleEphemeralBundles = pruneStaleEphemeralBundles;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const identity_1 = require("../identity");
40
+ const runtime_1 = require("../../nerves/runtime");
41
+ /**
42
+ * Scan the bundles root for `.ouro` directories that have no bundle contract
43
+ * or durable state markers (definitively dead ephemeral bundles) and delete
44
+ * them.
45
+ *
46
+ * Returns a list of pruned bundle directory names (e.g. `["stale.ouro"]`)
47
+ * for display purposes. Bundles that have `agent.json` -- even if disabled
48
+ * -- are never deleted. Task-doc-only bundles are also durable work state, so
49
+ * directories with state roots such as `tasks`, `desk`, `arc`, `state`, or
50
+ * `.git` are preserved. Errors on individual bundles are swallowed so that one
51
+ * permission-denied doesn't block pruning the rest.
52
+ */
53
+ function pruneStaleEphemeralBundles(deps = {}) {
54
+ const bundlesRoot = deps.bundlesRoot ?? (0, identity_1.getAgentBundlesRoot)();
55
+ const readdirSync = deps.readdirSync ?? fs.readdirSync;
56
+ const existsSync = deps.existsSync ?? fs.existsSync;
57
+ const rmSync = deps.rmSync ?? fs.rmSync;
58
+ let entries;
59
+ try {
60
+ entries = readdirSync(bundlesRoot, { withFileTypes: true });
61
+ }
62
+ catch {
63
+ return [];
64
+ }
65
+ const pruned = [];
66
+ for (const entry of entries) {
67
+ if (!entry.isDirectory() || !entry.name.endsWith(".ouro"))
68
+ continue;
69
+ const bundlePath = path.join(bundlesRoot, entry.name);
70
+ if (hasDurableBundleMarker(bundlePath, existsSync))
71
+ continue;
72
+ try {
73
+ rmSync(bundlePath, { recursive: true, force: true });
74
+ pruned.push(entry.name);
75
+ (0, runtime_1.emitNervesEvent)({
76
+ level: "info",
77
+ component: "daemon",
78
+ event: "daemon.stale_bundle_pruned",
79
+ message: `pruned stale ephemeral bundle: ${entry.name}`,
80
+ meta: { bundle: entry.name, bundlePath },
81
+ });
82
+ }
83
+ catch (error) {
84
+ (0, runtime_1.emitNervesEvent)({
85
+ level: "warn",
86
+ component: "daemon",
87
+ event: "daemon.stale_bundle_prune_error",
88
+ message: `failed to prune stale bundle: ${entry.name}`,
89
+ meta: {
90
+ bundle: entry.name,
91
+ bundlePath,
92
+ error: error instanceof Error ? error.message : String(error),
93
+ },
94
+ });
95
+ }
96
+ }
97
+ return pruned;
98
+ }
99
+ const DURABLE_BUNDLE_MARKERS = [
100
+ "agent.json",
101
+ "tasks",
102
+ "desk",
103
+ "arc",
104
+ "state",
105
+ "habits",
106
+ "friends",
107
+ "facts",
108
+ "vault",
109
+ ".git",
110
+ ];
111
+ function hasDurableBundleMarker(bundlePath, existsSync) {
112
+ return DURABLE_BUNDLE_MARKERS.some((marker) => existsSync(path.join(bundlePath, marker)));
113
+ }