@alisaitteke/photoshop-mcp 1.2.0 → 1.3.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.
Files changed (108) hide show
  1. package/README.md +38 -2
  2. package/dist/analytics/beta-telemetry.d.ts +11 -0
  3. package/dist/analytics/beta-telemetry.d.ts.map +1 -0
  4. package/dist/analytics/beta-telemetry.js +47 -0
  5. package/dist/analytics/beta-telemetry.js.map +1 -0
  6. package/dist/analytics/client-ip.d.ts +5 -0
  7. package/dist/analytics/client-ip.d.ts.map +1 -0
  8. package/dist/analytics/client-ip.js +39 -0
  9. package/dist/analytics/client-ip.js.map +1 -0
  10. package/dist/analytics/config.d.ts +6 -0
  11. package/dist/analytics/config.d.ts.map +1 -0
  12. package/dist/analytics/config.js +23 -0
  13. package/dist/analytics/config.js.map +1 -0
  14. package/dist/analytics/context.d.ts +2 -0
  15. package/dist/analytics/context.d.ts.map +1 -0
  16. package/dist/analytics/context.js +13 -0
  17. package/dist/analytics/context.js.map +1 -0
  18. package/dist/analytics/events.d.ts +3 -0
  19. package/dist/analytics/events.d.ts.map +1 -0
  20. package/dist/analytics/events.js +85 -0
  21. package/dist/analytics/events.js.map +1 -0
  22. package/dist/analytics/identity.d.ts +9 -0
  23. package/dist/analytics/identity.d.ts.map +1 -0
  24. package/dist/analytics/identity.js +166 -0
  25. package/dist/analytics/identity.js.map +1 -0
  26. package/dist/analytics/index.d.ts +12 -0
  27. package/dist/analytics/index.d.ts.map +1 -0
  28. package/dist/analytics/index.js +38 -0
  29. package/dist/analytics/index.js.map +1 -0
  30. package/dist/analytics/launch-method.d.ts +4 -0
  31. package/dist/analytics/launch-method.d.ts.map +1 -0
  32. package/dist/analytics/launch-method.js +33 -0
  33. package/dist/analytics/launch-method.js.map +1 -0
  34. package/dist/analytics/locale.d.ts +4 -0
  35. package/dist/analytics/locale.d.ts.map +1 -0
  36. package/dist/analytics/locale.js +14 -0
  37. package/dist/analytics/locale.js.map +1 -0
  38. package/dist/analytics/noop.d.ts +6 -0
  39. package/dist/analytics/noop.d.ts.map +1 -0
  40. package/dist/analytics/noop.js +9 -0
  41. package/dist/analytics/noop.js.map +1 -0
  42. package/dist/analytics/posthog-node.d.ts +11 -0
  43. package/dist/analytics/posthog-node.d.ts.map +1 -0
  44. package/dist/analytics/posthog-node.js +55 -0
  45. package/dist/analytics/posthog-node.js.map +1 -0
  46. package/dist/analytics/provider.d.ts +5 -0
  47. package/dist/analytics/provider.d.ts.map +1 -0
  48. package/dist/analytics/provider.js +27 -0
  49. package/dist/analytics/provider.js.map +1 -0
  50. package/dist/analytics/types.d.ts +23 -0
  51. package/dist/analytics/types.d.ts.map +1 -0
  52. package/dist/analytics/types.js +2 -0
  53. package/dist/analytics/types.js.map +1 -0
  54. package/dist/core/server.d.ts +1 -0
  55. package/dist/core/server.d.ts.map +1 -1
  56. package/dist/core/server.js +3 -0
  57. package/dist/core/server.js.map +1 -1
  58. package/dist/index.js +32 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/platform/macos-detector.js +4 -4
  61. package/dist/platform/macos-detector.js.map +1 -1
  62. package/dist/platform/macos-executor.js +1 -1
  63. package/dist/platform/macos-executor.js.map +1 -1
  64. package/dist/platform/windows-detector.js +4 -4
  65. package/dist/platform/windows-detector.js.map +1 -1
  66. package/dist/platform/windows-executor.js +2 -2
  67. package/dist/platform/windows-executor.js.map +1 -1
  68. package/dist/ui/agent/action-plan.d.ts +19 -0
  69. package/dist/ui/agent/action-plan.d.ts.map +1 -0
  70. package/dist/ui/agent/action-plan.js +552 -0
  71. package/dist/ui/agent/action-plan.js.map +1 -0
  72. package/dist/ui/agent/api-key.d.ts.map +1 -1
  73. package/dist/ui/agent/api-key.js +22 -4
  74. package/dist/ui/agent/api-key.js.map +1 -1
  75. package/dist/ui/agent/claude-account.d.ts.map +1 -1
  76. package/dist/ui/agent/claude-account.js +26 -12
  77. package/dist/ui/agent/claude-account.js.map +1 -1
  78. package/dist/ui/agent/gemini-account.d.ts.map +1 -1
  79. package/dist/ui/agent/gemini-account.js +14 -4
  80. package/dist/ui/agent/gemini-account.js.map +1 -1
  81. package/dist/ui/agent/shared.d.ts +26 -1
  82. package/dist/ui/agent/shared.d.ts.map +1 -1
  83. package/dist/ui/agent/shared.js +61 -0
  84. package/dist/ui/agent/shared.js.map +1 -1
  85. package/dist/ui/agent.d.ts +1 -0
  86. package/dist/ui/agent.d.ts.map +1 -1
  87. package/dist/ui/agent.js +36 -0
  88. package/dist/ui/agent.js.map +1 -1
  89. package/dist/ui/cli.js +11 -1
  90. package/dist/ui/cli.js.map +1 -1
  91. package/dist/ui/config.d.ts +6 -1
  92. package/dist/ui/config.d.ts.map +1 -1
  93. package/dist/ui/config.js +1 -12
  94. package/dist/ui/config.js.map +1 -1
  95. package/dist/ui/server.d.ts.map +1 -1
  96. package/dist/ui/server.js +103 -6
  97. package/dist/ui/server.js.map +1 -1
  98. package/dist/ui/store/chats.d.ts +11 -0
  99. package/dist/ui/store/chats.d.ts.map +1 -1
  100. package/dist/ui/store/chats.js.map +1 -1
  101. package/dist/ui/store/db.js +2 -2
  102. package/dist/ui/store/db.js.map +1 -1
  103. package/package.json +4 -2
  104. package/web/dist/assets/index-BgiXf1Jy.css +1 -0
  105. package/web/dist/assets/index-n0ymP-Cw.js +249 -0
  106. package/web/dist/index.html +9 -3
  107. package/web/dist/assets/index-BN0tu4e6.css +0 -1
  108. package/web/dist/assets/index-Cf7sH5RM.js +0 -138
