@ouro.bot/cli 0.1.0-alpha.56 → 0.1.0-alpha.560

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 (392) hide show
  1. package/README.md +127 -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 +3596 -0
  13. package/dist/arc/attention-types.js +8 -0
  14. package/dist/arc/cares.js +140 -0
  15. package/dist/arc/episodes.js +117 -0
  16. package/dist/arc/intentions.js +133 -0
  17. package/dist/arc/json-store.js +117 -0
  18. package/dist/arc/obligations.js +237 -0
  19. package/dist/arc/packets.js +193 -0
  20. package/dist/arc/presence.js +185 -0
  21. package/dist/arc/task-lifecycle.js +65 -0
  22. package/dist/heart/active-work.js +837 -26
  23. package/dist/heart/agent-entry.js +58 -3
  24. package/dist/heart/attachments/image-normalize.js +194 -0
  25. package/dist/heart/attachments/materialize.js +97 -0
  26. package/dist/heart/attachments/originals.js +88 -0
  27. package/dist/heart/attachments/render.js +29 -0
  28. package/dist/heart/attachments/sources/adapter.js +2 -0
  29. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  30. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  31. package/dist/heart/attachments/sources/index.js +16 -0
  32. package/dist/heart/attachments/store.js +103 -0
  33. package/dist/heart/attachments/types.js +93 -0
  34. package/dist/heart/auth/auth-flow.js +479 -0
  35. package/dist/heart/background-operations.js +281 -0
  36. package/dist/heart/bundle-state.js +168 -0
  37. package/dist/heart/commitments.js +111 -0
  38. package/dist/heart/config-registry.js +322 -0
  39. package/dist/heart/config.js +114 -118
  40. package/dist/heart/core.js +913 -246
  41. package/dist/heart/cross-chat-delivery.js +3 -18
  42. package/dist/heart/daemon/agent-config-check.js +419 -0
  43. package/dist/heart/daemon/agent-discovery.js +102 -3
  44. package/dist/heart/daemon/agent-service.js +522 -0
  45. package/dist/heart/daemon/agentic-repair.js +547 -0
  46. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  47. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  48. package/dist/heart/daemon/cadence.js +70 -0
  49. package/dist/heart/daemon/cli-defaults.js +776 -0
  50. package/dist/heart/daemon/cli-exec.js +7457 -0
  51. package/dist/heart/daemon/cli-help.js +498 -0
  52. package/dist/heart/daemon/cli-parse.js +1592 -0
  53. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  54. package/dist/heart/daemon/cli-render.js +763 -0
  55. package/dist/heart/daemon/cli-types.js +8 -0
  56. package/dist/heart/daemon/connect-bay.js +323 -0
  57. package/dist/heart/daemon/daemon-cli.js +29 -1698
  58. package/dist/heart/daemon/daemon-entry.js +387 -2
  59. package/dist/heart/daemon/daemon-health.js +176 -0
  60. package/dist/heart/daemon/daemon-rollup.js +57 -0
  61. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  62. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  63. package/dist/heart/daemon/daemon.js +796 -71
  64. package/dist/heart/daemon/dns-workflow.js +394 -0
  65. package/dist/heart/daemon/doctor-types.js +8 -0
  66. package/dist/heart/daemon/doctor.js +826 -0
  67. package/dist/heart/daemon/health-monitor.js +122 -1
  68. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  69. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  70. package/dist/heart/daemon/http-health-probe.js +80 -0
  71. package/dist/heart/daemon/human-command-screens.js +234 -0
  72. package/dist/heart/daemon/human-readiness.js +114 -0
  73. package/dist/heart/daemon/inner-status.js +89 -0
  74. package/dist/heart/daemon/interactive-repair.js +394 -0
  75. package/dist/heart/daemon/launchd.js +37 -8
  76. package/dist/heart/daemon/log-tailer.js +82 -12
  77. package/dist/heart/daemon/logs-prune.js +110 -0
  78. package/dist/heart/daemon/mcp-canary.js +297 -0
  79. package/dist/heart/daemon/message-router.js +2 -2
  80. package/dist/heart/daemon/os-cron-deps.js +135 -0
  81. package/dist/heart/daemon/os-cron.js +14 -12
  82. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  83. package/dist/heart/daemon/ouro-entry.js +3 -1
  84. package/dist/heart/daemon/process-manager.js +375 -33
  85. package/dist/heart/daemon/provider-discovery.js +137 -0
  86. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  87. package/dist/heart/daemon/pulse.js +475 -0
  88. package/dist/heart/daemon/readiness-repair.js +365 -0
  89. package/dist/heart/daemon/run-hooks.js +2 -0
  90. package/dist/heart/daemon/runtime-logging.js +67 -16
  91. package/dist/heart/daemon/runtime-metadata.js +3 -31
  92. package/dist/heart/daemon/safe-mode.js +161 -0
  93. package/dist/heart/daemon/sense-manager.js +389 -38
  94. package/dist/heart/daemon/session-id-resolver.js +131 -0
  95. package/dist/heart/daemon/skill-management-installer.js +94 -0
  96. package/dist/heart/daemon/socket-client.js +158 -11
  97. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  98. package/dist/heart/daemon/startup-tui.js +330 -0
  99. package/dist/heart/daemon/task-scheduler.js +3 -25
  100. package/dist/heart/daemon/terminal-ui.js +499 -0
  101. package/dist/heart/daemon/thoughts.js +162 -17
  102. package/dist/heart/daemon/up-progress.js +366 -0
  103. package/dist/heart/daemon/vault-items.js +56 -0
  104. package/dist/heart/delegation.js +1 -1
  105. package/dist/heart/habits/habit-migration.js +189 -0
  106. package/dist/heart/habits/habit-parser.js +140 -0
  107. package/dist/heart/habits/habit-runtime-state.js +100 -0
  108. package/dist/heart/habits/habit-scheduler.js +372 -0
  109. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  110. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  111. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  112. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  113. package/dist/heart/identity.js +203 -57
  114. package/dist/heart/kept-notes.js +357 -0
  115. package/dist/heart/kicks.js +1 -1
  116. package/dist/heart/machine-identity.js +161 -0
  117. package/dist/heart/mail-import-discovery.js +353 -0
  118. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  119. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  120. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  121. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  122. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  123. package/dist/heart/mailbox/mailbox-http.js +99 -0
  124. package/dist/heart/mailbox/mailbox-read.js +31 -0
  125. package/dist/heart/mailbox/mailbox-types.js +27 -0
  126. package/dist/heart/mailbox/mailbox-view.js +195 -0
  127. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  128. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  129. package/dist/heart/mailbox/readers/mail.js +362 -0
  130. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  131. package/dist/heart/mailbox/readers/sessions.js +232 -0
  132. package/dist/heart/mailbox/readers/shared.js +111 -0
  133. package/dist/heart/mcp/mcp-server.js +683 -0
  134. package/dist/heart/migrate-config.js +100 -0
  135. package/dist/heart/model-capabilities.js +19 -0
  136. package/dist/heart/platform.js +81 -0
  137. package/dist/heart/provider-attempt.js +134 -0
  138. package/dist/heart/provider-binding-resolver.js +267 -0
  139. package/dist/heart/provider-credentials.js +425 -0
  140. package/dist/heart/provider-failover.js +301 -0
  141. package/dist/heart/provider-models.js +81 -0
  142. package/dist/heart/provider-ping.js +262 -0
  143. package/dist/heart/provider-readiness-cache.js +40 -0
  144. package/dist/heart/provider-visibility.js +188 -0
  145. package/dist/heart/providers/anthropic-token.js +131 -0
  146. package/dist/heart/providers/anthropic.js +139 -52
  147. package/dist/heart/providers/azure.js +97 -13
  148. package/dist/heart/providers/error-classification.js +127 -0
  149. package/dist/heart/providers/github-copilot.js +145 -0
  150. package/dist/heart/providers/minimax-vlm.js +189 -0
  151. package/dist/heart/providers/minimax.js +26 -8
  152. package/dist/heart/providers/openai-codex.js +55 -40
  153. package/dist/heart/runtime-capability-check.js +170 -0
  154. package/dist/heart/runtime-credentials.js +367 -0
  155. package/dist/heart/runtime-cwd.js +87 -0
  156. package/dist/heart/sense-truth.js +13 -4
  157. package/dist/heart/session-activity.js +43 -22
  158. package/dist/heart/session-events.js +1149 -0
  159. package/dist/heart/session-playback-cli-main.js +5 -0
  160. package/dist/heart/session-playback-cli.js +36 -0
  161. package/dist/heart/session-playback.js +231 -0
  162. package/dist/heart/session-stats-cli-main.js +5 -0
  163. package/dist/heart/session-stats.js +182 -0
  164. package/dist/heart/session-transcript.js +243 -0
  165. package/dist/heart/start-of-turn-packet.js +345 -0
  166. package/dist/heart/streaming.js +44 -27
  167. package/dist/heart/sync-classification.js +176 -0
  168. package/dist/heart/sync.js +449 -0
  169. package/dist/heart/target-resolution.js +9 -5
  170. package/dist/heart/tempo.js +93 -0
  171. package/dist/heart/temporal-view.js +41 -0
  172. package/dist/heart/timeouts.js +101 -0
  173. package/dist/heart/tool-activity-callbacks.js +59 -0
  174. package/dist/heart/tool-description.js +139 -0
  175. package/dist/heart/tool-friction.js +55 -0
  176. package/dist/heart/tool-loop.js +200 -0
  177. package/dist/heart/turn-context.js +389 -0
  178. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  179. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  180. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  181. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  182. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  183. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  184. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  185. package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
  186. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  187. package/dist/mailbox-ui/index.html +15 -0
  188. package/dist/mailroom/attention.js +167 -0
  189. package/dist/mailroom/autonomy.js +209 -0
  190. package/dist/mailroom/blob-store.js +674 -0
  191. package/dist/mailroom/body-cache.js +61 -0
  192. package/dist/mailroom/core.js +720 -0
  193. package/dist/mailroom/entry.js +160 -0
  194. package/dist/mailroom/file-store.js +430 -0
  195. package/dist/mailroom/mbox-import.js +383 -0
  196. package/dist/mailroom/outbound.js +380 -0
  197. package/dist/mailroom/policy.js +263 -0
  198. package/dist/mailroom/reader.js +233 -0
  199. package/dist/mailroom/search-cache.js +256 -0
  200. package/dist/mailroom/search-relevance.js +319 -0
  201. package/dist/mailroom/smtp-ingress.js +176 -0
  202. package/dist/mailroom/source-state.js +176 -0
  203. package/dist/mailroom/thread.js +109 -0
  204. package/dist/mailroom/travel-extract.js +89 -0
  205. package/dist/mind/bundle-manifest.js +7 -1
  206. package/dist/mind/context.js +165 -101
  207. package/dist/mind/diary-integrity.js +60 -0
  208. package/dist/mind/{memory.js → diary.js} +62 -75
  209. package/dist/mind/embedding-provider.js +60 -0
  210. package/dist/mind/file-state.js +179 -0
  211. package/dist/mind/friends/channel.js +39 -0
  212. package/dist/mind/friends/resolver.js +54 -2
  213. package/dist/mind/friends/store-file.js +39 -3
  214. package/dist/mind/friends/types.js +2 -2
  215. package/dist/mind/journal-index.js +161 -0
  216. package/dist/mind/note-search.js +268 -0
  217. package/dist/mind/obligation-steering.js +221 -0
  218. package/dist/mind/pending.js +4 -0
  219. package/dist/mind/prompt-refresh.js +3 -2
  220. package/dist/mind/prompt.js +1011 -123
  221. package/dist/mind/provenance-trust.js +26 -0
  222. package/dist/mind/scrutiny.js +173 -0
  223. package/dist/nerves/cli-logging.js +7 -1
  224. package/dist/nerves/coverage/audit-rules.js +15 -6
  225. package/dist/nerves/coverage/audit.js +28 -2
  226. package/dist/nerves/coverage/cli.js +1 -1
  227. package/dist/nerves/coverage/contract.js +5 -5
  228. package/dist/nerves/coverage/file-completeness.js +129 -5
  229. package/dist/nerves/coverage/run-artifacts.js +1 -1
  230. package/dist/nerves/event-buffer.js +111 -0
  231. package/dist/nerves/index.js +224 -4
  232. package/dist/nerves/observation.js +20 -0
  233. package/dist/nerves/redact.js +79 -0
  234. package/dist/nerves/review/cli-main.js +5 -0
  235. package/dist/nerves/review/cli.js +156 -0
  236. package/dist/nerves/review/core.js +152 -0
  237. package/dist/nerves/runtime.js +5 -1
  238. package/dist/repertoire/ado-client.js +15 -56
  239. package/dist/repertoire/ado-semantic.js +11 -10
  240. package/dist/repertoire/api-client.js +97 -0
  241. package/dist/repertoire/bitwarden-store.js +963 -0
  242. package/dist/repertoire/bundle-templates.js +72 -0
  243. package/dist/repertoire/bw-installer.js +180 -0
  244. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  245. package/dist/repertoire/coding/context-pack.js +330 -0
  246. package/dist/repertoire/coding/feedback.js +197 -30
  247. package/dist/repertoire/coding/manager.js +158 -9
  248. package/dist/repertoire/coding/spawner.js +55 -9
  249. package/dist/repertoire/coding/tools.js +170 -7
  250. package/dist/repertoire/commerce-errors.js +109 -0
  251. package/dist/repertoire/commerce-self-test.js +156 -0
  252. package/dist/repertoire/credential-access.js +178 -0
  253. package/dist/repertoire/duffel-client.js +185 -0
  254. package/dist/repertoire/github-client.js +14 -55
  255. package/dist/repertoire/graph-client.js +11 -52
  256. package/dist/repertoire/guardrails.js +396 -0
  257. package/dist/repertoire/mcp-client.js +295 -0
  258. package/dist/repertoire/mcp-manager.js +362 -0
  259. package/dist/repertoire/mcp-tools.js +63 -0
  260. package/dist/repertoire/shell-sessions.js +133 -0
  261. package/dist/repertoire/skills.js +15 -24
  262. package/dist/repertoire/stripe-client.js +131 -0
  263. package/dist/repertoire/tasks/board.js +31 -5
  264. package/dist/repertoire/tasks/fix.js +182 -0
  265. package/dist/repertoire/tasks/index.js +16 -4
  266. package/dist/repertoire/tasks/lifecycle.js +2 -2
  267. package/dist/repertoire/tasks/parser.js +3 -2
  268. package/dist/repertoire/tasks/scanner.js +194 -37
  269. package/dist/repertoire/tasks/transitions.js +16 -78
  270. package/dist/repertoire/tool-results.js +29 -0
  271. package/dist/repertoire/tools-attachments.js +317 -0
  272. package/dist/repertoire/tools-base.js +47 -1075
  273. package/dist/repertoire/tools-bluebubbles.js +1 -0
  274. package/dist/repertoire/tools-bridge.js +142 -0
  275. package/dist/repertoire/tools-bundle.js +984 -0
  276. package/dist/repertoire/tools-config.js +185 -0
  277. package/dist/repertoire/tools-continuity.js +248 -0
  278. package/dist/repertoire/tools-credential.js +381 -0
  279. package/dist/repertoire/tools-files.js +342 -0
  280. package/dist/repertoire/tools-flight.js +224 -0
  281. package/dist/repertoire/tools-flow.js +119 -0
  282. package/dist/repertoire/tools-github.js +1 -7
  283. package/dist/repertoire/tools-mail.js +1857 -0
  284. package/dist/repertoire/tools-notes.js +421 -0
  285. package/dist/repertoire/tools-session.js +750 -0
  286. package/dist/repertoire/tools-shell.js +120 -0
  287. package/dist/repertoire/tools-stripe.js +180 -0
  288. package/dist/repertoire/tools-surface.js +243 -0
  289. package/dist/repertoire/tools-teams.js +9 -39
  290. package/dist/repertoire/tools-travel.js +125 -0
  291. package/dist/repertoire/tools-trip.js +604 -0
  292. package/dist/repertoire/tools-user-profile.js +144 -0
  293. package/dist/repertoire/tools-vault.js +40 -0
  294. package/dist/repertoire/tools.js +108 -100
  295. package/dist/repertoire/travel-api-client.js +360 -0
  296. package/dist/repertoire/user-profile.js +131 -0
  297. package/dist/repertoire/vault-setup.js +246 -0
  298. package/dist/repertoire/vault-unlock.js +594 -0
  299. package/dist/scripts/claude-code-hook.js +41 -0
  300. package/dist/scripts/claude-code-stop-hook.js +47 -0
  301. package/dist/senses/attention-queue.js +116 -0
  302. package/dist/senses/bluebubbles/active-turns.js +216 -0
  303. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  304. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  305. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  306. package/dist/senses/bluebubbles/entry.js +77 -0
  307. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  308. package/dist/senses/bluebubbles/index.js +2305 -0
  309. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  310. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  311. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  312. package/dist/senses/bluebubbles/processed-log.js +133 -0
  313. package/dist/senses/bluebubbles/replay.js +137 -0
  314. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  315. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  316. package/dist/senses/cli/bracketed-paste.js +82 -0
  317. package/dist/senses/cli/image-paste.js +287 -0
  318. package/dist/senses/cli/image-ref-navigation.js +75 -0
  319. package/dist/senses/cli/ink-app.js +156 -0
  320. package/dist/senses/cli/inline-diff.js +64 -0
  321. package/dist/senses/cli/input-keys.js +174 -0
  322. package/dist/senses/cli/kill-ring.js +86 -0
  323. package/dist/senses/cli/message-list.js +51 -0
  324. package/dist/senses/cli/ouro-tui.js +607 -0
  325. package/dist/senses/cli/spinner-imperative.js +135 -0
  326. package/dist/senses/cli/spinner.js +101 -0
  327. package/dist/senses/cli/status-line.js +60 -0
  328. package/dist/senses/cli/streaming-markdown.js +526 -0
  329. package/dist/senses/cli/tool-display.js +85 -0
  330. package/dist/senses/cli/tool-render.js +85 -0
  331. package/dist/senses/cli/tui-store.js +240 -0
  332. package/dist/senses/cli/virtual-list.js +35 -0
  333. package/dist/senses/cli-entry.js +60 -8
  334. package/dist/senses/cli-layout.js +187 -0
  335. package/dist/senses/cli.js +520 -209
  336. package/dist/senses/commands.js +66 -3
  337. package/dist/senses/habit-turn-message.js +108 -0
  338. package/dist/senses/inner-dialog-worker.js +175 -21
  339. package/dist/senses/inner-dialog.js +330 -27
  340. package/dist/senses/mail-entry.js +66 -0
  341. package/dist/senses/mail.js +379 -0
  342. package/dist/senses/pipeline.js +549 -181
  343. package/dist/senses/proactive-content-guard.js +51 -0
  344. package/dist/senses/shared-turn.js +248 -0
  345. package/dist/senses/surface-tool.js +68 -0
  346. package/dist/senses/teams-entry.js +60 -8
  347. package/dist/senses/teams.js +387 -98
  348. package/dist/senses/trust-gate.js +100 -5
  349. package/dist/senses/voice/elevenlabs.js +125 -0
  350. package/dist/senses/voice/index.js +22 -0
  351. package/dist/senses/voice/transcript.js +70 -0
  352. package/dist/senses/voice/turn.js +85 -0
  353. package/dist/senses/voice/types.js +2 -0
  354. package/dist/senses/voice/whisper.js +133 -0
  355. package/dist/senses/voice-entry.js +80 -0
  356. package/dist/trips/core.js +138 -0
  357. package/dist/trips/store.js +146 -0
  358. package/package.json +38 -7
  359. package/skills/agent-commerce.md +106 -0
  360. package/skills/browser-navigation.md +117 -0
  361. package/skills/commerce-setup-guide.md +116 -0
  362. package/skills/commerce-setup.md +84 -0
  363. package/skills/configure-dev-tools.md +101 -0
  364. package/skills/travel-planning.md +138 -0
  365. package/dist/heart/daemon/auth-flow.js +0 -351
  366. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  367. package/dist/heart/daemon/subagent-installer.js +0 -166
  368. package/dist/heart/session-recall.js +0 -116
  369. package/dist/mind/associative-recall.js +0 -209
  370. package/dist/senses/bluebubbles-entry.js +0 -13
  371. package/dist/senses/bluebubbles.js +0 -1177
  372. package/dist/senses/debug-activity.js +0 -148
  373. package/subagents/README.md +0 -86
  374. package/subagents/work-doer.md +0 -237
  375. package/subagents/work-merger.md +0 -618
  376. package/subagents/work-planner.md +0 -390
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  383. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  384. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  385. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  386. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  387. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  388. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  389. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  390. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  391. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  392. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -93,6 +93,91 @@ function writeInnerPendingNotice(bundleRoot, noticeContent, nowIso) {
93
93
  fs.mkdirSync(innerPendingDir, { recursive: true });
94
94
  fs.writeFileSync(filePath, JSON.stringify(payload), "utf-8");
95
95
  }
