@pleri/olam-cli 0.1.180 → 0.1.182
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/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +67 -19
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +93 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/destroy.d.ts +41 -0
- package/dist/commands/destroy.d.ts.map +1 -1
- package/dist/commands/destroy.js +81 -33
- package/dist/commands/destroy.js.map +1 -1
- package/dist/commands/dispatch-resolve.d.ts +54 -0
- package/dist/commands/dispatch-resolve.d.ts.map +1 -0
- package/dist/commands/dispatch-resolve.js +105 -0
- package/dist/commands/dispatch-resolve.js.map +1 -0
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/dispatch.js +40 -9
- package/dist/commands/dispatch.js.map +1 -1
- package/dist/commands/flywheel/k5-validate.d.ts +31 -0
- package/dist/commands/flywheel/k5-validate.d.ts.map +1 -1
- package/dist/commands/flywheel/k5-validate.js +80 -19
- package/dist/commands/flywheel/k5-validate.js.map +1 -1
- package/dist/commands/kg-classify.d.ts.map +1 -1
- package/dist/commands/kg-classify.js +20 -0
- package/dist/commands/kg-classify.js.map +1 -1
- package/dist/commands/kg-doctor.d.ts +67 -6
- package/dist/commands/kg-doctor.d.ts.map +1 -1
- package/dist/commands/kg-doctor.js +126 -46
- package/dist/commands/kg-doctor.js.map +1 -1
- package/dist/commands/list.d.ts +27 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +67 -19
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/memory/status.d.ts +18 -0
- package/dist/commands/memory/status.d.ts.map +1 -1
- package/dist/commands/memory/status.js +38 -2
- package/dist/commands/memory/status.js.map +1 -1
- package/dist/commands/memory-service-container.d.ts +44 -0
- package/dist/commands/memory-service-container.d.ts.map +1 -1
- package/dist/commands/memory-service-container.js +49 -0
- package/dist/commands/memory-service-container.js.map +1 -1
- package/dist/commands/ps.d.ts +32 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +34 -0
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/runbooks.d.ts +32 -0
- package/dist/commands/runbooks.d.ts.map +1 -1
- package/dist/commands/runbooks.js +79 -22
- package/dist/commands/runbooks.js.map +1 -1
- package/dist/commands/skills-source.d.ts.map +1 -1
- package/dist/commands/skills-source.js +77 -2
- package/dist/commands/skills-source.js.map +1 -1
- package/dist/commands/upgrade-history.d.ts +0 -2
- package/dist/commands/upgrade-history.d.ts.map +1 -1
- package/dist/commands/upgrade-history.js +0 -6
- package/dist/commands/upgrade-history.js.map +1 -1
- package/dist/commands/upgrade-lock.d.ts +0 -9
- package/dist/commands/upgrade-lock.d.ts.map +1 -1
- package/dist/commands/upgrade-lock.js +1 -1
- package/dist/commands/upgrade-lock.js.map +1 -1
- package/dist/commands/world-snapshot.d.ts +13 -0
- package/dist/commands/world-snapshot.d.ts.map +1 -1
- package/dist/commands/world-snapshot.js +81 -1
- package/dist/commands/world-snapshot.js.map +1 -1
- package/dist/commands/yolo.d.ts +0 -4
- package/dist/commands/yolo.d.ts.map +1 -1
- package/dist/commands/yolo.js +2 -2
- package/dist/commands/yolo.js.map +1 -1
- package/dist/image-digests.json +8 -8
- package/dist/index.js +3403 -2459
- package/dist/lib/anthropic-base-url-file.d.ts +37 -0
- package/dist/lib/anthropic-base-url-file.d.ts.map +1 -0
- package/dist/lib/anthropic-base-url-file.js +46 -0
- package/dist/lib/anthropic-base-url-file.js.map +1 -0
- package/dist/lib/auth-remote.d.ts +9 -0
- package/dist/lib/auth-remote.d.ts.map +1 -1
- package/dist/lib/auth-remote.js +19 -4
- package/dist/lib/auth-remote.js.map +1 -1
- package/dist/lib/cf-access-token.d.ts +32 -0
- package/dist/lib/cf-access-token.d.ts.map +1 -0
- package/dist/lib/cf-access-token.js +52 -0
- package/dist/lib/cf-access-token.js.map +1 -0
- package/dist/lib/config.d.ts +17 -3
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +28 -4
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/kubectl-context.d.ts +49 -0
- package/dist/lib/kubectl-context.d.ts.map +1 -1
- package/dist/lib/kubectl-context.js +64 -2
- package/dist/lib/kubectl-context.js.map +1 -1
- package/dist/lib/upgrade-kubernetes.d.ts +7 -0
- package/dist/lib/upgrade-kubernetes.d.ts.map +1 -1
- package/dist/lib/upgrade-kubernetes.js +35 -8
- package/dist/lib/upgrade-kubernetes.js.map +1 -1
- package/dist/mcp-server.js +1457 -1004
- package/hermes-bundle/version.json +1 -1
- package/host-cp/k8s/manifests/45-pvc.yaml +6 -2
- package/host-cp/k8s/manifests/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/auth-service/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/kg-service/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/mcp-auth-service/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/memory-service/50-deployment.yaml +1 -1
- package/host-cp/observability/trace-summary.mjs +267 -0
- package/host-cp/src/bootstrap-selective.mjs +30 -28
- package/host-cp/src/host-stream.mjs +52 -0
- package/host-cp/src/redirect.mjs +7 -0
- package/host-cp/src/router.mjs +168 -0
- package/host-cp/src/serve-only-config.mjs +85 -0
- package/host-cp/src/server.mjs +346 -217
- package/host-cp/src/world-services.mjs +136 -0
- package/package.json +1 -1
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure resolution + validation helpers for `olam dispatch`.
|
|
3
|
+
*
|
|
4
|
+
* Extracted so the operator-facing ergonomics (resolve-by-name,
|
|
5
|
+
* "did you mean" suggestions, mode validation) can be unit-tested
|
|
6
|
+
* without the container/IO surface of the command action.
|
|
7
|
+
*/
|
|
8
|
+
/** Minimal world shape these helpers need (subset of WorldMetadata). */
|
|
9
|
+
export interface DispatchWorldRef {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly status: string;
|
|
13
|
+
}
|
|
14
|
+
/** The execution modes `olam dispatch --mode` accepts. */
|
|
15
|
+
export declare const DISPATCH_MODES: readonly ["auto", "deep", "fast"];
|
|
16
|
+
export type DispatchMode = (typeof DISPATCH_MODES)[number];
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a world by the user-supplied argument.
|
|
19
|
+
*
|
|
20
|
+
* Precedence (backward-compatible — exact ID still wins):
|
|
21
|
+
* 1. Exact ID match.
|
|
22
|
+
* 2. Exact name match (operators usually remember the name, not the id).
|
|
23
|
+
*
|
|
24
|
+
* Returns the matched world, or `undefined` when nothing matches.
|
|
25
|
+
* When two worlds share a name, the first registered wins — callers
|
|
26
|
+
* should fall back to the unambiguous ID, which is surfaced in the
|
|
27
|
+
* not-found suggestion list.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveWorld<T extends DispatchWorldRef>(worlds: readonly T[], arg: string): T | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Rank worlds by how likely the operator meant them, given a typo'd or
|
|
32
|
+
* partial argument. Used to build a "did you mean" hint on not-found.
|
|
33
|
+
*
|
|
34
|
+
* Matching signal (lower score = better):
|
|
35
|
+
* - substring match on id or name (case-insensitive) → strong signal
|
|
36
|
+
* - small edit distance to id or name → typo signal
|
|
37
|
+
*
|
|
38
|
+
* Returns at most `limit` candidates, best first. Worlds with no
|
|
39
|
+
* plausible relationship to the argument are dropped, so an empty
|
|
40
|
+
* result is meaningful ("nothing close").
|
|
41
|
+
*/
|
|
42
|
+
export declare function suggestWorlds<T extends DispatchWorldRef>(worlds: readonly T[], arg: string, limit?: number): T[];
|
|
43
|
+
/**
|
|
44
|
+
* Validate a `--mode` value. Returns the canonical mode on success, or
|
|
45
|
+
* an `error` describing the valid set on failure. Unknown modes used to
|
|
46
|
+
* silently fall through to non-deep behaviour; surfacing them prevents
|
|
47
|
+
* a typo (`--mode dep`) from quietly running the wrong execution shape.
|
|
48
|
+
*/
|
|
49
|
+
export declare function validateMode(raw: string): {
|
|
50
|
+
mode: DispatchMode;
|
|
51
|
+
} | {
|
|
52
|
+
error: string;
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=dispatch-resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-resolve.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wEAAwE;AACxE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,0DAA0D;AAC1D,eAAO,MAAM,cAAc,mCAAoC,CAAC;AAChE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,gBAAgB,EACrD,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,GAAG,EAAE,MAAM,GACV,CAAC,GAAG,SAAS,CAIf;AAgCD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,gBAAgB,EACtD,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,GACR,CAAC,EAAE,CAoBL;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,GACV;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAQ5C"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure resolution + validation helpers for `olam dispatch`.
|
|
3
|
+
*
|
|
4
|
+
* Extracted so the operator-facing ergonomics (resolve-by-name,
|
|
5
|
+
* "did you mean" suggestions, mode validation) can be unit-tested
|
|
6
|
+
* without the container/IO surface of the command action.
|
|
7
|
+
*/
|
|
8
|
+
/** The execution modes `olam dispatch --mode` accepts. */
|
|
9
|
+
export const DISPATCH_MODES = ['auto', 'deep', 'fast'];
|
|
10
|
+
/**
|
|
11
|
+
* Resolve a world by the user-supplied argument.
|
|
12
|
+
*
|
|
13
|
+
* Precedence (backward-compatible — exact ID still wins):
|
|
14
|
+
* 1. Exact ID match.
|
|
15
|
+
* 2. Exact name match (operators usually remember the name, not the id).
|
|
16
|
+
*
|
|
17
|
+
* Returns the matched world, or `undefined` when nothing matches.
|
|
18
|
+
* When two worlds share a name, the first registered wins — callers
|
|
19
|
+
* should fall back to the unambiguous ID, which is surfaced in the
|
|
20
|
+
* not-found suggestion list.
|
|
21
|
+
*/
|
|
22
|
+
export function resolveWorld(worlds, arg) {
|
|
23
|
+
const byId = worlds.find((w) => w.id === arg);
|
|
24
|
+
if (byId)
|
|
25
|
+
return byId;
|
|
26
|
+
return worlds.find((w) => w.name === arg);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Case-insensitive Levenshtein distance, capped — we only care about
|
|
30
|
+
* "close enough to be a typo", not the exact edit count.
|
|
31
|
+
*/
|
|
32
|
+
function editDistance(a, b) {
|
|
33
|
+
const s = a.toLowerCase();
|
|
34
|
+
const t = b.toLowerCase();
|
|
35
|
+
if (s === t)
|
|
36
|
+
return 0;
|
|
37
|
+
const m = s.length;
|
|
38
|
+
const n = t.length;
|
|
39
|
+
if (m === 0)
|
|
40
|
+
return n;
|
|
41
|
+
if (n === 0)
|
|
42
|
+
return m;
|
|
43
|
+
// Single-row DP. `row[j]` holds the distance for the previous source
|
|
44
|
+
// prefix; `prevDiag` carries the diagonal value across the inner loop.
|
|
45
|
+
const row = Array.from({ length: n + 1 }, (_, i) => i);
|
|
46
|
+
for (let i = 1; i <= m; i += 1) {
|
|
47
|
+
let prevDiag = row[0]; // row[0] before overwrite = D[i-1][0]
|
|
48
|
+
row[0] = i;
|
|
49
|
+
for (let j = 1; j <= n; j += 1) {
|
|
50
|
+
const cost = s.charCodeAt(i - 1) === t.charCodeAt(j - 1) ? 0 : 1;
|
|
51
|
+
const above = row[j]; // D[i-1][j]
|
|
52
|
+
const left = row[j - 1]; // D[i][j-1]
|
|
53
|
+
row[j] = Math.min(left + 1, above + 1, prevDiag + cost);
|
|
54
|
+
prevDiag = above;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return row[n];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Rank worlds by how likely the operator meant them, given a typo'd or
|
|
61
|
+
* partial argument. Used to build a "did you mean" hint on not-found.
|
|
62
|
+
*
|
|
63
|
+
* Matching signal (lower score = better):
|
|
64
|
+
* - substring match on id or name (case-insensitive) → strong signal
|
|
65
|
+
* - small edit distance to id or name → typo signal
|
|
66
|
+
*
|
|
67
|
+
* Returns at most `limit` candidates, best first. Worlds with no
|
|
68
|
+
* plausible relationship to the argument are dropped, so an empty
|
|
69
|
+
* result is meaningful ("nothing close").
|
|
70
|
+
*/
|
|
71
|
+
export function suggestWorlds(worlds, arg, limit = 3) {
|
|
72
|
+
const needle = arg.toLowerCase();
|
|
73
|
+
// Typos within ~40% of the token length are plausible; clamp to >=2 so
|
|
74
|
+
// short ids/names still tolerate a one-char slip.
|
|
75
|
+
const threshold = Math.max(2, Math.ceil(needle.length * 0.4));
|
|
76
|
+
const scored = worlds
|
|
77
|
+
.map((w) => {
|
|
78
|
+
const id = w.id.toLowerCase();
|
|
79
|
+
const name = w.name.toLowerCase();
|
|
80
|
+
const substring = id.includes(needle) || name.includes(needle);
|
|
81
|
+
const dist = Math.min(editDistance(arg, w.id), editDistance(arg, w.name));
|
|
82
|
+
// Substring matches sort ahead of pure edit-distance matches.
|
|
83
|
+
const score = substring ? -1000 + dist : dist;
|
|
84
|
+
return { world: w, score, plausible: substring || dist <= threshold };
|
|
85
|
+
})
|
|
86
|
+
.filter((c) => c.plausible)
|
|
87
|
+
.sort((a, b) => a.score - b.score);
|
|
88
|
+
return scored.slice(0, limit).map((c) => c.world);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Validate a `--mode` value. Returns the canonical mode on success, or
|
|
92
|
+
* an `error` describing the valid set on failure. Unknown modes used to
|
|
93
|
+
* silently fall through to non-deep behaviour; surfacing them prevents
|
|
94
|
+
* a typo (`--mode dep`) from quietly running the wrong execution shape.
|
|
95
|
+
*/
|
|
96
|
+
export function validateMode(raw) {
|
|
97
|
+
const normalized = raw.trim().toLowerCase();
|
|
98
|
+
if (DISPATCH_MODES.includes(normalized)) {
|
|
99
|
+
return { mode: normalized };
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
error: `Invalid --mode "${raw}". Valid modes: ${DISPATCH_MODES.join(', ')}.`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=dispatch-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-resolve.js","sourceRoot":"","sources":["../../src/commands/dispatch-resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8IvD"}
|
|
@@ -9,34 +9,65 @@ import pc from 'picocolors';
|
|
|
9
9
|
import { loadContext } from '../context.js';
|
|
10
10
|
import { printError, printInfo, printHeader } from '../output.js';
|
|
11
11
|
import { DEEP_MODE_SUFFIX, COMPLEX_PROMPT_RE } from '@olam/core/src/orchestrator/dispatch.js';
|
|
12
|
+
import { resolveWorld, suggestWorlds, validateMode, DISPATCH_MODES } from './dispatch-resolve.js';
|
|
12
13
|
export function registerDispatch(program) {
|
|
13
14
|
program
|
|
14
15
|
.command('dispatch')
|
|
15
16
|
.description('Send a prompt to a world for execution')
|
|
16
|
-
.argument('<world>', 'World ID')
|
|
17
|
+
.argument('<world>', 'World ID or name')
|
|
17
18
|
.argument('<prompt>', 'Task prompt')
|
|
18
|
-
.option('--mode <mode>',
|
|
19
|
+
.option('--mode <mode>', `Execution mode: ${DISPATCH_MODES.join(', ')}`, 'auto')
|
|
19
20
|
.option('--max-turns <n>', 'Maximum turns', parseInt)
|
|
20
|
-
.action(async (
|
|
21
|
+
.action(async (world, prompt, opts) => {
|
|
22
|
+
// Validate --mode up front: a typo (`--mode dep`) used to fall
|
|
23
|
+
// through to non-deep behaviour silently. Fail loud instead.
|
|
24
|
+
const modeResult = validateMode(opts.mode);
|
|
25
|
+
if ('error' in modeResult) {
|
|
26
|
+
printError(modeResult.error);
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const mode = modeResult.mode;
|
|
21
31
|
const { ctx, error } = await loadContext();
|
|
22
32
|
if (!ctx) {
|
|
23
33
|
printError(error?.message ?? 'Olam is not configured. Run `olam init` first.');
|
|
24
34
|
process.exitCode = 1;
|
|
25
35
|
return;
|
|
26
36
|
}
|
|
27
|
-
const
|
|
37
|
+
const worlds = ctx.worldManager.listWorlds();
|
|
38
|
+
// Accept either a world ID (existing contract) or a name — operators
|
|
39
|
+
// usually remember the name, not the generated id.
|
|
40
|
+
const worldMeta = resolveWorld(worlds, world);
|
|
28
41
|
if (!worldMeta) {
|
|
29
|
-
printError(`World "${
|
|
42
|
+
printError(`World "${world}" not found.`);
|
|
43
|
+
const suggestions = suggestWorlds(worlds, world);
|
|
44
|
+
if (suggestions.length > 0) {
|
|
45
|
+
console.error(pc.dim('\n Did you mean:'));
|
|
46
|
+
for (const s of suggestions) {
|
|
47
|
+
console.error(` ${pc.bold(s.name)} ${pc.dim(`(${s.id})`)} ${pc.dim(s.status)}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
console.error(pc.dim('\n Run `olam list` to see all worlds.'));
|
|
30
51
|
process.exitCode = 1;
|
|
31
52
|
return;
|
|
32
53
|
}
|
|
54
|
+
const worldId = worldMeta.id;
|
|
33
55
|
// D3: warn-not-block version pin check (once per world per session).
|
|
34
56
|
{
|
|
35
57
|
const { checkVersionPin } = await import('@olam/core/src/world/version-pin.js');
|
|
36
58
|
checkVersionPin(worldId, worldMeta.workspacePath);
|
|
37
59
|
}
|
|
38
60
|
if (worldMeta.status !== 'running') {
|
|
39
|
-
printError(`World "${
|
|
61
|
+
printError(`World "${worldMeta.name}" (${worldId}) is ${worldMeta.status}. Only running worlds accept dispatches.`);
|
|
62
|
+
if (worldMeta.status === 'paused') {
|
|
63
|
+
console.error(pc.dim(`\n Resume it first: olam resume ${worldId}`));
|
|
64
|
+
}
|
|
65
|
+
else if (worldMeta.status === 'destroyed') {
|
|
66
|
+
console.error(pc.dim('\n This world was destroyed. Create a fresh one with `olam create`.'));
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.error(pc.dim(`\n Check what it's doing: olam status ${worldId}`));
|
|
70
|
+
}
|
|
40
71
|
process.exitCode = 1;
|
|
41
72
|
return;
|
|
42
73
|
}
|
|
@@ -53,10 +84,10 @@ export function registerDispatch(program) {
|
|
|
53
84
|
await computeWorld.exec('curl -s -X POST http://localhost:8080/api/claude/start');
|
|
54
85
|
// Enhance prompt based on mode (shared regex with MCP server)
|
|
55
86
|
let finalPrompt = prompt;
|
|
56
|
-
if (
|
|
87
|
+
if (mode === 'deep') {
|
|
57
88
|
finalPrompt += DEEP_MODE_SUFFIX;
|
|
58
89
|
}
|
|
59
|
-
else if (
|
|
90
|
+
else if (mode === 'auto') {
|
|
60
91
|
const isComplex = prompt.length > 100 ||
|
|
61
92
|
COMPLEX_PROMPT_RE.test(prompt);
|
|
62
93
|
if (isComplex) {
|
|
@@ -83,7 +114,7 @@ export function registerDispatch(program) {
|
|
|
83
114
|
const terminalPort = 17681 + worldMeta.portOffset;
|
|
84
115
|
printHeader('Dispatch');
|
|
85
116
|
printInfo('World', `${worldMeta.name} (${worldId})`);
|
|
86
|
-
printInfo('Mode',
|
|
117
|
+
printInfo('Mode', mode);
|
|
87
118
|
printInfo('Dashboard', `http://localhost:${dashboardPort}`);
|
|
88
119
|
printInfo('Terminal', `http://localhost:${terminalPort}`);
|
|
89
120
|
const containerName = `olam-${worldId}-devbox`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,5 +11,36 @@
|
|
|
11
11
|
* Plan reference: docs/plans/olam-flywheel-cli-namespace/phase-a-tasks.md § A4
|
|
12
12
|
*/
|
|
13
13
|
import type { Command } from 'commander';
|
|
14
|
+
/**
|
|
15
|
+
* Structured validation outcome. Stable shape consumed by `--json` mode — the
|
|
16
|
+
* /10x: chain reads `status` + `errors` programmatically instead of parsing the
|
|
17
|
+
* human-readable `message` prose.
|
|
18
|
+
*
|
|
19
|
+
* status 'pass' → file is valid (k5 block present + well-formed)
|
|
20
|
+
* status 'absent' → no k5 fields present (acceptable for legacy plans)
|
|
21
|
+
* status 'fail' → one or more present k5 fields fail schema validation
|
|
22
|
+
* status 'error' → file could not be read / parsed (stat / oversize / YAML)
|
|
23
|
+
*/
|
|
24
|
+
type ValidateStatus = 'pass' | 'absent' | 'fail' | 'error';
|
|
25
|
+
interface ValidateJson {
|
|
26
|
+
path: string;
|
|
27
|
+
status: ValidateStatus;
|
|
28
|
+
/** Schema-violation messages (empty unless status is 'fail' or 'error'). */
|
|
29
|
+
errors: string[];
|
|
30
|
+
/** The parsed k5 field values, when present + valid (null otherwise). */
|
|
31
|
+
k5_scores: Record<string, number> | null;
|
|
32
|
+
k5_boost: number | null;
|
|
33
|
+
k5_composite: number | null;
|
|
34
|
+
k5_scored_at: string | null;
|
|
35
|
+
/** min(k5_scores) convenience for the chain's gate logic (null if no scores). */
|
|
36
|
+
min_score: number | null;
|
|
37
|
+
}
|
|
38
|
+
export interface ValidateResult {
|
|
39
|
+
ok: boolean;
|
|
40
|
+
message: string;
|
|
41
|
+
json: ValidateJson;
|
|
42
|
+
}
|
|
43
|
+
export declare function validatePlan(path: string): ValidateResult;
|
|
14
44
|
export declare function registerFlywheelK5Validate(parent: Command): void;
|
|
45
|
+
export {};
|
|
15
46
|
//# sourceMappingURL=k5-validate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"k5-validate.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/k5-validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"k5-validate.d.ts","sourceRoot":"","sources":["../../../src/commands/flywheel/k5-validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2EzC;;;;;;;;;GASG;AACH,KAAK,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iFAAiF;IACjF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAwHzD;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA4ChE"}
|
|
@@ -76,40 +76,60 @@ function validateK5ScoredAt(scoredAt) {
|
|
|
76
76
|
}
|
|
77
77
|
return null;
|
|
78
78
|
}
|
|
79
|
-
function validatePlan(path) {
|
|
79
|
+
export function validatePlan(path) {
|
|
80
|
+
const emptyJson = (status, errors) => ({
|
|
81
|
+
path,
|
|
82
|
+
status,
|
|
83
|
+
errors,
|
|
84
|
+
k5_scores: null,
|
|
85
|
+
k5_boost: null,
|
|
86
|
+
k5_composite: null,
|
|
87
|
+
k5_scored_at: null,
|
|
88
|
+
min_score: null,
|
|
89
|
+
});
|
|
80
90
|
let stat;
|
|
81
91
|
try {
|
|
82
92
|
stat = statSync(path);
|
|
83
93
|
}
|
|
84
94
|
catch (err) {
|
|
85
|
-
|
|
95
|
+
const m = `FAIL cannot stat ${path}: ${err instanceof Error ? err.message : 'unknown'}`;
|
|
96
|
+
return { ok: false, message: m, json: emptyJson('error', [m]) };
|
|
86
97
|
}
|
|
87
98
|
if (stat.size > MAX_PLAN_BYTES) {
|
|
88
|
-
|
|
99
|
+
const m = `FAIL ${path}: plan file exceeds 1MB (${stat.size} bytes); refusing to parse`;
|
|
100
|
+
return { ok: false, message: m, json: emptyJson('error', [m]) };
|
|
89
101
|
}
|
|
90
102
|
let text;
|
|
91
103
|
try {
|
|
92
104
|
text = readFileSync(path, 'utf8');
|
|
93
105
|
}
|
|
94
106
|
catch (err) {
|
|
95
|
-
|
|
107
|
+
const m = `FAIL cannot read ${path}: ${err instanceof Error ? err.message : 'unknown'}`;
|
|
108
|
+
return { ok: false, message: m, json: emptyJson('error', [m]) };
|
|
96
109
|
}
|
|
97
110
|
if (!text.replace(/^/, '').startsWith('---')) {
|
|
98
|
-
|
|
111
|
+
const m = `FAIL ${path}: no YAML frontmatter (missing opening --- marker)`;
|
|
112
|
+
return { ok: false, message: m, json: emptyJson('error', [m]) };
|
|
99
113
|
}
|
|
100
114
|
if (!text.includes('\n---', 3)) {
|
|
101
|
-
|
|
115
|
+
const m = `FAIL ${path}: frontmatter block never closed (missing closing --- marker)`;
|
|
116
|
+
return { ok: false, message: m, json: emptyJson('error', [m]) };
|
|
102
117
|
}
|
|
103
118
|
const fm = extractFrontmatter(text);
|
|
104
119
|
if (fm === null) {
|
|
105
|
-
|
|
120
|
+
const m = `FAIL ${path}: frontmatter could not be parsed as YAML`;
|
|
121
|
+
return { ok: false, message: m, json: emptyJson('error', [m]) };
|
|
106
122
|
}
|
|
107
123
|
const hasScores = 'k5_scores' in fm;
|
|
108
124
|
const hasBoost = 'k5_boost' in fm;
|
|
109
125
|
const hasComposite = 'k5_composite' in fm;
|
|
110
126
|
const hasScoredAt = 'k5_scored_at' in fm;
|
|
111
127
|
if (!hasScores && !hasBoost && !hasComposite && !hasScoredAt) {
|
|
112
|
-
return {
|
|
128
|
+
return {
|
|
129
|
+
ok: true,
|
|
130
|
+
message: `PASS ${path}: k5_scores absent (acceptable — legacy plan)`,
|
|
131
|
+
json: emptyJson('absent', []),
|
|
132
|
+
};
|
|
113
133
|
}
|
|
114
134
|
const errors = [];
|
|
115
135
|
if (hasScores) {
|
|
@@ -133,51 +153,92 @@ function validatePlan(path) {
|
|
|
133
153
|
errors.push(err);
|
|
134
154
|
}
|
|
135
155
|
if (errors.length > 0) {
|
|
136
|
-
return {
|
|
137
|
-
|
|
156
|
+
return {
|
|
157
|
+
ok: false,
|
|
158
|
+
message: `FAIL ${path}: ${errors.join('; ')}`,
|
|
159
|
+
json: emptyJson('fail', errors),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
// Build both the human-readable lines and the structured json payload from
|
|
163
|
+
// the same parsed values — single source of truth, no drift between surfaces.
|
|
164
|
+
const json = emptyJson('pass', []);
|
|
138
165
|
const lines = [`PASS ${path}: k5_scores valid`];
|
|
139
166
|
if (hasScores && typeof fm.k5_scores === 'object' && fm.k5_scores !== null) {
|
|
140
167
|
const scoresObj = fm.k5_scores;
|
|
168
|
+
const parsed = {};
|
|
141
169
|
const vals = [];
|
|
142
170
|
for (const dim of K5_DIMS) {
|
|
143
171
|
const raw = scoresObj[dim];
|
|
144
172
|
const n = typeof raw === 'number' ? raw : Number.parseInt(String(raw), 10);
|
|
173
|
+
parsed[dim] = n;
|
|
145
174
|
vals.push(n);
|
|
146
175
|
lines.push(` ${dim}: ${n}`);
|
|
147
176
|
}
|
|
148
|
-
|
|
177
|
+
json.k5_scores = parsed;
|
|
178
|
+
json.min_score = Math.min(...vals);
|
|
179
|
+
lines.push(` min(k5_scores): ${json.min_score}`);
|
|
149
180
|
}
|
|
150
181
|
if (hasBoost) {
|
|
151
182
|
const n = typeof fm.k5_boost === 'number' ? fm.k5_boost : Number.parseFloat(String(fm.k5_boost));
|
|
183
|
+
json.k5_boost = n;
|
|
152
184
|
lines.push(` k5_boost: ${n.toFixed(2)}`);
|
|
153
185
|
}
|
|
154
|
-
if (hasComposite)
|
|
186
|
+
if (hasComposite) {
|
|
187
|
+
const n = typeof fm.k5_composite === 'number' ? fm.k5_composite : Number.parseInt(String(fm.k5_composite), 10);
|
|
188
|
+
json.k5_composite = n;
|
|
155
189
|
lines.push(` k5_composite: ${String(fm.k5_composite)}`);
|
|
156
|
-
|
|
190
|
+
}
|
|
191
|
+
if (hasScoredAt) {
|
|
192
|
+
json.k5_scored_at = String(fm.k5_scored_at);
|
|
157
193
|
lines.push(` k5_scored_at: ${String(fm.k5_scored_at)}`);
|
|
194
|
+
}
|
|
158
195
|
if ('confidence' in fm)
|
|
159
196
|
lines.push(` confidence (existing): ${String(fm.confidence)}`);
|
|
160
|
-
return { ok: true, message: lines.join('\n') };
|
|
197
|
+
return { ok: true, message: lines.join('\n'), json };
|
|
161
198
|
}
|
|
162
199
|
export function registerFlywheelK5Validate(parent) {
|
|
163
200
|
parent
|
|
164
201
|
.command('k5-validate')
|
|
165
202
|
.description("Schema-check a plan's frontmatter k5_scores / k5_boost / k5_composite / k5_scored_at")
|
|
166
203
|
.argument('<plan-path>', 'path to the plan markdown file')
|
|
167
|
-
.
|
|
204
|
+
.option('--json', 'emit the structured validation result as JSON on stdout instead of prose')
|
|
205
|
+
.action((planPath, opts) => {
|
|
206
|
+
// Exit-code contract is identical across both surfaces:
|
|
207
|
+
// 0 = pass / absent, 1 = fail (schema violation), 2 = error (read/parse).
|
|
208
|
+
// --json mode writes the JSON payload to stdout regardless of outcome so a
|
|
209
|
+
// chain consumer can capture + branch on `.status`; prose mode keeps the
|
|
210
|
+
// pass→stdout / fail→stderr split for human-shell ergonomics.
|
|
168
211
|
try {
|
|
169
212
|
const result = validatePlan(planPath);
|
|
170
|
-
if (
|
|
213
|
+
if (opts.json) {
|
|
214
|
+
process.stdout.write(JSON.stringify(result.json) + '\n');
|
|
215
|
+
}
|
|
216
|
+
else if (result.ok) {
|
|
171
217
|
process.stdout.write(result.message + '\n');
|
|
172
|
-
process.exit(0);
|
|
173
218
|
}
|
|
174
219
|
else {
|
|
175
220
|
process.stderr.write(result.message + '\n');
|
|
176
|
-
process.exit(1);
|
|
177
221
|
}
|
|
222
|
+
const code = result.json.status === 'error' ? 2 : result.ok ? 0 : 1;
|
|
223
|
+
process.exit(code);
|
|
178
224
|
}
|
|
179
225
|
catch (err) {
|
|
180
|
-
|
|
226
|
+
const msg = `FAIL ${planPath}: unexpected error: ${err instanceof Error ? err.message : 'unknown'}`;
|
|
227
|
+
if (opts.json) {
|
|
228
|
+
process.stdout.write(JSON.stringify({
|
|
229
|
+
path: planPath,
|
|
230
|
+
status: 'error',
|
|
231
|
+
errors: [msg],
|
|
232
|
+
k5_scores: null,
|
|
233
|
+
k5_boost: null,
|
|
234
|
+
k5_composite: null,
|
|
235
|
+
k5_scored_at: null,
|
|
236
|
+
min_score: null,
|
|
237
|
+
}) + '\n');
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
process.stderr.write(msg + '\n');
|
|
241
|
+
}
|
|
181
242
|
process.exit(2);
|
|
182
243
|
}
|
|
183
244
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"k5-validate.js","sourceRoot":"","sources":["../../../src/commands/flywheel/k5-validate.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"k5-validate.js","sourceRoot":"","sources":["../../../src/commands/flywheel/k5-validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kg-classify.d.ts","sourceRoot":"","sources":["../../src/commands/kg-classify.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"kg-classify.d.ts","sourceRoot":"","sources":["../../src/commands/kg-classify.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAiD3D"}
|
|
@@ -8,6 +8,14 @@
|
|
|
8
8
|
import pc from 'picocolors';
|
|
9
9
|
import { classify, KgServiceUnreachableError } from '@olam/core/src/kg/kg-service-client.js';
|
|
10
10
|
import { printError, printInfo } from '../output.js';
|
|
11
|
+
/** Compact token-count formatting (mirrors `kg savings`' `~`-prefix convention). */
|
|
12
|
+
function formatSavedTokens(n) {
|
|
13
|
+
if (n >= 1_000_000)
|
|
14
|
+
return `~${(n / 1_000_000).toFixed(1)}M`;
|
|
15
|
+
if (n >= 1_000)
|
|
16
|
+
return `~${Math.round(n / 1000)}k`;
|
|
17
|
+
return `~${n}`;
|
|
18
|
+
}
|
|
11
19
|
export function registerKgClassifyCommand(kg) {
|
|
12
20
|
kg.command('classify <question>')
|
|
13
21
|
.description('Route a question to kg | grep | both via the 4-layer classifier (kg-service required)')
|
|
@@ -36,6 +44,18 @@ export function registerKgClassifyCommand(kg) {
|
|
|
36
44
|
if (result.candidate_symbols.length > 0) {
|
|
37
45
|
printInfo('symbols', result.candidate_symbols.join(', '));
|
|
38
46
|
}
|
|
47
|
+
// Hit-signal metadata enriched by the server. `nodes_matched` is the
|
|
48
|
+
// count of distinct symbol/exemplar matches the route resolved to —
|
|
49
|
+
// the "matched signals" an operator wants to see at a glance. Only
|
|
50
|
+
// meaningful (and only emitted) when the route is not grep.
|
|
51
|
+
if (result.route !== 'grep') {
|
|
52
|
+
if (result.nodes_matched != null) {
|
|
53
|
+
printInfo('matched signals', String(result.nodes_matched));
|
|
54
|
+
}
|
|
55
|
+
if (result.savings && result.savings.saved_tokens_est > 0) {
|
|
56
|
+
printInfo('est. savings', `${formatSavedTokens(result.savings.saved_tokens_est)} tokens`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
39
59
|
}
|
|
40
60
|
catch (err) {
|
|
41
61
|
if (err instanceof KgServiceUnreachableError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kg-classify.js","sourceRoot":"","sources":["../../src/commands/kg-classify.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOrD,MAAM,UAAU,yBAAyB,CAAC,EAAW;IACnD,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,uFAAuF,CAAC;SACpG,MAAM,CAAC,oBAAoB,EAAE,uDAAuD,CAAC;SACrF,MAAM,CAAC,QAAQ,EAAE,gDAAgD,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,IAAuB,EAAE,EAAE;QAC1D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAC1E,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;YACD,4BAA4B;YAC5B,MAAM,QAAQ,GACZ,MAAM,CAAC,KAAK,KAAK,IAAI;gBACnB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;gBACf,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM;oBACvB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;oBACpB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,SAAS,CAAC,OAAO,EAAE,GAAG,QAAQ,YAAY,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;YACrF,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YACnD,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,UAAU;gBAAE,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAClE,IAAI,MAAM,CAAC,SAAS;gBAAE,SAAS,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,SAAU,SAAS,MAAM,CAAC,OAAO,IAAI,GAAG,GAAG,CAAC,CAAC;YACpG,IAAI,MAAM,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,yBAAyB,EAAE,CAAC;gBAC7C,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,UAAU,CAAC,oBAAoB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
1
|
+
{"version":3,"file":"kg-classify.js","sourceRoot":"","sources":["../../src/commands/kg-classify.ts"],"names":[],"mappings":"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"}
|