opencode-fractal-memory 0.6.12 → 0.6.14

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.
@@ -2,7 +2,8 @@ import { memLog, memLogSimple, setSessionId } from "../logging";
2
2
  import { generateFileSummary, generateFileLabel, SOURCE_FILE_EXTENSIONS } from "../file-summary";
3
3
  import { distillRules, predictiveRateToolCall, applyScoreDecay } from "../hooks";
4
4
  import * as fs from "node:fs";
5
- export function createHookHandlers(store, client, memConfig, ruleCache, ruleCacheDirty, sessionInjectionLock, latestUserMessage) {
5
+ let activeSessionCount = 0;
6
+ export function createHookHandlers(store, client, memConfig, ruleCache, ruleCacheDirty, sessionInjectionLock, latestUserMessage, managementServer) {
6
7
  return {
7
8
  "experimental.chat.system.transform": async (input, output) => {
8
9
  const sessionId = input.sessionID ?? `session-${Date.now()}`;
@@ -149,19 +150,30 @@ export function createHookHandlers(store, client, memConfig, ruleCache, ruleCach
149
150
  memLog("warn", "file-summary", "Failed to store file memory", { error: String(err) });
150
151
  }
151
152
  },
152
- "session.created": async (event) => {
153
- const sessionId = event.properties?.info?.id ?? "unknown";
154
- await store.createSessionMetrics(sessionId);
155
- setSessionId(sessionId);
156
- },
157
- "session.idle": async (event) => {
158
- const sessionId = event.properties?.sessionID ?? "unknown";
159
- await store.updateSessionMetrics(sessionId, { endedAt: Date.now(), status: "completed" });
160
- if (memConfig?.autoDistill?.enabled) {
161
- distillRules(store, memConfig.autoDistill, sessionId, client).then(msg => memLog("info", "auto-distill", msg)).catch(err => memLog("error", "auto-distill", "Failed", { error: String(err) }));
153
+ event: async (input) => {
154
+ const { type, properties } = input.event;
155
+ if (type === "session.created") {
156
+ const sessionId = properties.info?.id ?? "unknown";
157
+ await store.createSessionMetrics(sessionId);
158
+ setSessionId(sessionId);
159
+ activeSessionCount++;
160
+ managementServer.start();
161
+ }
162
+ else if (type === "session.idle") {
163
+ const sessionId = properties.sessionID ?? "unknown";
164
+ await store.updateSessionMetrics(sessionId, { endedAt: Date.now(), status: "completed" });
165
+ if (memConfig?.autoDistill?.enabled) {
166
+ distillRules(store, memConfig.autoDistill, sessionId, client).then(msg => memLog("info", "auto-distill", msg)).catch(err => memLog("error", "auto-distill", "Failed", { error: String(err) }));
167
+ }
168
+ if (memConfig?.predictiveRating?.enabled) {
169
+ applyScoreDecay(store, memConfig.predictiveRating).then(msg => memLog("info", "predictive-rating", msg)).catch(err => memLog("error", "predictive-rating", "Decay failed", { error: String(err) }));
170
+ }
162
171
  }
163
- if (memConfig?.predictiveRating?.enabled) {
164
- applyScoreDecay(store, memConfig.predictiveRating).then(msg => memLog("info", "predictive-rating", msg)).catch(err => memLog("error", "predictive-rating", "Decay failed", { error: String(err) }));
172
+ else if (type === "session.deleted") {
173
+ activeSessionCount = Math.max(0, activeSessionCount - 1);
174
+ if (activeSessionCount === 0) {
175
+ managementServer.stop();
176
+ }
165
177
  }
166
178
  },
167
179
  };
@@ -33,22 +33,16 @@ export const MemoryPlugin = async (ctx) => {
33
33
  const sessionInjectionLock = new Map();
34
34
  const latestUserMessage = { value: "" };
35
35
  const autoRetrieveHook = createAutoRetrieveIfEnabled(store, memConfig);
36
- const handlers = createHookHandlers(store, client, memConfig, ruleCache, ruleCacheDirty, sessionInjectionLock, latestUserMessage);
36
+ const handlers = createHookHandlers(store, client, memConfig, ruleCache, ruleCacheDirty, sessionInjectionLock, latestUserMessage, { start: ensureManagementServer, stop: stopManagementServer });
37
37
  const toolMap = createToolMap(store, journalTools, client);
38
38
  memLog("info", "init", "Plugin initialization completed", { totalDurationMs: perfNow() - t0 });
39
39
  return {
40
40
  ...handlers,
41
41
  ...(autoRetrieveHook || {}),
42
42
  tool: toolMap,
43
- "session.created": async (event) => {
44
- const existing = handlers["session.created"];
45
- if (existing) {
46
- await existing(event);
47
- }
48
- ensureManagementServer();
49
- },
50
- "session.deleted": async () => {
43
+ dispose: async () => {
51
44
  stopManagementServer();
45
+ await store.close();
52
46
  },
53
47
  };
54
48
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-fractal-memory",
3
- "version": "0.6.12",
3
+ "version": "0.6.14",
4
4
  "description": "Fractal memory system for OpenCode with semantic search and automatic compression.",
5
5
  "main": "dist/plugin.js",
6
6
  "exports": {