openpond 0.1.1 → 0.2.1

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 (225) hide show
  1. package/README.md +4 -4
  2. package/dist/cache.d.ts +7 -10
  3. package/dist/chunks/actions-command-QP3NMDK4.js +2 -0
  4. package/dist/chunks/app-layer-N7VFRVJ2.js +3 -0
  5. package/dist/chunks/app-server-runtime-OCLPUI7F.js +2 -0
  6. package/dist/chunks/apps-AMG75TI4.js +2 -0
  7. package/dist/chunks/chunk-22UARBPW.js +3 -0
  8. package/dist/chunks/chunk-3A7HZJNE.js +1 -0
  9. package/dist/chunks/chunk-3M53YXEI.js +2 -0
  10. package/dist/chunks/chunk-3NDRIQTI.js +2 -0
  11. package/dist/chunks/chunk-5BBVEWG3.js +2 -0
  12. package/dist/chunks/chunk-5O7ZVCMV.js +6 -0
  13. package/dist/chunks/chunk-6FA3GG5B.js +33 -0
  14. package/dist/chunks/chunk-6MI4KKWF.js +2 -0
  15. package/dist/chunks/chunk-BBG546O6.js +6 -0
  16. package/dist/chunks/chunk-BX4J2VDU.js +2 -0
  17. package/dist/chunks/chunk-BZMVB3GS.js +2 -0
  18. package/dist/chunks/chunk-C5LOZSVS.js +2 -0
  19. package/dist/chunks/chunk-CWQWV2T3.js +2 -0
  20. package/dist/chunks/chunk-DUA3QP6Y.js +19 -0
  21. package/dist/chunks/chunk-EAPFMACH.js +10 -0
  22. package/dist/chunks/chunk-ES2ISFJC.js +66 -0
  23. package/dist/chunks/chunk-F65NIZLM.js +2199 -0
  24. package/dist/chunks/chunk-FGJ5LFPL.js +5 -0
  25. package/dist/chunks/chunk-FTQLQJQV.js +2 -0
  26. package/dist/chunks/chunk-FY7OQ5RK.js +24 -0
  27. package/dist/chunks/chunk-FYCJSUFV.js +53 -0
  28. package/dist/chunks/chunk-GLUWATL5.js +2 -0
  29. package/dist/chunks/chunk-H7IWJN7L.js +17 -0
  30. package/dist/chunks/chunk-HZP5U2AA.js +3 -0
  31. package/dist/chunks/chunk-I5K74TOH.js +3 -0
  32. package/dist/chunks/chunk-IR3YJWPW.js +7 -0
  33. package/dist/chunks/chunk-KU7QOHFT.js +2872 -0
  34. package/dist/chunks/chunk-KV553EWX.js +16 -0
  35. package/dist/chunks/chunk-MGN6GLNZ.js +2 -0
  36. package/dist/chunks/chunk-OG5Q6NXK.js +28 -0
  37. package/dist/chunks/chunk-OGPHXXCD.js +1 -0
  38. package/dist/chunks/chunk-PI36UHRA.js +18 -0
  39. package/dist/chunks/chunk-RWSAGQTP.js +2 -0
  40. package/dist/chunks/chunk-SAE4OIPC.js +2 -0
  41. package/dist/chunks/chunk-SDO4FC4Q.js +2 -0
  42. package/dist/chunks/chunk-UKUVMXOW.js +12 -0
  43. package/dist/chunks/chunk-VCLCFK3O.js +36 -0
  44. package/dist/chunks/chunk-VYUMTRB3.js +5 -0
  45. package/dist/chunks/chunk-X37KMV27.js +1 -0
  46. package/dist/chunks/chunk-XDHAGACI.js +3 -0
  47. package/dist/chunks/chunk-XEOEKFG6.js +71 -0
  48. package/dist/chunks/chunk-ZF7TEGY5.js +5 -0
  49. package/dist/chunks/chunk-ZVOO7FKM.js +2 -0
  50. package/dist/chunks/cli-M2FG7SSI.js +2 -0
  51. package/dist/chunks/configuration-command-XBKBIZBO.js +2 -0
  52. package/dist/chunks/continual-D75WA7E7.js +7 -0
  53. package/dist/chunks/core-commands-LUZVWXQR.js +2 -0
  54. package/dist/chunks/database-X2CUV732.js +2 -0
  55. package/dist/chunks/desktop-test-KGC4JVJ7.js +3 -0
  56. package/dist/chunks/dist-NKLXFA37.js +2 -0
  57. package/dist/chunks/extension-NQ7N5LEY.js +5 -0
  58. package/dist/chunks/help-MWK66XZK.js +8 -0
  59. package/dist/chunks/module-ES6BEMUI-ZVL3F6NW.js +2 -0
  60. package/dist/chunks/module-asyncify-2EFITU5U-R7TVXNAE.js +2 -0
  61. package/dist/chunks/opchat-XJZA3QKZ.js +3 -0
  62. package/dist/chunks/organizations-UECDFEYE.js +2 -0
  63. package/dist/chunks/profile-KUMIZURM.js +3 -0
  64. package/dist/chunks/project-agent-NILMJHLV.js +2 -0
  65. package/dist/chunks/sandbox-command-QHH65OSE.js +2 -0
  66. package/dist/chunks/sandbox-template-N7I63PNU.js +10 -0
  67. package/dist/chunks/src-724HF43W.js +82 -0
  68. package/dist/chunks/src-VTKTTKQO.js +319 -0
  69. package/dist/chunks/taskset-PISBOILQ.js +2 -0
  70. package/dist/chunks/teams-bot-UV4RU53M.js +3 -0
  71. package/dist/chunks/training-2NDOWH5S.js +2 -0
  72. package/dist/chunks/workspaces-XXT4KUD3.js +2 -0
  73. package/dist/cli.js +3 -101
  74. package/dist/client.d.ts +1 -1
  75. package/dist/config.d.ts +1 -0
  76. package/dist/index.js +1 -26305
  77. package/dist/private-json-file.d.ts +1 -2
  78. package/dist/sandbox-template/manifest.js +1 -18380
  79. package/dist/web/assets/App-DxecRQUL.js +176 -0
  80. package/dist/web/assets/AppDialog-B65Eo3gp.js +1 -0
  81. package/dist/web/assets/AppTerminalPanel-B2EKQM7W.js +2 -0
  82. package/dist/web/assets/{AppsView-Ck_OzQWf.js → AppsView-BBoVe7s2.js} +1 -1
  83. package/dist/web/assets/{BrowserSidebar-CqciX8aL.js → BrowserSidebar-CSM1atSJ.js} +1 -1
  84. package/dist/web/assets/{CartesianChart-Y0lsL4vC.js → CartesianChart-CJKfXiEG.js} +1 -1
  85. package/dist/web/assets/{CollaborationTabs-BOb9PjvS.js → CollaborationTabs-BMZamWFC.js} +1 -1
  86. package/dist/web/assets/{CommandMenu-Co6JnmTu.js → CommandMenu-B3U1z2eo.js} +1 -1
  87. package/dist/web/assets/{CommunityView-BbTSeL7h.js → CommunityView-CTyRUcfy.js} +1 -1
  88. package/dist/web/assets/{ComposerCreateImproveStrip-BGzCWVFp.js → ComposerCreateImproveStrip-D7usvRtK.js} +1 -1
  89. package/dist/web/assets/GetStartedView-Ibu7oKWJ.js +1 -0
  90. package/dist/web/assets/HostedModelLearningReview-qnzIkT70.js +1 -0
  91. package/dist/web/assets/HostedModelLearningSettings--PKjpYsy.js +1 -0
  92. package/dist/web/assets/LabModelVersionDetailPage-s9uUN6fV.js +1 -0
  93. package/dist/web/assets/{LabSkillSidebar-C5oS6UmH.js → LabSkillSidebar-BKYseMiJ.js} +1 -1
  94. package/dist/web/assets/LabsRoute-C1FWCoYb.css +1 -0
  95. package/dist/web/assets/LabsRoute-DoRs0K6v.js +32 -0
  96. package/dist/web/assets/MainChatThread-DvuyMcMB.js +2 -0
  97. package/dist/web/assets/MainPane-BWwcxgHD.js +8 -0
  98. package/dist/web/assets/{MarkdownText-DqJarmTh.js → MarkdownText-D8XC5UT_.js} +1 -1
  99. package/dist/web/assets/{Messages-BaT7HOzB.js → Messages-e4A8JUjD.js} +6 -6
  100. package/dist/web/assets/{NativeSkillSidebar-DXp8snN5.js → NativeSkillSidebar-D2Joh8XB.js} +1 -1
  101. package/dist/web/assets/{NewExperienceSwitcher-CLHuGUN5.js → NewExperienceSwitcher-CzGebt2E.js} +1 -1
  102. package/dist/web/assets/{NewProjectDialog-CzpHCAaC.js → NewProjectDialog-CdMTSxUE.js} +1 -1
  103. package/dist/web/assets/{OutputsPage-DIzx-Ge6.js → OutputsPage-m7cSb8dW.js} +1 -1
  104. package/dist/web/assets/{ProjectsPage-DojwrhOy.js → ProjectsPage-C9mz8W1g.js} +1 -1
  105. package/dist/web/assets/RightChatPanelStack-B4LEqKEj.js +1 -0
  106. package/dist/web/assets/{RightSidebarHomePanel-DTzfuEX3.js → RightSidebarHomePanel-DOeUsH7h.js} +1 -1
  107. package/dist/web/assets/ScheduledWorkPage-UXZSSWgA.js +1 -0
  108. package/dist/web/assets/SettingsView-CAH0vreE.css +1 -0
  109. package/dist/web/assets/SettingsView-CQm1ai73.js +9 -0
  110. package/dist/web/assets/TeamChatView-C4haojB7.js +3 -0
  111. package/dist/web/assets/{TerminalOverlay-DnNVrCtu.js → TerminalOverlay-p2GZsuyQ.js} +3 -3
  112. package/dist/web/assets/{TrainingCreationPanel-CDwwyucO.js → TrainingCreationPanel-BYJSlO8X.js} +1 -1
  113. package/dist/web/assets/{TrainingDraftPanel-BijDnV_0.js → TrainingDraftPanel-DR5KlayH.js} +1 -1
  114. package/dist/web/assets/{UsageSettingsSection-Y5BFAu1p.js → UsageSettingsSection-BQToNXE4.js} +5 -5
  115. package/dist/web/assets/{WorkSidebarPanel-CkJlvZKm.js → WorkSidebarPanel--EeytWeg.js} +1 -1
  116. package/dist/web/assets/WorkspaceDiffPanel-BrovSYhn.js +14 -0
  117. package/dist/web/assets/{WorkspaceEnvironmentMenu-D8knAy1q.js → WorkspaceEnvironmentMenu-l-keRgvj.js} +3 -3
  118. package/dist/web/assets/{WorkspaceGitDialogs-_LHTrvh6.js → WorkspaceGitDialogs-aicWzaZu.js} +1 -1
  119. package/dist/web/assets/{WorkspaceMonacoEditor-B2B7OM_L.js → WorkspaceMonacoEditor-CO_E74jM.js} +36 -36
  120. package/dist/web/assets/{arrow-up-right-4nAzMtjW.js → arrow-up-right-rwPXNfVn.js} +1 -1
  121. package/dist/web/assets/chat-file-links-B3jDstSC.js +1 -0
  122. package/dist/web/assets/chevron-up-D089nvYQ.js +1 -0
  123. package/dist/web/assets/{clipboard-BzjUoZFo.js → clipboard-DwEExyU4.js} +1 -1
  124. package/dist/web/assets/{cloud-upload-CsrrwS-b.js → cloud-upload-D2he0-vQ.js} +1 -1
  125. package/dist/web/assets/{cssMode-CIbSSHKJ.js → cssMode-DS4k0NcI.js} +1 -1
  126. package/dist/web/assets/{folder-open-vRTuLzpS.js → folder-open-CAOLduKD.js} +1 -1
  127. package/dist/web/assets/{folder-plus-hyqwgUnx.js → folder-plus-D56MrxVT.js} +1 -1
  128. package/dist/web/assets/{git-commit-horizontal-CaxKfeYa.js → git-commit-horizontal-CeNM0oKJ.js} +1 -1
  129. package/dist/web/assets/{htmlMode-C3MGQGam.js → htmlMode-Xkni5erh.js} +1 -1
  130. package/dist/web/assets/{index-ByQIHpc9.css → index-BGMzUaup.css} +1 -1
  131. package/dist/web/assets/{index-Dvq7bpBG.js → index-KwyAyscP.js} +1 -1
  132. package/dist/web/assets/{info-aYWeE1Iw.js → info-CcrBaEE_.js} +1 -1
  133. package/dist/web/assets/{jsonMode-CpD6UkT7.js → jsonMode-C4YPbQB7.js} +1 -1
  134. package/dist/web/assets/{lspLanguageFeatures-DpcK8ZI6.js → lspLanguageFeatures-CF5oMTz6.js} +1 -1
  135. package/dist/web/assets/{minimize-2-DeYg7XqB.js → minimize-2-DzHQnInk.js} +1 -1
  136. package/dist/web/assets/{monaco.contribution-CrrdDQgP.js → monaco.contribution-0EN4mGCC.js} +2 -2
  137. package/dist/web/assets/{monaco.contribution-JWFq0HzV.js → monaco.contribution-B4qcTP0w.js} +2 -2
  138. package/dist/web/assets/{monaco.contribution-BDTM0ZJq.js → monaco.contribution-CJK_NrBm.js} +2 -2
  139. package/dist/web/assets/{monaco.contribution-C-_ekTxy.js → monaco.contribution-CkPGKNd-.js} +2 -2
  140. package/dist/web/assets/{play-BqgRTddV.js → play-p3-AMTPL.js} +1 -1
  141. package/dist/web/assets/{python-B67wope9.js → python-B0kpTxAZ.js} +1 -1
  142. package/dist/web/assets/{refresh-cw-DwMA_2On.js → refresh-cw-_jbTIzzr.js} +1 -1
  143. package/dist/web/assets/{save-B0BKh5oQ.js → save-Cy6hEotx.js} +1 -1
  144. package/dist/web/assets/{square-LY3oz82L.js → square-DKQkcrOH.js} +1 -1
  145. package/dist/web/assets/{toggleHighContrast-B2jka5B1.js → toggleHighContrast-Bnk1VVVq.js} +1 -1
  146. package/dist/web/assets/{tsMode-1MUwluYD.js → tsMode-BDrSVy7V.js} +1 -1
  147. package/dist/web/assets/{upload-bSKSkFVa.js → upload-COn0my_O.js} +1 -1
  148. package/dist/web/assets/{useLocalAgentSchedules--jnnM4Fz.js → useLocalAgentSchedules-iZNB4Oee.js} +1 -1
  149. package/dist/web/assets/{wifi-off-DA34iPmr.js → wifi-off-Cqt-ZLXY.js} +1 -1
  150. package/dist/web/assets/{workers-CczIcRcl.js → workers-hu0Ym93h.js} +1 -1
  151. package/dist/web/assets/{yaml-DwEGoHA9.js → yaml-D-JLDGL6.js} +1 -1
  152. package/dist/web/index.html +2 -2
  153. package/docs/command-reference.md +28 -2
  154. package/package.json +10 -7
  155. package/dist/chunks/actions-command-6N5XWMR6.js +0 -185
  156. package/dist/chunks/app-layer-XEYHFJHI.js +0 -214
  157. package/dist/chunks/app-server-runtime-FJM2EQPH.js +0 -21
  158. package/dist/chunks/apps-GSXUDK6V.js +0 -427
  159. package/dist/chunks/chunk-2JABRRNR.js +0 -183
  160. package/dist/chunks/chunk-47EIAYI7.js +0 -2162
  161. package/dist/chunks/chunk-4L3ZJS2T.js +0 -1207
  162. package/dist/chunks/chunk-5TKZBMQM.js +0 -731
  163. package/dist/chunks/chunk-6G6MDZLM.js +0 -14509
  164. package/dist/chunks/chunk-BVY5JYM6.js +0 -512
  165. package/dist/chunks/chunk-C5TKGE5Y.js +0 -1275
  166. package/dist/chunks/chunk-CNTM26OW.js +0 -602
  167. package/dist/chunks/chunk-D7BO5Y5J.js +0 -1531
  168. package/dist/chunks/chunk-DJL4TJYG.js +0 -70
  169. package/dist/chunks/chunk-DLQQIWN2.js +0 -648
  170. package/dist/chunks/chunk-DNXBJZAU.js +0 -630
  171. package/dist/chunks/chunk-EFET7LB7.js +0 -1331
  172. package/dist/chunks/chunk-FQS2QL5F.js +0 -14522
  173. package/dist/chunks/chunk-HFPUR4CQ.js +0 -669
  174. package/dist/chunks/chunk-J3YDKJFD.js +0 -88
  175. package/dist/chunks/chunk-J7PYGDRY.js +0 -634
  176. package/dist/chunks/chunk-JTHL5XJ2.js +0 -1838
  177. package/dist/chunks/chunk-KSRWKXRB.js +0 -12
  178. package/dist/chunks/chunk-KWDOAJJI.js +0 -238
  179. package/dist/chunks/chunk-MUMPWI4O.js +0 -92
  180. package/dist/chunks/chunk-N3TGCM7J.js +0 -1135
  181. package/dist/chunks/chunk-NTK22KJD.js +0 -10707
  182. package/dist/chunks/chunk-O6B6YCMI.js +0 -57688
  183. package/dist/chunks/chunk-R3C3MNSI.js +0 -140
  184. package/dist/chunks/chunk-SMNFI2FU.js +0 -113
  185. package/dist/chunks/chunk-UACZUFIA.js +0 -47
  186. package/dist/chunks/chunk-W5GKHH77.js +0 -168
  187. package/dist/chunks/chunk-WBAZFKC7.js +0 -1643
  188. package/dist/chunks/chunk-X7ZG4TSW.js +0 -3063
  189. package/dist/chunks/chunk-YVCYVDNP.js +0 -746
  190. package/dist/chunks/cli-6PFRZ2WV.js +0 -21
  191. package/dist/chunks/continual-FYDKLCO7.js +0 -803
  192. package/dist/chunks/core-commands-MAN3CSJQ.js +0 -48
  193. package/dist/chunks/desktop-test-OE5SST2W.js +0 -146
  194. package/dist/chunks/extension-J3CIEDP4.js +0 -10041
  195. package/dist/chunks/help-JNGJJFU5.js +0 -67
  196. package/dist/chunks/opchat-6HEQJFLL.js +0 -167
  197. package/dist/chunks/organizations-MWAPNOCK.js +0 -804
  198. package/dist/chunks/profile-P7HMONTZ.js +0 -1134
  199. package/dist/chunks/project-agent-2RAK7GAZ.js +0 -514
  200. package/dist/chunks/sandbox-command-G22CPFNK.js +0 -1659
  201. package/dist/chunks/sandbox-template-S4WRUWJ6.js +0 -1653
  202. package/dist/chunks/src-BKBZ7WLO.js +0 -3624
  203. package/dist/chunks/src-RTGN2O4H.js +0 -65745
  204. package/dist/chunks/taskset-BMI7KOWP.js +0 -66
  205. package/dist/chunks/teams-bot-5VBYEN7M.js +0 -144
  206. package/dist/chunks/training-UPVSGDTB.js +0 -17
  207. package/dist/chunks/workspaces-IJQPWX3H.js +0 -99
  208. package/dist/web/assets/App-BOkhmdHu.js +0 -173
  209. package/dist/web/assets/AppDialog-BCjKFUBn.js +0 -1
  210. package/dist/web/assets/AppTerminalPanel-DRU8GIfy.js +0 -2
  211. package/dist/web/assets/GetStartedView-jEogFjxP.js +0 -1
  212. package/dist/web/assets/LabModelVersionDetailPage-CrudId_1.js +0 -1
  213. package/dist/web/assets/LabsRoute-9v8qwEBc.js +0 -2
  214. package/dist/web/assets/LabsRoute-CGFgymTX.css +0 -1
  215. package/dist/web/assets/MainChatThread-VtMpAxlP.js +0 -2
  216. package/dist/web/assets/MainPane-BbknUzp3.js +0 -8
  217. package/dist/web/assets/RightChatPanelStack-CIE5bgmO.js +0 -1
  218. package/dist/web/assets/ScheduledWorkPage-DdbcQGSv.js +0 -1
  219. package/dist/web/assets/SettingsView-CC5GXaE1.css +0 -1
  220. package/dist/web/assets/SettingsView-QT_OLmDh.js +0 -6
  221. package/dist/web/assets/TeamChatView-C4-nG1tC.js +0 -3
  222. package/dist/web/assets/WorkspaceDiffPanel-CBgzmBk8.js +0 -14
  223. package/dist/web/assets/chat-file-links-Bned0MT7.js +0 -1
  224. package/dist/web/assets/chevron-up-DK7ejCfk.js +0 -1
  225. package/dist/web/assets/index-66-ohHD5.js +0 -1
