@ouro.bot/cli 0.1.0-alpha.38 → 0.1.0-alpha.381

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 (331) hide show
  1. package/README.md +109 -14
  2. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
  3. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  4. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  5. package/changelog.json +2303 -2
  6. package/dist/arc/attention-types.js +8 -0
  7. package/dist/arc/cares.js +140 -0
  8. package/dist/arc/episodes.js +117 -0
  9. package/dist/arc/intentions.js +133 -0
  10. package/dist/arc/json-store.js +117 -0
  11. package/dist/arc/obligations.js +237 -0
  12. package/dist/arc/packets.js +193 -0
  13. package/dist/arc/presence.js +185 -0
  14. package/dist/arc/task-lifecycle.js +65 -0
  15. package/dist/heart/active-work.js +832 -0
  16. package/dist/heart/agent-entry.js +58 -3
  17. package/dist/heart/attachments/image-normalize.js +194 -0
  18. package/dist/heart/attachments/materialize.js +97 -0
  19. package/dist/heart/attachments/originals.js +88 -0
  20. package/dist/heart/attachments/render.js +29 -0
  21. package/dist/heart/attachments/sources/adapter.js +2 -0
  22. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  23. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  24. package/dist/heart/attachments/sources/index.js +16 -0
  25. package/dist/heart/attachments/store.js +103 -0
  26. package/dist/heart/attachments/types.js +93 -0
  27. package/dist/heart/auth/auth-flow.js +378 -0
  28. package/dist/heart/bridges/manager.js +358 -0
  29. package/dist/heart/bridges/state-machine.js +135 -0
  30. package/dist/heart/bridges/store.js +123 -0
  31. package/dist/heart/bundle-state.js +168 -0
  32. package/dist/heart/commitments.js +111 -0
  33. package/dist/heart/config-registry.js +304 -0
  34. package/dist/heart/config.js +111 -128
  35. package/dist/heart/core.js +803 -259
  36. package/dist/heart/cross-chat-delivery.js +131 -0
  37. package/dist/heart/daemon/agent-config-check.js +376 -0
  38. package/dist/heart/daemon/agent-discovery.js +79 -3
  39. package/dist/heart/daemon/agent-service.js +360 -0
  40. package/dist/heart/daemon/agentic-repair.js +205 -0
  41. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  42. package/dist/heart/daemon/cadence.js +70 -0
  43. package/dist/heart/daemon/cli-defaults.js +560 -0
  44. package/dist/heart/daemon/cli-exec.js +3220 -0
  45. package/dist/heart/daemon/cli-help.js +319 -0
  46. package/dist/heart/daemon/cli-parse.js +1060 -0
  47. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  48. package/dist/heart/daemon/cli-render.js +560 -0
  49. package/dist/heart/daemon/cli-types.js +8 -0
  50. package/dist/heart/daemon/daemon-cli.js +29 -1498
  51. package/dist/heart/daemon/daemon-entry.js +356 -3
  52. package/dist/heart/daemon/daemon-health.js +141 -0
  53. package/dist/heart/daemon/daemon-runtime-sync.js +157 -12
  54. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  55. package/dist/heart/daemon/daemon.js +774 -58
  56. package/dist/heart/daemon/doctor-types.js +8 -0
  57. package/dist/heart/daemon/doctor.js +419 -0
  58. package/dist/heart/daemon/health-monitor.js +79 -1
  59. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  60. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  61. package/dist/heart/daemon/http-health-probe.js +80 -0
  62. package/dist/heart/daemon/inner-status.js +89 -0
  63. package/dist/heart/daemon/interactive-repair.js +182 -0
  64. package/dist/heart/daemon/launchd.js +46 -9
  65. package/dist/heart/daemon/log-tailer.js +82 -12
  66. package/dist/heart/daemon/logs-prune.js +105 -0
  67. package/dist/heart/daemon/message-router.js +17 -8
  68. package/dist/heart/daemon/os-cron-deps.js +134 -0
  69. package/dist/heart/daemon/ouro-bot-entry.js +1 -1
  70. package/dist/heart/daemon/process-manager.js +201 -0
  71. package/dist/heart/daemon/provider-discovery.js +137 -0
  72. package/dist/heart/daemon/pulse.js +475 -0
  73. package/dist/heart/daemon/run-hooks.js +2 -0
  74. package/dist/heart/daemon/runtime-logging.js +67 -16
  75. package/dist/heart/daemon/runtime-metadata.js +73 -0
  76. package/dist/heart/daemon/runtime-mode.js +67 -0
  77. package/dist/heart/daemon/safe-mode.js +161 -0
  78. package/dist/heart/daemon/sense-manager.js +119 -30
  79. package/dist/heart/daemon/session-id-resolver.js +131 -0
  80. package/dist/heart/daemon/skill-management-installer.js +94 -0
  81. package/dist/heart/daemon/socket-client.js +307 -0
  82. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  83. package/dist/heart/daemon/startup-tui.js +237 -0
  84. package/dist/heart/daemon/task-scheduler.js +3 -25
  85. package/dist/heart/daemon/thoughts.js +510 -0
  86. package/dist/heart/daemon/up-progress.js +135 -0
  87. package/dist/heart/delegation.js +62 -0
  88. package/dist/heart/habits/habit-migration.js +181 -0
  89. package/dist/heart/habits/habit-parser.js +140 -0
  90. package/dist/heart/habits/habit-scheduler.js +371 -0
  91. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -126
  92. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  93. package/dist/heart/{daemon → hatch}/specialist-prompt.js +10 -8
  94. package/dist/heart/{daemon → hatch}/specialist-tools.js +30 -10
  95. package/dist/heart/identity.js +153 -65
  96. package/dist/heart/kept-notes.js +357 -0
  97. package/dist/heart/kicks.js +2 -20
  98. package/dist/heart/machine-identity.js +161 -0
  99. package/dist/heart/mcp/mcp-server.js +653 -0
  100. package/dist/heart/migrate-config.js +100 -0
  101. package/dist/heart/model-capabilities.js +59 -0
  102. package/dist/heart/outlook/outlook-http-hooks.js +64 -0
  103. package/dist/heart/outlook/outlook-http-response.js +7 -0
  104. package/dist/heart/outlook/outlook-http-routes.js +232 -0
  105. package/dist/heart/outlook/outlook-http-static.js +99 -0
  106. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  107. package/dist/heart/outlook/outlook-http.js +99 -0
  108. package/dist/heart/outlook/outlook-read.js +28 -0
  109. package/dist/heart/outlook/outlook-types.js +27 -0
  110. package/dist/heart/outlook/outlook-view.js +195 -0
  111. package/dist/heart/outlook/readers/agent-machine.js +359 -0
  112. package/dist/heart/outlook/readers/continuity-readers.js +332 -0
  113. package/dist/heart/outlook/readers/runtime-readers.js +660 -0
  114. package/dist/heart/outlook/readers/sessions.js +232 -0
  115. package/dist/heart/outlook/readers/shared.js +111 -0
  116. package/dist/heart/platform.js +81 -0
  117. package/dist/heart/progress-story.js +42 -0
  118. package/dist/heart/provider-attempt.js +133 -0
  119. package/dist/heart/provider-binding-resolver.js +239 -0
  120. package/dist/heart/provider-credentials.js +379 -0
  121. package/dist/heart/provider-failover.js +266 -0
  122. package/dist/heart/provider-models.js +81 -0
  123. package/dist/heart/provider-ping.js +237 -0
  124. package/dist/heart/provider-state.js +216 -0
  125. package/dist/heart/provider-visibility.js +186 -0
  126. package/dist/heart/providers/anthropic-token.js +131 -0
  127. package/dist/heart/providers/anthropic.js +193 -55
  128. package/dist/heart/providers/azure.js +103 -12
  129. package/dist/heart/providers/error-classification.js +63 -0
  130. package/dist/heart/providers/github-copilot.js +145 -0
  131. package/dist/heart/providers/minimax-vlm.js +189 -0
  132. package/dist/heart/providers/minimax.js +29 -7
  133. package/dist/heart/providers/openai-codex.js +39 -29
  134. package/dist/heart/runtime-credentials.js +181 -0
  135. package/dist/heart/session-activity.js +190 -0
  136. package/dist/heart/session-events.js +855 -0
  137. package/dist/heart/session-transcript.js +167 -0
  138. package/dist/heart/start-of-turn-packet.js +345 -0
  139. package/dist/heart/streaming.js +36 -27
  140. package/dist/heart/sync.js +332 -0
  141. package/dist/heart/target-resolution.js +127 -0
  142. package/dist/heart/tempo.js +93 -0
  143. package/dist/heart/temporal-view.js +41 -0
  144. package/dist/heart/tool-activity-callbacks.js +36 -0
  145. package/dist/heart/tool-description.js +135 -0
  146. package/dist/heart/tool-friction.js +55 -0
  147. package/dist/heart/tool-loop.js +200 -0
  148. package/dist/heart/turn-context.js +351 -0
  149. package/dist/heart/turn-coordinator.js +28 -0
  150. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  151. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  152. package/dist/heart/versioning/ouro-path-installer.js +301 -0
  153. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  154. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  155. package/dist/heart/{daemon → versioning}/update-checker.js +12 -2
  156. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  157. package/dist/mind/bundle-manifest.js +7 -1
  158. package/dist/mind/context.js +141 -94
  159. package/dist/mind/diary-integrity.js +60 -0
  160. package/dist/mind/{memory.js → diary.js} +84 -96
  161. package/dist/mind/embedding-provider.js +60 -0
  162. package/dist/mind/file-state.js +179 -0
  163. package/dist/mind/first-impressions.js +14 -1
  164. package/dist/mind/friends/channel.js +48 -0
  165. package/dist/mind/friends/group-context.js +144 -0
  166. package/dist/mind/friends/resolver.js +38 -1
  167. package/dist/mind/friends/store-file.js +39 -3
  168. package/dist/mind/friends/trust-explanation.js +74 -0
  169. package/dist/mind/friends/types.js +9 -1
  170. package/dist/mind/journal-index.js +161 -0
  171. package/dist/mind/note-search.js +268 -0
  172. package/dist/mind/obligation-steering.js +221 -0
  173. package/dist/mind/pending.js +74 -7
  174. package/dist/mind/prompt-refresh.js +3 -2
  175. package/dist/mind/prompt.js +966 -183
  176. package/dist/mind/provenance-trust.js +26 -0
  177. package/dist/mind/scrutiny.js +173 -0
  178. package/dist/mind/token-estimate.js +8 -12
  179. package/dist/nerves/cli-logging.js +7 -1
  180. package/dist/nerves/coverage/audit-rules.js +15 -6
  181. package/dist/nerves/coverage/audit.js +28 -2
  182. package/dist/nerves/coverage/cli.js +1 -1
  183. package/dist/nerves/coverage/file-completeness.js +83 -5
  184. package/dist/nerves/coverage/run-artifacts.js +1 -1
  185. package/dist/nerves/event-buffer.js +111 -0
  186. package/dist/nerves/index.js +224 -4
  187. package/dist/nerves/observation.js +20 -0
  188. package/dist/nerves/redact.js +79 -0
  189. package/dist/nerves/runtime.js +5 -1
  190. package/dist/outlook-ui/assets/index-BAcU08c-.css +1 -0
  191. package/dist/outlook-ui/assets/index-D7l3l4vY.js +61 -0
  192. package/dist/outlook-ui/index.html +15 -0
  193. package/dist/repertoire/ado-client.js +15 -56
  194. package/dist/repertoire/ado-semantic.js +11 -10
  195. package/dist/repertoire/api-client.js +97 -0
  196. package/dist/repertoire/bitwarden-store.js +365 -0
  197. package/dist/repertoire/bundle-templates.js +72 -0
  198. package/dist/repertoire/bw-installer.js +79 -0
  199. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  200. package/dist/repertoire/coding/context-pack.js +330 -0
  201. package/dist/repertoire/coding/feedback.js +197 -30
  202. package/dist/repertoire/coding/manager.js +158 -9
  203. package/dist/repertoire/coding/spawner.js +55 -9
  204. package/dist/repertoire/coding/tools.js +170 -7
  205. package/dist/repertoire/commerce-errors.js +109 -0
  206. package/dist/repertoire/commerce-self-test.js +156 -0
  207. package/dist/repertoire/credential-access.js +107 -0
  208. package/dist/repertoire/duffel-client.js +185 -0
  209. package/dist/repertoire/github-client.js +14 -55
  210. package/dist/repertoire/graph-client.js +11 -52
  211. package/dist/repertoire/guardrails.js +371 -0
  212. package/dist/repertoire/mcp-client.js +255 -0
  213. package/dist/repertoire/mcp-manager.js +305 -0
  214. package/dist/repertoire/mcp-tools.js +63 -0
  215. package/dist/repertoire/shell-sessions.js +133 -0
  216. package/dist/repertoire/skills.js +15 -24
  217. package/dist/repertoire/stripe-client.js +131 -0
  218. package/dist/repertoire/tasks/board.js +43 -5
  219. package/dist/repertoire/tasks/fix.js +182 -0
  220. package/dist/repertoire/tasks/index.js +28 -10
  221. package/dist/repertoire/tasks/lifecycle.js +2 -2
  222. package/dist/repertoire/tasks/parser.js +3 -2
  223. package/dist/repertoire/tasks/scanner.js +194 -37
  224. package/dist/repertoire/tasks/transitions.js +16 -79
  225. package/dist/repertoire/tool-results.js +29 -0
  226. package/dist/repertoire/tools-attachments.js +317 -0
  227. package/dist/repertoire/tools-base.js +42 -690
  228. package/dist/repertoire/tools-bluebubbles.js +1 -0
  229. package/dist/repertoire/tools-bridge.js +141 -0
  230. package/dist/repertoire/tools-bundle.js +984 -0
  231. package/dist/repertoire/tools-config.js +185 -0
  232. package/dist/repertoire/tools-continuity.js +248 -0
  233. package/dist/repertoire/tools-credential.js +182 -0
  234. package/dist/repertoire/tools-files.js +342 -0
  235. package/dist/repertoire/tools-flight.js +224 -0
  236. package/dist/repertoire/tools-flow.js +105 -0
  237. package/dist/repertoire/tools-github.js +1 -7
  238. package/dist/repertoire/tools-notes.js +376 -0
  239. package/dist/repertoire/tools-session.js +739 -0
  240. package/dist/repertoire/tools-shell.js +120 -0
  241. package/dist/repertoire/tools-stripe.js +180 -0
  242. package/dist/repertoire/tools-surface.js +243 -0
  243. package/dist/repertoire/tools-teams.js +12 -62
  244. package/dist/repertoire/tools-travel.js +125 -0
  245. package/dist/repertoire/tools-user-profile.js +144 -0
  246. package/dist/repertoire/tools-vault.js +40 -0
  247. package/dist/repertoire/tools.js +144 -120
  248. package/dist/repertoire/travel-api-client.js +360 -0
  249. package/dist/repertoire/user-profile.js +118 -0
  250. package/dist/repertoire/vault-setup.js +241 -0
  251. package/dist/repertoire/vault-unlock.js +364 -0
  252. package/dist/scripts/claude-code-hook.js +41 -0
  253. package/dist/scripts/claude-code-stop-hook.js +47 -0
  254. package/dist/senses/attention-queue.js +116 -0
  255. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  256. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  257. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +260 -9
  258. package/dist/senses/bluebubbles/entry.js +70 -0
  259. package/dist/senses/bluebubbles/inbound-log.js +113 -0
  260. package/dist/senses/bluebubbles/index.js +1620 -0
  261. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  262. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +43 -12
  263. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  264. package/dist/senses/bluebubbles/replay.js +129 -0
  265. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  266. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  267. package/dist/senses/cli/bracketed-paste.js +82 -0
  268. package/dist/senses/cli/image-paste.js +287 -0
  269. package/dist/senses/cli/image-ref-navigation.js +75 -0
  270. package/dist/senses/cli/ink-app.js +156 -0
  271. package/dist/senses/cli/inline-diff.js +64 -0
  272. package/dist/senses/cli/input-keys.js +174 -0
  273. package/dist/senses/cli/kill-ring.js +86 -0
  274. package/dist/senses/cli/message-list.js +51 -0
  275. package/dist/senses/cli/ouro-tui.js +605 -0
  276. package/dist/senses/cli/spinner-imperative.js +135 -0
  277. package/dist/senses/cli/spinner.js +101 -0
  278. package/dist/senses/cli/status-line.js +60 -0
  279. package/dist/senses/cli/streaming-markdown.js +526 -0
  280. package/dist/senses/cli/tool-display.js +83 -0
  281. package/dist/senses/cli/tool-render.js +85 -0
  282. package/dist/senses/cli/tui-store.js +240 -0
  283. package/dist/senses/cli/virtual-list.js +35 -0
  284. package/dist/senses/cli-entry.js +60 -8
  285. package/dist/senses/cli-layout.js +187 -0
  286. package/dist/senses/cli.js +574 -254
  287. package/dist/senses/commands.js +66 -3
  288. package/dist/senses/continuity.js +94 -0
  289. package/dist/senses/habit-turn-message.js +108 -0
  290. package/dist/senses/inner-dialog-worker.js +112 -19
  291. package/dist/senses/inner-dialog.js +630 -82
  292. package/dist/senses/pipeline.js +602 -0
  293. package/dist/senses/proactive-content-guard.js +51 -0
  294. package/dist/senses/shared-turn.js +205 -0
  295. package/dist/senses/surface-tool.js +68 -0
  296. package/dist/senses/teams-entry.js +60 -8
  297. package/dist/senses/teams.js +585 -231
  298. package/dist/senses/trust-gate.js +112 -2
  299. package/package.json +28 -7
  300. package/skills/agent-commerce.md +106 -0
  301. package/skills/browser-navigation.md +110 -0
  302. package/skills/commerce-setup-guide.md +116 -0
  303. package/skills/commerce-setup.md +84 -0
  304. package/skills/configure-dev-tools.md +101 -0
  305. package/skills/travel-planning.md +134 -0
  306. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  307. package/dist/heart/daemon/subagent-installer.js +0 -134
  308. package/dist/mind/associative-recall.js +0 -197
  309. package/dist/senses/bluebubbles-entry.js +0 -11
  310. package/dist/senses/bluebubbles.js +0 -736
  311. package/dist/senses/debug-activity.js +0 -127
  312. package/subagents/README.md +0 -60
  313. package/subagents/work-doer.md +0 -235
  314. package/subagents/work-merger.md +0 -618
  315. package/subagents/work-planner.md +0 -382
  316. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  317. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  318. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  319. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  320. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  321. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  322. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  323. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  324. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  325. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  326. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  327. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  328. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  329. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  330. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  331. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -35,11 +35,13 @@ 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;
