@ashlr/hub 2.2.0 → 3.0.0

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 (177) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +59 -2
  3. package/dist/api/plugin.d.ts +1 -0
  4. package/dist/cli/backlog.js +2 -0
  5. package/dist/cli/backlog.js.map +1 -1
  6. package/dist/cli/digest.d.ts +6 -0
  7. package/dist/cli/digest.js +127 -2
  8. package/dist/cli/digest.js.map +1 -1
  9. package/dist/cli/eval-fixtures.d.ts +18 -0
  10. package/dist/cli/eval-fixtures.js +38 -0
  11. package/dist/cli/eval-fixtures.js.map +1 -0
  12. package/dist/cli/eval.d.ts +56 -0
  13. package/dist/cli/eval.js +283 -0
  14. package/dist/cli/eval.js.map +1 -0
  15. package/dist/cli/fleet.d.ts +27 -0
  16. package/dist/cli/fleet.js +222 -0
  17. package/dist/cli/fleet.js.map +1 -0
  18. package/dist/cli/goal.d.ts +15 -0
  19. package/dist/cli/goal.js +91 -0
  20. package/dist/cli/goal.js.map +1 -0
  21. package/dist/cli/help.js +10 -3
  22. package/dist/cli/help.js.map +1 -1
  23. package/dist/cli/inbox.d.ts +6 -0
  24. package/dist/cli/inbox.js +183 -8
  25. package/dist/cli/inbox.js.map +1 -1
  26. package/dist/cli/index.js +42 -0
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/cli/loop.d.ts +16 -0
  29. package/dist/cli/loop.js +66 -0
  30. package/dist/cli/loop.js.map +1 -0
  31. package/dist/cli/mcp.d.ts +12 -0
  32. package/dist/cli/mcp.js +148 -0
  33. package/dist/cli/mcp.js.map +1 -1
  34. package/dist/cli/onboard.d.ts +16 -0
  35. package/dist/cli/onboard.js +71 -0
  36. package/dist/cli/onboard.js.map +1 -1
  37. package/dist/cli/plugins.js +9 -8
  38. package/dist/cli/plugins.js.map +1 -1
  39. package/dist/cli/pulse.d.ts +10 -0
  40. package/dist/cli/pulse.js +261 -0
  41. package/dist/cli/pulse.js.map +1 -1
  42. package/dist/cli/run.js +21 -3
  43. package/dist/cli/run.js.map +1 -1
  44. package/dist/cli/stack.d.ts +34 -0
  45. package/dist/cli/stack.js +221 -0
  46. package/dist/cli/stack.js.map +1 -0
  47. package/dist/cli/update.js +12 -5
  48. package/dist/cli/update.js.map +1 -1
  49. package/dist/core/daemon/loop.d.ts +10 -5
  50. package/dist/core/daemon/loop.js +167 -37
  51. package/dist/core/daemon/loop.js.map +1 -1
  52. package/dist/core/env-bridge.js +3 -2
  53. package/dist/core/env-bridge.js.map +1 -1
  54. package/dist/core/fleet/automerge-pass.d.ts +33 -0
  55. package/dist/core/fleet/automerge-pass.js +61 -0
  56. package/dist/core/fleet/automerge-pass.js.map +1 -0
  57. package/dist/core/fleet/quota.d.ts +70 -0
  58. package/dist/core/fleet/quota.js +198 -0
  59. package/dist/core/fleet/quota.js.map +1 -0
  60. package/dist/core/fleet/router.d.ts +46 -0
  61. package/dist/core/fleet/router.js +121 -0
  62. package/dist/core/fleet/router.js.map +1 -0
  63. package/dist/core/fleet/self.d.ts +58 -0
  64. package/dist/core/fleet/self.js +187 -0
  65. package/dist/core/fleet/self.js.map +1 -0
  66. package/dist/core/fleet/status.d.ts +54 -0
  67. package/dist/core/fleet/status.js +157 -0
  68. package/dist/core/fleet/status.js.map +1 -0
  69. package/dist/core/foundry/provenance.d.ts +78 -0
  70. package/dist/core/foundry/provenance.js +172 -0
  71. package/dist/core/foundry/provenance.js.map +1 -0
  72. package/dist/core/git.d.ts +13 -0
  73. package/dist/core/git.js +26 -0
  74. package/dist/core/git.js.map +1 -1
  75. package/dist/core/inbox/merge.d.ts +151 -0
  76. package/dist/core/inbox/merge.js +858 -0
  77. package/dist/core/inbox/merge.js.map +1 -0
  78. package/dist/core/inbox/store.js +10 -1
  79. package/dist/core/inbox/store.js.map +1 -1
  80. package/dist/core/integrations/markdown.d.ts +66 -0
  81. package/dist/core/integrations/markdown.js +132 -0
  82. package/dist/core/integrations/markdown.js.map +1 -0
  83. package/dist/core/integrations/secrets.d.ts +37 -0
  84. package/dist/core/integrations/secrets.js +67 -0
  85. package/dist/core/integrations/secrets.js.map +1 -0
  86. package/dist/core/integrations/stack.d.ts +47 -0
  87. package/dist/core/integrations/stack.js +107 -0
  88. package/dist/core/integrations/stack.js.map +1 -0
  89. package/dist/core/mcp-native-engineer.d.ts +123 -0
  90. package/dist/core/mcp-native-engineer.js +936 -0
  91. package/dist/core/mcp-native-engineer.js.map +1 -0
  92. package/dist/core/mcp-native.js +20 -42
  93. package/dist/core/mcp-native.js.map +1 -1
  94. package/dist/core/mcp-registry.js +2 -0
  95. package/dist/core/mcp-registry.js.map +1 -1
  96. package/dist/core/observability/codex-source.d.ts +53 -0
  97. package/dist/core/observability/codex-source.js +390 -0
  98. package/dist/core/observability/codex-source.js.map +1 -0
  99. package/dist/core/observability/estimate.d.ts +12 -0
  100. package/dist/core/observability/estimate.js +26 -0
  101. package/dist/core/observability/estimate.js.map +1 -1
  102. package/dist/core/observability/limits.d.ts +52 -0
  103. package/dist/core/observability/limits.js +316 -0
  104. package/dist/core/observability/limits.js.map +1 -0
  105. package/dist/core/observability/usage-source.js +3 -1
  106. package/dist/core/observability/usage-source.js.map +1 -1
  107. package/dist/core/portfolio/scanners.d.ts +1 -0
  108. package/dist/core/portfolio/scanners.js +40 -1
  109. package/dist/core/portfolio/scanners.js.map +1 -1
  110. package/dist/core/providers.js +4 -0
  111. package/dist/core/providers.js.map +1 -1
  112. package/dist/core/quality/health.js +1 -0
  113. package/dist/core/quality/health.js.map +1 -1
  114. package/dist/core/run/agent-loop.d.ts +8 -0
  115. package/dist/core/run/agent-loop.js +24 -14
  116. package/dist/core/run/agent-loop.js.map +1 -1
  117. package/dist/core/run/engine-registry.d.ts +48 -0
  118. package/dist/core/run/engine-registry.js +190 -0
  119. package/dist/core/run/engine-registry.js.map +1 -0
  120. package/dist/core/run/engines.d.ts +17 -3
  121. package/dist/core/run/engines.js +63 -44
  122. package/dist/core/run/engines.js.map +1 -1
  123. package/dist/core/run/learned-router.d.ts +121 -0
  124. package/dist/core/run/learned-router.js +374 -0
  125. package/dist/core/run/learned-router.js.map +1 -0
  126. package/dist/core/run/model-manager.js +3 -3
  127. package/dist/core/run/model-manager.js.map +1 -1
  128. package/dist/core/run/model-profile.d.ts +67 -0
  129. package/dist/core/run/model-profile.js +132 -0
  130. package/dist/core/run/model-profile.js.map +1 -0
  131. package/dist/core/run/orchestrator.d.ts +1 -1
  132. package/dist/core/run/orchestrator.js +642 -510
  133. package/dist/core/run/orchestrator.js.map +1 -1
  134. package/dist/core/run/prompts/budget.d.ts +25 -0
  135. package/dist/core/run/prompts/budget.js +51 -0
  136. package/dist/core/run/prompts/budget.js.map +1 -0
  137. package/dist/core/run/prompts/index.d.ts +14 -0
  138. package/dist/core/run/prompts/index.js +59 -0
  139. package/dist/core/run/prompts/index.js.map +1 -0
  140. package/dist/core/run/prompts/layers.d.ts +26 -0
  141. package/dist/core/run/prompts/layers.js +73 -0
  142. package/dist/core/run/prompts/layers.js.map +1 -0
  143. package/dist/core/run/prompts/roles.d.ts +23 -0
  144. package/dist/core/run/prompts/roles.js +48 -0
  145. package/dist/core/run/prompts/roles.js.map +1 -0
  146. package/dist/core/run/prompts/types.d.ts +38 -0
  147. package/dist/core/run/prompts/types.js +5 -0
  148. package/dist/core/run/prompts/types.js.map +1 -0
  149. package/dist/core/run/provider-client.d.ts +6 -24
  150. package/dist/core/run/provider-client.js +125 -61
  151. package/dist/core/run/provider-client.js.map +1 -1
  152. package/dist/core/run/router.js +8 -0
  153. package/dist/core/run/router.js.map +1 -1
  154. package/dist/core/run/sandboxed-engine.d.ts +66 -0
  155. package/dist/core/run/sandboxed-engine.js +262 -0
  156. package/dist/core/run/sandboxed-engine.js.map +1 -0
  157. package/dist/core/run/verify-commands.d.ts +83 -0
  158. package/dist/core/run/verify-commands.js +234 -0
  159. package/dist/core/run/verify-commands.js.map +1 -0
  160. package/dist/core/run/verify.d.ts +31 -1
  161. package/dist/core/run/verify.js +48 -0
  162. package/dist/core/run/verify.js.map +1 -1
  163. package/dist/core/sandbox/audit.d.ts +27 -0
  164. package/dist/core/sandbox/audit.js +34 -0
  165. package/dist/core/sandbox/audit.js.map +1 -1
  166. package/dist/core/sandbox/confine.d.ts +134 -0
  167. package/dist/core/sandbox/confine.js +370 -0
  168. package/dist/core/sandbox/confine.js.map +1 -0
  169. package/dist/core/types.d.ts +227 -5
  170. package/dist/core/web/api.js +77 -28
  171. package/dist/core/web/api.js.map +1 -1
  172. package/dist/core/web/control.d.ts +116 -0
  173. package/dist/core/web/control.js +307 -0
  174. package/dist/core/web/control.js.map +1 -0
  175. package/dist/core/web/public/app.js +512 -6
  176. package/dist/core/web/public/styles.css +468 -0
  177. package/package.json +1 -1
