@ouro.bot/cli 0.0.1-alpha.0 → 0.1.0-alpha.10

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 (129) hide show
  1. package/AdoptionSpecialist.ouro/agent.json +20 -0
  2. package/AdoptionSpecialist.ouro/psyche/SOUL.md +24 -0
  3. package/AdoptionSpecialist.ouro/psyche/identities/basilisk.md +31 -0
  4. package/AdoptionSpecialist.ouro/psyche/identities/jafar.md +31 -0
  5. package/AdoptionSpecialist.ouro/psyche/identities/jormungandr.md +31 -0
  6. package/AdoptionSpecialist.ouro/psyche/identities/kaa.md +31 -0
  7. package/AdoptionSpecialist.ouro/psyche/identities/medusa.md +31 -0
  8. package/AdoptionSpecialist.ouro/psyche/identities/monty.md +31 -0
  9. package/AdoptionSpecialist.ouro/psyche/identities/nagini.md +31 -0
  10. package/AdoptionSpecialist.ouro/psyche/identities/ouroboros.md +31 -0
  11. package/AdoptionSpecialist.ouro/psyche/identities/python.md +31 -0
  12. package/AdoptionSpecialist.ouro/psyche/identities/quetzalcoatl.md +31 -0
  13. package/AdoptionSpecialist.ouro/psyche/identities/sir-hiss.md +31 -0
  14. package/AdoptionSpecialist.ouro/psyche/identities/the-serpent.md +31 -0
  15. package/AdoptionSpecialist.ouro/psyche/identities/the-snake.md +31 -0
  16. package/README.md +224 -6
  17. package/dist/heart/agent-entry.js +17 -0
  18. package/dist/heart/api-error.js +34 -0
  19. package/dist/heart/config.js +330 -0
  20. package/dist/heart/core.js +524 -0
  21. package/dist/heart/daemon/daemon-cli.js +884 -0
  22. package/dist/heart/daemon/daemon-entry.js +74 -0
  23. package/dist/heart/daemon/daemon.js +313 -0
  24. package/dist/heart/daemon/hatch-animation.js +28 -0
  25. package/dist/heart/daemon/hatch-flow.js +286 -0
  26. package/dist/heart/daemon/hatch-specialist.js +112 -0
  27. package/dist/heart/daemon/health-monitor.js +79 -0
  28. package/dist/heart/daemon/log-tailer.js +146 -0
  29. package/dist/heart/daemon/message-router.js +98 -0
  30. package/dist/heart/daemon/os-cron.js +260 -0
  31. package/dist/heart/daemon/ouro-bot-entry.js +23 -0
  32. package/dist/heart/daemon/ouro-bot-wrapper.js +91 -0
  33. package/dist/heart/daemon/ouro-entry.js +23 -0
  34. package/dist/heart/daemon/ouro-uti.js +212 -0
  35. package/dist/heart/daemon/process-manager.js +237 -0
  36. package/dist/heart/daemon/runtime-logging.js +102 -0
  37. package/dist/heart/daemon/specialist-orchestrator.js +161 -0
  38. package/dist/heart/daemon/specialist-prompt.js +56 -0
  39. package/dist/heart/daemon/specialist-session.js +150 -0
  40. package/dist/heart/daemon/specialist-tools.js +132 -0
  41. package/dist/heart/daemon/subagent-installer.js +125 -0
  42. package/dist/heart/daemon/task-scheduler.js +240 -0
  43. package/dist/heart/harness.js +26 -0
  44. package/dist/heart/identity.js +295 -0
  45. package/dist/heart/kicks.js +144 -0
  46. package/dist/heart/primitives.js +4 -0
  47. package/dist/heart/providers/anthropic.js +332 -0
  48. package/dist/heart/providers/azure.js +66 -0
  49. package/dist/heart/providers/minimax.js +53 -0
  50. package/dist/heart/providers/openai-codex.js +162 -0
  51. package/dist/heart/streaming.js +415 -0
  52. package/dist/heart/turn-coordinator.js +62 -0
  53. package/dist/inner-worker-entry.js +4 -0
  54. package/dist/mind/associative-recall.js +197 -0
  55. package/dist/mind/bundle-manifest.js +118 -0
  56. package/dist/mind/context.js +302 -0
  57. package/dist/mind/first-impressions.js +43 -0
  58. package/dist/mind/format.js +56 -0
  59. package/dist/mind/friends/channel.js +49 -0
  60. package/dist/mind/friends/resolver.js +84 -0
  61. package/dist/mind/friends/store-file.js +171 -0
  62. package/dist/mind/friends/store.js +4 -0
  63. package/dist/mind/friends/tokens.js +26 -0
  64. package/dist/mind/friends/types.js +21 -0
  65. package/dist/mind/memory.js +388 -0
  66. package/dist/mind/pending.js +93 -0
  67. package/dist/mind/phrases.js +43 -0
  68. package/dist/mind/prompt-refresh.js +20 -0
  69. package/dist/mind/prompt.js +355 -0
  70. package/dist/mind/token-estimate.js +119 -0
  71. package/dist/nerves/cli-logging.js +31 -0
  72. package/dist/nerves/coverage/audit-rules.js +81 -0
  73. package/dist/nerves/coverage/audit.js +200 -0
  74. package/dist/nerves/coverage/cli-main.js +5 -0
  75. package/dist/nerves/coverage/cli.js +51 -0
  76. package/dist/nerves/coverage/contract.js +23 -0
  77. package/dist/nerves/coverage/file-completeness.js +56 -0
  78. package/dist/nerves/coverage/run-artifacts.js +77 -0
  79. package/dist/nerves/coverage/source-scanner.js +34 -0
  80. package/dist/nerves/index.js +152 -0
  81. package/dist/nerves/runtime.js +38 -0
  82. package/dist/repertoire/ado-client.js +211 -0
  83. package/dist/repertoire/ado-context.js +73 -0
  84. package/dist/repertoire/ado-semantic.js +841 -0
  85. package/dist/repertoire/ado-templates.js +146 -0
  86. package/dist/repertoire/coding/index.js +36 -0
  87. package/dist/repertoire/coding/manager.js +489 -0
  88. package/dist/repertoire/coding/monitor.js +60 -0
  89. package/dist/repertoire/coding/reporter.js +45 -0
  90. package/dist/repertoire/coding/spawner.js +102 -0
  91. package/dist/repertoire/coding/tools.js +167 -0
  92. package/dist/repertoire/coding/types.js +2 -0
  93. package/dist/repertoire/data/ado-endpoints.json +122 -0
  94. package/dist/repertoire/data/graph-endpoints.json +212 -0
  95. package/dist/repertoire/github-client.js +64 -0
  96. package/dist/repertoire/graph-client.js +118 -0
  97. package/dist/repertoire/skills.js +156 -0
  98. package/dist/repertoire/tasks/board.js +122 -0
  99. package/dist/repertoire/tasks/index.js +210 -0
  100. package/dist/repertoire/tasks/lifecycle.js +80 -0
  101. package/dist/repertoire/tasks/middleware.js +65 -0
  102. package/dist/repertoire/tasks/parser.js +173 -0
  103. package/dist/repertoire/tasks/scanner.js +132 -0
  104. package/dist/repertoire/tasks/transitions.js +145 -0
  105. package/dist/repertoire/tasks/types.js +2 -0
  106. package/dist/repertoire/tools-base.js +714 -0
  107. package/dist/repertoire/tools-github.js +53 -0
  108. package/dist/repertoire/tools-teams.js +308 -0
  109. package/dist/repertoire/tools.js +199 -0
  110. package/dist/senses/bluebubbles-client.js +279 -0
  111. package/dist/senses/bluebubbles-entry.js +11 -0
  112. package/dist/senses/bluebubbles-model.js +253 -0
  113. package/dist/senses/bluebubbles-mutation-log.js +76 -0
  114. package/dist/senses/bluebubbles.js +332 -0
  115. package/dist/senses/cli-entry.js +15 -0
  116. package/dist/senses/cli.js +604 -0
  117. package/dist/senses/commands.js +98 -0
  118. package/dist/senses/inner-dialog-worker.js +61 -0
  119. package/dist/senses/inner-dialog.js +231 -0
  120. package/dist/senses/session-lock.js +119 -0
  121. package/dist/senses/teams-entry.js +15 -0
  122. package/dist/senses/teams.js +696 -0
  123. package/dist/senses/trust-gate.js +150 -0
  124. package/package.json +35 -11
  125. package/subagents/README.md +73 -0
  126. package/subagents/work-doer.md +233 -0
  127. package/subagents/work-merger.md +624 -0
  128. package/subagents/work-planner.md +373 -0
  129. package/bin/ouro.js +0 -6
