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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/README.md +127 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +3596 -0
  13. package/dist/arc/attention-types.js +8 -0
  14. package/dist/arc/cares.js +140 -0
  15. package/dist/arc/episodes.js +117 -0
  16. package/dist/arc/intentions.js +133 -0
  17. package/dist/arc/json-store.js +117 -0
  18. package/dist/arc/obligations.js +237 -0
  19. package/dist/arc/packets.js +193 -0
  20. package/dist/arc/presence.js +185 -0
  21. package/dist/arc/task-lifecycle.js +65 -0
  22. package/dist/heart/active-work.js +837 -26
  23. package/dist/heart/agent-entry.js +58 -3
  24. package/dist/heart/attachments/image-normalize.js +194 -0
  25. package/dist/heart/attachments/materialize.js +97 -0
  26. package/dist/heart/attachments/originals.js +88 -0
  27. package/dist/heart/attachments/render.js +29 -0
  28. package/dist/heart/attachments/sources/adapter.js +2 -0
  29. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  30. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  31. package/dist/heart/attachments/sources/index.js +16 -0
  32. package/dist/heart/attachments/store.js +103 -0
  33. package/dist/heart/attachments/types.js +93 -0
  34. package/dist/heart/auth/auth-flow.js +479 -0
  35. package/dist/heart/background-operations.js +281 -0
  36. package/dist/heart/bundle-state.js +168 -0
  37. package/dist/heart/commitments.js +111 -0
  38. package/dist/heart/config-registry.js +322 -0
  39. package/dist/heart/config.js +114 -118
  40. package/dist/heart/core.js +913 -246
  41. package/dist/heart/cross-chat-delivery.js +3 -18
  42. package/dist/heart/daemon/agent-config-check.js +419 -0
  43. package/dist/heart/daemon/agent-discovery.js +102 -3
  44. package/dist/heart/daemon/agent-service.js +522 -0
  45. package/dist/heart/daemon/agentic-repair.js +547 -0
  46. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  47. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  48. package/dist/heart/daemon/cadence.js +70 -0
  49. package/dist/heart/daemon/cli-defaults.js +776 -0
  50. package/dist/heart/daemon/cli-exec.js +7457 -0
  51. package/dist/heart/daemon/cli-help.js +498 -0
  52. package/dist/heart/daemon/cli-parse.js +1592 -0
  53. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  54. package/dist/heart/daemon/cli-render.js +763 -0
  55. package/dist/heart/daemon/cli-types.js +8 -0
  56. package/dist/heart/daemon/connect-bay.js +323 -0
  57. package/dist/heart/daemon/daemon-cli.js +29 -1698
  58. package/dist/heart/daemon/daemon-entry.js +387 -2
  59. package/dist/heart/daemon/daemon-health.js +176 -0
  60. package/dist/heart/daemon/daemon-rollup.js +57 -0
  61. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  62. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  63. package/dist/heart/daemon/daemon.js +796 -71
  64. package/dist/heart/daemon/dns-workflow.js +394 -0
  65. package/dist/heart/daemon/doctor-types.js +8 -0
  66. package/dist/heart/daemon/doctor.js +826 -0
  67. package/dist/heart/daemon/health-monitor.js +122 -1
  68. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  69. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  70. package/dist/heart/daemon/http-health-probe.js +80 -0
  71. package/dist/heart/daemon/human-command-screens.js +234 -0
  72. package/dist/heart/daemon/human-readiness.js +114 -0
  73. package/dist/heart/daemon/inner-status.js +89 -0
  74. package/dist/heart/daemon/interactive-repair.js +394 -0
  75. package/dist/heart/daemon/launchd.js +37 -8
  76. package/dist/heart/daemon/log-tailer.js +82 -12
  77. package/dist/heart/daemon/logs-prune.js +110 -0
  78. package/dist/heart/daemon/mcp-canary.js +297 -0
  79. package/dist/heart/daemon/message-router.js +2 -2
  80. package/dist/heart/daemon/os-cron-deps.js +135 -0
  81. package/dist/heart/daemon/os-cron.js +14 -12
  82. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  83. package/dist/heart/daemon/ouro-entry.js +3 -1
  84. package/dist/heart/daemon/process-manager.js +375 -33
  85. package/dist/heart/daemon/provider-discovery.js +137 -0
  86. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  87. package/dist/heart/daemon/pulse.js +475 -0
  88. package/dist/heart/daemon/readiness-repair.js +365 -0
  89. package/dist/heart/daemon/run-hooks.js +2 -0
  90. package/dist/heart/daemon/runtime-logging.js +67 -16
  91. package/dist/heart/daemon/runtime-metadata.js +3 -31
  92. package/dist/heart/daemon/safe-mode.js +161 -0
  93. package/dist/heart/daemon/sense-manager.js +389 -38
  94. package/dist/heart/daemon/session-id-resolver.js +131 -0
  95. package/dist/heart/daemon/skill-management-installer.js +94 -0
  96. package/dist/heart/daemon/socket-client.js +158 -11
  97. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  98. package/dist/heart/daemon/startup-tui.js +330 -0
  99. package/dist/heart/daemon/task-scheduler.js +3 -25
  100. package/dist/heart/daemon/terminal-ui.js +499 -0
  101. package/dist/heart/daemon/thoughts.js +162 -17
  102. package/dist/heart/daemon/up-progress.js +366 -0
  103. package/dist/heart/daemon/vault-items.js +56 -0
  104. package/dist/heart/delegation.js +1 -1
  105. package/dist/heart/habits/habit-migration.js +189 -0
  106. package/dist/heart/habits/habit-parser.js +140 -0
  107. package/dist/heart/habits/habit-runtime-state.js +100 -0
  108. package/dist/heart/habits/habit-scheduler.js +372 -0
  109. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  110. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  111. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  112. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  113. package/dist/heart/identity.js +203 -57
  114. package/dist/heart/kept-notes.js +357 -0
  115. package/dist/heart/kicks.js +1 -1
  116. package/dist/heart/machine-identity.js +161 -0
  117. package/dist/heart/mail-import-discovery.js +353 -0
  118. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  119. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  120. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  121. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  122. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  123. package/dist/heart/mailbox/mailbox-http.js +99 -0
  124. package/dist/heart/mailbox/mailbox-read.js +31 -0
  125. package/dist/heart/mailbox/mailbox-types.js +27 -0
  126. package/dist/heart/mailbox/mailbox-view.js +195 -0
  127. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  128. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  129. package/dist/heart/mailbox/readers/mail.js +362 -0
  130. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  131. package/dist/heart/mailbox/readers/sessions.js +232 -0
  132. package/dist/heart/mailbox/readers/shared.js +111 -0
  133. package/dist/heart/mcp/mcp-server.js +683 -0
  134. package/dist/heart/migrate-config.js +100 -0
  135. package/dist/heart/model-capabilities.js +19 -0
  136. package/dist/heart/platform.js +81 -0
  137. package/dist/heart/provider-attempt.js +134 -0
  138. package/dist/heart/provider-binding-resolver.js +267 -0
  139. package/dist/heart/provider-credentials.js +425 -0
  140. package/dist/heart/provider-failover.js +301 -0
  141. package/dist/heart/provider-models.js +81 -0
  142. package/dist/heart/provider-ping.js +262 -0
  143. package/dist/heart/provider-readiness-cache.js +40 -0
  144. package/dist/heart/provider-visibility.js +188 -0
  145. package/dist/heart/providers/anthropic-token.js +131 -0
  146. package/dist/heart/providers/anthropic.js +139 -52
  147. package/dist/heart/providers/azure.js +97 -13
  148. package/dist/heart/providers/error-classification.js +127 -0
  149. package/dist/heart/providers/github-copilot.js +145 -0
  150. package/dist/heart/providers/minimax-vlm.js +189 -0
  151. package/dist/heart/providers/minimax.js +26 -8
  152. package/dist/heart/providers/openai-codex.js +55 -40
  153. package/dist/heart/runtime-capability-check.js +170 -0
  154. package/dist/heart/runtime-credentials.js +367 -0
  155. package/dist/heart/runtime-cwd.js +87 -0
  156. package/dist/heart/sense-truth.js +13 -4
  157. package/dist/heart/session-activity.js +43 -22
  158. package/dist/heart/session-events.js +1149 -0
  159. package/dist/heart/session-playback-cli-main.js +5 -0
  160. package/dist/heart/session-playback-cli.js +36 -0
  161. package/dist/heart/session-playback.js +231 -0
  162. package/dist/heart/session-stats-cli-main.js +5 -0
  163. package/dist/heart/session-stats.js +182 -0
  164. package/dist/heart/session-transcript.js +243 -0
  165. package/dist/heart/start-of-turn-packet.js +345 -0
  166. package/dist/heart/streaming.js +44 -27
  167. package/dist/heart/sync-classification.js +176 -0
  168. package/dist/heart/sync.js +449 -0
  169. package/dist/heart/target-resolution.js +9 -5
  170. package/dist/heart/tempo.js +93 -0
  171. package/dist/heart/temporal-view.js +41 -0
  172. package/dist/heart/timeouts.js +101 -0
  173. package/dist/heart/tool-activity-callbacks.js +59 -0
  174. package/dist/heart/tool-description.js +139 -0
  175. package/dist/heart/tool-friction.js +55 -0
  176. package/dist/heart/tool-loop.js +200 -0
  177. package/dist/heart/turn-context.js +389 -0
  178. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  179. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  180. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  181. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  182. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  183. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  184. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  185. package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
  186. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  187. package/dist/mailbox-ui/index.html +15 -0
  188. package/dist/mailroom/attention.js +167 -0
  189. package/dist/mailroom/autonomy.js +209 -0
  190. package/dist/mailroom/blob-store.js +674 -0
  191. package/dist/mailroom/body-cache.js +61 -0
  192. package/dist/mailroom/core.js +720 -0
  193. package/dist/mailroom/entry.js +160 -0
  194. package/dist/mailroom/file-store.js +430 -0
  195. package/dist/mailroom/mbox-import.js +383 -0
  196. package/dist/mailroom/outbound.js +380 -0
  197. package/dist/mailroom/policy.js +263 -0
  198. package/dist/mailroom/reader.js +233 -0
  199. package/dist/mailroom/search-cache.js +256 -0
  200. package/dist/mailroom/search-relevance.js +319 -0
  201. package/dist/mailroom/smtp-ingress.js +176 -0
  202. package/dist/mailroom/source-state.js +176 -0
  203. package/dist/mailroom/thread.js +109 -0
  204. package/dist/mailroom/travel-extract.js +89 -0
  205. package/dist/mind/bundle-manifest.js +7 -1
  206. package/dist/mind/context.js +165 -101
  207. package/dist/mind/diary-integrity.js +60 -0
  208. package/dist/mind/{memory.js → diary.js} +62 -75
  209. package/dist/mind/embedding-provider.js +60 -0
  210. package/dist/mind/file-state.js +179 -0
  211. package/dist/mind/friends/channel.js +39 -0
  212. package/dist/mind/friends/resolver.js +54 -2
  213. package/dist/mind/friends/store-file.js +39 -3
  214. package/dist/mind/friends/types.js +2 -2
  215. package/dist/mind/journal-index.js +161 -0
  216. package/dist/mind/note-search.js +268 -0
  217. package/dist/mind/obligation-steering.js +221 -0
  218. package/dist/mind/pending.js +4 -0
  219. package/dist/mind/prompt-refresh.js +3 -2
  220. package/dist/mind/prompt.js +1011 -123
  221. package/dist/mind/provenance-trust.js +26 -0
  222. package/dist/mind/scrutiny.js +173 -0
  223. package/dist/nerves/cli-logging.js +7 -1
  224. package/dist/nerves/coverage/audit-rules.js +15 -6
  225. package/dist/nerves/coverage/audit.js +28 -2
  226. package/dist/nerves/coverage/cli.js +1 -1
  227. package/dist/nerves/coverage/contract.js +5 -5
  228. package/dist/nerves/coverage/file-completeness.js +129 -5
  229. package/dist/nerves/coverage/run-artifacts.js +1 -1
  230. package/dist/nerves/event-buffer.js +111 -0
  231. package/dist/nerves/index.js +224 -4
  232. package/dist/nerves/observation.js +20 -0
  233. package/dist/nerves/redact.js +79 -0
  234. package/dist/nerves/review/cli-main.js +5 -0
  235. package/dist/nerves/review/cli.js +156 -0
  236. package/dist/nerves/review/core.js +152 -0
  237. package/dist/nerves/runtime.js +5 -1
  238. package/dist/repertoire/ado-client.js +15 -56
  239. package/dist/repertoire/ado-semantic.js +11 -10
  240. package/dist/repertoire/api-client.js +97 -0
  241. package/dist/repertoire/bitwarden-store.js +963 -0
  242. package/dist/repertoire/bundle-templates.js +72 -0
  243. package/dist/repertoire/bw-installer.js +180 -0
  244. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  245. package/dist/repertoire/coding/context-pack.js +330 -0
  246. package/dist/repertoire/coding/feedback.js +197 -30
  247. package/dist/repertoire/coding/manager.js +158 -9
  248. package/dist/repertoire/coding/spawner.js +55 -9
  249. package/dist/repertoire/coding/tools.js +170 -7
  250. package/dist/repertoire/commerce-errors.js +109 -0
  251. package/dist/repertoire/commerce-self-test.js +156 -0
  252. package/dist/repertoire/credential-access.js +178 -0
  253. package/dist/repertoire/duffel-client.js +185 -0
  254. package/dist/repertoire/github-client.js +14 -55
  255. package/dist/repertoire/graph-client.js +11 -52
  256. package/dist/repertoire/guardrails.js +396 -0
  257. package/dist/repertoire/mcp-client.js +295 -0
  258. package/dist/repertoire/mcp-manager.js +362 -0
  259. package/dist/repertoire/mcp-tools.js +63 -0
  260. package/dist/repertoire/shell-sessions.js +133 -0
  261. package/dist/repertoire/skills.js +15 -24
  262. package/dist/repertoire/stripe-client.js +131 -0
  263. package/dist/repertoire/tasks/board.js +31 -5
  264. package/dist/repertoire/tasks/fix.js +182 -0
  265. package/dist/repertoire/tasks/index.js +16 -4
  266. package/dist/repertoire/tasks/lifecycle.js +2 -2
  267. package/dist/repertoire/tasks/parser.js +3 -2
  268. package/dist/repertoire/tasks/scanner.js +194 -37
  269. package/dist/repertoire/tasks/transitions.js +16 -78
  270. package/dist/repertoire/tool-results.js +29 -0
  271. package/dist/repertoire/tools-attachments.js +317 -0
  272. package/dist/repertoire/tools-base.js +47 -1075
  273. package/dist/repertoire/tools-bluebubbles.js +1 -0
  274. package/dist/repertoire/tools-bridge.js +142 -0
  275. package/dist/repertoire/tools-bundle.js +984 -0
  276. package/dist/repertoire/tools-config.js +185 -0
  277. package/dist/repertoire/tools-continuity.js +248 -0
  278. package/dist/repertoire/tools-credential.js +381 -0
  279. package/dist/repertoire/tools-files.js +342 -0
  280. package/dist/repertoire/tools-flight.js +224 -0
  281. package/dist/repertoire/tools-flow.js +119 -0
  282. package/dist/repertoire/tools-github.js +1 -7
  283. package/dist/repertoire/tools-mail.js +1857 -0
  284. package/dist/repertoire/tools-notes.js +421 -0
  285. package/dist/repertoire/tools-session.js +750 -0
  286. package/dist/repertoire/tools-shell.js +120 -0
  287. package/dist/repertoire/tools-stripe.js +180 -0
  288. package/dist/repertoire/tools-surface.js +243 -0
  289. package/dist/repertoire/tools-teams.js +9 -39
  290. package/dist/repertoire/tools-travel.js +125 -0
  291. package/dist/repertoire/tools-trip.js +604 -0
  292. package/dist/repertoire/tools-user-profile.js +144 -0
  293. package/dist/repertoire/tools-vault.js +40 -0
  294. package/dist/repertoire/tools.js +108 -100
  295. package/dist/repertoire/travel-api-client.js +360 -0
  296. package/dist/repertoire/user-profile.js +131 -0
  297. package/dist/repertoire/vault-setup.js +246 -0
  298. package/dist/repertoire/vault-unlock.js +594 -0
  299. package/dist/scripts/claude-code-hook.js +41 -0
  300. package/dist/scripts/claude-code-stop-hook.js +47 -0
  301. package/dist/senses/attention-queue.js +116 -0
  302. package/dist/senses/bluebubbles/active-turns.js +216 -0
  303. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  304. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  305. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  306. package/dist/senses/bluebubbles/entry.js +77 -0
  307. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  308. package/dist/senses/bluebubbles/index.js +2305 -0
  309. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  310. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  311. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  312. package/dist/senses/bluebubbles/processed-log.js +133 -0
  313. package/dist/senses/bluebubbles/replay.js +137 -0
  314. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  315. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  316. package/dist/senses/cli/bracketed-paste.js +82 -0
  317. package/dist/senses/cli/image-paste.js +287 -0
  318. package/dist/senses/cli/image-ref-navigation.js +75 -0
  319. package/dist/senses/cli/ink-app.js +156 -0
  320. package/dist/senses/cli/inline-diff.js +64 -0
  321. package/dist/senses/cli/input-keys.js +174 -0
  322. package/dist/senses/cli/kill-ring.js +86 -0
  323. package/dist/senses/cli/message-list.js +51 -0
  324. package/dist/senses/cli/ouro-tui.js +607 -0
  325. package/dist/senses/cli/spinner-imperative.js +135 -0
  326. package/dist/senses/cli/spinner.js +101 -0
  327. package/dist/senses/cli/status-line.js +60 -0
  328. package/dist/senses/cli/streaming-markdown.js +526 -0
  329. package/dist/senses/cli/tool-display.js +85 -0
  330. package/dist/senses/cli/tool-render.js +85 -0
  331. package/dist/senses/cli/tui-store.js +240 -0
  332. package/dist/senses/cli/virtual-list.js +35 -0
  333. package/dist/senses/cli-entry.js +60 -8
  334. package/dist/senses/cli-layout.js +187 -0
  335. package/dist/senses/cli.js +520 -209
  336. package/dist/senses/commands.js +66 -3
  337. package/dist/senses/habit-turn-message.js +108 -0
  338. package/dist/senses/inner-dialog-worker.js +175 -21
  339. package/dist/senses/inner-dialog.js +330 -27
  340. package/dist/senses/mail-entry.js +66 -0
  341. package/dist/senses/mail.js +379 -0
  342. package/dist/senses/pipeline.js +549 -181
  343. package/dist/senses/proactive-content-guard.js +51 -0
  344. package/dist/senses/shared-turn.js +248 -0
  345. package/dist/senses/surface-tool.js +68 -0
  346. package/dist/senses/teams-entry.js +60 -8
  347. package/dist/senses/teams.js +387 -98
  348. package/dist/senses/trust-gate.js +100 -5
  349. package/dist/senses/voice/elevenlabs.js +125 -0
  350. package/dist/senses/voice/index.js +22 -0
  351. package/dist/senses/voice/transcript.js +70 -0
  352. package/dist/senses/voice/turn.js +85 -0
  353. package/dist/senses/voice/types.js +2 -0
  354. package/dist/senses/voice/whisper.js +133 -0
  355. package/dist/senses/voice-entry.js +80 -0
  356. package/dist/trips/core.js +138 -0
  357. package/dist/trips/store.js +146 -0
  358. package/package.json +38 -7
  359. package/skills/agent-commerce.md +106 -0
  360. package/skills/browser-navigation.md +117 -0
  361. package/skills/commerce-setup-guide.md +116 -0
  362. package/skills/commerce-setup.md +84 -0
  363. package/skills/configure-dev-tools.md +101 -0
  364. package/skills/travel-planning.md +138 -0
  365. package/dist/heart/daemon/auth-flow.js +0 -351
  366. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  367. package/dist/heart/daemon/subagent-installer.js +0 -166
  368. package/dist/heart/session-recall.js +0 -116
  369. package/dist/mind/associative-recall.js +0 -209
  370. package/dist/senses/bluebubbles-entry.js +0 -13
  371. package/dist/senses/bluebubbles.js +0 -1177
  372. package/dist/senses/debug-activity.js +0 -148
  373. package/subagents/README.md +0 -86
  374. package/subagents/work-doer.md +0 -237
  375. package/subagents/work-merger.md +0 -618
  376. package/subagents/work-planner.md +0 -390
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  383. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  384. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  385. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  386. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  387. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  388. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  389. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  390. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  391. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  392. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -55,10 +55,29 @@ class FileFriendStore {
55
55
  });
