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
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [1.2.3] - 2026-07-25
6
+
7
+ ### Fixed
8
+ - **Session context now respects observation visibility** -- Automatic session handoff and manual session-context reads in the CLI, MCP server, and Workbench apply the caller's project, team, and personal-memory reader. A new identity cannot receive another agent's personal observations through session startup.
9
+ - **Identity before handoff** -- CLI and MCP coordination sessions establish their explicit identity before assembling prior context, so an owner's own personal records remain available while a newly joined agent fails closed.
10
+ - **Graph-side disclosure guard** -- Agent-facing session handoff no longer derives graph-neighbor hints from graph relations that do not yet carry observation visibility metadata.
11
+
5
12
  ## [1.2.2] - 2026-07-25
6
13
 
7
14
  ### Added
package/dist/sdk.js CHANGED
@@ -15346,7 +15346,7 @@ async function startSession(projectDir2, projectId, opts) {
15346
15346
  status: "active",
15347
15347
  agent: opts?.agent
15348
15348
  };
15349
- const previousContext = await getSessionContext(projectDir2, projectId);
15349
+ const previousContext = await getSessionContext(projectDir2, projectId, 3, opts?.reader);
15350
15350
  const sessionStore = getSessionStore();
15351
15351
  const aliasSet = await resolveProjectIds(projectId);
15352
15352
  await sessionStore.atomicRolloverInsert(session, [...aliasSet], now3);
@@ -15364,23 +15364,27 @@ async function endSession(projectDir2, sessionId, summary) {
15364
15364
  await sessionStore.update(session);
15365
15365
  return session;
15366
15366
  }
15367
- async function getSessionContext(projectDir2, projectId, limit = 3) {
15367
+ async function getSessionContext(projectDir2, projectId, limit = 3, reader) {
15368
15368
  const aliasSet = await resolveProjectIds(projectId);
15369
15369
  const [sessions, allObs] = await Promise.all([
15370
15370
  loadAliasSessions(aliasSet),
15371
15371
  loadAliasActiveObservations(aliasSet)
15372
15372
  ]);
15373
+ const readableObs = reader ? allObs.filter((observation) => {
15374
+ const observationReader = reader.projectId && aliasSet.has(observation.projectId) ? { ...reader, projectId: observation.projectId } : reader;
15375
+ return canReadObservation(observation, observationReader);
15376
+ }) : allObs;
15373
15377
  const isNoisySummary = (summary) => {
15374
15378
  if (!summary) return false;
15375
15379
  return NOISE_PATTERNS2.some((p) => p.test(summary)) || SYSTEM_SELF_PATTERNS.some((p) => p.test(summary));
15376
15380
  };
15377
15381
  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);
15378
- if (projectSessions.length === 0 && allObs.length === 0) {
15382
+ if (projectSessions.length === 0 && readableObs.length === 0) {
15379
15383
  return "";
15380
15384
  }
15381
15385
  const lines = [];
15382
15386
  const projectTokens = tokenizeProjectId(projectId);
15383
- const projectObs = allObs.filter((obs) => !isNoiseObservation(obs) && !isSystemSelfObservation(obs));
15387
+ const projectObs = readableObs.filter((obs) => !isNoiseObservation(obs) && !isSystemSelfObservation(obs));
15384
15388
  const l2Scored = projectObs.filter((obs) => PRIORITY_TYPES.has(obs.type) && classifyLayer(obs) === "L2").map((obs) => ({ obs, score: scoreObservationForSessionContext(obs, projectTokens) })).sort((a, b) => {
15385
15389
  if (b.score !== a.score) return b.score - a.score;
15386
15390
  return new Date(b.obs.createdAt).getTime() - new Date(a.obs.createdAt).getTime();
@@ -15406,7 +15410,7 @@ async function getSessionContext(projectDir2, projectId, limit = 3) {
15406
15410
  const hasL1Content = l1HookObs.length > 0 || l3GitCount > 0;
15407
15411
  if (hasL1Content) {
15408
15412
  let graphNeighbors = [];
15409
- if (activeEntities.length > 0) {
15413
+ if (!reader && activeEntities.length > 0) {
15410
15414
  try {
15411
15415
  const graphMgr = new KnowledgeGraphManager(projectDir2);
15412
15416
  await graphMgr.init();
@@ -15532,6 +15536,7 @@ var init_session = __esm({
15532
15536
  init_session_store();
15533
15537
  init_graph();
15534
15538
  init_secret_filter();
15539
+ init_visibility();
15535
15540
  PRIORITY_TYPES = /* @__PURE__ */ new Set(["gotcha", "decision", "problem-solution", "trade-off", "discovery"]);
15536
15541
  TYPE_EMOJI = {
15537
15542
  "gotcha": "[DISCOVERY]",
@@ -26915,7 +26920,7 @@ The path should point to a directory containing a .git folder.`
26915
26920
  };
26916
26921
  const server = existingServer ?? new McpServer({
26917
26922
  name: "memorix",
26918
- version: true ? "1.2.2" : "1.0.1"
26923
+ version: true ? "1.2.3" : "1.0.1"
26919
26924
  });
26920
26925
  const originalRegisterTool = server.registerTool.bind(server);
26921
26926
  server.registerTool = ((name, ...args) => {
@@ -29416,7 +29421,6 @@ Ensure the path points to a directory containing a .git folder (or a subdirector
29416
29421
  const unresolved = requireResolvedProject("start a project session");
29417
29422
  if (unresolved) return unresolved;
29418
29423
  const { startSession: startSession2 } = await Promise.resolve().then(() => (init_session(), session_exports));
29419
- const result = await startSession2(projectDir2, project.id, { sessionId, agent });
29420
29424
  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)";
29421
29425
  const shouldJoinTeam = !!joinTeam;
29422
29426
  let registeredAgent = null;
@@ -29473,6 +29477,11 @@ Ensure the path points to a directory containing a .git folder (or a subdirector
29473
29477
  }
29474
29478
  } catch {
29475
29479
  }
29480
+ const result = await startSession2(projectDir2, project.id, {
29481
+ sessionId,
29482
+ agent,
29483
+ reader: getObservationReader()
29484
+ });
29476
29485
  const lines = [
29477
29486
  `[OK] Session started: ${result.session.id}`,
29478
29487
  `Project: ${project.name} (${project.id})`,
@@ -29595,7 +29604,7 @@ ${summary ? "Summary saved for next session context injection." : "No summary pr
29595
29604
  async ({ limit }) => {
29596
29605
  const safeLimit = limit != null ? coerceNumber(limit, 3) : 3;
29597
29606
  const { getSessionContext: getSessionContext2, listSessions: listSessions2 } = await Promise.resolve().then(() => (init_session(), session_exports));
29598
- const context = await getSessionContext2(projectDir2, project.id, safeLimit);
29607
+ const context = await getSessionContext2(projectDir2, project.id, safeLimit, getObservationReader());
29599
29608
  const sessions = await listSessions2(projectDir2, project.id);
29600
29609
  const activeSessions = sessions.filter((s) => s.status === "active");
29601
29610
  const completedSessions = sessions.filter((s) => s.status === "completed");