@@ -0,0 +1,98 @@
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.FileMessageRouter = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ const runtime_1 = require("../../nerves/runtime");
41
+ function messageId(nowIso) {
42
+ return `msg-${nowIso.replace(/[^0-9]/g, "")}`;
43
+ }
44
+ class FileMessageRouter {
45
+ baseDir;
46
+ now;
47
+ constructor(options = {}) {
48
+ this.baseDir = options.baseDir ?? path.join(os.homedir(), ".agentstate", "messages");
49
+ this.now = options.now ?? (() => new Date().toISOString());
50
+ fs.mkdirSync(this.baseDir, { recursive: true });
51
+ }
52
+ async send(input) {
53
+ const queuedAt = this.now();
54
+ const id = messageId(queuedAt);
55
+ const message = {
56
+ id,
57
+ from: input.from,
58
+ to: input.to,
59
+ content: input.content,
60
+ queuedAt,
61
+ priority: input.priority ?? "normal",
62
+ sessionId: input.sessionId,
63
+ taskRef: input.taskRef,
64
+ };
65
+ const inboxPath = this.inboxPath(input.to);
66
+ fs.appendFileSync(inboxPath, `${JSON.stringify(message)}\n`, "utf-8");
67
+ (0, runtime_1.emitNervesEvent)({
68
+ component: "daemon",
69
+ event: "daemon.message_queued",
70
+ message: "queued inter-agent message",
71
+ meta: { id, from: input.from, to: input.to },
72
+ });
73
+ return { id, queuedAt };
74
+ }
75
+ pollInbox(agent) {
76
+ const inboxPath = this.inboxPath(agent);
77
+ if (!fs.existsSync(inboxPath))
78
+ return [];
79
+ const raw = fs.readFileSync(inboxPath, "utf-8");
80
+ fs.writeFileSync(inboxPath, "", "utf-8");
81
+ const messages = raw
82
+ .split("\n")
83
+ .map((line) => line.trim())
84
+ .filter((line) => line.length > 0)
85
+ .map((line) => JSON.parse(line));
86
+ (0, runtime_1.emitNervesEvent)({
87
+ component: "daemon",
88
+ event: "daemon.message_polled",
89
+ message: "polled inter-agent inbox",
90
+ meta: { agent, messageCount: messages.length },
91
+ });
92
+ return messages;
93
+ }
94
+ inboxPath(agent) {
95
+ return path.join(this.baseDir, `${agent}-inbox.jsonl`);
96
+ }
97
+ }
98
+ exports.FileMessageRouter = FileMessageRouter;
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CrontabCronManager = exports.LaunchdCronManager = void 0;
37
+ exports.createOsCronManager = createOsCronManager;
38
+ exports.cadenceToSeconds = cadenceToSeconds;
39
+ exports.scheduleToCalendarInterval = scheduleToCalendarInterval;
40
+ exports.generatePlistXml = generatePlistXml;
41
+ exports.plistLabel = plistLabel;
42
+ exports.crontabLine = crontabLine;
43
+ const os = __importStar(require("os"));
44
+ const runtime_1 = require("../../nerves/runtime");
45
+ const PLIST_PREFIX = "bot.ouro.";
46
+ function plistLabel(job) {
47
+ return `${PLIST_PREFIX}${job.agent}.${job.taskId}`;
48
+ }
49
+ function cadenceToSeconds(schedule) {
50
+ const parts = schedule.trim().split(/\s+/);
51
+ if (parts.length !== 5)
52
+ return null;
53
+ const [minute, hour, day, month, weekday] = parts;
54
+ // Simple interval patterns only
55
+ if (month !== "*" || weekday !== "*" || day !== "*")
56
+ return null;
57
+ const everyNMinutes = /^\*\/(\d+)$/.exec(minute);
58
+ if (everyNMinutes && hour === "*") {
59
+ return parseInt(everyNMinutes[1], 10) * 60;
60
+ }
61
+ const everyNHours = /^\*\/(\d+)$/.exec(hour);
62
+ if (everyNHours && minute === "0") {
63
+ return parseInt(everyNHours[1], 10) * 3600;
64
+ }
65
+ return null;
66
+ }
67
+ function scheduleToCalendarInterval(schedule) {
68
+ const parts = schedule.trim().split(/\s+/);
69
+ if (parts.length !== 5)
70
+ return null;
71
+ const [minute, hour, day, month] = parts;
72
+ const result = {};
73
+ if (minute !== "*" && !/^\*\//.test(minute))
74
+ result.Minute = parseInt(minute, 10);
75
+ if (hour !== "*" && !/^\*\//.test(hour))
76
+ result.Hour = parseInt(hour, 10);
77
+ if (day !== "*")
78
+ result.Day = parseInt(day, 10);
79
+ if (month !== "*")
80
+ result.Month = parseInt(month, 10);
81
+ return Object.keys(result).length > 0 ? result : null;
82
+ }
83
+ function generatePlistXml(job) {
84
+ const label = plistLabel(job);
85
+ const seconds = cadenceToSeconds(job.schedule);
86
+ const calendar = seconds === null ? scheduleToCalendarInterval(job.schedule) : null;
87
+ let triggerXml;
88
+ if (seconds !== null) {
89
+ triggerXml = ` <key>StartInterval</key>\n <integer>${seconds}</integer>`;
90
+ }
91
+ else if (calendar !== null) {
92
+ const entries = Object.entries(calendar)
93
+ .map(([k, v]) => ` <key>${k}</key>\n <integer>${v}</integer>`)
94
+ .join("\n");
95
+ triggerXml = ` <key>StartCalendarInterval</key>\n <dict>\n${entries}\n </dict>`;
96
+ }
97
+ else {
98
+ triggerXml = ` <key>StartInterval</key>\n <integer>1800</integer>`;
99
+ }
100
+ return [
101
+ `<?xml version="1.0" encoding="UTF-8"?>`,
102
+ `<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">`,
103
+ `<plist version="1.0">`,
104
+ `<dict>`,
105
+ ` <key>Label</key>`,
106
+ ` <string>${label}</string>`,
107
+ ` <key>ProgramArguments</key>`,
108
+ ` <array>`,
109
+ ` <string>${job.command.split(" ")[0]}</string>`,
110
+ ...job.command.split(" ").slice(1).map((arg) => ` <string>${arg}</string>`),
111
+ ` </array>`,
112
+ triggerXml,
113
+ ` <key>StandardOutPath</key>`,
114
+ ` <string>/tmp/${label}.stdout.log</string>`,
115
+ ` <key>StandardErrorPath</key>`,
116
+ ` <string>/tmp/${label}.stderr.log</string>`,
117
+ `</dict>`,
118
+ `</plist>`,
119
+ ``,
120
+ ].join("\n");
121
+ }
122
+ class LaunchdCronManager {
123
+ deps;
124
+ constructor(deps) {
125
+ this.deps = deps;
126
+ }
127
+ get launchAgentsDir() {
128
+ return `${this.deps.homeDir}/Library/LaunchAgents`;
129
+ }
130
+ sync(jobs) {
131
+ this.deps.mkdirp(this.launchAgentsDir);
132
+ const desiredLabels = new Set(jobs.map(plistLabel));
133
+ // Remove stale plists
134
+ const existing = this.listPlistFiles();
135
+ for (const filename of existing) {
136
+ const label = filename.replace(".plist", "");
137
+ if (!desiredLabels.has(label)) {
138
+ const fullPath = `${this.launchAgentsDir}/${filename}`;
139
+ try {
140
+ this.deps.exec(`launchctl unload "${fullPath}"`);
141
+ }
142
+ catch { /* best effort */ }
143
+ this.deps.removeFile(fullPath);
144
+ }
145
+ }
146
+ // Write current plists
147
+ for (const job of jobs) {
148
+ const label = plistLabel(job);
149
+ const filename = `${label}.plist`;
150
+ const fullPath = `${this.launchAgentsDir}/${filename}`;
151
+ const xml = generatePlistXml(job);
152
+ try {
153
+ this.deps.exec(`launchctl unload "${fullPath}"`);
154
+ }
155
+ catch { /* best effort */ }
156
+ this.deps.writeFile(fullPath, xml);
157
+ try {
158
+ this.deps.exec(`launchctl load "${fullPath}"`);
159
+ }
160
+ catch { /* best effort */ }
161
+ }
162
+ (0, runtime_1.emitNervesEvent)({ component: "daemon", event: "daemon.os_cron_synced", message: "synced OS cron entries", meta: { platform: "darwin", jobCount: jobs.length } });
163
+ }
164
+ removeAll() {
165
+ const existing = this.listPlistFiles();
166
+ for (const filename of existing) {
167
+ const fullPath = `${this.launchAgentsDir}/${filename}`;
168
+ try {
169
+ this.deps.exec(`launchctl unload "${fullPath}"`);
170
+ }
171
+ catch { /* best effort */ }
172
+ this.deps.removeFile(fullPath);
173
+ }
174
+ }
175
+ list() {
176
+ return this.listPlistFiles().map((f) => f.replace(".plist", ""));
177
+ }
178
+ listPlistFiles() {
179
+ if (!this.deps.existsFile(this.launchAgentsDir))
180
+ return [];
181
+ return this.deps.listDir(this.launchAgentsDir).filter((f) => f.startsWith(PLIST_PREFIX) && f.endsWith(".plist"));
182
+ }
183
+ }
184
+ exports.LaunchdCronManager = LaunchdCronManager;
185
+ const CRONTAB_MARKER_PREFIX = "# ouro:";
186
+ function crontabLine(job) {
187
+ return `${CRONTAB_MARKER_PREFIX}${job.id}\n${job.schedule} ${job.command}`;
188
+ }
189
+ class CrontabCronManager {
190
+ deps;
191
+ constructor(deps) {
192
+ this.deps = deps;
193
+ }
194
+ sync(jobs) {
195
+ const currentLines = this.readCrontab();
196
+ const cleaned = this.removeOuroLines(currentLines);
197
+ const newLines = jobs.map(crontabLine);
198
+ const combined = [...cleaned, ...newLines].join("\n").trim();
199
+ this.deps.execWrite("crontab -", combined ? `${combined}\n` : "");
200
+ }
201
+ removeAll() {
202
+ const currentLines = this.readCrontab();
203
+ const cleaned = this.removeOuroLines(currentLines);
204
+ const combined = cleaned.join("\n").trim();
205
+ this.deps.execWrite("crontab -", combined ? `${combined}\n` : "");
206
+ }
207
+ list() {
208
+ const lines = this.readCrontab();
209
+ return lines
210
+ .filter((l) => l.startsWith(CRONTAB_MARKER_PREFIX))
211
+ .map((l) => l.slice(CRONTAB_MARKER_PREFIX.length));
212
+ }
213
+ readCrontab() {
214
+ try {
215
+ return this.deps.execOutput("crontab -l").split("\n");
216
+ }
217
+ catch {
218
+ return [];
219
+ }
220
+ }
221
+ removeOuroLines(lines) {
222
+ const result = [];
223
+ let skipNext = false;
224
+ for (const line of lines) {
225
+ if (line.startsWith(CRONTAB_MARKER_PREFIX)) {
226
+ skipNext = true;
227
+ continue;
228
+ }
229
+ if (skipNext) {
230
+ skipNext = false;
231
+ continue;
232
+ }
233
+ result.push(line);
234
+ }
235
+ return result;
236
+ }
237
+ }
238
+ exports.CrontabCronManager = CrontabCronManager;
239
+ function createOsCronManager(options = {}) {
240
+ const platform = options.platform ?? process.platform;
241
+ if (platform === "darwin") {
242
+ /* v8 ignore start -- integration: default stubs for real OS operations @preserve */
243
+ const deps = options.launchdDeps ?? {
244
+ exec: () => { },
245
+ writeFile: () => { },
246
+ removeFile: () => { },
247
+ existsFile: () => false,
248
+ listDir: () => [],
249
+ mkdirp: () => { },
250
+ homeDir: os.homedir(),
251
+ };
252
+ /* v8 ignore stop */
253
+ return new LaunchdCronManager(deps);
254
+ }
255
+ const deps = options.crontabDeps ?? {
256
+ execOutput: () => "",
257
+ execWrite: () => { },
258
+ };
259
+ return new CrontabCronManager(deps);
260
+ }
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const runtime_1 = require("../../nerves/runtime");
5
+ const runtime_logging_1 = require("./runtime-logging");
6
+ const ouro_bot_wrapper_1 = require("./ouro-bot-wrapper");
7
+ (0, runtime_logging_1.configureDaemonRuntimeLogger)("ouro-bot");
8
+ (0, runtime_1.emitNervesEvent)({
9
+ component: "daemon",
10
+ event: "daemon.ouro_bot_entry_start",
11
+ message: "starting ouro.bot wrapper entrypoint",
12
+ meta: { args: process.argv.slice(2) },
13
+ });
14
+ void (0, ouro_bot_wrapper_1.runOuroBotWrapper)(process.argv.slice(2)).catch((error) => {
15
+ (0, runtime_1.emitNervesEvent)({
16
+ level: "error",
17
+ component: "daemon",
18
+ event: "daemon.ouro_bot_entry_error",
19
+ message: "ouro.bot wrapper entrypoint failed",
20
+ meta: { error: error instanceof Error ? error.message : String(error) },
21
+ });
22
+ process.exit(1);
23
+ });
@@ -0,0 +1,91 @@
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.runOuroBotWrapper = runOuroBotWrapper;
37
+ const runtime_1 = require("../../nerves/runtime");
38
+ const daemon_cli_1 = require("./daemon-cli");
39
+ async function defaultLoadCanonicalRunner() {
40
+ // Use the subpath export so we get the daemon-cli module directly,
41
+ // NOT the root entry point which has side-effects (immediately runs the CLI).
42
+ const specifier = "@ouro.bot/cli/runOuroCli";
43
+ const loaded = await Promise.resolve(`${specifier}`).then(s => __importStar(require(s)));
44
+ const candidate = Object.prototype.hasOwnProperty.call(loaded, "runOuroCli")
45
+ ? loaded["runOuroCli"]
46
+ : undefined;
47
+ if (typeof candidate === "function") {
48
+ return candidate;
49
+ }
50
+ throw new Error("@ouro.bot/cli/runOuroCli does not export runOuroCli");
51
+ }
52
+ function defaultWriteStdout(_text) {
53
+ // Wrapper is intentionally silent by default to avoid duplicate terminal output.
54
+ }
55
+ async function runOuroBotWrapper(args, deps = {}) {
56
+ (0, runtime_1.emitNervesEvent)({
57
+ component: "daemon",
58
+ event: "daemon.ouro_bot_wrapper_start",
59
+ message: "starting ouro.bot wrapper delegation",
60
+ meta: { args },
61
+ });
62
+ const loadCanonicalRunner = deps.loadCanonicalRunner ?? defaultLoadCanonicalRunner;
63
+ const fallbackRunCli = deps.fallbackRunCli ?? daemon_cli_1.runOuroCli;
64
+ const writeStdout = deps.writeStdout ?? defaultWriteStdout;
65
+ let delegatedTo = "@ouro.bot/cli";
66
+ let runner = fallbackRunCli;
67
+ try {
68
+ runner = await loadCanonicalRunner();
69
+ }
70
+ catch (error) {
71
+ delegatedTo = "local-fallback";
72
+ (0, runtime_1.emitNervesEvent)({
73
+ level: "warn",
74
+ component: "daemon",
75
+ event: "daemon.ouro_bot_wrapper_fallback",
76
+ message: "canonical ouro.bot package unavailable; falling back to local CLI",
77
+ meta: { error: error instanceof Error ? error.message : String(error) },
78
+ });
79
+ }
80
+ const result = await runner(args);
81
+ if (result.trim().length > 0) {
82
+ writeStdout(result);
83
+ }
84
+ (0, runtime_1.emitNervesEvent)({
85
+ component: "daemon",
86
+ event: "daemon.ouro_bot_wrapper_end",
87
+ message: "completed ouro.bot wrapper delegation",
88
+ meta: { delegatedTo },
89
+ });
90
+ return result;
91
+ }
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const runtime_1 = require("../../nerves/runtime");
5
+ const daemon_cli_1 = require("./daemon-cli");
6
+ const runtime_logging_1 = require("./runtime-logging");
7
+ (0, runtime_logging_1.configureDaemonRuntimeLogger)("ouro");
8
+ (0, runtime_1.emitNervesEvent)({
9
+ component: "daemon",
10
+ event: "daemon.cli_entry_start",
11
+ message: "starting ouro CLI entrypoint",
12
+ meta: { args: process.argv.slice(2) },
13
+ });
14
+ void (0, daemon_cli_1.runOuroCli)(process.argv.slice(2)).catch((error) => {
15
+ (0, runtime_1.emitNervesEvent)({
16
+ level: "error",
17
+ component: "daemon",
18
+ event: "daemon.cli_entry_error",
19
+ message: "ouro CLI entrypoint failed",
20
+ meta: { error: error instanceof Error ? error.message : String(error) },
21
+ });
22
+ process.exit(1);
23
+ });