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/CHANGELOG.md CHANGED
@@ -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/TEAM.md CHANGED
@@ -1,18 +1,18 @@
1
- # Memorix Team Protocol
2
-
1
+ # Memorix Team Protocol
2
+
3
3
  Rules for project-scoped autonomous-agent coordination via Memorix team tools. The Team page is an **Agent Team status surface** — it shows explicitly joined autonomous agents, open tasks, locks, messages, handoffs, and what needs attention. It is NOT an organization backend, staffing admin tool, or automatic chat room between separate IDE windows.
4
4
 
5
5
  Only agents that are intentionally participating in team/task/message/lock workflows need this protocol. Memory-only sessions should stay lightweight and do not need a team identity.
6
6
 
7
7
  For real autonomous multi-agent development, prefer `memorix orchestrate`: it launches and supervises CLI agent workers through Memorix tasks, context, verification, and fix loops. The team tools support that workflow; they should not be interpreted as proof that unrelated IDE conversation windows can autonomously contact each other.
8
-
9
- There are 4 team tools, each with an `action` parameter:
10
-
11
- - `team_manage` — action: join / leave / status
12
- - `team_file_lock` — action: lock / unlock / status
13
- - `team_task` — action: create / claim / complete / list
14
- - `team_message` — action: send / broadcast / inbox
15
-
8
+
9
+ There are 4 team tools, each with an `action` parameter:
10
+
11
+ - `team_manage` — action: join / leave / status
12
+ - `team_file_lock` — action: lock / unlock / status
13
+ - `team_task` — action: create / claim / complete / list
14
+ - `team_message` — action: send / broadcast / inbox
15
+
16
16
  ## RULE 1: Start Lightweight, Join Team Explicitly
17
17
 
18
18
  At the **beginning of every memory session**, before project-scoped memory work:
@@ -25,82 +25,82 @@ At the **beginning of every memory session**, before project-scoped memory work:
25
25
  4. Store the returned **agent ID** only after an explicit join — you will need it for subsequent team operations.
26
26
  5. Call `memorix_poll` with your agent ID to see current autonomous agents, check available tasks, and read unread messages.
27
27
  6. If you need a custom role or capabilities, use explicit `team_manage(join)` so the role overrides the default mapping cleanly.
