@ouro.bot/cli 0.1.0-alpha.42 → 0.1.0-alpha.420

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 (334) hide show
  1. package/README.md +118 -15
  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 +2627 -9
  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 +424 -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 +110 -128
  35. package/dist/heart/core.js +801 -217
  36. package/dist/heart/cross-chat-delivery.js +131 -0
  37. package/dist/heart/daemon/agent-config-check.js +419 -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 +214 -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 +605 -0
  44. package/dist/heart/daemon/cli-exec.js +4140 -0
  45. package/dist/heart/daemon/cli-help.js +413 -0
  46. package/dist/heart/daemon/cli-parse.js +1151 -0
  47. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  48. package/dist/heart/daemon/cli-render.js +561 -0
  49. package/dist/heart/daemon/cli-types.js +8 -0
  50. package/dist/heart/daemon/daemon-cli.js +28 -1582
  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 +171 -12
  54. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  55. package/dist/heart/daemon/daemon.js +684 -58
  56. package/dist/heart/daemon/doctor-types.js +8 -0
  57. package/dist/heart/daemon/doctor.js +427 -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 +307 -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 +2 -2
  68. package/dist/heart/daemon/os-cron-deps.js +134 -0
  69. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  70. package/dist/heart/daemon/ouro-entry.js +3 -1
  71. package/dist/heart/daemon/process-manager.js +214 -0
  72. package/dist/heart/daemon/provider-discovery.js +137 -0
  73. package/dist/heart/daemon/pulse.js +475 -0
  74. package/dist/heart/daemon/readiness-repair.js +250 -0
  75. package/dist/heart/daemon/run-hooks.js +2 -0
  76. package/dist/heart/daemon/runtime-logging.js +67 -16
  77. package/dist/heart/daemon/runtime-metadata.js +73 -0
  78. package/dist/heart/daemon/runtime-mode.js +67 -0
  79. package/dist/heart/daemon/safe-mode.js +161 -0
  80. package/dist/heart/daemon/sense-manager.js +145 -32
  81. package/dist/heart/daemon/session-id-resolver.js +131 -0
  82. package/dist/heart/daemon/skill-management-installer.js +94 -0
  83. package/dist/heart/daemon/socket-client.js +307 -0
  84. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  85. package/dist/heart/daemon/startup-tui.js +259 -0
  86. package/dist/heart/daemon/task-scheduler.js +3 -25
  87. package/dist/heart/daemon/thoughts.js +510 -0
  88. package/dist/heart/daemon/up-progress.js +218 -0
  89. package/dist/heart/delegation.js +62 -0
  90. package/dist/heart/habits/habit-migration.js +181 -0
  91. package/dist/heart/habits/habit-parser.js +140 -0
  92. package/dist/heart/habits/habit-scheduler.js +371 -0
  93. package/dist/heart/{daemon → hatch}/hatch-flow.js +53 -117
  94. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  95. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  96. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  97. package/dist/heart/identity.js +161 -65
  98. package/dist/heart/kept-notes.js +357 -0
  99. package/dist/heart/kicks.js +1 -1
  100. package/dist/heart/machine-identity.js +161 -0
  101. package/dist/heart/mcp/mcp-server.js +653 -0
  102. package/dist/heart/migrate-config.js +100 -0
  103. package/dist/heart/model-capabilities.js +59 -0
  104. package/dist/heart/outlook/outlook-http-hooks.js +64 -0
  105. package/dist/heart/outlook/outlook-http-response.js +7 -0
  106. package/dist/heart/outlook/outlook-http-routes.js +232 -0
  107. package/dist/heart/outlook/outlook-http-static.js +99 -0
  108. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  109. package/dist/heart/outlook/outlook-http.js +99 -0
  110. package/dist/heart/outlook/outlook-read.js +28 -0
  111. package/dist/heart/outlook/outlook-types.js +27 -0
  112. package/dist/heart/outlook/outlook-view.js +195 -0
  113. package/dist/heart/outlook/readers/agent-machine.js +359 -0
  114. package/dist/heart/outlook/readers/continuity-readers.js +332 -0
  115. package/dist/heart/outlook/readers/runtime-readers.js +660 -0
  116. package/dist/heart/outlook/readers/sessions.js +232 -0
  117. package/dist/heart/outlook/readers/shared.js +111 -0
  118. package/dist/heart/platform.js +81 -0
  119. package/dist/heart/progress-story.js +42 -0
  120. package/dist/heart/provider-attempt.js +133 -0
  121. package/dist/heart/provider-binding-resolver.js +239 -0
  122. package/dist/heart/provider-credentials.js +389 -0
  123. package/dist/heart/provider-failover.js +266 -0
  124. package/dist/heart/provider-models.js +81 -0
  125. package/dist/heart/provider-ping.js +237 -0
  126. package/dist/heart/provider-state.js +216 -0
  127. package/dist/heart/provider-visibility.js +186 -0
  128. package/dist/heart/providers/anthropic-token.js +131 -0
  129. package/dist/heart/providers/anthropic.js +193 -55
  130. package/dist/heart/providers/azure.js +103 -12
  131. package/dist/heart/providers/error-classification.js +63 -0
  132. package/dist/heart/providers/github-copilot.js +145 -0
  133. package/dist/heart/providers/minimax-vlm.js +189 -0
  134. package/dist/heart/providers/minimax.js +29 -7
  135. package/dist/heart/providers/openai-codex.js +62 -38
  136. package/dist/heart/runtime-credentials.js +260 -0
  137. package/dist/heart/sense-truth.js +3 -0
  138. package/dist/heart/session-activity.js +190 -0
  139. package/dist/heart/session-events.js +855 -0
  140. package/dist/heart/session-transcript.js +167 -0
  141. package/dist/heart/start-of-turn-packet.js +345 -0
  142. package/dist/heart/streaming.js +36 -27
  143. package/dist/heart/sync.js +332 -0
  144. package/dist/heart/target-resolution.js +127 -0
  145. package/dist/heart/tempo.js +93 -0
  146. package/dist/heart/temporal-view.js +41 -0
  147. package/dist/heart/tool-activity-callbacks.js +36 -0
  148. package/dist/heart/tool-description.js +135 -0
  149. package/dist/heart/tool-friction.js +55 -0
  150. package/dist/heart/tool-loop.js +200 -0
  151. package/dist/heart/turn-context.js +351 -0
  152. package/dist/heart/turn-coordinator.js +28 -0
  153. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  154. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  155. package/dist/heart/versioning/ouro-path-installer.js +301 -0
  156. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  157. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  158. package/dist/heart/{daemon → versioning}/update-checker.js +3 -1
  159. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  160. package/dist/mind/bundle-manifest.js +7 -1
  161. package/dist/mind/context.js +134 -87
  162. package/dist/mind/diary-integrity.js +60 -0
  163. package/dist/mind/{memory.js → diary.js} +74 -93
  164. package/dist/mind/embedding-provider.js +60 -0
  165. package/dist/mind/file-state.js +179 -0
  166. package/dist/mind/first-impressions.js +14 -1
  167. package/dist/mind/friends/channel.js +21 -0
  168. package/dist/mind/friends/group-context.js +144 -0
  169. package/dist/mind/friends/resolver.js +38 -1
  170. package/dist/mind/friends/store-file.js +39 -3
  171. package/dist/mind/friends/trust-explanation.js +74 -0
  172. package/dist/mind/friends/types.js +1 -1
  173. package/dist/mind/journal-index.js +161 -0
  174. package/dist/mind/note-search.js +268 -0
  175. package/dist/mind/obligation-steering.js +221 -0
  176. package/dist/mind/pending.js +66 -7
  177. package/dist/mind/prompt-refresh.js +3 -2
  178. package/dist/mind/prompt.js +948 -168
  179. package/dist/mind/provenance-trust.js +26 -0
  180. package/dist/mind/scrutiny.js +173 -0
  181. package/dist/nerves/cli-logging.js +7 -1
  182. package/dist/nerves/coverage/audit-rules.js +15 -6
  183. package/dist/nerves/coverage/audit.js +28 -2
  184. package/dist/nerves/coverage/cli.js +1 -1
  185. package/dist/nerves/coverage/contract.js +5 -5
  186. package/dist/nerves/coverage/file-completeness.js +83 -5
  187. package/dist/nerves/coverage/run-artifacts.js +1 -1
  188. package/dist/nerves/event-buffer.js +111 -0
  189. package/dist/nerves/index.js +224 -4
  190. package/dist/nerves/observation.js +20 -0
  191. package/dist/nerves/redact.js +79 -0
  192. package/dist/nerves/runtime.js +5 -1
  193. package/dist/outlook-ui/assets/index-BAcU08c-.css +1 -0
  194. package/dist/outlook-ui/assets/index-D7l3l4vY.js +61 -0
  195. package/dist/outlook-ui/index.html +15 -0
  196. package/dist/repertoire/ado-client.js +15 -56
  197. package/dist/repertoire/ado-semantic.js +11 -10
  198. package/dist/repertoire/api-client.js +97 -0
  199. package/dist/repertoire/bitwarden-store.js +702 -0
  200. package/dist/repertoire/bundle-templates.js +72 -0
  201. package/dist/repertoire/bw-installer.js +79 -0
  202. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  203. package/dist/repertoire/coding/context-pack.js +330 -0
  204. package/dist/repertoire/coding/feedback.js +197 -30
  205. package/dist/repertoire/coding/manager.js +158 -9
  206. package/dist/repertoire/coding/spawner.js +55 -9
  207. package/dist/repertoire/coding/tools.js +170 -7
  208. package/dist/repertoire/commerce-errors.js +109 -0
  209. package/dist/repertoire/commerce-self-test.js +156 -0
  210. package/dist/repertoire/credential-access.js +111 -0
  211. package/dist/repertoire/duffel-client.js +185 -0
  212. package/dist/repertoire/github-client.js +14 -55
  213. package/dist/repertoire/graph-client.js +11 -52
  214. package/dist/repertoire/guardrails.js +371 -0
  215. package/dist/repertoire/mcp-client.js +255 -0
  216. package/dist/repertoire/mcp-manager.js +305 -0
  217. package/dist/repertoire/mcp-tools.js +63 -0
  218. package/dist/repertoire/shell-sessions.js +133 -0
  219. package/dist/repertoire/skills.js +15 -24
  220. package/dist/repertoire/stripe-client.js +131 -0
  221. package/dist/repertoire/tasks/board.js +43 -5
  222. package/dist/repertoire/tasks/fix.js +182 -0
  223. package/dist/repertoire/tasks/index.js +26 -1
  224. package/dist/repertoire/tasks/lifecycle.js +2 -2
  225. package/dist/repertoire/tasks/parser.js +3 -2
  226. package/dist/repertoire/tasks/scanner.js +194 -37
  227. package/dist/repertoire/tasks/transitions.js +16 -78
  228. package/dist/repertoire/tool-results.js +29 -0
  229. package/dist/repertoire/tools-attachments.js +317 -0
  230. package/dist/repertoire/tools-base.js +42 -687
  231. package/dist/repertoire/tools-bluebubbles.js +1 -0
  232. package/dist/repertoire/tools-bridge.js +141 -0
  233. package/dist/repertoire/tools-bundle.js +984 -0
  234. package/dist/repertoire/tools-config.js +185 -0
  235. package/dist/repertoire/tools-continuity.js +248 -0
  236. package/dist/repertoire/tools-credential.js +361 -0
  237. package/dist/repertoire/tools-files.js +342 -0
  238. package/dist/repertoire/tools-flight.js +224 -0
  239. package/dist/repertoire/tools-flow.js +105 -0
  240. package/dist/repertoire/tools-github.js +1 -7
  241. package/dist/repertoire/tools-notes.js +376 -0
  242. package/dist/repertoire/tools-session.js +739 -0
  243. package/dist/repertoire/tools-shell.js +120 -0
  244. package/dist/repertoire/tools-stripe.js +180 -0
  245. package/dist/repertoire/tools-surface.js +243 -0
  246. package/dist/repertoire/tools-teams.js +9 -39
  247. package/dist/repertoire/tools-travel.js +125 -0
  248. package/dist/repertoire/tools-user-profile.js +144 -0
  249. package/dist/repertoire/tools-vault.js +40 -0
  250. package/dist/repertoire/tools.js +144 -113
  251. package/dist/repertoire/travel-api-client.js +360 -0
  252. package/dist/repertoire/user-profile.js +131 -0
  253. package/dist/repertoire/vault-setup.js +246 -0
  254. package/dist/repertoire/vault-unlock.js +421 -0
  255. package/dist/scripts/claude-code-hook.js +41 -0
  256. package/dist/scripts/claude-code-stop-hook.js +47 -0
  257. package/dist/senses/attention-queue.js +116 -0
  258. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  259. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  260. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +260 -9
  261. package/dist/senses/bluebubbles/entry.js +73 -0
  262. package/dist/senses/bluebubbles/inbound-log.js +113 -0
  263. package/dist/senses/bluebubbles/index.js +1620 -0
  264. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  265. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  266. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +45 -3
  267. package/dist/senses/bluebubbles/replay.js +129 -0
  268. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  269. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  270. package/dist/senses/cli/bracketed-paste.js +82 -0
  271. package/dist/senses/cli/image-paste.js +287 -0
  272. package/dist/senses/cli/image-ref-navigation.js +75 -0
  273. package/dist/senses/cli/ink-app.js +156 -0
  274. package/dist/senses/cli/inline-diff.js +64 -0
  275. package/dist/senses/cli/input-keys.js +174 -0
  276. package/dist/senses/cli/kill-ring.js +86 -0
  277. package/dist/senses/cli/message-list.js +51 -0
  278. package/dist/senses/cli/ouro-tui.js +605 -0
  279. package/dist/senses/cli/spinner-imperative.js +135 -0
  280. package/dist/senses/cli/spinner.js +101 -0
  281. package/dist/senses/cli/status-line.js +60 -0
  282. package/dist/senses/cli/streaming-markdown.js +526 -0
  283. package/dist/senses/cli/tool-display.js +83 -0
  284. package/dist/senses/cli/tool-render.js +85 -0
  285. package/dist/senses/cli/tui-store.js +240 -0
  286. package/dist/senses/cli/virtual-list.js +35 -0
  287. package/dist/senses/cli-entry.js +60 -8
  288. package/dist/senses/cli-layout.js +187 -0
  289. package/dist/senses/cli.js +526 -211
  290. package/dist/senses/commands.js +66 -3
  291. package/dist/senses/continuity.js +94 -0
  292. package/dist/senses/habit-turn-message.js +108 -0
  293. package/dist/senses/inner-dialog-worker.js +112 -19
  294. package/dist/senses/inner-dialog.js +596 -94
  295. package/dist/senses/pipeline.js +539 -61
  296. package/dist/senses/proactive-content-guard.js +51 -0
  297. package/dist/senses/shared-turn.js +205 -0
  298. package/dist/senses/surface-tool.js +68 -0
  299. package/dist/senses/teams-entry.js +60 -8
  300. package/dist/senses/teams.js +569 -237
  301. package/dist/senses/trust-gate.js +5 -5
  302. package/package.json +29 -7
  303. package/skills/agent-commerce.md +106 -0
  304. package/skills/browser-navigation.md +117 -0
  305. package/skills/commerce-setup-guide.md +116 -0
  306. package/skills/commerce-setup.md +84 -0
  307. package/skills/configure-dev-tools.md +101 -0
  308. package/skills/travel-planning.md +138 -0
  309. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  310. package/dist/heart/daemon/subagent-installer.js +0 -134
  311. package/dist/mind/associative-recall.js +0 -209
  312. package/dist/senses/bluebubbles-entry.js +0 -11
  313. package/dist/senses/bluebubbles.js +0 -832
  314. package/dist/senses/debug-activity.js +0 -127
  315. package/subagents/README.md +0 -60
  316. package/subagents/work-doer.md +0 -235
  317. package/subagents/work-merger.md +0 -618
  318. package/subagents/work-planner.md +0 -382
  319. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  320. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  321. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  322. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  323. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  324. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  325. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  326. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  327. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  328. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  329. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  330. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  331. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  332. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  333. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  334. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,260 @@
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.MACHINE_RUNTIME_CONFIG_ITEM_PREFIX = exports.RUNTIME_CONFIG_ITEM_NAME = void 0;
37
+ exports.machineRuntimeConfigItemName = machineRuntimeConfigItemName;
38
+ exports.readRuntimeCredentialConfig = readRuntimeCredentialConfig;
39
+ exports.readMachineRuntimeCredentialConfig = readMachineRuntimeCredentialConfig;
40
+ exports.cacheRuntimeCredentialConfig = cacheRuntimeCredentialConfig;
41
+ exports.cacheMachineRuntimeCredentialConfig = cacheMachineRuntimeCredentialConfig;
42
+ exports.refreshRuntimeCredentialConfig = refreshRuntimeCredentialConfig;
43
+ exports.refreshMachineRuntimeCredentialConfig = refreshMachineRuntimeCredentialConfig;
44
+ exports.upsertRuntimeCredentialConfig = upsertRuntimeCredentialConfig;
45
+ exports.upsertMachineRuntimeCredentialConfig = upsertMachineRuntimeCredentialConfig;
46
+ exports.resetRuntimeCredentialConfigCache = resetRuntimeCredentialConfigCache;
47
+ const crypto = __importStar(require("node:crypto"));
48
+ const runtime_1 = require("../nerves/runtime");
49
+ const credential_access_1 = require("../repertoire/credential-access");
50
+ const identity_1 = require("./identity");
51
+ exports.RUNTIME_CONFIG_ITEM_NAME = "runtime/config";
52
+ exports.MACHINE_RUNTIME_CONFIG_ITEM_PREFIX = "runtime/machines";
53
+ let cachedRuntimeConfigs = new Map();
54
+ let cachedMachineRuntimeConfigs = new Map();
55
+ function isRecord(value) {
56
+ return !!value && typeof value === "object" && !Array.isArray(value);
57
+ }
58
+ function stableJson(value) {
59
+ if (Array.isArray(value))
60
+ return `[${value.map(stableJson).join(",")}]`;
61
+ if (isRecord(value)) {
62
+ return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${stableJson(value[key])}`).join(",")}}`;
63
+ }
64
+ return JSON.stringify(value);
65
+ }
66
+ function runtimeConfigVaultPath(agentName, itemName = exports.RUNTIME_CONFIG_ITEM_NAME) {
67
+ return `vault:${agentName}:${itemName}`;
68
+ }
69
+ function machineRuntimeConfigItemName(machineId) {
70
+ const normalized = machineId.trim();
71
+ if (!normalized)
72
+ throw new Error("machineId must be non-empty");
73
+ return `${exports.MACHINE_RUNTIME_CONFIG_ITEM_PREFIX}/${normalized}/config`;
74
+ }
75
+ function runtimeConfigRevision(payload) {
76
+ return `runtime_${crypto
77
+ .createHash("sha256")
78
+ .update(stableJson(payload))
79
+ .digest("hex")
80
+ .slice(0, 16)}`;
81
+ }
82
+ function validateRuntimeCredentialPayload(value) {
83
+ if (!isRecord(value))
84
+ throw new Error("runtime credential payload must be an object");
85
+ if (value.schemaVersion !== 1)
86
+ throw new Error("runtime credential payload schemaVersion must be 1");
87
+ if (value.kind !== "runtime-config")
88
+ throw new Error("runtime credential payload kind must be runtime-config");
89
+ if (typeof value.updatedAt !== "string" || value.updatedAt.trim().length === 0) {
90
+ throw new Error("runtime credential payload updatedAt must be non-empty");
91
+ }
92
+ if (!isRecord(value.config))
93
+ throw new Error("runtime credential payload config must be an object");
94
+ return value;
95
+ }
96
+ function resultFromPayload(agentName, payload) {
97
+ return {
98
+ ok: true,
99
+ itemPath: runtimeConfigVaultPath(agentName),
100
+ config: { ...payload.config },
101
+ revision: runtimeConfigRevision(payload),
102
+ updatedAt: payload.updatedAt,
103
+ };
104
+ }
105
+ function resultFromPayloadForItem(agentName, itemName, payload) {
106
+ return {
107
+ ok: true,
108
+ itemPath: runtimeConfigVaultPath(agentName, itemName),
109
+ config: { ...payload.config },
110
+ revision: runtimeConfigRevision(payload),
111
+ updatedAt: payload.updatedAt,
112
+ };
113
+ }
114
+ function missingRuntimeConfig(agentName, itemName = exports.RUNTIME_CONFIG_ITEM_NAME) {
115
+ return {
116
+ ok: false,
117
+ reason: "missing",
118
+ itemPath: runtimeConfigVaultPath(agentName, itemName),
119
+ error: `no runtime credentials stored at ${runtimeConfigVaultPath(agentName, itemName)}`,
120
+ };
121
+ }
122
+ function cacheResult(agentName, result) {
123
+ cachedRuntimeConfigs.set(agentName, result);
124
+ return result;
125
+ }
126
+ function cacheMachineResult(agentName, result) {
127
+ cachedMachineRuntimeConfigs.set(agentName, result);
128
+ return result;
129
+ }
130
+ function missingMachineRuntimeConfig(agentName) {
131
+ return {
132
+ ok: false,
133
+ reason: "missing",
134
+ itemPath: `vault:${agentName}:${exports.MACHINE_RUNTIME_CONFIG_ITEM_PREFIX}/<this-machine>/config`,
135
+ error: `no machine runtime credentials loaded for ${agentName}`,
136
+ };
137
+ }
138
+ function readRuntimeCredentialConfig(agentName = (0, identity_1.getAgentName)()) {
139
+ return cachedRuntimeConfigs.get(agentName) ?? missingRuntimeConfig(agentName);
140
+ }
141
+ function readMachineRuntimeCredentialConfig(agentName = (0, identity_1.getAgentName)()) {
142
+ return cachedMachineRuntimeConfigs.get(agentName) ?? missingMachineRuntimeConfig(agentName);
143
+ }
144
+ function cacheRuntimeCredentialConfig(agentName, config, now = new Date()) {
145
+ const payload = {
146
+ schemaVersion: 1,
147
+ kind: "runtime-config",
148
+ updatedAt: now.toISOString(),
149
+ config: { ...config },
150
+ };
151
+ return cacheResult(agentName, resultFromPayload(agentName, payload));
152
+ }
153
+ function cacheMachineRuntimeCredentialConfig(agentName, config, now = new Date(), machineId = "<this-machine>") {
154
+ const payload = {
155
+ schemaVersion: 1,
156
+ kind: "runtime-config",
157
+ updatedAt: now.toISOString(),
158
+ config: { ...config },
159
+ };
160
+ return cacheMachineResult(agentName, resultFromPayloadForItem(agentName, machineRuntimeConfigItemName(machineId), payload));
161
+ }
162
+ async function refreshRuntimeCredentialConfigItem(agentName, itemName, cache, options = {}) {
163
+ try {
164
+ const store = (0, credential_access_1.getCredentialStore)(agentName);
165
+ const raw = await store.getRawSecret(itemName, "password");
166
+ const payload = validateRuntimeCredentialPayload(JSON.parse(raw));
167
+ const result = resultFromPayloadForItem(agentName, itemName, payload);
168
+ (0, runtime_1.emitNervesEvent)({
169
+ component: "config/identity",
170
+ event: "config.runtime_credentials_loaded",
171
+ message: "loaded runtime credentials from vault",
172
+ meta: { agentName, itemPath: result.itemPath, revision: result.revision },
173
+ });
174
+ return cache(agentName, result);
175
+ }
176
+ catch (error) {
177
+ const message = error instanceof Error ? error.message : String(error);
178
+ const existing = cache === cacheMachineResult
179
+ ? cachedMachineRuntimeConfigs.get(agentName)
180
+ : cachedRuntimeConfigs.get(agentName);
181
+ const reason = message.includes(`no credential found for domain "${itemName}"`)
182
+ ? "missing"
183
+ : message.includes("runtime credential payload")
184
+ ? "invalid"
185
+ : "unavailable";
186
+ const result = {
187
+ ok: false,
188
+ reason,
189
+ itemPath: runtimeConfigVaultPath(agentName, itemName),
190
+ error: reason === "missing" ? `no runtime credentials stored at ${runtimeConfigVaultPath(agentName, itemName)}` : message,
191
+ };
192
+ (0, runtime_1.emitNervesEvent)({
193
+ level: reason === "missing" ? "warn" : "error",
194
+ component: "config/identity",
195
+ event: "config.runtime_credentials_unavailable",
196
+ message: "runtime credentials unavailable",
197
+ meta: { agentName, reason, itemPath: result.itemPath },
198
+ });
199
+ if (options.preserveCachedOnFailure && existing?.ok)
200
+ return existing;
201
+ return cache(agentName, result);
202
+ }
203
+ }
204
+ async function refreshRuntimeCredentialConfig(agentName, options = {}) {
205
+ return refreshRuntimeCredentialConfigItem(agentName, exports.RUNTIME_CONFIG_ITEM_NAME, cacheResult, options);
206
+ }
207
+ async function refreshMachineRuntimeCredentialConfig(agentName, machineId, options = {}) {
208
+ return refreshRuntimeCredentialConfigItem(agentName, machineRuntimeConfigItemName(machineId), cacheMachineResult, options);
209
+ }
210
+ async function upsertRuntimeCredentialConfig(agentName, config, now = new Date()) {
211
+ const payload = {
212
+ schemaVersion: 1,
213
+ kind: "runtime-config",
214
+ updatedAt: now.toISOString(),
215
+ config: { ...config },
216
+ };
217
+ const store = (0, credential_access_1.getCredentialStore)(agentName);
218
+ await store.store(exports.RUNTIME_CONFIG_ITEM_NAME, {
219
+ username: "runtime/config",
220
+ password: JSON.stringify(payload),
221
+ notes: "Ouro runtime credentials for senses and integrations. Provider credentials live in providers/* items.",
222
+ });
223
+ const result = resultFromPayload(agentName, payload);
224
+ (0, runtime_1.emitNervesEvent)({
225
+ component: "config/identity",
226
+ event: "config.runtime_credentials_upserted",
227
+ message: "upserted runtime credential config in vault",
228
+ meta: { agentName, itemPath: result.itemPath, revision: result.revision },
229
+ });
230
+ cacheResult(agentName, result);
231
+ return result;
232
+ }
233
+ async function upsertMachineRuntimeCredentialConfig(agentName, machineId, config, now = new Date()) {
234
+ const payload = {
235
+ schemaVersion: 1,
236
+ kind: "runtime-config",
237
+ updatedAt: now.toISOString(),
238
+ config: { ...config },
239
+ };
240
+ const itemName = machineRuntimeConfigItemName(machineId);
241
+ const store = (0, credential_access_1.getCredentialStore)(agentName);
242
+ await store.store(itemName, {
243
+ username: itemName,
244
+ password: JSON.stringify(payload),
245
+ notes: "Ouro machine-local runtime credentials for senses attached to one machine. Portable runtime credentials live in runtime/config.",
246
+ });
247
+ const result = resultFromPayloadForItem(agentName, itemName, payload);
248
+ (0, runtime_1.emitNervesEvent)({
249
+ component: "config/identity",
250
+ event: "config.runtime_credentials_upserted",
251
+ message: "upserted machine runtime credential config in vault",
252
+ meta: { agentName, itemPath: result.itemPath, revision: result.revision },
253
+ });
254
+ cacheMachineResult(agentName, result);
255
+ return result;
256
+ }
257
+ function resetRuntimeCredentialConfigCache() {
258
+ cachedRuntimeConfigs = new Map();
259
+ cachedMachineRuntimeConfigs = new Map();
260
+ }
@@ -28,6 +28,9 @@ function resolveStatus(enabled, daemonManaged, runtimeInfo) {
28
28
  if (runtimeInfo?.runtime === "running") {
29
29
  return "running";
30
30
  }
31
+ if (runtimeInfo?.configured === false && runtimeInfo.optional) {
32
+ return "not_attached";
33
+ }
31
34
  if (runtimeInfo?.configured === false) {
32
35
  return "needs_config";
33
36
  }
@@ -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
+ }