@ouro.bot/cli 0.1.0-alpha.61 → 0.1.0-alpha.612

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 (418) 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 +3912 -0
  13. package/dist/arc/attention-types.js +8 -0
  14. package/dist/arc/cares.js +144 -0
  15. package/dist/arc/episodes.js +118 -0
  16. package/dist/arc/intentions.js +134 -0
  17. package/dist/arc/json-store.js +117 -0
  18. package/dist/arc/obligations.js +266 -0
  19. package/dist/arc/packets.js +194 -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 +69 -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/awaiting/await-alert.js +146 -0
  36. package/dist/heart/awaiting/await-expiry.js +108 -0
  37. package/dist/heart/awaiting/await-loader.js +91 -0
  38. package/dist/heart/awaiting/await-parser.js +141 -0
  39. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  40. package/dist/heart/awaiting/await-scheduler.js +377 -0
  41. package/dist/heart/background-operations.js +281 -0
  42. package/dist/heart/bridges/store.js +14 -2
  43. package/dist/heart/bundle-state.js +168 -0
  44. package/dist/heart/commitments.js +142 -0
  45. package/dist/heart/config-registry.js +322 -0
  46. package/dist/heart/config.js +114 -119
  47. package/dist/heart/core.js +909 -246
  48. package/dist/heart/cross-chat-delivery.js +3 -18
  49. package/dist/heart/daemon/agent-config-check.js +419 -0
  50. package/dist/heart/daemon/agent-discovery.js +102 -3
  51. package/dist/heart/daemon/agent-service.js +522 -0
  52. package/dist/heart/daemon/agentic-repair.js +547 -0
  53. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  54. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  55. package/dist/heart/daemon/cadence.js +70 -0
  56. package/dist/heart/daemon/cli-defaults.js +776 -0
  57. package/dist/heart/daemon/cli-exec.js +7579 -0
  58. package/dist/heart/daemon/cli-help.js +498 -0
  59. package/dist/heart/daemon/cli-parse.js +1599 -0
  60. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  61. package/dist/heart/daemon/cli-render.js +763 -0
  62. package/dist/heart/daemon/cli-types.js +8 -0
  63. package/dist/heart/daemon/connect-bay.js +323 -0
  64. package/dist/heart/daemon/daemon-cli.js +29 -1700
  65. package/dist/heart/daemon/daemon-entry.js +485 -2
  66. package/dist/heart/daemon/daemon-health.js +176 -0
  67. package/dist/heart/daemon/daemon-rollup.js +57 -0
  68. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  69. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  70. package/dist/heart/daemon/daemon.js +904 -70
  71. package/dist/heart/daemon/dns-workflow.js +394 -0
  72. package/dist/heart/daemon/doctor-types.js +8 -0
  73. package/dist/heart/daemon/doctor.js +873 -0
  74. package/dist/heart/daemon/health-monitor.js +122 -1
  75. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  76. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  77. package/dist/heart/daemon/http-health-probe.js +80 -0
  78. package/dist/heart/daemon/human-command-screens.js +234 -0
  79. package/dist/heart/daemon/human-readiness.js +114 -0
  80. package/dist/heart/daemon/inner-status.js +89 -0
  81. package/dist/heart/daemon/interactive-repair.js +394 -0
  82. package/dist/heart/daemon/launchd.js +37 -8
  83. package/dist/heart/daemon/log-tailer.js +78 -9
  84. package/dist/heart/daemon/logs-prune.js +110 -0
  85. package/dist/heart/daemon/mcp-canary.js +297 -0
  86. package/dist/heart/daemon/os-cron-deps.js +135 -0
  87. package/dist/heart/daemon/os-cron.js +14 -12
  88. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  89. package/dist/heart/daemon/ouro-entry.js +3 -1
  90. package/dist/heart/daemon/process-manager.js +463 -34
  91. package/dist/heart/daemon/provider-discovery.js +137 -0
  92. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  93. package/dist/heart/daemon/pulse.js +475 -0
  94. package/dist/heart/daemon/readiness-repair.js +365 -0
  95. package/dist/heart/daemon/run-hooks.js +2 -0
  96. package/dist/heart/daemon/runtime-logging.js +10 -2
  97. package/dist/heart/daemon/runtime-metadata.js +2 -30
  98. package/dist/heart/daemon/safe-mode.js +161 -0
  99. package/dist/heart/daemon/sense-manager.js +493 -38
  100. package/dist/heart/daemon/session-id-resolver.js +131 -0
  101. package/dist/heart/daemon/skill-management-installer.js +28 -7
  102. package/dist/heart/daemon/socket-client.js +158 -11
  103. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  104. package/dist/heart/daemon/startup-tui.js +330 -0
  105. package/dist/heart/daemon/task-scheduler.js +3 -25
  106. package/dist/heart/daemon/terminal-ui.js +499 -0
  107. package/dist/heart/daemon/thoughts.js +229 -17
  108. package/dist/heart/daemon/up-progress.js +366 -0
  109. package/dist/heart/daemon/vault-items.js +56 -0
  110. package/dist/heart/delegation.js +1 -1
  111. package/dist/heart/habits/habit-migration.js +189 -0
  112. package/dist/heart/habits/habit-parser.js +140 -0
  113. package/dist/heart/habits/habit-runtime-state.js +100 -0
  114. package/dist/heart/habits/habit-scheduler.js +372 -0
  115. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  116. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  117. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  118. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  119. package/dist/heart/identity.js +166 -55
  120. package/dist/heart/kept-notes.js +357 -0
  121. package/dist/heart/kicks.js +1 -1
  122. package/dist/heart/machine-identity.js +161 -0
  123. package/dist/heart/mail-import-discovery.js +353 -0
  124. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  125. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  126. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  127. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  128. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  129. package/dist/heart/mailbox/mailbox-http.js +99 -0
  130. package/dist/heart/mailbox/mailbox-read.js +31 -0
  131. package/dist/heart/mailbox/mailbox-types.js +27 -0
  132. package/dist/heart/mailbox/mailbox-view.js +197 -0
  133. package/dist/heart/mailbox/readers/agent-machine.js +425 -0
  134. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  135. package/dist/heart/mailbox/readers/mail.js +375 -0
  136. package/dist/heart/mailbox/readers/runtime-readers.js +756 -0
  137. package/dist/heart/mailbox/readers/sessions.js +232 -0
  138. package/dist/heart/mailbox/readers/shared.js +111 -0
  139. package/dist/heart/mcp/mcp-server.js +656 -0
  140. package/dist/heart/migrate-config.js +100 -0
  141. package/dist/heart/model-capabilities.js +19 -0
  142. package/dist/heart/platform.js +81 -0
  143. package/dist/heart/provider-attempt.js +134 -0
  144. package/dist/heart/provider-binding-resolver.js +267 -0
  145. package/dist/heart/provider-credentials.js +425 -0
  146. package/dist/heart/provider-failover.js +301 -0
  147. package/dist/heart/provider-models.js +81 -0
  148. package/dist/heart/provider-ping.js +262 -0
  149. package/dist/heart/provider-readiness-cache.js +40 -0
  150. package/dist/heart/provider-visibility.js +188 -0
  151. package/dist/heart/providers/anthropic-token.js +131 -0
  152. package/dist/heart/providers/anthropic.js +139 -52
  153. package/dist/heart/providers/azure.js +23 -11
  154. package/dist/heart/providers/error-classification.js +127 -0
  155. package/dist/heart/providers/github-copilot.js +145 -0
  156. package/dist/heart/providers/minimax-vlm.js +189 -0
  157. package/dist/heart/providers/minimax.js +26 -8
  158. package/dist/heart/providers/openai-codex.js +55 -40
  159. package/dist/heart/runtime-capability-check.js +170 -0
  160. package/dist/heart/runtime-credentials.js +367 -0
  161. package/dist/heart/runtime-cwd.js +87 -0
  162. package/dist/heart/sense-truth.js +13 -4
  163. package/dist/heart/session-activity.js +48 -24
  164. package/dist/heart/session-events.js +1156 -0
  165. package/dist/heart/session-playback-cli-main.js +5 -0
  166. package/dist/heart/session-playback-cli.js +36 -0
  167. package/dist/heart/session-playback.js +231 -0
  168. package/dist/heart/session-stats-cli-main.js +5 -0
  169. package/dist/heart/session-stats.js +182 -0
  170. package/dist/heart/session-transcript.js +133 -0
  171. package/dist/heart/start-of-turn-packet.js +345 -0
  172. package/dist/heart/streaming.js +44 -27
  173. package/dist/heart/sync-classification.js +176 -0
  174. package/dist/heart/sync.js +449 -0
  175. package/dist/heart/target-resolution.js +9 -5
  176. package/dist/heart/tempo.js +93 -0
  177. package/dist/heart/temporal-view.js +41 -0
  178. package/dist/heart/timeouts.js +101 -0
  179. package/dist/heart/tool-activity-callbacks.js +59 -0
  180. package/dist/heart/tool-description.js +143 -0
  181. package/dist/heart/tool-friction.js +55 -0
  182. package/dist/heart/tool-loop.js +200 -0
  183. package/dist/heart/turn-context.js +421 -0
  184. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  185. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  186. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  187. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  188. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  189. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  190. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  191. package/dist/mailbox-ui/assets/index-9-AxCxuB.js +61 -0
  192. package/dist/mailbox-ui/assets/index-CWzt267f.css +1 -0
  193. package/dist/mailbox-ui/index.html +15 -0
  194. package/dist/mailroom/attention.js +167 -0
  195. package/dist/mailroom/autonomy.js +209 -0
  196. package/dist/mailroom/blob-store.js +712 -0
  197. package/dist/mailroom/body-cache.js +61 -0
  198. package/dist/mailroom/core.js +788 -0
  199. package/dist/mailroom/entry.js +160 -0
  200. package/dist/mailroom/file-store.js +460 -0
  201. package/dist/mailroom/mbox-import.js +393 -0
  202. package/dist/mailroom/migration.js +164 -0
  203. package/dist/mailroom/outbound.js +380 -0
  204. package/dist/mailroom/policy.js +263 -0
  205. package/dist/mailroom/reader.js +233 -0
  206. package/dist/mailroom/search-cache.js +268 -0
  207. package/dist/mailroom/search-relevance.js +319 -0
  208. package/dist/mailroom/smtp-ingress.js +176 -0
  209. package/dist/mailroom/source-state.js +176 -0
  210. package/dist/mailroom/thread.js +109 -0
  211. package/dist/mailroom/travel-extract.js +89 -0
  212. package/dist/mind/bundle-manifest.js +7 -1
  213. package/dist/mind/context.js +250 -101
  214. package/dist/mind/diary-integrity.js +60 -0
  215. package/dist/mind/{memory.js → diary.js} +68 -76
  216. package/dist/mind/embedding-provider.js +60 -0
  217. package/dist/mind/file-state.js +179 -0
  218. package/dist/mind/friends/channel.js +39 -0
  219. package/dist/mind/friends/resolver.js +54 -2
  220. package/dist/mind/friends/store-file.js +48 -4
  221. package/dist/mind/friends/types.js +2 -2
  222. package/dist/mind/journal-index.js +162 -0
  223. package/dist/mind/note-search.js +268 -0
  224. package/dist/mind/obligation-steering.js +221 -0
  225. package/dist/mind/pending.js +6 -1
  226. package/dist/mind/prompt-refresh.js +3 -2
  227. package/dist/mind/prompt.js +1051 -135
  228. package/dist/mind/provenance-trust.js +26 -0
  229. package/dist/mind/scrutiny.js +173 -0
  230. package/dist/nerves/cli-logging.js +7 -1
  231. package/dist/nerves/coverage/audit-rules.js +15 -6
  232. package/dist/nerves/coverage/audit.js +28 -2
  233. package/dist/nerves/coverage/cli.js +1 -1
  234. package/dist/nerves/coverage/contract.js +5 -5
  235. package/dist/nerves/coverage/file-completeness.js +129 -5
  236. package/dist/nerves/event-buffer.js +111 -0
  237. package/dist/nerves/index.js +224 -4
  238. package/dist/nerves/observation.js +20 -0
  239. package/dist/nerves/redact.js +79 -0
  240. package/dist/nerves/review/cli-main.js +5 -0
  241. package/dist/nerves/review/cli.js +156 -0
  242. package/dist/nerves/review/core.js +152 -0
  243. package/dist/nerves/runtime.js +5 -1
  244. package/dist/repertoire/ado-client.js +15 -56
  245. package/dist/repertoire/ado-semantic.js +11 -10
  246. package/dist/repertoire/api-client.js +97 -0
  247. package/dist/repertoire/bitwarden-store.js +997 -0
  248. package/dist/repertoire/bundle-templates.js +72 -0
  249. package/dist/repertoire/bw-installer.js +180 -0
  250. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  251. package/dist/repertoire/coding/context-pack.js +331 -0
  252. package/dist/repertoire/coding/feedback.js +197 -30
  253. package/dist/repertoire/coding/manager.js +163 -10
  254. package/dist/repertoire/coding/spawner.js +55 -9
  255. package/dist/repertoire/coding/tools.js +170 -7
  256. package/dist/repertoire/commerce-errors.js +109 -0
  257. package/dist/repertoire/commerce-self-test.js +156 -0
  258. package/dist/repertoire/credential-access.js +178 -0
  259. package/dist/repertoire/duffel-client.js +185 -0
  260. package/dist/repertoire/github-client.js +14 -55
  261. package/dist/repertoire/graph-client.js +11 -52
  262. package/dist/repertoire/guardrails.js +396 -0
  263. package/dist/repertoire/mcp-client.js +295 -0
  264. package/dist/repertoire/mcp-manager.js +362 -0
  265. package/dist/repertoire/mcp-tools.js +63 -0
  266. package/dist/repertoire/shell-sessions.js +133 -0
  267. package/dist/repertoire/skills.js +18 -4
  268. package/dist/repertoire/stripe-client.js +131 -0
  269. package/dist/repertoire/tasks/board.js +31 -5
  270. package/dist/repertoire/tasks/fix.js +182 -0
  271. package/dist/repertoire/tasks/index.js +16 -4
  272. package/dist/repertoire/tasks/lifecycle.js +2 -2
  273. package/dist/repertoire/tasks/parser.js +3 -2
  274. package/dist/repertoire/tasks/scanner.js +194 -37
  275. package/dist/repertoire/tasks/transitions.js +16 -78
  276. package/dist/repertoire/tool-results.js +29 -0
  277. package/dist/repertoire/tools-attachments.js +317 -0
  278. package/dist/repertoire/tools-awaiting.js +365 -0
  279. package/dist/repertoire/tools-base.js +55 -1082
  280. package/dist/repertoire/tools-bluebubbles.js +1 -0
  281. package/dist/repertoire/tools-bridge.js +141 -0
  282. package/dist/repertoire/tools-bundle.js +984 -0
  283. package/dist/repertoire/tools-config.js +185 -0
  284. package/dist/repertoire/tools-continuity.js +248 -0
  285. package/dist/repertoire/tools-credential.js +381 -0
  286. package/dist/repertoire/tools-files.js +342 -0
  287. package/dist/repertoire/tools-flight.js +224 -0
  288. package/dist/repertoire/tools-flow.js +119 -0
  289. package/dist/repertoire/tools-github.js +1 -7
  290. package/dist/repertoire/tools-mail.js +1916 -0
  291. package/dist/repertoire/tools-notes.js +421 -0
  292. package/dist/repertoire/tools-obligations.js +142 -0
  293. package/dist/repertoire/tools-record.js +463 -0
  294. package/dist/repertoire/tools-runtime.js +148 -0
  295. package/dist/repertoire/tools-session.js +781 -0
  296. package/dist/repertoire/tools-shell.js +120 -0
  297. package/dist/repertoire/tools-stripe.js +180 -0
  298. package/dist/repertoire/tools-surface.js +345 -0
  299. package/dist/repertoire/tools-teams.js +9 -39
  300. package/dist/repertoire/tools-travel.js +125 -0
  301. package/dist/repertoire/tools-trip.js +604 -0
  302. package/dist/repertoire/tools-user-profile.js +144 -0
  303. package/dist/repertoire/tools-vault.js +40 -0
  304. package/dist/repertoire/tools-voice.js +144 -0
  305. package/dist/repertoire/tools.js +115 -103
  306. package/dist/repertoire/travel-api-client.js +360 -0
  307. package/dist/repertoire/user-profile.js +131 -0
  308. package/dist/repertoire/vault-setup.js +246 -0
  309. package/dist/repertoire/vault-unlock.js +594 -0
  310. package/dist/scripts/claude-code-hook.js +41 -0
  311. package/dist/scripts/claude-code-stop-hook.js +47 -0
  312. package/dist/senses/attention-queue.js +116 -0
  313. package/dist/senses/await-turn-message.js +58 -0
  314. package/dist/senses/bluebubbles/active-turns.js +216 -0
  315. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  316. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  317. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  318. package/dist/senses/bluebubbles/entry.js +77 -0
  319. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  320. package/dist/senses/bluebubbles/index.js +2613 -0
  321. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  322. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  323. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  324. package/dist/senses/bluebubbles/processed-log.js +133 -0
  325. package/dist/senses/bluebubbles/replay.js +137 -0
  326. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  327. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  328. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  329. package/dist/senses/cli/bracketed-paste.js +82 -0
  330. package/dist/senses/cli/image-paste.js +287 -0
  331. package/dist/senses/cli/image-ref-navigation.js +75 -0
  332. package/dist/senses/cli/ink-app.js +156 -0
  333. package/dist/senses/cli/inline-diff.js +64 -0
  334. package/dist/senses/cli/input-keys.js +174 -0
  335. package/dist/senses/cli/kill-ring.js +86 -0
  336. package/dist/senses/cli/message-list.js +51 -0
  337. package/dist/senses/cli/ouro-tui.js +607 -0
  338. package/dist/senses/cli/spinner-imperative.js +135 -0
  339. package/dist/senses/cli/spinner.js +101 -0
  340. package/dist/senses/cli/status-line.js +60 -0
  341. package/dist/senses/cli/streaming-markdown.js +526 -0
  342. package/dist/senses/cli/tool-display.js +85 -0
  343. package/dist/senses/cli/tool-render.js +85 -0
  344. package/dist/senses/cli/tui-store.js +240 -0
  345. package/dist/senses/cli/virtual-list.js +35 -0
  346. package/dist/senses/cli-entry.js +60 -8
  347. package/dist/senses/cli-layout.js +100 -0
  348. package/dist/senses/cli.js +516 -204
  349. package/dist/senses/commands.js +66 -3
  350. package/dist/senses/habit-turn-message.js +108 -0
  351. package/dist/senses/inner-dialog-worker.js +185 -21
  352. package/dist/senses/inner-dialog.js +469 -39
  353. package/dist/senses/mail-entry.js +66 -0
  354. package/dist/senses/mail.js +379 -0
  355. package/dist/senses/pipeline.js +654 -181
  356. package/dist/senses/proactive-content-guard.js +51 -0
  357. package/dist/senses/shared-turn.js +392 -0
  358. package/dist/senses/surface-tool.js +70 -0
  359. package/dist/senses/teams-entry.js +60 -8
  360. package/dist/senses/teams.js +387 -98
  361. package/dist/senses/trust-gate.js +100 -5
  362. package/dist/senses/voice/audio-playback.js +237 -0
  363. package/dist/senses/voice/audio-routing.js +119 -0
  364. package/dist/senses/voice/elevenlabs.js +202 -0
  365. package/dist/senses/voice/floor-control.js +431 -0
  366. package/dist/senses/voice/floor-controller.js +115 -0
  367. package/dist/senses/voice/golden-path.js +116 -0
  368. package/dist/senses/voice/index.js +29 -0
  369. package/dist/senses/voice/meeting.js +113 -0
  370. package/dist/senses/voice/outbound.js +190 -0
  371. package/dist/senses/voice/phone.js +33 -0
  372. package/dist/senses/voice/playback.js +139 -0
  373. package/dist/senses/voice/realtime-eval.js +496 -0
  374. package/dist/senses/voice/realtime-trace.js +531 -0
  375. package/dist/senses/voice/transcript.js +70 -0
  376. package/dist/senses/voice/turn.js +191 -0
  377. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  378. package/dist/senses/voice/twilio-phone.js +5079 -0
  379. package/dist/senses/voice/types.js +2 -0
  380. package/dist/senses/voice/whisper.js +161 -0
  381. package/dist/senses/voice-entry.js +81 -0
  382. package/dist/senses/voice-realtime-eval-command.js +99 -0
  383. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  384. package/dist/senses/voice-twilio-entry.js +87 -0
  385. package/dist/trips/core.js +138 -0
  386. package/dist/trips/store.js +265 -0
  387. package/package.json +41 -7
  388. package/skills/agent-commerce.md +106 -0
  389. package/skills/browser-navigation.md +117 -0
  390. package/skills/commerce-setup-guide.md +116 -0
  391. package/skills/commerce-setup.md +84 -0
  392. package/skills/configure-dev-tools.md +99 -0
  393. package/skills/travel-planning.md +138 -0
  394. package/dist/heart/daemon/auth-flow.js +0 -351
  395. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  396. package/dist/heart/safe-workspace.js +0 -228
  397. package/dist/heart/session-recall.js +0 -116
  398. package/dist/mind/associative-recall.js +0 -209
  399. package/dist/senses/bluebubbles-entry.js +0 -13
  400. package/dist/senses/bluebubbles.js +0 -1177
  401. package/dist/senses/debug-activity.js +0 -148
  402. package/subagents/README.md +0 -7
  403. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  404. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  405. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  406. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  407. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  408. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  409. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  410. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  411. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  412. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  413. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  414. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  415. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  416. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  417. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  418. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -39,6 +39,7 @@ exports.FileFriendStore = void 0;
