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.
- package/CHANGELOG.md +7 -0
- package/TEAM.md +86 -86
- package/dist/cli/index.js +34 -18
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +17 -8
- package/dist/index.js.map +1 -1
- package/dist/maintenance-runner.js.map +1 -1
- package/dist/memcode-runtime/CHANGELOG.md +7 -0
- package/dist/sdk.js +17 -8
- package/dist/sdk.js.map +1 -1
- package/docs/DESIGN_DECISIONS.md +357 -357
- package/docs/dev-log/progress.txt +18 -8
- package/package.json +1 -1
- package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
- package/src/audit/index.ts +156 -156
- package/src/cli/commands/audit-list.ts +89 -89
- package/src/cli/commands/background.ts +659 -659
- package/src/cli/commands/formation.ts +48 -48
- package/src/cli/commands/git-hook-install.ts +111 -111
- package/src/cli/commands/handoff.ts +54 -54
- package/src/cli/commands/hooks-status.ts +63 -63
- package/src/cli/commands/ingest-commit.ts +153 -153
- package/src/cli/commands/ingest-image.ts +66 -66
- package/src/cli/commands/ingest-log.ts +180 -180
- package/src/cli/commands/ingest.ts +44 -44
- package/src/cli/commands/integrate-shared.ts +15 -15
- package/src/cli/commands/lock.ts +82 -82
- package/src/cli/commands/message.ts +104 -104
- package/src/cli/commands/poll.ts +58 -58
- package/src/cli/commands/purge-all-memory.ts +85 -85
- package/src/cli/commands/purge-project-memory.ts +83 -83
- package/src/cli/commands/reasoning.ts +118 -118
- package/src/cli/commands/serve-shared.ts +118 -118
- package/src/cli/commands/session.ts +15 -7
- package/src/cli/commands/skills.ts +114 -114
- package/src/cli/commands/task.ts +167 -167
- package/src/cli/commands/transfer.ts +47 -47
- package/src/cli/commands/uninstall-project-artifacts.ts +85 -85
- package/src/cli/tui/ChatView.tsx +234 -234
- package/src/cli/tui/CommandBar.tsx +312 -312
- package/src/cli/tui/ContextRail.tsx +118 -118
- package/src/cli/tui/HeaderBar.tsx +72 -72
- package/src/cli/tui/LogoBanner.tsx +51 -51
- package/src/cli/tui/Sidebar.tsx +179 -179
- package/src/cli/tui/index.ts +41 -41
- package/src/cli/tui/markdown-render.tsx +371 -371
- package/src/cli/tui/session-service.ts +3 -2
- package/src/cli/tui/use-mouse.ts +157 -157
- package/src/cli/tui/useNavigation.ts +56 -56
- package/src/cli/update-checker.ts +211 -211
- package/src/cli/version.ts +7 -7
- package/src/cli/workbench.ts +1 -1
- package/src/compact/token-budget.ts +74 -74
- package/src/dashboard/project-classification.ts +64 -64
- package/src/embedding/fastembed-provider.ts +142 -142
- package/src/embedding/transformers-provider.ts +111 -111
- package/src/git/extractor.ts +209 -209
- package/src/git/hooks-path.ts +85 -85
- package/src/hooks/pattern-detector.ts +173 -173
- package/src/hooks/significance-filter.ts +250 -250
- package/src/llm/memory-manager.ts +328 -328
- package/src/llm/provider.ts +885 -885
- package/src/llm/quality.ts +248 -248
- package/src/memory/attribution-guard.ts +249 -249
- package/src/memory/disclosure-policy.ts +135 -135
- package/src/memory/entity-extractor.ts +197 -197
- package/src/memory/formation/evaluate.ts +217 -217
- package/src/memory/formation/extract.ts +361 -361
- package/src/memory/formation/index.ts +417 -417
- package/src/memory/formation/resolve.ts +344 -344
- package/src/memory/formation/types.ts +315 -315
- package/src/memory/freshness.ts +122 -122
- package/src/memory/graph.ts +197 -197
- package/src/memory/refs.ts +94 -94
- package/src/memory/secret-filter.ts +79 -79
- package/src/memory/session.ts +24 -9
- package/src/multimodal/image-loader.ts +143 -143
- package/src/orchestrate/adapters/claude-stream.ts +192 -192
- package/src/orchestrate/adapters/claude.ts +111 -111
- package/src/orchestrate/adapters/codex-stream.ts +134 -134
- package/src/orchestrate/adapters/codex.ts +41 -41
- package/src/orchestrate/adapters/gemini-stream.ts +166 -166
- package/src/orchestrate/adapters/gemini.ts +42 -42
- package/src/orchestrate/adapters/index.ts +73 -73
- package/src/orchestrate/adapters/opencode-stream.ts +143 -143
- package/src/orchestrate/adapters/opencode.ts +47 -47
- package/src/orchestrate/adapters/spawn-helper.ts +286 -286
- package/src/orchestrate/adapters/types.ts +77 -77
- package/src/orchestrate/capability-router.ts +284 -284
- package/src/orchestrate/context-compact.ts +188 -188
- package/src/orchestrate/cost-tracker.ts +219 -219
- package/src/orchestrate/error-recovery.ts +191 -191
- package/src/orchestrate/evidence.ts +140 -140
- package/src/orchestrate/ledger.ts +110 -110
- package/src/orchestrate/memorix-bridge.ts +343 -343
- package/src/orchestrate/output-budget.ts +80 -80
- package/src/orchestrate/permission.ts +152 -152
- package/src/orchestrate/pipeline-trace.ts +131 -131
- package/src/orchestrate/prompt-builder.ts +155 -155
- package/src/orchestrate/ring-buffer.ts +37 -37
- package/src/orchestrate/task-graph.ts +389 -389
- package/src/orchestrate/worktree.ts +232 -232
- package/src/project/aliases.ts +374 -374
- package/src/project/detector.ts +268 -268
- package/src/rules/adapters/claude-code.ts +99 -99
- package/src/rules/adapters/codex.ts +97 -97
- package/src/rules/adapters/copilot.ts +124 -124
- package/src/rules/adapters/cursor.ts +114 -114
- package/src/rules/adapters/kiro.ts +126 -126
- package/src/rules/adapters/trae.ts +56 -56
- package/src/rules/adapters/windsurf.ts +83 -83
- package/src/rules/syncer.ts +235 -235
- package/src/sdk.ts +299 -299
- package/src/search/intent-detector.ts +289 -289
- package/src/search/query-expansion.ts +52 -52
- package/src/server/formation-timeout.ts +27 -27
- package/src/server.ts +7 -2
- package/src/skills/mini-skills.ts +386 -386
- package/src/store/chat-store.ts +119 -119
- package/src/store/graph-store.ts +249 -249
- package/src/store/mini-skill-store.ts +349 -349
- package/src/store/persistence-json.ts +212 -212
- package/src/store/persistence.ts +291 -291
- package/src/store/project-affinity.ts +195 -195
- package/src/team/event-bus.ts +76 -76
- package/src/team/file-locks.ts +173 -173
- package/src/team/handoff.ts +161 -161
- package/src/team/messages.ts +203 -203
- package/src/team/poll.ts +132 -132
- package/src/team/tasks.ts +211 -211
- package/src/workspace/mcp-adapters/codex.ts +191 -191
- package/src/workspace/mcp-adapters/copilot.ts +105 -105
- package/src/workspace/mcp-adapters/cursor.ts +53 -53
- package/src/workspace/mcp-adapters/kiro.ts +64 -64
- package/src/workspace/mcp-adapters/opencode.ts +123 -123
- package/src/workspace/mcp-adapters/trae.ts +134 -134
- package/src/workspace/mcp-adapters/windsurf.ts +91 -91
- package/src/workspace/sanitizer.ts +60 -60
- 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.
|
|
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 &&
|
|
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 =
|
|
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.
|
|
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
|
|
87874
|
-
|
|
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",
|