@oyasmi/pipiclaw 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +43 -5
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +156 -57
  4. package/dist/agent.js.map +1 -1
  5. package/dist/context.d.ts +18 -0
  6. package/dist/context.d.ts.map +1 -1
  7. package/dist/context.js +26 -0
  8. package/dist/context.js.map +1 -1
  9. package/dist/index.d.ts +7 -3
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +6 -2
  12. package/dist/index.js.map +1 -1
  13. package/dist/llm-json.d.ts +7 -0
  14. package/dist/llm-json.d.ts.map +1 -0
  15. package/dist/llm-json.js +77 -0
  16. package/dist/llm-json.js.map +1 -0
  17. package/dist/markdown-sections.d.ts +6 -0
  18. package/dist/markdown-sections.d.ts.map +1 -0
  19. package/dist/markdown-sections.js +34 -0
  20. package/dist/markdown-sections.js.map +1 -0
  21. package/dist/memory-candidates.d.ts +21 -0
  22. package/dist/memory-candidates.d.ts.map +1 -0
  23. package/dist/memory-candidates.js +126 -0
  24. package/dist/memory-candidates.js.map +1 -0
  25. package/dist/memory-consolidation.d.ts.map +1 -1
  26. package/dist/memory-consolidation.js +28 -49
  27. package/dist/memory-consolidation.js.map +1 -1
  28. package/dist/memory-files.d.ts +3 -0
  29. package/dist/memory-files.d.ts.map +1 -1
  30. package/dist/memory-files.js +51 -0
  31. package/dist/memory-files.js.map +1 -1
  32. package/dist/memory-lifecycle.d.ts +9 -0
  33. package/dist/memory-lifecycle.d.ts.map +1 -1
  34. package/dist/memory-lifecycle.js +66 -0
  35. package/dist/memory-lifecycle.js.map +1 -1
  36. package/dist/memory-recall.d.ts +29 -0
  37. package/dist/memory-recall.d.ts.map +1 -0
  38. package/dist/memory-recall.js +218 -0
  39. package/dist/memory-recall.js.map +1 -0
  40. package/dist/prompt-builder.d.ts.map +1 -1
  41. package/dist/prompt-builder.js +7 -2
  42. package/dist/prompt-builder.js.map +1 -1
  43. package/dist/session-memory-files.d.ts +2 -0
  44. package/dist/session-memory-files.d.ts.map +1 -0
  45. package/dist/session-memory-files.js +2 -0
  46. package/dist/session-memory-files.js.map +1 -0
  47. package/dist/session-memory.d.ts +22 -0
  48. package/dist/session-memory.d.ts.map +1 -0
  49. package/dist/session-memory.js +274 -0
  50. package/dist/session-memory.js.map +1 -0
  51. package/dist/sidecar-worker.d.ts +27 -0
  52. package/dist/sidecar-worker.d.ts.map +1 -0
  53. package/dist/sidecar-worker.js +105 -0
  54. package/dist/sidecar-worker.js.map +1 -0
  55. package/dist/sub-agents.d.ts +10 -0
  56. package/dist/sub-agents.d.ts.map +1 -1
  57. package/dist/sub-agents.js +90 -0
  58. package/dist/sub-agents.js.map +1 -1
  59. package/dist/tools/index.d.ts +3 -0
  60. package/dist/tools/index.d.ts.map +1 -1
  61. package/dist/tools/index.js +2 -0
  62. package/dist/tools/index.js.map +1 -1
  63. package/dist/tools/subagent.d.ts +6 -0
  64. package/dist/tools/subagent.d.ts.map +1 -1
  65. package/dist/tools/subagent.js +127 -12
  66. package/dist/tools/subagent.js.map +1 -1
  67. package/docs/improve-memory/design.md +537 -0
  68. package/docs/improve-memory/interfaces-and-tests.md +473 -0
  69. package/docs/improve-memory/spec.md +357 -0
  70. package/docs/memory-rfc.md +7 -1
  71. package/docs/proj-review.md +188 -0
  72. package/docs/test-supplementation-plan.md +553 -0
  73. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agents.d.ts","sourceRoot":"","sources":["../src/sub-agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAQtD,QAAA,MAAM,uBAAuB,4CAA6C,CAAC;AAS3E,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,GAAG,QAAQ,CAAC;CAChC;AAED,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,UAAU,CAAC;IACzF,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AASD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAErE;AAMD,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5D;AAwCD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG;IAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAuB7G;AAmDD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,uBAAuB,CAyG9G;AAED,wBAAgB,qBAAqB,CACpC,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAC7B,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,EACxB,gBAAgB,EAAE,cAAc,EAAE,EAClC,SAAS,EAAE,2BAA2B,GACpC;IAAE,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAyErD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM,CAW1F"}