56
56
  }
57
57
  async get(id) {
58
+ // Direct UUID lookup
58
59
  const record = await this.readJson(path.join(this.friendsPath, `${id}.json`));
59
- if (!record)
60
- return null;
61
- return this.normalize(record);
60
+ if (record)
61
+ return this.normalize(record);
62
+ // Fallback: if id is a name (not UUID), scan for matching friend
63
+ /* v8 ignore start -- name fallback: exercised by live proactive sends @preserve */
64
+ try {
65
+ const entries = await fsPromises.readdir(this.friendsPath);
66
+ for (const entry of entries) {
67
+ if (!entry.endsWith(".json"))
68
+ continue;
69
+ const raw = await this.readJson(path.join(this.friendsPath, entry));
70
+ if (!raw)
71
+ continue;
72
+ const normalized = this.normalize(raw);
73
+ if (normalized.name?.toLowerCase() === id.toLowerCase()) {
74
+ return normalized;
75
+ }
76
+ }
77
+ }
78
+ catch { /* directory unreadable — return null */ }
79
+ /* v8 ignore stop */
80
+ return null;
62
81
  }
63
82
  async put(id, record) {
64
83
  await this.writeJson(path.join(this.friendsPath, `${id}.json`), this.normalize(record));
@@ -127,6 +146,8 @@ class FileFriendStore {
127
146
  trustLevel === "stranger"
128
147
  ? trustLevel
129
148
  : DEFAULT_TRUST_LEVEL;
149
+ const kind = raw.kind === "human" || raw.kind === "agent" ? raw.kind : "human";
150
+ const agentMeta = kind === "agent" ? this.normalizeAgentMeta(raw.agentMeta) : undefined;
130
151
  return {
131
152
  id: raw.id,
132
153
  name: raw.name,
@@ -153,6 +174,21 @@ class FileFriendStore {
153
174
  createdAt: typeof raw.createdAt === "string" ? raw.createdAt : new Date().toISOString(),
154
175
  updatedAt: typeof raw.updatedAt === "string" ? raw.updatedAt : new Date().toISOString(),
155
176
  schemaVersion: typeof raw.schemaVersion === "number" ? raw.schemaVersion : 1,
177
+ kind,
178
+ agentMeta,
179
+ };
180
+ }
181
+ normalizeAgentMeta(raw) {
182
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
183
+ return undefined;
184
+ const meta = raw;
185
+ if (typeof meta.bundleName !== "string")
186
+ return undefined;
187
+ return {
188
+ bundleName: meta.bundleName,
189
+ familiarity: typeof meta.familiarity === "number" ? meta.familiarity : 0,
190
+ sharedMissions: Array.isArray(meta.sharedMissions) ? meta.sharedMissions : [],
191
+ outcomes: Array.isArray(meta.outcomes) ? meta.outcomes : [],
156
192
  };
157
193
  }
158
194
  async readJson(filePath) {
@@ -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,161 @@
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 runtime_1 = require("../nerves/runtime");
40
+ const TEXT_EXTENSIONS = new Set([".md", ".txt"]);
41
+ const PREVIEW_CHAR_LIMIT = 500;
42
+ function readExistingIndex(indexPath) {
43
+ try {
44
+ const raw = fs.readFileSync(indexPath, "utf8");
45
+ const parsed = JSON.parse(raw);
46
+ if (!Array.isArray(parsed))
47
+ return [];
48
+ return parsed;
49
+ }
50
+ catch {
51
+ return [];
52
+ }
53
+ }
54
+ function extractPreview(content) {
55
+ const trimmed = content.trim();
56
+ if (!trimmed)
57
+ return "";
58
+ return trimmed.split("\n")[0].replace(/^#+\s*/, "").trim();
59
+ }
60
+ async function indexJournalFiles(journalDir, indexPath, embedProvider) {
61
+ // Read existing index
62
+ const existingIndex = readExistingIndex(indexPath);
63
+ const indexMap = new Map();
64
+ for (const entry of existingIndex) {
65
+ indexMap.set(entry.filename, entry);
66
+ }
67
+ // Scan journal dir for text files
68
+ let dirEntries;
69
+ try {
70
+ dirEntries = fs.readdirSync(journalDir, { withFileTypes: true });
71
+ }
72
+ catch {
73
+ (0, runtime_1.emitNervesEvent)({
74
+ component: "mind",
75
+ event: "mind.journal_index_scan",
76
+ message: "journal dir not found or unreadable",
77
+ meta: { journalDir },
78
+ });
79
+ return 0;
80
+ }
81
+ const textFiles = dirEntries.filter((entry) => {
82
+ if (!entry.isFile())
83
+ return false;
84
+ if (entry.name.startsWith("."))
85
+ return false;
86
+ const ext = path.extname(entry.name).toLowerCase();
87
+ return TEXT_EXTENSIONS.has(ext);
88
+ });
89
+ if (textFiles.length === 0) {
90
+ (0, runtime_1.emitNervesEvent)({
91
+ component: "mind",
92
+ event: "mind.journal_index_scan",
93
+ message: "no text files found in journal",
94
+ meta: { journalDir },
95
+ });
96
+ return 0;
97
+ }
98
+ let newlyIndexed = 0;
99
+ for (const file of textFiles) {
100
+ const filePath = path.join(journalDir, file.name);
101
+ let stat;
102
+ try {
103
+ stat = fs.statSync(filePath);
104
+ }
105
+ catch {
106
+ /* v8 ignore next -- filesystem race: file deleted between readdir and stat @preserve */
107
+ continue;
108
+ }
109
+ // Check if already indexed with same mtime
110
+ const existing = indexMap.get(file.name);
111
+ if (existing && existing.mtime === stat.mtimeMs) {
112
+ continue;
113
+ }
114
+ // Read content for embedding
115
+ let content;
116
+ try {
117
+ content = fs.readFileSync(filePath, "utf8");
118
+ }
119
+ catch {
120
+ /* v8 ignore next -- filesystem race: file deleted between stat and read @preserve */
121
+ continue;
122
+ }
123
+ const preview = extractPreview(content);
124
+ const embedText = content.slice(0, PREVIEW_CHAR_LIMIT);
125
+ // Generate embedding
126
+ let embedding;
127
+ try {
128
+ const vectors = await embedProvider.embed([embedText]);
129
+ embedding = vectors[0] ?? [];
130
+ }
131
+ catch {
132
+ (0, runtime_1.emitNervesEvent)({
133
+ level: "warn",
134
+ component: "mind",
135
+ event: "mind.journal_embedding_error",
136
+ message: "embedding failed for journal file",
137
+ meta: { filename: file.name },
138
+ });
139
+ embedding = [];
140
+ }
141
+ indexMap.set(file.name, {
142
+ filename: file.name,
143
+ embedding,
144
+ mtime: stat.mtimeMs,
145
+ preview,
146
+ });
147
+ newlyIndexed++;
148
+ }
149
+ // Write updated index back
150
+ if (newlyIndexed > 0) {
151
+ const updatedIndex = Array.from(indexMap.values());
152
+ fs.writeFileSync(indexPath, JSON.stringify(updatedIndex, null, 2), "utf8");
153
+ }
154
+ (0, runtime_1.emitNervesEvent)({
155
+ component: "mind",
156
+ event: "mind.journal_index_complete",
157
+ message: "journal indexing complete",
158
+ meta: { journalDir, newlyIndexed, total: indexMap.size },
159
+ });
160
+ return newlyIndexed;
161
+ }
@@ -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
+ }