@ouro.bot/cli 0.1.0-alpha.32 → 0.1.0-alpha.320

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 (303) hide show
  1. package/README.md +188 -190
  2. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
  3. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +1 -1
  4. package/changelog.json +1917 -0
  5. package/dist/arc/attention-types.js +8 -0
  6. package/dist/arc/cares.js +140 -0
  7. package/dist/arc/episodes.js +117 -0
  8. package/dist/arc/intentions.js +133 -0
  9. package/dist/arc/json-store.js +117 -0
  10. package/dist/arc/obligations.js +237 -0
  11. package/dist/arc/packets.js +193 -0
  12. package/dist/arc/presence.js +185 -0
  13. package/dist/arc/task-lifecycle.js +65 -0
  14. package/dist/heart/active-work.js +832 -0
  15. package/dist/heart/agent-entry.js +37 -2
  16. package/dist/heart/attachments/image-normalize.js +194 -0
  17. package/dist/heart/attachments/materialize.js +97 -0
  18. package/dist/heart/attachments/originals.js +88 -0
  19. package/dist/heart/attachments/render.js +29 -0
  20. package/dist/heart/attachments/sources/adapter.js +2 -0
  21. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  22. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  23. package/dist/heart/attachments/sources/index.js +16 -0
  24. package/dist/heart/attachments/store.js +103 -0
  25. package/dist/heart/attachments/types.js +93 -0
  26. package/dist/heart/auth/auth-flow.js +456 -0
  27. package/dist/heart/bridges/manager.js +358 -0
  28. package/dist/heart/bridges/state-machine.js +135 -0
  29. package/dist/heart/bridges/store.js +123 -0
  30. package/dist/heart/bundle-state.js +168 -0
  31. package/dist/heart/commitments.js +111 -0
  32. package/dist/heart/config-registry.js +304 -0
  33. package/dist/heart/config.js +63 -30
  34. package/dist/heart/core.js +669 -195
  35. package/dist/heart/cross-chat-delivery.js +131 -0
  36. package/dist/heart/daemon/agent-config-check.js +149 -0
  37. package/dist/heart/daemon/agent-discovery.js +79 -3
  38. package/dist/heart/daemon/agent-service.js +360 -0
  39. package/dist/heart/daemon/agentic-repair.js +170 -0
  40. package/dist/heart/daemon/cadence.js +70 -0
  41. package/dist/heart/daemon/cli-defaults.js +596 -0
  42. package/dist/heart/daemon/cli-exec.js +2238 -0
  43. package/dist/heart/daemon/cli-help.js +306 -0
  44. package/dist/heart/daemon/cli-parse.js +824 -0
  45. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  46. package/dist/heart/daemon/cli-render.js +506 -0
  47. package/dist/heart/daemon/cli-types.js +8 -0
  48. package/dist/heart/daemon/daemon-cli.js +29 -1171
  49. package/dist/heart/daemon/daemon-entry.js +333 -3
  50. package/dist/heart/daemon/daemon-health.js +137 -0
  51. package/dist/heart/daemon/daemon-runtime-sync.js +153 -12
  52. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  53. package/dist/heart/daemon/daemon.js +751 -58
  54. package/dist/heart/daemon/doctor-types.js +8 -0
  55. package/dist/heart/daemon/doctor.js +322 -0
  56. package/dist/heart/daemon/health-monitor.js +66 -0
  57. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  58. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  59. package/dist/heart/daemon/http-health-probe.js +80 -0
  60. package/dist/heart/daemon/inner-status.js +89 -0
  61. package/dist/heart/daemon/interactive-repair.js +69 -0
  62. package/dist/heart/daemon/launchd.js +46 -9
  63. package/dist/heart/daemon/log-tailer.js +82 -12
  64. package/dist/heart/daemon/logs-prune.js +105 -0
  65. package/dist/heart/daemon/message-router.js +17 -8
  66. package/dist/heart/daemon/os-cron-deps.js +134 -0
  67. package/dist/heart/daemon/ouro-bot-entry.js +1 -1
  68. package/dist/heart/daemon/process-manager.js +201 -0
  69. package/dist/heart/daemon/provider-discovery.js +105 -0
  70. package/dist/heart/daemon/pulse.js +463 -0
  71. package/dist/heart/daemon/run-hooks.js +2 -0
  72. package/dist/heart/daemon/runtime-logging.js +67 -16
  73. package/dist/heart/daemon/runtime-metadata.js +101 -0
  74. package/dist/heart/daemon/runtime-mode.js +67 -0
  75. package/dist/heart/daemon/safe-mode.js +161 -0
  76. package/dist/heart/daemon/sense-manager.js +72 -3
  77. package/dist/heart/daemon/session-id-resolver.js +131 -0
  78. package/dist/heart/daemon/skill-management-installer.js +94 -0
  79. package/dist/heart/daemon/socket-client.js +307 -0
  80. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  81. package/dist/heart/daemon/startup-tui.js +227 -0
  82. package/dist/heart/daemon/task-scheduler.js +3 -25
  83. package/dist/heart/daemon/thoughts.js +510 -0
  84. package/dist/heart/daemon/up-progress.js +135 -0
  85. package/dist/heart/delegation.js +62 -0
  86. package/dist/heart/habits/habit-migration.js +181 -0
  87. package/dist/heart/habits/habit-parser.js +140 -0
  88. package/dist/heart/habits/habit-scheduler.js +371 -0
  89. package/dist/heart/{daemon → hatch}/hatch-flow.js +30 -120
  90. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  91. package/dist/heart/{daemon → hatch}/specialist-prompt.js +10 -7
  92. package/dist/heart/{daemon → hatch}/specialist-tools.js +49 -3
  93. package/dist/heart/identity.js +163 -60
  94. package/dist/heart/kicks.js +2 -20
  95. package/dist/heart/mcp/mcp-server.js +653 -0
  96. package/dist/heart/migrate-config.js +127 -0
  97. package/dist/heart/model-capabilities.js +59 -0
  98. package/dist/heart/outlook/outlook-http.js +439 -0
  99. package/dist/heart/outlook/outlook-read.js +1595 -0
  100. package/dist/heart/outlook/outlook-render.js +1032 -0
  101. package/dist/heart/outlook/outlook-types.js +27 -0
  102. package/dist/heart/outlook/outlook-view.js +194 -0
  103. package/dist/heart/progress-story.js +42 -0
  104. package/dist/heart/provider-failover.js +88 -0
  105. package/dist/heart/provider-ping.js +162 -0
  106. package/dist/heart/providers/anthropic-token.js +163 -0
  107. package/dist/heart/providers/anthropic.js +169 -46
  108. package/dist/heart/providers/azure.js +98 -11
  109. package/dist/heart/providers/error-classification.js +63 -0
  110. package/dist/heart/providers/github-copilot.js +136 -0
  111. package/dist/heart/providers/minimax-vlm.js +189 -0
  112. package/dist/heart/providers/minimax.js +23 -5
  113. package/dist/heart/providers/openai-codex.js +33 -22
  114. package/dist/heart/session-activity.js +190 -0
  115. package/dist/heart/session-events.js +726 -0
  116. package/dist/heart/session-recall.js +162 -0
  117. package/dist/heart/start-of-turn-packet.js +341 -0
  118. package/dist/heart/streaming.js +36 -27
  119. package/dist/heart/sync.js +332 -0
  120. package/dist/heart/target-resolution.js +127 -0
  121. package/dist/heart/tempo.js +93 -0
  122. package/dist/heart/temporal-view.js +41 -0
  123. package/dist/heart/tool-activity-callbacks.js +36 -0
  124. package/dist/heart/tool-description.js +135 -0
  125. package/dist/heart/tool-friction.js +55 -0
  126. package/dist/heart/tool-loop.js +200 -0
  127. package/dist/heart/turn-context.js +358 -0
  128. package/dist/heart/turn-coordinator.js +28 -0
  129. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  130. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  131. package/dist/heart/{daemon → versioning}/ouro-path-installer.js +78 -35
  132. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  133. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  134. package/dist/heart/{daemon → versioning}/update-checker.js +12 -2
  135. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  136. package/dist/mind/associative-recall.js +137 -66
  137. package/dist/mind/bundle-manifest.js +8 -1
  138. package/dist/mind/context.js +89 -93
  139. package/dist/mind/diary-integrity.js +60 -0
  140. package/dist/mind/{memory.js → diary.js} +84 -96
  141. package/dist/mind/embedding-provider.js +60 -0
  142. package/dist/mind/file-state.js +179 -0
  143. package/dist/mind/first-impressions.js +14 -1
  144. package/dist/mind/friends/channel.js +56 -0
  145. package/dist/mind/friends/group-context.js +144 -0
  146. package/dist/mind/friends/resolver.js +37 -0
  147. package/dist/mind/friends/store-file.js +58 -3
  148. package/dist/mind/friends/trust-explanation.js +74 -0
  149. package/dist/mind/friends/types.js +8 -0
  150. package/dist/mind/journal-index.js +161 -0
  151. package/dist/mind/obligation-steering.js +221 -0
  152. package/dist/mind/pending.js +76 -9
  153. package/dist/mind/prompt.js +950 -113
  154. package/dist/mind/provenance-trust.js +26 -0
  155. package/dist/mind/scrutiny.js +173 -0
  156. package/dist/mind/token-estimate.js +8 -12
  157. package/dist/nerves/cli-logging.js +7 -1
  158. package/dist/nerves/coverage/audit.js +1 -1
  159. package/dist/nerves/coverage/file-completeness.js +76 -5
  160. package/dist/nerves/coverage/run-artifacts.js +1 -1
  161. package/dist/nerves/event-buffer.js +111 -0
  162. package/dist/nerves/index.js +224 -4
  163. package/dist/nerves/observation.js +20 -0
  164. package/dist/nerves/redact.js +79 -0
  165. package/dist/nerves/runtime.js +5 -1
  166. package/dist/outlook-ui/assets/index-IuR4F6y6.js +61 -0
  167. package/dist/outlook-ui/assets/index-LwChZTgL.css +1 -0
  168. package/dist/outlook-ui/index.html +15 -0
  169. package/dist/repertoire/ado-client.js +15 -56
  170. package/dist/repertoire/ado-semantic.js +11 -10
  171. package/dist/repertoire/api-client.js +97 -0
  172. package/dist/repertoire/bitwarden-store.js +319 -0
  173. package/dist/repertoire/bundle-templates.js +72 -0
  174. package/dist/repertoire/bw-installer.js +79 -0
  175. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  176. package/dist/repertoire/coding/context-pack.js +330 -0
  177. package/dist/repertoire/coding/feedback.js +197 -30
  178. package/dist/repertoire/coding/manager.js +159 -11
  179. package/dist/repertoire/coding/spawner.js +55 -9
  180. package/dist/repertoire/coding/tools.js +170 -7
  181. package/dist/repertoire/commerce-errors.js +109 -0
  182. package/dist/repertoire/commerce-self-test.js +156 -0
  183. package/dist/repertoire/credential-access.js +527 -0
  184. package/dist/repertoire/duffel-client.js +185 -0
  185. package/dist/repertoire/github-client.js +14 -55
  186. package/dist/repertoire/graph-client.js +11 -52
  187. package/dist/repertoire/guardrails.js +375 -0
  188. package/dist/repertoire/mcp-client.js +255 -0
  189. package/dist/repertoire/mcp-manager.js +305 -0
  190. package/dist/repertoire/mcp-tools.js +63 -0
  191. package/dist/repertoire/shell-sessions.js +133 -0
  192. package/dist/repertoire/skills.js +14 -23
  193. package/dist/repertoire/stripe-client.js +131 -0
  194. package/dist/repertoire/tasks/board.js +43 -5
  195. package/dist/repertoire/tasks/fix.js +182 -0
  196. package/dist/repertoire/tasks/index.js +28 -10
  197. package/dist/repertoire/tasks/lifecycle.js +2 -2
  198. package/dist/repertoire/tasks/parser.js +3 -2
  199. package/dist/repertoire/tasks/scanner.js +194 -37
  200. package/dist/repertoire/tasks/transitions.js +16 -79
  201. package/dist/repertoire/tool-results.js +29 -0
  202. package/dist/repertoire/tools-attachments.js +316 -0
  203. package/dist/repertoire/tools-base.js +45 -771
  204. package/dist/repertoire/tools-bluebubbles.js +1 -0
  205. package/dist/repertoire/tools-bridge.js +141 -0
  206. package/dist/repertoire/tools-bundle.js +984 -0
  207. package/dist/repertoire/tools-config.js +185 -0
  208. package/dist/repertoire/tools-continuity.js +248 -0
  209. package/dist/repertoire/tools-credential.js +182 -0
  210. package/dist/repertoire/tools-files.js +342 -0
  211. package/dist/repertoire/tools-flight.js +224 -0
  212. package/dist/repertoire/tools-flow.js +105 -0
  213. package/dist/repertoire/tools-github.js +1 -7
  214. package/dist/repertoire/tools-memory.js +376 -0
  215. package/dist/repertoire/tools-session.js +739 -0
  216. package/dist/repertoire/tools-shell.js +120 -0
  217. package/dist/repertoire/tools-stripe.js +180 -0
  218. package/dist/repertoire/tools-surface.js +243 -0
  219. package/dist/repertoire/tools-teams.js +12 -62
  220. package/dist/repertoire/tools-travel.js +125 -0
  221. package/dist/repertoire/tools-user-profile.js +144 -0
  222. package/dist/repertoire/tools-vault.js +110 -0
  223. package/dist/repertoire/tools.js +144 -138
  224. package/dist/repertoire/travel-api-client.js +360 -0
  225. package/dist/repertoire/user-profile.js +118 -0
  226. package/dist/repertoire/vault-setup.js +241 -0
  227. package/dist/scripts/claude-code-hook.js +41 -0
  228. package/dist/scripts/claude-code-stop-hook.js +47 -0
  229. package/dist/senses/attention-queue.js +116 -0
  230. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  231. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  232. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +143 -9
  233. package/dist/senses/bluebubbles/entry.js +13 -0
  234. package/dist/senses/bluebubbles/inbound-log.js +113 -0
  235. package/dist/senses/bluebubbles/index.js +1436 -0
  236. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  237. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +43 -12
  238. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  239. package/dist/senses/bluebubbles/replay.js +129 -0
  240. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  241. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  242. package/dist/senses/cli/bracketed-paste.js +82 -0
  243. package/dist/senses/cli/image-paste.js +287 -0
  244. package/dist/senses/cli/image-ref-navigation.js +75 -0
  245. package/dist/senses/cli/ink-app.js +156 -0
  246. package/dist/senses/cli/inline-diff.js +64 -0
  247. package/dist/senses/cli/input-keys.js +174 -0
  248. package/dist/senses/cli/kill-ring.js +86 -0
  249. package/dist/senses/cli/message-list.js +51 -0
  250. package/dist/senses/cli/ouro-tui.js +605 -0
  251. package/dist/senses/cli/spinner-imperative.js +135 -0
  252. package/dist/senses/cli/spinner.js +101 -0
  253. package/dist/senses/cli/status-line.js +60 -0
  254. package/dist/senses/cli/streaming-markdown.js +526 -0
  255. package/dist/senses/cli/tool-display.js +83 -0
  256. package/dist/senses/cli/tool-render.js +85 -0
  257. package/dist/senses/cli/tui-store.js +240 -0
  258. package/dist/senses/cli/virtual-list.js +35 -0
  259. package/dist/senses/cli-entry.js +1 -1
  260. package/dist/senses/cli-layout.js +187 -0
  261. package/dist/senses/cli.js +595 -246
  262. package/dist/senses/commands.js +65 -1
  263. package/dist/senses/continuity.js +94 -0
  264. package/dist/senses/habit-turn-message.js +108 -0
  265. package/dist/senses/inner-dialog-worker.js +112 -19
  266. package/dist/senses/inner-dialog.js +633 -86
  267. package/dist/senses/pipeline.js +565 -0
  268. package/dist/senses/shared-turn.js +199 -0
  269. package/dist/senses/surface-tool.js +68 -0
  270. package/dist/senses/teams.js +666 -166
  271. package/dist/senses/trust-gate.js +112 -2
  272. package/package.json +27 -7
  273. package/skills/agent-commerce.md +106 -0
  274. package/skills/browser-navigation.md +110 -0
  275. package/skills/commerce-setup-guide.md +116 -0
  276. package/skills/commerce-setup.md +84 -0
  277. package/skills/configure-dev-tools.md +81 -0
  278. package/skills/travel-planning.md +138 -0
  279. package/dist/heart/daemon/subagent-installer.js +0 -134
  280. package/dist/senses/bluebubbles-entry.js +0 -11
  281. package/dist/senses/bluebubbles.js +0 -544
  282. package/dist/senses/debug-activity.js +0 -108
  283. package/subagents/README.md +0 -73
  284. package/subagents/work-doer.md +0 -235
  285. package/subagents/work-merger.md +0 -618
  286. package/subagents/work-planner.md +0 -382
  287. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  288. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  289. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  290. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  291. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  292. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  293. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  294. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  295. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  296. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  297. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  298. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +0 -0
  299. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  300. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  301. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  302. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  303. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,358 @@
