@alisaitteke/photoshop-mcp 1.7.18 → 1.7.19
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/dist/platform/windows-executor.d.ts +0 -1
- package/dist/platform/windows-executor.d.ts.map +1 -1
- package/dist/platform/windows-executor.js +32 -33
- package/dist/platform/windows-executor.js.map +1 -1
- package/dist/platform/windows-script-bridge.d.ts +18 -0
- package/dist/platform/windows-script-bridge.d.ts.map +1 -0
- package/dist/platform/windows-script-bridge.js +100 -0
- package/dist/platform/windows-script-bridge.js.map +1 -0
- package/package.json +1 -1
|
@@ -7,7 +7,6 @@ export declare class WindowsExecutor implements ScriptExecutor {
|
|
|
7
7
|
execute(script: string, timeout?: number): Promise<unknown>;
|
|
8
8
|
private processQueue;
|
|
9
9
|
private executeScript;
|
|
10
|
-
private createVBSWrapper;
|
|
11
10
|
private parseResult;
|
|
12
11
|
isPhotoshopRunning(): Promise<boolean>;
|
|
13
12
|
launchPhotoshop(photoshopPath: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"windows-executor.d.ts","sourceRoot":"","sources":["../../src/platform/windows-executor.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"windows-executor.d.ts","sourceRoot":"","sources":["../../src/platform/windows-executor.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAiCtD,qBAAa,eAAgB,YAAW,cAAc;IACpD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,YAAY,CAAS;;IAMvB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YA8CnD,YAAY;YAsBZ,aAAa;IAkD3B,OAAO,CAAC,WAAW;IAUb,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAStC,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAoB5D"}
|
|
@@ -7,9 +7,19 @@ import { prefixExtendScriptBom } from '../utils/extendscript-file.js';
|
|
|
7
7
|
import { parseExtendScriptPayload } from '../utils/extendscript-result.js';
|
|
8
8
|
import { Logger } from '../utils/logger.js';
|
|
9
9
|
import { DEFAULT_SCRIPT_TIMEOUT_MS, QUEUE_WAIT_ALLOWANCE_MS, isScriptTimeoutError, resolveScriptTimeoutMs, } from './script-timeout.js';
|
|
10
|
+
import { WINDOWS_JSX_ENV, WINDOWS_RESULT_ENV, buildWindowsBridgeScript, readWindowsResultFile, } from './windows-script-bridge.js';
|
|
10
11
|
const execAsync = promisify(exec);
|
|
11
12
|
/** Extra grace before Node kills cscript, beyond the advertised tool timeout. */
|
|
12
13
|
const KILL_GRACE_MS = 5000;
|
|
14
|
+
function isExecTimeout(error) {
|
|
15
|
+
if (typeof error === 'object' && error !== null) {
|
|
16
|
+
const execError = error;
|
|
17
|
+
if (execError.killed || execError.signal)
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
21
|
+
return isScriptTimeoutError(message) || /killed/i.test(message);
|
|
22
|
+
}
|
|
13
23
|
export class WindowsExecutor {
|
|
14
24
|
logger;
|
|
15
25
|
scriptQueue = [];
|
|
@@ -75,60 +85,49 @@ export class WindowsExecutor {
|
|
|
75
85
|
this.isProcessing = false;
|
|
76
86
|
}
|
|
77
87
|
async executeScript(script, timeout = DEFAULT_SCRIPT_TIMEOUT_MS) {
|
|
78
|
-
const
|
|
88
|
+
const stamp = `${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
89
|
+
const tempScriptPath = join(tmpdir(), `photoshop-script-${stamp}.jsx`);
|
|
90
|
+
const vbsPath = join(tmpdir(), `photoshop-vbs-${stamp}.vbs`);
|
|
91
|
+
const resultPath = join(tmpdir(), `photoshop-result-${stamp}.txt`);
|
|
79
92
|
try {
|
|
80
93
|
await writeFile(tempScriptPath, prefixExtendScriptBom(script), 'utf8');
|
|
81
|
-
|
|
82
|
-
const vbsPath = join(tmpdir(), `photoshop-vbs-${Date.now()}.vbs`);
|
|
83
|
-
await writeFile(vbsPath, vbsScript, 'utf8');
|
|
94
|
+
await writeFile(vbsPath, buildWindowsBridgeScript(), 'utf8');
|
|
84
95
|
try {
|
|
85
|
-
const {
|
|
96
|
+
const { stderr } = await execAsync(`cscript //nologo "${vbsPath}"`, {
|
|
86
97
|
timeout: timeout + KILL_GRACE_MS,
|
|
87
98
|
killSignal: 'SIGKILL',
|
|
99
|
+
env: {
|
|
100
|
+
...process.env,
|
|
101
|
+
[WINDOWS_JSX_ENV]: tempScriptPath,
|
|
102
|
+
[WINDOWS_RESULT_ENV]: resultPath,
|
|
103
|
+
},
|
|
88
104
|
});
|
|
89
105
|
if (stderr) {
|
|
90
106
|
this.logger.warn('Script execution warning:', stderr);
|
|
91
107
|
}
|
|
92
|
-
return this.parseResult(stdout);
|
|
93
108
|
}
|
|
94
109
|
catch (error) {
|
|
95
|
-
|
|
96
|
-
if (isScriptTimeoutError(message) || /killed/i.test(message)) {
|
|
110
|
+
if (isExecTimeout(error)) {
|
|
97
111
|
throw new Error('Script execution timeout');
|
|
98
112
|
}
|
|
113
|
+
const fromFile = await readWindowsResultFile(resultPath);
|
|
114
|
+
if (fromFile !== null) {
|
|
115
|
+
return this.parseResult(fromFile);
|
|
116
|
+
}
|
|
99
117
|
throw error;
|
|
100
118
|
}
|
|
101
|
-
|
|
102
|
-
|
|
119
|
+
const fromFile = await readWindowsResultFile(resultPath);
|
|
120
|
+
if (fromFile === null) {
|
|
121
|
+
throw new Error('Photoshop script produced no result');
|
|
103
122
|
}
|
|
123
|
+
return this.parseResult(fromFile);
|
|
104
124
|
}
|
|
105
125
|
finally {
|
|
126
|
+
await unlink(vbsPath).catch(() => { });
|
|
106
127
|
await unlink(tempScriptPath).catch(() => { });
|
|
128
|
+
await unlink(resultPath).catch(() => { });
|
|
107
129
|
}
|
|
108
130
|
}
|
|
109
|
-
createVBSWrapper(jsxPath) {
|
|
110
|
-
return `
|
|
111
|
-
On Error Resume Next
|
|
112
|
-
Dim photoshopApp
|
|
113
|
-
Set photoshopApp = CreateObject("Photoshop.Application")
|
|
114
|
-
|
|
115
|
-
If Err.Number <> 0 Then
|
|
116
|
-
WScript.Echo "ERROR: Failed to connect to Photoshop - " & Err.Description
|
|
117
|
-
WScript.Quit 1
|
|
118
|
-
End If
|
|
119
|
-
|
|
120
|
-
' Execute the JSX script
|
|
121
|
-
Dim result
|
|
122
|
-
result = photoshopApp.DoJavaScript("$.evalFile('" & Replace("${jsxPath}", "\\", "\\\\") & "')")
|
|
123
|
-
|
|
124
|
-
If Err.Number <> 0 Then
|
|
125
|
-
WScript.Echo "ERROR: " & Err.Description
|
|
126
|
-
WScript.Quit 1
|
|
127
|
-
Else
|
|
128
|
-
WScript.Echo result
|
|
129
|
-
End If
|
|
130
|
-
`.trim();
|
|
131
|
-
}
|
|
132
131
|
parseResult(output) {
|
|
133
132
|
const trimmed = output.trim();
|
|
134
133
|
if (trimmed.startsWith('ERROR:')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"windows-executor.js","sourceRoot":"","sources":["../../src/platform/windows-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"windows-executor.js","sourceRoot":"","sources":["../../src/platform/windows-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Child-process env var holding the JSX path. Kept out of the .vbs source. */
|
|
2
|
+
export declare const WINDOWS_JSX_ENV = "PSMCP_JSX";
|
|
3
|
+
/** Child-process env var holding the UTF-16 result file path. */
|
|
4
|
+
export declare const WINDOWS_RESULT_ENV = "PSMCP_RESULT";
|
|
5
|
+
/**
|
|
6
|
+
* ASCII-only cscript bridge.
|
|
7
|
+
*
|
|
8
|
+
* cscript prints WScript.Echo with the system ANSI code page, so any non-ASCII
|
|
9
|
+
* Photoshop result (and any non-ASCII temp path inlined into the .vbs file)
|
|
10
|
+
* is corrupted before Node can read it. Paths travel in the process environment
|
|
11
|
+
* (Unicode), and the script body is written as UTF-16 LE by FileSystemObject,
|
|
12
|
+
* which ships with Windows Script Host. Stdout stays ASCII.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildWindowsBridgeScript(): string;
|
|
15
|
+
/** Decode a FileSystemObject Unicode text file (UTF-16 LE, BOM required). */
|
|
16
|
+
export declare function decodeWindowsResultFile(buffer: Buffer): string;
|
|
17
|
+
export declare function readWindowsResultFile(path: string): Promise<string | null>;
|
|
18
|
+
//# sourceMappingURL=windows-script-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-script-bridge.d.ts","sourceRoot":"","sources":["../../src/platform/windows-script-bridge.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,eAAO,MAAM,eAAe,cAAc,CAAC;AAE3C,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CA+DjD;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAShF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
/** Child-process env var holding the JSX path. Kept out of the .vbs source. */
|
|
3
|
+
export const WINDOWS_JSX_ENV = 'PSMCP_JSX';
|
|
4
|
+
/** Child-process env var holding the UTF-16 result file path. */
|
|
5
|
+
export const WINDOWS_RESULT_ENV = 'PSMCP_RESULT';
|
|
6
|
+
/**
|
|
7
|
+
* ASCII-only cscript bridge.
|
|
8
|
+
*
|
|
9
|
+
* cscript prints WScript.Echo with the system ANSI code page, so any non-ASCII
|
|
10
|
+
* Photoshop result (and any non-ASCII temp path inlined into the .vbs file)
|
|
11
|
+
* is corrupted before Node can read it. Paths travel in the process environment
|
|
12
|
+
* (Unicode), and the script body is written as UTF-16 LE by FileSystemObject,
|
|
13
|
+
* which ships with Windows Script Host. Stdout stays ASCII.
|
|
14
|
+
*/
|
|
15
|
+
export function buildWindowsBridgeScript() {
|
|
16
|
+
return `
|
|
17
|
+
On Error Resume Next
|
|
18
|
+
Dim shell, jsxPath, outFile, photoshopApp, result, jsxForJs
|
|
19
|
+
|
|
20
|
+
Sub WriteResult(text)
|
|
21
|
+
On Error Resume Next
|
|
22
|
+
Dim fso, stream, writeErr
|
|
23
|
+
' Err is global. Clear the Photoshop failure that caused this write
|
|
24
|
+
' before treating a non-zero Err as a file-system failure.
|
|
25
|
+
Err.Clear
|
|
26
|
+
Set fso = CreateObject("Scripting.FileSystemObject")
|
|
27
|
+
Set stream = fso.CreateTextFile(outFile, True, True)
|
|
28
|
+
writeErr = Err.Number
|
|
29
|
+
If writeErr <> 0 Then
|
|
30
|
+
WScript.Echo "ERROR: Failed to write script result (" & writeErr & ")"
|
|
31
|
+
WScript.Quit 1
|
|
32
|
+
End If
|
|
33
|
+
Err.Clear
|
|
34
|
+
stream.Write text
|
|
35
|
+
writeErr = Err.Number
|
|
36
|
+
If writeErr <> 0 Then
|
|
37
|
+
WScript.Echo "ERROR: Failed to write script result (" & writeErr & ")"
|
|
38
|
+
WScript.Quit 1
|
|
39
|
+
End If
|
|
40
|
+
stream.Close
|
|
41
|
+
End Sub
|
|
42
|
+
|
|
43
|
+
Set shell = CreateObject("WScript.Shell")
|
|
44
|
+
jsxPath = shell.Environment("PROCESS")("${WINDOWS_JSX_ENV}")
|
|
45
|
+
outFile = shell.Environment("PROCESS")("${WINDOWS_RESULT_ENV}")
|
|
46
|
+
|
|
47
|
+
If jsxPath = "" Or outFile = "" Then
|
|
48
|
+
WScript.Echo "ERROR: Missing Photoshop script paths"
|
|
49
|
+
WScript.Quit 1
|
|
50
|
+
End If
|
|
51
|
+
|
|
52
|
+
Set photoshopApp = CreateObject("Photoshop.Application")
|
|
53
|
+
If Err.Number <> 0 Then
|
|
54
|
+
WriteResult "ERROR: Failed to connect to Photoshop - " & Err.Description
|
|
55
|
+
WScript.Quit 1
|
|
56
|
+
End If
|
|
57
|
+
|
|
58
|
+
Err.Clear
|
|
59
|
+
jsxForJs = Replace(jsxPath, "\\", "\\\\")
|
|
60
|
+
jsxForJs = Replace(jsxForJs, "'", "\\'")
|
|
61
|
+
result = photoshopApp.DoJavaScript("$.evalFile('" & jsxForJs & "')")
|
|
62
|
+
|
|
63
|
+
If Err.Number <> 0 Then
|
|
64
|
+
WriteResult "ERROR: " & Err.Description
|
|
65
|
+
WScript.Quit 1
|
|
66
|
+
End If
|
|
67
|
+
|
|
68
|
+
If IsNull(result) Or IsEmpty(result) Then
|
|
69
|
+
result = ""
|
|
70
|
+
Else
|
|
71
|
+
result = CStr(result)
|
|
72
|
+
End If
|
|
73
|
+
|
|
74
|
+
WriteResult result
|
|
75
|
+
`
|
|
76
|
+
.trim()
|
|
77
|
+
.replace(/\n/g, '\r\n');
|
|
78
|
+
}
|
|
79
|
+
/** Decode a FileSystemObject Unicode text file (UTF-16 LE, BOM required). */
|
|
80
|
+
export function decodeWindowsResultFile(buffer) {
|
|
81
|
+
if (buffer.length === 0)
|
|
82
|
+
return '';
|
|
83
|
+
if (buffer.length >= 2 && buffer[0] === 0xff && buffer[1] === 0xfe) {
|
|
84
|
+
return buffer.subarray(2).toString('utf16le');
|
|
85
|
+
}
|
|
86
|
+
throw new Error('Photoshop script result was not UTF-16 text');
|
|
87
|
+
}
|
|
88
|
+
export async function readWindowsResultFile(path) {
|
|
89
|
+
try {
|
|
90
|
+
const buffer = await readFile(path);
|
|
91
|
+
return decodeWindowsResultFile(buffer);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
const code = error.code;
|
|
95
|
+
if (code === 'ENOENT')
|
|
96
|
+
return null;
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=windows-script-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-script-bridge.js","sourceRoot":"","sources":["../../src/platform/windows-script-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAE3C,iEAAiE;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CA4BiC,eAAe;0CACf,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B3D;SACI,IAAI,EAAE;SACN,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alisaitteke/photoshop-mcp",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.19",
|
|
4
4
|
"description": "MCP server for Adobe Photoshop — 122 tools (generative AI + recipes), standalone web UI. Control Photoshop from Cursor, Claude, or natural language.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|