38
39
  exports.patchRuntimeConfig = patchRuntimeConfig;
39
40
  exports.getAzureConfig = getAzureConfig;
40
41
  exports.getMinimaxConfig = getMinimaxConfig;
41
42
  exports.getAnthropicConfig = getAnthropicConfig;
42
43
  exports.getOpenAICodexConfig = getOpenAICodexConfig;
44
+ exports.getGithubCopilotConfig = getGithubCopilotConfig;
43
45
  exports.getTeamsConfig = getTeamsConfig;
44
46
  exports.getTeamsSecondaryConfig = getTeamsSecondaryConfig;
45
47
  exports.getContextConfig = getContextConfig;
@@ -49,39 +51,21 @@ exports.getTeamsChannelConfig = getTeamsChannelConfig;
49
51
  exports.getBlueBubblesConfig = getBlueBubblesConfig;
50
52
  exports.getBlueBubblesChannelConfig = getBlueBubblesChannelConfig;
51
53
  exports.getIntegrationsConfig = getIntegrationsConfig;
54
+ exports.getSyncConfig = getSyncConfig;
52
55
  exports.getOpenAIEmbeddingsApiKey = getOpenAIEmbeddingsApiKey;
53
56
  exports.getLogsDir = getLogsDir;
57
+ exports.sanitizeKey = sanitizeKey;
58
+ exports.slugify = slugify;
54
59
  exports.resolveSessionPath = resolveSessionPath;
