@fps-games/editor-deployment 0.2.3-beta.5 → 0.2.3-beta.7

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 (199) hide show
  1. package/bin/fps-editor-agent.mjs +5 -0
  2. package/bin/fps-editor-prepare.mjs +3 -3
  3. package/bin/fps-editor-project.mjs +14 -14
  4. package/bin/fps-editor-server.mjs +1 -1
  5. package/licenses/THIRD_PARTY_NOTICES.txt +2 -2
  6. package/manifest.json +225 -219
  7. package/npm-shrinkwrap.json +4 -3
  8. package/package.json +7 -6
  9. package/public/assets/animation-BJ8XM1EP.js.gz +0 -0
  10. package/public/assets/animationGroup-nIU37qTl.js.gz +0 -0
  11. package/public/assets/arcRotateCamera-Bpb6_-jM.js.gz +0 -0
  12. package/public/assets/babylon-core-B6Ot-GOK.js.gz +0 -0
  13. package/public/assets/babylon-core-DBdQTkWG.js.gz +0 -0
  14. package/public/assets/basisTextureLoader-xaH1TU2T.js.gz +0 -0
  15. package/public/assets/bumpVertex-CydMViY3.js.gz +0 -0
  16. package/public/assets/bumpVertex-bM0VcD-v.js.gz +0 -0
  17. package/public/assets/chromaticAberration.fragment-2LQpSY6n.js.gz +0 -0
  18. package/public/assets/chromaticAberration.fragment-CPC2jGBk.js.gz +0 -0
  19. package/public/assets/circleOfConfusion.fragment-DWehhKOk.js.gz +0 -0
  20. package/public/assets/circleOfConfusion.fragment-WIeIzKLd.js.gz +0 -0
  21. package/public/assets/clipPlaneFragment-BQiHvjzo.js.gz +0 -0
  22. package/public/assets/clipPlaneVertex-D5EB-X5S.js.gz +0 -0
  23. package/public/assets/color.fragment-0xZe_dSa.js.gz +0 -0
  24. package/public/assets/color.fragment-BQNpLnxa.js.gz +0 -0
  25. package/public/assets/color.vertex-0geH1BI8.js.gz +0 -0
  26. package/public/assets/color.vertex-qtb2-mc5.js.gz +0 -0
  27. package/public/assets/dds-IzbrFkh8.js.gz +0 -0
  28. package/public/assets/ddsTextureLoader-D3ROWbwv.js.gz +0 -0
  29. package/public/assets/default.fragment-BAHNlmD5.js.gz +0 -0
  30. package/public/assets/default.fragment-D3MA9CRV.js.gz +0 -0
  31. package/public/assets/default.vertex-B1KwtIUb.js.gz +0 -0
  32. package/public/assets/default.vertex-Mne8Sq_G.js.gz +0 -0
  33. package/public/assets/defaultUboDeclaration-00t3po2f.js.gz +0 -0
  34. package/public/assets/defaultUboDeclaration-DAuovVEA.js.gz +0 -0
  35. package/public/assets/depth.fragment-Da86gbwP.js.gz +0 -0
  36. package/public/assets/depth.vertex-DPT_V_9f.js.gz +0 -0
  37. package/public/assets/depthBoxBlur.fragment-tYNfbhdh.js.gz +0 -0
  38. package/public/assets/depthBoxBlur.fragment-zrJ9DLe5.js.gz +0 -0
  39. package/public/assets/depthOfFieldMerge.fragment-Car-ami-.js.gz +0 -0
  40. package/public/assets/depthOfFieldMerge.fragment-eO7Ot6AR.js.gz +0 -0
  41. package/public/assets/easing-BdugUZqW.js.gz +0 -0
  42. package/public/assets/editor-core-plugin-host-c2002442.js.gz +0 -0
  43. package/public/assets/exrTextureLoader-DYq9r93V.js.gz +0 -0
  44. package/public/assets/flowGraphArrayIndexBlock-C3zDMjuo.js.gz +0 -0
  45. package/public/assets/flowGraphBezierCurveEasingBlock-DDoK8_8l.js.gz +0 -0
  46. package/public/assets/flowGraphBinaryOperationBlock-BKlR9DS-.js.gz +0 -0
  47. package/public/assets/flowGraphBranchBlock-Bup839Qd.js.gz +0 -0
  48. package/public/assets/flowGraphCachedOperationBlock-DnmbMTY7.js.gz +0 -0
  49. package/public/assets/flowGraphCancelDelayBlock-B9MfNdwj.js.gz +0 -0
  50. package/public/assets/flowGraphCodeExecutionBlock-auEOflkO.js.gz +0 -0
  51. package/public/assets/flowGraphConditionalDataBlock-BAia9WED.js.gz +0 -0
  52. package/public/assets/flowGraphConsoleLogBlock--6MvrOCG.js.gz +0 -0
  53. package/public/assets/flowGraphConstantBlock-FOfDeLIf.js.gz +0 -0
  54. package/public/assets/flowGraphContextBlock-BP5dmyKZ.js.gz +0 -0
  55. package/public/assets/flowGraphCounterBlock-DjKMvUGB.js.gz +0 -0
  56. package/public/assets/flowGraphDataSwitchBlock-gSJm410f.js.gz +0 -0
  57. package/public/assets/flowGraphDebounceBlock-CO5ptvWG.js.gz +0 -0
  58. package/public/assets/flowGraphDoNBlock-Bf26kum1.js.gz +0 -0
  59. package/public/assets/flowGraphEasingBlock-DtnL-aP_.js.gz +0 -0
  60. package/public/assets/flowGraphFlipFlopBlock-Bh_IN41P.js.gz +0 -0
  61. package/public/assets/flowGraphForLoopBlock-C3CLz9Iv.js.gz +0 -0
  62. package/public/assets/flowGraphFunctionReferenceBlock-Bz40tn10.js.gz +0 -0
  63. package/public/assets/flowGraphGetAssetBlock-DYP1H9Hj.js.gz +0 -0
  64. package/public/assets/flowGraphGetPropertyBlock-B6XVNxDR.js.gz +0 -0
  65. package/public/assets/flowGraphGetVariableBlock-BvaNDTu7.js.gz +0 -0
  66. package/public/assets/flowGraphIndexOfBlock-qm1Ab3oN.js.gz +0 -0
  67. package/public/assets/flowGraphInterpolationBlock-CmG25tSZ.js.gz +0 -0
  68. package/public/assets/flowGraphJsonPointerParserBlock-C8rfhc4j.js.gz +0 -0
  69. package/public/assets/flowGraphMathBlocks-BdiMH3MQ.js.gz +0 -0
  70. package/public/assets/flowGraphMathCombineExtractBlocks-CXvPWL3b.js.gz +0 -0
  71. package/public/assets/flowGraphMatrixMathBlocks-Cal7WQ7i.js.gz +0 -0
  72. package/public/assets/flowGraphMeshPickEventBlock-B8EU7KmL.js.gz +0 -0
  73. package/public/assets/flowGraphMultiGateBlock-GMcU5jv7.js.gz +0 -0
  74. package/public/assets/flowGraphPauseAnimationBlock-BKUeGFEQ.js.gz +0 -0
  75. package/public/assets/flowGraphPlayAnimationBlock-vvCkTY_Z.js.gz +0 -0
  76. package/public/assets/flowGraphPointerOutEventBlock-EEJ78HAF.js.gz +0 -0
  77. package/public/assets/flowGraphPointerOverEventBlock-QMzEzISN.js.gz +0 -0
  78. package/public/assets/flowGraphReceiveCustomEventBlock-B5jEx7xE.js.gz +0 -0
  79. package/public/assets/flowGraphSceneReadyEventBlock-MjViOZsL.js.gz +0 -0
  80. package/public/assets/flowGraphSceneTickEventBlock-lyjGPNYo.js.gz +0 -0
  81. package/public/assets/flowGraphSendCustomEventBlock-M0LLhV7D.js.gz +0 -0
  82. package/public/assets/flowGraphSequenceBlock-DocFLI4M.js.gz +0 -0
  83. package/public/assets/flowGraphSetDelayBlock-BDoJj0I_.js.gz +0 -0
  84. package/public/assets/flowGraphSetPropertyBlock-9jao3AHa.js.gz +0 -0
  85. package/public/assets/flowGraphSetVariableBlock-buwJMv9v.js.gz +0 -0
  86. package/public/assets/flowGraphStopAnimationBlock-CDWhmsC8.js.gz +0 -0
  87. package/public/assets/flowGraphSwitchBlock-DG5ReWET.js.gz +0 -0
  88. package/public/assets/flowGraphThrottleBlock-Bgyx9UOo.js.gz +0 -0
  89. package/public/assets/flowGraphTransformCoordinatesSystemBlock-CUUmRj2j.js.gz +0 -0
  90. package/public/assets/flowGraphTypeToTypeBlocks-D7N8ZT_V.js.gz +0 -0
  91. package/public/assets/flowGraphUnaryOperationBlock-Bu73VxMC.js.gz +0 -0
  92. package/public/assets/flowGraphVectorMathBlocks-CqVzbdAw.js.gz +0 -0
  93. package/public/assets/flowGraphWaitAllBlock-xmBmiluG.js.gz +0 -0
  94. package/public/assets/flowGraphWhileLoopBlock-Ct2rHXgO.js.gz +0 -0
  95. package/public/assets/fogFragmentDeclaration-C-9jZMBi.js.gz +0 -0
  96. package/public/assets/fogFragmentDeclaration-CpAbKvc3.js.gz +0 -0
  97. package/public/assets/glowBlurPostProcess.fragment-C77x1kl1.js.gz +0 -0
  98. package/public/assets/glowBlurPostProcess.fragment-C7miknry.js.gz +0 -0
  99. package/public/assets/glowMapGeneration.fragment-BAqrUGS4.js.gz +0 -0
  100. package/public/assets/glowMapGeneration.fragment-CMvy-ILZ.js.gz +0 -0
  101. package/public/assets/glowMapGeneration.vertex-BThT8Jce.js.gz +0 -0
  102. package/public/assets/glowMapGeneration.vertex-mq9WR5EZ.js.gz +0 -0
  103. package/public/assets/glowMapMerge.fragment-BtMIQDli.js.gz +0 -0
  104. package/public/assets/glowMapMerge.fragment-CYj1SIfc.js.gz +0 -0
  105. package/public/assets/glowMapMerge.vertex-BilMgMCX.js.gz +0 -0
  106. package/public/assets/glowMapMerge.vertex-ChJNqQPz.js.gz +0 -0
  107. package/public/assets/grain.fragment-D6WdAOpZ.js.gz +0 -0
  108. package/public/assets/grain.fragment-DCpxKIZw.js.gz +0 -0
  109. package/public/assets/harmonicsFunctions-B5nauyTb.js.gz +0 -0
  110. package/public/assets/harmonicsFunctions-DVIRrUZs.js.gz +0 -0
  111. package/public/assets/hdrTextureLoader-Dfs_Fv5B.js.gz +0 -0
  112. package/public/assets/hemisphericLight-BkYyeXbK.js.gz +0 -0
  113. package/public/assets/iesTextureLoader-I2E-BXCc.js.gz +0 -0
  114. package/public/assets/index-CzHwtW4R.js.gz +0 -0
  115. package/public/assets/index-Dk6-vu7X.js +1 -0
  116. package/public/assets/index-Dk6-vu7X.js.br +0 -0
  117. package/public/assets/index-Dk6-vu7X.js.gz +0 -0
  118. package/public/assets/instancesDeclaration-DcwHJpHY.js.gz +0 -0
  119. package/public/assets/ktxTextureLoader-zpgT--10.js.gz +0 -0
  120. package/public/assets/lazy-CI-V5lCV.js.gz +0 -0
  121. package/public/assets/lod.fragment-B28SQFUx.js.gz +0 -0
  122. package/public/assets/lod.fragment-DOjU_E37.js.gz +0 -0
  123. package/public/assets/lodCube.fragment-B_ALsGmh.js.gz +0 -0
  124. package/public/assets/lodCube.fragment-CzeVIOa3.js.gz +0 -0
  125. package/public/assets/logDepthFragment-BaJ2YjZ0.js.gz +0 -0
  126. package/public/assets/logDepthVertex-B8jNoEwN.js.gz +0 -0
  127. package/public/assets/logDepthVertex-xgQTn7wg.js.gz +0 -0
  128. package/public/assets/mesh.vertexData.functions-BXkNVxNr.js.gz +0 -0
  129. package/public/assets/meshUboDeclaration-C5p-TivH.js.gz +0 -0
  130. package/public/assets/meshUboDeclaration-DKldQKni.js.gz +0 -0
  131. package/public/assets/morphTargetsVertex-BDbfSote.js.gz +0 -0
  132. package/public/assets/oitFinalSimpleBlend.fragment-DtE63qrD.js.gz +0 -0
  133. package/public/assets/oitFinalSimpleBlend.fragment-ZwpH3v_v.js.gz +0 -0
  134. package/public/assets/oitFragment-B8hFhX-8.js.gz +0 -0
  135. package/public/assets/oitFragment-B_HlWcYZ.js.gz +0 -0
  136. package/public/assets/openpbrMaterial-t_lYoXh4.js.gz +0 -0
  137. package/public/assets/outline.fragment-DEsg98mo.js.gz +0 -0
  138. package/public/assets/outline.fragment-WqsugjI-.js.gz +0 -0
  139. package/public/assets/outline.vertex-CVL3AfNh.js.gz +0 -0
  140. package/public/assets/outline.vertex-CtQ-HC3X.js.gz +0 -0
  141. package/public/assets/passCube.fragment-CHI4OPgd.js.gz +0 -0
  142. package/public/assets/passCube.fragment-DLbzh6pI.js.gz +0 -0
  143. package/public/assets/pbr.fragment-DHPEcGrm.js.gz +0 -0
  144. package/public/assets/pbr.fragment-KiX_RvyZ.js.gz +0 -0
  145. package/public/assets/pbr.vertex-CVSRg4tx.js.gz +0 -0
  146. package/public/assets/pbr.vertex-Dp30Rtkl.js.gz +0 -0
  147. package/public/assets/playable-sdk-Cz5ms1M8.js +8 -0
  148. package/public/assets/playable-sdk-Cz5ms1M8.js.br +0 -0
  149. package/public/assets/playable-sdk-Cz5ms1M8.js.gz +0 -0
  150. package/public/assets/playable-standard-project-CgBNJ6kY.js +5070 -0
  151. package/public/assets/playable-standard-project-CgBNJ6kY.js.br +0 -0
  152. package/public/assets/playable-standard-project-CgBNJ6kY.js.gz +0 -0
  153. package/public/assets/rgbdDecode.fragment-CU4ChTYE.js.gz +0 -0
  154. package/public/assets/rgbdDecode.fragment-DhrCd3U4.js.gz +0 -0
  155. package/public/assets/rgbdEncode.fragment-Bt1zaovT.js.gz +0 -0
  156. package/public/assets/rgbdEncode.fragment-CfKDkRU3.js.gz +0 -0
  157. package/public/assets/sceneLoader-DS5g2vTC.js.gz +0 -0
  158. package/public/assets/screenSpaceCurvature.fragment-Od67z-rQ.js.gz +0 -0
  159. package/public/assets/selection.fragment-CRMhdE35.js.gz +0 -0
  160. package/public/assets/selection.fragment-cSqXB6nx.js.gz +0 -0
  161. package/public/assets/selection.vertex-B5sPJWi2.js.gz +0 -0
  162. package/public/assets/selection.vertex-Dp4qd1GF.js.gz +0 -0
  163. package/public/assets/selectionOutline.fragment-CaYdhbIY.js.gz +0 -0
  164. package/public/assets/selectionOutline.fragment-RBpUe89m.js.gz +0 -0
  165. package/public/assets/shadowMap.fragment-BecpzSny.js.gz +0 -0
  166. package/public/assets/shadowMap.fragment-BhrOFpmK.js.gz +0 -0
  167. package/public/assets/shadowMap.vertex-DV4Ec23Y.js.gz +0 -0
  168. package/public/assets/shadowMap.vertex-Dpx2-6XS.js.gz +0 -0
  169. package/public/assets/shadowMapFragmentSoftTransparentShadow-BHumE7-J.js.gz +0 -0
  170. package/public/assets/shadowMapFragmentSoftTransparentShadow-CrPC6Hns.js.gz +0 -0
  171. package/public/assets/sharpen.fragment-CPdQPlDe.js.gz +0 -0
  172. package/public/assets/textureMerger.fragment-BNxx2w1v.js.gz +0 -0
  173. package/public/assets/textureMerger.fragment-CPq4n9w5.js.gz +0 -0
  174. package/public/assets/tgaTextureLoader-B7dlONGx.js.gz +0 -0
  175. package/public/assets/vertexColorMixing-BUQkJeP0.js.gz +0 -0
  176. package/public/assets/vertexColorMixing-Co5x3WYA.js.gz +0 -0
  177. package/public/assets/volumetricLightingBlendVolume.fragment-D01l1w1u.js.gz +0 -0
  178. package/public/assets/volumetricLightingBlendVolume.fragment-Dq5kceRW.js.gz +0 -0
  179. package/public/assets/volumetricLightingRenderVolume.fragment-BCxtzv0C.js.gz +0 -0
  180. package/public/assets/volumetricLightingRenderVolume.fragment-DwEKCs2S.js.gz +0 -0
  181. package/public/assets/volumetricLightingRenderVolume.vertex-CNPaSIo7.js.gz +0 -0
  182. package/public/assets/volumetricLightingRenderVolume.vertex-EiQlWi_X.js.gz +0 -0
  183. package/public/assets/webAudioBus-DYpSKoOA.js.gz +0 -0
  184. package/public/assets/webAudioMainBus-CP3f56US.js.gz +0 -0
  185. package/public/assets/workerPool-H9Ji3mCo.js.gz +0 -0
  186. package/public/index.html +3 -3
  187. package/public/index.html.br +0 -0
  188. package/public/index.html.gz +0 -0
  189. package/runtime/editor-control-plane.mjs +3 -3
  190. package/worker/editor-service-worker.mjs +23 -23
  191. package/public/assets/index-ZnhNI5EO.js +0 -1
  192. package/public/assets/index-ZnhNI5EO.js.br +0 -0
  193. package/public/assets/index-ZnhNI5EO.js.gz +0 -0
  194. package/public/assets/playable-sdk-D6RL-8B7.js +0 -135
  195. package/public/assets/playable-sdk-D6RL-8B7.js.br +0 -0
  196. package/public/assets/playable-sdk-D6RL-8B7.js.gz +0 -0
  197. package/public/assets/playable-standard-project-CkKWpnr-.js +0 -4943
  198. package/public/assets/playable-standard-project-CkKWpnr-.js.br +0 -0
  199. package/public/assets/playable-standard-project-CkKWpnr-.js.gz +0 -0
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import{randomUUID as N}from"node:crypto";import{constants as ge,createReadStream as he}from"node:fs";import{access as ve,readFile as H,realpath as Y,stat as ye}from"node:fs/promises";import b from"node:path";var He=8*1024*1024,J=128,G=256*1024;var c=Object.freeze({ok:0,usage:2,discovery:3,unavailable:4,conflict:5,execution:6,running:7,interrupted:130}),U=1024*1024,B=3e4,F=b.join(".fps-editor","state","agent-runtime.json"),X=Object.freeze({kind:"fps-editor-agent-deadline"}),q=!1,te=Number.POSITIVE_INFINITY,ne=B,T=new AbortController;process.once("SIGINT",()=>{q=!0,T.abort(),process.exitCode=c.interrupted,setTimeout(()=>process.exit(c.interrupted),25).unref?.()});we().catch(e=>{let t=q?P():me(e);I(t.result??{ok:!1,error:{code:t.code,message:t.message}}),t.log!==!1&&process.stderr.write(`[fps-editor-agent] ${t.message}
3
+ `),process.exitCode=t.exitCode});async function we(){let e=De(process.argv.slice(2)),t=e.argv,n=e.projectRoot??process.cwd(),i=e.projectRoot!==void 0;if(ne=e.deadlineMs,te=Date.now()+e.deadlineMs,t.length===0||t.includes("--help")||t[0]==="help"){I({ok:!0,usage:Ue()});return}if(t.includes("--version")){let o=JSON.parse(await H(new URL("../package.json",import.meta.url),"utf8"));I({ok:!0,package:o.name,version:o.version,protocolVersion:2});return}let s=t.shift();if(s==="doctor"){let o=await se(n,{validateService:!1,exactProjectRoot:i}),u=await ce(o),r=await(await Q(n,{exactProjectRoot:i})).request({kind:"status"});I({ok:!0,descriptorPath:o.descriptorPath,projectRoot:o.projectRoot,checks:u,status:r.status});return}let a=await Q(n,{exactProjectRoot:i});if(s==="status"){I(await a.request({kind:"status"}));return}if(s==="commands"){await Re(a,t);return}if(s==="command"){await Se(a,t);return}if(s==="transaction"){await Oe(a,t);return}if(s==="apply"){await Ee(a,t);return}if(s==="operation"){await _e(a,t);return}if(s==="trace"){await Ae(a,t);return}throw d(`Unknown command: ${String(s)}`)}async function Re(e,t){let n=t.shift();if(n==="describe"){let o=D(t,"command id");de(t),I(await e.request({kind:"commands.describe",commandId:o}));return}let i=_(t,new Set(["--cursor","--limit"])),s=m(i.options,"--cursor"),a=R(i.options,"--limit",{minimum:1});if(n==="list"){if(i.positionals.length)throw d("commands list does not accept positional arguments.");I(await e.request({kind:"commands.list",...s?{cursor:s}:{},...a?{limit:a}:{}}));return}if(n==="search"){let o=D(i.positionals,"search query");if(i.positionals.length)throw d("commands search accepts one query.");I(await e.request({kind:"commands.search",query:o,...s?{cursor:s}:{},...a?{limit:a}:{}}));return}throw d("commands requires list, search, or describe.")}async function Se(e,t){let n=_(t,new Set(["--stdin","--input-file","--input-json","--expected-revision","--idempotency-key","--request-id","--timeout","--trace-id","--client-id"]),new Set(["--stdin"])),i=D(n.positionals,"command id");if(n.positionals.length)throw d("command accepts one command id.");let s=await ke(n.options),a=await e.request({kind:"commands.describe",commandId:i}),o=a.ok&&a.kind==="command"?a.command:null;if(!o)throw p(c.unavailable,"command.unknown",`Editor command is not registered: ${i}`);if(!o.availability.available)throw p(c.unavailable,"command.unavailable",o.availability.reasons.map(v=>v.message).join("; ")||`Editor command is unavailable: ${i}`);let u=R(n.options,"--expected-revision",{minimum:0}),l=e.serviceInstanceId;if(o.manifest.access==="write"&&u===void 0){let v=await e.request({kind:"status"});u=v.status.documentRevision,l=v.status.serviceInstanceId}let r=m(n.options,"--request-id")??N(),g=m(n.options,"--idempotency-key")??(o.manifest.access==="write"?N():void 0),y=R(n.options,"--timeout",{minimum:0}),f=await e.request({kind:"command.invoke",invocation:{commandId:i,input:s,requestId:r,...g?{idempotencyKey:g}:{},...u!==void 0?{expectedRevision:{serviceInstanceId:l,document:u}}:{},principal:{type:"agent",id:"fps-editor-agent"},source:"agent-cli",...m(n.options,"--trace-id")?{traceId:m(n.options,"--trace-id")}:{},...m(n.options,"--client-id")?{clientId:m(n.options,"--client-id")}:{}},...y!==void 0?{timeoutMs:y}:{}});I(f),j(f.operation)}async function Oe(e,t){let n=t.shift();if(n==="begin"){let o=_(t,new Set(["--expected-revision","--label","--transaction-id","--trace-id","--service-instance-id"]));if(o.positionals.length)throw d("transaction begin does not accept positional arguments.");let u=await ie(e),l=m(o.options,"--transaction-id")??N(),r=await e.request({kind:"transaction.begin",serviceInstanceId:m(o.options,"--service-instance-id")??u.serviceInstanceId,expectedDocumentRevision:R(o.options,"--expected-revision",{minimum:0})??u.documentRevision,...m(o.options,"--label")?{label:m(o.options,"--label")}:{},transactionId:l,...m(o.options,"--trace-id")?{traceId:m(o.options,"--trace-id")}:{}});I(r),k(r.transaction);return}let i=_(t,new Set(["--service-instance-id","--sequence","--stdin","--input-file","--cursor","--limit"]),new Set(["--stdin"])),s=D(i.positionals,"transaction id");if(i.positionals.length)throw d(`transaction ${String(n)} accepts one transaction id.`);let a=m(i.options,"--service-instance-id")??e.serviceInstanceId;if(n==="append"){$(i.options,new Set(["--service-instance-id","--sequence","--stdin","--input-file"]));let o=R(i.options,"--sequence",{minimum:0});o===void 0&&(o=(await e.request({kind:"transaction.get",transactionId:s,serviceInstanceId:a,limit:1})).transaction.acceptedOperations);let u,l=oe(i.options);await re({client:e,source:l,transactionId:s,serviceInstanceId:a,sequence:o,maxOperations:e.status.transactions.maxOperationsPerAppend,maxBytes:e.status.transactions.maxBytesPerAppend,onAppend(r){u=r,I(r)}}),k(u?.transaction);return}if(n==="preflight"||n==="commit"||n==="abort"){$(i.options,new Set(["--service-instance-id"]));let o=await e.request({kind:`transaction.${n}`,transactionId:s,serviceInstanceId:a});I(o),k(o.transaction,{abortedIsSuccess:n==="abort"});return}if(n==="get"){$(i.options,new Set(["--service-instance-id","--cursor","--limit"]));let o=await e.request({kind:"transaction.get",transactionId:s,serviceInstanceId:a,...m(i.options,"--cursor")?{cursor:m(i.options,"--cursor")}:{},...R(i.options,"--limit",{minimum:1})?{limit:R(i.options,"--limit",{minimum:1})}:{}});I(o),k(o.transaction);return}throw d("transaction requires begin, append, preflight, commit, get, or abort.")}async function Ee(e,t){let n=_(t,new Set(["--stdin","--input-file","--save","--expected-revision","--label","--transaction-id","--trace-id","--service-instance-id","--timeout"]),new Set(["--stdin","--save"]));if(n.positionals.length)throw d("apply does not accept positional arguments.");let i=await ie(e),s=m(n.options,"--service-instance-id")??i.serviceInstanceId,a=R(n.options,"--expected-revision",{minimum:0})??i.documentRevision,o=R(n.options,"--timeout",{minimum:0}),u=m(n.options,"--transaction-id")??N(),l=m(n.options,"--trace-id"),r,g="begin";try{r=(await e.request({kind:"transaction.begin",serviceInstanceId:s,expectedDocumentRevision:a,transactionId:u,...m(n.options,"--label")?{label:m(n.options,"--label")}:{},...l?{traceId:l}:{}})).transaction,C("begin",r),g="append";let f=oe(n.options);if(await re({client:e,source:f,transactionId:r.transactionId,serviceInstanceId:r.serviceInstanceId,sequence:r.acceptedOperations,maxOperations:i.transactions.maxOperationsPerAppend,maxBytes:i.transactions.maxBytesPerAppend,onAppend(Ie){r=Ie.transaction,C("append",r)}}),g="commit",r=(await e.request({kind:"transaction.commit",transactionId:r.transactionId,serviceInstanceId:r.serviceInstanceId})).transaction,C("commit",r),r.state!=="working_committed"){O(!1,"commit_failed",r),k(r);return}if(!n.options.has("--save")){O(!0,"working_committed",r);return}g="document.export";let h=await z(e,{commandId:"document.export",input:{},expectedDocumentRevision:r.workingDocumentRevision,serviceInstanceId:r.serviceInstanceId,transactionId:r.transactionId,traceId:l,timeoutMs:o});if(W("document.export",r,h.operation),h.operation?.status==="accepted"||h.operation?.status==="running"){O(!1,"awaiting_export_operation",r,{operation:E(h.operation),allowedActions:["operation.get","transaction.get"],retry:{retryable:!0,requiresRebase:!1}}),process.exitCode=c.running;return}if(h.operation?.status!=="completed"){O(!1,"save_failed",r,{operation:E(h.operation),allowedActions:["command document.export","transaction.get"],retry:{retryable:!0,requiresRebase:!1}}),j(h.operation);return}let w=h.operation.output;if(!w||typeof w!="object"||Array.isArray(w))throw p(c.execution,"document.exportReceiptInvalid","document.export returned an invalid receipt.");if(w.persistedByEditor===!1){O(!1,"awaiting_persistence_confirmation",r,{operation:E(h.operation),allowedActions:["operation.get","transaction.get"],retry:{retryable:!0,requiresRebase:!1}}),process.exitCode=c.running;return}let x=typeof w.transactionId=="string"&&w.transactionId.trim()?w.transactionId:null;if(!x)throw p(c.execution,"document.exportReceiptInvalid","document.export receipt is missing transactionId.");g="document.commit";let fe=Number.isSafeInteger(w.documentRevision)?w.documentRevision:r.workingDocumentRevision,S=await z(e,{commandId:"document.commit",input:{transactionId:x},expectedDocumentRevision:fe,serviceInstanceId:r.serviceInstanceId,transactionId:r.transactionId,traceId:l,timeoutMs:o});if(W("document.commit",r,S.operation),S.operation?.status==="accepted"||S.operation?.status==="running"){O(!1,"awaiting_commit_operation",r,{saveTransactionId:x,operation:E(S.operation),allowedActions:["operation.get","transaction.get"],retry:{retryable:!0,requiresRebase:!1}}),process.exitCode=c.running;return}if(S.operation?.status!=="completed"){O(!1,"save_commit_failed",r,{saveTransactionId:x,operation:E(S.operation),allowedActions:["command document.commit","transaction.get"],retry:{retryable:!0,requiresRebase:!1}}),j(S.operation);return}O(!0,"saved",r,{saveTransactionId:x,operation:E(S.operation),receipt:be(S.operation.output)})}catch(y){let f=me(y);if(f.result?.kind==="cli.deadline"){I({...f.result,kind:"apply.result",phase:g,...r?{transaction:A(r)}:{}}),process.exitCode=f.exitCode;return}let v;if(r&&(r.state==="open"||r.state==="preflighted"))try{r=(await e.request({kind:"transaction.abort",transactionId:r.transactionId,serviceInstanceId:r.serviceInstanceId})).transaction,v=A(r),C("abort",r)}catch{}I({ok:!1,kind:"apply.result",state:r?.state==="working_committed"?"save_failed":"failed",phase:g,...r?{transaction:A(r)}:{},...v?{aborted:v}:{},error:{code:f.code,message:f.message},allowedActions:r?.state==="working_committed"?["command document.export","transaction.get"]:["status"],retry:{retryable:r?.state==="working_committed",requiresRebase:/revision|serviceInstance/i.test(f.code)}}),process.exitCode=f.exitCode}}async function ie(e){let t=await e.request({kind:"status"});if(t.kind!=="status"||!t.status)throw p(c.discovery,"protocol.statusInvalid","Editor Service returned an invalid status response.");return t.status}function oe(e){if(["--stdin","--input-file"].filter(i=>e.has(i)).length>1)throw d("Use only one of --stdin or --input-file.");let n=m(e,"--input-file");return!n||n==="-"?process.stdin:he(b.resolve(n),{encoding:"utf8"})}async function re(e){let t=K(e.maxOperations,J),n=K(e.maxBytes,G),i=[],s=2,a=e.sequence,o=0,u=0,l=async()=>{if(i.length===0)return;let r=i.length,g=await e.client.request({kind:"transaction.append",transactionId:e.transactionId,serviceInstanceId:e.serviceInstanceId,sequence:a,operations:i});if(g.kind!=="transaction"||g.transaction.acceptedOperations<a+r)throw p(c.execution,"transaction.appendReceiptInvalid","Editor Service returned an invalid append receipt.");a=g.transaction.acceptedOperations,o+=r,e.onAppend(g),i=[],s=2};for await(let r of Me(e.source,T.signal,n)){u+=1;let g=r.endsWith("\r")?r.slice(0,-1):r;if(!g.trim())continue;let y;try{y=JSON.parse(g)}catch(w){throw d(`NDJSON line ${u} is not valid JSON: ${w instanceof Error?w.message:String(w)}`)}Te(y,u);let f=JSON.stringify(y),v=Buffer.byteLength(f);if(v+2>n)throw d(`NDJSON line ${u} exceeds the ${n}-byte transaction append limit.`);let h=s+v+(i.length?1:0);i.length&&(i.length>=t||h>n)&&await l(),i.push(y),s+=v+(i.length>1?1:0),(i.length>=t||s>=n)&&await l()}if(await l(),o===0)throw d("Transaction input must contain at least one NDJSON operation.");return{acceptedOperations:o,nextSequence:a}}function Te(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw d(`NDJSON line ${t} must be a transaction operation object.`);if(typeof e.opId!="string"||!e.opId.trim())throw d(`NDJSON line ${t} requires a non-empty opId.`);if(typeof e.commandId!="string"||!e.commandId.trim())throw d(`NDJSON line ${t} requires a non-empty commandId.`);if(e.as!==void 0&&(typeof e.as!="string"||!e.as.trim()))throw d(`NDJSON line ${t} as must be a non-empty string.`)}async function z(e,t){let n=await e.request({kind:"commands.describe",commandId:t.commandId}),i=n.kind==="command"?n.command:null;if(!i)throw p(c.unavailable,"command.unknown",`Editor command is not registered: ${t.commandId}`);if(!i.availability.available)throw p(c.unavailable,"command.unavailable",i.availability.reasons.map(o=>o.message).join("; ")||`Editor command is unavailable: ${t.commandId}`);let s=await e.request({kind:"command.invoke",invocation:{commandId:t.commandId,input:t.input,requestId:N(),idempotencyKey:N(),expectedRevision:{serviceInstanceId:t.serviceInstanceId,...t.expectedDocumentRevision===void 0?{}:{document:t.expectedDocumentRevision}},principal:{type:"agent",id:"fps-editor-agent"},source:"agent-cli",transactionId:t.transactionId,...t.traceId?{traceId:t.traceId}:{}},...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}),a=s.operation;return a&&!pe(a.status)&&(a=(await e.request({kind:"operation.get",operationId:a.operationId})).operation??a),{response:s,operation:a}}function C(e,t){I({ok:t.state!=="failed",kind:"apply.event",phase:e,state:t.state,transaction:A(t)})}function W(e,t,n){I({ok:n?.status!=="failed"&&n?.status!=="cancelled",kind:"apply.event",phase:e,state:n?.status??"unavailable",transaction:A(t),operation:E(n)})}function O(e,t,n,i={}){I({ok:e,kind:"apply.result",state:t,phase:t==="saved"?"complete":n.phase,transaction:A(n),...i.allowedActions?{}:{allowedActions:n.allowedActions},...i.retry?{}:{retry:n.retry},...i})}function A(e){return{transactionId:e.transactionId,serviceInstanceId:e.serviceInstanceId,state:e.state,phase:e.phase,baseDocumentRevision:e.baseDocumentRevision,...e.workingDocumentRevision===void 0?{}:{workingDocumentRevision:e.workingDocumentRevision},dirty:e.dirty,acceptedOperations:e.acceptedOperations,acceptedBytes:e.acceptedBytes,processedOperations:e.processedOperations,allowedActions:e.allowedActions,retry:e.retry,diagnostics:e.diagnostics,results:{offset:e.results.offset,returned:e.results.returned,total:e.results.total,...e.results.nextCursor?{nextCursor:e.results.nextCursor}:{}}}}function E(e){return e?{operationId:e.operationId,requestId:e.requestId,commandId:e.commandId,status:e.status,...e.transactionId?{transactionId:e.transactionId}:{},...e.traceId?{traceId:e.traceId}:{},...e.output===void 0?{}:{output:e.output},...e.diagnostics?{diagnostics:e.diagnostics}:{}}:null}function be(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function K(e,t){return Number.isSafeInteger(e)&&e>0?e:t}async function _e(e,t){let n=t.shift();if(n==="get"){let i=_(t,new Set(["--request-id","--service-instance-id"])),s=i.positionals.shift();if(i.positionals.length)throw d("operation get accepts at most one operation id.");let a=m(i.options,"--request-id");if(!s&&!a||s&&a)throw d("operation get requires exactly one operation id or --request-id.");let o=m(i.options,"--service-instance-id");if(o&&o!==e.serviceInstanceId)throw p(c.conflict,"operation.serviceInstanceChanged",`Expected Editor Service ${o}, received ${e.serviceInstanceId}.`);let u=await e.request(s?{kind:"operation.get",operationId:s}:{kind:"operation.get",requestId:a});I(u),u.operation?j(u.operation):process.exitCode=c.unavailable;return}if(n==="cancel"){let i=D(t,"operation id");de(t);let s=await e.request({kind:"operation.cancel",operationId:i});I(s),s.operation?!s.cancelled&&!pe(s.operation.status)&&(process.exitCode=c.running):process.exitCode=c.unavailable;return}throw d("operation requires get or cancel.")}async function Ae(e,t){if(t.shift()!=="get")throw d("trace requires get.");let i=_(t,new Set(["--cursor","--limit"])),s=i.positionals.shift();if(i.positionals.length)throw d("trace get accepts at most one trace id.");I(await e.request({kind:"trace.get",...s?{traceId:s}:{},...m(i.options,"--cursor")?{cursor:m(i.options,"--cursor")}:{},...R(i.options,"--limit",{minimum:1})?{limit:R(i.options,"--limit",{minimum:1})}:{}}))}async function Q(e,t={}){let n=await se(e,{validateService:!0,...t}),i=ae(process.env.FPS_EDITOR_AGENT_ENDPOINT?.trim()||n.descriptor.endpoint),s=process.env.FPS_EDITOR_AGENT_TOKEN?.trim()||n.descriptor.token,a=async u=>{if(q)throw p(c.interrupted,"cli.interrupted","Interrupted.");let l=te-Date.now();if(l<=0)throw Z(n,u);let r=new AbortController,g=()=>r.abort(T.signal.reason);T.signal.addEventListener("abort",g,{once:!0});let y=setTimeout(()=>r.abort(X),l);y.unref?.();try{let f=await fetch(i,{method:"POST",headers:{authorization:`Bearer ${s}`,"content-type":"application/json"},body:JSON.stringify(u),signal:r.signal}),v=await je(f),h;try{h=JSON.parse(v)}catch{throw p(c.discovery,"protocol.invalidJson","Editor Service returned invalid JSON.")}if(f.status===401||f.status===403)throw p(c.discovery,"auth.invalidToken",ue(h)||"Editor Service authentication failed.");if(!h?.ok)throw Ce(h);return h}catch(f){throw q||T.signal.aborted?P():r.signal.reason===X?Z(n,u):f&&Number.isInteger(f.exitCode)?f:p(c.discovery,"service.unreachable",`Editor Service is unreachable: ${f instanceof Error?f.message:String(f)}`)}finally{clearTimeout(y),T.signal.removeEventListener("abort",g)}},o=await a({kind:"status"});return xe(n,o),Object.freeze({discovery:n,serviceInstanceId:n.descriptor.serviceInstanceId,status:o.status,request:a})}async function se(e,t={}){let n;try{n=await Y(b.resolve(e))}catch(i){throw p(c.discovery,"projectRoot.invalid",`Project root is unavailable: ${i instanceof Error?i.message:String(i)}`)}for(;;){let i=b.join(n,F);if(await Pe(i)){let a=await Ne(i),o=await Y(n);if(a.canonicalProjectRoot!==o)throw p(c.discovery,"descriptor.projectMismatch",`Runtime descriptor does not own ${o}.`);let u={descriptorPath:i,projectRoot:o,descriptor:a};return t.validateService!==!1&&await ce(u),u}if(t.exactProjectRoot===!0)break;let s=b.dirname(n);if(s===n)break;n=s}throw p(c.discovery,"descriptor.notFound",`No ${F} was found from ${e}.`)}async function Ne(e){let t;try{t=JSON.parse(await H(e,"utf8"))}catch(n){throw p(c.discovery,"descriptor.invalid",`Runtime descriptor is unreadable: ${n instanceof Error?n.message:String(n)}`)}if(t?.schemaVersion!==1||t?.protocolVersion!==2||t?.packageName!=="@fps-games/editor"||typeof t?.serviceInstanceId!="string"||typeof t?.canonicalProjectRoot!="string"||typeof t?.endpoint!="string"||typeof t?.token!="string"||!Number.isSafeInteger(t?.pid))throw p(c.discovery,"descriptor.incompatible","Runtime descriptor schema or protocol is incompatible.");if(ae(t.endpoint),process.platform!=="win32"){let n=(await ye(e)).mode&511;if(n&63)throw p(c.discovery,"descriptor.permissions",`Runtime descriptor permissions must be 0600; received ${n.toString(8)}.`)}return t}function ae(e){let t;try{t=new URL(e)}catch{throw p(c.discovery,"descriptor.endpoint","Runtime descriptor endpoint is invalid.")}if(t.protocol!=="http:"||!["127.0.0.1","localhost","[::1]"].includes(t.hostname))throw p(c.discovery,"descriptor.endpoint","Runtime descriptor endpoint must be project-local loopback HTTP.");return t.toString()}async function ce(e){let t=[];t.push({id:"descriptor.schema",ok:e.descriptor.schemaVersion===1}),t.push({id:"descriptor.protocol",ok:e.descriptor.protocolVersion===2}),t.push({id:"descriptor.project",ok:e.descriptor.canonicalProjectRoot===e.projectRoot});let n=qe(e.descriptor.pid);if(t.push({id:"descriptor.process",ok:n,pid:e.descriptor.pid}),!n)throw p(c.discovery,"descriptor.stale",`Editor Service process is not alive: ${e.descriptor.pid}.`);return t}function xe(e,t){let n=t?.kind==="status"?t.status:null;if(!n||n.protocolVersion!==2)throw p(c.discovery,"protocol.incompatible","Editor Service status protocol is incompatible.");if(n.serviceInstanceId!==e.descriptor.serviceInstanceId||n.canonicalProjectRoot!==e.projectRoot||n.packageVersion!==e.descriptor.packageVersion||n.buildKey!==e.descriptor.buildKey)throw p(c.discovery,"service.identityMismatch","Editor Service identity does not match the project runtime descriptor.")}async function ke(e){if(["--stdin","--input-file","--input-json"].filter(s=>e.has(s)).length>1)throw d("Use only one of --stdin, --input-file, or --input-json.");if(e.has("--stdin"))return M(await Le(process.stdin,T.signal),"--stdin");let n=m(e,"--input-file");if(n)return M(await H(b.resolve(n),"utf8"),"--input-file");let i=m(e,"--input-json");return i===void 0?{}:M(i,"--input-json")}function M(e,t){try{return JSON.parse(e)}catch(n){throw d(`${t} is not valid JSON: ${n instanceof Error?n.message:String(n)}`)}}function _(e,t,n=new Set){let i=new Map,s=[];for(;e.length;){let a=e.shift();if(!a.startsWith("--")){s.push(a);continue}let[o,u]=a.split("=",2);if(!t.has(o))throw d(`Unknown option: ${o}`);if(i.has(o))throw d(`Option may only be provided once: ${o}`);if(n.has(o)){if(u!==void 0)throw d(`${o} does not accept a value.`);i.set(o,!0);continue}let l=u??e.shift();if(l===void 0||l.startsWith("--"))throw d(`${o} requires a value.`);i.set(o,l)}return{options:i,positionals:s}}function m(e,t){let n=e.get(t);if(n!==void 0){if(typeof n!="string"||!n.trim())throw d(`${t} requires a non-empty value.`);return n.trim()}}function De(e){let t=[],n=B,i=!1,s;for(let a=0;a<e.length;a+=1){let o=e[a];if(o==="--project-root"||o.startsWith("--project-root=")){if(s!==void 0)throw d("--project-root may only be provided once.");let r=o==="--project-root"?e[++a]:o.slice(15);if(r===void 0||!r.trim()||r.startsWith("--"))throw d("--project-root requires a non-empty path.");s=b.resolve(process.cwd(),r);continue}if(o!=="--deadline"&&!o.startsWith("--deadline=")){t.push(o);continue}if(i)throw d("--deadline may only be provided once.");i=!0;let u=o==="--deadline"?e[++a]:o.slice(11);if(u===void 0||u.startsWith("--"))throw d("--deadline requires a value.");let l=Number(u);if(!Number.isSafeInteger(l)||l<1)throw d("--deadline must be an integer >= 1.");n=l}return{argv:t,deadlineMs:n,projectRoot:s}}function R(e,t,{minimum:n}){let i=m(e,t);if(i===void 0)return;let s=Number(i);if(!Number.isSafeInteger(s)||s<n)throw d(`${t} must be an integer >= ${n}.`);return s}function D(e,t){let n=e.shift();if(!n)throw d(`Missing ${t}.`);return n}function de(e){if(e.length)throw d(`Unexpected argument: ${e[0]}`)}function $(e,t){for(let n of e.keys())if(!t.has(n))throw d(`Option is not valid for this action: ${n}`)}function j(e){if(!e){process.exitCode=c.unavailable;return}if(e.status==="accepted"||e.status==="running"){process.exitCode=c.running;return}(e.status==="failed"||e.status==="cancelled")&&(process.exitCode=V(e.diagnostics))}function k(e,t={}){if(!e){process.exitCode=c.unavailable;return}if(e.state==="preflighting"||e.state==="committing"){process.exitCode=c.running;return}if(e.state==="failed"){process.exitCode=V(e.diagnostics);return}e.state==="aborted"&&t.abortedIsSuccess!==!0&&(process.exitCode=c.execution)}function V(e=[]){let t=e.map(n=>n?.code??"");return t.some(n=>/revision|idempotency|conflict|serviceInstance/i.test(n))?c.conflict:t.some(n=>/unknown|unavailable|notFound|sessionUnavailable/i.test(n))?c.unavailable:c.execution}function Ce(e){let t=Array.isArray(e?.diagnostics)?e.diagnostics:[];return p(V(t),t[0]?.code??"service.requestFailed",ue(e)||"Editor Service request failed.")}function ue(e){return Array.isArray(e?.diagnostics)?e.diagnostics.map(t=>t?.message).filter(Boolean).join("; "):""}function qe(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}function pe(e){return e==="completed"||e==="failed"||e==="cancelled"}async function je(e){let t=Number(e.headers.get("content-length"));if(Number.isFinite(t)&&t>U)throw p(c.execution,"response.tooLarge","Editor Service response exceeds 1 MiB.");let n=await e.text();if(Buffer.byteLength(n)>U)throw p(c.execution,"response.tooLarge","Editor Service response exceeds 1 MiB.");return n}async function Pe(e){try{return await ve(e,ge.R_OK),!0}catch{return!1}}async function Le(e,t){let n=[];for await(let i of le(e,t))n.push(Buffer.isBuffer(i)?i:Buffer.from(i));return Buffer.concat(n).toString("utf8")}async function*Me(e,t,n=Number.POSITIVE_INFINITY){let i="";for await(let s of le(e,t)){i+=s.toString();let a;for(;(a=i.indexOf(`
4
+ `))>=0;){let o=i.slice(0,a);if(Buffer.byteLength(o)>n)throw d(`NDJSON line exceeds the ${n}-byte transaction append limit.`);yield o,i=i.slice(a+1)}if(Buffer.byteLength(i)>n)throw d(`NDJSON line exceeds the ${n}-byte transaction append limit.`)}i&&(yield i)}async function*le(e,t){let n=e[Symbol.asyncIterator]();for(;;){let i=await $e(n,t);if(i.done)return;yield i.value}}function $e(e,t){return t.aborted?Promise.reject(P()):new Promise((n,i)=>{let s=()=>i(P());t.addEventListener("abort",s,{once:!0}),e.next().then(n,i).finally(()=>t.removeEventListener("abort",s))})}function I(e){let t=JSON.stringify(e);if(Buffer.byteLength(t)>U)throw p(c.execution,"output.tooLarge","CLI output exceeds 1 MiB.");process.stdout.write(`${t}
5
+ `)}function Ue(){return{globalOptions:{deadline:`End-to-end CLI deadline in milliseconds (default ${B}).`,projectRoot:"Exact target project root. Required for deployment-owned usage from outside the project."},commands:["status","commands list [--cursor CURSOR] [--limit N]","commands search QUERY [--cursor CURSOR] [--limit N]","commands describe COMMAND_ID","command COMMAND_ID [--stdin|--input-file FILE|--input-json JSON] [--expected-revision N] [--idempotency-key KEY] [--request-id ID] [--trace-id ID] [--client-id ID] [--timeout MS]","apply [--stdin|--input-file FILE] [--save] [--expected-revision N] [--transaction-id ID] [--label TEXT] [--trace-id ID] [--timeout MS]","transaction begin [--expected-revision N] [--transaction-id ID] [--label TEXT] [--trace-id ID]","transaction append TRANSACTION_ID [--stdin|--input-file FILE] [--sequence N] [--service-instance-id ID]","transaction preflight TRANSACTION_ID [--service-instance-id ID]","transaction commit TRANSACTION_ID [--service-instance-id ID]","transaction get TRANSACTION_ID [--service-instance-id ID] [--cursor CURSOR] [--limit N]","transaction abort TRANSACTION_ID [--service-instance-id ID]","operation get OPERATION_ID [--service-instance-id ID]","operation get --request-id REQUEST_ID [--service-instance-id ID]","operation cancel OPERATION_ID","trace get [TRACE_ID] [--cursor CURSOR] [--limit N]","doctor"],exitCodes:c}}function d(e){return p(c.usage,"cli.usage",e)}function p(e,t,n,i=!0,s){return Object.assign(new Error(n),{exitCode:e,code:t,log:i,...s?{result:s}:{}})}function Z(e,t){let n=t?.kind==="command.invoke"?t.invocation:null,i=t?.kind?.startsWith("transaction.")?t.transactionId:n?.transactionId,s=!!n||typeof t?.kind=="string"&&/^transaction\.(begin|append|preflight|commit|abort)$/.test(t.kind),a=n?.requestId,o=a?`operation get --request-id ${a} --service-instance-id ${e.descriptor.serviceInstanceId}`:null,u=i?`transaction get ${i} --service-instance-id ${e.descriptor.serviceInstanceId}`:null,l=[o,u].filter(Boolean);l.length||l.push("status");let r=`Agent CLI exceeded its ${ne}ms end-to-end deadline.`;return p(c.running,"cli.deadlineExceeded",r,!0,{ok:!1,kind:"cli.deadline",state:s?"outcome_unknown":"timed_out",serviceInstanceId:e.descriptor.serviceInstanceId,...n?.commandId?{commandId:n.commandId}:{},...a?{requestId:a}:{},...i?{transactionId:i}:{},error:{code:"cli.deadlineExceeded",message:r},allowedActions:l,retry:{retryable:!s,requiresOperationQuery:s}})}function P(){return p(c.interrupted,"cli.interrupted","Interrupted.")}function me(e){return e&&Number.isInteger(e.exitCode)&&typeof e.code=="string"?e:p(c.execution,"cli.failure",e instanceof Error?e.message:String(e))}
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import{createHash as m,randomBytes as A}from"node:crypto";import{chmod as I,copyFile as P,mkdir as l,mkdtemp as N,readFile as f,readdir as R,rename as $,rm as d,stat as h,writeFile as D}from"node:fs/promises";import{fileURLToPath as J,pathToFileURL as O}from"node:url";import e from"node:path";var T=e.dirname(J(import.meta.url)),w=e.resolve(T,".."),a=e.resolve(process.cwd()),g=e.join(a,".fps-editor"),p=e.join(g,"deployments"),j=e.join(g,"state"),k=e.join(g,"current.json"),y=e.join(j,"runtime-bridge-token"),V=process.argv.includes("--reset-test-state"),C=e.join(j,"playwright-working-document-journal.json");et();V&&await d(C,{force:!0});await l(p,{recursive:!0});await l(j,{recursive:!0,mode:448});await G();var s=await z(),c=JSON.parse(await f(e.join(w,"manifest.json"),"utf8"));M(c);var v=await Q(),F=X(v);await U(w,c.files);var H=_(c.files);s&&s.editorDistHash===c.build.distHash&&s.projectSourceHash===F&&s.deployment?.packageHash===H&&await q(s)&&(console.log("[fps-editor-server] existing deployment and static Project definition are current."),process.exit(0));var n=await L(w,c,H),B=["a","b"].map(t=>({release:t,artifactId:`${n.id}-${t}`,rootPath:e.relative(a,e.join(n.rootPath,"public")),build:{...n.manifest.build,buildId:`${n.manifest.build.buildId}.release-${t}`}})),x={schemaVersion:3,preparedAt:new Date().toISOString(),editorDistHash:c.build.distHash,projectSourceHash:F,projectDefinition:v,deployment:{id:n.id,rootPath:e.relative(a,n.rootPath),packageHash:n.packageHash,manifest:n.manifest},workerEntry:e.relative(a,e.join(n.rootPath,n.manifest.entrypoints.worker)),serverEntry:e.relative(a,e.join(n.rootPath,n.manifest.entrypoints.server)),builds:B,staged:s?.deployment?.id&&s.deployment.id!==n.id?{deploymentId:s.deployment.id}:null};await Y(k,x);await K(x);console.log([`[fps-editor-server] prepared deployment ${n.id}`,`for static Project ${v.projectId}.`].join(" "));async function L(t,r,i){let o=await N(e.join(p,".install-"));try{for(let E of r.files){let S=e.join(o,E.path);await l(e.dirname(S),{recursive:!0}),await P(e.join(t,E.path),S)}await P(e.join(t,"manifest.json"),e.join(o,"manifest.json"));let b=`${r.version}-${i.slice(0,16)}`,u=e.join(p,b);return(await h(u).catch(()=>null))?.isDirectory()?await d(o,{recursive:!0,force:!0}):await $(o,u),{id:b,rootPath:u,manifest:r,packageHash:i}}finally{await d(o,{recursive:!0,force:!0}).catch(()=>{})}}function M(t){if(t?.schemaVersion!==2||t.artifactKind!=="fps-editor-deployment-package"||t.packageName!=="@fps-games/editor-deployment")throw new Error("Editor deployment manifest is invalid.");if(t.node?.range!==">=24 <27"||t.node?.bundled!==!1)throw new Error("Editor deployment Node.js contract is invalid.");if(typeof t.build?.version!="string"||typeof t.build?.distHash!="string"||typeof t.commitSha!="string")throw new Error("Editor deployment build identity is incomplete.");for(let r of["server","worker","browser"])if(typeof t.entrypoints?.[r]!="string")throw new Error(`Editor deployment ${r} entrypoint is missing.`);for(let r of["prepare","server","project"])if(typeof t.binaries?.[r]!="string")throw new Error(`Editor deployment ${r} binary is missing.`);if(t.projectContentBundled!==!1)throw new Error("Editor deployment must not contain project content.")}async function U(t,r){if(!Array.isArray(r)||r.length===0)throw new Error("Editor deployment file manifest is empty.");for(let i of r){if(!Z(i.path))throw new Error(`Unsafe deployment file path: ${String(i.path)}.`);let o=await f(e.join(t,i.path));if(o.byteLength!==i.size||tt(o)!==i.sha256)throw new Error(`Editor deployment file integrity mismatch: ${i.path}.`)}}async function q(t){try{let r=[t.serverEntry,t.workerEntry,e.join(t.deployment.rootPath,t.deployment.manifest.entrypoints.browser)];return(await Promise.all(r.map(i=>h(e.join(a,i))))).every(i=>i.isFile())}catch{return!1}}async function z(){try{let t=JSON.parse(await f(k,"utf8"));return t?.schemaVersion===3?t:null}catch{return null}}async function K(t){let r=new Set([t.deployment.id,t.staged?.deploymentId].filter(Boolean));await W(p,r)}async function W(t,r){for(let i of await R(t,{withFileTypes:!0}))!i.isDirectory()||i.name.startsWith(".")||r.has(i.name)||await d(e.join(t,i.name),{recursive:!0,force:!0})}async function G(){(await f(y,"utf8").catch(()=>"")).trim()||(await D(y,`${A(32).toString("base64url")}
3
- `,{encoding:"utf8",mode:384}),await I(y,384))}async function Q(){let t=e.join(a,"fps.config.ts");if(!(await h(t).catch(()=>null))?.isFile())throw new Error("fps.config.ts is required.");let i=await import(`${O(t).href}?fps-editor-prepare=${Date.now()}`),o=i.default??i.fpsConfig;if(!o||typeof o!="object"||Array.isArray(o)||o.schemaVersion!==1||typeof o.projectId!="string"||!o.authoring||!Array.isArray(o.plugins))throw new Error("fps.config.ts must default-export a valid defineFpsProject() definition.");return o}function X(t){return m("sha256").update(JSON.stringify(t)).digest("hex")}async function Y(t,r){await l(e.dirname(t),{recursive:!0});let i=`${t}.${process.pid}.tmp`;await D(i,`${JSON.stringify(r,null,2)}
4
- `),await $(i,t)}function Z(t){return typeof t=="string"&&t.length>0&&!t.includes("\\")&&!e.isAbsolute(t)&&!t.split("/").includes("..")}function _(t){return m("sha256").update(JSON.stringify(t)).digest("hex")}function tt(t){return m("sha256").update(t).digest("hex")}function et(){let t=Number.parseInt(process.versions.node.split(".")[0]??"",10);if(!Number.isSafeInteger(t)||t<24||t>=27)throw new Error(`prepare:server requires Node.js >=24 <27; current version is ${process.versions.node}.`)}
2
+ import{createHash as w,randomBytes as z}from"node:crypto";import{chmod as K,copyFile as x,mkdir as u,mkdtemp as G,readFile as m,readdir as Q,rename as N,rm as l,stat as g,writeFile as A}from"node:fs/promises";import{fileURLToPath as X,pathToFileURL as Y}from"node:url";import r from"node:path";import T from"node:path";function R(t){let e=[],o;for(let i=0;i<t.length;i+=1){let s=t[i];if(s!=="--project-root"&&!s.startsWith("--project-root=")){e.push(s);continue}if(o!==void 0)throw new Error("--project-root may only be provided once.");let a=s==="--project-root"?t[++i]:s.slice(15);if(a===void 0||!a.trim()||a.startsWith("--"))throw new Error("--project-root requires a non-empty path.");o=a}return{argv:e,projectRoot:T.resolve(process.cwd(),o??"."),explicit:o!==void 0}}import{existsSync as J,statSync as M}from"node:fs";import{registerHooks as V}from"node:module";import D from"node:path";import{fileURLToPath as W,pathToFileURL as C}from"node:url";var k=[".ts",".mts",".js",".mjs",".cjs"];async function F(t){let e=V({resolve:B});try{return await import(t)}finally{e.deregister()}}function B(t,e,o){try{return o(t,e)}catch(i){if(i?.code!=="ERR_MODULE_NOT_FOUND"||!e.parentURL?.startsWith("file:")||!t.startsWith("./")&&!t.startsWith("../"))throw i;let s=new URL(t,e.parentURL);if(s.protocol!=="file:"||D.extname(s.pathname))throw i;let a=W(s);for(let h of q(a))if(_(h))return o(C(h).href,e);throw i}}function q(t){return[...k.map(e=>`${t}${e}`),...k.map(e=>D.join(t,`index${e}`))]}function _(t){try{return J(t)&&M(t).isFile()}catch{return!1}}var Z=r.dirname(X(import.meta.url)),j=r.resolve(Z,".."),v=R(process.argv.slice(2)),tt=v.argv.includes("--reset-test-state"),H=v.argv.filter(t=>t!=="--reset-test-state");if(H.length>0)throw new Error(`Unexpected argument: ${H[0]}`);var p=v.projectRoot,b=r.join(p,".fps-editor"),f=r.join(b,"deployments"),E=r.join(b,"state"),U=r.join(b,"current.json"),y=r.join(E,"runtime-bridge-token"),et=r.join(E,"playwright-working-document-journal.json");wt();tt&&await l(et,{force:!0});await u(f,{recursive:!0});await u(E,{recursive:!0,mode:448});await dt();var c=await at(),d=JSON.parse(await m(r.join(j,"manifest.json"),"utf8"));it(d);var P=await lt(),I=ft(P);await nt(j,d.files);var O=ht(d.files);c&&c.editorDistHash===d.build.distHash&&c.projectSourceHash===I&&c.deployment?.packageHash===O&&await st(c)&&(console.log("[fps-editor-server] existing deployment and static Project definition are current."),process.exit(0));var n=await rt(j,d,O),ot=["a","b"].map(t=>({release:t,artifactId:`${n.id}-${t}`,rootPath:r.relative(p,r.join(n.rootPath,"public")),build:{...n.manifest.build,buildId:`${n.manifest.build.buildId}.release-${t}`}})),L={schemaVersion:3,preparedAt:new Date().toISOString(),editorDistHash:d.build.distHash,projectSourceHash:I,projectDefinition:P,deployment:{id:n.id,rootPath:r.relative(p,n.rootPath),packageHash:n.packageHash,manifest:n.manifest},workerEntry:r.relative(p,r.join(n.rootPath,n.manifest.entrypoints.worker)),serverEntry:r.relative(p,r.join(n.rootPath,n.manifest.entrypoints.server)),builds:ot,staged:c?.deployment?.id&&c.deployment.id!==n.id?{deploymentId:c.deployment.id}:null};await ut(U,L);await ct(L);console.log([`[fps-editor-server] prepared deployment ${n.id}`,`for static Project ${P.projectId}.`].join(" "));async function rt(t,e,o){let i=await G(r.join(f,".install-"));try{for(let S of e.files){let $=r.join(i,S.path);await u(r.dirname($),{recursive:!0}),await x(r.join(t,S.path),$)}await x(r.join(t,"manifest.json"),r.join(i,"manifest.json"));let s=`${e.version}-${o.slice(0,16)}`,a=r.join(f,s);return(await g(a).catch(()=>null))?.isDirectory()?await l(i,{recursive:!0,force:!0}):await N(i,a),{id:s,rootPath:a,manifest:e,packageHash:o}}finally{await l(i,{recursive:!0,force:!0}).catch(()=>{})}}function it(t){if(t?.schemaVersion!==2||t.artifactKind!=="fps-editor-deployment-package"||t.packageName!=="@fps-games/editor-deployment")throw new Error("Editor deployment manifest is invalid.");if(t.node?.range!==">=24 <27"||t.node?.bundled!==!1)throw new Error("Editor deployment Node.js contract is invalid.");if(typeof t.build?.version!="string"||typeof t.build?.distHash!="string"||typeof t.commitSha!="string")throw new Error("Editor deployment build identity is incomplete.");for(let e of["server","worker","browser"])if(typeof t.entrypoints?.[e]!="string")throw new Error(`Editor deployment ${e} entrypoint is missing.`);for(let e of["prepare","server","project","agent"])if(typeof t.binaries?.[e]!="string")throw new Error(`Editor deployment ${e} binary is missing.`);if(t.projectContentBundled!==!1)throw new Error("Editor deployment must not contain project content.")}async function nt(t,e){if(!Array.isArray(e)||e.length===0)throw new Error("Editor deployment file manifest is empty.");for(let o of e){if(!mt(o.path))throw new Error(`Unsafe deployment file path: ${String(o.path)}.`);let i=await m(r.join(t,o.path));if(i.byteLength!==o.size||yt(i)!==o.sha256)throw new Error(`Editor deployment file integrity mismatch: ${o.path}.`)}}async function st(t){try{let e=[t.serverEntry,t.workerEntry,r.join(t.deployment.rootPath,t.deployment.manifest.entrypoints.browser)];return(await Promise.all(e.map(o=>g(r.join(p,o))))).every(o=>o.isFile())}catch{return!1}}async function at(){try{let t=JSON.parse(await m(U,"utf8"));return t?.schemaVersion===3?t:null}catch{return null}}async function ct(t){let e=new Set([t.deployment.id,t.staged?.deploymentId].filter(Boolean));await pt(f,e)}async function pt(t,e){for(let o of await Q(t,{withFileTypes:!0}))!o.isDirectory()||o.name.startsWith(".")||e.has(o.name)||await l(r.join(t,o.name),{recursive:!0,force:!0})}async function dt(){(await m(y,"utf8").catch(()=>"")).trim()||(await A(y,`${z(32).toString("base64url")}
3
+ `,{encoding:"utf8",mode:384}),await K(y,384))}async function lt(){let t=r.join(p,"fps.config.ts");if(!(await g(t).catch(()=>null))?.isFile())throw new Error("fps.config.ts is required.");let o=await F(`${Y(t).href}?fps-editor-prepare=${Date.now()}`),i=o.default??o.fpsConfig;if(!i||typeof i!="object"||Array.isArray(i)||i.schemaVersion!==1||typeof i.projectId!="string"||!i.authoring||!Array.isArray(i.plugins))throw new Error("fps.config.ts must default-export a valid defineFpsProject() definition.");return i}function ft(t){return w("sha256").update(JSON.stringify(t)).digest("hex")}async function ut(t,e){await u(r.dirname(t),{recursive:!0});let o=`${t}.${process.pid}.tmp`;await A(o,`${JSON.stringify(e,null,2)}
4
+ `),await N(o,t)}function mt(t){return typeof t=="string"&&t.length>0&&!t.includes("\\")&&!r.isAbsolute(t)&&!t.split("/").includes("..")}function ht(t){return w("sha256").update(JSON.stringify(t)).digest("hex")}function yt(t){return w("sha256").update(t).digest("hex")}function wt(){let t=Number.parseInt(process.versions.node.split(".")[0]??"",10);if(!Number.isSafeInteger(t)||t<24||t>=27)throw new Error(`prepare:server requires Node.js >=24 <27; current version is ${process.versions.node}.`)}