@astralyn/pi 0.86.1 → 0.87.0
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/CHANGELOG.md +28 -0
- package/dist/bundle/chunks/chunk-INDBRWNK.js +2 -0
- package/dist/bundle/chunks/{chunk-GTBMYBFG.js → chunk-RKLIHRPH.js} +39 -33
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{openai-completions-6SMWQWQN.js → openai-completions-JZCEEJ43.js} +1 -1
- package/dist/bundle/chunks/{virtual-modules-OHUZ2T7X.js → virtual-modules-CG7NJ5WO.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/file-processor.d.ts +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/core/agent-session-runtime.js +1 -1
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +31 -4
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +395 -126
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/cache-warmer.d.ts +1 -0
- package/dist/core/cache-warmer.d.ts.map +1 -1
- package/dist/core/cache-warmer.js +15 -1
- package/dist/core/cache-warmer.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +3 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +146 -48
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/crash-log.d.ts +5 -0
- package/dist/core/crash-log.d.ts.map +1 -1
- package/dist/core/crash-log.js +68 -0
- package/dist/core/crash-log.js.map +1 -1
- package/dist/core/export-html/template.js +6 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +16 -3
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +110 -5
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +77 -6
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/model-config.d.ts +52 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +16 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/prompt-templates.d.ts +6 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +61 -35
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/provider-composer.d.ts +1 -0
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +19 -0
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +6 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -4
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +36 -9
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +97 -7
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/tools/read.d.ts +4 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +5 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/extensions/btw/agent.d.ts.map +1 -1
- package/dist/extensions/btw/agent.js +8 -5
- package/dist/extensions/btw/agent.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +4 -3
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/bug-report.d.ts.map +1 -1
- package/dist/modes/interactive/bug-report.js +4 -0
- package/dist/modes/interactive/bug-report.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +7 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +64 -2
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/utils/mime.js +1 -1
- package/dist/utils/mime.js.map +1 -1
- package/dist/utils/tool-result-images.d.ts +3 -1
- package/dist/utils/tool-result-images.d.ts.map +1 -1
- package/dist/utils/tool-result-images.js +4 -1
- package/dist/utils/tool-result-images.js.map +1 -1
- package/docs/compaction.md +23 -4
- package/docs/extensions.md +72 -8
- package/docs/models.md +30 -1
- package/docs/sdk.md +14 -3
- package/docs/session-format.md +25 -4
- package/examples/plugins/pi-example-plugin/src/session.ts +3 -2
- package/npm-shrinkwrap.json +43 -43
- package/package.json +8 -8
- package/dist/bundle/chunks/chunk-DAEM5JIZ.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
2
|
-
import { type ImageContent, type Message, type SystemMessage, type TextContent, type Usage } from "@earendil-works/pi-ai";
|
|
2
|
+
import { type AssistantMessage, type ImageContent, type Message, type SystemMessage, type TextContent, type ToolResultMessage, type Usage, type UserMessage } from "@earendil-works/pi-ai";
|
|
3
3
|
import { type BashExecutionMessage, type CustomMessage } from "./messages.ts";
|
|
4
4
|
export declare const CURRENT_SESSION_VERSION = 3;
|
|
5
5
|
export interface SessionHeader {
|
|
@@ -113,8 +113,19 @@ export interface CustomMessageEntry<T = unknown> extends SessionEntryBase {
|
|
|
113
113
|
details?: T;
|
|
114
114
|
display: boolean;
|
|
115
115
|
}
|
|
116
|
+
/** Content that an append-only context edit may replace without changing message metadata. */
|
|
117
|
+
export type ContextEditableContent = UserMessage["content"] | AssistantMessage["content"] | ToolResultMessage["content"] | CustomMessage["content"];
|
|
118
|
+
/** Append-only change to one earlier entry's contribution to model context. */
|
|
119
|
+
export interface ContextEditEntry extends SessionEntryBase {
|
|
120
|
+
type: "context_edit";
|
|
121
|
+
targetId: string;
|
|
122
|
+
/** Null omits the target from model context. A value replaces only its content. */
|
|
123
|
+
replacement: {
|
|
124
|
+
content: ContextEditableContent;
|
|
125
|
+
} | null;
|
|
126
|
+
}
|
|
116
127
|
/** Session entry - has id/parentId for tree structure (returned by "read" methods in SessionManager) */
|
|
117
|
-
export type SessionEntry = SessionMessageEntry | ThinkingLevelChangeEntry | ModelChangeEntry | UsageEntry | CompactionEntry | BranchSummaryEntry | CustomEntry | CustomMessageEntry | LabelEntry | SessionInfoEntry;
|
|
128
|
+
export type SessionEntry = SessionMessageEntry | ThinkingLevelChangeEntry | ModelChangeEntry | UsageEntry | CompactionEntry | BranchSummaryEntry | CustomEntry | CustomMessageEntry | ContextEditEntry | LabelEntry | SessionInfoEntry;
|
|
118
129
|
/** Raw file entry (includes header) */
|
|
119
130
|
export type FileEntry = SessionHeader | SessionEntry;
|
|
120
131
|
/** Tree node for getTree() - defensive copy of session structure */
|
|
@@ -126,6 +137,21 @@ export interface SessionTreeNode {
|
|
|
126
137
|
/** Timestamp of the latest label change for this entry, if any */
|
|
127
138
|
labelTimestamp?: string;
|
|
128
139
|
}
|
|
140
|
+
export interface ProjectedSessionEntry {
|
|
141
|
+
/** Raw append-only entry that owns this projected contribution. */
|
|
142
|
+
sourceEntry: SessionEntry;
|
|
143
|
+
/** Model-visible messages after context edits. Empty for state-only entries and omissions. */
|
|
144
|
+
messages: AgentMessage[];
|
|
145
|
+
}
|
|
146
|
+
export interface SessionProjection {
|
|
147
|
+
entries: ProjectedSessionEntry[];
|
|
148
|
+
messages: AgentMessage[];
|
|
149
|
+
thinkingLevel: string;
|
|
150
|
+
model: {
|
|
151
|
+
provider: string;
|
|
152
|
+
modelId: string;
|
|
153
|
+
} | null;
|
|
154
|
+
}
|
|
129
155
|
export interface SessionContext {
|
|
130
156
|
messages: AgentMessage[];
|
|
131
157
|
thinkingLevel: string;
|
|
@@ -149,7 +175,7 @@ export interface SessionInfo {
|
|
|
149
175
|
firstMessage: string;
|
|
150
176
|
allMessagesText: string;
|
|
151
177
|
}
|
|
152
|
-
export type ReadonlySessionManager = Pick<SessionManager, "getCwd" | "getSessionDir" | "getSessionId" | "getSessionFile" | "getLeafId" | "getLeafEntry" | "getEntry" | "getLabel" | "getBranch" | "buildContextEntries" | "getHeader" | "getEntries" | "getTree" | "getSessionName">;
|
|
178
|
+
export type ReadonlySessionManager = Pick<SessionManager, "getCwd" | "getSessionDir" | "getSessionId" | "getSessionFile" | "getLeafId" | "getLeafEntry" | "getEntry" | "getLabel" | "getBranch" | "buildContextEntries" | "buildSessionProjection" | "getHeader" | "getEntries" | "getTree" | "getSessionName">;
|
|
153
179
|
export declare function assertValidSessionId(id: string): void;
|
|
154
180
|
/** Exported for testing */
|
|
155
181
|
export declare function migrateSessionEntries(entries: FileEntry[]): void;
|
|
@@ -170,11 +196,9 @@ export declare function sessionEntryToContextMessages(entry: SessionEntry): Agen
|
|
|
170
196
|
* compaction entry. Older summarized entries are omitted.
|
|
171
197
|
*/
|
|
172
198
|
export declare function buildContextEntries(entries: SessionEntry[], leafId?: string | null, byId?: Map<string, SessionEntry>): SessionEntry[];
|
|
173
|
-
/**
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
* Handles compaction and branch summaries along the path.
|
|
177
|
-
*/
|
|
199
|
+
/** Build provenance-preserving, compaction-aware model context. */
|
|
200
|
+
export declare function buildSessionProjection(entries: SessionEntry[], leafId?: string | null, byId?: Map<string, SessionEntry>): SessionProjection;
|
|
201
|
+
/** Build the finalized model context from the canonical session projection. */
|
|
178
202
|
export declare function buildSessionContext(entries: SessionEntry[], leafId?: string | null, byId?: Map<string, SessionEntry>): SessionContext;
|
|
179
203
|
export declare function getDefaultSessionDir(cwd: string, agentDir?: string): string;
|
|
180
204
|
/** Exported for testing */
|
|
@@ -237,7 +261,7 @@ export declare class SessionManager {
|
|
|
237
261
|
/** Append model-attributed usage that does not participate in LLM context. Returns the appended entry. */
|
|
238
262
|
appendUsage(kind: string, provider: string, model: string, usage: Usage, note?: string): UsageEntry;
|
|
239
263
|
/** Append a compaction summary as child of current leaf, then advance leaf. Returns entry id. */
|
|
240
|
-
appendCompaction<T = unknown>(summary: string, firstKeptEntryId: string, tokensBefore: number, details?: T, fromHook?: boolean, usage?: Usage): string;
|
|
264
|
+
appendCompaction<T = unknown>(summary: string, firstKeptEntryId: string | null, tokensBefore: number, details?: T, fromHook?: boolean, usage?: Usage): string;
|
|
241
265
|
/** Append a custom entry (for extensions) as child of current leaf, then advance leaf. Returns entry id. */
|
|
242
266
|
appendCustomEntry(customType: string, data?: unknown): string;
|
|
243
267
|
/** Append a session info entry (e.g., display name). Returns entry id. */
|
|
@@ -253,6 +277,8 @@ export declare class SessionManager {
|
|
|
253
277
|
* @returns Entry id
|
|
254
278
|
*/
|
|
255
279
|
appendCustomMessageEntry<T = unknown>(customType: string, content: string | (TextContent | ImageContent)[], display: boolean, details?: T): string;
|
|
280
|
+
/** Append a branch-local edit to an earlier model-visible entry. */
|
|
281
|
+
appendContextEdit(targetId: string, replacement: ContextEditEntry["replacement"]): string;
|
|
256
282
|
getLeafId(): string | null;
|
|
257
283
|
getLeafEntry(): SessionEntry | undefined;
|
|
258
284
|
getEntry(id: string): SessionEntry | undefined;
|
|
@@ -285,6 +311,7 @@ export declare class SessionManager {
|
|
|
285
311
|
* Build the session context (what gets sent to the LLM).
|
|
286
312
|
* Uses tree traversal from current leaf.
|
|
287
313
|
*/
|
|
314
|
+
buildSessionProjection(): SessionProjection;
|
|
288
315
|
buildSessionContext(): SessionContext;
|
|
289
316
|
/**
|
|
290
317
|
* Get session header.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -232,10 +232,55 @@ export function buildContextEntries(entries, leafId, byId) {
|
|
|
232
232
|
* If leafId is provided, walks from that entry to root.
|
|
233
233
|
* Handles compaction and branch summaries along the path.
|
|
234
234
|
*/
|
|
235
|
-
|
|
235
|
+
function projectContextEntry(entry, edit) {
|
|
236
|
+
const messages = sessionEntryToContextMessages(entry);
|
|
237
|
+
if (!edit)
|
|
238
|
+
return messages;
|
|
239
|
+
const replacement = edit.replacement;
|
|
240
|
+
if (replacement === null)
|
|
241
|
+
return [];
|
|
242
|
+
return messages.map((message) => {
|
|
243
|
+
if (message.role !== "user" &&
|
|
244
|
+
message.role !== "assistant" &&
|
|
245
|
+
message.role !== "toolResult" &&
|
|
246
|
+
message.role !== "custom") {
|
|
247
|
+
return message;
|
|
248
|
+
}
|
|
249
|
+
const content = (message.role === "assistant" || message.role === "toolResult") && typeof replacement.content === "string"
|
|
250
|
+
? [{ type: "text", text: replacement.content }]
|
|
251
|
+
: replacement.content;
|
|
252
|
+
return { ...message, content };
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
/** Build provenance-preserving, compaction-aware model context. */
|
|
256
|
+
export function buildSessionProjection(entries, leafId, byId) {
|
|
236
257
|
const path = buildSessionPath(entries, leafId, byId);
|
|
237
258
|
const { thinkingLevel, model } = getSessionContextSettings(path);
|
|
238
|
-
const
|
|
259
|
+
const contextEntries = buildContextEntries(entries, leafId, byId);
|
|
260
|
+
const edits = new Map();
|
|
261
|
+
for (const entry of contextEntries) {
|
|
262
|
+
if (entry.type === "context_edit")
|
|
263
|
+
edits.set(entry.targetId, entry);
|
|
264
|
+
}
|
|
265
|
+
const projectedEntries = contextEntries.map((sourceEntry, index) => ({
|
|
266
|
+
sourceEntry,
|
|
267
|
+
// buildContextEntries() may retain an older compaction entry because its
|
|
268
|
+
// raw ID lies inside the newest retained range. Only the newest compaction
|
|
269
|
+
// at index zero contributes a checkpoint and summary.
|
|
270
|
+
messages: sourceEntry.type === "compaction" && index > 0
|
|
271
|
+
? []
|
|
272
|
+
: projectContextEntry(sourceEntry, edits.get(sourceEntry.id)),
|
|
273
|
+
}));
|
|
274
|
+
return {
|
|
275
|
+
entries: projectedEntries,
|
|
276
|
+
messages: projectedEntries.flatMap((entry) => entry.messages),
|
|
277
|
+
thinkingLevel,
|
|
278
|
+
model,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
/** Build the finalized model context from the canonical session projection. */
|
|
282
|
+
export function buildSessionContext(entries, leafId, byId) {
|
|
283
|
+
const { messages, thinkingLevel, model } = buildSessionProjection(entries, leafId, byId);
|
|
239
284
|
return { messages, thinkingLevel, model };
|
|
240
285
|
}
|
|
241
286
|
/**
|
|
@@ -830,14 +875,15 @@ export class SessionManager {
|
|
|
830
875
|
/** Append a compaction summary as child of current leaf, then advance leaf. Returns entry id. */
|
|
831
876
|
appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromHook, usage) {
|
|
832
877
|
const timestamp = new Date().toISOString();
|
|
833
|
-
const systemMessage = getCurrentSystemMessage(this.
|
|
878
|
+
const systemMessage = getCurrentSystemMessage(this.buildSessionProjection().messages);
|
|
879
|
+
const id = generateId(this.byId);
|
|
834
880
|
const entry = {
|
|
835
881
|
type: "compaction",
|
|
836
|
-
id
|
|
882
|
+
id,
|
|
837
883
|
parentId: this.leafId,
|
|
838
884
|
timestamp,
|
|
839
885
|
summary,
|
|
840
|
-
firstKeptEntryId,
|
|
886
|
+
firstKeptEntryId: firstKeptEntryId ?? id,
|
|
841
887
|
tokensBefore,
|
|
842
888
|
details,
|
|
843
889
|
usage,
|
|
@@ -908,6 +954,44 @@ export class SessionManager {
|
|
|
908
954
|
this._appendEntry(entry);
|
|
909
955
|
return entry.id;
|
|
910
956
|
}
|
|
957
|
+
/** Append a branch-local edit to an earlier model-visible entry. */
|
|
958
|
+
appendContextEdit(targetId, replacement) {
|
|
959
|
+
if (replacement !== null &&
|
|
960
|
+
(typeof replacement !== "object" ||
|
|
961
|
+
!("content" in replacement) ||
|
|
962
|
+
(typeof replacement.content !== "string" && !Array.isArray(replacement.content)))) {
|
|
963
|
+
throw new Error("Context edit replacement must be null or contain string/array content");
|
|
964
|
+
}
|
|
965
|
+
const target = this.byId.get(targetId);
|
|
966
|
+
if (!target)
|
|
967
|
+
throw new Error(`Entry ${targetId} not found`);
|
|
968
|
+
if (!this.getBranch().some((entry) => entry.id === targetId)) {
|
|
969
|
+
throw new Error(`Entry ${targetId} is not on the active branch`);
|
|
970
|
+
}
|
|
971
|
+
const editable = target.type === "custom_message" ||
|
|
972
|
+
(target.type === "message" &&
|
|
973
|
+
(target.message.role === "user" ||
|
|
974
|
+
target.message.role === "assistant" ||
|
|
975
|
+
target.message.role === "toolResult"));
|
|
976
|
+
if (!editable)
|
|
977
|
+
throw new Error(`Entry ${targetId} does not contribute editable model content`);
|
|
978
|
+
const targetRole = target.type === "message" ? target.message.role : "custom";
|
|
979
|
+
const normalizedReplacement = replacement !== null &&
|
|
980
|
+
(targetRole === "assistant" || targetRole === "toolResult") &&
|
|
981
|
+
typeof replacement.content === "string"
|
|
982
|
+
? { content: [{ type: "text", text: replacement.content }] }
|
|
983
|
+
: replacement;
|
|
984
|
+
const entry = {
|
|
985
|
+
type: "context_edit",
|
|
986
|
+
id: generateId(this.byId),
|
|
987
|
+
parentId: this.leafId,
|
|
988
|
+
timestamp: new Date().toISOString(),
|
|
989
|
+
targetId,
|
|
990
|
+
replacement: normalizedReplacement,
|
|
991
|
+
};
|
|
992
|
+
this._appendEntry(entry);
|
|
993
|
+
return entry.id;
|
|
994
|
+
}
|
|
911
995
|
// =========================================================================
|
|
912
996
|
// Tree Traversal
|
|
913
997
|
// =========================================================================
|
|
@@ -993,8 +1077,12 @@ export class SessionManager {
|
|
|
993
1077
|
* Build the session context (what gets sent to the LLM).
|
|
994
1078
|
* Uses tree traversal from current leaf.
|
|
995
1079
|
*/
|
|
1080
|
+
buildSessionProjection() {
|
|
1081
|
+
return buildSessionProjection(this.getEntries(), this.leafId, this.byId);
|
|
1082
|
+
}
|
|
996
1083
|
buildSessionContext() {
|
|
997
|
-
|
|
1084
|
+
const { messages, thinkingLevel, model } = this.buildSessionProjection();
|
|
1085
|
+
return { messages, thinkingLevel, model };
|
|
998
1086
|
}
|
|
999
1087
|
/**
|
|
1000
1088
|
* Get session header.
|
|
@@ -1132,7 +1220,9 @@ export class SessionManager {
|
|
|
1132
1220
|
? {
|
|
1133
1221
|
...entry,
|
|
1134
1222
|
parentId: pathParentId,
|
|
1135
|
-
firstKeptEntryId:
|
|
1223
|
+
firstKeptEntryId: entry.firstKeptEntryId === entry.id
|
|
1224
|
+
? entry.id
|
|
1225
|
+
: (replacementByLabelId.get(entry.firstKeptEntryId) ?? entry.firstKeptEntryId),
|
|
1136
1226
|
}
|
|
1137
1227
|
: { ...entry, parentId: pathParentId });
|
|
1138
1228
|
pathParentId = entry.id;
|