@ouro.bot/cli 0.1.0-alpha.4 → 0.1.0-alpha.400

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