@ouro.bot/cli 0.1.0-alpha.23 → 0.1.0-alpha.230

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 (241) hide show
  1. package/README.md +187 -191
  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 +1402 -1
  5. package/dist/arc/attention-types.js +8 -0
  6. package/dist/arc/cares.js +140 -0
  7. package/dist/arc/episodes.js +119 -0
  8. package/dist/arc/intentions.js +133 -0
  9. package/dist/arc/json-store.js +120 -0
  10. package/dist/arc/obligations.js +237 -0
  11. package/dist/arc/presence.js +185 -0
  12. package/dist/heart/active-work.js +832 -0
  13. package/dist/heart/agent-entry.js +37 -2
  14. package/dist/heart/auth/auth-flow.js +447 -0
  15. package/dist/heart/bridges/manager.js +358 -0
  16. package/dist/heart/bridges/state-machine.js +135 -0
  17. package/dist/heart/bridges/store.js +123 -0
  18. package/dist/heart/commitments.js +111 -0
  19. package/dist/heart/config-registry.js +305 -0
  20. package/dist/heart/config.js +63 -30
  21. package/dist/heart/core.js +601 -145
  22. package/dist/heart/cross-chat-delivery.js +131 -0
  23. package/dist/heart/daemon/agent-config-check.js +149 -0
  24. package/dist/heart/daemon/agent-discovery.js +81 -0
  25. package/dist/heart/daemon/agent-service.js +360 -0
  26. package/dist/heart/daemon/cadence.js +70 -0
  27. package/dist/heart/daemon/cli-defaults.js +557 -0
  28. package/dist/heart/daemon/cli-exec.js +1847 -0
  29. package/dist/heart/daemon/cli-parse.js +759 -0
  30. package/dist/heart/daemon/cli-render.js +316 -0
  31. package/dist/heart/daemon/cli-types.js +8 -0
  32. package/dist/heart/daemon/daemon-cli.js +29 -1163
  33. package/dist/heart/daemon/daemon-entry.js +202 -4
  34. package/dist/heart/daemon/daemon-health.js +136 -0
  35. package/dist/heart/daemon/daemon-runtime-sync.js +153 -12
  36. package/dist/heart/daemon/daemon-tombstone.js +123 -0
  37. package/dist/heart/daemon/daemon.js +489 -20
  38. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  39. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  40. package/dist/heart/daemon/inner-status.js +89 -0
  41. package/dist/heart/daemon/launchd.js +39 -8
  42. package/dist/heart/daemon/log-tailer.js +4 -3
  43. package/dist/heart/daemon/message-router.js +17 -8
  44. package/dist/heart/daemon/os-cron-deps.js +134 -0
  45. package/dist/heart/daemon/ouro-bot-entry.js +1 -1
  46. package/dist/heart/daemon/process-manager.js +123 -0
  47. package/dist/heart/daemon/run-hooks.js +2 -0
  48. package/dist/heart/daemon/runtime-logging.js +58 -15
  49. package/dist/heart/daemon/runtime-metadata.js +101 -0
  50. package/dist/heart/daemon/runtime-mode.js +67 -0
  51. package/dist/heart/daemon/safe-mode.js +161 -0
  52. package/dist/heart/daemon/sense-manager.js +72 -3
  53. package/dist/heart/daemon/session-id-resolver.js +131 -0
  54. package/dist/heart/daemon/skill-management-installer.js +94 -0
  55. package/dist/heart/daemon/socket-client.js +201 -0
  56. package/dist/heart/daemon/task-scheduler.js +3 -25
  57. package/dist/heart/daemon/thoughts.js +507 -0
  58. package/dist/heart/delegation.js +62 -0
  59. package/dist/heart/habits/habit-migration.js +181 -0
  60. package/dist/heart/habits/habit-parser.js +119 -0
  61. package/dist/heart/habits/habit-scheduler.js +369 -0
  62. package/dist/heart/{daemon → hatch}/hatch-flow.js +29 -119
  63. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  64. package/dist/heart/{daemon → hatch}/specialist-prompt.js +10 -7
  65. package/dist/heart/{daemon → hatch}/specialist-tools.js +49 -3
  66. package/dist/heart/identity.js +144 -55
  67. package/dist/heart/kicks.js +2 -20
  68. package/dist/heart/mcp/mcp-server.js +608 -0
  69. package/dist/heart/migrate-config.js +127 -0
  70. package/dist/heart/model-capabilities.js +48 -0
  71. package/dist/heart/outlook/outlook-http.js +439 -0
  72. package/dist/heart/outlook/outlook-read.js +1618 -0
  73. package/dist/heart/outlook/outlook-render.js +1032 -0
  74. package/dist/heart/outlook/outlook-types.js +7 -0
  75. package/dist/heart/outlook/outlook-view.js +194 -0
  76. package/dist/heart/progress-story.js +42 -0
  77. package/dist/heart/provider-failover.js +88 -0
  78. package/dist/heart/provider-ping.js +162 -0
  79. package/dist/heart/providers/anthropic-token.js +163 -0
  80. package/dist/heart/providers/anthropic.js +187 -41
  81. package/dist/heart/providers/azure.js +116 -10
  82. package/dist/heart/providers/github-copilot.js +157 -0
  83. package/dist/heart/providers/minimax.js +33 -3
  84. package/dist/heart/providers/openai-codex.js +51 -16
  85. package/dist/heart/session-activity.js +172 -0
  86. package/dist/heart/session-recall.js +216 -0
  87. package/dist/heart/start-of-turn-packet.js +330 -0
  88. package/dist/heart/streaming.js +36 -27
  89. package/dist/heart/sync.js +217 -0
  90. package/dist/heart/target-resolution.js +127 -0
  91. package/dist/heart/tempo.js +93 -0
  92. package/dist/heart/temporal-view.js +41 -0
  93. package/dist/heart/tool-activity-callbacks.js +36 -0
  94. package/dist/heart/tool-description.js +135 -0
  95. package/dist/heart/tool-loop.js +200 -0
  96. package/dist/heart/turn-context.js +358 -0
  97. package/dist/heart/turn-coordinator.js +28 -0
  98. package/dist/heart/versioning/ouro-bot-global-installer.js +128 -0
  99. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  100. package/dist/heart/{daemon → versioning}/ouro-path-installer.js +78 -35
  101. package/dist/heart/versioning/ouro-version-manager.js +171 -0
  102. package/dist/heart/{daemon → versioning}/staged-restart.js +30 -6
  103. package/dist/heart/{daemon → versioning}/update-checker.js +9 -1
  104. package/dist/heart/{daemon → versioning}/update-hooks.js +20 -2
  105. package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +41 -3
  106. package/dist/mind/associative-recall.js +126 -66
  107. package/dist/mind/bundle-manifest.js +8 -1
  108. package/dist/mind/context.js +125 -14
  109. package/dist/mind/{memory.js → diary.js} +73 -96
  110. package/dist/mind/embedding-provider.js +60 -0
  111. package/dist/mind/file-state.js +179 -0
  112. package/dist/mind/first-impressions.js +16 -2
  113. package/dist/mind/friends/channel.js +56 -0
  114. package/dist/mind/friends/group-context.js +144 -0
  115. package/dist/mind/friends/store-file.js +58 -3
  116. package/dist/mind/friends/trust-explanation.js +74 -0
  117. package/dist/mind/friends/types.js +8 -0
  118. package/dist/mind/journal-index.js +161 -0
  119. package/dist/mind/obligation-steering.js +221 -0
  120. package/dist/mind/pending.js +76 -9
  121. package/dist/mind/phrases.js +1 -0
  122. package/dist/mind/prompt.js +779 -109
  123. package/dist/mind/scrutiny.js +173 -0
  124. package/dist/mind/token-estimate.js +8 -12
  125. package/dist/nerves/coverage/audit.js +1 -1
  126. package/dist/nerves/coverage/file-completeness.js +47 -5
  127. package/dist/nerves/coverage/run-artifacts.js +1 -1
  128. package/dist/nerves/event-buffer.js +111 -0
  129. package/dist/nerves/index.js +64 -4
  130. package/dist/nerves/observation.js +20 -0
  131. package/dist/nerves/runtime.js +5 -1
  132. package/dist/outlook-ui/assets/index-Ck8agNeO.js +61 -0
  133. package/dist/outlook-ui/assets/index-LwChZTgL.css +1 -0
  134. package/dist/outlook-ui/index.html +15 -0
  135. package/dist/repertoire/ado-client.js +15 -56
  136. package/dist/repertoire/ado-semantic.js +11 -5
  137. package/dist/repertoire/api-client.js +97 -0
  138. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  139. package/dist/repertoire/coding/context-pack.js +330 -0
  140. package/dist/repertoire/coding/feedback.js +197 -30
  141. package/dist/repertoire/coding/manager.js +149 -2
  142. package/dist/repertoire/coding/spawner.js +55 -9
  143. package/dist/repertoire/coding/tools.js +170 -7
  144. package/dist/repertoire/credential-access.js +449 -0
  145. package/dist/repertoire/github-client.js +14 -55
  146. package/dist/repertoire/graph-client.js +11 -52
  147. package/dist/repertoire/guardrails.js +342 -0
  148. package/dist/repertoire/mcp-client.js +254 -0
  149. package/dist/repertoire/mcp-manager.js +251 -0
  150. package/dist/repertoire/shell-sessions.js +133 -0
  151. package/dist/repertoire/skills.js +14 -23
  152. package/dist/repertoire/tasks/board.js +43 -5
  153. package/dist/repertoire/tasks/fix.js +182 -0
  154. package/dist/repertoire/tasks/index.js +28 -10
  155. package/dist/repertoire/tasks/lifecycle.js +2 -2
  156. package/dist/repertoire/tasks/parser.js +3 -2
  157. package/dist/repertoire/tasks/scanner.js +194 -37
  158. package/dist/repertoire/tasks/transitions.js +11 -28
  159. package/dist/repertoire/tools-base.js +35 -771
  160. package/dist/repertoire/tools-bluebubbles.js +94 -0
  161. package/dist/repertoire/tools-bridge.js +141 -0
  162. package/dist/repertoire/tools-config.js +266 -0
  163. package/dist/repertoire/tools-continuity.js +248 -0
  164. package/dist/repertoire/tools-credential.js +184 -0
  165. package/dist/repertoire/tools-files.js +342 -0
  166. package/dist/repertoire/tools-flow.js +62 -0
  167. package/dist/repertoire/tools-github.js +1 -6
  168. package/dist/repertoire/tools-memory.js +347 -0
  169. package/dist/repertoire/tools-session.js +740 -0
  170. package/dist/repertoire/tools-shell.js +120 -0
  171. package/dist/repertoire/tools-surface.js +242 -0
  172. package/dist/repertoire/tools-teams.js +12 -59
  173. package/dist/repertoire/tools-travel.js +125 -0
  174. package/dist/repertoire/tools.js +132 -124
  175. package/dist/repertoire/travel-api-client.js +214 -0
  176. package/dist/scripts/claude-code-hook.js +41 -0
  177. package/dist/scripts/claude-code-stop-hook.js +47 -0
  178. package/dist/senses/attention-queue.js +97 -0
  179. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +109 -10
  180. package/dist/senses/bluebubbles/entry.js +13 -0
  181. package/dist/senses/bluebubbles/inbound-log.js +109 -0
  182. package/dist/senses/bluebubbles/index.js +1359 -0
  183. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +119 -24
  184. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +13 -5
  185. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  186. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  187. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  188. package/dist/senses/cli/adapter.js +274 -0
  189. package/dist/senses/cli/ink-app.js +156 -0
  190. package/dist/senses/cli/inline-diff.js +64 -0
  191. package/dist/senses/cli/message-list.js +51 -0
  192. package/dist/senses/cli/ouro-tui.js +358 -0
  193. package/dist/senses/cli/spinner-imperative.js +135 -0
  194. package/dist/senses/cli/spinner.js +101 -0
  195. package/dist/senses/cli/status-line.js +60 -0
  196. package/dist/senses/cli/streaming-markdown.js +526 -0
  197. package/dist/senses/cli/tool-display.js +83 -0
  198. package/dist/senses/cli/tool-render.js +85 -0
  199. package/dist/senses/cli/tui-store.js +198 -0
  200. package/dist/senses/cli/virtual-list.js +35 -0
  201. package/dist/senses/cli-entry.js +1 -1
  202. package/dist/senses/cli-layout.js +187 -0
  203. package/dist/senses/cli.js +503 -244
  204. package/dist/senses/commands.js +65 -1
  205. package/dist/senses/continuity.js +94 -0
  206. package/dist/senses/habit-turn-message.js +108 -0
  207. package/dist/senses/inner-dialog-worker.js +112 -19
  208. package/dist/senses/inner-dialog.js +591 -84
  209. package/dist/senses/pipeline.js +559 -0
  210. package/dist/senses/shared-turn.js +196 -0
  211. package/dist/senses/surface-tool.js +68 -0
  212. package/dist/senses/teams.js +667 -120
  213. package/dist/senses/trust-gate.js +112 -2
  214. package/package.json +12 -6
  215. package/skills/browser-navigation.md +110 -0
  216. package/skills/configure-dev-tools.md +81 -0
  217. package/skills/travel-planning.md +138 -0
  218. package/dist/heart/daemon/subagent-installer.js +0 -134
  219. package/dist/senses/bluebubbles-entry.js +0 -11
  220. package/dist/senses/bluebubbles.js +0 -421
  221. package/dist/senses/debug-activity.js +0 -107
  222. package/subagents/README.md +0 -73
  223. package/subagents/work-doer.md +0 -235
  224. package/subagents/work-merger.md +0 -618
  225. package/subagents/work-planner.md +0 -382
  226. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  227. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  228. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  229. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  230. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  231. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  232. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  233. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  234. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  235. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  236. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  237. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +0 -0
  238. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  239. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  240. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  241. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
