@agentworkforce/cli 0.1.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.
- package/README.md +382 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +249 -0
- package/dist/cli.js.map +1 -0
- package/dist/env-refs.d.ts +56 -0
- package/dist/env-refs.d.ts.map +1 -0
- package/dist/env-refs.js +105 -0
- package/dist/env-refs.js.map +1 -0
- package/dist/env-refs.test.d.ts +2 -0
- package/dist/env-refs.test.d.ts.map +1 -0
- package/dist/env-refs.test.js +84 -0
- package/dist/env-refs.test.js.map +1 -0
- package/dist/local-personas.d.ts +42 -0
- package/dist/local-personas.d.ts.map +1 -0
- package/dist/local-personas.js +305 -0
- package/dist/local-personas.js.map +1 -0
- package/dist/local-personas.test.d.ts +2 -0
- package/dist/local-personas.test.d.ts.map +1 -0
- package/dist/local-personas.test.js +242 -0
- package/dist/local-personas.test.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve env references in persona `env` / `mcpServers` values against the
|
|
3
|
+
* caller's process environment. Two reference forms are supported:
|
|
4
|
+
*
|
|
5
|
+
* "$VAR" whole-string reference; replaced by the env var value.
|
|
6
|
+
* "Bearer ${VAR}" braced reference(s), interpolated anywhere in the
|
|
7
|
+
* string. Useful for header prefixes like `Bearer …`.
|
|
8
|
+
*
|
|
9
|
+
* Bare `$VAR` that appears *inside* a longer string (without braces) is kept
|
|
10
|
+
* as a literal — we only interpolate when the intent is unambiguous, so a
|
|
11
|
+
* literal `$` in a JSON string doesn't accidentally get eaten.
|
|
12
|
+
*
|
|
13
|
+
* A missing env var is a hard error naming both the referenced variable and
|
|
14
|
+
* the persona field that asked for it.
|
|
15
|
+
*/
|
|
16
|
+
export type EnvRefResolver = (value: string) => string;
|
|
17
|
+
export declare class MissingEnvRefError extends Error {
|
|
18
|
+
readonly ref: string;
|
|
19
|
+
readonly referencedBy: string;
|
|
20
|
+
constructor(ref: string, referencedBy: string);
|
|
21
|
+
}
|
|
22
|
+
export declare function makeEnvRefResolver(processEnv: NodeJS.ProcessEnv): (value: string, field: string) => string;
|
|
23
|
+
export declare function resolveStringMap(map: Record<string, string> | undefined, processEnv: NodeJS.ProcessEnv, fieldPrefix: string): Record<string, string> | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Like {@link makeEnvRefResolver} but never throws on missing refs. Returns
|
|
26
|
+
* a result object the caller can inspect to decide whether a missing ref is
|
|
27
|
+
* fatal (e.g. a `url` / `command`) or droppable (e.g. a specific header).
|
|
28
|
+
*/
|
|
29
|
+
export type LenientResult = {
|
|
30
|
+
ok: true;
|
|
31
|
+
value: string;
|
|
32
|
+
} | {
|
|
33
|
+
ok: false;
|
|
34
|
+
field: string;
|
|
35
|
+
ref: string;
|
|
36
|
+
};
|
|
37
|
+
export declare function makeLenientResolver(processEnv: NodeJS.ProcessEnv): (value: string, field: string) => LenientResult;
|
|
38
|
+
export interface DroppedRef {
|
|
39
|
+
field: string;
|
|
40
|
+
ref: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Walk a `Record<string,string>`, resolving each value leniently. Entries
|
|
44
|
+
* whose value referenced an unset env var are dropped from the result and
|
|
45
|
+
* reported via `dropped`. Literal strings and successfully-resolved refs
|
|
46
|
+
* pass through to `value`.
|
|
47
|
+
*
|
|
48
|
+
* Returns `value: undefined` when every entry was either dropped or the map
|
|
49
|
+
* itself was undefined — callers can use that to decide whether to emit a
|
|
50
|
+
* flag at all.
|
|
51
|
+
*/
|
|
52
|
+
export declare function resolveStringMapLenient(map: Record<string, string> | undefined, processEnv: NodeJS.ProcessEnv, fieldPrefix: string): {
|
|
53
|
+
value: Record<string, string> | undefined;
|
|
54
|
+
dropped: DroppedRef[];
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=env-refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-refs.d.ts","sourceRoot":"","sources":["../src/env-refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAKvD,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAClB,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;CAQ9C;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,CACjE,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,KACV,MAAM,CAsBV;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACvC,UAAU,EAAE,MAAM,CAAC,UAAU,EAC7B,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAQpC;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9C,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,CAAC,UAAU,GAC5B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,aAAa,CAYjD;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACvC,UAAU,EAAE,MAAM,CAAC,UAAU,EAC7B,WAAW,EAAE,MAAM,GAClB;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,CAkBtE"}
|
package/dist/env-refs.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve env references in persona `env` / `mcpServers` values against the
|
|
3
|
+
* caller's process environment. Two reference forms are supported:
|
|
4
|
+
*
|
|
5
|
+
* "$VAR" whole-string reference; replaced by the env var value.
|
|
6
|
+
* "Bearer ${VAR}" braced reference(s), interpolated anywhere in the
|
|
7
|
+
* string. Useful for header prefixes like `Bearer …`.
|
|
8
|
+
*
|
|
9
|
+
* Bare `$VAR` that appears *inside* a longer string (without braces) is kept
|
|
10
|
+
* as a literal — we only interpolate when the intent is unambiguous, so a
|
|
11
|
+
* literal `$` in a JSON string doesn't accidentally get eaten.
|
|
12
|
+
*
|
|
13
|
+
* A missing env var is a hard error naming both the referenced variable and
|
|
14
|
+
* the persona field that asked for it.
|
|
15
|
+
*/
|
|
16
|
+
const WHOLE_REF = /^\$([A-Z_][A-Z0-9_]*)$/;
|
|
17
|
+
const BRACED_REF = /\$\{([A-Z_][A-Z0-9_]*)\}/g;
|
|
18
|
+
export class MissingEnvRefError extends Error {
|
|
19
|
+
ref;
|
|
20
|
+
referencedBy;
|
|
21
|
+
constructor(ref, referencedBy) {
|
|
22
|
+
super(`Environment variable ${ref} is required by persona field \`${referencedBy}\` but is not set in the current shell. Export it and retry.`);
|
|
23
|
+
this.name = 'MissingEnvRefError';
|
|
24
|
+
this.ref = ref;
|
|
25
|
+
this.referencedBy = referencedBy;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function makeEnvRefResolver(processEnv) {
|
|
29
|
+
return (value, field) => {
|
|
30
|
+
const whole = WHOLE_REF.exec(value);
|
|
31
|
+
if (whole) {
|
|
32
|
+
const name = whole[1];
|
|
33
|
+
const resolved = processEnv[name];
|
|
34
|
+
if (resolved === undefined || resolved === '') {
|
|
35
|
+
throw new MissingEnvRefError(name, field);
|
|
36
|
+
}
|
|
37
|
+
return resolved;
|
|
38
|
+
}
|
|
39
|
+
if (!value.includes('${'))
|
|
40
|
+
return value;
|
|
41
|
+
return value.replace(BRACED_REF, (_, name) => {
|
|
42
|
+
const resolved = processEnv[name];
|
|
43
|
+
if (resolved === undefined || resolved === '') {
|
|
44
|
+
throw new MissingEnvRefError(name, field);
|
|
45
|
+
}
|
|
46
|
+
return resolved;
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function resolveStringMap(map, processEnv, fieldPrefix) {
|
|
51
|
+
if (!map)
|
|
52
|
+
return undefined;
|
|
53
|
+
const resolve = makeEnvRefResolver(processEnv);
|
|
54
|
+
const out = {};
|
|
55
|
+
for (const [key, value] of Object.entries(map)) {
|
|
56
|
+
out[key] = resolve(value, `${fieldPrefix}.${key}`);
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
export function makeLenientResolver(processEnv) {
|
|
61
|
+
const strict = makeEnvRefResolver(processEnv);
|
|
62
|
+
return (value, field) => {
|
|
63
|
+
try {
|
|
64
|
+
return { ok: true, value: strict(value, field) };
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
if (err instanceof MissingEnvRefError) {
|
|
68
|
+
return { ok: false, field, ref: err.ref };
|
|
69
|
+
}
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Walk a `Record<string,string>`, resolving each value leniently. Entries
|
|
76
|
+
* whose value referenced an unset env var are dropped from the result and
|
|
77
|
+
* reported via `dropped`. Literal strings and successfully-resolved refs
|
|
78
|
+
* pass through to `value`.
|
|
79
|
+
*
|
|
80
|
+
* Returns `value: undefined` when every entry was either dropped or the map
|
|
81
|
+
* itself was undefined — callers can use that to decide whether to emit a
|
|
82
|
+
* flag at all.
|
|
83
|
+
*/
|
|
84
|
+
export function resolveStringMapLenient(map, processEnv, fieldPrefix) {
|
|
85
|
+
if (!map)
|
|
86
|
+
return { value: undefined, dropped: [] };
|
|
87
|
+
const resolve = makeLenientResolver(processEnv);
|
|
88
|
+
const out = {};
|
|
89
|
+
const dropped = [];
|
|
90
|
+
for (const [key, raw] of Object.entries(map)) {
|
|
91
|
+
const field = `${fieldPrefix}.${key}`;
|
|
92
|
+
const result = resolve(raw, field);
|
|
93
|
+
if (result.ok) {
|
|
94
|
+
out[key] = result.value;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
dropped.push({ field: result.field, ref: result.ref });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
value: Object.keys(out).length > 0 ? out : undefined,
|
|
102
|
+
dropped
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=env-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-refs.js","sourceRoot":"","sources":["../src/env-refs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-refs.test.d.ts","sourceRoot":"","sources":["../src/env-refs.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { MissingEnvRefError, makeEnvRefResolver, makeLenientResolver, resolveStringMap, resolveStringMapLenient } from './env-refs.js';
|
|
4
|
+
test('resolves $VAR references against the provided env', () => {
|
|
5
|
+
const resolve = makeEnvRefResolver({ FOO: 'hello' });
|
|
6
|
+
assert.equal(resolve('$FOO', 'x'), 'hello');
|
|
7
|
+
});
|
|
8
|
+
test('passes literal strings through untouched', () => {
|
|
9
|
+
const resolve = makeEnvRefResolver({ FOO: 'hello' });
|
|
10
|
+
assert.equal(resolve('plain literal', 'x'), 'plain literal');
|
|
11
|
+
assert.equal(resolve('Bearer hello-world', 'x'), 'Bearer hello-world');
|
|
12
|
+
});
|
|
13
|
+
test('refuses un-braced partial interpolation — prefix-$VAR stays literal', () => {
|
|
14
|
+
// Unbraced `$VAR` mid-string is kept as-is so a stray `$` in a JSON value
|
|
15
|
+
// doesn't get eaten by accident. Use ${VAR} for partial interpolation.
|
|
16
|
+
const resolve = makeEnvRefResolver({ FOO: 'hello' });
|
|
17
|
+
assert.equal(resolve('prefix-$FOO', 'x'), 'prefix-$FOO');
|
|
18
|
+
});
|
|
19
|
+
test('resolves braced ${VAR} interpolation anywhere in a string', () => {
|
|
20
|
+
const resolve = makeEnvRefResolver({ POSTHOG_API_KEY: 'phx_abc' });
|
|
21
|
+
assert.equal(resolve('Bearer ${POSTHOG_API_KEY}', 'auth'), 'Bearer phx_abc');
|
|
22
|
+
assert.equal(resolve('${POSTHOG_API_KEY}-suffix', 'x'), 'phx_abc-suffix');
|
|
23
|
+
assert.equal(resolve('${POSTHOG_API_KEY}', 'x'), 'phx_abc');
|
|
24
|
+
});
|
|
25
|
+
test('interpolates multiple ${VAR} occurrences in the same string', () => {
|
|
26
|
+
const resolve = makeEnvRefResolver({ A: 'one', B: 'two' });
|
|
27
|
+
assert.equal(resolve('${A}-${B}-${A}', 'x'), 'one-two-one');
|
|
28
|
+
});
|
|
29
|
+
test('missing ${VAR} inside a longer string errors with the field and var', () => {
|
|
30
|
+
const resolve = makeEnvRefResolver({ FOO: 'ok' });
|
|
31
|
+
assert.throws(() => resolve('Bearer ${MISSING_KEY}', 'headers.Authorization'), (err) => err instanceof MissingEnvRefError &&
|
|
32
|
+
err.ref === 'MISSING_KEY' &&
|
|
33
|
+
err.referencedBy === 'headers.Authorization');
|
|
34
|
+
});
|
|
35
|
+
test('throws MissingEnvRefError with the referenced name and field', () => {
|
|
36
|
+
const resolve = makeEnvRefResolver({});
|
|
37
|
+
assert.throws(() => resolve('$POSTHOG_API_KEY', 'env.POSTHOG_API_KEY'), (err) => err instanceof MissingEnvRefError &&
|
|
38
|
+
err.ref === 'POSTHOG_API_KEY' &&
|
|
39
|
+
err.referencedBy === 'env.POSTHOG_API_KEY');
|
|
40
|
+
});
|
|
41
|
+
test('treats empty-string env vars as missing (explicit unset)', () => {
|
|
42
|
+
const resolve = makeEnvRefResolver({ FOO: '' });
|
|
43
|
+
assert.throws(() => resolve('$FOO', 'x'), MissingEnvRefError);
|
|
44
|
+
});
|
|
45
|
+
test('resolveStringMap walks every value and reports the originating field', () => {
|
|
46
|
+
const result = resolveStringMap({ A: '$FOO', B: 'literal' }, { FOO: 'ok' }, 'env');
|
|
47
|
+
assert.deepEqual(result, { A: 'ok', B: 'literal' });
|
|
48
|
+
assert.throws(() => resolveStringMap({ X: '$MISSING' }, {}, 'env'), (err) => err instanceof MissingEnvRefError &&
|
|
49
|
+
err.ref === 'MISSING' &&
|
|
50
|
+
err.referencedBy === 'env.X');
|
|
51
|
+
});
|
|
52
|
+
test('resolveStringMap returns undefined for undefined input', () => {
|
|
53
|
+
assert.equal(resolveStringMap(undefined, {}, 'env'), undefined);
|
|
54
|
+
});
|
|
55
|
+
test('lenient resolver reports missing refs instead of throwing', () => {
|
|
56
|
+
const resolve = makeLenientResolver({ FOO: 'ok' });
|
|
57
|
+
assert.deepEqual(resolve('$FOO', 'x'), { ok: true, value: 'ok' });
|
|
58
|
+
assert.deepEqual(resolve('$MISSING', 'env.K'), {
|
|
59
|
+
ok: false,
|
|
60
|
+
field: 'env.K',
|
|
61
|
+
ref: 'MISSING'
|
|
62
|
+
});
|
|
63
|
+
assert.deepEqual(resolve('Bearer ${MISSING_KEY}', 'headers.Auth'), {
|
|
64
|
+
ok: false,
|
|
65
|
+
field: 'headers.Auth',
|
|
66
|
+
ref: 'MISSING_KEY'
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
test('resolveStringMapLenient drops missing entries and reports them', () => {
|
|
70
|
+
const result = resolveStringMapLenient({
|
|
71
|
+
PRESENT: '$FOO',
|
|
72
|
+
MISSING: '$NOPE',
|
|
73
|
+
LITERAL: 'plain',
|
|
74
|
+
PARTIAL_MISSING: 'Bearer ${NO_KEY}'
|
|
75
|
+
}, { FOO: 'value' }, 'env');
|
|
76
|
+
assert.deepEqual(result.value, { PRESENT: 'value', LITERAL: 'plain' });
|
|
77
|
+
assert.deepEqual(result.dropped.map((d) => `${d.field}:${d.ref}`).sort(), ['env.MISSING:NOPE', 'env.PARTIAL_MISSING:NO_KEY']);
|
|
78
|
+
});
|
|
79
|
+
test('resolveStringMapLenient returns value=undefined when all entries dropped', () => {
|
|
80
|
+
const result = resolveStringMapLenient({ A: '$MISSING' }, {}, 'env');
|
|
81
|
+
assert.equal(result.value, undefined);
|
|
82
|
+
assert.equal(result.dropped.length, 1);
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=env-refs.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-refs.test.js","sourceRoot":"","sources":["../src/env-refs.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type McpServerSpec, type PersonaPermissions, type PersonaRuntime, type PersonaSpec, type PersonaTier } from '@agentworkforce/workload-router';
|
|
2
|
+
/**
|
|
3
|
+
* User-defined persona override. Local files are partial overlays — only the
|
|
4
|
+
* fields you specify replace the inherited base; everything else cascades down
|
|
5
|
+
* through pwd → home → library.
|
|
6
|
+
*
|
|
7
|
+
* `extends` names the base explicitly by id or intent. If omitted, the loader
|
|
8
|
+
* implicitly inherits from the same-id persona found in the next lower layer.
|
|
9
|
+
*/
|
|
10
|
+
export interface LocalPersonaOverride {
|
|
11
|
+
id: string;
|
|
12
|
+
extends?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
skills?: PersonaSpec['skills'];
|
|
15
|
+
env?: Record<string, string>;
|
|
16
|
+
mcpServers?: Record<string, McpServerSpec>;
|
|
17
|
+
/**
|
|
18
|
+
* Permission policy. `allow` and `deny` append to the base's lists (dedup
|
|
19
|
+
* on merge); `mode` replaces the base's mode when set.
|
|
20
|
+
*/
|
|
21
|
+
permissions?: PersonaPermissions;
|
|
22
|
+
/** Convenience: replaces systemPrompt on every inherited tier. Ignored if `tiers` is also set. */
|
|
23
|
+
systemPrompt?: string;
|
|
24
|
+
/** Per-tier overrides. If a tier is set here, it replaces the inherited tier wholesale. */
|
|
25
|
+
tiers?: Partial<Record<PersonaTier, Partial<PersonaRuntime>>>;
|
|
26
|
+
}
|
|
27
|
+
type Layer = 'pwd' | 'home';
|
|
28
|
+
export type PersonaSource = Layer | 'library';
|
|
29
|
+
export interface LoadedLocalPersonas {
|
|
30
|
+
/** Final resolved specs by id, with the cascade applied (pwd wins over home wins over library). */
|
|
31
|
+
byId: Map<string, PersonaSpec>;
|
|
32
|
+
/** Where each id in `byId` was defined (top-most layer that declared it). */
|
|
33
|
+
sources: Map<string, PersonaSource>;
|
|
34
|
+
warnings: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface LoadOptions {
|
|
37
|
+
cwd?: string;
|
|
38
|
+
homeDir?: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function loadLocalPersonas(options?: LoadOptions): LoadedLocalPersonas;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=local-personas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-personas.d.ts","sourceRoot":"","sources":["../src/local-personas.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,iCAAiC,CAAC;AAEzC;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3C;;;OAGG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,kGAAkG;IAClG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2FAA2F;IAC3F,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;CAC/D;AAED,KAAK,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAG5B,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,mGAAmG;IACnG,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/B,6EAA6E;IAC7E,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA0SD,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,WAAgB,GAAG,mBAAmB,CA2BhF"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, existsSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { personaCatalog, PERSONA_TIERS } from '@agentworkforce/workload-router';
|
|
5
|
+
const LAYER_ORDER = ['pwd', 'home'];
|
|
6
|
+
function defaultHomeDir() {
|
|
7
|
+
const override = process.env.AGENT_WORKFORCE_CONFIG_DIR?.trim();
|
|
8
|
+
if (override)
|
|
9
|
+
return override;
|
|
10
|
+
return join(homedir(), '.agent-workforce');
|
|
11
|
+
}
|
|
12
|
+
function defaultPwdDir(cwd) {
|
|
13
|
+
return join(cwd, '.agent-workforce');
|
|
14
|
+
}
|
|
15
|
+
function readLayerDir(dir, layer, warnings) {
|
|
16
|
+
const out = new Map();
|
|
17
|
+
if (!existsSync(dir))
|
|
18
|
+
return out;
|
|
19
|
+
let entries;
|
|
20
|
+
try {
|
|
21
|
+
entries = readdirSync(dir).filter((n) => n.endsWith('.json'));
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
warnings.push(`[${layer}] could not read ${dir}: ${err.message}`);
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
for (const file of entries) {
|
|
28
|
+
const path = join(dir, file);
|
|
29
|
+
try {
|
|
30
|
+
const raw = readFileSync(path, 'utf8');
|
|
31
|
+
const parsed = parseOverride(JSON.parse(raw), `[${layer}] ${file}`);
|
|
32
|
+
if (out.has(parsed.id)) {
|
|
33
|
+
warnings.push(`[${layer}] ${file}: duplicate id "${parsed.id}" within layer; skipping.`);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
out.set(parsed.id, parsed);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
warnings.push(`[${layer}] ${file}: ${err.message}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
function isPlainObject(value) {
|
|
45
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
46
|
+
}
|
|
47
|
+
function parseOverride(value, context) {
|
|
48
|
+
if (!isPlainObject(value)) {
|
|
49
|
+
throw new Error(`${context} must be a JSON object`);
|
|
50
|
+
}
|
|
51
|
+
const raw = value;
|
|
52
|
+
if (typeof raw.id !== 'string' || !raw.id.trim()) {
|
|
53
|
+
throw new Error(`${context}.id must be a non-empty string`);
|
|
54
|
+
}
|
|
55
|
+
if (raw.extends !== undefined && (typeof raw.extends !== 'string' || !raw.extends.trim())) {
|
|
56
|
+
throw new Error(`${context}.extends must be a non-empty string if provided`);
|
|
57
|
+
}
|
|
58
|
+
if (raw.systemPrompt !== undefined && typeof raw.systemPrompt !== 'string') {
|
|
59
|
+
throw new Error(`${context}.systemPrompt must be a string if provided`);
|
|
60
|
+
}
|
|
61
|
+
if (raw.description !== undefined && typeof raw.description !== 'string') {
|
|
62
|
+
throw new Error(`${context}.description must be a string if provided`);
|
|
63
|
+
}
|
|
64
|
+
if (raw.skills !== undefined && !Array.isArray(raw.skills)) {
|
|
65
|
+
throw new Error(`${context}.skills must be an array if provided`);
|
|
66
|
+
}
|
|
67
|
+
assertStringMap(raw.env, `${context}.env`);
|
|
68
|
+
assertMcpServersShape(raw.mcpServers, `${context}.mcpServers`);
|
|
69
|
+
assertPermissionsShape(raw.permissions, `${context}.permissions`);
|
|
70
|
+
assertTiersShape(raw.tiers, `${context}.tiers`);
|
|
71
|
+
return {
|
|
72
|
+
id: raw.id,
|
|
73
|
+
extends: raw.extends,
|
|
74
|
+
description: raw.description,
|
|
75
|
+
skills: raw.skills,
|
|
76
|
+
env: raw.env,
|
|
77
|
+
mcpServers: raw.mcpServers,
|
|
78
|
+
permissions: raw.permissions,
|
|
79
|
+
systemPrompt: raw.systemPrompt,
|
|
80
|
+
tiers: raw.tiers
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function assertStringMap(value, context) {
|
|
84
|
+
if (value === undefined)
|
|
85
|
+
return;
|
|
86
|
+
if (!isPlainObject(value)) {
|
|
87
|
+
throw new Error(`${context} must be an object if provided`);
|
|
88
|
+
}
|
|
89
|
+
for (const [k, v] of Object.entries(value)) {
|
|
90
|
+
if (typeof v !== 'string') {
|
|
91
|
+
throw new Error(`${context}.${k} must be a string`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function assertMcpServersShape(value, context) {
|
|
96
|
+
if (value === undefined)
|
|
97
|
+
return;
|
|
98
|
+
if (!isPlainObject(value)) {
|
|
99
|
+
throw new Error(`${context} must be an object if provided`);
|
|
100
|
+
}
|
|
101
|
+
for (const [name, spec] of Object.entries(value)) {
|
|
102
|
+
const path = `${context}.${name}`;
|
|
103
|
+
if (!isPlainObject(spec)) {
|
|
104
|
+
throw new Error(`${path} must be an object`);
|
|
105
|
+
}
|
|
106
|
+
const type = spec.type;
|
|
107
|
+
if (type !== 'http' && type !== 'sse' && type !== 'stdio') {
|
|
108
|
+
throw new Error(`${path}.type must be one of: http, sse, stdio`);
|
|
109
|
+
}
|
|
110
|
+
if (type === 'stdio') {
|
|
111
|
+
if (typeof spec.command !== 'string' || !spec.command.trim()) {
|
|
112
|
+
throw new Error(`${path}.command must be a non-empty string`);
|
|
113
|
+
}
|
|
114
|
+
if (spec.args !== undefined) {
|
|
115
|
+
if (!Array.isArray(spec.args) || spec.args.some((a) => typeof a !== 'string')) {
|
|
116
|
+
throw new Error(`${path}.args must be an array of strings`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
assertStringMap(spec.env, `${path}.env`);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
if (typeof spec.url !== 'string' || !spec.url.trim()) {
|
|
123
|
+
throw new Error(`${path}.url must be a non-empty string`);
|
|
124
|
+
}
|
|
125
|
+
assertStringMap(spec.headers, `${path}.headers`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function assertPermissionsShape(value, context) {
|
|
130
|
+
if (value === undefined)
|
|
131
|
+
return;
|
|
132
|
+
if (!isPlainObject(value)) {
|
|
133
|
+
throw new Error(`${context} must be an object if provided`);
|
|
134
|
+
}
|
|
135
|
+
for (const key of ['allow', 'deny']) {
|
|
136
|
+
const list = value[key];
|
|
137
|
+
if (list === undefined)
|
|
138
|
+
continue;
|
|
139
|
+
if (!Array.isArray(list) || list.some((s) => typeof s !== 'string' || !s.trim())) {
|
|
140
|
+
throw new Error(`${context}.${key} must be an array of non-empty strings`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const mode = value.mode;
|
|
144
|
+
if (mode !== undefined && typeof mode !== 'string') {
|
|
145
|
+
throw new Error(`${context}.mode must be a string if provided`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function assertTiersShape(value, context) {
|
|
149
|
+
if (value === undefined)
|
|
150
|
+
return;
|
|
151
|
+
if (!isPlainObject(value)) {
|
|
152
|
+
throw new Error(`${context} must be an object if provided`);
|
|
153
|
+
}
|
|
154
|
+
for (const [tierName, runtime] of Object.entries(value)) {
|
|
155
|
+
const path = `${context}.${tierName}`;
|
|
156
|
+
if (!isPlainObject(runtime)) {
|
|
157
|
+
throw new Error(`${path} must be an object`);
|
|
158
|
+
}
|
|
159
|
+
if (runtime.model !== undefined && typeof runtime.model !== 'string') {
|
|
160
|
+
throw new Error(`${path}.model must be a string`);
|
|
161
|
+
}
|
|
162
|
+
if (runtime.harness !== undefined && typeof runtime.harness !== 'string') {
|
|
163
|
+
throw new Error(`${path}.harness must be a string`);
|
|
164
|
+
}
|
|
165
|
+
if (runtime.systemPrompt !== undefined && typeof runtime.systemPrompt !== 'string') {
|
|
166
|
+
throw new Error(`${path}.systemPrompt must be a string`);
|
|
167
|
+
}
|
|
168
|
+
if (runtime.harnessSettings !== undefined && !isPlainObject(runtime.harnessSettings)) {
|
|
169
|
+
throw new Error(`${path}.harnessSettings must be an object`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function findInLibrary(key) {
|
|
174
|
+
const byIntent = personaCatalog[key];
|
|
175
|
+
if (byIntent)
|
|
176
|
+
return byIntent;
|
|
177
|
+
for (const spec of Object.values(personaCatalog)) {
|
|
178
|
+
if (spec.id === key)
|
|
179
|
+
return spec;
|
|
180
|
+
}
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Mutual-recursion with resolveInLayer: given a base key, walk strictly-lower
|
|
185
|
+
* layers until we find a persona with that id (local layers) or an id/intent
|
|
186
|
+
* match in the library. Returns a fully-merged PersonaSpec or undefined.
|
|
187
|
+
*/
|
|
188
|
+
function findInLowerLayers(key, startLayerIdx, overrides, resolving) {
|
|
189
|
+
for (let i = startLayerIdx; i < LAYER_ORDER.length; i++) {
|
|
190
|
+
const layer = LAYER_ORDER[i];
|
|
191
|
+
if (overrides[layer].has(key)) {
|
|
192
|
+
return resolveInLayer(key, layer, overrides, resolving);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return findInLibrary(key);
|
|
196
|
+
}
|
|
197
|
+
function resolveInLayer(id, layer, overrides, resolving) {
|
|
198
|
+
const key = `${layer}:${id}`;
|
|
199
|
+
if (resolving.has(key)) {
|
|
200
|
+
throw new Error(`extends cycle detected through ${[...resolving, key].join(' -> ')}`);
|
|
201
|
+
}
|
|
202
|
+
resolving.add(key);
|
|
203
|
+
try {
|
|
204
|
+
const override = overrides[layer].get(id);
|
|
205
|
+
if (!override) {
|
|
206
|
+
throw new Error(`internal: resolveInLayer called for missing ${key}`);
|
|
207
|
+
}
|
|
208
|
+
const baseKey = override.extends ?? override.id;
|
|
209
|
+
const layerIdx = LAYER_ORDER.indexOf(layer);
|
|
210
|
+
const base = findInLowerLayers(baseKey, layerIdx + 1, overrides, resolving);
|
|
211
|
+
if (!base) {
|
|
212
|
+
const hint = override.extends
|
|
213
|
+
? `extends "${override.extends}" does not match any persona in lower layers (home, library)`
|
|
214
|
+
: `no lower-layer persona with id "${override.id}" to implicitly inherit from; add extends or define the persona in a lower layer`;
|
|
215
|
+
throw new Error(hint);
|
|
216
|
+
}
|
|
217
|
+
return mergeOverride(base, override);
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
resolving.delete(key);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function mergeOverride(base, override) {
|
|
224
|
+
const tiers = {};
|
|
225
|
+
for (const tier of PERSONA_TIERS) {
|
|
226
|
+
const baseRuntime = base.tiers[tier];
|
|
227
|
+
const tierOverride = override.tiers?.[tier];
|
|
228
|
+
let merged = tierOverride
|
|
229
|
+
? {
|
|
230
|
+
...baseRuntime,
|
|
231
|
+
...tierOverride,
|
|
232
|
+
harnessSettings: {
|
|
233
|
+
...baseRuntime.harnessSettings,
|
|
234
|
+
...(tierOverride.harnessSettings ?? {})
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
: baseRuntime;
|
|
238
|
+
if (override.systemPrompt && !tierOverride?.systemPrompt) {
|
|
239
|
+
merged = { ...merged, systemPrompt: override.systemPrompt };
|
|
240
|
+
}
|
|
241
|
+
tiers[tier] = merged;
|
|
242
|
+
}
|
|
243
|
+
const env = override.env || base.env
|
|
244
|
+
? { ...(base.env ?? {}), ...(override.env ?? {}) }
|
|
245
|
+
: undefined;
|
|
246
|
+
const mcpServers = override.mcpServers || base.mcpServers
|
|
247
|
+
? { ...(base.mcpServers ?? {}), ...(override.mcpServers ?? {}) }
|
|
248
|
+
: undefined;
|
|
249
|
+
const permissions = mergePermissions(base.permissions, override.permissions);
|
|
250
|
+
return {
|
|
251
|
+
id: override.id,
|
|
252
|
+
intent: base.intent,
|
|
253
|
+
description: override.description ?? base.description,
|
|
254
|
+
skills: override.skills ?? base.skills,
|
|
255
|
+
tiers,
|
|
256
|
+
...(env ? { env } : {}),
|
|
257
|
+
...(mcpServers ? { mcpServers } : {}),
|
|
258
|
+
...(permissions ? { permissions } : {})
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
function mergePermissions(base, override) {
|
|
262
|
+
if (!base && !override)
|
|
263
|
+
return undefined;
|
|
264
|
+
const allow = dedupe([...(base?.allow ?? []), ...(override?.allow ?? [])]);
|
|
265
|
+
const deny = dedupe([...(base?.deny ?? []), ...(override?.deny ?? [])]);
|
|
266
|
+
const mode = override?.mode ?? base?.mode;
|
|
267
|
+
const out = {};
|
|
268
|
+
if (allow.length > 0)
|
|
269
|
+
out.allow = allow;
|
|
270
|
+
if (deny.length > 0)
|
|
271
|
+
out.deny = deny;
|
|
272
|
+
if (mode)
|
|
273
|
+
out.mode = mode;
|
|
274
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
275
|
+
}
|
|
276
|
+
function dedupe(values) {
|
|
277
|
+
return [...new Set(values)];
|
|
278
|
+
}
|
|
279
|
+
export function loadLocalPersonas(options = {}) {
|
|
280
|
+
const cwd = options.cwd ?? process.cwd();
|
|
281
|
+
const homeDir = options.homeDir ?? defaultHomeDir();
|
|
282
|
+
const warnings = [];
|
|
283
|
+
const overrides = {
|
|
284
|
+
pwd: readLayerDir(defaultPwdDir(cwd), 'pwd', warnings),
|
|
285
|
+
home: readLayerDir(homeDir, 'home', warnings)
|
|
286
|
+
};
|
|
287
|
+
const byId = new Map();
|
|
288
|
+
const sources = new Map();
|
|
289
|
+
for (const layer of LAYER_ORDER) {
|
|
290
|
+
for (const id of overrides[layer].keys()) {
|
|
291
|
+
if (byId.has(id))
|
|
292
|
+
continue; // higher-layer already won
|
|
293
|
+
try {
|
|
294
|
+
const resolved = resolveInLayer(id, layer, overrides, new Set());
|
|
295
|
+
byId.set(id, resolved);
|
|
296
|
+
sources.set(id, layer);
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
warnings.push(`[${layer}] ${id}: ${err.message}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return { byId, sources, warnings };
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=local-personas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-personas.js","sourceRoot":"","sources":["../src/local-personas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-personas.test.d.ts","sourceRoot":"","sources":["../src/local-personas.test.ts"],"names":[],"mappings":""}
|