pi-shadow-mind 0.1.10 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/DESIGN.md +11 -10
  2. package/LICENSE +21 -0
  3. package/README.md +176 -26
  4. package/dist/index.js +6477 -7204
  5. package/dist/index.js.map +4 -4
  6. package/package.json +11 -3
  7. package/dist/config.d.ts +0 -18
  8. package/dist/config.js +0 -132
  9. package/dist/config.js.map +0 -1
  10. package/dist/entity-store.d.ts +0 -22
  11. package/dist/entity-store.js +0 -71
  12. package/dist/entity-store.js.map +0 -1
  13. package/dist/management-tools.d.ts +0 -4
  14. package/dist/management-tools.js +0 -130
  15. package/dist/management-tools.js.map +0 -1
  16. package/dist/protocol.d.ts +0 -3
  17. package/dist/protocol.js +0 -15
  18. package/dist/protocol.js.map +0 -1
  19. package/dist/random.d.ts +0 -2
  20. package/dist/random.js +0 -14
  21. package/dist/random.js.map +0 -1
  22. package/dist/registry.d.ts +0 -9
  23. package/dist/registry.js +0 -139
  24. package/dist/registry.js.map +0 -1
  25. package/dist/report-batcher.d.ts +0 -15
  26. package/dist/report-batcher.js +0 -49
  27. package/dist/report-batcher.js.map +0 -1
  28. package/dist/runtime.d.ts +0 -37
  29. package/dist/runtime.js +0 -290
  30. package/dist/runtime.js.map +0 -1
  31. package/dist/scheduler.d.ts +0 -10
  32. package/dist/scheduler.js +0 -46
  33. package/dist/scheduler.js.map +0 -1
  34. package/dist/session-lifetime.d.ts +0 -8
  35. package/dist/session-lifetime.js +0 -31
  36. package/dist/session-lifetime.js.map +0 -1
  37. package/dist/shadow-runner.d.ts +0 -93
  38. package/dist/shadow-runner.js +0 -248
  39. package/dist/shadow-runner.js.map +0 -1
  40. package/dist/shutdown-drain.d.ts +0 -12
  41. package/dist/shutdown-drain.js +0 -22
  42. package/dist/shutdown-drain.js.map +0 -1
  43. package/dist/summaries.d.ts +0 -9
  44. package/dist/summaries.js +0 -56
  45. package/dist/summaries.js.map +0 -1
  46. package/dist/trajectory.d.ts +0 -8
  47. package/dist/trajectory.js +0 -107
  48. package/dist/trajectory.js.map +0 -1
  49. package/dist/types.d.ts +0 -64
  50. package/dist/types.js +0 -2
  51. package/dist/types.js.map +0 -1
  52. package/dist/validation.d.ts +0 -8
  53. package/dist/validation.js +0 -18
  54. package/dist/validation.js.map +0 -1
