memorix 1.4.6 → 1.5.1

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 (119) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/TEAM.md +86 -86
  3. package/dist/cli/index.js +225 -70
  4. package/dist/cli/memcode.js +0 -0
  5. package/dist/index.js +225 -70
  6. package/dist/maintenance-runner.js +183 -38
  7. package/dist/media-audio-runner.js +183 -38
  8. package/dist/media-video-runner.js +183 -38
  9. package/dist/memcode-runtime/CHANGELOG.md +38 -0
  10. package/dist/sdk.js +224 -69
  11. package/dist/types.d.ts +2 -0
  12. package/dist/vector-backfill-runner.js +183 -38
  13. package/docs/CONFIGURATION.md +12 -0
  14. package/docs/DESIGN_DECISIONS.md +357 -357
  15. package/package.json +1 -1
  16. package/plugins/claude/memorix/.claude-plugin/plugin.json +1 -1
  17. package/plugins/codebuddy/memorix/.codebuddy-plugin/plugin.json +1 -1
  18. package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
  19. package/plugins/copilot/memorix/plugin.json +1 -1
  20. package/plugins/gemini/memorix/gemini-extension.json +1 -1
  21. package/plugins/omp/memorix/package.json +1 -1
  22. package/plugins/openclaw/memorix/.codex-plugin/plugin.json +1 -1
  23. package/plugins/pi/memorix/package.json +1 -1
  24. package/server.json +2 -2
  25. package/src/audit/index.ts +156 -156
  26. package/src/cli/commands/formation.ts +48 -48
  27. package/src/cli/commands/git-hook-install.ts +111 -111
  28. package/src/cli/commands/handoff.ts +54 -54
  29. package/src/cli/commands/hooks-status.ts +63 -63
  30. package/src/cli/commands/ingest.ts +44 -44
  31. package/src/cli/commands/integrate-shared.ts +15 -15
  32. package/src/cli/commands/lock.ts +82 -82
  33. package/src/cli/commands/message.ts +104 -104
  34. package/src/cli/commands/poll.ts +58 -58
  35. package/src/cli/commands/reasoning.ts +118 -118
  36. package/src/cli/commands/skills.ts +114 -114
  37. package/src/cli/commands/task.ts +167 -167
  38. package/src/cli/commands/transfer.ts +47 -47
  39. package/src/cli/index.ts +406 -406
  40. package/src/cli/tui/ChatView.tsx +234 -234
  41. package/src/cli/tui/CommandBar.tsx +312 -312
  42. package/src/cli/tui/ContextRail.tsx +118 -118
  43. package/src/cli/tui/HeaderBar.tsx +72 -72
  44. package/src/cli/tui/LogoBanner.tsx +51 -51
  45. package/src/cli/tui/index.ts +41 -41
  46. package/src/cli/version.ts +7 -7
  47. package/src/cli/workbench.ts +1 -1
  48. package/src/config.ts +23 -2
  49. package/src/dashboard/project-classification.ts +64 -64
  50. package/src/embedding/api-provider.ts +105 -22
  51. package/src/embedding/provider.ts +2 -0
  52. package/src/git/hooks-path.ts +85 -85
  53. package/src/hooks/pattern-detector.ts +173 -173
  54. package/src/hooks/significance-filter.ts +250 -250
  55. package/src/llm/memory-manager.ts +328 -328
  56. package/src/llm/provider.ts +17 -8
  57. package/src/llm/quality.ts +248 -248
  58. package/src/memory/attribution-guard.ts +249 -249
  59. package/src/memory/disclosure-policy.ts +135 -135
  60. package/src/memory/entity-extractor.ts +197 -197
  61. package/src/memory/formation/evaluate.ts +217 -217
  62. package/src/memory/formation/extract.ts +6 -3
  63. package/src/memory/formation/index.ts +2 -1
  64. package/src/memory/formation/resolve.ts +10 -6
  65. package/src/memory/formation/types.ts +3 -1
  66. package/src/memory/freshness.ts +122 -122
  67. package/src/memory/graph.ts +197 -197
  68. package/src/memory/long-term.ts +7 -1
  69. package/src/memory/refs.ts +94 -94
  70. package/src/memory/secret-filter.ts +79 -79
  71. package/src/orchestrate/adapters/claude-stream.ts +192 -192
  72. package/src/orchestrate/adapters/claude.ts +111 -111
  73. package/src/orchestrate/adapters/codex-stream.ts +134 -134
  74. package/src/orchestrate/adapters/codex.ts +41 -41
  75. package/src/orchestrate/adapters/gemini-stream.ts +166 -166
  76. package/src/orchestrate/adapters/gemini.ts +42 -42
  77. package/src/orchestrate/adapters/index.ts +73 -73
  78. package/src/orchestrate/adapters/opencode-stream.ts +143 -143
  79. package/src/orchestrate/adapters/opencode.ts +47 -47
  80. package/src/orchestrate/adapters/types.ts +77 -77
  81. package/src/orchestrate/capability-router.ts +284 -284
  82. package/src/orchestrate/cost-tracker.ts +219 -219
  83. package/src/orchestrate/error-recovery.ts +191 -191
  84. package/src/orchestrate/evidence.ts +140 -140
  85. package/src/orchestrate/ledger.ts +110 -110
  86. package/src/orchestrate/memorix-bridge.ts +343 -343
  87. package/src/orchestrate/output-budget.ts +80 -80
  88. package/src/orchestrate/permission.ts +152 -152
  89. package/src/orchestrate/pipeline-trace.ts +131 -131
  90. package/src/orchestrate/prompt-builder.ts +155 -155
  91. package/src/orchestrate/ring-buffer.ts +37 -37
  92. package/src/orchestrate/task-graph.ts +389 -389
  93. package/src/project/aliases.ts +374 -374
  94. package/src/rules/adapters/trae.ts +56 -56
  95. package/src/rules/syncer.ts +235 -235
  96. package/src/search/query-expansion.ts +52 -52
  97. package/src/server/formation-timeout.ts +27 -27
  98. package/src/server.ts +14 -10
  99. package/src/skills/mini-skills.ts +386 -386
  100. package/src/store/chat-store.ts +119 -119
  101. package/src/store/graph-store.ts +249 -249
  102. package/src/store/mini-skill-store.ts +349 -349
  103. package/src/store/orama-store.ts +6 -4
  104. package/src/store/persistence-json.ts +212 -212
  105. package/src/store/persistence.ts +291 -291
  106. package/src/store/project-affinity.ts +195 -195
  107. package/src/team/event-bus.ts +76 -76
  108. package/src/team/handoff.ts +161 -161
  109. package/src/team/poll.ts +132 -132
  110. package/src/timeout.ts +67 -0
  111. package/src/types.ts +2 -0
  112. package/src/workspace/mcp-adapters/codex.ts +191 -191
  113. package/src/workspace/mcp-adapters/copilot.ts +105 -105
  114. package/src/workspace/mcp-adapters/cursor.ts +53 -53
  115. package/src/workspace/mcp-adapters/kiro.ts +64 -64
  116. package/src/workspace/mcp-adapters/opencode.ts +123 -123
  117. package/src/workspace/mcp-adapters/trae.ts +134 -134
  118. package/src/workspace/mcp-adapters/windsurf.ts +91 -91
  119. package/src/workspace/sanitizer.ts +60 -60