28
-
29
- ## RULE 2: Lock Before Edit
30
-
31
- Before modifying any file that another agent might also be working on:
32
-
33
- 1. Call `team_file_lock` with `action: "status"` and the file path to check if it is already locked.
34
- 2. If unlocked, call `team_file_lock` with `action: "lock"`, the file path, and your agent ID.
35
- 3. If locked by another agent, **do not edit that file**. Either:
36
- - Work on a different file.
37
- - Send a `request` message to the lock owner asking them to release it.
38
- - Wait and re-check later.
39
- 4. When you are done editing, call `team_file_lock` with `action: "unlock"` to release the lock.
40
-
41
- **Never edit a file locked by another agent.** Lock violations cause merge conflicts and data loss.
42
-
43
- Locks auto-expire after 10 minutes. If you hold a lock for extended work, re-lock periodically to refresh the TTL.
44
-
45
- ## RULE 3: Use Tasks for Work Coordination
46
-
47
- When the user assigns work that involves multiple agents or multiple steps:
48
-
49
- 1. Call `team_task` with `action: "create"` to break the work into discrete tasks with clear descriptions.
50
- 2. Use `deps` to declare dependencies between tasks (a task cannot be claimed until its dependencies are completed).
51
- 3. Call `team_task` with `action: "claim"` to assign a task to yourself before starting work on it.
52
- 4. Call `team_task` with `action: "complete"` and a `result` summary when the task is done.
53
- 5. Call `team_task` with `action: "list"` to see overall progress and find available work.
54
-
55
- Rules:
56
- - Only claim tasks whose dependencies are all completed.
57
- - Only one agent may claim a given task.
58
- - If you cannot complete a claimed task, leave the team so the task returns to pending and another agent can pick it up.
59
-
60
- ## RULE 4: Communication Protocol
61
-
62
- Use `team_message` with `action: "send"` for direct messages and `action: "broadcast"` for announcements. Message types and their intended use:
63
-
64
- | Type | Use |
65
- |------|-----|
66
- | `request` | Ask another agent to do something, release a lock, or provide information. |
67
- | `response` | Reply to a prior request. |
68
- | `info` | Share context: discoveries, status updates, warnings about tricky code. |
69
- | `announcement` | Broadcast to all agents: major state changes, deployment events, breaking changes. |
70
- | `contract` | Propose or agree on a division of work. Both agents should acknowledge. |
71
- | `error` | Report a blocking issue that requires another agent's attention. |
72
-
73
- Rules:
74
- - `action: "send"` requires the full UUID of the target agent. Get it from `team_manage` with `action: "status"`.
75
- - Check your inbox (`action: "inbox"`) at least once before starting new work and once before ending a session.
76
- - Keep message content under 10KB. Be concise and actionable.
77
-
78
- ## RULE 5: Leave on Session End
79
-
80
- When the session is ending:
81
-
82
- 1. Call `team_file_lock` with `action: "unlock"` for every file you have locked, or they will remain locked until TTL expiry (10 min).
83
- 2. If you have in-progress tasks you cannot finish, leave them — leaving releases your tasks back to pending.
84
- 3. Call `team_manage` with `action: "leave"` and your agent ID. This marks you inactive, releases all your locks, and clears your inbox.
85
-
86
- ## RULE 6: Conflict Prevention
87
-
88
- - **Check before acting.** Always check team status and file lock status before starting work to understand the current state.
89
- - **Communicate before diverging.** If you plan to refactor shared code, broadcast an `announcement` first so other agents can save their work.
90
- - **Respect lock ownership.** The lock holder has exclusive write access. No exceptions.
91
- - **Prefer small, scoped changes.** Large cross-cutting changes increase conflict risk. Coordinate via tasks and messages if a change touches files other agents are working on.
92
- - **Do not duplicate work.** Check the task list before creating new tasks. If a similar task exists, claim it instead of creating a duplicate.
93
-
94
- ## Summary of Required Calls
95
-
96
- | When | Tool Call |
97
- |------|-----------|
28
+
29
+ ## RULE 2: Lock Before Edit
30
+
31
+ Before modifying any file that another agent might also be working on:
32
+
33
+ 1. Call `team_file_lock` with `action: "status"` and the file path to check if it is already locked.
34
+ 2. If unlocked, call `team_file_lock` with `action: "lock"`, the file path, and your agent ID.
35
+ 3. If locked by another agent, **do not edit that file**. Either:
36
+ - Work on a different file.
37
+ - Send a `request` message to the lock owner asking them to release it.
38
+ - Wait and re-check later.
39
+ 4. When you are done editing, call `team_file_lock` with `action: "unlock"` to release the lock.
40
+
41
+ **Never edit a file locked by another agent.** Lock violations cause merge conflicts and data loss.
42
+
43
+ Locks auto-expire after 10 minutes. If you hold a lock for extended work, re-lock periodically to refresh the TTL.
44
+
45
+ ## RULE 3: Use Tasks for Work Coordination
46
+
47
+ When the user assigns work that involves multiple agents or multiple steps:
48
+
49
+ 1. Call `team_task` with `action: "create"` to break the work into discrete tasks with clear descriptions.
50
+ 2. Use `deps` to declare dependencies between tasks (a task cannot be claimed until its dependencies are completed).
51
+ 3. Call `team_task` with `action: "claim"` to assign a task to yourself before starting work on it.
52
+ 4. Call `team_task` with `action: "complete"` and a `result` summary when the task is done.
53
+ 5. Call `team_task` with `action: "list"` to see overall progress and find available work.
54
+
55
+ Rules:
56
+ - Only claim tasks whose dependencies are all completed.
57
+ - Only one agent may claim a given task.
58
+ - If you cannot complete a claimed task, leave the team so the task returns to pending and another agent can pick it up.
59
+
60
+ ## RULE 4: Communication Protocol
61
+
62
+ Use `team_message` with `action: "send"` for direct messages and `action: "broadcast"` for announcements. Message types and their intended use:
63
+
64
+ | Type | Use |
65
+ |------|-----|
66
+ | `request` | Ask another agent to do something, release a lock, or provide information. |
67
+ | `response` | Reply to a prior request. |
68
+ | `info` | Share context: discoveries, status updates, warnings about tricky code. |
69
+ | `announcement` | Broadcast to all agents: major state changes, deployment events, breaking changes. |
70
+ | `contract` | Propose or agree on a division of work. Both agents should acknowledge. |
71
+ | `error` | Report a blocking issue that requires another agent's attention. |
72
+
73
+ Rules:
74
+ - `action: "send"` requires the full UUID of the target agent. Get it from `team_manage` with `action: "status"`.
75
+ - Check your inbox (`action: "inbox"`) at least once before starting new work and once before ending a session.
76
+ - Keep message content under 10KB. Be concise and actionable.
77
+
78
+ ## RULE 5: Leave on Session End
79
+
80
+ When the session is ending:
81
+
82
+ 1. Call `team_file_lock` with `action: "unlock"` for every file you have locked, or they will remain locked until TTL expiry (10 min).
83
+ 2. If you have in-progress tasks you cannot finish, leave them — leaving releases your tasks back to pending.
84
+ 3. Call `team_manage` with `action: "leave"` and your agent ID. This marks you inactive, releases all your locks, and clears your inbox.
85
+
86
+ ## RULE 6: Conflict Prevention
87
+
88
+ - **Check before acting.** Always check team status and file lock status before starting work to understand the current state.
89
+ - **Communicate before diverging.** If you plan to refactor shared code, broadcast an `announcement` first so other agents can save their work.
90
+ - **Respect lock ownership.** The lock holder has exclusive write access. No exceptions.
91
+ - **Prefer small, scoped changes.** Large cross-cutting changes increase conflict risk. Coordinate via tasks and messages if a change touches files other agents are working on.
92
+ - **Do not duplicate work.** Check the task list before creating new tasks. If a similar task exists, claim it instead of creating a duplicate.
93
+
94
+ ## Summary of Required Calls
95
+
96
+ | When | Tool Call |
97
+ |------|-----------|
98
98
  | Session start | `memorix_session_start` (lightweight) |