1
+ "use strict";
2
+ /**
3
+ * TurnContext: a single pre-read snapshot of all state sources needed
4
+ * by the inbound-turn pipeline and prompt assembly.
5
+ *
6
+ * Before this module existed, pipeline.ts read ~10 state sources inline
7
+ * and prompt.ts did several ad-hoc filesystem reads. This centralizes
8
+ * all reads into one place so the rest of the turn is pure derivation.
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.buildTurnContext = buildTurnContext;
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ const runtime_1 = require("../nerves/runtime");
48
+ const manager_1 = require("./bridges/manager");
49
+ const identity_1 = require("./identity");
50
+ const tasks_1 = require("../repertoire/tasks");
51
+ const coding_1 = require("../repertoire/coding");
52
+ const session_activity_1 = require("./session-activity");
53
+ const thoughts_1 = require("./daemon/thoughts");
54
+ const pending_1 = require("../mind/pending");
55
+ const obligations_1 = require("../arc/obligations");
56
+ const target_resolution_1 = require("./target-resolution");
57
+ const episodes_1 = require("../arc/episodes");
58
+ const cares_1 = require("../arc/cares");
59
+ const config_1 = require("./config");
60
+ const daemon_health_1 = require("./daemon/daemon-health");
61
+ const prompt_1 = require("../mind/prompt");
62
+ // ── Helpers ─────────────────────────────────────────────────────────
63
+ const DAEMON_SOCKET_PATH = "/tmp/ouroboros-daemon.sock";
64
+ function isLiveCodingSessionStatus(status) {
65
+ return status === "spawning"
66
+ || status === "running"
67
+ || status === "waiting_input"
68
+ || status === "stalled";
69
+ }
70
+ function emptyTaskBoard() {
71
+ return {
72
+ compact: "",
73
+ full: "",
74
+ byStatus: {
75
+ drafting: [],
76
+ processing: [],
77
+ validating: [],
78
+ collaborating: [],
79
+ paused: [],
80
+ blocked: [],
81
+ done: [],
82
+ cancelled: [],
83
+ },
84
+ issues: [],
85
+ actionRequired: [],
86
+ unresolvedDependencies: [],
87
+ activeSessions: [],
88
+ activeBridges: [],
89
+ };
90
+ }
91
+ function readInnerWorkState() {
92
+ const defaultJob = {
93
+ status: "idle",
94
+ content: null,
95
+ origin: null,
96
+ mode: "reflect",
97
+ obligationStatus: null,
98
+ surfacedResult: null,
99
+ queuedAt: null,
100
+ startedAt: null,
101
+ surfacedAt: null,
102
+ };
103
+ try {
104
+ const agentRoot = (0, identity_1.getAgentRoot)();
105
+ const pendingDir = (0, pending_1.getInnerDialogPendingDir)((0, identity_1.getAgentName)());
106
+ const sessionPath = (0, thoughts_1.getInnerDialogSessionPath)(agentRoot);
107
+ const { pendingMessages, turns, runtimeState } = (0, thoughts_1.readInnerDialogRawData)(sessionPath, pendingDir);
108
+ const dialogStatus = (0, thoughts_1.deriveInnerDialogStatus)(pendingMessages, turns, runtimeState);
109
+ const job = (0, thoughts_1.deriveInnerJob)(pendingMessages, turns, runtimeState);
110
+ const storeObligationPending = (0, obligations_1.readPendingObligations)(agentRoot).length > 0;
111
+ return {
112
+ status: dialogStatus.processing === "started" ? "running" : "idle",
113
+ hasPending: dialogStatus.queue !== "clear",
114
+ origin: dialogStatus.origin,
115
+ contentSnippet: dialogStatus.contentSnippet,
116
+ obligationPending: dialogStatus.obligationPending || storeObligationPending,
117
+ job,
118
+ };
119
+ }
120
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
121
+ return {
122
+ status: "idle",
123
+ hasPending: false,
124
+ job: defaultJob,
125
+ /* v8 ignore stop */
126
+ };
127
+ }
128
+ }
129
+ function checkDaemonRunning() {
130
+ try {
131
+ return fs.existsSync(DAEMON_SOCKET_PATH);
132
+ }
133
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
134
+ return false;
135
+ /* v8 ignore stop */
136
+ }
137
+ }
138
+ function hasTextField(record, key) {
139
+ return typeof record?.[key] === "string" && record[key].trim().length > 0;
140
+ }
141
+ function readSenseStatusLines() {
142
+ const config = (0, identity_1.loadAgentConfig)();
143
+ const senses = config.senses ?? {
144
+ cli: { enabled: true },
145
+ teams: { enabled: false },
146
+ bluebubbles: { enabled: false },
147
+ };
148
+ let payload = {};
149
+ try {
150
+ const raw = fs.readFileSync((0, identity_1.getAgentSecretsPath)(), "utf-8");
151
+ const parsed = JSON.parse(raw);
152
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
153
+ payload = parsed;
154
+ }
155
+ }
156
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
157
+ payload = {};
158
+ /* v8 ignore stop */
159
+ }
160
+ const teams = payload.teams;
161
+ const bluebubbles = payload.bluebubbles;
162
+ const configured = {
163
+ cli: true,
164
+ teams: hasTextField(teams, "clientId") && hasTextField(teams, "clientSecret") && hasTextField(teams, "tenantId"),
165
+ bluebubbles: hasTextField(bluebubbles, "serverUrl") && hasTextField(bluebubbles, "password"),
166
+ };
167
+ const rows = [
168
+ { label: "CLI", status: "interactive" },
169
+ {
170
+ label: "Teams",
171
+ status: !senses.teams.enabled ? "disabled" : configured.teams ? "ready" : "needs_config",
172
+ },
173
+ {
174
+ label: "BlueBubbles",
175
+ status: !senses.bluebubbles.enabled ? "disabled" : configured.bluebubbles ? "ready" : "needs_config",
176
+ },
177
+ ];
178
+ return rows.map((row) => `- ${row.label}: ${row.status}`);
179
+ }
180
+ function readBundleMetaFile() {
181
+ try {
182
+ const metaPath = path.join((0, identity_1.getAgentRoot)(), "bundle-meta.json");
183
+ const raw = fs.readFileSync(metaPath, "utf-8");
184
+ return JSON.parse(raw);
185
+ }
186
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
187
+ return null;
188
+ /* v8 ignore stop */
189
+ }
190
+ }
191
+ // ── Builder ─────────────────────────────────────────────────────────
192
+ async function buildTurnContext(input) {
193
+ const agentRoot = (0, identity_1.getAgentRoot)();
194
+ const agentName = (0, identity_1.getAgentName)();
195
+ // Sync config
196
+ let syncConfig = { enabled: false, remote: "origin" };
197
+ try {
198
+ syncConfig = (0, config_1.getSyncConfig)();
199
+ }
200
+ catch { /* v8 ignore next -- defensive @preserve */ /* config not available */ }
201
+ // Bridges
202
+ const activeBridges = (0, manager_1.createBridgeManager)().findBridgesForSession({
203
+ friendId: input.currentSession.friendId,
204
+ channel: input.currentSession.channel,
205
+ key: input.currentSession.key,
206
+ });
207
+ // Session activity
208
+ let sessionActivity = [];
209
+ try {
210
+ sessionActivity = (0, session_activity_1.listSessionActivity)({
211
+ sessionsDir: `${agentRoot}/state/sessions`,
212
+ friendsDir: `${agentRoot}/friends`,
213
+ agentName,
214
+ currentSession: {
215
+ friendId: input.currentSession.friendId,
216
+ channel: input.currentSession.channel,
217
+ key: input.currentSession.key,
218
+ },
219
+ });
220
+ }
221
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
222
+ sessionActivity = [];
223
+ /* v8 ignore stop */
224
+ }
225
+ // Target candidates
226
+ let targetCandidates = [];
227
+ try {
228
+ if (input.channel !== "inner") {
229
+ targetCandidates = await (0, target_resolution_1.listTargetSessionCandidates)({
230
+ sessionsDir: `${agentRoot}/state/sessions`,
231
+ friendsDir: `${agentRoot}/friends`,
232
+ agentName,
233
+ currentSession: {
234
+ friendId: input.currentSession.friendId,
235
+ channel: input.currentSession.channel,
236
+ key: input.currentSession.key,
237
+ },
238
+ friendStore: input.friendStore,
239
+ });
240
+ }
241
+ }
242
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
243
+ targetCandidates = [];
244
+ /* v8 ignore stop */
245
+ }
246
+ // Pending obligations
247
+ let pendingObligations = [];
248
+ try {
249
+ pendingObligations = (0, obligations_1.readPendingObligations)(agentRoot);
250
+ }
251
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
252
+ pendingObligations = [];
253
+ /* v8 ignore stop */
254
+ }
255
+ // Coding sessions
256
+ let codingSessions = [];
257
+ let otherCodingSessions = [];
258
+ try {
259
+ const liveCodingSessions = (0, coding_1.getCodingSessionManager)()
260
+ .listSessions()
261
+ .filter((session) => isLiveCodingSessionStatus(session.status) && Boolean(session.originSession));
262
+ codingSessions = liveCodingSessions.filter((session) => session.originSession?.friendId === input.currentSession.friendId
263
+ && session.originSession.channel === input.currentSession.channel
264
+ && session.originSession.key === input.currentSession.key);
265
+ otherCodingSessions = liveCodingSessions.filter((session) => !(session.originSession?.friendId === input.currentSession.friendId
266
+ && session.originSession.channel === input.currentSession.channel
267
+ && session.originSession.key === input.currentSession.key));
268
+ }
269
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
270
+ codingSessions = [];
271
+ otherCodingSessions = [];
272
+ /* v8 ignore stop */
273
+ }
274
+ // Inner work state
275
+ const innerWorkState = readInnerWorkState();
276
+ // Task board
277
+ let taskBoard;
278
+ try {
279
+ taskBoard = (0, tasks_1.getTaskModule)().getBoard();
280
+ }
281
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
282
+ taskBoard = emptyTaskBoard();
283
+ /* v8 ignore stop */
284
+ }
285
+ // Return obligations
286
+ let returnObligations = [];
287
+ try {
288
+ returnObligations = (0, obligations_1.listActiveReturnObligations)(agentName);
289
+ }
290
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
291
+ returnObligations = [];
292
+ /* v8 ignore stop */
293
+ }
294
+ // Recent episodes
295
+ const recentEpisodes = (0, episodes_1.readRecentEpisodes)(agentRoot, { limit: 20 });
296
+ // Active cares
297
+ const activeCares = (0, cares_1.readActiveCares)(agentRoot);
298
+ // ── Prompt-assembly pre-reads ──────────────────────────────────────
299
+ const daemonRunning = checkDaemonRunning();
300
+ let senseStatusLines = [];
301
+ try {
302
+ senseStatusLines = readSenseStatusLines();
303
+ }
304
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
305
+ senseStatusLines = [];
306
+ /* v8 ignore stop */
307
+ }
308
+ const bundleMeta = readBundleMetaFile();
309
+ let daemonHealth = null;
310
+ try {
311
+ daemonHealth = (0, daemon_health_1.readHealth)((0, daemon_health_1.getDefaultHealthPath)());
312
+ }
313
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
314
+ daemonHealth = null;
315
+ /* v8 ignore stop */
316
+ }
317
+ let journalFiles = [];
318
+ try {
319
+ const journalDir = path.join(agentRoot, "journal");
320
+ journalFiles = (0, prompt_1.readJournalFiles)(journalDir);
321
+ }
322
+ catch { /* v8 ignore start -- defensive: fallback on read failure @preserve */
323
+ journalFiles = [];
324
+ /* v8 ignore stop */
325
+ }
326
+ (0, runtime_1.emitNervesEvent)({
327
+ component: "senses",
328
+ event: "senses.turn_context_built",
329
+ message: "turn context snapshot assembled",
330
+ meta: {
331
+ channel: input.channel,
332
+ obligationCount: pendingObligations.length,
333
+ bridgeCount: activeBridges.length,
334
+ codingSessionCount: codingSessions.length,
335
+ episodeCount: recentEpisodes.length,
336
+ },
337
+ });
338
+ return {
339
+ activeBridges,
340
+ sessionActivity,
341
+ targetCandidates,
342
+ pendingObligations,
343
+ codingSessions,
344
+ otherCodingSessions,
345
+ innerWorkState,
346
+ taskBoard,
347
+ returnObligations,
348
+ recentEpisodes,
349
+ activeCares,
350
+ syncConfig,
351
+ syncFailure: undefined, // Set by pipeline after preTurnPull
352
+ daemonRunning,
353
+ senseStatusLines,
354
+ bundleMeta,
355
+ daemonHealth,
356
+ journalFiles,
357
+ };
358
+ }
@@ -1,7 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createTurnCoordinator = createTurnCoordinator;
4
+ exports.withSharedTurnLock = withSharedTurnLock;
5
+ exports.tryBeginSharedTurn = tryBeginSharedTurn;
6
+ exports.endSharedTurn = endSharedTurn;
7
+ exports.isSharedTurnActive = isSharedTurnActive;
8
+ exports.enqueueSharedFollowUp = enqueueSharedFollowUp;
9
+ exports.drainSharedFollowUps = drainSharedFollowUps;
4
10
  const runtime_1 = require("../nerves/runtime");