@@ -1,117 +1,117 @@
1
- /**
2
- * Disclosure Policy
3
- *
4
- * Lightweight helper that classifies an observation or index entry into
5
- * an L1 / L2 / L3 disclosure layer based on its provenance fields.
6
- *
7
- * Rules (phase 2 first-cut):
8
- * L2 — default working-context: explicit, undefined, or core-valued
9
- * L1 — routing signal: hook auto-captures (non-core)
10
- * L3 — evidence layer: git-ingest (non-core), or any other low-trust source
11
- *
12
- * git-ingest defaults to L3 but can be promoted to L2 by valueCategory=core.
13
- * Rules are kept explicit and easy to extend in future phases.
14
- */
15
-
16
- export type DisclosureLayer = 'L1' | 'L2' | 'L3';
17
-
18
- /**
19
- * Evidence basis: how well-grounded a memory is in verifiable sources.
20
- *
21
- * Computed from existing fields — not stored separately.
22
- * 'repository' — directly backed by a git commit or repository evidence
23
- * 'synthesized' — explicit agent analysis that cites repository evidence
24
- * via relatedCommits (no direct commitHash — not raw evidence)
25
- * 'direct' — explicitly agent-recorded, no git backing
26
- * undefined — hook trace, legacy, or unknown origin → neutral
27
- */
28
- export type EvidenceBasis = 'repository' | 'synthesized' | 'direct' | undefined;
29
-
30
- /**
31
- * Derive the evidence basis from existing provenance fields.
32
- * Conservative: only labels what can be clearly determined.
33
- * Neutral (undefined) is preferred over incorrect labeling.
34
- */
35
- export function resolveEvidenceBasis(fields: {
36
- sourceDetail?: string;
37
- source?: string;
38
- commitHash?: string;
39
- relatedCommits?: string[];
40
- }): EvidenceBasis {
41
- // Repository-backed: commitHash present = direct git evidence (highest confidence).
42
- // Also covers git-ingest source and legacy source='git'.
43
- if (
44
- fields.commitHash ||
45
- fields.source === 'git' ||
46
- fields.sourceDetail === 'git-ingest'
47
- ) {
48
- return 'repository';
49
- }
50
- // Synthesized: explicit agent analysis that cites commits via relatedCommits,
51
- // but has no direct commitHash (so it is analysis OF repository evidence, not raw evidence).
52
- // Conservative: requires explicit sourceDetail, relatedCommits present, no commitHash.
53
- if (
54
- fields.sourceDetail === 'explicit' &&
55
- (fields.relatedCommits?.length ?? 0) > 0
56
- ) {
57
- return 'synthesized';
58
- }
59
- // relatedCommits without explicit sourceDetail — legacy or unknown → repository fallback.
60
- if ((fields.relatedCommits?.length ?? 0) > 0) {
61
- return 'repository';
62
- }
63
- // Direct: explicitly agent-recorded, no git backing
64
- if (fields.sourceDetail === 'explicit') return 'direct';
65
- // Hook trace, manual, legacy, unknown → neutral
66
- return undefined;
67
- }
68
-
69
- /**
70
- * Return a compact one-line verification annotation for provenance headers.
71
- * Returns empty string when basis is 'direct' or undefined (not shown to avoid noise).
72
- * The commit hash is shown only in the detail path (commitHash present).
73
- */
74
- export function evidenceBasisLine(basis: EvidenceBasis, commitHash?: string): string {
75
- if (basis === 'repository') {
76
- const commit = commitHash ? ` — commit ${commitHash.substring(0, 7)}` : '';
77
- return `[OK] Repository-backed${commit}`;
78
- }
79
- if (basis === 'synthesized') {
1
+ /**
2
+ * Disclosure Policy
3
+ *
4
+ * Lightweight helper that classifies an observation or index entry into
5
+ * an L1 / L2 / L3 disclosure layer based on its provenance fields.
6
+ *
7
+ * Rules (phase 2 first-cut):
8
+ * L2 — default working-context: explicit, undefined, or core-valued
9
+ * L1 — routing signal: hook auto-captures (non-core)
10
+ * L3 — evidence layer: git-ingest (non-core), or any other low-trust source
11
+ *
12
+ * git-ingest defaults to L3 but can be promoted to L2 by valueCategory=core.
13
+ * Rules are kept explicit and easy to extend in future phases.
14
+ */
15
+
16
+ export type DisclosureLayer = 'L1' | 'L2' | 'L3';
17
+
18
+ /**
19
+ * Evidence basis: how well-grounded a memory is in verifiable sources.
20
+ *
21
+ * Computed from existing fields — not stored separately.
22
+ * 'repository' — directly backed by a git commit or repository evidence
23
+ * 'synthesized' — explicit agent analysis that cites repository evidence
24
+ * via relatedCommits (no direct commitHash — not raw evidence)
25
+ * 'direct' — explicitly agent-recorded, no git backing
26
+ * undefined — hook trace, legacy, or unknown origin → neutral
27
+ */
28
+ export type EvidenceBasis = 'repository' | 'synthesized' | 'direct' | undefined;
29
+
30
+ /**
31
+ * Derive the evidence basis from existing provenance fields.
32
+ * Conservative: only labels what can be clearly determined.
33
+ * Neutral (undefined) is preferred over incorrect labeling.
34
+ */
35
+ export function resolveEvidenceBasis(fields: {
36
+ sourceDetail?: string;
37
+ source?: string;
38
+ commitHash?: string;
39
+ relatedCommits?: string[];
40
+ }): EvidenceBasis {
41
+ // Repository-backed: commitHash present = direct git evidence (highest confidence).
42
+ // Also covers git-ingest source and legacy source='git'.
43
+ if (
44
+ fields.commitHash ||
45
+ fields.source === 'git' ||
46
+ fields.sourceDetail === 'git-ingest'
47
+ ) {
48
+ return 'repository';
49
+ }
50
+ // Synthesized: explicit agent analysis that cites commits via relatedCommits,
51
+ // but has no direct commitHash (so it is analysis OF repository evidence, not raw evidence).
52
+ // Conservative: requires explicit sourceDetail, relatedCommits present, no commitHash.
53
+ if (
54
+ fields.sourceDetail === 'explicit' &&
55
+ (fields.relatedCommits?.length ?? 0) > 0
56
+ ) {
57
+ return 'synthesized';
58
+ }
59
+ // relatedCommits without explicit sourceDetail — legacy or unknown → repository fallback.
60
+ if ((fields.relatedCommits?.length ?? 0) > 0) {
61
+ return 'repository';
62
+ }
63
+ // Direct: explicitly agent-recorded, no git backing
64
+ if (fields.sourceDetail === 'explicit') return 'direct';
65
+ // Hook trace, manual, legacy, unknown → neutral
66
+ return undefined;
67
+ }
68
+
69
+ /**
70
+ * Return a compact one-line verification annotation for provenance headers.
71
+ * Returns empty string when basis is 'direct' or undefined (not shown to avoid noise).
72
+ * The commit hash is shown only in the detail path (commitHash present).
73
+ */
74
+ export function evidenceBasisLine(basis: EvidenceBasis, commitHash?: string): string {
75
+ if (basis === 'repository') {
76
+ const commit = commitHash ? ` — commit ${commitHash.substring(0, 7)}` : '';
77
+ return `[OK] Repository-backed${commit}`;
78
+ }
79
+ if (basis === 'synthesized') {
80
80
  return '[SYNTHESIZED] Synthesized — explicit analysis citing repository evidence';
81
- }
82
- return '';
83
- }
84
-
81
+ }
82
+ return '';
83
+ }
84
+
85
85
  export interface ProvenanceFields {
86
86
  sourceDetail?: string;
87
87
  valueCategory?: string;
88
88
  admissionState?: string;
89
- /** Legacy fallback: observations ingested before Phase 1 only have source='git'. */
90
- source?: string;
91
- }
92
-
93
- /**
94
- * Resolve the effective sourceDetail for an observation, supporting legacy
95
- * observations that only have source='git' and no sourceDetail.
96
- *
97
- * This is the single fallback point — call this instead of reading sourceDetail
98
- * directly whenever provenance classification or display is needed.
99
- */
100
- export function resolveSourceDetail(
101
- sourceDetail?: string,
102
- source?: string,
103
- ): 'explicit' | 'hook' | 'git-ingest' | undefined {
104
- if (sourceDetail === 'explicit' || sourceDetail === 'hook' || sourceDetail === 'git-ingest') {
105
- return sourceDetail;
106
- }
107
- // Legacy git memories: source='git' with no sourceDetail → treat as git-ingest.
108
- if (source === 'git') return 'git-ingest';
109
- return undefined;
110
- }
111
-
112
- /**
113
- * Classify a single observation or index entry into a disclosure layer.
114
- */
89
+ /** Legacy fallback: observations ingested before Phase 1 only have source='git'. */
90
+ source?: string;
91
+ }
92
+
93
+ /**
94
+ * Resolve the effective sourceDetail for an observation, supporting legacy
95
+ * observations that only have source='git' and no sourceDetail.
96
+ *
97
+ * This is the single fallback point — call this instead of reading sourceDetail
98
+ * directly whenever provenance classification or display is needed.
99
+ */
100
+ export function resolveSourceDetail(
101
+ sourceDetail?: string,
102
+ source?: string,
103
+ ): 'explicit' | 'hook' | 'git-ingest' | undefined {
104
+ if (sourceDetail === 'explicit' || sourceDetail === 'hook' || sourceDetail === 'git-ingest') {
105
+ return sourceDetail;
106
+ }
107
+ // Legacy git memories: source='git' with no sourceDetail → treat as git-ingest.
108
+ if (source === 'git') return 'git-ingest';
109
+ return undefined;
110
+ }
111
+
112
+ /**
113
+ * Classify a single observation or index entry into a disclosure layer.
114
+ */
115
115
  export function classifyLayer(fields: ProvenanceFields): DisclosureLayer {
116
116
  const { valueCategory, admissionState } = fields;
117
117
  const sd = resolveSourceDetail(fields.sourceDetail, fields.source);
@@ -119,29 +119,29 @@ export function classifyLayer(fields: ProvenanceFields): DisclosureLayer {
119
119
  // New automatic records must earn delivery through the control plane.
120
120
  // Preserve legacy behavior for records created before admission metadata.
121
121
  if (admissionState === 'candidate' || admissionState === 'ephemeral') return 'L1';
122
-
123
- // Core-valued memories are always promoted to L2, regardless of source.
124
- if (valueCategory === 'core') return 'L2';
125
-
126
- // Hook auto-captures without core classification → L1 routing signal.
127
- if (sd === 'hook') return 'L1';
128
-
129
- // Git-ingest (including legacy source='git') defaults to L3.
130
- if (sd === 'git-ingest') return 'L3';
131
-
132
- // Explicit, undefined/legacy, manual → L2 working context.
133
- return 'L2';
134
- }
135
-
136
- /**
137
- * Return a compact source badge string for display in search tables.
138
- * Accepts both sourceDetail and legacy source for fallback resolution.
139
- * Keeps existing table structure stable — fits in a narrow column.
140
- */
141
- export function sourceBadge(sourceDetail?: string, source?: string): string {
142
- const sd = resolveSourceDetail(sourceDetail, source);
143
- if (sd === 'explicit') return 'ex';
144
- if (sd === 'hook') return 'hk';
145
- if (sd === 'git-ingest') return 'git';
146
- return '';
147
- }
122
+
123
+ // Core-valued memories are always promoted to L2, regardless of source.
124
+ if (valueCategory === 'core') return 'L2';
125
+
126
+ // Hook auto-captures without core classification → L1 routing signal.
127
+ if (sd === 'hook') return 'L1';
128
+
129
+ // Git-ingest (including legacy source='git') defaults to L3.
130
+ if (sd === 'git-ingest') return 'L3';
131
+
132
+ // Explicit, undefined/legacy, manual → L2 working context.
133
+ return 'L2';
134
+ }
135
+
136
+ /**
137
+ * Return a compact source badge string for display in search tables.
138
+ * Accepts both sourceDetail and legacy source for fallback resolution.
139
+ * Keeps existing table structure stable — fits in a narrow column.
140
+ */
141
+ export function sourceBadge(sourceDetail?: string, source?: string): string {
142
+ const sd = resolveSourceDetail(sourceDetail, source);
143
+ if (sd === 'explicit') return 'ex';
144
+ if (sd === 'hook') return 'hk';
145
+ if (sd === 'git-ingest') return 'git';
146
+ return '';
147
+ }