opencode-fractal-memory 0.2.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.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +493 -0
  3. package/agent/memory-hints.md +98 -0
  4. package/agent/memory-researcher.md +56 -0
  5. package/commands/memory-auto-test.md +10 -0
  6. package/commands/memory-cache-status.md +13 -0
  7. package/commands/memory-check-context.md +4 -0
  8. package/commands/memory-compress.md +13 -0
  9. package/commands/memory-dashboard.md +23 -0
  10. package/commands/memory-delete.md +24 -0
  11. package/commands/memory-detect-topics.md +28 -0
  12. package/commands/memory-distill.md +35 -0
  13. package/commands/memory-drilldown-query.md +28 -0
  14. package/commands/memory-drilldown.md +11 -0
  15. package/commands/memory-extract-patterns.md +4 -0
  16. package/commands/memory-generate-embeddings.md +26 -0
  17. package/commands/memory-get.md +26 -0
  18. package/commands/memory-help.md +55 -0
  19. package/commands/memory-injection-feedback.md +26 -0
  20. package/commands/memory-injection-stats.md +11 -0
  21. package/commands/memory-list.md +4 -0
  22. package/commands/memory-llm-compress.md +34 -0
  23. package/commands/memory-mcp.md +20 -0
  24. package/commands/memory-prune.md +4 -0
  25. package/commands/memory-rate.md +48 -0
  26. package/commands/memory-reflect.md +37 -0
  27. package/commands/memory-replace.md +26 -0
  28. package/commands/memory-retrieve.md +34 -0
  29. package/commands/memory-search.md +28 -0
  30. package/commands/memory-session-stats.md +4 -0
  31. package/commands/memory-set.md +31 -0
  32. package/commands/memory-stats.md +11 -0
  33. package/commands/memory-summarize.md +29 -0
  34. package/commands/memory-tool-stats.md +4 -0
  35. package/commands/memory-total-tokens.md +10 -0
  36. package/commands/memory-verify.md +4 -0
  37. package/commands/memory-version.md +9 -0
  38. package/dist/cache.js +39 -0
  39. package/dist/config.js +120 -0
  40. package/dist/embeddings.js +125 -0
  41. package/dist/ensure-models.js +70 -0
  42. package/dist/file-summary.js +143 -0
  43. package/dist/frontmatter.js +28 -0
  44. package/dist/hnsw-index.js +138 -0
  45. package/dist/hooks/auto-discover.js +4 -0
  46. package/dist/hooks/auto-distill.js +120 -0
  47. package/dist/hooks/auto-retrieve/content.js +47 -0
  48. package/dist/hooks/auto-retrieve/detection.js +50 -0
  49. package/dist/hooks/auto-retrieve/formatting.js +19 -0
  50. package/dist/hooks/auto-retrieve/index.js +163 -0
  51. package/dist/hooks/auto-retrieve/scoring.js +56 -0
  52. package/dist/hooks/auto-retrieve.js +1 -0
  53. package/dist/hooks/index.js +4 -0
  54. package/dist/hooks/predictive-rating.js +87 -0
  55. package/dist/journal.js +279 -0
  56. package/dist/logging.js +147 -0
  57. package/dist/management/helpers.js +227 -0
  58. package/dist/management/router.js +48 -0
  59. package/dist/management/routes.js +197 -0
  60. package/dist/management-server.js +4 -0
  61. package/dist/management-standalone.js +31 -0
  62. package/dist/mcp/logging.js +57 -0
  63. package/dist/mcp/server.js +251 -0
  64. package/dist/mcp/transform.js +48 -0
  65. package/dist/mcp-server.js +18 -0
  66. package/dist/memory.js +2 -0
  67. package/dist/ollama.js +74 -0
  68. package/dist/plugin/hooks.js +168 -0
  69. package/dist/plugin/index.js +28 -0
  70. package/dist/plugin/init.js +109 -0
  71. package/dist/plugin/state.js +75 -0
  72. package/dist/plugin/tools.js +45 -0
  73. package/dist/plugin.js +2 -0
  74. package/dist/procedural/store.js +1 -0
  75. package/dist/procedural/types.js +1 -0
  76. package/dist/seed-nodes.js +804 -0
  77. package/dist/storage/compress-ops.js +129 -0
  78. package/dist/storage/compression/formatters.js +243 -0
  79. package/dist/storage/compression/index.js +107 -0
  80. package/dist/storage/compression/patterns.js +138 -0
  81. package/dist/storage/expiration.js +66 -0
  82. package/dist/storage/index.js +1 -0
  83. package/dist/storage/injection-events.js +82 -0
  84. package/dist/storage/lifecycle.js +65 -0
  85. package/dist/storage/maintenance.js +60 -0
  86. package/dist/storage/migrations/definitions.js +374 -0
  87. package/dist/storage/migrations/index.js +21 -0
  88. package/dist/storage/navigation.js +98 -0
  89. package/dist/storage/queries/base.js +44 -0
  90. package/dist/storage/queries/links.js +32 -0
  91. package/dist/storage/queries/nodes.js +189 -0
  92. package/dist/storage/queries/search-helpers.js +239 -0
  93. package/dist/storage/scoring.js +36 -0
  94. package/dist/storage/search.js +233 -0
  95. package/dist/storage/session-tracking.js +180 -0
  96. package/dist/storage/sqlite.js +329 -0
  97. package/dist/storage/tool-usage.js +56 -0
  98. package/dist/storage/types.js +1 -0
  99. package/dist/storage/utils.js +94 -0
  100. package/dist/tools/auto-test.js +24 -0
  101. package/dist/tools/cache-status.js +36 -0
  102. package/dist/tools/compress.js +186 -0
  103. package/dist/tools/core.js +307 -0
  104. package/dist/tools/dashboard.js +97 -0
  105. package/dist/tools/help.js +59 -0
  106. package/dist/tools/index.js +12 -0
  107. package/dist/tools/inject.js +91 -0
  108. package/dist/tools/injection-debug.js +48 -0
  109. package/dist/tools/journal.js +105 -0
  110. package/dist/tools/llm-compress.js +41 -0
  111. package/dist/tools/middle-term.js +68 -0
  112. package/dist/tools/playbook.js +64 -0
  113. package/dist/tools/reflect.js +291 -0
  114. package/dist/tools/search.js +188 -0
  115. package/dist/tools/session.js +189 -0
  116. package/dist/tools/shared.js +74 -0
  117. package/dist/tools/skill.js +37 -0
  118. package/dist/tools/stats.js +256 -0
  119. package/dist/tools/version.js +13 -0
  120. package/dist/tools.js +18 -0
  121. package/dist/utils/hybridScore.js +67 -0
  122. package/management/public/app.js +1529 -0
  123. package/management/public/index.html +486 -0
  124. package/management/public/three.min.js +6 -0
  125. package/package.json +65 -0
  126. package/scripts/download-models.ts +16 -0
  127. package/scripts/postinstall.cjs +30 -0