99
99
  | Join Agent Team | `memorix_session_start(joinTeam=true)` or `team_manage(join)` |
100
100
  | After joining | `memorix_poll` (check status + inbox) |
101
- | Before editing a shared file | `team_file_lock(status)`, `team_file_lock(lock)` |
102
- | After editing | `team_file_lock(unlock)` |
103
- | Starting a unit of work | `team_task(claim)` or `team_task(create)` + `team_task(claim)` |
104
- | Finishing a unit of work | `team_task(complete)` |
105
- | Need to coordinate | `team_message(send)` or `team_message(broadcast)` |
106
- | Session end | `team_file_lock(unlock)` (all), `team_manage(leave)` |
101
+ | Before editing a shared file | `team_file_lock(status)`, `team_file_lock(lock)` |
102
+ | After editing | `team_file_lock(unlock)` |
103
+ | Starting a unit of work | `team_task(claim)` or `team_task(create)` + `team_task(claim)` |
104
+ | Finishing a unit of work | `team_task(complete)` |
105
+ | Need to coordinate | `team_message(send)` or `team_message(broadcast)` |
106
+ | Session end | `team_file_lock(unlock)` (all), `team_manage(leave)` |
package/dist/cli/index.js CHANGED
@@ -3212,7 +3212,7 @@ ${import_picocolors.default.gray(m3)} ${s2}
3212
3212
 
3213
3213
  // src/cli/version.ts
3214
3214
  function getCliVersion() {
3215
- return true ? "1.2.2" : pkg.version;
3215
+ return true ? "1.2.3" : pkg.version;
3216
3216
  }
