@alisaitteke/photoshop-mcp 1.3.13 → 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.
Files changed (166) hide show
  1. package/README.de.md +787 -0
  2. package/README.es.md +737 -0
  3. package/README.ja.md +732 -0
  4. package/README.md +204 -41
  5. package/README.tr.md +842 -0
  6. package/README.zh-CN.md +727 -0
  7. package/dist/api/extendscript.d.ts +17 -1
  8. package/dist/api/extendscript.d.ts.map +1 -1
  9. package/dist/api/extendscript.js +301 -3
  10. package/dist/api/extendscript.js.map +1 -1
  11. package/dist/api/photoshop-api.d.ts +1 -1
  12. package/dist/api/photoshop-api.d.ts.map +1 -1
  13. package/dist/api/photoshop-api.js +4 -4
  14. package/dist/api/photoshop-api.js.map +1 -1
  15. package/dist/core/server.d.ts.map +1 -1
  16. package/dist/core/server.js +8 -0
  17. package/dist/core/server.js.map +1 -1
  18. package/dist/errors/envelope.d.ts +1 -1
  19. package/dist/errors/envelope.d.ts.map +1 -1
  20. package/dist/errors/envelope.js +4 -0
  21. package/dist/errors/envelope.js.map +1 -1
  22. package/dist/platform/capabilities.d.ts +7 -0
  23. package/dist/platform/capabilities.d.ts.map +1 -1
  24. package/dist/platform/capabilities.js +23 -1
  25. package/dist/platform/capabilities.js.map +1 -1
  26. package/dist/platform/macos-detector.d.ts.map +1 -1
  27. package/dist/platform/macos-detector.js +7 -4
  28. package/dist/platform/macos-detector.js.map +1 -1
  29. package/dist/platform/macos-executor.d.ts +11 -0
  30. package/dist/platform/macos-executor.d.ts.map +1 -1
  31. package/dist/platform/macos-executor.js +103 -32
  32. package/dist/platform/macos-executor.js.map +1 -1
  33. package/dist/platform/uxp-bridge-client.d.ts +13 -0
  34. package/dist/platform/uxp-bridge-client.d.ts.map +1 -0
  35. package/dist/platform/uxp-bridge-client.js +31 -0
  36. package/dist/platform/uxp-bridge-client.js.map +1 -0
  37. package/dist/platform/uxp-bridge-server.d.ts +16 -0
  38. package/dist/platform/uxp-bridge-server.d.ts.map +1 -0
  39. package/dist/platform/uxp-bridge-server.js +105 -0
  40. package/dist/platform/uxp-bridge-server.js.map +1 -0
  41. package/dist/prompts/instructions.d.ts.map +1 -1
  42. package/dist/prompts/instructions.js +21 -12
  43. package/dist/prompts/instructions.js.map +1 -1
  44. package/dist/prompts/registry.d.ts +2 -2
  45. package/dist/prompts/registry.d.ts.map +1 -1
  46. package/dist/prompts/registry.js +15 -0
  47. package/dist/prompts/registry.js.map +1 -1
  48. package/dist/prompts/templates/batch-watermark.d.ts +3 -0
  49. package/dist/prompts/templates/batch-watermark.d.ts.map +1 -0
  50. package/dist/prompts/templates/batch-watermark.js +67 -0
  51. package/dist/prompts/templates/batch-watermark.js.map +1 -0
  52. package/dist/prompts/templates/generative-expand.d.ts +3 -0
  53. package/dist/prompts/templates/generative-expand.d.ts.map +1 -0
  54. package/dist/prompts/templates/generative-expand.js +34 -0
  55. package/dist/prompts/templates/generative-expand.js.map +1 -0
  56. package/dist/prompts/templates/generative-fill.d.ts +3 -0
  57. package/dist/prompts/templates/generative-fill.d.ts.map +1 -0
  58. package/dist/prompts/templates/generative-fill.js +29 -0
  59. package/dist/prompts/templates/generative-fill.js.map +1 -0
  60. package/dist/prompts/templates/generative-remove.d.ts +3 -0
  61. package/dist/prompts/templates/generative-remove.d.ts.map +1 -0
  62. package/dist/prompts/templates/generative-remove.js +36 -0
  63. package/dist/prompts/templates/generative-remove.js.map +1 -0
  64. package/dist/prompts/templates/passport-photo.d.ts +3 -0
  65. package/dist/prompts/templates/passport-photo.d.ts.map +1 -0
  66. package/dist/prompts/templates/passport-photo.js +36 -0
  67. package/dist/prompts/templates/passport-photo.js.map +1 -0
  68. package/dist/prompts/templates/remove-distraction.d.ts.map +1 -1
  69. package/dist/prompts/templates/remove-distraction.js +4 -5
  70. package/dist/prompts/templates/remove-distraction.js.map +1 -1
  71. package/dist/prompts/templates/split-carousel.d.ts +3 -0
  72. package/dist/prompts/templates/split-carousel.d.ts.map +1 -0
  73. package/dist/prompts/templates/split-carousel.js +49 -0
  74. package/dist/prompts/templates/split-carousel.js.map +1 -0
  75. package/dist/tools/generative/_shared.d.ts +14 -0
  76. package/dist/tools/generative/_shared.d.ts.map +1 -0
  77. package/dist/tools/generative/_shared.js +79 -0
  78. package/dist/tools/generative/_shared.js.map +1 -0
  79. package/dist/tools/generative-tools.d.ts +8 -0
  80. package/dist/tools/generative-tools.d.ts.map +1 -0
  81. package/dist/tools/generative-tools.js +221 -0
  82. package/dist/tools/generative-tools.js.map +1 -0
  83. package/dist/tools/layer-properties-tools.d.ts.map +1 -1
  84. package/dist/tools/layer-properties-tools.js +2 -1
  85. package/dist/tools/layer-properties-tools.js.map +1 -1
  86. package/dist/tools/neural-tools.d.ts +8 -0
  87. package/dist/tools/neural-tools.d.ts.map +1 -0
  88. package/dist/tools/neural-tools.js +99 -0
  89. package/dist/tools/neural-tools.js.map +1 -0
  90. package/dist/tools/recipes/_shared.d.ts +8 -0
  91. package/dist/tools/recipes/_shared.d.ts.map +1 -1
  92. package/dist/tools/recipes/_shared.js +45 -0
  93. package/dist/tools/recipes/_shared.js.map +1 -1
  94. package/dist/tools/recipes/batch-watermark.d.ts +4 -0
  95. package/dist/tools/recipes/batch-watermark.d.ts.map +1 -0
  96. package/dist/tools/recipes/batch-watermark.js +283 -0
  97. package/dist/tools/recipes/batch-watermark.js.map +1 -0
  98. package/dist/tools/recipes/enhance-portrait.d.ts.map +1 -1
  99. package/dist/tools/recipes/enhance-portrait.js +47 -0
  100. package/dist/tools/recipes/enhance-portrait.js.map +1 -1
  101. package/dist/tools/recipes/index.d.ts +1 -1
  102. package/dist/tools/recipes/index.d.ts.map +1 -1
  103. package/dist/tools/recipes/index.js +9 -0
  104. package/dist/tools/recipes/index.js.map +1 -1
  105. package/dist/tools/recipes/passport-photo.d.ts +4 -0
  106. package/dist/tools/recipes/passport-photo.d.ts.map +1 -0
  107. package/dist/tools/recipes/passport-photo.js +202 -0
  108. package/dist/tools/recipes/passport-photo.js.map +1 -0
  109. package/dist/tools/recipes/remove-background.d.ts.map +1 -1
  110. package/dist/tools/recipes/remove-background.js +5 -0
  111. package/dist/tools/recipes/remove-background.js.map +1 -1
  112. package/dist/tools/recipes/remove-distraction.d.ts.map +1 -1
  113. package/dist/tools/recipes/remove-distraction.js +48 -8
  114. package/dist/tools/recipes/remove-distraction.js.map +1 -1
  115. package/dist/tools/recipes/sky-blend.d.ts.map +1 -1
  116. package/dist/tools/recipes/sky-blend.js +43 -1
  117. package/dist/tools/recipes/sky-blend.js.map +1 -1
  118. package/dist/tools/recipes/split-carousel.d.ts +4 -0
  119. package/dist/tools/recipes/split-carousel.d.ts.map +1 -0
  120. package/dist/tools/recipes/split-carousel.js +163 -0
  121. package/dist/tools/recipes/split-carousel.js.map +1 -0
  122. package/dist/tools/state-tools.js +2 -2
  123. package/dist/tools/state-tools.js.map +1 -1
  124. package/dist/ui/cli.js +7 -1
  125. package/dist/ui/cli.js.map +1 -1
  126. package/dist/ui/providers/anthropic.d.ts.map +1 -1
  127. package/dist/ui/providers/anthropic.js +11 -1
  128. package/dist/ui/providers/anthropic.js.map +1 -1
  129. package/dist/ui/providers/types.d.ts +1 -0
  130. package/dist/ui/providers/types.d.ts.map +1 -1
  131. package/dist/ui/security/session-token.d.ts +24 -0
  132. package/dist/ui/security/session-token.d.ts.map +1 -0
  133. package/dist/ui/security/session-token.js +72 -0
  134. package/dist/ui/security/session-token.js.map +1 -0
  135. package/dist/ui/server.d.ts +4 -0
  136. package/dist/ui/server.d.ts.map +1 -1
  137. package/dist/ui/server.js +79 -11
  138. package/dist/ui/server.js.map +1 -1
  139. package/dist/utils/js-string.d.ts.map +1 -1
  140. package/dist/utils/js-string.js +6 -1
  141. package/dist/utils/js-string.js.map +1 -1
  142. package/package.json +8 -4
  143. package/uxp-plugin/index.html +20 -0
  144. package/uxp-plugin/main.js +139 -0
  145. package/uxp-plugin/manifest.json +26 -0
  146. package/web/dist/assets/index-SNfxhJjr.js +350 -0
  147. package/web/dist/assets/index-vi5C3hqd.css +1 -0
  148. package/web/dist/index.html +2 -2
  149. package/dist/analytics/client-ip.d.ts +0 -5
  150. package/dist/analytics/client-ip.d.ts.map +0 -1
  151. package/dist/analytics/client-ip.js +0 -39
  152. package/dist/analytics/client-ip.js.map +0 -1
  153. package/dist/analytics/debug-log.d.ts +0 -3
  154. package/dist/analytics/debug-log.d.ts.map +0 -1
  155. package/dist/analytics/debug-log.js +0 -21
  156. package/dist/analytics/debug-log.js.map +0 -1
  157. package/dist/prompts/templates.d.ts +0 -8
  158. package/dist/prompts/templates.d.ts.map +0 -1
  159. package/dist/prompts/templates.js +0 -162
  160. package/dist/prompts/templates.js.map +0 -1
  161. package/dist/tools/recipe-tools.d.ts +0 -4
  162. package/dist/tools/recipe-tools.d.ts.map +0 -1
  163. package/dist/tools/recipe-tools.js +0 -265
  164. package/dist/tools/recipe-tools.js.map +0 -1
  165. package/web/dist/assets/index-BgiXf1Jy.css +0 -1
  166. package/web/dist/assets/index-DvGX0LLy.js +0 -346