@@ -1,31 +0,0 @@
1
- const STALE_CONTEXT_MARKER = "This extension ctx is stale after session replacement or reload";
2
- export class SessionLifetime {
3
- active = false;
4
- activate() {
5
- this.active = true;
6
- }
7
- deactivate() {
8
- this.active = false;
9
- }
10
- get isActive() {
11
- return this.active;
12
- }
13
- run(action) {
14
- if (!this.active)
15
- return false;
16
- try {
17
- action();
18
- return true;
19
- }
20
- catch (error) {
21
- if (!isStaleExtensionContextError(error))
22
- throw error;
23
- this.active = false;
24
- return false;
25
- }
26
- }
27
- }
28
- export function isStaleExtensionContextError(error) {
29
- return error instanceof Error && error.message.includes(STALE_CONTEXT_MARKER);
30
- }
31
- //# sourceMappingURL=session-lifetime.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-lifetime.js","sourceRoot":"","sources":["../src/session-lifetime.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,iEAAiE,CAAC;AAE/F,MAAM,OAAO,eAAe;IAClB,MAAM,GAAG,KAAK,CAAC;IAEvB,QAAQ;QACN,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,MAAkB;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YACtD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAc;IACzD,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AAChF,CAAC"}
@@ -1,93 +0,0 @@
1
- import { createAgentSession } from "@earendil-works/pi-coding-agent";
2
- import type { Model } from "@earendil-works/pi-ai";
3
- import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
4
- import type { ShadowConfig, ShadowDefinition, ShadowReport } from "./types.js";
5
- /**
6
- * Resolve the final tool allowlist for a Shadow run against the main session's
7
- * tool registry, per the design contract:
8
- *
9
- * - the final set is `readOnlyTools defaults + whitelist + report_to_main`;
10
- * - names that do not exist in the main session are dropped (ignored) and
11
- * returned as `missing`, while the rest are provided normally;
12
- * - the built-in `report_to_main` is always kept.
13
- */
14
- export declare function resolveShadowTools(whitelist: readonly string[], available: ReadonlySet<string>, defaults?: readonly string[]): {
15
- tools: string[];
16
- missing: string[];
17
- };
18
- export interface ShadowRunRequest {
19
- shadow: ShadowDefinition;
20
- config: ShadowConfig;
21
- epoch: number;
22
- runId: string;
23
- cwd: string;
24
- agentDir: string;
25
- mainSystemPrompt: string;
26
- messages: readonly Record<string, unknown>[];
27
- mainModel: Model<any>;
28
- /** Final tool allowlist, already resolved against the main session registry. */
29
- tools: string[];
30
- resolveModel(fullModelId: string): Model<any> | undefined;
31
- /** Optional auth check for explicitly configured shadow models (runtime supplies it). */
32
- modelAuthOk?(model: Model<any>): boolean;
33
- /** The main session's effective thinking level at activation, used as the final fallback. */
34
- mainThinkingLevel?: ThinkingLevel;
35
- onReport(report: ShadowReport): void;
36
- }
37
- export interface ToolStat {
38
- tool: string;
39
- calls: number;
40
- failures: number;
41
- }
42
- export interface ShadowRunResult {
43
- reason: "report" | "silent" | "timeout" | "aborted" | "error";
44
- error?: string;
45
- durationMs: number;
46
- toolNames: string[];
47
- /** Requested tools that did not materialize in the shadow session. */
48
- missingTools: string[];
49
- toolCalls: number;
50
- toolFailures: number;
51
- /** Per-tool usage summary (called tools only). */
52
- toolStats: ToolStat[];
53
- /** The thinking level actually used for this run (after fallback resolution). */
54
- thinkingLevel?: string;
55
- sessionFile?: string;
56
- }
57
- type ShadowSession = Awaited<ReturnType<typeof createAgentSession>>["session"];
58
- /** Unify the three run() return paths so result shape changes touch one place. */
59
- export declare function buildRunResult(options: {
60
- reason: ShadowRunResult["reason"];
61
- error?: string;
62
- durationMs: number;
63
- session?: ShadowSession;
64
- /** Message count before the shadow's own run started; only later tool results are counted. */
65
- baseMessageCount: number;
66
- missingTools: string[];
67
- thinkingLevel?: string;
68
- }): ShadowRunResult;
69
- export declare class ShadowRunner {
70
- private readonly controllers;
71
- run(request: ShadowRunRequest): Promise<ShadowRunResult>;
72
- /** Build the shadow AgentSession (loader, report tool, allowlist) and validate it. */
73
- private bootstrapSession;
74
- abort(runId: string): void;
75
- abortAll(): void;
76
- }
77
- export declare function toolMetrics(messages: readonly {
78
- role?: string;
79
- toolName?: string;
80
- isError?: boolean;
81
- }[]): {
82
- toolCalls: number;
83
- toolFailures: number;
84
- toolStats: ToolStat[];
85
- };
86
- /**
87
- * Resolve the thinking level for this run: shadow config → plugin default →
88
- * the main session's effective level. The first candidate the model supports
89
- * (per its thinkingLevelMap; null marks unsupported, a missing key or map means
90
- * provider default, i.e. supported) wins. Fails only when none are supported.
91
- */
92
- export declare function resolveRunThinkingLevel(model: Model<any>, request: ShadowRunRequest): ThinkingLevel;
93
- export {};
@@ -1,248 +0,0 @@
1
- import { mkdir } from "node:fs/promises";
2
- import { fileURLToPath } from "node:url";
3
- import { basename, dirname, join, normalize, resolve } from "node:path";
4
- import { Type } from "typebox";
5
- import { DefaultResourceLoader, SessionManager, SettingsManager, createAgentSession, } from "@earendil-works/pi-coding-agent";
6
- import { DEFAULT_READ_TOOLS } from "./types.js";
7
- /**
8
- * Resolve the final tool allowlist for a Shadow run against the main session's
9
- * tool registry, per the design contract:
10
- *
11
- * - the final set is `readOnlyTools defaults + whitelist + report_to_main`;
12
- * - names that do not exist in the main session are dropped (ignored) and
13
- * returned as `missing`, while the rest are provided normally;
14
- * - the built-in `report_to_main` is always kept.
15
- */
16
- export function resolveShadowTools(whitelist, available, defaults = DEFAULT_READ_TOOLS) {
17
- const builtin = new Set(["report_to_main"]);
18
- const requested = [...new Set([...defaults, ...whitelist, ...builtin])];
19
- const tools = [];
20
- const missing = [];
21
- for (const name of requested) {
22
- (builtin.has(name) || available.has(name) ? tools : missing).push(name);
23
- }
24
- return { tools, missing };
25
- }
26
- import { buildShadowRequest, buildShadowSystemPrompt } from "./protocol.js";
27
- import { serializeTrajectory } from "./trajectory.js";
28
- const SELF_PATH = normalize(resolve(fileURLToPath(import.meta.url)));
29
- function runReason(timedOut, reported, aborted, failed = false) {
30
- if (timedOut)
31
- return "timeout";
32
- if (reported)
33
- return "report";
34
- if (aborted)
35
- return "aborted";
36
- return failed ? "error" : "silent";
37
- }
38
- /** Unify the three run() return paths so result shape changes touch one place. */
39
- export function buildRunResult(options) {
40
- const { reason, error, durationMs, session, baseMessageCount, missingTools, thinkingLevel } = options;
41
- const ownMessages = session ? session.messages.slice(baseMessageCount) : [];
42
- const metrics = toolMetrics(ownMessages);
43
- return {
44
- reason,
45
- ...(error !== undefined ? { error } : {}),
46
- durationMs,
47
- toolNames: session?.getActiveToolNames() ?? [],
48
- missingTools,
49
- ...metrics,
50
- ...(thinkingLevel !== undefined ? { thinkingLevel } : {}),
51
- sessionFile: session?.sessionFile,
52
- };
53
- }
54
- export class ShadowRunner {
55
- controllers = new Map();
56
- async run(request) {
57
- const started = Date.now();
58
- const controller = new AbortController();
59
- this.controllers.set(request.runId, { controller });
60
- const state = { reported: false, timedOut: false };
61
- let finalReason = "error";
62
- let sessionManager;
63
- let timeout;
64
- let missingTools = [];
65
- let baseMessageCount = 0;
66
- let thinkingLevel;
67
- try {
68
- const model = resolveRunModel(request);
69
- assertShadowModelAuth(model, request);
70
- const trajectory = serializeTrajectory(request.messages);
71
- assertTrajectoryFits(model, [trajectory]);
72
- sessionManager = await createShadowSessionManager(request);
73
- const boot = await this.bootstrapSession(request, model, controller, state, sessionManager);
74
- state.session = boot.session;
75
- missingTools = boot.missingTools;
76
- thinkingLevel = boot.thinkingLevel;
77
- baseMessageCount = boot.session.messages.length;
78
- this.controllers.set(request.runId, { controller, session: boot.session });
79
- if (controller.signal.aborted) {
80
- finalReason = "aborted";
81
- return buildRunResult({ reason: finalReason, durationMs: Date.now() - started, session: boot.session, baseMessageCount, missingTools, thinkingLevel });
82
- }
83
- const timeoutMs = (request.shadow.timeoutSeconds ?? request.config.defaultShadowTimeoutSeconds) * 1000;
84
- timeout = setTimeout(() => {
85
- state.timedOut = true;
86
- controller.abort();
87
- void boot.session?.abort();
88
- }, timeoutMs);
89
- controller.signal.addEventListener("abort", () => void boot.session?.abort(), { once: true });
90
- await boot.session.prompt(buildShadowRequest(trajectory, request.shadow));
91
- await boot.session.waitForIdle();
92
- finalReason = runReason(state.timedOut, state.reported, controller.signal.aborted);
93
- return buildRunResult({ reason: finalReason, durationMs: Date.now() - started, session: boot.session, baseMessageCount, missingTools, thinkingLevel });
94
- }
95
- catch (error) {
96
- finalReason = runReason(state.timedOut, state.reported, controller.signal.aborted, true);
97
- return buildRunResult({ reason: finalReason, error: error instanceof Error ? error.message : String(error), durationMs: Date.now() - started, session: state.session, baseMessageCount, missingTools, thinkingLevel });
98
- }
99
- finally {
100
- if (timeout)
101
- clearTimeout(timeout);
102
- sessionManager?.appendCustomEntry("shadow-mind-run-end", { runId: request.runId, reason: finalReason, durationMs: Date.now() - started });
103
- state.session?.dispose();
104
- this.controllers.delete(request.runId);
105
- }
106
- }
107
- /** Build the shadow AgentSession (loader, report tool, allowlist) and validate it. */
108
- async bootstrapSession(request, model, controller, state, sessionManager) {
109
- const thinkingLevel = resolveRunThinkingLevel(model, request);
110
- const settingsManager = SettingsManager.create(request.cwd, request.agentDir);
111
- const resourceLoader = new DefaultResourceLoader({
112
- cwd: request.cwd,
113
- agentDir: request.agentDir,
114
- settingsManager,
115
- systemPrompt: buildShadowSystemPrompt(request.mainSystemPrompt),
116
- // The inherited main system prompt already embeds APPEND_SYSTEM.md,
117
- // AGENTS.md and skills; keep the loader from re-discovering them so the
118
- // shadow context stays a strict subset (no duplication).
119
- appendSystemPrompt: [],
120
- agentsFilesOverride: () => ({ agentsFiles: [] }),
121
- skillsOverride: (base) => ({ skills: [], diagnostics: base.diagnostics }),
122
- extensionsOverride: (base) => ({
123
- ...base,
124
- extensions: base.extensions.filter((extension) => !isSelfExtension(extension.resolvedPath)),
125
- }),
126
- });
127
- const reportTool = createReportTool((content) => {
128
- if (state.reported || controller.signal.aborted)
129
- return;
130
- state.reported = true;
131
- request.onReport({
132
- shadowId: request.shadow.id,
133
- shadowName: request.shadow.name,
134
- content,
135
- epoch: request.epoch,
136
- runId: request.runId,
137
- });
138
- queueMicrotask(() => void state.session?.abort());
139
- });
140
- const tools = [...new Set(request.tools)];
141
- const created = await createAgentSession({
142
- cwd: request.cwd,
143
- agentDir: request.agentDir,
144
- model,
145
- thinkingLevel,
146
- tools,
147
- customTools: [reportTool],
148
- resourceLoader,
149
- sessionManager,
150
- settingsManager,
151
- });
152
- const missingTools = tools.filter((name) => !created.session.getActiveToolNames().includes(name));
153
- return { session: created.session, missingTools, thinkingLevel };
154
- }
155
- abort(runId) {
156
- this.controllers.get(runId)?.controller.abort();
157
- }
158
- abortAll() {
159
- for (const { controller } of this.controllers.values())
160
- controller.abort();
161
- }
162
- }
163
- export function toolMetrics(messages) {
164
- const stats = new Map();
165
- for (const message of messages) {
166
- if (message.role !== "toolResult")
167
- continue;
168
- const tool = message.toolName ?? "unknown";
169
- const entry = stats.get(tool) ?? { tool, calls: 0, failures: 0 };
170
- entry.calls += 1;
171
- if (message.isError)
172
- entry.failures += 1;
173
- stats.set(tool, entry);
174
- }
175
- const toolStats = [...stats.values()].sort((a, b) => b.calls - a.calls);
176
- return {
177
- toolCalls: toolStats.reduce((sum, stat) => sum + stat.calls, 0),
178
- toolFailures: toolStats.reduce((sum, stat) => sum + stat.failures, 0),
179
- toolStats,
180
- };
181
- }
182
- function createReportTool(onReport) {
183
- return {
184
- name: "report_to_main",
185
- label: "Report to Main",
186
- description: "Report a concrete finding or completed result to the main agent and immediately end this Shadow Mind run.",
187
- promptSnippet: "Report a useful result to the main agent and end this run",
188
- parameters: Type.Object({ content: Type.String({ description: "The complete report for the main agent" }) }),
189
- async execute(_toolCallId, params) {
190
- const content = params.content;
191
- onReport(content);
192
- return { content: [{ type: "text", text: "Report delivered." }], details: {}, terminate: true };
193
- },
194
- };
195
- }
196
- async function createShadowSessionManager(request) {
197
- if (!request.shadow.debug)
198
- return SessionManager.inMemory(request.cwd);
199
- const directory = join(request.agentDir, "shadow-minds", "logs", request.shadow.id);
200
- await mkdir(directory, { recursive: true });
201
- const manager = SessionManager.create(request.cwd, directory);
202
- manager.appendCustomEntry("shadow-mind-run", { runId: request.runId, epoch: request.epoch, shadowId: request.shadow.id });
203
- return manager;
204
- }
205
- function resolveRunModel(request) {
206
- const fullId = request.shadow.runWithModel ?? request.config.defaultShadowModel;
207
- if (!fullId)
208
- return request.mainModel;
209
- const model = request.resolveModel(fullId);
210
- if (!model)
211
- throw new Error(`shadow model not found: ${fullId}`);
212
- return model;
213
- }
214
- function assertShadowModelAuth(model, request) {
215
- if (request.modelAuthOk && !request.modelAuthOk(model)) {
216
- throw new Error(`shadow model ${model.provider}/${model.id} has no configured auth`);
217
- }
218
- }
219
- /**
220
- * Resolve the thinking level for this run: shadow config → plugin default →
221
- * the main session's effective level. The first candidate the model supports
222
- * (per its thinkingLevelMap; null marks unsupported, a missing key or map means
223
- * provider default, i.e. supported) wins. Fails only when none are supported.
224
- */
225
- export function resolveRunThinkingLevel(model, request) {
226
- const candidates = [request.shadow.thinkingLevel, request.config.defaultThinkingLevel, request.mainThinkingLevel]
227
- .filter((level) => level !== undefined);
228
- for (const level of candidates) {
229
- if (model.thinkingLevelMap?.[level] !== null)
230
- return level;
231
- }
232
- throw new Error(`no supported thinking level for ${model.provider}/${model.id} (tried: ${candidates.join(", ") || "none"})`);
233
- }
234
- function assertTrajectoryFits(model, messages) {
235
- const chars = messages.reduce((sum, message) => sum + (JSON.stringify(message)?.length ?? 0), 0);
236
- const estimated = Math.ceil(chars / 2);
237
- if (estimated > model.contextWindow) {
238
- throw new Error(`trajectory ~${estimated} tokens exceeds ${model.provider}/${model.id} context window (${model.contextWindow})`);
239
- }
240
- }
241
- function isSelfExtension(candidate) {
242
- const normalized = normalize(resolve(candidate));
243
- if (normalized === SELF_PATH)
244
- return true;
245
- const sourceDirectory = normalize(resolve(dirname(SELF_PATH)));
246
- return dirname(normalized) === sourceDirectory && (basename(normalized) === "index.ts" || basename(normalized) === "index.js");
247
- }
248
- //# sourceMappingURL=shadow-runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shadow-runner.js","sourceRoot":"","sources":["../src/shadow-runner.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- export interface DrainResult {
2
- settled: boolean;
3
- durationMs: number;
4
- }
5
- export declare function waitForSettled(options: {
6
- timeoutMs: number;
7
- isSettled: () => boolean;
8
- pollMs?: number;
9
- quietMs?: number;
10
- now?: () => number;
11
- delay?: (ms: number) => Promise<void>;
12
- }): Promise<DrainResult>;
@@ -1,22 +0,0 @@
1
- export async function waitForSettled(options) {
2
- const pollMs = options.pollMs ?? 25;
3
- const quietMs = options.quietMs ?? 50;
4
- const now = options.now ?? Date.now;
5
- const delay = options.delay ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
6
- const started = now();
7
- let settledSince;
8
- while (now() - started < options.timeoutMs) {
9
- if (options.isSettled()) {
10
- settledSince ??= now();
11
- if (now() - settledSince >= quietMs)
12
- return { settled: true, durationMs: now() - started };
13
- }
14
- else {
15
- settledSince = undefined;
16
- }
17
- const remaining = options.timeoutMs - (now() - started);
18
- await delay(Math.min(pollMs, Math.max(1, remaining)));
19
- }
20
- return { settled: false, durationMs: now() - started };
21
- }
22
- //# sourceMappingURL=shutdown-drain.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shutdown-drain.js","sourceRoot":"","sources":["../src/shutdown-drain.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAOpC;IACC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACzG,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IACtB,IAAI,YAAgC,CAAC;IAErC,OAAO,GAAG,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;YACxB,YAAY,KAAK,GAAG,EAAE,CAAC;YACvB,IAAI,GAAG,EAAE,GAAG,YAAY,IAAI,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;QACxD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;AACzD,CAAC"}
@@ -1,9 +0,0 @@
1
- interface ToolResultLike {
2
- toolName?: string;
3
- content?: unknown;
4
- isError?: boolean;
5
- }
6
- type Summarizer = (result: ToolResultLike) => string;
7
- export declare function summarizeToolResult(result: ToolResultLike): string;
8
- export declare function registerToolResultSummarizer(toolName: string, summarizer: Summarizer): void;
9
- export {};
package/dist/summaries.js DELETED
@@ -1,56 +0,0 @@
1
- const summarizers = new Map([
2
- ["read", (result) => summarizeLines(result, "read")],
3
- ["grep", (result) => summarizeLines(result, "matches")],
4
- ["find", (result) => summarizeLines(result, "paths")],
5
- ["ls", (result) => summarizeLines(result, "entries")],
6
- ]);
7
- export function summarizeToolResult(result) {
8
- const summary = summarizers.get(result.toolName ?? "")?.(result) ?? summarizeGeneric(result);
9
- return result.isError ? `error · ${summary}` : summary;
10
- }
11
- export function registerToolResultSummarizer(toolName, summarizer) {
12
- summarizers.set(toolName, summarizer);
13
- }
14
- function summarizeLines(result, noun) {
15
- const text = textContent(result.content);
16
- if (!text)
17
- return `0 ${noun}`;
18
- const lines = text.split(/\r?\n/).filter(Boolean);
19
- const preview = compact(lines[0] ?? "");
20
- return `${lines.length} ${noun}${preview ? ` · ${preview}` : ""}`;
21
- }
22
- function summarizeGeneric(result) {
23
- return describeContent(result.content) ?? "no output";
24
- }
25
- function describeContent(content) {
26
- if (Array.isArray(content)) {
27
- const blocks = content.filter((block) => Boolean(block) && typeof block === "object");
28
- if (!blocks.length)
29
- return "empty result";
30
- const counts = new Map();
31
- for (const block of blocks) {
32
- const type = block.type ?? "object";
33
- counts.set(type, (counts.get(type) ?? 0) + 1);
34
- }
35
- return [...counts.entries()].map(([type, count]) => `${count} ${type}${count > 1 ? "s" : ""}`).join(" · ");
36
- }
37
- if (content === null)
38
- return "null";
39
- if (typeof content === "string")
40
- return `text · ${content.length} chars`;
41
- if (typeof content === "number" || typeof content === "boolean")
42
- return `${typeof content} · ${String(content)}`;
43
- if (typeof content === "object")
44
- return `object · ${Object.keys(content).length} keys`;
45
- return undefined;
46
- }
47
- function textContent(content) {
48
- if (!Array.isArray(content))
49
- return "";
50
- return content.filter((part) => Boolean(part) && typeof part === "object" && part.type === "text")
51
- .map((part) => part.text ?? "").join("\n");
52
- }
53
- function compact(value) {
54
- return value.replace(/\s+/g, " ").trim();
55
- }
56
- //# sourceMappingURL=summaries.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"summaries.js","sourceRoot":"","sources":["../src/summaries.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- type MessageLike = {
2
- role?: string;
3
- content?: unknown;
4
- [key: string]: unknown;
5
- };
6
- export declare function serializeTrajectory(messages: readonly MessageLike[]): string;
7
- export declare function sanitizeTrajectory(messages: readonly MessageLike[]): MessageLike[];
8
- export {};
@@ -1,107 +0,0 @@
1
- import { summarizeToolResult } from "./summaries.js";
2
- export function serializeTrajectory(messages) {
3
- const results = new Map();
4
- for (const message of messages) {
5
- if (message.role === "toolResult" && typeof message.toolCallId === "string") {
6
- results.set(message.toolCallId, summarizeToolResult(message));
7
- }
8
- }
9
- const lines = [];
10
- for (const message of messages) {
11
- if (message.role === "user") {
12
- appendText(lines, "USER", message.content);
13
- continue;
14
- }
15
- if (message.role === "assistant") {
16
- if (!Array.isArray(message.content)) {
17
- appendText(lines, "MAIN", message.content);
18
- continue;
19
- }
20
- for (const block of message.content) {
21
- if (!block || typeof block !== "object" || isThinkingBlock(block))
22
- continue;
23
- const item = block;
24
- if (item.type === "text" && item.text)
25
- lines.push(`MAIN: ${item.text}`);
26
- if (item.type === "toolCall" && item.name) {
27
- const call = `${item.name}(${compactJson(item.arguments)})`;
28
- const result = item.id ? results.get(item.id) : undefined;
29
- lines.push(`TOOL: ${call}${result ? ` · ${result}` : ""}`);
30
- }
31
- }
32
- continue;
33
- }
34
- if (message.role === "toolResult") {
35
- if (typeof message.toolCallId !== "string" || !results.has(message.toolCallId)) {
36
- lines.push(`TOOL RESULT: ${summarizeToolResult(message)}`);
37
- }
38
- continue;
39
- }
40
- if (message.role === "custom" && message.customType === "shadow-report") {
41
- appendText(lines, "SHADOW FEEDBACK", message.content);
42
- continue;
43
- }
44
- if (message.role === "compactionSummary" || message.role === "branchSummary") {
45
- appendText(lines, "SUMMARY", message.content);
46
- }
47
- }
48
- return `<main-agent-trajectory>\n${lines.join("\n")}\n</main-agent-trajectory>`;
49
- }
50
- export function sanitizeTrajectory(messages) {
51
- return messages.flatMap((message) => {
52
- if (message.role === "assistant") {
53
- const content = Array.isArray(message.content)
54
- ? message.content.filter((block) => !isThinkingBlock(block)).map(clone)
55
- : message.content;
56
- return [{ ...clone(message), content }];
57
- }
58
- if (message.role === "toolResult") {
59
- return [{
60
- ...clone(message),
61
- content: [{ type: "text", text: summarizeToolResult(message) }],
62
- details: undefined,
63
- usage: undefined,
64
- }];
65
- }
66
- if (message.role === "custom") {
67
- return message.customType === "shadow-report" ? [clone(message)] : [];
68
- }
69
- if (message.role === "user" || message.role === "compactionSummary" || message.role === "branchSummary") {
70
- return [clone(message)];
71
- }
72
- return [];
73
- });
74
- }
75
- function isThinkingBlock(value) {
76
- return Boolean(value) && typeof value === "object" && value.type === "thinking";
77
- }
78
- function clone(value) {
79
- return structuredClone(value);
80
- }
81
- function appendText(lines, label, content) {
82
- const text = extractText(content);
83
- if (text)
84
- lines.push(`${label}: ${text}`);
85
- }
86
- function extractText(content) {
87
- if (typeof content === "string")
88
- return content;
89
- if (!Array.isArray(content))
90
- return "";
91
- return content
92
- .filter((item) => Boolean(item) && typeof item === "object")
93
- .filter((item) => item.type === "text" && typeof item.text === "string")
94
- .map((item) => item.text)
95
- .join("\n");
96
- }
97
- function compactJson(value) {
98
- if (value === undefined)
99
- return "";
100
- try {
101
- return JSON.stringify(value);
102
- }
103
- catch {
104
- return "[unserializable]";
105
- }
106
- }
107
- //# sourceMappingURL=trajectory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trajectory.js","sourceRoot":"","sources":["../src/trajectory.ts"],"names":[],"mappings":"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"}