openpond 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +4 -4
  2. package/dist/cache.d.ts +7 -10
  3. package/dist/chunks/{app-layer-XEYHFJHI.js → app-layer-F3CGXB33.js} +9 -7
  4. package/dist/chunks/{app-server-runtime-FJM2EQPH.js → app-server-runtime-RHO5TFUC.js} +9 -7
  5. package/dist/chunks/{apps-GSXUDK6V.js → apps-L5XCL7QY.js} +12 -10
  6. package/dist/chunks/{chunk-J7PYGDRY.js → chunk-26AMV5ZI.js} +1 -1
  7. package/dist/chunks/{chunk-DNXBJZAU.js → chunk-3EB7I67T.js} +1 -1
  8. package/dist/chunks/{chunk-J3YDKJFD.js → chunk-3ELF4FXY.js} +19 -11
  9. package/dist/chunks/{chunk-HFPUR4CQ.js → chunk-3VEYNDHN.js} +10 -10
  10. package/dist/chunks/chunk-4KA25HUP.js +5648 -0
  11. package/dist/chunks/{chunk-EFET7LB7.js → chunk-6SMNG6YA.js} +62 -90
  12. package/dist/chunks/{chunk-N3TGCM7J.js → chunk-7RIGZB7N.js} +50 -37
  13. package/dist/chunks/{chunk-47EIAYI7.js → chunk-A6G3PFA5.js} +6 -4
  14. package/dist/chunks/{chunk-D7BO5Y5J.js → chunk-FJ2JGB2N.js} +31 -189
  15. package/dist/chunks/{chunk-WBAZFKC7.js → chunk-G65WAOJV.js} +2 -2
  16. package/dist/chunks/{chunk-CNTM26OW.js → chunk-K4TZEHAW.js} +16 -16
  17. package/dist/chunks/{chunk-DJL4TJYG.js → chunk-KCRCIQPD.js} +1 -5
  18. package/dist/chunks/chunk-OCBRPU2K.js +629 -0
  19. package/dist/chunks/{chunk-2JABRRNR.js → chunk-PS37DB5F.js} +1 -1
  20. package/dist/chunks/{chunk-C5TKGE5Y.js → chunk-UZMVNKXM.js} +1 -1
  21. package/dist/chunks/{chunk-O6B6YCMI.js → chunk-VT6BLHMB.js} +10750 -1240
  22. package/dist/chunks/{chunk-5TKZBMQM.js → chunk-X6F4LBTQ.js} +102 -1
  23. package/dist/chunks/{chunk-6G6MDZLM.js → chunk-XA4KBDMY.js} +213 -999
  24. package/dist/chunks/chunk-ZNQEROWP.js +254 -0
  25. package/dist/chunks/{cli-6PFRZ2WV.js → cli-D2MUUBEX.js} +7 -5
  26. package/dist/chunks/configuration-command-NR6JYIUD.js +187 -0
  27. package/dist/chunks/{continual-FYDKLCO7.js → continual-37CE4LLJ.js} +4 -4
  28. package/dist/chunks/{core-commands-MAN3CSJQ.js → core-commands-SWGIOZLW.js} +8 -6
  29. package/dist/chunks/database-DEYUZDIM.js +20 -0
  30. package/dist/chunks/{desktop-test-OE5SST2W.js → desktop-test-QOS7G5NE.js} +8 -6
  31. package/dist/chunks/dist-AKYCQNNF.js +187 -0
  32. package/dist/chunks/{extension-J3CIEDP4.js → extension-HJUJBQAD.js} +67 -730
  33. package/dist/chunks/{help-JNGJJFU5.js → help-J6PZ23IC.js} +1 -1
  34. package/dist/chunks/{opchat-6HEQJFLL.js → opchat-ABX5YBAT.js} +9 -7
  35. package/dist/chunks/{organizations-MWAPNOCK.js → organizations-CPNC47DO.js} +8 -6
  36. package/dist/chunks/{profile-P7HMONTZ.js → profile-Q3HB5MIO.js} +16 -14
  37. package/dist/chunks/{project-agent-2RAK7GAZ.js → project-agent-YHUBX4OR.js} +9 -7
  38. package/dist/chunks/{sandbox-command-G22CPFNK.js → sandbox-command-YFL5QTWX.js} +8 -6
  39. package/dist/chunks/{sandbox-template-S4WRUWJ6.js → sandbox-template-Z6P7NTNF.js} +12 -10
  40. package/dist/chunks/{src-BKBZ7WLO.js → src-7XEENEBI.js} +16 -12
  41. package/dist/chunks/{src-RTGN2O4H.js → src-KBBIV4NT.js} +1376 -10996
  42. package/dist/chunks/{taskset-BMI7KOWP.js → taskset-2TRZBRRT.js} +1 -1
  43. package/dist/chunks/{teams-bot-5VBYEN7M.js → teams-bot-WD33NLH5.js} +7 -5
  44. package/dist/chunks/{training-UPVSGDTB.js → training-4XH37UZB.js} +1 -1
  45. package/dist/chunks/{workspaces-IJQPWX3H.js → workspaces-WG2MH2WE.js} +2 -2
  46. package/dist/cli.js +25 -17
  47. package/dist/client.d.ts +1 -1
  48. package/dist/config.d.ts +1 -0
  49. package/dist/index.js +20803 -15878
  50. package/dist/private-json-file.d.ts +1 -2
  51. package/dist/web/assets/App-C9aGkxVg.js +173 -0
  52. package/dist/web/assets/{AppDialog-BCjKFUBn.js → AppDialog-CK6_lg8c.js} +1 -1
  53. package/dist/web/assets/{AppTerminalPanel-DRU8GIfy.js → AppTerminalPanel-BKqgX4sd.js} +2 -2
  54. package/dist/web/assets/{AppsView-Ck_OzQWf.js → AppsView-B1NUuAIf.js} +1 -1
  55. package/dist/web/assets/{BrowserSidebar-CqciX8aL.js → BrowserSidebar-DOvYxXeP.js} +1 -1
  56. package/dist/web/assets/{CartesianChart-Y0lsL4vC.js → CartesianChart-pOrYpzBr.js} +1 -1
  57. package/dist/web/assets/{CollaborationTabs-BOb9PjvS.js → CollaborationTabs-CgbR-MBJ.js} +1 -1
  58. package/dist/web/assets/{CommandMenu-Co6JnmTu.js → CommandMenu-CrIr4qUX.js} +1 -1
  59. package/dist/web/assets/{CommunityView-BbTSeL7h.js → CommunityView-CvAVQ_HZ.js} +1 -1
  60. package/dist/web/assets/{ComposerCreateImproveStrip-BGzCWVFp.js → ComposerCreateImproveStrip-DybcKwwd.js} +1 -1
  61. package/dist/web/assets/GetStartedView-DVInkexN.js +1 -0
  62. package/dist/web/assets/{LabModelVersionDetailPage-CrudId_1.js → LabModelVersionDetailPage-NaaPElmM.js} +1 -1
  63. package/dist/web/assets/{LabSkillSidebar-C5oS6UmH.js → LabSkillSidebar-CuaYrtiu.js} +1 -1
  64. package/dist/web/assets/LabsRoute-BRR6x3SX.js +2 -0
  65. package/dist/web/assets/{MainChatThread-VtMpAxlP.js → MainChatThread-BfkjCZB9.js} +2 -2
  66. package/dist/web/assets/MainPane-Gw-YK38n.js +8 -0
  67. package/dist/web/assets/{MarkdownText-DqJarmTh.js → MarkdownText-DOlVQR8a.js} +1 -1
  68. package/dist/web/assets/{Messages-BaT7HOzB.js → Messages-DMubppta.js} +6 -6
  69. package/dist/web/assets/{NativeSkillSidebar-DXp8snN5.js → NativeSkillSidebar-DSFwZ-od.js} +1 -1
  70. package/dist/web/assets/{NewExperienceSwitcher-CLHuGUN5.js → NewExperienceSwitcher-Dj0ePIJ-.js} +1 -1
  71. package/dist/web/assets/{NewProjectDialog-CzpHCAaC.js → NewProjectDialog-B8NQV-Ji.js} +1 -1
  72. package/dist/web/assets/{OutputsPage-DIzx-Ge6.js → OutputsPage-D_LDYTgV.js} +1 -1
  73. package/dist/web/assets/{ProjectsPage-DojwrhOy.js → ProjectsPage-xjDYPc_W.js} +1 -1
  74. package/dist/web/assets/RightChatPanelStack-BktRQ9wg.js +1 -0
  75. package/dist/web/assets/{RightSidebarHomePanel-DTzfuEX3.js → RightSidebarHomePanel-j0VckZUu.js} +1 -1
  76. package/dist/web/assets/ScheduledWorkPage-1aT4bBY-.js +1 -0
  77. package/dist/web/assets/SettingsView-BSpuMDpv.js +9 -0
  78. package/dist/web/assets/SettingsView-CAH0vreE.css +1 -0
  79. package/dist/web/assets/{TeamChatView-C4-nG1tC.js → TeamChatView-BPWJbDf1.js} +2 -2
  80. package/dist/web/assets/{TerminalOverlay-DnNVrCtu.js → TerminalOverlay-CrSwUk2d.js} +1 -1
  81. package/dist/web/assets/{TrainingCreationPanel-CDwwyucO.js → TrainingCreationPanel-B4HMRwUg.js} +1 -1
  82. package/dist/web/assets/{TrainingDraftPanel-BijDnV_0.js → TrainingDraftPanel-D4r1tN3I.js} +1 -1
  83. package/dist/web/assets/{UsageSettingsSection-Y5BFAu1p.js → UsageSettingsSection-2aymqwIM.js} +1 -1
  84. package/dist/web/assets/{WorkSidebarPanel-CkJlvZKm.js → WorkSidebarPanel-B0X0OiR6.js} +1 -1
  85. package/dist/web/assets/WorkspaceDiffPanel-Pg7GL0br.js +14 -0
  86. package/dist/web/assets/{WorkspaceEnvironmentMenu-D8knAy1q.js → WorkspaceEnvironmentMenu-OAfMEt7L.js} +3 -3
  87. package/dist/web/assets/{WorkspaceGitDialogs-_LHTrvh6.js → WorkspaceGitDialogs-YxcPH2Rq.js} +1 -1
  88. package/dist/web/assets/{WorkspaceMonacoEditor-B2B7OM_L.js → WorkspaceMonacoEditor-COKTiQZl.js} +3 -3
  89. package/dist/web/assets/{arrow-up-right-4nAzMtjW.js → arrow-up-right-_TX-awvK.js} +1 -1
  90. package/dist/web/assets/{chat-file-links-Bned0MT7.js → chat-file-links-CWLsRYvW.js} +1 -1
  91. package/dist/web/assets/chevron-up--mNnEqha.js +1 -0
  92. package/dist/web/assets/{clipboard-BzjUoZFo.js → clipboard-CyRSS8Sy.js} +1 -1
  93. package/dist/web/assets/{cloud-upload-CsrrwS-b.js → cloud-upload-uBJBUYTy.js} +1 -1
  94. package/dist/web/assets/{cssMode-CIbSSHKJ.js → cssMode-BrXSsZYs.js} +1 -1
  95. package/dist/web/assets/{folder-open-vRTuLzpS.js → folder-open-DktdZNW7.js} +1 -1
  96. package/dist/web/assets/{folder-plus-hyqwgUnx.js → folder-plus-DO06i9Vo.js} +1 -1
  97. package/dist/web/assets/{git-commit-horizontal-CaxKfeYa.js → git-commit-horizontal-zFSIkPs7.js} +1 -1
  98. package/dist/web/assets/{htmlMode-C3MGQGam.js → htmlMode-X9UMFkjt.js} +1 -1
  99. package/dist/web/assets/index-BEPmTPIA.js +1 -0
  100. package/dist/web/assets/{index-Dvq7bpBG.js → index-UOGdfLzi.js} +1 -1
  101. package/dist/web/assets/{info-aYWeE1Iw.js → info-BEJXUqCD.js} +1 -1
  102. package/dist/web/assets/{jsonMode-CpD6UkT7.js → jsonMode-DIsB-j2E.js} +1 -1
  103. package/dist/web/assets/{lspLanguageFeatures-DpcK8ZI6.js → lspLanguageFeatures-CmZ17KpA.js} +1 -1
  104. package/dist/web/assets/{minimize-2-DeYg7XqB.js → minimize-2-DumTpFtE.js} +1 -1
  105. package/dist/web/assets/{monaco.contribution-C-_ekTxy.js → monaco.contribution-D6w5PJji.js} +2 -2
  106. package/dist/web/assets/{monaco.contribution-CrrdDQgP.js → monaco.contribution-DJ_NmcHu.js} +2 -2
  107. package/dist/web/assets/{monaco.contribution-BDTM0ZJq.js → monaco.contribution-LZEujgny.js} +2 -2
  108. package/dist/web/assets/{monaco.contribution-JWFq0HzV.js → monaco.contribution-YVDfJcG4.js} +2 -2
  109. package/dist/web/assets/{play-BqgRTddV.js → play-CLFeH7CU.js} +1 -1
  110. package/dist/web/assets/{python-B67wope9.js → python-Djbda_qZ.js} +1 -1
  111. package/dist/web/assets/{refresh-cw-DwMA_2On.js → refresh-cw-B4IpQ_7Q.js} +1 -1
  112. package/dist/web/assets/{save-B0BKh5oQ.js → save-BbTHztnA.js} +1 -1
  113. package/dist/web/assets/{square-LY3oz82L.js → square-BJrVbmz6.js} +1 -1
  114. package/dist/web/assets/{toggleHighContrast-B2jka5B1.js → toggleHighContrast-BopU5W9S.js} +1 -1
  115. package/dist/web/assets/{tsMode-1MUwluYD.js → tsMode-CH_0_YDX.js} +1 -1
  116. package/dist/web/assets/{upload-bSKSkFVa.js → upload-UumVeufu.js} +1 -1
  117. package/dist/web/assets/{useLocalAgentSchedules--jnnM4Fz.js → useLocalAgentSchedules-BRa23U7O.js} +1 -1
  118. package/dist/web/assets/{wifi-off-DA34iPmr.js → wifi-off-BWJWivn6.js} +1 -1
  119. package/dist/web/assets/{workers-CczIcRcl.js → workers-pTe8RvSI.js} +1 -1
  120. package/dist/web/assets/{yaml-DwEGoHA9.js → yaml-DNLASORn.js} +1 -1
  121. package/dist/web/index.html +1 -1
  122. package/docs/command-reference.md +28 -2
  123. package/package.json +7 -5
  124. package/dist/chunks/chunk-KWDOAJJI.js +0 -238
  125. package/dist/web/assets/App-BOkhmdHu.js +0 -173
  126. package/dist/web/assets/GetStartedView-jEogFjxP.js +0 -1
  127. package/dist/web/assets/LabsRoute-9v8qwEBc.js +0 -2
  128. package/dist/web/assets/MainPane-BbknUzp3.js +0 -8
  129. package/dist/web/assets/RightChatPanelStack-CIE5bgmO.js +0 -1
  130. package/dist/web/assets/ScheduledWorkPage-DdbcQGSv.js +0 -1
  131. package/dist/web/assets/SettingsView-CC5GXaE1.css +0 -1
  132. package/dist/web/assets/SettingsView-QT_OLmDh.js +0 -6
  133. package/dist/web/assets/WorkspaceDiffPanel-CBgzmBk8.js +0 -14
  134. package/dist/web/assets/chevron-up-DK7ejCfk.js +0 -1
  135. package/dist/web/assets/index-66-ohHD5.js +0 -1
