@ouro.bot/cli 0.1.0-alpha.55 → 0.1.0-alpha.551

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 (386) hide show
  1. package/README.md +133 -19
  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-bootstrap-drift.md +54 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/changelog.json +3561 -0
  14. package/dist/arc/attention-types.js +8 -0
  15. package/dist/arc/cares.js +140 -0
  16. package/dist/arc/episodes.js +117 -0
  17. package/dist/arc/intentions.js +133 -0
  18. package/dist/arc/json-store.js +117 -0
  19. package/dist/arc/obligations.js +237 -0
  20. package/dist/arc/packets.js +193 -0
  21. package/dist/arc/presence.js +185 -0
  22. package/dist/arc/task-lifecycle.js +65 -0
  23. package/dist/heart/active-work.js +837 -26
  24. package/dist/heart/agent-entry.js +58 -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/adapter.js +2 -0
  30. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  31. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  32. package/dist/heart/attachments/sources/index.js +16 -0
  33. package/dist/heart/attachments/store.js +103 -0
  34. package/dist/heart/attachments/types.js +93 -0
  35. package/dist/heart/auth/auth-flow.js +479 -0
  36. package/dist/heart/background-operations.js +281 -0
  37. package/dist/heart/bundle-state.js +168 -0
  38. package/dist/heart/commitments.js +111 -0
  39. package/dist/heart/config-registry.js +304 -0
  40. package/dist/heart/config.js +114 -118
  41. package/dist/heart/core.js +925 -246
  42. package/dist/heart/cross-chat-delivery.js +3 -18
  43. package/dist/heart/daemon/agent-config-check.js +512 -0
  44. package/dist/heart/daemon/agent-discovery.js +102 -3
  45. package/dist/heart/daemon/agent-service.js +522 -0
  46. package/dist/heart/daemon/agentic-repair.js +554 -0
  47. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  48. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  49. package/dist/heart/daemon/cadence.js +70 -0
  50. package/dist/heart/daemon/cli-defaults.js +665 -0
  51. package/dist/heart/daemon/cli-exec.js +7565 -0
  52. package/dist/heart/daemon/cli-help.js +498 -0
  53. package/dist/heart/daemon/cli-parse.js +1590 -0
  54. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  55. package/dist/heart/daemon/cli-render.js +775 -0
  56. package/dist/heart/daemon/cli-types.js +8 -0
  57. package/dist/heart/daemon/connect-bay.js +323 -0
  58. package/dist/heart/daemon/daemon-cli.js +29 -1672
  59. package/dist/heart/daemon/daemon-entry.js +417 -2
  60. package/dist/heart/daemon/daemon-health.js +183 -0
  61. package/dist/heart/daemon/daemon-rollup.js +58 -0
  62. package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
  63. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  64. package/dist/heart/daemon/daemon.js +796 -71
  65. package/dist/heart/daemon/dns-workflow.js +394 -0
  66. package/dist/heart/daemon/doctor-types.js +8 -0
  67. package/dist/heart/daemon/doctor.js +844 -0
  68. package/dist/heart/daemon/drift-detection.js +146 -0
  69. package/dist/heart/daemon/health-monitor.js +122 -1
  70. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  71. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  72. package/dist/heart/daemon/http-health-probe.js +80 -0
  73. package/dist/heart/daemon/human-command-screens.js +234 -0
  74. package/dist/heart/daemon/human-readiness.js +114 -0
  75. package/dist/heart/daemon/inner-status.js +102 -0
  76. package/dist/heart/daemon/interactive-repair.js +394 -0
  77. package/dist/heart/daemon/launchd.js +37 -8
  78. package/dist/heart/daemon/log-tailer.js +82 -12
  79. package/dist/heart/daemon/logs-prune.js +110 -0
  80. package/dist/heart/daemon/mcp-canary.js +297 -0
  81. package/dist/heart/daemon/message-router.js +2 -2
  82. package/dist/heart/daemon/os-cron-deps.js +135 -0
  83. package/dist/heart/daemon/os-cron.js +14 -12
  84. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  85. package/dist/heart/daemon/ouro-entry.js +3 -1
  86. package/dist/heart/daemon/process-manager.js +375 -33
  87. package/dist/heart/daemon/provider-discovery.js +137 -0
  88. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  89. package/dist/heart/daemon/pulse.js +475 -0
  90. package/dist/heart/daemon/readiness-repair.js +365 -0
  91. package/dist/heart/daemon/run-hooks.js +2 -0
  92. package/dist/heart/daemon/runtime-logging.js +67 -16
  93. package/dist/heart/daemon/runtime-metadata.js +3 -31
  94. package/dist/heart/daemon/safe-mode.js +161 -0
  95. package/dist/heart/daemon/sense-manager.js +353 -38
  96. package/dist/heart/daemon/session-id-resolver.js +131 -0
  97. package/dist/heart/daemon/skill-management-installer.js +94 -0
  98. package/dist/heart/daemon/socket-client.js +158 -11
  99. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  100. package/dist/heart/daemon/startup-tui.js +330 -0
  101. package/dist/heart/daemon/task-scheduler.js +3 -25
  102. package/dist/heart/daemon/terminal-ui.js +499 -0
  103. package/dist/heart/daemon/thoughts.js +162 -17
  104. package/dist/heart/daemon/up-progress.js +366 -0
  105. package/dist/heart/daemon/vault-items.js +56 -0
  106. package/dist/heart/delegation.js +1 -1
  107. package/dist/heart/habits/habit-migration.js +189 -0
  108. package/dist/heart/habits/habit-parser.js +140 -0
  109. package/dist/heart/habits/habit-runtime-state.js +100 -0
  110. package/dist/heart/habits/habit-scheduler.js +372 -0
  111. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  112. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  113. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  114. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  115. package/dist/heart/identity.js +200 -51
  116. package/dist/heart/kept-notes.js +357 -0
  117. package/dist/heart/kicks.js +1 -1
  118. package/dist/heart/machine-identity.js +161 -0
  119. package/dist/heart/mail-import-discovery.js +353 -0
  120. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  121. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  122. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  123. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  124. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  125. package/dist/heart/mailbox/mailbox-http.js +99 -0
  126. package/dist/heart/mailbox/mailbox-read.js +31 -0
  127. package/dist/heart/mailbox/mailbox-types.js +27 -0
  128. package/dist/heart/mailbox/mailbox-view.js +195 -0
  129. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  130. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  131. package/dist/heart/mailbox/readers/mail.js +362 -0
  132. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  133. package/dist/heart/mailbox/readers/sessions.js +232 -0
  134. package/dist/heart/mailbox/readers/shared.js +111 -0
  135. package/dist/heart/mcp/mcp-server.js +683 -0
  136. package/dist/heart/migrate-config.js +100 -0
  137. package/dist/heart/model-capabilities.js +19 -0
  138. package/dist/heart/platform.js +81 -0
  139. package/dist/heart/provider-attempt.js +134 -0
  140. package/dist/heart/provider-binding-resolver.js +255 -0
  141. package/dist/heart/provider-credentials.js +425 -0
  142. package/dist/heart/provider-failover.js +301 -0
  143. package/dist/heart/provider-models.js +81 -0
  144. package/dist/heart/provider-ping.js +262 -0
  145. package/dist/heart/provider-state.js +216 -0
  146. package/dist/heart/provider-visibility.js +188 -0
  147. package/dist/heart/providers/anthropic-token.js +131 -0
  148. package/dist/heart/providers/anthropic.js +139 -52
  149. package/dist/heart/providers/azure.js +97 -13
  150. package/dist/heart/providers/error-classification.js +127 -0
  151. package/dist/heart/providers/github-copilot.js +145 -0
  152. package/dist/heart/providers/minimax-vlm.js +189 -0
  153. package/dist/heart/providers/minimax.js +26 -8
  154. package/dist/heart/providers/openai-codex.js +55 -40
  155. package/dist/heart/runtime-capability-check.js +170 -0
  156. package/dist/heart/runtime-credentials.js +367 -0
  157. package/dist/heart/runtime-cwd.js +87 -0
  158. package/dist/heart/sense-truth.js +11 -4
  159. package/dist/heart/session-activity.js +43 -22
  160. package/dist/heart/session-events.js +1149 -0
  161. package/dist/heart/session-playback-cli-main.js +5 -0
  162. package/dist/heart/session-playback-cli.js +36 -0
  163. package/dist/heart/session-playback.js +231 -0
  164. package/dist/heart/session-stats-cli-main.js +5 -0
  165. package/dist/heart/session-stats.js +182 -0
  166. package/dist/heart/session-transcript.js +243 -0
  167. package/dist/heart/start-of-turn-packet.js +345 -0
  168. package/dist/heart/streaming.js +44 -27
  169. package/dist/heart/sync-classification.js +176 -0
  170. package/dist/heart/sync.js +449 -0
  171. package/dist/heart/target-resolution.js +9 -5
  172. package/dist/heart/tempo.js +93 -0
  173. package/dist/heart/temporal-view.js +41 -0
  174. package/dist/heart/timeouts.js +101 -0
  175. package/dist/heart/tool-activity-callbacks.js +59 -0
  176. package/dist/heart/tool-description.js +139 -0
  177. package/dist/heart/tool-friction.js +55 -0
  178. package/dist/heart/tool-loop.js +200 -0
  179. package/dist/heart/turn-context.js +381 -0
  180. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  181. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  182. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  183. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  184. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  185. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  186. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  187. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  188. package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -0
  189. package/dist/mailbox-ui/index.html +15 -0
  190. package/dist/mailroom/attention.js +167 -0
  191. package/dist/mailroom/autonomy.js +209 -0
  192. package/dist/mailroom/blob-store.js +674 -0
  193. package/dist/mailroom/body-cache.js +61 -0
  194. package/dist/mailroom/core.js +720 -0
  195. package/dist/mailroom/entry.js +160 -0
  196. package/dist/mailroom/file-store.js +430 -0
  197. package/dist/mailroom/mbox-import.js +383 -0
  198. package/dist/mailroom/outbound.js +380 -0
  199. package/dist/mailroom/policy.js +263 -0
  200. package/dist/mailroom/reader.js +233 -0
  201. package/dist/mailroom/search-cache.js +256 -0
  202. package/dist/mailroom/search-relevance.js +319 -0
  203. package/dist/mailroom/smtp-ingress.js +176 -0
  204. package/dist/mailroom/source-state.js +176 -0
  205. package/dist/mailroom/thread.js +109 -0
  206. package/dist/mailroom/travel-extract.js +89 -0
  207. package/dist/mind/bundle-manifest.js +7 -1
  208. package/dist/mind/context.js +165 -101
  209. package/dist/mind/diary-integrity.js +60 -0
  210. package/dist/mind/{memory.js → diary.js} +62 -75
  211. package/dist/mind/embedding-provider.js +60 -0
  212. package/dist/mind/file-state.js +179 -0
  213. package/dist/mind/friends/channel.js +30 -0
  214. package/dist/mind/friends/resolver.js +54 -2
  215. package/dist/mind/friends/store-file.js +39 -3
  216. package/dist/mind/friends/types.js +2 -2
  217. package/dist/mind/journal-index.js +161 -0
  218. package/dist/mind/note-search.js +268 -0
  219. package/dist/mind/obligation-steering.js +221 -0
  220. package/dist/mind/pending.js +4 -0
  221. package/dist/mind/prompt-refresh.js +3 -2
  222. package/dist/mind/prompt.js +995 -123
  223. package/dist/mind/provenance-trust.js +26 -0
  224. package/dist/mind/scrutiny.js +173 -0
  225. package/dist/nerves/cli-logging.js +7 -1
  226. package/dist/nerves/coverage/audit-rules.js +15 -6
  227. package/dist/nerves/coverage/audit.js +28 -2
  228. package/dist/nerves/coverage/cli.js +1 -1
  229. package/dist/nerves/coverage/contract.js +5 -5
  230. package/dist/nerves/coverage/file-completeness.js +139 -5
  231. package/dist/nerves/coverage/run-artifacts.js +1 -1
  232. package/dist/nerves/event-buffer.js +111 -0
  233. package/dist/nerves/index.js +224 -4
  234. package/dist/nerves/observation.js +20 -0
  235. package/dist/nerves/redact.js +79 -0
  236. package/dist/nerves/review/cli-main.js +5 -0
  237. package/dist/nerves/review/cli.js +156 -0
  238. package/dist/nerves/review/core.js +152 -0
  239. package/dist/nerves/runtime.js +5 -1
  240. package/dist/repertoire/ado-client.js +15 -56
  241. package/dist/repertoire/ado-semantic.js +11 -10
  242. package/dist/repertoire/api-client.js +97 -0
  243. package/dist/repertoire/bitwarden-store.js +816 -0
  244. package/dist/repertoire/bundle-templates.js +72 -0
  245. package/dist/repertoire/bw-installer.js +180 -0
  246. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  247. package/dist/repertoire/coding/context-pack.js +330 -0
  248. package/dist/repertoire/coding/feedback.js +197 -30
  249. package/dist/repertoire/coding/manager.js +158 -9
  250. package/dist/repertoire/coding/spawner.js +55 -9
  251. package/dist/repertoire/coding/tools.js +170 -7
  252. package/dist/repertoire/commerce-errors.js +109 -0
  253. package/dist/repertoire/commerce-self-test.js +156 -0
  254. package/dist/repertoire/credential-access.js +111 -0
  255. package/dist/repertoire/duffel-client.js +185 -0
  256. package/dist/repertoire/github-client.js +14 -55
  257. package/dist/repertoire/graph-client.js +11 -52
  258. package/dist/repertoire/guardrails.js +396 -0
  259. package/dist/repertoire/mcp-client.js +295 -0
  260. package/dist/repertoire/mcp-manager.js +362 -0
  261. package/dist/repertoire/mcp-tools.js +63 -0
  262. package/dist/repertoire/shell-sessions.js +133 -0
  263. package/dist/repertoire/skills.js +15 -24
  264. package/dist/repertoire/stripe-client.js +131 -0
  265. package/dist/repertoire/tasks/board.js +31 -5
  266. package/dist/repertoire/tasks/fix.js +182 -0
  267. package/dist/repertoire/tasks/index.js +16 -4
  268. package/dist/repertoire/tasks/lifecycle.js +2 -2
  269. package/dist/repertoire/tasks/parser.js +3 -2
  270. package/dist/repertoire/tasks/scanner.js +194 -37
  271. package/dist/repertoire/tasks/transitions.js +16 -78
  272. package/dist/repertoire/tool-results.js +29 -0
  273. package/dist/repertoire/tools-attachments.js +317 -0
  274. package/dist/repertoire/tools-base.js +47 -1075
  275. package/dist/repertoire/tools-bluebubbles.js +1 -0
  276. package/dist/repertoire/tools-bridge.js +142 -0
  277. package/dist/repertoire/tools-bundle.js +984 -0
  278. package/dist/repertoire/tools-config.js +185 -0
  279. package/dist/repertoire/tools-continuity.js +248 -0
  280. package/dist/repertoire/tools-credential.js +381 -0
  281. package/dist/repertoire/tools-files.js +342 -0
  282. package/dist/repertoire/tools-flight.js +224 -0
  283. package/dist/repertoire/tools-flow.js +119 -0
  284. package/dist/repertoire/tools-github.js +1 -7
  285. package/dist/repertoire/tools-mail.js +1857 -0
  286. package/dist/repertoire/tools-notes.js +421 -0
  287. package/dist/repertoire/tools-session.js +750 -0
  288. package/dist/repertoire/tools-shell.js +120 -0
  289. package/dist/repertoire/tools-stripe.js +180 -0
  290. package/dist/repertoire/tools-surface.js +243 -0
  291. package/dist/repertoire/tools-teams.js +9 -39
  292. package/dist/repertoire/tools-travel.js +125 -0
  293. package/dist/repertoire/tools-trip.js +604 -0
  294. package/dist/repertoire/tools-user-profile.js +144 -0
  295. package/dist/repertoire/tools-vault.js +40 -0
  296. package/dist/repertoire/tools.js +108 -100
  297. package/dist/repertoire/travel-api-client.js +360 -0
  298. package/dist/repertoire/user-profile.js +131 -0
  299. package/dist/repertoire/vault-setup.js +246 -0
  300. package/dist/repertoire/vault-unlock.js +561 -0
  301. package/dist/scripts/claude-code-hook.js +41 -0
  302. package/dist/scripts/claude-code-stop-hook.js +47 -0
  303. package/dist/senses/attention-queue.js +116 -0
  304. package/dist/senses/bluebubbles/active-turns.js +216 -0
  305. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  306. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  307. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  308. package/dist/senses/bluebubbles/entry.js +77 -0
  309. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  310. package/dist/senses/bluebubbles/index.js +2305 -0
  311. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  312. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  313. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  314. package/dist/senses/bluebubbles/processed-log.js +133 -0
  315. package/dist/senses/bluebubbles/replay.js +137 -0
  316. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  317. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  318. package/dist/senses/cli/bracketed-paste.js +82 -0
  319. package/dist/senses/cli/image-paste.js +287 -0
  320. package/dist/senses/cli/image-ref-navigation.js +75 -0
  321. package/dist/senses/cli/ink-app.js +156 -0
  322. package/dist/senses/cli/inline-diff.js +64 -0
  323. package/dist/senses/cli/input-keys.js +174 -0
  324. package/dist/senses/cli/kill-ring.js +86 -0
  325. package/dist/senses/cli/message-list.js +51 -0
  326. package/dist/senses/cli/ouro-tui.js +607 -0
  327. package/dist/senses/cli/spinner-imperative.js +135 -0
  328. package/dist/senses/cli/spinner.js +101 -0
  329. package/dist/senses/cli/status-line.js +60 -0
  330. package/dist/senses/cli/streaming-markdown.js +526 -0
  331. package/dist/senses/cli/tool-display.js +85 -0
  332. package/dist/senses/cli/tool-render.js +85 -0
  333. package/dist/senses/cli/tui-store.js +240 -0
  334. package/dist/senses/cli/virtual-list.js +35 -0
  335. package/dist/senses/cli-entry.js +60 -8
  336. package/dist/senses/cli-layout.js +187 -0
  337. package/dist/senses/cli.js +520 -209
  338. package/dist/senses/commands.js +66 -3
  339. package/dist/senses/habit-turn-message.js +108 -0
  340. package/dist/senses/inner-dialog-worker.js +175 -21
  341. package/dist/senses/inner-dialog.js +330 -27
  342. package/dist/senses/mail-entry.js +66 -0
  343. package/dist/senses/mail.js +379 -0
  344. package/dist/senses/pipeline.js +569 -182
  345. package/dist/senses/proactive-content-guard.js +51 -0
  346. package/dist/senses/shared-turn.js +248 -0
  347. package/dist/senses/surface-tool.js +68 -0
  348. package/dist/senses/teams-entry.js +60 -8
  349. package/dist/senses/teams.js +387 -98
  350. package/dist/senses/trust-gate.js +100 -5
  351. package/dist/trips/core.js +138 -0
  352. package/dist/trips/store.js +146 -0
  353. package/package.json +38 -7
  354. package/skills/agent-commerce.md +106 -0
  355. package/skills/browser-navigation.md +117 -0
  356. package/skills/commerce-setup-guide.md +116 -0
  357. package/skills/commerce-setup.md +84 -0
  358. package/skills/configure-dev-tools.md +101 -0
  359. package/skills/travel-planning.md +138 -0
  360. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  361. package/dist/heart/daemon/subagent-installer.js +0 -166
  362. package/dist/heart/session-recall.js +0 -116
  363. package/dist/mind/associative-recall.js +0 -209
  364. package/dist/senses/bluebubbles-entry.js +0 -13
  365. package/dist/senses/bluebubbles.js +0 -1177
  366. package/dist/senses/debug-activity.js +0 -148
  367. package/subagents/README.md +0 -86
  368. package/subagents/work-doer.md +0 -237
  369. package/subagents/work-merger.md +0 -618
  370. package/subagents/work-planner.md +0 -390
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  381. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  382. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  383. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  384. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  385. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  386. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,304 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONFIG_REGISTRY = void 0;
4
+ exports.getRegistryEntries = getRegistryEntries;
5
+ exports.getRegistryEntriesByTier = getRegistryEntriesByTier;
6
+ exports.getRegistryEntriesByTopic = getRegistryEntriesByTopic;
7
+ exports.getRegistryEntry = getRegistryEntry;
8
+ const runtime_1 = require("../nerves/runtime");
9
+ // --- Validation helpers ---
10
+ const KNOWN_PROVIDERS = ["anthropic", "azure", "minimax", "openai-codex", "github-copilot"];
11
+ function validateNumber(value) {
12
+ if (typeof value !== "number")
13
+ return `expected number, got ${typeof value}`;
14
+ return undefined;
15
+ }
16
+ function validateBoolean(value) {
17
+ if (typeof value !== "boolean")
18
+ return `expected boolean, got ${typeof value}`;
19
+ return undefined;
20
+ }
21
+ function validateString(value) {
22
+ if (typeof value !== "string")
23
+ return `expected string, got ${typeof value}`;
24
+ return undefined;
25
+ }
26
+ function validateStringEnum(allowed) {
27
+ return (value) => {
28
+ if (typeof value !== "string")
29
+ return `expected string, got ${typeof value}`;
30
+ if (!allowed.includes(value))
31
+ return `expected one of [${allowed.join(", ")}], got "${value}"`;
32
+ return undefined;
33
+ };
34
+ }
35
+ function validateInteger(min, max) {
36
+ return (value) => {
37
+ if (typeof value !== "number")
38
+ return `expected number, got ${typeof value}`;
39
+ if (!Number.isInteger(value))
40
+ return `expected integer, got ${value}`;
41
+ if (value < min || value > max)
42
+ return `expected integer between ${min} and ${max}, got ${value}`;
43
+ return undefined;
44
+ };
45
+ }
46
+ function validateStringArray(value) {
47
+ if (!Array.isArray(value))
48
+ return `expected array, got ${typeof value}`;
49
+ for (let i = 0; i < value.length; i++) {
50
+ if (typeof value[i] !== "string")
51
+ return `expected string at index ${i}, got ${typeof value[i]}`;
52
+ }
53
+ return undefined;
54
+ }
55
+ function validateStringEnumArray(allowed) {
56
+ return (value) => {
57
+ if (!Array.isArray(value))
58
+ return `expected array, got ${typeof value}`;
59
+ for (let i = 0; i < value.length; i++) {
60
+ if (typeof value[i] !== "string")
61
+ return `expected string at index ${i}, got ${typeof value[i]}`;
62
+ if (!allowed.includes(value[i]))
63
+ return `expected one of [${allowed.join(", ")}] at index ${i}, got "${value[i]}"`;
64
+ }
65
+ return undefined;
66
+ };
67
+ }
68
+ function validateObject(requiredFields) {
69
+ return (value) => {
70
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
71
+ return `expected object, got ${Array.isArray(value) ? "array" : typeof value}`;
72
+ }
73
+ const obj = value;
74
+ for (const [field, validator] of Object.entries(requiredFields)) {
75
+ if (!(field in obj))
76
+ return `missing required field "${field}"`;
77
+ const err = validator(obj[field]);
78
+ if (err)
79
+ return `field "${field}": ${err}`;
80
+ }
81
+ return undefined;
82
+ };
83
+ }
84
+ const registryData = [
85
+ // --- Managed: harness-only ---
86
+ {
87
+ path: "version",
88
+ tier: "managed",
89
+ description: "Agent config schema version. Managed by the harness. Must be an integer >= 1.",
90
+ default: 2,
91
+ effects: "Controls which config migrations apply on load. Changing incorrectly can corrupt config.",
92
+ topics: ["schema", "migration"],
93
+ validate: validateNumber,
94
+ },
95
+ {
96
+ path: "enabled",
97
+ tier: "managed",
98
+ description: "Whether the agent is enabled. Managed by the harness. When false, the agent refuses to start.",
99
+ default: true,
100
+ effects: "Disables all agent functionality when set to false.",
101
+ topics: ["lifecycle", "activation"],
102
+ validate: validateBoolean,
103
+ },
104
+ // --- Self: agent-configurable ---
105
+ {
106
+ path: "mcpServers",
107
+ tier: "self",
108
+ description: "MCP server configurations. Maps server name to command, args, and env. The agent can add or remove MCP servers.",
109
+ default: undefined,
110
+ effects: "Adds or removes MCP tool servers.",
111
+ topics: ["tools", "mcp", "servers", "extensions"],
112
+ },
113
+ {
114
+ path: "humanFacing.provider",
115
+ tier: "self",
116
+ description: "Provider for human-facing interactions (CLI, Teams, BlueBubbles).",
117
+ default: "anthropic",
118
+ effects: "Changes the LLM provider used for all human-facing conversations. Affects quality, latency, and cost.",
119
+ topics: ["model", "provider", "llm", "human"],
120
+ validate: validateStringEnum(KNOWN_PROVIDERS),
121
+ },
122
+ {
123
+ path: "humanFacing.model",
124
+ tier: "self",
125
+ description: "Model name for human-facing interactions.",
126
+ default: "claude-opus-4-6",
127
+ effects: "Changes the specific model used for human-facing conversations.",
128
+ topics: ["model", "provider", "llm", "human"],
129
+ validate: validateString,
130
+ },
131
+ {
132
+ path: "agentFacing.provider",
133
+ tier: "self",
134
+ description: "Provider for agent-facing interactions (inner dialog, delegation).",
135
+ default: "anthropic",
136
+ effects: "Changes the LLM provider used for inner dialog and agent-to-agent communication.",
137
+ topics: ["model", "provider", "llm", "agent", "inner-dialog"],
138
+ validate: validateStringEnum(KNOWN_PROVIDERS),
139
+ },
140
+ {
141
+ path: "agentFacing.model",
142
+ tier: "self",
143
+ description: "Model name for agent-facing interactions.",
144
+ default: "claude-opus-4-6",
145
+ effects: "Changes the specific model used for inner dialog and agent-to-agent communication.",
146
+ topics: ["model", "provider", "llm", "agent", "inner-dialog"],
147
+ validate: validateString,
148
+ },
149
+ {
150
+ path: "context.maxTokens",
151
+ tier: "self",
152
+ description: "Maximum context window size in tokens.",
153
+ default: 80000,
154
+ effects: "Larger values allow more context but increase cost and latency. Must match model capability.",
155
+ topics: ["context", "tokens", "notes", "performance"],
156
+ validate: validateInteger(1000, 1000000),
157
+ },
158
+ {
159
+ path: "senses.cli",
160
+ tier: "self",
161
+ description: "CLI sense configuration. Controls whether the CLI interface is enabled.",
162
+ default: { enabled: true },
163
+ effects: "Enables or disables the CLI (terminal) interaction channel.",
164
+ topics: ["senses", "cli", "channels", "interface"],
165
+ validate: validateObject({ enabled: validateBoolean }),
166
+ },
167
+ {
168
+ path: "senses.teams",
169
+ tier: "self",
170
+ description: "Teams sense configuration. Controls whether the Teams interface is enabled.",
171
+ default: { enabled: false },
172
+ effects: "Enables or disables the Microsoft Teams interaction channel.",
173
+ topics: ["senses", "teams", "channels", "interface"],
174
+ validate: validateObject({ enabled: validateBoolean }),
175
+ },
176
+ {
177
+ path: "senses.bluebubbles",
178
+ tier: "self",
179
+ description: "BlueBubbles sense configuration. Controls whether the iMessage interface is enabled.",
180
+ default: { enabled: false },
181
+ effects: "Enables or disables the BlueBubbles (iMessage) interaction channel.",
182
+ topics: ["senses", "bluebubbles", "imessage", "channels", "interface"],
183
+ validate: validateObject({ enabled: validateBoolean }),
184
+ },
185
+ {
186
+ path: "sync.enabled",
187
+ tier: "self",
188
+ description: "Whether git-based bundle sync is enabled.",
189
+ default: false,
190
+ effects: "Enables automatic synchronization of agent state via git. Requires sync.remote to be configured.",
191
+ topics: ["sync", "git", "state", "backup"],
192
+ validate: validateBoolean,
193
+ },
194
+ {
195
+ path: "sync.remote",
196
+ tier: "self",
197
+ description: "Git remote name used for bundle sync.",
198
+ default: "origin",
199
+ effects: "Controls which git remote is used when sync is enabled.",
200
+ topics: ["sync", "git", "remote"],
201
+ validate: validateString,
202
+ },
203
+ {
204
+ path: "context.contextMargin",
205
+ tier: "self",
206
+ description: "Percentage of context window reserved as margin before compaction triggers.",
207
+ default: 20,
208
+ effects: "Higher values trigger compaction earlier, preserving more headroom. Lower values use more context.",
209
+ topics: ["context", "compaction", "notes", "performance"],
210
+ validate: validateInteger(0, 100),
211
+ },
212
+ {
213
+ path: "phrases.thinking",
214
+ tier: "self",
215
+ description: "Array of phrases displayed while the agent is thinking.",
216
+ default: ["working"],
217
+ effects: "Changes the thinking indicator text shown to users. Purely cosmetic.",
218
+ topics: ["phrases", "ux", "display", "personality"],
219
+ validate: validateStringArray,
220
+ },
221
+ {
222
+ path: "phrases.tool",
223
+ tier: "self",
224
+ description: "Array of phrases displayed while the agent is running a tool.",
225
+ default: ["running tool"],
226
+ effects: "Changes the tool-use indicator text shown to users. Purely cosmetic.",
227
+ topics: ["phrases", "ux", "display", "personality"],
228
+ validate: validateStringArray,
229
+ },
230
+ {
231
+ path: "phrases.followup",
232
+ tier: "self",
233
+ description: "Array of phrases displayed during follow-up processing.",
234
+ default: ["processing"],
235
+ effects: "Changes the follow-up indicator text shown to users. Purely cosmetic.",
236
+ topics: ["phrases", "ux", "display", "personality"],
237
+ validate: validateStringArray,
238
+ },
239
+ {
240
+ path: "shell.defaultTimeout",
241
+ tier: "self",
242
+ description: "Default timeout in milliseconds for shell command execution.",
243
+ default: undefined,
244
+ effects: "Controls how long shell commands run before timing out. Undefined uses system default.",
245
+ topics: ["shell", "timeout", "execution", "tools"],
246
+ validate: validateInteger(1000, 600000),
247
+ },
248
+ {
249
+ path: "logging.level",
250
+ tier: "self",
251
+ description: "Minimum log level: debug, info, warn, or error.",
252
+ default: undefined,
253
+ effects: "Controls verbosity of runtime logging. Lower levels produce more output.",
254
+ topics: ["logging", "debug", "diagnostics"],
255
+ validate: validateStringEnum(["debug", "info", "warn", "error"]),
256
+ },
257
+ {
258
+ path: "logging.sinks",
259
+ tier: "self",
260
+ description: "Array of log sink types: 'terminal' and/or 'ndjson'.",
261
+ default: undefined,
262
+ effects: "Controls where log output is directed. Terminal shows in console, ndjson writes structured logs.",
263
+ topics: ["logging", "output", "diagnostics"],
264
+ validate: validateStringEnumArray(["terminal", "ndjson"]),
265
+ },
266
+ ];
267
+ exports.CONFIG_REGISTRY = new Map(registryData.map((entry) => [entry.path, entry]));
268
+ function getRegistryEntries() {
269
+ (0, runtime_1.emitNervesEvent)({
270
+ component: "heart",
271
+ event: "config_registry.access",
272
+ message: "listing all registry entries",
273
+ meta: { count: exports.CONFIG_REGISTRY.size },
274
+ });
275
+ return [...exports.CONFIG_REGISTRY.values()];
276
+ }
277
+ function getRegistryEntriesByTier(tier) {
278
+ (0, runtime_1.emitNervesEvent)({
279
+ component: "heart",
280
+ event: "config_registry.access",
281
+ message: `filtering registry entries by tier ${tier}`,
282
+ meta: { tier },
283
+ });
284
+ return [...exports.CONFIG_REGISTRY.values()].filter((entry) => entry.tier === tier);
285
+ }
286
+ function getRegistryEntriesByTopic(topic) {
287
+ const needle = topic.toLowerCase();
288
+ (0, runtime_1.emitNervesEvent)({
289
+ component: "heart",
290
+ event: "config_registry.access",
291
+ message: `filtering registry entries by topic "${topic}"`,
292
+ meta: { topic },
293
+ });
294
+ return [...exports.CONFIG_REGISTRY.values()].filter((entry) => entry.topics.some((t) => t.toLowerCase().includes(needle)));
295
+ }
296
+ function getRegistryEntry(path) {
297
+ (0, runtime_1.emitNervesEvent)({
298
+ component: "heart",
299
+ event: "config_registry.access",
300
+ message: `looking up registry entry for "${path}"`,
301
+ meta: { path },
302
+ });
303
+ return exports.CONFIG_REGISTRY.get(path);
304
+ }
@@ -35,11 +35,14 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.loadConfig = loadConfig;
37
37
  exports.resetConfigCache = resetConfigCache;
