@alisaitteke/photoshop-mcp 0.1.0
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/.prettierrc +9 -0
- package/README.md +1300 -0
- package/dist/api/batch-play.d.ts +62 -0
- package/dist/api/batch-play.d.ts.map +1 -0
- package/dist/api/batch-play.js +131 -0
- package/dist/api/batch-play.js.map +1 -0
- package/dist/api/extendscript.d.ts +258 -0
- package/dist/api/extendscript.d.ts.map +1 -0
- package/dist/api/extendscript.js +1437 -0
- package/dist/api/extendscript.js.map +1 -0
- package/dist/api/photoshop-api.d.ts +20 -0
- package/dist/api/photoshop-api.d.ts.map +1 -0
- package/dist/api/photoshop-api.js +88 -0
- package/dist/api/photoshop-api.js.map +1 -0
- package/dist/core/server.d.ts +14 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +191 -0
- package/dist/core/server.js.map +1 -0
- package/dist/core/session.d.ts +24 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +83 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/tool-registry.d.ts +23 -0
- package/dist/core/tool-registry.d.ts.map +1 -0
- package/dist/core/tool-registry.js +55 -0
- package/dist/core/tool-registry.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/platform/connection.d.ts +20 -0
- package/dist/platform/connection.d.ts.map +1 -0
- package/dist/platform/connection.js +94 -0
- package/dist/platform/connection.js.map +1 -0
- package/dist/platform/detector.d.ts +19 -0
- package/dist/platform/detector.d.ts.map +1 -0
- package/dist/platform/detector.js +63 -0
- package/dist/platform/detector.js.map +1 -0
- package/dist/platform/macos-detector.d.ts +13 -0
- package/dist/platform/macos-detector.d.ts.map +1 -0
- package/dist/platform/macos-detector.js +145 -0
- package/dist/platform/macos-detector.js.map +1 -0
- package/dist/platform/macos-executor.d.ts +22 -0
- package/dist/platform/macos-executor.d.ts.map +1 -0
- package/dist/platform/macos-executor.js +161 -0
- package/dist/platform/macos-executor.js.map +1 -0
- package/dist/platform/script-executor.d.ts +23 -0
- package/dist/platform/script-executor.d.ts.map +1 -0
- package/dist/platform/script-executor.js +2 -0
- package/dist/platform/script-executor.js.map +1 -0
- package/dist/platform/windows-detector.d.ts +14 -0
- package/dist/platform/windows-detector.d.ts.map +1 -0
- package/dist/platform/windows-detector.js +173 -0
- package/dist/platform/windows-detector.js.map +1 -0
- package/dist/platform/windows-executor.d.ts +15 -0
- package/dist/platform/windows-executor.d.ts.map +1 -0
- package/dist/platform/windows-executor.js +148 -0
- package/dist/platform/windows-executor.js.map +1 -0
- package/dist/tools/action-tools.d.ts +4 -0
- package/dist/tools/action-tools.d.ts.map +1 -0
- package/dist/tools/action-tools.js +102 -0
- package/dist/tools/action-tools.js.map +1 -0
- package/dist/tools/adjustment-tools.d.ts +4 -0
- package/dist/tools/adjustment-tools.d.ts.map +1 -0
- package/dist/tools/adjustment-tools.js +274 -0
- package/dist/tools/adjustment-tools.js.map +1 -0
- package/dist/tools/document-tools.d.ts +4 -0
- package/dist/tools/document-tools.d.ts.map +1 -0
- package/dist/tools/document-tools.js +230 -0
- package/dist/tools/document-tools.js.map +1 -0
- package/dist/tools/filter-tools.d.ts +4 -0
- package/dist/tools/filter-tools.d.ts.map +1 -0
- package/dist/tools/filter-tools.js +230 -0
- package/dist/tools/filter-tools.js.map +1 -0
- package/dist/tools/history-tools.d.ts +4 -0
- package/dist/tools/history-tools.d.ts.map +1 -0
- package/dist/tools/history-tools.js +137 -0
- package/dist/tools/history-tools.js.map +1 -0
- package/dist/tools/image-placement-tools.d.ts +4 -0
- package/dist/tools/image-placement-tools.d.ts.map +1 -0
- package/dist/tools/image-placement-tools.js +109 -0
- package/dist/tools/image-placement-tools.js.map +1 -0
- package/dist/tools/image-tools.d.ts +4 -0
- package/dist/tools/image-tools.d.ts.map +1 -0
- package/dist/tools/image-tools.js +123 -0
- package/dist/tools/image-tools.js.map +1 -0
- package/dist/tools/layer-ordering-tools.d.ts +4 -0
- package/dist/tools/layer-ordering-tools.d.ts.map +1 -0
- package/dist/tools/layer-ordering-tools.js +210 -0
- package/dist/tools/layer-ordering-tools.js.map +1 -0
- package/dist/tools/layer-properties-tools.d.ts +4 -0
- package/dist/tools/layer-properties-tools.d.ts.map +1 -0
- package/dist/tools/layer-properties-tools.js +421 -0
- package/dist/tools/layer-properties-tools.js.map +1 -0
- package/dist/tools/layer-tools.d.ts +4 -0
- package/dist/tools/layer-tools.d.ts.map +1 -0
- package/dist/tools/layer-tools.js +251 -0
- package/dist/tools/layer-tools.js.map +1 -0
- package/dist/tools/layer-transform-tools.d.ts +4 -0
- package/dist/tools/layer-transform-tools.d.ts.map +1 -0
- package/dist/tools/layer-transform-tools.js +199 -0
- package/dist/tools/layer-transform-tools.js.map +1 -0
- package/dist/tools/selection-tools.d.ts +4 -0
- package/dist/tools/selection-tools.d.ts.map +1 -0
- package/dist/tools/selection-tools.js +295 -0
- package/dist/tools/selection-tools.js.map +1 -0
- package/dist/tools/text-tools.d.ts +4 -0
- package/dist/tools/text-tools.d.ts.map +1 -0
- package/dist/tools/text-tools.js +210 -0
- package/dist/tools/text-tools.js.map +1 -0
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { access, constants } from 'fs/promises';
|
|
4
|
+
import { Logger } from '../utils/logger.js';
|
|
5
|
+
const execAsync = promisify(exec);
|
|
6
|
+
export class WindowsDetector {
|
|
7
|
+
logger;
|
|
8
|
+
constructor() {
|
|
9
|
+
this.logger = new Logger('WindowsDetector');
|
|
10
|
+
}
|
|
11
|
+
async detect() {
|
|
12
|
+
this.logger.info('Detecting Photoshop on Windows...');
|
|
13
|
+
// Try environment variable first
|
|
14
|
+
const envPath = process.env.PHOTOSHOP_PATH;
|
|
15
|
+
if (envPath) {
|
|
16
|
+
this.logger.debug(`Using environment variable: ${envPath}`);
|
|
17
|
+
const info = await this.checkPath(envPath);
|
|
18
|
+
if (info)
|
|
19
|
+
return info;
|
|
20
|
+
}
|
|
21
|
+
// Try registry detection
|
|
22
|
+
try {
|
|
23
|
+
const registryInfo = await this.detectFromRegistry();
|
|
24
|
+
if (registryInfo)
|
|
25
|
+
return registryInfo;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
this.logger.warn('Registry detection failed:', error);
|
|
29
|
+
}
|
|
30
|
+
// Try common installation paths
|
|
31
|
+
const commonPaths = this.getCommonPaths();
|
|
32
|
+
for (const path of commonPaths) {
|
|
33
|
+
const info = await this.checkPath(path);
|
|
34
|
+
if (info)
|
|
35
|
+
return info;
|
|
36
|
+
}
|
|
37
|
+
throw new Error('Photoshop not found on this system');
|
|
38
|
+
}
|
|
39
|
+
async detectFromRegistry() {
|
|
40
|
+
try {
|
|
41
|
+
// Query Adobe registry keys
|
|
42
|
+
const registryPaths = [
|
|
43
|
+
'HKLM\\SOFTWARE\\Adobe\\Photoshop',
|
|
44
|
+
'HKLM\\SOFTWARE\\WOW6432Node\\Adobe\\Photoshop',
|
|
45
|
+
];
|
|
46
|
+
for (const regPath of registryPaths) {
|
|
47
|
+
try {
|
|
48
|
+
const { stdout } = await execAsync(`reg query "${regPath}" /s`);
|
|
49
|
+
const entries = this.parseRegistryOutput(stdout);
|
|
50
|
+
if (entries.length > 0) {
|
|
51
|
+
// Get the latest version
|
|
52
|
+
const latest = entries.sort((a, b) => b.version.localeCompare(a.version))[0];
|
|
53
|
+
const info = await this.checkPath(latest.path);
|
|
54
|
+
if (info)
|
|
55
|
+
return info;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
// Continue to next registry path
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Try COM CLSID registry
|
|
64
|
+
const clsidPaths = [
|
|
65
|
+
'HKCR\\CLSID\\{06870682-6f3c-4b97-9143-f03e85c0bd3e}\\LocalServer32',
|
|
66
|
+
'HKCR\\Wow6432Node\\CLSID\\{06870682-6f3c-4b97-9143-f03e85c0bd3e}\\LocalServer32',
|
|
67
|
+
];
|
|
68
|
+
for (const clsidPath of clsidPaths) {
|
|
69
|
+
try {
|
|
70
|
+
const { stdout } = await execAsync(`reg query "${clsidPath}" /ve`);
|
|
71
|
+
const exePath = this.extractPathFromCLSID(stdout);
|
|
72
|
+
if (exePath) {
|
|
73
|
+
const info = await this.checkPath(exePath);
|
|
74
|
+
if (info)
|
|
75
|
+
return info;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
this.logger.error('Registry query failed:', error);
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
parseRegistryOutput(output) {
|
|
89
|
+
const entries = [];
|
|
90
|
+
const lines = output.split('\n');
|
|
91
|
+
let currentVersion = '';
|
|
92
|
+
for (const line of lines) {
|
|
93
|
+
// Extract version from registry path
|
|
94
|
+
const versionMatch = line.match(/Photoshop\\(\d+\.\d+)/);
|
|
95
|
+
if (versionMatch) {
|
|
96
|
+
currentVersion = versionMatch[1];
|
|
97
|
+
}
|
|
98
|
+
// Extract ApplicationPath
|
|
99
|
+
const pathMatch = line.match(/ApplicationPath\s+REG_SZ\s+(.+)/);
|
|
100
|
+
if (pathMatch && currentVersion) {
|
|
101
|
+
entries.push({
|
|
102
|
+
version: currentVersion,
|
|
103
|
+
path: pathMatch[1].trim(),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return entries;
|
|
108
|
+
}
|
|
109
|
+
extractPathFromCLSID(output) {
|
|
110
|
+
const match = output.match(/REG_SZ\s+(.+\.exe)/i);
|
|
111
|
+
if (match) {
|
|
112
|
+
// Remove quotes and trailing parameters
|
|
113
|
+
return match[1].trim().replace(/^"(.+)".*$/, '$1');
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
getCommonPaths() {
|
|
118
|
+
const programFiles = process.env.ProgramFiles || 'C:\\Program Files';
|
|
119
|
+
const programFilesX86 = process.env['ProgramFiles(x86)'] || 'C:\\Program Files (x86)';
|
|
120
|
+
const paths = [];
|
|
121
|
+
// Generate paths for versions 2012-2025
|
|
122
|
+
for (let year = 2025; year >= 2012; year--) {
|
|
123
|
+
paths.push(`${programFiles}\\Adobe\\Adobe Photoshop ${year}\\Photoshop.exe`, `${programFilesX86}\\Adobe\\Adobe Photoshop ${year}\\Photoshop.exe`, `${programFiles}\\Adobe\\Adobe Photoshop CC ${year}\\Photoshop.exe`, `${programFilesX86}\\Adobe\\Adobe Photoshop CC ${year}\\Photoshop.exe`);
|
|
124
|
+
}
|
|
125
|
+
// Also check for version-less installation
|
|
126
|
+
paths.push(`${programFiles}\\Adobe\\Adobe Photoshop CC\\Photoshop.exe`, `${programFiles}\\Adobe\\Photoshop CC\\Photoshop.exe`);
|
|
127
|
+
return paths;
|
|
128
|
+
}
|
|
129
|
+
async checkPath(path) {
|
|
130
|
+
try {
|
|
131
|
+
// Clean up path
|
|
132
|
+
let cleanPath = path.trim().replace(/^"|"$/g, '');
|
|
133
|
+
// If path is a directory, append Photoshop.exe
|
|
134
|
+
if (!cleanPath.toLowerCase().endsWith('.exe')) {
|
|
135
|
+
cleanPath = `${cleanPath}\\Photoshop.exe`;
|
|
136
|
+
}
|
|
137
|
+
await access(cleanPath, constants.F_OK);
|
|
138
|
+
const version = this.extractVersionFromPath(cleanPath);
|
|
139
|
+
this.logger.info(`Found Photoshop at: ${cleanPath}`);
|
|
140
|
+
return {
|
|
141
|
+
version,
|
|
142
|
+
path: cleanPath,
|
|
143
|
+
isRunning: await this.checkIfRunning(),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
extractVersionFromPath(path) {
|
|
151
|
+
// Try to extract year from path
|
|
152
|
+
const yearMatch = path.match(/(\d{4})/);
|
|
153
|
+
if (yearMatch) {
|
|
154
|
+
return yearMatch[1];
|
|
155
|
+
}
|
|
156
|
+
// Try to extract version number
|
|
157
|
+
const versionMatch = path.match(/(\d+\.\d+)/);
|
|
158
|
+
if (versionMatch) {
|
|
159
|
+
return versionMatch[1];
|
|
160
|
+
}
|
|
161
|
+
return 'Unknown';
|
|
162
|
+
}
|
|
163
|
+
async checkIfRunning() {
|
|
164
|
+
try {
|
|
165
|
+
const { stdout } = await execAsync('tasklist /FI "IMAGENAME eq Photoshop.exe"');
|
|
166
|
+
return stdout.toLowerCase().includes('photoshop.exe');
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=windows-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-detector.js","sourceRoot":"","sources":["../../src/platform/windows-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ScriptExecutor } from './script-executor.js';
|
|
2
|
+
export declare class WindowsExecutor implements ScriptExecutor {
|
|
3
|
+
private logger;
|
|
4
|
+
private scriptQueue;
|
|
5
|
+
private isProcessing;
|
|
6
|
+
constructor();
|
|
7
|
+
execute(script: string, timeout?: number): Promise<unknown>;
|
|
8
|
+
private processQueue;
|
|
9
|
+
private executeScript;
|
|
10
|
+
private createVBSWrapper;
|
|
11
|
+
private parseResult;
|
|
12
|
+
isPhotoshopRunning(): Promise<boolean>;
|
|
13
|
+
launchPhotoshop(photoshopPath: string): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=windows-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-executor.d.ts","sourceRoot":"","sources":["../../src/platform/windows-executor.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,qBAAa,eAAgB,YAAW,cAAc;IACpD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAqC;IACxD,OAAO,CAAC,YAAY,CAAS;;IAMvB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC;YAuB1D,YAAY;YAqBZ,aAAa;IAkC3B,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,WAAW;IAiBb,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAStC,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAqB5D"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { exec, spawn } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { writeFile, unlink } from 'fs/promises';
|
|
4
|
+
import { tmpdir } from 'os';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { Logger } from '../utils/logger.js';
|
|
7
|
+
const execAsync = promisify(exec);
|
|
8
|
+
export class WindowsExecutor {
|
|
9
|
+
logger;
|
|
10
|
+
scriptQueue = [];
|
|
11
|
+
isProcessing = false;
|
|
12
|
+
constructor() {
|
|
13
|
+
this.logger = new Logger('WindowsExecutor');
|
|
14
|
+
}
|
|
15
|
+
async execute(script, timeout = 30000) {
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
const timeoutId = setTimeout(() => {
|
|
18
|
+
reject(new Error('Script execution timeout'));
|
|
19
|
+
}, timeout);
|
|
20
|
+
this.scriptQueue.push(async () => {
|
|
21
|
+
try {
|
|
22
|
+
const result = await this.executeScript(script);
|
|
23
|
+
clearTimeout(timeoutId);
|
|
24
|
+
resolve(result);
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
clearTimeout(timeoutId);
|
|
29
|
+
reject(error);
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
this.processQueue();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async processQueue() {
|
|
37
|
+
if (this.isProcessing || this.scriptQueue.length === 0) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.isProcessing = true;
|
|
41
|
+
while (this.scriptQueue.length > 0) {
|
|
42
|
+
const task = this.scriptQueue.shift();
|
|
43
|
+
if (task) {
|
|
44
|
+
try {
|
|
45
|
+
await task();
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
this.logger.error('Script execution failed:', error);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
this.isProcessing = false;
|
|
53
|
+
}
|
|
54
|
+
async executeScript(script) {
|
|
55
|
+
// For Windows, we'll use a combination of VBScript/JScript to communicate with Photoshop via COM
|
|
56
|
+
// Write script to temporary file
|
|
57
|
+
const tempScriptPath = join(tmpdir(), `photoshop-script-${Date.now()}.jsx`);
|
|
58
|
+
try {
|
|
59
|
+
await writeFile(tempScriptPath, script, 'utf8');
|
|
60
|
+
// Use VBScript to execute the JSX script via COM
|
|
61
|
+
const vbsScript = this.createVBSWrapper(tempScriptPath);
|
|
62
|
+
const vbsPath = join(tmpdir(), `photoshop-vbs-${Date.now()}.vbs`);
|
|
63
|
+
await writeFile(vbsPath, vbsScript, 'utf8');
|
|
64
|
+
try {
|
|
65
|
+
// Execute VBScript
|
|
66
|
+
const { stdout, stderr } = await execAsync(`cscript //nologo "${vbsPath}"`);
|
|
67
|
+
if (stderr) {
|
|
68
|
+
this.logger.warn('Script execution warning:', stderr);
|
|
69
|
+
}
|
|
70
|
+
// Parse result
|
|
71
|
+
return this.parseResult(stdout);
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
// Cleanup VBS file
|
|
75
|
+
await unlink(vbsPath).catch(() => { });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
// Cleanup JSX file
|
|
80
|
+
await unlink(tempScriptPath).catch(() => { });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
createVBSWrapper(jsxPath) {
|
|
84
|
+
return `
|
|
85
|
+
On Error Resume Next
|
|
86
|
+
Dim photoshopApp
|
|
87
|
+
Set photoshopApp = CreateObject("Photoshop.Application")
|
|
88
|
+
|
|
89
|
+
If Err.Number <> 0 Then
|
|
90
|
+
WScript.Echo "ERROR: Failed to connect to Photoshop - " & Err.Description
|
|
91
|
+
WScript.Quit 1
|
|
92
|
+
End If
|
|
93
|
+
|
|
94
|
+
' Execute the JSX script
|
|
95
|
+
Dim result
|
|
96
|
+
result = photoshopApp.DoJavaScript("$.evalFile('" & Replace("${jsxPath}", "\\", "\\\\") & "');")
|
|
97
|
+
|
|
98
|
+
If Err.Number <> 0 Then
|
|
99
|
+
WScript.Echo "ERROR: " & Err.Description
|
|
100
|
+
WScript.Quit 1
|
|
101
|
+
Else
|
|
102
|
+
WScript.Echo result
|
|
103
|
+
End If
|
|
104
|
+
`.trim();
|
|
105
|
+
}
|
|
106
|
+
parseResult(output) {
|
|
107
|
+
const trimmed = output.trim();
|
|
108
|
+
// Check for error
|
|
109
|
+
if (trimmed.startsWith('ERROR:')) {
|
|
110
|
+
throw new Error(trimmed.substring(6).trim());
|
|
111
|
+
}
|
|
112
|
+
// Try to parse as JSON
|
|
113
|
+
try {
|
|
114
|
+
return JSON.parse(trimmed);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Return as string if not JSON
|
|
118
|
+
return trimmed;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async isPhotoshopRunning() {
|
|
122
|
+
try {
|
|
123
|
+
const { stdout } = await execAsync('tasklist /FI "IMAGENAME eq Photoshop.exe"');
|
|
124
|
+
return stdout.toLowerCase().includes('photoshop.exe');
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async launchPhotoshop(photoshopPath) {
|
|
131
|
+
return new Promise((resolve, reject) => {
|
|
132
|
+
this.logger.info(`Launching Photoshop: ${photoshopPath}`);
|
|
133
|
+
const child = spawn(photoshopPath, [], {
|
|
134
|
+
detached: true,
|
|
135
|
+
stdio: 'ignore',
|
|
136
|
+
});
|
|
137
|
+
child.unref();
|
|
138
|
+
// Wait a bit for Photoshop to start
|
|
139
|
+
setTimeout(() => {
|
|
140
|
+
resolve();
|
|
141
|
+
}, 5000);
|
|
142
|
+
child.on('error', (error) => {
|
|
143
|
+
reject(new Error(`Failed to launch Photoshop: ${error.message}`));
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=windows-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-executor.js","sourceRoot":"","sources":["../../src/platform/windows-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-tools.d.ts","sourceRoot":"","sources":["../../src/tools/action-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAc,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAIhE,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,mBAAmB,GAAG,cAAc,EAAE,CAyCnF"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { PhotoshopAPIFactory } from '../api/photoshop-api.js';
|
|
2
|
+
import { ExtendScriptSnippets } from '../api/extendscript.js';
|
|
3
|
+
export function createActionTools(connection) {
|
|
4
|
+
return [
|
|
5
|
+
{
|
|
6
|
+
tool: {
|
|
7
|
+
name: 'photoshop_play_action',
|
|
8
|
+
description: 'Play a recorded action from the Actions palette',
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
actionName: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
description: 'Name of the action to play',
|
|
15
|
+
},
|
|
16
|
+
actionSetName: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
description: 'Name of the action set containing the action',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
required: ['actionName', 'actionSetName'],
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
handler: async (args) => playAction(connection, args),
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
tool: {
|
|
28
|
+
name: 'photoshop_execute_script',
|
|
29
|
+
description: 'Execute custom ExtendScript code (advanced)',
|
|
30
|
+
inputSchema: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: {
|
|
33
|
+
code: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
description: 'ExtendScript code to execute',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
required: ['code'],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
handler: async (args) => executeCustomScript(connection, args),
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
async function playAction(connection, args) {
|
|
46
|
+
const actionName = args.actionName;
|
|
47
|
+
const actionSetName = args.actionSetName;
|
|
48
|
+
try {
|
|
49
|
+
const apiFactory = new PhotoshopAPIFactory(connection);
|
|
50
|
+
const api = await apiFactory.createAPI();
|
|
51
|
+
const script = ExtendScriptSnippets.playAction(actionName, actionSetName);
|
|
52
|
+
await api.executeScript(script);
|
|
53
|
+
return {
|
|
54
|
+
content: [
|
|
55
|
+
{
|
|
56
|
+
type: 'text',
|
|
57
|
+
text: `Action played: "${actionName}" from set "${actionSetName}"`,
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return {
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: 'text',
|
|
67
|
+
text: `Error playing action: ${error instanceof Error ? error.message : String(error)}`,
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
isError: true,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async function executeCustomScript(connection, args) {
|
|
75
|
+
const code = args.code;
|
|
76
|
+
try {
|
|
77
|
+
const apiFactory = new PhotoshopAPIFactory(connection);
|
|
78
|
+
const api = await apiFactory.createAPI();
|
|
79
|
+
const script = ExtendScriptSnippets.executeCustomScript(code);
|
|
80
|
+
const result = await api.executeScript(script);
|
|
81
|
+
return {
|
|
82
|
+
content: [
|
|
83
|
+
{
|
|
84
|
+
type: 'text',
|
|
85
|
+
text: `Custom script executed\nResult: ${JSON.stringify(result)}`,
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return {
|
|
92
|
+
content: [
|
|
93
|
+
{
|
|
94
|
+
type: 'text',
|
|
95
|
+
text: `Error executing custom script: ${error instanceof Error ? error.message : String(error)}`,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
isError: true,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=action-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-tools.js","sourceRoot":"","sources":["../../src/tools/action-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ToolDefinition } from '../core/tool-registry.js';
|
|
2
|
+
import { PhotoshopConnection } from '../platform/connection.js';
|
|
3
|
+
export declare function createAdjustmentTools(connection: PhotoshopConnection): ToolDefinition[];
|
|
4
|
+
//# sourceMappingURL=adjustment-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adjustment-tools.d.ts","sourceRoot":"","sources":["../../src/tools/adjustment-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAc,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAIhE,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,mBAAmB,GAAG,cAAc,EAAE,CAuGvF"}
|