96
+ const ACKNOWLEDGED_GROUPS_FILENAME = "acknowledged-auto-groups.json";
97
+ function acknowledgedGroupsPath(bundleRoot) {
98
+ return path.join(bundleRoot, "state", ACKNOWLEDGED_GROUPS_FILENAME);
99
+ }
100
+ function loadAcknowledgedGroupsState(bundleRoot) {
101
+ try {
102
+ const raw = fs.readFileSync(acknowledgedGroupsPath(bundleRoot), "utf-8");
103
+ if (!raw.trim())
104
+ return {};
105
+ const parsed = JSON.parse(raw);
106
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
107
+ return {};
108
+ return parsed;
109
+ }
110
+ catch {
111
+ return {};
112
+ }
113
+ }
114
+ function persistAcknowledgedGroupsState(bundleRoot, state) {
115
+ const target = acknowledgedGroupsPath(bundleRoot);
116
+ fs.mkdirSync(path.dirname(target), { recursive: true });
117
+ fs.writeFileSync(target, `${JSON.stringify(state, null, 2)}\n`, "utf-8");
118
+ }
119
+ /**
120
+ * For BlueBubbles group chats that were auto-created at stranger trust (no
121
+ * explicit operator/agent action ever bound the harness to this group), the
122
+ * gate's family-member bypass would otherwise let messages flow through
123
+ * silently and the agent would accumulate a session it has no mental model
124
+ * for. Surface the relationship as an inner-pending notice exactly once so
125
+ * the agent can categorize / rename / dismiss the group on its next turn.
126
+ *
127
+ * Returns true if a notice was written so callers can emit a telemetry event.
128
+ */
129
+ function maybeSurfaceAutoCreatedGroup(input, bundleRoot, nowIso) {
130
+ // Caller guarantees isGroupChat = true (only invoked from the family-member
131
+ // bypass branch); skip a redundant guard here.
132
+ if (input.friend.trustLevel !== "stranger")
133
+ return false;
134
+ if (!input.friend.notes?.["autoCreatedGroup"])
135
+ return false;
136
+ // loadAcknowledgedGroupsState is defensive (its own try/catch returns {})
137
+ // so we don't wrap it in another try here.
138
+ const state = loadAcknowledgedGroupsState(bundleRoot);
139
+ if (state[input.friend.id])
140
+ return false;
141
+ const noticeContent = `New BlueBubbles group "${input.friend.name}" became active without explicit acknowledgment. ` +
142
+ `It was auto-created at stranger trust the first time a message routed through it. ` +
143
+ `If you recognize the group, label or rename it (and consider promoting trust); if not, you can leave it as a stranger group or rename it for clarity. ` +
144
+ `external id: ${input.externalId}; friend id: ${input.friend.id}.`;
145
+ try {
146
+ writeInnerPendingNotice(bundleRoot, noticeContent, nowIso);
147
+ persistAcknowledgedGroupsState(bundleRoot, {
148
+ ...state,
149
+ [input.friend.id]: { surfacedAt: nowIso },
150
+ });
151
+ (0, runtime_1.emitNervesEvent)({
152
+ level: "info",
153
+ component: "senses",
154
+ event: "senses.trust_gate_group_acknowledgment_surfaced",
155
+ message: "auto-created group surfaced for agent acknowledgment",
156
+ meta: {
157
+ friendId: input.friend.id,
158
+ friendName: input.friend.name,
159
+ externalId: input.externalId,
160
+ provider: input.provider,
161
+ },
162
+ });
163
+ return true;
164
+ /* v8 ignore start -- defensive: surfacing failure must not block the gate decision @preserve */
165
+ }
166
+ catch (error) {
167
+ (0, runtime_1.emitNervesEvent)({
168
+ level: "error",
169
+ component: "senses",
170
+ event: "senses.trust_gate_error",
171
+ message: "failed to surface auto-created group for acknowledgment",
172
+ meta: {
173
+ friendId: input.friend.id,
174
+ reason: error instanceof Error ? error.message : String(error),
175
+ },
176
+ });
177
+ return false;
178
+ }
179
+ /* v8 ignore stop */
180
+ }
96
181
  function enforceTrustGate(input) {
97
182
  const { senseType } = input;
98
183
  // Local (CLI) and internal (inner dialog) — always allow
@@ -104,6 +189,20 @@ function enforceTrustGate(input) {
104
189
  return { allowed: true };
105
190
  }
106
191
  // Open senses (BlueBubbles/iMessage) — enforce trust rules
192
+ // Group chat with a family member present — allow regardless of trust level.
193
+ // BUT if this is an auto-created stranger group (the harness picked it up
194
+ // silently via the family-member shortcut and the agent never explicitly
195
+ // acknowledged it), surface a one-time inner-pending notice so the agent
196
+ // gets a chance to categorize / rename / dismiss the relationship instead
197
+ // of accumulating activity invisibly.
198
+ if (input.isGroupChat && input.groupHasFamilyMember) {
199
+ /* v8 ignore start -- defaults shared with the rest of the gate; tested via the stranger-trust path */
200
+ const bundleRoot = input.bundleRoot ?? (0, identity_1.getAgentRoot)();
201
+ const nowIso = (input.now ?? (() => new Date()))().toISOString();
202
+ /* v8 ignore stop */
203
+ maybeSurfaceAutoCreatedGroup(input, bundleRoot, nowIso);
204
+ return { allowed: true };
205
+ }
107
206
  const trustLevel = input.friend.trustLevel ?? "friend";
108
207
  // Family and friend — always allow on open
109
208
  if ((0, types_1.isTrustedLevel)(trustLevel)) {
@@ -119,11 +218,7 @@ function enforceTrustGate(input) {
119
218
  return handleStranger(input, bundleRoot, nowIso);
120
219
  }
121
220
  function handleAcquaintance(input, bundleRoot, nowIso) {
122
- const { isGroupChat, groupHasFamilyMember, hasExistingGroupWithFamily } = input;
123
- // Group chat with family member present — allow
124
- if (isGroupChat && groupHasFamilyMember) {
125
- return { allowed: true };
126
- }
221
+ const { isGroupChat, hasExistingGroupWithFamily } = input;
127
222
  let result;
128
223
  let noticeDetail;
129
224
  if (isGroupChat) {
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_ELEVENLABS_MIME_TYPE = exports.DEFAULT_ELEVENLABS_OUTPUT_FORMAT = exports.DEFAULT_ELEVENLABS_MODEL_ID = void 0;
4
+ exports.createElevenLabsTtsClient = createElevenLabsTtsClient;
5
+ const runtime_1 = require("../../nerves/runtime");
6
+ exports.DEFAULT_ELEVENLABS_MODEL_ID = "eleven_flash_v2_5";
7
+ exports.DEFAULT_ELEVENLABS_OUTPUT_FORMAT = "pcm_16000";
8
+ exports.DEFAULT_ELEVENLABS_MIME_TYPE = "audio/pcm;rate=16000";
9
+ function cleanTtsText(text) {
10
+ return text.replace(/\s+/g, " ").trim();
11
+ }
12
+ function elevenLabsStreamUrl(voiceId, modelId, outputFormat) {
13
+ const params = new URLSearchParams({ model_id: modelId, output_format: outputFormat });
14
+ return `wss://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(voiceId)}/stream-input?${params.toString()}`;
15
+ }
16
+ function payloadText(payload) {
17
+ if (typeof payload === "string")
18
+ return payload;
19
+ if (Buffer.isBuffer(payload))
20
+ return payload.toString("utf8");
21
+ return String(payload ?? "");
22
+ }
23
+ function createElevenLabsTtsClient(options) {
24
+ const modelId = options.modelId ?? exports.DEFAULT_ELEVENLABS_MODEL_ID;
25
+ const outputFormat = options.outputFormat ?? exports.DEFAULT_ELEVENLABS_OUTPUT_FORMAT;
26
+ const mimeType = outputFormat === exports.DEFAULT_ELEVENLABS_OUTPUT_FORMAT
27
+ ? exports.DEFAULT_ELEVENLABS_MIME_TYPE
28
+ : "audio/mpeg";
29
+ return {
30
+ async synthesize(request) {
31
+ const text = cleanTtsText(request.text);
32
+ if (!text) {
33
+ (0, runtime_1.emitNervesEvent)({
34
+ level: "error",
35
+ component: "senses",
36
+ event: "senses.voice_tts_error",
37
+ message: "voice TTS text is empty",
38
+ meta: { utteranceId: request.utteranceId },
39
+ });
40
+ throw new Error("voice TTS text is empty");
41
+ }
42
+ const url = elevenLabsStreamUrl(options.voiceId, modelId, outputFormat);
43
+ const socket = options.socketFactory(url);
44
+ const chunks = [];
45
+ (0, runtime_1.emitNervesEvent)({
46
+ component: "senses",
47
+ event: "senses.voice_tts_start",
48
+ message: "starting ElevenLabs TTS",
49
+ meta: { utteranceId: request.utteranceId, modelId, voiceId: options.voiceId },
50
+ });
51
+ return new Promise((resolve, reject) => {
52
+ let settled = false;
53
+ const fail = (error) => {
54
+ if (settled)
55
+ return;
56
+ settled = true;
57
+ const message = error instanceof Error ? error.message : String(error);
58
+ (0, runtime_1.emitNervesEvent)({
59
+ level: "error",
60
+ component: "senses",
61
+ event: "senses.voice_tts_error",
62
+ message: "ElevenLabs TTS failed",
63
+ meta: { utteranceId: request.utteranceId, error: message },
64
+ });
65
+ reject(new Error(`ElevenLabs TTS failed: ${message}`));
66
+ };
67
+ const finish = () => {
68
+ if (settled)
69
+ return;
70
+ settled = true;
71
+ const audio = Buffer.concat(chunks);
72
+ (0, runtime_1.emitNervesEvent)({
73
+ component: "senses",
74
+ event: "senses.voice_tts_end",
75
+ message: "finished ElevenLabs TTS",
76
+ meta: { utteranceId: request.utteranceId, chunkCount: chunks.length, byteLength: audio.byteLength },
77
+ });
78
+ socket.close();
79
+ resolve({
80
+ utteranceId: request.utteranceId,
81
+ audio,
82
+ byteLength: audio.byteLength,
83
+ chunkCount: chunks.length,
84
+ modelId,
85
+ voiceId: options.voiceId,
86
+ mimeType,
87
+ });
88
+ };
89
+ socket.on("open", () => {
90
+ socket.send(JSON.stringify({
91
+ text: " ",
92
+ xi_api_key: options.apiKey,
93
+ voice_settings: {
94
+ stability: 0.5,
95
+ similarity_boost: 0.8,
96
+ use_speaker_boost: true,
97
+ },
98
+ }));
99
+ socket.send(JSON.stringify({ text, try_trigger_generation: true }));
100
+ socket.send(JSON.stringify({ text: "" }));
101
+ });
102
+ socket.on("message", (payload) => {
103
+ try {
104
+ const parsed = JSON.parse(payloadText(payload));
105
+ if (typeof parsed.audio === "string" && parsed.audio.length > 0) {
106
+ chunks.push(Buffer.from(parsed.audio, "base64"));
107
+ }
108
+ if (parsed.isFinal === true) {
109
+ finish();
110
+ }
111
+ }
112
+ catch (error) {
113
+ fail(error);
114
+ }
115
+ });
116
+ socket.on("error", fail);
117
+ socket.on("close", () => {
118
+ if (!settled) {
119
+ fail(new Error("socket closed before final audio"));
120
+ }
121
+ });
122
+ });
123
+ },
124
+ };
125
+ }
@@ -0,0 +1,22 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ /* v8 ignore file -- barrel exports only; executable voice helpers are covered directly. @preserve */
18
+ __exportStar(require("./types"), exports);
19
+ __exportStar(require("./transcript"), exports);
20
+ __exportStar(require("./whisper"), exports);
21
+ __exportStar(require("./elevenlabs"), exports);
22
+ __exportStar(require("./turn"), exports);
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildVoiceTranscript = buildVoiceTranscript;
4
+ exports.transcriptToPromptText = transcriptToPromptText;
5
+ exports.normalizeVoiceSessionKey = normalizeVoiceSessionKey;
6
+ const runtime_1 = require("../../nerves/runtime");
7
+ function compactSpeechText(text) {
8
+ return text.replace(/\s+/g, " ").trim();
9
+ }
10
+ function buildVoiceTranscript(input) {
11
+ const text = compactSpeechText(input.text);
12
+ if (!text) {
13
+ (0, runtime_1.emitNervesEvent)({
14
+ level: "error",
15
+ component: "senses",
16
+ event: "senses.voice_transcript_error",
17
+ message: "voice transcript text is empty",
18
+ meta: { utteranceId: input.utteranceId },
19
+ });
20
+ throw new Error("voice transcript text is empty");
21
+ }
22
+ const transcript = {
23
+ utteranceId: input.utteranceId,
24
+ text,
25
+ source: input.source,
26
+ audioPath: input.audioPath ?? null,
27
+ language: input.language ?? null,
28
+ startedAt: input.startedAt ?? null,
29
+ endedAt: input.endedAt ?? null,
30
+ };
31
+ (0, runtime_1.emitNervesEvent)({
32
+ component: "senses",
33
+ event: "senses.voice_transcript_built",
34
+ message: "built voice transcript",
35
+ meta: { utteranceId: transcript.utteranceId, source: transcript.source, length: transcript.text.length },
36
+ });
37
+ return transcript;
38
+ }
39
+ function transcriptToPromptText(transcript) {
40
+ const text = compactSpeechText(transcript.text);
41
+ if (!text) {
42
+ (0, runtime_1.emitNervesEvent)({
43
+ level: "error",
44
+ component: "senses",
45
+ event: "senses.voice_transcript_error",
46
+ message: "voice prompt text is empty",
47
+ meta: { utteranceId: transcript.utteranceId },
48
+ });
49
+ throw new Error("voice transcript text is empty");
50
+ }
51
+ return text;
52
+ }
53
+ function normalizeVoiceSessionKey(value) {
54
+ const normalized = value
55
+ .trim()
56
+ .toLowerCase()
57
+ .replace(/[^a-z0-9]+/g, "-")
58
+ .replace(/^-+|-+$/g, "");
59
+ if (!normalized) {
60
+ (0, runtime_1.emitNervesEvent)({
61
+ level: "error",
62
+ component: "senses",
63
+ event: "senses.voice_transcript_error",
64
+ message: "voice session key is empty",
65
+ meta: { inputLength: value.length },
66
+ });
67
+ throw new Error("voice session key is empty");
68
+ }
69
+ return normalized;
70
+ }
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runVoiceLoopbackTurn = runVoiceLoopbackTurn;
4
+ const runtime_1 = require("../../nerves/runtime");
5
+ const shared_turn_1 = require("../shared-turn");
6
+ const transcript_1 = require("./transcript");
7
+ async function runVoiceLoopbackTurn(options) {
8
+ const runSenseTurn = options.runSenseTurn ?? shared_turn_1.runSenseTurn;
9
+ let userMessage;
10
+ try {
11
+ userMessage = (0, transcript_1.transcriptToPromptText)(options.transcript);
12
+ }
13
+ catch (error) {
14
+ (0, runtime_1.emitNervesEvent)({
15
+ level: "error",
16
+ component: "senses",
17
+ event: "senses.voice_turn_error",
18
+ message: "voice turn rejected transcript",
19
+ meta: { utteranceId: options.transcript.utteranceId, error: error instanceof Error ? error.message : String(error) },
20
+ });
21
+ throw error;
22
+ }
23
+ (0, runtime_1.emitNervesEvent)({
24
+ component: "senses",
25
+ event: "senses.voice_turn_start",
26
+ message: "starting voice loopback turn",
27
+ meta: {
28
+ agentName: options.agentName,
29
+ friendId: options.friendId,
30
+ sessionKey: options.sessionKey,
31
+ utteranceId: options.transcript.utteranceId,
32
+ },
33
+ });
34
+ const turn = await runSenseTurn({
35
+ agentName: options.agentName,
36
+ channel: "voice",
37
+ friendId: options.friendId,
38
+ sessionKey: options.sessionKey,
39
+ userMessage,
40
+ });
41
+ try {
42
+ const spoken = await options.tts.synthesize({
43
+ utteranceId: options.transcript.utteranceId,
44
+ text: turn.response,
45
+ });
46
+ const result = {
47
+ responseText: turn.response,
48
+ ponderDeferred: turn.ponderDeferred,
49
+ tts: {
50
+ status: "delivered",
51
+ audio: spoken.audio,
52
+ byteLength: spoken.byteLength,
53
+ chunkCount: spoken.chunkCount,
54
+ mimeType: spoken.mimeType,
55
+ modelId: spoken.modelId,
56
+ voiceId: spoken.voiceId,
57
+ },
58
+ };
59
+ (0, runtime_1.emitNervesEvent)({
60
+ component: "senses",
61
+ event: "senses.voice_turn_end",
62
+ message: "voice loopback turn delivered speech",
63
+ meta: { utteranceId: options.transcript.utteranceId, responseLength: turn.response.length, byteLength: spoken.byteLength },
64
+ });
65
+ return result;
66
+ }
67
+ catch (error) {
68
+ const message = error instanceof Error ? error.message : String(error);
69
+ (0, runtime_1.emitNervesEvent)({
70
+ level: "error",
71
+ component: "senses",
72
+ event: "senses.voice_turn_tts_error",
73
+ message: "voice loopback TTS failed after text response",
74
+ meta: { utteranceId: options.transcript.utteranceId, error: message, responseLength: turn.response.length },
75
+ });
76
+ return {
77
+ responseText: turn.response,
78
+ ponderDeferred: turn.ponderDeferred,
79
+ tts: {
80
+ status: "failed",
81
+ error: message,
82
+ },
83
+ };
84
+ }
85
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,133 @@
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.parseWhisperCppTranscriptJson = parseWhisperCppTranscriptJson;
37
+ exports.createWhisperCppTranscriber = createWhisperCppTranscriber;
38
+ const fs = __importStar(require("fs/promises"));
39
+ const os = __importStar(require("os"));
40
+ const path = __importStar(require("path"));
41
+ const runtime_1 = require("../../nerves/runtime");
42
+ const transcript_1 = require("./transcript");
43
+ function parseWhisperCppTranscriptJson(raw) {
44
+ let parsed;
45
+ try {
46
+ parsed = JSON.parse(raw);
47
+ }
48
+ catch (error) {
49
+ throw new Error(`invalid whisper.cpp JSON: ${String(error)}`);
50
+ }
51
+ const text = typeof parsed.text === "string"
52
+ ? parsed.text.trim()
53
+ : Array.isArray(parsed.transcription)
54
+ ? parsed.transcription
55
+ .map((entry) => typeof entry.text === "string" ? entry.text.trim() : "")
56
+ .filter(Boolean)
57
+ .join(" ")
58
+ .trim()
59
+ : "";
60
+ if (!text) {
61
+ throw new Error("empty whisper.cpp transcript");
62
+ }
63
+ return text;
64
+ }
65
+ async function defaultMakeTempDir() {
66
+ return fs.mkdtemp(path.join(os.tmpdir(), "ouro-voice-whisper-"));
67
+ }
68
+ async function defaultRemoveDir(dir) {
69
+ await fs.rm(dir, { recursive: true, force: true });
70
+ }
71
+ function createWhisperCppTranscriber(options) {
72
+ const timeoutMs = options.timeoutMs ?? 120_000;
73
+ const readFile = options.readFile ?? fs.readFile;
74
+ const makeTempDir = options.makeTempDir ?? defaultMakeTempDir;
75
+ const removeDir = options.removeDir ?? defaultRemoveDir;
76
+ return {
77
+ async transcribe(request) {
78
+ const workDir = await makeTempDir();
79
+ const outputBase = path.join(workDir, "transcript");
80
+ const args = [
81
+ "-m",
82
+ options.modelPath,
83
+ "-f",
84
+ request.audioPath,
85
+ "-oj",
86
+ "-of",
87
+ outputBase,
88
+ ...(request.language ? ["-l", request.language] : []),
89
+ ];
90
+ (0, runtime_1.emitNervesEvent)({
91
+ component: "senses",
92
+ event: "senses.voice_stt_start",
93
+ message: "starting Whisper.cpp transcription",
94
+ meta: { utteranceId: request.utteranceId, audioPath: request.audioPath },
95
+ });
96
+ try {
97
+ const result = await options.processRunner(options.whisperCliPath, args, { timeoutMs });
98
+ if (typeof result.exitCode === "number" && result.exitCode !== 0) {
99
+ throw new Error(`exit ${result.exitCode}${result.stderr ? `: ${result.stderr}` : ""}`);
100
+ }
101
+ const raw = await readFile(`${outputBase}.json`, "utf8");
102
+ const text = parseWhisperCppTranscriptJson(raw);
103
+ const transcript = (0, transcript_1.buildVoiceTranscript)({
104
+ utteranceId: request.utteranceId,
105
+ text,
106
+ audioPath: request.audioPath,
107
+ language: request.language,
108
+ source: "whisper.cpp",
109
+ });
110
+ (0, runtime_1.emitNervesEvent)({
111
+ component: "senses",
112
+ event: "senses.voice_stt_end",
113
+ message: "finished Whisper.cpp transcription",
114
+ meta: { utteranceId: request.utteranceId, length: transcript.text.length },
115
+ });
116
+ return transcript;
117
+ }
118
+ catch (error) {
119
+ (0, runtime_1.emitNervesEvent)({
120
+ level: "error",
121
+ component: "senses",
122
+ event: "senses.voice_stt_error",
123
+ message: "Whisper.cpp transcription failed",
124
+ meta: { utteranceId: request.utteranceId, error: error instanceof Error ? error.message : String(error) },
125
+ });
126
+ throw new Error(`whisper.cpp transcription failed: ${error instanceof Error ? error.message : String(error)}`);
127
+ }
128
+ finally {
129
+ await removeDir(workDir);
130
+ }
131
+ },
132
+ };
133
+ }
@@ -0,0 +1,80 @@
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
+ const agentArgIndex = process.argv.indexOf("--agent");
37
+ const agentName = agentArgIndex >= 0 ? process.argv[agentArgIndex + 1] : undefined;
38
+ if (!agentName) {
39
+ // eslint-disable-next-line no-console -- pre-boot guard: --agent check before imports
40
+ console.error("Missing required --agent <name> argument.\nUsage: node dist/senses/voice-entry.js --agent ouroboros");
41
+ process.exit(1);
42
+ }
43
+ const runtime_logging_1 = require("../heart/daemon/runtime-logging");
44
+ const runtime_1 = require("../nerves/runtime");
45
+ (0, runtime_logging_1.configureDaemonRuntimeLogger)("voice");
46
+ (0, runtime_1.emitNervesEvent)({
47
+ component: "senses",
48
+ event: "senses.entry_boot",
49
+ message: "booting Voice entrypoint",
50
+ meta: { entry: "voice", agentName },
51
+ });
52
+ Promise.resolve().then(() => __importStar(require("../heart/runtime-credentials"))).then(async ({ readMachineRuntimeCredentialConfig, refreshMachineRuntimeCredentialConfig, refreshRuntimeCredentialConfig, waitForRuntimeCredentialBootstrap, }) => {
53
+ await waitForRuntimeCredentialBootstrap(agentName);
54
+ const { loadOrCreateMachineIdentity } = await Promise.resolve().then(() => __importStar(require("../heart/machine-identity")));
55
+ const machine = loadOrCreateMachineIdentity();
56
+ const machineConfig = readMachineRuntimeCredentialConfig(agentName);
57
+ if (!machineConfig.ok) {
58
+ await refreshMachineRuntimeCredentialConfig(agentName, machine.machineId, { preserveCachedOnFailure: true }).catch(() => undefined);
59
+ }
60
+ void refreshRuntimeCredentialConfig(agentName, { preserveCachedOnFailure: true }).catch(() => undefined);
61
+ (0, runtime_1.emitNervesEvent)({
62
+ component: "senses",
63
+ event: "senses.voice_entry_ready",
64
+ message: "Voice entrypoint is ready for managed voice turns",
65
+ meta: { entry: "voice", agentName, machineId: machine.machineId },
66
+ });
67
+ setInterval(() => undefined, 60_000);
68
+ })
69
+ .catch((error) => {
70
+ (0, runtime_1.emitNervesEvent)({
71
+ level: "error",
72
+ component: "senses",
73
+ event: "senses.entry_error",
74
+ message: "Voice entrypoint failed",
75
+ meta: { entry: "voice", agentName, error: error instanceof Error ? error.message : String(error) },
76
+ });
77
+ // eslint-disable-next-line no-console -- fatal startup guard for sense process
78
+ console.error(error instanceof Error ? error.message : String(error));
79
+ process.exit(1);
80
+ });