@oyasmi/pipiclaw 0.5.0 → 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
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
function sanitizeProgressText(text) {
|
|
2
|
+
return text
|
|
3
|
+
.replace(/\uFFFC/g, "")
|
|
4
|
+
.replace(/\r/g, "")
|
|
5
|
+
.trim();
|
|
6
|
+
}
|
|
7
|
+
export function clipUserInput(text, maxChars) {
|
|
8
|
+
const normalized = text.replace(/\r/g, "").trim();
|
|
9
|
+
if (normalized.length <= maxChars) {
|
|
10
|
+
return normalized;
|
|
11
|
+
}
|
|
12
|
+
const headChars = Math.floor(maxChars * 0.6);
|
|
13
|
+
const tailChars = maxChars - headChars;
|
|
14
|
+
return `${normalized.slice(0, headChars)}\n\n[... omitted ${normalized.length - maxChars} chars ...]\n\n${normalized.slice(-tailChars)}`;
|
|
15
|
+
}
|
|
16
|
+
export function formatProgressEntry(kind, text) {
|
|
17
|
+
const cleaned = sanitizeProgressText(text);
|
|
18
|
+
if (!cleaned)
|
|
19
|
+
return "";
|
|
20
|
+
const normalized = cleaned.replace(/\n+/g, " ").trim();
|
|
21
|
+
switch (kind) {
|
|
22
|
+
case "tool":
|
|
23
|
+
return `Running: ${normalized}`;
|
|
24
|
+
case "thinking":
|
|
25
|
+
return `Thinking: ${normalized}`;
|
|
26
|
+
case "error":
|
|
27
|
+
return `Error: ${normalized}`;
|
|
28
|
+
case "assistant":
|
|
29
|
+
return normalized;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function extractToolResultText(result) {
|
|
33
|
+
if (typeof result === "string") {
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
if (result &&
|
|
37
|
+
typeof result === "object" &&
|
|
38
|
+
"content" in result &&
|
|
39
|
+
Array.isArray(result.content)) {
|
|
40
|
+
const content = result.content;
|
|
41
|
+
const textParts = [];
|
|
42
|
+
for (const part of content) {
|
|
43
|
+
if (part.type === "text" && part.text) {
|
|
44
|
+
textParts.push(part.text);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (textParts.length > 0) {
|
|
48
|
+
return textParts.join("\n");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return JSON.stringify(result);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=progress-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-formatter.js","sourceRoot":"","sources":["../../src/agent/progress-formatter.ts"],"names":[],"mappings":"AAEA,SAAS,oBAAoB,CAAC,IAAY;IACzC,OAAO,IAAI;SACT,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,IAAI,EAAE,CAAC;AACV,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAgB;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,IAAI,UAAU,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QACnC,OAAO,UAAU,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvC,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,oBAAoB,UAAU,CAAC,MAAM,GAAG,QAAQ,kBAAkB,UAAU,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;AAC1I,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAuB,EAAE,IAAY;IACxE,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,MAAM;YACV,OAAO,YAAY,UAAU,EAAE,CAAC;QACjC,KAAK,UAAU;YACd,OAAO,aAAa,UAAU,EAAE,CAAC;QAClC,KAAK,OAAO;YACX,OAAO,UAAU,UAAU,EAAE,CAAC;QAC/B,KAAK,WAAW;YACf,OAAO,UAAU,CAAC;IACpB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC;IACf,CAAC;IAED,IACC,MAAM;QACN,OAAO,MAAM,KAAK,QAAQ;QAC1B,SAAS,IAAI,MAAM;QACnB,KAAK,CAAC,OAAO,CAAE,MAA+B,CAAC,OAAO,CAAC,EACtD,CAAC;QACF,MAAM,OAAO,GAAI,MAA8D,CAAC,OAAO,CAAC;QACxF,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACvC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;QACF,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC","sourcesContent":["import type { ProgressEntryKind } from \"./types.js\";\n\nfunction sanitizeProgressText(text: string): string {\n\treturn text\n\t\t.replace(/\\uFFFC/g, \"\")\n\t\t.replace(/\\r/g, \"\")\n\t\t.trim();\n}\n\nexport function clipUserInput(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\n\tconst headChars = Math.floor(maxChars * 0.6);\n\tconst tailChars = maxChars - headChars;\n\treturn `${normalized.slice(0, headChars)}\\n\\n[... omitted ${normalized.length - maxChars} chars ...]\\n\\n${normalized.slice(-tailChars)}`;\n}\n\nexport function formatProgressEntry(kind: ProgressEntryKind, text: string): string {\n\tconst cleaned = sanitizeProgressText(text);\n\tif (!cleaned) return \"\";\n\n\tconst normalized = cleaned.replace(/\\n+/g, \" \").trim();\n\tswitch (kind) {\n\t\tcase \"tool\":\n\t\t\treturn `Running: ${normalized}`;\n\t\tcase \"thinking\":\n\t\t\treturn `Thinking: ${normalized}`;\n\t\tcase \"error\":\n\t\t\treturn `Error: ${normalized}`;\n\t\tcase \"assistant\":\n\t\t\treturn normalized;\n\t}\n}\n\nexport function extractToolResultText(result: unknown): string {\n\tif (typeof result === \"string\") {\n\t\treturn result;\n\t}\n\n\tif (\n\t\tresult &&\n\t\ttypeof result === \"object\" &&\n\t\t\"content\" in result &&\n\t\tArray.isArray((result as { content: unknown }).content)\n\t) {\n\t\tconst content = (result as { content: Array<{ type: string; text?: string }> }).content;\n\t\tconst textParts: string[] = [];\n\t\tfor (const part of content) {\n\t\t\tif (part.type === \"text\" && part.text) {\n\t\t\t\ttextParts.push(part.text);\n\t\t\t}\n\t\t}\n\t\tif (textParts.length > 0) {\n\t\t\treturn textParts.join(\"\\n\");\n\t\t}\n\t}\n\n\treturn JSON.stringify(result);\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DingTalkContext } from "../runtime/dingtalk.js";
|
|
2
|
+
import type { RunQueue } from "./types.js";
|
|
3
|
+
export interface CreatedRunQueue {
|
|
4
|
+
queue: RunQueue;
|
|
5
|
+
drain: () => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare function createRunQueue(ctx: DingTalkContext): CreatedRunQueue;
|
|
8
|
+
//# sourceMappingURL=run-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-queue.d.ts","sourceRoot":"","sources":["../../src/agent/run-queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,eAAe,CAwBpE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as log from "../log.js";
|
|
2
|
+
export function createRunQueue(ctx) {
|
|
3
|
+
let queueChain = Promise.resolve();
|
|
4
|
+
const queue = {
|
|
5
|
+
enqueue: (fn, errorContext) => {
|
|
6
|
+
queueChain = queueChain.then(async () => {
|
|
7
|
+
try {
|
|
8
|
+
await fn();
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
12
|
+
log.logWarning(`DingTalk API error (${errorContext})`, errMsg);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
},
|
|
16
|
+
enqueueMessage: function (text, target, errorContext, doLog = true) {
|
|
17
|
+
this.enqueue(() => (target === "main" ? ctx.respond(text, doLog) : ctx.respondInThread(text)), errorContext);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
queue,
|
|
22
|
+
drain: async () => {
|
|
23
|
+
await queueChain;
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=run-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-queue.js","sourceRoot":"","sources":["../../src/agent/run-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AASjC,MAAM,UAAU,cAAc,CAAC,GAAoB;IAClD,IAAI,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IACnC,MAAM,KAAK,GAAa;QACvB,OAAO,EAAE,CAAC,EAAuB,EAAE,YAAoB,EAAQ,EAAE;YAChE,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvC,IAAI,CAAC;oBACJ,MAAM,EAAE,EAAE,CAAC;gBACZ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAChE,GAAG,CAAC,UAAU,CAAC,uBAAuB,YAAY,GAAG,EAAE,MAAM,CAAC,CAAC;gBAChE,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,cAAc,EAAE,UAAU,IAAY,EAAE,MAAyB,EAAE,YAAoB,EAAE,KAAK,GAAG,IAAI;YACpG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAC9G,CAAC;KACD,CAAC;IAEF,OAAO;QACN,KAAK;QACL,KAAK,EAAE,KAAK,IAAI,EAAE;YACjB,MAAM,UAAU,CAAC;QAClB,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["import * as log from \"../log.js\";\nimport type { DingTalkContext } from \"../runtime/dingtalk.js\";\nimport type { RunQueue } from \"./types.js\";\n\nexport interface CreatedRunQueue {\n\tqueue: RunQueue;\n\tdrain: () => Promise<void>;\n}\n\nexport function createRunQueue(ctx: DingTalkContext): CreatedRunQueue {\n\tlet queueChain = Promise.resolve();\n\tconst queue: RunQueue = {\n\t\tenqueue: (fn: () => Promise<void>, errorContext: string): void => {\n\t\t\tqueueChain = queueChain.then(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait fn();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst errMsg = err instanceof Error ? err.message : String(err);\n\t\t\t\t\tlog.logWarning(`DingTalk API error (${errorContext})`, errMsg);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tenqueueMessage: function (text: string, target: \"main\" | \"thread\", errorContext: string, doLog = true): void {\n\t\t\tthis.enqueue(() => (target === \"main\" ? ctx.respond(text, doLog) : ctx.respondInThread(text)), errorContext);\n\t\t},\n\t};\n\n\treturn {\n\t\tqueue,\n\t\tdrain: async () => {\n\t\t\tawait queueChain;\n\t\t},\n\t};\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SandboxConfig } from "../sandbox.js";
|
|
2
|
+
import type { AgentRunner } from "./types.js";
|
|
3
|
+
export declare function getOrCreateRunner(sandboxConfig: SandboxConfig, channelId: string, channelDir: string): AgentRunner;
|
|
4
|
+
//# sourceMappingURL=runner-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner-factory.d.ts","sourceRoot":"","sources":["../../src/agent/runner-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAOlH"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ChannelRunner } from "./channel-runner.js";
|
|
2
|
+
const channelRunners = new Map();
|
|
3
|
+
export function getOrCreateRunner(sandboxConfig, channelId, channelDir) {
|
|
4
|
+
const existing = channelRunners.get(channelId);
|
|
5
|
+
if (existing)
|
|
6
|
+
return existing;
|
|
7
|
+
const runner = new ChannelRunner(sandboxConfig, channelId, channelDir);
|
|
8
|
+
channelRunners.set(channelId, runner);
|
|
9
|
+
return runner;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=runner-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner-factory.js","sourceRoot":"","sources":["../../src/agent/runner-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;AAEtD,MAAM,UAAU,iBAAiB,CAAC,aAA4B,EAAE,SAAiB,EAAE,UAAkB;IACpG,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACvE,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC;AACf,CAAC","sourcesContent":["import type { SandboxConfig } from \"../sandbox.js\";\nimport { ChannelRunner } from \"./channel-runner.js\";\nimport type { AgentRunner } from \"./types.js\";\n\nconst channelRunners = new Map<string, AgentRunner>();\n\nexport function getOrCreateRunner(sandboxConfig: SandboxConfig, channelId: string, channelDir: string): AgentRunner {\n\tconst existing = channelRunners.get(channelId);\n\tif (existing) return existing;\n\n\tconst runner = new ChannelRunner(sandboxConfig, channelId, channelDir);\n\tchannelRunners.set(channelId, runner);\n\treturn runner;\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MemoryLifecycle } from "../memory/lifecycle.js";
|
|
2
|
+
import type { DingTalkContext } from "../runtime/dingtalk.js";
|
|
3
|
+
import type { ChannelStore } from "../runtime/store.js";
|
|
4
|
+
import type { PendingTool, RunLogContext, RunQueue, RunState } from "./types.js";
|
|
5
|
+
export interface SessionEventHandlerContext {
|
|
6
|
+
ctx: DingTalkContext;
|
|
7
|
+
logCtx: RunLogContext;
|
|
8
|
+
queue: RunQueue;
|
|
9
|
+
pendingTools: Map<string, PendingTool>;
|
|
10
|
+
store: ChannelStore | null;
|
|
11
|
+
runState: RunState;
|
|
12
|
+
memoryLifecycle: MemoryLifecycle;
|
|
13
|
+
}
|
|
14
|
+
export declare function handleSessionEvent(event: unknown, context: SessionEventHandlerContext): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=session-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-events.d.ts","sourceRoot":"","sources":["../../src/agent/session-events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAsBxD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjF,MAAM,WAAW,0BAA0B;IAC1C,GAAG,EAAE,eAAe,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;CACjC;AAwCD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CA4N3G"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import * as log from "../log.js";
|
|
2
|
+
import { extractLabelFromArgs, truncate } from "../shared/text-utils.js";
|
|
3
|
+
import { isRecord } from "../shared/type-guards.js";
|
|
4
|
+
import { extractToolResultText, formatProgressEntry } from "./progress-formatter.js";
|
|
5
|
+
import { extractCustomCommandResultText, isAssistantEventMessage, isAutoCompactionEndEvent, isAutoCompactionStartEvent, isAutoRetryStartEvent, isMessageEndEvent, isMessageStartEvent, isSubAgentToolDetails, isTextPart, isThinkingPart, isToolExecutionEndEvent, isToolExecutionStartEvent, isToolExecutionUpdateEvent, isTurnEndEvent, } from "./type-guards.js";
|
|
6
|
+
function mergeSubAgentUsage(totalUsage, details) {
|
|
7
|
+
totalUsage.input += details.usage.input;
|
|
8
|
+
totalUsage.output += details.usage.output;
|
|
9
|
+
totalUsage.cacheRead += details.usage.cacheRead;
|
|
10
|
+
totalUsage.cacheWrite += details.usage.cacheWrite;
|
|
11
|
+
totalUsage.total += details.usage.total;
|
|
12
|
+
totalUsage.cost.input += details.usage.cost.input;
|
|
13
|
+
totalUsage.cost.output += details.usage.cost.output;
|
|
14
|
+
totalUsage.cost.cacheRead += details.usage.cost.cacheRead;
|
|
15
|
+
totalUsage.cost.cacheWrite += details.usage.cost.cacheWrite;
|
|
16
|
+
totalUsage.cost.total += details.usage.cost.total;
|
|
17
|
+
}
|
|
18
|
+
function mergeAssistantUsage(runState, usage) {
|
|
19
|
+
runState.totalUsage.input += usage.input;
|
|
20
|
+
runState.totalUsage.output += usage.output;
|
|
21
|
+
runState.totalUsage.cacheRead += usage.cacheRead;
|
|
22
|
+
runState.totalUsage.cacheWrite += usage.cacheWrite;
|
|
23
|
+
runState.totalUsage.total +=
|
|
24
|
+
usage.total ?? usage.totalTokens ?? usage.input + usage.output + usage.cacheRead + usage.cacheWrite;
|
|
25
|
+
runState.totalUsage.cost.input += usage.cost.input;
|
|
26
|
+
runState.totalUsage.cost.output += usage.cost.output;
|
|
27
|
+
runState.totalUsage.cost.cacheRead += usage.cost.cacheRead;
|
|
28
|
+
runState.totalUsage.cost.cacheWrite += usage.cost.cacheWrite;
|
|
29
|
+
runState.totalUsage.cost.total += usage.cost.total;
|
|
30
|
+
}
|
|
31
|
+
export async function handleSessionEvent(event, context) {
|
|
32
|
+
const { ctx, logCtx, queue, pendingTools, store, runState, memoryLifecycle } = context;
|
|
33
|
+
if (isToolExecutionStartEvent(event)) {
|
|
34
|
+
const label = extractLabelFromArgs(event.args) || event.toolName;
|
|
35
|
+
pendingTools.set(event.toolCallId, {
|
|
36
|
+
toolName: event.toolName,
|
|
37
|
+
args: event.args,
|
|
38
|
+
startTime: Date.now(),
|
|
39
|
+
});
|
|
40
|
+
memoryLifecycle.noteToolCall();
|
|
41
|
+
log.logToolStart(logCtx, event.toolName, label, isRecord(event.args) ? event.args : {});
|
|
42
|
+
queue.enqueue(() => ctx.respond(formatProgressEntry("tool", label), false), "tool label");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (isToolExecutionUpdateEvent(event)) {
|
|
46
|
+
if (event.toolName !== "subagent") {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const partialText = truncate(extractToolResultText(event.partialResult), 200);
|
|
50
|
+
if (!partialText.trim()) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
queue.enqueue(() => ctx.respond(formatProgressEntry("tool", partialText), false), "tool update");
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (isToolExecutionEndEvent(event)) {
|
|
57
|
+
const resultStr = extractToolResultText(event.result);
|
|
58
|
+
const pending = pendingTools.get(event.toolCallId);
|
|
59
|
+
pendingTools.delete(event.toolCallId);
|
|
60
|
+
const durationMs = pending ? Date.now() - pending.startTime : 0;
|
|
61
|
+
const subAgentDetails = event.toolName === "subagent" &&
|
|
62
|
+
isRecord(event.result) &&
|
|
63
|
+
"details" in event.result &&
|
|
64
|
+
isSubAgentToolDetails(event.result.details)
|
|
65
|
+
? event.result.details
|
|
66
|
+
: null;
|
|
67
|
+
if (subAgentDetails) {
|
|
68
|
+
mergeSubAgentUsage(runState.totalUsage, subAgentDetails);
|
|
69
|
+
const label = pending?.args &&
|
|
70
|
+
typeof pending.args === "object" &&
|
|
71
|
+
"label" in pending.args &&
|
|
72
|
+
typeof pending.args.label === "string"
|
|
73
|
+
? (pending.args.label ?? "subagent").trim()
|
|
74
|
+
: "subagent";
|
|
75
|
+
queue.enqueue(() => store?.logSubAgentRun(logCtx.channelId, {
|
|
76
|
+
date: new Date().toISOString(),
|
|
77
|
+
toolCallId: event.toolCallId,
|
|
78
|
+
label,
|
|
79
|
+
agent: subAgentDetails.agent,
|
|
80
|
+
source: subAgentDetails.source,
|
|
81
|
+
model: subAgentDetails.model,
|
|
82
|
+
tools: [...subAgentDetails.tools],
|
|
83
|
+
turns: subAgentDetails.turns,
|
|
84
|
+
toolCalls: subAgentDetails.toolCalls,
|
|
85
|
+
durationMs: subAgentDetails.durationMs,
|
|
86
|
+
failed: subAgentDetails.failed,
|
|
87
|
+
failureReason: subAgentDetails.failureReason,
|
|
88
|
+
output: resultStr.length > 16000 ? resultStr.slice(0, 16000) : resultStr,
|
|
89
|
+
outputTruncated: resultStr.length > 16000,
|
|
90
|
+
usage: {
|
|
91
|
+
...subAgentDetails.usage,
|
|
92
|
+
cost: { ...subAgentDetails.usage.cost },
|
|
93
|
+
},
|
|
94
|
+
}) ?? Promise.resolve(), "sub-agent run log");
|
|
95
|
+
}
|
|
96
|
+
const treatAsError = event.isError || Boolean(subAgentDetails?.failed);
|
|
97
|
+
if (treatAsError) {
|
|
98
|
+
log.logToolError(logCtx, event.toolName, durationMs, resultStr);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
log.logToolSuccess(logCtx, event.toolName, durationMs, resultStr);
|
|
102
|
+
}
|
|
103
|
+
if (treatAsError) {
|
|
104
|
+
queue.enqueue(() => ctx.respond(formatProgressEntry("error", truncate(resultStr, 200)), false), "tool error");
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (isMessageStartEvent(event)) {
|
|
109
|
+
if (isAssistantEventMessage(event.message)) {
|
|
110
|
+
log.logResponseStart(logCtx);
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (isMessageEndEvent(event)) {
|
|
115
|
+
const commandResultText = extractCustomCommandResultText(event.message);
|
|
116
|
+
if (commandResultText) {
|
|
117
|
+
runState.finalOutcome = { kind: "final", text: commandResultText };
|
|
118
|
+
log.logResponse(logCtx, commandResultText);
|
|
119
|
+
queue.enqueue(async () => {
|
|
120
|
+
const delivered = await ctx.respondPlain(commandResultText);
|
|
121
|
+
if (!delivered) {
|
|
122
|
+
await ctx.replaceMessage(commandResultText);
|
|
123
|
+
}
|
|
124
|
+
runState.finalResponseDelivered = true;
|
|
125
|
+
}, "command result");
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (isAssistantEventMessage(event.message)) {
|
|
129
|
+
const assistantMsg = event.message;
|
|
130
|
+
if (assistantMsg.stopReason) {
|
|
131
|
+
runState.stopReason = assistantMsg.stopReason;
|
|
132
|
+
}
|
|
133
|
+
if (assistantMsg.errorMessage) {
|
|
134
|
+
runState.errorMessage = assistantMsg.errorMessage;
|
|
135
|
+
}
|
|
136
|
+
if (assistantMsg.usage) {
|
|
137
|
+
mergeAssistantUsage(runState, assistantMsg.usage);
|
|
138
|
+
}
|
|
139
|
+
const thinkingParts = [];
|
|
140
|
+
const textParts = [];
|
|
141
|
+
let hasToolCalls = false;
|
|
142
|
+
for (const part of assistantMsg.content) {
|
|
143
|
+
if (isThinkingPart(part)) {
|
|
144
|
+
thinkingParts.push(part.thinking);
|
|
145
|
+
}
|
|
146
|
+
else if (isTextPart(part)) {
|
|
147
|
+
textParts.push(part.text);
|
|
148
|
+
}
|
|
149
|
+
else if (part.type === "toolCall") {
|
|
150
|
+
hasToolCalls = true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const text = textParts.join("\n");
|
|
154
|
+
for (const thinking of thinkingParts) {
|
|
155
|
+
log.logThinking(logCtx, thinking);
|
|
156
|
+
queue.enqueue(() => ctx.respond(formatProgressEntry("thinking", thinking), false), "thinking");
|
|
157
|
+
}
|
|
158
|
+
if (hasToolCalls && text.trim()) {
|
|
159
|
+
queue.enqueue(() => ctx.respond(formatProgressEntry("assistant", text), false), "assistant progress");
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (isTurnEndEvent(event)) {
|
|
165
|
+
if (isAssistantEventMessage(event.message) && event.toolResults.length === 0) {
|
|
166
|
+
if (event.message.stopReason === "error" || event.message.stopReason === "aborted") {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const finalText = event.message.content
|
|
170
|
+
.filter((part) => isTextPart(part))
|
|
171
|
+
.map((part) => part.text)
|
|
172
|
+
.join("\n");
|
|
173
|
+
const trimmedFinalText = finalText.trim();
|
|
174
|
+
if (!trimmedFinalText) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (trimmedFinalText === "[SILENT]" || trimmedFinalText.startsWith("[SILENT]")) {
|
|
178
|
+
runState.finalOutcome = { kind: "silent" };
|
|
179
|
+
memoryLifecycle.noteCompletedAssistantTurn();
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (runState.finalOutcome.kind === "final" && runState.finalOutcome.text.trim() === trimmedFinalText) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
runState.finalOutcome = { kind: "final", text: finalText };
|
|
186
|
+
memoryLifecycle.noteCompletedAssistantTurn();
|
|
187
|
+
log.logResponse(logCtx, finalText);
|
|
188
|
+
queue.enqueue(async () => {
|
|
189
|
+
const delivered = await ctx.respondPlain(finalText);
|
|
190
|
+
if (delivered) {
|
|
191
|
+
runState.finalResponseDelivered = true;
|
|
192
|
+
}
|
|
193
|
+
}, "final response");
|
|
194
|
+
}
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (isAutoCompactionStartEvent(event)) {
|
|
198
|
+
log.logInfo(`Auto-compaction started (reason: ${event.reason})`);
|
|
199
|
+
queue.enqueue(() => ctx.respond(formatProgressEntry("assistant", "Compacting context..."), false), "compaction start");
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (isAutoCompactionEndEvent(event)) {
|
|
203
|
+
if (event.result) {
|
|
204
|
+
log.logInfo(`Auto-compaction complete: ${event.result.tokensBefore} tokens compacted`);
|
|
205
|
+
}
|
|
206
|
+
else if (event.aborted) {
|
|
207
|
+
log.logInfo("Auto-compaction aborted");
|
|
208
|
+
}
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (isAutoRetryStartEvent(event)) {
|
|
212
|
+
log.logWarning(`Retrying (${event.attempt}/${event.maxAttempts})`, event.errorMessage);
|
|
213
|
+
queue.enqueue(() => ctx.respond(formatProgressEntry("assistant", `Retrying (${event.attempt}/${event.maxAttempts})...`), false), "retry");
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=session-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-events.js","sourceRoot":"","sources":["../../src/agent/session-events.ts"],"names":[],"mappings":"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","sourcesContent":["import * as log from \"../log.js\";\nimport type { MemoryLifecycle } from \"../memory/lifecycle.js\";\nimport type { DingTalkContext } from \"../runtime/dingtalk.js\";\nimport type { ChannelStore } from \"../runtime/store.js\";\nimport { extractLabelFromArgs, truncate } from \"../shared/text-utils.js\";\nimport { isRecord } from \"../shared/type-guards.js\";\nimport type { UsageTotals } from \"../shared/types.js\";\nimport type { SubAgentToolDetails } from \"../subagents/tool.js\";\nimport { extractToolResultText, formatProgressEntry } from \"./progress-formatter.js\";\nimport {\n\textractCustomCommandResultText,\n\tisAssistantEventMessage,\n\tisAutoCompactionEndEvent,\n\tisAutoCompactionStartEvent,\n\tisAutoRetryStartEvent,\n\tisMessageEndEvent,\n\tisMessageStartEvent,\n\tisSubAgentToolDetails,\n\tisTextPart,\n\tisThinkingPart,\n\tisToolExecutionEndEvent,\n\tisToolExecutionStartEvent,\n\tisToolExecutionUpdateEvent,\n\tisTurnEndEvent,\n} from \"./type-guards.js\";\nimport type { PendingTool, RunLogContext, RunQueue, RunState } from \"./types.js\";\n\nexport interface SessionEventHandlerContext {\n\tctx: DingTalkContext;\n\tlogCtx: RunLogContext;\n\tqueue: RunQueue;\n\tpendingTools: Map<string, PendingTool>;\n\tstore: ChannelStore | null;\n\trunState: RunState;\n\tmemoryLifecycle: MemoryLifecycle;\n}\n\nfunction mergeSubAgentUsage(totalUsage: UsageTotals, details: SubAgentToolDetails): void {\n\ttotalUsage.input += details.usage.input;\n\ttotalUsage.output += details.usage.output;\n\ttotalUsage.cacheRead += details.usage.cacheRead;\n\ttotalUsage.cacheWrite += details.usage.cacheWrite;\n\ttotalUsage.total += details.usage.total;\n\ttotalUsage.cost.input += details.usage.cost.input;\n\ttotalUsage.cost.output += details.usage.cost.output;\n\ttotalUsage.cost.cacheRead += details.usage.cost.cacheRead;\n\ttotalUsage.cost.cacheWrite += details.usage.cost.cacheWrite;\n\ttotalUsage.cost.total += details.usage.cost.total;\n}\n\nfunction mergeAssistantUsage(\n\trunState: RunState,\n\tusage: NonNullable<Extract<unknown, unknown>> & {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t\ttotal?: number;\n\t\ttotalTokens?: number;\n\t\tcost: { input: number; output: number; cacheRead: number; cacheWrite: number; total: number };\n\t},\n): void {\n\trunState.totalUsage.input += usage.input;\n\trunState.totalUsage.output += usage.output;\n\trunState.totalUsage.cacheRead += usage.cacheRead;\n\trunState.totalUsage.cacheWrite += usage.cacheWrite;\n\trunState.totalUsage.total +=\n\t\tusage.total ?? usage.totalTokens ?? usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n\trunState.totalUsage.cost.input += usage.cost.input;\n\trunState.totalUsage.cost.output += usage.cost.output;\n\trunState.totalUsage.cost.cacheRead += usage.cost.cacheRead;\n\trunState.totalUsage.cost.cacheWrite += usage.cost.cacheWrite;\n\trunState.totalUsage.cost.total += usage.cost.total;\n}\n\nexport async function handleSessionEvent(event: unknown, context: SessionEventHandlerContext): Promise<void> {\n\tconst { ctx, logCtx, queue, pendingTools, store, runState, memoryLifecycle } = context;\n\n\tif (isToolExecutionStartEvent(event)) {\n\t\tconst label = extractLabelFromArgs(event.args) || event.toolName;\n\n\t\tpendingTools.set(event.toolCallId, {\n\t\t\ttoolName: event.toolName,\n\t\t\targs: event.args,\n\t\t\tstartTime: Date.now(),\n\t\t});\n\t\tmemoryLifecycle.noteToolCall();\n\n\t\tlog.logToolStart(logCtx, event.toolName, label, isRecord(event.args) ? event.args : {});\n\t\tqueue.enqueue(() => ctx.respond(formatProgressEntry(\"tool\", label), false), \"tool label\");\n\t\treturn;\n\t}\n\n\tif (isToolExecutionUpdateEvent(event)) {\n\t\tif (event.toolName !== \"subagent\") {\n\t\t\treturn;\n\t\t}\n\t\tconst partialText = truncate(extractToolResultText(event.partialResult), 200);\n\t\tif (!partialText.trim()) {\n\t\t\treturn;\n\t\t}\n\t\tqueue.enqueue(() => ctx.respond(formatProgressEntry(\"tool\", partialText), false), \"tool update\");\n\t\treturn;\n\t}\n\n\tif (isToolExecutionEndEvent(event)) {\n\t\tconst resultStr = extractToolResultText(event.result);\n\t\tconst pending = pendingTools.get(event.toolCallId);\n\t\tpendingTools.delete(event.toolCallId);\n\n\t\tconst durationMs = pending ? Date.now() - pending.startTime : 0;\n\t\tconst subAgentDetails =\n\t\t\tevent.toolName === \"subagent\" &&\n\t\t\tisRecord(event.result) &&\n\t\t\t\"details\" in event.result &&\n\t\t\tisSubAgentToolDetails((event.result as { details?: unknown }).details)\n\t\t\t\t? (event.result as { details: SubAgentToolDetails }).details\n\t\t\t\t: null;\n\n\t\tif (subAgentDetails) {\n\t\t\tmergeSubAgentUsage(runState.totalUsage, subAgentDetails);\n\t\t\tconst label =\n\t\t\t\tpending?.args &&\n\t\t\t\ttypeof pending.args === \"object\" &&\n\t\t\t\t\"label\" in pending.args &&\n\t\t\t\ttypeof (pending.args as { label?: unknown }).label === \"string\"\n\t\t\t\t\t? ((pending.args as { label: string }).label ?? \"subagent\").trim()\n\t\t\t\t\t: \"subagent\";\n\t\t\tqueue.enqueue(\n\t\t\t\t() =>\n\t\t\t\t\tstore?.logSubAgentRun(logCtx.channelId, {\n\t\t\t\t\t\tdate: new Date().toISOString(),\n\t\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\t\tlabel,\n\t\t\t\t\t\tagent: subAgentDetails.agent,\n\t\t\t\t\t\tsource: subAgentDetails.source,\n\t\t\t\t\t\tmodel: subAgentDetails.model,\n\t\t\t\t\t\ttools: [...subAgentDetails.tools],\n\t\t\t\t\t\tturns: subAgentDetails.turns,\n\t\t\t\t\t\ttoolCalls: subAgentDetails.toolCalls,\n\t\t\t\t\t\tdurationMs: subAgentDetails.durationMs,\n\t\t\t\t\t\tfailed: subAgentDetails.failed,\n\t\t\t\t\t\tfailureReason: subAgentDetails.failureReason,\n\t\t\t\t\t\toutput: resultStr.length > 16000 ? resultStr.slice(0, 16000) : resultStr,\n\t\t\t\t\t\toutputTruncated: resultStr.length > 16000,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\t...subAgentDetails.usage,\n\t\t\t\t\t\t\tcost: { ...subAgentDetails.usage.cost },\n\t\t\t\t\t\t},\n\t\t\t\t\t}) ?? Promise.resolve(),\n\t\t\t\t\"sub-agent run log\",\n\t\t\t);\n\t\t}\n\n\t\tconst treatAsError = event.isError || Boolean(subAgentDetails?.failed);\n\t\tif (treatAsError) {\n\t\t\tlog.logToolError(logCtx, event.toolName, durationMs, resultStr);\n\t\t} else {\n\t\t\tlog.logToolSuccess(logCtx, event.toolName, durationMs, resultStr);\n\t\t}\n\n\t\tif (treatAsError) {\n\t\t\tqueue.enqueue(() => ctx.respond(formatProgressEntry(\"error\", truncate(resultStr, 200)), false), \"tool error\");\n\t\t}\n\t\treturn;\n\t}\n\n\tif (isMessageStartEvent(event)) {\n\t\tif (isAssistantEventMessage(event.message)) {\n\t\t\tlog.logResponseStart(logCtx);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (isMessageEndEvent(event)) {\n\t\tconst commandResultText = extractCustomCommandResultText(event.message);\n\t\tif (commandResultText) {\n\t\t\trunState.finalOutcome = { kind: \"final\", text: commandResultText };\n\t\t\tlog.logResponse(logCtx, commandResultText);\n\t\t\tqueue.enqueue(async () => {\n\t\t\t\tconst delivered = await ctx.respondPlain(commandResultText);\n\t\t\t\tif (!delivered) {\n\t\t\t\t\tawait ctx.replaceMessage(commandResultText);\n\t\t\t\t}\n\t\t\t\trunState.finalResponseDelivered = true;\n\t\t\t}, \"command result\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (isAssistantEventMessage(event.message)) {\n\t\t\tconst assistantMsg = event.message;\n\n\t\t\tif (assistantMsg.stopReason) {\n\t\t\t\trunState.stopReason = assistantMsg.stopReason;\n\t\t\t}\n\t\t\tif (assistantMsg.errorMessage) {\n\t\t\t\trunState.errorMessage = assistantMsg.errorMessage;\n\t\t\t}\n\n\t\t\tif (assistantMsg.usage) {\n\t\t\t\tmergeAssistantUsage(runState, assistantMsg.usage);\n\t\t\t}\n\n\t\t\tconst thinkingParts: string[] = [];\n\t\t\tconst textParts: string[] = [];\n\t\t\tlet hasToolCalls = false;\n\t\t\tfor (const part of assistantMsg.content) {\n\t\t\t\tif (isThinkingPart(part)) {\n\t\t\t\t\tthinkingParts.push(part.thinking);\n\t\t\t\t} else if (isTextPart(part)) {\n\t\t\t\t\ttextParts.push(part.text);\n\t\t\t\t} else if (part.type === \"toolCall\") {\n\t\t\t\t\thasToolCalls = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst text = textParts.join(\"\\n\");\n\n\t\t\tfor (const thinking of thinkingParts) {\n\t\t\t\tlog.logThinking(logCtx, thinking);\n\t\t\t\tqueue.enqueue(() => ctx.respond(formatProgressEntry(\"thinking\", thinking), false), \"thinking\");\n\t\t\t}\n\n\t\t\tif (hasToolCalls && text.trim()) {\n\t\t\t\tqueue.enqueue(() => ctx.respond(formatProgressEntry(\"assistant\", text), false), \"assistant progress\");\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\tif (isTurnEndEvent(event)) {\n\t\tif (isAssistantEventMessage(event.message) && event.toolResults.length === 0) {\n\t\t\tif (event.message.stopReason === \"error\" || event.message.stopReason === \"aborted\") {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst finalText = event.message.content\n\t\t\t\t.filter((part): part is { type: \"text\"; text: string } => isTextPart(part))\n\t\t\t\t.map((part) => part.text)\n\t\t\t\t.join(\"\\n\");\n\n\t\t\tconst trimmedFinalText = finalText.trim();\n\t\t\tif (!trimmedFinalText) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (trimmedFinalText === \"[SILENT]\" || trimmedFinalText.startsWith(\"[SILENT]\")) {\n\t\t\t\trunState.finalOutcome = { kind: \"silent\" };\n\t\t\t\tmemoryLifecycle.noteCompletedAssistantTurn();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (runState.finalOutcome.kind === \"final\" && runState.finalOutcome.text.trim() === trimmedFinalText) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trunState.finalOutcome = { kind: \"final\", text: finalText };\n\t\t\tmemoryLifecycle.noteCompletedAssistantTurn();\n\t\t\tlog.logResponse(logCtx, finalText);\n\t\t\tqueue.enqueue(async () => {\n\t\t\t\tconst delivered = await ctx.respondPlain(finalText);\n\t\t\t\tif (delivered) {\n\t\t\t\t\trunState.finalResponseDelivered = true;\n\t\t\t\t}\n\t\t\t}, \"final response\");\n\t\t}\n\t\treturn;\n\t}\n\n\tif (isAutoCompactionStartEvent(event)) {\n\t\tlog.logInfo(`Auto-compaction started (reason: ${event.reason})`);\n\t\tqueue.enqueue(\n\t\t\t() => ctx.respond(formatProgressEntry(\"assistant\", \"Compacting context...\"), false),\n\t\t\t\"compaction start\",\n\t\t);\n\t\treturn;\n\t}\n\n\tif (isAutoCompactionEndEvent(event)) {\n\t\tif (event.result) {\n\t\t\tlog.logInfo(`Auto-compaction complete: ${event.result.tokensBefore} tokens compacted`);\n\t\t} else if (event.aborted) {\n\t\t\tlog.logInfo(\"Auto-compaction aborted\");\n\t\t}\n\t\treturn;\n\t}\n\n\tif (isAutoRetryStartEvent(event)) {\n\t\tlog.logWarning(`Retrying (${event.attempt}/${event.maxAttempts})`, event.errorMessage);\n\t\tqueue.enqueue(\n\t\t\t() =>\n\t\t\t\tctx.respond(formatProgressEntry(\"assistant\", `Retrying (${event.attempt}/${event.maxAttempts})...`), false),\n\t\t\t\"retry\",\n\t\t);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { SubAgentToolDetails } from "../subagents/tool.js";
|
|
2
|
+
import type { AssistantContentPart, AssistantEventMessage, AssistantUsageMessage, AutoCompactionEndEvent, AutoCompactionStartEvent, AutoRetryStartEvent, MessageEndEvent, MessageStartEvent, ToolExecutionEndEvent, ToolExecutionStartEvent, ToolExecutionUpdateEvent, TurnEndEvent } from "./types.js";
|
|
3
|
+
export declare function isAssistantEventMessage(value: unknown): value is AssistantEventMessage;
|
|
4
|
+
export declare function isAssistantUsageMessage(value: unknown): value is AssistantUsageMessage;
|
|
5
|
+
export declare function getLastAssistantUsage(messages: readonly unknown[]): AssistantUsageMessage | null;
|
|
6
|
+
export declare function isThinkingPart(part: AssistantContentPart): part is Extract<AssistantContentPart, {
|
|
7
|
+
type: "thinking";
|
|
8
|
+
}>;
|
|
9
|
+
export declare function isTextPart(part: AssistantContentPart): part is Extract<AssistantContentPart, {
|
|
10
|
+
type: "text";
|
|
11
|
+
}>;
|
|
12
|
+
export declare function isToolExecutionStartEvent(value: unknown): value is ToolExecutionStartEvent;
|
|
13
|
+
export declare function isToolExecutionUpdateEvent(value: unknown): value is ToolExecutionUpdateEvent;
|
|
14
|
+
export declare function isToolExecutionEndEvent(value: unknown): value is ToolExecutionEndEvent;
|
|
15
|
+
export declare function isMessageStartEvent(value: unknown): value is MessageStartEvent;
|
|
16
|
+
export declare function isMessageEndEvent(value: unknown): value is MessageEndEvent;
|
|
17
|
+
export declare function isTurnEndEvent(value: unknown): value is TurnEndEvent;
|
|
18
|
+
export declare function isAutoCompactionStartEvent(value: unknown): value is AutoCompactionStartEvent;
|
|
19
|
+
export declare function isAutoCompactionEndEvent(value: unknown): value is AutoCompactionEndEvent;
|
|
20
|
+
export declare function isAutoRetryStartEvent(value: unknown): value is AutoRetryStartEvent;
|
|
21
|
+
export declare function isSubAgentToolDetails(value: unknown): value is SubAgentToolDetails;
|
|
22
|
+
export declare function extractCustomCommandResultText(message: unknown): string | null;
|
|
23
|
+
//# sourceMappingURL=type-guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-guards.d.ts","sourceRoot":"","sources":["../../src/agent/type-guards.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EACX,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EAEjB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,YAAY,EACZ,MAAM,YAAY,CAAC;AAMpB,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAItF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAgBtF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,qBAAqB,GAAG,IAAI,CAShG;AAED,wBAAgB,cAAc,CAC7B,IAAI,EAAE,oBAAoB,GACxB,IAAI,IAAI,OAAO,CAAC,oBAAoB,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAE7D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,IAAI,OAAO,CAAC,oBAAoB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAE9G;AASD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,uBAAuB,CAM1F;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,wBAAwB,CAM5F;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAOtF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,wBAAwB,CAE5F;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,sBAAsB,CAExF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAOlF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAmBlF;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAc9E"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { COMMAND_RESULT_CUSTOM_TYPE } from "../command-extension.js";
|
|
2
|
+
import { isRecord } from "../shared/type-guards.js";
|
|
3
|
+
function isMessageWithRole(value) {
|
|
4
|
+
return isRecord(value) && typeof value.role === "string";
|
|
5
|
+
}
|
|
6
|
+
export function isAssistantEventMessage(value) {
|
|
7
|
+
return (isMessageWithRole(value) && value.role === "assistant" && Array.isArray(value.content));
|
|
8
|
+
}
|
|
9
|
+
export function isAssistantUsageMessage(value) {
|
|
10
|
+
if (!isMessageWithRole(value) || value.role !== "assistant" || !("usage" in value) || !isRecord(value.usage)) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
return (typeof value.usage.input === "number" &&
|
|
14
|
+
typeof value.usage.output === "number" &&
|
|
15
|
+
typeof value.usage.cacheRead === "number" &&
|
|
16
|
+
typeof value.usage.cacheWrite === "number" &&
|
|
17
|
+
isRecord(value.usage.cost) &&
|
|
18
|
+
typeof value.usage.cost.input === "number" &&
|
|
19
|
+
typeof value.usage.cost.output === "number" &&
|
|
20
|
+
typeof value.usage.cost.cacheRead === "number" &&
|
|
21
|
+
typeof value.usage.cost.cacheWrite === "number" &&
|
|
22
|
+
typeof value.usage.cost.total === "number");
|
|
23
|
+
}
|
|
24
|
+
export function getLastAssistantUsage(messages) {
|
|
25
|
+
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
26
|
+
const message = messages[index];
|
|
27
|
+
if (isAssistantUsageMessage(message) && message.stopReason !== "aborted") {
|
|
28
|
+
return message;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
export function isThinkingPart(part) {
|
|
34
|
+
return part.type === "thinking" && typeof part.thinking === "string";
|
|
35
|
+
}
|
|
36
|
+
export function isTextPart(part) {
|
|
37
|
+
return part.type === "text" && typeof part.text === "string";
|
|
38
|
+
}
|
|
39
|
+
function hasEventType(value, type) {
|
|
40
|
+
return isRecord(value) && value.type === type;
|
|
41
|
+
}
|
|
42
|
+
export function isToolExecutionStartEvent(value) {
|
|
43
|
+
return (hasEventType(value, "tool_execution_start") &&
|
|
44
|
+
typeof value.toolCallId === "string" &&
|
|
45
|
+
typeof value.toolName === "string");
|
|
46
|
+
}
|
|
47
|
+
export function isToolExecutionUpdateEvent(value) {
|
|
48
|
+
return (hasEventType(value, "tool_execution_update") &&
|
|
49
|
+
typeof value.toolCallId === "string" &&
|
|
50
|
+
typeof value.toolName === "string");
|
|
51
|
+
}
|
|
52
|
+
export function isToolExecutionEndEvent(value) {
|
|
53
|
+
return (hasEventType(value, "tool_execution_end") &&
|
|
54
|
+
typeof value.toolCallId === "string" &&
|
|
55
|
+
typeof value.toolName === "string" &&
|
|
56
|
+
typeof value.isError === "boolean");
|
|
57
|
+
}
|
|
58
|
+
export function isMessageStartEvent(value) {
|
|
59
|
+
return hasEventType(value, "message_start") && "message" in value;
|
|
60
|
+
}
|
|
61
|
+
export function isMessageEndEvent(value) {
|
|
62
|
+
return hasEventType(value, "message_end") && "message" in value;
|
|
63
|
+
}
|
|
64
|
+
export function isTurnEndEvent(value) {
|
|
65
|
+
return hasEventType(value, "turn_end") && "message" in value && Array.isArray(value.toolResults);
|
|
66
|
+
}
|
|
67
|
+
export function isAutoCompactionStartEvent(value) {
|
|
68
|
+
return hasEventType(value, "auto_compaction_start") && (value.reason === "threshold" || value.reason === "overflow");
|
|
69
|
+
}
|
|
70
|
+
export function isAutoCompactionEndEvent(value) {
|
|
71
|
+
return hasEventType(value, "auto_compaction_end");
|
|
72
|
+
}
|
|
73
|
+
export function isAutoRetryStartEvent(value) {
|
|
74
|
+
return (hasEventType(value, "auto_retry_start") &&
|
|
75
|
+
typeof value.attempt === "number" &&
|
|
76
|
+
typeof value.maxAttempts === "number" &&
|
|
77
|
+
typeof value.errorMessage === "string");
|
|
78
|
+
}
|
|
79
|
+
export function isSubAgentToolDetails(value) {
|
|
80
|
+
if (!value || typeof value !== "object" || !("kind" in value) || value.kind !== "subagent") {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (!("usage" in value)) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
const usage = value.usage;
|
|
87
|
+
return (!!usage &&
|
|
88
|
+
typeof usage === "object" &&
|
|
89
|
+
"input" in usage &&
|
|
90
|
+
"output" in usage &&
|
|
91
|
+
"cacheRead" in usage &&
|
|
92
|
+
"cacheWrite" in usage &&
|
|
93
|
+
"cost" in usage);
|
|
94
|
+
}
|
|
95
|
+
export function extractCustomCommandResultText(message) {
|
|
96
|
+
if (!message ||
|
|
97
|
+
typeof message !== "object" ||
|
|
98
|
+
!("role" in message) ||
|
|
99
|
+
!("customType" in message) ||
|
|
100
|
+
message.role !== "custom" ||
|
|
101
|
+
message.customType !== COMMAND_RESULT_CUSTOM_TYPE) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const content = message.content;
|
|
105
|
+
return typeof content === "string" && content.trim() ? content : null;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=type-guards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-guards.js","sourceRoot":"","sources":["../../src/agent/type-guards.ts"],"names":[],"mappings":"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","sourcesContent":["import { COMMAND_RESULT_CUSTOM_TYPE } from \"../command-extension.js\";\nimport { isRecord } from \"../shared/type-guards.js\";\nimport type { SubAgentToolDetails } from \"../subagents/tool.js\";\nimport type {\n\tAssistantContentPart,\n\tAssistantEventMessage,\n\tAssistantUsageMessage,\n\tAutoCompactionEndEvent,\n\tAutoCompactionStartEvent,\n\tAutoRetryStartEvent,\n\tMessageEndEvent,\n\tMessageStartEvent,\n\tSessionEvent,\n\tToolExecutionEndEvent,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tTurnEndEvent,\n} from \"./types.js\";\n\nfunction isMessageWithRole(value: unknown): value is { role: string } {\n\treturn isRecord(value) && typeof value.role === \"string\";\n}\n\nexport function isAssistantEventMessage(value: unknown): value is AssistantEventMessage {\n\treturn (\n\t\tisMessageWithRole(value) && value.role === \"assistant\" && Array.isArray((value as { content?: unknown }).content)\n\t);\n}\n\nexport function isAssistantUsageMessage(value: unknown): value is AssistantUsageMessage {\n\tif (!isMessageWithRole(value) || value.role !== \"assistant\" || !(\"usage\" in value) || !isRecord(value.usage)) {\n\t\treturn false;\n\t}\n\treturn (\n\t\ttypeof value.usage.input === \"number\" &&\n\t\ttypeof value.usage.output === \"number\" &&\n\t\ttypeof value.usage.cacheRead === \"number\" &&\n\t\ttypeof value.usage.cacheWrite === \"number\" &&\n\t\tisRecord(value.usage.cost) &&\n\t\ttypeof value.usage.cost.input === \"number\" &&\n\t\ttypeof value.usage.cost.output === \"number\" &&\n\t\ttypeof value.usage.cost.cacheRead === \"number\" &&\n\t\ttypeof value.usage.cost.cacheWrite === \"number\" &&\n\t\ttypeof value.usage.cost.total === \"number\"\n\t);\n}\n\nexport function getLastAssistantUsage(messages: readonly unknown[]): AssistantUsageMessage | null {\n\tfor (let index = messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = messages[index];\n\t\tif (isAssistantUsageMessage(message) && message.stopReason !== \"aborted\") {\n\t\t\treturn message;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport function isThinkingPart(\n\tpart: AssistantContentPart,\n): part is Extract<AssistantContentPart, { type: \"thinking\" }> {\n\treturn part.type === \"thinking\" && typeof (part as { thinking?: unknown }).thinking === \"string\";\n}\n\nexport function isTextPart(part: AssistantContentPart): part is Extract<AssistantContentPart, { type: \"text\" }> {\n\treturn part.type === \"text\" && typeof (part as { text?: unknown }).text === \"string\";\n}\n\nfunction hasEventType(\n\tvalue: unknown,\n\ttype: SessionEvent[\"type\"],\n): value is { type: SessionEvent[\"type\"] } & Record<string, unknown> {\n\treturn isRecord(value) && value.type === type;\n}\n\nexport function isToolExecutionStartEvent(value: unknown): value is ToolExecutionStartEvent {\n\treturn (\n\t\thasEventType(value, \"tool_execution_start\") &&\n\t\ttypeof value.toolCallId === \"string\" &&\n\t\ttypeof value.toolName === \"string\"\n\t);\n}\n\nexport function isToolExecutionUpdateEvent(value: unknown): value is ToolExecutionUpdateEvent {\n\treturn (\n\t\thasEventType(value, \"tool_execution_update\") &&\n\t\ttypeof value.toolCallId === \"string\" &&\n\t\ttypeof value.toolName === \"string\"\n\t);\n}\n\nexport function isToolExecutionEndEvent(value: unknown): value is ToolExecutionEndEvent {\n\treturn (\n\t\thasEventType(value, \"tool_execution_end\") &&\n\t\ttypeof value.toolCallId === \"string\" &&\n\t\ttypeof value.toolName === \"string\" &&\n\t\ttypeof value.isError === \"boolean\"\n\t);\n}\n\nexport function isMessageStartEvent(value: unknown): value is MessageStartEvent {\n\treturn hasEventType(value, \"message_start\") && \"message\" in value;\n}\n\nexport function isMessageEndEvent(value: unknown): value is MessageEndEvent {\n\treturn hasEventType(value, \"message_end\") && \"message\" in value;\n}\n\nexport function isTurnEndEvent(value: unknown): value is TurnEndEvent {\n\treturn hasEventType(value, \"turn_end\") && \"message\" in value && Array.isArray(value.toolResults);\n}\n\nexport function isAutoCompactionStartEvent(value: unknown): value is AutoCompactionStartEvent {\n\treturn hasEventType(value, \"auto_compaction_start\") && (value.reason === \"threshold\" || value.reason === \"overflow\");\n}\n\nexport function isAutoCompactionEndEvent(value: unknown): value is AutoCompactionEndEvent {\n\treturn hasEventType(value, \"auto_compaction_end\");\n}\n\nexport function isAutoRetryStartEvent(value: unknown): value is AutoRetryStartEvent {\n\treturn (\n\t\thasEventType(value, \"auto_retry_start\") &&\n\t\ttypeof value.attempt === \"number\" &&\n\t\ttypeof value.maxAttempts === \"number\" &&\n\t\ttypeof value.errorMessage === \"string\"\n\t);\n}\n\nexport function isSubAgentToolDetails(value: unknown): value is SubAgentToolDetails {\n\tif (!value || typeof value !== \"object\" || !(\"kind\" in value) || (value as { kind?: unknown }).kind !== \"subagent\") {\n\t\treturn false;\n\t}\n\n\tif (!(\"usage\" in value)) {\n\t\treturn false;\n\t}\n\n\tconst usage = (value as { usage?: unknown }).usage;\n\treturn (\n\t\t!!usage &&\n\t\ttypeof usage === \"object\" &&\n\t\t\"input\" in usage &&\n\t\t\"output\" in usage &&\n\t\t\"cacheRead\" in usage &&\n\t\t\"cacheWrite\" in usage &&\n\t\t\"cost\" in usage\n\t);\n}\n\nexport function extractCustomCommandResultText(message: unknown): string | null {\n\tif (\n\t\t!message ||\n\t\ttypeof message !== \"object\" ||\n\t\t!(\"role\" in message) ||\n\t\t!(\"customType\" in message) ||\n\t\t(message as { role?: unknown }).role !== \"custom\" ||\n\t\t(message as { customType?: unknown }).customType !== COMMAND_RESULT_CUSTOM_TYPE\n\t) {\n\t\treturn null;\n\t}\n\n\tconst content = (message as { content?: unknown }).content;\n\treturn typeof content === \"string\" && content.trim() ? content : null;\n}\n"]}
|