@defai.digital/ax-cli 4.0.3 → 4.0.5
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/README.md +61 -2
- package/dist/commands/mcp.js +61 -28
- package/dist/commands/mcp.js.map +1 -1
- package/dist/design/figma-alias.d.ts +5 -0
- package/dist/design/figma-alias.js +11 -4
- package/dist/design/figma-alias.js.map +1 -1
- package/dist/design/figma-audit.js +9 -1
- package/dist/design/figma-audit.js.map +1 -1
- package/dist/design/figma-client.d.ts +4 -0
- package/dist/design/figma-client.js +44 -11
- package/dist/design/figma-client.js.map +1 -1
- package/dist/design/figma-tokens.js +19 -8
- package/dist/design/figma-tokens.js.map +1 -1
- package/dist/mcp/automatosx-loader.d.ts +16 -1
- package/dist/mcp/automatosx-loader.js +18 -8
- package/dist/mcp/automatosx-loader.js.map +1 -1
- package/dist/mcp/cancellation.d.ts +3 -0
- package/dist/mcp/cancellation.js +22 -3
- package/dist/mcp/cancellation.js.map +1 -1
- package/dist/mcp/content-length-transport.d.ts +3 -0
- package/dist/mcp/content-length-transport.js +32 -1
- package/dist/mcp/content-length-transport.js.map +1 -1
- package/dist/mcp/progress.d.ts +3 -0
- package/dist/mcp/progress.js +22 -4
- package/dist/mcp/progress.js.map +1 -1
- package/dist/mcp/schema-validator.d.ts +5 -0
- package/dist/mcp/schema-validator.js +46 -11
- package/dist/mcp/schema-validator.js.map +1 -1
- package/dist/mcp/templates.js +4 -1
- package/dist/mcp/templates.js.map +1 -1
- package/dist/sdk/errors.d.ts +7 -2
- package/dist/sdk/errors.js +17 -5
- package/dist/sdk/errors.js.map +1 -1
- package/dist/sdk/index.d.ts +5 -5
- package/dist/sdk/index.js +113 -31
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/progress-reporter.d.ts +8 -0
- package/dist/sdk/progress-reporter.js +41 -6
- package/dist/sdk/progress-reporter.js.map +1 -1
- package/dist/sdk/testing.d.ts +20 -3
- package/dist/sdk/testing.js +177 -20
- package/dist/sdk/testing.js.map +1 -1
- package/dist/sdk/tool-registry.d.ts +32 -1
- package/dist/sdk/tool-registry.js +111 -13
- package/dist/sdk/tool-registry.js.map +1 -1
- package/dist/sdk/unified-logger.d.ts +6 -0
- package/dist/sdk/unified-logger.js +48 -8
- package/dist/sdk/unified-logger.js.map +1 -1
- package/dist/sdk/version.d.ts +1 -1
- package/dist/sdk/version.js +20 -6
- package/dist/sdk/version.js.map +1 -1
- package/dist/tools/design-tool.d.ts +9 -0
- package/dist/tools/design-tool.js +72 -35
- package/dist/tools/design-tool.js.map +1 -1
- package/dist/ui/components/diff-renderer.js +4 -4
- package/dist/ui/components/diff-renderer.js.map +1 -1
- package/dist/ui/themes/theme-registry.d.ts +3 -1
- package/dist/ui/themes/theme-registry.js +5 -3
- package/dist/ui/themes/theme-registry.js.map +1 -1
- package/package.json +1 -1
|
@@ -40,15 +40,26 @@ export class ToolRegistry {
|
|
|
40
40
|
registerTool(source, definition, executor, options = {}) {
|
|
41
41
|
const toolName = definition.function.name;
|
|
42
42
|
// Check if tool already exists
|
|
43
|
-
|
|
43
|
+
const existingTool = this.tools.get(toolName);
|
|
44
|
+
if (existingTool && !options.allowOverwrite) {
|
|
44
45
|
throw new Error(`Tool '${toolName}' is already registered. Use allowOverwrite: true to replace it.`);
|
|
45
46
|
}
|
|
47
|
+
// If overwriting, remove from old source's set first
|
|
48
|
+
if (existingTool && existingTool.registeredBy !== source) {
|
|
49
|
+
const oldSourceSet = this.toolsBySource.get(existingTool.registeredBy);
|
|
50
|
+
if (oldSourceSet) {
|
|
51
|
+
oldSourceSet.delete(toolName);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// BUG FIX: Clone definition and tags to prevent external mutation of registry state
|
|
55
|
+
// Without this, external code could modify the definition/tags after registration
|
|
56
|
+
// and corrupt the internal registry state
|
|
46
57
|
const registeredTool = {
|
|
47
|
-
definition,
|
|
58
|
+
definition: this.cloneDefinition(definition),
|
|
48
59
|
executor,
|
|
49
60
|
registeredBy: source,
|
|
50
61
|
registeredAt: Date.now(),
|
|
51
|
-
tags: options.tags,
|
|
62
|
+
tags: options.tags ? [...options.tags] : undefined,
|
|
52
63
|
};
|
|
53
64
|
this.tools.set(toolName, registeredTool);
|
|
54
65
|
const sourceSet = this.toolsBySource.get(source);
|
|
@@ -71,11 +82,43 @@ export class ToolRegistry {
|
|
|
71
82
|
}
|
|
72
83
|
return true;
|
|
73
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Deep clone an LLMTool definition to prevent external mutation
|
|
87
|
+
* @internal
|
|
88
|
+
*/
|
|
89
|
+
cloneDefinition(def) {
|
|
90
|
+
return {
|
|
91
|
+
type: def.type,
|
|
92
|
+
function: {
|
|
93
|
+
name: def.function.name,
|
|
94
|
+
description: def.function.description,
|
|
95
|
+
parameters: JSON.parse(JSON.stringify(def.function.parameters)),
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Deep clone a RegisteredTool to prevent external mutation
|
|
101
|
+
* @internal
|
|
102
|
+
*/
|
|
103
|
+
cloneTool(tool) {
|
|
104
|
+
return {
|
|
105
|
+
definition: this.cloneDefinition(tool.definition),
|
|
106
|
+
executor: tool.executor, // Executor is a function, can't be cloned
|
|
107
|
+
registeredBy: tool.registeredBy,
|
|
108
|
+
registeredAt: tool.registeredAt,
|
|
109
|
+
tags: tool.tags ? [...tool.tags] : undefined,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
74
112
|
/**
|
|
75
113
|
* Get a registered tool
|
|
114
|
+
*
|
|
115
|
+
* Returns a deep copy to prevent external mutation of registry state.
|
|
116
|
+
* Note: The executor function reference is shared (cannot be cloned).
|
|
76
117
|
*/
|
|
77
118
|
getTool(toolName) {
|
|
78
|
-
|
|
119
|
+
const tool = this.tools.get(toolName);
|
|
120
|
+
// BUG FIX: Return deep copy to prevent external mutation
|
|
121
|
+
return tool ? this.cloneTool(tool) : undefined;
|
|
79
122
|
}
|
|
80
123
|
/**
|
|
81
124
|
* Check if a tool is registered
|
|
@@ -85,27 +128,36 @@ export class ToolRegistry {
|
|
|
85
128
|
}
|
|
86
129
|
/**
|
|
87
130
|
* Get all tool definitions (OpenAI format)
|
|
131
|
+
*
|
|
132
|
+
* Returns deep copies to prevent external mutation of registry state.
|
|
88
133
|
*/
|
|
89
134
|
getAllToolDefinitions() {
|
|
90
|
-
|
|
135
|
+
// BUG FIX: Return deep copies to prevent external mutation
|
|
136
|
+
return Array.from(this.tools.values()).map(tool => this.cloneDefinition(tool.definition));
|
|
91
137
|
}
|
|
92
138
|
/**
|
|
93
139
|
* Get tool definitions from specific source
|
|
140
|
+
*
|
|
141
|
+
* Returns deep copies to prevent external mutation of registry state.
|
|
94
142
|
*/
|
|
95
143
|
getToolDefinitionsBySource(source) {
|
|
96
144
|
const toolNames = this.toolsBySource.get(source) || new Set();
|
|
145
|
+
// BUG FIX: Return deep copies to prevent external mutation
|
|
97
146
|
return Array.from(toolNames)
|
|
98
147
|
.map(name => this.tools.get(name))
|
|
99
148
|
.filter((tool) => tool !== undefined)
|
|
100
|
-
.map(tool => tool.definition);
|
|
149
|
+
.map(tool => this.cloneDefinition(tool.definition));
|
|
101
150
|
}
|
|
102
151
|
/**
|
|
103
152
|
* Get tool definitions by tag
|
|
153
|
+
*
|
|
154
|
+
* Returns deep copies to prevent external mutation of registry state.
|
|
104
155
|
*/
|
|
105
156
|
getToolDefinitionsByTag(tag) {
|
|
157
|
+
// BUG FIX: Return deep copies to prevent external mutation
|
|
106
158
|
return Array.from(this.tools.values())
|
|
107
159
|
.filter(tool => tool.tags?.includes(tag))
|
|
108
|
-
.map(tool => tool.definition);
|
|
160
|
+
.map(tool => this.cloneDefinition(tool.definition));
|
|
109
161
|
}
|
|
110
162
|
/**
|
|
111
163
|
* Execute a tool
|
|
@@ -119,13 +171,32 @@ export class ToolRegistry {
|
|
|
119
171
|
};
|
|
120
172
|
}
|
|
121
173
|
try {
|
|
122
|
-
|
|
174
|
+
// BUG FIX: Clone args and context before passing to executor
|
|
175
|
+
// This prevents the executor from mutating the caller's objects
|
|
176
|
+
// which could cause subtle bugs if the caller reuses them
|
|
177
|
+
const clonedArgs = JSON.parse(JSON.stringify(args));
|
|
178
|
+
const clonedContext = {
|
|
179
|
+
source: context.source,
|
|
180
|
+
agentId: context.agentId,
|
|
181
|
+
metadata: context.metadata ? { ...context.metadata } : undefined,
|
|
182
|
+
};
|
|
183
|
+
const result = await tool.executor(clonedArgs, clonedContext);
|
|
123
184
|
return result;
|
|
124
185
|
}
|
|
125
186
|
catch (error) {
|
|
187
|
+
// Preserve full error information for debugging
|
|
188
|
+
const errorMessage = error instanceof Error
|
|
189
|
+
? `${error.message}${error.stack ? `\nStack: ${error.stack}` : ''}`
|
|
190
|
+
: 'Unknown execution error';
|
|
126
191
|
return {
|
|
127
192
|
success: false,
|
|
128
|
-
error:
|
|
193
|
+
error: errorMessage,
|
|
194
|
+
// Include structured error data for programmatic access
|
|
195
|
+
data: error instanceof Error ? {
|
|
196
|
+
errorName: error.name,
|
|
197
|
+
errorMessage: error.message,
|
|
198
|
+
errorStack: error.stack,
|
|
199
|
+
} : undefined,
|
|
129
200
|
};
|
|
130
201
|
}
|
|
131
202
|
}
|
|
@@ -186,14 +257,17 @@ export class ToolRegistry {
|
|
|
186
257
|
}
|
|
187
258
|
/**
|
|
188
259
|
* Export registry as JSON (excluding executors)
|
|
260
|
+
*
|
|
261
|
+
* Returns deep copies to prevent external mutation of registry state.
|
|
189
262
|
*/
|
|
190
263
|
exportDefinitions() {
|
|
264
|
+
// BUG FIX: Return deep copies to prevent external mutation
|
|
191
265
|
const tools = Array.from(this.tools.entries()).map(([name, tool]) => ({
|
|
192
266
|
name,
|
|
193
|
-
definition: tool.definition,
|
|
267
|
+
definition: this.cloneDefinition(tool.definition),
|
|
194
268
|
registeredBy: tool.registeredBy,
|
|
195
269
|
registeredAt: tool.registeredAt,
|
|
196
|
-
tags: tool.tags,
|
|
270
|
+
tags: tool.tags ? [...tool.tags] : undefined,
|
|
197
271
|
}));
|
|
198
272
|
return {
|
|
199
273
|
tools,
|
|
@@ -209,12 +283,36 @@ export function getToolRegistry() {
|
|
|
209
283
|
}
|
|
210
284
|
/**
|
|
211
285
|
* Helper: Register multiple tools at once
|
|
286
|
+
*
|
|
287
|
+
* @param source - Source system registering the tools
|
|
288
|
+
* @param tools - Array of tool definitions with executors
|
|
289
|
+
* @returns Object with success status and any errors encountered
|
|
212
290
|
*/
|
|
213
291
|
export function registerTools(source, tools) {
|
|
214
292
|
const registry = getToolRegistry();
|
|
215
|
-
|
|
216
|
-
|
|
293
|
+
const registered = [];
|
|
294
|
+
const errors = [];
|
|
295
|
+
for (let i = 0; i < tools.length; i++) {
|
|
296
|
+
const tool = tools[i];
|
|
297
|
+
// BUG FIX: Safely extract tool name to prevent crashes on malformed input
|
|
298
|
+
// Without this, accessing definition.function.name on null/undefined would throw
|
|
299
|
+
// and crash registration for all remaining tools
|
|
300
|
+
const toolName = tool?.definition?.function?.name ?? `unknown-tool-${i}`;
|
|
301
|
+
try {
|
|
302
|
+
if (!tool || !tool.definition || !tool.executor) {
|
|
303
|
+
throw new Error('Tool definition and executor are required');
|
|
304
|
+
}
|
|
305
|
+
registry.registerTool(source, tool.definition, tool.executor, tool.options);
|
|
306
|
+
registered.push(toolName);
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
errors.push({
|
|
310
|
+
name: toolName,
|
|
311
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
312
|
+
});
|
|
313
|
+
}
|
|
217
314
|
}
|
|
315
|
+
return { registered, errors };
|
|
218
316
|
}
|
|
219
317
|
/**
|
|
220
318
|
* Helper: Create a simple tool executor from a function
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/sdk/tool-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuDH;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,MAAM,CAAC,QAAQ,GAAwB,IAAI,CAAC;IAE5C,KAAK,GAAgC,IAAI,GAAG,EAAE,CAAC;IAC/C,aAAa,GAA6B,IAAI,GAAG,EAAE,CAAC,CAAC,uBAAuB;IAEpF;QACE,yBAAyB;QACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC3B,YAAY,CAAC,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK;QACV,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC1B,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC9B,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CACV,MAA+B,EAC/B,UAAmB,EACnB,QAAsB,EACtB,UAAmC,EAAE;QAErC,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;QAE1C,+BAA+B;QAC/B,
|
|
1
|
+
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/sdk/tool-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -102,10 +102,16 @@ export declare class UnifiedLogger extends EventEmitter {
|
|
|
102
102
|
private trimLogs;
|
|
103
103
|
/**
|
|
104
104
|
* Get all logs (optionally filtered)
|
|
105
|
+
*
|
|
106
|
+
* Returns deep copies of log entries to prevent external mutation of internal state.
|
|
105
107
|
*/
|
|
106
108
|
getLogs(filter?: LogFilter): LogEntry[];
|
|
107
109
|
/**
|
|
108
110
|
* Get recent logs (last N entries)
|
|
111
|
+
*
|
|
112
|
+
* @param count - Number of recent entries to return (must be positive)
|
|
113
|
+
* @param filter - Optional filter to apply before selecting recent entries
|
|
114
|
+
* @returns Array of recent log entries
|
|
109
115
|
*/
|
|
110
116
|
getRecentLogs(count: number, filter?: LogFilter): LogEntry[];
|
|
111
117
|
/**
|
|
@@ -68,24 +68,39 @@ export class UnifiedLogger extends EventEmitter {
|
|
|
68
68
|
if (level < this.minLevel) {
|
|
69
69
|
return;
|
|
70
70
|
}
|
|
71
|
+
// BUG FIX: Clone data to prevent external mutation of stored log entries
|
|
72
|
+
// Without this, external code could modify the data object after logging
|
|
73
|
+
// and corrupt the internal log state
|
|
71
74
|
const entry = {
|
|
72
75
|
timestamp: Date.now(),
|
|
73
76
|
level,
|
|
74
77
|
source,
|
|
75
78
|
message,
|
|
76
|
-
data,
|
|
79
|
+
data: data ? { ...data } : undefined,
|
|
77
80
|
error: error ? {
|
|
78
81
|
message: error.message,
|
|
79
82
|
stack: error.stack,
|
|
80
83
|
name: error.name,
|
|
81
84
|
} : undefined,
|
|
82
85
|
};
|
|
86
|
+
// Trim logs BEFORE adding to prevent exceeding maxLogSize
|
|
87
|
+
// This ensures the array never grows beyond the limit
|
|
88
|
+
if (this.logs.length >= this.maxLogSize) {
|
|
89
|
+
// Remove oldest entries to make room (keep last maxLogSize - 1 entries)
|
|
90
|
+
this.logs = this.logs.slice(-(this.maxLogSize - 1));
|
|
91
|
+
}
|
|
83
92
|
// Add to logs
|
|
84
93
|
this.logs.push(entry);
|
|
85
|
-
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
94
|
+
// BUG FIX: Emit separate copies of the entry to each event channel
|
|
95
|
+
// The stored entry must not be shared with listeners, as listeners could
|
|
96
|
+
// mutate it and corrupt internal state. Each emission gets its own copy.
|
|
97
|
+
const emitEntry = () => ({
|
|
98
|
+
...entry,
|
|
99
|
+
data: entry.data ? { ...entry.data } : undefined,
|
|
100
|
+
error: entry.error ? { ...entry.error } : undefined,
|
|
101
|
+
});
|
|
102
|
+
this.emit('log', emitEntry());
|
|
103
|
+
this.emit(LogLevel[level].toLowerCase(), emitEntry());
|
|
89
104
|
}
|
|
90
105
|
/**
|
|
91
106
|
* Log debug message
|
|
@@ -121,6 +136,8 @@ export class UnifiedLogger extends EventEmitter {
|
|
|
121
136
|
}
|
|
122
137
|
/**
|
|
123
138
|
* Get all logs (optionally filtered)
|
|
139
|
+
*
|
|
140
|
+
* Returns deep copies of log entries to prevent external mutation of internal state.
|
|
124
141
|
*/
|
|
125
142
|
getLogs(filter) {
|
|
126
143
|
let filtered = [...this.logs];
|
|
@@ -135,7 +152,12 @@ export class UnifiedLogger extends EventEmitter {
|
|
|
135
152
|
filtered = filtered.filter(log => log.source === source);
|
|
136
153
|
}
|
|
137
154
|
else if (source instanceof RegExp) {
|
|
138
|
-
|
|
155
|
+
// Reset lastIndex before each filter to avoid stateful behavior with global regexes
|
|
156
|
+
// Global regexes maintain lastIndex state between test() calls which can cause flaky results
|
|
157
|
+
filtered = filtered.filter(log => {
|
|
158
|
+
source.lastIndex = 0;
|
|
159
|
+
return source.test(log.source);
|
|
160
|
+
});
|
|
139
161
|
}
|
|
140
162
|
}
|
|
141
163
|
if (filter.since !== undefined) {
|
|
@@ -147,14 +169,32 @@ export class UnifiedLogger extends EventEmitter {
|
|
|
147
169
|
filtered = filtered.filter(log => log.timestamp <= until);
|
|
148
170
|
}
|
|
149
171
|
}
|
|
150
|
-
|
|
172
|
+
// BUG FIX: Return deep copies to prevent external mutation of internal log entries
|
|
173
|
+
// Without this, external code could modify the returned entries and corrupt internal state
|
|
174
|
+
return filtered.map(log => ({
|
|
175
|
+
...log,
|
|
176
|
+
// Deep copy optional nested objects
|
|
177
|
+
data: log.data ? { ...log.data } : undefined,
|
|
178
|
+
error: log.error ? { ...log.error } : undefined,
|
|
179
|
+
}));
|
|
151
180
|
}
|
|
152
181
|
/**
|
|
153
182
|
* Get recent logs (last N entries)
|
|
183
|
+
*
|
|
184
|
+
* @param count - Number of recent entries to return (must be positive)
|
|
185
|
+
* @param filter - Optional filter to apply before selecting recent entries
|
|
186
|
+
* @returns Array of recent log entries
|
|
154
187
|
*/
|
|
155
188
|
getRecentLogs(count, filter) {
|
|
189
|
+
// Validate count is a positive integer
|
|
190
|
+
const validCount = typeof count === 'number' && isFinite(count) && count > 0
|
|
191
|
+
? Math.floor(count)
|
|
192
|
+
: 0;
|
|
193
|
+
if (validCount === 0) {
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
156
196
|
const logs = this.getLogs(filter);
|
|
157
|
-
return logs.slice(-
|
|
197
|
+
return logs.slice(-validCount);
|
|
158
198
|
}
|
|
159
199
|
/**
|
|
160
200
|
* Subscribe to all log events
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unified-logger.js","sourceRoot":"","sources":["../../src/sdk/unified-logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACX,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AA0CD;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAY;IACrC,MAAM,CAAC,QAAQ,GAAyB,IAAI,CAAC;IAE7C,IAAI,GAAe,EAAE,CAAC;IACtB,UAAU,GAAW,IAAI,CAAC,CAAC,6BAA6B;IACxD,QAAQ,GAAa,QAAQ,CAAC,KAAK,CAAC;IAE5C;QACE,KAAK,EAAE,CAAC;QACR,8CAA8C;QAC9C,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK;QACV,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC3B,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC/B,aAAa,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;YAC5C,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAe;QACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,sBAAsB;QAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,KAAe,EAAE,MAAiB,EAAE,OAAe,EAAE,IAA8B,EAAE,KAAa;QACpG,8BAA8B;QAC9B,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAa;YACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,KAAK;YACL,MAAM;YACN,OAAO;YACP,IAAI;
|
|
1
|
+
{"version":3,"file":"unified-logger.js","sourceRoot":"","sources":["../../src/sdk/unified-logger.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/version.d.ts
CHANGED
package/dist/sdk/version.js
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* - Checking CLI compatibility
|
|
27
27
|
* - Debugging CLI-specific issues
|
|
28
28
|
*/
|
|
29
|
-
export const CLI_VERSION = '
|
|
29
|
+
export const CLI_VERSION = '4.0.5';
|
|
30
30
|
/**
|
|
31
31
|
* SDK library version (semantic versioning for API stability)
|
|
32
32
|
*
|
|
@@ -160,17 +160,31 @@ export function getVersionString() {
|
|
|
160
160
|
* ```
|
|
161
161
|
*/
|
|
162
162
|
export function isSDKVersionCompatible(minVersion) {
|
|
163
|
-
//
|
|
163
|
+
// Validate version string format before parsing
|
|
164
164
|
if (typeof minVersion !== 'string' || !minVersion.trim()) {
|
|
165
165
|
throw new Error(`Invalid version string: "${minVersion}"`);
|
|
166
166
|
}
|
|
167
|
-
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
167
|
+
// Remove leading 'v' if present (e.g., "v1.2.3" -> "1.2.3")
|
|
168
|
+
const normalizedVersion = minVersion.trim().replace(/^v/i, '');
|
|
169
|
+
// Split and validate version parts
|
|
170
|
+
const parts = normalizedVersion.split('.');
|
|
171
|
+
// Warn about non-standard version formats (more or less than 3 parts)
|
|
172
|
+
if (parts.length > 3) {
|
|
173
|
+
console.warn(`[AX SDK] Version "${minVersion}" has more than 3 parts; extra parts will be ignored`);
|
|
174
|
+
}
|
|
175
|
+
const [minMajorStr, minMinorStr = '0', minPatchStr = '0'] = parts;
|
|
176
|
+
const minMajor = parseInt(minMajorStr, 10);
|
|
177
|
+
const minMinor = parseInt(minMinorStr, 10);
|
|
178
|
+
const minPatch = parseInt(minPatchStr, 10);
|
|
179
|
+
// Check for NaN (invalid number in version string)
|
|
171
180
|
if (isNaN(minMajor) || isNaN(minMinor) || isNaN(minPatch)) {
|
|
172
181
|
throw new Error(`Invalid version format: "${minVersion}" (must be semantic version like "1.2.3")`);
|
|
173
182
|
}
|
|
183
|
+
// Validate version numbers are non-negative
|
|
184
|
+
if (minMajor < 0 || minMinor < 0 || minPatch < 0) {
|
|
185
|
+
throw new Error(`Invalid version format: "${minVersion}" (version numbers cannot be negative)`);
|
|
186
|
+
}
|
|
187
|
+
const [curMajor, curMinor = 0, curPatch = 0] = SDK_VERSION.split('.').map(Number);
|
|
174
188
|
// Major version comparison
|
|
175
189
|
if (curMajor > minMajor)
|
|
176
190
|
return true;
|
package/dist/sdk/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/sdk/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/sdk/version.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,15 @@ import { type MapOutputFormat } from '../design/index.js';
|
|
|
12
12
|
* Design Tool for Figma integration
|
|
13
13
|
*/
|
|
14
14
|
export declare class DesignTool {
|
|
15
|
+
/**
|
|
16
|
+
* Validate and get Figma access token
|
|
17
|
+
* Returns error result if token is not available
|
|
18
|
+
*/
|
|
19
|
+
private validateFigmaToken;
|
|
20
|
+
/**
|
|
21
|
+
* Format Figma API errors with helpful messages
|
|
22
|
+
*/
|
|
23
|
+
private formatFigmaError;
|
|
15
24
|
/**
|
|
16
25
|
* Map a Figma file structure
|
|
17
26
|
*/
|
|
@@ -12,18 +12,61 @@ import { extractErrorMessage } from '../utils/error-handler.js';
|
|
|
12
12
|
* Design Tool for Figma integration
|
|
13
13
|
*/
|
|
14
14
|
export class DesignTool {
|
|
15
|
+
/**
|
|
16
|
+
* Validate and get Figma access token
|
|
17
|
+
* Returns error result if token is not available
|
|
18
|
+
*/
|
|
19
|
+
validateFigmaToken() {
|
|
20
|
+
if (!process.env.FIGMA_ACCESS_TOKEN) {
|
|
21
|
+
return {
|
|
22
|
+
success: false,
|
|
23
|
+
error: `FIGMA_ACCESS_TOKEN environment variable not set.
|
|
24
|
+
|
|
25
|
+
To fix this:
|
|
26
|
+
1. Get a personal access token from https://www.figma.com/developers/api#access-tokens
|
|
27
|
+
2. Set it using one of these methods:
|
|
28
|
+
- Run: export FIGMA_ACCESS_TOKEN="your_token"
|
|
29
|
+
- Add to your shell profile (~/.zshrc or ~/.bashrc)
|
|
30
|
+
- Use ax-cli mcp add figma --template --interactive`,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Format Figma API errors with helpful messages
|
|
37
|
+
*/
|
|
38
|
+
formatFigmaError(error, operation) {
|
|
39
|
+
const message = extractErrorMessage(error);
|
|
40
|
+
// Check for common error patterns
|
|
41
|
+
if (message.includes('401') || message.includes('Unauthorized')) {
|
|
42
|
+
return `${operation}: Invalid or expired Figma access token. Please check your FIGMA_ACCESS_TOKEN.`;
|
|
43
|
+
}
|
|
44
|
+
if (message.includes('403') || message.includes('Forbidden')) {
|
|
45
|
+
return `${operation}: Access denied. You may not have permission to access this Figma file.`;
|
|
46
|
+
}
|
|
47
|
+
if (message.includes('404') || message.includes('Not Found')) {
|
|
48
|
+
return `${operation}: Figma file not found. Please check the file key is correct and you have access to the file.`;
|
|
49
|
+
}
|
|
50
|
+
if (message.includes('429') || message.includes('Rate limit')) {
|
|
51
|
+
return `${operation}: Figma API rate limit exceeded. Please wait a moment and try again.`;
|
|
52
|
+
}
|
|
53
|
+
if (message.includes('timeout') || message.includes('Timeout')) {
|
|
54
|
+
return `${operation}: Request timed out. The Figma file may be too large or the API is slow. Try again or use a smaller depth value.`;
|
|
55
|
+
}
|
|
56
|
+
if (message.includes('ENOTFOUND') || message.includes('network')) {
|
|
57
|
+
return `${operation}: Network error. Please check your internet connection.`;
|
|
58
|
+
}
|
|
59
|
+
return `${operation}: ${message}`;
|
|
60
|
+
}
|
|
15
61
|
/**
|
|
16
62
|
* Map a Figma file structure
|
|
17
63
|
*/
|
|
18
64
|
async mapFile(fileKey, options = {}) {
|
|
65
|
+
// Validate token first
|
|
66
|
+
const tokenError = this.validateFigmaToken();
|
|
67
|
+
if (tokenError)
|
|
68
|
+
return tokenError;
|
|
19
69
|
try {
|
|
20
|
-
// Check for FIGMA_ACCESS_TOKEN
|
|
21
|
-
if (!process.env.FIGMA_ACCESS_TOKEN) {
|
|
22
|
-
return {
|
|
23
|
-
success: false,
|
|
24
|
-
error: 'FIGMA_ACCESS_TOKEN environment variable not set. Please set it with your Figma personal access token.',
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
70
|
const client = getFigmaClient();
|
|
28
71
|
const response = await client.getFile(fileKey, {
|
|
29
72
|
depth: options.depth,
|
|
@@ -44,7 +87,7 @@ export class DesignTool {
|
|
|
44
87
|
catch (error) {
|
|
45
88
|
return {
|
|
46
89
|
success: false,
|
|
47
|
-
error:
|
|
90
|
+
error: this.formatFigmaError(error, 'Failed to map Figma file'),
|
|
48
91
|
};
|
|
49
92
|
}
|
|
50
93
|
}
|
|
@@ -52,13 +95,11 @@ export class DesignTool {
|
|
|
52
95
|
* Extract design tokens from a Figma file
|
|
53
96
|
*/
|
|
54
97
|
async extractTokens(fileKey, options = {}) {
|
|
98
|
+
// Validate token first
|
|
99
|
+
const tokenError = this.validateFigmaToken();
|
|
100
|
+
if (tokenError)
|
|
101
|
+
return tokenError;
|
|
55
102
|
try {
|
|
56
|
-
if (!process.env.FIGMA_ACCESS_TOKEN) {
|
|
57
|
-
return {
|
|
58
|
-
success: false,
|
|
59
|
-
error: 'FIGMA_ACCESS_TOKEN environment variable not set.',
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
103
|
const client = getFigmaClient();
|
|
63
104
|
const response = await client.getLocalVariables(fileKey);
|
|
64
105
|
const tokens = extractTokensFromVariables(response, {
|
|
@@ -75,7 +116,7 @@ export class DesignTool {
|
|
|
75
116
|
catch (error) {
|
|
76
117
|
return {
|
|
77
118
|
success: false,
|
|
78
|
-
error:
|
|
119
|
+
error: this.formatFigmaError(error, 'Failed to extract tokens'),
|
|
79
120
|
};
|
|
80
121
|
}
|
|
81
122
|
}
|
|
@@ -83,13 +124,11 @@ export class DesignTool {
|
|
|
83
124
|
* Run design audit on a Figma file
|
|
84
125
|
*/
|
|
85
126
|
async auditFile(fileKey, options = {}) {
|
|
127
|
+
// Validate token first
|
|
128
|
+
const tokenError = this.validateFigmaToken();
|
|
129
|
+
if (tokenError)
|
|
130
|
+
return tokenError;
|
|
86
131
|
try {
|
|
87
|
-
if (!process.env.FIGMA_ACCESS_TOKEN) {
|
|
88
|
-
return {
|
|
89
|
-
success: false,
|
|
90
|
-
error: 'FIGMA_ACCESS_TOKEN environment variable not set.',
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
132
|
const client = getFigmaClient();
|
|
94
133
|
const response = await client.getFile(fileKey, {
|
|
95
134
|
depth: options.depth,
|
|
@@ -119,7 +158,7 @@ export class DesignTool {
|
|
|
119
158
|
catch (error) {
|
|
120
159
|
return {
|
|
121
160
|
success: false,
|
|
122
|
-
error:
|
|
161
|
+
error: this.formatFigmaError(error, 'Failed to audit design'),
|
|
123
162
|
};
|
|
124
163
|
}
|
|
125
164
|
}
|
|
@@ -194,19 +233,17 @@ export class DesignTool {
|
|
|
194
233
|
* Search for nodes in a Figma file
|
|
195
234
|
*/
|
|
196
235
|
async searchNodes(fileKey, options) {
|
|
236
|
+
// Validate token first
|
|
237
|
+
const tokenError = this.validateFigmaToken();
|
|
238
|
+
if (tokenError)
|
|
239
|
+
return tokenError;
|
|
240
|
+
if (!options.name && !options.type && !options.text) {
|
|
241
|
+
return {
|
|
242
|
+
success: false,
|
|
243
|
+
error: 'At least one search option required: name, type, or text',
|
|
244
|
+
};
|
|
245
|
+
}
|
|
197
246
|
try {
|
|
198
|
-
if (!process.env.FIGMA_ACCESS_TOKEN) {
|
|
199
|
-
return {
|
|
200
|
-
success: false,
|
|
201
|
-
error: 'FIGMA_ACCESS_TOKEN environment variable not set.',
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
if (!options.name && !options.type && !options.text) {
|
|
205
|
-
return {
|
|
206
|
-
success: false,
|
|
207
|
-
error: 'At least one search option required: name, type, or text',
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
247
|
const client = getFigmaClient();
|
|
211
248
|
const response = await client.getFile(fileKey);
|
|
212
249
|
const mapResult = mapFigmaFile(response, fileKey);
|
|
@@ -254,7 +291,7 @@ export class DesignTool {
|
|
|
254
291
|
catch (error) {
|
|
255
292
|
return {
|
|
256
293
|
success: false,
|
|
257
|
-
error:
|
|
294
|
+
error: this.formatFigmaError(error, 'Failed to search nodes'),
|
|
258
295
|
};
|
|
259
296
|
}
|
|
260
297
|
}
|