@ouro.bot/cli 0.1.0-alpha.39 → 0.1.0-alpha.391

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 (332) 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 +2377 -4
  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 +384 -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 +599 -0
  44. package/dist/heart/daemon/cli-exec.js +3384 -0
  45. package/dist/heart/daemon/cli-help.js +385 -0
  46. package/dist/heart/daemon/cli-parse.js +1097 -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 +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 +157 -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 +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 +4 -2
  70. package/dist/heart/daemon/ouro-entry.js +3 -1
  71. package/dist/heart/daemon/process-manager.js +201 -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/run-hooks.js +2 -0
  75. package/dist/heart/daemon/runtime-logging.js +67 -16
  76. package/dist/heart/daemon/runtime-metadata.js +73 -0
  77. package/dist/heart/daemon/runtime-mode.js +67 -0
  78. package/dist/heart/daemon/safe-mode.js +161 -0
  79. package/dist/heart/daemon/sense-manager.js +119 -30
  80. package/dist/heart/daemon/session-id-resolver.js +131 -0
  81. package/dist/heart/daemon/skill-management-installer.js +94 -0
  82. package/dist/heart/daemon/socket-client.js +307 -0
  83. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  84. package/dist/heart/daemon/startup-tui.js +237 -0
  85. package/dist/heart/daemon/task-scheduler.js +3 -25
  86. package/dist/heart/daemon/thoughts.js +510 -0
  87. package/dist/heart/daemon/up-progress.js +135 -0
  88. package/dist/heart/delegation.js +62 -0
  89. package/dist/heart/habits/habit-migration.js +181 -0
  90. package/dist/heart/habits/habit-parser.js +140 -0
  91. package/dist/heart/habits/habit-scheduler.js +371 -0
  92. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -126
  93. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  94. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  95. package/dist/heart/{daemon → hatch}/specialist-tools.js +33 -12
  96. package/dist/heart/identity.js +153 -65
  97. package/dist/heart/kept-notes.js +357 -0
  98. package/dist/heart/kicks.js +2 -20
  99. package/dist/heart/machine-identity.js +161 -0
  100. package/dist/heart/mcp/mcp-server.js +653 -0
  101. package/dist/heart/migrate-config.js +100 -0
  102. package/dist/heart/model-capabilities.js +59 -0
  103. package/dist/heart/outlook/outlook-http-hooks.js +64 -0
  104. package/dist/heart/outlook/outlook-http-response.js +7 -0
  105. package/dist/heart/outlook/outlook-http-routes.js +232 -0
  106. package/dist/heart/outlook/outlook-http-static.js +99 -0
  107. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  108. package/dist/heart/outlook/outlook-http.js +99 -0
  109. package/dist/heart/outlook/outlook-read.js +28 -0
  110. package/dist/heart/outlook/outlook-types.js +27 -0
  111. package/dist/heart/outlook/outlook-view.js +195 -0
  112. package/dist/heart/outlook/readers/agent-machine.js +359 -0
  113. package/dist/heart/outlook/readers/continuity-readers.js +332 -0
  114. package/dist/heart/outlook/readers/runtime-readers.js +660 -0
  115. package/dist/heart/outlook/readers/sessions.js +232 -0
  116. package/dist/heart/outlook/readers/shared.js +111 -0
  117. package/dist/heart/platform.js +81 -0
  118. package/dist/heart/progress-story.js +42 -0
  119. package/dist/heart/provider-attempt.js +133 -0
  120. package/dist/heart/provider-binding-resolver.js +239 -0
  121. package/dist/heart/provider-credentials.js +379 -0
  122. package/dist/heart/provider-failover.js +266 -0
  123. package/dist/heart/provider-models.js +81 -0
  124. package/dist/heart/provider-ping.js +237 -0
  125. package/dist/heart/provider-state.js +216 -0
  126. package/dist/heart/provider-visibility.js +186 -0
  127. package/dist/heart/providers/anthropic-token.js +131 -0
  128. package/dist/heart/providers/anthropic.js +193 -55
  129. package/dist/heart/providers/azure.js +103 -12
  130. package/dist/heart/providers/error-classification.js +63 -0
  131. package/dist/heart/providers/github-copilot.js +145 -0
  132. package/dist/heart/providers/minimax-vlm.js +189 -0
  133. package/dist/heart/providers/minimax.js +29 -7
  134. package/dist/heart/providers/openai-codex.js +39 -29
  135. package/dist/heart/runtime-credentials.js +181 -0
  136. package/dist/heart/session-activity.js +190 -0
  137. package/dist/heart/session-events.js +855 -0
  138. package/dist/heart/session-transcript.js +167 -0
  139. package/dist/heart/start-of-turn-packet.js +345 -0
  140. package/dist/heart/streaming.js +36 -27
  141. package/dist/heart/sync.js +332 -0
  142. package/dist/heart/target-resolution.js +127 -0
  143. package/dist/heart/tempo.js +93 -0
  144. package/dist/heart/temporal-view.js +41 -0
  145. package/dist/heart/tool-activity-callbacks.js +36 -0
  146. package/dist/heart/tool-description.js +135 -0
  147. package/dist/heart/tool-friction.js +55 -0
  148. package/dist/heart/tool-loop.js +200 -0
  149. package/dist/heart/turn-context.js +351 -0
  150. package/dist/heart/turn-coordinator.js +28 -0
  151. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  152. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  153. package/dist/heart/versioning/ouro-path-installer.js +301 -0
  154. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  155. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  156. package/dist/heart/{daemon → versioning}/update-checker.js +12 -2
  157. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  158. package/dist/mind/bundle-manifest.js +7 -1
  159. package/dist/mind/context.js +141 -94
  160. package/dist/mind/diary-integrity.js +60 -0
  161. package/dist/mind/{memory.js → diary.js} +84 -96
  162. package/dist/mind/embedding-provider.js +60 -0
  163. package/dist/mind/file-state.js +179 -0
  164. package/dist/mind/first-impressions.js +14 -1
  165. package/dist/mind/friends/channel.js +21 -0
  166. package/dist/mind/friends/group-context.js +144 -0
  167. package/dist/mind/friends/resolver.js +38 -1
  168. package/dist/mind/friends/store-file.js +39 -3
  169. package/dist/mind/friends/trust-explanation.js +74 -0
  170. package/dist/mind/friends/types.js +1 -1
  171. package/dist/mind/journal-index.js +161 -0
  172. package/dist/mind/note-search.js +268 -0
  173. package/dist/mind/obligation-steering.js +221 -0
  174. package/dist/mind/pending.js +66 -7
  175. package/dist/mind/prompt-refresh.js +3 -2
  176. package/dist/mind/prompt.js +946 -167
  177. package/dist/mind/provenance-trust.js +26 -0
  178. package/dist/mind/scrutiny.js +173 -0
  179. package/dist/mind/token-estimate.js +8 -12
  180. package/dist/nerves/cli-logging.js +7 -1
  181. package/dist/nerves/coverage/audit-rules.js +15 -6
  182. package/dist/nerves/coverage/audit.js +28 -2
  183. package/dist/nerves/coverage/cli.js +1 -1
  184. package/dist/nerves/coverage/file-completeness.js +83 -5
  185. package/dist/nerves/coverage/run-artifacts.js +1 -1
  186. package/dist/nerves/event-buffer.js +111 -0
  187. package/dist/nerves/index.js +224 -4
  188. package/dist/nerves/observation.js +20 -0
  189. package/dist/nerves/redact.js +79 -0
  190. package/dist/nerves/runtime.js +5 -1
  191. package/dist/outlook-ui/assets/index-BAcU08c-.css +1 -0
  192. package/dist/outlook-ui/assets/index-D7l3l4vY.js +61 -0
  193. package/dist/outlook-ui/index.html +15 -0
  194. package/dist/repertoire/ado-client.js +15 -56
  195. package/dist/repertoire/ado-semantic.js +11 -10
  196. package/dist/repertoire/api-client.js +97 -0
  197. package/dist/repertoire/bitwarden-store.js +365 -0
  198. package/dist/repertoire/bundle-templates.js +72 -0
  199. package/dist/repertoire/bw-installer.js +79 -0
  200. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  201. package/dist/repertoire/coding/context-pack.js +330 -0
  202. package/dist/repertoire/coding/feedback.js +197 -30
  203. package/dist/repertoire/coding/manager.js +158 -9
  204. package/dist/repertoire/coding/spawner.js +55 -9
  205. package/dist/repertoire/coding/tools.js +170 -7
  206. package/dist/repertoire/commerce-errors.js +109 -0
  207. package/dist/repertoire/commerce-self-test.js +156 -0
  208. package/dist/repertoire/credential-access.js +107 -0
  209. package/dist/repertoire/duffel-client.js +185 -0
  210. package/dist/repertoire/github-client.js +14 -55
  211. package/dist/repertoire/graph-client.js +11 -52
  212. package/dist/repertoire/guardrails.js +371 -0
  213. package/dist/repertoire/mcp-client.js +255 -0
  214. package/dist/repertoire/mcp-manager.js +305 -0
  215. package/dist/repertoire/mcp-tools.js +63 -0
  216. package/dist/repertoire/shell-sessions.js +133 -0
  217. package/dist/repertoire/skills.js +15 -24
  218. package/dist/repertoire/stripe-client.js +131 -0
  219. package/dist/repertoire/tasks/board.js +43 -5
  220. package/dist/repertoire/tasks/fix.js +182 -0
  221. package/dist/repertoire/tasks/index.js +28 -10
  222. package/dist/repertoire/tasks/lifecycle.js +2 -2
  223. package/dist/repertoire/tasks/parser.js +3 -2
  224. package/dist/repertoire/tasks/scanner.js +194 -37
  225. package/dist/repertoire/tasks/transitions.js +16 -79
  226. package/dist/repertoire/tool-results.js +29 -0
  227. package/dist/repertoire/tools-attachments.js +317 -0
  228. package/dist/repertoire/tools-base.js +42 -690
  229. package/dist/repertoire/tools-bluebubbles.js +1 -0
  230. package/dist/repertoire/tools-bridge.js +141 -0
  231. package/dist/repertoire/tools-bundle.js +984 -0
  232. package/dist/repertoire/tools-config.js +185 -0
  233. package/dist/repertoire/tools-continuity.js +248 -0
  234. package/dist/repertoire/tools-credential.js +182 -0
  235. package/dist/repertoire/tools-files.js +342 -0
  236. package/dist/repertoire/tools-flight.js +224 -0
  237. package/dist/repertoire/tools-flow.js +105 -0
  238. package/dist/repertoire/tools-github.js +1 -7
  239. package/dist/repertoire/tools-notes.js +376 -0
  240. package/dist/repertoire/tools-session.js +739 -0
  241. package/dist/repertoire/tools-shell.js +120 -0
  242. package/dist/repertoire/tools-stripe.js +180 -0
  243. package/dist/repertoire/tools-surface.js +243 -0
  244. package/dist/repertoire/tools-teams.js +12 -62
  245. package/dist/repertoire/tools-travel.js +125 -0
  246. package/dist/repertoire/tools-user-profile.js +144 -0
  247. package/dist/repertoire/tools-vault.js +40 -0
  248. package/dist/repertoire/tools.js +144 -115
  249. package/dist/repertoire/travel-api-client.js +360 -0
  250. package/dist/repertoire/user-profile.js +118 -0
  251. package/dist/repertoire/vault-setup.js +246 -0
  252. package/dist/repertoire/vault-unlock.js +366 -0
  253. package/dist/scripts/claude-code-hook.js +41 -0
  254. package/dist/scripts/claude-code-stop-hook.js +47 -0
  255. package/dist/senses/attention-queue.js +116 -0
  256. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  257. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  258. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +260 -9
  259. package/dist/senses/bluebubbles/entry.js +70 -0
  260. package/dist/senses/bluebubbles/inbound-log.js +113 -0
  261. package/dist/senses/bluebubbles/index.js +1620 -0
  262. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  263. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  264. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  265. package/dist/senses/bluebubbles/replay.js +129 -0
  266. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  267. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  268. package/dist/senses/cli/bracketed-paste.js +82 -0
  269. package/dist/senses/cli/image-paste.js +287 -0
  270. package/dist/senses/cli/image-ref-navigation.js +75 -0
  271. package/dist/senses/cli/ink-app.js +156 -0
  272. package/dist/senses/cli/inline-diff.js +64 -0
  273. package/dist/senses/cli/input-keys.js +174 -0
  274. package/dist/senses/cli/kill-ring.js +86 -0
  275. package/dist/senses/cli/message-list.js +51 -0
  276. package/dist/senses/cli/ouro-tui.js +605 -0
  277. package/dist/senses/cli/spinner-imperative.js +135 -0
  278. package/dist/senses/cli/spinner.js +101 -0
  279. package/dist/senses/cli/status-line.js +60 -0
  280. package/dist/senses/cli/streaming-markdown.js +526 -0
  281. package/dist/senses/cli/tool-display.js +83 -0
  282. package/dist/senses/cli/tool-render.js +85 -0
  283. package/dist/senses/cli/tui-store.js +240 -0
  284. package/dist/senses/cli/virtual-list.js +35 -0
  285. package/dist/senses/cli-entry.js +60 -8
  286. package/dist/senses/cli-layout.js +187 -0
  287. package/dist/senses/cli.js +526 -211
  288. package/dist/senses/commands.js +66 -3
  289. package/dist/senses/continuity.js +94 -0
  290. package/dist/senses/habit-turn-message.js +108 -0
  291. package/dist/senses/inner-dialog-worker.js +112 -19
  292. package/dist/senses/inner-dialog.js +600 -95
  293. package/dist/senses/pipeline.js +539 -61
  294. package/dist/senses/proactive-content-guard.js +51 -0
  295. package/dist/senses/shared-turn.js +205 -0
  296. package/dist/senses/surface-tool.js +68 -0
  297. package/dist/senses/teams-entry.js +60 -8
  298. package/dist/senses/teams.js +569 -237
  299. package/dist/senses/trust-gate.js +6 -7
  300. package/package.json +28 -7
  301. package/skills/agent-commerce.md +106 -0
  302. package/skills/browser-navigation.md +110 -0
  303. package/skills/commerce-setup-guide.md +116 -0
  304. package/skills/commerce-setup.md +84 -0
  305. package/skills/configure-dev-tools.md +101 -0
  306. package/skills/travel-planning.md +134 -0
  307. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  308. package/dist/heart/daemon/subagent-installer.js +0 -134
  309. package/dist/mind/associative-recall.js +0 -197
  310. package/dist/senses/bluebubbles-entry.js +0 -11
  311. package/dist/senses/bluebubbles.js +0 -832
  312. package/dist/senses/debug-activity.js +0 -127
  313. package/subagents/README.md +0 -60
  314. package/subagents/work-doer.md +0 -235
  315. package/subagents/work-merger.md +0 -618
  316. package/subagents/work-planner.md +0 -382
  317. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  318. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  319. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  320. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  321. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  322. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  323. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  324. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  325. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  326. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  327. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  328. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  329. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  330. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  331. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  332. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,232 @@
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.readSessionInventory = readSessionInventory;
37
+ exports.readSessionTranscript = readSessionTranscript;
38
+ const path = __importStar(require("path"));
39
+ const runtime_1 = require("../../../nerves/runtime");
40
+ const identity_1 = require("../../identity");
41
+ const session_events_1 = require("../../session-events");
42
+ const shared_1 = require("./shared");
43
+ /* v8 ignore start — session envelope parsing utilities */
44
+ function parseSessionUsage(raw) {
45
+ if (!raw || typeof raw !== "object")
46
+ return null;
47
+ const record = raw;
48
+ const inputTokens = typeof record.input_tokens === "number" ? record.input_tokens : 0;
49
+ const outputTokens = typeof record.output_tokens === "number" ? record.output_tokens : 0;
50
+ const reasoningTokens = typeof record.reasoning_tokens === "number" ? record.reasoning_tokens : 0;
51
+ const totalTokens = typeof record.total_tokens === "number" ? record.total_tokens : 0;
52
+ if (inputTokens === 0 && outputTokens === 0 && totalTokens === 0)
53
+ return null;
54
+ return { input_tokens: inputTokens, output_tokens: outputTokens, reasoning_tokens: reasoningTokens, total_tokens: totalTokens };
55
+ }
56
+ function parseSessionContinuity(raw) {
57
+ if (!raw)
58
+ return null;
59
+ if (typeof raw !== "object")
60
+ return null;
61
+ const record = raw;
62
+ const continuity = {
63
+ mustResolveBeforeHandoff: record.mustResolveBeforeHandoff === true,
64
+ lastFriendActivityAt: typeof record.lastFriendActivityAt === "string" ? record.lastFriendActivityAt : null,
65
+ };
66
+ if (!continuity.mustResolveBeforeHandoff && continuity.lastFriendActivityAt === null)
67
+ return null;
68
+ return continuity;
69
+ }
70
+ function extractContent(event) {
71
+ if (!event)
72
+ return null;
73
+ const text = (0, session_events_1.extractEventText)(event);
74
+ return text.length > 0 ? text : null;
75
+ }
76
+ function extractToolCallNames(event) {
77
+ if (!event)
78
+ return [];
79
+ return event.toolCalls
80
+ .map((call) => call.function.name)
81
+ .filter((name) => typeof name === "string" && name.length > 0);
82
+ }
83
+ /* v8 ignore stop */
84
+ function estimateTokenCount(messages) {
85
+ let charCount = 0;
86
+ for (const msg of messages) {
87
+ const content = extractContent(msg);
88
+ if (content)
89
+ charCount += content.length;
90
+ if (msg.toolCalls.length > 0)
91
+ charCount += JSON.stringify(msg.toolCalls).length;
92
+ }
93
+ return Math.ceil(charCount / 4);
94
+ }
95
+ /* v8 ignore start — filesystem traversal with defensive isDirectory checks */
96
+ function resolveAllSessionPaths(sessionsDir) {
97
+ const results = [];
98
+ if (!(0, shared_1.safeIsDirectory)(sessionsDir))
99
+ return results;
100
+ for (const friendId of (0, shared_1.safeReaddir)(sessionsDir)) {
101
+ const friendDir = path.join(sessionsDir, friendId);
102
+ if (!(0, shared_1.safeIsDirectory)(friendDir))
103
+ continue;
104
+ for (const channel of (0, shared_1.safeReaddir)(friendDir)) {
105
+ const channelDir = path.join(friendDir, channel);
106
+ if (!(0, shared_1.safeIsDirectory)(channelDir))
107
+ continue;
108
+ for (const file of (0, shared_1.safeReaddir)(channelDir)) {
109
+ if (!file.endsWith(".json"))
110
+ continue;
111
+ const key = file.slice(0, -5);
112
+ results.push({
113
+ friendId,
114
+ channel,
115
+ key,
116
+ sessionPath: path.join(channelDir, file),
117
+ });
118
+ }
119
+ }
120
+ }
121
+ return results;
122
+ }
123
+ /* v8 ignore stop */
124
+ /* v8 ignore start — defensive parsing */
125
+ function readSessionInventory(agentName, options = {}) {
126
+ const bundlesRoot = options.bundlesRoot ?? (0, identity_1.getAgentBundlesRoot)();
127
+ const now = options.now?.() ?? new Date();
128
+ const agentRoot = path.join(bundlesRoot, `${agentName}.ouro`);
129
+ const sessionsDir = path.join(agentRoot, "state", "sessions");
130
+ const friendsDir = path.join(agentRoot, "friends");
131
+ const allSessions = resolveAllSessionPaths(sessionsDir);
132
+ const items = [];
133
+ for (const { friendId, channel, key, sessionPath } of allSessions) {
134
+ if (friendId === "self" && channel === "inner")
135
+ continue;
136
+ const envelope = (0, shared_1.readSessionEnvelope)(sessionPath);
137
+ const events = envelope?.events ?? [];
138
+ const chronology = (0, session_events_1.deriveSessionChronology)(events);
139
+ const lastUsage = parseSessionUsage(envelope?.lastUsage);
140
+ const continuity = parseSessionContinuity(envelope?.state);
141
+ const hasObservedEventTiming = events.some((event) => event.time.authoredAt !== null || event.time.observedAt !== null);
142
+ const lastActivityAt = hasObservedEventTiming
143
+ ? (chronology.lastActivityAt ?? continuity?.lastFriendActivityAt ?? (0, shared_1.safeFileMtime)(sessionPath) ?? now.toISOString())
144
+ : (continuity?.lastFriendActivityAt ?? (0, shared_1.safeFileMtime)(sessionPath) ?? now.toISOString());
145
+ const activitySource = hasObservedEventTiming && chronology.lastActivityAt
146
+ ? "event-timeline"
147
+ : continuity?.lastFriendActivityAt
148
+ ? "friend-facing"
149
+ : "mtime-fallback";
150
+ const userMessages = events.filter((m) => m.role === "user");
151
+ const assistantMessages = events.filter((m) => m.role === "assistant");
152
+ const lastUser = userMessages.length > 0 ? userMessages[userMessages.length - 1] : null;
153
+ const lastAssistant = assistantMessages.length > 0 ? assistantMessages[assistantMessages.length - 1] : null;
154
+ const latestToolCallNames = [];
155
+ for (let i = events.length - 1; i >= 0; i--) {
156
+ const names = extractToolCallNames(events[i]);
157
+ if (names.length > 0) {
158
+ latestToolCallNames.push(...names);
159
+ break;
160
+ }
161
+ }
162
+ const friendName = (0, shared_1.resolveFriendName)(friendsDir, friendId);
163
+ const lastMsg = events.length > 0 ? events[events.length - 1] : null;
164
+ const mustResolve = continuity?.mustResolveBeforeHandoff === true;
165
+ let replyState = "idle";
166
+ if (mustResolve) {
167
+ replyState = "on-hold";
168
+ }
169
+ else if (lastMsg?.role === "user") {
170
+ replyState = "needs-reply";
171
+ }
172
+ else if (events.length > 0) {
173
+ replyState = "monitoring";
174
+ }
175
+ items.push({
176
+ friendId,
177
+ friendName,
178
+ channel,
179
+ key,
180
+ sessionPath,
181
+ lastActivityAt,
182
+ activitySource,
183
+ replyState,
184
+ messageCount: events.length,
185
+ lastUsage,
186
+ continuity,
187
+ latestUserExcerpt: (0, shared_1.truncateExcerpt)(extractContent(lastUser)),
188
+ latestAssistantExcerpt: (0, shared_1.truncateExcerpt)(extractContent(lastAssistant)),
189
+ latestToolCallNames,
190
+ estimatedTokens: events.length > 0 ? estimateTokenCount(events) : null,
191
+ });
192
+ }
193
+ items.sort((a, b) => b.lastActivityAt.localeCompare(a.lastActivityAt));
194
+ const ageThreshold = now.getTime() - shared_1.STALE_THRESHOLD_MS;
195
+ const activeCount = items.filter((item) => Date.parse(item.lastActivityAt) >= ageThreshold).length;
196
+ (0, runtime_1.emitNervesEvent)({
197
+ component: "heart",
198
+ event: "heart.outlook_sessions_read",
199
+ message: "reading outlook session inventory",
200
+ meta: { agentName, totalCount: items.length, activeCount },
201
+ });
202
+ return {
203
+ totalCount: items.length,
204
+ activeCount,
205
+ staleCount: items.length - activeCount,
206
+ items,
207
+ };
208
+ }
209
+ function readSessionTranscript(agentName, friendId, channel, key, options = {}) {
210
+ const bundlesRoot = options.bundlesRoot ?? (0, identity_1.getAgentBundlesRoot)();
211
+ const agentRoot = path.join(bundlesRoot, `${agentName}.ouro`);
212
+ const sessionPath = path.join(agentRoot, "state", "sessions", friendId, channel, `${key}.json`);
213
+ const envelope = (0, shared_1.readSessionEnvelope)(sessionPath);
214
+ if (!envelope)
215
+ return null;
216
+ // Use full event history (envelope + archive) for complete transcript
217
+ const rawMessages = (0, session_events_1.loadFullEventHistory)(sessionPath);
218
+ const friendsDir = path.join(agentRoot, "friends");
219
+ const friendName = (0, shared_1.resolveFriendName)(friendsDir, friendId);
220
+ const messages = rawMessages;
221
+ return {
222
+ friendId,
223
+ friendName,
224
+ channel,
225
+ key,
226
+ sessionPath,
227
+ messageCount: messages.length,
228
+ lastUsage: parseSessionUsage(envelope.lastUsage),
229
+ continuity: parseSessionContinuity(envelope.state),
230
+ messages,
231
+ };
232
+ }
@@ -0,0 +1,111 @@
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.STALE_THRESHOLD_MS = exports.BLOCKED_CODING_STATUSES = exports.ACTIVE_CODING_STATUSES = void 0;
37
+ exports.issue = issue;
38
+ exports.safeReaddir = safeReaddir;
39
+ exports.safeIsDirectory = safeIsDirectory;
40
+ exports.resolveFriendName = resolveFriendName;
41
+ exports.safeFileMtime = safeFileMtime;
42
+ exports.truncateExcerpt = truncateExcerpt;
43
+ exports.readSessionEnvelope = readSessionEnvelope;
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const runtime_1 = require("../../../nerves/runtime");
47
+ const session_events_1 = require("../../session-events");
48
+ exports.ACTIVE_CODING_STATUSES = new Set(["spawning", "running", "waiting_input", "stalled"]);
49
+ exports.BLOCKED_CODING_STATUSES = new Set(["waiting_input", "stalled"]);
50
+ exports.STALE_THRESHOLD_MS = 24 * 60 * 60 * 1000;
51
+ function issue(code, detail) {
52
+ return { code, detail };
53
+ }
54
+ function safeReaddir(dir) {
55
+ try {
56
+ return fs.readdirSync(dir);
57
+ }
58
+ catch {
59
+ return [];
60
+ }
61
+ }
62
+ function safeIsDirectory(filePath) {
63
+ try {
64
+ return fs.statSync(filePath).isDirectory();
65
+ /* v8 ignore start */
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ /* v8 ignore stop */
71
+ }
72
+ /* v8 ignore start — defensive friend name resolution */
73
+ function resolveFriendName(friendsDir, friendId) {
74
+ try {
75
+ const raw = fs.readFileSync(path.join(friendsDir, `${friendId}.json`), "utf-8");
76
+ const parsed = JSON.parse(raw);
77
+ return typeof parsed.name === "string" ? parsed.name : friendId;
78
+ }
79
+ catch {
80
+ return friendId;
81
+ }
82
+ }
83
+ /* v8 ignore stop */
84
+ /* v8 ignore start — utility helpers with defensive branches */
85
+ function safeFileMtime(filePath) {
86
+ try {
87
+ return fs.statSync(filePath).mtime.toISOString();
88
+ }
89
+ catch {
90
+ return null;
91
+ }
92
+ }
93
+ function truncateExcerpt(content, maxLength = 200) {
94
+ if (!content)
95
+ return null;
96
+ if (content.length <= maxLength)
97
+ return content;
98
+ const truncated = content.slice(0, maxLength);
99
+ const lastSpace = truncated.lastIndexOf(" ");
100
+ return (lastSpace > maxLength * 0.6 ? truncated.slice(0, lastSpace) : truncated) + "…";
101
+ }
102
+ /* v8 ignore stop */
103
+ function readSessionEnvelope(sessionPath) {
104
+ (0, runtime_1.emitNervesEvent)({
105
+ component: "heart",
106
+ event: "heart.outlook_session_envelope_read",
107
+ message: "reading outlook session envelope",
108
+ meta: { sessionPath },
109
+ });
110
+ return (0, session_events_1.loadSessionEnvelopeFile)(sessionPath);
111
+ }
@@ -0,0 +1,81 @@
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.detectPlatform = detectPlatform;
37
+ const fs = __importStar(require("fs"));
38
+ const runtime_1 = require("../nerves/runtime");
39
+ function detectPlatform(deps = {}) {
40
+ const platform = deps.platform ?? process.platform;
41
+ const env = deps.env ?? process.env;
42
+ const readFile = deps.readFileSync ?? ((p) => fs.readFileSync(p, "utf-8"));
43
+ let result;
44
+ if (platform === "darwin") {
45
+ result = "macos";
46
+ }
47
+ else if (platform === "win32") {
48
+ result = "windows-native";
49
+ }
50
+ else if (platform === "linux") {
51
+ result = detectLinuxOrWsl(env, readFile);
52
+ }
53
+ else {
54
+ // Unknown platform — treat as linux
55
+ result = "linux";
56
+ }
57
+ (0, runtime_1.emitNervesEvent)({
58
+ component: "daemon",
59
+ event: "daemon.platform_detected",
60
+ message: "detected platform",
61
+ meta: { platform, result },
62
+ });
63
+ return result;
64
+ }
65
+ function detectLinuxOrWsl(env, readFile) {
66
+ // Primary: WSL_DISTRO_NAME env var
67
+ if (env.WSL_DISTRO_NAME && env.WSL_DISTRO_NAME.length > 0) {
68
+ return "wsl";
69
+ }
70
+ // Fallback: /proc/version containing "microsoft" (case-insensitive)
71
+ try {
72
+ const procVersion = readFile("/proc/version");
73
+ if (/microsoft/i.test(procVersion)) {
74
+ return "wsl";
75
+ }
76
+ }
77
+ catch {
78
+ // /proc/version not readable — not WSL
79
+ }
80
+ return "linux";
81
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildProgressStory = buildProgressStory;
4
+ exports.renderProgressStory = renderProgressStory;
5
+ const runtime_1 = require("../nerves/runtime");
6
+ function labelForScope(scope) {
7
+ return scope === "inner-delegation" ? "inner work" : "shared work";
8
+ }
9
+ function compactDetail(text) {
10
+ if (typeof text !== "string")
11
+ return null;
12
+ const trimmed = text.trim();
13
+ return trimmed.length > 0 ? trimmed : null;
14
+ }
15
+ function buildProgressStory(input) {
16
+ const detailLines = [
17
+ compactDetail(input.objective),
18
+ compactDetail(input.outcomeText),
19
+ compactDetail(input.bridgeId ? `bridge: ${input.bridgeId}` : null),
20
+ compactDetail(input.taskName ? `task: ${input.taskName}` : null),
21
+ ].filter((line) => Boolean(line));
22
+ const story = {
23
+ statusLine: `${labelForScope(input.scope)}: ${input.phase}`,
24
+ detailLines,
25
+ };
26
+ (0, runtime_1.emitNervesEvent)({
27
+ component: "engine",
28
+ event: "engine.progress_story_build",
29
+ message: "built shared progress story",
30
+ meta: {
31
+ scope: input.scope,
32
+ phase: input.phase,
33
+ detailLines: detailLines.length,
34
+ hasBridge: Boolean(input.bridgeId),
35
+ hasTask: Boolean(input.taskName),
36
+ },
37
+ });
38
+ return story;
39
+ }
40
+ function renderProgressStory(story) {
41
+ return [story.statusLine, ...story.detailLines].join("\n");
42
+ }
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_PROVIDER_ATTEMPT_POLICY = exports.ProviderAttemptAbortError = void 0;
4
+ exports.runProviderAttempt = runProviderAttempt;
5
+ const runtime_1 = require("../nerves/runtime");
6
+ class ProviderAttemptAbortError extends Error {
7
+ constructor(message = "provider attempt aborted") {
8
+ super(message);
9
+ this.name = "ProviderAttemptAbortError";
10
+ }
11
+ }
12
+ exports.ProviderAttemptAbortError = ProviderAttemptAbortError;
13
+ exports.DEFAULT_PROVIDER_ATTEMPT_POLICY = {
14
+ maxAttempts: 3,
15
+ baseDelayMs: 2_000,
16
+ backoffMultiplier: 2,
17
+ };
18
+ function sleep(delayMs) {
19
+ return new Promise((resolve) => setTimeout(resolve, delayMs));
20
+ }
21
+ function normalizePolicy(policy) {
22
+ return {
23
+ ...exports.DEFAULT_PROVIDER_ATTEMPT_POLICY,
24
+ ...policy,
25
+ };
26
+ }
27
+ function toError(error) {
28
+ return error instanceof Error ? error : new Error(String(error));
29
+ }
30
+ function classify(error, classifyError) {
31
+ if (!(error instanceof Error))
32
+ return "unknown";
33
+ try {
34
+ return classifyError(error);
35
+ }
36
+ catch {
37
+ return "unknown";
38
+ }
39
+ }
40
+ function httpStatus(error) {
41
+ const status = error.status;
42
+ return typeof status === "number" ? status : null;
43
+ }
44
+ function delayForAttempt(policy, attempt) {
45
+ return policy.baseDelayMs * Math.pow(policy.backoffMultiplier, attempt - 1);
46
+ }
47
+ async function runProviderAttempt(input) {
48
+ const policy = normalizePolicy(input.policy);
49
+ const maxAttempts = Math.max(1, Math.floor(policy.maxAttempts));
50
+ const wait = input.sleep ?? sleep;
51
+ const attempts = [];
52
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
53
+ try {
54
+ const value = await input.run();
55
+ attempts.push({
56
+ attempt,
57
+ provider: input.provider,
58
+ model: input.model,
59
+ operation: input.operation,
60
+ ok: true,
61
+ willRetry: false,
62
+ });
63
+ (0, runtime_1.emitNervesEvent)({
64
+ component: "engine",
65
+ event: "engine.provider_attempt_succeeded",
66
+ message: "provider attempt succeeded",
67
+ meta: { provider: input.provider, model: input.model, operation: input.operation, attempt, maxAttempts },
68
+ });
69
+ return { ok: true, value, attempts };
70
+ }
71
+ catch (caught) {
72
+ if (caught instanceof ProviderAttemptAbortError)
73
+ throw caught;
74
+ const error = toError(caught);
75
+ const classification = classify(caught, input.classifyError);
76
+ const willRetry = attempt < maxAttempts;
77
+ const delayMs = willRetry ? delayForAttempt(policy, attempt) : undefined;
78
+ const record = {
79
+ attempt,
80
+ provider: input.provider,
81
+ model: input.model,
82
+ operation: input.operation,
83
+ ok: false,
84
+ classification,
85
+ errorMessage: error.message,
86
+ httpStatus: httpStatus(error),
87
+ willRetry,
88
+ ...(delayMs !== undefined ? { delayMs } : {}),
89
+ };
90
+ attempts.push(record);
91
+ if (!willRetry) {
92
+ (0, runtime_1.emitNervesEvent)({
93
+ level: "warn",
94
+ component: "engine",
95
+ event: "engine.provider_attempt_failed",
96
+ message: "provider attempt failed",
97
+ meta: {
98
+ provider: input.provider,
99
+ model: input.model,
100
+ operation: input.operation,
101
+ attempt,
102
+ maxAttempts,
103
+ classification,
104
+ errorMessage: error.message.slice(0, 200),
105
+ httpStatus: httpStatus(error),
106
+ },
107
+ });
108
+ return { ok: false, error, classification, attempts };
109
+ }
110
+ const retryDelayMs = delayMs;
111
+ (0, runtime_1.emitNervesEvent)({
112
+ component: "engine",
113
+ event: "engine.provider_attempt_retry",
114
+ message: "provider attempt failed; retrying",
115
+ meta: {
116
+ provider: input.provider,
117
+ model: input.model,
118
+ operation: input.operation,
119
+ attempt,
120
+ maxAttempts,
121
+ classification,
122
+ errorMessage: error.message.slice(0, 200),
123
+ httpStatus: httpStatus(error),
124
+ delayMs: retryDelayMs,
125
+ },
126
+ });
127
+ await input.onRetry?.(record, maxAttempts);
128
+ await wait(retryDelayMs);
129
+ }
130
+ }
131
+ /* v8 ignore next 2 -- defensive: loop always returns on success or final failure @preserve */
132
+ return { ok: false, error: new Error("provider attempt loop ended unexpectedly"), classification: "unknown", attempts };
133
+ }