39
39
  const fs = __importStar(require("fs"));
40
40
  const fsPromises = __importStar(require("fs/promises"));
41
41
  const path = __importStar(require("path"));
42
+ const session_events_1 = require("../../heart/session-events");
42
43
  const runtime_1 = require("../../nerves/runtime");
43
44
  const DEFAULT_ROLE = "friend";
44
45
  const DEFAULT_TRUST_LEVEL = "friend";
@@ -55,10 +56,29 @@ class FileFriendStore {
55
56
  });
56
57
  }
57
58
  async get(id) {
59
+ // Direct UUID lookup
58
60
  const record = await this.readJson(path.join(this.friendsPath, `${id}.json`));
59
- if (!record)
60
- return null;
61
- return this.normalize(record);
61
+ if (record)
62
+ return this.normalize(record);
63
+ // Fallback: if id is a name (not UUID), scan for matching friend
64
+ /* v8 ignore start -- name fallback: exercised by live proactive sends @preserve */
65
+ try {
66
+ const entries = await fsPromises.readdir(this.friendsPath);
67
+ for (const entry of entries) {
68
+ if (!entry.endsWith(".json"))
69
+ continue;
70
+ const raw = await this.readJson(path.join(this.friendsPath, entry));
71
+ if (!raw)
72
+ continue;
73
+ const normalized = this.normalize(raw);
74
+ if (normalized.name?.toLowerCase() === id.toLowerCase()) {
75
+ return normalized;
76
+ }
77
+ }
78
+ }
79
+ catch { /* directory unreadable — return null */ }
80
+ /* v8 ignore stop */
81
+ return null;
62
82
  }
