@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
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RUNTIME_CONFIG_ITEM_NAME = void 0;
37
+ exports.readRuntimeCredentialConfig = readRuntimeCredentialConfig;
38
+ exports.cacheRuntimeCredentialConfig = cacheRuntimeCredentialConfig;
39
+ exports.refreshRuntimeCredentialConfig = refreshRuntimeCredentialConfig;
40
+ exports.upsertRuntimeCredentialConfig = upsertRuntimeCredentialConfig;
41
+ exports.resetRuntimeCredentialConfigCache = resetRuntimeCredentialConfigCache;
42
+ const crypto = __importStar(require("node:crypto"));
43
+ const runtime_1 = require("../nerves/runtime");
44
+ const credential_access_1 = require("../repertoire/credential-access");
45
+ const identity_1 = require("./identity");
46
+ exports.RUNTIME_CONFIG_ITEM_NAME = "runtime/config";
47
+ let cachedRuntimeConfigs = new Map();
48
+ function isRecord(value) {
49
+ return !!value && typeof value === "object" && !Array.isArray(value);
50
+ }
51
+ function stableJson(value) {
52
+ if (Array.isArray(value))
53
+ return `[${value.map(stableJson).join(",")}]`;
54
+ if (isRecord(value)) {
55
+ return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${stableJson(value[key])}`).join(",")}}`;
56
+ }
57
+ return JSON.stringify(value);
58
+ }
59
+ function runtimeConfigVaultPath(agentName) {
60
+ return `vault:${agentName}:${exports.RUNTIME_CONFIG_ITEM_NAME}`;
61
+ }
62
+ function runtimeConfigRevision(payload) {
63
+ return `runtime_${crypto
64
+ .createHash("sha256")
65
+ .update(stableJson(payload))
66
+ .digest("hex")
67
+ .slice(0, 16)}`;
68
+ }
69
+ function validateRuntimeCredentialPayload(value) {
70
+ if (!isRecord(value))
71
+ throw new Error("runtime credential payload must be an object");
72
+ if (value.schemaVersion !== 1)
73
+ throw new Error("runtime credential payload schemaVersion must be 1");
74
+ if (value.kind !== "runtime-config")
75
+ throw new Error("runtime credential payload kind must be runtime-config");
76
+ if (typeof value.updatedAt !== "string" || value.updatedAt.trim().length === 0) {
77
+ throw new Error("runtime credential payload updatedAt must be non-empty");
78
+ }
79
+ if (!isRecord(value.config))
80
+ throw new Error("runtime credential payload config must be an object");
81
+ return value;
82
+ }
83
+ function resultFromPayload(agentName, payload) {
84
+ return {
85
+ ok: true,
86
+ itemPath: runtimeConfigVaultPath(agentName),
87
+ config: { ...payload.config },
88
+ revision: runtimeConfigRevision(payload),
89
+ updatedAt: payload.updatedAt,
90
+ };
91
+ }
92
+ function missingRuntimeConfig(agentName) {
93
+ return {
94
+ ok: false,
95
+ reason: "missing",
96
+ itemPath: runtimeConfigVaultPath(agentName),
97
+ error: `no runtime credentials stored at ${runtimeConfigVaultPath(agentName)}`,
98
+ };
99
+ }
100
+ function cacheResult(agentName, result) {
101
+ cachedRuntimeConfigs.set(agentName, result);
102
+ return result;
103
+ }
104
+ function readRuntimeCredentialConfig(agentName = (0, identity_1.getAgentName)()) {
105
+ return cachedRuntimeConfigs.get(agentName) ?? missingRuntimeConfig(agentName);
106
+ }
107
+ function cacheRuntimeCredentialConfig(agentName, config, now = new Date()) {
108
+ const payload = {
109
+ schemaVersion: 1,
110
+ kind: "runtime-config",
111
+ updatedAt: now.toISOString(),
112
+ config: { ...config },
113
+ };
114
+ return cacheResult(agentName, resultFromPayload(agentName, payload));
115
+ }
116
+ async function refreshRuntimeCredentialConfig(agentName, options = {}) {
117
+ try {
118
+ const store = (0, credential_access_1.getCredentialStore)(agentName);
119
+ const raw = await store.getRawSecret(exports.RUNTIME_CONFIG_ITEM_NAME, "password");
120
+ const payload = validateRuntimeCredentialPayload(JSON.parse(raw));
121
+ const result = resultFromPayload(agentName, payload);
122
+ (0, runtime_1.emitNervesEvent)({
123
+ component: "config/identity",
124
+ event: "config.runtime_credentials_loaded",
125
+ message: "loaded runtime credentials from vault",
126
+ meta: { agentName, itemPath: result.itemPath, revision: result.revision },
127
+ });
128
+ return cacheResult(agentName, result);
129
+ }
130
+ catch (error) {
131
+ const message = error instanceof Error ? error.message : String(error);
132
+ const cached = cachedRuntimeConfigs.get(agentName);
133
+ const reason = message.includes(`no credential found for domain "${exports.RUNTIME_CONFIG_ITEM_NAME}"`)
134
+ ? "missing"
135
+ : message.includes("runtime credential payload")
136
+ ? "invalid"
137
+ : "unavailable";
138
+ const result = {
139
+ ok: false,
140
+ reason,
141
+ itemPath: runtimeConfigVaultPath(agentName),
142
+ error: reason === "missing" ? `no runtime credentials stored at ${runtimeConfigVaultPath(agentName)}` : message,
143
+ };
144
+ (0, runtime_1.emitNervesEvent)({
145
+ level: reason === "missing" ? "warn" : "error",
146
+ component: "config/identity",
147
+ event: "config.runtime_credentials_unavailable",
148
+ message: "runtime credentials unavailable",
149
+ meta: { agentName, reason, itemPath: result.itemPath },
150
+ });
151
+ if (options.preserveCachedOnFailure && cached?.ok)
152
+ return cached;
153
+ return cacheResult(agentName, result);
154
+ }
155
+ }
156
+ async function upsertRuntimeCredentialConfig(agentName, config, now = new Date()) {
157
+ const payload = {
158
+ schemaVersion: 1,
159
+ kind: "runtime-config",
160
+ updatedAt: now.toISOString(),
161
+ config: { ...config },
162
+ };
163
+ const store = (0, credential_access_1.getCredentialStore)(agentName);
164
+ await store.store(exports.RUNTIME_CONFIG_ITEM_NAME, {
165
+ username: "runtime/config",
166
+ password: JSON.stringify(payload),
167
+ notes: "Ouro runtime credentials for senses and integrations. Provider credentials live in providers/* items.",
168
+ });
169
+ const result = resultFromPayload(agentName, payload);
170
+ (0, runtime_1.emitNervesEvent)({
171
+ component: "config/identity",
172
+ event: "config.runtime_credentials_upserted",
173
+ message: "upserted runtime credential config in vault",
174
+ meta: { agentName, itemPath: result.itemPath, revision: result.revision },
175
+ });
176
+ cacheResult(agentName, result);
177
+ return result;
178
+ }
179
+ function resetRuntimeCredentialConfigCache() {
180
+ cachedRuntimeConfigs = new Map();
181
+ }
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.listSessionActivity = listSessionActivity;
37
+ exports.findFreshestFriendSession = findFreshestFriendSession;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const runtime_1 = require("../nerves/runtime");
41
+ const config_1 = require("./config");
42
+ const session_events_1 = require("./session-events");
43
+ const DEFAULT_ACTIVE_THRESHOLD_MS = 24 * 60 * 60 * 1000;
44
+ function activityPriority(source) {
45
+ return source === "friend-facing" ? 0 : 1;
46
+ }
47
+ function resolveFriendName(friendId, friendsDir, agentName) {
48
+ if (friendId === "self")
49
+ return agentName;
50
+ try {
51
+ const raw = fs.readFileSync(path.join(friendsDir, `${friendId}.json`), "utf-8");
52
+ const parsed = JSON.parse(raw);
53
+ return parsed.name ?? friendId;
54
+ }
55
+ catch {
56
+ return friendId;
57
+ }
58
+ }
59
+ function parseFriendActivity(sessionPath) {
60
+ let mtimeMs;
61
+ try {
62
+ mtimeMs = fs.statSync(sessionPath).mtimeMs;
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ const envelope = (0, session_events_1.loadSessionEnvelopeFile)(sessionPath);
68
+ const chronology = envelope ? (0, session_events_1.deriveSessionChronology)(envelope.events) : null;
69
+ const explicit = envelope?.state.lastFriendActivityAt;
70
+ if (typeof explicit === "string") {
71
+ const parsedMs = Date.parse(explicit);
72
+ if (Number.isFinite(parsedMs)) {
73
+ return {
74
+ lastActivityMs: parsedMs,
75
+ lastActivityAt: new Date(parsedMs).toISOString(),
76
+ activitySource: "friend-facing",
77
+ lastInboundAt: chronology?.lastInboundAt ?? null,
78
+ lastOutboundAt: chronology?.lastOutboundAt ?? null,
79
+ unansweredInboundCount: chronology?.unansweredInboundCount ?? 0,
80
+ };
81
+ }
82
+ }
83
+ if (chronology?.lastInboundAt) {
84
+ const parsedMs = Date.parse(chronology.lastInboundAt);
85
+ if (Number.isFinite(parsedMs)) {
86
+ return {
87
+ lastActivityMs: parsedMs,
88
+ lastActivityAt: new Date(parsedMs).toISOString(),
89
+ activitySource: "friend-facing",
90
+ lastInboundAt: chronology.lastInboundAt,
91
+ lastOutboundAt: chronology.lastOutboundAt,
92
+ unansweredInboundCount: chronology.unansweredInboundCount,
93
+ };
94
+ }
95
+ }
96
+ return {
97
+ lastActivityMs: mtimeMs,
98
+ lastActivityAt: new Date(mtimeMs).toISOString(),
99
+ activitySource: "mtime-fallback",
100
+ lastInboundAt: chronology?.lastInboundAt ?? null,
101
+ lastOutboundAt: chronology?.lastOutboundAt ?? null,
102
+ unansweredInboundCount: chronology?.unansweredInboundCount ?? 0,
103
+ };
104
+ }
105
+ function listSessionActivity(query) {
106
+ const { sessionsDir, friendsDir, agentName, activeThresholdMs = DEFAULT_ACTIVE_THRESHOLD_MS, nowMs = Date.now(), currentSession = null, } = query;
107
+ (0, runtime_1.emitNervesEvent)({
108
+ component: "daemon",
109
+ event: "daemon.session_activity_scan",
110
+ message: "scanning session activity",
111
+ meta: {
112
+ sessionsDir,
113
+ currentSession: currentSession ? `${currentSession.friendId}/${currentSession.channel}/${currentSession.key}` : null,
114
+ },
115
+ });
116
+ if (!fs.existsSync(sessionsDir))
117
+ return [];
118
+ const results = [];
119
+ let friendDirs;
120
+ try {
121
+ friendDirs = fs.readdirSync(sessionsDir);
122
+ }
123
+ catch {
124
+ return [];
125
+ }
126
+ for (const friendId of friendDirs) {
127
+ const friendPath = path.join(sessionsDir, friendId);
128
+ let channels;
129
+ try {
130
+ channels = fs.readdirSync(friendPath);
131
+ }
132
+ catch {
133
+ continue;
134
+ }
135
+ for (const channel of channels) {
136
+ const channelPath = path.join(friendPath, channel);
137
+ let keys;
138
+ try {
139
+ keys = fs.readdirSync(channelPath);
140
+ }
141
+ catch {
142
+ continue;
143
+ }
144
+ for (const keyFile of keys) {
145
+ if (!keyFile.endsWith(".json"))
146
+ continue;
147
+ const key = keyFile.replace(/\.json$/, "");
148
+ // Compare with sanitizeKey on both sides — session keys from the filesystem
149
+ // are already sanitized (colons → underscores), but the canonical key from
150
+ // the pipeline may still have colons (e.g. "chat:any" vs "chat_any").
151
+ if (currentSession && friendId === currentSession.friendId && channel === currentSession.channel && (0, config_1.sanitizeKey)(key) === (0, config_1.sanitizeKey)(currentSession.key)) {
152
+ continue;
153
+ }
154
+ const sessionPath = path.join(channelPath, keyFile);
155
+ const activity = parseFriendActivity(sessionPath);
156
+ if (!activity)
157
+ continue;
158
+ if (nowMs - activity.lastActivityMs > activeThresholdMs)
159
+ continue;
160
+ results.push({
161
+ friendId,
162
+ friendName: resolveFriendName(friendId, friendsDir, agentName),
163
+ channel,
164
+ key,
165
+ sessionPath,
166
+ lastActivityAt: activity.lastActivityAt,
167
+ lastActivityMs: activity.lastActivityMs,
168
+ activitySource: activity.activitySource,
169
+ lastInboundAt: activity.lastInboundAt,
170
+ lastOutboundAt: activity.lastOutboundAt,
171
+ unansweredInboundCount: activity.unansweredInboundCount,
172
+ });
173
+ }
174
+ }
175
+ }
176
+ return results.sort((a, b) => {
177
+ const sourceDiff = activityPriority(a.activitySource) - activityPriority(b.activitySource);
178
+ if (sourceDiff !== 0)
179
+ return sourceDiff;
180
+ return b.lastActivityMs - a.lastActivityMs;
181
+ });
182
+ }
183
+ function findFreshestFriendSession(query) {
184
+ const { activeOnly = false, activeThresholdMs = DEFAULT_ACTIVE_THRESHOLD_MS, nowMs, ...rest } = query;
185
+ const currentSession = rest.currentSession ?? null;
186
+ const all = activeOnly
187
+ ? listSessionActivity({ ...rest, activeThresholdMs, nowMs, currentSession })
188
+ : listSessionActivity({ ...rest, activeThresholdMs: Number.MAX_SAFE_INTEGER, nowMs, currentSession });
189
+ return all.find((entry) => entry.friendId === query.friendId) ?? null;
190
+ }