@alisaitteke/photoshop-mcp 1.5.0 → 1.6.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/README.de.md +21 -0
- package/README.es.md +20 -0
- package/README.ja.md +20 -0
- package/README.md +69 -1
- package/README.tr.md +70 -1
- package/README.zh-CN.md +17 -0
- package/dist/platform/macos-detector.d.ts.map +1 -1
- package/dist/platform/macos-detector.js +7 -4
- package/dist/platform/macos-detector.js.map +1 -1
- package/dist/platform/macos-executor.d.ts +11 -0
- package/dist/platform/macos-executor.d.ts.map +1 -1
- package/dist/platform/macos-executor.js +103 -32
- package/dist/platform/macos-executor.js.map +1 -1
- package/dist/ui/cli.js +7 -1
- package/dist/ui/cli.js.map +1 -1
- package/dist/ui/providers/anthropic.d.ts.map +1 -1
- package/dist/ui/providers/anthropic.js +11 -1
- package/dist/ui/providers/anthropic.js.map +1 -1
- package/dist/ui/providers/types.d.ts +1 -0
- package/dist/ui/providers/types.d.ts.map +1 -1
- package/dist/ui/security/session-token.d.ts +24 -0
- package/dist/ui/security/session-token.d.ts.map +1 -0
- package/dist/ui/security/session-token.js +72 -0
- package/dist/ui/security/session-token.js.map +1 -0
- package/dist/ui/server.d.ts +4 -0
- package/dist/ui/server.d.ts.map +1 -1
- package/dist/ui/server.js +79 -11
- package/dist/ui/server.js.map +1 -1
- package/dist/utils/js-string.d.ts.map +1 -1
- package/dist/utils/js-string.js +6 -1
- package/dist/utils/js-string.js.map +1 -1
- package/package.json +6 -3
- package/web/dist/assets/{index-uXgjjmy3.js → index-SNfxhJjr.js} +89 -85
- package/web/dist/assets/index-vi5C3hqd.css +1 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/index-BN7ku4VU.css +0 -1
package/README.de.md
CHANGED
|
@@ -115,6 +115,27 @@ Die Authentifizierungsmethode wird pro Anbieter in `~/.photoshop-mcp/data.db` ge
|
|
|
115
115
|
photoshop-mcp-ui [--port 5174] [--host 127.0.0.1] [--no-open]
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
+
### Sicherheit der lokalen API
|
|
119
|
+
|
|
120
|
+
Der UI-Server speichert deine Provider-API-Schlüssel und kann Photoshop
|
|
121
|
+
steuern, daher ist `/api/*` nicht für alles offen, was auf deinem Rechner
|
|
122
|
+
läuft. Jede Anfrage muss drei Prüfungen bestehen:
|
|
123
|
+
|
|
124
|
+
1. **Host** — muss die Loopback-Adresse (oder der via `--host` gebundene Host)
|
|
125
|
+
auf dem Port des Servers sein. Blockiert DNS-Rebinding.
|
|
126
|
+
2. **Origin** — falls vorhanden, muss sie dem Origin der UI entsprechen.
|
|
127
|
+
Blockiert Cross-Origin-Aufrufe aus dem Browser.
|
|
128
|
+
3. **Session-Token** — ein zufälliges Geheimnis pro Serverstart. Blockiert
|
|
129
|
+
andere lokale Prozesse, die zwar jeden Header fälschen, aber das Token nicht
|
|
130
|
+
lesen können.
|
|
131
|
+
|
|
132
|
+
Der Browser muss sich nicht um das Token kümmern: Der Server injiziert es in
|
|
133
|
+
die ausgelieferte `index.html`. Für Skripte liest du es aus
|
|
134
|
+
`~/.photoshop-mcp/ui-session.json` (chmod 600) und sendest es als
|
|
135
|
+
`x-psmcp-token` oder `Authorization: Bearer`; alternativ setzt du vor dem Start
|
|
136
|
+
`PSMCP_UI_TOKEN` auf ein eigenes Token. Anfragen ohne gültiges Token erhalten
|
|
137
|
+
`401 unauthorized`.
|
|
138
|
+
|
|
118
139
|
### Hinweise
|
|
119
140
|
|
|
120
141
|
- Der Agent ist auf Photoshop-MCP-Werkzeuge beschränkt – integrierte Shell-, Datei-
|
package/README.es.md
CHANGED
|
@@ -99,6 +99,26 @@ El método de autenticación se almacena por proveedor en `~/.photoshop-mcp/data
|
|
|
99
99
|
photoshop-mcp-ui [--port 5174] [--host 127.0.0.1] [--no-open]
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
+
### Seguridad de la API local
|
|
103
|
+
|
|
104
|
+
El servidor de la UI guarda tus claves de API de proveedores y puede controlar
|
|
105
|
+
Photoshop, así que `/api/*` no está abierto a todo lo que se ejecute en tu
|
|
106
|
+
máquina. Cada petición debe superar tres comprobaciones:
|
|
107
|
+
|
|
108
|
+
1. **Host** — debe ser la dirección de loopback (o el `--host` al que enlazaste)
|
|
109
|
+
en el puerto del servidor. Bloquea el DNS rebinding.
|
|
110
|
+
2. **Origin** — si está presente, debe coincidir con el origen de la propia UI.
|
|
111
|
+
Bloquea las llamadas cross-origin desde el navegador.
|
|
112
|
+
3. **Token de sesión** — un secreto aleatorio por arranque. Bloquea a otros
|
|
113
|
+
procesos locales, que pueden falsificar cualquier cabecera pero no leer el
|
|
114
|
+
token.
|
|
115
|
+
|
|
116
|
+
El navegador no necesita gestionar el token: el servidor lo inyecta en el
|
|
117
|
+
`index.html` que sirve. Para scripts, léelo de
|
|
118
|
+
`~/.photoshop-mcp/ui-session.json` (chmod 600) y envíalo como `x-psmcp-token` o
|
|
119
|
+
`Authorization: Bearer`, o fija el tuyo con `PSMCP_UI_TOKEN` antes de arrancar
|
|
120
|
+
el servidor. Las peticiones sin un token válido reciben `401 unauthorized`.
|
|
121
|
+
|
|
102
122
|
### Notas
|
|
103
123
|
|
|
104
124
|
- El agente está restringido únicamente a las herramientas de Photoshop MCP — las herramientas integradas de shell, archivos y web están deshabilitadas.
|
package/README.ja.md
CHANGED
|
@@ -99,6 +99,26 @@ npx -p @alisaitteke/photoshop-mcp photoshop-mcp-ui
|
|
|
99
99
|
photoshop-mcp-ui [--port 5174] [--host 127.0.0.1] [--no-open]
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
+
### ローカル API のセキュリティ
|
|
103
|
+
|
|
104
|
+
UI サーバーはプロバイダーの API キーを保存し、Photoshop を操作できます。その
|
|
105
|
+
ため `/api/*` はマシン上で動作するすべてのプロセスに開かれてはいません。各
|
|
106
|
+
リクエストは次の 3 つのチェックを通過する必要があります。
|
|
107
|
+
|
|
108
|
+
1. **Host** — サーバーのポート上のループバックアドレス(または `--host` で
|
|
109
|
+
バインドしたホスト)である必要があります。DNS リバインディングを防ぎます。
|
|
110
|
+
2. **Origin** — 存在する場合は UI 自身のオリジンと一致する必要があります。
|
|
111
|
+
ブラウザからのクロスオリジン呼び出しを防ぎます。
|
|
112
|
+
3. **セッショントークン** — 起動ごとに生成されるランダムな秘密値です。ヘッダー
|
|
113
|
+
は偽装できてもトークンは読み取れない、他のローカルプロセスを防ぎます。
|
|
114
|
+
|
|
115
|
+
ブラウザ側でトークンを扱う必要はありません。サーバーが配信する `index.html`
|
|
116
|
+
に注入します。スクリプトから使う場合は
|
|
117
|
+
`~/.photoshop-mcp/ui-session.json`(chmod 600)から読み取り、`x-psmcp-token`
|
|
118
|
+
または `Authorization: Bearer` ヘッダーで送信するか、サーバー起動前に
|
|
119
|
+
`PSMCP_UI_TOKEN` で任意のトークンを固定してください。有効なトークンがない
|
|
120
|
+
リクエストは `401 unauthorized` を返します。
|
|
121
|
+
|
|
102
122
|
### 注意事項
|
|
103
123
|
|
|
104
124
|
- エージェントはPhotoshop MCPツールのみに制限されています。組み込みのシェル・ファイル・Webツールは無効化されています。
|
package/README.md
CHANGED
|
@@ -126,6 +126,25 @@ Auth method is stored per provider in `~/.photoshop-mcp/data.db` (`authMethod`:
|
|
|
126
126
|
photoshop-mcp-ui [--port 5174] [--host 127.0.0.1] [--no-open]
|
|
127
127
|
```
|
|
128
128
|
|
|
129
|
+
### Local API security
|
|
130
|
+
|
|
131
|
+
The UI server stores your provider API keys and can drive Photoshop, so `/api/*`
|
|
132
|
+
is not open to everything running on your machine. Each request must pass three
|
|
133
|
+
checks:
|
|
134
|
+
|
|
135
|
+
1. **Host** — must be the loopback address (or the `--host` you bound to) on the
|
|
136
|
+
server's port. Blocks DNS rebinding.
|
|
137
|
+
2. **Origin** — when present, must match the UI's own origin. Blocks
|
|
138
|
+
cross-origin browser callers.
|
|
139
|
+
3. **Session token** — a random per-start secret. Blocks other local processes,
|
|
140
|
+
which can forge any header but cannot read the token.
|
|
141
|
+
|
|
142
|
+
The browser never has to deal with the token: the server injects it into the
|
|
143
|
+
`index.html` it serves. For scripting, read it from
|
|
144
|
+
`~/.photoshop-mcp/ui-session.json` (chmod 600) and send it as `x-psmcp-token` or
|
|
145
|
+
`Authorization: Bearer`, or pin your own with `PSMCP_UI_TOKEN` before starting
|
|
146
|
+
the server. Requests without a valid token get `401 unauthorized`.
|
|
147
|
+
|
|
129
148
|
### Notes
|
|
130
149
|
|
|
131
150
|
- The agent is restricted to Photoshop MCP tools only — built-in shell, file
|
|
@@ -631,6 +650,54 @@ Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_
|
|
|
631
650
|
}
|
|
632
651
|
```
|
|
633
652
|
|
|
653
|
+
**Can't find the config file?** In Claude Desktop, open **Settings → Developer → Edit Config** — it opens the correct path for your install (the `%APPDATA%` path may differ on some setups).
|
|
654
|
+
|
|
655
|
+
### For Claude Code
|
|
656
|
+
|
|
657
|
+
Use the [Claude Code CLI](https://code.claude.com/docs/en/agent-sdk/mcp) or the [Claude Agent SDK](https://code.claude.com/docs/en/agent-sdk/mcp) with the same MCP server entry.
|
|
658
|
+
|
|
659
|
+
**Recommended (CLI):**
|
|
660
|
+
|
|
661
|
+
```bash
|
|
662
|
+
claude mcp add photoshop -- npx -y @alisaitteke/photoshop-mcp
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
**Manual JSON** — merge into your project `.mcp.json` or Claude Code MCP settings (see [`examples/claude-code-mcp.json`](examples/claude-code-mcp.json)):
|
|
666
|
+
|
|
667
|
+
```json
|
|
668
|
+
{
|
|
669
|
+
"mcpServers": {
|
|
670
|
+
"photoshop": {
|
|
671
|
+
"command": "npx",
|
|
672
|
+
"args": ["-y", "@alisaitteke/photoshop-mcp"],
|
|
673
|
+
"env": {
|
|
674
|
+
"LOG_LEVEL": "1"
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
**Agent SDK (TypeScript)** — pass the same `mcpServers` block in your `query()` options:
|
|
682
|
+
|
|
683
|
+
```typescript
|
|
684
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
685
|
+
|
|
686
|
+
const q = query({
|
|
687
|
+
prompt: 'List open documents in Photoshop',
|
|
688
|
+
options: {
|
|
689
|
+
mcpServers: {
|
|
690
|
+
photoshop: {
|
|
691
|
+
command: 'npx',
|
|
692
|
+
args: ['-y', '@alisaitteke/photoshop-mcp'],
|
|
693
|
+
env: { LOG_LEVEL: '1' },
|
|
694
|
+
},
|
|
695
|
+
},
|
|
696
|
+
allowedTools: ['mcp__photoshop__*'],
|
|
697
|
+
},
|
|
698
|
+
});
|
|
699
|
+
```
|
|
700
|
+
|
|
634
701
|
### Environment Variables
|
|
635
702
|
|
|
636
703
|
- `PHOTOSHOP_PATH`: (Optional) Specify custom Photoshop installation path
|
|
@@ -733,7 +800,8 @@ Common connection, scripting, and logging issues:
|
|
|
733
800
|
| Symptom | Likely cause | Fix |
|
|
734
801
|
|---|---|---|
|
|
735
802
|
| `cli_not_found` | Claude Code / Gemini CLI not installed | `npm i -g @anthropic-ai/claude-code` or `npm i -g @google/gemini-cli` |
|
|
736
|
-
| `not_authenticated` | No OAuth session | Run `claude auth login` or `gemini auth login` in Terminal |
|
|
803
|
+
| `not_authenticated` | No CLI OAuth session (API key / SDK auth does not count) | Run `claude auth login` or `gemini auth login` in Terminal, or switch to **API key** auth |
|
|
804
|
+
| SDK client works, UI CLI mode fails | SDK/API credentials are separate from Claude Code CLI OAuth | Use **API key** in the standalone UI, or log in with `claude auth login` for CLI account mode |
|
|
737
805
|
| `claude` / `gemini` not on `PATH` | Custom install location | Settings → **CLI path** → **Check connection** |
|
|
738
806
|
| Chat works in IDE but not UI (CLI mode) | OAuth tokens are CLI-only | Use **CLI account** in UI; API keys and CLI sessions are separate |
|
|
739
807
|
| Gemini multi-turn feels forgetful | Headless CLI may start a fresh session each turn | Known limitation; history is prepended to the prompt (MVP) |
|
package/README.tr.md
CHANGED
|
@@ -104,6 +104,26 @@ kullanır ve değişmeden çalışmaya devam eder.
|
|
|
104
104
|
photoshop-mcp-ui [--port 5174] [--host 127.0.0.1] [--no-open]
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
+
### Yerel API güvenliği
|
|
108
|
+
|
|
109
|
+
UI sunucusu sağlayıcı API anahtarlarınızı saklar ve Photoshop'u sürebilir; bu
|
|
110
|
+
nedenle `/api/*` makinenizde çalışan her şeye açık değildir. Her istek üç
|
|
111
|
+
kontrolden geçer:
|
|
112
|
+
|
|
113
|
+
1. **Host** — sunucunun portunda loopback adresi (veya bağlandığınız `--host`)
|
|
114
|
+
olmalıdır. DNS rebinding saldırısını engeller.
|
|
115
|
+
2. **Origin** — varsa UI'ın kendi origin'iyle eşleşmelidir. Çapraz kaynaklı
|
|
116
|
+
tarayıcı isteklerini engeller.
|
|
117
|
+
3. **Oturum token'ı** — her başlatmada üretilen rastgele bir sır. Header'ları
|
|
118
|
+
taklit edebilen ama token'ı okuyamayan diğer yerel süreçleri engeller.
|
|
119
|
+
|
|
120
|
+
Tarayıcının token ile uğraşması gerekmez: sunucu token'ı servis ettiği
|
|
121
|
+
`index.html` içine enjekte eder. Script yazarken token'ı
|
|
122
|
+
`~/.photoshop-mcp/ui-session.json` (chmod 600) dosyasından okuyup `x-psmcp-token`
|
|
123
|
+
veya `Authorization: Bearer` header'ı olarak gönderin; ya da sunucuyu
|
|
124
|
+
başlatmadan önce `PSMCP_UI_TOKEN` ile kendi token'ınızı sabitleyin. Geçerli
|
|
125
|
+
token içermeyen istekler `401 unauthorized` alır.
|
|
126
|
+
|
|
107
127
|
### Notlar
|
|
108
128
|
|
|
109
129
|
- Ajan yalnızca Photoshop MCP araçlarıyla sınırlıdır — dahili kabuk, dosya
|
|
@@ -608,6 +628,54 @@ Claude Desktop yapılandırmanıza ekleyin (macOS'ta `~/Library/Application Supp
|
|
|
608
628
|
}
|
|
609
629
|
```
|
|
610
630
|
|
|
631
|
+
**Yapılandırma dosyasını bulamıyor musunuz?** Claude Desktop'ta **Settings → Developer → Edit Config** yolunu kullanın — kurulumunuza uygun dosyayı açar (`%APPDATA%` yolu her zaman aynı olmayabilir).
|
|
632
|
+
|
|
633
|
+
### Claude Code için
|
|
634
|
+
|
|
635
|
+
[Claude Code CLI](https://code.claude.com/docs/en/agent-sdk/mcp) veya [Claude Agent SDK](https://code.claude.com/docs/en/agent-sdk/mcp) ile aynı MCP sunucu girdisini kullanın.
|
|
636
|
+
|
|
637
|
+
**Önerilen (CLI):**
|
|
638
|
+
|
|
639
|
+
```bash
|
|
640
|
+
claude mcp add photoshop -- npx -y @alisaitteke/photoshop-mcp
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
**Manuel JSON** — proje `.mcp.json` dosyanıza veya Claude Code MCP ayarlarınıza ekleyin ([`examples/claude-code-mcp.json`](examples/claude-code-mcp.json)):
|
|
644
|
+
|
|
645
|
+
```json
|
|
646
|
+
{
|
|
647
|
+
"mcpServers": {
|
|
648
|
+
"photoshop": {
|
|
649
|
+
"command": "npx",
|
|
650
|
+
"args": ["-y", "@alisaitteke/photoshop-mcp"],
|
|
651
|
+
"env": {
|
|
652
|
+
"LOG_LEVEL": "1"
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
**Agent SDK (TypeScript)** — `query()` seçeneklerinde aynı `mcpServers` bloğunu geçirin:
|
|
660
|
+
|
|
661
|
+
```typescript
|
|
662
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
663
|
+
|
|
664
|
+
const q = query({
|
|
665
|
+
prompt: 'Photoshop\'ta açık belgeleri listele',
|
|
666
|
+
options: {
|
|
667
|
+
mcpServers: {
|
|
668
|
+
photoshop: {
|
|
669
|
+
command: 'npx',
|
|
670
|
+
args: ['-y', '@alisaitteke/photoshop-mcp'],
|
|
671
|
+
env: { LOG_LEVEL: '1' },
|
|
672
|
+
},
|
|
673
|
+
},
|
|
674
|
+
allowedTools: ['mcp__photoshop__*'],
|
|
675
|
+
},
|
|
676
|
+
});
|
|
677
|
+
```
|
|
678
|
+
|
|
611
679
|
### Ortam Değişkenleri
|
|
612
680
|
|
|
613
681
|
- `PHOTOSHOP_PATH`: (İsteğe bağlı) Özel Photoshop kurulum yolunu belirtin
|
|
@@ -717,7 +785,8 @@ Yaygın bağlantı, betik ve günlük kaydı sorunları:
|
|
|
717
785
|
| Belirti | Olası neden | Düzeltme |
|
|
718
786
|
|---|---|---|
|
|
719
787
|
| `cli_not_found` | Claude Code / Gemini CLI yüklü değil | `npm i -g @anthropic-ai/claude-code` veya `npm i -g @google/gemini-cli` |
|
|
720
|
-
| `not_authenticated` | OAuth oturumu yok | Terminal'de `claude auth login` veya `gemini auth login` çalıştırın |
|
|
788
|
+
| `not_authenticated` | CLI OAuth oturumu yok (API anahtarı / SDK oturumu sayılmaz) | Terminal'de `claude auth login` veya `gemini auth login` çalıştırın veya **API key** moduna geçin |
|
|
789
|
+
| SDK istemcisi çalışıyor, UI CLI modu başarısız | SDK/API kimlik bilgileri Claude Code CLI OAuth'tan ayrıdır | Bağımsız UI'da **API key** kullanın veya CLI hesabı için `claude auth login` çalıştırın |
|
|
721
790
|
| `claude` / `gemini` `PATH`'de yok | Özel kurulum konumu | Ayarlar → **CLI path** → **Check connection** |
|
|
722
791
|
| Sohbet IDE'de çalışıyor ama UI'da çalışmıyor (CLI modu) | OAuth tokenları yalnızca CLI'ya özgü | UI'da **CLI account** kullanın; API anahtarları ve CLI oturumları ayrıdır |
|
|
723
792
|
| Gemini çok turlu konuşmalarda unutkanlık gösteriyor | Başsız CLI her turda yeni oturum açabilir | Bilinen kısıtlama; geçmiş isteme eklenir (MVP) |
|
package/README.zh-CN.md
CHANGED
|
@@ -99,6 +99,23 @@ npx -p @alisaitteke/photoshop-mcp photoshop-mcp-ui
|
|
|
99
99
|
photoshop-mcp-ui [--port 5174] [--host 127.0.0.1] [--no-open]
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
+
### 本地 API 安全
|
|
103
|
+
|
|
104
|
+
UI 服务器保存着你的模型提供方 API 密钥,并且可以驱动 Photoshop,因此 `/api/*`
|
|
105
|
+
并不对本机上运行的所有程序开放。每个请求都必须通过三项检查:
|
|
106
|
+
|
|
107
|
+
1. **Host** — 必须是服务器端口上的回环地址(或你通过 `--host` 绑定的主机),
|
|
108
|
+
用于阻止 DNS 重绑定攻击。
|
|
109
|
+
2. **Origin** — 如果存在,必须与 UI 自身的来源一致,用于阻止浏览器发起的跨源
|
|
110
|
+
调用。
|
|
111
|
+
3. **会话令牌** — 每次启动生成的随机密钥,用于阻止其他本地进程;它们可以伪造
|
|
112
|
+
任意请求头,却无法读取该令牌。
|
|
113
|
+
|
|
114
|
+
浏览器无需处理令牌:服务器会将其注入所返回的 `index.html`。编写脚本时,请从
|
|
115
|
+
`~/.photoshop-mcp/ui-session.json`(chmod 600)读取令牌,并通过
|
|
116
|
+
`x-psmcp-token` 或 `Authorization: Bearer` 请求头发送;也可以在启动服务器前用
|
|
117
|
+
`PSMCP_UI_TOKEN` 指定自己的令牌。缺少有效令牌的请求会收到 `401 unauthorized`。
|
|
118
|
+
|
|
102
119
|
### 注意事项
|
|
103
120
|
|
|
104
121
|
- 代理仅限于使用 Photoshop MCP 工具——内置的 shell、文件和网络工具已禁用。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"macos-detector.d.ts","sourceRoot":"","sources":["../../src/platform/macos-detector.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;;IAMjB,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC;YA6BxB,oBAAoB;IAuBlC,OAAO,CAAC,cAAc;
|
|
1
|
+
{"version":3,"file":"macos-detector.d.ts","sourceRoot":"","sources":["../../src/platform/macos-detector.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;;IAMjB,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC;YA6BxB,oBAAoB;IAuBlC,OAAO,CAAC,cAAc;YA2BR,SAAS;YA2BT,qBAAqB;YAwCrB,cAAc;IActB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAW9D"}
|
|
@@ -57,12 +57,15 @@ export class MacOSDetector {
|
|
|
57
57
|
}
|
|
58
58
|
getCommonPaths() {
|
|
59
59
|
const paths = [];
|
|
60
|
-
// Generate paths
|
|
61
|
-
|
|
60
|
+
// Generate paths from next year's release (Adobe ships "Photoshop N+1"
|
|
61
|
+
// in the autumn of year N) back to 2012, so new versions are found
|
|
62
|
+
// without a code change.
|
|
63
|
+
const maxYear = new Date().getFullYear() + 1;
|
|
64
|
+
for (let year = maxYear; year >= 2012; year--) {
|
|
62
65
|
paths.push(`/Applications/Adobe Photoshop ${year}/Adobe Photoshop ${year}.app`, `/Applications/Adobe Photoshop CC ${year}/Adobe Photoshop CC ${year}.app`, `/Applications/Adobe Photoshop ${year}.app`);
|
|
63
66
|
}
|
|
64
|
-
// Also check for version-less
|
|
65
|
-
paths.push('/Applications/Adobe Photoshop CC/Adobe Photoshop CC.app', '/Applications/Adobe Photoshop/Adobe Photoshop.app', '/Applications/Adobe Photoshop.app');
|
|
67
|
+
// Also check for version-less and beta installations
|
|
68
|
+
paths.push('/Applications/Adobe Photoshop CC/Adobe Photoshop CC.app', '/Applications/Adobe Photoshop/Adobe Photoshop.app', '/Applications/Adobe Photoshop.app', '/Applications/Adobe Photoshop (Beta)/Adobe Photoshop (Beta).app', '/Applications/Adobe Photoshop (Beta).app');
|
|
66
69
|
return paths;
|
|
67
70
|
}
|
|
68
71
|
async checkPath(path) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"macos-detector.js","sourceRoot":"","sources":["../../src/platform/macos-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,OAAO,aAAa;IAChB,MAAM,CAAS;IAEvB;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAEpD,iCAAiC;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;YAC5D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;QACxB,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACxD,IAAI,aAAa;gBAAE,OAAO,aAAa,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;QAED,gCAAgC;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;QACxB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,IAAI,CAAC;YACH,kDAAkD;YAClD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,2DAA2D,CAC5D,CAAC;YAEF,MAAM,IAAI,GAAG,MAAM;iBAChB,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;iBACtD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,8CAA8C;YAErF,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC3C,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,cAAc;QACpB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,
|
|
1
|
+
{"version":3,"file":"macos-detector.js","sourceRoot":"","sources":["../../src/platform/macos-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
import { ScriptExecutor } from './script-executor.js';
|
|
2
|
+
/** Escape a string for use as a pgrep -f pattern (extended regex). */
|
|
3
|
+
export declare function escapeForPgrep(value: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* AppleScript `with timeout of N seconds` value for a given tool timeout.
|
|
6
|
+
* Without this block AppleScript's default ~120s Apple-event reply timeout
|
|
7
|
+
* silently caps every `do javascript` call regardless of the tool timeout.
|
|
8
|
+
*/
|
|
9
|
+
export declare function appleScriptTimeoutSeconds(timeoutMs: number): number;
|
|
10
|
+
/** Hard outer bound: osascript is SIGKILLed after this many ms. Always strictly
|
|
11
|
+
* above the AppleScript timeout so the clean AppleEvent error fires first. */
|
|
12
|
+
export declare function killTimeoutMs(timeoutMs: number): number;
|
|
2
13
|
export declare class MacOSExecutor implements ScriptExecutor {
|
|
3
14
|
private logger;
|
|
4
15
|
private scriptQueue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"macos-executor.d.ts","sourceRoot":"","sources":["../../src/platform/macos-executor.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"macos-executor.d.ts","sourceRoot":"","sources":["../../src/platform/macos-executor.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAoBD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;8EAC8E;AAC9E,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AASD,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAkC;;IAMjD,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK3B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC;YA+C1D,YAAY;YAwBZ,aAAa;IAyC3B,OAAO,CAAC,wBAAwB;IAsBhC,OAAO,CAAC,WAAW;IAUb,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IActC,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB3D;;;OAGG;IACG,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAoBhE"}
|
|
@@ -7,6 +7,37 @@ import { Logger } from '../utils/logger.js';
|
|
|
7
7
|
import { prefixExtendScriptBom } from '../utils/extendscript-file.js';
|
|
8
8
|
import { parseExtendScriptPayload } from '../utils/extendscript-result.js';
|
|
9
9
|
const execAsync = promisify(exec);
|
|
10
|
+
/** Escape a string for use as a pgrep -f pattern (extended regex). */
|
|
11
|
+
export function escapeForPgrep(value) {
|
|
12
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
13
|
+
}
|
|
14
|
+
function envTruthy(name) {
|
|
15
|
+
const value = process.env[name]?.trim().toLowerCase();
|
|
16
|
+
return value === '1' || value === 'true' || value === 'yes';
|
|
17
|
+
}
|
|
18
|
+
/** Slack added to the AppleScript-side timeout beyond the tool timeout, so the
|
|
19
|
+
* JSX gets its full advertised budget plus Apple-event overhead. */
|
|
20
|
+
const APPLESCRIPT_TIMEOUT_MARGIN_SECONDS = 5;
|
|
21
|
+
/** Extra grace before Node SIGKILLs osascript, beyond the AppleScript timeout.
|
|
22
|
+
* Keeps the AppleScript timeout strictly below the hard kill so Photoshop gets
|
|
23
|
+
* a clean AppleEvent timeout error instead of a dead pipe. */
|
|
24
|
+
const KILL_GRACE_MS = 5000;
|
|
25
|
+
/** Extra time a task may sit in the serial queue behind other scripts before
|
|
26
|
+
* its caller gives up, on top of the task's own execution timeout. */
|
|
27
|
+
const QUEUE_WAIT_ALLOWANCE_MS = 60_000;
|
|
28
|
+
/**
|
|
29
|
+
* AppleScript `with timeout of N seconds` value for a given tool timeout.
|
|
30
|
+
* Without this block AppleScript's default ~120s Apple-event reply timeout
|
|
31
|
+
* silently caps every `do javascript` call regardless of the tool timeout.
|
|
32
|
+
*/
|
|
33
|
+
export function appleScriptTimeoutSeconds(timeoutMs) {
|
|
34
|
+
return Math.ceil(timeoutMs / 1000) + APPLESCRIPT_TIMEOUT_MARGIN_SECONDS;
|
|
35
|
+
}
|
|
36
|
+
/** Hard outer bound: osascript is SIGKILLed after this many ms. Always strictly
|
|
37
|
+
* above the AppleScript timeout so the clean AppleEvent error fires first. */
|
|
38
|
+
export function killTimeoutMs(timeoutMs) {
|
|
39
|
+
return appleScriptTimeoutSeconds(timeoutMs) * 1000 + KILL_GRACE_MS;
|
|
40
|
+
}
|
|
10
41
|
export class MacOSExecutor {
|
|
11
42
|
logger;
|
|
12
43
|
scriptQueue = [];
|
|
@@ -21,22 +52,40 @@ export class MacOSExecutor {
|
|
|
21
52
|
}
|
|
22
53
|
async execute(script, timeout = 30000) {
|
|
23
54
|
return new Promise((resolve, reject) => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
55
|
+
// Two-phase timeout. While QUEUED: a generous wait timer (timeout +
|
|
56
|
+
// queue allowance) rejects the caller AND marks the entry cancelled so
|
|
57
|
+
// it never executes later. While RUNNING: the real execution timer,
|
|
58
|
+
// started at dequeue so queue wait does not eat into script run time.
|
|
59
|
+
const entry = {
|
|
60
|
+
cancelled: false,
|
|
61
|
+
run: async () => {
|
|
62
|
+
clearTimeout(waitTimer);
|
|
63
|
+
let timedOut = false;
|
|
64
|
+
const execTimer = setTimeout(() => {
|
|
65
|
+
timedOut = true;
|
|
66
|
+
reject(new Error('Script execution timeout'));
|
|
67
|
+
}, timeout);
|
|
68
|
+
try {
|
|
69
|
+
const result = await this.executeScript(script, timeout);
|
|
70
|
+
clearTimeout(execTimer);
|
|
71
|
+
if (!timedOut) {
|
|
72
|
+
resolve(result);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
clearTimeout(execTimer);
|
|
77
|
+
if (!timedOut) {
|
|
78
|
+
reject(error);
|
|
79
|
+
}
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
const waitTimer = setTimeout(() => {
|
|
85
|
+
entry.cancelled = true;
|
|
86
|
+
reject(new Error(`Script timed out after ${timeout + QUEUE_WAIT_ALLOWANCE_MS}ms waiting in the execution queue`));
|
|
87
|
+
}, timeout + QUEUE_WAIT_ALLOWANCE_MS);
|
|
88
|
+
this.scriptQueue.push(entry);
|
|
40
89
|
this.processQueue();
|
|
41
90
|
});
|
|
42
91
|
}
|
|
@@ -47,29 +96,38 @@ export class MacOSExecutor {
|
|
|
47
96
|
this.isProcessing = true;
|
|
48
97
|
while (this.scriptQueue.length > 0) {
|
|
49
98
|
const task = this.scriptQueue.shift();
|
|
50
|
-
if (task) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
99
|
+
if (!task || task.cancelled) {
|
|
100
|
+
// Caller already saw a timeout for this task; running it now would
|
|
101
|
+
// mutate Photoshop state after the caller gave up.
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
await task.run();
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
this.logger.error('Script execution failed:', error);
|
|
57
109
|
}
|
|
58
110
|
}
|
|
59
111
|
this.isProcessing = false;
|
|
60
112
|
}
|
|
61
|
-
async executeScript(script) {
|
|
113
|
+
async executeScript(script, timeout = 30000) {
|
|
62
114
|
// For macOS, we'll use AppleScript to execute JavaScript in Photoshop
|
|
63
115
|
const tempScriptPath = join(tmpdir(), `photoshop-script-${Date.now()}.jsx`);
|
|
64
116
|
const tempAppleScriptPath = join(tmpdir(), `photoshop-applescript-${Date.now()}.scpt`);
|
|
65
117
|
try {
|
|
66
118
|
await writeFile(tempScriptPath, prefixExtendScriptBom(script), 'utf8');
|
|
67
119
|
// Create AppleScript that tells Photoshop to execute the JSX
|
|
68
|
-
const appleScript = this.createAppleScriptWrapper(tempScriptPath);
|
|
120
|
+
const appleScript = this.createAppleScriptWrapper(tempScriptPath, timeout);
|
|
69
121
|
await writeFile(tempAppleScriptPath, appleScript, 'utf8');
|
|
70
122
|
try {
|
|
71
|
-
// Execute AppleScript via osascript
|
|
72
|
-
|
|
123
|
+
// Execute AppleScript via osascript; the timeout must kill the child,
|
|
124
|
+
// otherwise abandoned osascript processes pile up behind long calls.
|
|
125
|
+
// The kill fires after the AppleScript-side timeout (see
|
|
126
|
+
// killTimeoutMs) so a clean AppleEvent timeout error comes first.
|
|
127
|
+
const { stdout, stderr } = await execAsync(`osascript "${tempAppleScriptPath}"`, {
|
|
128
|
+
timeout: killTimeoutMs(timeout),
|
|
129
|
+
killSignal: 'SIGKILL',
|
|
130
|
+
});
|
|
73
131
|
if (stderr) {
|
|
74
132
|
this.logger.warn('Script execution warning:', stderr);
|
|
75
133
|
}
|
|
@@ -90,13 +148,22 @@ export class MacOSExecutor {
|
|
|
90
148
|
await unlink(tempScriptPath).catch(() => { });
|
|
91
149
|
}
|
|
92
150
|
}
|
|
93
|
-
createAppleScriptWrapper(jsxPath) {
|
|
151
|
+
createAppleScriptWrapper(jsxPath, timeoutMs = 30000) {
|
|
94
152
|
// Use POSIX file path for AppleScript
|
|
95
153
|
const posixPath = jsxPath.replace(/\\/g, '/');
|
|
154
|
+
// 'activate' steals window focus on every tool call, which makes the
|
|
155
|
+
// machine unusable while an agent drives Photoshop. Apple events reach
|
|
156
|
+
// background apps fine, so only activate when explicitly requested.
|
|
157
|
+
const activateLine = envTruthy('PHOTOSHOP_ACTIVATE') ? '\tactivate\n' : '';
|
|
158
|
+
// Without an explicit `with timeout` block, AppleScript's default ~120s
|
|
159
|
+
// Apple-event reply timeout caps every synchronous `do javascript` call,
|
|
160
|
+
// silently defeating per-tool timeouts above 120s (batch tools use 600s).
|
|
161
|
+
const timeoutSeconds = appleScriptTimeoutSeconds(timeoutMs);
|
|
96
162
|
return `tell application "${this.appName}"
|
|
97
|
-
\
|
|
98
|
-
\
|
|
99
|
-
\tdo javascript "$.evalFile(decodeURI('${encodeURI(posixPath)}'))"
|
|
163
|
+
${activateLine}\tset jsxFile to POSIX file "${posixPath}"
|
|
164
|
+
\twith timeout of ${timeoutSeconds} seconds
|
|
165
|
+
\t\tdo javascript "$.evalFile(decodeURI('${encodeURI(posixPath)}'))"
|
|
166
|
+
\tend timeout
|
|
100
167
|
end tell`;
|
|
101
168
|
}
|
|
102
169
|
parseResult(output) {
|
|
@@ -108,7 +175,11 @@ end tell`;
|
|
|
108
175
|
}
|
|
109
176
|
async isPhotoshopRunning() {
|
|
110
177
|
try {
|
|
111
|
-
|
|
178
|
+
// Match the specific app we drive, not any Photoshop — with 2025/2026/
|
|
179
|
+
// Beta installed side by side, a generic match reports "running" while
|
|
180
|
+
// the target version is not.
|
|
181
|
+
const pattern = escapeForPgrep(this.appName);
|
|
182
|
+
const { stdout } = await execAsync(`pgrep -f "${pattern}"`);
|
|
112
183
|
return stdout.trim().length > 0;
|
|
113
184
|
}
|
|
114
185
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"macos-executor.js","sourceRoot":"","sources":["../../src/platform/macos-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,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAG3E,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,OAAO,aAAa;IAChB,MAAM,CAAS;IACf,WAAW,
|
|
1
|
+
{"version":3,"file":"macos-executor.js","sourceRoot":"","sources":["../../src/platform/macos-executor.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/cli.js
CHANGED
|
@@ -3,6 +3,7 @@ import getPort from 'get-port';
|
|
|
3
3
|
import open from 'open';
|
|
4
4
|
import { capture, ensureAnalyticsIdentity, getAppVersion, identifyAnalyticsPerson, shutdownAnalytics, } from '../analytics/index.js';
|
|
5
5
|
import { Logger } from '../utils/logger.js';
|
|
6
|
+
import { getSessionFilePath } from './security/session-token.js';
|
|
6
7
|
import { startUIServer } from './server.js';
|
|
7
8
|
function parseFlags(argv) {
|
|
8
9
|
const flags = { host: '127.0.0.1', noOpen: false };
|
|
@@ -44,6 +45,9 @@ function printHelp() {
|
|
|
44
45
|
' -v, --version Show version',
|
|
45
46
|
'',
|
|
46
47
|
'Configuration is stored at ~/.photoshop-mcp/config.json (chmod 600).',
|
|
48
|
+
'The /api/* endpoints require the session token from',
|
|
49
|
+
'~/.photoshop-mcp/ui-session.json (chmod 600), sent as an',
|
|
50
|
+
'x-psmcp-token or Authorization: Bearer header.',
|
|
47
51
|
'',
|
|
48
52
|
].join('\n'));
|
|
49
53
|
}
|
|
@@ -71,7 +75,9 @@ async function main() {
|
|
|
71
75
|
event_source: 'server',
|
|
72
76
|
});
|
|
73
77
|
const url = server.url;
|
|
74
|
-
process.stdout.write(`\nPhotoshop MCP UI ready at:\n ${url}\n\n`
|
|
78
|
+
process.stdout.write(`\nPhotoshop MCP UI ready at:\n ${url}\n\n` +
|
|
79
|
+
`The /api/* endpoints require this session's token.\n` +
|
|
80
|
+
` ${getSessionFilePath()}\n\n`);
|
|
75
81
|
if (!flags.noOpen) {
|
|
76
82
|
try {
|
|
77
83
|
await open(url);
|
package/dist/ui/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/ui/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/ui/cli.ts"],"names":[],"mappings":";AAEA,OAAO,OAAO,MAAM,UAAU,CAAC;AAC/B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EACL,OAAO,EACP,uBAAuB,EACvB,aAAa,EACb,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ5C,SAAS,UAAU,CAAC,IAAc;IAChC,MAAM,KAAK,GAAa,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;QACxD,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;QACvC,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5C,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC/C,YAAY,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,4DAA4D;QAC5D,EAAE;QACF,mCAAmC;QACnC,EAAE;QACF,UAAU;QACV,uEAAuE;QACvE,8DAA8D;QAC9D,sDAAsD;QACtD,wCAAwC;QACxC,sCAAsC;QACtC,EAAE;QACF,sEAAsE;QACtE,qDAAqD;QACrD,0DAA0D;QAC1D,gDAAgD;QAChD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,aAAa,EAAE,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,uBAAuB,EAAE,CAAC;IAC1B,uBAAuB,CAAC;QACtB,aAAa,EAAE,QAAQ;QACvB,YAAY,EAAE,QAAQ;KACvB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;QACjC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI;KACL,CAAC,CAAC;IAEH,OAAO,CAAC,mBAAmB,EAAE;QAC3B,IAAI;QACJ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,MAAM;QACrB,YAAY,EAAE,QAAQ;KACvB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mCAAmC,GAAG,MAAM;QAC1C,sDAAsD;QACtD,KAAK,kBAAkB,EAAE,MAAM,CAClC,CAAC;IAEF,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACxC,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,iBAAiB,CAAC,CAAC;QACjD,OAAO,CAAC,iBAAiB,EAAE;YACzB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YACnC,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE;YACrC,YAAY,EAAE,QAAQ;SACvB,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,iBAAiB,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAsC,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;IACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ui/providers/anthropic.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ui/providers/anthropic.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,YAAY,CAAC;AAyCjE,eAAO,MAAM,gBAAgB,EAAE,eAkE9B,CAAC"}
|