openmeld 0.3.231 → 0.3.232

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 (133) hide show
  1. package/dist/{add-me-membership-0KyMk1wi.js → add-me-membership-ChntsjGm.js} +2 -2
  2. package/dist/{add-me-membership-0KyMk1wi.js.map → add-me-membership-ChntsjGm.js.map} +1 -1
  3. package/dist/{agents-Bkx6ldpV.js → agents-DruPcNSg.js} +11 -11
  4. package/dist/{agents-Bkx6ldpV.js.map → agents-DruPcNSg.js.map} +1 -1
  5. package/dist/{api-client-foundation-d4E5XWdJ.js → api-client-foundation-CDj_9Rks.js} +1 -1
  6. package/dist/{api-client-foundation-DgTXf3Gb.js → api-client-foundation-EZpFLGVC.js} +3 -3
  7. package/dist/{api-client-foundation-DgTXf3Gb.js.map → api-client-foundation-EZpFLGVC.js.map} +1 -1
  8. package/dist/auth-session-BOG3gV2K2.js +4 -0
  9. package/dist/{auth-session-pLaN5cnC.js → auth-session-DhSHCYvl.js} +4 -4
  10. package/dist/{auth-session-pLaN5cnC.js.map → auth-session-DhSHCYvl.js.map} +1 -1
  11. package/dist/auth-url-6Bb6YdNm.js +24 -0
  12. package/dist/auth-url-6Bb6YdNm.js.map +1 -0
  13. package/dist/{base-url-eck31vC8.js → base-url-0AoeTi3w.js} +3 -3
  14. package/dist/{base-url-eck31vC8.js.map → base-url-0AoeTi3w.js.map} +1 -1
  15. package/dist/{base-url-B8eWb2md.js → base-url-Bdjp-5vy.js} +1 -1
  16. package/dist/{channel-DppbHxHw.js → channel-tvFZSSVr.js} +24 -4
  17. package/dist/channel-tvFZSSVr.js.map +1 -0
  18. package/dist/{command-CBWv24uj.js → command-0yoZa1GT.js} +18 -18
  19. package/dist/{command-CBWv24uj.js.map → command-0yoZa1GT.js.map} +1 -1
  20. package/dist/{computer-connection-DMkamVpB.js → computer-connection-CoBDorh6.js} +2 -2
  21. package/dist/{computer-connection-DMkamVpB.js.map → computer-connection-CoBDorh6.js.map} +1 -1
  22. package/dist/{computer-connection-review-BSPMGVhN.js → computer-connection-review-Dy7p1LXZ.js} +6 -6
  23. package/dist/{computer-connection-review-BSPMGVhN.js.map → computer-connection-review-Dy7p1LXZ.js.map} +1 -1
  24. package/dist/{computer-disconnect-BQ_MDeeA.js → computer-disconnect-4Ks_DVXV.js} +9 -9
  25. package/dist/{computer-disconnect-BQ_MDeeA.js.map → computer-disconnect-4Ks_DVXV.js.map} +1 -1
  26. package/dist/{computer-setup-continuation-Cd293Yzi.js → computer-setup-continuation-ZcQb7MvI.js} +3 -3
  27. package/dist/{computer-setup-continuation-Cd293Yzi.js.map → computer-setup-continuation-ZcQb7MvI.js.map} +1 -1
  28. package/dist/{context-qbQXVLF5.js → context-BPIoofMa.js} +5 -5
  29. package/dist/{context-qbQXVLF5.js.map → context-BPIoofMa.js.map} +1 -1
  30. package/dist/{daemon-device-id-B6iDyQEs.js → daemon-device-id-DDazRZUV.js} +7 -7
  31. package/dist/{daemon-device-id-B6iDyQEs.js.map → daemon-device-id-DDazRZUV.js.map} +1 -1
  32. package/dist/{daemon-lifecycle-journal-DrwEygzu.js → daemon-lifecycle-journal-CRxQL9m6.js} +7 -7
  33. package/dist/{daemon-lifecycle-journal-DrwEygzu.js.map → daemon-lifecycle-journal-CRxQL9m6.js.map} +1 -1
  34. package/dist/{daemon-runtime-lease-C1wkT4Bi.js → daemon-runtime-lease-Bv6vhqOe.js} +2 -2
  35. package/dist/{daemon-runtime-lease-C1wkT4Bi.js.map → daemon-runtime-lease-Bv6vhqOe.js.map} +1 -1
  36. package/dist/{daemon-runtime-lease-DAQyRUc5.js → daemon-runtime-lease-ZjP0urJt.js} +1 -1
  37. package/dist/{daemon-service-contract-DhEfbzHt.js → daemon-service-contract-COPKbCy_.js} +4 -4
  38. package/dist/{daemon-service-contract-DhEfbzHt.js.map → daemon-service-contract-COPKbCy_.js.map} +1 -1
  39. package/dist/{daemon-service-manager-CRnFxPKA.js → daemon-service-manager-BXAp21GH.js} +6 -6
  40. package/dist/{daemon-service-manager-CRnFxPKA.js.map → daemon-service-manager-BXAp21GH.js.map} +1 -1
  41. package/dist/{daemon-service-manager-l0unaDGa.js → daemon-service-manager-C_ny0JhB.js} +1 -1
  42. package/dist/{daemon-service-runtime-B4nWB2Qx.js → daemon-service-runtime-BTzL0w6s.js} +14 -13
  43. package/dist/{daemon-service-runtime-B4nWB2Qx.js.map → daemon-service-runtime-BTzL0w6s.js.map} +1 -1
  44. package/dist/{daemon-service-update-coordinator-C8cW7Vn_.js → daemon-service-update-coordinator-BDs0p4bA.js} +26 -21
  45. package/dist/daemon-service-update-coordinator-BDs0p4bA.js.map +1 -0
  46. package/dist/{daemon-state-B6G5xe7f.js → daemon-state-Dte9re5V.js} +4 -4
  47. package/dist/{daemon-state-B6G5xe7f.js.map → daemon-state-Dte9re5V.js.map} +1 -1
  48. package/dist/{daemon-frame-transport-xQnNyg6E.js → dispatch-owned-runtime-CK2YJ2Oo.js} +547 -50
  49. package/dist/dispatch-owned-runtime-CK2YJ2Oo.js.map +1 -0
  50. package/dist/{dist-DFhd6JmQ.js → dist--TaSMxQz.js} +2 -2
  51. package/dist/{dist-DFhd6JmQ.js.map → dist--TaSMxQz.js.map} +1 -1
  52. package/dist/{dist-olOaAWkl.js → dist-B12upl5l.js} +1 -1
  53. package/dist/{dist-CAypwFRu.js → dist-Bw6OBFYo.js} +195 -185
  54. package/dist/dist-Bw6OBFYo.js.map +1 -0
  55. package/dist/{elapsed-time-COv3bjEl.js → elapsed-time-C3nfbdd9.js} +5 -5
  56. package/dist/{elapsed-time-COv3bjEl.js.map → elapsed-time-C3nfbdd9.js.map} +1 -1
  57. package/dist/{entry-DIjUKIep.js → entry-De__5RVq.js} +81 -17
  58. package/dist/entry-De__5RVq.js.map +1 -0
  59. package/dist/{installation-inventory-DllgoKT1.js → installation-inventory-Bq8iZfSa.js} +5 -5
  60. package/dist/{installation-inventory-DllgoKT1.js.map → installation-inventory-Bq8iZfSa.js.map} +1 -1
  61. package/dist/{installer-Sc79LhuA.js → installer-C7iSAOSz.js} +2 -2
  62. package/dist/{installer-Sc79LhuA.js.map → installer-C7iSAOSz.js.map} +1 -1
  63. package/dist/{lock-CMH9eoS7.js → lock-BMI00i2F.js} +2 -2
  64. package/dist/{lock-CMH9eoS7.js.map → lock-BMI00i2F.js.map} +1 -1
  65. package/dist/meta-api-BpwJWE22.js +371 -0
  66. package/dist/meta-api-BpwJWE22.js.map +1 -0
  67. package/dist/{openmeld-BUYFXSyY.js → openmeld-C0OSZJtn.js} +40 -38
  68. package/dist/{openmeld-BUYFXSyY.js.map → openmeld-C0OSZJtn.js.map} +1 -1
  69. package/dist/openmeld-dev.js +17 -9
  70. package/dist/openmeld-dev.js.map +1 -1
  71. package/dist/{openmeld-environment-target-Cw3V0WnE.js → openmeld-environment-target-BgYR6ozy.js} +8 -25
  72. package/dist/openmeld-environment-target-BgYR6ozy.js.map +1 -0
  73. package/dist/{openmeld-maintenance-worker-Br6WIhhe.js → openmeld-maintenance-worker-DY90mkWW.js} +14 -14
  74. package/dist/{openmeld-maintenance-worker-Br6WIhhe.js.map → openmeld-maintenance-worker-DY90mkWW.js.map} +1 -1
  75. package/dist/{openmeld-tools-update-join-B1l6RER6.js → openmeld-tools-update-join-DgzNuaDy.js} +4 -4
  76. package/dist/{openmeld-tools-update-join-B1l6RER6.js.map → openmeld-tools-update-join-DgzNuaDy.js.map} +1 -1
  77. package/dist/openmeld.js +5 -5
  78. package/dist/{paths-DSkUuEu3.js → paths-De9xdA2h.js} +11 -6
  79. package/dist/paths-De9xdA2h.js.map +1 -0
  80. package/dist/{prepare-provider-runtime-DfsSj_N_.js → prepare-provider-runtime-BGdfbFyZ.js} +20 -15
  81. package/dist/prepare-provider-runtime-BGdfbFyZ.js.map +1 -0
  82. package/dist/{prepare-session-executor-CrYpWljb.js → prepare-session-executor-CA1gq8dR.js} +25 -25
  83. package/dist/{prepare-session-executor-CrYpWljb.js.map → prepare-session-executor-CA1gq8dR.js.map} +1 -1
  84. package/dist/{process-channel-DmTb_kO4.js → process-channel-C1wRGUmk.js} +2 -2
  85. package/dist/{process-channel-DmTb_kO4.js.map → process-channel-C1wRGUmk.js.map} +1 -1
  86. package/dist/{published-production-safety-CgXxtdMK.js → published-production-safety-zANGAGDI.js} +5 -6
  87. package/dist/published-production-safety-zANGAGDI.js.map +1 -0
  88. package/dist/{runtime-ZLBVtFFY.js → runtime-DFlEdls4.js} +76 -22
  89. package/dist/runtime-DFlEdls4.js.map +1 -0
  90. package/dist/{runtime-agent-controller-reporting-submission-CbaUsNTF.js → runtime-agent-controller-reporting-submission-C_xD2A-P.js} +15 -12
  91. package/dist/runtime-agent-controller-reporting-submission-C_xD2A-P.js.map +1 -0
  92. package/dist/{runtime-reporting-health-state-DOg9iwwO.js → runtime-reporting-health-state-_bvJcV1y.js} +116 -22
  93. package/dist/runtime-reporting-health-state-_bvJcV1y.js.map +1 -0
  94. package/dist/{runtime-transport-D4x8_AmR.js → runtime-transport-DH8Ks-AU.js} +86 -6
  95. package/dist/runtime-transport-DH8Ks-AU.js.map +1 -0
  96. package/dist/{service-B9y1SQlB.js → service-KHA_Yv8q.js} +61 -28
  97. package/dist/service-KHA_Yv8q.js.map +1 -0
  98. package/dist/{service-account-authorization-Di59Cjth.js → service-account-authorization-BHWs8cRP.js} +6 -6
  99. package/dist/{service-account-authorization-Di59Cjth.js.map → service-account-authorization-BHWs8cRP.js.map} +1 -1
  100. package/dist/{service-account-control-DALO1USM.js → service-account-control-BcHjpVid.js} +13 -13
  101. package/dist/{service-account-control-DALO1USM.js.map → service-account-control-BcHjpVid.js.map} +1 -1
  102. package/dist/{service-control-capabilities-CKwU9Er5.js → service-control-capabilities-B4433dGT.js} +5 -5
  103. package/dist/{service-control-capabilities-CKwU9Er5.js.map → service-control-capabilities-B4433dGT.js.map} +1 -1
  104. package/dist/{service-control-capabilities-B9ZxDPOJ.js → service-control-capabilities-DTKD2-o0.js} +1 -1
  105. package/dist/{state-CdSbKM0J.js → state-iJqU2XWw.js} +3 -3
  106. package/dist/{state-CdSbKM0J.js.map → state-iJqU2XWw.js.map} +1 -1
  107. package/dist/upgrade-CuzsgsKh.js +4 -0
  108. package/dist/{upgrade-DLJJlkbf.js → upgrade-DlBDEvs4.js} +8 -8
  109. package/dist/{upgrade-DLJJlkbf.js.map → upgrade-DlBDEvs4.js.map} +1 -1
  110. package/dist/{windows-preview-channel-DPrYuLyY.js → windows-preview-channel-BPhfSwji.js} +2 -2
  111. package/dist/{windows-preview-channel-DPrYuLyY.js.map → windows-preview-channel-BPhfSwji.js.map} +1 -1
  112. package/dist/{windows-user-task-BR-WB7hr.js → windows-user-task-CTsMnmD4.js} +3 -3
  113. package/dist/{windows-user-task-BR-WB7hr.js.map → windows-user-task-CTsMnmD4.js.map} +1 -1
  114. package/dist/{windows-user-task-m9eMEUEq.js → windows-user-task-DnxKO3oB.js} +1 -1
  115. package/package.json +11 -11
  116. package/dist/auth-session-DExyUwLo.js +0 -4
  117. package/dist/channel-DppbHxHw.js.map +0 -1
  118. package/dist/daemon-frame-transport-xQnNyg6E.js.map +0 -1
  119. package/dist/daemon-service-update-coordinator-C8cW7Vn_.js.map +0 -1
  120. package/dist/dist-CAypwFRu.js.map +0 -1
  121. package/dist/entry-DIjUKIep.js.map +0 -1
  122. package/dist/meta-api-CEw8eOeN.js +0 -845
  123. package/dist/meta-api-CEw8eOeN.js.map +0 -1
  124. package/dist/openmeld-environment-target-Cw3V0WnE.js.map +0 -1
  125. package/dist/paths-DSkUuEu3.js.map +0 -1
  126. package/dist/prepare-provider-runtime-DfsSj_N_.js.map +0 -1
  127. package/dist/published-production-safety-CgXxtdMK.js.map +0 -1
  128. package/dist/runtime-ZLBVtFFY.js.map +0 -1
  129. package/dist/runtime-agent-controller-reporting-submission-CbaUsNTF.js.map +0 -1
  130. package/dist/runtime-reporting-health-state-DOg9iwwO.js.map +0 -1
  131. package/dist/runtime-transport-D4x8_AmR.js.map +0 -1
  132. package/dist/service-B9y1SQlB.js.map +0 -1
  133. package/dist/upgrade-BFWUxFpJ.js +0 -4
