@defai.digital/ax-cli 4.1.11 → 4.1.15
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/.ax-cli/settings.json +1 -0
- package/README.md +140 -589
- package/bin/ax-cli +6 -0
- package/dist/agent/dependency-resolver.d.ts +7 -0
- package/dist/agent/dependency-resolver.js +46 -18
- package/dist/agent/dependency-resolver.js.map +1 -1
- package/dist/agent/execution/tool-executor.d.ts +4 -0
- package/dist/agent/execution/tool-executor.js +76 -52
- package/dist/agent/execution/tool-executor.js.map +1 -1
- package/dist/agent/parallel-tools.d.ts +4 -0
- package/dist/agent/parallel-tools.js +65 -24
- package/dist/agent/parallel-tools.js.map +1 -1
- package/dist/agent/planning/plan-executor.d.ts +0 -5
- package/dist/agent/planning/plan-executor.js +23 -6
- package/dist/agent/planning/plan-executor.js.map +1 -1
- package/dist/agent/streaming/stream-handler.js +7 -4
- package/dist/agent/streaming/stream-handler.js.map +1 -1
- package/dist/agent/subagent-orchestrator.d.ts +35 -2
- package/dist/agent/subagent-orchestrator.js +188 -146
- package/dist/agent/subagent-orchestrator.js.map +1 -1
- package/dist/agent/subagent-types.js +3 -1
- package/dist/agent/subagent-types.js.map +1 -1
- package/dist/agent/subagent.d.ts +15 -4
- package/dist/agent/subagent.js +91 -72
- package/dist/agent/subagent.js.map +1 -1
- package/dist/design/figma-alias.d.ts +77 -0
- package/dist/design/figma-alias.js +246 -0
- package/dist/design/figma-alias.js.map +1 -1
- package/dist/design/figma-client.d.ts +4 -0
- package/dist/design/figma-client.js +24 -4
- package/dist/design/figma-client.js.map +1 -1
- package/dist/design/figma-map.js +78 -6
- package/dist/design/figma-map.js.map +1 -1
- package/dist/design/figma-tokens.js +6 -2
- package/dist/design/figma-tokens.js.map +1 -1
- package/dist/design/index.d.ts +1 -1
- package/dist/design/index.js +3 -1
- package/dist/design/index.js.map +1 -1
- package/dist/design/types.d.ts +9 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/client-v2.js +4 -0
- package/dist/mcp/client-v2.js.map +1 -1
- package/dist/mcp/config-detector.js +3 -4
- package/dist/mcp/config-detector.js.map +1 -1
- package/dist/mcp/debug.d.ts +207 -0
- package/dist/mcp/debug.js +398 -0
- package/dist/mcp/debug.js.map +1 -0
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.js +4 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/reconnection.js +6 -3
- package/dist/mcp/reconnection.js.map +1 -1
- package/dist/mcp/validation.js +15 -6
- package/dist/mcp/validation.js.map +1 -1
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/provider-context-store.d.ts +127 -0
- package/dist/memory/provider-context-store.js +385 -0
- package/dist/memory/provider-context-store.js.map +1 -0
- package/dist/sdk/errors.d.ts +2 -0
- package/dist/sdk/errors.js +2 -0
- package/dist/sdk/errors.js.map +1 -1
- package/dist/sdk/index.d.ts +633 -62
- package/dist/sdk/index.js +854 -116
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/testing.d.ts +46 -4
- package/dist/sdk/testing.js +58 -6
- package/dist/sdk/testing.js.map +1 -1
- package/dist/sdk/version.d.ts +13 -9
- package/dist/sdk/version.js +13 -9
- package/dist/sdk/version.js.map +1 -1
- package/dist/utils/file-lock.d.ts +141 -0
- package/dist/utils/file-lock.js +559 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/provider-context.d.ts +243 -0
- package/dist/utils/provider-context.js +421 -0
- package/dist/utils/provider-context.js.map +1 -0
- package/dist/utils/provider-file-cache.d.ts +91 -0
- package/dist/utils/provider-file-cache.js +165 -0
- package/dist/utils/provider-file-cache.js.map +1 -0
- package/dist/utils/provider-settings.d.ts +181 -0
- package/dist/utils/provider-settings.js +450 -0
- package/dist/utils/provider-settings.js.map +1 -0
- package/package.json +4 -3
package/dist/mcp/reconnection.js
CHANGED
|
@@ -128,16 +128,19 @@ export class ReconnectionManager extends EventEmitter {
|
|
|
128
128
|
* Calculate delay for next attempt with exponential backoff
|
|
129
129
|
*/
|
|
130
130
|
calculateDelay(attempts) {
|
|
131
|
-
|
|
131
|
+
const baseDelay = this.strategy.baseDelayMs * Math.pow(this.strategy.backoffMultiplier, attempts);
|
|
132
132
|
// Cap at max delay
|
|
133
|
-
delay = Math.min(
|
|
133
|
+
let delay = Math.min(baseDelay, this.strategy.maxDelayMs);
|
|
134
134
|
// Add jitter if enabled (±25% randomness)
|
|
135
135
|
if (this.strategy.jitter) {
|
|
136
136
|
const jitterRange = delay * 0.25;
|
|
137
137
|
const jitter = (Math.random() * 2 - 1) * jitterRange;
|
|
138
138
|
delay += jitter;
|
|
139
139
|
}
|
|
140
|
-
|
|
140
|
+
// BUG FIX: Ensure delay is at least 50% of base delay after jitter
|
|
141
|
+
// This prevents near-zero delays that would defeat the purpose of backoff
|
|
142
|
+
const minDelay = this.strategy.baseDelayMs * 0.5;
|
|
143
|
+
return Math.max(delay, minDelay);
|
|
141
144
|
}
|
|
142
145
|
/**
|
|
143
146
|
* Cancel reconnection attempts for a server
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconnection.js","sourceRoot":"","sources":["../../src/mcp/reconnection.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"reconnection.js","sourceRoot":"","sources":["../../src/mcp/reconnection.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/validation.js
CHANGED
|
@@ -80,24 +80,33 @@ export async function validateServerConfig(config) {
|
|
|
80
80
|
* Prevents command injection by only allowing safe commands
|
|
81
81
|
*/
|
|
82
82
|
function validateCommandWhitelist(command) {
|
|
83
|
+
// BUG FIX: Handle empty or whitespace-only commands
|
|
84
|
+
const trimmedCommand = command.trim();
|
|
85
|
+
if (!trimmedCommand) {
|
|
86
|
+
return {
|
|
87
|
+
valid: false,
|
|
88
|
+
error: 'Command cannot be empty'
|
|
89
|
+
};
|
|
90
|
+
}
|
|
83
91
|
// Allow full paths (they will be validated separately)
|
|
84
|
-
if (
|
|
92
|
+
if (trimmedCommand.includes('/') || trimmedCommand.includes('\\')) {
|
|
85
93
|
// Validate path doesn't contain shell metacharacters
|
|
86
94
|
const dangerousChars = /[;&|`$()<>]/;
|
|
87
|
-
if (dangerousChars.test(
|
|
95
|
+
if (dangerousChars.test(trimmedCommand)) {
|
|
88
96
|
return {
|
|
89
97
|
valid: false,
|
|
90
|
-
error: `Command path contains dangerous characters: ${
|
|
98
|
+
error: `Command path contains dangerous characters: ${trimmedCommand}`
|
|
91
99
|
};
|
|
92
100
|
}
|
|
93
101
|
return { valid: true };
|
|
94
102
|
}
|
|
95
103
|
// Check against whitelist
|
|
96
|
-
|
|
97
|
-
|
|
104
|
+
// BUG FIX: Use trimmed command and handle empty result from split
|
|
105
|
+
const baseCommand = trimmedCommand.split(/\s+/)[0] || '';
|
|
106
|
+
if (!baseCommand || !SAFE_MCP_COMMANDS.includes(baseCommand)) {
|
|
98
107
|
return {
|
|
99
108
|
valid: false,
|
|
100
|
-
error: `Command "${baseCommand}" is not in the safe commands whitelist. ` +
|
|
109
|
+
error: `Command "${baseCommand || '(empty)'}" is not in the safe commands whitelist. ` +
|
|
101
110
|
`Allowed: ${SAFE_MCP_COMMANDS.join(', ')}. ` +
|
|
102
111
|
`Use full path for custom commands.`
|
|
103
112
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/mcp/validation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAc1C;;;GAGG;AACH,MAAM,iBAAiB,GAAG;IACxB,2BAA2B;IAC3B,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,SAAS;IACT,KAAK;IACL,MAAM;IACN,KAAK;IACL,SAAS;IACT,QAAQ;IACR,qDAAqD;IACrD,MAAM;IACN,IAAI;IACJ,KAAK;IACL,4CAA4C;CACpC,CAAC;AAIX;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAuB;IAChE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,6CAA6C;IAC7C,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC5C,CAAC;IAED,mCAAmC;IACnC,QAAQ,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC9B,KAAK,OAAO;YACV,MAAM,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK;YACR,MAAM,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YACtD,MAAM;QACR,KAAK,iBAAiB;YACpB,MAAM,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAChE,MAAM;IACV,CAAC;IAED,2DAA2D;IAC3D,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAElD,0BAA0B;IAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,QAAQ,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,IAAI,qFAAqF,CAAC,CAAC;IAClI,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,wBAAwB,CAAC,OAAe;IAC/C,uDAAuD;IACvD,IAAI,
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/mcp/validation.ts"],"names":[],"mappings":"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"}
|
package/dist/memory/index.d.ts
CHANGED
|
@@ -40,3 +40,4 @@ export { ContextGenerator } from './context-generator.js';
|
|
|
40
40
|
export { ContextStore, getContextStore, resetDefaultStore, type StoreResult, } from './context-store.js';
|
|
41
41
|
export { ContextInjector, getContextInjector, resetDefaultInjector, type MemoryMetadata, } from './context-injector.js';
|
|
42
42
|
export { StatsCollector, getStatsCollector, resetDefaultCollector, type FormattedStats, } from './stats-collector.js';
|
|
43
|
+
export { ProviderContextStore, getProviderContextStore, getAllProviderMemoryMetadata, } from './provider-context-store.js';
|
package/dist/memory/index.js
CHANGED
|
@@ -44,4 +44,6 @@ export { ContextStore, getContextStore, resetDefaultStore, } from './context-sto
|
|
|
44
44
|
export { ContextInjector, getContextInjector, resetDefaultInjector, } from './context-injector.js';
|
|
45
45
|
// Stats Collector
|
|
46
46
|
export { StatsCollector, getStatsCollector, resetDefaultCollector, } from './stats-collector.js';
|
|
47
|
+
// Provider-Aware Context Store (Multi-Provider Support)
|
|
48
|
+
export { ProviderContextStore, getProviderContextStore, getAllProviderMemoryMetadata, } from './provider-context-store.js';
|
|
47
49
|
//# sourceMappingURL=index.js.map
|
package/dist/memory/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAiBH,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,UAAU;AACV,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAEtB,oBAAoB;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,gBAAgB;AAChB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAE5B,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,oBAAoB,GAErB,MAAM,uBAAuB,CAAC;AAE/B,kBAAkB;AAClB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GAEtB,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAiBH,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,UAAU;AACV,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAEtB,oBAAoB;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,gBAAgB;AAChB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAE5B,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,oBAAoB,GAErB,MAAM,uBAAuB,CAAC;AAE/B,kBAAkB;AAClB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GAEtB,MAAM,sBAAsB,CAAC;AAE9B,wDAAwD;AACxD,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-Aware Context Store
|
|
3
|
+
*
|
|
4
|
+
* This module extends ContextStore to support provider-specific memory isolation.
|
|
5
|
+
* When running ax-glm and ax-grok in parallel, each has its own memory.json:
|
|
6
|
+
* - .ax-glm/memory.json
|
|
7
|
+
* - .ax-grok/memory.json
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* // Get store for current provider context
|
|
12
|
+
* const store = getProviderContextStore();
|
|
13
|
+
*
|
|
14
|
+
* // Get store for specific provider
|
|
15
|
+
* const glmStore = getProviderContextStore('glm');
|
|
16
|
+
* const grokStore = getProviderContextStore('grok');
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import type { ProjectMemory, CacheStats } from './types.js';
|
|
20
|
+
import { ProviderContext, ProviderType } from '../utils/provider-context.js';
|
|
21
|
+
/**
|
|
22
|
+
* Result type for store operations
|
|
23
|
+
*/
|
|
24
|
+
export type StoreResult<T = void> = {
|
|
25
|
+
success: true;
|
|
26
|
+
data: T;
|
|
27
|
+
} | {
|
|
28
|
+
success: false;
|
|
29
|
+
error: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Provider-Aware Context Store
|
|
33
|
+
*
|
|
34
|
+
* Unlike the base ContextStore which uses a global singleton,
|
|
35
|
+
* this version supports instance-based operation for multi-provider scenarios.
|
|
36
|
+
*/
|
|
37
|
+
export declare class ProviderContextStore {
|
|
38
|
+
private static instances;
|
|
39
|
+
readonly context: ProviderContext;
|
|
40
|
+
readonly memoryPath: string;
|
|
41
|
+
readonly configDir: string;
|
|
42
|
+
private constructor();
|
|
43
|
+
/**
|
|
44
|
+
* Get or create a store for a provider context
|
|
45
|
+
*/
|
|
46
|
+
static forContext(context: ProviderContext): ProviderContextStore;
|
|
47
|
+
/**
|
|
48
|
+
* Get store for specific provider
|
|
49
|
+
*/
|
|
50
|
+
static forProvider(provider: ProviderType, projectRoot?: string): ProviderContextStore;
|
|
51
|
+
/**
|
|
52
|
+
* Get store for current provider context
|
|
53
|
+
*/
|
|
54
|
+
static current(): ProviderContextStore;
|
|
55
|
+
/**
|
|
56
|
+
* Clear all cached instances (for testing)
|
|
57
|
+
*/
|
|
58
|
+
static clearInstances(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Get the path to memory.json
|
|
61
|
+
*/
|
|
62
|
+
getMemoryPath(): string;
|
|
63
|
+
/**
|
|
64
|
+
* Get the config directory path
|
|
65
|
+
*/
|
|
66
|
+
getConfigDir(): string;
|
|
67
|
+
/**
|
|
68
|
+
* Check if memory.json exists
|
|
69
|
+
*/
|
|
70
|
+
exists(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Check if provider config directory exists
|
|
73
|
+
*/
|
|
74
|
+
configDirExists(): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Load project memory from disk with file locking
|
|
77
|
+
*/
|
|
78
|
+
load(): StoreResult<ProjectMemory>;
|
|
79
|
+
/**
|
|
80
|
+
* Save project memory to disk with file locking (atomic write)
|
|
81
|
+
*/
|
|
82
|
+
save(memory: ProjectMemory): StoreResult<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Update only the stats section of memory.json with locking
|
|
85
|
+
*/
|
|
86
|
+
updateStats(stats: Partial<CacheStats>): StoreResult<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Internal load without locking (for use within locked sections)
|
|
89
|
+
*/
|
|
90
|
+
private loadWithoutLock;
|
|
91
|
+
/**
|
|
92
|
+
* Internal save without locking (for use within locked sections)
|
|
93
|
+
*/
|
|
94
|
+
private saveWithoutLock;
|
|
95
|
+
/**
|
|
96
|
+
* Record usage with proper locking (fixes race condition)
|
|
97
|
+
*/
|
|
98
|
+
recordUsage(promptTokens: number, cachedTokens: number): StoreResult<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Delete memory.json
|
|
101
|
+
*/
|
|
102
|
+
clear(): StoreResult<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Get memory metadata without loading full context
|
|
105
|
+
*/
|
|
106
|
+
getMetadata(): {
|
|
107
|
+
exists: boolean;
|
|
108
|
+
provider: ProviderType;
|
|
109
|
+
tokenEstimate?: number;
|
|
110
|
+
updatedAt?: string;
|
|
111
|
+
contentHash?: string;
|
|
112
|
+
usageCount?: number;
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get provider-aware context store
|
|
117
|
+
*/
|
|
118
|
+
export declare function getProviderContextStore(provider?: ProviderType, projectRoot?: string): ProviderContextStore;
|
|
119
|
+
/**
|
|
120
|
+
* Get memory metadata for all configured providers
|
|
121
|
+
*/
|
|
122
|
+
export declare function getAllProviderMemoryMetadata(projectRoot?: string): Array<{
|
|
123
|
+
provider: ProviderType;
|
|
124
|
+
exists: boolean;
|
|
125
|
+
tokenEstimate?: number;
|
|
126
|
+
usageCount?: number;
|
|
127
|
+
}>;
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-Aware Context Store
|
|
3
|
+
*
|
|
4
|
+
* This module extends ContextStore to support provider-specific memory isolation.
|
|
5
|
+
* When running ax-glm and ax-grok in parallel, each has its own memory.json:
|
|
6
|
+
* - .ax-glm/memory.json
|
|
7
|
+
* - .ax-grok/memory.json
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* // Get store for current provider context
|
|
12
|
+
* const store = getProviderContextStore();
|
|
13
|
+
*
|
|
14
|
+
* // Get store for specific provider
|
|
15
|
+
* const glmStore = getProviderContextStore('glm');
|
|
16
|
+
* const grokStore = getProviderContextStore('grok');
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import * as fs from 'fs';
|
|
20
|
+
import { MEMORY_DEFAULTS } from './types.js';
|
|
21
|
+
import { safeValidateProjectMemory } from './schemas.js';
|
|
22
|
+
import { parseJsonFile } from '../utils/json-utils.js';
|
|
23
|
+
import { ProviderContext, getProviderContext, } from '../utils/provider-context.js';
|
|
24
|
+
import { withFileLockSync } from '../utils/file-lock.js';
|
|
25
|
+
/**
|
|
26
|
+
* Provider-Aware Context Store
|
|
27
|
+
*
|
|
28
|
+
* Unlike the base ContextStore which uses a global singleton,
|
|
29
|
+
* this version supports instance-based operation for multi-provider scenarios.
|
|
30
|
+
*/
|
|
31
|
+
export class ProviderContextStore {
|
|
32
|
+
static instances = new Map();
|
|
33
|
+
context;
|
|
34
|
+
memoryPath;
|
|
35
|
+
configDir;
|
|
36
|
+
constructor(context) {
|
|
37
|
+
this.context = context;
|
|
38
|
+
this.configDir = context.projectDir;
|
|
39
|
+
this.memoryPath = context.projectMemoryPath;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get or create a store for a provider context
|
|
43
|
+
*/
|
|
44
|
+
static forContext(context) {
|
|
45
|
+
const key = `${context.provider}:${context.projectDir}`;
|
|
46
|
+
let instance = ProviderContextStore.instances.get(key);
|
|
47
|
+
if (!instance) {
|
|
48
|
+
instance = new ProviderContextStore(context);
|
|
49
|
+
ProviderContextStore.instances.set(key, instance);
|
|
50
|
+
}
|
|
51
|
+
return instance;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get store for specific provider
|
|
55
|
+
*/
|
|
56
|
+
static forProvider(provider, projectRoot) {
|
|
57
|
+
const context = projectRoot
|
|
58
|
+
? ProviderContext.create(provider, projectRoot)
|
|
59
|
+
: ProviderContext.create(provider);
|
|
60
|
+
return ProviderContextStore.forContext(context);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get store for current provider context
|
|
64
|
+
*/
|
|
65
|
+
static current() {
|
|
66
|
+
return ProviderContextStore.forContext(getProviderContext());
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Clear all cached instances (for testing)
|
|
70
|
+
*/
|
|
71
|
+
static clearInstances() {
|
|
72
|
+
ProviderContextStore.instances.clear();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get the path to memory.json
|
|
76
|
+
*/
|
|
77
|
+
getMemoryPath() {
|
|
78
|
+
return this.memoryPath;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get the config directory path
|
|
82
|
+
*/
|
|
83
|
+
getConfigDir() {
|
|
84
|
+
return this.configDir;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if memory.json exists
|
|
88
|
+
*/
|
|
89
|
+
exists() {
|
|
90
|
+
return fs.existsSync(this.memoryPath);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if provider config directory exists
|
|
94
|
+
*/
|
|
95
|
+
configDirExists() {
|
|
96
|
+
return fs.existsSync(this.configDir);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Load project memory from disk with file locking
|
|
100
|
+
*/
|
|
101
|
+
load() {
|
|
102
|
+
if (!this.exists()) {
|
|
103
|
+
return {
|
|
104
|
+
success: false,
|
|
105
|
+
error: `Memory file not found at ${this.memoryPath}. Run: ${this.context.config.cliName} memory warmup`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
// Use file locking for safe concurrent reads
|
|
110
|
+
return withFileLockSync(this.memoryPath, () => {
|
|
111
|
+
// Parse JSON file
|
|
112
|
+
const parseResult = parseJsonFile(this.memoryPath);
|
|
113
|
+
if (!parseResult.success) {
|
|
114
|
+
return {
|
|
115
|
+
success: false,
|
|
116
|
+
error: `Failed to parse memory.json: ${parseResult.error}\n` +
|
|
117
|
+
`💡 The file may be corrupted. Try: ${this.context.config.cliName} memory warmup --force`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// Validate schema
|
|
121
|
+
const validation = safeValidateProjectMemory(parseResult.data);
|
|
122
|
+
if (!validation.success) {
|
|
123
|
+
return {
|
|
124
|
+
success: false,
|
|
125
|
+
error: `Invalid memory.json schema: ${validation.error}\n` +
|
|
126
|
+
`💡 The file format is outdated or corrupted. Run: ${this.context.config.cliName} memory warmup`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// Validate memory size (warn if too large)
|
|
130
|
+
const memory = validation.data;
|
|
131
|
+
const tokenEstimate = memory.context.token_estimate;
|
|
132
|
+
if (tokenEstimate > MEMORY_DEFAULTS.MAX_RECOMMENDED_TOKENS) {
|
|
133
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
134
|
+
console.warn(`⚠️ [${this.context.provider}] Large context detected (${tokenEstimate.toLocaleString()} tokens)\n` +
|
|
135
|
+
` Recommended: <${MEMORY_DEFAULTS.MAX_RECOMMENDED_TOKENS.toLocaleString()} tokens for optimal caching`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return { success: true, data: validation.data };
|
|
139
|
+
}, { type: 'read', timeout: 5000 });
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
return {
|
|
143
|
+
success: false,
|
|
144
|
+
error: `Failed to load memory: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Save project memory to disk with file locking (atomic write)
|
|
150
|
+
*/
|
|
151
|
+
save(memory) {
|
|
152
|
+
try {
|
|
153
|
+
// Ensure provider config directory exists
|
|
154
|
+
if (!fs.existsSync(this.configDir)) {
|
|
155
|
+
fs.mkdirSync(this.configDir, { recursive: true });
|
|
156
|
+
}
|
|
157
|
+
// Validate before saving
|
|
158
|
+
const validation = safeValidateProjectMemory(memory);
|
|
159
|
+
if (!validation.success) {
|
|
160
|
+
return {
|
|
161
|
+
success: false,
|
|
162
|
+
error: `Invalid memory data: ${validation.error}\n` +
|
|
163
|
+
`💡 Memory structure is invalid. Please report this bug.`,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
// Size validation warning
|
|
167
|
+
const tokenEstimate = memory.context.token_estimate;
|
|
168
|
+
if (tokenEstimate > MEMORY_DEFAULTS.MAX_RECOMMENDED_TOKENS) {
|
|
169
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
170
|
+
console.warn(`⚠️ [${this.context.provider}] Saving large context (${tokenEstimate.toLocaleString()} tokens)`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Use file locking for safe concurrent writes
|
|
174
|
+
return withFileLockSync(this.memoryPath, () => {
|
|
175
|
+
// Atomic write: write to temp file then rename
|
|
176
|
+
const tmpPath = `${this.memoryPath}.tmp.${process.pid}.${Date.now()}`;
|
|
177
|
+
const content = JSON.stringify(memory, null, 2);
|
|
178
|
+
try {
|
|
179
|
+
fs.writeFileSync(tmpPath, content, 'utf-8');
|
|
180
|
+
fs.renameSync(tmpPath, this.memoryPath);
|
|
181
|
+
return { success: true, data: undefined };
|
|
182
|
+
}
|
|
183
|
+
catch (writeError) {
|
|
184
|
+
// Clean up temp file
|
|
185
|
+
try {
|
|
186
|
+
if (fs.existsSync(tmpPath)) {
|
|
187
|
+
fs.unlinkSync(tmpPath);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// Ignore cleanup errors
|
|
192
|
+
}
|
|
193
|
+
throw writeError;
|
|
194
|
+
}
|
|
195
|
+
}, { type: 'write', timeout: 10000 });
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
return {
|
|
199
|
+
success: false,
|
|
200
|
+
error: error instanceof Error ? error.message : 'Unknown write error',
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Update only the stats section of memory.json with locking
|
|
206
|
+
*/
|
|
207
|
+
updateStats(stats) {
|
|
208
|
+
try {
|
|
209
|
+
return withFileLockSync(this.memoryPath, () => {
|
|
210
|
+
const loadResult = this.loadWithoutLock();
|
|
211
|
+
if (!loadResult.success) {
|
|
212
|
+
return { success: false, error: loadResult.error };
|
|
213
|
+
}
|
|
214
|
+
const memory = loadResult.data;
|
|
215
|
+
// Merge stats
|
|
216
|
+
memory.stats = {
|
|
217
|
+
...memory.stats,
|
|
218
|
+
...stats,
|
|
219
|
+
last_used_at: new Date().toISOString(),
|
|
220
|
+
};
|
|
221
|
+
// Update timestamp
|
|
222
|
+
memory.updated_at = new Date().toISOString();
|
|
223
|
+
return this.saveWithoutLock(memory);
|
|
224
|
+
}, { type: 'write', timeout: 10000 });
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
return {
|
|
228
|
+
success: false,
|
|
229
|
+
error: `Failed to update stats: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Internal load without locking (for use within locked sections)
|
|
235
|
+
*/
|
|
236
|
+
loadWithoutLock() {
|
|
237
|
+
if (!this.exists()) {
|
|
238
|
+
return {
|
|
239
|
+
success: false,
|
|
240
|
+
error: `Memory file not found at ${this.memoryPath}`,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
const parseResult = parseJsonFile(this.memoryPath);
|
|
244
|
+
if (!parseResult.success) {
|
|
245
|
+
return {
|
|
246
|
+
success: false,
|
|
247
|
+
error: `Failed to parse memory.json: ${parseResult.error}`,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
const validation = safeValidateProjectMemory(parseResult.data);
|
|
251
|
+
if (!validation.success) {
|
|
252
|
+
return {
|
|
253
|
+
success: false,
|
|
254
|
+
error: `Invalid memory.json schema: ${validation.error}`,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
return { success: true, data: validation.data };
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Internal save without locking (for use within locked sections)
|
|
261
|
+
*/
|
|
262
|
+
saveWithoutLock(memory) {
|
|
263
|
+
const tmpPath = `${this.memoryPath}.tmp.${process.pid}.${Date.now()}`;
|
|
264
|
+
const content = JSON.stringify(memory, null, 2);
|
|
265
|
+
try {
|
|
266
|
+
fs.writeFileSync(tmpPath, content, 'utf-8');
|
|
267
|
+
fs.renameSync(tmpPath, this.memoryPath);
|
|
268
|
+
return { success: true, data: undefined };
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
try {
|
|
272
|
+
if (fs.existsSync(tmpPath)) {
|
|
273
|
+
fs.unlinkSync(tmpPath);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
// Ignore cleanup errors
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
success: false,
|
|
281
|
+
error: error instanceof Error ? error.message : 'Unknown write error',
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Record usage with proper locking (fixes race condition)
|
|
287
|
+
*/
|
|
288
|
+
recordUsage(promptTokens, cachedTokens) {
|
|
289
|
+
try {
|
|
290
|
+
return withFileLockSync(this.memoryPath, () => {
|
|
291
|
+
const loadResult = this.loadWithoutLock();
|
|
292
|
+
if (!loadResult.success) {
|
|
293
|
+
return {
|
|
294
|
+
success: false,
|
|
295
|
+
error: `[${this.context.provider}] No memory found - stats not recorded`,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
const memory = loadResult.data;
|
|
299
|
+
const currentStats = memory.stats || {};
|
|
300
|
+
memory.stats = {
|
|
301
|
+
...currentStats,
|
|
302
|
+
last_cached_tokens: cachedTokens,
|
|
303
|
+
last_prompt_tokens: promptTokens,
|
|
304
|
+
total_tokens_saved: (currentStats.total_tokens_saved || 0) + cachedTokens,
|
|
305
|
+
usage_count: (currentStats.usage_count || 0) + 1,
|
|
306
|
+
last_used_at: new Date().toISOString(),
|
|
307
|
+
};
|
|
308
|
+
memory.updated_at = new Date().toISOString();
|
|
309
|
+
return this.saveWithoutLock(memory);
|
|
310
|
+
}, { type: 'write', timeout: 10000 });
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
return {
|
|
314
|
+
success: false,
|
|
315
|
+
error: `Failed to record usage: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Delete memory.json
|
|
321
|
+
*/
|
|
322
|
+
clear() {
|
|
323
|
+
if (!this.exists()) {
|
|
324
|
+
return { success: true, data: undefined };
|
|
325
|
+
}
|
|
326
|
+
try {
|
|
327
|
+
fs.unlinkSync(this.memoryPath);
|
|
328
|
+
return { success: true, data: undefined };
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
return {
|
|
332
|
+
success: false,
|
|
333
|
+
error: error instanceof Error ? error.message : 'Unknown delete error',
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Get memory metadata without loading full context
|
|
339
|
+
*/
|
|
340
|
+
getMetadata() {
|
|
341
|
+
const base = {
|
|
342
|
+
exists: false,
|
|
343
|
+
provider: this.context.provider,
|
|
344
|
+
};
|
|
345
|
+
if (!this.exists()) {
|
|
346
|
+
return base;
|
|
347
|
+
}
|
|
348
|
+
const result = this.load();
|
|
349
|
+
if (!result.success) {
|
|
350
|
+
return base;
|
|
351
|
+
}
|
|
352
|
+
const memory = result.data;
|
|
353
|
+
return {
|
|
354
|
+
exists: true,
|
|
355
|
+
provider: this.context.provider,
|
|
356
|
+
tokenEstimate: memory.context.token_estimate,
|
|
357
|
+
updatedAt: memory.updated_at,
|
|
358
|
+
contentHash: memory.content_hash,
|
|
359
|
+
usageCount: memory.stats?.usage_count,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// ============================================================================
|
|
364
|
+
// Convenience Functions
|
|
365
|
+
// ============================================================================
|
|
366
|
+
/**
|
|
367
|
+
* Get provider-aware context store
|
|
368
|
+
*/
|
|
369
|
+
export function getProviderContextStore(provider, projectRoot) {
|
|
370
|
+
if (provider) {
|
|
371
|
+
return ProviderContextStore.forProvider(provider, projectRoot);
|
|
372
|
+
}
|
|
373
|
+
return ProviderContextStore.current();
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Get memory metadata for all configured providers
|
|
377
|
+
*/
|
|
378
|
+
export function getAllProviderMemoryMetadata(projectRoot) {
|
|
379
|
+
const providers = ['glm', 'grok', 'generic'];
|
|
380
|
+
return providers.map((provider) => {
|
|
381
|
+
const store = getProviderContextStore(provider, projectRoot);
|
|
382
|
+
return store.getMetadata();
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=provider-context-store.js.map
|