38
+ exports.cacheRuntimeConfigForTests = cacheRuntimeConfigForTests;
39
+ exports.cacheMachineRuntimeConfigForTests = cacheMachineRuntimeConfigForTests;
38
40
  exports.patchRuntimeConfig = patchRuntimeConfig;
39
41
  exports.getAzureConfig = getAzureConfig;
40
42
  exports.getMinimaxConfig = getMinimaxConfig;
41
43
  exports.getAnthropicConfig = getAnthropicConfig;
42
44
  exports.getOpenAICodexConfig = getOpenAICodexConfig;
45
+ exports.getGithubCopilotConfig = getGithubCopilotConfig;
43
46
  exports.getTeamsConfig = getTeamsConfig;
44
47
  exports.getTeamsSecondaryConfig = getTeamsSecondaryConfig;
45
48
  exports.getContextConfig = getContextConfig;
@@ -49,6 +52,7 @@ exports.getTeamsChannelConfig = getTeamsChannelConfig;
49
52
  exports.getBlueBubblesConfig = getBlueBubblesConfig;
50
53
  exports.getBlueBubblesChannelConfig = getBlueBubblesChannelConfig;
51
54
  exports.getIntegrationsConfig = getIntegrationsConfig;
55
+ exports.getSyncConfig = getSyncConfig;
52
56
  exports.getOpenAIEmbeddingsApiKey = getOpenAIEmbeddingsApiKey;