@@ -1,746 +0,0 @@
1
- import { createRequire as __openpondCreateRequire } from "node:module"; var require = __openpondCreateRequire(import.meta.url);
2
- import {
3
- yaml
4
- } from "./chunk-X7ZG4TSW.js";
5
- import {
6
- external_exports
7
- } from "./chunk-FQS2QL5F.js";
8
-
9
- // ../../packages/cloud/src/sandbox-template/manifest.ts
10
- var SANDBOX_TEMPLATE_PREVIEW_PORT_MIN = 3e3;
11
- var SANDBOX_TEMPLATE_PREVIEW_PORT_MAX = 9999;
12
- var OPENPOND_MANIFEST_FILE_NAME = "openpond.yaml";
13
- var SANDBOX_TEMPLATE_BUILD_PLAN_FILE_NAME = "openpond-template-plan.json";
14
- var SANDBOX_TEMPLATE_BUILD_PLAN_KIND = "openpond.sandboxTemplate.buildPlan.v1";
15
- var INTEGRATION_PROVIDERS = [
16
- "google",
17
- "github",
18
- "x"
19
- ];
20
- var RESERVED_PREVIEW_PORTS = /* @__PURE__ */ new Set([
21
- 22,
22
- 2222,
23
- 2375,
24
- 2376,
25
- 3108,
26
- 5900,
27
- 5901,
28
- 6080,
29
- 7818
30
- ]);
31
- var CommandListSchema = external_exports.array(external_exports.string().trim().min(1).max(1e3)).max(50);
32
- var RelativeWorkspacePathSchema = external_exports.string().trim().min(1).max(4096).refine(isSafeRelativeWorkspacePath, {
33
- message: "path must be a relative workspace path"
34
- });
35
- var OciImageRefSchema = external_exports.string().trim().min(1).max(500).refine(
36
- (value) => !value.includes("\0") && !/\s/.test(value),
37
- "image ref must be a single OCI reference"
38
- );
39
- var OciDigestSchema = external_exports.string().trim().regex(/^sha256:[0-9a-f]{64}$/i);
40
- var RuntimeWorkspaceRootSchema = external_exports.string().trim().min(1).max(500).refine(
41
- (value) => value.startsWith("/") && !value.includes("\0"),
42
- "workspaceRoot must be an absolute guest path"
43
- );
44
- var DockerfileRuntimeImageSchema = external_exports.object({
45
- ref: OciImageRefSchema,
46
- digest: OciDigestSchema.optional(),
47
- registrySecretRef: external_exports.string().trim().min(1).max(500).optional(),
48
- platform: external_exports.literal("linux/amd64").optional(),
49
- workspaceRoot: RuntimeWorkspaceRootSchema.optional()
50
- }).strict();
51
- var DockerfileRuntimeSourceSchema = external_exports.object({
52
- context: RelativeWorkspacePathSchema.default("."),
53
- path: RelativeWorkspacePathSchema.default("Dockerfile"),
54
- target: external_exports.string().trim().min(1).max(191).optional(),
55
- buildArgs: external_exports.record(external_exports.string().max(191), external_exports.string().max(500)).optional(),
56
- registrySecretRefs: external_exports.array(external_exports.string().trim().min(1).max(500)).max(10).optional(),
57
- platform: external_exports.literal("linux/amd64").optional(),
58
- workspaceRoot: RuntimeWorkspaceRootSchema.optional()
59
- }).strict();
60
- var SandboxTemplateRuntimeSchema = external_exports.object({
61
- base: external_exports.string().trim().min(1).max(120).optional(),
62
- snapshot: external_exports.string().trim().min(1).max(191).optional(),
63
- image: DockerfileRuntimeImageSchema.optional(),
64
- dockerfile: DockerfileRuntimeSourceSchema.optional()
65
- }).strict().superRefine((runtime, context) => {
66
- const selected = [
67
- runtime.base,
68
- runtime.snapshot,
69
- runtime.image,
70
- runtime.dockerfile
71
- ].filter(Boolean).length;
72
- if (selected !== 1) {
73
- context.addIssue({
74
- code: external_exports.ZodIssueCode.custom,
75
- message: "runtime must declare exactly one of base, snapshot, image, or dockerfile"
76
- });
77
- }
78
- });
79
- var SandboxTemplateResourcesSchema = external_exports.object({
80
- cpu: external_exports.number().positive().max(8).optional(),
81
- memoryGb: external_exports.number().positive().max(32).optional(),
82
- diskGb: external_exports.number().positive().max(100).optional()
83
- }).strict();
84
- var SandboxTemplateRequiredLeaseSchema = external_exports.object({
85
- provider: external_exports.enum(INTEGRATION_PROVIDERS),
86
- scopes: external_exports.array(external_exports.string().trim().min(1).max(200)).max(100).default([]),
87
- capabilities: external_exports.array(external_exports.string().trim().min(1).max(200)).max(100).default([])
88
- }).strict();
89
- var SandboxTemplateOpChatPermissionsSchema = external_exports.object({
90
- models: external_exports.array(external_exports.string().trim().min(1).max(200)).max(100).default([]),
91
- scopes: external_exports.array(external_exports.string().trim().min(1).max(200)).max(100).default([])
92
- }).strict();
93
- var SandboxTemplatePermissionsSchema = external_exports.object({
94
- opchat: SandboxTemplateOpChatPermissionsSchema.optional()
95
- }).catchall(external_exports.record(external_exports.string(), external_exports.unknown())).default({});
96
- var SandboxTemplateVolumeSchema = external_exports.object({
97
- name: external_exports.string().trim().regex(/^[A-Za-z_][A-Za-z0-9_-]*$/).max(63).optional(),
98
- mountPath: external_exports.string().trim().min(1).max(256).optional(),
99
- storageGb: external_exports.number().int().positive().max(100).optional(),
100
- deleteOnSandboxDelete: external_exports.boolean().optional()
101
- }).strict();
102
- var SandboxTemplatePortSchema = external_exports.object({
103
- port: external_exports.number().int().min(SANDBOX_TEMPLATE_PREVIEW_PORT_MIN).max(SANDBOX_TEMPLATE_PREVIEW_PORT_MAX).refine((port) => !RESERVED_PREVIEW_PORTS.has(port), {
104
- message: "preview port is reserved"
105
- }),
106
- protocol: external_exports.literal("http").default("http"),
107
- label: external_exports.string().trim().min(1).max(80).optional(),
108
- access: external_exports.enum(["private", "public"]).default("private"),
109
- path: external_exports.string().trim().min(1).max(512).refine((value) => value.startsWith("/"), {
110
- message: "preview path must start with /"
111
- }).default("/")
112
- }).strict();
113
- var SandboxTemplateCommandSchema = external_exports.object({
114
- command: external_exports.string().trim().min(1).max(1e3),
115
- cwd: RelativeWorkspacePathSchema.optional(),
116
- timeoutSeconds: external_exports.number().int().positive().max(86400).optional(),
117
- requiresStart: external_exports.boolean().default(false),
118
- ports: external_exports.array(SandboxTemplatePortSchema).max(20).default([]),
119
- artifactPaths: external_exports.array(RelativeWorkspacePathSchema).max(100).default([])
120
- }).strict();
121
- var SandboxTemplateNamedCommandSchema = SandboxTemplateCommandSchema.extend({
122
- name: external_exports.string().trim().min(1).max(80)
123
- }).strict();
124
- var SandboxTemplateMcpEndpointSchema = external_exports.object({
125
- name: external_exports.string().trim().min(1).max(80).optional(),
126
- service: external_exports.string().trim().min(1).max(80).optional(),
127
- port: external_exports.number().int().min(SANDBOX_TEMPLATE_PREVIEW_PORT_MIN).max(SANDBOX_TEMPLATE_PREVIEW_PORT_MAX).refine((port) => !RESERVED_PREVIEW_PORTS.has(port), {
128
- message: "app MCP port is reserved"
129
- }),
130
- path: external_exports.string().trim().min(1).max(512).refine((value) => value.startsWith("/"), {
131
- message: "app MCP path must start with /"
132
- }).default("/mcp")
133
- }).strict();
134
- var SandboxTemplateValidationProbeSchema = external_exports.object({
135
- name: external_exports.string().trim().min(1).max(80).optional(),
136
- port: external_exports.number().int().min(SANDBOX_TEMPLATE_PREVIEW_PORT_MIN).max(SANDBOX_TEMPLATE_PREVIEW_PORT_MAX).refine((port) => !RESERVED_PREVIEW_PORTS.has(port), {
137
- message: "validation probe port is reserved"
138
- }),
139
- path: external_exports.string().trim().min(1).max(512).refine((value) => value.startsWith("/"), {
140
- message: "validation probe path must start with /"
141
- }).default("/"),
142
- expectedStatus: external_exports.number().int().min(100).max(599).default(200)
143
- }).strict();
144
- var SandboxTemplateJsonSchema = external_exports.record(external_exports.string(), external_exports.unknown()).refine(
145
- (schema) => schema.type === "object",
146
- "input schema must be a JSON schema object"
147
- );
148
- var SandboxTemplateEnvInputSchema = external_exports.object({
149
- name: external_exports.string().trim().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).max(191),
150
- required: external_exports.boolean().default(false),
151
- secret: external_exports.boolean().default(true),
152
- description: external_exports.string().trim().max(500).optional()
153
- }).strict();
154
- var SandboxTemplateScheduleDateSchema = external_exports.string().trim().min(1).max(120);
155
- var SandboxTemplateScheduleSchema = external_exports.object({
156
- name: external_exports.string().trim().min(1).max(120),
157
- description: external_exports.string().trim().max(500).optional(),
158
- cron: external_exports.string().trim().min(1).max(500).optional(),
159
- rate: external_exports.string().trim().min(1).max(500).optional(),
160
- once: SandboxTemplateScheduleDateSchema.optional(),
161
- scheduleType: external_exports.enum(["rate", "cron", "once"]).optional(),
162
- scheduleExpression: external_exports.string().trim().min(1).max(500).optional(),
163
- timezone: external_exports.string().trim().min(1).max(100).optional(),
164
- enabled: external_exports.boolean().default(true),
165
- startAt: SandboxTemplateScheduleDateSchema.optional(),
166
- endAt: SandboxTemplateScheduleDateSchema.optional(),
167
- maxRuns: external_exports.number().int().positive().nullable().optional(),
168
- runtimePolicy: external_exports.enum([
169
- "run_and_stop",
170
- "run_and_archive",
171
- "run_and_delete",
172
- "use_existing_running"
173
- ]).default("run_and_stop"),
174
- action: external_exports.string().trim().min(1).max(120).optional(),
175
- actionName: external_exports.string().trim().min(1).max(120).optional(),
176
- command: external_exports.string().trim().min(1).max(2e3).optional(),
177
- target: external_exports.object({
178
- kind: external_exports.enum(["start", "action", "service", "command"]).optional(),
179
- name: external_exports.string().trim().min(1).max(120).optional(),
180
- actionName: external_exports.string().trim().min(1).max(120).optional(),
181
- command: external_exports.string().trim().min(1).max(2e3).optional(),
182
- requiresStart: external_exports.boolean().optional()
183
- }).strict().optional(),
184
- requiresStart: external_exports.boolean().optional(),
185
- budget: external_exports.object({
186
- maxUsd: external_exports.string().trim().min(1).max(40).optional()
187
- }).strict().optional(),
188
- resources: SandboxTemplateResourcesSchema.optional(),
189
- quotas: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
190
- lifecycle: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
191
- retentionPolicy: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
192
- env: external_exports.array(
193
- external_exports.object({
194
- name: external_exports.string().trim().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).max(191),
195
- value: external_exports.string().optional(),
196
- secretRef: external_exports.string().optional()
197
- }).strict()
198
- ).max(100).optional(),
199
- integrationLeases: external_exports.array(external_exports.record(external_exports.string(), external_exports.unknown())).max(20).optional(),
200
- metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
201
- }).strict().superRefine((schedule, context) => {
202
- const expressionCount = [
203
- schedule.cron,
204
- schedule.rate,
205
- schedule.once,
206
- schedule.scheduleExpression
207
- ].filter((value) => typeof value === "string" && value.trim()).length;
208
- if (expressionCount !== 1) {
209
- context.addIssue({
210
- code: external_exports.ZodIssueCode.custom,
211
- path: ["scheduleExpression"],
212
- message: "schedule must declare exactly one of cron, rate, once, or scheduleExpression"
213
- });
214
- }
215
- if (schedule.scheduleExpression && !schedule.scheduleType) {
216
- context.addIssue({
217
- code: external_exports.ZodIssueCode.custom,
218
- path: ["scheduleType"],
219
- message: "scheduleType is required with scheduleExpression"
220
- });
221
- }
222
- const command = schedule.command ?? schedule.target?.command ?? null;
223
- const targetName = schedule.target?.name ?? null;
224
- const actionName = schedule.actionName ?? schedule.action ?? schedule.target?.actionName ?? (schedule.target?.kind === "action" ? targetName : null);
225
- const kind = schedule.target?.kind ?? (command ? "command" : "action");
226
- if (kind === "action" && !actionName) {
227
- context.addIssue({
228
- code: external_exports.ZodIssueCode.custom,
229
- path: ["action"],
230
- message: "schedule action target is required"
231
- });
232
- }
233
- if (kind === "service" && !targetName) {
234
- context.addIssue({
235
- code: external_exports.ZodIssueCode.custom,
236
- path: ["target", "name"],
237
- message: "schedule service target name is required"
238
- });
239
- }
240
- if (kind === "command" && !command) {
241
- context.addIssue({
242
- code: external_exports.ZodIssueCode.custom,
243
- path: ["command"],
244
- message: "schedule command target is required"
245
- });
246
- }
247
- });
248
- var SandboxTemplateManifestSchema = external_exports.object({
249
- schemaVersion: external_exports.literal(1),
250
- name: external_exports.string().trim().min(1).max(80).regex(/^[a-z0-9][a-z0-9-]*[a-z0-9]$/),
251
- version: external_exports.string().trim().min(1).max(40),
252
- useCase: external_exports.string().trim().min(1).max(80),
253
- description: external_exports.string().trim().min(1).max(500),
254
- runtime: SandboxTemplateRuntimeSchema,
255
- resources: SandboxTemplateResourcesSchema.optional(),
256
- setup: external_exports.object({
257
- commands: CommandListSchema.default([])
258
- }).strict().default({ commands: [] }),
259
- validation: external_exports.object({
260
- commands: CommandListSchema.min(1),
261
- probes: external_exports.array(SandboxTemplateValidationProbeSchema).max(20).default([])
262
- }).strict(),
263
- start: SandboxTemplateCommandSchema,
264
- actions: external_exports.array(SandboxTemplateNamedCommandSchema).max(20).default([]),
265
- services: external_exports.array(SandboxTemplateNamedCommandSchema).max(20).default([]),
266
- schedules: external_exports.array(SandboxTemplateScheduleSchema).max(20).default([]),
267
- mcp: external_exports.object({
268
- endpoints: external_exports.array(SandboxTemplateMcpEndpointSchema).max(10).default([])
269
- }).strict().default({ endpoints: [] }),
270
- volumes: external_exports.array(SandboxTemplateVolumeSchema).max(5).default([]),
271
- integrations: external_exports.object({
272
- requiredLeases: external_exports.array(SandboxTemplateRequiredLeaseSchema).max(20).default([])
273
- }).strict().default({ requiredLeases: [] }),
274
- permissions: SandboxTemplatePermissionsSchema,
275
- inputs: external_exports.object({
276
- schema: SandboxTemplateJsonSchema.default({ type: "object" }),
277
- env: external_exports.array(SandboxTemplateEnvInputSchema).max(100).default([])
278
- }).strict().default({ schema: { type: "object" }, env: [] }),
279
- artifacts: external_exports.object({
280
- paths: external_exports.array(RelativeWorkspacePathSchema).max(100).default([])
281
- }).strict().default({ paths: [] }),
282
- network: external_exports.object({
283
- egress: external_exports.enum(["restricted", "allow", "block"]).default("restricted")
284
- }).strict().default({ egress: "restricted" })
285
- }).strict().superRefine((manifest, context) => {
286
- validateExecutableNames(manifest, context);
287
- addDuplicateNameIssue(
288
- context,
289
- manifest.volumes.flatMap((volume) => volume.name ? [volume.name] : []),
290
- "volume names must be unique",
291
- "volumes"
292
- );
293
- validateInputSchemaUploadTargets(manifest, context);
294
- validateEnvInputs(manifest, context);
295
- validateMcpEndpoints(manifest, context);
296
- validateScheduleTargets(manifest, context);
297
- });
298
- var SandboxTemplateValidationDiagnosticSchema = external_exports.object({
299
- path: external_exports.string(),
300
- message: external_exports.string(),
301
- code: external_exports.string()
302
- });
303
- function validateSandboxTemplateYaml(source) {
304
- let parsed;
305
- try {
306
- parsed = yaml.load(source);
307
- } catch (error) {
308
- return {
309
- ok: false,
310
- manifest: null,
311
- diagnostics: [
312
- {
313
- path: "$",
314
- code: "invalid_yaml",
315
- message: error instanceof Error ? error.message : "Invalid YAML"
316
- }
317
- ]
318
- };
319
- }
320
- return validateSandboxTemplateManifest(parsed);
321
- }
322
- function validateSandboxTemplateManifest(value) {
323
- if (!value || typeof value !== "object" || Array.isArray(value)) {
324
- return {
325
- ok: false,
326
- manifest: null,
327
- diagnostics: [
328
- {
329
- path: "$",
330
- code: "invalid_type",
331
- message: `${OPENPOND_MANIFEST_FILE_NAME} must be an object`
332
- }
333
- ]
334
- };
335
- }
336
- if (Object.prototype.hasOwnProperty.call(value, "databases")) {
337
- return {
338
- ok: false,
339
- manifest: null,
340
- diagnostics: [
341
- {
342
- path: "$.databases",
343
- code: "database_resources_removed",
344
- message: "managed database requests are unsupported for Firecracker sandbox templates; use a durable volume with SQLite or files instead"
345
- }
346
- ]
347
- };
348
- }
349
- const result = SandboxTemplateManifestSchema.safeParse(value);
350
- if (result.success)
351
- return { ok: true, manifest: result.data, diagnostics: [] };
352
- return {
353
- ok: false,
354
- manifest: null,
355
- diagnostics: result.error.issues.map((issue) => ({
356
- path: formatIssuePath(issue.path),
357
- code: issue.code,
358
- message: issue.message
359
- }))
360
- };
361
- }
362
- function formatSandboxTemplateDiagnostics(diagnostics) {
363
- return diagnostics.map((diagnostic) => `${diagnostic.path}: ${diagnostic.message}`).join("\n");
364
- }
365
- function sandboxTemplateExecutableEntries(manifest) {
366
- return [
367
- {
368
- kind: "start",
369
- name: "start",
370
- ...manifest.start,
371
- artifactPaths: commandArtifactPaths(manifest.start, manifest)
372
- },
373
- ...manifest.actions.map((action) => ({
374
- kind: "action",
375
- name: action.name,
376
- command: action.command,
377
- cwd: action.cwd,
378
- timeoutSeconds: action.timeoutSeconds,
379
- requiresStart: action.requiresStart,
380
- ports: action.ports,
381
- artifactPaths: commandArtifactPaths(action, manifest)
382
- })),
383
- ...manifest.services.map((service) => ({
384
- kind: "service",
385
- name: service.name,
386
- command: service.command,
387
- cwd: service.cwd,
388
- timeoutSeconds: service.timeoutSeconds,
389
- requiresStart: service.requiresStart,
390
- ports: service.ports,
391
- artifactPaths: commandArtifactPaths(service, manifest)
392
- }))
393
- ];
394
- }
395
- function sandboxTemplateBuildMetadata(manifest) {
396
- const executables = sandboxTemplateExecutableEntries(manifest);
397
- return {
398
- template: {
399
- name: manifest.name,
400
- version: manifest.version,
401
- useCase: manifest.useCase,
402
- runtime: manifest.runtime
403
- },
404
- resources: manifest.resources ?? null,
405
- volumes: manifest.volumes,
406
- executables: executables.map((entry) => ({
407
- kind: entry.kind,
408
- name: entry.name,
409
- command: entry.command,
410
- cwd: entry.cwd ?? null,
411
- timeoutSeconds: entry.timeoutSeconds ?? null,
412
- requiresStart: entry.requiresStart,
413
- ports: entry.ports.map((port) => port.port),
414
- artifactPaths: entry.artifactPaths
415
- })),
416
- ports: executables.flatMap(
417
- (entry) => entry.ports.map((port) => ({
418
- executable: entry.name,
419
- kind: entry.kind,
420
- port: port.port,
421
- access: port.access,
422
- label: port.label ?? null
423
- }))
424
- ),
425
- appMcpEndpoints: manifest.mcp.endpoints.map((endpoint) => ({
426
- name: endpoint.name ?? null,
427
- service: endpoint.service ?? null,
428
- port: endpoint.port,
429
- path: endpoint.path
430
- })),
431
- validation: {
432
- commands: manifest.validation.commands,
433
- probes: manifest.validation.probes
434
- },
435
- schedules: manifest.schedules
436
- };
437
- }
438
- function sandboxTemplateBuildPlan(input) {
439
- return {
440
- kind: SANDBOX_TEMPLATE_BUILD_PLAN_KIND,
441
- schemaVersion: 1,
442
- manifestFile: input.manifestFile,
443
- projectRoot: input.projectRoot,
444
- manifest: input.manifest,
445
- metadata: sandboxTemplateBuildMetadata(input.manifest),
446
- executables: sandboxTemplateExecutableEntries(input.manifest)
447
- };
448
- }
449
- function sandboxTemplateScaffoldFiles(input) {
450
- const displayName = input.name.trim() || "Sandbox Template";
451
- const name = slug(displayName);
452
- const description = input.description?.trim() || `Local scaffold for ${displayName}.`;
453
- return {
454
- ".gitignore": ["node_modules", "artifacts", ".DS_Store", ""].join("\n"),
455
- "README.md": [
456
- `# ${displayName}`,
457
- "",
458
- "Local sandbox template scaffold.",
459
- "",
460
- "## Commands",
461
- "",
462
- "- `pnpm dev` starts the preview service on port 3000.",
463
- "- `pnpm process` writes a sample artifact.",
464
- `- \`pnpm validate\` validates ${OPENPOND_MANIFEST_FILE_NAME}.`,
465
- ""
466
- ].join("\n"),
467
- "package.json": `${JSON.stringify(
468
- {
469
- private: true,
470
- type: "module",
471
- scripts: {
472
- dev: "node src/server.ts",
473
- process: "node scripts/process.ts",
474
- validate: `openpond sandbox-template validate --file ${OPENPOND_MANIFEST_FILE_NAME}`
475
- }
476
- },
477
- null,
478
- 2
479
- )}
480
- `,
481
- [OPENPOND_MANIFEST_FILE_NAME]: [
482
- "schemaVersion: 1",
483
- `name: ${name}`,
484
- "version: 0.1.0",
485
- "useCase: sandbox-template-scaffold",
486
- `description: ${description}`,
487
- "runtime:",
488
- " base: node-bun-workspace",
489
- "resources:",
490
- " cpu: 1",
491
- " memoryGb: 1",
492
- " diskGb: 8",
493
- "setup:",
494
- " commands:",
495
- " - mkdir -p artifacts",
496
- "validation:",
497
- " commands:",
498
- " - test -f src/server.ts",
499
- " - test -f scripts/process.ts",
500
- "start:",
501
- " command: pnpm process",
502
- " timeoutSeconds: 300",
503
- " ports: []",
504
- " artifactPaths:",
505
- " - artifacts/result.json",
506
- "actions: []",
507
- "schedules: []",
508
- "services:",
509
- " - name: web",
510
- " command: pnpm dev",
511
- " timeoutSeconds: 3600",
512
- " ports:",
513
- " - port: 3000",
514
- " protocol: http",
515
- " label: web",
516
- " access: private",
517
- " path: /",
518
- " artifactPaths: []",
519
- "inputs:",
520
- " env:",
521
- " - name: FOO_API_KEY",
522
- " required: false",
523
- " secret: true",
524
- " description: API key used by the sample action.",
525
- " schema:",
526
- " type: object",
527
- " properties:",
528
- " subject:",
529
- " type: string",
530
- " title: Subject",
531
- " default: Example",
532
- "artifacts:",
533
- " paths:",
534
- " - artifacts/result.json",
535
- "network:",
536
- " egress: restricted",
537
- ""
538
- ].join("\n"),
539
- "src/server.ts": [
540
- "import { createServer } from 'node:http';",
541
- "",
542
- "createServer((_request, response) => {",
543
- " response.setHeader('content-type', 'application/json');",
544
- " response.end(JSON.stringify({ ok: true, template: 'sandbox-template-scaffold' }));",
545
- "}).listen(3000, '0.0.0.0');",
546
- ""
547
- ].join("\n"),
548
- "scripts/process.ts": [
549
- "import { mkdir, writeFile } from 'node:fs/promises';",
550
- "",
551
- "const raw = process.env.OPENPOND_REPLAY_PARAMS_BASE64;",
552
- "const params = raw ? JSON.parse(Buffer.from(raw, 'base64').toString('utf8')).input ?? {} : {};",
553
- "await mkdir('artifacts', { recursive: true });",
554
- "await writeFile('artifacts/result.json', JSON.stringify({ ok: true, input: params }, null, 2));",
555
- "console.log('wrote artifacts/result.json');",
556
- ""
557
- ].join("\n"),
558
- "fixtures/input.txt": "Example input\n"
559
- };
560
- }
561
- function sandboxTemplateJsonSchema() {
562
- return external_exports.toJSONSchema(SandboxTemplateManifestSchema);
563
- }
564
- function isSafeRelativeWorkspacePath(value) {
565
- return !value.includes("\0") && !value.startsWith("/") && !value.split(/[\\/]+/).some((segment) => segment === ".." || segment === "");
566
- }
567
- function formatIssuePath(path) {
568
- if (path.length === 0) return "$";
569
- return `$${path.map(
570
- (part) => typeof part === "number" ? `[${part}]` : `.${String(part)}`
571
- ).join("")}`;
572
- }
573
- function addDuplicateNameIssue(context, names, message, path) {
574
- const seen = /* @__PURE__ */ new Set();
575
- for (const name of names) {
576
- if (seen.has(name)) {
577
- context.addIssue({
578
- code: external_exports.ZodIssueCode.custom,
579
- path: [path],
580
- message
581
- });
582
- return;
583
- }
584
- seen.add(name);
585
- }
586
- }
587
- function validateExecutableNames(manifest, context) {
588
- const names = [
589
- "start",
590
- ...manifest.actions.map((action) => action.name),
591
- ...manifest.services.map((service) => service.name)
592
- ];
593
- addDuplicateNameIssue(
594
- context,
595
- names,
596
- "start, action, and service names must be unique",
597
- "actions"
598
- );
599
- }
600
- function validateInputSchemaUploadTargets(manifest, context) {
601
- const properties = asRecord(manifest.inputs.schema.properties);
602
- const volumeNames = new Set(
603
- manifest.volumes.map((volume) => volume.name).filter((name) => Boolean(name))
604
- );
605
- for (const [inputName, rawProperty] of Object.entries(properties)) {
606
- const property = asRecord(rawProperty);
607
- const upload = asRecord(
608
- property["x-openpond-upload"] ?? property.xOpenPondUpload
609
- );
610
- const targetPath = typeof upload.targetPath === "string" && upload.targetPath.trim() ? upload.targetPath.trim() : typeof upload.path === "string" && upload.path.trim() ? upload.path.trim() : "";
611
- if (!targetPath) continue;
612
- const normalizedTargetPath = targetPath.replace(/^workspace\//, "").replace(/^\/+/, "").replace(/\/+$/, "");
613
- if (!isSafeRelativeWorkspacePath(normalizedTargetPath)) {
614
- context.addIssue({
615
- code: external_exports.ZodIssueCode.custom,
616
- path: [
617
- "inputs",
618
- "schema",
619
- "properties",
620
- inputName,
621
- "x-openpond-upload",
622
- "targetPath"
623
- ],
624
- message: "upload target must be a relative workspace path"
625
- });
626
- continue;
627
- }
628
- const parts = normalizedTargetPath.split("/");
629
- if (parts[0] === "volumes" && (!parts[1] || !volumeNames.has(parts[1]))) {
630
- context.addIssue({
631
- code: external_exports.ZodIssueCode.custom,
632
- path: [
633
- "inputs",
634
- "schema",
635
- "properties",
636
- inputName,
637
- "x-openpond-upload",
638
- "targetPath"
639
- ],
640
- message: "upload target references an undeclared volume"
641
- });
642
- }
643
- }
644
- }
645
- function validateEnvInputs(manifest, context) {
646
- addDuplicateNameIssue(
647
- context,
648
- manifest.inputs.env.map((env) => env.name),
649
- "env input names must be unique",
650
- "inputs"
651
- );
652
- }
653
- function validateMcpEndpoints(manifest, context) {
654
- const servicePorts = new Map(
655
- manifest.services.map((service) => [
656
- service.name,
657
- new Set(service.ports.map((port) => port.port))
658
- ])
659
- );
660
- const declaredPorts = /* @__PURE__ */ new Set([
661
- ...manifest.start.ports.map((port) => port.port),
662
- ...manifest.services.flatMap(
663
- (service) => service.ports.map((port) => port.port)
664
- )
665
- ]);
666
- for (const [index, endpoint] of manifest.mcp.endpoints.entries()) {
667
- if (endpoint.service) {
668
- const ports = servicePorts.get(endpoint.service);
669
- if (!ports) {
670
- context.addIssue({
671
- code: external_exports.ZodIssueCode.custom,
672
- path: ["mcp", "endpoints", index, "service"],
673
- message: `app MCP service does not exist: ${endpoint.service}`
674
- });
675
- continue;
676
- }
677
- if (!ports.has(endpoint.port)) {
678
- context.addIssue({
679
- code: external_exports.ZodIssueCode.custom,
680
- path: ["mcp", "endpoints", index, "port"],
681
- message: `app MCP port ${endpoint.port} is not declared on service ${endpoint.service}`
682
- });
683
- }
684
- continue;
685
- }
686
- if (!declaredPorts.has(endpoint.port)) {
687
- context.addIssue({
688
- code: external_exports.ZodIssueCode.custom,
689
- path: ["mcp", "endpoints", index, "port"],
690
- message: `app MCP port ${endpoint.port} is not declared on start or services`
691
- });
692
- }
693
- }
694
- }
695
- function validateScheduleTargets(manifest, context) {
696
- const actionNames = new Set(manifest.actions.map((action) => action.name));
697
- const serviceNames = new Set(
698
- manifest.services.map((service) => service.name)
699
- );
700
- for (const [index, schedule] of manifest.schedules.entries()) {
701
- const command = schedule.command ?? schedule.target?.command ?? null;
702
- if (schedule.target?.kind === "command" || command) {
703
- continue;
704
- }
705
- const actionName = schedule.actionName ?? schedule.action ?? schedule.target?.actionName ?? (schedule.target?.kind === "action" ? schedule.target?.name : null);
706
- if (actionName && !actionNames.has(actionName)) {
707
- context.addIssue({
708
- code: external_exports.ZodIssueCode.custom,
709
- path: ["schedules", index, "action"],
710
- message: `schedule action target does not exist: ${actionName}`
711
- });
712
- }
713
- if (schedule.target?.kind === "service") {
714
- const serviceName = schedule.target.name ?? "";
715
- if (serviceName && !serviceNames.has(serviceName)) {
716
- context.addIssue({
717
- code: external_exports.ZodIssueCode.custom,
718
- path: ["schedules", index, "target", "name"],
719
- message: `schedule service target does not exist: ${serviceName}`
720
- });
721
- }
722
- }
723
- }
724
- }
725
- function asRecord(value) {
726
- return value && typeof value === "object" && !Array.isArray(value) ? value : {};
727
- }
728
- function commandArtifactPaths(command, manifest) {
729
- return command.artifactPaths.length > 0 ? command.artifactPaths : manifest.artifacts.paths;
730
- }
731
- function slug(value) {
732
- return value.toLowerCase().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "").replace(/-{2,}/g, "-").slice(0, 80) || "sandbox-template";
733
- }
734
-
735
- export {
736
- OPENPOND_MANIFEST_FILE_NAME,
737
- SANDBOX_TEMPLATE_BUILD_PLAN_FILE_NAME,
738
- SANDBOX_TEMPLATE_BUILD_PLAN_KIND,
739
- validateSandboxTemplateYaml,
740
- formatSandboxTemplateDiagnostics,
741
- sandboxTemplateExecutableEntries,
742
- sandboxTemplateBuildMetadata,
743
- sandboxTemplateBuildPlan,
744
- sandboxTemplateScaffoldFiles,
745
- sandboxTemplateJsonSchema
746
- };