@@ -0,0 +1,316 @@
1
+ "use strict";
2
+ /**
3
+ * CLI output formatting and rendering helpers.
4
+ *
5
+ * Pure functions that transform data into human-readable CLI output.
6
+ * No side effects — callers handle writing to stdout.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.parseStatusPayload = parseStatusPayload;
43
+ exports.humanizeSenseName = humanizeSenseName;
44
+ exports.formatTable = formatTable;
45
+ exports.formatDaemonStatusOutput = formatDaemonStatusOutput;
46
+ exports.formatVersionOutput = formatVersionOutput;
47
+ exports.buildStoppedStatusPayload = buildStoppedStatusPayload;
48
+ exports.daemonUnavailableStatusOutput = daemonUnavailableStatusOutput;
49
+ exports.isDaemonUnavailableError = isDaemonUnavailableError;
50
+ exports.formatMcpResponse = formatMcpResponse;
51
+ const path = __importStar(require("path"));
52
+ const runtime_metadata_1 = require("./runtime-metadata");
53
+ const runtime_mode_1 = require("./runtime-mode");
54
+ const identity_1 = require("../identity");
55
+ const daemon_tombstone_1 = require("./daemon-tombstone");
56
+ const daemon_health_1 = require("./daemon-health");
57
+ // ── Field extractors ──
58
+ function stringField(value) {
59
+ return typeof value === "string" ? value : null;
60
+ }
61
+ function numberField(value) {
62
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
63
+ }
64
+ function booleanField(value) {
65
+ return typeof value === "boolean" ? value : null;
66
+ }
67
+ // ── Parsers ──
68
+ function parseStatusPayload(data) {
69
+ if (!data || typeof data !== "object" || Array.isArray(data))
70
+ return null;
71
+ const raw = data;
72
+ const overview = raw.overview;
73
+ const senses = raw.senses;
74
+ const workers = raw.workers;
75
+ if (!overview || typeof overview !== "object" || Array.isArray(overview))
76
+ return null;
77
+ if (!Array.isArray(senses) || !Array.isArray(workers))
78
+ return null;
79
+ const parsedOverview = {
80
+ daemon: stringField(overview.daemon) ?? "unknown",
81
+ health: stringField(overview.health) ?? "unknown",
82
+ socketPath: stringField(overview.socketPath) ?? "unknown",
83
+ outlookUrl: stringField(overview.outlookUrl) ?? "unavailable",
84
+ version: stringField(overview.version) ?? "unknown",
85
+ lastUpdated: stringField(overview.lastUpdated) ?? "unknown",
86
+ repoRoot: stringField(overview.repoRoot) ?? "unknown",
87
+ configFingerprint: stringField(overview.configFingerprint) ?? "unknown",
88
+ workerCount: numberField(overview.workerCount) ?? 0,
89
+ senseCount: numberField(overview.senseCount) ?? 0,
90
+ entryPath: stringField(overview.entryPath) ?? "unknown",
91
+ mode: stringField(overview.mode) ?? "unknown",
92
+ };
93
+ const parsedSenses = senses.map((entry) => {
94
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
95
+ return null;
96
+ const row = entry;
97
+ const agent = stringField(row.agent);
98
+ const sense = stringField(row.sense);
99
+ const status = stringField(row.status);
100
+ const detail = stringField(row.detail);
101
+ const enabled = booleanField(row.enabled);
102
+ if (!agent || !sense || !status || detail === null || enabled === null)
103
+ return null;
104
+ return {
105
+ agent,
106
+ sense,
107
+ label: stringField(row.label) ?? undefined,
108
+ enabled,
109
+ status,
110
+ detail,
111
+ };
112
+ });
113
+ const parsedWorkers = workers.map((entry) => {
114
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
115
+ return null;
116
+ const row = entry;
117
+ const agent = stringField(row.agent);
118
+ const worker = stringField(row.worker);
119
+ const status = stringField(row.status);
120
+ const restartCount = numberField(row.restartCount);
121
+ const hasPid = Object.prototype.hasOwnProperty.call(row, "pid");
122
+ const pid = row.pid === null ? null : numberField(row.pid);
123
+ const pidInvalid = !hasPid || (row.pid !== null && pid === null);
124
+ if (!agent || !worker || !status || restartCount === null || pidInvalid)
125
+ return null;
126
+ return {
127
+ agent,
128
+ worker,
129
+ status,
130
+ pid,
131
+ restartCount,
132
+ lastExitCode: numberField(row.lastExitCode) ?? null,
133
+ lastSignal: stringField(row.lastSignal) ?? null,
134
+ };
135
+ });
136
+ if (parsedSenses.some((row) => row === null) || parsedWorkers.some((row) => row === null))
137
+ return null;
138
+ return {
139
+ overview: parsedOverview,
140
+ senses: parsedSenses,
141
+ workers: parsedWorkers,
142
+ };
143
+ }
144
+ // ── Formatters ──
145
+ function humanizeSenseName(sense, label) {
146
+ if (label)
147
+ return label;
148
+ if (sense === "cli")
149
+ return "CLI";
150
+ if (sense === "bluebubbles")
151
+ return "BlueBubbles";
152
+ if (sense === "teams")
153
+ return "Teams";
154
+ return sense;
155
+ }
156
+ function formatTable(headers, rows) {
157
+ const widths = headers.map((header, index) => Math.max(header.length, ...rows.map((row) => row[index].length)));
158
+ const renderRow = (row) => `| ${row.map((cell, index) => (index === row.length - 1
159
+ ? cell
160
+ : cell.padEnd(widths[index]))).join(" | ")} |`;
161
+ const divider = `|-${widths.map((width) => "-".repeat(width)).join("-|-")}-|`;
162
+ return [
163
+ renderRow(headers),
164
+ divider,
165
+ ...rows.map(renderRow),
166
+ ].join("\n");
167
+ }
168
+ function formatDaemonStatusOutput(response, fallback) {
169
+ const payload = parseStatusPayload(response.data);
170
+ if (!payload)
171
+ return fallback;
172
+ const overviewRows = [
173
+ ["Daemon", payload.overview.daemon],
174
+ ["Socket", payload.overview.socketPath],
175
+ ["Version", payload.overview.version],
176
+ ["Last Updated", payload.overview.lastUpdated],
177
+ ["Outlook", payload.overview.outlookUrl],
178
+ ["Entry Path", payload.overview.entryPath],
179
+ ["Mode", payload.overview.mode],
180
+ ["Workers", String(payload.overview.workerCount)],
181
+ ["Senses", String(payload.overview.senseCount)],
182
+ ["Health", payload.overview.health],
183
+ ];
184
+ const senseRows = payload.senses.map((row) => [
185
+ row.agent,
186
+ humanizeSenseName(row.sense, row.label),
187
+ row.enabled ? "ON" : "OFF",
188
+ row.status,
189
+ row.detail,
190
+ ]);
191
+ const workerRows = payload.workers.map((row) => {
192
+ /* v8 ignore start — exit info branches tested via daemon-crash-context; v8 misreports conditional chains @preserve */
193
+ let exitInfo = "n/a";
194
+ if (row.lastExitCode !== null)
195
+ exitInfo = `code=${row.lastExitCode}`;
196
+ if (row.lastSignal !== null)
197
+ exitInfo = row.lastExitCode !== null ? `code=${row.lastExitCode} sig=${row.lastSignal}` : `sig=${row.lastSignal}`;
198
+ /* v8 ignore stop */
199
+ return [
200
+ row.agent,
201
+ row.worker,
202
+ row.status,
203
+ row.pid === null ? "n/a" : String(row.pid),
204
+ String(row.restartCount),
205
+ exitInfo,
206
+ ];
207
+ });
208
+ return [
209
+ "Overview",
210
+ formatTable(["Item", "Value"], overviewRows),
211
+ "",
212
+ "Senses",
213
+ formatTable(["Agent", "Sense", "Enabled", "State", "Detail"], senseRows),
214
+ "",
215
+ "Workers",
216
+ formatTable(["Agent", "Worker", "State", "PID", "Restarts", "Last Exit"], workerRows),
217
+ ].join("\n");
218
+ }
219
+ function formatVersionOutput() {
220
+ const version = (0, runtime_metadata_1.getRuntimeMetadata)().version;
221
+ const mode = (0, runtime_mode_1.detectRuntimeMode)((0, identity_1.getRepoRoot)());
222
+ /* v8 ignore start — cosmetic display toggle; dev mode always true in test env */
223
+ return mode === "dev" ? `${version} (dev)` : version;
224
+ /* v8 ignore stop */
225
+ }
226
+ function buildStoppedStatusPayload(socketPath) {
227
+ const metadata = (0, runtime_metadata_1.getRuntimeMetadata)();
228
+ const repoRoot = (0, identity_1.getRepoRoot)();
229
+ return {
230
+ overview: {
231
+ daemon: "stopped",
232
+ health: "warn",
233
+ socketPath,
234
+ outlookUrl: "unavailable",
235
+ version: metadata.version,
236
+ lastUpdated: metadata.lastUpdated,
237
+ repoRoot: metadata.repoRoot,
238
+ configFingerprint: metadata.configFingerprint,
239
+ workerCount: 0,
240
+ senseCount: 0,
241
+ entryPath: path.join(repoRoot, "dist", "heart", "daemon", "daemon-entry.js"),
242
+ mode: (0, runtime_mode_1.detectRuntimeMode)(repoRoot),
243
+ },
244
+ senses: [],
245
+ workers: [],
246
+ };
247
+ }
248
+ function daemonUnavailableStatusOutput(socketPath, healthFilePath) {
249
+ /* v8 ignore start — tombstone read tested in daemon-status-tombstone.test; branch misreported @preserve */
250
+ const tombstone = (0, daemon_tombstone_1.readDaemonTombstone)();
251
+ const deathLine = tombstone
252
+ ? `Last death: ${tombstone.timestamp} -- ${tombstone.reason}: ${tombstone.message}`
253
+ : null;
254
+ /* v8 ignore stop */
255
+ const lines = [
256
+ formatDaemonStatusOutput({
257
+ ok: true,
258
+ summary: "daemon not running",
259
+ data: buildStoppedStatusPayload(socketPath),
260
+ }, "daemon not running"),
261
+ "",
262
+ ];
263
+ /* v8 ignore start — tombstone presence requires real daemon crash @preserve */
264
+ if (deathLine) {
265
+ lines.push(deathLine);
266
+ lines.push("");
267
+ /* v8 ignore stop */
268
+ }
269
+ // Read health file for last-known state (best-effort)
270
+ const resolvedHealthPath = healthFilePath ?? (0, daemon_health_1.getDefaultHealthPath)();
271
+ const health = (0, daemon_health_1.readHealth)(resolvedHealthPath);
272
+ if (health) {
273
+ lines.push(`Last known status: ${health.status} (pid ${health.pid}, uptime ${health.uptimeSeconds}s)`);
274
+ if (health.safeMode?.active) {
275
+ lines.push(`SAFE MODE: ${health.safeMode.reason}`);
276
+ }
277
+ if (health.degraded.length > 0) {
278
+ lines.push("");
279
+ lines.push("Degraded:");
280
+ for (const d of health.degraded) {
281
+ lines.push(` ${d.component}: ${d.reason} (since ${d.since})`);
282
+ }
283
+ }
284
+ lines.push("");
285
+ }
286
+ lines.push("daemon not running; run `ouro up`");
287
+ return lines.join("\n");
288
+ }
289
+ function isDaemonUnavailableError(error) {
290
+ const code = typeof error === "object" && error !== null && "code" in error
291
+ ? String(error.code ?? "")
292
+ : "";
293
+ return code === "ENOENT" || code === "ECONNREFUSED";
294
+ }
295
+ function formatMcpResponse(command, response) {
296
+ if (command.kind === "mcp.list") {
297
+ const allTools = response.data;
298
+ if (!allTools || allTools.length === 0) {
299
+ return response.message ?? "no tools available from connected MCP servers";
300
+ }
301
+ const lines = [];
302
+ for (const entry of allTools) {
303
+ lines.push(`[${entry.server}]`);
304
+ for (const tool of entry.tools) {
305
+ lines.push(` ${tool.name}: ${tool.description}`);
306
+ }
307
+ }
308
+ return lines.join("\n");
309
+ }
310
+ // mcp.call
311
+ const result = response.data;
312
+ if (!result) {
313
+ return response.message ?? "no result";
314
+ }
315
+ return result.content.map((c) => c.text).join("\n");
316
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * CLI command types and dependency interface.
4
+ *
5
+ * Extracted from daemon-cli.ts — the OuroCliCommand union and OuroCliDeps
6
+ * interface are the contract between parsing, execution, and default wiring.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });