memorix 1.2.2 → 1.2.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 (139) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/TEAM.md +86 -86
  3. package/dist/cli/index.js +34 -18
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/index.js +17 -8
  6. package/dist/index.js.map +1 -1
  7. package/dist/maintenance-runner.js.map +1 -1
  8. package/dist/memcode-runtime/CHANGELOG.md +7 -0
  9. package/dist/sdk.js +17 -8
  10. package/dist/sdk.js.map +1 -1
  11. package/docs/DESIGN_DECISIONS.md +357 -357
  12. package/docs/dev-log/progress.txt +18 -8
  13. package/package.json +1 -1
  14. package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
  15. package/src/audit/index.ts +156 -156
  16. package/src/cli/commands/audit-list.ts +89 -89
  17. package/src/cli/commands/background.ts +659 -659
  18. package/src/cli/commands/formation.ts +48 -48
  19. package/src/cli/commands/git-hook-install.ts +111 -111
  20. package/src/cli/commands/handoff.ts +54 -54
  21. package/src/cli/commands/hooks-status.ts +63 -63
  22. package/src/cli/commands/ingest-commit.ts +153 -153
  23. package/src/cli/commands/ingest-image.ts +66 -66
  24. package/src/cli/commands/ingest-log.ts +180 -180
  25. package/src/cli/commands/ingest.ts +44 -44
  26. package/src/cli/commands/integrate-shared.ts +15 -15
  27. package/src/cli/commands/lock.ts +82 -82
  28. package/src/cli/commands/message.ts +104 -104
  29. package/src/cli/commands/poll.ts +58 -58
  30. package/src/cli/commands/purge-all-memory.ts +85 -85
  31. package/src/cli/commands/purge-project-memory.ts +83 -83
  32. package/src/cli/commands/reasoning.ts +118 -118
  33. package/src/cli/commands/serve-shared.ts +118 -118
  34. package/src/cli/commands/session.ts +15 -7
  35. package/src/cli/commands/skills.ts +114 -114
  36. package/src/cli/commands/task.ts +167 -167
  37. package/src/cli/commands/transfer.ts +47 -47
  38. package/src/cli/commands/uninstall-project-artifacts.ts +85 -85
  39. package/src/cli/tui/ChatView.tsx +234 -234
  40. package/src/cli/tui/CommandBar.tsx +312 -312
  41. package/src/cli/tui/ContextRail.tsx +118 -118
  42. package/src/cli/tui/HeaderBar.tsx +72 -72
  43. package/src/cli/tui/LogoBanner.tsx +51 -51
  44. package/src/cli/tui/Sidebar.tsx +179 -179
  45. package/src/cli/tui/index.ts +41 -41
  46. package/src/cli/tui/markdown-render.tsx +371 -371
  47. package/src/cli/tui/session-service.ts +3 -2
  48. package/src/cli/tui/use-mouse.ts +157 -157
  49. package/src/cli/tui/useNavigation.ts +56 -56
  50. package/src/cli/update-checker.ts +211 -211
  51. package/src/cli/version.ts +7 -7
  52. package/src/cli/workbench.ts +1 -1
  53. package/src/compact/token-budget.ts +74 -74
  54. package/src/dashboard/project-classification.ts +64 -64
  55. package/src/embedding/fastembed-provider.ts +142 -142
  56. package/src/embedding/transformers-provider.ts +111 -111
  57. package/src/git/extractor.ts +209 -209
  58. package/src/git/hooks-path.ts +85 -85
  59. package/src/hooks/pattern-detector.ts +173 -173
  60. package/src/hooks/significance-filter.ts +250 -250
  61. package/src/llm/memory-manager.ts +328 -328
  62. package/src/llm/provider.ts +885 -885
  63. package/src/llm/quality.ts +248 -248
  64. package/src/memory/attribution-guard.ts +249 -249
  65. package/src/memory/disclosure-policy.ts +135 -135
  66. package/src/memory/entity-extractor.ts +197 -197
  67. package/src/memory/formation/evaluate.ts +217 -217
  68. package/src/memory/formation/extract.ts +361 -361
  69. package/src/memory/formation/index.ts +417 -417
  70. package/src/memory/formation/resolve.ts +344 -344
  71. package/src/memory/formation/types.ts +315 -315
  72. package/src/memory/freshness.ts +122 -122
  73. package/src/memory/graph.ts +197 -197
  74. package/src/memory/refs.ts +94 -94
  75. package/src/memory/secret-filter.ts +79 -79
  76. package/src/memory/session.ts +24 -9
  77. package/src/multimodal/image-loader.ts +143 -143
  78. package/src/orchestrate/adapters/claude-stream.ts +192 -192
  79. package/src/orchestrate/adapters/claude.ts +111 -111
  80. package/src/orchestrate/adapters/codex-stream.ts +134 -134
  81. package/src/orchestrate/adapters/codex.ts +41 -41
  82. package/src/orchestrate/adapters/gemini-stream.ts +166 -166
  83. package/src/orchestrate/adapters/gemini.ts +42 -42
  84. package/src/orchestrate/adapters/index.ts +73 -73
  85. package/src/orchestrate/adapters/opencode-stream.ts +143 -143
  86. package/src/orchestrate/adapters/opencode.ts +47 -47
  87. package/src/orchestrate/adapters/spawn-helper.ts +286 -286
  88. package/src/orchestrate/adapters/types.ts +77 -77
  89. package/src/orchestrate/capability-router.ts +284 -284
  90. package/src/orchestrate/context-compact.ts +188 -188
  91. package/src/orchestrate/cost-tracker.ts +219 -219
  92. package/src/orchestrate/error-recovery.ts +191 -191
  93. package/src/orchestrate/evidence.ts +140 -140
  94. package/src/orchestrate/ledger.ts +110 -110
  95. package/src/orchestrate/memorix-bridge.ts +343 -343
  96. package/src/orchestrate/output-budget.ts +80 -80
  97. package/src/orchestrate/permission.ts +152 -152
  98. package/src/orchestrate/pipeline-trace.ts +131 -131
  99. package/src/orchestrate/prompt-builder.ts +155 -155
  100. package/src/orchestrate/ring-buffer.ts +37 -37
  101. package/src/orchestrate/task-graph.ts +389 -389
  102. package/src/orchestrate/worktree.ts +232 -232
  103. package/src/project/aliases.ts +374 -374
  104. package/src/project/detector.ts +268 -268
  105. package/src/rules/adapters/claude-code.ts +99 -99
  106. package/src/rules/adapters/codex.ts +97 -97
  107. package/src/rules/adapters/copilot.ts +124 -124
  108. package/src/rules/adapters/cursor.ts +114 -114
  109. package/src/rules/adapters/kiro.ts +126 -126
  110. package/src/rules/adapters/trae.ts +56 -56
  111. package/src/rules/adapters/windsurf.ts +83 -83
  112. package/src/rules/syncer.ts +235 -235
  113. package/src/sdk.ts +299 -299
  114. package/src/search/intent-detector.ts +289 -289
  115. package/src/search/query-expansion.ts +52 -52
  116. package/src/server/formation-timeout.ts +27 -27
  117. package/src/server.ts +7 -2
  118. package/src/skills/mini-skills.ts +386 -386
  119. package/src/store/chat-store.ts +119 -119
  120. package/src/store/graph-store.ts +249 -249
  121. package/src/store/mini-skill-store.ts +349 -349
  122. package/src/store/persistence-json.ts +212 -212
  123. package/src/store/persistence.ts +291 -291
  124. package/src/store/project-affinity.ts +195 -195
  125. package/src/team/event-bus.ts +76 -76
  126. package/src/team/file-locks.ts +173 -173
  127. package/src/team/handoff.ts +161 -161
  128. package/src/team/messages.ts +203 -203
  129. package/src/team/poll.ts +132 -132
  130. package/src/team/tasks.ts +211 -211
  131. package/src/workspace/mcp-adapters/codex.ts +191 -191
  132. package/src/workspace/mcp-adapters/copilot.ts +105 -105
  133. package/src/workspace/mcp-adapters/cursor.ts +53 -53
  134. package/src/workspace/mcp-adapters/kiro.ts +64 -64
  135. package/src/workspace/mcp-adapters/opencode.ts +123 -123
  136. package/src/workspace/mcp-adapters/trae.ts +134 -134
  137. package/src/workspace/mcp-adapters/windsurf.ts +91 -91
  138. package/src/workspace/sanitizer.ts +60 -60
  139. package/src/workspace/workflow-sync.ts +131 -131
package/dist/index.js CHANGED
@@ -15342,7 +15342,7 @@ async function startSession(projectDir2, projectId, opts) {
15342
15342
  status: "active",
15343
15343
  agent: opts?.agent
15344
15344
  };
15345
- const previousContext = await getSessionContext(projectDir2, projectId);
15345
+ const previousContext = await getSessionContext(projectDir2, projectId, 3, opts?.reader);
15346
15346
  const sessionStore = getSessionStore();
15347
15347
  const aliasSet = await resolveProjectIds(projectId);
15348
15348
  await sessionStore.atomicRolloverInsert(session, [...aliasSet], now3);
@@ -15360,23 +15360,27 @@ async function endSession(projectDir2, sessionId, summary) {
15360
15360
  await sessionStore.update(session);
15361
15361
  return session;
15362
15362
  }
15363
- async function getSessionContext(projectDir2, projectId, limit = 3) {
15363
+ async function getSessionContext(projectDir2, projectId, limit = 3, reader) {
15364
15364
  const aliasSet = await resolveProjectIds(projectId);
15365
15365
  const [sessions, allObs] = await Promise.all([
15366
15366
  loadAliasSessions(aliasSet),
15367
15367
  loadAliasActiveObservations(aliasSet)
15368
15368
  ]);
15369
+ const readableObs = reader ? allObs.filter((observation) => {
15370
+ const observationReader = reader.projectId && aliasSet.has(observation.projectId) ? { ...reader, projectId: observation.projectId } : reader;
15371
+ return canReadObservation(observation, observationReader);
15372
+ }) : allObs;
15369
15373
  const isNoisySummary = (summary) => {
15370
15374
  if (!summary) return false;
15371
15375
  return NOISE_PATTERNS2.some((p) => p.test(summary)) || SYSTEM_SELF_PATTERNS.some((p) => p.test(summary));
15372
15376
  };
15373
15377
  const projectSessions = sessions.filter((session) => session.status === "completed").filter((session) => !isNoisySummary(session.summary)).sort((a, b) => new Date(b.endedAt || b.startedAt).getTime() - new Date(a.endedAt || a.startedAt).getTime()).slice(0, limit);
15374
- if (projectSessions.length === 0 && allObs.length === 0) {
15378
+ if (projectSessions.length === 0 && readableObs.length === 0) {
15375
15379
  return "";
15376
15380
  }
15377
15381
  const lines = [];
15378
15382
  const projectTokens = tokenizeProjectId(projectId);
15379
- const projectObs = allObs.filter((obs) => !isNoiseObservation(obs) && !isSystemSelfObservation(obs));
15383
+ const projectObs = readableObs.filter((obs) => !isNoiseObservation(obs) && !isSystemSelfObservation(obs));
15380
15384
  const l2Scored = projectObs.filter((obs) => PRIORITY_TYPES.has(obs.type) && classifyLayer(obs) === "L2").map((obs) => ({ obs, score: scoreObservationForSessionContext(obs, projectTokens) })).sort((a, b) => {
15381
15385
  if (b.score !== a.score) return b.score - a.score;
15382
15386
  return new Date(b.obs.createdAt).getTime() - new Date(a.obs.createdAt).getTime();
@@ -15402,7 +15406,7 @@ async function getSessionContext(projectDir2, projectId, limit = 3) {
15402
15406
  const hasL1Content = l1HookObs.length > 0 || l3GitCount > 0;
15403
15407
  if (hasL1Content) {
15404
15408
  let graphNeighbors = [];
15405
- if (activeEntities.length > 0) {
15409
+ if (!reader && activeEntities.length > 0) {
15406
15410
  try {
15407
15411
  const graphMgr = new KnowledgeGraphManager(projectDir2);
15408
15412
  await graphMgr.init();
@@ -15528,6 +15532,7 @@ var init_session = __esm({
15528
15532
  init_session_store();
15529
15533
  init_graph();
15530
15534
  init_secret_filter();
15535
+ init_visibility();
15531
15536
  PRIORITY_TYPES = /* @__PURE__ */ new Set(["gotcha", "decision", "problem-solution", "trade-off", "discovery"]);
15532
15537
  TYPE_EMOJI = {
15533
15538
  "gotcha": "[DISCOVERY]",
@@ -26999,7 +27004,7 @@ The path should point to a directory containing a .git folder.`
26999
27004
  };
27000
27005
  const server = existingServer ?? new McpServer({
27001
27006
  name: "memorix",
27002
- version: true ? "1.2.2" : "1.0.1"
27007
+ version: true ? "1.2.3" : "1.0.1"
27003
27008
  });
27004
27009
  const originalRegisterTool = server.registerTool.bind(server);
27005
27010
  server.registerTool = ((name, ...args) => {
@@ -29500,7 +29505,6 @@ Ensure the path points to a directory containing a .git folder (or a subdirector
29500
29505
  const unresolved = requireResolvedProject("start a project session");
29501
29506
  if (unresolved) return unresolved;
29502
29507
  const { startSession: startSession2 } = await Promise.resolve().then(() => (init_session(), session_exports));
29503
- const result = await startSession2(projectDir2, project.id, { sessionId, agent });
29504
29508
  const llmStatus = isLLMEnabled() ? `LLM enhanced mode: ${getLLMConfig()?.provider}/${getLLMConfig()?.model} (fact extraction + auto-dedup active)` : "LLM mode: off (set MEMORIX_LLM_API_KEY to enable enhanced memory quality)";
29505
29509
  const shouldJoinTeam = !!joinTeam;
29506
29510
  let registeredAgent = null;
@@ -29557,6 +29561,11 @@ Ensure the path points to a directory containing a .git folder (or a subdirector
29557
29561
  }
29558
29562
  } catch {
29559
29563
  }
29564
+ const result = await startSession2(projectDir2, project.id, {
29565
+ sessionId,
29566
+ agent,
29567
+ reader: getObservationReader()
29568
+ });
29560
29569
  const lines = [
29561
29570
  `[OK] Session started: ${result.session.id}`,
29562
29571
  `Project: ${project.name} (${project.id})`,
@@ -29679,7 +29688,7 @@ ${summary ? "Summary saved for next session context injection." : "No summary pr
29679
29688
  async ({ limit }) => {
29680
29689
  const safeLimit = limit != null ? coerceNumber(limit, 3) : 3;
29681
29690
  const { getSessionContext: getSessionContext2, listSessions: listSessions2 } = await Promise.resolve().then(() => (init_session(), session_exports));
29682
- const context = await getSessionContext2(projectDir2, project.id, safeLimit);
29691
+ const context = await getSessionContext2(projectDir2, project.id, safeLimit, getObservationReader());
29683
29692
  const sessions = await listSessions2(projectDir2, project.id);
29684
29693
  const activeSessions = sessions.filter((s) => s.status === "active");
29685
29694
  const completedSessions = sessions.filter((s) => s.status === "completed");