63
83
  async put(id, record) {
64
84
  await this.writeJson(path.join(this.friendsPath, `${id}.json`), this.normalize(record));
@@ -127,6 +147,8 @@ class FileFriendStore {
127
147
  trustLevel === "stranger"
128
148
  ? trustLevel
129
149
  : DEFAULT_TRUST_LEVEL;
150
+ const kind = raw.kind === "human" || raw.kind === "agent" ? raw.kind : "human";
151
+ const agentMeta = kind === "agent" ? this.normalizeAgentMeta(raw.agentMeta) : undefined;
130
152
  return {
131
153
  id: raw.id,
132
154
  name: raw.name,
@@ -153,6 +175,21 @@ class FileFriendStore {
153
175
  createdAt: typeof raw.createdAt === "string" ? raw.createdAt : new Date().toISOString(),
154
176
  updatedAt: typeof raw.updatedAt === "string" ? raw.updatedAt : new Date().toISOString(),
155
177
  schemaVersion: typeof raw.schemaVersion === "number" ? raw.schemaVersion : 1,
178
+ kind,
179
+ agentMeta,
180
+ };
181
+ }
182
+ normalizeAgentMeta(raw) {
183
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
184
+ return undefined;
185
+ const meta = raw;
186
+ if (typeof meta.bundleName !== "string")
187
+ return undefined;
188
+ return {
189
+ bundleName: meta.bundleName,
190
+ familiarity: typeof meta.familiarity === "number" ? meta.familiarity : 0,
191
+ sharedMissions: Array.isArray(meta.sharedMissions) ? meta.sharedMissions : [],
192
+ outcomes: Array.isArray(meta.outcomes) ? meta.outcomes : [],
156
193
  };
157
194
  }
158
195
  async readJson(filePath) {
@@ -174,7 +211,14 @@ class FileFriendStore {
174
211
  }
175
212
  }
176
213
  async writeJson(filePath, data) {
177
- await fsPromises.writeFile(filePath, JSON.stringify(data, null, 2), "utf-8");
214
+ const notes = Object.fromEntries(Object.entries(data.notes).map(([key, note]) => [
215
+ key,
216
+ {
217
+ ...note,
218
+ value: (0, session_events_1.capStructuredRecordString)(note.value),
219
+ },
220
+ ]));
221
+ await fsPromises.writeFile(filePath, JSON.stringify({ ...data, notes }, null, 2), "utf-8");
178
222
  }
179
223
  async removeFile(filePath) {
180
224
  try {
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  // Context kernel type definitions.
3
- // FriendRecord (merged identity + memory), channel capabilities, and resolved context.
3
+ // FriendRecord (merged identity + notes), channel capabilities, and resolved context.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.TRUSTED_LEVELS = void 0;
6
6
  exports.isIdentityProvider = isIdentityProvider;
7
7
  exports.isIntegration = isIntegration;
8
8
  exports.isTrustedLevel = isTrustedLevel;
9
9
  const runtime_1 = require("../../nerves/runtime");
10
- const IDENTITY_PROVIDERS = new Set(["aad", "local", "teams-conversation", "imessage-handle"]);
10
+ const IDENTITY_PROVIDERS = new Set(["aad", "local", "teams-conversation", "imessage-handle", "email-address"]);
11
11
  function isIdentityProvider(value) {
12
12
  (0, runtime_1.emitNervesEvent)({
13
13
  component: "friends",
@@ -0,0 +1,162 @@
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.indexJournalFiles = indexJournalFiles;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const session_events_1 = require("../heart/session-events");
40
+ const runtime_1 = require("../nerves/runtime");
41
+ const TEXT_EXTENSIONS = new Set([".md", ".txt"]);
42
+ const PREVIEW_CHAR_LIMIT = 500;
43
+ function readExistingIndex(indexPath) {
44
+ try {
45
+ const raw = fs.readFileSync(indexPath, "utf8");
46
+ const parsed = JSON.parse(raw);
47
+ if (!Array.isArray(parsed))
48
+ return [];
49
+ return parsed;
50
+ }
51
+ catch {
52
+ return [];
53
+ }
54
+ }
55
+ function extractPreview(content) {
56
+ const trimmed = content.trim();
57
+ if (!trimmed)
58
+ return "";
59
+ return trimmed.split("\n")[0].replace(/^#+\s*/, "").trim();
60
+ }
61
+ async function indexJournalFiles(journalDir, indexPath, embedProvider) {
62
+ // Read existing index
63
+ const existingIndex = readExistingIndex(indexPath);
64
+ const indexMap = new Map();
65
+ for (const entry of existingIndex) {
66
+ indexMap.set(entry.filename, entry);
67
+ }
68
+ // Scan journal dir for text files
69
+ let dirEntries;
70
+ try {
71
+ dirEntries = fs.readdirSync(journalDir, { withFileTypes: true });
72
+ }
73
+ catch {
74
+ (0, runtime_1.emitNervesEvent)({
75
+ component: "mind",
76
+ event: "mind.journal_index_scan",
77
+ message: "journal dir not found or unreadable",
78
+ meta: { journalDir },
79
+ });
80
+ return 0;
81
+ }
82
+ const textFiles = dirEntries.filter((entry) => {
83
+ if (!entry.isFile())
84
+ return false;
85
+ if (entry.name.startsWith("."))
86
+ return false;
87
+ const ext = path.extname(entry.name).toLowerCase();
88
+ return TEXT_EXTENSIONS.has(ext);
89
+ });
90
+ if (textFiles.length === 0) {
91
+ (0, runtime_1.emitNervesEvent)({
92
+ component: "mind",
93
+ event: "mind.journal_index_scan",
94
+ message: "no text files found in journal",
95
+ meta: { journalDir },
96
+ });
97
+ return 0;
98
+ }
99
+ let newlyIndexed = 0;
100
+ for (const file of textFiles) {
101
+ const filePath = path.join(journalDir, file.name);
102
+ let stat;
103
+ try {
104
+ stat = fs.statSync(filePath);
105
+ }
106
+ catch {
107
+ /* v8 ignore next -- filesystem race: file deleted between readdir and stat @preserve */
108
+ continue;
109
+ }
110
+ // Check if already indexed with same mtime
111
+ const existing = indexMap.get(file.name);
112
+ if (existing && existing.mtime === stat.mtimeMs) {
113
+ continue;
114
+ }
115
+ // Read content for embedding
116
+ let content;
117
+ try {
118
+ content = fs.readFileSync(filePath, "utf8");
119
+ }
120
+ catch {
121
+ /* v8 ignore next -- filesystem race: file deleted between stat and read @preserve */
122
+ continue;
123
+ }
124
+ const preview = (0, session_events_1.capStructuredRecordString)(extractPreview(content));
125
+ const embedText = content.slice(0, PREVIEW_CHAR_LIMIT);
126
+ // Generate embedding
127
+ let embedding;
128
+ try {
129
+ const vectors = await embedProvider.embed([embedText]);
130
+ embedding = vectors[0] ?? [];
131
+ }
132
+ catch {
133
+ (0, runtime_1.emitNervesEvent)({
134
+ level: "warn",
135
+ component: "mind",
136
+ event: "mind.journal_embedding_error",
137
+ message: "embedding failed for journal file",
138
+ meta: { filename: file.name },
139
+ });
140
+ embedding = [];
141
+ }
142
+ indexMap.set(file.name, {
143
+ filename: file.name,
144
+ embedding,
145
+ mtime: stat.mtimeMs,
146
+ preview,
147
+ });
148
+ newlyIndexed++;
149
+ }
150
+ // Write updated index back
151
+ if (newlyIndexed > 0) {
152
+ const updatedIndex = Array.from(indexMap.values());
153
+ fs.writeFileSync(indexPath, JSON.stringify(updatedIndex, null, 2), "utf8");
154
+ }
155
+ (0, runtime_1.emitNervesEvent)({
156
+ component: "mind",
157
+ event: "mind.journal_index_complete",
158
+ message: "journal indexing complete",
159
+ meta: { journalDir, newlyIndexed, total: indexMap.size },
160
+ });
161
+ return newlyIndexed;
162
+ }
@@ -0,0 +1,268 @@
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.cosineSimilarity = cosineSimilarity;
37
+ exports.searchDiaryFactsForQuery = searchDiaryFactsForQuery;
38
+ exports.searchJournalIndex = searchJournalIndex;
39
+ exports.injectNoteSearchContext = injectNoteSearchContext;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const runtime_1 = require("../nerves/runtime");
43
+ const diary_1 = require("./diary");
44
+ const provenance_trust_1 = require("./provenance-trust");
45
+ const embedding_provider_1 = require("./embedding-provider");
46
+ const DEFAULT_MIN_SCORE = 0.5;
47
+ const DEFAULT_TOP_K = 3;
48
+ function createDefaultProvider() {
49
+ const provider = (0, embedding_provider_1.createDefaultEmbeddingProvider)();
50
+ if (!provider) {
51
+ throw new Error("openaiEmbeddingsApiKey not configured");
52
+ }
53
+ return provider;
54
+ }
55
+ function readFacts(diaryRoot) {
56
+ const factsPath = path.join(diaryRoot, "facts.jsonl");
57
+ if (!fs.existsSync(factsPath))
58
+ return [];
59
+ const raw = fs.readFileSync(factsPath, "utf8").trim();
60
+ if (!raw)
61
+ return [];
62
+ const facts = [];
63
+ for (const line of raw.split("\n")) {
64
+ const trimmed = line.trim();
65
+ if (!trimmed)
66
+ continue;
67
+ try {
68
+ facts.push(JSON.parse(trimmed));
69
+ }
70
+ catch {
71
+ // Skip corrupt lines (e.g. partial write from a crash).
72
+ }
73
+ }
74
+ return facts;
75
+ }
76
+ function getLatestUserText(messages) {
77
+ for (let i = messages.length - 1; i >= 0; i--) {
78
+ const message = messages[i];
79
+ if (message.role !== "user")
80
+ continue;
81
+ if (typeof message.content !== "string")
82
+ continue;
83
+ const text = message.content.trim();
84
+ if (text.length > 0)
85
+ return text;
86
+ }
87
+ return "";
88
+ }
89
+ function cosineSimilarity(left, right) {
90
+ if (left.length === 0 || right.length === 0 || left.length !== right.length)
91
+ return 0;
92
+ let dot = 0;
93
+ let leftNorm = 0;
94
+ let rightNorm = 0;
95
+ for (let i = 0; i < left.length; i++) {
96
+ dot += left[i] * right[i];
97
+ leftNorm += left[i] * left[i];
98
+ rightNorm += right[i] * right[i];
99
+ }
100
+ if (leftNorm === 0 || rightNorm === 0)
101
+ return 0;
102
+ return dot / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm));
103
+ }
104
+ async function searchDiaryFactsForQuery(query, facts, provider, options) {
105
+ const trimmed = query.trim();
106
+ if (!trimmed)
107
+ return [];
108
+ const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;
109
+ const topK = options?.topK ?? DEFAULT_TOP_K;
110
+ const [queryEmbedding] = await provider.embed([trimmed]);
111
+ return facts
112
+ .map((fact) => ({
113
+ ...fact,
114
+ score: cosineSimilarity(queryEmbedding, fact.embedding),
115
+ }))
116
+ .filter((fact) => fact.score >= minScore)
117
+ .sort((left, right) => right.score - left.score)
118
+ .slice(0, topK);
119
+ }
120
+ function readJournalIndex(journalDir) {
121
+ const indexPath = path.join(journalDir, ".index.json");
122
+ try {
123
+ const raw = fs.readFileSync(indexPath, "utf8");
124
+ const parsed = JSON.parse(raw);
125
+ if (!Array.isArray(parsed))
126
+ return [];
127
+ return parsed;
128
+ }
129
+ catch {
130
+ return [];
131
+ }
132
+ }
133
+ function searchJournalIndex(queryEmbedding, entries, options) {
134
+ const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;
135
+ const topK = options?.topK ?? DEFAULT_TOP_K;
136
+ return entries
137
+ .filter((entry) => Array.isArray(entry.embedding) && entry.embedding.length > 0)
138
+ .map((entry) => ({
139
+ filename: entry.filename,
140
+ preview: entry.preview,
141
+ score: cosineSimilarity(queryEmbedding, entry.embedding),
142
+ }))
143
+ .filter((entry) => entry.score >= minScore)
144
+ .sort((left, right) => right.score - left.score)
145
+ .slice(0, topK);
146
+ }
147
+ function resolveJournalDir(diaryRoot, explicitJournalDir) {
148
+ if (explicitJournalDir)
149
+ return explicitJournalDir;
150
+ // journal/ is a sibling of diary/ at the agent root level
151
+ const agentRoot = path.dirname(diaryRoot);
152
+ return path.join(agentRoot, "journal");
153
+ }
154
+ async function injectNoteSearchContext(messages, options) {
155
+ try {
156
+ if (messages[0]?.role !== "system" || typeof messages[0].content !== "string")
157
+ return;
158
+ const query = getLatestUserText(messages);
159
+ if (!query)
160
+ return;
161
+ const diaryRoot = options?.diaryRoot ?? (0, diary_1.resolveDiaryRoot)();
162
+ const facts = readFacts(diaryRoot);
163
+ const journalDir = resolveJournalDir(diaryRoot, options?.journalDir);
164
+ const journalEntries = readJournalIndex(journalDir);
165
+ if (facts.length === 0 && journalEntries.length === 0)
166
+ return;
167
+ // Build combined result lines tagged by source
168
+ const resultLines = [];
169
+ let queryEmbedding;
170
+ // Search diary entries
171
+ if (facts.length > 0) {
172
+ let found;
173
+ try {
174
+ const provider = options?.provider ?? createDefaultProvider();
175
+ found = await searchDiaryFactsForQuery(query, facts, provider, options);
176
+ // Compute query embedding for journal search while provider is available
177
+ if (journalEntries.length > 0) {
178
+ const [qe] = await provider.embed([query.trim()]);
179
+ queryEmbedding = qe;
180
+ }
181
+ }
182
+ catch {
183
+ // Embeddings unavailable — fall back to substring matching
184
+ const lowerQuery = query.toLowerCase();
185
+ const topK = options?.topK ?? DEFAULT_TOP_K;
186
+ found = facts
187
+ .filter((fact) => fact.text.toLowerCase().includes(lowerQuery))
188
+ .slice(0, topK)
189
+ .map((fact) => ({ ...fact, score: 1 }));
190
+ if (found.length > 0) {
191
+ (0, runtime_1.emitNervesEvent)({
192
+ level: "warn",
193
+ component: "mind",
194
+ event: "mind.note_search_fallback",
195
+ message: "embeddings unavailable, used substring fallback",
196
+ meta: { matchCount: found.length },
197
+ });
198
+ }
199
+ }
200
+ for (const fact of found) {
201
+ let meta = `score=${fact.score.toFixed(3)} source=${fact.source}`;
202
+ if (fact.provenance) {
203
+ if (fact.provenance.channel)
204
+ meta += ` channel=${fact.provenance.channel}`;
205
+ if (fact.provenance.friendName)
206
+ meta += ` friend=${fact.provenance.friendName}`;
207
+ if (fact.provenance.trust)
208
+ meta += ` trust=${fact.provenance.trust}`;
209
+ }
210
+ const tag = (0, provenance_trust_1.classifyProvenanceTrust)(fact.provenance) === "external" ? "diary/external" : "diary";
211
+ resultLines.push({
212
+ text: `[${tag}] ${fact.text} [${meta}]`,
213
+ score: fact.score,
214
+ });
215
+ }
216
+ }
217
+ // Search journal entries (works whether diary had results or not)
218
+ if (journalEntries.length > 0) {
219
+ try {
220
+ if (!queryEmbedding) {
221
+ const provider = options?.provider ?? createDefaultProvider();
222
+ const [qe] = await provider.embed([query.trim()]);
223
+ queryEmbedding = qe;
224
+ }
225
+ if (queryEmbedding) {
226
+ const journalResults = searchJournalIndex(queryEmbedding, journalEntries, options);
227
+ for (const entry of journalResults) {
228
+ resultLines.push({
229
+ text: `[journal] ${entry.filename}: ${entry.preview} [score=${entry.score.toFixed(3)}]`,
230
+ score: entry.score,
231
+ });
232
+ }
233
+ }
234
+ }
235
+ catch {
236
+ // Embeddings unavailable — no journal fallback
237
+ }
238
+ }
239
+ if (resultLines.length === 0)
240
+ return;
241
+ // Sort all results by score descending
242
+ resultLines.sort((left, right) => right.score - left.score);
243
+ const noteSection = resultLines
244
+ .map((entry, index) => `${index + 1}. ${entry.text}`)
245
+ .join("\n");
246
+ messages[0] = {
247
+ role: "system",
248
+ content: `${messages[0].content}\n\n## from my diary and journal\n${noteSection}`,
249
+ };
250
+ (0, runtime_1.emitNervesEvent)({
251
+ component: "mind",
252
+ event: "mind.note_search_context",
253
+ message: "note search injected",
254
+ meta: { count: resultLines.length },
255
+ });
256
+ }
257
+ catch (error) {
258
+ (0, runtime_1.emitNervesEvent)({
259
+ level: "warn",
260
+ component: "mind",
261
+ event: "mind.note_search_context_error",
262
+ message: "note search failed",
263
+ meta: {
264
+ reason: error instanceof Error ? error.message : /* v8 ignore start -- defensive: non-Error catch branch @preserve */ String(error) /* v8 ignore stop */,
265
+ },
266
+ });
267
+ }
268
+ }