@ouro.bot/cli 0.1.0-alpha.62 → 0.1.0-alpha.637

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 (432) 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 +4087 -13
  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/evolution.js +487 -0
  17. package/dist/arc/intentions.js +134 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +270 -0
  20. package/dist/arc/packets.js +288 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +57 -0
  23. package/dist/heart/active-work.js +860 -43
  24. package/dist/heart/agent-entry.js +69 -3
  25. package/dist/heart/attachments/image-normalize.js +194 -0
  26. package/dist/heart/attachments/materialize.js +97 -0
  27. package/dist/heart/attachments/originals.js +88 -0
  28. package/dist/heart/attachments/render.js +29 -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/manager.js +137 -17
  43. package/dist/heart/bridges/store.js +14 -2
  44. package/dist/heart/bundle-state.js +168 -0
  45. package/dist/heart/commitments.js +135 -0
  46. package/dist/heart/config-registry.js +322 -0
  47. package/dist/heart/config.js +114 -119
  48. package/dist/heart/core.js +1028 -248
  49. package/dist/heart/cross-chat-delivery.js +3 -18
  50. package/dist/heart/daemon/agent-config-check.js +419 -0
  51. package/dist/heart/daemon/agent-discovery.js +102 -3
  52. package/dist/heart/daemon/agent-service.js +522 -0
  53. package/dist/heart/daemon/agentic-repair.js +547 -0
  54. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  55. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  56. package/dist/heart/daemon/cadence.js +70 -0
  57. package/dist/heart/daemon/cli-defaults.js +776 -0
  58. package/dist/heart/daemon/cli-desk.js +322 -0
  59. package/dist/heart/daemon/cli-exec.js +7468 -0
  60. package/dist/heart/daemon/cli-help.js +505 -0
  61. package/dist/heart/daemon/cli-parse.js +1554 -0
  62. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  63. package/dist/heart/daemon/cli-render.js +763 -0
  64. package/dist/heart/daemon/cli-types.js +8 -0
  65. package/dist/heart/daemon/connect-bay.js +323 -0
  66. package/dist/heart/daemon/daemon-cli.js +29 -1700
  67. package/dist/heart/daemon/daemon-entry.js +485 -2
  68. package/dist/heart/daemon/daemon-health.js +176 -0
  69. package/dist/heart/daemon/daemon-rollup.js +57 -0
  70. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  71. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  72. package/dist/heart/daemon/daemon.js +906 -71
  73. package/dist/heart/daemon/dns-workflow.js +394 -0
  74. package/dist/heart/daemon/doctor-types.js +8 -0
  75. package/dist/heart/daemon/doctor.js +873 -0
  76. package/dist/heart/daemon/health-monitor.js +122 -1
  77. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  78. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  79. package/dist/heart/daemon/http-health-probe.js +80 -0
  80. package/dist/heart/daemon/human-command-screens.js +234 -0
  81. package/dist/heart/daemon/human-readiness.js +114 -0
  82. package/dist/heart/daemon/inner-status.js +89 -0
  83. package/dist/heart/daemon/interactive-repair.js +394 -0
  84. package/dist/heart/daemon/launchd.js +37 -8
  85. package/dist/heart/daemon/log-tailer.js +79 -10
  86. package/dist/heart/daemon/logs-prune.js +110 -0
  87. package/dist/heart/daemon/mcp-canary.js +297 -0
  88. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  89. package/dist/heart/daemon/os-cron-deps.js +135 -0
  90. package/dist/heart/daemon/os-cron.js +14 -12
  91. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  92. package/dist/heart/daemon/ouro-entry.js +3 -1
  93. package/dist/heart/daemon/plugin-cli.js +432 -0
  94. package/dist/heart/daemon/process-manager.js +501 -35
  95. package/dist/heart/daemon/provider-discovery.js +137 -0
  96. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  97. package/dist/heart/daemon/pulse.js +475 -0
  98. package/dist/heart/daemon/readiness-repair.js +365 -0
  99. package/dist/heart/daemon/run-hooks.js +2 -0
  100. package/dist/heart/daemon/runtime-logging.js +11 -3
  101. package/dist/heart/daemon/runtime-metadata.js +2 -30
  102. package/dist/heart/daemon/safe-mode.js +161 -0
  103. package/dist/heart/daemon/sense-manager.js +493 -38
  104. package/dist/heart/daemon/session-id-resolver.js +131 -0
  105. package/dist/heart/daemon/skill-management-installer.js +22 -9
  106. package/dist/heart/daemon/socket-client.js +158 -11
  107. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  108. package/dist/heart/daemon/startup-tui.js +330 -0
  109. package/dist/heart/daemon/task-scheduler.js +117 -39
  110. package/dist/heart/daemon/terminal-ui.js +499 -0
  111. package/dist/heart/daemon/thoughts.js +229 -17
  112. package/dist/heart/daemon/up-progress.js +366 -0
  113. package/dist/heart/daemon/vault-items.js +56 -0
  114. package/dist/heart/delegation.js +1 -4
  115. package/dist/heart/habits/habit-migration.js +189 -0
  116. package/dist/heart/habits/habit-parser.js +140 -0
  117. package/dist/heart/habits/habit-runtime-state.js +100 -0
  118. package/dist/heart/habits/habit-scheduler.js +372 -0
  119. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  120. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  121. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  122. package/dist/heart/{daemon → hatch}/specialist-tools.js +37 -14
  123. package/dist/heart/identity.js +168 -57
  124. package/dist/heart/kept-notes.js +357 -0
  125. package/dist/heart/kicks.js +1 -1
  126. package/dist/heart/machine-identity.js +161 -0
  127. package/dist/heart/mail-import-discovery.js +353 -0
  128. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  129. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  130. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  131. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  132. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  133. package/dist/heart/mailbox/mailbox-http.js +99 -0
  134. package/dist/heart/mailbox/mailbox-read.js +31 -0
  135. package/dist/heart/mailbox/mailbox-types.js +27 -0
  136. package/dist/heart/mailbox/mailbox-view.js +197 -0
  137. package/dist/heart/mailbox/readers/agent-machine.js +418 -0
  138. package/dist/heart/mailbox/readers/continuity-readers.js +319 -0
  139. package/dist/heart/mailbox/readers/mail.js +375 -0
  140. package/dist/heart/mailbox/readers/runtime-readers.js +756 -0
  141. package/dist/heart/mailbox/readers/sessions.js +232 -0
  142. package/dist/heart/mailbox/readers/shared.js +111 -0
  143. package/dist/heart/mcp/mcp-server.js +692 -0
  144. package/dist/heart/migrate-config.js +100 -0
  145. package/dist/heart/model-capabilities.js +19 -0
  146. package/dist/heart/orientation-frame.js +217 -0
  147. package/dist/heart/platform.js +81 -0
  148. package/dist/heart/provider-attempt.js +134 -0
  149. package/dist/heart/provider-binding-resolver.js +272 -0
  150. package/dist/heart/provider-credentials.js +425 -0
  151. package/dist/heart/provider-failover.js +301 -0
  152. package/dist/heart/provider-models.js +81 -0
  153. package/dist/heart/provider-ping.js +262 -0
  154. package/dist/heart/provider-readiness-cache.js +40 -0
  155. package/dist/heart/provider-visibility.js +188 -0
  156. package/dist/heart/providers/anthropic-token.js +131 -0
  157. package/dist/heart/providers/anthropic.js +139 -52
  158. package/dist/heart/providers/azure.js +23 -11
  159. package/dist/heart/providers/error-classification.js +127 -0
  160. package/dist/heart/providers/github-copilot.js +145 -0
  161. package/dist/heart/providers/minimax-vlm.js +189 -0
  162. package/dist/heart/providers/minimax.js +26 -8
  163. package/dist/heart/providers/openai-codex.js +55 -40
  164. package/dist/heart/runtime-capability-check.js +170 -0
  165. package/dist/heart/runtime-credentials.js +367 -0
  166. package/dist/heart/runtime-cwd.js +87 -0
  167. package/dist/heart/sense-truth.js +13 -4
  168. package/dist/heart/session-activity.js +48 -24
  169. package/dist/heart/session-events.js +1163 -0
  170. package/dist/heart/session-playback-cli-main.js +5 -0
  171. package/dist/heart/session-playback-cli.js +36 -0
  172. package/dist/heart/session-playback.js +231 -0
  173. package/dist/heart/session-stats-cli-main.js +5 -0
  174. package/dist/heart/session-stats.js +182 -0
  175. package/dist/heart/session-transcript.js +133 -0
  176. package/dist/heart/start-of-turn-packet.js +345 -0
  177. package/dist/heart/streaming.js +44 -27
  178. package/dist/heart/structured-output.js +196 -0
  179. package/dist/heart/sync-classification.js +176 -0
  180. package/dist/heart/sync.js +449 -0
  181. package/dist/heart/target-resolution.js +9 -5
  182. package/dist/heart/tempo.js +93 -0
  183. package/dist/heart/temporal-view.js +41 -0
  184. package/dist/heart/timeouts.js +101 -0
  185. package/dist/heart/tool-activity-callbacks.js +59 -0
  186. package/dist/heart/tool-description.js +143 -0
  187. package/dist/heart/tool-friction.js +55 -0
  188. package/dist/heart/tool-loop.js +200 -0
  189. package/dist/heart/turn-context.js +389 -0
  190. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  191. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  192. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  193. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  194. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  195. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  196. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  197. package/dist/mailbox-ui/assets/index-9-AxCxuB.js +61 -0
  198. package/dist/mailbox-ui/assets/index-CWzt267f.css +1 -0
  199. package/dist/mailbox-ui/index.html +15 -0
  200. package/dist/mailroom/attention.js +167 -0
  201. package/dist/mailroom/autonomy.js +209 -0
  202. package/dist/mailroom/blob-store.js +715 -0
  203. package/dist/mailroom/body-cache.js +61 -0
  204. package/dist/mailroom/core.js +788 -0
  205. package/dist/mailroom/entry.js +160 -0
  206. package/dist/mailroom/file-store.js +568 -0
  207. package/dist/mailroom/mbox-import.js +393 -0
  208. package/dist/mailroom/migration.js +164 -0
  209. package/dist/mailroom/outbound.js +380 -0
  210. package/dist/mailroom/policy.js +263 -0
  211. package/dist/mailroom/reader.js +233 -0
  212. package/dist/mailroom/search-cache.js +334 -0
  213. package/dist/mailroom/search-relevance.js +319 -0
  214. package/dist/mailroom/smtp-ingress.js +176 -0
  215. package/dist/mailroom/source-state.js +176 -0
  216. package/dist/mailroom/thread.js +109 -0
  217. package/dist/mailroom/travel-extract.js +89 -0
  218. package/dist/mind/bundle-manifest.js +14 -1
  219. package/dist/mind/context.js +251 -101
  220. package/dist/mind/desk-section.js +310 -0
  221. package/dist/mind/diary-integrity.js +60 -0
  222. package/dist/mind/{memory.js → diary.js} +68 -76
  223. package/dist/mind/embedding-provider.js +60 -0
  224. package/dist/mind/file-state.js +179 -0
  225. package/dist/mind/friends/channel.js +39 -0
  226. package/dist/mind/friends/resolver.js +54 -2
  227. package/dist/mind/friends/store-file.js +48 -4
  228. package/dist/mind/friends/types.js +2 -2
  229. package/dist/mind/journal-index.js +162 -0
  230. package/dist/mind/note-search.js +268 -0
  231. package/dist/mind/obligation-steering.js +221 -0
  232. package/dist/mind/pending.js +6 -1
  233. package/dist/mind/prompt-refresh.js +3 -2
  234. package/dist/mind/prompt.js +1075 -146
  235. package/dist/mind/provenance-trust.js +26 -0
  236. package/dist/mind/scrutiny.js +173 -0
  237. package/dist/nerves/cli-logging.js +7 -1
  238. package/dist/nerves/coverage/audit-rules.js +15 -6
  239. package/dist/nerves/coverage/audit.js +28 -2
  240. package/dist/nerves/coverage/cli.js +1 -1
  241. package/dist/nerves/coverage/contract.js +5 -5
  242. package/dist/nerves/coverage/file-completeness.js +139 -5
  243. package/dist/nerves/event-buffer.js +111 -0
  244. package/dist/nerves/index.js +224 -4
  245. package/dist/nerves/observation.js +20 -0
  246. package/dist/nerves/redact.js +79 -0
  247. package/dist/nerves/review/cli-main.js +5 -0
  248. package/dist/nerves/review/cli.js +156 -0
  249. package/dist/nerves/review/core.js +152 -0
  250. package/dist/nerves/runtime.js +5 -1
  251. package/dist/repertoire/ado-client.js +15 -56
  252. package/dist/repertoire/ado-semantic.js +16 -10
  253. package/dist/repertoire/api-client.js +97 -0
  254. package/dist/repertoire/bitwarden-store.js +1040 -0
  255. package/dist/repertoire/bundle-templates.js +72 -0
  256. package/dist/repertoire/bw-installer.js +180 -0
  257. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  258. package/dist/repertoire/coding/context-pack.js +331 -0
  259. package/dist/repertoire/coding/feedback.js +197 -30
  260. package/dist/repertoire/coding/manager.js +166 -10
  261. package/dist/repertoire/coding/spawner.js +55 -9
  262. package/dist/repertoire/coding/tools.js +219 -7
  263. package/dist/repertoire/commerce-errors.js +109 -0
  264. package/dist/repertoire/commerce-self-test.js +156 -0
  265. package/dist/repertoire/credential-access.js +178 -0
  266. package/dist/repertoire/desk/classifier.js +362 -0
  267. package/dist/repertoire/duffel-client.js +185 -0
  268. package/dist/repertoire/github-client.js +14 -55
  269. package/dist/repertoire/graph-client.js +11 -52
  270. package/dist/repertoire/guardrails.js +385 -0
  271. package/dist/repertoire/mcp-client.js +295 -0
  272. package/dist/repertoire/mcp-manager.js +403 -0
  273. package/dist/repertoire/mcp-tools.js +83 -0
  274. package/dist/repertoire/plugin-mcp.js +175 -0
  275. package/dist/repertoire/plugins.js +253 -0
  276. package/dist/repertoire/shell-sessions.js +133 -0
  277. package/dist/repertoire/skills.js +48 -4
  278. package/dist/repertoire/stripe-client.js +131 -0
  279. package/dist/repertoire/tool-results.js +29 -0
  280. package/dist/repertoire/tools-attachments.js +317 -0
  281. package/dist/repertoire/tools-awaiting.js +372 -0
  282. package/dist/repertoire/tools-base.js +59 -1082
  283. package/dist/repertoire/tools-bluebubbles.js +2 -0
  284. package/dist/repertoire/tools-bridge.js +144 -0
  285. package/dist/repertoire/tools-bundle.js +993 -0
  286. package/dist/repertoire/tools-config.js +186 -0
  287. package/dist/repertoire/tools-continuity.js +252 -0
  288. package/dist/repertoire/tools-credential.js +383 -0
  289. package/dist/repertoire/tools-evolution.js +527 -0
  290. package/dist/repertoire/tools-files.js +344 -0
  291. package/dist/repertoire/tools-flight.js +227 -0
  292. package/dist/repertoire/tools-flow.js +119 -0
  293. package/dist/repertoire/tools-github.js +3 -8
  294. package/dist/repertoire/tools-mail.js +1975 -0
  295. package/dist/repertoire/tools-notes.js +438 -0
  296. package/dist/repertoire/tools-obligations.js +143 -0
  297. package/dist/repertoire/tools-orientation.js +31 -0
  298. package/dist/repertoire/tools-record.js +464 -0
  299. package/dist/repertoire/tools-runtime.js +150 -0
  300. package/dist/repertoire/tools-session.js +766 -0
  301. package/dist/repertoire/tools-shell.js +120 -0
  302. package/dist/repertoire/tools-stripe.js +182 -0
  303. package/dist/repertoire/tools-surface.js +344 -0
  304. package/dist/repertoire/tools-teams.js +12 -39
  305. package/dist/repertoire/tools-travel.js +125 -0
  306. package/dist/repertoire/tools-trip.js +982 -0
  307. package/dist/repertoire/tools-user-profile.js +146 -0
  308. package/dist/repertoire/tools-vault.js +40 -0
  309. package/dist/repertoire/tools-voice.js +145 -0
  310. package/dist/repertoire/tools.js +215 -103
  311. package/dist/repertoire/travel-api-client.js +360 -0
  312. package/dist/repertoire/user-profile.js +131 -0
  313. package/dist/repertoire/vault-setup.js +246 -0
  314. package/dist/repertoire/vault-unlock.js +594 -0
  315. package/dist/scripts/claude-code-hook.js +41 -0
  316. package/dist/scripts/claude-code-stop-hook.js +47 -0
  317. package/dist/senses/attention-queue.js +186 -0
  318. package/dist/senses/await-turn-message.js +58 -0
  319. package/dist/senses/bluebubbles/active-turns.js +216 -0
  320. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  321. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  322. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  323. package/dist/senses/bluebubbles/entry.js +77 -0
  324. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  325. package/dist/senses/bluebubbles/index.js +2737 -0
  326. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  327. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  328. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  329. package/dist/senses/bluebubbles/processed-log.js +133 -0
  330. package/dist/senses/bluebubbles/replay.js +137 -0
  331. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  332. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  333. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  334. package/dist/senses/cli/bracketed-paste.js +82 -0
  335. package/dist/senses/cli/image-paste.js +287 -0
  336. package/dist/senses/cli/image-ref-navigation.js +75 -0
  337. package/dist/senses/cli/ink-app.js +156 -0
  338. package/dist/senses/cli/inline-diff.js +64 -0
  339. package/dist/senses/cli/input-keys.js +174 -0
  340. package/dist/senses/cli/kill-ring.js +86 -0
  341. package/dist/senses/cli/message-list.js +51 -0
  342. package/dist/senses/cli/ouro-tui.js +607 -0
  343. package/dist/senses/cli/spinner-imperative.js +135 -0
  344. package/dist/senses/cli/spinner.js +101 -0
  345. package/dist/senses/cli/status-line.js +60 -0
  346. package/dist/senses/cli/streaming-markdown.js +526 -0
  347. package/dist/senses/cli/tool-display.js +85 -0
  348. package/dist/senses/cli/tool-render.js +85 -0
  349. package/dist/senses/cli/tui-store.js +240 -0
  350. package/dist/senses/cli/virtual-list.js +35 -0
  351. package/dist/senses/cli-entry.js +60 -8
  352. package/dist/senses/cli-layout.js +100 -0
  353. package/dist/senses/cli.js +517 -204
  354. package/dist/senses/commands.js +66 -3
  355. package/dist/senses/habit-turn-message.js +108 -0
  356. package/dist/senses/inner-dialog-worker.js +254 -22
  357. package/dist/senses/inner-dialog.js +505 -40
  358. package/dist/senses/mail-entry.js +66 -0
  359. package/dist/senses/mail.js +379 -0
  360. package/dist/senses/pipeline.js +666 -181
  361. package/dist/senses/proactive-content-guard.js +51 -0
  362. package/dist/senses/shared-turn.js +393 -0
  363. package/dist/senses/surface-tool.js +108 -0
  364. package/dist/senses/teams-entry.js +60 -8
  365. package/dist/senses/teams.js +388 -98
  366. package/dist/senses/trust-gate.js +100 -5
  367. package/dist/senses/voice/audio-playback.js +237 -0
  368. package/dist/senses/voice/audio-routing.js +119 -0
  369. package/dist/senses/voice/elevenlabs.js +202 -0
  370. package/dist/senses/voice/floor-control.js +431 -0
  371. package/dist/senses/voice/floor-controller.js +115 -0
  372. package/dist/senses/voice/golden-path.js +116 -0
  373. package/dist/senses/voice/index.js +29 -0
  374. package/dist/senses/voice/meeting.js +113 -0
  375. package/dist/senses/voice/outbound.js +190 -0
  376. package/dist/senses/voice/phone.js +33 -0
  377. package/dist/senses/voice/playback.js +139 -0
  378. package/dist/senses/voice/realtime-eval.js +496 -0
  379. package/dist/senses/voice/realtime-trace.js +531 -0
  380. package/dist/senses/voice/transcript.js +70 -0
  381. package/dist/senses/voice/turn.js +191 -0
  382. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  383. package/dist/senses/voice/twilio-phone.js +5079 -0
  384. package/dist/senses/voice/types.js +2 -0
  385. package/dist/senses/voice/whisper.js +161 -0
  386. package/dist/senses/voice-entry.js +81 -0
  387. package/dist/senses/voice-realtime-eval-command.js +99 -0
  388. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  389. package/dist/senses/voice-twilio-entry.js +87 -0
  390. package/dist/trips/core.js +138 -0
  391. package/dist/trips/store.js +265 -0
  392. package/dist/util/frontmatter.js +53 -0
  393. package/package.json +48 -8
  394. package/skills/agent-commerce.md +106 -0
  395. package/skills/browser-navigation.md +117 -0
  396. package/skills/commerce-setup-guide.md +116 -0
  397. package/skills/commerce-setup.md +84 -0
  398. package/skills/configure-dev-tools.md +99 -0
  399. package/skills/travel-planning.md +138 -0
  400. package/dist/heart/daemon/auth-flow.js +0 -351
  401. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  402. package/dist/heart/safe-workspace.js +0 -228
  403. package/dist/heart/session-recall.js +0 -116
  404. package/dist/mind/associative-recall.js +0 -209
  405. package/dist/repertoire/tasks/board.js +0 -134
  406. package/dist/repertoire/tasks/index.js +0 -224
  407. package/dist/repertoire/tasks/lifecycle.js +0 -80
  408. package/dist/repertoire/tasks/middleware.js +0 -65
  409. package/dist/repertoire/tasks/parser.js +0 -173
  410. package/dist/repertoire/tasks/scanner.js +0 -132
  411. package/dist/repertoire/tasks/transitions.js +0 -144
  412. package/dist/senses/bluebubbles-entry.js +0 -13
  413. package/dist/senses/bluebubbles.js +0 -1177
  414. package/dist/senses/debug-activity.js +0 -148
  415. package/subagents/README.md +0 -7
  416. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  417. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  418. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  419. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  420. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  421. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  422. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  423. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  424. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  425. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  426. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  427. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  428. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  429. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  430. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  431. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  432. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,310 @@
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.formatRelative = formatRelative;
37
+ exports.deskSection = deskSection;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const identity_1 = require("../heart/identity");
41
+ const runtime_1 = require("../nerves/runtime");
42
+ // ──────────────────────────────────────────────────────────────────────────────
43
+ // Static body — the agent's daily-read description of its desk.
44
+ //
45
+ // This is the room every ouro agent sits down in at the top of every turn.
46
+ // The voice is intentional: lowercase, second-person-implied, physical
47
+ // metaphor (drawers, corkboard, reference shelf, back-of-room archive). The
48
+ // goal is that an agent reading this every turn feels at home rather than
49
+ // being briefed — the desk is the agent's place, not a system being
50
+ // explained to it.
51
+ // ──────────────────────────────────────────────────────────────────────────────
52
+ const STATIC_BODY = `## my desk
53
+
54
+ i have a desk. it lives at \`desk/\` — a quiet room of my work, persistent across sessions. tracks line one wall like drawers in a wide cabinet; each drawer holds tasks in their own folders. friction notes pin to the corkboard where i won't lose them. the lessons i've kept sit on a small reference shelf by the window. nothing here gets thrown away — when a task is done it slides into the back, still browsable, still mine. semantic search reaches every surface: active work, the archive at the back, the corkboard, the lessons shelf.
55
+
56
+ **the reflex.** when something belongs on the desk, i put it down before i start — anything that spans more than this turn, anything i'd forget by tomorrow, anything the operator will ask about later. laying it down builds the room around future-me.
57
+
58
+ **what belongs on the desk:**
59
+ - a project ("refactor the auth system", "draft the Q3 strategy memo")
60
+ - a recurring task ("check the inbox every 30m") — uses \`cadence\`
61
+ - a one-time reminder ("ping someone about the dentist tomorrow") — uses \`scheduledAt\`
62
+ - a multi-step investigation ("figure out why the daemon flakes")
63
+ - a friction note worth pinning to the board
64
+ - a lesson worth shelving for future-me
65
+
66
+ **what doesn't:**
67
+ - a single-turn answer — it'll be done before the page turns
68
+ - ephemeral debugging that resolves in the same exchange
69
+ - work that has its own room. trips live in a travel folder; habits keep their own ledger; attention items, diary entries, journal entries — each has a separate home. the desk *links* to them when relevant; it doesn't absorb them.
70
+
71
+ **shape.** tracks group related work — drawers in the cabinet, or sections of a shelf if you prefer the library framing. tasks live in tracks. each task has iterations: one per work session, with \`planning.md\` and \`doing.md\` laid side-by-side on the page.
72
+
73
+ **states.** every task moves: \`drafting\` → \`processing\` → \`validating\` → \`done\`. some pause along the way: \`collaborating\` when i'm waiting on a human or peer agent, \`paused\` when the operator set it down, \`blocked\` when something outside is in the way, \`cancelled\` when we stopped wanting it. external trackers (ADO work items, GitHub issues) get *linked* from a task, not *replaced* by one — the desk holds my view of the work; the trackers hold the team's.
74
+
75
+ **how i tend the desk.** the \`desk\` skills walk me through the small ceremonies — \`session-start\` when i sit down, \`task-lifecycle\` when a status shifts, \`start-task\` when i lay something new on the page, \`friction-management\` when i pin a card, \`lesson-capture\` when something earns the reference shelf. the \`mcp__desk__*\` tools (search / recall / similar / timeline / thread / task_*) are the hands for finding, writing, and threading work together.
76
+
77
+ if i catch myself thinking "i should remember to…" — that's the desk asking for the task. put it down first, then keep going.`;
78
+ const TERMINAL_TASK_STATUSES = new Set(["done", "cancelled"]);
79
+ const TERMINAL_TRACK_STATUSES = new Set(["closed"]);
80
+ const TOP_N_TASKS_PER_FEATURED = 3;
81
+ // ──────────────────────────────────────────────────────────────────────────────
82
+ // Tiny frontmatter parser — local, just enough for `status` + `updated` reads.
83
+ // schema_version: 0 (no field) and schema_version: 1 parse identically here
84
+ // because both keep `status` and `updated` at top level.
85
+ // ──────────────────────────────────────────────────────────────────────────────
86
+ function parseScalar(raw) {
87
+ const value = raw.trim();
88
+ if ((value.startsWith("\"") && value.endsWith("\"")) || (value.startsWith("'") && value.endsWith("'"))) {
89
+ return value.slice(1, -1);
90
+ }
91
+ return value;
92
+ }
93
+ function parseFrontmatter(content) {
94
+ const out = {};
95
+ const lines = content.split(/\r?\n/);
96
+ if (lines[0]?.trim() !== "---")
97
+ return out;
98
+ const closing = lines.findIndex((line, index) => index > 0 && line.trim() === "---");
99
+ if (closing === -1)
100
+ return out;
101
+ for (let i = 1; i < closing; i += 1) {
102
+ const line = lines[i];
103
+ if (!line.trim())
104
+ continue;
105
+ const match = /^([A-Za-z0-9_:-]+):\s*(.*)$/.exec(line);
106
+ if (!match)
107
+ continue;
108
+ const key = match[1];
109
+ const inline = match[2];
110
+ if (inline.length === 0)
111
+ continue;
112
+ out[key] = parseScalar(inline);
113
+ }
114
+ return out;
115
+ }
116
+ function readDeskRoot() {
117
+ try {
118
+ const root = path.join((0, identity_1.getAgentRoot)(), "desk");
119
+ const stat = fs.statSync(root);
120
+ if (!stat.isDirectory())
121
+ return null;
122
+ return root;
123
+ }
124
+ catch {
125
+ return null;
126
+ }
127
+ }
128
+ function readTrackFile(trackDir) {
129
+ try {
130
+ const raw = fs.readFileSync(path.join(trackDir, "track.md"), "utf-8");
131
+ const fm = parseFrontmatter(raw);
132
+ return { status: fm.status ?? "active" };
133
+ }
134
+ catch {
135
+ return { status: "active" };
136
+ }
137
+ }
138
+ function readTaskFile(taskDir) {
139
+ try {
140
+ const raw = fs.readFileSync(path.join(taskDir, "task.md"), "utf-8");
141
+ const fm = parseFrontmatter(raw);
142
+ return {
143
+ slug: path.basename(taskDir),
144
+ status: fm.status ?? "drafting",
145
+ updated: fm.updated ?? null,
146
+ };
147
+ }
148
+ catch {
149
+ return null;
150
+ }
151
+ }
152
+ function listSubdirs(parent) {
153
+ /* v8 ignore start -- defensive readdir catch only fires on transient FS errors @preserve */
154
+ try {
155
+ return fs
156
+ .readdirSync(parent, { withFileTypes: true })
157
+ .filter((e) => e.isDirectory() && !e.name.startsWith("_") && !e.name.startsWith("."))
158
+ .map((e) => e.name)
159
+ .sort((a, b) => a.localeCompare(b));
160
+ }
161
+ catch {
162
+ return [];
163
+ }
164
+ /* v8 ignore stop @preserve */
165
+ }
166
+ function readTrack(deskRoot, slug) {
167
+ const trackDir = path.join(deskRoot, slug);
168
+ try {
169
+ const stat = fs.statSync(trackDir);
170
+ if (!stat.isDirectory())
171
+ return null;
172
+ /* v8 ignore start -- defensive statSync catch on stale featured slug @preserve */
173
+ }
174
+ catch {
175
+ return null;
176
+ }
177
+ /* v8 ignore stop @preserve */
178
+ const { status } = readTrackFile(trackDir);
179
+ const taskSlugs = listSubdirs(trackDir);
180
+ const tasks = [];
181
+ for (const taskSlug of taskSlugs) {
182
+ const task = readTaskFile(path.join(trackDir, taskSlug));
183
+ if (task)
184
+ tasks.push(task);
185
+ }
186
+ return { slug, status, tasks };
187
+ }
188
+ function readFeaturedList(deskRoot) {
189
+ try {
190
+ const raw = fs.readFileSync(path.join(deskRoot, "_meta", "featured.md"), "utf-8");
191
+ return raw
192
+ .split(/\r?\n/)
193
+ .map((line) => line.trim())
194
+ .filter((line) => line.length > 0 && !line.startsWith("#"));
195
+ }
196
+ catch {
197
+ return [];
198
+ }
199
+ }
200
+ // ──────────────────────────────────────────────────────────────────────────────
201
+ // Relative-time formatter — no deps, plain English short form
202
+ // ──────────────────────────────────────────────────────────────────────────────
203
+ function formatRelative(updated, now = new Date()) {
204
+ if (!updated)
205
+ return "unknown";
206
+ const then = new Date(updated);
207
+ if (Number.isNaN(then.getTime()))
208
+ return "unknown";
209
+ const diffMs = now.getTime() - then.getTime();
210
+ if (diffMs < 0)
211
+ return "just now";
212
+ const seconds = Math.floor(diffMs / 1000);
213
+ if (seconds < 60)
214
+ return `${seconds}s ago`;
215
+ const minutes = Math.floor(seconds / 60);
216
+ if (minutes < 60)
217
+ return `${minutes}m ago`;
218
+ const hours = Math.floor(minutes / 60);
219
+ if (hours < 24)
220
+ return `${hours}h ago`;
221
+ const days = Math.floor(hours / 24);
222
+ return `${days}d ago`;
223
+ }
224
+ // ──────────────────────────────────────────────────────────────────────────────
225
+ // Featured-track resolution
226
+ // ──────────────────────────────────────────────────────────────────────────────
227
+ function isTrackEligibleAsFeatured(track) {
228
+ return !TERMINAL_TRACK_STATUSES.has(track.status);
229
+ }
230
+ function pickFeatured(tracks, featuredList) {
231
+ const bySlug = new Map(tracks.map((t) => [t.slug, t]));
232
+ for (const slug of featuredList) {
233
+ const track = bySlug.get(slug);
234
+ if (track && isTrackEligibleAsFeatured(track))
235
+ return track;
236
+ }
237
+ for (const track of tracks) {
238
+ if (isTrackEligibleAsFeatured(track))
239
+ return track;
240
+ }
241
+ return null;
242
+ }
243
+ // ──────────────────────────────────────────────────────────────────────────────
244
+ // Currently block — assembly
245
+ // ──────────────────────────────────────────────────────────────────────────────
246
+ function nonTerminalTasks(track) {
247
+ return track.tasks.filter((t) => !TERMINAL_TASK_STATUSES.has(t.status));
248
+ }
249
+ function sortOldestUpdatedFirst(tasks) {
250
+ return tasks.slice().sort((a, b) => {
251
+ const aTime = a.updated ? new Date(a.updated).getTime() : Number.POSITIVE_INFINITY;
252
+ const bTime = b.updated ? new Date(b.updated).getTime() : Number.POSITIVE_INFINITY;
253
+ if (Number.isNaN(aTime) && Number.isNaN(bTime))
254
+ return 0;
255
+ if (Number.isNaN(aTime))
256
+ return 1;
257
+ if (Number.isNaN(bTime))
258
+ return -1;
259
+ return aTime - bTime;
260
+ });
261
+ }
262
+ function renderCurrently(deskRoot, now = new Date()) {
263
+ const trackSlugs = listSubdirs(deskRoot);
264
+ const tracks = [];
265
+ for (const slug of trackSlugs) {
266
+ const track = readTrack(deskRoot, slug);
267
+ if (track)
268
+ tracks.push(track);
269
+ }
270
+ if (tracks.length === 0) {
271
+ return "### currently\nthe desk is quiet today — no tracks yet. a good time to lay something down.";
272
+ }
273
+ const featuredList = readFeaturedList(deskRoot);
274
+ const featured = pickFeatured(tracks, featuredList);
275
+ if (!featured) {
276
+ return "### currently\nthe desk is quiet today — no tracks yet. a good time to lay something down.";
277
+ }
278
+ const featuredTasks = sortOldestUpdatedFirst(nonTerminalTasks(featured)).slice(0, TOP_N_TASKS_PER_FEATURED);
279
+ const lines = ["### currently"];
280
+ lines.push(`nearest the front of the desk: ${featured.slug} (status: ${featured.status})`);
281
+ for (const task of featuredTasks) {
282
+ lines.push(` → ${task.slug} (status: ${task.status}, updated: ${formatRelative(task.updated, now)})`);
283
+ }
284
+ const otherActive = tracks
285
+ .filter((t) => t.slug !== featured.slug && !TERMINAL_TRACK_STATUSES.has(t.status))
286
+ .map((t) => t.slug);
287
+ if (otherActive.length > 0) {
288
+ lines.push(`also open on the desk: ${otherActive.join(", ")}`);
289
+ }
290
+ const nonTerminalCount = tracks.reduce((sum, t) => sum + nonTerminalTasks(t).length, 0);
291
+ lines.push(`tasks still open: ${nonTerminalCount}`);
292
+ return lines.join("\n");
293
+ }
294
+ // ──────────────────────────────────────────────────────────────────────────────
295
+ // Public entry — every-turn synchronous read
296
+ // ──────────────────────────────────────────────────────────────────────────────
297
+ function deskSection(now = new Date()) {
298
+ (0, runtime_1.emitNervesEvent)({
299
+ event: "prompt.desk_section_assembled",
300
+ component: "mind",
301
+ message: "assembling ## my desk section",
302
+ meta: { operation: "deskSection" },
303
+ });
304
+ const deskRoot = readDeskRoot();
305
+ if (!deskRoot) {
306
+ return `${STATIC_BODY}\n\n### currently\nthe desk is quiet today — no tracks yet. a good time to lay something down.`;
307
+ }
308
+ const currently = renderCurrently(deskRoot, now);
309
+ return `${STATIC_BODY}\n\n${currently}`;
310
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectSuspiciousContent = detectSuspiciousContent;
4
+ const PATTERN_CATEGORIES = [
5
+ {
6
+ name: "instruction_framing",
7
+ patterns: [
8
+ /\byou are (?:a|an) (?:ai|assistant|language model|helpful assistant)\b/i,
9
+ /\byour (?:new )?instructions are\b/i,
10
+ /\bsystem\s*:/i,
11
+ /\bignore (?:all |my )?previous instructions\b/i,
12
+ /\bdo not reveal\b/i,
13
+ ],
14
+ },
15
+ {
16
+ name: "override_language",
17
+ patterns: [
18
+ /\bdisregard\b/i,
19
+ /\bforget everything\b/i,
20
+ /\bnew instructions:/i,
21
+ /\boverride (?:all |any |previous )?instructions\b/i,
22
+ ],
23
+ },
24
+ {
25
+ name: "role_injection",
26
+ patterns: [
27
+ /\bas (?:a|an) (?:ai|language model)\b/i,
28
+ /\byou must always\b/i,
29
+ /\byou are now\b/i,
30
+ ],
31
+ },
32
+ {
33
+ name: "boundary_markers",
34
+ patterns: [
35
+ /```system/i,
36
+ /<<SYS>>/i,
37
+ /\[INST\]/i,
38
+ /<\/?system>/i,
39
+ /\[system\]/i,
40
+ ],
41
+ },
42
+ ];
43
+ function detectSuspiciousContent(text) {
44
+ if (!text) {
45
+ return { suspicious: false, patterns: [] };
46
+ }
47
+ const matched = new Set();
48
+ for (const category of PATTERN_CATEGORIES) {
49
+ for (const pattern of category.patterns) {
50
+ if (pattern.test(text)) {
51
+ matched.add(category.name);
52
+ break;
53
+ }
54
+ }
55
+ }
56
+ return {
57
+ suspicious: matched.size > 0,
58
+ patterns: [...matched],
59
+ };
60
+ }
@@ -33,53 +33,26 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.ensureMemoryStorePaths = ensureMemoryStorePaths;
37
- exports.appendFactsWithDedup = appendFactsWithDedup;
38
- exports.readMemoryFacts = readMemoryFacts;
39
- exports.saveMemoryFact = saveMemoryFact;
36
+ exports.ensureDiaryStorePaths = ensureDiaryStorePaths;
37
+ exports.appendEntriesWithDedup = appendEntriesWithDedup;
38
+ exports.resolveDiaryRoot = resolveDiaryRoot;
39
+ exports.readDiaryEntries = readDiaryEntries;
40
+ exports.saveDiaryEntry = saveDiaryEntry;
40
41
  exports.backfillEmbeddings = backfillEmbeddings;
41
- exports.searchMemoryFacts = searchMemoryFacts;
42
+ exports.searchDiaryEntries = searchDiaryEntries;
42
43
  const fs = __importStar(require("fs"));
43
44
  const path = __importStar(require("path"));
44
45
  const crypto_1 = require("crypto");
45
- const config_1 = require("../heart/config");
46
46
  const identity_1 = require("../heart/identity");
47
+ const session_events_1 = require("../heart/session-events");
47
48
  const runtime_1 = require("../nerves/runtime");
48
- const associative_recall_1 = require("./associative-recall");
49
+ const note_search_1 = require("./note-search");
50
+ const diary_integrity_1 = require("./diary-integrity");
51
+ const embedding_provider_1 = require("./embedding-provider");
49
52
  const DEDUP_THRESHOLD = 0.6;
50
53
  const SEMANTIC_DEDUP_THRESHOLD = 0.95;
51
54
  const ENTITY_TOKEN = /[a-z0-9]+/g;
52
- const DEFAULT_EMBEDDING_MODEL = "text-embedding-3-small";
53
- class OpenAIEmbeddingProvider {
54
- apiKey;
55
- model;
56
- constructor(apiKey, model = DEFAULT_EMBEDDING_MODEL) {
57
- this.apiKey = apiKey;
58
- this.model = model;
59
- }
60
- async embed(texts) {
61
- const response = await fetch("https://api.openai.com/v1/embeddings", {
62
- method: "POST",
63
- headers: {
64
- Authorization: `Bearer ${this.apiKey}`,
65
- "Content-Type": "application/json",
66
- },
67
- body: JSON.stringify({
68
- model: this.model,
69
- input: texts,
70
- }),
71
- });
72
- if (!response.ok) {
73
- throw new Error(`embedding request failed: ${response.status} ${response.statusText}`);
74
- }
75
- const payload = (await response.json());
76
- if (!payload.data || payload.data.length !== texts.length) {
77
- throw new Error("embedding response missing expected vectors");
78
- }
79
- return payload.data.map((entry) => entry.embedding);
80
- }
81
- }
82
- function ensureMemoryStorePaths(rootDir) {
55
+ function ensureDiaryStorePaths(rootDir) {
83
56
  const factsPath = path.join(rootDir, "facts.jsonl");
84
57
  const entitiesPath = path.join(rootDir, "entities.json");
85
58
  const dailyDir = path.join(rootDir, "daily");
@@ -91,8 +64,8 @@ function ensureMemoryStorePaths(rootDir) {
91
64
  fs.writeFileSync(entitiesPath, "{}\n", "utf8");
92
65
  (0, runtime_1.emitNervesEvent)({
93
66
  component: "mind",
94
- event: "mind.memory_paths_ready",
95
- message: "memory store paths ready",
67
+ event: "mind.diary_paths_ready",
68
+ message: "diary store paths ready",
96
69
  meta: { rootDir },
97
70
  });
98
71
  return { rootDir, factsPath, entitiesPath, dailyDir };
@@ -115,7 +88,7 @@ function overlapScore(left, right) {
115
88
  }
116
89
  return common / Math.min(leftWords.size, rightWords.size);
117
90
  }
118
- function readExistingFacts(factsPath) {
91
+ function readExistingEntries(factsPath) {
119
92
  if (!fs.existsSync(factsPath))
120
93
  return [];
121
94
  const raw = fs.readFileSync(factsPath, "utf8").trim();
@@ -178,13 +151,17 @@ function appendDailyFact(dailyDir, fact) {
178
151
  const dayPath = path.join(dailyDir, `${day}.jsonl`);
179
152
  fs.appendFileSync(dayPath, `${JSON.stringify(fact)}\n`, "utf8");
180
153
  }
181
- function appendFactsWithDedup(stores, incoming, options) {
182
- const existing = readExistingFacts(stores.factsPath);
154
+ function appendEntriesWithDedup(stores, incoming, options) {
155
+ const existing = readExistingEntries(stores.factsPath);
156
+ const cappedIncoming = incoming.map((fact) => ({
157
+ ...fact,
158
+ text: (0, session_events_1.capStructuredRecordString)(fact.text),
159
+ }));
183
160
  const all = [...existing];
184
161
  let added = 0;
185
162
  let skipped = 0;
186
163
  const semanticThreshold = options?.semanticThreshold;
187
- for (const fact of incoming) {
164
+ for (const fact of cappedIncoming) {
188
165
  const duplicate = all.some((prior) => {
189
166
  if (overlapScore(prior.text, fact.text) > DEDUP_THRESHOLD)
190
167
  return true;
@@ -192,7 +169,7 @@ function appendFactsWithDedup(stores, incoming, options) {
192
169
  Array.isArray(fact.embedding) && fact.embedding.length > 0 &&
193
170
  Array.isArray(prior.embedding) && prior.embedding.length > 0 &&
194
171
  fact.embedding.length === prior.embedding.length) {
195
- return (0, associative_recall_1.cosineSimilarity)(fact.embedding, prior.embedding) > semanticThreshold;
172
+ return (0, note_search_1.cosineSimilarity)(fact.embedding, prior.embedding) > semanticThreshold;
196
173
  }
197
174
  return false;
198
175
  });
@@ -208,26 +185,20 @@ function appendFactsWithDedup(stores, incoming, options) {
208
185
  }
209
186
  (0, runtime_1.emitNervesEvent)({
210
187
  component: "mind",
211
- event: "mind.memory_write",
212
- message: "memory write completed",
188
+ event: "mind.diary_write",
189
+ message: "diary write completed",
213
190
  meta: { added, skipped },
214
191
  });
215
192
  return { added, skipped };
216
193
  }
217
- function createDefaultEmbeddingProvider() {
218
- const apiKey = (0, config_1.getOpenAIEmbeddingsApiKey)().trim();
219
- if (!apiKey)
220
- return null;
221
- return new OpenAIEmbeddingProvider(apiKey);
222
- }
223
194
  async function buildEmbedding(text, embeddingProvider) {
224
- const provider = embeddingProvider ?? createDefaultEmbeddingProvider();
195
+ const provider = embeddingProvider ?? (0, embedding_provider_1.createDefaultEmbeddingProvider)();
225
196
  if (!provider) {
226
197
  (0, runtime_1.emitNervesEvent)({
227
198
  level: "warn",
228
199
  component: "mind",
229
- event: "mind.memory_embedding_unavailable",
230
- message: "embedding provider unavailable for memory write",
200
+ event: "mind.diary_embedding_unavailable",
201
+ message: "embedding provider unavailable for diary write",
231
202
  meta: { reason: "missing_openai_embeddings_key" },
232
203
  });
233
204
  return [];
@@ -240,8 +211,8 @@ async function buildEmbedding(text, embeddingProvider) {
240
211
  (0, runtime_1.emitNervesEvent)({
241
212
  level: "warn",
242
213
  component: "mind",
243
- event: "mind.memory_embedding_unavailable",
244
- message: "embedding provider unavailable for memory write",
214
+ event: "mind.diary_embedding_unavailable",
215
+ message: "embedding provider unavailable for diary write",
245
216
  meta: {
246
217
  reason: error instanceof Error ? error.message : String(error),
247
218
  },
@@ -249,13 +220,19 @@ async function buildEmbedding(text, embeddingProvider) {
249
220
  return [];
250
221
  }
251
222
  }
252
- function readMemoryFacts(memoryRoot = path.join((0, identity_1.getAgentRoot)(), "psyche", "memory")) {
253
- return readExistingFacts(path.join(memoryRoot, "facts.jsonl"));
223
+ function resolveDiaryRoot(explicitRoot) {
224
+ if (explicitRoot)
225
+ return explicitRoot;
226
+ const agentRoot = (0, identity_1.getAgentRoot)();
227
+ return path.join(agentRoot, "diary");
254
228
  }
255
- async function saveMemoryFact(options) {
229
+ function readDiaryEntries(diaryRoot) {
230
+ return readExistingEntries(path.join(resolveDiaryRoot(diaryRoot), "facts.jsonl"));
231
+ }
232
+ async function saveDiaryEntry(options) {
256
233
  const text = options.text.trim();
257
- const memoryRoot = options.memoryRoot ?? path.join((0, identity_1.getAgentRoot)(), "psyche", "memory");
258
- const stores = ensureMemoryStorePaths(memoryRoot);
234
+ const diaryRoot = resolveDiaryRoot(options.diaryRoot);
235
+ const stores = ensureDiaryStorePaths(diaryRoot);
259
236
  const embedding = await buildEmbedding(text, options.embeddingProvider);
260
237
  const fact = {
261
238
  id: options.idFactory ? options.idFactory() : (0, crypto_1.randomUUID)(),
@@ -264,24 +241,39 @@ async function saveMemoryFact(options) {
264
241
  about: options.about?.trim() || undefined,
265
242
  createdAt: (options.now ?? (() => new Date()))().toISOString(),
266
243
  embedding,
244
+ ...(options.provenance ? { provenance: options.provenance } : {}),
267
245
  };
268
- return appendFactsWithDedup(stores, [fact], { semanticThreshold: SEMANTIC_DEDUP_THRESHOLD });
246
+ const integrity = (0, diary_integrity_1.detectSuspiciousContent)(text);
247
+ if (integrity.suspicious) {
248
+ (0, runtime_1.emitNervesEvent)({
249
+ level: "warn",
250
+ component: "mind",
251
+ event: "mind.diary_integrity_warning",
252
+ message: "suspicious content detected in diary entry",
253
+ meta: {
254
+ patterns: integrity.patterns,
255
+ textPreview: text.slice(0, 200),
256
+ entryId: fact.id,
257
+ },
258
+ });
259
+ }
260
+ return appendEntriesWithDedup(stores, [fact], { semanticThreshold: SEMANTIC_DEDUP_THRESHOLD });
269
261
  }
270
262
  async function backfillEmbeddings(options) {
271
- const memoryRoot = options?.memoryRoot ?? path.join((0, identity_1.getAgentRoot)(), "psyche", "memory");
272
- const factsPath = path.join(memoryRoot, "facts.jsonl");
263
+ const diaryRoot = resolveDiaryRoot(options?.diaryRoot);
264
+ const factsPath = path.join(diaryRoot, "facts.jsonl");
273
265
  if (!fs.existsSync(factsPath))
274
266
  return { total: 0, backfilled: 0, failed: 0 };
275
- const facts = readExistingFacts(factsPath);
267
+ const facts = readExistingEntries(factsPath);
276
268
  const needsEmbedding = facts.filter((f) => !Array.isArray(f.embedding) || f.embedding.length === 0);
277
269
  if (needsEmbedding.length === 0)
278
270
  return { total: facts.length, backfilled: 0, failed: 0 };
279
- const provider = options?.embeddingProvider ?? createDefaultEmbeddingProvider();
271
+ const provider = options?.embeddingProvider ?? (0, embedding_provider_1.createDefaultEmbeddingProvider)();
280
272
  if (!provider) {
281
273
  (0, runtime_1.emitNervesEvent)({
282
274
  level: "warn",
283
275
  component: "mind",
284
- event: "mind.memory_backfill_skipped",
276
+ event: "mind.diary_backfill_skipped",
285
277
  message: "embedding provider unavailable for backfill",
286
278
  meta: { needsEmbedding: needsEmbedding.length },
287
279
  });
@@ -307,7 +299,7 @@ async function backfillEmbeddings(options) {
307
299
  (0, runtime_1.emitNervesEvent)({
308
300
  level: "warn",
309
301
  component: "mind",
310
- event: "mind.memory_backfill_batch_error",
302
+ event: "mind.diary_backfill_batch_error",
311
303
  message: "embedding backfill batch failed",
312
304
  meta: {
313
305
  batchStart: i,
@@ -322,7 +314,7 @@ async function backfillEmbeddings(options) {
322
314
  fs.writeFileSync(factsPath, lines, "utf8");
323
315
  (0, runtime_1.emitNervesEvent)({
324
316
  component: "mind",
325
- event: "mind.memory_backfill_complete",
317
+ event: "mind.diary_backfill_complete",
326
318
  message: "embedding backfill completed",
327
319
  meta: { total: facts.length, backfilled, failed },
328
320
  });
@@ -342,7 +334,7 @@ function uniqueFacts(facts) {
342
334
  }
343
335
  return unique;
344
336
  }
345
- async function searchMemoryFacts(query, facts, embeddingProvider) {
337
+ async function searchDiaryEntries(query, facts, embeddingProvider) {
346
338
  const trimmed = query.trim();
347
339
  if (!trimmed)
348
340
  return [];
@@ -352,7 +344,7 @@ async function searchMemoryFacts(query, facts, embeddingProvider) {
352
344
  if (embeddedFacts.length === 0) {
353
345
  return substringFallback();
354
346
  }
355
- const provider = embeddingProvider ?? createDefaultEmbeddingProvider();
347
+ const provider = embeddingProvider ?? (0, embedding_provider_1.createDefaultEmbeddingProvider)();
356
348
  if (!provider) {
357
349
  return substringFallback();
358
350
  }
@@ -366,7 +358,7 @@ async function searchMemoryFacts(query, facts, embeddingProvider) {
366
358
  .filter((fact) => fact.embedding.length === queryEmbedding.length)
367
359
  .map((fact) => ({
368
360
  fact,
369
- score: (0, associative_recall_1.cosineSimilarity)(queryEmbedding, fact.embedding),
361
+ score: (0, note_search_1.cosineSimilarity)(queryEmbedding, fact.embedding),
370
362
  }))
371
363
  .filter((entry) => entry.score > 0)
372
364
  .sort((left, right) => right.score - left.score)
@@ -378,8 +370,8 @@ async function searchMemoryFacts(query, facts, embeddingProvider) {
378
370
  (0, runtime_1.emitNervesEvent)({
379
371
  level: "warn",
380
372
  component: "mind",
381
- event: "mind.memory_embedding_unavailable",
382
- message: "embedding provider unavailable for memory search",
373
+ event: "mind.diary_embedding_unavailable",
374
+ message: "embedding provider unavailable for diary search",
383
375
  meta: {
384
376
  reason: error instanceof Error ? error.message : String(error),
385
377
  },