@@ -0,0 +1,371 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { f as toSpaceMetaUrl } from "./urls-CY2uzH2-.js";
4
+ import { Bn as toStructuredApiClientFailure, gi as spaceMetaSchema, mn as createSpaceApi, nr as OPENMELD_HEADER_REQUEST_ID, t as OpenMeldApiClientHttpError, yr as gatewayErrorEnvelopeSchema } from "./dist-Bw6OBFYo.js";
5
+ import { Xt as SPACE_FILE_MAX_SIZE_BYTES, on as resolveSpaceFileMimeType, yn as spaceFileNameSchema } from "./runtime-transport-DH8Ks-AU.js";
6
+ import { n as fetchSpaceRequestWithTimeout, s as buildOpenMeldRequestContextHeadersWithAuth, t as createCliApiClientFoundation } from "./api-client-foundation-EZpFLGVC.js";
7
+ import { basename } from "node:path";
8
+ import { access } from "node:fs/promises";
9
+ import { openAsBlob } from "node:fs";
10
+ //#region src/space/cli-space-api.ts
11
+ function createCliSpaceApi(baseUrl, options = {}) {
12
+ return createSpaceApi(createCliApiClientFoundation(baseUrl, options));
13
+ }
14
+ //#endregion
15
+ //#region src/space/send-files.ts
16
+ var SpaceSendFileError = class extends Error {
17
+ code;
18
+ requestId;
19
+ status;
20
+ upstreamCode;
21
+ constructor(input) {
22
+ super(input.message, { cause: input.cause });
23
+ this.name = "SpaceSendFileError";
24
+ this.code = input.code;
25
+ if (input.requestId) this.requestId = input.requestId;
26
+ if (input.status !== null && input.status !== void 0) this.status = input.status;
27
+ if (input.upstreamCode) this.upstreamCode = input.upstreamCode;
28
+ }
29
+ };
30
+ async function prepareRequestedSpaceSendFiles(input) {
31
+ if (input.filePaths.length > 10) throw new SpaceSendFileError({
32
+ code: "space.file.too_many",
33
+ message: `A Space message can include at most 10 files. The message was not sent.`
34
+ });
35
+ const prepared = [];
36
+ for (const rawPath of input.filePaths) {
37
+ if (!rawPath.trim()) throw new SpaceSendFileError({
38
+ code: "space.file.invalid_path",
39
+ message: "File paths cannot be empty. The message was not sent."
40
+ });
41
+ prepared.push(await prepareSpaceSendFile(rawPath));
42
+ }
43
+ return prepared;
44
+ }
45
+ async function uploadPreparedSpaceFiles(input) {
46
+ const uploaded = [];
47
+ for (const file of input.files) try {
48
+ const descriptor = await input.spaceApi.uploadFile({
49
+ bytes: file.bytes,
50
+ clientMutationId: crypto.randomUUID(),
51
+ mimeType: file.mimeType,
52
+ name: file.name,
53
+ origin: "chat_upload",
54
+ parentId: null,
55
+ requestContext: input.requestContext,
56
+ spaceId: input.spaceId,
57
+ ...input.password === void 0 ? {} : { spacePassword: input.password }
58
+ });
59
+ uploaded.push({
60
+ fileId: descriptor.id,
61
+ revision: descriptor.latestRevision.revision,
62
+ name: descriptor.name,
63
+ mimeType: descriptor.latestRevision.mimeType,
64
+ sizeBytes: descriptor.latestRevision.sizeBytes
65
+ });
66
+ } catch (error) {
67
+ const failure = toStructuredApiClientFailure(error);
68
+ const cleanupFailures = await moveUploadedFilesToTrash({
69
+ files: uploaded,
70
+ password: input.password,
71
+ requestContext: input.requestContext,
72
+ spaceApi: input.spaceApi,
73
+ spaceId: input.spaceId
74
+ });
75
+ let cleanupMessage = "";
76
+ if (uploaded.length > 0) cleanupMessage = cleanupFailures.length === 0 ? " Files added earlier in this send were moved to Trash." : ` ${formatCleanupFailures({
77
+ failures: cleanupFailures,
78
+ passwordProtected: input.password !== void 0,
79
+ profileId: input.requestContext.actorContext.openMeldProfileId,
80
+ spaceId: input.spaceId
81
+ })}`;
82
+ throw new SpaceSendFileError({
83
+ code: failure.code ?? "space.file.upload_failed",
84
+ message: `Could not add file "${file.name}" to this Space. The message was not sent. ${failure.message}${cleanupMessage}`,
85
+ cause: error,
86
+ requestId: failure.requestId,
87
+ status: failure.status,
88
+ upstreamCode: failure.upstreamCode
89
+ });
90
+ }
91
+ return uploaded;
92
+ }
93
+ async function moveUploadedFilesToTrash(input) {
94
+ const failures = [];
95
+ for (const file of input.files) try {
96
+ await input.spaceApi.trashFileEntry({
97
+ clientMutationId: crypto.randomUUID(),
98
+ entryId: file.fileId,
99
+ requestContext: input.requestContext,
100
+ spaceId: input.spaceId,
101
+ ...input.password === void 0 ? {} : { spacePassword: input.password }
102
+ });
103
+ } catch (error) {
104
+ failures.push({
105
+ failure: toStructuredApiClientFailure(error),
106
+ fileId: file.fileId
107
+ });
108
+ }
109
+ return failures;
110
+ }
111
+ function formatCleanupFailures(input) {
112
+ return `${input.failures.map(({ failure, fileId }) => {
113
+ const evidence = [failure.code ? `code ${failure.code}` : null, failure.requestId ? `request ${failure.requestId}` : null].filter((value) => value !== null).join(", ");
114
+ return `Could not move file ${fileId} to Trash${evidence ? ` (${evidence})` : ""}: ${failure.message} Run \`openmeld space files trash ${input.spaceId} ${fileId} --profile ${input.profileId}\` to finish cleanup.`;
115
+ }).join(" ")}${input.passwordProtected ? " This Space is password protected. Add `--password` with the same Space password you used for this send; OpenMeld does not include the password in this message." : ""}`;
116
+ }
117
+ async function prepareSpaceSendFile(sourcePath) {
118
+ let bytes;
119
+ try {
120
+ await access(sourcePath);
121
+ bytes = await openAsBlob(sourcePath);
122
+ } catch (error) {
123
+ if (readNodeErrorCode(error) === "ENOENT") throw new SpaceSendFileError({
124
+ code: "space.file.file_not_found",
125
+ message: `File not found: ${sourcePath}. The message was not sent.`,
126
+ cause: error
127
+ });
128
+ throw new SpaceSendFileError({
129
+ code: "space.file.file_unreadable",
130
+ message: `Could not read file: ${sourcePath}. The message was not sent.`,
131
+ cause: error
132
+ });
133
+ }
134
+ if (bytes.size > 1073741824) throw new SpaceSendFileError({
135
+ code: "space.file.too_large",
136
+ message: `File exceeds the ${formatFileSizeLimit()} limit: ${sourcePath}. The message was not sent.`
137
+ });
138
+ const parsedName = spaceFileNameSchema.safeParse(basename(sourcePath));
139
+ if (!parsedName.success) throw new SpaceSendFileError({
140
+ code: "space.file.invalid_file_name",
141
+ message: `File name is invalid: ${sourcePath}. The message was not sent.`
142
+ });
143
+ return {
144
+ bytes,
145
+ name: parsedName.data,
146
+ mimeType: resolveSpaceFileMimeType({ fileName: parsedName.data })
147
+ };
148
+ }
149
+ function readNodeErrorCode(error) {
150
+ if (!(error && typeof error === "object" && "code" in error)) return null;
151
+ return typeof error.code === "string" ? error.code : null;
152
+ }
153
+ function formatFileSizeLimit() {
154
+ return `${SPACE_FILE_MAX_SIZE_BYTES / (1024 * 1024)} MiB`;
155
+ }
156
+ //#endregion
157
+ //#region src/space/api-json.ts
158
+ function parseJsonResponse(raw) {
159
+ if (!raw.trim()) return null;
160
+ try {
161
+ return JSON.parse(raw);
162
+ } catch {
163
+ return null;
164
+ }
165
+ }
166
+ //#endregion
167
+ //#region src/space/gateway-response.ts
168
+ const FALLBACK_GATEWAY_HTTP_ERROR_CODE = "gateway.http_error";
169
+ var GatewayHttpError = class extends Error {
170
+ code;
171
+ requestId;
172
+ status;
173
+ rawBody;
174
+ upstreamCode;
175
+ constructor(input) {
176
+ super(input.message);
177
+ this.name = "GatewayHttpError";
178
+ this.code = input.code;
179
+ this.requestId = normalizeOptionalText(input.requestId);
180
+ this.status = input.status;
181
+ this.rawBody = input.rawBody;
182
+ this.upstreamCode = normalizeOptionalText(input.upstreamCode);
183
+ }
184
+ };
185
+ async function readGatewayJsonResponse(input) {
186
+ const raw = await input.response.text();
187
+ assertGatewayResponseOk({
188
+ response: input.response,
189
+ raw
190
+ });
191
+ const parsed = input.schema.safeParse(parseJsonResponse(raw));
192
+ if (!parsed.success) throw new Error(input.invalidMessage);
193
+ return parsed.data;
194
+ }
195
+ async function readGatewayTextResponse(input) {
196
+ const raw = await input.response.text();
197
+ assertGatewayResponseOk({
198
+ response: input.response,
199
+ raw
200
+ });
201
+ return raw;
202
+ }
203
+ function assertGatewayResponseOk(input) {
204
+ if (input.response.ok) return;
205
+ throw parseGatewayErrorResponse(input);
206
+ }
207
+ function parseGatewayErrorResponse(input) {
208
+ const payload = parseJsonResponse(input.raw);
209
+ const parsed = gatewayErrorEnvelopeSchema.safeParse(payload);
210
+ const headerRequestId = normalizeOptionalText(input.response.headers.get(OPENMELD_HEADER_REQUEST_ID));
211
+ if (parsed.success) return new GatewayHttpError({
212
+ code: parsed.data.error.code,
213
+ message: parsed.data.error.message,
214
+ requestId: parsed.data.error.requestId || headerRequestId,
215
+ status: input.response.status,
216
+ rawBody: input.raw,
217
+ upstreamCode: parsed.data.error.upstreamCode ?? null
218
+ });
219
+ const looseEnvelope = readLooseGatewayErrorEnvelope(payload);
220
+ if (looseEnvelope) return new GatewayHttpError({
221
+ code: looseEnvelope.code ?? FALLBACK_GATEWAY_HTTP_ERROR_CODE,
222
+ message: looseEnvelope.message ?? `Gateway request failed with HTTP ${input.response.status}.`,
223
+ requestId: looseEnvelope.requestId ?? headerRequestId,
224
+ status: input.response.status,
225
+ rawBody: input.raw,
226
+ upstreamCode: looseEnvelope.upstreamCode
227
+ });
228
+ return new GatewayHttpError({
229
+ code: FALLBACK_GATEWAY_HTTP_ERROR_CODE,
230
+ message: normalizeOptionalText(input.raw) ?? `Gateway request failed with HTTP ${input.response.status}.`,
231
+ requestId: headerRequestId,
232
+ status: input.response.status,
233
+ rawBody: input.raw,
234
+ upstreamCode: null
235
+ });
236
+ }
237
+ function toStructuredGatewayFailure(error) {
238
+ if (error instanceof OpenMeldApiClientHttpError) return {
239
+ code: error.code,
240
+ message: normalizeFailureMessage(error.message),
241
+ requestId: error.requestId,
242
+ status: error.status,
243
+ upstreamCode: error.upstreamCode
244
+ };
245
+ if (error instanceof GatewayHttpError) return {
246
+ code: error.code,
247
+ message: normalizeFailureMessage(error.message),
248
+ requestId: error.requestId,
249
+ status: error.status,
250
+ upstreamCode: error.upstreamCode
251
+ };
252
+ const genericErrorCode = readGenericErrorCode(error);
253
+ if (genericErrorCode) return {
254
+ code: genericErrorCode,
255
+ message: normalizeFailureMessage(error instanceof Error ? error.message : String(error)),
256
+ requestId: null,
257
+ status: null,
258
+ upstreamCode: null
259
+ };
260
+ return {
261
+ code: null,
262
+ message: normalizeFailureMessage(error instanceof Error ? error.message : String(error)),
263
+ requestId: null,
264
+ status: null,
265
+ upstreamCode: null
266
+ };
267
+ }
268
+ function normalizeOptionalText(value) {
269
+ const normalized = String(value ?? "").trim();
270
+ return normalized.length > 0 ? normalized : null;
271
+ }
272
+ function normalizeFailureMessage(value) {
273
+ return normalizeOptionalText(value) ?? "Unknown error.";
274
+ }
275
+ function readGenericErrorCode(value) {
276
+ if (!value || typeof value !== "object" || !("code" in value)) return null;
277
+ return normalizeOptionalText(value.code ?? null);
278
+ }
279
+ function readLooseGatewayErrorEnvelope(value) {
280
+ if (!value || typeof value !== "object") return null;
281
+ const error = value.error;
282
+ if (!error || typeof error !== "object") return null;
283
+ const code = normalizeOptionalText(error.code);
284
+ const message = normalizeOptionalText(error.message);
285
+ const requestId = normalizeOptionalText(error.requestId);
286
+ const upstreamCode = normalizeOptionalText(error.upstreamCode);
287
+ if (!(code || message || requestId || upstreamCode)) return null;
288
+ return {
289
+ code,
290
+ message,
291
+ requestId,
292
+ upstreamCode
293
+ };
294
+ }
295
+ //#endregion
296
+ //#region src/space/space-meta-response.ts
297
+ function parseSpaceMetaPayload(input) {
298
+ try {
299
+ const validation = spaceMetaSchema.safeParse(input.data);
300
+ if (!validation.success) {
301
+ const reason = validation.error.issues[0]?.message ?? "space meta payload does not match schema";
302
+ throw new Error(reason);
303
+ }
304
+ return validation.data;
305
+ } catch (error) {
306
+ const reason = error instanceof Error ? error.message : String(error);
307
+ throw new Error(`${input.operation} received invalid response payload from ${input.endpoint}: ${reason}; raw=${JSON.stringify(input.data)}`);
308
+ }
309
+ }
310
+ function parseSpaceMetaResponse(input) {
311
+ try {
312
+ return parseSpaceMetaPayload({
313
+ data: JSON.parse(input.raw),
314
+ endpoint: input.endpoint,
315
+ operation: input.operation
316
+ });
317
+ } catch (error) {
318
+ const reason = error instanceof Error ? error.message : String(error);
319
+ throw new Error(`${input.operation} received invalid response payload from ${input.endpoint}: ${reason}; raw=${input.raw}`);
320
+ }
321
+ }
322
+ //#endregion
323
+ //#region src/space/meta-api.ts
324
+ async function fetchSpaceMeta(input) {
325
+ const endpoint = toSpaceMetaUrl(input.baseUrl, input.space);
326
+ return parseSpaceMetaResponse({
327
+ raw: await readGatewayTextResponse({ response: await fetchSpaceRequestWithTimeout({
328
+ url: endpoint,
329
+ operation: "space.fetch_meta",
330
+ init: {
331
+ method: "GET",
332
+ headers: await buildOpenMeldRequestContextHeadersWithAuth({
333
+ requestUrl: endpoint,
334
+ requestContext: input.requestContext,
335
+ spacePassword: input.password
336
+ })
337
+ }
338
+ }) }),
339
+ endpoint,
340
+ operation: "fetchSpaceMeta"
341
+ });
342
+ }
343
+ async function updateSpaceMeta(input) {
344
+ const endpoint = toSpaceMetaUrl(input.baseUrl, input.space);
345
+ const headers = await buildOpenMeldRequestContextHeadersWithAuth({
346
+ requestUrl: endpoint,
347
+ requestContext: input.requestContext,
348
+ spacePassword: input.password
349
+ });
350
+ headers["content-type"] = "application/json";
351
+ return parseSpaceMetaResponse({
352
+ raw: await readGatewayTextResponse({ response: await fetchSpaceRequestWithTimeout({
353
+ url: endpoint,
354
+ operation: "space.update_meta",
355
+ init: {
356
+ method: "PATCH",
357
+ headers,
358
+ body: JSON.stringify({
359
+ ...input.purpose === void 0 ? {} : { purpose: input.purpose },
360
+ ...input.guide === void 0 ? {} : { guide: input.guide }
361
+ })
362
+ }
363
+ }) }),
364
+ endpoint,
365
+ operation: "updateSpaceMeta"
366
+ });
367
+ }
368
+ //#endregion
369
+ export { GatewayHttpError as a, toStructuredGatewayFailure as c, uploadPreparedSpaceFiles as d, createCliSpaceApi as f, parseSpaceMetaResponse as i, parseJsonResponse as l, updateSpaceMeta as n, readGatewayJsonResponse as o, parseSpaceMetaPayload as r, readGatewayTextResponse as s, fetchSpaceMeta as t, prepareRequestedSpaceSendFiles as u };
370
+
371
+ //# sourceMappingURL=meta-api-BpwJWE22.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-api-BpwJWE22.js","names":["record"],"sources":["../src/space/cli-space-api.ts","../src/space/send-files.ts","../src/space/api-json.ts","../src/space/gateway-response.ts","../src/space/space-meta-response.ts","../src/space/meta-api.ts"],"sourcesContent":["import { createSpaceApi, type SpaceApi } from \"@openmeld/api-client\";\nimport { createCliApiClientFoundation } from \"./api-client-foundation\";\n\nexport type {\n SpaceApi,\n SpaceSignalsReadQuery,\n} from \"@openmeld/api-client\";\n\nexport function createCliSpaceApi(\n baseUrl: string,\n options: Parameters<typeof createCliApiClientFoundation>[1] = {}\n): SpaceApi {\n return createSpaceApi(createCliApiClientFoundation(baseUrl, options));\n}\n","import { openAsBlob } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport {\n type StructuredApiClientFailure,\n toStructuredApiClientFailure,\n} from \"@openmeld/api-client\";\nimport {\n resolveSpaceFileMimeType,\n SPACE_FILE_MAX_SIZE_BYTES,\n SPACE_MESSAGE_FILE_MAX_COUNT,\n spaceFileNameSchema,\n} from \"@openmeld/schemas\";\nimport type {\n OpenMeldRequestContext,\n SpaceMessageFileReference,\n} from \"@openmeld/schemas/types\";\nimport type { SpaceApi } from \"./cli-space-api\";\n\ntype PreparedSpaceFile = {\n bytes: Blob;\n name: string;\n mimeType: string;\n};\n\ntype SpaceFileCleanupFailure = {\n failure: StructuredApiClientFailure;\n fileId: string;\n};\n\nexport class SpaceSendFileError extends Error {\n readonly code: string;\n readonly requestId?: string;\n readonly status?: number;\n readonly upstreamCode?: string;\n\n constructor(input: {\n code: string;\n message: string;\n cause?: unknown;\n requestId?: string | null;\n status?: number | null;\n upstreamCode?: string | null;\n }) {\n super(input.message, { cause: input.cause });\n this.name = \"SpaceSendFileError\";\n this.code = input.code;\n if (input.requestId) {\n this.requestId = input.requestId;\n }\n if (input.status !== null && input.status !== undefined) {\n this.status = input.status;\n }\n if (input.upstreamCode) {\n this.upstreamCode = input.upstreamCode;\n }\n }\n}\n\nexport async function prepareRequestedSpaceSendFiles(input: {\n filePaths: readonly string[];\n}): Promise<readonly PreparedSpaceFile[]> {\n if (input.filePaths.length > SPACE_MESSAGE_FILE_MAX_COUNT) {\n throw new SpaceSendFileError({\n code: \"space.file.too_many\",\n message: `A Space message can include at most ${SPACE_MESSAGE_FILE_MAX_COUNT} files. The message was not sent.`,\n });\n }\n\n const prepared: PreparedSpaceFile[] = [];\n for (const rawPath of input.filePaths) {\n if (!rawPath.trim()) {\n throw new SpaceSendFileError({\n code: \"space.file.invalid_path\",\n message: \"File paths cannot be empty. The message was not sent.\",\n });\n }\n prepared.push(await prepareSpaceSendFile(rawPath));\n }\n return prepared;\n}\n\nexport async function uploadPreparedSpaceFiles(input: {\n files: readonly PreparedSpaceFile[];\n password?: string;\n requestContext: OpenMeldRequestContext;\n spaceApi: SpaceApi;\n spaceId: string;\n}): Promise<readonly SpaceMessageFileReference[]> {\n const uploaded: SpaceMessageFileReference[] = [];\n for (const file of input.files) {\n try {\n const descriptor = await input.spaceApi.uploadFile({\n bytes: file.bytes,\n clientMutationId: crypto.randomUUID(),\n mimeType: file.mimeType,\n name: file.name,\n origin: \"chat_upload\",\n parentId: null,\n requestContext: input.requestContext,\n spaceId: input.spaceId,\n ...(input.password === undefined\n ? {}\n : { spacePassword: input.password }),\n });\n uploaded.push({\n fileId: descriptor.id,\n revision: descriptor.latestRevision.revision,\n name: descriptor.name,\n mimeType: descriptor.latestRevision.mimeType,\n sizeBytes: descriptor.latestRevision.sizeBytes,\n });\n } catch (error) {\n const failure = toStructuredApiClientFailure(error);\n const cleanupFailures = await moveUploadedFilesToTrash({\n files: uploaded,\n password: input.password,\n requestContext: input.requestContext,\n spaceApi: input.spaceApi,\n spaceId: input.spaceId,\n });\n let cleanupMessage = \"\";\n if (uploaded.length > 0) {\n cleanupMessage =\n cleanupFailures.length === 0\n ? \" Files added earlier in this send were moved to Trash.\"\n : ` ${formatCleanupFailures({\n failures: cleanupFailures,\n passwordProtected: input.password !== undefined,\n profileId: input.requestContext.actorContext.openMeldProfileId,\n spaceId: input.spaceId,\n })}`;\n }\n throw new SpaceSendFileError({\n code: failure.code ?? \"space.file.upload_failed\",\n message: `Could not add file \"${file.name}\" to this Space. The message was not sent. ${failure.message}${cleanupMessage}`,\n cause: error,\n requestId: failure.requestId,\n status: failure.status,\n upstreamCode: failure.upstreamCode,\n });\n }\n }\n return uploaded;\n}\n\nasync function moveUploadedFilesToTrash(input: {\n files: readonly SpaceMessageFileReference[];\n password?: string;\n requestContext: OpenMeldRequestContext;\n spaceApi: SpaceApi;\n spaceId: string;\n}): Promise<readonly SpaceFileCleanupFailure[]> {\n const failures: SpaceFileCleanupFailure[] = [];\n for (const file of input.files) {\n try {\n await input.spaceApi.trashFileEntry({\n clientMutationId: crypto.randomUUID(),\n entryId: file.fileId,\n requestContext: input.requestContext,\n spaceId: input.spaceId,\n ...(input.password === undefined\n ? {}\n : { spacePassword: input.password }),\n });\n } catch (error) {\n failures.push({\n failure: toStructuredApiClientFailure(error),\n fileId: file.fileId,\n });\n }\n }\n return failures;\n}\n\nfunction formatCleanupFailures(input: {\n failures: readonly SpaceFileCleanupFailure[];\n passwordProtected: boolean;\n profileId: string;\n spaceId: string;\n}): string {\n const failureMessages = input.failures\n .map(({ failure, fileId }) => {\n const evidence = [\n failure.code ? `code ${failure.code}` : null,\n failure.requestId ? `request ${failure.requestId}` : null,\n ]\n .filter((value): value is string => value !== null)\n .join(\", \");\n const evidenceText = evidence ? ` (${evidence})` : \"\";\n return `Could not move file ${fileId} to Trash${evidenceText}: ${failure.message} Run \\`openmeld space files trash ${input.spaceId} ${fileId} --profile ${input.profileId}\\` to finish cleanup.`;\n })\n .join(\" \");\n const passwordGuidance = input.passwordProtected\n ? \" This Space is password protected. Add `--password` with the same Space password you used for this send; OpenMeld does not include the password in this message.\"\n : \"\";\n return `${failureMessages}${passwordGuidance}`;\n}\n\nasync function prepareSpaceSendFile(\n sourcePath: string\n): Promise<PreparedSpaceFile> {\n let bytes: Blob;\n try {\n // openAsBlob collapses missing paths into ERR_INVALID_ARG_VALUE on Node 24.\n // Preserve the filesystem error code for the user-facing failure category.\n await access(sourcePath);\n bytes = await openAsBlob(sourcePath);\n } catch (error) {\n const code = readNodeErrorCode(error);\n if (code === \"ENOENT\") {\n throw new SpaceSendFileError({\n code: \"space.file.file_not_found\",\n message: `File not found: ${sourcePath}. The message was not sent.`,\n cause: error,\n });\n }\n throw new SpaceSendFileError({\n code: \"space.file.file_unreadable\",\n message: `Could not read file: ${sourcePath}. The message was not sent.`,\n cause: error,\n });\n }\n\n if (bytes.size > SPACE_FILE_MAX_SIZE_BYTES) {\n throw new SpaceSendFileError({\n code: \"space.file.too_large\",\n message: `File exceeds the ${formatFileSizeLimit()} limit: ${sourcePath}. The message was not sent.`,\n });\n }\n\n const parsedName = spaceFileNameSchema.safeParse(basename(sourcePath));\n if (!parsedName.success) {\n throw new SpaceSendFileError({\n code: \"space.file.invalid_file_name\",\n message: `File name is invalid: ${sourcePath}. The message was not sent.`,\n });\n }\n\n return {\n bytes,\n name: parsedName.data,\n mimeType: resolveSpaceFileMimeType({ fileName: parsedName.data }),\n };\n}\n\nfunction readNodeErrorCode(error: unknown): string | null {\n if (!(error && typeof error === \"object\" && \"code\" in error)) {\n return null;\n }\n return typeof error.code === \"string\" ? error.code : null;\n}\n\nfunction formatFileSizeLimit(): string {\n return `${SPACE_FILE_MAX_SIZE_BYTES / (1024 * 1024)} MiB`;\n}\n","export function parseJsonResponse(raw: string): unknown {\n if (!raw.trim()) {\n return null;\n }\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n","import { OpenMeldApiClientHttpError } from \"@openmeld/api-client\";\nimport { OPENMELD_HEADER_REQUEST_ID } from \"@openmeld/gateway-contract\";\nimport { gatewayErrorEnvelopeSchema } from \"@openmeld/schemas\";\nimport type { GatewayErrorCode } from \"@openmeld/schemas/types\";\nimport { parseJsonResponse } from \"./api-json\";\n\nconst FALLBACK_GATEWAY_HTTP_ERROR_CODE = \"gateway.http_error\" as const;\nconst GENERIC_NETWORK_ERROR_CODES = [\n \"network.timeout\",\n \"network.request_failed\",\n] as const;\n\ntype SafeParseResult<T> = { success: true; data: T } | { success: false };\n\ntype GatewayResponseSchema<T> = {\n safeParse: (value: unknown) => SafeParseResult<T>;\n};\n\nexport type GatewayResponseErrorCode =\n | GatewayErrorCode\n | typeof FALLBACK_GATEWAY_HTTP_ERROR_CODE\n | (typeof GENERIC_NETWORK_ERROR_CODES)[number]\n | string;\n\nexport type StructuredGatewayFailure = {\n code: GatewayResponseErrorCode | null;\n message: string;\n requestId: string | null;\n status: number | null;\n upstreamCode: string | null;\n};\n\nexport class GatewayHttpError extends Error {\n readonly code: GatewayResponseErrorCode;\n readonly requestId: string | null;\n readonly status: number;\n readonly rawBody: string;\n readonly upstreamCode: string | null;\n\n constructor(input: {\n code: GatewayResponseErrorCode;\n message: string;\n requestId?: string | null;\n status: number;\n rawBody: string;\n upstreamCode?: string | null;\n }) {\n super(input.message);\n this.name = \"GatewayHttpError\";\n this.code = input.code;\n this.requestId = normalizeOptionalText(input.requestId);\n this.status = input.status;\n this.rawBody = input.rawBody;\n this.upstreamCode = normalizeOptionalText(input.upstreamCode);\n }\n}\n\nexport async function readGatewayJsonResponse<T>(input: {\n response: Response;\n schema: GatewayResponseSchema<T>;\n invalidMessage: string;\n}): Promise<T> {\n const raw = await input.response.text();\n assertGatewayResponseOk({\n response: input.response,\n raw,\n });\n\n const parsed = input.schema.safeParse(parseJsonResponse(raw));\n if (!parsed.success) {\n throw new Error(input.invalidMessage);\n }\n return parsed.data;\n}\n\nexport async function readGatewayTextResponse(input: {\n response: Response;\n}): Promise<string> {\n const raw = await input.response.text();\n assertGatewayResponseOk({\n response: input.response,\n raw,\n });\n return raw;\n}\n\nexport function assertGatewayResponseOk(input: {\n response: Response;\n raw: string;\n}): void {\n if (input.response.ok) {\n return;\n }\n throw parseGatewayErrorResponse(input);\n}\n\nexport function parseGatewayErrorResponse(input: {\n response: Pick<Response, \"headers\" | \"status\">;\n raw: string;\n}): GatewayHttpError {\n const payload = parseJsonResponse(input.raw);\n const parsed = gatewayErrorEnvelopeSchema.safeParse(payload);\n const headerRequestId = normalizeOptionalText(\n input.response.headers.get(OPENMELD_HEADER_REQUEST_ID)\n );\n\n if (parsed.success) {\n return new GatewayHttpError({\n code: parsed.data.error.code,\n message: parsed.data.error.message,\n requestId: parsed.data.error.requestId || headerRequestId,\n status: input.response.status,\n rawBody: input.raw,\n upstreamCode: parsed.data.error.upstreamCode ?? null,\n });\n }\n\n const looseEnvelope = readLooseGatewayErrorEnvelope(payload);\n if (looseEnvelope) {\n return new GatewayHttpError({\n code: looseEnvelope.code ?? FALLBACK_GATEWAY_HTTP_ERROR_CODE,\n message:\n looseEnvelope.message ??\n `Gateway request failed with HTTP ${input.response.status}.`,\n requestId: looseEnvelope.requestId ?? headerRequestId,\n status: input.response.status,\n rawBody: input.raw,\n upstreamCode: looseEnvelope.upstreamCode,\n });\n }\n\n return new GatewayHttpError({\n code: FALLBACK_GATEWAY_HTTP_ERROR_CODE,\n message:\n normalizeOptionalText(input.raw) ??\n `Gateway request failed with HTTP ${input.response.status}.`,\n requestId: headerRequestId,\n status: input.response.status,\n rawBody: input.raw,\n upstreamCode: null,\n });\n}\n\nexport function toStructuredGatewayFailure(\n error: unknown\n): StructuredGatewayFailure {\n if (error instanceof OpenMeldApiClientHttpError) {\n return {\n code: error.code,\n message: normalizeFailureMessage(error.message),\n requestId: error.requestId,\n status: error.status,\n upstreamCode: error.upstreamCode,\n };\n }\n\n if (error instanceof GatewayHttpError) {\n return {\n code: error.code,\n message: normalizeFailureMessage(error.message),\n requestId: error.requestId,\n status: error.status,\n upstreamCode: error.upstreamCode,\n };\n }\n\n const genericErrorCode = readGenericErrorCode(error);\n if (genericErrorCode) {\n return {\n code: genericErrorCode,\n message: normalizeFailureMessage(\n error instanceof Error ? error.message : String(error)\n ),\n requestId: null,\n status: null,\n upstreamCode: null,\n };\n }\n\n return {\n code: null,\n message: normalizeFailureMessage(\n error instanceof Error ? error.message : String(error)\n ),\n requestId: null,\n status: null,\n upstreamCode: null,\n };\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeFailureMessage(value: unknown): string {\n return normalizeOptionalText(value) ?? \"Unknown error.\";\n}\n\nfunction readGenericErrorCode(value: unknown): GatewayResponseErrorCode | null {\n if (!value || typeof value !== \"object\" || !(\"code\" in value)) {\n return null;\n }\n\n const normalized = normalizeOptionalText(\n (value as { code?: unknown }).code ?? null\n );\n return normalized as GatewayResponseErrorCode | null;\n}\n\nfunction readLooseGatewayErrorEnvelope(value: unknown): {\n code: string | null;\n message: string | null;\n requestId: string | null;\n upstreamCode: string | null;\n} | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const record = value as {\n error?: {\n code?: unknown;\n message?: unknown;\n requestId?: unknown;\n upstreamCode?: unknown;\n } | null;\n };\n const error = record.error;\n if (!error || typeof error !== \"object\") {\n return null;\n }\n\n const code = normalizeOptionalText(error.code);\n const message = normalizeOptionalText(error.message);\n const requestId = normalizeOptionalText(error.requestId);\n const upstreamCode = normalizeOptionalText(error.upstreamCode);\n if (!(code || message || requestId || upstreamCode)) {\n return null;\n }\n\n return {\n code,\n message,\n requestId,\n upstreamCode,\n };\n}\n","import type { SpaceMeta } from \"@openmeld/protocol\";\nimport { spaceMetaSchema } from \"@openmeld/schemas\";\n\ntype SpaceMetaParseOperation =\n | \"createSpaceMeta\"\n | \"fetchSpaceMeta\"\n | \"updateSpaceMeta\";\n\nexport function parseSpaceMetaPayload(input: {\n data: unknown;\n endpoint: string;\n operation: SpaceMetaParseOperation;\n}): SpaceMeta {\n try {\n const validation = spaceMetaSchema.safeParse(input.data);\n if (!validation.success) {\n const reason =\n validation.error.issues[0]?.message ??\n \"space meta payload does not match schema\";\n throw new Error(reason);\n }\n return validation.data;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `${input.operation} received invalid response payload from ${input.endpoint}: ${reason}; raw=${JSON.stringify(input.data)}`\n );\n }\n}\n\nexport function parseSpaceMetaResponse(input: {\n raw: string;\n endpoint: string;\n operation: Extract<\n SpaceMetaParseOperation,\n \"fetchSpaceMeta\" | \"updateSpaceMeta\"\n >;\n}): SpaceMeta {\n try {\n return parseSpaceMetaPayload({\n data: JSON.parse(input.raw) as unknown,\n endpoint: input.endpoint,\n operation: input.operation,\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `${input.operation} received invalid response payload from ${input.endpoint}: ${reason}; raw=${input.raw}`\n );\n }\n}\n","import type { SpaceMeta } from \"@openmeld/protocol\";\nimport type { OpenMeldRequestContext } from \"@openmeld/schemas/types\";\nimport { buildOpenMeldRequestContextHeadersWithAuth } from \"../config/request-headers\";\nimport { toSpaceMetaUrl } from \"../protocol/urls\";\nimport { fetchSpaceRequestWithTimeout } from \"./fetch-with-timeout\";\nimport { readGatewayTextResponse } from \"./gateway-response\";\nimport { parseSpaceMetaResponse } from \"./space-meta-response\";\n\ntype SpaceMetaApiInput = {\n requestContext: OpenMeldRequestContext;\n baseUrl: string;\n space: string;\n password?: string;\n};\n\nexport async function fetchSpaceMeta(\n input: SpaceMetaApiInput\n): Promise<SpaceMeta> {\n const endpoint = toSpaceMetaUrl(input.baseUrl, input.space);\n const response = await fetchSpaceRequestWithTimeout({\n url: endpoint,\n operation: \"space.fetch_meta\",\n init: {\n method: \"GET\",\n headers: await buildOpenMeldRequestContextHeadersWithAuth({\n requestUrl: endpoint,\n requestContext: input.requestContext,\n spacePassword: input.password,\n }),\n },\n });\n const raw = await readGatewayTextResponse({ response });\n\n return parseSpaceMetaResponse({\n raw,\n endpoint,\n operation: \"fetchSpaceMeta\",\n });\n}\n\nexport async function updateSpaceMeta(\n input: SpaceMetaApiInput & {\n purpose?: string;\n guide?: string;\n }\n): Promise<SpaceMeta> {\n const endpoint = toSpaceMetaUrl(input.baseUrl, input.space);\n const headers = await buildOpenMeldRequestContextHeadersWithAuth({\n requestUrl: endpoint,\n requestContext: input.requestContext,\n spacePassword: input.password,\n });\n headers[\"content-type\"] = \"application/json\";\n\n const response = await fetchSpaceRequestWithTimeout({\n url: endpoint,\n operation: \"space.update_meta\",\n init: {\n method: \"PATCH\",\n headers,\n body: JSON.stringify({\n ...(input.purpose === undefined ? {} : { purpose: input.purpose }),\n ...(input.guide === undefined ? {} : { guide: input.guide }),\n }),\n },\n });\n const raw = await readGatewayTextResponse({ response });\n\n return parseSpaceMetaResponse({\n raw,\n endpoint,\n operation: \"updateSpaceMeta\",\n });\n}\n"],"mappings":"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"}