@markusylisiurunen/tau 0.2.66 → 0.2.68
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 +45 -57
- package/dist/core/async/cli.js +150 -181
- package/dist/core/async/cli.js.map +1 -1
- package/dist/core/async/server_config.js +5 -8
- package/dist/core/async/server_config.js.map +1 -1
- package/dist/core/async/session_manager.js +65 -72
- package/dist/core/async/session_manager.js.map +1 -1
- package/dist/core/async/telegram.js +57 -6
- package/dist/core/async/telegram.js.map +1 -1
- package/dist/core/auth/auth_manager.js.map +1 -1
- package/dist/core/auth/auth_storage.js +55 -76
- package/dist/core/auth/auth_storage.js.map +1 -1
- package/dist/core/auth/credential_resolver.js +11 -1
- package/dist/core/auth/credential_resolver.js.map +1 -1
- package/dist/core/auth/jwt.js +9 -9
- package/dist/core/auth/jwt.js.map +1 -1
- package/dist/core/auth/providers/openai_codex.js +128 -194
- package/dist/core/auth/providers/openai_codex.js.map +1 -1
- package/dist/core/cli.js +40 -48
- package/dist/core/cli.js.map +1 -1
- package/dist/core/config/content_loader.js +118 -54
- package/dist/core/config/content_loader.js.map +1 -1
- package/dist/core/config/markdown_frontmatter.js.map +1 -1
- package/dist/core/config/paths.js +2 -1
- package/dist/core/config/paths.js.map +1 -1
- package/dist/core/config/runtime.js +13 -4
- package/dist/core/config/runtime.js.map +1 -1
- package/dist/core/config/schema.js +41 -45
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/skills_loader.js +5 -10
- package/dist/core/config/skills_loader.js.map +1 -1
- package/dist/core/config/virtual_bundle.js +1 -1
- package/dist/core/config/virtual_bundle.js.map +1 -1
- package/dist/core/events/parser.js +47 -25
- package/dist/core/events/parser.js.map +1 -1
- package/dist/core/install/cli.js +10 -4
- package/dist/core/install/cli.js.map +1 -1
- package/dist/core/models/catalog.js +409 -0
- package/dist/core/models/catalog.js.map +1 -0
- package/dist/core/models/tau_extensions.js +2 -0
- package/dist/core/models/tau_extensions.js.map +1 -0
- package/dist/core/personas.js +7 -7
- package/dist/core/personas.js.map +1 -1
- package/dist/core/session/session_engine.js +30 -1
- package/dist/core/session/session_engine.js.map +1 -1
- package/dist/core/subagents/control_plane.js +5 -2
- package/dist/core/subagents/control_plane.js.map +1 -1
- package/dist/core/subagents/launch_model.js +9 -15
- package/dist/core/subagents/launch_model.js.map +1 -1
- package/dist/core/subagents/subagent_engine.js +3 -4
- package/dist/core/subagents/subagent_engine.js.map +1 -1
- package/dist/core/tools/registry.js.map +1 -1
- package/dist/core/tools/send_input_to_agent.js +1 -0
- package/dist/core/tools/send_input_to_agent.js.map +1 -1
- package/dist/core/tools/spawn_agent.js +18 -2
- package/dist/core/tools/spawn_agent.js.map +1 -1
- package/dist/core/usage/cli.js +150 -130
- package/dist/core/usage/cli.js.map +1 -1
- package/dist/core/utils/agents_files.js +5 -1
- package/dist/core/utils/agents_files.js.map +1 -1
- package/dist/core/utils/model_stream.js +30 -4
- package/dist/core/utils/model_stream.js.map +1 -1
- package/dist/core/version.js +1 -1
- package/dist/main.js +5 -4
- package/dist/main.js.map +1 -1
- package/dist/tui/chat_controller/session_maintenance_service.js +10 -8
- package/dist/tui/chat_controller/session_maintenance_service.js.map +1 -1
- package/dist/tui/chat_controller.js +10 -18
- package/dist/tui/chat_controller.js.map +1 -1
- package/package.json +4 -4
- package/dist/core/utils/type_guards.js +0 -4
- package/dist/core/utils/type_guards.js.map +0 -1
package/dist/core/cli.js
CHANGED
|
@@ -1,17 +1,5 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
1
|
import { parsePersonaReference } from "./persona_reference.js";
|
|
3
|
-
import { REASONING_LEVELS,
|
|
4
|
-
export const CliOptionsSchema = z.object({
|
|
5
|
-
help: z.boolean(),
|
|
6
|
-
debug: z.boolean(),
|
|
7
|
-
loadPath: z.string().optional(),
|
|
8
|
-
personaId: z.string().optional(),
|
|
9
|
-
reasoningOverride: ReasoningEffortSchema.optional(),
|
|
10
|
-
riskLevel: RiskLevelSchema.optional(),
|
|
11
|
-
sandbox: z.boolean(),
|
|
12
|
-
caffeinated: z.boolean(),
|
|
13
|
-
noAgentContextFiles: z.boolean(),
|
|
14
|
-
});
|
|
2
|
+
import { REASONING_LEVELS, RiskLevelSchema, } from "./types.js";
|
|
15
3
|
export class CliError extends Error {
|
|
16
4
|
constructor(message) {
|
|
17
5
|
super(message);
|
|
@@ -35,17 +23,39 @@ export function parsePersonaString(raw, personas) {
|
|
|
35
23
|
reasoning: personaId ? parsed.reasoning : undefined,
|
|
36
24
|
};
|
|
37
25
|
}
|
|
38
|
-
function
|
|
26
|
+
function parsePersonaOption(raw, personas) {
|
|
27
|
+
const parsedReference = parsePersonaReference(raw);
|
|
28
|
+
if (parsedReference.error === "missing-reasoning") {
|
|
29
|
+
throw new CliError("missing reasoning level after ':' in --persona");
|
|
30
|
+
}
|
|
31
|
+
if (parsedReference.error === "invalid-reasoning") {
|
|
32
|
+
const allowed = REASONING_LEVELS.join(", ");
|
|
33
|
+
throw new CliError(`invalid reasoning level '${parsedReference.rawReasoning}'. allowed levels: ${allowed}`);
|
|
34
|
+
}
|
|
35
|
+
if (!parsedReference.personaId) {
|
|
36
|
+
throw new CliError("missing persona id in --persona");
|
|
37
|
+
}
|
|
38
|
+
const personaId = resolvePersonaId(parsedReference.personaId, personas);
|
|
39
|
+
if (!personaId) {
|
|
40
|
+
const available = personas.map((p) => p.id).join(", ");
|
|
41
|
+
throw new CliError(`unknown persona '${parsedReference.personaId}'. available personas: ${available}`);
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
personaId,
|
|
45
|
+
reasoningOverride: parsedReference.reasoning,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function parseRiskOption(raw) {
|
|
39
49
|
const normalized = raw.trim();
|
|
40
50
|
if (!normalized) {
|
|
41
51
|
throw new CliError("missing value for --risk");
|
|
42
52
|
}
|
|
43
53
|
const parsed = RiskLevelSchema.safeParse(normalized);
|
|
44
|
-
if (parsed.success) {
|
|
45
|
-
|
|
54
|
+
if (!parsed.success) {
|
|
55
|
+
const allowed = RiskLevelSchema.options.join(", ");
|
|
56
|
+
throw new CliError(`invalid risk level '${raw}'. allowed levels: ${allowed}`);
|
|
46
57
|
}
|
|
47
|
-
|
|
48
|
-
throw new CliError(`invalid risk level '${raw}'. allowed levels: ${allowed}`);
|
|
58
|
+
return parsed.data;
|
|
49
59
|
}
|
|
50
60
|
function parseValue(arg, argv, index) {
|
|
51
61
|
const eqIndex = arg.indexOf("=");
|
|
@@ -83,9 +93,9 @@ export function parseCliArgs(argv, personas) {
|
|
|
83
93
|
continue;
|
|
84
94
|
}
|
|
85
95
|
if (arg === "--load" || arg === "-l" || arg.startsWith("--load=") || arg.startsWith("-l=")) {
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
96
|
+
const parsed = parseValue(arg, argv, i);
|
|
97
|
+
loadPath = parsed.value;
|
|
98
|
+
i = parsed.nextIndex;
|
|
89
99
|
continue;
|
|
90
100
|
}
|
|
91
101
|
if (arg === "--no-agent-context-files") {
|
|
@@ -104,34 +114,17 @@ export function parseCliArgs(argv, personas) {
|
|
|
104
114
|
arg === "-p" ||
|
|
105
115
|
arg.startsWith("--persona=") ||
|
|
106
116
|
arg.startsWith("-p=")) {
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
if (parsedReference.error === "invalid-reasoning") {
|
|
114
|
-
const allowed = [...REASONING_LEVELS].join(", ");
|
|
115
|
-
throw new CliError(`invalid reasoning level '${parsedReference.rawReasoning}'. allowed levels: ${allowed}`);
|
|
116
|
-
}
|
|
117
|
-
if (!parsedReference.personaId) {
|
|
118
|
-
throw new CliError("missing persona id in --persona");
|
|
119
|
-
}
|
|
120
|
-
const resolvedPersonaId = resolvePersonaId(parsedReference.personaId, personas);
|
|
121
|
-
if (!resolvedPersonaId) {
|
|
122
|
-
const available = personas.map((p) => p.id).join(", ");
|
|
123
|
-
throw new CliError(`unknown persona '${parsedReference.personaId}'. available personas: ${available}`);
|
|
124
|
-
}
|
|
125
|
-
personaId = resolvedPersonaId;
|
|
126
|
-
if (parsedReference.reasoning !== undefined) {
|
|
127
|
-
reasoningOverride = parsedReference.reasoning;
|
|
128
|
-
}
|
|
117
|
+
const parsed = parseValue(arg, argv, i);
|
|
118
|
+
const persona = parsePersonaOption(parsed.value, personas);
|
|
119
|
+
personaId = persona.personaId;
|
|
120
|
+
reasoningOverride = persona.reasoningOverride;
|
|
121
|
+
i = parsed.nextIndex;
|
|
129
122
|
continue;
|
|
130
123
|
}
|
|
131
124
|
if (arg === "--risk" || arg === "-r" || arg.startsWith("--risk=") || arg.startsWith("-r=")) {
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
125
|
+
const parsed = parseValue(arg, argv, i);
|
|
126
|
+
riskLevel = parseRiskOption(parsed.value);
|
|
127
|
+
i = parsed.nextIndex;
|
|
135
128
|
continue;
|
|
136
129
|
}
|
|
137
130
|
if (arg.startsWith("-")) {
|
|
@@ -139,7 +132,7 @@ export function parseCliArgs(argv, personas) {
|
|
|
139
132
|
}
|
|
140
133
|
throw new CliError(`unexpected argument: ${arg}`);
|
|
141
134
|
}
|
|
142
|
-
|
|
135
|
+
return {
|
|
143
136
|
help,
|
|
144
137
|
debug,
|
|
145
138
|
loadPath,
|
|
@@ -150,7 +143,6 @@ export function parseCliArgs(argv, personas) {
|
|
|
150
143
|
caffeinated,
|
|
151
144
|
noAgentContextFiles,
|
|
152
145
|
};
|
|
153
|
-
return CliOptionsSchema.parse(options);
|
|
154
146
|
}
|
|
155
147
|
export function printHelp(personas) {
|
|
156
148
|
const personaList = personas.map((p) => p.id).join(", ");
|
package/dist/core/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/core/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/core/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { basename, join } from "node:path";
|
|
2
|
-
import { getModels, getProviders } from "@mariozechner/pi-ai";
|
|
3
2
|
import { z } from "zod";
|
|
4
3
|
import { personas as builtinPersonas } from "../personas.js";
|
|
5
4
|
import { parseSubagentLaunchModelList } from "../subagents/launch_model.js";
|
|
@@ -15,32 +14,23 @@ import { WAIT_FOR_AGENT_TOOL } from "../tools/wait_for_agent.js";
|
|
|
15
14
|
import { WRITE_TOOL } from "../tools/write.js";
|
|
16
15
|
import { ReasoningEffortSchema, RiskLevelSchema } from "../types.js";
|
|
17
16
|
import { formatZodError } from "../utils/zod.js";
|
|
18
|
-
import { createDefaultConfigDeps } from "./deps.js";
|
|
19
17
|
import { parseMarkdownFrontMatter } from "./markdown_frontmatter.js";
|
|
20
|
-
import { resolveConfigLevels } from "./paths.js";
|
|
21
18
|
import { loadSkillsContent as loadCanonicalSkillsContent } from "./skills_loader.js";
|
|
22
19
|
import { buildVirtualBundle } from "./virtual_bundle.js";
|
|
23
|
-
function isKnownProvider(value) {
|
|
24
|
-
return getProviders().includes(value);
|
|
25
|
-
}
|
|
26
20
|
const SubagentNameSchema = z
|
|
27
21
|
.string()
|
|
28
22
|
.trim()
|
|
29
23
|
.min(1)
|
|
30
24
|
.max(64)
|
|
31
25
|
.regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/);
|
|
32
|
-
const StringListSchema = z.array(z.string());
|
|
33
|
-
const TrimmedNonEmptyStringListSchema = StringListSchema.transform((list) => list.map((item) => item.trim())).refine((list) => list.every(Boolean), {
|
|
34
|
-
message: "entries must be non-empty strings",
|
|
35
|
-
});
|
|
36
26
|
const SubagentSpecSchema = z
|
|
37
27
|
.object({
|
|
38
28
|
provider: z.string().trim().min(1).optional(),
|
|
39
29
|
model: z.string().trim().min(1).optional(),
|
|
40
30
|
reasoning: ReasoningEffortSchema.optional(),
|
|
41
|
-
tools:
|
|
31
|
+
tools: z.array(z.string()).optional(),
|
|
42
32
|
riskLevel: RiskLevelSchema.optional(),
|
|
43
|
-
launchModels:
|
|
33
|
+
launchModels: z.array(z.string()).optional(),
|
|
44
34
|
systemPrompt: z.string().trim().min(1).optional(),
|
|
45
35
|
description: z.string().trim().min(1).optional(),
|
|
46
36
|
})
|
|
@@ -57,6 +47,12 @@ const SubagentSpecSchema = z
|
|
|
57
47
|
});
|
|
58
48
|
const SUBAGENT_TOOL_NAME_SET = new Set(SUBAGENT_TOOL_NAMES);
|
|
59
49
|
const SubagentConfigInputSchema = z.record(SubagentNameSchema, z.union([z.literal(false), SubagentSpecSchema]));
|
|
50
|
+
const TrimmedNonEmptyStringListSchema = z
|
|
51
|
+
.array(z.string())
|
|
52
|
+
.transform((list) => list.map((item) => item.trim()))
|
|
53
|
+
.refine((list) => list.every(Boolean), {
|
|
54
|
+
message: "entries must be non-empty strings",
|
|
55
|
+
});
|
|
60
56
|
function parseSubagentTools(toolsRaw) {
|
|
61
57
|
if (toolsRaw === undefined) {
|
|
62
58
|
return {};
|
|
@@ -100,7 +96,7 @@ function cloneSubagentPersonaConfig(config) {
|
|
|
100
96
|
...(config.launchModels ? { launchModels: [...config.launchModels] } : {}),
|
|
101
97
|
};
|
|
102
98
|
}
|
|
103
|
-
function parseSubagentConfig(subagentsRaw) {
|
|
99
|
+
function parseSubagentConfig(subagentsRaw, modelResolver) {
|
|
104
100
|
if (subagentsRaw === undefined) {
|
|
105
101
|
return {};
|
|
106
102
|
}
|
|
@@ -142,7 +138,9 @@ function parseSubagentConfig(subagentsRaw) {
|
|
|
142
138
|
if (toolsResult.error) {
|
|
143
139
|
return { error: `subagent ${validatedName}: ${toolsResult.error}` };
|
|
144
140
|
}
|
|
145
|
-
const launchModelsResult = parseSubagentLaunchModelList(specRaw.launchModels
|
|
141
|
+
const launchModelsResult = parseSubagentLaunchModelList(specRaw.launchModels, {
|
|
142
|
+
resolveModel: modelResolver,
|
|
143
|
+
});
|
|
146
144
|
if (launchModelsResult.error) {
|
|
147
145
|
return {
|
|
148
146
|
error: `subagent ${validatedName}: launchModels ${launchModelsResult.error}`,
|
|
@@ -156,7 +154,7 @@ function parseSubagentConfig(subagentsRaw) {
|
|
|
156
154
|
: undefined;
|
|
157
155
|
let modelObj;
|
|
158
156
|
if (provider && model) {
|
|
159
|
-
modelObj =
|
|
157
|
+
modelObj = modelResolver(provider, model);
|
|
160
158
|
if (!modelObj) {
|
|
161
159
|
return {
|
|
162
160
|
error: `subagent ${validatedName}: failed to resolve model "${provider}:${model}"`,
|
|
@@ -213,10 +211,47 @@ function parsePersonaTools(toolsRaw) {
|
|
|
213
211
|
}
|
|
214
212
|
return { tools: selected };
|
|
215
213
|
}
|
|
216
|
-
function
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
214
|
+
function resolvePersonaModels(persona, modelResolver) {
|
|
215
|
+
const resolvedPersonaModel = modelResolver(persona.model.provider, persona.model.id);
|
|
216
|
+
if (!resolvedPersonaModel) {
|
|
217
|
+
return {
|
|
218
|
+
error: `failed to resolve model "${persona.model.provider}:${persona.model.id}"`,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
if (!persona.subagents) {
|
|
222
|
+
return {
|
|
223
|
+
persona: {
|
|
224
|
+
...persona,
|
|
225
|
+
model: resolvedPersonaModel,
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
const resolvedSubagents = {};
|
|
230
|
+
for (const [name, config] of Object.entries(persona.subagents)) {
|
|
231
|
+
if (!config?.model) {
|
|
232
|
+
if (config) {
|
|
233
|
+
resolvedSubagents[name] = cloneSubagentPersonaConfig(config);
|
|
234
|
+
}
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
const resolvedSubagentModel = modelResolver(config.model.provider, config.model.id);
|
|
238
|
+
if (!resolvedSubagentModel) {
|
|
239
|
+
return {
|
|
240
|
+
error: `subagent ${name}: failed to resolve model "${config.model.provider}:${config.model.id}"`,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
resolvedSubagents[name] = {
|
|
244
|
+
...cloneSubagentPersonaConfig(config),
|
|
245
|
+
model: resolvedSubagentModel,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
persona: {
|
|
250
|
+
...persona,
|
|
251
|
+
model: resolvedPersonaModel,
|
|
252
|
+
subagents: resolvedSubagents,
|
|
253
|
+
},
|
|
254
|
+
};
|
|
220
255
|
}
|
|
221
256
|
function mergeById(base, overlay, overlay2) {
|
|
222
257
|
const map = new Map();
|
|
@@ -296,9 +331,10 @@ function loadJsonEntries(dir, deps, listFiles) {
|
|
|
296
331
|
return loadEntries(dir, deps, listFiles);
|
|
297
332
|
}
|
|
298
333
|
function resolveContentContext(options) {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
334
|
+
return {
|
|
335
|
+
deps: options.deps,
|
|
336
|
+
levels: options.levels,
|
|
337
|
+
};
|
|
302
338
|
}
|
|
303
339
|
const personaFrontMatterSchema = z
|
|
304
340
|
.object({
|
|
@@ -340,7 +376,7 @@ const DEFAULT_SUBAGENT_TOOLS = [
|
|
|
340
376
|
WAIT_FOR_AGENT_TOOL,
|
|
341
377
|
TERMINATE_AGENT_TOOL,
|
|
342
378
|
];
|
|
343
|
-
function parsePersona(file, content, source, basePersonasById) {
|
|
379
|
+
function parsePersona(file, content, source, modelResolver, basePersonasById) {
|
|
344
380
|
const markdownResult = parseMarkdownFrontMatter(content);
|
|
345
381
|
if (!markdownResult.ok) {
|
|
346
382
|
return { error: `${file}: ${markdownResult.message}. skipped.` };
|
|
@@ -365,7 +401,7 @@ function parsePersona(file, content, source, basePersonasById) {
|
|
|
365
401
|
if (extendsId && !basePersona) {
|
|
366
402
|
return { error: `${file}: extends "${extendsId}" not found. skipped.` };
|
|
367
403
|
}
|
|
368
|
-
const modelObj =
|
|
404
|
+
const modelObj = modelResolver(provider, model);
|
|
369
405
|
if (!modelObj) {
|
|
370
406
|
return { error: `${file}: failed to load model "${provider}:${model}". skipped.` };
|
|
371
407
|
}
|
|
@@ -398,7 +434,7 @@ function parsePersona(file, content, source, basePersonasById) {
|
|
|
398
434
|
}
|
|
399
435
|
}
|
|
400
436
|
// Parse subagents
|
|
401
|
-
const subagentsResult = parseSubagentConfig(subagentsRaw);
|
|
437
|
+
const subagentsResult = parseSubagentConfig(subagentsRaw, modelResolver);
|
|
402
438
|
if (subagentsResult.error) {
|
|
403
439
|
return { error: `${file}: ${subagentsResult.error}. skipped.` };
|
|
404
440
|
}
|
|
@@ -537,9 +573,8 @@ function parseTheme(entry, scope) {
|
|
|
537
573
|
}
|
|
538
574
|
export async function loadUserPersonas(args) {
|
|
539
575
|
const { deps, levels } = resolveContentContext({
|
|
540
|
-
deps: args
|
|
541
|
-
levels: args
|
|
542
|
-
cwd: args?.cwd,
|
|
576
|
+
deps: args.deps,
|
|
577
|
+
levels: args.levels,
|
|
543
578
|
});
|
|
544
579
|
const globalLevel = levels.find((level) => level.scope === "global");
|
|
545
580
|
if (!globalLevel) {
|
|
@@ -548,9 +583,9 @@ export async function loadUserPersonas(args) {
|
|
|
548
583
|
const personasDir = globalLevel.personasDir;
|
|
549
584
|
const { entries, errors } = loadMarkdownEntries(personasDir, deps, listMarkdownFiles);
|
|
550
585
|
const personas = [];
|
|
551
|
-
const basePersonasById = args
|
|
586
|
+
const basePersonasById = args.basePersonasById ?? new Map(builtinPersonas.map((p) => [p.id.toLowerCase(), p]));
|
|
552
587
|
for (const file of entries) {
|
|
553
|
-
const result = parsePersona(file.path, file.content, "user", basePersonasById);
|
|
588
|
+
const result = parsePersona(file.path, file.content, "user", args.modelResolver, basePersonasById);
|
|
554
589
|
if (result.persona) {
|
|
555
590
|
personas.push(result.persona);
|
|
556
591
|
}
|
|
@@ -562,9 +597,8 @@ export async function loadUserPersonas(args) {
|
|
|
562
597
|
}
|
|
563
598
|
export async function loadProjectPersonas(args) {
|
|
564
599
|
const { deps, levels } = resolveContentContext({
|
|
565
|
-
deps: args
|
|
566
|
-
levels: args
|
|
567
|
-
cwd: args?.cwd,
|
|
600
|
+
deps: args.deps,
|
|
601
|
+
levels: args.levels,
|
|
568
602
|
});
|
|
569
603
|
const projectLevels = levels.filter((level) => level.scope === "project");
|
|
570
604
|
if (projectLevels.length === 0) {
|
|
@@ -572,13 +606,13 @@ export async function loadProjectPersonas(args) {
|
|
|
572
606
|
}
|
|
573
607
|
const personas = [];
|
|
574
608
|
const errors = [];
|
|
575
|
-
const basePersonasById = args
|
|
609
|
+
const basePersonasById = args.basePersonasById ?? new Map(builtinPersonas.map((p) => [p.id.toLowerCase(), p]));
|
|
576
610
|
// Parent-first order, closest directory wins on conflicts.
|
|
577
611
|
for (const level of projectLevels) {
|
|
578
612
|
const { entries, errors: entryErrors } = loadMarkdownEntries(level.personasDir, deps, listMarkdownFiles);
|
|
579
613
|
errors.push(...entryErrors);
|
|
580
614
|
for (const file of entries) {
|
|
581
|
-
const result = parsePersona(file.path, file.content, "project", basePersonasById);
|
|
615
|
+
const result = parsePersona(file.path, file.content, "project", args.modelResolver, basePersonasById);
|
|
582
616
|
if (result.persona) {
|
|
583
617
|
personas.push(result.persona);
|
|
584
618
|
}
|
|
@@ -591,9 +625,8 @@ export async function loadProjectPersonas(args) {
|
|
|
591
625
|
}
|
|
592
626
|
export async function loadUserPrompts(args) {
|
|
593
627
|
const { deps, levels } = resolveContentContext({
|
|
594
|
-
deps: args
|
|
595
|
-
levels: args
|
|
596
|
-
cwd: args?.cwd,
|
|
628
|
+
deps: args.deps,
|
|
629
|
+
levels: args.levels,
|
|
597
630
|
});
|
|
598
631
|
const globalLevel = levels.find((level) => level.scope === "global");
|
|
599
632
|
if (!globalLevel) {
|
|
@@ -615,9 +648,8 @@ export async function loadUserPrompts(args) {
|
|
|
615
648
|
}
|
|
616
649
|
export async function loadProjectPrompts(args) {
|
|
617
650
|
const { deps, levels } = resolveContentContext({
|
|
618
|
-
deps: args
|
|
619
|
-
levels: args
|
|
620
|
-
cwd: args?.cwd,
|
|
651
|
+
deps: args.deps,
|
|
652
|
+
levels: args.levels,
|
|
621
653
|
});
|
|
622
654
|
const projectLevels = levels.filter((level) => level.scope === "project");
|
|
623
655
|
if (projectLevels.length === 0) {
|
|
@@ -643,9 +675,8 @@ export async function loadProjectPrompts(args) {
|
|
|
643
675
|
}
|
|
644
676
|
export async function loadUserThemes(args) {
|
|
645
677
|
const { deps, levels } = resolveContentContext({
|
|
646
|
-
deps: args
|
|
647
|
-
levels: args
|
|
648
|
-
cwd: args?.cwd,
|
|
678
|
+
deps: args.deps,
|
|
679
|
+
levels: args.levels,
|
|
649
680
|
});
|
|
650
681
|
const globalLevel = levels.find((level) => level.scope === "global");
|
|
651
682
|
if (!globalLevel) {
|
|
@@ -666,9 +697,8 @@ export async function loadUserThemes(args) {
|
|
|
666
697
|
}
|
|
667
698
|
export async function loadProjectThemes(args) {
|
|
668
699
|
const { deps, levels } = resolveContentContext({
|
|
669
|
-
deps: args
|
|
670
|
-
levels: args
|
|
671
|
-
cwd: args?.cwd,
|
|
700
|
+
deps: args.deps,
|
|
701
|
+
levels: args.levels,
|
|
672
702
|
});
|
|
673
703
|
const projectLevels = levels.filter((level) => level.scope === "project");
|
|
674
704
|
if (projectLevels.length === 0) {
|
|
@@ -697,25 +727,59 @@ export async function loadSkillsContent(config, options) {
|
|
|
697
727
|
}
|
|
698
728
|
export async function loadAllContent(config, options) {
|
|
699
729
|
const { deps, levels } = resolveContentContext({
|
|
700
|
-
deps: options
|
|
701
|
-
levels: options
|
|
702
|
-
cwd: options?.cwd,
|
|
730
|
+
deps: options.deps,
|
|
731
|
+
levels: options.levels,
|
|
703
732
|
});
|
|
704
|
-
const virtualBundle = buildVirtualBundle(config ?? {}
|
|
733
|
+
const virtualBundle = buildVirtualBundle(config ?? {});
|
|
705
734
|
try {
|
|
706
|
-
const
|
|
735
|
+
const modelResolverResult = {
|
|
736
|
+
resolveModel: options.modelResolver,
|
|
737
|
+
errors: [],
|
|
738
|
+
};
|
|
739
|
+
const builtinPersonaErrors = [];
|
|
740
|
+
const resolvedBuiltinPersonas = [];
|
|
741
|
+
for (const persona of builtinPersonas) {
|
|
742
|
+
const resolved = resolvePersonaModels(persona, modelResolverResult.resolveModel);
|
|
743
|
+
if (resolved.persona) {
|
|
744
|
+
resolvedBuiltinPersonas.push(resolved.persona);
|
|
745
|
+
}
|
|
746
|
+
else if (resolved.error) {
|
|
747
|
+
builtinPersonaErrors.push(`builtin persona '${persona.id}': ${resolved.error}`);
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
const resolvedVirtualBundlePersonas = virtualBundle.personas === builtinPersonas ? [...resolvedBuiltinPersonas] : [];
|
|
751
|
+
if (resolvedVirtualBundlePersonas.length === 0) {
|
|
752
|
+
for (const persona of virtualBundle.personas) {
|
|
753
|
+
const resolved = resolvePersonaModels(persona, modelResolverResult.resolveModel);
|
|
754
|
+
if (resolved.persona) {
|
|
755
|
+
resolvedVirtualBundlePersonas.push(resolved.persona);
|
|
756
|
+
}
|
|
757
|
+
else if (resolved.error) {
|
|
758
|
+
builtinPersonaErrors.push(`builtin persona '${persona.id}': ${resolved.error}`);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
const basePersonasById = new Map(resolvedBuiltinPersonas.map((persona) => [persona.id.toLowerCase(), persona]));
|
|
707
763
|
const userPersonasResult = await loadUserPersonas({
|
|
708
764
|
basePersonasById,
|
|
765
|
+
modelResolver: modelResolverResult.resolveModel,
|
|
766
|
+
deps,
|
|
767
|
+
levels,
|
|
768
|
+
});
|
|
769
|
+
const projectPersonasResult = await loadProjectPersonas({
|
|
770
|
+
basePersonasById,
|
|
771
|
+
modelResolver: modelResolverResult.resolveModel,
|
|
709
772
|
deps,
|
|
710
773
|
levels,
|
|
711
774
|
});
|
|
712
|
-
const projectPersonasResult = await loadProjectPersonas({ basePersonasById, deps, levels });
|
|
713
775
|
const userPromptsResult = await loadUserPrompts({ deps, levels });
|
|
714
776
|
const projectPromptsResult = await loadProjectPrompts({ deps, levels });
|
|
715
777
|
const skillsResult = await loadSkillsContent(config, { deps, levels });
|
|
716
778
|
const userThemesResult = await loadUserThemes({ deps, levels });
|
|
717
779
|
const projectThemesResult = await loadProjectThemes({ deps, levels });
|
|
718
780
|
const allErrors = [
|
|
781
|
+
...modelResolverResult.errors,
|
|
782
|
+
...builtinPersonaErrors,
|
|
719
783
|
...userPersonasResult.errors,
|
|
720
784
|
...projectPersonasResult.errors,
|
|
721
785
|
...userPromptsResult.errors,
|
|
@@ -727,7 +791,7 @@ export async function loadAllContent(config, options) {
|
|
|
727
791
|
const skills = skillsResult.skills;
|
|
728
792
|
// Precedence: virtual bundle < global < nearest .tau levels.
|
|
729
793
|
const defaultLaunchModels = config?.subagents?.defaultLaunchModels;
|
|
730
|
-
const personas = mergeById(
|
|
794
|
+
const personas = mergeById(resolvedVirtualBundlePersonas, userPersonasResult.personas, projectPersonasResult.personas).map((persona) => withDefaultSubagentLaunchModels(persona, defaultLaunchModels));
|
|
731
795
|
return {
|
|
732
796
|
personas,
|
|
733
797
|
prompts: mergeById(virtualBundle.prompts, userPromptsResult.prompts, projectPromptsResult.prompts),
|