@@ -0,0 +1,109 @@
1
+ import { createSqliteMemoryStore as createMemoryStore } from "../storage/sqlite";
2
+ import { loadMemConfig } from "../config";
3
+ import { generateEmbedding } from "../embeddings";
4
+ import { ensureModels, ensureAgentFiles, ensureCommandFiles } from "../ensure-models";
5
+ import { createAutoRetrieveHook } from "../hooks";
6
+ import { loadConfig } from "../journal";
7
+ import { createJournalStore } from "../journal";
8
+ import { startManagementServer } from "../management-server";
9
+ import { SEED_NODES } from "../seed-nodes";
10
+ import * as tools from "../tools";
11
+ import { memLog } from "../logging";
12
+ import { setCacheConfig } from "../cache";
13
+ import { setHighContextThreshold, setCriticalContextThreshold, setMaxInjectionTokens, setCoreInjectionTokens, setAutoCompressThreshold } from "./state";
14
+ export async function initStorage(directory) {
15
+ const store = createMemoryStore(directory);
16
+ await store.ensureSeed();
17
+ await ensureModels();
18
+ await ensureAgentFiles().catch(() => { });
19
+ await ensureCommandFiles().catch(() => { });
20
+ return store;
21
+ }
22
+ export async function loadPluginConfig(directory) {
23
+ const memConfig = await loadMemConfig(directory);
24
+ memLog("info", "config", "[plugin] Config loaded", { directory, autoRetrieve: memConfig.autoRetrieve });
25
+ setHighContextThreshold(memConfig.highContextThreshold);
26
+ setCriticalContextThreshold(memConfig.criticalContextThreshold);
27
+ setMaxInjectionTokens(memConfig.maxInjectionTokens);
28
+ setCoreInjectionTokens(memConfig.coreInjectionTokens);
29
+ setAutoCompressThreshold(memConfig.autoCompressThreshold);
30
+ setCacheConfig(memConfig.cacheSize, memConfig.cacheTTLHours);
31
+ return memConfig;
32
+ }
33
+ export async function seedRuleNodes(store) {
34
+ for (const seed of SEED_NODES) {
35
+ try {
36
+ await store.getNodeByLabel("global", seed.label);
37
+ }
38
+ catch {
39
+ await store.createNode({
40
+ scope: "global",
41
+ label: seed.label,
42
+ content: seed.content,
43
+ summary: seed.summary ?? null,
44
+ type: (seed.type ?? "note"),
45
+ level: 0,
46
+ parentIds: null,
47
+ embedding: null,
48
+ importance: 1,
49
+ metadata: seed.metadata ?? null,
50
+ });
51
+ }
52
+ }
53
+ }
54
+ export async function backfillData(store) {
55
+ for (const scope of ["global", "project"]) {
56
+ await store.backfillLinks(scope);
57
+ await store.backfillBinaryEmbeddingsAndBM25(scope);
58
+ }
59
+ await store.rebuildHNSWIndex();
60
+ }
61
+ export function scheduleBackgroundEmbeddings(store) {
62
+ setTimeout(async () => {
63
+ try {
64
+ const nodes = await store.listNodes("all");
65
+ const withoutEmbeddings = nodes.filter(n => !n.embedding);
66
+ if (withoutEmbeddings.length === 0)
67
+ return;
68
+ for (const node of withoutEmbeddings) {
69
+ try {
70
+ if (!node.content || node.content.trim().length < 10)
71
+ continue;
72
+ const embedding = await generateEmbedding(node.content);
73
+ await store.updateNode(node.id, { embedding });
74
+ }
75
+ catch { /* ignore */ }
76
+ }
77
+ }
78
+ catch { /* ignore */ }
79
+ }, 1000);
80
+ }
81
+ export async function setupJournal(directory) {
82
+ const config = await loadConfig();
83
+ if (!config.journal?.enabled)
84
+ return {};
85
+ const journalStore = createJournalStore();
86
+ return {
87
+ journal_write: tools.JournalWrite(journalStore, { directory, model: "", provider: "" }),
88
+ journal_read: tools.JournalRead(journalStore),
89
+ journal_search: tools.JournalSearch(journalStore),
90
+ };
91
+ }
92
+ export function startManagementIfEnabled(store, directory) {
93
+ const config = { enabled: true, port: 8787 };
94
+ loadConfig().then(c => {
95
+ const mgmtConfig = c.management;
96
+ if (mgmtConfig?.enabled === true) {
97
+ startManagementServer(store, directory, { enabled: true, port: mgmtConfig?.port ?? 8787 });
98
+ }
99
+ }).catch(() => { });
100
+ }
101
+ export function createAutoRetrieveIfEnabled(store, memConfig) {
102
+ return memConfig?.autoRetrieve?.enabled
103
+ ? createAutoRetrieveHook({
104
+ store,
105
+ config: memConfig,
106
+ log: (level, msg, data) => memLog(level, "auto-retrieve", msg, data),
107
+ })
108
+ : null;
109
+ }
@@ -0,0 +1,75 @@
1
+ import { getWorkingCache } from "../cache";
2
+ import { memLog } from "../logging";
3
+ import { loadMemConfig } from "../config";
4
+ export let CONTEXT_LIMIT = 128000;
5
+ export let HIGH_CONTEXT_THRESHOLD = 0.6;
6
+ export let CRITICAL_CONTEXT_THRESHOLD = 0.8;
7
+ export let MAX_INJECTION_TOKENS = 8000;
8
+ export let CORE_INJECTION_TOKENS = 2000;
9
+ export let AUTO_COMPRESS_THRESHOLD = 0.7;
10
+ export const AUTO_COMPRESS_COOLDOWN_MS = 5 * 60 * 60 * 1000;
11
+ export let lastAutoCompress = 0;
12
+ export let currentSessionId = null;
13
+ export function setContextLimit(v) { CONTEXT_LIMIT = v; }
14
+ export function setHighContextThreshold(v) { HIGH_CONTEXT_THRESHOLD = v; }
15
+ export function setCriticalContextThreshold(v) { CRITICAL_CONTEXT_THRESHOLD = v; }
16
+ export function setMaxInjectionTokens(v) { MAX_INJECTION_TOKENS = v; }
17
+ export function setCoreInjectionTokens(v) { CORE_INJECTION_TOKENS = v; }
18
+ export function setAutoCompressThreshold(v) { AUTO_COMPRESS_THRESHOLD = v; }
19
+ export function setLastAutoCompress(v) { lastAutoCompress = v; }
20
+ export function setCurrentSessionId(v) { currentSessionId = v; }
21
+ export async function captureMiddleTermContext(store, sessionId) {
22
+ try {
23
+ const config = await loadMemConfig(process.cwd());
24
+ if (!config.enableMiddleTermCapture) {
25
+ memLog("debug", "middle-term", "Middle-term capture disabled in config");
26
+ return;
27
+ }
28
+ const sid = sessionId || currentSessionId || "unknown";
29
+ memLog("info", "middle-term", "Starting pre-compaction context capture", { sessionId: sid });
30
+ const workingCache = getWorkingCache(sid);
31
+ const allNodes = await store.listNodes("all");
32
+ const recentNodes = allNodes
33
+ .filter(n => n.importance >= 0.3)
34
+ .sort((a, b) => (b.lastAccessed?.getTime() ?? 0) - (a.lastAccessed?.getTime() ?? 0))
35
+ .slice(0, 20);
36
+ const snapshot = {
37
+ timestamp: new Date().toISOString(),
38
+ sessionId: sid,
39
+ type: "middle-term-context",
40
+ workingCache: workingCache.map((n) => ({
41
+ id: n.id,
42
+ label: n.label,
43
+ importance: n.importance,
44
+ cachedAt: n.cachedAt,
45
+ })),
46
+ recentNodes: recentNodes.slice(0, 10).map(n => ({
47
+ id: n.id,
48
+ label: n.label,
49
+ importance: n.importance,
50
+ level: n.level,
51
+ })),
52
+ contextTokens: workingCache.reduce((sum, n) => sum + (n.content ? n.content.length / 4 : 0), 0),
53
+ };
54
+ const label = `middle-term:${sid}:${Date.now()}`;
55
+ const content = JSON.stringify(snapshot, null, 2);
56
+ await store.createNode({
57
+ scope: "project",
58
+ label,
59
+ content,
60
+ level: 0,
61
+ sticky: true,
62
+ importance: 0.8,
63
+ type: "note",
64
+ metadata: { tags: ["middle-term", "pre-compaction", sid], customType: "middle-term" },
65
+ });
66
+ memLog("info", "middle-term", "Captured pre-compaction context", {
67
+ sessionId: sid,
68
+ nodeCount: workingCache.length,
69
+ label,
70
+ });
71
+ }
72
+ catch (err) {
73
+ memLog("warn", "middle-term", "Failed to capture context", { error: String(err) });
74
+ }
75
+ }
@@ -0,0 +1,45 @@
1
+ import * as tools from "../tools";
2
+ import { MemoryPlaybookExecute } from "../tools/playbook";
3
+ export function createToolMap(store, journalTools, client) {
4
+ return {
5
+ memory_list: tools.MemoryList(store),
6
+ memory_set: tools.MemorySet(store),
7
+ memory_rate: tools.MemoryRate(store),
8
+ memory_get: tools.MemoryGet(store),
9
+ memory_fetch: tools.MemoryFetch(store),
10
+ memory_replace: tools.MemoryReplace(store),
11
+ memory_delete: tools.MemoryDelete(store),
12
+ memory_verify: tools.MemoryVerify(store),
13
+ memory_prune: tools.MemoryPrune(store),
14
+ memory_compress: tools.MemoryCompress(store),
15
+ memory_extract_patterns: tools.MemoryExtractPatterns(store),
16
+ memory_summarize: tools.MemorySummarize(store),
17
+ memory_llm_compress: tools.MemoryLlmCompress(store, client),
18
+ memory_stats: tools.MemoryStats(store),
19
+ memory_drilldown: tools.MemoryDrilldown(store),
20
+ memory_search: tools.MemorySearch(store),
21
+ memory_drilldown_query: tools.MemoryDrilldownQuery(store),
22
+ memory_detect_topics: tools.MemoryDetectTopics(store),
23
+ memory_generate_embeddings: tools.MemoryGenerateEmbeddings(store),
24
+ memory_check_context: tools.MemoryCheckContext(store),
25
+ memory_injection_stats: tools.MemoryInjectionStats(store),
26
+ memory_injection_feedback: tools.MemoryInjectionFeedback(store),
27
+ memory_tool_stats: tools.MemoryToolStats(store),
28
+ memory_session_stats: tools.MemorySessionStats(store),
29
+ memory_total_tokens: tools.MemoryTotalTokens(store, client),
30
+ memory_reflect: tools.MemoryReflect(store, client),
31
+ memory_distill: tools.MemoryDistill(store, client),
32
+ memory_inject: tools.MemoryInject(store),
33
+ memory_injection_debug: tools.MemoryInjectionDebug(store),
34
+ memory_middle_term: tools.MemoryMiddleTerm(store),
35
+ memory_dashboard: tools.MemoryDashboard(store),
36
+ memory_cache_status: tools.MemoryCacheStatus(store),
37
+ memory_help: tools.MemoryHelp(store),
38
+ memory_version: tools.MemoryVersion(store),
39
+ memory_auto_test: tools.createMemoryAutoTest(store),
40
+ memory_playbook_execute: MemoryPlaybookExecute(store),
41
+ memory_skill_load: tools.MemorySkillLoad(store),
42
+ skill: tools.MemorySkillLoad(store),
43
+ ...journalTools,
44
+ };
45
+ }
package/dist/plugin.js ADDED
@@ -0,0 +1,2 @@
1
+ export { MemoryPlugin } from "./plugin/index";
2
+ export { createMemoryStore } from "./memory";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};