53
57
  exports.getLogsDir = getLogsDir;
54
58
  exports.sanitizeKey = sanitizeKey;
@@ -59,31 +63,10 @@ exports.logPath = logPath;
59
63
  const fs = __importStar(require("fs"));
60
64
  const path = __importStar(require("path"));
61
65
  const identity_1 = require("./identity");
66
+ const provider_credentials_1 = require("./provider-credentials");
67
+ const runtime_credentials_1 = require("./runtime-credentials");
62
68
  const runtime_1 = require("../nerves/runtime");
63
- const DEFAULT_SECRETS_TEMPLATE = {
64
- providers: {
65
- // Keep provider field ordering consistent: model first, then auth credentials,
66
- // then provider-specific transport fields.
67
- azure: {
68
- modelName: "",
69
- apiKey: "",
70
- endpoint: "",
71
- deployment: "",
72
- apiVersion: "2025-04-01-preview",
73
- },
74
- minimax: {
75
- model: "",
76
- apiKey: "",
77
- },
78
- anthropic: {
79
- model: "claude-opus-4-6",
80
- setupToken: "",
81
- },
82
- "openai-codex": {
83
- model: "gpt-5.4",
84
- oauthAccessToken: "",
85
- },
86
- },
69
+ const DEFAULT_LOCAL_RUNTIME_CONFIG = {
87
70
  teams: {
88
71
  clientId: "",
89
72
  clientSecret: "",
@@ -109,12 +92,16 @@ const DEFAULT_SECRETS_TEMPLATE = {
109
92
  serverUrl: "",
110
93
  password: "",
111
94
  accountId: "default",
95
+ ownHandles: [],
112
96
  },
113
97
  bluebubblesChannel: {
114
98
  port: 18790,
115
99
  webhookPath: "/bluebubbles-webhook",
116
100
  requestTimeoutMs: 30000,
117
101
  },
102
+ vault: {
103
+ masterPassword: "",
104
+ },
118
105
  integrations: {
119
106
  perplexityApiKey: "",
120
107
  openaiEmbeddingsApiKey: "",
@@ -122,27 +109,20 @@ const DEFAULT_SECRETS_TEMPLATE = {
122
109
  };
123
110
  function defaultRuntimeConfig() {
124
111
  return {
125
- providers: {
126
- azure: { ...DEFAULT_SECRETS_TEMPLATE.providers.azure },
127
- minimax: { ...DEFAULT_SECRETS_TEMPLATE.providers.minimax },
128
- anthropic: { ...DEFAULT_SECRETS_TEMPLATE.providers.anthropic },
129
- "openai-codex": { ...DEFAULT_SECRETS_TEMPLATE.providers["openai-codex"] },
130
- },
131
- teams: { ...DEFAULT_SECRETS_TEMPLATE.teams },
132
- teamsSecondary: { ...DEFAULT_SECRETS_TEMPLATE.teamsSecondary },
133
- oauth: { ...DEFAULT_SECRETS_TEMPLATE.oauth },
112
+ teams: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teams },
113
+ teamsSecondary: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teamsSecondary },
114
+ oauth: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.oauth },
134
115
  context: { ...identity_1.DEFAULT_AGENT_CONTEXT },
135
- teamsChannel: { ...DEFAULT_SECRETS_TEMPLATE.teamsChannel },
136
- bluebubbles: { ...DEFAULT_SECRETS_TEMPLATE.bluebubbles },
137
- bluebubblesChannel: { ...DEFAULT_SECRETS_TEMPLATE.bluebubblesChannel },
138
- integrations: { ...DEFAULT_SECRETS_TEMPLATE.integrations },
116
+ teamsChannel: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teamsChannel },
117
+ bluebubbles: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.bluebubbles },
118
+ bluebubblesChannel: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.bluebubblesChannel },
119
+ vault: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.vault },
120
+ integrations: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.integrations },
139
121
  };
