pi-mega-compact 0.7.7 → 0.7.9

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 (114) hide show
  1. package/README.md +11 -12
  2. package/dist/extensions/dashboard-server/helpers.js +37 -0
  3. package/dist/extensions/dashboard-server/html/all-repos-tab.js +26 -0
  4. package/dist/extensions/dashboard-server/html/body-open.js +23 -0
  5. package/dist/extensions/dashboard-server/html/current-repo-tab.js +130 -0
  6. package/dist/extensions/dashboard-server/html/head-open.js +16 -0
  7. package/dist/extensions/dashboard-server/html/high-score-tab.js +25 -0
  8. package/dist/extensions/dashboard-server/html/repo-detail-modal.js +26 -0
  9. package/dist/extensions/dashboard-server/html/script.js +259 -0
  10. package/dist/extensions/dashboard-server/html/styles.js +103 -0
  11. package/dist/extensions/dashboard-server/html/summary-tab.js +19 -0
  12. package/dist/extensions/dashboard-server/html-template.js +41 -0
  13. package/dist/extensions/dashboard-server/html.js +756 -0
  14. package/dist/extensions/dashboard-server/index-reader.js +133 -0
  15. package/dist/extensions/dashboard-server/server.js +370 -0
  16. package/dist/extensions/dashboard-server/snapshot.js +43 -0
  17. package/dist/extensions/dashboard-server/state.js +30 -0
  18. package/dist/extensions/dashboard-server/types.js +5 -0
  19. package/dist/extensions/dashboard-server.js +7 -1315
  20. package/dist/extensions/mega-commands.js +162 -134
  21. package/dist/extensions/mega-compact.test.js +292 -24
  22. package/dist/extensions/mega-config.js +10 -0
  23. package/dist/extensions/mega-conflict-cmds.js +5 -1
  24. package/dist/extensions/mega-dashboard-cmds.js +29 -22
  25. package/dist/extensions/mega-db-cmds.js +11 -2
  26. package/dist/extensions/mega-events/agent-handlers.js +173 -0
  27. package/dist/extensions/mega-events/compact-handlers.js +133 -0
  28. package/dist/extensions/mega-events/context-handler.js +249 -0
  29. package/dist/extensions/mega-events/register.js +21 -0
  30. package/dist/extensions/mega-events/session-handlers.js +142 -0
  31. package/dist/extensions/mega-events.js +15 -652
  32. package/dist/extensions/mega-pipeline/compact.js +324 -0
  33. package/dist/extensions/mega-pipeline/memory-review.js +38 -0
  34. package/dist/extensions/mega-pipeline/recall.js +147 -0
  35. package/dist/extensions/mega-pipeline.js +9 -480
  36. package/dist/extensions/mega-runtime/helpers.js +40 -0
  37. package/dist/extensions/mega-runtime/query.js +29 -0
  38. package/dist/extensions/mega-runtime/state.js +711 -0
  39. package/dist/extensions/mega-runtime/widget.js +197 -0
  40. package/dist/extensions/mega-runtime.js +15 -932
  41. package/dist/src/store/sqlite/checkpoints.js +145 -0
  42. package/dist/src/store/sqlite/connection.js +35 -0
  43. package/dist/src/store/sqlite/dedup-mirror.js +64 -0
  44. package/dist/src/store/sqlite/foundation.js +38 -0
  45. package/dist/src/store/sqlite/global-index.js +224 -0
  46. package/dist/src/store/sqlite/index-store.js +167 -0
  47. package/dist/src/store/sqlite/maintenance.js +235 -0
  48. package/dist/src/store/sqlite/memories.js +164 -0
  49. package/dist/src/store/sqlite/memory.js +54 -0
  50. package/dist/src/store/sqlite/meta.js +82 -0
  51. package/dist/src/store/sqlite/minhash-lsh.js +47 -0
  52. package/dist/src/store/sqlite/model-snapshots.js +47 -0
  53. package/dist/src/store/sqlite/raptor.js +57 -0
  54. package/dist/src/store/sqlite/raw-transcript.js +134 -0
  55. package/dist/src/store/sqlite/schema.js +250 -0
  56. package/dist/src/store/sqlite/session-state.js +28 -0
  57. package/dist/src/store/sqlite/sessions.js +39 -0
  58. package/dist/src/store/sqlite/stats.js +66 -0
  59. package/dist/src/store/sqlite/transaction.js +19 -0
  60. package/dist/src/store/sqlite/utils.js +120 -0
  61. package/dist/src/store/sqlite.js +20 -1607
  62. package/dist/src/vectorStore/add.js +260 -0
  63. package/dist/src/vectorStore/dedup.js +52 -0
  64. package/dist/src/vectorStore/index.js +10 -0
  65. package/dist/src/vectorStore/queries.js +83 -0
  66. package/dist/src/vectorStore/search.js +95 -0
  67. package/dist/src/vectorStore/session.js +19 -0
  68. package/dist/src/vectorStore/store.js +105 -0
  69. package/dist/src/vectorStore/types.js +6 -0
  70. package/dist/src/vectorStore/utils.js +23 -0
  71. package/extensions/dashboard-server/html.ts +758 -0
  72. package/extensions/dashboard-server/index-reader.ts +130 -0
  73. package/extensions/dashboard-server/server.ts +358 -0
  74. package/extensions/dashboard-server/snapshot.ts +44 -0
  75. package/extensions/dashboard-server/state.ts +33 -0
  76. package/extensions/dashboard-server/types.ts +134 -0
  77. package/extensions/dashboard-server.ts +7 -1431
  78. package/extensions/mega-commands.ts +33 -10
  79. package/extensions/mega-compact.test.ts +453 -37
  80. package/extensions/mega-config.ts +22 -0
  81. package/extensions/mega-conflict-cmds.ts +6 -2
  82. package/extensions/mega-dashboard-cmds.ts +30 -23
  83. package/extensions/mega-db-cmds.ts +11 -3
  84. package/extensions/mega-events/agent-handlers.ts +214 -0
  85. package/extensions/mega-events/compact-handlers.ts +164 -0
  86. package/extensions/mega-events/context-handler.ts +290 -0
  87. package/extensions/mega-events/register.ts +37 -0
  88. package/extensions/mega-events/session-handlers.ts +165 -0
  89. package/extensions/mega-events.ts +15 -732
  90. package/extensions/mega-pipeline/compact.ts +366 -0
  91. package/extensions/mega-pipeline/memory-review.ts +46 -0
  92. package/extensions/mega-pipeline/recall.ts +165 -0
  93. package/extensions/mega-pipeline.ts +9 -537
  94. package/extensions/mega-runtime/helpers.ts +68 -0
  95. package/extensions/mega-runtime/query.ts +29 -0
  96. package/extensions/mega-runtime/state.ts +797 -0
  97. package/extensions/mega-runtime/widget.ts +258 -0
  98. package/extensions/mega-runtime.ts +15 -1076
  99. package/package.json +4 -3
  100. package/src/store/sqlite/checkpoints.ts +204 -0
  101. package/src/store/sqlite/dedup-mirror.ts +114 -0
  102. package/src/store/sqlite/foundation.ts +63 -0
  103. package/src/store/sqlite/global-index.ts +305 -0
  104. package/src/store/sqlite/maintenance.ts +294 -0
  105. package/src/store/sqlite/memories.ts +217 -0
  106. package/src/store/sqlite/meta.ts +108 -0
  107. package/src/store/sqlite/model-snapshots.ts +83 -0
  108. package/src/store/sqlite/raptor.ts +107 -0
  109. package/src/store/sqlite/raw-transcript.ts +221 -0
  110. package/src/store/sqlite/schema.ts +258 -0
  111. package/src/store/sqlite/session-state.ts +38 -0
  112. package/src/store/sqlite/stats.ts +127 -0
  113. package/src/store/sqlite/utils.ts +125 -0
  114. package/src/store/sqlite.ts +20 -2204