1
+ {"version":3,"file":"sub-agents.d.ts","sourceRoot":"","sources":["../src/sub-agents.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,8 @@ const DEFAULT_MAX_WALL_TIME_SEC = 300;
11
11
  const DEFAULT_BASH_TIMEOUT_SEC = 120;
12
12
  const MAX_SUB_AGENT_TASK_CHARS = 12000;
13
13
  const MAX_SUB_AGENT_SYSTEM_PROMPT_CHARS = 16000;
14
+ const ALLOWED_CONTEXT_MODES = ["isolated", "contextual"];
15
+ const ALLOWED_MEMORY_MODES = ["none", "session", "relevant"];
14
16
  function validateTextLength(value, maxChars, label) {
15
17
  if (value.length <= maxChars) {
16
18
  return undefined;
@@ -56,6 +58,58 @@ function parseToolNames(raw) {
56
58
  }
57
59
  return { tools: [], error: 'Invalid "tools" frontmatter: expected a string or string[]' };
58
60
  }
61
+ function parseStringList(raw, label) {
62
+ if (raw === undefined || raw === null) {
63
+ return { values: [] };
64
+ }
65
+ if (typeof raw === "string") {
66
+ if (!raw.trim()) {
67
+ return { values: [] };
68
+ }
69
+ return {
70
+ values: Array.from(new Set(raw
71
+ .split(",")
72
+ .map((value) => value.trim())
73
+ .filter((value) => value.length > 0))),
74
+ };
75
+ }
76
+ if (Array.isArray(raw)) {
77
+ const invalidValue = raw.find((value) => typeof value !== "string");
78
+ if (invalidValue !== undefined) {
79
+ return { values: [], error: `Invalid "${label}" frontmatter: expected a string or string[]` };
80
+ }
81
+ return {
82
+ values: Array.from(new Set(raw.map((value) => value.trim()).filter((value) => value.length > 0))),
83
+ };
84
+ }
85
+ return { values: [], error: `Invalid "${label}" frontmatter: expected a string or string[]` };
86
+ }
87
+ function parseContextMode(raw) {
88
+ const normalized = readOptionalTrimmedString(raw);
89
+ if (!normalized) {
90
+ return { value: "isolated" };
91
+ }
92
+ if (ALLOWED_CONTEXT_MODES.includes(normalized)) {
93
+ return { value: normalized };
94
+ }
95
+ return {
96
+ value: "isolated",
97
+ error: `Unknown contextMode "${normalized}". Allowed values: ${ALLOWED_CONTEXT_MODES.join(", ")}`,
98
+ };
99
+ }
100
+ function parseMemoryMode(raw, contextMode) {
101
+ const normalized = readOptionalTrimmedString(raw);
102
+ if (!normalized) {
103
+ return { value: contextMode === "contextual" ? "relevant" : "none" };
104
+ }
105
+ if (ALLOWED_MEMORY_MODES.includes(normalized)) {
106
+ return { value: normalized };
107
+ }
108
+ return {
109
+ value: contextMode === "contextual" ? "relevant" : "none",
110
+ error: `Unknown memory "${normalized}". Allowed values: ${ALLOWED_MEMORY_MODES.join(", ")}`,
111
+ };
112
+ }
59
113
  export function validateToolNames(values) {
60
114
  if (!values || values.length === 0) {
61
115
  return { tools: [...DEFAULT_SUB_AGENT_TOOLS] };
@@ -163,6 +217,21 @@ export function discoverSubAgents(workspaceDir, availableModels) {
163
217
  warnings.push(`${entry.name}: ${toolParse.error}`);
164
218
  continue;
165
219
  }
220
+ const contextMode = parseContextMode(frontmatter.contextMode);
221
+ if (contextMode.error) {
222
+ warnings.push(`${entry.name}: ${contextMode.error}`);
223
+ continue;
224
+ }
225
+ const memoryMode = parseMemoryMode(frontmatter.memory, contextMode.value);
226
+ if (memoryMode.error) {
227
+ warnings.push(`${entry.name}: ${memoryMode.error}`);
228
+ continue;
229
+ }
230
+ const parsedPaths = parseStringList(frontmatter.paths, "paths");
231
+ if (parsedPaths.error) {
232
+ warnings.push(`${entry.name}: ${parsedPaths.error}`);
233
+ continue;
234
+ }
166
235
  const maxTurns = parsePositiveInteger(frontmatter.maxTurns, DEFAULT_MAX_TURNS);
167
236
  const maxToolCalls = parsePositiveInteger(frontmatter.maxToolCalls, DEFAULT_MAX_TOOL_CALLS);
168
237
  const maxWallTimeSec = parsePositiveInteger(frontmatter.maxWallTimeSec, DEFAULT_MAX_WALL_TIME_SEC);
@@ -204,6 +273,9 @@ export function discoverSubAgents(workspaceDir, availableModels) {
204
273
  maxToolCalls: maxToolCalls.value,
205
274
  maxWallTimeSec: maxWallTimeSec.value,
206
275
  bashTimeoutSec: bashTimeoutSec.value,
276
+ contextMode: contextMode.value,
277
+ memory: memoryMode.value,
278
+ paths: parsedPaths.values,
207
279
  filePath,
208
280
  source: "predefined",
209
281
  });
@@ -239,6 +311,21 @@ export function resolveSubAgentConfig(availableModels, currentModel, predefinedA
239
311
  const maxToolCalls = resolvePositiveOverride(overrides.maxToolCalls, baseConfig?.maxToolCalls ?? DEFAULT_MAX_TOOL_CALLS);
240
312
  const maxWallTimeSec = resolvePositiveOverride(overrides.maxWallTimeSec, baseConfig?.maxWallTimeSec ?? DEFAULT_MAX_WALL_TIME_SEC);
241
313
  const bashTimeoutSec = resolvePositiveOverride(overrides.bashTimeoutSec, baseConfig?.bashTimeoutSec ?? DEFAULT_BASH_TIMEOUT_SEC);
314
+ const contextModeOverride = overrides.contextMode ? parseContextMode(overrides.contextMode) : undefined;
315
+ if (contextModeOverride?.error) {
316
+ return { error: contextModeOverride.error };
317
+ }
318
+ const contextMode = contextModeOverride?.value ?? baseConfig?.contextMode ?? "isolated";
319
+ const memoryOverride = overrides.memory ? parseMemoryMode(overrides.memory, contextMode) : undefined;
320
+ if (memoryOverride?.error) {
321
+ return { error: memoryOverride.error };
322
+ }
323
+ const memory = memoryOverride?.value ?? baseConfig?.memory ?? (contextMode === "contextual" ? "relevant" : "none");
324
+ const pathsOverride = overrides.paths ? parseStringList(overrides.paths, "paths") : undefined;
325
+ if (pathsOverride?.error) {
326
+ return { error: pathsOverride.error };
327
+ }
328
+ const paths = pathsOverride?.values ?? baseConfig?.paths ?? [];
242
329
  const systemPrompt = overrides.systemPrompt?.trim() || baseConfig?.systemPrompt || "";
243
330
  if (!systemPrompt) {
244
331
  return { error: "Sub-agent system prompt cannot be empty." };
@@ -261,6 +348,9 @@ export function resolveSubAgentConfig(availableModels, currentModel, predefinedA
261
348
  maxToolCalls,
262
349
  maxWallTimeSec,
263
350
  bashTimeoutSec,
351
+ contextMode,
352
+ memory,
353
+ paths,
264
354
  filePath: baseConfig?.filePath,
265
355
  source: baseConfig ? "predefined" : "inline",
266
356
  },
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agents.js","sourceRoot":"","sources":["../src/sub-agents.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@mariozechner/pi-ai\";\nimport { parseFrontmatter } from \"@mariozechner/pi-coding-agent\";\nimport type { Dirent } from \"fs\";\nimport { existsSync, readdirSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { findExactModelReferenceMatch, formatModelReference } from \"./model-utils.js\";\nimport { SUB_AGENTS_DIR_NAME } from \"./paths.js\";\n\nconst ALLOWED_SUB_AGENT_TOOLS = [\"read\", \"bash\", \"edit\", \"write\"] as const;\nconst DEFAULT_SUB_AGENT_TOOLS = [\"read\", \"bash\"] as const;\nconst DEFAULT_MAX_TURNS = 24;\nconst DEFAULT_MAX_TOOL_CALLS = 48;\nconst DEFAULT_MAX_WALL_TIME_SEC = 300;\nconst DEFAULT_BASH_TIMEOUT_SEC = 120;\nconst MAX_SUB_AGENT_TASK_CHARS = 12000;\nconst MAX_SUB_AGENT_SYSTEM_PROMPT_CHARS = 16000;\n\nexport type SubAgentToolName = (typeof ALLOWED_SUB_AGENT_TOOLS)[number];\n\nexport interface SubAgentConfig {\n\tname: string;\n\tdescription: string;\n\tsystemPrompt: string;\n\ttools: SubAgentToolName[];\n\tmodel?: Model<Api>;\n\tmodelRef?: string;\n\tmaxTurns: number;\n\tmaxToolCalls: number;\n\tmaxWallTimeSec: number;\n\tbashTimeoutSec: number;\n\tfilePath?: string;\n\tsource: \"predefined\" | \"inline\";\n}\n\nexport interface ResolvedSubAgentConfig extends Omit<SubAgentConfig, \"model\" | \"modelRef\"> {\n\tmodel: Model<Api>;\n\tmodelRef: string;\n}\n\nexport interface SubAgentDiscoveryResult {\n\tdirectory: string;\n\tagents: SubAgentConfig[];\n\twarnings: string[];\n}\n\nexport interface SubAgentInvocationOverrides {\n\tagent?: string;\n\tname?: string;\n\tsystemPrompt?: string;\n\ttools?: string[];\n\tmodel?: string;\n\tmaxTurns?: number;\n\tmaxToolCalls?: number;\n\tmaxWallTimeSec?: number;\n\tbashTimeoutSec?: number;\n}\n\nfunction validateTextLength(value: string, maxChars: number, label: string): string | undefined {\n\tif (value.length <= maxChars) {\n\t\treturn undefined;\n\t}\n\treturn `${label} exceeds ${maxChars} characters (got ${value.length}).`;\n}\n\nexport function validateSubAgentTask(task: string): string | undefined {\n\treturn validateTextLength(task, MAX_SUB_AGENT_TASK_CHARS, \"Sub-agent task\");\n}\n\nfunction validateSubAgentSystemPrompt(systemPrompt: string, label: string): string | undefined {\n\treturn validateTextLength(systemPrompt, MAX_SUB_AGENT_SYSTEM_PROMPT_CHARS, label);\n}\n\nexport function getSubAgentsDir(workspaceDir: string): string {\n\treturn join(workspaceDir, SUB_AGENTS_DIR_NAME);\n}\n\nfunction readOptionalTrimmedString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") {\n\t\treturn undefined;\n\t}\n\n\tconst trimmed = value.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nfunction parseToolNames(raw: unknown): { tools: SubAgentToolName[]; error?: string } {\n\tif (raw === undefined || raw === null) {\n\t\treturn { tools: [...DEFAULT_SUB_AGENT_TOOLS] };\n\t}\n\n\tif (typeof raw === \"string\") {\n\t\tif (!raw.trim()) {\n\t\t\treturn { tools: [...DEFAULT_SUB_AGENT_TOOLS] };\n\t\t}\n\n\t\tconst values = raw\n\t\t\t.split(\",\")\n\t\t\t.map((value) => value.trim())\n\t\t\t.filter((value) => value.length > 0);\n\n\t\treturn validateToolNames(values);\n\t}\n\n\tif (Array.isArray(raw)) {\n\t\tconst invalidValue = raw.find((value) => typeof value !== \"string\");\n\t\tif (invalidValue !== undefined) {\n\t\t\treturn { tools: [], error: 'Invalid \"tools\" frontmatter: expected a string or string[]' };\n\t\t}\n\t\treturn validateToolNames(raw);\n\t}\n\n\treturn { tools: [], error: 'Invalid \"tools\" frontmatter: expected a string or string[]' };\n}\n\nexport function validateToolNames(values: string[] | undefined): { tools: SubAgentToolName[]; error?: string } {\n\tif (!values || values.length === 0) {\n\t\treturn { tools: [...DEFAULT_SUB_AGENT_TOOLS] };\n\t}\n\n\tconst tools: SubAgentToolName[] = [];\n\tconst seen = new Set<string>();\n\tfor (const value of values) {\n\t\tconst normalized = value.trim();\n\t\tif (!normalized || seen.has(normalized)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!ALLOWED_SUB_AGENT_TOOLS.includes(normalized as SubAgentToolName)) {\n\t\t\treturn {\n\t\t\t\ttools: [],\n\t\t\t\terror: `Unknown tool \"${normalized}\". Allowed tools: ${ALLOWED_SUB_AGENT_TOOLS.join(\", \")}`,\n\t\t\t};\n\t\t}\n\t\tseen.add(normalized);\n\t\ttools.push(normalized as SubAgentToolName);\n\t}\n\n\treturn { tools: tools.length > 0 ? tools : [...DEFAULT_SUB_AGENT_TOOLS] };\n}\n\nfunction parsePositiveInteger(raw: unknown, fallback: number): { value: number; warning?: string } {\n\tif (raw === undefined || raw === null) {\n\t\treturn { value: fallback };\n\t}\n\n\tif (typeof raw === \"number\") {\n\t\tif (!Number.isFinite(raw) || raw <= 0) {\n\t\t\treturn { value: fallback, warning: `Invalid numeric value \"${String(raw)}\", using default ${fallback}` };\n\t\t}\n\t\treturn { value: Math.floor(raw) };\n\t}\n\n\tif (typeof raw !== \"string\") {\n\t\treturn { value: fallback, warning: `Invalid numeric value \"${String(raw)}\", using default ${fallback}` };\n\t}\n\n\tif (!raw.trim()) {\n\t\treturn { value: fallback };\n\t}\n\n\tconst parsed = Number.parseInt(raw.trim(), 10);\n\tif (!Number.isFinite(parsed) || parsed <= 0) {\n\t\treturn { value: fallback, warning: `Invalid numeric value \"${raw}\", using default ${fallback}` };\n\t}\n\n\treturn { value: parsed };\n}\n\nfunction resolvePositiveOverride(value: number | undefined, fallback: number): number {\n\tif (!Number.isFinite(value) || value === undefined || value <= 0) {\n\t\treturn fallback;\n\t}\n\treturn Math.floor(value);\n}\n\nfunction resolveModelReference(\n\tmodelRef: string,\n\tavailableModels: Model<Api>[],\n): { model?: Model<Api>; error?: string } {\n\tconst { match, ambiguous } = findExactModelReferenceMatch(modelRef, availableModels);\n\tif (match) {\n\t\treturn { model: match };\n\t}\n\tif (ambiguous) {\n\t\treturn { error: `Model reference \"${modelRef}\" is ambiguous. Use provider/modelId.` };\n\t}\n\treturn { error: `Model reference \"${modelRef}\" was not found among available models.` };\n}\n\nexport function discoverSubAgents(workspaceDir: string, availableModels: Model<Api>[]): SubAgentDiscoveryResult {\n\tconst directory = getSubAgentsDir(workspaceDir);\n\tif (!existsSync(directory)) {\n\t\treturn { directory, agents: [], warnings: [] };\n\t}\n\n\tconst warnings: string[] = [];\n\tconst agents: SubAgentConfig[] = [];\n\tconst seenNames = new Set<string>();\n\tlet entries: Dirent<string>[];\n\ttry {\n\t\tentries = readdirSync(directory, { withFileTypes: true })\n\t\t\t.filter((entry) => entry.name.endsWith(\".md\") && (entry.isFile() || entry.isSymbolicLink()))\n\t\t\t.sort((a, b) => a.name.localeCompare(b.name));\n\t} catch (error) {\n\t\treturn {\n\t\t\tdirectory,\n\t\t\tagents: [],\n\t\t\twarnings: [`Failed to read sub-agents directory (${error instanceof Error ? error.message : String(error)})`],\n\t\t};\n\t}\n\n\tfor (const entry of entries) {\n\t\tconst filePath = join(directory, entry.name);\n\t\tlet content = \"\";\n\t\ttry {\n\t\t\tcontent = readFileSync(filePath, \"utf-8\");\n\t\t} catch (error) {\n\t\t\twarnings.push(\n\t\t\t\t`${entry.name}: failed to read file (${error instanceof Error ? error.message : String(error)})`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst { frontmatter, body } = parseFrontmatter<Record<string, unknown>>(content);\n\t\tconst name = readOptionalTrimmedString(frontmatter.name);\n\t\tconst description = readOptionalTrimmedString(frontmatter.description);\n\n\t\tif (!name || !description) {\n\t\t\twarnings.push(`${entry.name}: missing required frontmatter fields \"name\" or \"description\"`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (seenNames.has(name)) {\n\t\t\twarnings.push(`${entry.name}: duplicate sub-agent name \"${name}\" ignored`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst toolParse = parseToolNames(frontmatter.tools);\n\t\tif (toolParse.error) {\n\t\t\twarnings.push(`${entry.name}: ${toolParse.error}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst maxTurns = parsePositiveInteger(frontmatter.maxTurns, DEFAULT_MAX_TURNS);\n\t\tconst maxToolCalls = parsePositiveInteger(frontmatter.maxToolCalls, DEFAULT_MAX_TOOL_CALLS);\n\t\tconst maxWallTimeSec = parsePositiveInteger(frontmatter.maxWallTimeSec, DEFAULT_MAX_WALL_TIME_SEC);\n\t\tconst bashTimeoutSec = parsePositiveInteger(frontmatter.bashTimeoutSec, DEFAULT_BASH_TIMEOUT_SEC);\n\n\t\tfor (const warning of [maxTurns.warning, maxToolCalls.warning, maxWallTimeSec.warning, bashTimeoutSec.warning]) {\n\t\t\tif (warning) {\n\t\t\t\twarnings.push(`${entry.name}: ${warning}`);\n\t\t\t}\n\t\t}\n\n\t\tconst modelRef = readOptionalTrimmedString(frontmatter.model);\n\t\tlet model: Model<Api> | undefined;\n\t\tif (modelRef) {\n\t\t\tconst resolved = resolveModelReference(modelRef, availableModels);\n\t\t\tif (!resolved.model) {\n\t\t\t\twarnings.push(`${entry.name}: ${resolved.error}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmodel = resolved.model;\n\t\t}\n\n\t\tconst trimmedBody = body.trim();\n\t\tif (!trimmedBody) {\n\t\t\twarnings.push(`${entry.name}: empty system prompt body`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst promptLengthError = validateSubAgentSystemPrompt(trimmedBody, \"Sub-agent system prompt\");\n\t\tif (promptLengthError) {\n\t\t\twarnings.push(`${entry.name}: ${promptLengthError}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tseenNames.add(name);\n\t\tagents.push({\n\t\t\tname,\n\t\t\tdescription,\n\t\t\tsystemPrompt: trimmedBody,\n\t\t\ttools: toolParse.tools,\n\t\t\tmodel,\n\t\t\tmodelRef: modelRef || (model ? formatModelReference(model) : undefined),\n\t\t\tmaxTurns: maxTurns.value,\n\t\t\tmaxToolCalls: maxToolCalls.value,\n\t\t\tmaxWallTimeSec: maxWallTimeSec.value,\n\t\t\tbashTimeoutSec: bashTimeoutSec.value,\n\t\t\tfilePath,\n\t\t\tsource: \"predefined\",\n\t\t});\n\t}\n\n\treturn { directory, agents, warnings };\n}\n\nexport function resolveSubAgentConfig(\n\tavailableModels: Model<Api>[],\n\tcurrentModel: Model<Api>,\n\tpredefinedAgents: SubAgentConfig[],\n\toverrides: SubAgentInvocationOverrides,\n): { config?: ResolvedSubAgentConfig; error?: string } {\n\tconst baseConfig = overrides.agent ? predefinedAgents.find((agent) => agent.name === overrides.agent) : undefined;\n\tif (overrides.agent && !baseConfig) {\n\t\tconst available = predefinedAgents.length > 0 ? predefinedAgents.map((agent) => agent.name).join(\", \") : \"none\";\n\t\treturn { error: `Unknown sub-agent \"${overrides.agent}\". Available sub-agents: ${available}.` };\n\t}\n\n\tif (!baseConfig && (!overrides.systemPrompt || !overrides.systemPrompt.trim())) {\n\t\treturn { error: 'Provide either \"agent\" or \"systemPrompt\" to define the sub-agent.' };\n\t}\n\n\tconst tools = overrides.tools\n\t\t? validateToolNames(overrides.tools)\n\t\t: { tools: baseConfig?.tools ?? [...DEFAULT_SUB_AGENT_TOOLS] };\n\tif (tools.error) {\n\t\treturn { error: tools.error };\n\t}\n\n\tlet model = baseConfig?.model;\n\tlet modelRef = baseConfig?.modelRef;\n\tif (overrides.model?.trim()) {\n\t\tconst resolved = resolveModelReference(overrides.model.trim(), availableModels);\n\t\tif (!resolved.model) {\n\t\t\treturn { error: resolved.error };\n\t\t}\n\t\tmodel = resolved.model;\n\t\tmodelRef = formatModelReference(resolved.model);\n\t}\n\n\tconst maxTurns = resolvePositiveOverride(overrides.maxTurns, baseConfig?.maxTurns ?? DEFAULT_MAX_TURNS);\n\tconst maxToolCalls = resolvePositiveOverride(\n\t\toverrides.maxToolCalls,\n\t\tbaseConfig?.maxToolCalls ?? DEFAULT_MAX_TOOL_CALLS,\n\t);\n\tconst maxWallTimeSec = resolvePositiveOverride(\n\t\toverrides.maxWallTimeSec,\n\t\tbaseConfig?.maxWallTimeSec ?? DEFAULT_MAX_WALL_TIME_SEC,\n\t);\n\tconst bashTimeoutSec = resolvePositiveOverride(\n\t\toverrides.bashTimeoutSec,\n\t\tbaseConfig?.bashTimeoutSec ?? DEFAULT_BASH_TIMEOUT_SEC,\n\t);\n\n\tconst systemPrompt = overrides.systemPrompt?.trim() || baseConfig?.systemPrompt || \"\";\n\tif (!systemPrompt) {\n\t\treturn { error: \"Sub-agent system prompt cannot be empty.\" };\n\t}\n\tif (overrides.systemPrompt?.trim()) {\n\t\tconst promptLengthError = validateSubAgentSystemPrompt(\n\t\t\toverrides.systemPrompt.trim(),\n\t\t\t\"Inline sub-agent systemPrompt\",\n\t\t);\n\t\tif (promptLengthError) {\n\t\t\treturn { error: promptLengthError };\n\t\t}\n\t}\n\n\treturn {\n\t\tconfig: {\n\t\t\tname: overrides.name?.trim() || baseConfig?.name || \"dynamic-subagent\",\n\t\t\tdescription: baseConfig?.description || \"Inline sub-agent\",\n\t\t\tsystemPrompt,\n\t\t\ttools: tools.tools,\n\t\t\tmodel: model ?? currentModel,\n\t\t\tmodelRef: modelRef ?? formatModelReference(model ?? currentModel),\n\t\t\tmaxTurns,\n\t\t\tmaxToolCalls,\n\t\t\tmaxWallTimeSec,\n\t\t\tbashTimeoutSec,\n\t\t\tfilePath: baseConfig?.filePath,\n\t\t\tsource: baseConfig ? \"predefined\" : \"inline\",\n\t\t},\n\t};\n}\n\nexport function formatSubAgentList(agents: SubAgentConfig[], maxItems: number = 12): string {\n\tif (agents.length === 0) {\n\t\treturn \"none\";\n\t}\n\n\tconst listed = agents.slice(0, maxItems).map((agent) => `- \\`${agent.name}\\`: ${agent.description}`);\n\tif (agents.length <= maxItems) {\n\t\treturn listed.join(\"\\n\");\n\t}\n\n\treturn `${listed.join(\"\\n\")}\\n- ... and ${agents.length - maxItems} more`;\n}\n"]}
1
+ {"version":3,"file":"sub-agents.js","sourceRoot":"","sources":["../src/sub-agents.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@mariozechner/pi-ai\";\nimport { parseFrontmatter } from \"@mariozechner/pi-coding-agent\";\nimport type { Dirent } from \"fs\";\nimport { existsSync, readdirSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { findExactModelReferenceMatch, formatModelReference } from \"./model-utils.js\";\nimport { SUB_AGENTS_DIR_NAME } from \"./paths.js\";\n\nconst ALLOWED_SUB_AGENT_TOOLS = [\"read\", \"bash\", \"edit\", \"write\"] as const;\nconst DEFAULT_SUB_AGENT_TOOLS = [\"read\", \"bash\"] as const;\nconst DEFAULT_MAX_TURNS = 24;\nconst DEFAULT_MAX_TOOL_CALLS = 48;\nconst DEFAULT_MAX_WALL_TIME_SEC = 300;\nconst DEFAULT_BASH_TIMEOUT_SEC = 120;\nconst MAX_SUB_AGENT_TASK_CHARS = 12000;\nconst MAX_SUB_AGENT_SYSTEM_PROMPT_CHARS = 16000;\nconst ALLOWED_CONTEXT_MODES = [\"isolated\", \"contextual\"] as const;\nconst ALLOWED_MEMORY_MODES = [\"none\", \"session\", \"relevant\"] as const;\n\nexport type SubAgentToolName = (typeof ALLOWED_SUB_AGENT_TOOLS)[number];\nexport type SubAgentContextMode = (typeof ALLOWED_CONTEXT_MODES)[number];\nexport type SubAgentMemoryMode = (typeof ALLOWED_MEMORY_MODES)[number];\n\nexport interface SubAgentConfig {\n\tname: string;\n\tdescription: string;\n\tsystemPrompt: string;\n\ttools: SubAgentToolName[];\n\tmodel?: Model<Api>;\n\tmodelRef?: string;\n\tmaxTurns: number;\n\tmaxToolCalls: number;\n\tmaxWallTimeSec: number;\n\tbashTimeoutSec: number;\n\tcontextMode: SubAgentContextMode;\n\tmemory: SubAgentMemoryMode;\n\tpaths: string[];\n\tfilePath?: string;\n\tsource: \"predefined\" | \"inline\";\n}\n\nexport interface ResolvedSubAgentConfig extends Omit<SubAgentConfig, \"model\" | \"modelRef\"> {\n\tmodel: Model<Api>;\n\tmodelRef: string;\n}\n\nexport interface SubAgentDiscoveryResult {\n\tdirectory: string;\n\tagents: SubAgentConfig[];\n\twarnings: string[];\n}\n\nexport interface SubAgentInvocationOverrides {\n\tagent?: string;\n\tname?: string;\n\tsystemPrompt?: string;\n\ttools?: string[];\n\tmodel?: string;\n\tmaxTurns?: number;\n\tmaxToolCalls?: number;\n\tmaxWallTimeSec?: number;\n\tbashTimeoutSec?: number;\n\tcontextMode?: string;\n\tmemory?: string;\n\tpaths?: string[];\n}\n\nfunction validateTextLength(value: string, maxChars: number, label: string): string | undefined {\n\tif (value.length <= maxChars) {\n\t\treturn undefined;\n\t}\n\treturn `${label} exceeds ${maxChars} characters (got ${value.length}).`;\n}\n\nexport function validateSubAgentTask(task: string): string | undefined {\n\treturn validateTextLength(task, MAX_SUB_AGENT_TASK_CHARS, \"Sub-agent task\");\n}\n\nfunction validateSubAgentSystemPrompt(systemPrompt: string, label: string): string | undefined {\n\treturn validateTextLength(systemPrompt, MAX_SUB_AGENT_SYSTEM_PROMPT_CHARS, label);\n}\n\nexport function getSubAgentsDir(workspaceDir: string): string {\n\treturn join(workspaceDir, SUB_AGENTS_DIR_NAME);\n}\n\nfunction readOptionalTrimmedString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") {\n\t\treturn undefined;\n\t}\n\n\tconst trimmed = value.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nfunction parseToolNames(raw: unknown): { tools: SubAgentToolName[]; error?: string } {\n\tif (raw === undefined || raw === null) {\n\t\treturn { tools: [...DEFAULT_SUB_AGENT_TOOLS] };\n\t}\n\n\tif (typeof raw === \"string\") {\n\t\tif (!raw.trim()) {\n\t\t\treturn { tools: [...DEFAULT_SUB_AGENT_TOOLS] };\n\t\t}\n\n\t\tconst values = raw\n\t\t\t.split(\",\")\n\t\t\t.map((value) => value.trim())\n\t\t\t.filter((value) => value.length > 0);\n\n\t\treturn validateToolNames(values);\n\t}\n\n\tif (Array.isArray(raw)) {\n\t\tconst invalidValue = raw.find((value) => typeof value !== \"string\");\n\t\tif (invalidValue !== undefined) {\n\t\t\treturn { tools: [], error: 'Invalid \"tools\" frontmatter: expected a string or string[]' };\n\t\t}\n\t\treturn validateToolNames(raw);\n\t}\n\n\treturn { tools: [], error: 'Invalid \"tools\" frontmatter: expected a string or string[]' };\n}\n\nfunction parseStringList(raw: unknown, label: string): { values: string[]; error?: string } {\n\tif (raw === undefined || raw === null) {\n\t\treturn { values: [] };\n\t}\n\n\tif (typeof raw === \"string\") {\n\t\tif (!raw.trim()) {\n\t\t\treturn { values: [] };\n\t\t}\n\n\t\treturn {\n\t\t\tvalues: Array.from(\n\t\t\t\tnew Set(\n\t\t\t\t\traw\n\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t.map((value) => value.trim())\n\t\t\t\t\t\t.filter((value) => value.length > 0),\n\t\t\t\t),\n\t\t\t),\n\t\t};\n\t}\n\n\tif (Array.isArray(raw)) {\n\t\tconst invalidValue = raw.find((value) => typeof value !== \"string\");\n\t\tif (invalidValue !== undefined) {\n\t\t\treturn { values: [], error: `Invalid \"${label}\" frontmatter: expected a string or string[]` };\n\t\t}\n\n\t\treturn {\n\t\t\tvalues: Array.from(new Set(raw.map((value) => value.trim()).filter((value) => value.length > 0))),\n\t\t};\n\t}\n\n\treturn { values: [], error: `Invalid \"${label}\" frontmatter: expected a string or string[]` };\n}\n\nfunction parseContextMode(raw: unknown): { value: SubAgentContextMode; error?: string } {\n\tconst normalized = readOptionalTrimmedString(raw);\n\tif (!normalized) {\n\t\treturn { value: \"isolated\" };\n\t}\n\tif (ALLOWED_CONTEXT_MODES.includes(normalized as SubAgentContextMode)) {\n\t\treturn { value: normalized as SubAgentContextMode };\n\t}\n\treturn {\n\t\tvalue: \"isolated\",\n\t\terror: `Unknown contextMode \"${normalized}\". Allowed values: ${ALLOWED_CONTEXT_MODES.join(\", \")}`,\n\t};\n}\n\nfunction parseMemoryMode(\n\traw: unknown,\n\tcontextMode: SubAgentContextMode,\n): { value: SubAgentMemoryMode; error?: string } {\n\tconst normalized = readOptionalTrimmedString(raw);\n\tif (!normalized) {\n\t\treturn { value: contextMode === \"contextual\" ? \"relevant\" : \"none\" };\n\t}\n\tif (ALLOWED_MEMORY_MODES.includes(normalized as SubAgentMemoryMode)) {\n\t\treturn { value: normalized as SubAgentMemoryMode };\n\t}\n\treturn {\n\t\tvalue: contextMode === \"contextual\" ? \"relevant\" : \"none\",\n\t\terror: `Unknown memory \"${normalized}\". Allowed values: ${ALLOWED_MEMORY_MODES.join(\", \")}`,\n\t};\n}\n\nexport function validateToolNames(values: string[] | undefined): { tools: SubAgentToolName[]; error?: string } {\n\tif (!values || values.length === 0) {\n\t\treturn { tools: [...DEFAULT_SUB_AGENT_TOOLS] };\n\t}\n\n\tconst tools: SubAgentToolName[] = [];\n\tconst seen = new Set<string>();\n\tfor (const value of values) {\n\t\tconst normalized = value.trim();\n\t\tif (!normalized || seen.has(normalized)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!ALLOWED_SUB_AGENT_TOOLS.includes(normalized as SubAgentToolName)) {\n\t\t\treturn {\n\t\t\t\ttools: [],\n\t\t\t\terror: `Unknown tool \"${normalized}\". Allowed tools: ${ALLOWED_SUB_AGENT_TOOLS.join(\", \")}`,\n\t\t\t};\n\t\t}\n\t\tseen.add(normalized);\n\t\ttools.push(normalized as SubAgentToolName);\n\t}\n\n\treturn { tools: tools.length > 0 ? tools : [...DEFAULT_SUB_AGENT_TOOLS] };\n}\n\nfunction parsePositiveInteger(raw: unknown, fallback: number): { value: number; warning?: string } {\n\tif (raw === undefined || raw === null) {\n\t\treturn { value: fallback };\n\t}\n\n\tif (typeof raw === \"number\") {\n\t\tif (!Number.isFinite(raw) || raw <= 0) {\n\t\t\treturn { value: fallback, warning: `Invalid numeric value \"${String(raw)}\", using default ${fallback}` };\n\t\t}\n\t\treturn { value: Math.floor(raw) };\n\t}\n\n\tif (typeof raw !== \"string\") {\n\t\treturn { value: fallback, warning: `Invalid numeric value \"${String(raw)}\", using default ${fallback}` };\n\t}\n\n\tif (!raw.trim()) {\n\t\treturn { value: fallback };\n\t}\n\n\tconst parsed = Number.parseInt(raw.trim(), 10);\n\tif (!Number.isFinite(parsed) || parsed <= 0) {\n\t\treturn { value: fallback, warning: `Invalid numeric value \"${raw}\", using default ${fallback}` };\n\t}\n\n\treturn { value: parsed };\n}\n\nfunction resolvePositiveOverride(value: number | undefined, fallback: number): number {\n\tif (!Number.isFinite(value) || value === undefined || value <= 0) {\n\t\treturn fallback;\n\t}\n\treturn Math.floor(value);\n}\n\nfunction resolveModelReference(\n\tmodelRef: string,\n\tavailableModels: Model<Api>[],\n): { model?: Model<Api>; error?: string } {\n\tconst { match, ambiguous } = findExactModelReferenceMatch(modelRef, availableModels);\n\tif (match) {\n\t\treturn { model: match };\n\t}\n\tif (ambiguous) {\n\t\treturn { error: `Model reference \"${modelRef}\" is ambiguous. Use provider/modelId.` };\n\t}\n\treturn { error: `Model reference \"${modelRef}\" was not found among available models.` };\n}\n\nexport function discoverSubAgents(workspaceDir: string, availableModels: Model<Api>[]): SubAgentDiscoveryResult {\n\tconst directory = getSubAgentsDir(workspaceDir);\n\tif (!existsSync(directory)) {\n\t\treturn { directory, agents: [], warnings: [] };\n\t}\n\n\tconst warnings: string[] = [];\n\tconst agents: SubAgentConfig[] = [];\n\tconst seenNames = new Set<string>();\n\tlet entries: Dirent<string>[];\n\ttry {\n\t\tentries = readdirSync(directory, { withFileTypes: true })\n\t\t\t.filter((entry) => entry.name.endsWith(\".md\") && (entry.isFile() || entry.isSymbolicLink()))\n\t\t\t.sort((a, b) => a.name.localeCompare(b.name));\n\t} catch (error) {\n\t\treturn {\n\t\t\tdirectory,\n\t\t\tagents: [],\n\t\t\twarnings: [`Failed to read sub-agents directory (${error instanceof Error ? error.message : String(error)})`],\n\t\t};\n\t}\n\n\tfor (const entry of entries) {\n\t\tconst filePath = join(directory, entry.name);\n\t\tlet content = \"\";\n\t\ttry {\n\t\t\tcontent = readFileSync(filePath, \"utf-8\");\n\t\t} catch (error) {\n\t\t\twarnings.push(\n\t\t\t\t`${entry.name}: failed to read file (${error instanceof Error ? error.message : String(error)})`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst { frontmatter, body } = parseFrontmatter<Record<string, unknown>>(content);\n\t\tconst name = readOptionalTrimmedString(frontmatter.name);\n\t\tconst description = readOptionalTrimmedString(frontmatter.description);\n\n\t\tif (!name || !description) {\n\t\t\twarnings.push(`${entry.name}: missing required frontmatter fields \"name\" or \"description\"`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (seenNames.has(name)) {\n\t\t\twarnings.push(`${entry.name}: duplicate sub-agent name \"${name}\" ignored`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst toolParse = parseToolNames(frontmatter.tools);\n\t\tif (toolParse.error) {\n\t\t\twarnings.push(`${entry.name}: ${toolParse.error}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst contextMode = parseContextMode(frontmatter.contextMode);\n\t\tif (contextMode.error) {\n\t\t\twarnings.push(`${entry.name}: ${contextMode.error}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst memoryMode = parseMemoryMode(frontmatter.memory, contextMode.value);\n\t\tif (memoryMode.error) {\n\t\t\twarnings.push(`${entry.name}: ${memoryMode.error}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst parsedPaths = parseStringList(frontmatter.paths, \"paths\");\n\t\tif (parsedPaths.error) {\n\t\t\twarnings.push(`${entry.name}: ${parsedPaths.error}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst maxTurns = parsePositiveInteger(frontmatter.maxTurns, DEFAULT_MAX_TURNS);\n\t\tconst maxToolCalls = parsePositiveInteger(frontmatter.maxToolCalls, DEFAULT_MAX_TOOL_CALLS);\n\t\tconst maxWallTimeSec = parsePositiveInteger(frontmatter.maxWallTimeSec, DEFAULT_MAX_WALL_TIME_SEC);\n\t\tconst bashTimeoutSec = parsePositiveInteger(frontmatter.bashTimeoutSec, DEFAULT_BASH_TIMEOUT_SEC);\n\n\t\tfor (const warning of [maxTurns.warning, maxToolCalls.warning, maxWallTimeSec.warning, bashTimeoutSec.warning]) {\n\t\t\tif (warning) {\n\t\t\t\twarnings.push(`${entry.name}: ${warning}`);\n\t\t\t}\n\t\t}\n\n\t\tconst modelRef = readOptionalTrimmedString(frontmatter.model);\n\t\tlet model: Model<Api> | undefined;\n\t\tif (modelRef) {\n\t\t\tconst resolved = resolveModelReference(modelRef, availableModels);\n\t\t\tif (!resolved.model) {\n\t\t\t\twarnings.push(`${entry.name}: ${resolved.error}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmodel = resolved.model;\n\t\t}\n\n\t\tconst trimmedBody = body.trim();\n\t\tif (!trimmedBody) {\n\t\t\twarnings.push(`${entry.name}: empty system prompt body`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst promptLengthError = validateSubAgentSystemPrompt(trimmedBody, \"Sub-agent system prompt\");\n\t\tif (promptLengthError) {\n\t\t\twarnings.push(`${entry.name}: ${promptLengthError}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tseenNames.add(name);\n\t\tagents.push({\n\t\t\tname,\n\t\t\tdescription,\n\t\t\tsystemPrompt: trimmedBody,\n\t\t\ttools: toolParse.tools,\n\t\t\tmodel,\n\t\t\tmodelRef: modelRef || (model ? formatModelReference(model) : undefined),\n\t\t\tmaxTurns: maxTurns.value,\n\t\t\tmaxToolCalls: maxToolCalls.value,\n\t\t\tmaxWallTimeSec: maxWallTimeSec.value,\n\t\t\tbashTimeoutSec: bashTimeoutSec.value,\n\t\t\tcontextMode: contextMode.value,\n\t\t\tmemory: memoryMode.value,\n\t\t\tpaths: parsedPaths.values,\n\t\t\tfilePath,\n\t\t\tsource: \"predefined\",\n\t\t});\n\t}\n\n\treturn { directory, agents, warnings };\n}\n\nexport function resolveSubAgentConfig(\n\tavailableModels: Model<Api>[],\n\tcurrentModel: Model<Api>,\n\tpredefinedAgents: SubAgentConfig[],\n\toverrides: SubAgentInvocationOverrides,\n): { config?: ResolvedSubAgentConfig; error?: string } {\n\tconst baseConfig = overrides.agent ? predefinedAgents.find((agent) => agent.name === overrides.agent) : undefined;\n\tif (overrides.agent && !baseConfig) {\n\t\tconst available = predefinedAgents.length > 0 ? predefinedAgents.map((agent) => agent.name).join(\", \") : \"none\";\n\t\treturn { error: `Unknown sub-agent \"${overrides.agent}\". Available sub-agents: ${available}.` };\n\t}\n\n\tif (!baseConfig && (!overrides.systemPrompt || !overrides.systemPrompt.trim())) {\n\t\treturn { error: 'Provide either \"agent\" or \"systemPrompt\" to define the sub-agent.' };\n\t}\n\n\tconst tools = overrides.tools\n\t\t? validateToolNames(overrides.tools)\n\t\t: { tools: baseConfig?.tools ?? [...DEFAULT_SUB_AGENT_TOOLS] };\n\tif (tools.error) {\n\t\treturn { error: tools.error };\n\t}\n\n\tlet model = baseConfig?.model;\n\tlet modelRef = baseConfig?.modelRef;\n\tif (overrides.model?.trim()) {\n\t\tconst resolved = resolveModelReference(overrides.model.trim(), availableModels);\n\t\tif (!resolved.model) {\n\t\t\treturn { error: resolved.error };\n\t\t}\n\t\tmodel = resolved.model;\n\t\tmodelRef = formatModelReference(resolved.model);\n\t}\n\n\tconst maxTurns = resolvePositiveOverride(overrides.maxTurns, baseConfig?.maxTurns ?? DEFAULT_MAX_TURNS);\n\tconst maxToolCalls = resolvePositiveOverride(\n\t\toverrides.maxToolCalls,\n\t\tbaseConfig?.maxToolCalls ?? DEFAULT_MAX_TOOL_CALLS,\n\t);\n\tconst maxWallTimeSec = resolvePositiveOverride(\n\t\toverrides.maxWallTimeSec,\n\t\tbaseConfig?.maxWallTimeSec ?? DEFAULT_MAX_WALL_TIME_SEC,\n\t);\n\tconst bashTimeoutSec = resolvePositiveOverride(\n\t\toverrides.bashTimeoutSec,\n\t\tbaseConfig?.bashTimeoutSec ?? DEFAULT_BASH_TIMEOUT_SEC,\n\t);\n\tconst contextModeOverride = overrides.contextMode ? parseContextMode(overrides.contextMode) : undefined;\n\tif (contextModeOverride?.error) {\n\t\treturn { error: contextModeOverride.error };\n\t}\n\tconst contextMode = contextModeOverride?.value ?? baseConfig?.contextMode ?? \"isolated\";\n\n\tconst memoryOverride = overrides.memory ? parseMemoryMode(overrides.memory, contextMode) : undefined;\n\tif (memoryOverride?.error) {\n\t\treturn { error: memoryOverride.error };\n\t}\n\tconst memory = memoryOverride?.value ?? baseConfig?.memory ?? (contextMode === \"contextual\" ? \"relevant\" : \"none\");\n\n\tconst pathsOverride = overrides.paths ? parseStringList(overrides.paths, \"paths\") : undefined;\n\tif (pathsOverride?.error) {\n\t\treturn { error: pathsOverride.error };\n\t}\n\tconst paths = pathsOverride?.values ?? baseConfig?.paths ?? [];\n\n\tconst systemPrompt = overrides.systemPrompt?.trim() || baseConfig?.systemPrompt || \"\";\n\tif (!systemPrompt) {\n\t\treturn { error: \"Sub-agent system prompt cannot be empty.\" };\n\t}\n\tif (overrides.systemPrompt?.trim()) {\n\t\tconst promptLengthError = validateSubAgentSystemPrompt(\n\t\t\toverrides.systemPrompt.trim(),\n\t\t\t\"Inline sub-agent systemPrompt\",\n\t\t);\n\t\tif (promptLengthError) {\n\t\t\treturn { error: promptLengthError };\n\t\t}\n\t}\n\n\treturn {\n\t\tconfig: {\n\t\t\tname: overrides.name?.trim() || baseConfig?.name || \"dynamic-subagent\",\n\t\t\tdescription: baseConfig?.description || \"Inline sub-agent\",\n\t\t\tsystemPrompt,\n\t\t\ttools: tools.tools,\n\t\t\tmodel: model ?? currentModel,\n\t\t\tmodelRef: modelRef ?? formatModelReference(model ?? currentModel),\n\t\t\tmaxTurns,\n\t\t\tmaxToolCalls,\n\t\t\tmaxWallTimeSec,\n\t\t\tbashTimeoutSec,\n\t\t\tcontextMode,\n\t\t\tmemory,\n\t\t\tpaths,\n\t\t\tfilePath: baseConfig?.filePath,\n\t\t\tsource: baseConfig ? \"predefined\" : \"inline\",\n\t\t},\n\t};\n}\n\nexport function formatSubAgentList(agents: SubAgentConfig[], maxItems: number = 12): string {\n\tif (agents.length === 0) {\n\t\treturn \"none\";\n\t}\n\n\tconst listed = agents.slice(0, maxItems).map((agent) => `- \\`${agent.name}\\`: ${agent.description}`);\n\tif (agents.length <= maxItems) {\n\t\treturn listed.join(\"\\n\");\n\t}\n\n\treturn `${listed.join(\"\\n\")}\\n- ... and ${agents.length - maxItems} more`;\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { AgentTool } from "@mariozechner/pi-agent-core";
2
2
  import type { Api, Model } from "@mariozechner/pi-ai";
3
+ import type { PipiclawMemoryRecallSettings } from "../context.js";
3
4
  import type { Executor, SandboxConfig } from "../sandbox.js";
4
5
  import type { SubAgentDiscoveryResult } from "../sub-agents.js";
5
6
  export interface CreatePipiclawToolsOptions {
@@ -8,10 +9,12 @@ export interface CreatePipiclawToolsOptions {
8
9
  getAvailableModels: () => Model<Api>[];
9
10
  resolveApiKey: (model: Model<Api>) => Promise<string>;
10
11
  workspaceDir: string;
12
+ channelDir: string;
11
13
  workspacePath: string;
12
14
  channelId: string;
13
15
  sandboxConfig: SandboxConfig;
14
16
  getSubAgentDiscovery: () => SubAgentDiscoveryResult;
17
+ getMemoryRecallSettings: () => PipiclawMemoryRecallSettings;
15
18
  }
16
19
  export declare function createPipiclawBaseTools(executor: Executor): AgentTool<any>[];
17
20
  export declare function createPipiclawTools(options: CreatePipiclawToolsOptions): AgentTool<any>[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAOhE,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,kBAAkB,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,aAAa,CAAC;IAC7B,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;CACpD;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAE5E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAkBzF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAOhE,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,kBAAkB,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,aAAa,CAAC;IAC7B,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;IACpD,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;CAC5D;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAE5E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAoBzF"}
@@ -16,7 +16,9 @@ export function createPipiclawTools(options) {
16
16
  getAvailableModels: options.getAvailableModels,
17
17
  resolveApiKey: options.resolveApiKey,
18
18
  workspaceDir: options.workspaceDir,
19
+ channelDir: options.channelDir,
19
20
  getSubAgentDiscovery: options.getSubAgentDiscovery,
21
+ getMemoryRecallSettings: options.getMemoryRecallSettings,
20
22
  runtimeContext: {
21
23
  workspacePath: options.workspacePath,
22
24
  channelId: options.channelId,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAc7C,MAAM,UAAU,uBAAuB,CAAC,QAAkB;IACzD,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAmC;IACtE,MAAM,SAAS,GAAG,uBAAuB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5D,OAAO;QACN,GAAG,SAAS;QACZ,kBAAkB,CAAC;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;YAClD,cAAc,EAAE;gBACf,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE;aACrG;SACD,CAAC;KACF,CAAC;AACH,CAAC","sourcesContent":["import type { AgentTool } from \"@mariozechner/pi-agent-core\";\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\nimport type { Executor, SandboxConfig } from \"../sandbox.js\";\nimport type { SubAgentDiscoveryResult } from \"../sub-agents.js\";\nimport { createBashTool } from \"./bash.js\";\nimport { createEditTool } from \"./edit.js\";\nimport { createReadTool } from \"./read.js\";\nimport { createSubAgentTool } from \"./subagent.js\";\nimport { createWriteTool } from \"./write.js\";\n\nexport interface CreatePipiclawToolsOptions {\n\texecutor: Executor;\n\tgetCurrentModel: () => Model<Api>;\n\tgetAvailableModels: () => Model<Api>[];\n\tresolveApiKey: (model: Model<Api>) => Promise<string>;\n\tworkspaceDir: string;\n\tworkspacePath: string;\n\tchannelId: string;\n\tsandboxConfig: SandboxConfig;\n\tgetSubAgentDiscovery: () => SubAgentDiscoveryResult;\n}\n\nexport function createPipiclawBaseTools(executor: Executor): AgentTool<any>[] {\n\treturn [createReadTool(executor), createBashTool(executor), createEditTool(executor), createWriteTool(executor)];\n}\n\nexport function createPipiclawTools(options: CreatePipiclawToolsOptions): AgentTool<any>[] {\n\tconst baseTools = createPipiclawBaseTools(options.executor);\n\treturn [\n\t\t...baseTools,\n\t\tcreateSubAgentTool({\n\t\t\texecutor: options.executor,\n\t\t\tgetCurrentModel: options.getCurrentModel,\n\t\t\tgetAvailableModels: options.getAvailableModels,\n\t\t\tresolveApiKey: options.resolveApiKey,\n\t\t\tworkspaceDir: options.workspaceDir,\n\t\t\tgetSubAgentDiscovery: options.getSubAgentDiscovery,\n\t\t\truntimeContext: {\n\t\t\t\tworkspacePath: options.workspacePath,\n\t\t\t\tchannelId: options.channelId,\n\t\t\t\tsandbox: options.sandboxConfig.type === \"host\" ? \"host\" : `docker:${options.sandboxConfig.container}`,\n\t\t\t},\n\t\t}),\n\t];\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAgB7C,MAAM,UAAU,uBAAuB,CAAC,QAAkB;IACzD,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAmC;IACtE,MAAM,SAAS,GAAG,uBAAuB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5D,OAAO;QACN,GAAG,SAAS;QACZ,kBAAkB,CAAC;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;YAClD,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;YACxD,cAAc,EAAE;gBACf,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE;aACrG;SACD,CAAC;KACF,CAAC;AACH,CAAC","sourcesContent":["import type { AgentTool } from \"@mariozechner/pi-agent-core\";\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\nimport type { PipiclawMemoryRecallSettings } from \"../context.js\";\nimport type { Executor, SandboxConfig } from \"../sandbox.js\";\nimport type { SubAgentDiscoveryResult } from \"../sub-agents.js\";\nimport { createBashTool } from \"./bash.js\";\nimport { createEditTool } from \"./edit.js\";\nimport { createReadTool } from \"./read.js\";\nimport { createSubAgentTool } from \"./subagent.js\";\nimport { createWriteTool } from \"./write.js\";\n\nexport interface CreatePipiclawToolsOptions {\n\texecutor: Executor;\n\tgetCurrentModel: () => Model<Api>;\n\tgetAvailableModels: () => Model<Api>[];\n\tresolveApiKey: (model: Model<Api>) => Promise<string>;\n\tworkspaceDir: string;\n\tchannelDir: string;\n\tworkspacePath: string;\n\tchannelId: string;\n\tsandboxConfig: SandboxConfig;\n\tgetSubAgentDiscovery: () => SubAgentDiscoveryResult;\n\tgetMemoryRecallSettings: () => PipiclawMemoryRecallSettings;\n}\n\nexport function createPipiclawBaseTools(executor: Executor): AgentTool<any>[] {\n\treturn [createReadTool(executor), createBashTool(executor), createEditTool(executor), createWriteTool(executor)];\n}\n\nexport function createPipiclawTools(options: CreatePipiclawToolsOptions): AgentTool<any>[] {\n\tconst baseTools = createPipiclawBaseTools(options.executor);\n\treturn [\n\t\t...baseTools,\n\t\tcreateSubAgentTool({\n\t\t\texecutor: options.executor,\n\t\t\tgetCurrentModel: options.getCurrentModel,\n\t\t\tgetAvailableModels: options.getAvailableModels,\n\t\t\tresolveApiKey: options.resolveApiKey,\n\t\t\tworkspaceDir: options.workspaceDir,\n\t\t\tchannelDir: options.channelDir,\n\t\t\tgetSubAgentDiscovery: options.getSubAgentDiscovery,\n\t\t\tgetMemoryRecallSettings: options.getMemoryRecallSettings,\n\t\t\truntimeContext: {\n\t\t\t\tworkspacePath: options.workspacePath,\n\t\t\t\tchannelId: options.channelId,\n\t\t\t\tsandbox: options.sandboxConfig.type === \"host\" ? \"host\" : `docker:${options.sandboxConfig.container}`,\n\t\t\t},\n\t\t}),\n\t];\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { type AgentEvent, type AgentMessage, type AgentTool } from "@mariozechner/pi-agent-core";
2
2
  import type { Api, Model } from "@mariozechner/pi-ai";
3
+ import type { PipiclawMemoryRecallSettings } from "../context.js";
3
4
  import type { Executor } from "../sandbox.js";
4
5
  import { type ResolvedSubAgentConfig, type SubAgentDiscoveryResult } from "../sub-agents.js";
5
6
  declare const subagentSchema: import("@sinclair/typebox").TObject<{
@@ -14,6 +15,9 @@ declare const subagentSchema: import("@sinclair/typebox").TObject<{
14
15
  maxToolCalls: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
15
16
  maxWallTimeSec: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
16
17
  bashTimeoutSec: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
18
+ contextMode: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
19
+ memory: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
20
+ paths: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
17
21
  }>;
18
22
  interface UsageTotals {
19
23
  input: number;
@@ -48,7 +52,9 @@ export interface SubAgentToolOptions {
48
52
  getAvailableModels: () => Model<Api>[];
49
53
  resolveApiKey: (model: Model<Api>) => Promise<string>;
50
54
  workspaceDir: string;
55
+ channelDir: string;
51
56
  getSubAgentDiscovery?: () => SubAgentDiscoveryResult;
57
+ getMemoryRecallSettings?: () => PipiclawMemoryRecallSettings;
52
58
  runtimeContext: {
53
59
  workspacePath: string;
54
60
  channelId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxG,OAAO,KAAK,EAAE,GAAG,EAAoB,KAAK,EAAe,MAAM,qBAAqB,CAAC;AAIrF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAEN,KAAK,sBAAsB,EAG3B,KAAK,uBAAuB,EAE5B,MAAM,kBAAkB,CAAC;AAM1B,QAAA,MAAM,cAAc;;;;;;;;;;;;EAsBlB,CAAC;AAEH,UAAU,WAAW;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACd,CAAC;CACF;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,GAAG,QAAQ,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,kBAAkB,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,uBAAuB,CAAC;IACrD,cAAc,EAAE;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE,sBAAsB,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;KACxB,KAAK,cAAc,CAAC;CACrB;AAED,UAAU,cAAc;IACvB,KAAK,EAAE;QAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;IACpC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC7D,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAyID,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,mBAAmB,GAC1B,SAAS,CAAC,OAAO,cAAc,EAAE,mBAAmB,CAAC,CAwLvD"}
1
+ {"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxG,OAAO,KAAK,EAAE,GAAG,EAAoB,KAAK,EAAe,MAAM,qBAAqB,CAAC;AAGrF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAMlE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAEN,KAAK,sBAAsB,EAG3B,KAAK,uBAAuB,EAE5B,MAAM,kBAAkB,CAAC;AAM1B,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;EAqClB,CAAC;AAEH,UAAU,WAAW;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACd,CAAC;CACF;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,GAAG,QAAQ,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,kBAAkB,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,uBAAuB,CAAC;IACrD,uBAAuB,CAAC,EAAE,MAAM,4BAA4B,CAAC;IAC7D,cAAc,EAAE;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE,sBAAsB,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;KACxB,KAAK,cAAc,CAAC;CACrB;AAED,UAAU,cAAc;IACvB,KAAK,EAAE;QAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;IACpC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC7D,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAwQD,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,mBAAmB,GAC1B,SAAS,CAAC,OAAO,cAAc,EAAE,mBAAmB,CAAC,CAyLvD"}
@@ -1,6 +1,10 @@
1
1
  import { Agent } from "@mariozechner/pi-agent-core";
2
2
  import { convertToLlm } from "@mariozechner/pi-coding-agent";
3
3
  import { Type } from "@sinclair/typebox";
4
+ import { splitLevelOneSections } from "../markdown-sections.js";
5
+ import { createMemoryCandidateCache } from "../memory-candidates.js";
6
+ import { readChannelSession } from "../memory-files.js";
7
+ import { recallRelevantMemory } from "../memory-recall.js";
4
8
  import { formatModelReference } from "../model-utils.js";
5
9
  import { formatSubAgentList, resolveSubAgentConfig, validateSubAgentTask, } from "../sub-agents.js";
6
10
  import { createBashTool } from "./bash.js";
@@ -21,7 +25,28 @@ const subagentSchema = Type.Object({
21
25
  maxToolCalls: Type.Optional(Type.Number({ description: "Optional maximum tool calls for this sub-agent" })),
22
26
  maxWallTimeSec: Type.Optional(Type.Number({ description: "Optional wall time budget in seconds for this sub-agent" })),
23
27
  bashTimeoutSec: Type.Optional(Type.Number({ description: "Optional default timeout in seconds for bash commands inside this sub-agent" })),
28
+ contextMode: Type.Optional(Type.String({
29
+ description: 'Optional context mode. Use "contextual" to inject selected session and memory context.',
30
+ })),
31
+ memory: Type.Optional(Type.String({
32
+ description: 'Optional memory mode for contextual sub-agents: "none", "session", or "relevant".',
33
+ })),
34
+ paths: Type.Optional(Type.Array(Type.String(), {
35
+ description: "Optional preferred file or directory paths for the sub-agent to focus on.",
36
+ })),
24
37
  });
38
+ const DEFAULT_SUBAGENT_MEMORY_RECALL_SETTINGS = {
39
+ enabled: true,
40
+ maxCandidates: 8,
41
+ maxInjected: 3,
42
+ maxChars: 3500,
43
+ rerankWithModel: false,
44
+ };
45
+ const SESSION_SECTION_ORDER = ["Current State", "User Intent", "Active Files", "Errors & Corrections", "Next Steps"];
46
+ const MAX_SESSION_SECTION_CHARS = 280;
47
+ const MAX_SESSION_CONTEXT_CHARS = 1800;
48
+ const MAX_RECALL_CONTEXT_CHARS = 2200;
49
+ const HAN_REGEX = /\p{Script=Han}/u;
25
50
  function createEmptyUsageTotals() {
26
51
  return {
27
52
  input: 0,
@@ -83,18 +108,107 @@ function createToolSet(executor, bashTimeoutSec) {
83
108
  createWriteTool(executor),
84
109
  ];
85
110
  }
86
- function buildSubAgentTask(task, config, runtimeContext) {
111
+ function buildSubAgentTask(task, config, runtimeContext, contextBlocks) {
87
112
  const taskText = task.trim();
88
- return `Runtime context:
89
- - Workspace root: ${runtimeContext.workspacePath}
90
- - Channel id: ${runtimeContext.channelId}
91
- - Channel directory: ${runtimeContext.workspacePath}/${runtimeContext.channelId}
92
- - Sandbox: ${runtimeContext.sandbox}
93
- - Filesystem isolation: none (files written here are visible to the parent agent)
94
- - Your configured role: ${config.name}
95
-
96
- Task:
97
- ${taskText}`;
113
+ const lines = [
114
+ `Runtime context:`,
115
+ `- Workspace root: ${runtimeContext.workspacePath}`,
116
+ `- Channel id: ${runtimeContext.channelId}`,
117
+ `- Channel directory: ${runtimeContext.workspacePath}/${runtimeContext.channelId}`,
118
+ `- Sandbox: ${runtimeContext.sandbox}`,
119
+ `- Filesystem isolation: none (files written here are visible to the parent agent)`,
120
+ `- Your configured role: ${config.name}`,
121
+ ];
122
+ for (const block of contextBlocks) {
123
+ if (!block.trim()) {
124
+ continue;
125
+ }
126
+ lines.push("", block.trim());
127
+ }
128
+ lines.push("", `Task:`, taskText);
129
+ return lines.join("\n");
130
+ }
131
+ function clipText(text, maxChars) {
132
+ const normalized = text.replace(/\s+\n/g, "\n").trim();
133
+ if (normalized.length <= maxChars) {
134
+ return normalized;
135
+ }
136
+ return `${normalized.slice(0, Math.max(0, maxChars - 3)).trimEnd()}...`;
137
+ }
138
+ function buildSessionContextBlock(sessionMarkdown) {
139
+ const sections = splitLevelOneSections(sessionMarkdown);
140
+ if (sections.length === 0) {
141
+ return "";
142
+ }
143
+ const selectedSections = SESSION_SECTION_ORDER.flatMap((heading) => sections.filter((section) => section.heading.toLowerCase() === heading.toLowerCase()));
144
+ if (selectedSections.length === 0) {
145
+ return "";
146
+ }
147
+ const lines = ["Relevant session state:"];
148
+ let usedChars = lines[0].length;
149
+ for (const section of selectedSections) {
150
+ const clipped = clipText(section.content, MAX_SESSION_SECTION_CHARS);
151
+ const block = `- ${section.heading}: ${clipped}`;
152
+ if (usedChars + block.length > MAX_SESSION_CONTEXT_CHARS) {
153
+ break;
154
+ }
155
+ lines.push(block);
156
+ usedChars += block.length + 1;
157
+ }
158
+ return lines.length > 1 ? lines.join("\n") : "";
159
+ }
160
+ function stripRuntimeContextWrapper(renderedText) {
161
+ return renderedText
162
+ .replace(/^<runtime_context>\s*/i, "")
163
+ .replace(/\s*<\/runtime_context>$/i, "")
164
+ .trim();
165
+ }
166
+ async function buildContextualBlocks(task, config, options, currentModel, candidateCache = createMemoryCandidateCache()) {
167
+ if (config.contextMode !== "contextual") {
168
+ return [];
169
+ }
170
+ const blocks = [];
171
+ if (config.paths.length > 0) {
172
+ blocks.push(`Preferred focus paths:\n${config.paths.map((path) => `- ${path}`).join("\n")}`);
173
+ }
174
+ if (config.memory === "none") {
175
+ return blocks;
176
+ }
177
+ const sessionMarkdown = await readChannelSession(options.channelDir);
178
+ const sessionBlock = buildSessionContextBlock(sessionMarkdown);
179
+ if (sessionBlock) {
180
+ blocks.push(sessionBlock);
181
+ }
182
+ if (config.memory !== "relevant") {
183
+ return blocks;
184
+ }
185
+ const recallSettings = {
186
+ ...DEFAULT_SUBAGENT_MEMORY_RECALL_SETTINGS,
187
+ ...options.getMemoryRecallSettings?.(),
188
+ };
189
+ if (!recallSettings.enabled) {
190
+ return blocks;
191
+ }
192
+ const recallQuery = [task.trim(), config.description.trim(), ...config.paths].filter(Boolean).join("\n");
193
+ const recalled = await recallRelevantMemory({
194
+ query: recallQuery,
195
+ workspaceDir: options.workspaceDir,
196
+ channelDir: options.channelDir,
197
+ maxCandidates: recallSettings.maxCandidates,
198
+ maxInjected: recallSettings.maxInjected,
199
+ maxChars: Math.min(recallSettings.maxChars, MAX_RECALL_CONTEXT_CHARS),
200
+ rerankWithModel: recallSettings.rerankWithModel,
201
+ autoRerank: HAN_REGEX.test(recallQuery),
202
+ model: currentModel,
203
+ resolveApiKey: options.resolveApiKey,
204
+ allowedSources: ["workspace-memory", "channel-memory", "channel-history"],
205
+ candidateCache,
206
+ });
207
+ const recalledText = stripRuntimeContextWrapper(recalled.renderedText);
208
+ if (recalledText) {
209
+ blocks.push(recalledText);
210
+ }
211
+ return blocks;
98
212
  }
99
213
  function filterToolsByName(allTools, names) {
100
214
  const allowed = new Set(names);
@@ -234,7 +348,8 @@ export function createSubAgentTool(options) {
234
348
  const abortWorker = () => worker.abort();
235
349
  childController.signal.addEventListener("abort", abortWorker, { once: true });
236
350
  try {
237
- await worker.prompt(buildSubAgentTask(params.task, config, options.runtimeContext));
351
+ const contextualBlocks = await buildContextualBlocks(params.task, config, options, currentModel);
352
+ await worker.prompt(buildSubAgentTask(params.task, config, options.runtimeContext, contextualBlocks));
238
353
  await worker.waitForIdle();
239
354
  }
240
355
  finally {