pi-fabric 0.19.0 → 0.20.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/README.md +5 -0
- package/dist/compaction/enrichers.d.ts +10 -0
- package/dist/compaction/enrichers.d.ts.map +1 -0
- package/dist/compaction/enrichers.js +11 -0
- package/dist/compaction/enrichers.js.map +1 -0
- package/dist/compaction/hook.d.ts +40 -0
- package/dist/compaction/hook.d.ts.map +1 -0
- package/dist/compaction/hook.js +211 -0
- package/dist/compaction/hook.js.map +1 -0
- package/dist/compaction/normalize.d.ts +43 -0
- package/dist/compaction/normalize.d.ts.map +1 -0
- package/dist/compaction/normalize.js +113 -0
- package/dist/compaction/normalize.js.map +1 -0
- package/dist/compaction/projections.d.ts +13 -0
- package/dist/compaction/projections.d.ts.map +1 -0
- package/dist/compaction/projections.js +373 -0
- package/dist/compaction/projections.js.map +1 -0
- package/dist/compaction/qa.d.ts +27 -0
- package/dist/compaction/qa.d.ts.map +1 -0
- package/dist/compaction/qa.js +235 -0
- package/dist/compaction/qa.js.map +1 -0
- package/dist/compaction/render.d.ts +8 -0
- package/dist/compaction/render.d.ts.map +1 -0
- package/dist/compaction/render.js +40 -0
- package/dist/compaction/render.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +33 -1
- package/dist/config.js.map +1 -1
- package/dist/core/compact-controller.d.ts +40 -0
- package/dist/core/compact-controller.d.ts.map +1 -0
- package/dist/core/compact-controller.js +111 -0
- package/dist/core/compact-controller.js.map +1 -0
- package/dist/fabric-state.d.ts +2 -0
- package/dist/fabric-state.d.ts.map +1 -1
- package/dist/fabric-state.js +52 -0
- package/dist/fabric-state.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/memory/digest.d.ts +26 -0
- package/dist/memory/digest.d.ts.map +1 -0
- package/dist/memory/digest.js +83 -0
- package/dist/memory/digest.js.map +1 -0
- package/dist/memory/discovery.d.ts +33 -0
- package/dist/memory/discovery.d.ts.map +1 -0
- package/dist/memory/discovery.js +119 -0
- package/dist/memory/discovery.js.map +1 -0
- package/dist/memory/index.d.ts +69 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +281 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/normalize.d.ts +53 -0
- package/dist/memory/normalize.d.ts.map +1 -0
- package/dist/memory/normalize.js +344 -0
- package/dist/memory/normalize.js.map +1 -0
- package/dist/memory/search.d.ts +58 -0
- package/dist/memory/search.d.ts.map +1 -0
- package/dist/memory/search.js +330 -0
- package/dist/memory/search.js.map +1 -0
- package/dist/providers/agents-provider.d.ts.map +1 -1
- package/dist/providers/agents-provider.js +29 -0
- package/dist/providers/agents-provider.js.map +1 -1
- package/dist/providers/compact-provider.d.ts +12 -0
- package/dist/providers/compact-provider.d.ts.map +1 -0
- package/dist/providers/compact-provider.js +99 -0
- package/dist/providers/compact-provider.js.map +1 -0
- package/dist/providers/memory-provider.d.ts +22 -0
- package/dist/providers/memory-provider.d.ts.map +1 -0
- package/dist/providers/memory-provider.js +246 -0
- package/dist/providers/memory-provider.js.map +1 -0
- package/dist/providers/state-provider.d.ts +14 -0
- package/dist/providers/state-provider.d.ts.map +1 -0
- package/dist/providers/state-provider.js +296 -0
- package/dist/providers/state-provider.js.map +1 -0
- package/dist/state/complexity.d.ts +13 -0
- package/dist/state/complexity.d.ts.map +1 -0
- package/dist/state/complexity.js +293 -0
- package/dist/state/complexity.js.map +1 -0
- package/dist/state/store.d.ts +157 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +532 -0
- package/dist/state/store.js.map +1 -0
- package/dist/subagents/manager.d.ts +1 -0
- package/dist/subagents/manager.d.ts.map +1 -1
- package/dist/subagents/manager.js +16 -0
- package/dist/subagents/manager.js.map +1 -1
- package/dist/subagents/types.d.ts +2 -1
- package/dist/subagents/types.d.ts.map +1 -1
- package/dist/ui/fabric-render.d.ts.map +1 -1
- package/dist/ui/fabric-render.js +11 -1
- package/dist/ui/fabric-render.js.map +1 -1
- package/dist/worker.js +10 -0
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
- package/skills/fabric-schema/SKILL.md +101 -0
package/README.md
CHANGED
|
@@ -588,6 +588,9 @@ Project values override global values.
|
|
|
588
588
|
"lingerMs": 10000,
|
|
589
589
|
"eventHistory": 80
|
|
590
590
|
},
|
|
591
|
+
"compaction": {
|
|
592
|
+
"engine": "fabric"
|
|
593
|
+
},
|
|
591
594
|
"mesh": {
|
|
592
595
|
"enabled": true,
|
|
593
596
|
"actorScope": "project",
|
|
@@ -600,6 +603,8 @@ Project values override global values.
|
|
|
600
603
|
}
|
|
601
604
|
```
|
|
602
605
|
|
|
606
|
+
The deterministic, LLM-free compaction engine is default-on. Set `compaction.engine` to `"pi"` to restore pi-core compaction. When pi-vcc is also installed, Fabric takes precedence for automatic compaction, while an explicit `/pi-vcc` command always uses pi-vcc's engine.
|
|
607
|
+
|
|
603
608
|
`subagents.runner` selects the default harness (`"pi"` or `"claude"`). `subagents.model` is the optional Pi `provider/id` override; `subagents.claude.model` is the optional canonical Claude runtime key. `subagents.claude.binary` defaults to `claude` and can be an absolute path or wrapper; `PI_FABRIC_CLAUDE_BINARY` overrides it for the current process. `/fabric settings` enumerates Claude models from that binary and stores the two runner defaults independently.
|
|
604
609
|
|
|
605
610
|
`fullCodeMode` defaults to `true`. Full mode deactivates native core tools in the parent session and makes `fabric_exec` their exclusive model-facing owner. When false, Fabric uses orchestration-only mode: native Pi and registered extension tools remain direct, capture is disabled, and Fabric's internal registry omits the `pi` and `extensions` providers.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CompactionEvent } from "./normalize.js";
|
|
2
|
+
import type { Sections } from "./projections.js";
|
|
3
|
+
export interface CompactionEnricher {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
applies(events: CompactionEvent[]): boolean;
|
|
6
|
+
contribute(events: CompactionEvent[], sections: Sections): void;
|
|
7
|
+
}
|
|
8
|
+
export declare const NO_BUILTIN_ENRICHERS: readonly CompactionEnricher[];
|
|
9
|
+
export declare const runEnrichers: (enrichers: readonly CompactionEnricher[], events: CompactionEvent[], sections: Sections) => void;
|
|
10
|
+
//# sourceMappingURL=enrichers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrichers.d.ts","sourceRoot":"","sources":["../../src/compaction/enrichers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAcjD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAGtB,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAI5C,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CACjE;AAID,eAAO,MAAM,oBAAoB,EAAE,SAAS,kBAAkB,EAAsB,CAAC;AAErF,eAAO,MAAM,YAAY,GACvB,WAAW,SAAS,kBAAkB,EAAE,EACxC,QAAQ,eAAe,EAAE,EACzB,UAAU,QAAQ,KACjB,IAKF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// No built-in enrichers. Kept explicit (and exported) so tests and docs can
|
|
2
|
+
// reference the empty set and so the registration path stays exercised.
|
|
3
|
+
export const NO_BUILTIN_ENRICHERS = Object.freeze([]);
|
|
4
|
+
export const runEnrichers = (enrichers, events, sections) => {
|
|
5
|
+
for (const enricher of enrichers) {
|
|
6
|
+
if (!enricher.applies(events))
|
|
7
|
+
continue;
|
|
8
|
+
enricher.contribute(events, sections);
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=enrichers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrichers.js","sourceRoot":"","sources":["../../src/compaction/enrichers.ts"],"names":[],"mappings":"AA0BA,4EAA4E;AAC5E,wEAAwE;AACxE,MAAM,CAAC,MAAM,oBAAoB,GAAkC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAErF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,SAAwC,EACxC,MAAyB,EACzB,QAAkB,EACZ,EAAE;IACR,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,SAAS;QACxC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { CompactionResult, ExtensionAPI, SessionEntry } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { type CompactionEnricher } from "./enrichers.js";
|
|
3
|
+
type CompactionEngine = "pi" | "fabric";
|
|
4
|
+
export type CutResult = {
|
|
5
|
+
ok: true;
|
|
6
|
+
summarized: SessionEntry[];
|
|
7
|
+
firstKeptEntryId: string;
|
|
8
|
+
firstSummarizedEntryId: string;
|
|
9
|
+
lastSummarizedEntryId: string;
|
|
10
|
+
lastTimestamp: string;
|
|
11
|
+
} | {
|
|
12
|
+
ok: false;
|
|
13
|
+
reason: "empty";
|
|
14
|
+
};
|
|
15
|
+
export declare const computeCut: (branchEntries: SessionEntry[]) => CutResult;
|
|
16
|
+
export interface FabricCompactionDetails {
|
|
17
|
+
compactor: "fabric";
|
|
18
|
+
version: 1;
|
|
19
|
+
sections: string[];
|
|
20
|
+
summarizedEntryRange: {
|
|
21
|
+
first: string;
|
|
22
|
+
last: string;
|
|
23
|
+
};
|
|
24
|
+
sourceEntryCount: number;
|
|
25
|
+
firstKeptEntryId: string;
|
|
26
|
+
timestamp: string;
|
|
27
|
+
}
|
|
28
|
+
export declare const compileFabricSummary: (branchEntries: SessionEntry[], tokensBefore: number, enrichers?: readonly CompactionEnricher[]) => {
|
|
29
|
+
compaction: CompactionResult<FabricCompactionDetails>;
|
|
30
|
+
} | {
|
|
31
|
+
cancel: true;
|
|
32
|
+
reason: string;
|
|
33
|
+
};
|
|
34
|
+
export interface CompactionHookOptions {
|
|
35
|
+
getEngine: () => CompactionEngine;
|
|
36
|
+
enrichers?: readonly CompactionEnricher[];
|
|
37
|
+
}
|
|
38
|
+
export declare const registerCompactionHook: (pi: ExtensionAPI, options: CompactionHookOptions) => void;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/compaction/hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EAEZ,YAAY,EACb,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAsC,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAgB7F,KAAK,gBAAgB,GAAG,IAAI,GAAG,QAAQ,CAAC;AAyHxC,MAAM,MAAM,SAAS,GACjB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;CACvB,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAGnC,eAAO,MAAM,UAAU,GAAI,eAAe,YAAY,EAAE,KAAG,SAmB1D,CAAC;AAmBF,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,QAAQ,CAAC;IACpB,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oBAAoB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,oBAAoB,GAC/B,eAAe,YAAY,EAAE,EAC7B,cAAc,MAAM,EACpB,YAAW,SAAS,kBAAkB,EAAyB,KAC9D;IAAE,UAAU,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAgC5F,CAAC;AAWF,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,gBAAgB,CAAC;IAClC,SAAS,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC3C;AAED,eAAO,MAAM,sBAAsB,GAAI,IAAI,YAAY,EAAE,SAAS,qBAAqB,KAAG,IAmBzF,CAAC"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { NO_BUILTIN_ENRICHERS, runEnrichers } from "./enrichers.js";
|
|
2
|
+
import { normalizeEntries } from "./normalize.js";
|
|
3
|
+
import { project } from "./projections.js";
|
|
4
|
+
import { renderSummary } from "./render.js";
|
|
5
|
+
const isMessageEntry = (entry) => entry.type === "message";
|
|
6
|
+
const isHiddenEmptyCustom = (message) => {
|
|
7
|
+
if (!message || typeof message !== "object")
|
|
8
|
+
return false;
|
|
9
|
+
const candidate = message;
|
|
10
|
+
if (candidate.role !== "custom" || candidate.display !== false)
|
|
11
|
+
return false;
|
|
12
|
+
const content = candidate.content;
|
|
13
|
+
return content === "" || (Array.isArray(content) && content.length === 0);
|
|
14
|
+
};
|
|
15
|
+
const toolCallIdsOf = (message) => {
|
|
16
|
+
const content = message.content;
|
|
17
|
+
if (!Array.isArray(content))
|
|
18
|
+
return [];
|
|
19
|
+
const ids = [];
|
|
20
|
+
for (const part of content) {
|
|
21
|
+
if (part && typeof part === "object" && "type" in part && part.type === "toolCall") {
|
|
22
|
+
const id = part.id;
|
|
23
|
+
if (typeof id === "string")
|
|
24
|
+
ids.push(id);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return ids;
|
|
28
|
+
};
|
|
29
|
+
const findLastCompaction = (entries) => {
|
|
30
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
31
|
+
const entry = entries[i];
|
|
32
|
+
if (entry.type === "compaction") {
|
|
33
|
+
return { index: i, firstKeptEntryId: entry.firstKeptEntryId };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
};
|
|
38
|
+
// Collect the live message entries — the raw window this compaction works on —
|
|
39
|
+
// starting from the last compaction's kept boundary (or right after the last
|
|
40
|
+
// compaction entry when the kept id is missing or the compact-all sentinel).
|
|
41
|
+
const collectLive = (entries) => {
|
|
42
|
+
const last = findLastCompaction(entries);
|
|
43
|
+
const live = [];
|
|
44
|
+
if (!last) {
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
if (!isMessageEntry(entry))
|
|
47
|
+
continue;
|
|
48
|
+
if (isHiddenEmptyCustom(entry.message))
|
|
49
|
+
continue;
|
|
50
|
+
live.push({ entry, message: entry.message });
|
|
51
|
+
}
|
|
52
|
+
return live;
|
|
53
|
+
}
|
|
54
|
+
const keptId = last.firstKeptEntryId;
|
|
55
|
+
const orphan = !keptId || !entries.some((e) => e.id === keptId);
|
|
56
|
+
if (orphan) {
|
|
57
|
+
for (let i = last.index + 1; i < entries.length; i++) {
|
|
58
|
+
const entry = entries[i];
|
|
59
|
+
if (!isMessageEntry(entry))
|
|
60
|
+
continue;
|
|
61
|
+
if (isHiddenEmptyCustom(entry.message))
|
|
62
|
+
continue;
|
|
63
|
+
live.push({ entry, message: entry.message });
|
|
64
|
+
}
|
|
65
|
+
return live;
|
|
66
|
+
}
|
|
67
|
+
let foundKept = false;
|
|
68
|
+
for (const entry of entries) {
|
|
69
|
+
if (!foundKept && entry.id === keptId)
|
|
70
|
+
foundKept = true;
|
|
71
|
+
if (!foundKept)
|
|
72
|
+
continue;
|
|
73
|
+
if (!isMessageEntry(entry))
|
|
74
|
+
continue;
|
|
75
|
+
if (isHiddenEmptyCustom(entry.message))
|
|
76
|
+
continue;
|
|
77
|
+
live.push({ entry, message: entry.message });
|
|
78
|
+
}
|
|
79
|
+
return live;
|
|
80
|
+
};
|
|
81
|
+
const lastUserIndex = (live) => {
|
|
82
|
+
for (let i = live.length - 1; i >= 0; i--) {
|
|
83
|
+
if (live[i].message.role === "user")
|
|
84
|
+
return i;
|
|
85
|
+
}
|
|
86
|
+
return -1;
|
|
87
|
+
};
|
|
88
|
+
// True when the turn starting at `cutIdx` has tool calls without matching
|
|
89
|
+
// results in the live window (assistant emitted a call but no result landed
|
|
90
|
+
// before compaction). Structural: id match only.
|
|
91
|
+
const turnIncomplete = (live, cutIdx) => {
|
|
92
|
+
const calls = new Set();
|
|
93
|
+
const results = new Set();
|
|
94
|
+
for (let i = cutIdx + 1; i < live.length; i++) {
|
|
95
|
+
const message = live[i].message;
|
|
96
|
+
if (message.role === "user")
|
|
97
|
+
break;
|
|
98
|
+
if (message.role === "toolResult" && typeof message.toolCallId === "string") {
|
|
99
|
+
results.add(message.toolCallId);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
for (const id of toolCallIdsOf(message)) {
|
|
103
|
+
calls.add(id);
|
|
104
|
+
if (!results.has(id)) {
|
|
105
|
+
// unmatched so far; keep scanning in case a later result matches
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const id of calls) {
|
|
110
|
+
if (!results.has(id))
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
return false;
|
|
114
|
+
};
|
|
115
|
+
const previousUserIndex = (live, before) => {
|
|
116
|
+
for (let i = before - 1; i >= 0; i--) {
|
|
117
|
+
if (live[i].message.role === "user")
|
|
118
|
+
return i;
|
|
119
|
+
}
|
|
120
|
+
return -1;
|
|
121
|
+
};
|
|
122
|
+
// Pure cut over the raw branch entries. Exported for deterministic testing.
|
|
123
|
+
export const computeCut = (branchEntries) => {
|
|
124
|
+
const live = collectLive(branchEntries);
|
|
125
|
+
if (live.length === 0)
|
|
126
|
+
return { ok: false, reason: "empty" };
|
|
127
|
+
let cutIdx = lastUserIndex(live);
|
|
128
|
+
if (cutIdx > 0 && turnIncomplete(live, cutIdx)) {
|
|
129
|
+
const prev = previousUserIndex(live, cutIdx);
|
|
130
|
+
cutIdx = prev; // may be -1 / 0
|
|
131
|
+
}
|
|
132
|
+
if (cutIdx <= 0) {
|
|
133
|
+
// No earlier complete-turn boundary to cut at — compact the whole window.
|
|
134
|
+
const summarized = live.map((l) => l.entry);
|
|
135
|
+
return boundary(summarized, "");
|
|
136
|
+
}
|
|
137
|
+
const summarized = live.slice(0, cutIdx).map((l) => l.entry);
|
|
138
|
+
const firstKeptEntryId = live[cutIdx].entry.id;
|
|
139
|
+
return boundary(summarized, firstKeptEntryId);
|
|
140
|
+
};
|
|
141
|
+
const boundary = (summarized, firstKeptEntryId) => {
|
|
142
|
+
if (summarized.length === 0)
|
|
143
|
+
return { ok: false, reason: "empty" };
|
|
144
|
+
const first = summarized[0];
|
|
145
|
+
const last = summarized[summarized.length - 1];
|
|
146
|
+
return {
|
|
147
|
+
ok: true,
|
|
148
|
+
summarized,
|
|
149
|
+
firstKeptEntryId,
|
|
150
|
+
firstSummarizedEntryId: first.id,
|
|
151
|
+
lastSummarizedEntryId: last.id,
|
|
152
|
+
lastTimestamp: last.timestamp,
|
|
153
|
+
};
|
|
154
|
+
};
|
|
155
|
+
export const compileFabricSummary = (branchEntries, tokensBefore, enrichers = NO_BUILTIN_ENRICHERS) => {
|
|
156
|
+
const cut = computeCut(branchEntries);
|
|
157
|
+
if (!cut.ok)
|
|
158
|
+
return { cancel: true, reason: "fabric: nothing to compact" };
|
|
159
|
+
const events = normalizeEntries(cut.summarized);
|
|
160
|
+
const sections = project(events);
|
|
161
|
+
runEnrichers(enrichers, events, sections);
|
|
162
|
+
const summary = renderSummary(sections, {
|
|
163
|
+
firstEntryId: cut.firstSummarizedEntryId,
|
|
164
|
+
lastEntryId: cut.lastSummarizedEntryId,
|
|
165
|
+
lastTimestamp: cut.lastTimestamp,
|
|
166
|
+
});
|
|
167
|
+
const details = {
|
|
168
|
+
compactor: "fabric",
|
|
169
|
+
version: 1,
|
|
170
|
+
sections: SECTION_HEADERS.filter(({ key }) => sections[key].length > 0).map(({ header }) => header),
|
|
171
|
+
summarizedEntryRange: { first: cut.firstSummarizedEntryId, last: cut.lastSummarizedEntryId },
|
|
172
|
+
sourceEntryCount: events.length,
|
|
173
|
+
firstKeptEntryId: cut.firstKeptEntryId,
|
|
174
|
+
timestamp: cut.lastTimestamp,
|
|
175
|
+
};
|
|
176
|
+
return {
|
|
177
|
+
compaction: {
|
|
178
|
+
summary,
|
|
179
|
+
firstKeptEntryId: cut.firstKeptEntryId,
|
|
180
|
+
tokensBefore,
|
|
181
|
+
details,
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
const SECTION_HEADERS = [
|
|
186
|
+
{ key: "goal", header: "[Session Goal]" },
|
|
187
|
+
{ key: "files", header: "[Files And Changes]" },
|
|
188
|
+
{ key: "commits", header: "[Commits]" },
|
|
189
|
+
{ key: "outstanding", header: "[Outstanding Context]" },
|
|
190
|
+
{ key: "earlierTurns", header: "[Earlier Turns]" },
|
|
191
|
+
{ key: "status", header: "[Current Status]" },
|
|
192
|
+
];
|
|
193
|
+
export const registerCompactionHook = (pi, options) => {
|
|
194
|
+
pi.on("session_before_compact", (event) => {
|
|
195
|
+
if (event.customInstructions === "__pi_vcc__")
|
|
196
|
+
return;
|
|
197
|
+
if (options.getEngine() !== "fabric")
|
|
198
|
+
return;
|
|
199
|
+
const { preparation, branchEntries } = event;
|
|
200
|
+
const result = compileFabricSummary(branchEntries ?? [], preparation.tokensBefore, options.enrichers);
|
|
201
|
+
if ("cancel" in result) {
|
|
202
|
+
if (event._piVccOverriding) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
return { cancel: true };
|
|
206
|
+
}
|
|
207
|
+
event._fabricCompaction = true;
|
|
208
|
+
return { compaction: result.compaction };
|
|
209
|
+
});
|
|
210
|
+
};
|
|
211
|
+
//# sourceMappingURL=hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/compaction/hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { SessionEntry } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
interface EventBase {
|
|
3
|
+
index: number;
|
|
4
|
+
entryId: string;
|
|
5
|
+
}
|
|
6
|
+
interface UserEvent extends EventBase {
|
|
7
|
+
kind: "user";
|
|
8
|
+
text: string;
|
|
9
|
+
}
|
|
10
|
+
interface AssistantTextEvent extends EventBase {
|
|
11
|
+
kind: "assistantText";
|
|
12
|
+
text: string;
|
|
13
|
+
}
|
|
14
|
+
interface ThinkingEvent extends EventBase {
|
|
15
|
+
kind: "thinking";
|
|
16
|
+
text: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ToolCallEvent extends EventBase {
|
|
19
|
+
kind: "toolCall";
|
|
20
|
+
toolCallId: string;
|
|
21
|
+
name: string;
|
|
22
|
+
args: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
interface ToolResultEvent extends EventBase {
|
|
25
|
+
kind: "toolResult";
|
|
26
|
+
toolCallId: string;
|
|
27
|
+
toolName: string;
|
|
28
|
+
isError: boolean;
|
|
29
|
+
text: string;
|
|
30
|
+
}
|
|
31
|
+
interface BashEvent extends EventBase {
|
|
32
|
+
kind: "bash";
|
|
33
|
+
toolCallId: string;
|
|
34
|
+
command: string;
|
|
35
|
+
isError: boolean;
|
|
36
|
+
exitCode: number | null;
|
|
37
|
+
output: string;
|
|
38
|
+
}
|
|
39
|
+
export type CompactionEvent = UserEvent | AssistantTextEvent | ThinkingEvent | ToolCallEvent | ToolResultEvent | BashEvent;
|
|
40
|
+
declare const firstLine: (text: string) => string;
|
|
41
|
+
export declare const normalizeEntries: (entries: SessionEntry[]) => CompactionEvent[];
|
|
42
|
+
export { firstLine };
|
|
43
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/compaction/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,iCAAiC,CAAC;AAUzF,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,SAAU,SAAQ,SAAS;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,kBAAmB,SAAQ,SAAS;IAC5C,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,aAAc,SAAQ,SAAS;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,UAAU,eAAgB,SAAQ,SAAS;IACzC,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,SAAU,SAAQ,SAAS;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,kBAAkB,GAClB,aAAa,GACb,aAAa,GACb,eAAe,GACf,SAAS,CAAC;AAiBd,QAAA,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAIjC,CAAC;AAcF,eAAO,MAAM,gBAAgB,GAAI,SAAS,YAAY,EAAE,KAAG,eAAe,EAgGzE,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
const isMessageEntry = (entry) => entry.type === "message";
|
|
2
|
+
const textOfContent = (content) => {
|
|
3
|
+
if (typeof content === "string")
|
|
4
|
+
return content;
|
|
5
|
+
if (!Array.isArray(content))
|
|
6
|
+
return "";
|
|
7
|
+
const parts = [];
|
|
8
|
+
for (const part of content) {
|
|
9
|
+
if (part && typeof part === "object" && "type" in part) {
|
|
10
|
+
if (part.type === "text" && typeof part.text === "string")
|
|
11
|
+
parts.push(part.text);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return parts.join("\n");
|
|
15
|
+
};
|
|
16
|
+
const firstLine = (text) => {
|
|
17
|
+
const trimmed = text.trimStart();
|
|
18
|
+
const nl = trimmed.indexOf("\n");
|
|
19
|
+
return nl < 0 ? trimmed : trimmed.slice(0, nl);
|
|
20
|
+
};
|
|
21
|
+
// Normalize a window of SessionEntries into a flat, typed event stream.
|
|
22
|
+
// `entries` must already be the live window to summarize (post last-compaction
|
|
23
|
+
// boundary, up to the cut). Tool results are paired back to their tool calls by
|
|
24
|
+
// id so a bash result can carry the command from the originating call; this
|
|
25
|
+
// pairing is structural (id match), never prose-based.
|
|
26
|
+
export const normalizeEntries = (entries) => {
|
|
27
|
+
const events = [];
|
|
28
|
+
const calls = new Map();
|
|
29
|
+
let index = 0;
|
|
30
|
+
const push = (event) => {
|
|
31
|
+
index += 1;
|
|
32
|
+
events.push({ ...event, index });
|
|
33
|
+
};
|
|
34
|
+
for (const entry of entries) {
|
|
35
|
+
if (!isMessageEntry(entry))
|
|
36
|
+
continue;
|
|
37
|
+
const message = entry.message;
|
|
38
|
+
if (!message || typeof message !== "object")
|
|
39
|
+
continue;
|
|
40
|
+
const role = message.role;
|
|
41
|
+
const entryId = entry.id;
|
|
42
|
+
if (role === "user") {
|
|
43
|
+
push({ kind: "user", entryId, text: textOfContent(message.content) });
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (role === "assistant") {
|
|
47
|
+
const content = message.content;
|
|
48
|
+
if (!Array.isArray(content))
|
|
49
|
+
continue;
|
|
50
|
+
for (const part of content) {
|
|
51
|
+
if (!part || typeof part !== "object" || !("type" in part))
|
|
52
|
+
continue;
|
|
53
|
+
if (part.type === "text" && typeof part.text === "string") {
|
|
54
|
+
push({ kind: "assistantText", entryId, text: part.text });
|
|
55
|
+
}
|
|
56
|
+
else if (part.type === "thinking" && typeof part.thinking === "string") {
|
|
57
|
+
push({ kind: "thinking", entryId, text: part.thinking });
|
|
58
|
+
}
|
|
59
|
+
else if (part.type === "toolCall" && typeof part.id === "string" && typeof part.name === "string") {
|
|
60
|
+
const args = (part.arguments ?? {});
|
|
61
|
+
calls.set(part.id, { name: part.name, args });
|
|
62
|
+
push({ kind: "toolCall", entryId, toolCallId: part.id, name: part.name, args });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (role === "toolResult") {
|
|
68
|
+
const toolResult = message;
|
|
69
|
+
const toolCallId = typeof toolResult.toolCallId === "string" ? toolResult.toolCallId : "";
|
|
70
|
+
const toolName = typeof toolResult.toolName === "string" ? toolResult.toolName : "";
|
|
71
|
+
const isError = toolResult.isError === true;
|
|
72
|
+
const text = textOfContent(toolResult.content);
|
|
73
|
+
if (toolName === "bash") {
|
|
74
|
+
const pending = toolCallId ? calls.get(toolCallId) : undefined;
|
|
75
|
+
const command = pending && typeof pending.args.command === "string"
|
|
76
|
+
? pending.args.command
|
|
77
|
+
: "";
|
|
78
|
+
push({
|
|
79
|
+
kind: "bash",
|
|
80
|
+
entryId,
|
|
81
|
+
toolCallId,
|
|
82
|
+
command,
|
|
83
|
+
isError,
|
|
84
|
+
exitCode: null,
|
|
85
|
+
output: text,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
push({ kind: "toolResult", entryId, toolCallId, toolName, isError, text });
|
|
90
|
+
}
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (role === "bashExecution") {
|
|
94
|
+
const bash = message;
|
|
95
|
+
const exitCode = typeof bash.exitCode === "number" ? bash.exitCode : null;
|
|
96
|
+
push({
|
|
97
|
+
kind: "bash",
|
|
98
|
+
entryId,
|
|
99
|
+
toolCallId: "",
|
|
100
|
+
command: typeof bash.command === "string" ? bash.command : "",
|
|
101
|
+
isError: exitCode !== null && exitCode !== 0,
|
|
102
|
+
exitCode,
|
|
103
|
+
output: typeof bash.output === "string" ? bash.output : "",
|
|
104
|
+
});
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
// custom / branchSummary / compactionSummary and any other roles carry no
|
|
108
|
+
// raw work signal for the deterministic core and are skipped here.
|
|
109
|
+
}
|
|
110
|
+
return events;
|
|
111
|
+
};
|
|
112
|
+
export { firstLine };
|
|
113
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/compaction/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type CompactionEvent } from "./normalize.js";
|
|
2
|
+
export interface Sections {
|
|
3
|
+
goal: string[];
|
|
4
|
+
files: string[];
|
|
5
|
+
commits: string[];
|
|
6
|
+
outstanding: string[];
|
|
7
|
+
earlierTurns: string[];
|
|
8
|
+
status: string[];
|
|
9
|
+
transcript: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare const projectOutstanding: (events: CompactionEvent[]) => string[];
|
|
12
|
+
export declare const project: (events: CompactionEvent[]) => Sections;
|
|
13
|
+
//# sourceMappingURL=projections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projections.d.ts","sourceRoot":"","sources":["../../src/compaction/projections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,eAAe,EAAsB,MAAM,gBAAgB,CAAC;AASrF,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AA+KD,eAAO,MAAM,kBAAkB,GAAI,QAAQ,eAAe,EAAE,KAAG,MAAM,EA6DpE,CAAC;AA4HF,eAAO,MAAM,OAAO,GAAI,QAAQ,eAAe,EAAE,KAAG,QAQlD,CAAC"}
|