pi-blackhole 0.4.2 → 0.4.3
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 +15 -0
- package/dist/index.js +11660 -0
- package/dist/index.js.map +1 -0
- package/example-config.json +1 -1
- package/index.ts +37 -63
- package/package.json +21 -9
- package/src/commands/cleanup.ts +279 -240
- package/src/commands/memory.ts +236 -184
- package/src/commands/pi-vcc.ts +202 -152
- package/src/commands/vcc-recall.ts +126 -95
- package/src/core/brief.ts +167 -33
- package/src/core/build-sections.ts +8 -2
- package/src/core/config-env.ts +117 -0
- package/src/core/content.ts +31 -7
- package/src/core/drill-down.ts +41 -11
- package/src/core/filter-noise.ts +9 -3
- package/src/core/format-recall.ts +15 -6
- package/src/core/format.ts +14 -4
- package/src/core/lineage.ts +9 -3
- package/src/core/load-messages.ts +24 -5
- package/src/core/normalize.ts +38 -14
- package/src/core/recall-scope.ts +11 -3
- package/src/core/render-entries.ts +22 -6
- package/src/core/sanitize.ts +5 -1
- package/src/core/search-entries.ts +111 -19
- package/src/core/settings.ts +1 -3
- package/src/core/summarize.ts +42 -21
- package/src/core/unified-config.ts +549 -411
- package/src/extract/commits.ts +4 -2
- package/src/extract/files.ts +10 -5
- package/src/extract/goals.ts +7 -2
- package/src/hooks/before-compact.ts +210 -88
- package/src/om/agents/dropper/agent.ts +380 -265
- package/src/om/agents/dropper/coverage.ts +102 -82
- package/src/om/agents/observer/agent.ts +242 -206
- package/src/om/agents/reflector/agent.ts +212 -153
- package/src/om/cleanup.ts +239 -218
- package/src/om/clipboard.ts +59 -51
- package/src/om/compaction-trigger.ts +448 -333
- package/src/om/config.ts +13 -6
- package/src/om/configure-overlay.ts +518 -355
- package/src/om/consolidation.ts +1460 -953
- package/src/om/cooldown.ts +75 -65
- package/src/om/debug-log.ts +86 -68
- package/src/om/ids.ts +1 -1
- package/src/om/ledger/fold.ts +89 -78
- package/src/om/ledger/progress.ts +181 -153
- package/src/om/ledger/projection.ts +248 -185
- package/src/om/ledger/recall.ts +247 -196
- package/src/om/ledger/render-summary.ts +79 -50
- package/src/om/ledger/types.ts +146 -117
- package/src/om/model-budget.ts +23 -13
- package/src/om/pending.ts +243 -179
- package/src/om/provider-stream.ts +52 -7
- package/src/om/retryable-error.ts +12 -16
- package/src/om/reverse-recall.ts +97 -91
- package/src/om/runtime.ts +474 -375
- package/src/om/serialize.ts +190 -166
- package/src/om/status-overlay.ts +246 -195
- package/src/om/tokens.ts +28 -21
- package/src/pi-base/blackhole-settings.ts +437 -0
- package/src/pi-base/config-manager.ts +440 -0
- package/src/pi-base/config.ts +469 -0
- package/src/pi-base/env.ts +43 -0
- package/src/pi-base/paths.ts +47 -0
- package/src/pi-base/settings/body.ts +1648 -0
- package/src/pi-base/settings/fields/action.ts +43 -0
- package/src/pi-base/settings/fields/boolean.ts +47 -0
- package/src/pi-base/settings/fields/custom.ts +72 -0
- package/src/pi-base/settings/fields/enum.ts +310 -0
- package/src/pi-base/settings/fields/index.ts +46 -0
- package/src/pi-base/settings/fields/model.ts +452 -0
- package/src/pi-base/settings/fields/string.ts +527 -0
- package/src/pi-base/settings/fields/text.ts +115 -0
- package/src/pi-base/settings/frame.ts +197 -0
- package/src/pi-base/settings/index.ts +77 -0
- package/src/pi-base/settings/inline-edit.ts +313 -0
- package/src/pi-base/settings/modal.ts +152 -0
- package/src/pi-base/settings/types.ts +500 -0
- package/src/pi-base/settings/validate-field.ts +113 -0
- package/src/pi-base/shell.ts +117 -0
- package/src/pi-base/types.ts +6 -0
- package/src/pi-base/ui.ts +32 -0
- package/src/tools/recall.ts +347 -225
- package/src/types.ts +20 -3
- package/tsup.config.ts +23 -0
- package/vitest.config.ts +15 -15
|
@@ -1,128 +1,148 @@
|
|
|
1
1
|
import type { Observation, Reflection } from "../../ledger/index.js";
|
|
2
2
|
|
|
3
3
|
export const REFLECTION_COVERAGE_TIERS = ["none", "partial", "strong"] as const;
|
|
4
|
-
export type ReflectionCoverageTier = typeof REFLECTION_COVERAGE_TIERS[number];
|
|
4
|
+
export type ReflectionCoverageTier = (typeof REFLECTION_COVERAGE_TIERS)[number];
|
|
5
5
|
|
|
6
6
|
type Relevance = Observation["relevance"];
|
|
7
7
|
|
|
8
|
-
type CoverageBucket = Record<
|
|
8
|
+
type CoverageBucket = Record<
|
|
9
|
+
ReflectionCoverageTier,
|
|
10
|
+
{ count: number; tokens: number }
|
|
11
|
+
>;
|
|
9
12
|
export type CoverageSummaryByRelevance = Record<Relevance, CoverageBucket>;
|
|
10
|
-
export type CoverageTransitionSummaryByRelevance = Record<
|
|
13
|
+
export type CoverageTransitionSummaryByRelevance = Record<
|
|
14
|
+
Relevance,
|
|
15
|
+
Record<string, { count: number; tokens: number }>
|
|
16
|
+
>;
|
|
11
17
|
|
|
12
|
-
export const REFLECTION_COVERAGE_DROP_RANK: Record<
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
18
|
+
export const REFLECTION_COVERAGE_DROP_RANK: Record<
|
|
19
|
+
ReflectionCoverageTier,
|
|
20
|
+
number
|
|
21
|
+
> = {
|
|
22
|
+
strong: 0,
|
|
23
|
+
partial: 1,
|
|
24
|
+
none: 2,
|
|
16
25
|
};
|
|
17
26
|
|
|
18
|
-
export function reflectionSupportCounts(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
export function reflectionSupportCounts(
|
|
28
|
+
reflections: readonly Reflection[],
|
|
29
|
+
): Map<string, number> {
|
|
30
|
+
const counts = new Map<string, number>();
|
|
31
|
+
for (const reflection of reflections) {
|
|
32
|
+
const uniqueIds = new Set(reflection.supportingObservationIds);
|
|
33
|
+
for (const id of uniqueIds) counts.set(id, (counts.get(id) ?? 0) + 1);
|
|
34
|
+
}
|
|
35
|
+
return counts;
|
|
25
36
|
}
|
|
26
37
|
|
|
27
|
-
export function reflectionCoverageTierForCount(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
38
|
+
export function reflectionCoverageTierForCount(
|
|
39
|
+
count: number,
|
|
40
|
+
): ReflectionCoverageTier {
|
|
41
|
+
if (count <= 0) return "none";
|
|
42
|
+
if (count === 1) return "partial";
|
|
43
|
+
return "strong";
|
|
31
44
|
}
|
|
32
45
|
|
|
33
46
|
export function reflectionCoverageMap(
|
|
34
|
-
|
|
35
|
-
|
|
47
|
+
observations: readonly Observation[],
|
|
48
|
+
reflections: readonly Reflection[],
|
|
36
49
|
): Map<string, ReflectionCoverageTier> {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
50
|
+
const counts = reflectionSupportCounts(reflections);
|
|
51
|
+
return new Map(
|
|
52
|
+
observations.map((observation) => [
|
|
53
|
+
observation.id,
|
|
54
|
+
reflectionCoverageTierForCount(counts.get(observation.id) ?? 0),
|
|
55
|
+
]),
|
|
56
|
+
);
|
|
42
57
|
}
|
|
43
58
|
|
|
44
59
|
function emptyCoverageBucket(): CoverageBucket {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
60
|
+
return {
|
|
61
|
+
none: { count: 0, tokens: 0 },
|
|
62
|
+
partial: { count: 0, tokens: 0 },
|
|
63
|
+
strong: { count: 0, tokens: 0 },
|
|
64
|
+
};
|
|
50
65
|
}
|
|
51
66
|
|
|
52
67
|
export function emptyCoverageSummaryByRelevance(): CoverageSummaryByRelevance {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
68
|
+
return {
|
|
69
|
+
low: emptyCoverageBucket(),
|
|
70
|
+
medium: emptyCoverageBucket(),
|
|
71
|
+
high: emptyCoverageBucket(),
|
|
72
|
+
critical: emptyCoverageBucket(),
|
|
73
|
+
};
|
|
59
74
|
}
|
|
60
75
|
|
|
61
76
|
export function summarizeCoverageByRelevance(
|
|
62
|
-
|
|
63
|
-
|
|
77
|
+
observations: readonly Observation[],
|
|
78
|
+
coverageById: ReadonlyMap<string, ReflectionCoverageTier>,
|
|
64
79
|
): CoverageSummaryByRelevance {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
80
|
+
const summary = emptyCoverageSummaryByRelevance();
|
|
81
|
+
for (const observation of observations) {
|
|
82
|
+
const tier = coverageById.get(observation.id) ?? "none";
|
|
83
|
+
const bucket = summary[observation.relevance][tier];
|
|
84
|
+
bucket.count++;
|
|
85
|
+
bucket.tokens += observation.tokenCount;
|
|
86
|
+
}
|
|
87
|
+
return summary;
|
|
73
88
|
}
|
|
74
89
|
|
|
75
90
|
export function summarizeCoverageByRelevanceForIds(
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
91
|
+
ids: readonly string[],
|
|
92
|
+
observations: readonly Observation[],
|
|
93
|
+
coverageById: ReadonlyMap<string, ReflectionCoverageTier>,
|
|
79
94
|
): CoverageSummaryByRelevance {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
95
|
+
const byId = new Map(
|
|
96
|
+
observations.map((observation) => [observation.id, observation]),
|
|
97
|
+
);
|
|
98
|
+
const selected = ids.flatMap((id) => {
|
|
99
|
+
const observation = byId.get(id);
|
|
100
|
+
return observation ? [observation] : [];
|
|
101
|
+
});
|
|
102
|
+
return summarizeCoverageByRelevance(selected, coverageById);
|
|
86
103
|
}
|
|
87
104
|
|
|
88
105
|
export function emptyCoverageTransitionSummaryByRelevance(): CoverageTransitionSummaryByRelevance {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
106
|
+
return {
|
|
107
|
+
low: {},
|
|
108
|
+
medium: {},
|
|
109
|
+
high: {},
|
|
110
|
+
critical: {},
|
|
111
|
+
};
|
|
95
112
|
}
|
|
96
113
|
|
|
97
114
|
export function summarizeCoverageTransitionsByRelevance(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
115
|
+
observations: readonly Observation[],
|
|
116
|
+
beforeCoverageById: ReadonlyMap<string, ReflectionCoverageTier>,
|
|
117
|
+
afterCoverageById: ReadonlyMap<string, ReflectionCoverageTier>,
|
|
101
118
|
): CoverageTransitionSummaryByRelevance {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
119
|
+
const summary = emptyCoverageTransitionSummaryByRelevance();
|
|
120
|
+
for (const observation of observations) {
|
|
121
|
+
const before = beforeCoverageById.get(observation.id) ?? "none";
|
|
122
|
+
const after = afterCoverageById.get(observation.id) ?? "none";
|
|
123
|
+
if (before === after) continue;
|
|
124
|
+
const key = `${before}->${after}`;
|
|
125
|
+
const bucket = summary[observation.relevance][key] ?? {
|
|
126
|
+
count: 0,
|
|
127
|
+
tokens: 0,
|
|
128
|
+
};
|
|
129
|
+
bucket.count++;
|
|
130
|
+
bucket.tokens += observation.tokenCount;
|
|
131
|
+
summary[observation.relevance][key] = bucket;
|
|
132
|
+
}
|
|
133
|
+
return summary;
|
|
114
134
|
}
|
|
115
135
|
|
|
116
136
|
export function observationToDropperLine(
|
|
117
|
-
|
|
118
|
-
|
|
137
|
+
observation: Observation,
|
|
138
|
+
coverage: ReflectionCoverageTier,
|
|
119
139
|
): string {
|
|
120
|
-
|
|
140
|
+
return `[${observation.id}] ${observation.timestamp} [${observation.relevance}] [coverage: ${coverage}] ${observation.content}`;
|
|
121
141
|
}
|
|
122
142
|
|
|
123
143
|
export function coverageTierForObservation(
|
|
124
|
-
|
|
125
|
-
|
|
144
|
+
observation: Observation,
|
|
145
|
+
coverageById: ReadonlyMap<string, ReflectionCoverageTier>,
|
|
126
146
|
): ReflectionCoverageTier {
|
|
127
|
-
|
|
147
|
+
return coverageById.get(observation.id) ?? "none";
|
|
128
148
|
}
|