@@ -0,0 +1,629 @@
1
+ import { createRequire as __openpondCreateRequire } from "node:module"; var require = __openpondCreateRequire(import.meta.url);
2
+ import {
3
+ ensureCapabilityToken,
4
+ ownHomeRuntime,
5
+ publishRuntimeEndpoint,
6
+ runAppServerJsonl
7
+ } from "./chunk-X6F4LBTQ.js";
8
+ import {
9
+ getBundledRuntimeVersion,
10
+ openUrlWithSystemBrowser
11
+ } from "./chunk-6SMNG6YA.js";
12
+ import {
13
+ DEFAULT_HOST,
14
+ DEFAULT_PORT,
15
+ VERSION,
16
+ parseListen
17
+ } from "./chunk-KCRCIQPD.js";
18
+ import {
19
+ ClientChoicesSchema,
20
+ MigrationResolutionsSchema,
21
+ configEditorSchema,
22
+ configRecoveryRevisions,
23
+ fileRevision,
24
+ initializeHome,
25
+ patchConfig,
26
+ readClientChoices,
27
+ readMigrationJournal,
28
+ readOptionalFile,
29
+ replaceConfigText,
30
+ resolveEffectiveConfig,
31
+ restartMigration,
32
+ restoreConfigRevision,
33
+ setProjectTrust,
34
+ updateClientChoices,
35
+ validateConfigText
36
+ } from "./chunk-4KA25HUP.js";
37
+ import {
38
+ PersistenceError,
39
+ persistenceIssue,
40
+ resolveOpenPondHome,
41
+ storagePaths
42
+ } from "./chunk-ZNQEROWP.js";
43
+ import {
44
+ external_exports
45
+ } from "./chunk-FQS2QL5F.js";
46
+
47
+ // ../server/src/api/startup-recovery.ts
48
+ import { promises as fs } from "node:fs";
49
+ import os from "node:os";
50
+ import path from "node:path";
51
+ import { createServer } from "node:http";
52
+ import { randomBytes } from "node:crypto";
53
+
54
+ // ../server/src/api/configuration-payloads.ts
55
+ var operation = external_exports.discriminatedUnion("op", [
56
+ external_exports.strictObject({ op: external_exports.literal("set"), path: external_exports.array(external_exports.string().min(1)).min(1), value: external_exports.unknown() }),
57
+ external_exports.strictObject({ op: external_exports.literal("unset"), path: external_exports.array(external_exports.string().min(1)).min(1) })
58
+ ]);
59
+ var requestSchema = external_exports.discriminatedUnion("action", [
60
+ external_exports.strictObject({ action: external_exports.literal("patch"), expectedRevision: external_exports.string(), operations: external_exports.array(operation).max(100) }),
61
+ external_exports.strictObject({ action: external_exports.literal("replace"), expectedRevision: external_exports.string(), text: external_exports.string().max(1048576) }),
62
+ external_exports.strictObject({ action: external_exports.literal("validate"), text: external_exports.string().max(1048576) }),
63
+ external_exports.strictObject({ action: external_exports.literal("restore"), expectedRevision: external_exports.string(), revision: external_exports.string() }),
64
+ external_exports.strictObject({ action: external_exports.literal("trust"), root: external_exports.string(), accountId: external_exports.string(), trusted: external_exports.boolean() }),
65
+ external_exports.strictObject({ action: external_exports.literal("client-state"), owner: external_exports.string(), patch: ClientChoicesSchema, importOnly: external_exports.boolean().optional() })
66
+ ]);
67
+ function createConfigurationPayloads(home) {
68
+ let lastValid = null;
69
+ async function status(projectRoot, accountId) {
70
+ const file = storagePaths(home).config;
71
+ let text = null, issue = null, effective = null;
72
+ try {
73
+ text = await readOptionalFile(file);
74
+ effective = await resolveEffectiveConfig(home, { projectRoot, accountId });
75
+ if (!projectRoot) lastValid = effective;
76
+ } catch (error) {
77
+ issue = persistenceIssue(error, file);
78
+ }
79
+ const retained = effective ?? (projectRoot ? null : lastValid);
80
+ return {
81
+ path: file,
82
+ text,
83
+ rawRevision: fileRevision(text),
84
+ issue,
85
+ effective: retained,
86
+ usingLastValid: !effective && Boolean(retained),
87
+ applies: "next_turn",
88
+ recoverableRevisions: await configRecoveryRevisions(home),
89
+ clientState: issue ? null : await readClientChoices(home)
90
+ };
91
+ }
92
+ async function mutate(payload) {
93
+ const input = requestSchema.parse(payload);
94
+ if (input.action === "validate") return { valid: true, document: validateConfigText(input.text, storagePaths(home).config) };
95
+ if (input.action === "patch") await patchConfig(home, input.expectedRevision, input.operations);
96
+ if (input.action === "replace") await replaceConfigText(home, input.expectedRevision, input.text);
97
+ if (input.action === "restore") await restoreConfigRevision(home, input.revision, input.expectedRevision);
98
+ if (input.action === "trust") await setProjectTrust(home, input.root, input.accountId, input.trusted);
99
+ if (input.action === "client-state") return updateClientChoices(home, input.owner, input.patch, input.importOnly);
100
+ return status();
101
+ }
102
+ return { status, mutate, schema: configEditorSchema };
103
+ }
104
+
105
+ // ../server/src/api/http.ts
106
+ import { Buffer } from "node:buffer";
107
+ var CORS_HEADERS = {
108
+ "Access-Control-Allow-Headers": "authorization, content-type",
109
+ "Access-Control-Allow-Methods": "GET, POST, PUT, PATCH, DELETE, OPTIONS"
110
+ };
111
+ var DEFAULT_JSON_BODY_LIMIT_BYTES = 25 * 1024 * 1024;
112
+ var HttpBodyError = class extends Error {
113
+ constructor(status, code, message) {
114
+ super(message);
115
+ this.status = status;
116
+ this.code = code;
117
+ this.name = "HttpBodyError";
118
+ }
119
+ status;
120
+ code;
121
+ };
122
+ function applyCorsHeaders(request, response, options = {}) {
123
+ for (const [name, value] of Object.entries(CORS_HEADERS)) {
124
+ response.setHeader(name, value);
125
+ }
126
+ const origin = headerValue(request.headers.origin);
127
+ if (!origin) return { allowed: true, origin: null };
128
+ response.setHeader("Vary", appendVaryOrigin(response.getHeader("Vary")));
129
+ if (!isAllowedCorsOrigin(origin, options)) return { allowed: false, origin };
130
+ response.setHeader("Access-Control-Allow-Origin", origin);
131
+ return { allowed: true, origin };
132
+ }
133
+ function isAllowedCorsOrigin(origin, options = {}) {
134
+ if (origin === "null") return true;
135
+ const normalized = normalizeOrigin(origin);
136
+ if (!normalized) return false;
137
+ if (isLoopbackOrigin(normalized)) return true;
138
+ const allowedOrigins = new Set(
139
+ (options.allowedOrigins ?? []).map((value) => value ? normalizeOrigin(value) : null).filter((value) => Boolean(value))
140
+ );
141
+ return allowedOrigins.has(normalized);
142
+ }
143
+ function sendJson(response, status, payload) {
144
+ response.writeHead(status, {
145
+ "Content-Type": "application/json",
146
+ ...CORS_HEADERS
147
+ });
148
+ response.end(JSON.stringify(payload));
149
+ }
150
+ function sendText(response, status, payload) {
151
+ response.writeHead(status, {
152
+ "Content-Type": "text/plain; charset=utf-8",
153
+ ...CORS_HEADERS
154
+ });
155
+ response.end(payload);
156
+ }
157
+ function sendBinary(response, status, payload, contentType) {
158
+ response.writeHead(status, {
159
+ "Content-Type": contentType,
160
+ "Content-Length": String(payload.byteLength),
161
+ "Cache-Control": "no-store",
162
+ "X-Content-Type-Options": "nosniff",
163
+ ...CORS_HEADERS
164
+ });
165
+ response.end(payload);
166
+ }
167
+ async function readJson(request, options = {}) {
168
+ const maxBytes = options.maxBytes ?? DEFAULT_JSON_BODY_LIMIT_BYTES;
169
+ const contentType = headerValue(request.headers["content-type"]);
170
+ const chunks = [];
171
+ let byteLength = 0;
172
+ for await (const chunk of request) {
173
+ const buffer = Buffer.from(chunk);
174
+ byteLength += buffer.byteLength;
175
+ if (byteLength > maxBytes) {
176
+ throw new HttpBodyError(
177
+ 413,
178
+ "request_body_too_large",
179
+ `JSON request body exceeds ${maxBytes} bytes.`
180
+ );
181
+ }
182
+ chunks.push(buffer);
183
+ }
184
+ const raw = Buffer.concat(chunks).toString("utf8").trim();
185
+ if (!raw) return {};
186
+ if (!isJsonContentType(contentType)) {
187
+ throw new HttpBodyError(
188
+ 415,
189
+ "unsupported_media_type",
190
+ "JSON request body requires Content-Type: application/json."
191
+ );
192
+ }
193
+ try {
194
+ return JSON.parse(raw);
195
+ } catch {
196
+ throw new HttpBodyError(400, "invalid_json", "Request body is not valid JSON.");
197
+ }
198
+ }
199
+ function hasAuth(request, _url, token) {
200
+ const header = request.headers.authorization;
201
+ const bearer = typeof header === "string" && header.startsWith("Bearer ") ? header.slice(7) : null;
202
+ return bearer === token;
203
+ }
204
+ function headerValue(value) {
205
+ if (Array.isArray(value)) return value[0] ?? null;
206
+ return value ?? null;
207
+ }
208
+ function isJsonContentType(contentType) {
209
+ if (!contentType) return false;
210
+ const mediaType = contentType.split(";")[0]?.trim().toLowerCase();
211
+ return mediaType === "application/json" || Boolean(mediaType?.endsWith("+json"));
212
+ }
213
+ function normalizeOrigin(value) {
214
+ try {
215
+ const url = new URL(value);
216
+ if (url.protocol !== "http:" && url.protocol !== "https:") return null;
217
+ return url.origin;
218
+ } catch {
219
+ return null;
220
+ }
221
+ }
222
+ function isLoopbackOrigin(origin) {
223
+ const url = new URL(origin);
224
+ return url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "::1" || url.hostname === "[::1]";
225
+ }
226
+ function appendVaryOrigin(value) {
227
+ const existing = Array.isArray(value) ? value.join(", ") : value ? String(value) : "";
228
+ const parts = existing.split(",").map((part) => part.trim()).filter(Boolean);
229
+ if (!parts.some((part) => part.toLowerCase() === "origin")) parts.push("Origin");
230
+ return parts.join(", ");
231
+ }
232
+
233
+ // ../server/src/api/startup-recovery-page.ts
234
+ function startupRecoveryPage(nonce) {
235
+ return `<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>OpenPond recovery</title>
236
+ <style nonce="${nonce}">body{font:16px system-ui;background:#171819;color:#eee;max-width:850px;margin:6vh auto;padding:24px}textarea{box-sizing:border-box;width:100%;min-height:280px;background:#222;color:#eee;padding:14px;border:1px solid #777;border-radius:8px;font:14px monospace}button,input,select{font:inherit;margin:6px;padding:8px}pre{white-space:pre-wrap}code{overflow-wrap:anywhere}button{cursor:pointer}p{line-height:1.5}</style>
237
+ <h1>OpenPond needs a storage repair</h1><p id="issue" role="alert">Loading recovery details\u2026</p><p><code id="file"></code></p>
238
+ <p id="action"></p><p>Migration backups and the source installation remain available. Execution services are stopped while recovery is open.</p>
239
+ <details id="editor"><summary>Edit configuration</summary><textarea id="text" aria-label="Configuration TOML" spellcheck="false"></textarea><button id="save">Validate and save</button><button id="reload">Reload file</button><select id="revisions" aria-label="Restore a verified configuration revision"><option value="">Restore a verified revision\u2026</option></select></details>
240
+ <details><summary>Migration sources and diagnostics</summary><pre id="migration"></pre><label>Previous app home <input id="appHome"></label><label>Previous account config <input id="configSource"></label><label>Configuration conflict choices (JSON from the preview) <textarea id="resolutions" aria-label="Migration conflict choices" spellcheck="false" placeholder='[{"path":["chat","steer_active_responses"],"choice":"existing"}]'></textarea></label><button id="preview">Preview migration</button><button id="migrate">Use these sources</button><button id="restart">Restart failed preparation</button><button id="diagnostics">Export diagnostics</button></details>
241
+ <button id="retry">Retry startup</button><p id="message" role="status"></p>
242
+ <script nonce="${nonce}">
243
+ let token='',state=null,editing=false,revision=null;
244
+ const el=id=>document.getElementById(id);
245
+ async function request(route,body){const r=await fetch(route,{method:body?'POST':'GET',headers:{'Content-Type':'application/json',Authorization:'Bearer '+token},body:body?JSON.stringify(body):undefined});const v=await r.json();if(!r.ok)throw Error(v.error||'Recovery request failed');return v;}
246
+ function message(error){el('message').textContent=error instanceof Error?error.message:String(error);}
247
+ async function load(){state=await request('/v1/recovery');el('issue').textContent=state.issue.message;el('action').textContent=state.issue.action;el('file').textContent=state.issue.path;el('migration').textContent=JSON.stringify(state.migration,null,2);if(!editing){el('text').value=state.config.text||'schema_version = 1\\n';revision=state.config.rawRevision;}el('revisions').replaceChildren(new Option('Restore a verified revision\u2026',''),...state.config.recoverableRevisions.map(r=>new Option(r.createdAt,r.revision)));el('editor').hidden=!state.configEditable;}
248
+ el('text').oninput=()=>{editing=true};
249
+ el('reload').onclick=()=>{editing=false;load().catch(message)};
250
+ el('save').onclick=async()=>{try{await request('/v1/configuration',{action:'replace',text:el('text').value,expectedRevision:revision});editing=false;await load();message('Configuration saved. Retry startup when ready.')}catch(e){message(e)}};
251
+ el('revisions').onchange=async e=>{if(!e.target.value)return;try{await request('/v1/configuration',{action:'restore',revision:e.target.value,expectedRevision:state.config.rawRevision});editing=false;await load();message('Verified revision restored.')}catch(e){message(e)}};
252
+ for(const [id,action] of [['preview','preview'],['migrate','migrate'],['restart','restart']])el(id).onclick=async()=>{try{const result=await request('/v1/recovery',{action,sourceAppHome:el('appHome').value||undefined,sourceConfig:el('configSource').value||undefined,resolutions:el('resolutions').value?JSON.parse(el('resolutions').value):undefined});el('migration').textContent=JSON.stringify(result,null,2);message(action==='preview'?'Review the source paths above.':'Migration operation completed; retry startup.')}catch(e){message(e)}};
253
+ el('diagnostics').onclick=()=>{if(!state)return;const blob=new Blob([JSON.stringify({issue:state.issue,migration:state.migration,config:{path:state.config.path,rawRevision:state.config.rawRevision,issue:state.config.issue}},null,2)],{type:'application/json'});const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='openpond-recovery-diagnostics.json';a.click();URL.revokeObjectURL(a.href)};
254
+ el('retry').onclick=async()=>{try{await request('/v1/recovery',{action:'retry'});message('Starting OpenPond\u2026');const timer=setInterval(async()=>{try{const h=await(await fetch('/health')).json();if(!h.recovery){clearInterval(timer);const next=new URLSearchParams(location.hash.slice(1)).get('returnTo');if(next){const u=new URL(next);if(['localhost','127.0.0.1','[::1]'].includes(u.hostname)){location.replace(u.toString());return}}location.reload();}}catch{}},500)}catch(e){message(e)}};
255
+ (async()=>{const params=new URLSearchParams(location.hash.slice(1));token=params.get('openpondToken')||'';if(!token&&window.openpond?.getConnection)token=(await window.openpond.getConnection()).token;if(!token){message('Open the authenticated recovery URL from the launcher.');return}await load()})().catch(message);
256
+ </script></html>`;
257
+ }
258
+
259
+ // ../server/src/api/startup-recovery.ts
260
+ var recoveryRequest = external_exports.strictObject({ action: external_exports.enum(["preview", "migrate", "restart", "retry"]), sourceAppHome: external_exports.string().optional(), sourceConfig: external_exports.string().optional(), resolutions: MigrationResolutionsSchema.optional() });
261
+ function isRecoverableStartupError(error) {
262
+ return error instanceof PersistenceError && /^(PRIVATE_STORAGE_|UNSAFE_STORAGE_|INVALID_CONFIG|CONFIG_|MIGRATION_|SOURCE_CHANGED_|CREDENTIAL_|UNSUPPORTED_STORAGE_|INVALID_MIGRATION_|INVALID_ACCOUNT_|MISSING_INSTRUCTION_|INVALID_PROFILE_|DATABASE_RECOVERY_)/.test(error.issue.code);
263
+ }
264
+ async function startRecoveryServer(home, port, initialError) {
265
+ const readOnlyHome = /^(UNSUPPORTED_STORAGE_|INVALID_MIGRATION_|UNSAFE_STORAGE_|PRIVATE_STORAGE_)/.test(initialError.issue.code);
266
+ const runtimeHome = readOnlyHome ? await fs.mkdtemp(path.join(os.tmpdir(), "openpond-recovery-")) : home;
267
+ return ownHomeRuntime(runtimeHome, async () => {
268
+ const { token, tokenFile } = await ensureCapabilityToken(runtimeHome);
269
+ const configuration = createConfigurationPayloads(home);
270
+ let issue = initialError.issue;
271
+ let ready;
272
+ const repaired = new Promise((resolve) => {
273
+ ready = resolve;
274
+ });
275
+ const server = createServer((request, response) => {
276
+ void (async () => {
277
+ const url2 = new URL(request.url ?? "/", "http://127.0.0.1");
278
+ if (!applyCorsHeaders(request, response).allowed) {
279
+ sendJson(response, 403, { error: "Origin not allowed" });
280
+ return;
281
+ }
282
+ if (request.method === "OPTIONS") {
283
+ sendJson(response, 204, {});
284
+ return;
285
+ }
286
+ if (request.method === "GET" && url2.pathname === "/health") {
287
+ sendJson(response, 200, { ok: true, server: "openpond-app-server", version: VERSION, recovery: true });
288
+ return;
289
+ }
290
+ if (request.method === "GET" && url2.pathname === "/") {
291
+ const nonce = randomBytes(18).toString("base64");
292
+ response.writeHead(200, { "Content-Type": "text/html; charset=utf-8", "Cache-Control": "no-store", "Content-Security-Policy": `default-src 'none'; script-src 'nonce-${nonce}'; style-src 'nonce-${nonce}'; connect-src 'self'; base-uri 'none'; frame-ancestors 'none'` });
293
+ response.end(startupRecoveryPage(nonce));
294
+ return;
295
+ }
296
+ if (!hasAuth(request, url2, token)) {
297
+ sendJson(response, 401, { error: "Unauthorized" });
298
+ return;
299
+ }
300
+ const configEditable = !readOnlyHome;
301
+ if (request.method === "GET" && url2.pathname === "/v1/recovery") {
302
+ sendJson(response, 200, { issue, configEditable, config: readOnlyHome ? { path: storagePaths(home).config, text: null, rawRevision: "unavailable", issue, recoverableRevisions: [] } : await configuration.status(), migration: await readMigrationJournal(home).catch((error) => ({ issue: persistenceIssue(error, home) })) });
303
+ return;
304
+ }
305
+ if (request.method === "POST" && url2.pathname === "/v1/configuration" && configEditable) {
306
+ sendJson(response, 200, await configuration.mutate(await readJson(request)));
307
+ return;
308
+ }
309
+ if (request.method === "POST" && url2.pathname === "/v1/recovery") {
310
+ const input = recoveryRequest.parse(await readJson(request));
311
+ if (readOnlyHome && input.action !== "retry" && input.action !== "preview") throw initialError;
312
+ if (input.action === "restart") {
313
+ sendJson(response, 200, await restartMigration(home));
314
+ return;
315
+ }
316
+ if (input.action === "preview" || input.action === "migrate") {
317
+ sendJson(response, 200, await initializeHome(home, { sourceAppHome: input.sourceAppHome, sourceConfig: input.sourceConfig, resolutions: input.resolutions, dryRun: input.action === "preview" }));
318
+ return;
319
+ }
320
+ await initializeHome(home);
321
+ await resolveEffectiveConfig(home);
322
+ sendJson(response, 200, { ready: true });
323
+ ready();
324
+ return;
325
+ }
326
+ sendJson(response, 503, { error: `${issue.message} ${issue.action}`, issue, recovery: true });
327
+ })().catch((error) => {
328
+ issue = persistenceIssue(error, home);
329
+ sendJson(response, 422, { error: `${issue.message} ${issue.action}`, issue });
330
+ });
331
+ });
332
+ await new Promise((resolve, reject) => {
333
+ server.once("error", reject);
334
+ server.listen(port, "127.0.0.1", () => {
335
+ server.off("error", reject);
336
+ resolve();
337
+ });
338
+ });
339
+ const actualPort = server.address().port;
340
+ const url = `http://127.0.0.1:${actualPort}`;
341
+ await publishRuntimeEndpoint(runtimeHome, url, "startup-recovery");
342
+ return {
343
+ url,
344
+ port: actualPort,
345
+ token,
346
+ tokenFile,
347
+ storePath: storagePaths(home).database,
348
+ repaired,
349
+ close: async () => {
350
+ server.closeIdleConnections();
351
+ await new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
352
+ if (readOnlyHome) await fs.rm(runtimeHome, { recursive: true, force: true });
353
+ }
354
+ };
355
+ }).catch(async (error) => {
356
+ if (readOnlyHome) await fs.rm(runtimeHome, { recursive: true, force: true });
357
+ throw error;
358
+ });
359
+ }
360
+
361
+ // ../server/src/cli.ts
362
+ import { existsSync } from "node:fs";
363
+ import path2 from "node:path";
364
+ import { fileURLToPath } from "node:url";
365
+ var __dirname = path2.dirname(fileURLToPath(import.meta.url));
366
+ function requireValue(args, index, flag) {
367
+ const value = args[index + 1];
368
+ if (!value || value.startsWith("--")) throw new Error(`${flag} requires a value.`);
369
+ return value;
370
+ }
371
+ function parsePort(value, flag) {
372
+ const port = Number.parseInt(value, 10);
373
+ if (!Number.isFinite(port) || port < 0 || port > 65535) throw new Error(`${flag} must be a port from 0 to 65535.`);
374
+ return port;
375
+ }
376
+ function parseCliArgs(args) {
377
+ let mode = "serve";
378
+ let host = DEFAULT_HOST;
379
+ let port = DEFAULT_PORT;
380
+ let webRoot = null;
381
+ let openBrowser = false;
382
+ let printAccessUrl = false;
383
+ let storeDir = null;
384
+ let sourceBrowserState;
385
+ let index = 0;
386
+ const command = args[0];
387
+ if (command && !command.startsWith("-")) {
388
+ if (command === "serve" || command === "server") mode = "serve";
389
+ else if (command === "app-server") mode = "app-server";
390
+ else if (command === "web") mode = "web";
391
+ else if (command === "help") {
392
+ return { mode, host, port, webRoot, openBrowser, printAccessUrl, storeDir, help: true };
393
+ } else throw new Error(`Unknown command: ${command}`);
394
+ index = 1;
395
+ }
396
+ for (let i = index; i < args.length; i += 1) {
397
+ const arg = args[i];
398
+ if (arg === "--help" || arg === "-h") {
399
+ return { mode, host, port, webRoot, openBrowser, printAccessUrl, storeDir, help: true };
400
+ }
401
+ if (arg === "--listen") {
402
+ const listen = parseListen(requireValue(args, i, arg));
403
+ host = listen.host;
404
+ port = parsePort(String(listen.port), arg);
405
+ i += 1;
406
+ } else if (arg === "--hostname" || arg === "--host") {
407
+ host = requireValue(args, i, arg);
408
+ i += 1;
409
+ } else if (arg === "--port") {
410
+ port = parsePort(requireValue(args, i, arg), arg);
411
+ i += 1;
412
+ } else if (arg === "--web-root") {
413
+ webRoot = path2.resolve(requireValue(args, i, arg));
414
+ i += 1;
415
+ } else if (arg === "--source-browser-state") {
416
+ sourceBrowserState = path2.resolve(requireValue(args, i, arg));
417
+ i += 1;
418
+ } else if (arg === "--store-dir") {
419
+ throw new Error("--store-dir has been replaced by --home. Use --home <directory> or OPENPOND_HOME.");
420
+ } else if (arg === "--home") {
421
+ storeDir = path2.resolve(requireValue(args, i, arg));
422
+ i += 1;
423
+ } else if (arg === "--open-browser") {
424
+ openBrowser = true;
425
+ } else if (arg === "--print-access-url") {
426
+ printAccessUrl = true;
427
+ } else {
428
+ throw new Error(`Unknown option: ${arg}`);
429
+ }
430
+ }
431
+ if (openBrowser && printAccessUrl) {
432
+ throw new Error("--open-browser and --print-access-url cannot be used together.");
433
+ }
434
+ if (mode !== "web" && (openBrowser || printAccessUrl)) {
435
+ throw new Error("Browser options are only available in web mode.");
436
+ }
437
+ return { mode, host, port, webRoot, openBrowser, printAccessUrl, storeDir, sourceBrowserState, help: false };
438
+ }
439
+ function defaultWebRootCandidates() {
440
+ return [
441
+ process.env.OPENPOND_WEB_ROOT,
442
+ path2.resolve(process.cwd(), "apps/web/dist"),
443
+ path2.resolve(__dirname, "../../web/dist"),
444
+ path2.resolve(process.cwd(), "web"),
445
+ path2.resolve(__dirname, "../web")
446
+ ].filter((candidate) => Boolean(candidate));
447
+ }
448
+ function resolveWebRoot(explicitWebRoot) {
449
+ const candidates = explicitWebRoot ? [explicitWebRoot] : defaultWebRootCandidates();
450
+ for (const candidate of candidates) {
451
+ const resolved = path2.resolve(candidate);
452
+ if (existsSync(path2.join(resolved, "index.html"))) return resolved;
453
+ }
454
+ return null;
455
+ }
456
+ function formatHostForUrl(host) {
457
+ const browserHost = host === "0.0.0.0" || host === "::" ? "127.0.0.1" : host;
458
+ return browserHost.includes(":") && !browserHost.startsWith("[") ? `[${browserHost}]` : browserHost;
459
+ }
460
+ function browserBaseUrl(instance) {
461
+ return `http://${formatHostForUrl(instance.status.host)}:${instance.status.port}`;
462
+ }
463
+ function tokenizedWebUrl(baseUrl, token) {
464
+ const url = new URL(baseUrl);
465
+ const params = new URLSearchParams();
466
+ params.set("openpondServerUrl", baseUrl);
467
+ params.set("openpondToken", token);
468
+ url.hash = params.toString();
469
+ return url.toString();
470
+ }
471
+ async function resolveWebLaunchMessages(input, handOffToBrowser = openUrlWithSystemBrowser) {
472
+ const accessUrl = tokenizedWebUrl(input.baseUrl, input.token);
473
+ if (input.printAccessUrl) {
474
+ return { stdout: [`OpenPond access URL: ${accessUrl}`], stderr: [] };
475
+ }
476
+ if (!input.openBrowser) {
477
+ return { stdout: [`OpenPond web UI: ${input.baseUrl}`], stderr: [] };
478
+ }
479
+ const handoff = await handOffToBrowser(accessUrl);
480
+ if (handoff.opened) {
481
+ return { stdout: [`Opened OpenPond in your browser: ${input.baseUrl}`], stderr: [] };
482
+ }
483
+ return {
484
+ stdout: [`OpenPond access URL: ${accessUrl}`],
485
+ stderr: [`Could not open the system browser: ${handoff.error}`]
486
+ };
487
+ }
488
+ function printHelp() {
489
+ console.log(`Usage:
490
+ openpond-app-server serve [--hostname HOST] [--port PORT]
491
+ openpond-app-server app-server [--home DIR]
492
+ openpond-app-server web [--hostname HOST] [--port PORT] [--web-root DIR]
493
+
494
+ Options:
495
+ --listen HOST:PORT Set host and port together
496
+ --hostname HOST Bind host (default ${DEFAULT_HOST})
497
+ --port PORT Bind port, or 0 for any free port (default ${DEFAULT_PORT})
498
+ --web-root DIR Directory containing the built web UI for web mode
499
+ --home DIR Local app-server state directory
500
+ --open-browser Open the authenticated web URL in the system browser
501
+ --print-access-url Print the authenticated URL instead of opening it
502
+ `);
503
+ }
504
+ async function runOpenPondServerCli(factories) {
505
+ const args = parseCliArgs(process.argv.slice(2));
506
+ if (args.help) {
507
+ printHelp();
508
+ return;
509
+ }
510
+ const webRoot = args.mode === "web" ? resolveWebRoot(args.webRoot) : null;
511
+ if (args.mode === "web" && !webRoot) {
512
+ throw new Error("Could not find a built OpenPond web UI. Run `pnpm build:web` or pass --web-root.");
513
+ }
514
+ if (args.mode === "app-server") {
515
+ await runAgentServer(factories.createOpenPondAppServer, args.storeDir);
516
+ return;
517
+ }
518
+ if (args.storeDir) process.env.OPENPOND_HOME = args.storeDir;
519
+ let instance;
520
+ let port = args.port;
521
+ while (true) {
522
+ try {
523
+ instance = await factories.createOpenPondServer({
524
+ host: args.host,
525
+ port,
526
+ webRoot,
527
+ sourceBrowserState: args.sourceBrowserState,
528
+ ...args.storeDir ? { storeDir: args.storeDir } : {},
529
+ httpEnabled: true
530
+ });
531
+ break;
532
+ } catch (error) {
533
+ if (!isRecoverableStartupError(error)) throw error;
534
+ const recovery = await startRecoveryServer(resolveOpenPondHome({ home: args.storeDir ?? void 0 }), port, error);
535
+ port = recovery.port;
536
+ console.log(`OPENPOND_APP_SERVER_READY ${JSON.stringify({ mode: "recovery", url: recovery.url, tokenFile: recovery.tokenFile, storePath: recovery.storePath })}`);
537
+ console.error(`${error.issue.code}: ${error.issue.message} ${error.issue.action}`);
538
+ const messages = await resolveWebLaunchMessages({ baseUrl: recovery.url, openBrowser: args.openBrowser, printAccessUrl: args.printAccessUrl, token: recovery.token });
539
+ for (const message of messages.stdout) console.log(message);
540
+ for (const message of messages.stderr) console.error(message);
541
+ const close = () => {
542
+ void recovery.close().finally(() => process.exit(0));
543
+ };
544
+ process.once("SIGINT", close);
545
+ process.once("SIGTERM", close);
546
+ try {
547
+ await recovery.repaired;
548
+ } finally {
549
+ process.off("SIGINT", close);
550
+ process.off("SIGTERM", close);
551
+ await recovery.close();
552
+ }
553
+ }
554
+ }
555
+ const webBaseUrl = args.mode === "web" ? browserBaseUrl(instance) : null;
556
+ console.log(
557
+ `OPENPOND_APP_SERVER_READY ${JSON.stringify({
558
+ mode: args.mode,
559
+ url: instance.url,
560
+ webUrl: null,
561
+ webRoot,
562
+ tokenFile: instance.tokenFile,
563
+ storePath: instance.storePath,
564
+ runtime: getBundledRuntimeVersion()
565
+ })}`
566
+ );
567
+ if (webBaseUrl) {
568
+ const messages = await resolveWebLaunchMessages({
569
+ baseUrl: webBaseUrl,
570
+ openBrowser: args.openBrowser,
571
+ printAccessUrl: args.printAccessUrl,
572
+ token: instance.token
573
+ });
574
+ for (const message of messages.stderr) console.error(message);
575
+ for (const message of messages.stdout) console.log(message);
576
+ } else {
577
+ console.log(`OpenPond API server: ${instance.url}`);
578
+ }
579
+ let shuttingDown = false;
580
+ const shutdown = async () => {
581
+ if (shuttingDown) return;
582
+ shuttingDown = true;
583
+ await instance.close();
584
+ process.exit(0);
585
+ };
586
+ process.on("SIGINT", () => void shutdown());
587
+ process.on("SIGTERM", () => void shutdown());
588
+ await new Promise(() => {
589
+ });
590
+ }
591
+ async function runOpenPondAppServerCli(createOpenPondAppServer) {
592
+ const rawArgs = process.argv.slice(2);
593
+ const args = parseCliArgs(
594
+ !rawArgs[0] || rawArgs[0].startsWith("-") ? ["app-server", ...rawArgs] : rawArgs
595
+ );
596
+ if (args.help) {
597
+ printHelp();
598
+ return;
599
+ }
600
+ if (args.mode !== "app-server") {
601
+ throw new Error("The app-server entrypoint only accepts the app-server command.");
602
+ }
603
+ await runAgentServer(createOpenPondAppServer, args.storeDir);
604
+ }
605
+ async function runAgentServer(createOpenPondAppServer, storeDir) {
606
+ if (storeDir) process.env.OPENPOND_HOME = storeDir;
607
+ const appServer = await createOpenPondAppServer({
608
+ ...storeDir ? { storeDir } : {}
609
+ });
610
+ await runAppServerJsonl({
611
+ appServer,
612
+ readable: process.stdin,
613
+ writable: process.stdout
614
+ });
615
+ }
616
+
617
+ export {
618
+ createConfigurationPayloads,
619
+ HttpBodyError,
620
+ applyCorsHeaders,
621
+ sendJson,
622
+ sendText,
623
+ sendBinary,
624
+ readJson,
625
+ hasAuth,
626
+ resolveWebLaunchMessages,
627
+ runOpenPondServerCli,
628
+ runOpenPondAppServerCli
629
+ };
@@ -4,7 +4,7 @@ import {
4
4
  getAnyCliOptionKind,
5
5
  getCliCommandDefinition,
6
6
  getCliOptionKind
7
- } from "./chunk-N3TGCM7J.js";
7
+ } from "./chunk-7RIGZB7N.js";
8
8
  import {
9
9
  parseJsonOption
10
10
  } from "./chunk-MUMPWI4O.js";
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __openpondCreateRequire } from "node:module"; var require = __openpondCreateRequire(import.meta.url);
2
2
  import {
3
3
  now
4
- } from "./chunk-DJL4TJYG.js";
4
+ } from "./chunk-KCRCIQPD.js";
5
5
 
6
6
  // ../server/src/workspace/workspace-command.ts
7
7
  import { spawn, spawnSync } from "node:child_process";