memorix 1.6.1 → 1.6.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 +35 -0
- package/TEAM.md +86 -86
- package/dist/cli/index.js +2582 -1845
- package/dist/index.js +1355 -683
- package/dist/maintenance-runner.js +1621 -1096
- package/dist/media-audio-runner.js +1612 -1088
- package/dist/media-video-runner.js +1612 -1088
- package/dist/memcode-runtime/CHANGELOG.md +35 -0
- package/dist/sdk.js +2007 -1396
- package/dist/vector-backfill-runner.js +1610 -1086
- package/docs/DESIGN_DECISIONS.md +357 -357
- package/docs/PERFORMANCE.md +15 -0
- package/package.json +2 -1
- package/plugins/claude/memorix/.claude-plugin/plugin.json +1 -1
- package/plugins/codebuddy/memorix/.codebuddy-plugin/plugin.json +1 -1
- package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
- package/plugins/copilot/memorix/plugin.json +1 -1
- package/plugins/gemini/memorix/gemini-extension.json +1 -1
- package/plugins/omp/memorix/package.json +1 -1
- package/plugins/openclaw/memorix/.codex-plugin/plugin.json +1 -1
- package/plugins/pi/memorix/package.json +1 -1
- package/server.json +2 -2
- package/src/audit/index.ts +156 -156
- package/src/cli/commands/background.ts +51 -5
- 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.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/operator-shared.ts +18 -11
- package/src/cli/commands/poll.ts +58 -58
- package/src/cli/commands/reasoning.ts +118 -118
- package/src/cli/commands/serve-http.ts +29 -7
- package/src/cli/commands/serve-shared.ts +49 -6
- package/src/cli/commands/serve.ts +4 -0
- 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/index.ts +406 -406
- 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/index.ts +41 -41
- package/src/cli/version.ts +7 -7
- package/src/cli/workbench.ts +1 -1
- package/src/dashboard/project-classification.ts +64 -64
- package/src/embedding/api-provider.ts +503 -27
- package/src/embedding/provider.ts +20 -3
- package/src/git/hooks-path.ts +85 -85
- package/src/hooks/lifecycle.ts +1 -0
- 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/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/freshness.ts +122 -122
- package/src/memory/graph.ts +197 -197
- package/src/memory/observations.ts +68 -18
- package/src/memory/refs.ts +94 -94
- package/src/memory/secret-filter.ts +79 -79
- package/src/memory/session.ts +13 -3
- 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/types.ts +77 -77
- package/src/orchestrate/capability-router.ts +284 -284
- 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/project/aliases.ts +374 -374
- package/src/project/launch-root.ts +115 -0
- package/src/rules/adapters/trae.ts +56 -56
- package/src/rules/syncer.ts +235 -235
- package/src/runtime/isolated-maintenance.ts +12 -1
- package/src/sdk.ts +12 -8
- package/src/search/query-expansion.ts +52 -52
- package/src/server/formation-timeout.ts +27 -27
- package/src/server.ts +38 -5
- 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/obs-store.ts +2 -2
- package/src/store/orama-store.ts +21 -3
- 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/store/sqlite-db.ts +2 -0
- package/src/store/sqlite-store.ts +19 -4
- package/src/team/event-bus.ts +76 -76
- package/src/team/handoff.ts +161 -161
- package/src/team/poll.ts +132 -132
- 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
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
export const DEFAULT_FORMATION_TIMEOUT_MS = 12_000;
|
|
2
|
-
export const FORMATION_TIMEOUT_MIN_MS = 1_000;
|
|
3
|
-
export const FORMATION_TIMEOUT_MAX_MS = 300_000;
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Parse and validate MEMORIX_FORMATION_TIMEOUT_MS.
|
|
7
|
-
* - Must be a valid integer in the range 1000-300000ms.
|
|
8
|
-
* - Invalid values fall back to the default and log a warning.
|
|
9
|
-
* - Out-of-range values are clamped to the nearest bound.
|
|
10
|
-
* Default: 12000ms (12s).
|
|
11
|
-
*/
|
|
12
|
-
export function parseFormationTimeoutMs(raw: string | undefined): number {
|
|
13
|
-
const value = raw?.trim();
|
|
14
|
-
if (!value) return DEFAULT_FORMATION_TIMEOUT_MS;
|
|
15
|
-
|
|
16
|
-
const parsed = Number(value);
|
|
17
|
-
if (!Number.isInteger(parsed) || Number.isNaN(parsed)) {
|
|
18
|
-
console.warn(
|
|
19
|
-
`[memorix] MEMORIX_FORMATION_TIMEOUT_MS="${raw}" is invalid (must be a positive integer between ${FORMATION_TIMEOUT_MIN_MS}-${FORMATION_TIMEOUT_MAX_MS}ms). Using default ${DEFAULT_FORMATION_TIMEOUT_MS}ms.`,
|
|
20
|
-
);
|
|
21
|
-
return DEFAULT_FORMATION_TIMEOUT_MS;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
if (parsed < FORMATION_TIMEOUT_MIN_MS) return FORMATION_TIMEOUT_MIN_MS;
|
|
25
|
-
if (parsed > FORMATION_TIMEOUT_MAX_MS) return FORMATION_TIMEOUT_MAX_MS;
|
|
26
|
-
return parsed;
|
|
27
|
-
}
|
|
1
|
+
export const DEFAULT_FORMATION_TIMEOUT_MS = 12_000;
|
|
2
|
+
export const FORMATION_TIMEOUT_MIN_MS = 1_000;
|
|
3
|
+
export const FORMATION_TIMEOUT_MAX_MS = 300_000;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Parse and validate MEMORIX_FORMATION_TIMEOUT_MS.
|
|
7
|
+
* - Must be a valid integer in the range 1000-300000ms.
|
|
8
|
+
* - Invalid values fall back to the default and log a warning.
|
|
9
|
+
* - Out-of-range values are clamped to the nearest bound.
|
|
10
|
+
* Default: 12000ms (12s).
|
|
11
|
+
*/
|
|
12
|
+
export function parseFormationTimeoutMs(raw: string | undefined): number {
|
|
13
|
+
const value = raw?.trim();
|
|
14
|
+
if (!value) return DEFAULT_FORMATION_TIMEOUT_MS;
|
|
15
|
+
|
|
16
|
+
const parsed = Number(value);
|
|
17
|
+
if (!Number.isInteger(parsed) || Number.isNaN(parsed)) {
|
|
18
|
+
console.warn(
|
|
19
|
+
`[memorix] MEMORIX_FORMATION_TIMEOUT_MS="${raw}" is invalid (must be a positive integer between ${FORMATION_TIMEOUT_MIN_MS}-${FORMATION_TIMEOUT_MAX_MS}ms). Using default ${DEFAULT_FORMATION_TIMEOUT_MS}ms.`,
|
|
20
|
+
);
|
|
21
|
+
return DEFAULT_FORMATION_TIMEOUT_MS;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (parsed < FORMATION_TIMEOUT_MIN_MS) return FORMATION_TIMEOUT_MIN_MS;
|
|
25
|
+
if (parsed > FORMATION_TIMEOUT_MAX_MS) return FORMATION_TIMEOUT_MAX_MS;
|
|
26
|
+
return parsed;
|
|
27
|
+
}
|
package/src/server.ts
CHANGED
|
@@ -33,6 +33,7 @@ import { canManageObservation, canReadObservation, filterReadableObservations, r
|
|
|
33
33
|
import { compactSearch, compactTimeline, compactDetail } from './compact/engine.js';
|
|
34
34
|
import { buildGraphContextPacket, formatGraphContextPrompt } from './memory/graph-context.js';
|
|
35
35
|
import { detectProject } from './project/detector.js';
|
|
36
|
+
import { homeProjectRootError, isHomeDirectory, writeLastProjectRoot } from './project/launch-root.js';
|
|
36
37
|
import { registerAlias, initAliasRegistry, resolveAliases, autoMergeByBaseName } from './project/aliases.js';
|
|
37
38
|
import { getProjectDataDir } from './store/persistence.js';
|
|
38
39
|
import type { ObservationType, RuleSource, AgentTarget, MCPServerEntry, ObservationReader } from './types.js';
|
|
@@ -228,6 +229,7 @@ export const BOOTSTRAP_SAFE_TOOL_NAMES = new Set([
|
|
|
228
229
|
'memorix_codegraph_status',
|
|
229
230
|
'memorix_graph_context',
|
|
230
231
|
'memorix_context_pack',
|
|
232
|
+
'memorix_session_start',
|
|
231
233
|
]);
|
|
232
234
|
|
|
233
235
|
const AUTOPILOT_RETRIEVAL_BOUNDARY_TTL_MS = 2 * 60 * 1000;
|
|
@@ -265,7 +267,10 @@ export async function createMemorixServer(
|
|
|
265
267
|
});
|
|
266
268
|
const teamFeaturesEnabled = isToolInProfile('team_manage', toolProfile);
|
|
267
269
|
const projectBinding = options.projectBinding ?? createProjectBindingController(cwd ?? process.cwd());
|
|
268
|
-
const
|
|
270
|
+
const detectedProjectRaw = detectProject(cwd);
|
|
271
|
+
const detectedProject = detectedProjectRaw && !isHomeDirectory(detectedProjectRaw.rootPath)
|
|
272
|
+
? detectedProjectRaw
|
|
273
|
+
: null;
|
|
269
274
|
let rawProject: import('./types.js').ProjectInfo;
|
|
270
275
|
let projectResolved = true;
|
|
271
276
|
let projectResolutionError: string | null = null;
|
|
@@ -316,6 +321,7 @@ export async function createMemorixServer(
|
|
|
316
321
|
}
|
|
317
322
|
if (projectResolved) {
|
|
318
323
|
projectBinding.recordResolvedProject(project.id, project.rootPath);
|
|
324
|
+
writeLastProjectRoot(project.rootPath);
|
|
319
325
|
}
|
|
320
326
|
|
|
321
327
|
const registerMaintenanceTarget = async (): Promise<void> => {
|
|
@@ -362,6 +368,7 @@ export async function createMemorixServer(
|
|
|
362
368
|
|
|
363
369
|
const lightweightUnresolvedSession = !projectResolved && deferProjectInitUntilBound;
|
|
364
370
|
let projectRuntimeInitPromise: Promise<void> | null = null;
|
|
371
|
+
let runtimeHydratedForDir: string | null = null;
|
|
365
372
|
|
|
366
373
|
const initializeProjectRuntime = async (logPrefix: 'startup' | 'switch'): Promise<void> => {
|
|
367
374
|
await initObservationStore(projectDir);
|
|
@@ -430,14 +437,20 @@ export async function createMemorixServer(
|
|
|
430
437
|
} catch { /* migration is optional */ }
|
|
431
438
|
|
|
432
439
|
await initializeProjectRuntime('startup');
|
|
440
|
+
runtimeHydratedForDir = projectDir;
|
|
433
441
|
} else {
|
|
434
442
|
// Intentionally silent — serve-http.ts deferred logging handles session lifecycle visibility.
|
|
435
443
|
// Noisy per-probe 'awaiting binding' log was removed to reduce terminal spam.
|
|
436
444
|
}
|
|
437
445
|
|
|
438
446
|
const ensureProjectRuntimeInitialized = async (): Promise<void> => {
|
|
439
|
-
if (
|
|
447
|
+
if (!projectResolved) return;
|
|
448
|
+
if (runtimeHydratedForDir === projectDir) {
|
|
449
|
+
if (projectRuntimeInitPromise) await projectRuntimeInitPromise;
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
440
452
|
if (!projectRuntimeInitPromise) {
|
|
453
|
+
const targetDir = projectDir;
|
|
441
454
|
projectRuntimeInitPromise = (async () => {
|
|
442
455
|
// Auto-merge obvious alias groups by scanning observed projectIds in data.
|
|
443
456
|
try {
|
|
@@ -470,7 +483,8 @@ export async function createMemorixServer(
|
|
|
470
483
|
}
|
|
471
484
|
} catch { /* migration is optional */ }
|
|
472
485
|
|
|
473
|
-
await initializeProjectRuntime('startup');
|
|
486
|
+
await initializeProjectRuntime(runtimeHydratedForDir ? 'switch' : 'startup');
|
|
487
|
+
runtimeHydratedForDir = targetDir;
|
|
474
488
|
})().catch((err) => {
|
|
475
489
|
projectRuntimeInitPromise = null;
|
|
476
490
|
throw err;
|
|
@@ -3846,6 +3860,15 @@ export async function createMemorixServer(
|
|
|
3846
3860
|
// BEFORE checking whether the project is resolved. This is the primary
|
|
3847
3861
|
// mechanism for HTTP/control-plane multi-project support.
|
|
3848
3862
|
if (explicitRoot && typeof explicitRoot === 'string') {
|
|
3863
|
+
if (isHomeDirectory(explicitRoot)) {
|
|
3864
|
+
return {
|
|
3865
|
+
content: [{
|
|
3866
|
+
type: 'text' as const,
|
|
3867
|
+
text: homeProjectRootError(explicitRoot),
|
|
3868
|
+
}],
|
|
3869
|
+
isError: true as const,
|
|
3870
|
+
};
|
|
3871
|
+
}
|
|
3849
3872
|
let bound = await switchProject(explicitRoot, 'explicit-project-root');
|
|
3850
3873
|
// switchProject returns false for both "same project, no-op" and "no git repo".
|
|
3851
3874
|
// Only scan subdirectories when explicitRoot is not itself a git repo; otherwise
|
|
@@ -5503,8 +5526,12 @@ export async function createMemorixServer(
|
|
|
5503
5526
|
): Promise<boolean> => {
|
|
5504
5527
|
if (source === 'mcp-roots' && projectBinding.isExplicit()) return false;
|
|
5505
5528
|
const { detectProjectWithDiagnostics } = await import('./project/detector.js');
|
|
5529
|
+
if (isHomeDirectory(newCwd)) {
|
|
5530
|
+
console.error(`[memorix] Refusing to bind $HOME as a project root: ${newCwd}`);
|
|
5531
|
+
return false;
|
|
5532
|
+
}
|
|
5506
5533
|
const result = detectProjectWithDiagnostics(newCwd);
|
|
5507
|
-
if (!result.project) {
|
|
5534
|
+
if (!result.project || isHomeDirectory(result.project.rootPath)) {
|
|
5508
5535
|
if (result.failure) {
|
|
5509
5536
|
console.error(`[memorix] Project detection failed for "${newCwd}": [${result.failure.reason}] ${result.failure.detail}`);
|
|
5510
5537
|
}
|
|
@@ -5523,6 +5550,7 @@ export async function createMemorixServer(
|
|
|
5523
5550
|
else if (source === 'mcp-roots') projectBinding.bindFromRoots(newDetected.rootPath);
|
|
5524
5551
|
else projectBinding.bindStartup(newDetected.rootPath);
|
|
5525
5552
|
projectBinding.recordResolvedProject(project.id, project.rootPath);
|
|
5553
|
+
writeLastProjectRoot(project.rootPath);
|
|
5526
5554
|
return false; // same project, no-op
|
|
5527
5555
|
}
|
|
5528
5556
|
|
|
@@ -5580,7 +5608,12 @@ export async function createMemorixServer(
|
|
|
5580
5608
|
}
|
|
5581
5609
|
} catch { /* best-effort - coordination features degrade gracefully */ }
|
|
5582
5610
|
|
|
5583
|
-
|
|
5611
|
+
writeLastProjectRoot(project.rootPath);
|
|
5612
|
+
runtimeHydratedForDir = null;
|
|
5613
|
+
projectRuntimeInitPromise = null;
|
|
5614
|
+
void ensureProjectRuntimeInitialized().catch((err) => {
|
|
5615
|
+
console.error(`[memorix] Background project runtime init failed: ${err instanceof Error ? err.message : err}`);
|
|
5616
|
+
});
|
|
5584
5617
|
try {
|
|
5585
5618
|
await startProjectMaintenanceWorker();
|
|
5586
5619
|
} catch {
|