11
+ function scopedKey(scope, key) {
12
+ return `${scope}:${key}`;
13
+ }
5
14
  function createTurnCoordinator() {
6
15
  const turnLocks = new Map();
7
16
  const activeTurns = new Set();
@@ -60,3 +69,22 @@ function createTurnCoordinator() {
60
69
  },
61
70
  };
62
71
  }
72
+ const _sharedTurnCoordinator = createTurnCoordinator();
73
+ function withSharedTurnLock(scope, key, fn) {
74
+ return _sharedTurnCoordinator.withTurnLock(scopedKey(scope, key), fn);
75
+ }
76
+ function tryBeginSharedTurn(scope, key) {
77
+ return _sharedTurnCoordinator.tryBeginTurn(scopedKey(scope, key));
78
+ }
79
+ function endSharedTurn(scope, key) {
80
+ _sharedTurnCoordinator.endTurn(scopedKey(scope, key));
81
+ }
82
+ function isSharedTurnActive(scope, key) {
83
+ return _sharedTurnCoordinator.isTurnActive(scopedKey(scope, key));
84
+ }
85
+ function enqueueSharedFollowUp(scope, key, followUp) {
86
+ _sharedTurnCoordinator.enqueueFollowUp(scopedKey(scope, key), followUp);
87
+ }
88
+ function drainSharedFollowUps(scope, key) {
89
+ return _sharedTurnCoordinator.drainFollowUps(scopedKey(scope, key));
90
+ }
@@ -38,7 +38,7 @@ const child_process_1 = require("child_process");
38
38
  const fs = __importStar(require("fs"));
