@ashlr/hub 2.2.0 → 3.0.1
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.
- package/CHANGELOG.md +73 -0
- package/README.md +95 -8
- package/dist/api/plugin.d.ts +1 -0
- package/dist/cli/backlog.js +2 -0
- package/dist/cli/backlog.js.map +1 -1
- package/dist/cli/digest.d.ts +6 -0
- package/dist/cli/digest.js +127 -2
- package/dist/cli/digest.js.map +1 -1
- package/dist/cli/eval-fixtures.d.ts +18 -0
- package/dist/cli/eval-fixtures.js +38 -0
- package/dist/cli/eval-fixtures.js.map +1 -0
- package/dist/cli/eval.d.ts +56 -0
- package/dist/cli/eval.js +283 -0
- package/dist/cli/eval.js.map +1 -0
- package/dist/cli/fleet.d.ts +27 -0
- package/dist/cli/fleet.js +222 -0
- package/dist/cli/fleet.js.map +1 -0
- package/dist/cli/goal.d.ts +15 -0
- package/dist/cli/goal.js +91 -0
- package/dist/cli/goal.js.map +1 -0
- package/dist/cli/help.js +10 -3
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/inbox.d.ts +6 -0
- package/dist/cli/inbox.js +183 -8
- package/dist/cli/inbox.js.map +1 -1
- package/dist/cli/index.js +50 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/loop.d.ts +16 -0
- package/dist/cli/loop.js +66 -0
- package/dist/cli/loop.js.map +1 -0
- package/dist/cli/mcp.d.ts +12 -0
- package/dist/cli/mcp.js +148 -0
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/onboard.d.ts +16 -0
- package/dist/cli/onboard.js +71 -0
- package/dist/cli/onboard.js.map +1 -1
- package/dist/cli/plugins.js +9 -8
- package/dist/cli/plugins.js.map +1 -1
- package/dist/cli/pulse.d.ts +10 -0
- package/dist/cli/pulse.js +261 -0
- package/dist/cli/pulse.js.map +1 -1
- package/dist/cli/run.js +21 -3
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/stack.d.ts +34 -0
- package/dist/cli/stack.js +221 -0
- package/dist/cli/stack.js.map +1 -0
- package/dist/cli/update.js +12 -5
- package/dist/cli/update.js.map +1 -1
- package/dist/core/daemon/loop.d.ts +10 -5
- package/dist/core/daemon/loop.js +167 -37
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/env-bridge.js +3 -2
- package/dist/core/env-bridge.js.map +1 -1
- package/dist/core/fleet/automerge-pass.d.ts +33 -0
- package/dist/core/fleet/automerge-pass.js +61 -0
- package/dist/core/fleet/automerge-pass.js.map +1 -0
- package/dist/core/fleet/quota.d.ts +70 -0
- package/dist/core/fleet/quota.js +198 -0
- package/dist/core/fleet/quota.js.map +1 -0
- package/dist/core/fleet/router.d.ts +46 -0
- package/dist/core/fleet/router.js +121 -0
- package/dist/core/fleet/router.js.map +1 -0
- package/dist/core/fleet/self.d.ts +58 -0
- package/dist/core/fleet/self.js +187 -0
- package/dist/core/fleet/self.js.map +1 -0
- package/dist/core/fleet/status.d.ts +54 -0
- package/dist/core/fleet/status.js +157 -0
- package/dist/core/fleet/status.js.map +1 -0
- package/dist/core/foundry/provenance.d.ts +78 -0
- package/dist/core/foundry/provenance.js +172 -0
- package/dist/core/foundry/provenance.js.map +1 -0
- package/dist/core/git.d.ts +13 -0
- package/dist/core/git.js +26 -0
- package/dist/core/git.js.map +1 -1
- package/dist/core/inbox/merge.d.ts +151 -0
- package/dist/core/inbox/merge.js +858 -0
- package/dist/core/inbox/merge.js.map +1 -0
- package/dist/core/inbox/store.js +10 -1
- package/dist/core/inbox/store.js.map +1 -1
- package/dist/core/integrations/markdown.d.ts +66 -0
- package/dist/core/integrations/markdown.js +132 -0
- package/dist/core/integrations/markdown.js.map +1 -0
- package/dist/core/integrations/secrets.d.ts +37 -0
- package/dist/core/integrations/secrets.js +67 -0
- package/dist/core/integrations/secrets.js.map +1 -0
- package/dist/core/integrations/stack.d.ts +47 -0
- package/dist/core/integrations/stack.js +107 -0
- package/dist/core/integrations/stack.js.map +1 -0
- package/dist/core/mcp-native-engineer.d.ts +123 -0
- package/dist/core/mcp-native-engineer.js +936 -0
- package/dist/core/mcp-native-engineer.js.map +1 -0
- package/dist/core/mcp-native.js +20 -42
- package/dist/core/mcp-native.js.map +1 -1
- package/dist/core/mcp-registry.js +2 -0
- package/dist/core/mcp-registry.js.map +1 -1
- package/dist/core/observability/codex-source.d.ts +53 -0
- package/dist/core/observability/codex-source.js +390 -0
- package/dist/core/observability/codex-source.js.map +1 -0
- package/dist/core/observability/estimate.d.ts +12 -0
- package/dist/core/observability/estimate.js +26 -0
- package/dist/core/observability/estimate.js.map +1 -1
- package/dist/core/observability/limits.d.ts +52 -0
- package/dist/core/observability/limits.js +316 -0
- package/dist/core/observability/limits.js.map +1 -0
- package/dist/core/observability/usage-source.js +3 -1
- package/dist/core/observability/usage-source.js.map +1 -1
- package/dist/core/portfolio/scanners.d.ts +1 -0
- package/dist/core/portfolio/scanners.js +40 -1
- package/dist/core/portfolio/scanners.js.map +1 -1
- package/dist/core/providers.js +4 -0
- package/dist/core/providers.js.map +1 -1
- package/dist/core/quality/health.js +1 -0
- package/dist/core/quality/health.js.map +1 -1
- package/dist/core/run/agent-loop.d.ts +8 -0
- package/dist/core/run/agent-loop.js +24 -14
- package/dist/core/run/agent-loop.js.map +1 -1
- package/dist/core/run/engine-registry.d.ts +48 -0
- package/dist/core/run/engine-registry.js +190 -0
- package/dist/core/run/engine-registry.js.map +1 -0
- package/dist/core/run/engines.d.ts +17 -3
- package/dist/core/run/engines.js +63 -44
- package/dist/core/run/engines.js.map +1 -1
- package/dist/core/run/learned-router.d.ts +121 -0
- package/dist/core/run/learned-router.js +374 -0
- package/dist/core/run/learned-router.js.map +1 -0
- package/dist/core/run/model-manager.js +3 -3
- package/dist/core/run/model-manager.js.map +1 -1
- package/dist/core/run/model-profile.d.ts +67 -0
- package/dist/core/run/model-profile.js +132 -0
- package/dist/core/run/model-profile.js.map +1 -0
- package/dist/core/run/orchestrator.d.ts +1 -1
- package/dist/core/run/orchestrator.js +642 -510
- package/dist/core/run/orchestrator.js.map +1 -1
- package/dist/core/run/prompts/budget.d.ts +25 -0
- package/dist/core/run/prompts/budget.js +51 -0
- package/dist/core/run/prompts/budget.js.map +1 -0
- package/dist/core/run/prompts/index.d.ts +14 -0
- package/dist/core/run/prompts/index.js +59 -0
- package/dist/core/run/prompts/index.js.map +1 -0
- package/dist/core/run/prompts/layers.d.ts +26 -0
- package/dist/core/run/prompts/layers.js +73 -0
- package/dist/core/run/prompts/layers.js.map +1 -0
- package/dist/core/run/prompts/roles.d.ts +23 -0
- package/dist/core/run/prompts/roles.js +48 -0
- package/dist/core/run/prompts/roles.js.map +1 -0
- package/dist/core/run/prompts/types.d.ts +38 -0
- package/dist/core/run/prompts/types.js +5 -0
- package/dist/core/run/prompts/types.js.map +1 -0
- package/dist/core/run/provider-client.d.ts +6 -24
- package/dist/core/run/provider-client.js +125 -61
- package/dist/core/run/provider-client.js.map +1 -1
- package/dist/core/run/router.js +8 -0
- package/dist/core/run/router.js.map +1 -1
- package/dist/core/run/sandboxed-engine.d.ts +66 -0
- package/dist/core/run/sandboxed-engine.js +262 -0
- package/dist/core/run/sandboxed-engine.js.map +1 -0
- package/dist/core/run/verify-commands.d.ts +83 -0
- package/dist/core/run/verify-commands.js +234 -0
- package/dist/core/run/verify-commands.js.map +1 -0
- package/dist/core/run/verify.d.ts +31 -1
- package/dist/core/run/verify.js +48 -0
- package/dist/core/run/verify.js.map +1 -1
- package/dist/core/sandbox/audit.d.ts +27 -0
- package/dist/core/sandbox/audit.js +34 -0
- package/dist/core/sandbox/audit.js.map +1 -1
- package/dist/core/sandbox/confine.d.ts +134 -0
- package/dist/core/sandbox/confine.js +370 -0
- package/dist/core/sandbox/confine.js.map +1 -0
- package/dist/core/types.d.ts +227 -5
- package/dist/core/web/api.js +77 -28
- package/dist/core/web/api.js.map +1 -1
- package/dist/core/web/control.d.ts +116 -0
- package/dist/core/web/control.js +307 -0
- package/dist/core/web/control.js.map +1 -0
- package/dist/core/web/public/app.js +512 -6
- package/dist/core/web/public/styles.css +468 -0
- package/package.json +3 -2
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M44 — fixed eval fixtures.
|
|
3
|
+
*
|
|
4
|
+
* A small, deterministic set of SHORT, self-contained coding/reasoning goals a
|
|
5
|
+
* 7B-class local model can attempt without any engineer tools. Used by the
|
|
6
|
+
* `ashlr eval` harness to compare the agent loop with adaptive prompts OFF vs
|
|
7
|
+
* ON and prove the M41–M43 uplift.
|
|
8
|
+
*
|
|
9
|
+
* Keep these tool-free-friendly (no file I/O, no repo context) so a run can
|
|
10
|
+
* complete on a bare local provider with `{ tools: false }`.
|
|
11
|
+
*/
|
|
12
|
+
export const EVAL_FIXTURES = [
|
|
13
|
+
{
|
|
14
|
+
id: 'palindrome',
|
|
15
|
+
goal: 'Write a TypeScript function `isPalindrome(s: string): boolean` and show its code.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: 'debounce-explain',
|
|
19
|
+
goal: 'Explain in exactly 3 bullet points what a debounce function does.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: 'fizzbuzz',
|
|
23
|
+
goal: 'Write a JavaScript function that prints FizzBuzz for numbers 1 to 15. Show the code.',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: 'reverse-words',
|
|
27
|
+
goal: 'Write a Python function `reverse_words(s: str) -> str` that reverses the order of words in a sentence. Show the code.',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'http-vs-https',
|
|
31
|
+
goal: 'In 2 sentences, explain the difference between HTTP and HTTPS.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: 'sum-array',
|
|
35
|
+
goal: 'Write a one-line TypeScript expression that sums an array of numbers named `xs`.',
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
//# sourceMappingURL=eval-fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-fixtures.js","sourceRoot":"","sources":["../../src/cli/eval-fixtures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C;QACE,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,mFAAmF;KAC1F;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,mEAAmE;KAC1E;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,sFAAsF;KAC7F;IACD;QACE,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,uHAAuH;KAC9H;IACD;QACE,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,gEAAgE;KACvE;IACD;QACE,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,kFAAkF;KACzF;CACF,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
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
|
+
/** Per-fixture result after running OFF then ON. */
|
|
18
|
+
export interface EvalRow {
|
|
19
|
+
id: string;
|
|
20
|
+
goal: string;
|
|
21
|
+
/** Steps taken with adaptive prompts OFF. */
|
|
22
|
+
stepsOff: number;
|
|
23
|
+
/** Steps taken with adaptive prompts ON. */
|
|
24
|
+
stepsOn: number;
|
|
25
|
+
/** Whether the OFF run reached status 'done'. */
|
|
26
|
+
doneOff: boolean;
|
|
27
|
+
/** Whether the ON run reached status 'done'. */
|
|
28
|
+
doneOn: boolean;
|
|
29
|
+
/** Total tokens (in+out) for the OFF run. */
|
|
30
|
+
tokensOff: number;
|
|
31
|
+
/** Total tokens (in+out) for the ON run. */
|
|
32
|
+
tokensOn: number;
|
|
33
|
+
/** Set when the fixture failed to run at all (caught error). */
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
/** Aggregate over all rows. */
|
|
37
|
+
export interface EvalSummary {
|
|
38
|
+
fixtures: number;
|
|
39
|
+
totalStepsOff: number;
|
|
40
|
+
totalStepsOn: number;
|
|
41
|
+
doneOff: number;
|
|
42
|
+
doneOn: number;
|
|
43
|
+
totalTokensOff: number;
|
|
44
|
+
totalTokensOn: number;
|
|
45
|
+
errors: number;
|
|
46
|
+
}
|
|
47
|
+
/** Aggregate EvalRows into a summary. Pure. */
|
|
48
|
+
export declare function summarize(rows: EvalRow[]): EvalSummary;
|
|
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 declare function formatEvalTable(rows: EvalRow[]): string;
|
|
56
|
+
export declare function cmdEval(args: string[]): Promise<number>;
|
package/dist/cli/eval.js
ADDED
|
@@ -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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"}
|