3217
3217
  var init_version = __esm({
3218
3218
  "src/cli/version.ts"() {
@@ -41147,7 +41147,7 @@ async function startSession(projectDir2, projectId, opts) {
41147
41147
  status: "active",
41148
41148
  agent: opts?.agent
41149
41149
  };
41150
- const previousContext = await getSessionContext(projectDir2, projectId);
41150
+ const previousContext = await getSessionContext(projectDir2, projectId, 3, opts?.reader);
41151
41151
  const sessionStore = getSessionStore();
41152
41152
  const aliasSet = await resolveProjectIds(projectId);
41153
41153
  await sessionStore.atomicRolloverInsert(session, [...aliasSet], now3);
@@ -41165,23 +41165,27 @@ async function endSession(projectDir2, sessionId, summary) {
41165
41165
  await sessionStore.update(session);
41166
41166
  return session;
41167
41167
  }
41168
- async function getSessionContext(projectDir2, projectId, limit = 3) {
41168
+ async function getSessionContext(projectDir2, projectId, limit = 3, reader) {
41169
41169
  const aliasSet = await resolveProjectIds(projectId);
41170
41170
  const [sessions, allObs] = await Promise.all([
41171
41171
  loadAliasSessions(aliasSet),
41172
41172
  loadAliasActiveObservations(aliasSet)
41173
41173
  ]);
41174
+ const readableObs = reader ? allObs.filter((observation) => {
41175
+ const observationReader = reader.projectId && aliasSet.has(observation.projectId) ? { ...reader, projectId: observation.projectId } : reader;
41176
+ return canReadObservation(observation, observationReader);
41177
+ }) : allObs;
41174
41178
  const isNoisySummary = (summary) => {
41175
41179
  if (!summary) return false;
41176
41180
  return NOISE_PATTERNS2.some((p2) => p2.test(summary)) || SYSTEM_SELF_PATTERNS.some((p2) => p2.test(summary));
41177
41181
  };
41178
41182
  const projectSessions = sessions.filter((session) => session.status === "completed").filter((session) => !isNoisySummary(session.summary)).sort((a3, b3) => new Date(b3.endedAt || b3.startedAt).getTime() - new Date(a3.endedAt || a3.startedAt).getTime()).slice(0, limit);
41179
- if (projectSessions.length === 0 && allObs.length === 0) {
41183
+ if (projectSessions.length === 0 && readableObs.length === 0) {
41180
41184
  return "";
41181
41185
  }
41182
41186
  const lines = [];
41183
41187
  const projectTokens = tokenizeProjectId(projectId);
41184
- const projectObs = allObs.filter((obs) => !isNoiseObservation(obs) && !isSystemSelfObservation(obs));
41188
+ const projectObs = readableObs.filter((obs) => !isNoiseObservation(obs) && !isSystemSelfObservation(obs));
41185
41189
  const l2Scored = projectObs.filter((obs) => PRIORITY_TYPES.has(obs.type) && classifyLayer(obs) === "L2").map((obs) => ({ obs, score: scoreObservationForSessionContext(obs, projectTokens) })).sort((a3, b3) => {
41186
41190
  if (b3.score !== a3.score) return b3.score - a3.score;
41187
41191
  return new Date(b3.obs.createdAt).getTime() - new Date(a3.obs.createdAt).getTime();
@@ -41207,7 +41211,7 @@ async function getSessionContext(projectDir2, projectId, limit = 3) {
41207
41211
  const hasL1Content = l1HookObs.length > 0 || l3GitCount > 0;
41208
41212
  if (hasL1Content) {
41209
41213
  let graphNeighbors = [];
41210
- if (activeEntities.length > 0) {
41214
+ if (!reader && activeEntities.length > 0) {
41211
41215
  try {
41212
41216
  const graphMgr = new KnowledgeGraphManager(projectDir2);
41213
41217
  await graphMgr.init();
@@ -41333,6 +41337,7 @@ var init_session = __esm({
41333
41337
  init_session_store();
41334
41338
  init_graph();
41335
41339
  init_secret_filter();
41340
+ init_visibility();
41336
41341
  PRIORITY_TYPES = /* @__PURE__ */ new Set(["gotcha", "decision", "problem-solution", "trade-off", "discovery"]);
41337
41342
  TYPE_EMOJI = {
41338
41343
  "gotcha": "[DISCOVERY]",
@@ -41492,7 +41497,7 @@ var init_session2 = __esm({
41492
41497
  const action = args._?.[0] || "";
41493
41498
  const asJson = !!args.json;
41494
41499
  try {
41495
- const { project, dataDir, teamStore } = await getCliProjectContext({
41500
+ const { project, dataDir, teamStore, reader } = await getCliProjectContext({
41496
41501
  projectRoot: args.projectRoot
41497
41502
  });
41498
41503
  switch (action) {
@@ -41505,10 +41510,6 @@ var init_session2 = __esm({
41505
41510
  emitError("use requires --agent or --agentType so Memorix can activate a coordination identity.", asJson);
41506
41511
  return;
41507
41512
  }
41508
- const result = await startSession(dataDir, project.id, {
41509
- sessionId: args.sessionId,
41510
- agent: args.agent
41511
- });
41512
41513
  const shouldJoinTeam = !!args.joinTeam;
41513
41514
  let agentRecord = null;
41514
41515
  let teamJoinNotice = null;
@@ -41526,6 +41527,16 @@ var init_session2 = __esm({
41526
41527
  } else if (shouldJoinTeam) {
41527
41528
  teamJoinNotice = "Coordination join skipped: provide --agent or --agentType to create a coordination identity.";
41528
41529
  }
41530
+ const contextReader = agentRecord ? {
41531
+ projectId: project.id,
41532
+ agentId: agentRecord.agent_id,
41533
+ isTeamMember: agentRecord.status === "active"
41534
+ } : reader;
41535
+ const result = await startSession(dataDir, project.id, {
41536
+ sessionId: args.sessionId,
41537
+ agent: args.agent,
41538
+ reader: contextReader
41539
+ });
41529
41540
  let identityActivated = false;
41530
41541
  if (args.use && agentRecord) {
41531
41542
  await saveCliIdentity(dataDir, {
@@ -41615,7 +41626,7 @@ var init_session2 = __esm({
41615
41626
  case "context": {
41616
41627
  const limit = parsePositiveInt(args.limit, 3);
41617
41628
  const [context, sessions] = await Promise.all([
41618
- getSessionContext(dataDir, project.id, limit),
41629
+ getSessionContext(dataDir, project.id, limit, reader),
41619
41630
  listSessions(dataDir, project.id)
41620
41631
  ]);
41621
41632
  const active = sessions.filter((session) => session.status === "active").length;
@@ -69995,7 +70006,7 @@ The path should point to a directory containing a .git folder.`
69995
70006
  };
69996
70007
  const server = existingServer ?? new McpServer({
69997
70008
  name: "memorix",
69998
- version: true ? "1.2.2" : "1.0.1"
70009
+ version: true ? "1.2.3" : "1.0.1"
69999
70010
  });
70000
70011
  const originalRegisterTool = server.registerTool.bind(server);
70001
70012
  server.registerTool = ((name, ...args) => {
@@ -72496,7 +72507,6 @@ Ensure the path points to a directory containing a .git folder (or a subdirector
72496
72507
  const unresolved = requireResolvedProject("start a project session");
72497
72508
  if (unresolved) return unresolved;
72498
72509
  const { startSession: startSession2 } = await Promise.resolve().then(() => (init_session(), session_exports));
72499
- const result = await startSession2(projectDir2, project.id, { sessionId, agent });
72500
72510
  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)";
72501
72511
  const shouldJoinTeam = !!joinTeam;
72502
72512
  let registeredAgent = null;
@@ -72553,6 +72563,11 @@ Ensure the path points to a directory containing a .git folder (or a subdirector
72553
72563
  }
72554
72564
  } catch {
72555
72565
  }
72566
+ const result = await startSession2(projectDir2, project.id, {
72567
+ sessionId,
72568
+ agent,
72569
+ reader: getObservationReader()
72570
+ });
72556
72571
  const lines = [
72557
72572
  `[OK] Session started: ${result.session.id}`,
72558
72573
  `Project: ${project.name} (${project.id})`,
@@ -72675,7 +72690,7 @@ ${summary ? "Summary saved for next session context injection." : "No summary pr
72675
72690
  async ({ limit }) => {
72676
72691
  const safeLimit = limit != null ? coerceNumber(limit, 3) : 3;
72677
72692
  const { getSessionContext: getSessionContext2, listSessions: listSessions2 } = await Promise.resolve().then(() => (init_session(), session_exports));
72678
- const context = await getSessionContext2(projectDir2, project.id, safeLimit);
72693
+ const context = await getSessionContext2(projectDir2, project.id, safeLimit, getObservationReader());
72679
72694
  const sessions = await listSessions2(projectDir2, project.id);
72680
72695
  const activeSessions = sessions.filter((s2) => s2.status === "active");
72681
72696
  const completedSessions = sessions.filter((s2) => s2.status === "completed");
@@ -87870,11 +87885,12 @@ async function getSessionState(projectId) {
87870
87885
  }
87871
87886
  async function bindSession() {
87872
87887
  try {
87873
- const proj = await resolveProject();
87874
- if (!proj) return { status: "error", error: "No project detected" };
87888
+ const { getTuiOperatorContext: getTuiOperatorContext2 } = await Promise.resolve().then(() => (init_operator_context(), operator_context_exports));
87889
+ const { project: proj, reader } = await getTuiOperatorContext2();
87875
87890
  const { startSession: startSession2 } = await Promise.resolve().then(() => (init_session(), session_exports));
87876
87891
  const { session, previousContext } = await startSession2(proj.rootPath, proj.id, {
87877
- agent: "memorix-tui"
87892
+ agent: "memorix-tui",
87893
+ reader
87878
87894
  });
87879
87895
  return {
87880
87896
  status: "bound",