55
60
  exports.sessionPath = sessionPath;
56
61
  exports.logPath = logPath;
57
62
  const fs = __importStar(require("fs"));
58
63
  const path = __importStar(require("path"));
59
64
  const identity_1 = require("./identity");
65
+ const provider_credentials_1 = require("./provider-credentials");
66
+ const runtime_credentials_1 = require("./runtime-credentials");
60
67
  const runtime_1 = require("../nerves/runtime");
61
- const DEFAULT_SECRETS_TEMPLATE = {
62
- providers: {
63
- // Keep provider field ordering consistent: model first, then auth credentials,
64
- // then provider-specific transport fields.
65
- azure: {
66
- modelName: "",
67
- apiKey: "",
68
- endpoint: "",
69
- deployment: "",
70
- apiVersion: "2025-04-01-preview",
71
- },
72
- minimax: {
73
- model: "",
74
- apiKey: "",
75
- },
76
- anthropic: {
77
- model: "claude-opus-4-6",
78
- setupToken: "",
79
- },
80
- "openai-codex": {
81
- model: "gpt-5.4",
82
- oauthAccessToken: "",
83
- },
84
- },
68
+ const DEFAULT_LOCAL_RUNTIME_CONFIG = {
85
69
  teams: {
86
70
  clientId: "",
87
71
  clientSecret: "",
@@ -113,6 +97,9 @@ const DEFAULT_SECRETS_TEMPLATE = {
113
97
  webhookPath: "/bluebubbles-webhook",
114
98
  requestTimeoutMs: 30000,
115
99
  },
100
+ vault: {
101
+ masterPassword: "",
102
+ },
116
103
  integrations: {
117
104
  perplexityApiKey: "",
118
105
  openaiEmbeddingsApiKey: "",
@@ -120,27 +107,20 @@ const DEFAULT_SECRETS_TEMPLATE = {
120
107
  };
121
108
  function defaultRuntimeConfig() {
122
109
  return {
123
- providers: {
124
- azure: { ...DEFAULT_SECRETS_TEMPLATE.providers.azure },
125
- minimax: { ...DEFAULT_SECRETS_TEMPLATE.providers.minimax },
126
- anthropic: { ...DEFAULT_SECRETS_TEMPLATE.providers.anthropic },
127
- "openai-codex": { ...DEFAULT_SECRETS_TEMPLATE.providers["openai-codex"] },
128
- },
129
- teams: { ...DEFAULT_SECRETS_TEMPLATE.teams },
130
- teamsSecondary: { ...DEFAULT_SECRETS_TEMPLATE.teamsSecondary },
131
- oauth: { ...DEFAULT_SECRETS_TEMPLATE.oauth },
110
+ teams: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teams },
111
+ teamsSecondary: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teamsSecondary },
112
+ oauth: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.oauth },
132
113
  context: { ...identity_1.DEFAULT_AGENT_CONTEXT },
133
- teamsChannel: { ...DEFAULT_SECRETS_TEMPLATE.teamsChannel },
134
- bluebubbles: { ...DEFAULT_SECRETS_TEMPLATE.bluebubbles },
135
- bluebubblesChannel: { ...DEFAULT_SECRETS_TEMPLATE.bluebubblesChannel },
136
- integrations: { ...DEFAULT_SECRETS_TEMPLATE.integrations },
114
+ teamsChannel: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.teamsChannel },
115
+ bluebubbles: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.bluebubbles },
116
+ bluebubblesChannel: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.bluebubblesChannel },
117
+ vault: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.vault },
118
+ integrations: { ...DEFAULT_LOCAL_RUNTIME_CONFIG.integrations },
137
119
  };