140
122
  }
141
123
  let _runtimeConfigOverride = null;
142
124
  let _testContextOverride = null;
143
- function resolveConfigPath() {
144
- return (0, identity_1.getAgentSecretsPath)();
145
- }
125
+ let _providerConfigOverride = null;
146
126
  function deepMerge(defaults, partial) {
147
127
  const result = { ...defaults };
148
128
  for (const key of Object.keys(partial)) {
@@ -159,79 +139,31 @@ function deepMerge(defaults, partial) {
159
139
  }
160
140
  return result;
161
141
  }
142
+ function localRuntimeFields(config) {
143
+ const { providers: _providers, context: _context, ...localFields } = config;
144
+ return localFields;
145
+ }
162
146
  function loadConfig() {
163
- const configPath = resolveConfigPath();
164
- // Auto-create config directory if it doesn't exist
165
- const configDir = path.dirname(configPath);
166
- fs.mkdirSync(configDir, { recursive: true });
167
- let fileData = {};
168
- try {
169
- const raw = fs.readFileSync(configPath, "utf-8");
170
- fileData = JSON.parse(raw);
171
- }
172
- catch (error) {
173
- const errorCode = error &&
174
- typeof error === "object" &&
175
- "code" in error &&
176
- typeof error.code === "string"
177
- ? error.code
178
- : undefined;
179
- if (errorCode === "ENOENT") {
180
- try {
181
- fs.writeFileSync(configPath, JSON.stringify(DEFAULT_SECRETS_TEMPLATE, null, 2) + "\n", "utf-8");
182
- }
183
- catch (writeError) {
184
- (0, runtime_1.emitNervesEvent)({
185
- level: "warn",
186
- event: "config_identity.error",
187
- component: "config/identity",
188
- message: "failed writing default secrets config",
189
- meta: {
190
- phase: "loadConfig",
191
- path: configPath,
192
- reason: writeError instanceof Error ? writeError.message : String(writeError),
193
- },
194
- });
195
- }
196
- }
197
- (0, runtime_1.emitNervesEvent)({
198
- level: "warn",
199
- event: "config_identity.error",
200
- component: "config/identity",
201
- message: "config read failed; defaults applied",
202
- meta: {
203
- phase: "loadConfig",
204
- reason: error instanceof Error ? error.message : String(error),
205
- },
206
- });
207
- // ENOENT or parse error -- use defaults
208
- }
209
- const sanitizedFileData = { ...fileData };
210
- if ("context" in sanitizedFileData) {
211
- delete sanitizedFileData.context;
212
- (0, runtime_1.emitNervesEvent)({
213
- level: "warn",
214
- event: "config_identity.error",
215
- component: "config/identity",
216
- message: "ignored legacy context block in secrets config",
217
- meta: {
218
- phase: "loadConfig",
219
- path: configPath,
220
- },
221
- });
222
- }
223
- const mergedConfig = deepMerge(defaultRuntimeConfig(), sanitizedFileData);
147
+ const agentName = (0, identity_1.getAgentName)();
148
+ const runtimeResult = (0, runtime_credentials_1.readRuntimeCredentialConfig)(agentName);
149
+ const machineRuntimeResult = (0, runtime_credentials_1.readMachineRuntimeCredentialConfig)(agentName);
150
+ const vaultData = runtimeResult.ok ? localRuntimeFields(runtimeResult.config) : {};
151
+ const machineVaultData = machineRuntimeResult.ok ? localRuntimeFields(machineRuntimeResult.config) : {};
152
+ const mergedConfig = deepMerge(defaultRuntimeConfig(), vaultData);
153
+ const mergedWithMachineConfig = deepMerge(mergedConfig, machineVaultData);
224
154
  const config = _runtimeConfigOverride
225
- ? deepMerge(mergedConfig, _runtimeConfigOverride)
226
- : mergedConfig;
155
+ ? deepMerge(mergedWithMachineConfig, _runtimeConfigOverride)
156
+ : mergedWithMachineConfig;
227
157
  (0, runtime_1.emitNervesEvent)({
228
158
  event: "config.load",
229
159
  component: "config/identity",
230
- message: "config loaded from disk",
160
+ message: "config loaded from runtime credential cache",
231
161
  meta: {
232
- source: "disk",
233
- used_defaults_only: Object.keys(fileData).length === 0,
162
+ source: runtimeResult.ok ? "vault-cache" : "defaults",
163
+ used_defaults_only: !runtimeResult.ok,
164
+ machine_runtime_credentials: machineRuntimeResult.ok ? "available" : machineRuntimeResult.reason,
234
165
  override_applied: _runtimeConfigOverride !== null,
166
+ runtime_credentials: runtimeResult.ok ? "available" : runtimeResult.reason,
235
167
  },
236
168
  });
237
169
  return config;
@@ -239,30 +171,74 @@ function loadConfig() {
239
171
  function resetConfigCache() {
240
172
  _runtimeConfigOverride = null;
241
173
  _testContextOverride = null;
174
+ _providerConfigOverride = null;
175
+ (0, provider_credentials_1.resetProviderCredentialCache)();
176
+ (0, runtime_credentials_1.resetRuntimeCredentialConfigCache)();
177
+ }
178
+ function cacheRuntimeConfigForTests(agentName, config) {
179
+ (0, runtime_credentials_1.cacheRuntimeCredentialConfig)(agentName, config, new Date(0));
180
+ }
181
+ function cacheMachineRuntimeConfigForTests(agentName, config) {
182
+ (0, runtime_credentials_1.cacheMachineRuntimeCredentialConfig)(agentName, config, new Date(0), "machine_test");
183
+ }
184
+ function seedProviderCredentialCache(providers) {
185
+ if (!providers)
186
+ return;
187
+ _providerConfigOverride = deepMerge((_providerConfigOverride ?? {}), providers);
188
+ const records = Object.entries(_providerConfigOverride).map(([provider, rawConfig]) => {
189
+ const split = (0, provider_credentials_1.splitProviderCredentialFields)(provider, rawConfig);
190
+ return (0, provider_credentials_1.createProviderCredentialRecord)({
191
+ provider: provider,
192
+ credentials: split.credentials,
193
+ config: split.config,
194
+ provenance: { source: "manual" },
195
+ now: new Date(0),
196
+ });
197
+ });
198
+ (0, provider_credentials_1.cacheProviderCredentialRecords)((0, identity_1.getAgentName)(), records, new Date(0));
242
199
  }
243
200
  function patchRuntimeConfig(partial) {
201
+ const { providers, ...runtimePartial } = partial;
202
+ seedProviderCredentialCache(providers);
244
203
  const contextPatch = partial.context;
245
204
  if (contextPatch) {
246
205
  const base = _testContextOverride ?? identity_1.DEFAULT_AGENT_CONTEXT;
247
206
  _testContextOverride = deepMerge(base, contextPatch);
248
207
  }
249
- _runtimeConfigOverride = deepMerge((_runtimeConfigOverride ?? {}), partial);
208
+ _runtimeConfigOverride = deepMerge((_runtimeConfigOverride ?? {}), runtimePartial);
209
+ }
210
+ function readProviderConfig(provider) {
211
+ const cached = (0, provider_credentials_1.readCachedProviderCredentialRecord)((0, identity_1.getAgentName)(), provider);
212
+ return cached.ok ? { ...cached.record.config, ...cached.record.credentials } : {};
250
213
  }
251
214
  function getAzureConfig() {
252
- const config = loadConfig();
253
- return { ...config.providers.azure };
215
+ const raw = readProviderConfig("azure");
216
+ return {
217
+ apiKey: typeof raw.apiKey === "string" ? raw.apiKey : "",
218
+ endpoint: typeof raw.endpoint === "string" ? raw.endpoint : "",
219
+ deployment: typeof raw.deployment === "string" ? raw.deployment : "",
220
+ apiVersion: typeof raw.apiVersion === "string" ? raw.apiVersion : "2025-04-01-preview",
221
+ managedIdentityClientId: typeof raw.managedIdentityClientId === "string" ? raw.managedIdentityClientId : "",
222
+ };
254
223
  }
255
224
  function getMinimaxConfig() {
256
- const config = loadConfig();
257
- return { ...config.providers.minimax };
225
+ const raw = readProviderConfig("minimax");
226
+ return { apiKey: typeof raw.apiKey === "string" ? raw.apiKey : "" };
258
227
  }
259
228
  function getAnthropicConfig() {
260
- const config = loadConfig();
261
- return { ...config.providers.anthropic };
229
+ const raw = readProviderConfig("anthropic");
230
+ return { setupToken: typeof raw.setupToken === "string" ? raw.setupToken : "" };
262
231
  }
263
232
  function getOpenAICodexConfig() {
264
- const config = loadConfig();
265
- return { ...config.providers["openai-codex"] };
233
+ const raw = readProviderConfig("openai-codex");
234
+ return { oauthAccessToken: typeof raw.oauthAccessToken === "string" ? raw.oauthAccessToken : "" };
235
+ }
236
+ function getGithubCopilotConfig() {
237
+ const raw = readProviderConfig("github-copilot");
238
+ return {
239
+ githubToken: typeof raw.githubToken === "string" ? raw.githubToken : "",
240
+ baseUrl: typeof raw.baseUrl === "string" ? raw.baseUrl : "",
241
+ };
266
242
  }
267
243
  function getTeamsConfig() {
268
244
  const config = loadConfig();
@@ -309,17 +285,24 @@ function getTeamsChannelConfig() {
309
285
  }
310
286
  function getBlueBubblesConfig() {
311
287
  const config = loadConfig();
312
- const { serverUrl, password, accountId } = config.bluebubbles;
288
+ const { serverUrl, password, accountId, ownHandles } = config.bluebubbles;
313
289
  if (!serverUrl.trim()) {
314
- throw new Error("bluebubbles.serverUrl is required in secrets.json to run the BlueBubbles sense.");
290
+ throw new Error("bluebubbles.serverUrl is required in this machine's agent-vault runtime config. Run `ouro connect bluebubbles --agent <agent>`.");
315
291
  }
316
292
  if (!password.trim()) {
317
- throw new Error("bluebubbles.password is required in secrets.json to run the BlueBubbles sense.");
293
+ throw new Error("bluebubbles.password is required in this machine's agent-vault runtime config. Run `ouro connect bluebubbles --agent <agent>`.");
294
+ }
295
+ const normalizedHandles = [];
296
+ for (const handle of ownHandles) {
297
+ const trimmed = handle.trim();
298
+ if (trimmed.length > 0)
299
+ normalizedHandles.push(trimmed);
318
300
  }
319
301
  return {
320
302
  serverUrl: serverUrl.trim(),
321
303
  password: password.trim(),
322
304
  accountId: accountId.trim() || "default",
305
+ ownHandles: normalizedHandles,
323
306
  };
324
307
  }
325
308
  function getBlueBubblesChannelConfig() {
@@ -331,6 +314,19 @@ function getIntegrationsConfig() {
331
314
  const config = loadConfig();
332
315
  return { ...config.integrations };
333
316
  }
317
+ function getSyncConfig() {
318
+ try {
319
+ const agentConfig = (0, identity_1.loadAgentConfig)();
320
+ return {
321
+ enabled: agentConfig.sync?.enabled ?? false,
322
+ remote: agentConfig.sync?.remote ?? "origin",
323
+ };
324
+ }
325
+ catch {
326
+ /* v8 ignore next -- defensive: loadAgentConfig failure in test/bootstrap @preserve */
327
+ return { enabled: false, remote: "origin" };
328
+ }
329
+ }
334
330
  function getOpenAIEmbeddingsApiKey() {
335
331
  return getIntegrationsConfig().openaiEmbeddingsApiKey;
336
332
  }