@@ -0,0 +1,552 @@
1
+ import { createMCPClient } from '@ai-sdk/mcp';
2
+ import { Experimental_StdioMCPTransport } from '@ai-sdk/mcp/mcp-stdio';
3
+ import { Output, streamText } from 'ai';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { z } from 'zod';
6
+ import { PHOTOSHOP_EXPORT_CHAT_ID_ENV } from '../../lib/export-paths.js';
7
+ import { buildSpawnArgs, sanitizedEnv } from './mcp-transport.js';
8
+ import { computeCost, isToolOutputOk, parseToolEnvelope, stringifyToolOutput, toolFailureMessage, } from './shared.js';
9
+ const MAX_STEPS = 20;
10
+ const MAX_REPAIRS = 3;
11
+ const MAX_SUGGESTED_FOLLOW_UPS = 5;
12
+ const planStepSchema = z.object({
13
+ id: z.string().describe('Unique short id for this step, e.g. "s1".'),
14
+ tool: z.string().describe('Exact tool name from the catalog.'),
15
+ argsJson: z
16
+ .string()
17
+ .describe('JSON-encoded object of arguments for the tool. Use "{}" if none. ' +
18
+ 'A value may reference a prior step result with the placeholder ' +
19
+ '"$steps.<stepId>.<dot.path>" (e.g. "$steps.s1.document.id").'),
20
+ rationale: z.string().optional().describe('One short sentence on why this step.'),
21
+ dependsOn: z.array(z.string()).optional().describe('Step ids this step depends on.'),
22
+ });
23
+ const planSchema = z.object({
24
+ summary: z.string().describe('One short sentence summarizing the overall plan.'),
25
+ steps: z.array(planStepSchema).max(MAX_STEPS),
26
+ });
27
+ class PlaceholderError extends Error {
28
+ }
29
+ export async function* runChatViaActionPlan(opts) {
30
+ let mcp;
31
+ const buffer = { text: '', toolCalls: [] };
32
+ const model = opts.provider.getLanguageModel({ apiKey: opts.apiKey, modelId: opts.modelId });
33
+ const pricing = opts.provider.getModelPricing(opts.modelId);
34
+ // Aggregate planner + repair token usage across all generateObject calls.
35
+ const totalUsage = {
36
+ inputTokens: 0,
37
+ outputTokens: 0,
38
+ totalTokens: 0,
39
+ inputTokenDetails: { noCacheTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 },
40
+ outputTokenDetails: { textTokens: 0, reasoningTokens: 0 },
41
+ };
42
+ const addUsage = (u) => {
43
+ if (!u)
44
+ return;
45
+ totalUsage.inputTokens = (totalUsage.inputTokens ?? 0) + (u.inputTokens ?? 0);
46
+ totalUsage.outputTokens = (totalUsage.outputTokens ?? 0) + (u.outputTokens ?? 0);
47
+ totalUsage.totalTokens = (totalUsage.totalTokens ?? 0) + (u.totalTokens ?? 0);
48
+ const id = totalUsage.inputTokenDetails;
49
+ id.noCacheTokens = (id.noCacheTokens ?? 0) + (u.inputTokenDetails?.noCacheTokens ?? 0);
50
+ id.cacheReadTokens = (id.cacheReadTokens ?? 0) + (u.inputTokenDetails?.cacheReadTokens ?? 0);
51
+ id.cacheWriteTokens = (id.cacheWriteTokens ?? 0) + (u.inputTokenDetails?.cacheWriteTokens ?? 0);
52
+ const od = totalUsage.outputTokenDetails;
53
+ od.textTokens = (od.textTokens ?? 0) + (u.outputTokenDetails?.textTokens ?? 0);
54
+ od.reasoningTokens = (od.reasoningTokens ?? 0) + (u.outputTokenDetails?.reasoningTokens ?? 0);
55
+ };
56
+ try {
57
+ mcp = await createMCPClient({
58
+ transport: new Experimental_StdioMCPTransport({
59
+ command: process.execPath,
60
+ args: buildSpawnArgs(),
61
+ env: {
62
+ ...sanitizedEnv(),
63
+ LOG_LEVEL: process.env.LOG_LEVEL ?? '2',
64
+ ...(opts.chatId ? { [PHOTOSHOP_EXPORT_CHAT_ID_ENV]: opts.chatId } : {}),
65
+ },
66
+ }),
67
+ });
68
+ const tools = (await mcp.tools());
69
+ const catalog = buildToolCatalog(tools);
70
+ // ---- 1. Plan ---------------------------------------------------------
71
+ yield { type: 'activity', payload: { phase: 'planning' } };
72
+ let plan;
73
+ try {
74
+ const streamed = streamText({
75
+ model,
76
+ output: Output.object({ schema: planSchema }),
77
+ system: opts.systemPrompt,
78
+ prompt: buildPlannerPrompt(catalog, opts.history, opts.prompt),
79
+ abortSignal: opts.abortSignal,
80
+ });
81
+ for await (const partial of streamed.partialOutputStream) {
82
+ const partialView = toPartialPlanView(partial);
83
+ buffer.plan = partialView;
84
+ yield { type: 'plan-partial', payload: partialView };
85
+ opts.onAssistantBuffer?.(buffer);
86
+ }
87
+ plan = await streamed.output;
88
+ addUsage(await streamed.usage);
89
+ }
90
+ catch (err) {
91
+ yield {
92
+ type: 'error',
93
+ payload: { message: `Planning failed: ${err.message}` },
94
+ };
95
+ return;
96
+ }
97
+ // Empty plan -> fall back to a single natural-language reply.
98
+ if (!plan.steps.length) {
99
+ buffer.text = plan.summary?.trim() || 'No actionable steps were produced for this request.';
100
+ yield { type: 'text-delta', payload: { text: buffer.text } };
101
+ opts.onAssistantBuffer?.(buffer);
102
+ yield* emitFinish();
103
+ return;
104
+ }
105
+ const planView = {
106
+ summary: plan.summary,
107
+ steps: plan.steps.map((s) => toStepView(s, 'pending')),
108
+ };
109
+ buffer.plan = planView;
110
+ yield { type: 'plan', payload: planView };
111
+ opts.onAssistantBuffer?.(buffer);
112
+ // ---- 2. Execute (with bounded repair) --------------------------------
113
+ const results = {};
114
+ let steps = plan.steps;
115
+ let i = 0;
116
+ let repairs = 0;
117
+ while (i < steps.length) {
118
+ if (opts.abortSignal.aborted)
119
+ break;
120
+ const step = steps[i];
121
+ const toolCallId = randomUUID();
122
+ setStepStatus(planView, step.id, 'running');
123
+ yield { type: 'plan-step', payload: { id: step.id, status: 'running' } };
124
+ opts.onAssistantBuffer?.(buffer);
125
+ const tool = tools[step.tool];
126
+ // Resolve args + validate tool existence before announcing the call.
127
+ let args;
128
+ let prepError;
129
+ if (!tool || typeof tool.execute !== 'function') {
130
+ prepError = `Unknown tool "${step.tool}". It is not in the available tool catalog.`;
131
+ }
132
+ else {
133
+ try {
134
+ args = resolveArgs(step.argsJson, results);
135
+ }
136
+ catch (err) {
137
+ prepError =
138
+ err instanceof PlaceholderError
139
+ ? `Unresolved dependency: ${err.message}`
140
+ : `Invalid arguments JSON: ${err.message}`;
141
+ }
142
+ }
143
+ if (prepError) {
144
+ const repaired = yield* tryRepair(prepError, step);
145
+ if (!repaired)
146
+ break;
147
+ continue;
148
+ }
149
+ yield {
150
+ type: 'tool-call',
151
+ payload: { id: toolCallId, name: step.tool, input: args },
152
+ };
153
+ buffer.toolCalls.push({ id: toolCallId, name: step.tool, input: args, status: 'pending' });
154
+ opts.onAssistantBuffer?.(buffer);
155
+ try {
156
+ const output = await tool.execute(args, {
157
+ toolCallId,
158
+ messages: [],
159
+ abortSignal: opts.abortSignal,
160
+ });
161
+ results[step.id] = output;
162
+ const text = stringifyToolOutput(output);
163
+ const ok = isToolOutputOk(output);
164
+ const tc = buffer.toolCalls.find((c) => c.id === toolCallId);
165
+ if (tc) {
166
+ tc.result = { ok, content: text };
167
+ tc.status = ok ? 'success' : 'error';
168
+ }
169
+ yield { type: 'tool-result', payload: { id: toolCallId, ok, content: text } };
170
+ opts.onAssistantBuffer?.(buffer);
171
+ if (ok) {
172
+ setStepStatus(planView, step.id, 'done');
173
+ yield { type: 'plan-step', payload: { id: step.id, status: 'done' } };
174
+ opts.onAssistantBuffer?.(buffer);
175
+ i++;
176
+ }
177
+ else {
178
+ const repaired = yield* tryRepair(toolFailureMessage(output, text), step);
179
+ if (!repaired)
180
+ break;
181
+ }
182
+ }
183
+ catch (err) {
184
+ const text = err?.message ?? String(err);
185
+ const tc = buffer.toolCalls.find((c) => c.id === toolCallId);
186
+ if (tc) {
187
+ tc.result = { ok: false, content: text };
188
+ tc.status = 'error';
189
+ }
190
+ yield { type: 'tool-result', payload: { id: toolCallId, ok: false, content: text } };
191
+ opts.onAssistantBuffer?.(buffer);
192
+ const repaired = yield* tryRepair(text, step);
193
+ if (!repaired)
194
+ break;
195
+ }
196
+ }
197
+ // ---- 3. Execute tool-suggested follow-ups (no extra LLM round-trip) --
198
+ if (i >= steps.length && !opts.abortSignal.aborted && steps.length > 0) {
199
+ const lastStep = steps[steps.length - 1];
200
+ let lastOutput = results[lastStep.id];
201
+ let followUpCount = 0;
202
+ const seenFollowUpTools = new Set();
203
+ while (followUpCount < MAX_SUGGESTED_FOLLOW_UPS &&
204
+ lastOutput &&
205
+ !opts.abortSignal.aborted) {
206
+ const suggestion = extractSuggestedFollowUp(lastOutput);
207
+ if (!suggestion || seenFollowUpTools.has(suggestion.tool))
208
+ break;
209
+ const followTool = tools[suggestion.tool];
210
+ if (!followTool || typeof followTool.execute !== 'function')
211
+ break;
212
+ seenFollowUpTools.add(suggestion.tool);
213
+ followUpCount++;
214
+ const followStepId = `followup-${followUpCount}`;
215
+ const toolCallId = randomUUID();
216
+ planView.steps.push({
217
+ id: followStepId,
218
+ tool: suggestion.tool,
219
+ rationale: 'Suggested by prior tool result',
220
+ status: 'running',
221
+ });
222
+ yield { type: 'plan', payload: planView };
223
+ yield {
224
+ type: 'plan-step',
225
+ payload: { id: followStepId, status: 'running' },
226
+ };
227
+ opts.onAssistantBuffer?.(buffer);
228
+ yield {
229
+ type: 'tool-call',
230
+ payload: { id: toolCallId, name: suggestion.tool, input: suggestion.args },
231
+ };
232
+ buffer.toolCalls.push({
233
+ id: toolCallId,
234
+ name: suggestion.tool,
235
+ input: suggestion.args,
236
+ status: 'pending',
237
+ });
238
+ opts.onAssistantBuffer?.(buffer);
239
+ try {
240
+ const output = await followTool.execute(suggestion.args, {
241
+ toolCallId,
242
+ messages: [],
243
+ abortSignal: opts.abortSignal,
244
+ });
245
+ lastOutput = output;
246
+ results[followStepId] = output;
247
+ const text = stringifyToolOutput(output);
248
+ const ok = isToolOutputOk(output);
249
+ const tc = buffer.toolCalls.find((c) => c.id === toolCallId);
250
+ if (tc) {
251
+ tc.result = { ok, content: text };
252
+ tc.status = ok ? 'success' : 'error';
253
+ }
254
+ yield { type: 'tool-result', payload: { id: toolCallId, ok, content: text } };
255
+ if (ok) {
256
+ setStepStatus(planView, followStepId, 'done');
257
+ yield {
258
+ type: 'plan-step',
259
+ payload: { id: followStepId, status: 'done' },
260
+ };
261
+ opts.onAssistantBuffer?.(buffer);
262
+ }
263
+ else {
264
+ setStepStatus(planView, followStepId, 'error');
265
+ yield {
266
+ type: 'plan-step',
267
+ payload: { id: followStepId, status: 'error' },
268
+ };
269
+ opts.onAssistantBuffer?.(buffer);
270
+ break;
271
+ }
272
+ }
273
+ catch (err) {
274
+ const text = err?.message ?? String(err);
275
+ const tc = buffer.toolCalls.find((c) => c.id === toolCallId);
276
+ if (tc) {
277
+ tc.result = { ok: false, content: text };
278
+ tc.status = 'error';
279
+ }
280
+ yield { type: 'tool-result', payload: { id: toolCallId, ok: false, content: text } };
281
+ setStepStatus(planView, followStepId, 'error');
282
+ yield {
283
+ type: 'plan-step',
284
+ payload: { id: followStepId, status: 'error' },
285
+ };
286
+ opts.onAssistantBuffer?.(buffer);
287
+ break;
288
+ }
289
+ }
290
+ }
291
+ yield* emitFinish();
292
+ return;
293
+ // ---- helpers (closures over plan state) ------------------------------
294
+ function* emitFinish() {
295
+ const cost = pricing ? computeCost(totalUsage, pricing) : undefined;
296
+ opts.onFinish?.({ usage: totalUsage, cost });
297
+ yield { type: 'finish', payload: { finishReason: 'stop', usage: totalUsage, cost } };
298
+ }
299
+ /**
300
+ * Re-plan ONLY the remaining steps (from the current failed index) using the
301
+ * accumulated results and the error. Returns false when the repair budget is
302
+ * exhausted (caller should stop), true when execution can continue.
303
+ */
304
+ async function* tryRepair(errorMessage, failedStep) {
305
+ if (repairs >= MAX_REPAIRS) {
306
+ setStepStatus(planView, failedStep.id, 'error');
307
+ opts.onAssistantBuffer?.(buffer);
308
+ yield {
309
+ type: 'plan-step',
310
+ payload: { id: failedStep.id, status: 'error' },
311
+ };
312
+ yield {
313
+ type: 'error',
314
+ payload: {
315
+ message: `Action plan failed after ${MAX_REPAIRS} repair attempts at step "${failedStep.id}": ${errorMessage}`,
316
+ },
317
+ };
318
+ return false;
319
+ }
320
+ repairs++;
321
+ setStepStatus(planView, failedStep.id, 'error');
322
+ yield { type: 'plan-step', payload: { id: failedStep.id, status: 'error' } };
323
+ yield {
324
+ type: 'plan-repair',
325
+ payload: { stepId: failedStep.id, attempt: repairs, reason: errorMessage },
326
+ };
327
+ opts.onAssistantBuffer?.(buffer);
328
+ const remaining = steps.slice(i);
329
+ let replanned;
330
+ try {
331
+ yield { type: 'activity', payload: { phase: 'planning' } };
332
+ const streamed = streamText({
333
+ model,
334
+ output: Output.object({ schema: planSchema }),
335
+ system: opts.systemPrompt,
336
+ prompt: buildRepairPrompt(catalog, opts.prompt, remaining, results, errorMessage),
337
+ abortSignal: opts.abortSignal,
338
+ });
339
+ for await (const partial of streamed.partialOutputStream) {
340
+ const partialTail = toPartialPlanView(partial);
341
+ const mergedView = {
342
+ summary: partialTail.summary || planView.summary,
343
+ steps: [
344
+ ...planView.steps.slice(0, i),
345
+ ...partialTail.steps,
346
+ ],
347
+ };
348
+ buffer.plan = mergedView;
349
+ yield { type: 'plan-partial', payload: mergedView };
350
+ opts.onAssistantBuffer?.(buffer);
351
+ }
352
+ replanned = await streamed.output;
353
+ addUsage(await streamed.usage);
354
+ }
355
+ catch (err) {
356
+ yield {
357
+ type: 'error',
358
+ payload: { message: `Re-planning failed: ${err.message}` },
359
+ };
360
+ return false;
361
+ }
362
+ // Splice the new steps in place of the remaining ones; keep index.
363
+ steps = [...steps.slice(0, i), ...replanned.steps];
364
+ // Rebuild the plan view tail so the UI reflects the new todo list.
365
+ planView.steps = [
366
+ ...planView.steps.slice(0, i),
367
+ ...replanned.steps.map((s) => toStepView(s, 'pending')),
368
+ ];
369
+ yield { type: 'plan', payload: planView };
370
+ opts.onAssistantBuffer?.(buffer);
371
+ return true;
372
+ }
373
+ }
374
+ finally {
375
+ if (mcp)
376
+ await mcp.close().catch(() => undefined);
377
+ }
378
+ }
379
+ // ---- pure helpers ------------------------------------------------------
380
+ function toStepView(step, status) {
381
+ return { id: step.id, tool: step.tool, rationale: step.rationale, status };
382
+ }
383
+ function toPartialPlanView(partial) {
384
+ const rawSteps = partial.steps ?? [];
385
+ const steps = [];
386
+ for (const s of rawSteps) {
387
+ if (!s)
388
+ continue;
389
+ steps.push({
390
+ id: s.id ?? '',
391
+ tool: s.tool ?? '',
392
+ rationale: s.rationale,
393
+ status: 'pending',
394
+ });
395
+ }
396
+ return {
397
+ summary: partial.summary ?? '',
398
+ steps: steps.filter((s) => s.id || s.tool),
399
+ };
400
+ }
401
+ function setStepStatus(plan, id, status) {
402
+ const step = plan.steps.find((s) => s.id === id);
403
+ if (step)
404
+ step.status = status;
405
+ }
406
+ function buildToolCatalog(tools) {
407
+ const lines = [];
408
+ for (const [name, tool] of Object.entries(tools)) {
409
+ const desc = (tool.description ?? '').replace(/\s+/g, ' ').trim();
410
+ let params = '';
411
+ try {
412
+ const schema = tool.inputSchema;
413
+ const json = schema?.jsonSchema ?? schema;
414
+ if (json)
415
+ params = JSON.stringify(json);
416
+ }
417
+ catch {
418
+ params = '';
419
+ }
420
+ lines.push(`- ${name}: ${desc}${params ? `\n params: ${params}` : ''}`);
421
+ }
422
+ return lines.join('\n');
423
+ }
424
+ function buildPlannerPrompt(catalog, history, prompt) {
425
+ return [
426
+ 'Produce a COMPLETE ordered execution plan of Photoshop MCP tool calls that fully delivers the user request.',
427
+ 'Rules:',
428
+ '- Use ONLY tools from the catalog below; copy tool names exactly.',
429
+ '- Each step\'s argsJson must be a valid JSON object string matching the tool params.',
430
+ '- When a step needs a value produced by an earlier step, reference it with',
431
+ ' "$steps.<stepId>.<dot.path>" inside argsJson instead of guessing.',
432
+ '- The plan must accomplish the full request end-to-end. Do not stop at partial progress.',
433
+ '- After meaningful visual edits, include photoshop_get_preview when the user expects to see the result.',
434
+ '- Prefer photoshop_recipe_* tools over composing many atomic calls when the request matches a recipe.',
435
+ '- Read each tool description: if a recipe already performs a sub-task, do not duplicate with atomic tools.',
436
+ '- Include photoshop_get_state when document/layer state is uncertain before dependent tools.',
437
+ '- Include export/save steps when the user asks to export or save a file.',
438
+ '',
439
+ 'Tool catalog:',
440
+ catalog,
441
+ '',
442
+ formatHistory(history),
443
+ `User request: ${prompt}`,
444
+ ]
445
+ .filter(Boolean)
446
+ .join('\n');
447
+ }
448
+ function buildRepairPrompt(catalog, originalPrompt, remaining, results, errorMessage) {
449
+ return [
450
+ 'A step in the execution plan failed. Re-plan ONLY the remaining work.',
451
+ `Original user request: ${originalPrompt}`,
452
+ '',
453
+ 'Error from the failed step:',
454
+ errorMessage,
455
+ '',
456
+ 'Results already produced by completed steps (JSON):',
457
+ safeJson(results),
458
+ '',
459
+ 'Remaining steps that still need to run (the first one failed):',
460
+ safeJson(remaining),
461
+ '',
462
+ 'Return a corrected, ordered plan for the remaining work only. Reuse prior results',
463
+ 'via "$steps.<stepId>.<dot.path>" placeholders. Use ONLY tools from the catalog.',
464
+ '',
465
+ 'Tool catalog:',
466
+ catalog,
467
+ ].join('\n');
468
+ }
469
+ function formatHistory(history) {
470
+ if (!history.length)
471
+ return '';
472
+ const lines = history
473
+ .map((m) => {
474
+ const text = typeof m.content === 'string'
475
+ ? m.content
476
+ : Array.isArray(m.content)
477
+ ? m.content.map((p) => ('text' in p ? p.text : '')).filter(Boolean).join(' ')
478
+ : '';
479
+ const trimmed = text.trim();
480
+ return trimmed ? `${m.role === 'user' ? 'User' : 'Assistant'}: ${trimmed}` : '';
481
+ })
482
+ .filter(Boolean);
483
+ return lines.length ? `Conversation so far:\n${lines.join('\n')}\n` : '';
484
+ }
485
+ function resolveArgs(argsJson, results) {
486
+ const trimmed = (argsJson ?? '').trim();
487
+ if (!trimmed)
488
+ return {};
489
+ const parsed = JSON.parse(trimmed);
490
+ return resolvePlaceholders(parsed, results);
491
+ }
492
+ const PLACEHOLDER_RE = /^\$steps\.([^.]+)(?:\.(.+))?$/;
493
+ function resolvePlaceholders(value, results) {
494
+ if (typeof value === 'string') {
495
+ const match = PLACEHOLDER_RE.exec(value);
496
+ if (!match)
497
+ return value;
498
+ const [, stepId, path] = match;
499
+ if (!(stepId in results)) {
500
+ throw new PlaceholderError(`step "${stepId}" has no result yet for "${value}"`);
501
+ }
502
+ const resolved = path ? getByPath(results[stepId], path) : results[stepId];
503
+ if (resolved === undefined) {
504
+ throw new PlaceholderError(`path "${path}" not found in result of step "${stepId}"`);
505
+ }
506
+ return resolved;
507
+ }
508
+ if (Array.isArray(value)) {
509
+ return value.map((v) => resolvePlaceholders(v, results));
510
+ }
511
+ if (value && typeof value === 'object') {
512
+ const out = {};
513
+ for (const [k, v] of Object.entries(value)) {
514
+ out[k] = resolvePlaceholders(v, results);
515
+ }
516
+ return out;
517
+ }
518
+ return value;
519
+ }
520
+ function getByPath(root, path) {
521
+ let current = root;
522
+ for (const key of path.split('.')) {
523
+ if (current == null || typeof current !== 'object')
524
+ return undefined;
525
+ current = current[key];
526
+ }
527
+ return current;
528
+ }
529
+ function safeJson(value) {
530
+ try {
531
+ return JSON.stringify(value, null, 2);
532
+ }
533
+ catch {
534
+ return String(value);
535
+ }
536
+ }
537
+ /** Parse tool result envelopes for next_suggested_tool / suggested_next_tool hints. */
538
+ function extractSuggestedFollowUp(result) {
539
+ const parsed = parseToolEnvelope(result);
540
+ if (!parsed)
541
+ return null;
542
+ const tool = (typeof parsed.next_suggested_tool === 'string' && parsed.next_suggested_tool) ||
543
+ (typeof parsed.suggested_next_tool === 'string' && parsed.suggested_next_tool) ||
544
+ null;
545
+ if (!tool)
546
+ return null;
547
+ const args = parsed.suggested_args && typeof parsed.suggested_args === 'object' && parsed.suggested_args !== null
548
+ ? parsed.suggested_args
549
+ : {};
550
+ return { tool, args };
551
+ }
552
+ //# sourceMappingURL=action-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-plan.js","sourceRoot":"","sources":["../../../src/ui/agent/action-plan.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"api-key.d.ts","sourceRoot":"","sources":["../../../src/ui/agent/api-key.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAGvC,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAuB,gBAAgB,CACrC,IAAI,EAAE,uBAAuB,GAC5B,cAAc,CAAC,kBAAkB,CAAC,CA2GpC"}
1
+ {"version":3,"file":"api-key.d.ts","sourceRoot":"","sources":["../../../src/ui/agent/api-key.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAGvC,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAExB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAuB,gBAAgB,CACrC,IAAI,EAAE,uBAAuB,GAC5B,cAAc,CAAC,kBAAkB,CAAC,CA6HpC"}
@@ -3,7 +3,7 @@ import { Experimental_StdioMCPTransport } from '@ai-sdk/mcp/mcp-stdio';
3
3
  import { stepCountIs, streamText } from 'ai';
4
4
  import { buildSpawnArgs, sanitizedEnv } from './mcp-transport.js';
5
5
  import { PHOTOSHOP_EXPORT_CHAT_ID_ENV } from '../../lib/export-paths.js';
6
- import { computeCost, stringifyToolOutput, } from './shared.js';
6
+ import { computeCost, isToolOutputOk, stringifyToolOutput, } from './shared.js';
7
7
  export async function* runChatViaApiKey(opts) {
8
8
  let mcp;
9
9
  const buffer = { text: '', toolCalls: [] };
@@ -39,6 +39,17 @@ export async function* runChatViaApiKey(opts) {
39
39
  opts.onAssistantBuffer?.(buffer);
40
40
  break;
41
41
  }
42
+ case 'reasoning-delta': {
43
+ buffer.reasoning = (buffer.reasoning ?? '') + part.text;
44
+ yield { type: 'reasoning-delta', payload: { text: part.text } };
45
+ opts.onAssistantBuffer?.(buffer);
46
+ break;
47
+ }
48
+ case 'start-step': {
49
+ const activity = { phase: 'thinking' };
50
+ yield { type: 'activity', payload: activity };
51
+ break;
52
+ }
42
53
  case 'tool-call': {
43
54
  const tc = {
44
55
  id: part.toolCallId,
@@ -51,20 +62,26 @@ export async function* runChatViaApiKey(opts) {
51
62
  type: 'tool-call',
52
63
  payload: { id: tc.id, name: tc.name, input: tc.input },
53
64
  };
65
+ yield {
66
+ type: 'activity',
67
+ payload: { phase: 'tool-running', detail: part.toolName },
68
+ };
54
69
  opts.onAssistantBuffer?.(buffer);
55
70
  break;
56
71
  }
57
72
  case 'tool-result': {
58
73
  const tc = buffer.toolCalls.find((c) => c.id === part.toolCallId);
59
74
  const text = stringifyToolOutput(part.output);
75
+ const ok = isToolOutputOk(part.output);
60
76
  if (tc) {
61
- tc.result = { ok: true, content: text };
62
- tc.status = 'success';
77
+ tc.result = { ok, content: text };
78
+ tc.status = ok ? 'success' : 'error';
63
79
  }
64
80
  yield {
65
81
  type: 'tool-result',
66
- payload: { id: part.toolCallId, ok: true, content: text },
82
+ payload: { id: part.toolCallId, ok, content: text },
67
83
  };
84
+ yield { type: 'activity', payload: { phase: 'thinking' } };
68
85
  opts.onAssistantBuffer?.(buffer);
69
86
  break;
70
87
  }
@@ -79,6 +96,7 @@ export async function* runChatViaApiKey(opts) {
79
96
  type: 'tool-result',
80
97
  payload: { id: part.toolCallId, ok: false, content: text },
81
98
  };
99
+ yield { type: 'activity', payload: { phase: 'thinking' } };
82
100
  opts.onAssistantBuffer?.(buffer);
83
101
  break;
84
102
  }