138
120
  }
139
- let _cachedConfig = null;
121
+ let _runtimeConfigOverride = null;
140
122
  let _testContextOverride = null;
141
- function resolveConfigPath() {
142
- return (0, identity_1.getAgentSecretsPath)();
143
- }
123
+ let _providerConfigOverride = null;
144
124
  function deepMerge(defaults, partial) {
145
125
  const result = { ...defaults };
146
126
  for (const key of Object.keys(partial)) {
@@ -157,116 +137,98 @@ function deepMerge(defaults, partial) {
157
137
  }
158
138
  return result;
159
139
  }
140
+ function localRuntimeFields(config) {
141
+ const { providers: _providers, context: _context, ...localFields } = config;
142
+ return localFields;
143
+ }
160
144
  function loadConfig() {
161
- if (_cachedConfig) {
162
- (0, runtime_1.emitNervesEvent)({
163
- event: "config.load",
164
- component: "config/identity",
165
- message: "config loaded from cache",
166
- meta: { source: "cache" },
167
- });
168
- return _cachedConfig;
169
- }
170
- const configPath = resolveConfigPath();
171
- // Auto-create config directory if it doesn't exist
172
- const configDir = path.dirname(configPath);
173
- fs.mkdirSync(configDir, { recursive: true });
174
- let fileData = {};
175
- try {
176
- const raw = fs.readFileSync(configPath, "utf-8");
177
- fileData = JSON.parse(raw);
178
- }
179
- catch (error) {
180
- const errorCode = error &&
181
- typeof error === "object" &&
182
- "code" in error &&
183
- typeof error.code === "string"
184
- ? error.code
185
- : undefined;
186
- if (errorCode === "ENOENT") {
187
- try {
188
- fs.writeFileSync(configPath, JSON.stringify(DEFAULT_SECRETS_TEMPLATE, null, 2) + "\n", "utf-8");
189
- }
190
- catch (writeError) {
191
- (0, runtime_1.emitNervesEvent)({
192
- level: "warn",
193
- event: "config_identity.error",
194
- component: "config/identity",
195
- message: "failed writing default secrets config",
196
- meta: {
197
- phase: "loadConfig",
198
- path: configPath,
199
- reason: writeError instanceof Error ? writeError.message : String(writeError),
200
- },
201
- });
202
- }
203
- }
204
- (0, runtime_1.emitNervesEvent)({
205
- level: "warn",
206
- event: "config_identity.error",
207
- component: "config/identity",
208
- message: "config read failed; defaults applied",
209
- meta: {
210
- phase: "loadConfig",
211
- reason: error instanceof Error ? error.message : String(error),
212
- },
213
- });
214
- // ENOENT or parse error -- use defaults
215
- }
216
- const sanitizedFileData = { ...fileData };
217
- if ("context" in sanitizedFileData) {
218
- delete sanitizedFileData.context;
219
- (0, runtime_1.emitNervesEvent)({
220
- level: "warn",
221
- event: "config_identity.error",
222
- component: "config/identity",
223
- message: "ignored legacy context block in secrets config",
224
- meta: {
225
- phase: "loadConfig",
226
- path: configPath,
227
- },
228
- });
229
- }
230
- _cachedConfig = deepMerge(defaultRuntimeConfig(), sanitizedFileData);
145
+ const runtimeResult = (0, runtime_credentials_1.readRuntimeCredentialConfig)((0, identity_1.getAgentName)());
146
+ const vaultData = runtimeResult.ok ? localRuntimeFields(runtimeResult.config) : {};
147
+ const mergedConfig = deepMerge(defaultRuntimeConfig(), vaultData);
148
+ const config = _runtimeConfigOverride
149
+ ? deepMerge(mergedConfig, _runtimeConfigOverride)
150
+ : mergedConfig;
231
151
  (0, runtime_1.emitNervesEvent)({
232
152
  event: "config.load",
233
153
  component: "config/identity",
234
- message: "config loaded from disk",
154
+ message: "config loaded from runtime credential cache",
235
155
  meta: {
236
- source: "disk",
237
- used_defaults_only: Object.keys(fileData).length === 0,
156
+ source: runtimeResult.ok ? "vault-cache" : "defaults",
157
+ used_defaults_only: !runtimeResult.ok,
158
+ override_applied: _runtimeConfigOverride !== null,
159
+ runtime_credentials: runtimeResult.ok ? "available" : runtimeResult.reason,
238
160
  },
239
161
  });
240
- return _cachedConfig;
162
+ return config;
241
163
  }
242
164
  function resetConfigCache() {
243
- _cachedConfig = null;
165
+ _runtimeConfigOverride = null;
244
166
  _testContextOverride = null;
167
+ _providerConfigOverride = null;
168
+ (0, provider_credentials_1.resetProviderCredentialCache)();
169
+ (0, runtime_credentials_1.resetRuntimeCredentialConfigCache)();
170
+ }
171
+ function cacheRuntimeConfigForTests(agentName, config) {
172
+ (0, runtime_credentials_1.cacheRuntimeCredentialConfig)(agentName, config, new Date(0));
173
+ }
174
+ function seedProviderCredentialCache(providers) {
175
+ if (!providers)
176
+ return;
177
+ _providerConfigOverride = deepMerge((_providerConfigOverride ?? {}), providers);
178
+ const records = Object.entries(_providerConfigOverride).map(([provider, rawConfig]) => {
179
+ const split = (0, provider_credentials_1.splitProviderCredentialFields)(provider, rawConfig);
180
+ return (0, provider_credentials_1.createProviderCredentialRecord)({
181
+ provider: provider,
182
+ credentials: split.credentials,
183
+ config: split.config,
184
+ provenance: { source: "manual" },
185
+ now: new Date(0),
186
+ });
187
+ });
188
+ (0, provider_credentials_1.cacheProviderCredentialRecords)((0, identity_1.getAgentName)(), records, new Date(0));
245
189
  }
246
190
  function patchRuntimeConfig(partial) {
247
- loadConfig(); // ensure _cachedConfig exists
191
+ const { providers, ...runtimePartial } = partial;
192
+ seedProviderCredentialCache(providers);
248
193
  const contextPatch = partial.context;
249
194
  if (contextPatch) {
250
195
  const base = _testContextOverride ?? identity_1.DEFAULT_AGENT_CONTEXT;
251
196
  _testContextOverride = deepMerge(base, contextPatch);
252
197
  }
253
- _cachedConfig = deepMerge(_cachedConfig, partial);
198
+ _runtimeConfigOverride = deepMerge((_runtimeConfigOverride ?? {}), runtimePartial);
199
+ }
200
+ function readProviderConfig(provider) {
201
+ const cached = (0, provider_credentials_1.readCachedProviderCredentialRecord)((0, identity_1.getAgentName)(), provider);
202
+ return cached.ok ? { ...cached.record.config, ...cached.record.credentials } : {};
254
203
  }
255
204
  function getAzureConfig() {
256
- const config = loadConfig();
257
- return { ...config.providers.azure };
205
+ const raw = readProviderConfig("azure");
206
+ return {
207
+ apiKey: typeof raw.apiKey === "string" ? raw.apiKey : "",
208
+ endpoint: typeof raw.endpoint === "string" ? raw.endpoint : "",
209
+ deployment: typeof raw.deployment === "string" ? raw.deployment : "",
210
+ apiVersion: typeof raw.apiVersion === "string" ? raw.apiVersion : "2025-04-01-preview",
211
+ managedIdentityClientId: typeof raw.managedIdentityClientId === "string" ? raw.managedIdentityClientId : "",
212
+ };
258
213
  }
259
214
  function getMinimaxConfig() {
260
- const config = loadConfig();
261
- return { ...config.providers.minimax };
215
+ const raw = readProviderConfig("minimax");
216
+ return { apiKey: typeof raw.apiKey === "string" ? raw.apiKey : "" };
262
217
  }
263
218
  function getAnthropicConfig() {
264
- const config = loadConfig();
265
- return { ...config.providers.anthropic };
219
+ const raw = readProviderConfig("anthropic");
220
+ return { setupToken: typeof raw.setupToken === "string" ? raw.setupToken : "" };
266
221
  }
267
222
  function getOpenAICodexConfig() {
268
- const config = loadConfig();
269
- return { ...config.providers["openai-codex"] };
223
+ const raw = readProviderConfig("openai-codex");
224
+ return { oauthAccessToken: typeof raw.oauthAccessToken === "string" ? raw.oauthAccessToken : "" };
225
+ }
226
+ function getGithubCopilotConfig() {
227
+ const raw = readProviderConfig("github-copilot");
228
+ return {
229
+ githubToken: typeof raw.githubToken === "string" ? raw.githubToken : "",
230
+ baseUrl: typeof raw.baseUrl === "string" ? raw.baseUrl : "",
231
+ };
270
232
  }
271
233
  function getTeamsConfig() {
272
234
  const config = loadConfig();
@@ -315,10 +277,10 @@ function getBlueBubblesConfig() {
315
277
  const config = loadConfig();
316
278
  const { serverUrl, password, accountId } = config.bluebubbles;
317
279
  if (!serverUrl.trim()) {
318
- throw new Error("bluebubbles.serverUrl is required in secrets.json to run the BlueBubbles sense.");
280
+ throw new Error("bluebubbles.serverUrl is required in the agent vault runtime/config item to run the BlueBubbles sense.");
319
281
  }
320
282
  if (!password.trim()) {
321
- throw new Error("bluebubbles.password is required in secrets.json to run the BlueBubbles sense.");
283
+ throw new Error("bluebubbles.password is required in the agent vault runtime/config item to run the BlueBubbles sense.");
322
284
  }
323
285
  return {
324
286
  serverUrl: serverUrl.trim(),
@@ -335,6 +297,19 @@ function getIntegrationsConfig() {
335
297
  const config = loadConfig();
336
298
  return { ...config.integrations };
337
299
  }
300
+ function getSyncConfig() {
301
+ try {
302
+ const agentConfig = (0, identity_1.loadAgentConfig)();
303
+ return {
304
+ enabled: agentConfig.sync?.enabled ?? false,
305
+ remote: agentConfig.sync?.remote ?? "origin",
306
+ };
307
+ }
308
+ catch {
309
+ /* v8 ignore next -- defensive: loadAgentConfig failure in test/bootstrap @preserve */
310
+ return { enabled: false, remote: "origin" };
311
+ }
312
+ }
338
313
  function getOpenAIEmbeddingsApiKey() {
339
314
  return getIntegrationsConfig().openaiEmbeddingsApiKey;
340
315
  }
@@ -344,6 +319,14 @@ function getLogsDir() {
344
319
  function sanitizeKey(key) {
345
320
  return key.replace(/[/:]/g, "_");
346
321
  }
322
+ function slugify(value) {
323
+ return value
324
+ .trim()
325
+ .toLowerCase()
326
+ .replace(/[^a-z0-9]+/g, "-")
327
+ .replace(/^-+/, "")
328
+ .replace(/-+$/, "");
329
+ }
347
330
  function resolveSessionPath(friendId, channel, key, options) {
348
331
  const dir = path.join((0, identity_1.getAgentRoot)(), "state", "sessions", friendId, channel);
349
332
  if (options?.ensureDir) {