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