39
39
  const path = __importStar(require("path"));
40
40
  const runtime_1 = require("../../nerves/runtime");
41
- const runtime_metadata_1 = require("./runtime-metadata");
41
+ const runtime_metadata_1 = require("../daemon/runtime-metadata");
42
42
  function normalizeOutput(output) {
43
43
  return (typeof output === "string" ? output : output.toString("utf-8")).trim();
44
44
  }
@@ -35,7 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.runOuroBotWrapper = runOuroBotWrapper;
37
37
  const runtime_1 = require("../../nerves/runtime");
38
- const daemon_cli_1 = require("./daemon-cli");
38
+ const daemon_cli_1 = require("../daemon/daemon-cli");
39
39
  async function defaultLoadCanonicalRunner() {
40
40
  // Use the subpath export so we get the daemon-cli module directly,
41
41
  // NOT the root entry point which has side-effects (immediately runs the CLI).
@@ -38,10 +38,30 @@ const fs = __importStar(require("fs"));
38
38
  const os = __importStar(require("os"));
39
39
  const path = __importStar(require("path"));
40
40
  const runtime_1 = require("../../nerves/runtime");
41
- const CLI_PACKAGE_SPECIFIER = "@ouro.bot/cli@alpha";
42
41
  const WRAPPER_SCRIPT = `#!/bin/sh
43
- exec npx --yes ${CLI_PACKAGE_SPECIFIER} "$@"
42
+ # Check for dev mode — if dev-config.json exists, dispatch to the dev repo
43
+ # Skip dev dispatch for "up" command (explicitly returns to production)
44
+ DEV_CONFIG="$HOME/.ouro-cli/dev-config.json"
45
+ if [ -f "$DEV_CONFIG" ] && [ "$1" != "up" ]; then
46
+ DEV_REPO=$(node -e "try{console.log(JSON.parse(require('fs').readFileSync('$DEV_CONFIG','utf-8')).repoPath)}catch{}" 2>/dev/null)
47
+ DEV_ENTRY="$DEV_REPO/dist/heart/daemon/ouro-entry.js"
48
+ if [ -n "$DEV_REPO" ] && [ -e "$DEV_ENTRY" ]; then
49
+ exec node "$DEV_ENTRY" "$@"
50
+ fi
51
+ fi
52
+ # Fall back to installed version
53
+ ENTRY="$HOME/.ouro-cli/CurrentVersion/node_modules/@ouro.bot/cli/dist/heart/daemon/ouro-entry.js"
54
+ if [ ! -e "$ENTRY" ]; then
55
+ echo "ouro not installed. Run: npx ouro.bot" >&2
56
+ exit 1
57
+ fi
58
+ exec node "$ENTRY" "$@"
44
59
  `;
60
+ function writeWrapperScript(scriptPath, mkdirSync, writeFileSync, chmodSync) {
61
+ mkdirSync(path.dirname(scriptPath), { recursive: true });
62
+ writeFileSync(scriptPath, WRAPPER_SCRIPT, { mode: 0o755 });
63
+ chmodSync(scriptPath, 0o755);
64
+ }
45
65
  function detectShellProfile(homeDir, shell) {
46
66
  if (!shell)
47
67
  return null;
@@ -67,6 +87,16 @@ function buildPathExportLine(binDir, shell) {
67
87
  }
68
88
  return `\n# Added by ouro\nexport PATH="${binDir}:$PATH"\n`;
69
89
  }
90
+ function isWrapperCurrent(scriptPath, existsSync, readFileSync) {
91
+ if (!existsSync(scriptPath))
92
+ return false;
93
+ try {
94
+ return readFileSync(scriptPath, "utf-8") === WRAPPER_SCRIPT;
95
+ }
96
+ catch {
97
+ return false;
98
+ }
99
+ }
70
100
  function installOuroCommand(deps = {}) {
71
101
  /* v8 ignore start -- dep defaults: only used in real runtime, tests always inject @preserve */
72
102
  const platform = deps.platform ?? process.platform;
@@ -87,46 +117,59 @@ function installOuroCommand(deps = {}) {
87
117
  message: "skipped ouro PATH install on Windows",
88
118
  meta: { platform },
89
119
  });
90
- return { installed: false, scriptPath: null, pathReady: false, shellProfileUpdated: null, skippedReason: "windows" };
120
+ return { installed: false, scriptPath: null, pathReady: false, shellProfileUpdated: null, skippedReason: "windows", repairedOldLauncher: false };
121
+ }
122
+ // Ensure ~/.ouro-cli/ directory layout exists
123
+ if (deps.ensureCliLayout) {
124
+ deps.ensureCliLayout();
91
125
  }