@@ -0,0 +1,283 @@
1
+ /**
2
+ * `ashlr eval` — M44 local-agent eval harness.
3
+ *
4
+ * Runs a fixed set of small coding/reasoning goals (see eval-fixtures.ts)
5
+ * through the hub's own agent loop TWICE per fixture — once with adaptive
6
+ * prompts OFF, once ON — and reports per-fixture metrics (steps-to-done,
7
+ * status, tokens). This is the "proof" milestone for the M41–M43 uplift.
8
+ *
9
+ * Adaptive prompts are toggled via the ASHLR_ADAPTIVE_PROMPTS env var, which
10
+ * adaptivePromptsEnabled(cfg) reads FIRST (before cfg.models.adaptivePrompts).
11
+ *
12
+ * ashlr eval [--budget N] [--limit N] [--json]
13
+ *
14
+ * Exit codes:
15
+ * 0 always (even when no local model — prints a clear hint and returns 0)
16
+ */
17
+ import { EVAL_FIXTURES } from './eval-fixtures.js';
18
+ import { makeColors, isTty, pad } from './ui.js';
19
+ const { bold, dim, yellow, red, cyan, gray } = makeColors(isTty());
20
+ // ---------------------------------------------------------------------------
21
+ // Pure helpers — exported for unit testing
22
+ // ---------------------------------------------------------------------------
23
+ /** Aggregate EvalRows into a summary. Pure. */
24
+ export function summarize(rows) {
25
+ const s = {
26
+ fixtures: rows.length,
27
+ totalStepsOff: 0,
28
+ totalStepsOn: 0,
29
+ doneOff: 0,
30
+ doneOn: 0,
31
+ totalTokensOff: 0,
32
+ totalTokensOn: 0,
33
+ errors: 0,
34
+ };
35
+ for (const r of rows) {
36
+ s.totalStepsOff += r.stepsOff;
37
+ s.totalStepsOn += r.stepsOn;
38
+ s.totalTokensOff += r.tokensOff;
39
+ s.totalTokensOn += r.tokensOn;
40
+ if (r.doneOff)
41
+ s.doneOff++;
42
+ if (r.doneOn)
43
+ s.doneOn++;
44
+ if (r.error)
45
+ s.errors++;
46
+ }
47
+ return s;
48
+ }
49
+ /**
50
+ * Render a plain (no-color) eval table + summary as a string. Pure — does no
51
+ * I/O, takes no color dependencies, so it's deterministic and unit-testable.
52
+ *
53
+ * Columns: id | off(done/steps/tokens) | on(done/steps/tokens).
54
+ */
55
+ export function formatEvalTable(rows) {
56
+ const idW = Math.max(8, ...rows.map((r) => r.id.length));
57
+ const cell = (s, w) => s + ' '.repeat(Math.max(0, w - s.length));
58
+ const num = (n) => String(n);
59
+ const doneMark = (b) => (b ? 'done' : 'fail');
60
+ const lines = [];
61
+ lines.push('Adaptive prompts: OFF vs ON');
62
+ lines.push('');
63
+ lines.push(`${cell('id', idW)} ${cell('off:done', 10)} ${cell('off:steps', 10)} ${cell('off:tok', 10)} ` +
64
+ `${cell('on:done', 10)} ${cell('on:steps', 10)} ${cell('on:tok', 10)}`);
65
+ lines.push('-'.repeat(idW + 2 + 33 + 2 + 33));
66
+ for (const r of rows) {
67
+ if (r.error) {
68
+ lines.push(`${cell(r.id, idW)} ERROR: ${r.error}`);
69
+ continue;
70
+ }
71
+ lines.push(`${cell(r.id, idW)} ` +
72
+ `${cell(doneMark(r.doneOff), 10)} ${cell(num(r.stepsOff), 10)} ${cell(num(r.tokensOff), 10)} ` +
73
+ `${cell(doneMark(r.doneOn), 10)} ${cell(num(r.stepsOn), 10)} ${cell(num(r.tokensOn), 10)}`);
74
+ }
75
+ const s = summarize(rows);
76
+ lines.push('');
77
+ lines.push(`TOTAL fixtures=${s.fixtures} done OFF=${s.doneOff}/${s.fixtures} ON=${s.doneOn}/${s.fixtures} ` +
78
+ `steps OFF=${s.totalStepsOff} ON=${s.totalStepsOn} ` +
79
+ `tokens OFF=${s.totalTokensOff} ON=${s.totalTokensOn}` +
80
+ (s.errors ? ` errors=${s.errors}` : ''));
81
+ return lines.join('\n');
82
+ }
83
+ const DEFAULT_EVAL_BUDGET = 4000;
84
+ function parseEvalArgs(args) {
85
+ const result = { budget: DEFAULT_EVAL_BUDGET, json: false };
86
+ let i = 0;
87
+ while (i < args.length) {
88
+ const arg = args[i];
89
+ if (arg === '--json') {
90
+ result.json = true;
91
+ i++;
92
+ }
93
+ else if (arg === '--budget') {
94
+ const v = Number(args[++i]);
95
+ if (!Number.isFinite(v) || v <= 0) {
96
+ result.usageError = '--budget requires a positive number';
97
+ return result;
98
+ }
99
+ result.budget = Math.floor(v);
100
+ i++;
101
+ }
102
+ else if (arg === '--limit') {
103
+ const v = Number(args[++i]);
104
+ if (!Number.isFinite(v) || v <= 0) {
105
+ result.usageError = '--limit requires a positive number';
106
+ return result;
107
+ }
108
+ result.limit = Math.floor(v);
109
+ i++;
110
+ }
111
+ else {
112
+ result.usageError = `unknown flag: ${arg}`;
113
+ return result;
114
+ }
115
+ }
116
+ return result;
117
+ }
118
+ function buildOpts(budget) {
119
+ // noCapture lives on the run.ts parse layer (not on RunOptions), so we attach
120
+ // it via the same extra-prop escape hatch the CLI uses; it's ignored if unread.
121
+ const opts = {
122
+ budget: { maxTokens: budget },
123
+ parallel: 1,
124
+ tools: false,
125
+ json: true,
126
+ noMemory: true,
127
+ noCapture: true,
128
+ };
129
+ return opts;
130
+ }
131
+ /**
132
+ * Run a single fixture twice. Any failure is caught and recorded on the row —
133
+ * one bad fixture never aborts the whole eval.
134
+ */
135
+ async function evalFixture(fixture, cfg, budget, runGoal) {
136
+ const row = {
137
+ id: fixture.id,
138
+ goal: fixture.goal,
139
+ stepsOff: 0,
140
+ stepsOn: 0,
141
+ doneOff: false,
142
+ doneOn: false,
143
+ tokensOff: 0,
144
+ tokensOn: 0,
145
+ };
146
+ const prev = process.env.ASHLR_ADAPTIVE_PROMPTS;
147
+ try {
148
+ // ── OFF ────────────────────────────────────────────────────────────────
149
+ process.env.ASHLR_ADAPTIVE_PROMPTS = '0';
150
+ const off = await runGoal(fixture.goal, cfg, buildOpts(budget));
151
+ row.stepsOff = off.usage.steps;
152
+ row.doneOff = off.status === 'done';
153
+ row.tokensOff = off.usage.tokensIn + off.usage.tokensOut;
154
+ // ── ON ─────────────────────────────────────────────────────────────────
155
+ process.env.ASHLR_ADAPTIVE_PROMPTS = '1';
156
+ const on = await runGoal(fixture.goal, cfg, buildOpts(budget));
157
+ row.stepsOn = on.usage.steps;
158
+ row.doneOn = on.status === 'done';
159
+ row.tokensOn = on.usage.tokensIn + on.usage.tokensOut;
160
+ }
161
+ catch (err) {
162
+ row.error = err instanceof Error ? err.message : String(err);
163
+ }
164
+ finally {
165
+ // Restore the env var to its pre-fixture value.
166
+ if (prev === undefined)
167
+ delete process.env.ASHLR_ADAPTIVE_PROMPTS;
168
+ else
169
+ process.env.ASHLR_ADAPTIVE_PROMPTS = prev;
170
+ }
171
+ return row;
172
+ }
173
+ // ---------------------------------------------------------------------------
174
+ // `ashlr eval` — main
175
+ // ---------------------------------------------------------------------------
176
+ export async function cmdEval(args) {
177
+ if (args[0] === '--help' || args[0] === '-h' || args[0] === 'help') {
178
+ printEvalHelp();
179
+ return 0;
180
+ }
181
+ const parsed = parseEvalArgs(args);
182
+ if (parsed.usageError) {
183
+ process.stderr.write(red('error: ') + parsed.usageError + '\n');
184
+ return 2;
185
+ }
186
+ // Load config.
187
+ let cfg;
188
+ try {
189
+ const { loadConfig } = await import('../core/config.js');
190
+ cfg = loadConfig();
191
+ }
192
+ catch (err) {
193
+ process.stderr.write(red('error: ') + 'Failed to load config: ' +
194
+ (err instanceof Error ? err.message : String(err)) + '\n');
195
+ return 1;
196
+ }
197
+ // Guard: a local provider must be reachable. getActiveClient throws when no
198
+ // local provider is up (and allowCloud:false). If so, the eval cannot run —
199
+ // print a clear hint and return 0 (graceful, not an error).
200
+ try {
201
+ const { getActiveClient } = await import('../core/run/provider-client.js');
202
+ await getActiveClient(cfg, { allowCloud: false });
203
+ }
204
+ catch {
205
+ const msg = 'eval needs a local model — start Ollama or LM Studio, then re-run `ashlr eval`.';
206
+ if (parsed.json) {
207
+ process.stdout.write(JSON.stringify({ skipped: true, reason: msg }) + '\n');
208
+ }
209
+ else {
210
+ process.stdout.write('\n ' + yellow('eval skipped: ') + msg + '\n\n');
211
+ }
212
+ return 0;
213
+ }
214
+ // Load orchestrator.
215
+ let runGoal;
216
+ try {
217
+ const mod = await import('../core/run/orchestrator.js');
218
+ runGoal = mod.runGoal;
219
+ }
220
+ catch (err) {
221
+ process.stderr.write(red('error: ') + 'Failed to load orchestrator: ' +
222
+ (err instanceof Error ? err.message : String(err)) + '\n');
223
+ return 1;
224
+ }
225
+ const fixtures = parsed.limit ? EVAL_FIXTURES.slice(0, parsed.limit) : EVAL_FIXTURES;
226
+ if (!parsed.json) {
227
+ process.stderr.write(seInfo(`running ${fixtures.length} fixture(s) × 2 (adaptive OFF/ON), budget ${parsed.budget} tok each\n`));
228
+ }
229
+ const rows = [];
230
+ for (const fixture of fixtures) {
231
+ if (!parsed.json) {
232
+ process.stderr.write(seInfo(` • ${fixture.id} …\n`));
233
+ }
234
+ const row = await evalFixture(fixture, cfg, parsed.budget, runGoal);
235
+ rows.push(row);
236
+ }
237
+ // Output.
238
+ if (parsed.json) {
239
+ process.stdout.write(JSON.stringify({ rows, summary: summarize(rows) }, null, 2) + '\n');
240
+ }
241
+ else {
242
+ console.log('');
243
+ console.log(bold(' ashlr eval') + dim(' — M44 adaptive-prompt proof'));
244
+ console.log('');
245
+ for (const line of formatEvalTable(rows).split('\n')) {
246
+ console.log(' ' + line);
247
+ }
248
+ console.log('');
249
+ }
250
+ return 0;
251
+ }
252
+ // stderr progress helper (kept terse; cyan when TTY)
253
+ function seInfo(s) {
254
+ return process.stderr.isTTY ? cyan(s) : s;
255
+ }
256
+ function printEvalHelp() {
257
+ console.log('');
258
+ console.log(bold(' ashlr eval') + dim(' — local-agent eval harness (M44)'));
259
+ console.log('');
260
+ console.log(' ' + bold('Usage:'));
261
+ console.log('');
262
+ console.log(` ashlr eval [--budget N] [--limit N] [--json]`);
263
+ console.log('');
264
+ console.log(' ' + bold('Options:'));
265
+ console.log('');
266
+ const opts = [
267
+ ['--budget N', `Max tokens per run (default: ${DEFAULT_EVAL_BUDGET}).`],
268
+ ['--limit N', 'Only run the first N fixtures.'],
269
+ ['--json', 'Emit JSON { rows, summary } instead of a table.'],
270
+ ];
271
+ const w = Math.max(...opts.map(([o]) => o.length));
272
+ for (const [o, d] of opts) {
273
+ console.log(` ${cyan(pad(o, w))} ${d}`);
274
+ }
275
+ console.log('');
276
+ console.log(' ' + bold('What it does:'));
277
+ console.log('');
278
+ console.log(` ${gray('Runs a fixed fixture set through the agent loop twice each —')}`);
279
+ console.log(` ${gray('adaptive prompts OFF then ON — and reports steps/done/tokens.')}`);
280
+ console.log(` ${gray('Needs a local model (Ollama / LM Studio); skips cleanly if none.')}`);
281
+ console.log('');
282
+ }
283
+ //# sourceMappingURL=eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/cli/eval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `ashlr fleet` — M49 fleet control plane + observability CLI.
3
+ *
4
+ * Subcommands:
5
+ * fleet status [--json]
6
+ * Print a READ-ONLY snapshot of the whole fleet: daemon liveness +
7
+ * today's spend, per-backend recent dispatches + quota, queue size,
8
+ * proposal counts (pending / frontier-pending / applied), recent
9
+ * auto-merges, and the kill-switch (paused) state. Never mutates.
10
+ * fleet pause
11
+ * Engage the global kill switch (setKill(true)) — same effect as
12
+ * `ashlr daemon stop`'s kill: any running loop halts on its next tick and
13
+ * nothing autonomous dispatches until resumed. Idempotent.
14
+ * fleet resume
15
+ * Release the kill switch (setKill(false)). Idempotent.
16
+ *
17
+ * Pause/resume are the ONLY mutations here, and they touch ONLY the kill-switch
18
+ * sentinel (no repo, no spend, no proposals). `fleet status` is fully read-only.
19
+ */
20
+ import type { FleetStatus } from '../core/fleet/status.js';
21
+ /**
22
+ * Render a FleetStatus as a plain (no-color) multi-line string. Pure and
23
+ * deterministic — does no I/O and takes no color dependency, so it is fully
24
+ * unit-testable.
25
+ */
26
+ export declare function formatFleetStatus(s: FleetStatus): string;
27
+ export declare function cmdFleet(args: string[]): Promise<number>;
@@ -0,0 +1,222 @@
1
+ /**
2
+ * `ashlr fleet` — M49 fleet control plane + observability CLI.
3
+ *
4
+ * Subcommands:
5
+ * fleet status [--json]
6
+ * Print a READ-ONLY snapshot of the whole fleet: daemon liveness +
7
+ * today's spend, per-backend recent dispatches + quota, queue size,
8
+ * proposal counts (pending / frontier-pending / applied), recent
9
+ * auto-merges, and the kill-switch (paused) state. Never mutates.
10
+ * fleet pause
11
+ * Engage the global kill switch (setKill(true)) — same effect as
12
+ * `ashlr daemon stop`'s kill: any running loop halts on its next tick and
13
+ * nothing autonomous dispatches until resumed. Idempotent.
14
+ * fleet resume
15
+ * Release the kill switch (setKill(false)). Idempotent.
16
+ *
17
+ * Pause/resume are the ONLY mutations here, and they touch ONLY the kill-switch
18
+ * sentinel (no repo, no spend, no proposals). `fleet status` is fully read-only.
19
+ */
20
+ import { makeColors, isTty } from './ui.js';
21
+ const { bold, dim, green, red, yellow, cyan } = makeColors(isTty());
22
+ // ---------------------------------------------------------------------------
23
+ // Pure formatter — exported for unit testing (no I/O, no color deps).
24
+ // ---------------------------------------------------------------------------
25
+ /**
26
+ * Render a FleetStatus as a plain (no-color) multi-line string. Pure and
27
+ * deterministic — does no I/O and takes no color dependency, so it is fully
28
+ * unit-testable.
29
+ */
30
+ export function formatFleetStatus(s) {
31
+ const lines = [];
32
+ const pausedTag = s.killed ? ' [PAUSED — kill switch engaged]' : '';
33
+ lines.push('Fleet status' + pausedTag);
34
+ lines.push('');
35
+ // Daemon
36
+ lines.push(`Daemon: ${s.daemon.running ? 'running' : 'stopped'}`);
37
+ lines.push(` last tick: ${s.daemon.lastTickAt ?? '—'}`);
38
+ lines.push(` spend today: $${s.daemon.todaySpentUsd.toFixed(4)}`);
39
+ lines.push('');
40
+ // Backends
41
+ lines.push('Backends:');
42
+ if (s.backends.length === 0) {
43
+ lines.push(' (none)');
44
+ }
45
+ else {
46
+ const nameW = Math.max(8, ...s.backends.map((b) => b.backend.length));
47
+ for (const b of s.backends) {
48
+ const name = b.backend + ' '.repeat(Math.max(0, nameW - b.backend.length));
49
+ lines.push(` ${name} dispatches(24h)=${b.dispatchesRecent} quota=${b.quota}`);
50
+ }
51
+ }
52
+ lines.push('');
53
+ // Queue
54
+ lines.push(`Queue: ${s.queue.backlogItems} backlog item(s)`);
55
+ lines.push('');
56
+ // Proposals
57
+ lines.push('Proposals:');
58
+ lines.push(` pending: ${s.proposals.pending}`);
59
+ lines.push(` frontier pending: ${s.proposals.frontierPending}`);
60
+ lines.push(` applied: ${s.proposals.applied}`);
61
+ lines.push('');
62
+ // Merges
63
+ lines.push(`Merges: ${s.merges.recent} auto-merge(s) in last 24h`);
64
+ return lines.join('\n');
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Config loader (lazy, graceful)
68
+ // ---------------------------------------------------------------------------
69
+ async function loadCfg() {
70
+ try {
71
+ const { loadConfig } = await import('../core/config.js');
72
+ return loadConfig();
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // Subcommand: status (READ-ONLY)
80
+ // ---------------------------------------------------------------------------
81
+ async function cmdFleetStatus(jsonMode) {
82
+ const cfg = await loadCfg();
83
+ if (!cfg) {
84
+ process.stderr.write(red('error: ') + 'failed to load config.\n');
85
+ return 1;
86
+ }
87
+ let status;
88
+ try {
89
+ const { buildFleetStatus } = await import('../core/fleet/status.js');
90
+ status = await buildFleetStatus(cfg);
91
+ }
92
+ catch (err) {
93
+ process.stderr.write(red('error: ') + 'failed to build fleet status: ' +
94
+ (err instanceof Error ? err.message : String(err)) + '\n');
95
+ return 1;
96
+ }
97
+ if (jsonMode) {
98
+ process.stdout.write(JSON.stringify(status, null, 2) + '\n');
99
+ return 0;
100
+ }
101
+ console.log('');
102
+ console.log(bold(' ashlr fleet') + dim(' — control plane + observability'));
103
+ console.log('');
104
+ for (const line of formatFleetStatus(status).split('\n')) {
105
+ // Colorize the paused banner line; leave the rest plain.
106
+ if (line.includes('[PAUSED'))
107
+ console.log(' ' + yellow(line));
108
+ else
109
+ console.log(' ' + line);
110
+ }
111
+ console.log('');
112
+ return 0;
113
+ }
114
+ // ---------------------------------------------------------------------------
115
+ // Subcommands: pause / resume (kill-switch only)
116
+ // ---------------------------------------------------------------------------
117
+ async function setKillSwitch(on) {
118
+ try {
119
+ const { setKill } = await import('../core/sandbox/policy.js');
120
+ setKill(on);
121
+ }
122
+ catch (err) {
123
+ process.stderr.write(red('error: ') + 'failed to toggle kill switch: ' +
124
+ (err instanceof Error ? err.message : String(err)) + '\n');
125
+ return 1;
126
+ }
127
+ console.log('');
128
+ if (on) {
129
+ console.log(green(' ✓ fleet paused') + dim(' — kill switch engaged.'));
130
+ console.log(dim(' Any running loop halts on its next tick; nothing autonomous dispatches.'));
131
+ console.log(dim(' Resume with `ashlr fleet resume`.'));
132
+ }
133
+ else {
134
+ console.log(green(' ✓ fleet resumed') + dim(' — kill switch released.'));
135
+ console.log(dim(' The daemon may dispatch again on its next tick (if running).'));
136
+ }
137
+ console.log('');
138
+ return 0;
139
+ }
140
+ // ---------------------------------------------------------------------------
141
+ // Main dispatch
142
+ // ---------------------------------------------------------------------------
143
+ /**
144
+ * M59: a conservative starter `cfg.foundry` block. Installed backends +
145
+ * OS confinement on + auto-merge OFF. No mergeAuthority models are guessed (the
146
+ * user pins those); no API engines are added (they need keys). Adding more is
147
+ * config-only — see docs/FOUNDRY-CONFIG.md.
148
+ */
149
+ function starterFoundry() {
150
+ return {
151
+ allowedBackends: ['builtin', 'claude', 'codex', 'hermes'],
152
+ confinement: { '*': { mode: 'os', networkEgress: false, onUnsupported: 'fallback' } },
153
+ autoMerge: { enabled: false },
154
+ };
155
+ }
156
+ /**
157
+ * `ashlr fleet init [--write]` — print (default) or merge (--write, only when
158
+ * absent) a starter cfg.foundry. NEVER overwrites an existing foundry block.
159
+ */
160
+ async function cmdFleetInit(args) {
161
+ const write = args.includes('--write');
162
+ const { loadConfig, saveConfig, CONFIG_PATH } = await import('../core/config.js');
163
+ const cfg = loadConfig();
164
+ const block = { foundry: starterFoundry() };
165
+ if (!write) {
166
+ console.log('');
167
+ console.log(dim(' # Starter cfg.foundry — merge into ' + CONFIG_PATH));
168
+ console.log(dim(' # Full reference: docs/FOUNDRY-CONFIG.md'));
169
+ console.log(JSON.stringify(block, null, 2));
170
+ console.log('');
171
+ console.log(dim(' Re-run `ashlr fleet init --write` to merge it (only when foundry is absent).'));
172
+ return 0;
173
+ }
174
+ if (cfg.foundry) {
175
+ console.error(yellow('note: ') +
176
+ 'cfg.foundry already present in ' +
177
+ CONFIG_PATH +
178
+ ' — not overwriting. Edit it by hand (see docs/FOUNDRY-CONFIG.md).');
179
+ return 1;
180
+ }
181
+ cfg.foundry = starterFoundry();
182
+ saveConfig(cfg);
183
+ console.log(green('✓ ') +
184
+ 'wrote a starter cfg.foundry to ' +
185
+ CONFIG_PATH +
186
+ ' (auto-merge OFF; set provider keys + pass --allow-cloud to use API backends).');
187
+ return 0;
188
+ }
189
+ export async function cmdFleet(args) {
190
+ const [sub, ...rest] = args;
191
+ if (sub === '--help' || sub === '-h' || sub === 'help' || sub === undefined) {
192
+ printFleetHelp();
193
+ return 0;
194
+ }
195
+ switch (sub) {
196
+ case 'status':
197
+ return cmdFleetStatus(rest.includes('--json'));
198
+ case 'init':
199
+ return cmdFleetInit(rest);
200
+ case 'pause':
201
+ return setKillSwitch(true);
202
+ case 'resume':
203
+ return setKillSwitch(false);
204
+ default:
205
+ process.stderr.write(red('error: ') + `unknown fleet subcommand: ${sub}\n`);
206
+ printFleetHelp();
207
+ return 2;
208
+ }
209
+ }
210
+ function printFleetHelp() {
211
+ console.log('');
212
+ console.log(bold(' ashlr fleet') + dim(' — fleet control plane + observability (M49)'));
213
+ console.log('');
214
+ console.log(' ' + bold('Usage:'));
215
+ console.log('');
216
+ console.log(` ashlr fleet status [--json] ${cyan('# read-only fleet snapshot')}`);
217
+ console.log(` ashlr fleet init [--write] ${cyan('# print/merge a starter cfg.foundry')}`);
218
+ console.log(` ashlr fleet pause ${cyan('# engage kill switch (pause fleet)')}`);
219
+ console.log(` ashlr fleet resume ${cyan('# release kill switch (resume fleet)')}`);
220
+ console.log('');
221
+ }
222
+ //# sourceMappingURL=fleet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../src/cli/fleet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * goal.ts — M55 (v5 Open Fleet): the `ashlr goal` conductor.
3
+ *
4
+ * One polished front door to the goal machinery: `ashlr goal "<objective>"`
5
+ * creates a goal, plans it into milestones, and advances the next one — routed
6
+ * across the polyglot roster (M50/M51/M53), sandboxed, PROPOSAL-FIRST. It is a
7
+ * thin convenience wrapper over the PROVEN, gated `ashlr goals` subcommands
8
+ * (add → plan → advance); it adds NO new dispatch or mutation path. The
9
+ * proposal-only + enrollment + kill-switch gates all live in core advanceGoal.
10
+ *
11
+ * SAFETY: this module imports no outward-mutation primitive — it never applies
12
+ * proposals, opens pull requests, pushes a remote, or deploys. It only sequences
13
+ * the already-gated goals flow.
14
+ */
15
+ export declare function cmdGoal(args: string[]): Promise<number>;