@@ -0,0 +1,142 @@
1
+ import { normalizeSessionId } from "../../src/store.js";
2
+ import { autoMaintain } from "../../src/store/sqlite.js";
3
+ import { recentUserQuery, WIDGET_KEY, } from "../mega-runtime.js";
4
+ import { doRecall, doRecallAsync, } from "../mega-pipeline.js";
5
+ import { recallMemoriesAndInline } from "../../src/recall.js";
6
+ /** Register session lifecycle event handlers. */
7
+ export function registerSessionHandlers(pi, runtime, config) {
8
+ // Capture model/provider whenever it changes (drives real cost estimation).
9
+ pi.on("model_select", async (_event, ctx) => {
10
+ runtime.captureModel(ctx);
11
+ runtime.snapshot(ctx);
12
+ });
13
+ pi.on("session_start", async (event, ctx) => {
14
+ runtime.resetRuntime(ctx.sessionManager.getSessionId());
15
+ runtime.captureModel(ctx); // best-effort: ctx.model may be set by session start
16
+ runtime.setStatus(ctx, config.auto ? "mega-compact: ready" : "mega-compact: manual only");
17
+ // S21: clear any stale memory block from a prior session.
18
+ runtime.pendingMemoryRecallBlock = undefined;
19
+ // Auto-inline on resume/fork/continue: stage the most relevant checkpoints
20
+ // so the next before_agent_start prepends them to the system prompt.
21
+ // Triggered whenever this session already has persisted checkpoints AND a
22
+ // usable query — that covers reason "resume"/"fork" (explicit) and
23
+ // reason "startup" (e.g. `pi --continue`s an existing session, which still
24
+ // emits "startup" but with a populated message window). A brand-new empty
25
+ // session has no checkpoints, so it's naturally excluded.
26
+ if (config.autoInline) {
27
+ const sid = normalizeSessionId(ctx.sessionManager.getSessionId());
28
+ const query = recentUserQuery(ctx);
29
+ if (query && runtime.store.stats(sid).checkpointCount > 0) {
30
+ // S17: use the async variant on resume so cross-repo HNSW recall can
31
+ // augment when this repo's store is thin. session_start is an async-safe
32
+ // point (unlike the mid-turn context handler, which stays sync).
33
+ const r = await doRecallAsync(runtime, config, ctx, query, "resume", {
34
+ crossRepo: config.crossRepoEnabled,
35
+ });
36
+ if (!r.empty) {
37
+ runtime.pendingRecallBlock = r.block;
38
+ const crossLabel = r.toInject.some((h) => h.repoId)
39
+ ? " (cross-repo)"
40
+ : "";
41
+ runtime.setStatus(ctx, `mega-compact: recalled ${r.toInject.length} chkpt${crossLabel}`);
42
+ runtime.logger.info("auto-inline", {
43
+ reason: event.reason,
44
+ query,
45
+ injected: r.toInject.map((h) => h.checkpoint.checkpointId),
46
+ crossRepo: r.toInject.some((h) => h.repoId),
47
+ });
48
+ }
49
+ }
50
+ // S21: parallel memory recall. Same async context so we can await without
51
+ // breaking the handler contract. Best-effort — never throws.
52
+ try {
53
+ const mr = await recallMemoriesAndInline({
54
+ query,
55
+ stateDir: runtime.getStateDir(),
56
+ limit: 5,
57
+ crossRepo: config.crossRepoEnabled,
58
+ crossRepoCosine: config.crossRepoCosine,
59
+ });
60
+ if (!mr.empty)
61
+ runtime.pendingMemoryRecallBlock = mr.block;
62
+ }
63
+ catch (err) {
64
+ runtime.logger.warn("memory-recall skipped", { err: String(err) });
65
+ }
66
+ }
67
+ // S27 Task 10: best-effort auto-maintenance on session start (prune rows
68
+ // older than 30d, checkpoint WAL if >10MB, VACUUM if DB >100MB + >20%
69
+ // freelist). Never blocks session start — swallows errors and logs a
70
+ // one-line summary for diagnostics.
71
+ try {
72
+ const m = autoMaintain(runtime.currentStateDir);
73
+ if (m && !m.endsWith("nothing to do"))
74
+ runtime.logger.info("db-auto-maintain", { result: m });
75
+ }
76
+ catch (e) {
77
+ runtime.logger.warn("db-auto-maintain-fail", { error: String(e) });
78
+ }
79
+ runtime.dashboard.event("session_start", {
80
+ reason: event.reason,
81
+ sessionId: runtime.rt.sessionId,
82
+ });
83
+ runtime.snapshot(ctx);
84
+ });
85
+ pi.on("session_tree", async (_event, ctx) => {
86
+ // Branch navigation invalidates region indexes — reset checkpoint memory but
87
+ // keep the on-disk store (markers replayed from entries below if needed).
88
+ runtime.resetRuntime(ctx.sessionManager.getSessionId());
89
+ runtime.setStatus(ctx, "mega-compact: ready (branch)");
90
+ if (config.autoInline) {
91
+ const query = recentUserQuery(ctx);
92
+ if (query) {
93
+ const r = doRecall(runtime, config, ctx, query, "resume");
94
+ if (!r.empty) {
95
+ runtime.pendingRecallBlock = r.block;
96
+ runtime.logger.info("auto-inline", {
97
+ reason: "session_tree",
98
+ query,
99
+ injected: r.toInject.map((h) => h.checkpoint.checkpointId),
100
+ });
101
+ }
102
+ // S21: parallel memory recall. Trigram embedder is sub-ms; await is fine.
103
+ try {
104
+ const mr = await recallMemoriesAndInline({
105
+ query,
106
+ stateDir: runtime.getStateDir(),
107
+ limit: 5,
108
+ crossRepo: config.crossRepoEnabled,
109
+ crossRepoCosine: config.crossRepoCosine,
110
+ });
111
+ if (!mr.empty)
112
+ runtime.pendingMemoryRecallBlock = mr.block;
113
+ }
114
+ catch (err) {
115
+ runtime.logger.warn("memory-recall skipped", { err: String(err) });
116
+ }
117
+ }
118
+ }
119
+ runtime.dashboard.event("session_tree", {
120
+ sessionId: runtime.rt.sessionId,
121
+ });
122
+ runtime.snapshot(ctx);
123
+ });
124
+ // ---- Auto-inline injection point: prepend staged recall to systemPrompt ----
125
+ pi.on("before_agent_start", async (event, ctx) => {
126
+ runtime.captureModel(ctx); // most reliable point ctx.model is populated
127
+ const cpBlock = runtime.pendingRecallBlock;
128
+ const memBlock = runtime.pendingMemoryRecallBlock;
129
+ if (!cpBlock && !memBlock)
130
+ return;
131
+ runtime.pendingRecallBlock = undefined;
132
+ runtime.pendingMemoryRecallBlock = undefined;
133
+ const composed = [cpBlock, memBlock].filter(Boolean).join("\n\n");
134
+ return { systemPrompt: `${event.systemPrompt}\n\n${composed}` };
135
+ });
136
+ pi.on("session_shutdown", async (_event, ctx) => {
137
+ runtime.setStatus(ctx, undefined);
138
+ runtime.activeAgents = 0;
139
+ runtime.currentTurn = 0;
140
+ ctx.ui.setWidget(WIDGET_KEY, [], { placement: "aboveEditor" });
141
+ });
142
+ }