92
- const binDir = path.join(homeDir, ".local", "bin");
126
+ const binDir = path.join(homeDir, ".ouro-cli", "bin");
93
127
  const scriptPath = path.join(binDir, "ouro");
94
- (0, runtime_1.emitNervesEvent)({
95
- component: "daemon",
96
- event: "daemon.ouro_path_install_start",
97
- message: "installing ouro command to PATH",
98
- meta: { scriptPath, binDir },
99
- });
100
- // If ouro already exists, check content and repair if stale
101
- if (existsSync(scriptPath)) {
102
- let existingContent = "";
128
+ const oldScriptPath = path.join(homeDir, ".local", "bin", "ouro");
129
+ const modernCurrent = isWrapperCurrent(scriptPath, existsSync, readFileSync);
130
+ const oldExists = existsSync(oldScriptPath);
131
+ const oldCurrent = oldExists && isWrapperCurrent(oldScriptPath, existsSync, readFileSync);
132
+ // ── Repair old ~/.local/bin/ouro launcher ──
133
+ // If the old launcher exists with stale content it can shadow the modern
134
+ // path and cause the wrong CLI version to run. Overwrite it with the
135
+ // current wrapper so both paths resolve to ~/.ouro-cli/CurrentVersion.
136
+ let repairedOldLauncher = false;
137
+ if (oldExists && !oldCurrent) {
138
+ (0, runtime_1.emitNervesEvent)({
139
+ component: "daemon",
140
+ event: "daemon.ouro_path_repair_old",
141
+ message: "repairing stale old launcher at ~/.local/bin/ouro",
142
+ meta: { oldScriptPath },
143
+ });
103
144
  try {
104
- existingContent = readFileSync(scriptPath, "utf-8");
145
+ writeFileSync(oldScriptPath, WRAPPER_SCRIPT, { mode: 0o755 });
146
+ chmodSync(oldScriptPath, 0o755);
147
+ repairedOldLauncher = true;
105
148
  }
106
149
  catch {
107
- // Can't readtreat as stale, will overwrite below
108
- }
109
- if (existingContent === WRAPPER_SCRIPT) {
110
- (0, runtime_1.emitNervesEvent)({
111
- component: "daemon",
112
- event: "daemon.ouro_path_install_skip",
113
- message: "ouro command already installed",
114
- meta: { scriptPath },
115
- });
116
- return { installed: false, scriptPath, pathReady: isBinDirInPath(binDir, envPath), shellProfileUpdated: null, skippedReason: "already-installed" };
150
+ // Best effortold launcher repair failure must not block modern install
117
151
  }
118
- // Content is stale — repair by overwriting
152
+ }
153
+ // ── Fast-path: modern wrapper already current ──
154
+ if (modernCurrent) {
119
155
  (0, runtime_1.emitNervesEvent)({
120
156
  component: "daemon",
121
- event: "daemon.ouro_path_install_repair",
122
- message: "repairing stale ouro wrapper script",
157
+ event: "daemon.ouro_path_install_skip",
158
+ message: "ouro command already installed",
123
159
  meta: { scriptPath },
124
160
  });
161
+ return { installed: false, scriptPath, pathReady: isBinDirInPath(binDir, envPath), shellProfileUpdated: null, skippedReason: "already-installed", repairedOldLauncher };
125
162
  }
163
+ (0, runtime_1.emitNervesEvent)({
164
+ component: "daemon",
165
+ event: "daemon.ouro_path_install_start",
166
+ message: existsSync(scriptPath) ? "repairing stale ouro wrapper script" : "installing ouro command to PATH",
167
+ meta: { scriptPath, binDir },
168
+ });
126
169
  try {
127
- mkdirSync(binDir, { recursive: true });
128
- writeFileSync(scriptPath, WRAPPER_SCRIPT, { mode: 0o755 });
129
- chmodSync(scriptPath, 0o755);
170
+ if (!modernCurrent) {
171
+ writeWrapperScript(scriptPath, mkdirSync, writeFileSync, chmodSync);
172
+ }
130
173
  }
131
174
  catch (error) {
132
175
  (0, runtime_1.emitNervesEvent)({
@@ -136,11 +179,11 @@ function installOuroCommand(deps = {}) {
136
179
  message: "failed to install ouro command",
137
180
  meta: { error: error instanceof Error ? error.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(error) },
138
181
  });
139
- return { installed: false, scriptPath: null, pathReady: false, shellProfileUpdated: null, skippedReason: error instanceof Error ? error.message : /* v8 ignore next -- defensive @preserve */ String(error) };
182
+ return { installed: false, scriptPath: null, pathReady: false, shellProfileUpdated: null, skippedReason: error instanceof Error ? error.message : /* v8 ignore next -- defensive @preserve */ String(error), repairedOldLauncher };
140
183
  }
141
- // Check if ~/.local/bin is already in PATH
142
- let shellProfileUpdated = null;
184
+ // Check if ~/.ouro-cli/bin is already in PATH
143
185
  const pathReady = isBinDirInPath(binDir, envPath);
186
+ let shellProfileUpdated = null;
144
187
  if (!pathReady) {
145
188
  const profilePath = detectShellProfile(homeDir, shell);
146
189
  if (profilePath) {
@@ -172,7 +215,7 @@ function installOuroCommand(deps = {}) {
172
215
  component: "daemon",
173
216
  event: "daemon.ouro_path_install_end",
174
217
  message: "ouro command installed",
175
- meta: { scriptPath, pathReady, shellProfileUpdated },
218
+ meta: { scriptPath, pathReady, shellProfileUpdated, oldScriptPath: oldExists ? oldScriptPath : null },
176
219
  });
177
- return { installed: true, scriptPath, pathReady, shellProfileUpdated };
220
+ return { installed: true, scriptPath, pathReady, shellProfileUpdated, repairedOldLauncher };
178
221
  }