@@ -1,4 +1,5 @@
1
1
  import { PhotoshopDetector } from './detector.js';
2
+ import { isUxpBridgeReachable } from './uxp-bridge-client.js';
2
3
  export function parsePhotoshopVersion(version) {
3
4
  const numeric = version.match(/(\d+)\.?(\d*)/);
4
5
  if (numeric) {
@@ -27,17 +28,38 @@ export function getPhotoshopCapabilities(version) {
27
28
  const year = parsed.year ?? (major >= 13 ? 1990 + major : undefined);
28
29
  const selectSubjectV2 = major >= 23 || (year !== undefined && year >= 2020);
29
30
  const generativeFill = major >= 25 || (year !== undefined && year >= 2024);
31
+ const generativeRemove = generativeFill;
32
+ const generativeExpand = generativeFill;
30
33
  const generativeUpscale = major >= 27 || (year !== undefined && year >= 2025);
31
- const executeAsModal = major >= 25 || (year !== undefined && year >= 2024);
34
+ const skyReplacementNative = generativeFill;
35
+ const executeAsModal = generativeFill;
32
36
  return {
33
37
  version,
34
38
  features: {
35
39
  select_subject_v2: selectSubjectV2,
36
40
  generative_fill: generativeFill,
41
+ generative_remove: generativeRemove,
42
+ generative_expand: generativeExpand,
37
43
  generative_upscale: generativeUpscale,
44
+ sky_replacement_native: skyReplacementNative,
45
+ neural_filters: false,
46
+ uxp_bridge_reachable: false,
38
47
  execute_as_modal_timeout: executeAsModal,
39
48
  uxp_plugin_api: detector.supportsUXP(version),
40
49
  },
41
50
  };
42
51
  }
52
+ /** Merge runtime UXP bridge reachability into version-derived capabilities. */
53
+ export async function resolvePhotoshopCapabilities(version) {
54
+ const base = getPhotoshopCapabilities(version);
55
+ const bridgeUp = await isUxpBridgeReachable();
56
+ return {
57
+ ...base,
58
+ features: {
59
+ ...base.features,
60
+ uxp_bridge_reachable: bridgeUp,
61
+ neural_filters: bridgeUp && base.features.uxp_plugin_api,
62
+ },
63
+ };
64
+ }
43
65
  //# sourceMappingURL=capabilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/platform/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAoBlD,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/B,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,GAAG,EAAE,OAAO;SACb,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO;YACL,KAAK,EAAE,IAAI,GAAG,IAAI;YAClB,KAAK,EAAE,CAAC;YACR,IAAI;YACJ,GAAG,EAAE,OAAO;SACb,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAEzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAErE,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC;IAC3E,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC;IAC9E,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC;IAE3E,OAAO;QACL,OAAO;QACP,QAAQ,EAAE;YACR,iBAAiB,EAAE,eAAe;YAClC,eAAe,EAAE,cAAc;YAC/B,kBAAkB,EAAE,iBAAiB;YACrC,wBAAwB,EAAE,cAAc;YACxC,cAAc,EAAE,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC;SAC9C;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/platform/capabilities.ts"],"names":[],"mappings":"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"}
@@ -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;YAsBR,SAAS;YA2BT,qBAAqB;YAwCrB,cAAc;IActB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAW9D"}
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 for versions 2012-2025
61
- for (let year = 2025; year >= 2012; year--) {
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 installation
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":"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"}
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,CAAqC;IACxD,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;YAuB1D,YAAY;YAqBZ,aAAa;IAmC3B,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,WAAW;IAUb,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAUtC,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB3D;;;OAGG;IACG,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAoBhE"}
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
- const timeoutId = setTimeout(() => {
25
- reject(new Error('Script execution timeout'));
26
- }, timeout);
27
- this.scriptQueue.push(async () => {
28
- try {
29
- const result = await this.executeScript(script);
30
- clearTimeout(timeoutId);
31
- resolve(result);
32
- return result;
33
- }
34
- catch (error) {
35
- clearTimeout(timeoutId);
36
- reject(error);
37
- throw error;
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
- try {
52
- await task();
53
- }
54
- catch (error) {
55
- this.logger.error('Script execution failed:', error);
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
- const { stdout, stderr } = await execAsync(`osascript "${tempAppleScriptPath}"`);
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
- \tactivate
98
- \tset jsxFile to POSIX file "${posixPath}"
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
- const { stdout } = await execAsync('pgrep -f "Adobe Photoshop"');
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":"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"}
1
+ {"version":3,"file":"macos-executor.js","sourceRoot":"","sources":["../../src/platform/macos-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare function isUxpBridgeReachable(): Promise<boolean>;
2
+ export type NeuralFilterKind = 'skin_smoothing' | 'harmonize' | 'depth_blur' | 'super_zoom' | 'colorize';
3
+ export interface NeuralFilterParams {
4
+ smoothness?: number;
5
+ blur?: number;
6
+ reference_layer_id?: number;
7
+ }
8
+ export declare function invokeNeuralFilter(filter: NeuralFilterKind, params?: NeuralFilterParams): Promise<{
9
+ ok: boolean;
10
+ data?: unknown;
11
+ error?: string;
12
+ }>;
13
+ //# sourceMappingURL=uxp-bridge-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uxp-bridge-client.d.ts","sourceRoot":"","sources":["../../src/platform/uxp-bridge-client.ts"],"names":[],"mappings":"AAOA,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAe7D;AAED,MAAM,MAAM,gBAAgB,GAC1B,gBAAgB,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC;AAE5E,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,gBAAgB,EACxB,MAAM,GAAE,kBAAuB,GAC9B,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAM1D"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Client for the MCP-hosted UXP bridge (health check + neural filter invoke).
3
+ */
4
+ import { ensureUxpBridgeServer, invokeUxpBridge } from './uxp-bridge-server.js';
5
+ const HEALTH_TIMEOUT_MS = 800;
6
+ export async function isUxpBridgeReachable() {
7
+ try {
8
+ const port = await ensureUxpBridgeServer();
9
+ const controller = new AbortController();
10
+ const timer = setTimeout(() => controller.abort(), HEALTH_TIMEOUT_MS);
11
+ const res = await fetch(`http://127.0.0.1:${port}/health`, {
12
+ signal: controller.signal,
13
+ });
14
+ clearTimeout(timer);
15
+ if (!res.ok)
16
+ return false;
17
+ const body = (await res.json());
18
+ return body.ok === true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ export async function invokeNeuralFilter(filter, params = {}) {
25
+ const result = await invokeUxpBridge('neural_filter', { filter, ...params }, 90_000);
26
+ if (!result.ok) {
27
+ return { ok: false, error: result.error ?? 'neural_filter_failed' };
28
+ }
29
+ return { ok: true, data: result.data };
30
+ }
31
+ //# sourceMappingURL=uxp-bridge-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uxp-bridge-client.js","sourceRoot":"","sources":["../../src/platform/uxp-bridge-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,qBAAqB,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,SAAS,EAAE;YACzD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqB,CAAC;QACpD,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAwB,EACxB,SAA6B,EAAE;IAE/B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;IACrF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,sBAAsB,EAAE,CAAC;IACtE,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface UxpBridgeCommand {
2
+ id: string;
3
+ action: string;
4
+ params: Record<string, unknown>;
5
+ }
6
+ export interface UxpBridgeResult {
7
+ id: string;
8
+ ok: boolean;
9
+ data?: unknown;
10
+ error?: string;
11
+ }
12
+ export declare function getUxpBridgePort(): number;
13
+ export declare function ensureUxpBridgeServer(): Promise<number>;
14
+ export declare function invokeUxpBridge(action: string, params: Record<string, unknown>, timeoutMs?: number): Promise<UxpBridgeResult>;
15
+ export declare function shutdownUxpBridgeServer(): Promise<void>;
16
+ //# sourceMappingURL=uxp-bridge-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uxp-bridge-server.d.ts","sourceRoot":"","sources":["../../src/platform/uxp-bridge-server.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkBD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgE7D;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,SAAS,GACjB,OAAO,CAAC,eAAe,CAAC,CAgB1B;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAI7D"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * MCP-hosted UXP bridge server — companion Photoshop plugin polls for commands.
3
+ * See docs/plans/2026-07-03-1149-photoshop-ai-features/ and uxp-plugin/.
4
+ */
5
+ import { createServer } from 'node:http';
6
+ import { Logger } from '../utils/logger.js';
7
+ const logger = new Logger('UxpBridgeServer');
8
+ const DEFAULT_PORT = Number.parseInt(process.env.PHOTOSHOP_UXP_BRIDGE_PORT ?? '38452', 10);
9
+ let server = null;
10
+ let listenPort = DEFAULT_PORT;
11
+ const pendingCommands = [];
12
+ const results = new Map();
13
+ function json(res, status, body) {
14
+ const payload = JSON.stringify(body);
15
+ res.writeHead(status, {
16
+ 'Content-Type': 'application/json',
17
+ 'Content-Length': Buffer.byteLength(payload),
18
+ });
19
+ res.end(payload);
20
+ }
21
+ export function getUxpBridgePort() {
22
+ return listenPort;
23
+ }
24
+ export async function ensureUxpBridgeServer() {
25
+ if (server)
26
+ return listenPort;
27
+ return new Promise((resolve, reject) => {
28
+ const s = createServer((req, res) => {
29
+ const url = new URL(req.url ?? '/', `http://127.0.0.1:${listenPort}`);
30
+ if (req.method === 'GET' && url.pathname === '/health') {
31
+ json(res, 200, { ok: true, pending: pendingCommands.length });
32
+ return;
33
+ }
34
+ if (req.method === 'GET' && url.pathname === '/poll') {
35
+ const cmd = pendingCommands.shift();
36
+ if (!cmd) {
37
+ res.writeHead(204);
38
+ res.end();
39
+ return;
40
+ }
41
+ json(res, 200, cmd);
42
+ return;
43
+ }
44
+ if (req.method === 'POST' && url.pathname === '/result') {
45
+ let body = '';
46
+ req.on('data', (chunk) => {
47
+ body += chunk;
48
+ });
49
+ req.on('end', () => {
50
+ try {
51
+ const parsed = JSON.parse(body);
52
+ if (parsed?.id) {
53
+ results.set(parsed.id, parsed);
54
+ }
55
+ json(res, 200, { ok: true });
56
+ }
57
+ catch {
58
+ json(res, 400, { ok: false, error: 'invalid_json' });
59
+ }
60
+ });
61
+ return;
62
+ }
63
+ json(res, 404, { ok: false, error: 'not_found' });
64
+ });
65
+ s.listen(listenPort, '127.0.0.1', () => {
66
+ server = s;
67
+ const addr = s.address();
68
+ if (addr && typeof addr === 'object') {
69
+ listenPort = addr.port;
70
+ }
71
+ logger.info(`UXP bridge listening on 127.0.0.1:${listenPort}`);
72
+ resolve(listenPort);
73
+ });
74
+ s.on('error', (err) => {
75
+ if (err.code === 'EADDRINUSE') {
76
+ listenPort += 1;
77
+ s.listen(listenPort, '127.0.0.1');
78
+ return;
79
+ }
80
+ reject(err);
81
+ });
82
+ });
83
+ }
84
+ export async function invokeUxpBridge(action, params, timeoutMs = 60_000) {
85
+ await ensureUxpBridgeServer();
86
+ const id = `cmd-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
87
+ pendingCommands.push({ id, action, params });
88
+ const started = Date.now();
89
+ while (Date.now() - started < timeoutMs) {
90
+ const hit = results.get(id);
91
+ if (hit) {
92
+ results.delete(id);
93
+ return hit;
94
+ }
95
+ await new Promise((r) => setTimeout(r, 250));
96
+ }
97
+ return { id, ok: false, error: 'uxp_bridge_timeout' };
98
+ }
99
+ export async function shutdownUxpBridgeServer() {
100
+ if (!server)
101
+ return;
102
+ await new Promise((resolve) => server.close(() => resolve()));
103
+ server = null;
104
+ }
105
+ //# sourceMappingURL=uxp-bridge-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uxp-bridge-server.js","sourceRoot":"","sources":["../../src/platform/uxp-bridge-server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/prompts/instructions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QA6H/B,CAAC;AAET,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD"}
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/prompts/instructions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAsI/B,CAAC;AAET,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD"}
@@ -73,11 +73,12 @@ User intent glossary
73
73
  - bg.remove — "remove background", "cut out", "isolate subject", "transparent
74
74
  background", "arka planı sil" → \`photoshop_recipe_remove_background\`
75
75
  - obj.remove — "remove that person", "erase distraction", "generative remove"
76
- → \`photoshop_recipe_remove_distraction\` (content-aware; select region first);
77
- fallback \`photoshop_content_aware_fill\` after manual selection
76
+ → \`photoshop_generative_remove\` first; fallback
77
+ \`photoshop_recipe_remove_distraction\` (content-aware) after manual selection
78
78
  - mask.gradient_fade — "fade into background", "gradient mask", "blend subject"
79
79
  → \`photoshop_recipe_gradient_fade\`; guide \`ps.gradient_blend\` for atomic chain
80
80
  - sky.replace — "replace sky", "fix blown sky", "better clouds" →
81
+ \`photoshop_sky_replacement\` when \`sky_replacement_native\`; else
81
82
  \`photoshop_recipe_sky_blend\`; guide \`ps.composite_blend\` for manual composite
82
83
  - portrait.enhance — "smooth skin", "retouch portrait", "fix blemishes" →
83
84
  \`photoshop_recipe_enhance_portrait\`
@@ -93,16 +94,22 @@ User intent glossary
93
94
  - export.social — "for Instagram", "web export" →
94
95
  \`photoshop_recipe_export_social_variants\` or \`photoshop_recipe_prepare_for_web\`
95
96
  - layers.organize — "organize layers", "rename mess" → \`photoshop_recipe_organize_layers\`
97
+ - carousel.split — "seamless carousel", "split panorama", "swipe post", "slayt"
98
+ → \`photoshop_recipe_split_carousel\`
99
+ - batch.watermark — "watermark these photos", "add logo to all", "toplu filigran"
100
+ → \`photoshop_recipe_batch_watermark\`
101
+ - id.passport — "passport photo", "visa photo", "ID photo", "vesikalık", "biyometrik"
102
+ → \`photoshop_recipe_passport_photo\`
96
103
 
97
104
  Degrade paths
98
- - Generative remove / distraction — ideal \`photoshop_generative_remove\` is not
99
- available via ExtendScript. Degrade: user selects region →
100
- \`photoshop_recipe_remove_distraction\` or \`photoshop_content_aware_fill\` →
101
- ask user to refine manually.
102
- - Sky replacement menu — ideal \`photoshop_sky_replacement\` is not scriptable.
103
- Degrade: \`photoshop_recipe_sky_blend\` when a sky file path is available;
104
- otherwise \`photoshop_place_image\` + \`photoshop_create_layer_mask\` +
105
- \`photoshop_apply_gradient_mask\` or guide \`ps.composite_blend\`.
105
+ - Generative remove / distraction — prefer \`photoshop_generative_remove\`; degrade to
106
+ \`photoshop_recipe_remove_distraction\` or \`photoshop_content_aware_fill\` when
107
+ \`generative_unavailable\` or \`generative_credits_exhausted\`.
108
+ - Sky replacement — prefer \`photoshop_sky_replacement\`; degrade:
109
+ \`photoshop_recipe_sky_blend\` when a sky file path is available;
110
+ otherwise \`photoshop_place_image\` + mask workflow or guide \`ps.composite_blend\`.
111
+ - Neural skin / harmonize — \`photoshop_neural_filter\` when \`neural_filters\` is true;
112
+ else frequency separation / manual recipes.
106
113
  - Select Subject v2 missing — \`photoshop_recipe_remove_background\` returns
107
114
  \`version_unsupported\` → manual selection tools + \`photoshop_create_layer_mask\`.
108
115
  - Curves unavailable — use \`photoshop_auto_levels\` then
@@ -123,10 +130,12 @@ Guide prompts (MCP prompts/get)
123
130
  \`ps.enhance_portrait\`, \`ps.prepare_for_web\`, \`ps.export_social_variants\`,
124
131
  \`ps.apply_color_grade\`, \`ps.frequency_separation\`, \`ps.batch_mockup_replace\`,
125
132
  \`ps.organize_layers\`, \`ps.gradient_fade\`, \`ps.sky_blend\`, \`ps.dodge_burn\`,
126
- \`ps.remove_distraction\`
133
+ \`ps.remove_distraction\`, \`ps.split_carousel\`, \`ps.batch_watermark\`,
134
+ \`ps.passport_photo\`
127
135
  - Guide prompts (no recipe pair): \`ps.gradient_blend\` — fade via mask gradient;
128
136
  \`ps.color_correct\` — tone / contrast fix chain; \`ps.dodge_burn_guide\` — 50% gray
129
- overlay setup; \`ps.composite_blend\` — place asset + mask + blend mode
137
+ overlay setup; \`ps.composite_blend\` — place asset + mask + blend mode;
138
+ \`ps.generative_fill\`, \`ps.generative_remove\`, \`ps.generative_expand\` — Firefly workflows
130
139
  `.trim();
131
140
  export function buildPhotoshopInstructions() {
132
141
  return PHOTOSHOP_MCP_INSTRUCTIONS;
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/prompts/instructions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6HzC,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,UAAU,0BAA0B;IACxC,OAAO,0BAA0B,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/prompts/instructions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsIzC,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,UAAU,0BAA0B;IACxC,OAAO,0BAA0B,CAAC;AACpC,CAAC"}