@oyasmi/pipiclaw 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/channel-runner.d.ts +46 -0
- package/dist/agent/channel-runner.d.ts.map +1 -0
- package/dist/agent/channel-runner.js +434 -0
- package/dist/agent/channel-runner.js.map +1 -0
- package/dist/agent/index.d.ts +4 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +3 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/progress-formatter.d.ts +5 -0
- package/dist/agent/progress-formatter.d.ts.map +1 -0
- package/dist/agent/progress-formatter.js +53 -0
- package/dist/agent/progress-formatter.js.map +1 -0
- package/dist/agent/run-queue.d.ts +8 -0
- package/dist/agent/run-queue.d.ts.map +1 -0
- package/dist/agent/run-queue.js +27 -0
- package/dist/agent/run-queue.js.map +1 -0
- package/dist/agent/runner-factory.d.ts +4 -0
- package/dist/agent/runner-factory.d.ts.map +1 -0
- package/dist/agent/runner-factory.js +11 -0
- package/dist/agent/runner-factory.js.map +1 -0
- package/dist/agent/session-events.d.ts +15 -0
- package/dist/agent/session-events.d.ts.map +1 -0
- package/dist/agent/session-events.js +216 -0
- package/dist/agent/session-events.js.map +1 -0
- package/dist/agent/type-guards.d.ts +23 -0
- package/dist/agent/type-guards.d.ts.map +1 -0
- package/dist/agent/type-guards.js +107 -0
- package/dist/agent/type-guards.js.map +1 -0
- package/dist/agent/types.d.ts +161 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +23 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent.d.ts +2 -15
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +1 -781
- package/dist/agent.js.map +1 -1
- package/dist/context.d.ts +58 -14
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +50 -7
- package/dist/context.js.map +1 -1
- package/dist/index.d.ts +12 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/main.js +5 -404
- package/dist/main.js.map +1 -1
- package/dist/memory/bootstrap.d.ts +7 -0
- package/dist/memory/bootstrap.d.ts.map +1 -0
- package/dist/memory/bootstrap.js +47 -0
- package/dist/memory/bootstrap.js.map +1 -0
- package/dist/{memory-candidates.d.ts → memory/candidates.d.ts} +2 -1
- package/dist/memory/candidates.d.ts.map +1 -0
- package/dist/{memory-candidates.js → memory/candidates.js} +34 -21
- package/dist/memory/candidates.js.map +1 -0
- package/dist/memory/chinese-words.d.ts +2 -0
- package/dist/memory/chinese-words.d.ts.map +1 -0
- package/dist/memory/chinese-words.js +210 -0
- package/dist/memory/chinese-words.js.map +1 -0
- package/dist/{memory-consolidation.d.ts → memory/consolidation.d.ts} +1 -1
- package/dist/memory/consolidation.d.ts.map +1 -0
- package/dist/{memory-consolidation.js → memory/consolidation.js} +27 -35
- package/dist/memory/consolidation.js.map +1 -0
- package/dist/{memory-files.d.ts → memory/files.d.ts} +1 -6
- package/dist/memory/files.d.ts.map +1 -0
- package/dist/{memory-files.js → memory/files.js} +12 -36
- package/dist/memory/files.js.map +1 -0
- package/dist/{memory-lifecycle.d.ts → memory/lifecycle.d.ts} +24 -6
- package/dist/memory/lifecycle.d.ts.map +1 -0
- package/dist/memory/lifecycle.js +247 -0
- package/dist/memory/lifecycle.js.map +1 -0
- package/dist/{memory-recall.d.ts → memory/recall.d.ts} +2 -2
- package/dist/memory/recall.d.ts.map +1 -0
- package/dist/memory/recall.js +435 -0
- package/dist/memory/recall.js.map +1 -0
- package/dist/{session-memory.d.ts → memory/session.d.ts} +2 -1
- package/dist/memory/session.d.ts.map +1 -0
- package/dist/{session-memory.js → memory/session.js} +32 -62
- package/dist/memory/session.js.map +1 -0
- package/dist/runtime/bootstrap.d.ts +48 -0
- package/dist/runtime/bootstrap.d.ts.map +1 -0
- package/dist/runtime/bootstrap.js +451 -0
- package/dist/runtime/bootstrap.js.map +1 -0
- package/dist/runtime/delivery.d.ts.map +1 -0
- package/dist/{delivery.js → runtime/delivery.js} +1 -1
- package/dist/runtime/delivery.js.map +1 -0
- package/dist/{dingtalk.d.ts → runtime/dingtalk.d.ts} +10 -0
- package/dist/runtime/dingtalk.d.ts.map +1 -0
- package/dist/{dingtalk.js → runtime/dingtalk.js} +87 -27
- package/dist/runtime/dingtalk.js.map +1 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/{events.js → runtime/events.js} +1 -1
- package/dist/runtime/events.js.map +1 -0
- package/dist/{store.d.ts → runtime/store.d.ts} +5 -0
- package/dist/runtime/store.d.ts.map +1 -0
- package/dist/{store.js → runtime/store.js} +60 -19
- package/dist/runtime/store.js.map +1 -0
- package/dist/shared/markdown-sections.d.ts +7 -0
- package/dist/shared/markdown-sections.d.ts.map +1 -0
- package/dist/{markdown-sections.js → shared/markdown-sections.js} +10 -3
- package/dist/shared/markdown-sections.js.map +1 -0
- package/dist/shared/text-utils.d.ts +10 -0
- package/dist/shared/text-utils.d.ts.map +1 -0
- package/dist/shared/text-utils.js +37 -0
- package/dist/shared/text-utils.js.map +1 -0
- package/dist/shared/type-guards.d.ts +6 -0
- package/dist/shared/type-guards.d.ts.map +1 -0
- package/dist/shared/type-guards.js +13 -0
- package/dist/shared/type-guards.js.map +1 -0
- package/dist/shared/types.d.ts +15 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +2 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/sidecar-worker.d.ts.map +1 -1
- package/dist/sidecar-worker.js +1 -7
- package/dist/sidecar-worker.js.map +1 -1
- package/dist/{sub-agents.d.ts → subagents/discovery.d.ts} +1 -1
- package/dist/subagents/discovery.d.ts.map +1 -0
- package/dist/{sub-agents.js → subagents/discovery.js} +3 -3
- package/dist/subagents/discovery.js.map +1 -0
- package/dist/{tools/subagent.d.ts → subagents/tool.d.ts} +3 -16
- package/dist/{tools/subagent.d.ts.map → subagents/tool.d.ts.map} +1 -1
- package/dist/{tools/subagent.js → subagents/tool.js} +17 -38
- package/dist/subagents/tool.js.map +1 -0
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/docs/memory-audit.md +330 -0
- package/docs/memory-optimization-round2.md +319 -0
- package/package.json +1 -1
- package/dist/delivery.d.ts.map +0 -1
- package/dist/delivery.js.map +0 -1
- package/dist/dingtalk.d.ts.map +0 -1
- package/dist/dingtalk.js.map +0 -1
- package/dist/events.d.ts.map +0 -1
- package/dist/events.js.map +0 -1
- package/dist/markdown-sections.d.ts +0 -6
- package/dist/markdown-sections.d.ts.map +0 -1
- package/dist/markdown-sections.js.map +0 -1
- package/dist/memory-candidates.d.ts.map +0 -1
- package/dist/memory-candidates.js.map +0 -1
- package/dist/memory-consolidation.d.ts.map +0 -1
- package/dist/memory-consolidation.js.map +0 -1
- package/dist/memory-files.d.ts.map +0 -1
- package/dist/memory-files.js.map +0 -1
- package/dist/memory-lifecycle.d.ts.map +0 -1
- package/dist/memory-lifecycle.js +0 -150
- package/dist/memory-lifecycle.js.map +0 -1
- package/dist/memory-recall.d.ts.map +0 -1
- package/dist/memory-recall.js +0 -218
- package/dist/memory-recall.js.map +0 -1
- package/dist/session-memory-files.d.ts +0 -2
- package/dist/session-memory-files.d.ts.map +0 -1
- package/dist/session-memory-files.js +0 -2
- package/dist/session-memory-files.js.map +0 -1
- package/dist/session-memory.d.ts.map +0 -1
- package/dist/session-memory.js.map +0 -1
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js.map +0 -1
- package/dist/sub-agents.d.ts.map +0 -1
- package/dist/sub-agents.js.map +0 -1
- package/dist/tools/subagent.js.map +0 -1
- package/docs/proj-review.md +0 -188
- package/docs/test-supplementation-plan.md +0 -553
- /package/dist/{delivery.d.ts → runtime/delivery.d.ts} +0 -0
- /package/dist/{events.d.ts → runtime/events.d.ts} +0 -0
- /package/docs/{memory-rfc.md → specs/001-implement-memory/memory-rfc.md} +0 -0
- /package/docs/{subagent → specs/002-subagent}/pi-subagent-analyse.txt +0 -0
- /package/docs/{subagent → specs/002-subagent}/pi-subagent-design.txt +0 -0
- /package/docs/{subagent → specs/002-subagent}/pi-subagent-phase1-plan.txt +0 -0
- /package/docs/{improve-memory → specs/003-improve-memory}/design.md +0 -0
- /package/docs/{improve-memory → specs/003-improve-memory}/interfaces-and-tests.md +0 -0
- /package/docs/{improve-memory → specs/003-improve-memory}/spec.md +0 -0
package/dist/memory-recall.js
DELETED
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import { parseJsonObject } from "./llm-json.js";
|
|
2
|
-
import { buildMemoryCandidates } from "./memory-candidates.js";
|
|
3
|
-
import { runSidecarTask } from "./sidecar-worker.js";
|
|
4
|
-
const RERANK_SYSTEM_PROMPT = `You are selecting which memory snippets are most relevant to the current user turn.
|
|
5
|
-
|
|
6
|
-
Return strict JSON only:
|
|
7
|
-
{
|
|
8
|
-
"selectedIds": ["candidate-id"]
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
Rules:
|
|
12
|
-
- Select only snippets that are clearly useful for answering the current turn.
|
|
13
|
-
- Prefer current work state, constraints, active files, recent corrections, and durable decisions.
|
|
14
|
-
- If nothing is clearly useful, return an empty array.
|
|
15
|
-
- Do not rewrite the candidates. Only return candidate ids.`;
|
|
16
|
-
const HAN_REGEX = /\p{Script=Han}/u;
|
|
17
|
-
const TOKEN_PART_REGEX = /[\p{Script=Han}]+|[\p{L}\p{N}_./-]+/gu;
|
|
18
|
-
const MEMORY_RECALL_RERANK_TIMEOUT_MS = 5_000;
|
|
19
|
-
function containsHanText(text) {
|
|
20
|
-
return HAN_REGEX.test(text);
|
|
21
|
-
}
|
|
22
|
-
function tokenizeHanPart(part) {
|
|
23
|
-
const chars = Array.from(part);
|
|
24
|
-
const tokens = [];
|
|
25
|
-
for (const size of [2, 3]) {
|
|
26
|
-
if (chars.length < size) {
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
for (let index = 0; index <= chars.length - size; index++) {
|
|
30
|
-
tokens.push(chars.slice(index, index + size).join(""));
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return tokens;
|
|
34
|
-
}
|
|
35
|
-
function tokenize(text) {
|
|
36
|
-
const parts = text.toLowerCase().match(TOKEN_PART_REGEX) ?? [];
|
|
37
|
-
const tokens = [];
|
|
38
|
-
for (const part of parts) {
|
|
39
|
-
if (containsHanText(part)) {
|
|
40
|
-
tokens.push(...tokenizeHanPart(part));
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
if (part.length >= 2) {
|
|
44
|
-
tokens.push(part);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return Array.from(new Set(tokens));
|
|
48
|
-
}
|
|
49
|
-
function computeTokenOverlapScore(queryTokens, text, weight) {
|
|
50
|
-
const haystack = new Set(tokenize(text));
|
|
51
|
-
let score = 0;
|
|
52
|
-
for (const token of queryTokens) {
|
|
53
|
-
if (haystack.has(token)) {
|
|
54
|
-
score += weight;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return score;
|
|
58
|
-
}
|
|
59
|
-
function computeRecencyBoost(timestamp) {
|
|
60
|
-
if (!timestamp)
|
|
61
|
-
return 0;
|
|
62
|
-
const timestampMs = Date.parse(timestamp);
|
|
63
|
-
if (!Number.isFinite(timestampMs))
|
|
64
|
-
return 0;
|
|
65
|
-
const ageMs = Date.now() - timestampMs;
|
|
66
|
-
const dayMs = 24 * 60 * 60 * 1000;
|
|
67
|
-
if (ageMs <= dayMs)
|
|
68
|
-
return 8;
|
|
69
|
-
if (ageMs <= 7 * dayMs)
|
|
70
|
-
return 5;
|
|
71
|
-
if (ageMs <= 30 * dayMs)
|
|
72
|
-
return 2;
|
|
73
|
-
return 0;
|
|
74
|
-
}
|
|
75
|
-
function scoreCandidate(queryTokens, candidate) {
|
|
76
|
-
let score = candidate.priority;
|
|
77
|
-
score += computeTokenOverlapScore(queryTokens, candidate.title, 10);
|
|
78
|
-
score += computeTokenOverlapScore(queryTokens, candidate.content, 3);
|
|
79
|
-
score += computeTokenOverlapScore(queryTokens, candidate.path, 6);
|
|
80
|
-
score += computeRecencyBoost(candidate.timestamp);
|
|
81
|
-
return score;
|
|
82
|
-
}
|
|
83
|
-
function buildFallbackCandidates(request, candidates, existing) {
|
|
84
|
-
if (!containsHanText(request.query) && existing.length > 0) {
|
|
85
|
-
return existing;
|
|
86
|
-
}
|
|
87
|
-
const seen = new Set(existing.map(({ candidate }) => candidate.id));
|
|
88
|
-
const seeded = [...existing];
|
|
89
|
-
const limit = Math.max(request.maxCandidates, request.maxInjected);
|
|
90
|
-
for (const candidate of candidates
|
|
91
|
-
.filter((item) => item.source === "channel-session" || item.source === "channel-memory")
|
|
92
|
-
.sort((a, b) => b.priority - a.priority || a.title.localeCompare(b.title))) {
|
|
93
|
-
if (seen.has(candidate.id)) {
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
seeded.push({ candidate, score: candidate.priority });
|
|
97
|
-
seen.add(candidate.id);
|
|
98
|
-
if (seeded.length >= limit) {
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return seeded;
|
|
103
|
-
}
|
|
104
|
-
async function rerankCandidates(request, candidates) {
|
|
105
|
-
if ((!request.rerankWithModel && !request.autoRerank) || candidates.length <= request.maxInjected) {
|
|
106
|
-
return candidates;
|
|
107
|
-
}
|
|
108
|
-
const renderedCandidates = candidates
|
|
109
|
-
.map(({ candidate, score }) => {
|
|
110
|
-
const clippedContent = candidate.content.length > 300 ? `${candidate.content.slice(0, 300)}...` : candidate.content;
|
|
111
|
-
return [
|
|
112
|
-
`id: ${candidate.id}`,
|
|
113
|
-
`source: ${candidate.source}`,
|
|
114
|
-
`title: ${candidate.title}`,
|
|
115
|
-
`path: ${candidate.path}`,
|
|
116
|
-
`score: ${score}`,
|
|
117
|
-
`content: ${clippedContent}`,
|
|
118
|
-
].join("\n");
|
|
119
|
-
})
|
|
120
|
-
.join("\n\n---\n\n");
|
|
121
|
-
try {
|
|
122
|
-
const result = await runSidecarTask({
|
|
123
|
-
name: "memory-recall-rerank",
|
|
124
|
-
model: request.model,
|
|
125
|
-
resolveApiKey: request.resolveApiKey,
|
|
126
|
-
systemPrompt: RERANK_SYSTEM_PROMPT,
|
|
127
|
-
prompt: `User turn:\n${request.query.trim()}\n\nCandidates:\n${renderedCandidates}`,
|
|
128
|
-
timeoutMs: MEMORY_RECALL_RERANK_TIMEOUT_MS,
|
|
129
|
-
parse: (text) => {
|
|
130
|
-
const parsed = parseJsonObject(text);
|
|
131
|
-
return Array.isArray(parsed.selectedIds)
|
|
132
|
-
? parsed.selectedIds.filter((id) => typeof id === "string" && id.trim().length > 0)
|
|
133
|
-
: [];
|
|
134
|
-
},
|
|
135
|
-
});
|
|
136
|
-
const selectedIds = new Set(result.output);
|
|
137
|
-
if (selectedIds.size === 0) {
|
|
138
|
-
return candidates;
|
|
139
|
-
}
|
|
140
|
-
const selected = candidates.filter(({ candidate }) => selectedIds.has(candidate.id));
|
|
141
|
-
return selected.length > 0 ? selected : candidates;
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
return candidates;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
function renderRecallResult(items, maxChars) {
|
|
148
|
-
if (items.length === 0) {
|
|
149
|
-
return "";
|
|
150
|
-
}
|
|
151
|
-
const lines = ["<runtime_context>", "Relevant context for this turn:"];
|
|
152
|
-
for (const item of items) {
|
|
153
|
-
lines.push("");
|
|
154
|
-
lines.push(`[${item.source}/${item.title}]`);
|
|
155
|
-
lines.push(`Path: ${item.path}`);
|
|
156
|
-
lines.push(item.content);
|
|
157
|
-
}
|
|
158
|
-
lines.push("</runtime_context>");
|
|
159
|
-
const rendered = lines.join("\n");
|
|
160
|
-
if (rendered.length <= maxChars) {
|
|
161
|
-
return rendered;
|
|
162
|
-
}
|
|
163
|
-
const clippedLines = ["<runtime_context>", "Relevant context for this turn:"];
|
|
164
|
-
let usedChars = clippedLines.join("\n").length + "</runtime_context>".length + 2;
|
|
165
|
-
for (const item of items) {
|
|
166
|
-
const block = ["", `[${item.source}/${item.title}]`, `Path: ${item.path}`, item.content].join("\n");
|
|
167
|
-
if (usedChars + block.length > maxChars) {
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
clippedLines.push("", `[${item.source}/${item.title}]`, `Path: ${item.path}`, item.content);
|
|
171
|
-
usedChars += block.length;
|
|
172
|
-
}
|
|
173
|
-
clippedLines.push("</runtime_context>");
|
|
174
|
-
return clippedLines.join("\n");
|
|
175
|
-
}
|
|
176
|
-
export async function recallRelevantMemory(request) {
|
|
177
|
-
const query = request.query.trim();
|
|
178
|
-
if (!query) {
|
|
179
|
-
return { items: [], renderedText: "" };
|
|
180
|
-
}
|
|
181
|
-
const candidates = await buildMemoryCandidates({
|
|
182
|
-
workspaceDir: request.workspaceDir,
|
|
183
|
-
channelDir: request.channelDir,
|
|
184
|
-
cache: request.candidateCache,
|
|
185
|
-
});
|
|
186
|
-
const filteredCandidates = request.allowedSources?.length
|
|
187
|
-
? candidates.filter((candidate) => request.allowedSources?.includes(candidate.source))
|
|
188
|
-
: candidates;
|
|
189
|
-
if (filteredCandidates.length === 0) {
|
|
190
|
-
return { items: [], renderedText: "" };
|
|
191
|
-
}
|
|
192
|
-
const queryTokens = tokenize(query);
|
|
193
|
-
const scored = filteredCandidates
|
|
194
|
-
.map((candidate) => ({ candidate, score: scoreCandidate(queryTokens, candidate) }))
|
|
195
|
-
.filter(({ score }) => score > 0)
|
|
196
|
-
.sort((a, b) => b.score - a.score || a.candidate.title.localeCompare(b.candidate.title));
|
|
197
|
-
const shortlist = buildFallbackCandidates(request, filteredCandidates, scored)
|
|
198
|
-
.sort((a, b) => b.score - a.score ||
|
|
199
|
-
b.candidate.priority - a.candidate.priority ||
|
|
200
|
-
a.candidate.title.localeCompare(b.candidate.title))
|
|
201
|
-
.slice(0, Math.max(request.maxCandidates, request.maxInjected));
|
|
202
|
-
if (shortlist.length === 0) {
|
|
203
|
-
return { items: [], renderedText: "" };
|
|
204
|
-
}
|
|
205
|
-
const reranked = await rerankCandidates(request, shortlist);
|
|
206
|
-
const items = reranked.slice(0, request.maxInjected).map(({ candidate, score }) => ({
|
|
207
|
-
source: candidate.source,
|
|
208
|
-
path: candidate.path,
|
|
209
|
-
title: candidate.title,
|
|
210
|
-
content: candidate.content,
|
|
211
|
-
score,
|
|
212
|
-
}));
|
|
213
|
-
return {
|
|
214
|
-
items,
|
|
215
|
-
renderedText: renderRecallResult(items, request.maxChars),
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
//# sourceMappingURL=memory-recall.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory-recall.js","sourceRoot":"","sources":["../src/memory-recall.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAmD,MAAM,wBAAwB,CAAC;AAChH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA8BrD,MAAM,oBAAoB,GAAG;;;;;;;;;;;4DAW+B,CAAC;AAE7D,MAAM,SAAS,GAAG,iBAAiB,CAAC;AACpC,MAAM,gBAAgB,GAAG,uCAAuC,CAAC;AACjE,MAAM,+BAA+B,GAAG,KAAK,CAAC;AAE9C,SAAS,eAAe,CAAC,IAAY;IACpC,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YACzB,SAAS;QACV,CAAC;QACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;YACtC,SAAS;QACV,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,wBAAwB,CAAC,WAAqB,EAAE,IAAY,EAAE,MAAc;IACpF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,IAAI,MAAM,CAAC;QACjB,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,SAA6B;IACzD,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,CAAC;IACzB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;IACvC,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAClC,IAAI,KAAK,IAAI,KAAK;QAAE,OAAO,CAAC,CAAC;IAC7B,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK;QAAE,OAAO,CAAC,CAAC;IACjC,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK;QAAE,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,CAAC;AACV,CAAC;AAED,SAAS,cAAc,CAAC,WAAqB,EAAE,SAA0B;IACxE,IAAI,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC;IAC/B,KAAK,IAAI,wBAAwB,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpE,KAAK,IAAI,wBAAwB,CAAC,WAAW,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrE,KAAK,IAAI,wBAAwB,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClE,KAAK,IAAI,mBAAmB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,uBAAuB,CAC/B,OAAsB,EACtB,UAA6B,EAC7B,QAA8D;IAE9D,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAEnE,KAAK,MAAM,SAAS,IAAI,UAAU;SAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,iBAAiB,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC;SACvF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAC7E,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5B,SAAS;QACV,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;YAC5B,MAAM;QACP,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC9B,OAAsB,EACtB,UAAgE;IAEhE,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACnG,OAAO,UAAU,CAAC;IACnB,CAAC;IAED,MAAM,kBAAkB,GAAG,UAAU;SACnC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7B,MAAM,cAAc,GACnB,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;QAC9F,OAAO;YACN,OAAO,SAAS,CAAC,EAAE,EAAE;YACrB,WAAW,SAAS,CAAC,MAAM,EAAE;YAC7B,UAAU,SAAS,CAAC,KAAK,EAAE;YAC3B,SAAS,SAAS,CAAC,IAAI,EAAE;YACzB,UAAU,KAAK,EAAE;YACjB,YAAY,cAAc,EAAE;SAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,CAAC,CAAC;SACD,IAAI,CAAC,aAAa,CAAC,CAAC;IAEtB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;YACnC,IAAI,EAAE,sBAAsB;YAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,YAAY,EAAE,oBAAoB;YAClC,MAAM,EAAE,eAAe,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,kBAAkB,EAAE;YACnF,SAAS,EAAE,+BAA+B;YAC1C,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAA8B,CAAC;gBAClE,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;oBACvC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;oBACjG,CAAC,CAAC,EAAE,CAAC;YACP,CAAC;SACD,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,UAAU,CAAC;QACnB,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QACrF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,UAAU,CAAC;IACnB,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAuB,EAAE,QAAgB;IACpE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,mBAAmB,EAAE,iCAAiC,CAAC,CAAC;IACjF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAEjC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,mBAAmB,EAAE,iCAAiC,CAAC,CAAC;IAC9E,IAAI,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;IACjF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,SAAS,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpG,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YACzC,MAAM;QACP,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,SAAS,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5F,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACxC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAsB;IAChE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC;QAC9C,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,OAAO,CAAC,cAAc;KAC7B,CAAC,CAAC;IACH,MAAM,kBAAkB,GAAG,OAAO,CAAC,cAAc,EAAE,MAAM;QACxD,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACtF,CAAC,CAAC,UAAU,CAAC;IACd,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,kBAAkB;SAC/B,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;SAClF,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;SAChC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAE1F,MAAM,SAAS,GAAG,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,CAAC;SAC5E,IAAI,CACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACR,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;QACjB,CAAC,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ;QAC3C,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CACnD;SACA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAEjE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACnF,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,KAAK;KACL,CAAC,CAAC,CAAC;IAEJ,OAAO;QACN,KAAK;QACL,YAAY,EAAE,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC;KACzD,CAAC;AACH,CAAC","sourcesContent":["import type { Api, Model } from \"@mariozechner/pi-ai\";\nimport { parseJsonObject } from \"./llm-json.js\";\nimport { buildMemoryCandidates, type MemoryCandidate, type MemoryCandidateCache } from \"./memory-candidates.js\";\nimport { runSidecarTask } from \"./sidecar-worker.js\";\n\nexport interface RecallRequest {\n\tquery: string;\n\tworkspaceDir: string;\n\tchannelDir: string;\n\tallowedSources?: MemoryCandidate[\"source\"][];\n\tmaxCandidates: number;\n\tmaxInjected: number;\n\tmaxChars: number;\n\trerankWithModel: boolean;\n\tautoRerank?: boolean;\n\tmodel: Model<Api>;\n\tresolveApiKey: (model: Model<Api>) => Promise<string>;\n\tcandidateCache?: MemoryCandidateCache;\n}\n\nexport interface RecalledMemory {\n\tsource: MemoryCandidate[\"source\"];\n\tpath: string;\n\ttitle: string;\n\tcontent: string;\n\tscore: number;\n}\n\nexport interface RecallResult {\n\titems: RecalledMemory[];\n\trenderedText: string;\n}\n\nconst RERANK_SYSTEM_PROMPT = `You are selecting which memory snippets are most relevant to the current user turn.\n\nReturn strict JSON only:\n{\n \"selectedIds\": [\"candidate-id\"]\n}\n\nRules:\n- Select only snippets that are clearly useful for answering the current turn.\n- Prefer current work state, constraints, active files, recent corrections, and durable decisions.\n- If nothing is clearly useful, return an empty array.\n- Do not rewrite the candidates. Only return candidate ids.`;\n\nconst HAN_REGEX = /\\p{Script=Han}/u;\nconst TOKEN_PART_REGEX = /[\\p{Script=Han}]+|[\\p{L}\\p{N}_./-]+/gu;\nconst MEMORY_RECALL_RERANK_TIMEOUT_MS = 5_000;\n\nfunction containsHanText(text: string): boolean {\n\treturn HAN_REGEX.test(text);\n}\n\nfunction tokenizeHanPart(part: string): string[] {\n\tconst chars = Array.from(part);\n\tconst tokens: string[] = [];\n\tfor (const size of [2, 3]) {\n\t\tif (chars.length < size) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (let index = 0; index <= chars.length - size; index++) {\n\t\t\ttokens.push(chars.slice(index, index + size).join(\"\"));\n\t\t}\n\t}\n\treturn tokens;\n}\n\nfunction tokenize(text: string): string[] {\n\tconst parts = text.toLowerCase().match(TOKEN_PART_REGEX) ?? [];\n\tconst tokens: string[] = [];\n\tfor (const part of parts) {\n\t\tif (containsHanText(part)) {\n\t\t\ttokens.push(...tokenizeHanPart(part));\n\t\t\tcontinue;\n\t\t}\n\t\tif (part.length >= 2) {\n\t\t\ttokens.push(part);\n\t\t}\n\t}\n\treturn Array.from(new Set(tokens));\n}\n\nfunction computeTokenOverlapScore(queryTokens: string[], text: string, weight: number): number {\n\tconst haystack = new Set(tokenize(text));\n\tlet score = 0;\n\tfor (const token of queryTokens) {\n\t\tif (haystack.has(token)) {\n\t\t\tscore += weight;\n\t\t}\n\t}\n\treturn score;\n}\n\nfunction computeRecencyBoost(timestamp: string | undefined): number {\n\tif (!timestamp) return 0;\n\tconst timestampMs = Date.parse(timestamp);\n\tif (!Number.isFinite(timestampMs)) return 0;\n\n\tconst ageMs = Date.now() - timestampMs;\n\tconst dayMs = 24 * 60 * 60 * 1000;\n\tif (ageMs <= dayMs) return 8;\n\tif (ageMs <= 7 * dayMs) return 5;\n\tif (ageMs <= 30 * dayMs) return 2;\n\treturn 0;\n}\n\nfunction scoreCandidate(queryTokens: string[], candidate: MemoryCandidate): number {\n\tlet score = candidate.priority;\n\tscore += computeTokenOverlapScore(queryTokens, candidate.title, 10);\n\tscore += computeTokenOverlapScore(queryTokens, candidate.content, 3);\n\tscore += computeTokenOverlapScore(queryTokens, candidate.path, 6);\n\tscore += computeRecencyBoost(candidate.timestamp);\n\treturn score;\n}\n\nfunction buildFallbackCandidates(\n\trequest: RecallRequest,\n\tcandidates: MemoryCandidate[],\n\texisting: Array<{ candidate: MemoryCandidate; score: number }>,\n): Array<{ candidate: MemoryCandidate; score: number }> {\n\tif (!containsHanText(request.query) && existing.length > 0) {\n\t\treturn existing;\n\t}\n\n\tconst seen = new Set(existing.map(({ candidate }) => candidate.id));\n\tconst seeded = [...existing];\n\tconst limit = Math.max(request.maxCandidates, request.maxInjected);\n\n\tfor (const candidate of candidates\n\t\t.filter((item) => item.source === \"channel-session\" || item.source === \"channel-memory\")\n\t\t.sort((a, b) => b.priority - a.priority || a.title.localeCompare(b.title))) {\n\t\tif (seen.has(candidate.id)) {\n\t\t\tcontinue;\n\t\t}\n\t\tseeded.push({ candidate, score: candidate.priority });\n\t\tseen.add(candidate.id);\n\t\tif (seeded.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn seeded;\n}\n\nasync function rerankCandidates(\n\trequest: RecallRequest,\n\tcandidates: Array<{ candidate: MemoryCandidate; score: number }>,\n): Promise<Array<{ candidate: MemoryCandidate; score: number }>> {\n\tif ((!request.rerankWithModel && !request.autoRerank) || candidates.length <= request.maxInjected) {\n\t\treturn candidates;\n\t}\n\n\tconst renderedCandidates = candidates\n\t\t.map(({ candidate, score }) => {\n\t\t\tconst clippedContent =\n\t\t\t\tcandidate.content.length > 300 ? `${candidate.content.slice(0, 300)}...` : candidate.content;\n\t\t\treturn [\n\t\t\t\t`id: ${candidate.id}`,\n\t\t\t\t`source: ${candidate.source}`,\n\t\t\t\t`title: ${candidate.title}`,\n\t\t\t\t`path: ${candidate.path}`,\n\t\t\t\t`score: ${score}`,\n\t\t\t\t`content: ${clippedContent}`,\n\t\t\t].join(\"\\n\");\n\t\t})\n\t\t.join(\"\\n\\n---\\n\\n\");\n\n\ttry {\n\t\tconst result = await runSidecarTask({\n\t\t\tname: \"memory-recall-rerank\",\n\t\t\tmodel: request.model,\n\t\t\tresolveApiKey: request.resolveApiKey,\n\t\t\tsystemPrompt: RERANK_SYSTEM_PROMPT,\n\t\t\tprompt: `User turn:\\n${request.query.trim()}\\n\\nCandidates:\\n${renderedCandidates}`,\n\t\t\ttimeoutMs: MEMORY_RECALL_RERANK_TIMEOUT_MS,\n\t\t\tparse: (text) => {\n\t\t\t\tconst parsed = parseJsonObject(text) as { selectedIds?: unknown };\n\t\t\t\treturn Array.isArray(parsed.selectedIds)\n\t\t\t\t\t? parsed.selectedIds.filter((id): id is string => typeof id === \"string\" && id.trim().length > 0)\n\t\t\t\t\t: [];\n\t\t\t},\n\t\t});\n\n\t\tconst selectedIds = new Set(result.output);\n\t\tif (selectedIds.size === 0) {\n\t\t\treturn candidates;\n\t\t}\n\n\t\tconst selected = candidates.filter(({ candidate }) => selectedIds.has(candidate.id));\n\t\treturn selected.length > 0 ? selected : candidates;\n\t} catch {\n\t\treturn candidates;\n\t}\n}\n\nfunction renderRecallResult(items: RecalledMemory[], maxChars: number): string {\n\tif (items.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst lines: string[] = [\"<runtime_context>\", \"Relevant context for this turn:\"];\n\tfor (const item of items) {\n\t\tlines.push(\"\");\n\t\tlines.push(`[${item.source}/${item.title}]`);\n\t\tlines.push(`Path: ${item.path}`);\n\t\tlines.push(item.content);\n\t}\n\tlines.push(\"</runtime_context>\");\n\n\tconst rendered = lines.join(\"\\n\");\n\tif (rendered.length <= maxChars) {\n\t\treturn rendered;\n\t}\n\n\tconst clippedLines = [\"<runtime_context>\", \"Relevant context for this turn:\"];\n\tlet usedChars = clippedLines.join(\"\\n\").length + \"</runtime_context>\".length + 2;\n\tfor (const item of items) {\n\t\tconst block = [\"\", `[${item.source}/${item.title}]`, `Path: ${item.path}`, item.content].join(\"\\n\");\n\t\tif (usedChars + block.length > maxChars) {\n\t\t\tbreak;\n\t\t}\n\t\tclippedLines.push(\"\", `[${item.source}/${item.title}]`, `Path: ${item.path}`, item.content);\n\t\tusedChars += block.length;\n\t}\n\tclippedLines.push(\"</runtime_context>\");\n\treturn clippedLines.join(\"\\n\");\n}\n\nexport async function recallRelevantMemory(request: RecallRequest): Promise<RecallResult> {\n\tconst query = request.query.trim();\n\tif (!query) {\n\t\treturn { items: [], renderedText: \"\" };\n\t}\n\n\tconst candidates = await buildMemoryCandidates({\n\t\tworkspaceDir: request.workspaceDir,\n\t\tchannelDir: request.channelDir,\n\t\tcache: request.candidateCache,\n\t});\n\tconst filteredCandidates = request.allowedSources?.length\n\t\t? candidates.filter((candidate) => request.allowedSources?.includes(candidate.source))\n\t\t: candidates;\n\tif (filteredCandidates.length === 0) {\n\t\treturn { items: [], renderedText: \"\" };\n\t}\n\n\tconst queryTokens = tokenize(query);\n\tconst scored = filteredCandidates\n\t\t.map((candidate) => ({ candidate, score: scoreCandidate(queryTokens, candidate) }))\n\t\t.filter(({ score }) => score > 0)\n\t\t.sort((a, b) => b.score - a.score || a.candidate.title.localeCompare(b.candidate.title));\n\n\tconst shortlist = buildFallbackCandidates(request, filteredCandidates, scored)\n\t\t.sort(\n\t\t\t(a, b) =>\n\t\t\t\tb.score - a.score ||\n\t\t\t\tb.candidate.priority - a.candidate.priority ||\n\t\t\t\ta.candidate.title.localeCompare(b.candidate.title),\n\t\t)\n\t\t.slice(0, Math.max(request.maxCandidates, request.maxInjected));\n\n\tif (shortlist.length === 0) {\n\t\treturn { items: [], renderedText: \"\" };\n\t}\n\n\tconst reranked = await rerankCandidates(request, shortlist);\n\tconst items = reranked.slice(0, request.maxInjected).map(({ candidate, score }) => ({\n\t\tsource: candidate.source,\n\t\tpath: candidate.path,\n\t\ttitle: candidate.title,\n\t\tcontent: candidate.content,\n\t\tscore,\n\t}));\n\n\treturn {\n\t\titems,\n\t\trenderedText: renderRecallResult(items, request.maxChars),\n\t};\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-memory-files.d.ts","sourceRoot":"","sources":["../src/session-memory-files.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,wBAAwB,EACxB,4BAA4B,EAC5B,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,GACrB,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-memory-files.js","sourceRoot":"","sources":["../src/session-memory-files.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,wBAAwB,EACxB,4BAA4B,EAC5B,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,GACrB,MAAM,mBAAmB,CAAC","sourcesContent":["export {\n\tensureChannelMemoryFiles,\n\tensureChannelMemoryFilesSync,\n\tgetChannelSessionPath,\n\treadChannelSession,\n\trewriteChannelSession,\n} from \"./memory-files.js\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-memory.d.ts","sourceRoot":"","sources":["../src/session-memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,GAAG,EAAW,KAAK,EAAE,MAAM,qBAAqB,CAAC;AA2C/D,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACtD;AA0LD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAyBrE;AAcD,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4BjH"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-memory.js","sourceRoot":"","sources":["../src/session-memory.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@mariozechner/pi-agent-core\";\nimport type { Api, Message, Model } from \"@mariozechner/pi-ai\";\nimport { serializeConversation } from \"@mariozechner/pi-coding-agent\";\nimport { writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { parseJsonObject } from \"./llm-json.js\";\nimport { splitLevelOneSections } from \"./markdown-sections.js\";\nimport { readChannelMemory } from \"./memory-files.js\";\nimport { readChannelSession, rewriteChannelSession } from \"./session-memory-files.js\";\nimport { runSidecarTask, SidecarParseError } from \"./sidecar-worker.js\";\n\nconst SESSION_TRANSCRIPT_MAX_CHARS = 20_000;\nconst SESSION_MEMORY_MAX_CHARS = 4_000;\nconst SESSION_ITEM_LIMIT = 12;\nconst SESSION_ITEM_MAX_CHARS = 300;\nconst SESSION_MEMORY_TIMEOUT_MS = 10_000;\n\nconst SESSION_MEMORY_SYSTEM_PROMPT = `You maintain a Pipiclaw SESSION.md file.\n\nReturn strict JSON only. Do not use Markdown fences.\n\nOutput schema:\n{\n \"title\": \"string\",\n \"currentState\": [\"string\"],\n \"userIntent\": [\"string\"],\n \"activeFiles\": [\"string\"],\n \"decisions\": [\"string\"],\n \"constraints\": [\"string\"],\n \"errorsAndCorrections\": [\"string\"],\n \"nextSteps\": [\"string\"],\n \"worklog\": [\"string\"]\n}\n\nRules:\n- Prefer short, information-dense bullet-sized items.\n- Capture only the current active work state, not the full conversation history.\n- Keep durable facts out unless they are directly relevant to the current work.\n- \"activeFiles\" should list only files, directories, or work areas currently in focus.\n- \"errorsAndCorrections\" should record recent failures, fixes, or things to avoid repeating.\n- \"nextSteps\" should reflect the most likely immediate follow-up actions.\n- \"worklog\" must stay terse and recent.\n- If a field has nothing useful, return an empty string or empty array.`;\n\nexport interface SessionMemoryState {\n\ttitle: string;\n\tcurrentState: string[];\n\tuserIntent: string[];\n\tactiveFiles: string[];\n\tdecisions: string[];\n\tconstraints: string[];\n\terrorsAndCorrections: string[];\n\tnextSteps: string[];\n\tworklog: string[];\n}\n\nexport interface SessionMemoryUpdateOptions {\n\tchannelDir: string;\n\tmessages: AgentMessage[];\n\tmodel: Model<Api>;\n\tresolveApiKey: (model: Model<Api>) => Promise<string>;\n}\n\ntype SessionMemoryStateUpdate = Partial<Record<keyof SessionMemoryState, string[] | string>>;\n\nfunction clipText(text: string, maxChars: number): string {\n\tconst normalized = text.replace(/\\r/g, \"\").trim();\n\tif (normalized.length <= maxChars) {\n\t\treturn normalized;\n\t}\n\tconst headChars = Math.floor(maxChars * 0.45);\n\tconst tailChars = maxChars - headChars;\n\treturn `${normalized.slice(0, headChars)}\\n\\n[... omitted middle section ...]\\n\\n${normalized.slice(-tailChars)}`;\n}\n\nfunction normalizeItem(value: unknown): string | null {\n\tif (typeof value !== \"string\") {\n\t\treturn null;\n\t}\n\tconst normalized = value.replace(/\\s+/g, \" \").trim();\n\tif (!normalized) {\n\t\treturn null;\n\t}\n\treturn normalized.length > SESSION_ITEM_MAX_CHARS\n\t\t? `${normalized.slice(0, SESSION_ITEM_MAX_CHARS - 3)}...`\n\t\t: normalized;\n}\n\nfunction normalizeItems(value: unknown): string[] {\n\tif (!Array.isArray(value)) {\n\t\treturn [];\n\t}\n\treturn value\n\t\t.map(normalizeItem)\n\t\t.filter((item): item is string => !!item)\n\t\t.slice(0, SESSION_ITEM_LIMIT);\n}\n\nfunction normalizeTitle(value: unknown): string {\n\treturn typeof value === \"string\" ? value.trim().slice(0, 120) : \"\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction parseStateUpdate(text: string): SessionMemoryStateUpdate {\n\tconst parsed = parseJsonObject(text);\n\tif (!isRecord(parsed)) {\n\t\tthrow new Error(\"Session memory response was not a JSON object\");\n\t}\n\n\tconst next: SessionMemoryStateUpdate = {};\n\tif (\"title\" in parsed) next.title = normalizeTitle(parsed.title);\n\tif (\"currentState\" in parsed) next.currentState = normalizeItems(parsed.currentState);\n\tif (\"userIntent\" in parsed) next.userIntent = normalizeItems(parsed.userIntent);\n\tif (\"activeFiles\" in parsed) next.activeFiles = normalizeItems(parsed.activeFiles);\n\tif (\"decisions\" in parsed) next.decisions = normalizeItems(parsed.decisions);\n\tif (\"constraints\" in parsed) next.constraints = normalizeItems(parsed.constraints);\n\tif (\"errorsAndCorrections\" in parsed) next.errorsAndCorrections = normalizeItems(parsed.errorsAndCorrections);\n\tif (\"nextSteps\" in parsed) next.nextSteps = normalizeItems(parsed.nextSteps);\n\tif (\"worklog\" in parsed) next.worklog = normalizeItems(parsed.worklog);\n\treturn next;\n}\n\nfunction createEmptySessionMemoryState(): SessionMemoryState {\n\treturn {\n\t\ttitle: \"\",\n\t\tcurrentState: [],\n\t\tuserIntent: [],\n\t\tactiveFiles: [],\n\t\tdecisions: [],\n\t\tconstraints: [],\n\t\terrorsAndCorrections: [],\n\t\tnextSteps: [],\n\t\tworklog: [],\n\t};\n}\n\nfunction stripHtmlComments(text: string): string {\n\treturn text.replace(/<!--[\\s\\S]*?-->/g, \"\").trim();\n}\n\nfunction parseSectionItems(content: string): string[] {\n\tconst normalized = stripHtmlComments(content);\n\tif (!normalized) {\n\t\treturn [];\n\t}\n\n\tconst lines = normalized\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean);\n\tconst bulletItems = lines\n\t\t.filter((line) => line.startsWith(\"- \"))\n\t\t.map((line) => normalizeItem(line.slice(2)))\n\t\t.filter((item): item is string => !!item);\n\tif (bulletItems.length > 0) {\n\t\treturn bulletItems.slice(0, SESSION_ITEM_LIMIT);\n\t}\n\treturn lines\n\t\t.map(normalizeItem)\n\t\t.filter((item): item is string => !!item)\n\t\t.slice(0, SESSION_ITEM_LIMIT);\n}\n\nfunction parseRenderedSessionMemory(markdown: string): SessionMemoryState {\n\tconst state = createEmptySessionMemoryState();\n\tfor (const section of splitLevelOneSections(markdown)) {\n\t\tswitch (section.heading.toLowerCase()) {\n\t\t\tcase \"session title\":\n\t\t\t\tstate.title = stripHtmlComments(section.content).split(\"\\n\")[0]?.trim().slice(0, 120) || \"\";\n\t\t\t\tbreak;\n\t\t\tcase \"current state\":\n\t\t\t\tstate.currentState = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"user intent\":\n\t\t\t\tstate.userIntent = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"active files\":\n\t\t\t\tstate.activeFiles = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"decisions\":\n\t\t\t\tstate.decisions = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"constraints\":\n\t\t\t\tstate.constraints = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"errors & corrections\":\n\t\t\t\tstate.errorsAndCorrections = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"next steps\":\n\t\t\t\tstate.nextSteps = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"worklog\":\n\t\t\t\tstate.worklog = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn state;\n}\n\nfunction mergeSessionMemoryState(current: SessionMemoryState, update: SessionMemoryStateUpdate): SessionMemoryState {\n\treturn {\n\t\ttitle: typeof update.title === \"string\" ? update.title : current.title,\n\t\tcurrentState: Array.isArray(update.currentState) ? update.currentState : current.currentState,\n\t\tuserIntent: Array.isArray(update.userIntent) ? update.userIntent : current.userIntent,\n\t\tactiveFiles: Array.isArray(update.activeFiles) ? update.activeFiles : current.activeFiles,\n\t\tdecisions: Array.isArray(update.decisions) ? update.decisions : current.decisions,\n\t\tconstraints: Array.isArray(update.constraints) ? update.constraints : current.constraints,\n\t\terrorsAndCorrections: Array.isArray(update.errorsAndCorrections)\n\t\t\t? update.errorsAndCorrections\n\t\t\t: current.errorsAndCorrections,\n\t\tnextSteps: Array.isArray(update.nextSteps) ? update.nextSteps : current.nextSteps,\n\t\tworklog: Array.isArray(update.worklog) ? update.worklog : current.worklog,\n\t};\n}\n\nasync function writeSessionMemoryDebugFile(channelDir: string, error: unknown, rawText: string): Promise<void> {\n\tconst debugPath = join(channelDir, \"SESSION.invalid-response.txt\");\n\tconst header = [\n\t\t`timestamp: ${new Date().toISOString()}`,\n\t\t`error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\"\",\n\t\t\"raw response:\",\n\t\t\"\",\n\t].join(\"\\n\");\n\tawait writeFile(debugPath, `${header}${rawText}\\n`, \"utf-8\");\n}\n\nfunction renderSection(heading: string, items: string[]): string {\n\treturn [`# ${heading}`, \"\", ...items.map((item) => `- ${item}`)].join(\"\\n\");\n}\n\nfunction isStandardAgentMessage(message: AgentMessage): message is Message {\n\treturn (\n\t\ttypeof message === \"object\" &&\n\t\tmessage !== null &&\n\t\t\"role\" in message &&\n\t\t(message.role === \"user\" || message.role === \"assistant\" || message.role === \"toolResult\")\n\t);\n}\n\nfunction buildMessagesForSessionMemory(messages: AgentMessage[]): Message[] {\n\treturn messages.filter(isStandardAgentMessage);\n}\n\nexport function renderSessionMemory(state: SessionMemoryState): string {\n\tconst sections: string[] = [];\n\tif (state.title.trim()) {\n\t\tsections.push(\"# Session Title\", \"\", state.title.trim());\n\t}\n\n\tconst orderedSections: Array<[string, string[]]> = [\n\t\t[\"Current State\", state.currentState],\n\t\t[\"User Intent\", state.userIntent],\n\t\t[\"Active Files\", state.activeFiles],\n\t\t[\"Decisions\", state.decisions],\n\t\t[\"Constraints\", state.constraints],\n\t\t[\"Errors & Corrections\", state.errorsAndCorrections],\n\t\t[\"Next Steps\", state.nextSteps],\n\t\t[\"Worklog\", state.worklog],\n\t];\n\n\tfor (const [heading, items] of orderedSections) {\n\t\tif (items.length === 0 && heading === \"Worklog\") {\n\t\t\tcontinue;\n\t\t}\n\t\tsections.push(renderSection(heading, items));\n\t}\n\n\treturn `${sections.join(\"\\n\\n\").trim()}\\n`;\n}\n\nfunction buildSessionPrompt(currentSession: string, currentMemory: string, messages: Message[]): string {\n\tconst transcript = clipText(serializeConversation(messages), SESSION_TRANSCRIPT_MAX_CHARS);\n\treturn `Current SESSION.md:\n${currentSession || \"(empty)\"}\n\nCurrent channel MEMORY.md:\n${clipText(currentMemory, SESSION_MEMORY_MAX_CHARS) || \"(empty)\"}\n\nRecent conversation:\n${transcript || \"(empty)\"}`;\n}\n\nexport async function updateChannelSessionMemory(options: SessionMemoryUpdateOptions): Promise<SessionMemoryState> {\n\tconst currentSession = await readChannelSession(options.channelDir);\n\tconst currentMemory = await readChannelMemory(options.channelDir);\n\tconst messages = buildMessagesForSessionMemory(options.messages);\n\tconst currentState = parseRenderedSessionMemory(currentSession);\n\n\tlet update: SessionMemoryStateUpdate;\n\ttry {\n\t\tconst result = await runSidecarTask({\n\t\t\tname: \"session-memory-update\",\n\t\t\tmodel: options.model,\n\t\t\tresolveApiKey: options.resolveApiKey,\n\t\t\tsystemPrompt: SESSION_MEMORY_SYSTEM_PROMPT,\n\t\t\tprompt: buildSessionPrompt(currentSession, currentMemory, messages),\n\t\t\tparse: parseStateUpdate,\n\t\t\ttimeoutMs: SESSION_MEMORY_TIMEOUT_MS,\n\t\t});\n\t\tupdate = result.output;\n\t} catch (error) {\n\t\tif (error instanceof SidecarParseError) {\n\t\t\tawait writeSessionMemoryDebugFile(options.channelDir, error.cause ?? error, error.rawText);\n\t\t}\n\t\tthrow error;\n\t}\n\n\tconst rendered = renderSessionMemory(mergeSessionMemoryState(currentState, update));\n\tawait rewriteChannelSession(options.channelDir, rendered);\n\treturn parseRenderedSessionMemory(rendered);\n}\n"]}
|
package/dist/store.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IAClC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,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,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE;YACL,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;YACf,SAAS,EAAE,MAAM,CAAC;YAClB,UAAU,EAAE,MAAM,CAAC;YACnB,KAAK,EAAE,MAAM,CAAC;SACd,CAAC;KACF,CAAC;CACF;AAED,qBAAa,YAAY;IACxB,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,cAAc,CAA6B;gBAEvC,MAAM,EAAE,kBAAkB;IAStC;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAQxC;;;;OAIG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BvE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9E;;;OAGG;IACH,OAAO,CAAC,cAAc;IAmBtB;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhF;;;OAGG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAkElD"}
|
package/dist/store.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, existsSync, mkdirSync, openSync, readSync, renameSync, statSync } from \"fs\";\nimport { appendFile, writeFile } from \"fs/promises\";\nimport { dirname, join } from \"path\";\n\nexport interface LoggedMessage {\n\tdate: string;\n\tts: string;\n\tuser: string;\n\tuserName?: string;\n\tdisplayName?: string;\n\ttext: string;\n\tisBot: boolean;\n\tdeliveryMode?: \"steer\" | \"followUp\";\n\tskipContextSync?: boolean;\n}\n\nexport interface ChannelStoreConfig {\n\tworkingDir: string;\n}\n\nexport interface LoggedSubAgentRun {\n\tdate: string;\n\ttoolCallId: string;\n\tlabel: string;\n\tagent: string;\n\tsource: \"predefined\" | \"inline\";\n\tmodel: string;\n\ttools: string[];\n\tturns: number;\n\ttoolCalls: number;\n\tdurationMs: number;\n\tfailed: boolean;\n\tfailureReason?: string;\n\toutput: string;\n\toutputTruncated: boolean;\n\tusage: {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t\ttotal: number;\n\t\tcost: {\n\t\t\tinput: number;\n\t\t\toutput: number;\n\t\t\tcacheRead: number;\n\t\t\tcacheWrite: number;\n\t\t\ttotal: number;\n\t\t};\n\t};\n}\n\nexport class ChannelStore {\n\tprivate workingDir: string;\n\t// Track recently logged message timestamps to prevent duplicates\n\tprivate recentlyLogged = new Map<string, number>();\n\n\tconstructor(config: ChannelStoreConfig) {\n\t\tthis.workingDir = config.workingDir;\n\n\t\t// Ensure working directory exists\n\t\tif (!existsSync(this.workingDir)) {\n\t\t\tmkdirSync(this.workingDir, { recursive: true });\n\t\t}\n\t}\n\n\t/**\n\t * Get or create the directory for a channel/DM\n\t */\n\tgetChannelDir(channelId: string): string {\n\t\tconst dir = join(this.workingDir, channelId);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\t\treturn dir;\n\t}\n\n\t/**\n\t * Log a message to the channel's log.jsonl raw archive.\n\t * This file is cold storage and is not proactively loaded into memory context.\n\t * Returns false if message was already logged (duplicate)\n\t */\n\tasync logMessage(channelId: string, message: LoggedMessage): Promise<boolean> {\n\t\t// Check for duplicate (same channel + timestamp)\n\t\tconst dedupeKey = `${channelId}:${message.ts}`;\n\t\tif (this.recentlyLogged.has(dedupeKey)) {\n\t\t\treturn false; // Already logged\n\t\t}\n\n\t\t// Mark as logged and schedule cleanup after 60 seconds\n\t\tthis.recentlyLogged.set(dedupeKey, Date.now());\n\t\tsetTimeout(() => this.recentlyLogged.delete(dedupeKey), 60000);\n\n\t\tconst logPath = join(this.getChannelDir(channelId), \"log.jsonl\");\n\n\t\t// Rotate if file exceeds size limit\n\t\tthis.rotateIfNeeded(logPath);\n\n\t\t// Ensure message has a date field\n\t\tif (!message.date) {\n\t\t\tmessage.date = new Date().toISOString();\n\t\t}\n\n\t\tconst line = `${JSON.stringify(message)}\\n`;\n\t\tawait appendFile(logPath, line, \"utf-8\");\n\t\treturn true;\n\t}\n\n\tasync logSubAgentRun(channelId: string, run: LoggedSubAgentRun): Promise<void> {\n\t\tconst logPath = join(this.getChannelDir(channelId), \"subagent-runs.jsonl\");\n\t\tthis.rotateIfNeeded(logPath);\n\t\tconst line = `${JSON.stringify(run)}\\n`;\n\t\tawait appendFile(logPath, line, \"utf-8\");\n\t}\n\n\t/**\n\t * Rotate log file if it exceeds 1MB.\n\t * Keeps one backup (log.jsonl.1) and resets the sync offset.\n\t */\n\tprivate rotateIfNeeded(logPath: string): void {\n\t\ttry {\n\t\t\tif (!existsSync(logPath)) return;\n\t\t\tconst stats = statSync(logPath);\n\t\t\tif (stats.size > 1_000_000) {\n\t\t\t\trenameSync(logPath, `${logPath}.1`);\n\t\t\t\t// Reset sync offset since log.jsonl was replaced\n\t\t\t\tconst syncOffsetPath = join(dirname(logPath), \".sync-offset\");\n\t\t\t\ttry {\n\t\t\t\t\twriteFile(syncOffsetPath, \"0\", \"utf-8\").catch(() => {});\n\t\t\t\t} catch {\n\t\t\t\t\t/* ignore */\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore rotation errors\n\t\t}\n\t}\n\n\t/**\n\t * Log a bot response\n\t */\n\tasync logBotResponse(channelId: string, text: string, ts: string): Promise<void> {\n\t\tawait this.logMessage(channelId, {\n\t\t\tdate: new Date().toISOString(),\n\t\t\tts,\n\t\t\tuser: \"bot\",\n\t\t\ttext,\n\t\t\tisBot: true,\n\t\t});\n\t}\n\n\t/**\n\t * Get the timestamp of the last logged message for a channel\n\t * Returns null if no log exists\n\t */\n\tgetLastTimestamp(channelId: string): string | null {\n\t\tconst logPath = join(this.workingDir, channelId, \"log.jsonl\");\n\t\tif (!existsSync(logPath)) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst stats = statSync(logPath);\n\t\t\tif (stats.size === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst fd = openSync(logPath, \"r\");\n\t\t\ttry {\n\t\t\t\tlet end = stats.size;\n\t\t\t\tconst trailing = Buffer.alloc(1);\n\t\t\t\twhile (end > 0) {\n\t\t\t\t\treadSync(fd, trailing, 0, 1, end - 1);\n\t\t\t\t\tif (trailing[0] !== 0x0a && trailing[0] !== 0x0d) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tend--;\n\t\t\t\t}\n\n\t\t\t\tif (end === 0) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst chunkSize = 4096;\n\t\t\t\tconst buffer = Buffer.alloc(chunkSize);\n\t\t\t\tlet lineStart = 0;\n\t\t\t\tlet position = end;\n\n\t\t\t\twhile (position > 0) {\n\t\t\t\t\tconst bytesToRead = Math.min(chunkSize, position);\n\t\t\t\t\tposition -= bytesToRead;\n\t\t\t\t\treadSync(fd, buffer, 0, bytesToRead, position);\n\n\t\t\t\t\tconst newlineIndex = buffer.subarray(0, bytesToRead).lastIndexOf(0x0a);\n\t\t\t\t\tif (newlineIndex !== -1) {\n\t\t\t\t\t\tlineStart = position + newlineIndex + 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst lineLength = end - lineStart;\n\t\t\t\tif (lineLength <= 0) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst lineBuffer = Buffer.alloc(lineLength);\n\t\t\t\treadSync(fd, lineBuffer, 0, lineLength, lineStart);\n\t\t\t\tconst lastLine = lineBuffer.toString(\"utf-8\").replace(/\\r+$/, \"\");\n\t\t\t\tif (!lastLine) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst message = JSON.parse(lastLine) as LoggedMessage;\n\t\t\t\treturn message.ts;\n\t\t\t} finally {\n\t\t\t\tcloseSync(fd);\n\t\t\t}\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"]}
|
package/dist/sub-agents.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agents.d.ts","sourceRoot":"","sources":["../src/sub-agents.ts"],"names":[],"mappings":"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"}
|
package/dist/sub-agents.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agents.js","sourceRoot":"","sources":["../src/sub-agents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAC3E,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC;AAC1D,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AACtC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AACrC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AACvC,MAAM,iCAAiC,GAAG,KAAK,CAAC;AAChD,MAAM,qBAAqB,GAAG,CAAC,UAAU,EAAE,YAAY,CAAU,CAAC;AAClE,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AAkDtE,SAAS,kBAAkB,CAAC,KAAa,EAAE,QAAgB,EAAE,KAAa;IACzE,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,KAAK,YAAY,QAAQ,oBAAoB,KAAK,CAAC,MAAM,IAAI,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAChD,OAAO,kBAAkB,CAAC,IAAI,EAAE,wBAAwB,EAAE,gBAAgB,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,4BAA4B,CAAC,YAAoB,EAAE,KAAa;IACxE,OAAO,kBAAkB,CAAC,YAAY,EAAE,iCAAiC,EAAE,KAAK,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,YAAoB;IACnD,OAAO,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAc;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IACnC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACvC,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,uBAAuB,CAAC,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,uBAAuB,CAAC,EAAE,CAAC;QAChD,CAAC;QAED,MAAM,MAAM,GAAG,GAAG;aAChB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;aAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEtC,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;QACpE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,4DAA4D,EAAE,CAAC;QAC3F,CAAC;QACD,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,4DAA4D,EAAE,CAAC;AAC3F,CAAC;AAED,SAAS,eAAe,CAAC,GAAY,EAAE,KAAa;IACnD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACvC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACvB,CAAC;QAED,OAAO;YACN,MAAM,EAAE,KAAK,CAAC,IAAI,CACjB,IAAI,GAAG,CACN,GAAG;iBACD,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;iBAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CACrC,CACD;SACD,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;QACpE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,KAAK,8CAA8C,EAAE,CAAC;QAC/F,CAAC;QAED,OAAO;YACN,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;SACjG,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,KAAK,8CAA8C,EAAE,CAAC;AAC/F,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAY;IACrC,MAAM,UAAU,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,qBAAqB,CAAC,QAAQ,CAAC,UAAiC,CAAC,EAAE,CAAC;QACvE,OAAO,EAAE,KAAK,EAAE,UAAiC,EAAE,CAAC;IACrD,CAAC;IACD,OAAO;QACN,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,wBAAwB,UAAU,sBAAsB,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACjG,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACvB,GAAY,EACZ,WAAgC;IAEhC,MAAM,UAAU,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACtE,CAAC;IACD,IAAI,oBAAoB,CAAC,QAAQ,CAAC,UAAgC,CAAC,EAAE,CAAC;QACrE,OAAO,EAAE,KAAK,EAAE,UAAgC,EAAE,CAAC;IACpD,CAAC;IACD,OAAO;QACN,KAAK,EAAE,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;QACzD,KAAK,EAAE,mBAAmB,UAAU,sBAAsB,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KAC3F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAA4B;IAC7D,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,uBAAuB,CAAC,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACzC,SAAS;QACV,CAAC;QACD,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,UAA8B,CAAC,EAAE,CAAC;YACvE,OAAO;gBACN,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,iBAAiB,UAAU,qBAAqB,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC3F,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,UAA8B,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,uBAAuB,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAY,EAAE,QAAgB;IAC3D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACvC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,0BAA0B,MAAM,CAAC,GAAG,CAAC,oBAAoB,QAAQ,EAAE,EAAE,CAAC;QAC1G,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,0BAA0B,MAAM,CAAC,GAAG,CAAC,oBAAoB,QAAQ,EAAE,EAAE,CAAC;IAC1G,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,0BAA0B,GAAG,oBAAoB,QAAQ,EAAE,EAAE,CAAC;IAClG,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAyB,EAAE,QAAgB;IAC3E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAClE,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,qBAAqB,CAC7B,QAAgB,EAChB,eAA6B;IAE7B,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,4BAA4B,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACrF,IAAI,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,oBAAoB,QAAQ,uCAAuC,EAAE,CAAC;IACvF,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,oBAAoB,QAAQ,yCAAyC,EAAE,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,YAAoB,EAAE,eAA6B;IACpF,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,OAAyB,CAAC;IAC9B,IAAI,CAAC;QACJ,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aACvD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;aAC3F,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO;YACN,SAAS;YACT,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,CAAC,wCAAwC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;SAC7G,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC;YACJ,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,QAAQ,CAAC,IAAI,CACZ,GAAG,KAAK,CAAC,IAAI,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAChG,CAAC;YACF,SAAS;QACV,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAA0B,OAAO,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,yBAAyB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,yBAAyB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAEvE,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,+DAA+D,CAAC,CAAC;YAC5F,SAAS;QACV,CAAC;QAED,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,+BAA+B,IAAI,WAAW,CAAC,CAAC;YAC3E,SAAS;QACV,CAAC;QAED,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,SAAS;QACV,CAAC;QAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC9D,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;YACrD,SAAS;QACV,CAAC;QAED,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1E,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YACpD,SAAS;QACV,CAAC;QAED,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChE,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;YACrD,SAAS;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAC/E,MAAM,YAAY,GAAG,oBAAoB,CAAC,WAAW,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;QAC5F,MAAM,cAAc,GAAG,oBAAoB,CAAC,WAAW,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC;QACnG,MAAM,cAAc,GAAG,oBAAoB,CAAC,WAAW,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;QAElG,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAChH,IAAI,OAAO,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;YAC5C,CAAC;QACF,CAAC;QAED,MAAM,QAAQ,GAAG,yBAAyB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9D,IAAI,KAA6B,CAAC;QAClC,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;YAClE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACrB,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;gBAClD,SAAS;YACV,CAAC;YACD,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QACxB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,4BAA4B,CAAC,CAAC;YACzD,SAAS;QACV,CAAC;QACD,MAAM,iBAAiB,GAAG,4BAA4B,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;QAC/F,IAAI,iBAAiB,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC,CAAC;YACrD,SAAS;QACV,CAAC;QAED,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,WAAW;YACX,YAAY,EAAE,WAAW;YACzB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,KAAK;YACL,QAAQ,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACvE,QAAQ,EAAE,QAAQ,CAAC,KAAK;YACxB,YAAY,EAAE,YAAY,CAAC,KAAK;YAChC,cAAc,EAAE,cAAc,CAAC,KAAK;YACpC,cAAc,EAAE,cAAc,CAAC,KAAK;YACpC,WAAW,EAAE,WAAW,CAAC,KAAK;YAC9B,MAAM,EAAE,UAAU,CAAC,KAAK;YACxB,KAAK,EAAE,WAAW,CAAC,MAAM;YACzB,QAAQ;YACR,MAAM,EAAE,YAAY;SACpB,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,eAA6B,EAC7B,YAAwB,EACxB,gBAAkC,EAClC,SAAsC;IAEtC,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClH,IAAI,SAAS,CAAC,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAChH,OAAO,EAAE,KAAK,EAAE,sBAAsB,SAAS,CAAC,KAAK,4BAA4B,SAAS,GAAG,EAAE,CAAC;IACjG,CAAC;IAED,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAChF,OAAO,EAAE,KAAK,EAAE,mEAAmE,EAAE,CAAC;IACvF,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK;QAC5B,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,KAAK,CAAC;QACpC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC,GAAG,uBAAuB,CAAC,EAAE,CAAC;IAChE,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,KAAK,GAAG,UAAU,EAAE,KAAK,CAAC;IAC9B,IAAI,QAAQ,GAAG,UAAU,EAAE,QAAQ,CAAC;IACpC,IAAI,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;QAChF,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC;QACD,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QACvB,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,IAAI,iBAAiB,CAAC,CAAC;IACxG,MAAM,YAAY,GAAG,uBAAuB,CAC3C,SAAS,CAAC,YAAY,EACtB,UAAU,EAAE,YAAY,IAAI,sBAAsB,CAClD,CAAC;IACF,MAAM,cAAc,GAAG,uBAAuB,CAC7C,SAAS,CAAC,cAAc,EACxB,UAAU,EAAE,cAAc,IAAI,yBAAyB,CACvD,CAAC;IACF,MAAM,cAAc,GAAG,uBAAuB,CAC7C,SAAS,CAAC,cAAc,EACxB,UAAU,EAAE,cAAc,IAAI,wBAAwB,CACtD,CAAC;IACF,MAAM,mBAAmB,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxG,IAAI,mBAAmB,EAAE,KAAK,EAAE,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,mBAAmB,CAAC,KAAK,EAAE,CAAC;IAC7C,CAAC;IACD,MAAM,WAAW,GAAG,mBAAmB,EAAE,KAAK,IAAI,UAAU,EAAE,WAAW,IAAI,UAAU,CAAC;IAExF,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,IAAI,cAAc,EAAE,KAAK,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC;IACxC,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEnH,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,IAAI,aAAa,EAAE,KAAK,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,EAAE,MAAM,IAAI,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC;IAE/D,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,YAAY,IAAI,EAAE,CAAC;IACtF,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,OAAO,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC;IAC9D,CAAC;IACD,IAAI,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;QACpC,MAAM,iBAAiB,GAAG,4BAA4B,CACrD,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,EAC7B,+BAA+B,CAC/B,CAAC;QACF,IAAI,iBAAiB,EAAE,CAAC;YACvB,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;QACrC,CAAC;IACF,CAAC;IAED,OAAO;QACN,MAAM,EAAE;YACP,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,IAAI,IAAI,kBAAkB;YACtE,WAAW,EAAE,UAAU,EAAE,WAAW,IAAI,kBAAkB;YAC1D,YAAY;YACZ,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,IAAI,YAAY;YAC5B,QAAQ,EAAE,QAAQ,IAAI,oBAAoB,CAAC,KAAK,IAAI,YAAY,CAAC;YACjE,QAAQ;YACR,YAAY;YACZ,cAAc;YACd,cAAc;YACd,WAAW;YACX,MAAM;YACN,KAAK;YACL,QAAQ,EAAE,UAAU,EAAE,QAAQ;YAC9B,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ;SAC5C;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAwB,EAAE,WAAmB,EAAE;IACjF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IACrG,IAAI,MAAM,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,MAAM,GAAG,QAAQ,OAAO,CAAC;AAC3E,CAAC","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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"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","sourcesContent":["import { Agent, type AgentEvent, type AgentMessage, type AgentTool } from \"@mariozechner/pi-agent-core\";\nimport type { Api, AssistantMessage, Model, TextContent } from \"@mariozechner/pi-ai\";\nimport { convertToLlm } from \"@mariozechner/pi-coding-agent\";\nimport { Type } from \"@sinclair/typebox\";\nimport type { PipiclawMemoryRecallSettings } from \"../context.js\";\nimport { splitLevelOneSections } from \"../markdown-sections.js\";\nimport { createMemoryCandidateCache } from \"../memory-candidates.js\";\nimport { readChannelSession } from \"../memory-files.js\";\nimport { recallRelevantMemory } from \"../memory-recall.js\";\nimport { formatModelReference } from \"../model-utils.js\";\nimport type { Executor } from \"../sandbox.js\";\nimport {\n\tformatSubAgentList,\n\ttype ResolvedSubAgentConfig,\n\tresolveSubAgentConfig,\n\ttype SubAgentConfig,\n\ttype SubAgentDiscoveryResult,\n\tvalidateSubAgentTask,\n} from \"../sub-agents.js\";\nimport { createBashTool } from \"./bash.js\";\nimport { createEditTool } from \"./edit.js\";\nimport { createReadTool } from \"./read.js\";\nimport { createWriteTool } from \"./write.js\";\n\nconst subagentSchema = Type.Object({\n\tlabel: Type.String({ description: \"Brief description of what this sub-agent task does (shown to user)\" }),\n\tagent: Type.Optional(Type.String({ description: \"Name of a predefined sub-agent from workspaceDir/sub-agents/\" })),\n\tname: Type.Optional(Type.String({ description: \"Optional display name for an inline sub-agent\" })),\n\ttask: Type.String({ description: \"Complete task description for the sub-agent\" }),\n\tsystemPrompt: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Optional inline system prompt for a temporary sub-agent. Use when no predefined agent fits.\",\n\t\t}),\n\t),\n\ttools: Type.Optional(Type.Array(Type.String(), { description: \"Optional tool whitelist for the sub-agent\" })),\n\tmodel: Type.Optional(\n\t\tType.String({ description: \"Optional exact model reference. Defaults to the parent's current model.\" }),\n\t),\n\tmaxTurns: Type.Optional(Type.Number({ description: \"Optional maximum assistant turns for this sub-agent\" })),\n\tmaxToolCalls: Type.Optional(Type.Number({ description: \"Optional maximum tool calls for this sub-agent\" })),\n\tmaxWallTimeSec: Type.Optional(\n\t\tType.Number({ description: \"Optional wall time budget in seconds for this sub-agent\" }),\n\t),\n\tbashTimeoutSec: Type.Optional(\n\t\tType.Number({ description: \"Optional default timeout in seconds for bash commands inside this sub-agent\" }),\n\t),\n\tcontextMode: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: 'Optional context mode. Use \"contextual\" to inject selected session and memory context.',\n\t\t}),\n\t),\n\tmemory: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: 'Optional memory mode for contextual sub-agents: \"none\", \"session\", or \"relevant\".',\n\t\t}),\n\t),\n\tpaths: Type.Optional(\n\t\tType.Array(Type.String(), {\n\t\t\tdescription: \"Optional preferred file or directory paths for the sub-agent to focus on.\",\n\t\t}),\n\t),\n});\n\ninterface UsageTotals {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotal: number;\n\tcost: {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t\ttotal: number;\n\t};\n}\n\nexport interface SubAgentToolDetails {\n\tkind: \"subagent\";\n\tagent: string;\n\tsource: \"predefined\" | \"inline\";\n\tmodel: string;\n\ttools: string[];\n\tturns: number;\n\ttoolCalls: number;\n\tdurationMs: number;\n\tfailed: boolean;\n\tfailureReason?: string;\n\tusage: UsageTotals;\n}\n\nexport interface SubAgentToolOptions {\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\tgetSubAgentDiscovery?: () => SubAgentDiscoveryResult;\n\tgetMemoryRecallSettings?: () => PipiclawMemoryRecallSettings;\n\truntimeContext: {\n\t\tworkspacePath: string;\n\t\tchannelId: string;\n\t\tsandbox: string;\n\t};\n\tcreateWorker?: (config: {\n\t\tsubAgent: ResolvedSubAgentConfig;\n\t\tapiKey: string;\n\t\ttools: AgentTool<any>[];\n\t}) => SubAgentWorker;\n}\n\ninterface SubAgentWorker {\n\tstate: { messages: AgentMessage[] };\n\tsubscribe(listener: (event: AgentEvent) => void): () => void;\n\tabort(): void;\n\tprompt(input: string): Promise<void>;\n\twaitForIdle(): Promise<void>;\n}\n\nconst DEFAULT_SUBAGENT_MEMORY_RECALL_SETTINGS: PipiclawMemoryRecallSettings = {\n\tenabled: true,\n\tmaxCandidates: 8,\n\tmaxInjected: 3,\n\tmaxChars: 3500,\n\trerankWithModel: false,\n};\nconst SESSION_SECTION_ORDER = [\"Current State\", \"User Intent\", \"Active Files\", \"Errors & Corrections\", \"Next Steps\"];\nconst MAX_SESSION_SECTION_CHARS = 280;\nconst MAX_SESSION_CONTEXT_CHARS = 1800;\nconst MAX_RECALL_CONTEXT_CHARS = 2200;\nconst HAN_REGEX = /\\p{Script=Han}/u;\n\nfunction createEmptyUsageTotals(): UsageTotals {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotal: 0,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t};\n}\n\nfunction isAssistantMessage(message: AgentMessage): message is AssistantMessage {\n\treturn typeof message === \"object\" && message !== null && \"role\" in message && message.role === \"assistant\";\n}\n\nfunction extractAssistantText(message: AssistantMessage): string {\n\treturn message.content\n\t\t.filter((part): part is Extract<AssistantMessage[\"content\"][number], TextContent> => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nfunction getLastAssistantMessage(messages: AgentMessage[]): AssistantMessage | null {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst message = messages[i];\n\t\tif (isAssistantMessage(message)) {\n\t\t\treturn message;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction extractLabelFromArgs(args: unknown): string | null {\n\tif (!args || typeof args !== \"object\" || !(\"label\" in args)) {\n\t\treturn null;\n\t}\n\tconst label = (args as { label?: unknown }).label;\n\treturn typeof label === \"string\" && label.trim() ? label.trim() : null;\n}\n\nfunction formatStatus(agentName: string, text: string): string {\n\treturn `Subagent ${agentName}: ${text}`;\n}\n\nfunction buildFailureText(config: SubAgentConfig, reason: string, lastAssistantText: string): string {\n\tconst trimmedLastText = lastAssistantText.trim();\n\tif (!trimmedLastText) {\n\t\treturn `Sub-agent ${config.name} failed: ${reason}`;\n\t}\n\treturn `Sub-agent ${config.name} failed: ${reason}\\n\\nLast output:\\n${trimmedLastText}`;\n}\n\nfunction buildStoppedText(config: SubAgentConfig, reason: string, finalText: string): string {\n\tconst trimmedFinalText = finalText.trim();\n\tif (!trimmedFinalText) {\n\t\treturn `Sub-agent ${config.name} stopped: ${reason}`;\n\t}\n\treturn `[Sub-agent ${config.name} stopped: ${reason}]\\n\\n${trimmedFinalText}`;\n}\n\nfunction createToolSet(executor: Executor, bashTimeoutSec: number): AgentTool<any>[] {\n\treturn [\n\t\tcreateReadTool(executor),\n\t\tcreateBashTool(executor, { defaultTimeoutSeconds: bashTimeoutSec }),\n\t\tcreateEditTool(executor),\n\t\tcreateWriteTool(executor),\n\t];\n}\n\nfunction buildSubAgentTask(\n\ttask: string,\n\tconfig: ResolvedSubAgentConfig,\n\truntimeContext: SubAgentToolOptions[\"runtimeContext\"],\n\tcontextBlocks: string[],\n): string {\n\tconst taskText = task.trim();\n\tconst lines = [\n\t\t`Runtime context:`,\n\t\t`- Workspace root: ${runtimeContext.workspacePath}`,\n\t\t`- Channel id: ${runtimeContext.channelId}`,\n\t\t`- Channel directory: ${runtimeContext.workspacePath}/${runtimeContext.channelId}`,\n\t\t`- Sandbox: ${runtimeContext.sandbox}`,\n\t\t`- Filesystem isolation: none (files written here are visible to the parent agent)`,\n\t\t`- Your configured role: ${config.name}`,\n\t];\n\n\tfor (const block of contextBlocks) {\n\t\tif (!block.trim()) {\n\t\t\tcontinue;\n\t\t}\n\t\tlines.push(\"\", block.trim());\n\t}\n\n\tlines.push(\"\", `Task:`, taskText);\n\treturn lines.join(\"\\n\");\n}\n\nfunction clipText(text: string, maxChars: number): string {\n\tconst normalized = text.replace(/\\s+\\n/g, \"\\n\").trim();\n\tif (normalized.length <= maxChars) {\n\t\treturn normalized;\n\t}\n\treturn `${normalized.slice(0, Math.max(0, maxChars - 3)).trimEnd()}...`;\n}\n\nfunction buildSessionContextBlock(sessionMarkdown: string): string {\n\tconst sections = splitLevelOneSections(sessionMarkdown);\n\tif (sections.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst selectedSections = SESSION_SECTION_ORDER.flatMap((heading) =>\n\t\tsections.filter((section) => section.heading.toLowerCase() === heading.toLowerCase()),\n\t);\n\n\tif (selectedSections.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst lines = [\"Relevant session state:\"];\n\tlet usedChars = lines[0].length;\n\tfor (const section of selectedSections) {\n\t\tconst clipped = clipText(section.content, MAX_SESSION_SECTION_CHARS);\n\t\tconst block = `- ${section.heading}: ${clipped}`;\n\t\tif (usedChars + block.length > MAX_SESSION_CONTEXT_CHARS) {\n\t\t\tbreak;\n\t\t}\n\t\tlines.push(block);\n\t\tusedChars += block.length + 1;\n\t}\n\treturn lines.length > 1 ? lines.join(\"\\n\") : \"\";\n}\n\nfunction stripRuntimeContextWrapper(renderedText: string): string {\n\treturn renderedText\n\t\t.replace(/^<runtime_context>\\s*/i, \"\")\n\t\t.replace(/\\s*<\\/runtime_context>$/i, \"\")\n\t\t.trim();\n}\n\nasync function buildContextualBlocks(\n\ttask: string,\n\tconfig: ResolvedSubAgentConfig,\n\toptions: SubAgentToolOptions,\n\tcurrentModel: Model<Api>,\n\tcandidateCache = createMemoryCandidateCache(),\n): Promise<string[]> {\n\tif (config.contextMode !== \"contextual\") {\n\t\treturn [];\n\t}\n\n\tconst blocks: string[] = [];\n\tif (config.paths.length > 0) {\n\t\tblocks.push(`Preferred focus paths:\\n${config.paths.map((path) => `- ${path}`).join(\"\\n\")}`);\n\t}\n\n\tif (config.memory === \"none\") {\n\t\treturn blocks;\n\t}\n\n\tconst sessionMarkdown = await readChannelSession(options.channelDir);\n\tconst sessionBlock = buildSessionContextBlock(sessionMarkdown);\n\tif (sessionBlock) {\n\t\tblocks.push(sessionBlock);\n\t}\n\n\tif (config.memory !== \"relevant\") {\n\t\treturn blocks;\n\t}\n\n\tconst recallSettings = {\n\t\t...DEFAULT_SUBAGENT_MEMORY_RECALL_SETTINGS,\n\t\t...options.getMemoryRecallSettings?.(),\n\t};\n\tif (!recallSettings.enabled) {\n\t\treturn blocks;\n\t}\n\n\tconst recallQuery = [task.trim(), config.description.trim(), ...config.paths].filter(Boolean).join(\"\\n\");\n\tconst recalled = await recallRelevantMemory({\n\t\tquery: recallQuery,\n\t\tworkspaceDir: options.workspaceDir,\n\t\tchannelDir: options.channelDir,\n\t\tmaxCandidates: recallSettings.maxCandidates,\n\t\tmaxInjected: recallSettings.maxInjected,\n\t\tmaxChars: Math.min(recallSettings.maxChars, MAX_RECALL_CONTEXT_CHARS),\n\t\trerankWithModel: recallSettings.rerankWithModel,\n\t\tautoRerank: HAN_REGEX.test(recallQuery),\n\t\tmodel: currentModel,\n\t\tresolveApiKey: options.resolveApiKey,\n\t\tallowedSources: [\"workspace-memory\", \"channel-memory\", \"channel-history\"],\n\t\tcandidateCache,\n\t});\n\tconst recalledText = stripRuntimeContextWrapper(recalled.renderedText);\n\tif (recalledText) {\n\t\tblocks.push(recalledText);\n\t}\n\n\treturn blocks;\n}\n\nfunction filterToolsByName(allTools: AgentTool<any>[], names: string[]): AgentTool<any>[] {\n\tconst allowed = new Set(names);\n\treturn allTools.filter((tool) => allowed.has(tool.name));\n}\n\nfunction createDetails(\n\tconfig: ResolvedSubAgentConfig,\n\tusage: UsageTotals,\n\tturns: number,\n\ttoolCalls: number,\n\tdurationMs: number,\n\tfailed: boolean,\n\tfailureReason?: string,\n): SubAgentToolDetails {\n\treturn {\n\t\tkind: \"subagent\",\n\t\tagent: config.name,\n\t\tsource: config.source,\n\t\tmodel: formatModelReference(config.model),\n\t\ttools: [...config.tools],\n\t\tturns,\n\t\ttoolCalls,\n\t\tdurationMs,\n\t\tfailed,\n\t\tfailureReason,\n\t\tusage: {\n\t\t\t...usage,\n\t\t\tcost: { ...usage.cost },\n\t\t},\n\t};\n}\n\nfunction linkAbortSignals(parentSignal: AbortSignal | undefined, childController: AbortController): () => void {\n\tif (!parentSignal) {\n\t\treturn () => {};\n\t}\n\n\tconst abortChild = () => childController.abort(parentSignal.reason);\n\tif (parentSignal.aborted) {\n\t\tabortChild();\n\t\treturn () => {};\n\t}\n\n\tparentSignal.addEventListener(\"abort\", abortChild, { once: true });\n\treturn () => parentSignal.removeEventListener(\"abort\", abortChild);\n}\n\nexport function createSubAgentTool(\n\toptions: SubAgentToolOptions,\n): AgentTool<typeof subagentSchema, SubAgentToolDetails> {\n\treturn {\n\t\tname: \"subagent\",\n\t\tlabel: \"subagent\",\n\t\tdescription:\n\t\t\t\"Delegate a task to a sub-agent with an isolated context. You may use a predefined sub-agent from workspaceDir/sub-agents/ or define a temporary inline sub-agent by providing systemPrompt/tools/model parameters. Sub-agents never receive the subagent tool, so they cannot create nested agents.\",\n\t\tparameters: subagentSchema,\n\t\texecute: async (_toolCallId, params, signal, onUpdate) => {\n\t\t\tconst availableModels = options.getAvailableModels();\n\t\t\tconst discovery = options.getSubAgentDiscovery?.() ?? {\n\t\t\t\tdirectory: `${options.workspaceDir}/sub-agents`,\n\t\t\t\tagents: [],\n\t\t\t\twarnings: [],\n\t\t\t};\n\t\t\tconst currentModel = options.getCurrentModel();\n\t\t\tconst taskLengthError = validateSubAgentTask(params.task);\n\t\t\tif (taskLengthError) {\n\t\t\t\tthrow new Error(taskLengthError);\n\t\t\t}\n\t\t\tconst invocation = resolveSubAgentConfig(availableModels, currentModel, discovery.agents, params);\n\t\t\tif (!invocation.config) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${invocation.error}\\n\\nAvailable predefined sub-agents:\\n${formatSubAgentList(discovery.agents)}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst config = invocation.config;\n\t\t\tconst apiKey = await options.resolveApiKey(config.model);\n\t\t\tconst startedAt = Date.now();\n\t\t\tconst usage = createEmptyUsageTotals();\n\t\t\tlet assistantTurns = 0;\n\t\t\tlet toolCalls = 0;\n\t\t\tlet failureReason: string | undefined;\n\t\t\tlet lastUpdateText = \"\";\n\n\t\t\tconst emitUpdate = (text: string) => {\n\t\t\t\tconst nextText = text.trim();\n\t\t\t\tif (!nextText || nextText === lastUpdateText) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlastUpdateText = nextText;\n\t\t\t\tonUpdate?.({\n\t\t\t\t\tcontent: [{ type: \"text\", text: nextText }],\n\t\t\t\t\tdetails: createDetails(\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tusage,\n\t\t\t\t\t\tassistantTurns,\n\t\t\t\t\t\ttoolCalls,\n\t\t\t\t\t\tDate.now() - startedAt,\n\t\t\t\t\t\tBoolean(failureReason),\n\t\t\t\t\t\tfailureReason,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst worker =\n\t\t\t\toptions.createWorker?.({\n\t\t\t\t\tsubAgent: config,\n\t\t\t\t\tapiKey,\n\t\t\t\t\ttools: filterToolsByName(createToolSet(options.executor, config.bashTimeoutSec), config.tools),\n\t\t\t\t}) ??\n\t\t\t\tnew Agent({\n\t\t\t\t\tinitialState: {\n\t\t\t\t\t\tsystemPrompt: config.systemPrompt,\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\tthinkingLevel: \"off\",\n\t\t\t\t\t\ttools: filterToolsByName(createToolSet(options.executor, config.bashTimeoutSec), config.tools),\n\t\t\t\t\t},\n\t\t\t\t\tconvertToLlm,\n\t\t\t\t\tgetApiKey: async () => apiKey,\n\t\t\t\t});\n\n\t\t\tconst childController = new AbortController();\n\t\t\tconst unlinkAbortSignals = linkAbortSignals(signal, childController);\n\t\t\tconst wallClockTimer = setTimeout(() => {\n\t\t\t\tfailureReason = `Wall time budget exceeded (${config.maxWallTimeSec}s)`;\n\t\t\t\tworker.abort();\n\t\t\t}, config.maxWallTimeSec * 1000);\n\n\t\t\tconst unsubscribe = worker.subscribe((event: AgentEvent) => {\n\t\t\t\tif (event.type === \"message_end\" && isAssistantMessage(event.message)) {\n\t\t\t\t\tassistantTurns++;\n\t\t\t\t\tconst messageUsage = event.message.usage;\n\t\t\t\t\tusage.input += messageUsage.input;\n\t\t\t\t\tusage.output += messageUsage.output;\n\t\t\t\t\tusage.cacheRead += messageUsage.cacheRead;\n\t\t\t\t\tusage.cacheWrite += messageUsage.cacheWrite;\n\t\t\t\t\tusage.total += messageUsage.totalTokens;\n\t\t\t\t\tusage.cost.input += messageUsage.cost.input;\n\t\t\t\t\tusage.cost.output += messageUsage.cost.output;\n\t\t\t\t\tusage.cost.cacheRead += messageUsage.cost.cacheRead;\n\t\t\t\t\tusage.cost.cacheWrite += messageUsage.cost.cacheWrite;\n\t\t\t\t\tusage.cost.total += messageUsage.cost.total;\n\t\t\t\t}\n\n\t\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\t\ttoolCalls++;\n\t\t\t\t\tconst label = extractLabelFromArgs(event.args) || event.toolName;\n\t\t\t\t\temitUpdate(formatStatus(config.name, label));\n\t\t\t\t\tif (toolCalls > config.maxToolCalls) {\n\t\t\t\t\t\tfailureReason = `Tool call budget exceeded (${config.maxToolCalls})`;\n\t\t\t\t\t\temitUpdate(formatStatus(config.name, \"tool budget reached\"));\n\t\t\t\t\t\tworker.abort();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tevent.type === \"turn_end\" &&\n\t\t\t\t\tisAssistantMessage(event.message) &&\n\t\t\t\t\tevent.toolResults.length > 0 &&\n\t\t\t\t\tassistantTurns >= config.maxTurns\n\t\t\t\t) {\n\t\t\t\t\tfailureReason = `Turn budget exceeded (${config.maxTurns})`;\n\t\t\t\t\temitUpdate(formatStatus(config.name, \"turn budget reached\"));\n\t\t\t\t\tworker.abort();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\temitUpdate(formatStatus(config.name, \"started\"));\n\n\t\t\ttry {\n\t\t\t\tif (childController.signal.aborted) {\n\t\t\t\t\tthrow new Error(\"Sub-agent aborted\");\n\t\t\t\t}\n\n\t\t\t\tconst abortWorker = () => worker.abort();\n\t\t\t\tchildController.signal.addEventListener(\"abort\", abortWorker, { once: true });\n\t\t\t\ttry {\n\t\t\t\t\tconst contextualBlocks = await buildContextualBlocks(params.task, config, options, currentModel);\n\t\t\t\t\tawait worker.prompt(buildSubAgentTask(params.task, config, options.runtimeContext, contextualBlocks));\n\t\t\t\t\tawait worker.waitForIdle();\n\t\t\t\t} finally {\n\t\t\t\t\tchildController.signal.removeEventListener(\"abort\", abortWorker);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tunsubscribe();\n\t\t\t\tunlinkAbortSignals();\n\t\t\t\tclearTimeout(wallClockTimer);\n\t\t\t}\n\n\t\t\tif (signal?.aborted) {\n\t\t\t\tthrow new Error(\"Sub-agent aborted\");\n\t\t\t}\n\n\t\t\tconst lastAssistantMessage = getLastAssistantMessage(worker.state.messages);\n\t\t\tconst durationMs = Date.now() - startedAt;\n\t\t\tif (!lastAssistantMessage) {\n\t\t\t\tfailureReason = failureReason || \"Sub-agent returned no assistant message\";\n\t\t\t\temitUpdate(formatStatus(config.name, \"failed\"));\n\t\t\t\tthrow new Error(`Sub-agent ${config.name} failed: ${failureReason}`);\n\t\t\t}\n\n\t\t\tconst finalText = extractAssistantText(lastAssistantMessage);\n\t\t\tconst effectiveFailureReason =\n\t\t\t\tfailureReason ||\n\t\t\t\t(lastAssistantMessage.stopReason === \"error\" || lastAssistantMessage.stopReason === \"aborted\"\n\t\t\t\t\t? lastAssistantMessage.errorMessage || `Sub-agent stopped with ${lastAssistantMessage.stopReason}`\n\t\t\t\t\t: undefined);\n\n\t\t\tif (effectiveFailureReason) {\n\t\t\t\tif (!finalText.trim()) {\n\t\t\t\t\temitUpdate(formatStatus(config.name, \"failed\"));\n\t\t\t\t\tthrow new Error(buildFailureText(config, effectiveFailureReason, finalText));\n\t\t\t\t}\n\t\t\t\temitUpdate(formatStatus(config.name, \"stopped\"));\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: buildStoppedText(config, effectiveFailureReason, finalText) }],\n\t\t\t\t\tdetails: createDetails(\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tusage,\n\t\t\t\t\t\tassistantTurns,\n\t\t\t\t\t\ttoolCalls,\n\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\teffectiveFailureReason,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: finalText || `(Sub-agent ${config.name} completed with no text output)` }],\n\t\t\t\tdetails: createDetails(config, usage, assistantTurns, toolCalls, durationMs, false),\n\t\t\t};\n\t\t},\n\t};\n}\n"]}
|