@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.
Files changed (72) hide show
  1. package/README.md +45 -57
  2. package/dist/core/async/cli.js +150 -181
  3. package/dist/core/async/cli.js.map +1 -1
  4. package/dist/core/async/server_config.js +5 -8
  5. package/dist/core/async/server_config.js.map +1 -1
  6. package/dist/core/async/session_manager.js +65 -72
  7. package/dist/core/async/session_manager.js.map +1 -1
  8. package/dist/core/async/telegram.js +57 -6
  9. package/dist/core/async/telegram.js.map +1 -1
  10. package/dist/core/auth/auth_manager.js.map +1 -1
  11. package/dist/core/auth/auth_storage.js +55 -76
  12. package/dist/core/auth/auth_storage.js.map +1 -1
  13. package/dist/core/auth/credential_resolver.js +11 -1
  14. package/dist/core/auth/credential_resolver.js.map +1 -1
  15. package/dist/core/auth/jwt.js +9 -9
  16. package/dist/core/auth/jwt.js.map +1 -1
  17. package/dist/core/auth/providers/openai_codex.js +128 -194
  18. package/dist/core/auth/providers/openai_codex.js.map +1 -1
  19. package/dist/core/cli.js +40 -48
  20. package/dist/core/cli.js.map +1 -1
  21. package/dist/core/config/content_loader.js +118 -54
  22. package/dist/core/config/content_loader.js.map +1 -1
  23. package/dist/core/config/markdown_frontmatter.js.map +1 -1
  24. package/dist/core/config/paths.js +2 -1
  25. package/dist/core/config/paths.js.map +1 -1
  26. package/dist/core/config/runtime.js +13 -4
  27. package/dist/core/config/runtime.js.map +1 -1
  28. package/dist/core/config/schema.js +41 -45
  29. package/dist/core/config/schema.js.map +1 -1
  30. package/dist/core/config/skills_loader.js +5 -10
  31. package/dist/core/config/skills_loader.js.map +1 -1
  32. package/dist/core/config/virtual_bundle.js +1 -1
  33. package/dist/core/config/virtual_bundle.js.map +1 -1
  34. package/dist/core/events/parser.js +47 -25
  35. package/dist/core/events/parser.js.map +1 -1
  36. package/dist/core/install/cli.js +10 -4
  37. package/dist/core/install/cli.js.map +1 -1
  38. package/dist/core/models/catalog.js +409 -0
  39. package/dist/core/models/catalog.js.map +1 -0
  40. package/dist/core/models/tau_extensions.js +2 -0
  41. package/dist/core/models/tau_extensions.js.map +1 -0
  42. package/dist/core/personas.js +7 -7
  43. package/dist/core/personas.js.map +1 -1
  44. package/dist/core/session/session_engine.js +30 -1
  45. package/dist/core/session/session_engine.js.map +1 -1
  46. package/dist/core/subagents/control_plane.js +5 -2
  47. package/dist/core/subagents/control_plane.js.map +1 -1
  48. package/dist/core/subagents/launch_model.js +9 -15
  49. package/dist/core/subagents/launch_model.js.map +1 -1
  50. package/dist/core/subagents/subagent_engine.js +3 -4
  51. package/dist/core/subagents/subagent_engine.js.map +1 -1
  52. package/dist/core/tools/registry.js.map +1 -1
  53. package/dist/core/tools/send_input_to_agent.js +1 -0
  54. package/dist/core/tools/send_input_to_agent.js.map +1 -1
  55. package/dist/core/tools/spawn_agent.js +18 -2
  56. package/dist/core/tools/spawn_agent.js.map +1 -1
  57. package/dist/core/usage/cli.js +150 -130
  58. package/dist/core/usage/cli.js.map +1 -1
  59. package/dist/core/utils/agents_files.js +5 -1
  60. package/dist/core/utils/agents_files.js.map +1 -1
  61. package/dist/core/utils/model_stream.js +30 -4
  62. package/dist/core/utils/model_stream.js.map +1 -1
  63. package/dist/core/version.js +1 -1
  64. package/dist/main.js +5 -4
  65. package/dist/main.js.map +1 -1
  66. package/dist/tui/chat_controller/session_maintenance_service.js +10 -8
  67. package/dist/tui/chat_controller/session_maintenance_service.js.map +1 -1
  68. package/dist/tui/chat_controller.js +10 -18
  69. package/dist/tui/chat_controller.js.map +1 -1
  70. package/package.json +4 -4
  71. package/dist/core/utils/type_guards.js +0 -4
  72. 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, ReasoningEffortSchema, RiskLevelSchema, } from "./types.js";
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 parseRiskLevel(raw) {
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
- return parsed.data;
54
+ if (!parsed.success) {
55
+ const allowed = RiskLevelSchema.options.join(", ");
56
+ throw new CliError(`invalid risk level '${raw}'. allowed levels: ${allowed}`);
46
57
  }
47
- const allowed = RiskLevelSchema.options.join(", ");
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 { value, nextIndex } = parseValue(arg, argv, i);
87
- i = nextIndex;
88
- loadPath = value;
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 { value, nextIndex } = parseValue(arg, argv, i);
108
- i = nextIndex;
109
- const parsedReference = parsePersonaReference(value);
110
- if (parsedReference.error === "missing-reasoning") {
111
- throw new CliError("missing reasoning level after ':' in --persona");
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 { value, nextIndex } = parseValue(arg, argv, i);
133
- i = nextIndex;
134
- riskLevel = parseRiskLevel(value);
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
- const options = {
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(", ");
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/core/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAEL,gBAAgB,EAEhB,qBAAqB,EAErB,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;IACjB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;IAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,iBAAiB,EAAE,qBAAqB,CAAC,QAAQ,EAAE;IACnD,SAAS,EAAE,eAAe,CAAC,QAAQ,EAAE;IACrC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE;IACxB,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE;CACjC,CAAC,CAAC;AAIH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAmB;IAC/D,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,QAAmB;IAEnB,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACtC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IACxD,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/D,OAAO;QACL,SAAS;QACT,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACpD,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,QAAQ,CAAC,0BAA0B,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,IAAI,QAAQ,CAAC,uBAAuB,GAAG,sBAAsB,OAAO,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,UAAU,CACjB,GAAW,EACX,IAAc,EACd,KAAa;IAEb,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,QAAQ,CAAC,qBAAqB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,QAAQ,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAc,EAAE,QAAmB;IAC9D,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,QAA4B,CAAC;IACjC,IAAI,SAA6B,CAAC;IAClC,IAAI,iBAA8C,CAAC;IACnD,IAAI,SAAgC,CAAC;IACrC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAErB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,GAAG,IAAI,CAAC;YACb,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3F,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC,GAAG,SAAS,CAAC;YACd,QAAQ,GAAG,KAAK,CAAC;YACjB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,0BAA0B,EAAE,CAAC;YACvC,mBAAmB,GAAG,IAAI,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,WAAW,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IACE,GAAG,KAAK,WAAW;YACnB,GAAG,KAAK,IAAI;YACZ,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;YAC5B,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EACrB,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC,GAAG,SAAS,CAAC;YAEd,MAAM,eAAe,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,eAAe,CAAC,KAAK,KAAK,mBAAmB,EAAE,CAAC;gBAClD,MAAM,IAAI,QAAQ,CAAC,gDAAgD,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,eAAe,CAAC,KAAK,KAAK,mBAAmB,EAAE,CAAC;gBAClD,MAAM,OAAO,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjD,MAAM,IAAI,QAAQ,CAChB,4BAA4B,eAAe,CAAC,YAAY,sBAAsB,OAAO,EAAE,CACxF,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC/B,MAAM,IAAI,QAAQ,CAAC,iCAAiC,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAChF,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvD,MAAM,IAAI,QAAQ,CAChB,oBAAoB,eAAe,CAAC,SAAS,0BAA0B,SAAS,EAAE,CACnF,CAAC;YACJ,CAAC;YAED,SAAS,GAAG,iBAAiB,CAAC;YAC9B,IAAI,eAAe,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5C,iBAAiB,GAAG,eAAe,CAAC,SAAS,CAAC;YAChD,CAAC;YAED,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3F,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC,GAAG,SAAS,CAAC;YACd,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,QAAQ,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG;QACd,IAAI;QACJ,KAAK;QACL,QAAQ;QACR,SAAS;QACT,iBAAiB;QACjB,SAAS;QACT,OAAO;QACP,WAAW;QACX,mBAAmB;KACpB,CAAC;IACF,OAAO,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAmB;IAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CACT;QACE,qBAAqB;QACrB,EAAE;QACF,QAAQ;QACR,iBAAiB;QACjB,qBAAqB;QACrB,yBAAyB;QACzB,uBAAuB;QACvB,yBAAyB;QACzB,uBAAuB;QACvB,EAAE;QACF,UAAU;QACV,0DAA0D;QAC1D,uGAAuG;QACvG,yDAAyD;QACzD,oEAAoE,WAAW,GAAG;QAClF,+EAA+E,aAAa,GAAG;QAC/F,uGAAuG;QACvG,yEAAyE,QAAQ,GAAG;QACpF,yHAAyH;QACzH,2FAA2F;QAC3F,8GAA8G;QAC9G,qFAAqF;QACrF,EAAE;QACF,cAAc;QACd,uEAAuE;QACvE,gFAAgF;QAChF,uDAAuD;QACvD,qEAAqE;QACrE,mEAAmE;QACnE,EAAE;QACF,WAAW;QACX,mCAAmC;QACnC,yBAAyB;QACzB,uDAAuD;QACvD,2CAA2C;QAC3C,qDAAqD;QACrD,EAAE;QACF,QAAQ;QACR,gFAAgF;QAChF,qFAAqF;QACrF,uEAAuE;QACvE,4DAA4D;QAC5D,+DAA+D;QAC/D,8CAA8C;QAC9C,8FAA8F;QAC9F,4FAA4F;QAC5F,gEAAgE;QAChE,qDAAqD;KACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/core/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAEL,gBAAgB,EAGhB,eAAe,GAChB,MAAM,YAAY,CAAC;AAcpB,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAmB;IAC/D,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,QAAmB;IAEnB,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACtC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IACxD,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/D,OAAO;QACL,SAAS;QACT,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACpD,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,GAAW,EACX,QAAmB;IAEnB,MAAM,eAAe,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAEnD,IAAI,eAAe,CAAC,KAAK,KAAK,mBAAmB,EAAE,CAAC;QAClD,MAAM,IAAI,QAAQ,CAAC,gDAAgD,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,eAAe,CAAC,KAAK,KAAK,mBAAmB,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,IAAI,QAAQ,CAChB,4BAA4B,eAAe,CAAC,YAAY,sBAAsB,OAAO,EAAE,CACxF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,QAAQ,CAAC,iCAAiC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,IAAI,QAAQ,CAChB,oBAAoB,eAAe,CAAC,SAAS,0BAA0B,SAAS,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS;QACT,iBAAiB,EAAE,eAAe,CAAC,SAAS;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,QAAQ,CAAC,0BAA0B,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,IAAI,QAAQ,CAAC,uBAAuB,GAAG,sBAAsB,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,UAAU,CACjB,GAAW,EACX,IAAc,EACd,KAAa;IAEb,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,QAAQ,CAAC,qBAAqB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,QAAQ,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAc,EAAE,QAAmB;IAC9D,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,QAA4B,CAAC;IACjC,IAAI,SAA6B,CAAC;IAClC,IAAI,iBAA8C,CAAC;IACnD,IAAI,SAAgC,CAAC;IACrC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAErB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,GAAG,IAAI,CAAC;YACb,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3F,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACxC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;YACxB,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;YACrB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,0BAA0B,EAAE,CAAC;YACvC,mBAAmB,GAAG,IAAI,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,WAAW,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IACE,GAAG,KAAK,WAAW;YACnB,GAAG,KAAK,IAAI;YACZ,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;YAC5B,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EACrB,CAAC;YACD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3D,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YAC9B,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAC9C,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;YACrB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3F,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACxC,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;YACrB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,QAAQ,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,IAAI,QAAQ,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO;QACL,IAAI;QACJ,KAAK;QACL,QAAQ;QACR,SAAS;QACT,iBAAiB;QACjB,SAAS;QACT,OAAO;QACP,WAAW;QACX,mBAAmB;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAmB;IAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CACT;QACE,qBAAqB;QACrB,EAAE;QACF,QAAQ;QACR,iBAAiB;QACjB,qBAAqB;QACrB,yBAAyB;QACzB,uBAAuB;QACvB,yBAAyB;QACzB,uBAAuB;QACvB,EAAE;QACF,UAAU;QACV,0DAA0D;QAC1D,uGAAuG;QACvG,yDAAyD;QACzD,oEAAoE,WAAW,GAAG;QAClF,+EAA+E,aAAa,GAAG;QAC/F,uGAAuG;QACvG,yEAAyE,QAAQ,GAAG;QACpF,yHAAyH;QACzH,2FAA2F;QAC3F,8GAA8G;QAC9G,qFAAqF;QACrF,EAAE;QACF,cAAc;QACd,uEAAuE;QACvE,gFAAgF;QAChF,uDAAuD;QACvD,qEAAqE;QACrE,mEAAmE;QACnE,EAAE;QACF,WAAW;QACX,mCAAmC;QACnC,yBAAyB;QACzB,uDAAuD;QACvD,2CAA2C;QAC3C,qDAAqD;QACrD,EAAE;QACF,QAAQ;QACR,gFAAgF;QAChF,qFAAqF;QACrF,uEAAuE;QACvE,4DAA4D;QAC5D,+DAA+D;QAC/D,8CAA8C;QAC9C,8FAA8F;QAC9F,4FAA4F;QAC5F,gEAAgE;QAChE,qDAAqD;KACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC"}
@@ -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: StringListSchema.optional(),
31
+ tools: z.array(z.string()).optional(),
42
32
  riskLevel: RiskLevelSchema.optional(),
43
- launchModels: StringListSchema.optional(),
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 = resolveModel(provider, model);
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 resolveModel(provider, modelId) {
217
- if (!isKnownProvider(provider))
218
- return undefined;
219
- return getModels(provider).find((m) => m.id === modelId);
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
- const deps = options?.deps ?? createDefaultConfigDeps();
300
- const levels = options?.levels ?? resolveConfigLevels(deps, { cwd: options?.cwd });
301
- return { deps, levels };
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 = resolveModel(provider, model);
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?.deps,
541
- levels: args?.levels,
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?.basePersonasById ?? new Map(builtinPersonas.map((p) => [p.id.toLowerCase(), p]));
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?.deps,
566
- levels: args?.levels,
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?.basePersonasById ?? new Map(builtinPersonas.map((p) => [p.id.toLowerCase(), p]));
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?.deps,
595
- levels: args?.levels,
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?.deps,
619
- levels: args?.levels,
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?.deps,
647
- levels: args?.levels,
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?.deps,
670
- levels: args?.levels,
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?.deps,
701
- levels: options?.levels,
702
- cwd: options?.cwd,
730
+ deps: options.deps,
731
+ levels: options.levels,
703
732
  });
704
- const virtualBundle = buildVirtualBundle(config ?? {}, deps);
733
+ const virtualBundle = buildVirtualBundle(config ?? {});
705
734
  try {
706
- const basePersonasById = new Map(builtinPersonas.map((p) => [p.id.toLowerCase(), p]));
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(virtualBundle.personas, userPersonasResult.personas, projectPersonasResult.personas).map((persona) => withDefaultSubagentLaunchModels(persona, defaultLaunchModels));
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),