@powerhousedao/shared 6.2.2-dev.9 → 6.2.2

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 (227) hide show
  1. package/dist/clis/args/access-token--9H57y8J.d.mts +18 -0
  2. package/dist/clis/args/access-token--9H57y8J.d.mts.map +1 -0
  3. package/dist/clis/args/access-token-To5LaIfL.mjs +22 -0
  4. package/dist/clis/args/access-token-To5LaIfL.mjs.map +1 -0
  5. package/dist/clis/args/access-token.d.mts +2 -18
  6. package/dist/clis/args/access-token.mjs +1 -21
  7. package/dist/clis/args/{common-dbsvksvf.mjs → common-CcYbXrBx.mjs} +7 -2
  8. package/dist/clis/args/common-CcYbXrBx.mjs.map +1 -0
  9. package/dist/clis/args/{common-Cr8LZG55.d.mts → common-Dsf1vpHV.d.mts} +7 -4
  10. package/dist/clis/args/{common-Cr8LZG55.d.mts.map → common-Dsf1vpHV.d.mts.map} +1 -1
  11. package/dist/clis/args/common.d.mts +2 -2
  12. package/dist/clis/args/common.mjs +2 -2
  13. package/dist/clis/args/connect-BVVvCmL9.mjs +198 -0
  14. package/dist/clis/args/connect-BVVvCmL9.mjs.map +1 -0
  15. package/dist/clis/args/connect-DetTnI8g.d.mts +443 -0
  16. package/dist/clis/args/connect-DetTnI8g.d.mts.map +1 -0
  17. package/dist/clis/args/connect.d.mts +2 -434
  18. package/dist/clis/args/connect.mjs +1 -196
  19. package/dist/clis/args/{generate-Cs5okckF.mjs → generate-CA916Fvj.mjs} +2 -2
  20. package/dist/clis/args/{generate-Cs5okckF.mjs.map → generate-CA916Fvj.mjs.map} +1 -1
  21. package/dist/clis/args/generate-DnV-bfXt.d.mts +87 -0
  22. package/dist/clis/args/generate-DnV-bfXt.d.mts.map +1 -0
  23. package/dist/clis/args/generate.d.mts +2 -87
  24. package/dist/clis/args/generate.mjs +1 -1
  25. package/dist/clis/args/{help-BkF9Cxud.mjs → help-Bqbgbalu.mjs} +15 -15
  26. package/dist/clis/args/{help-BkF9Cxud.mjs.map → help-Bqbgbalu.mjs.map} +1 -1
  27. package/dist/clis/args/{help-CYjFrzIJ.d.mts → help-CjAsudUn.d.mts} +1 -1
  28. package/dist/clis/args/{help-CYjFrzIJ.d.mts.map → help-CjAsudUn.d.mts.map} +1 -1
  29. package/dist/clis/args/help.d.mts +1 -1
  30. package/dist/clis/args/help.mjs +1 -13
  31. package/dist/clis/args/index.d.mts +19 -19
  32. package/dist/clis/args/index.mjs +19 -19
  33. package/dist/clis/args/init-CUXyfquF.d.mts +55 -0
  34. package/dist/clis/args/init-CUXyfquF.d.mts.map +1 -0
  35. package/dist/clis/args/init-rz9Ei7nq.mjs +67 -0
  36. package/dist/clis/args/init-rz9Ei7nq.mjs.map +1 -0
  37. package/dist/clis/args/init.d.mts +2 -55
  38. package/dist/clis/args/init.mjs +1 -66
  39. package/dist/clis/args/inspect-DtZeoA5c.d.mts +15 -0
  40. package/dist/clis/args/inspect-DtZeoA5c.d.mts.map +1 -0
  41. package/dist/clis/args/inspect-tckH8mSw.mjs +15 -0
  42. package/dist/clis/args/inspect-tckH8mSw.mjs.map +1 -0
  43. package/dist/clis/args/inspect.d.mts +2 -15
  44. package/dist/clis/args/inspect.mjs +1 -14
  45. package/dist/clis/args/install-CkP8zcHb.d.mts +40 -0
  46. package/dist/clis/args/install-CkP8zcHb.d.mts.map +1 -0
  47. package/dist/clis/args/install-Sz2DlCHh.mjs +32 -0
  48. package/dist/clis/args/install-Sz2DlCHh.mjs.map +1 -0
  49. package/dist/clis/args/install.d.mts +2 -40
  50. package/dist/clis/args/install.mjs +1 -31
  51. package/dist/clis/args/list-BGf8s_gj.d.mts +12 -0
  52. package/dist/clis/args/list-BGf8s_gj.d.mts.map +1 -0
  53. package/dist/clis/args/list-DM2d6f1m.mjs +7 -0
  54. package/dist/clis/args/list-DM2d6f1m.mjs.map +1 -0
  55. package/dist/clis/args/list.d.mts +2 -12
  56. package/dist/clis/args/list.mjs +1 -6
  57. package/dist/clis/args/login-DNsHwvqk.d.mts +27 -0
  58. package/dist/clis/args/login-DNsHwvqk.d.mts.map +1 -0
  59. package/dist/clis/args/login-DiKT5Jfu.mjs +40 -0
  60. package/dist/clis/args/login-DiKT5Jfu.mjs.map +1 -0
  61. package/dist/clis/args/login.d.mts +2 -27
  62. package/dist/clis/args/login.mjs +1 -39
  63. package/dist/clis/args/magic-string.es-h_0HDQBQ.mjs +1013 -0
  64. package/dist/clis/args/magic-string.es-h_0HDQBQ.mjs.map +1 -0
  65. package/dist/clis/args/migrate-CG_gWc4k.mjs +29 -0
  66. package/dist/clis/args/migrate-CG_gWc4k.mjs.map +1 -0
  67. package/dist/clis/args/migrate-sixkWhxm.d.mts +21 -0
  68. package/dist/clis/args/migrate-sixkWhxm.d.mts.map +1 -0
  69. package/dist/clis/args/migrate.d.mts +2 -21
  70. package/dist/clis/args/migrate.mjs +1 -28
  71. package/dist/clis/args/publish-DDZYsUfV.mjs +19 -0
  72. package/dist/clis/args/publish-DDZYsUfV.mjs.map +1 -0
  73. package/dist/clis/args/publish-Dqe5DUst.d.mts +18 -0
  74. package/dist/clis/args/publish-Dqe5DUst.d.mts.map +1 -0
  75. package/dist/clis/args/publish.d.mts +2 -18
  76. package/dist/clis/args/publish.mjs +1 -18
  77. package/dist/clis/args/registry-C_OVFQmI.mjs +23 -0
  78. package/dist/clis/args/registry-C_OVFQmI.mjs.map +1 -0
  79. package/dist/clis/args/registry-C_RfTsKB.d.mts +19 -0
  80. package/dist/clis/args/registry-C_RfTsKB.d.mts.map +1 -0
  81. package/dist/clis/args/registry.d.mts +2 -19
  82. package/dist/clis/args/registry.mjs +1 -22
  83. package/dist/clis/args/service-CHOOr0Gg.mjs +11 -0
  84. package/dist/clis/args/service-CHOOr0Gg.mjs.map +1 -0
  85. package/dist/clis/args/{service-C88bN_g_.d.mts → service-DhIkf8-O.d.mts} +1 -1
  86. package/dist/clis/args/{service-C88bN_g_.d.mts.map → service-DhIkf8-O.d.mts.map} +1 -1
  87. package/dist/clis/args/service.d.mts +1 -1
  88. package/dist/clis/args/service.mjs +1 -10
  89. package/dist/clis/args/switchboard-BlPaq2at.d.mts +72 -0
  90. package/dist/clis/args/switchboard-BlPaq2at.d.mts.map +1 -0
  91. package/dist/clis/args/switchboard-Dsp7nosi.mjs +85 -0
  92. package/dist/clis/args/switchboard-Dsp7nosi.mjs.map +1 -0
  93. package/dist/clis/args/switchboard.d.mts +2 -72
  94. package/dist/clis/args/switchboard.mjs +1 -84
  95. package/dist/clis/args/uninstall-BpA3YYbw.d.mts +31 -0
  96. package/dist/clis/args/uninstall-BpA3YYbw.d.mts.map +1 -0
  97. package/dist/clis/args/uninstall-CTwTX0u_.mjs +16 -0
  98. package/dist/clis/args/uninstall-CTwTX0u_.mjs.map +1 -0
  99. package/dist/clis/args/uninstall.d.mts +2 -31
  100. package/dist/clis/args/uninstall.mjs +1 -15
  101. package/dist/clis/args/unpublish-BPMkGEg5.mjs +30 -0
  102. package/dist/clis/args/unpublish-BPMkGEg5.mjs.map +1 -0
  103. package/dist/clis/args/unpublish-CvwaIimG.d.mts +24 -0
  104. package/dist/clis/args/unpublish-CvwaIimG.d.mts.map +1 -0
  105. package/dist/clis/args/unpublish.d.mts +2 -24
  106. package/dist/clis/args/unpublish.mjs +1 -29
  107. package/dist/clis/args/vetra-DLQ6lhLl.d.mts +113 -0
  108. package/dist/clis/args/vetra-DLQ6lhLl.d.mts.map +1 -0
  109. package/dist/clis/args/vetra-b4KUu1Ax.mjs +126 -0
  110. package/dist/clis/args/vetra-b4KUu1Ax.mjs.map +1 -0
  111. package/dist/clis/args/vetra-ports.test.d.mts +1 -0
  112. package/dist/clis/args/vetra-ports.test.mjs +13249 -0
  113. package/dist/clis/args/vetra-ports.test.mjs.map +1 -0
  114. package/dist/clis/args/vetra.d.mts +2 -102
  115. package/dist/clis/args/vetra.mjs +2 -75
  116. package/dist/clis/build-config.d.mts +1 -1
  117. package/dist/clis/build-config.d.mts.map +1 -1
  118. package/dist/clis/constants.d.mts +199 -55
  119. package/dist/clis/constants.d.mts.map +1 -1
  120. package/dist/clis/constants.mjs +12 -4
  121. package/dist/clis/constants.mjs.map +1 -1
  122. package/dist/clis/index.d.mts +591 -30
  123. package/dist/clis/index.d.mts.map +1 -1
  124. package/dist/clis/index.mjs +413 -18
  125. package/dist/clis/index.mjs.map +1 -1
  126. package/dist/clis/project-env.d.mts +27 -0
  127. package/dist/clis/project-env.d.mts.map +1 -0
  128. package/dist/clis/project-env.mjs +44 -0
  129. package/dist/clis/project-env.mjs.map +1 -0
  130. package/dist/clis/project-ports.d.mts +40 -0
  131. package/dist/clis/project-ports.d.mts.map +1 -0
  132. package/dist/clis/project-ports.mjs +90 -0
  133. package/dist/clis/project-ports.mjs.map +1 -0
  134. package/dist/{config-loader-19K8n4DO.js → config-loader-B845Hidf.js} +11 -14
  135. package/dist/config-loader-B845Hidf.js.map +1 -0
  136. package/dist/connect/config-loader.d.ts +2 -1
  137. package/dist/connect/config-loader.d.ts.map +1 -1
  138. package/dist/connect/config-loader.js +1 -1
  139. package/dist/connect/index.d.ts +486 -27
  140. package/dist/connect/index.d.ts.map +1 -1
  141. package/dist/connect/index.js +531 -5
  142. package/dist/connect/index.js.map +1 -1
  143. package/dist/connect/json-adapter.d.ts.map +1 -1
  144. package/dist/{constants-C_EQX4DY.d.ts → constants-BP_gjn8g.d.ts} +1 -1
  145. package/dist/constants-BP_gjn8g.d.ts.map +1 -0
  146. package/dist/constants.d.ts +1 -1
  147. package/dist/document-drive/index.d.ts +2 -2
  148. package/dist/document-drive/index.js +3 -3
  149. package/dist/document-drive/index.js.map +1 -1
  150. package/dist/document-model/index.d.ts +4 -5
  151. package/dist/document-model/index.js +1337 -133
  152. package/dist/document-model/index.js.map +1 -1
  153. package/dist/document-model/mock.d.ts +22 -2
  154. package/dist/document-model/mock.d.ts.map +1 -0
  155. package/dist/document-model/mock.js +32 -3
  156. package/dist/document-model/mock.js.map +1 -1
  157. package/dist/document-model/utils.d.ts +1 -2
  158. package/dist/document-model/utils.js +1 -2
  159. package/dist/{index-CQDIrK1k.d.ts → index-C_iVZe7f.d.ts} +1 -1
  160. package/dist/index-C_iVZe7f.d.ts.map +1 -0
  161. package/dist/index-DPuio_se.d.ts +836 -0
  162. package/dist/index-DPuio_se.d.ts.map +1 -0
  163. package/dist/index.d.ts +5 -6
  164. package/dist/processors/index.d.ts +2 -2
  165. package/dist/registry/index.d.ts +5 -4
  166. package/dist/registry/index.d.ts.map +1 -1
  167. package/dist/registry/index.js +9 -8
  168. package/dist/registry/index.js.map +1 -1
  169. package/dist/registry/manifest-slim.d.ts +1 -1
  170. package/dist/registry/urls.d.ts +11 -0
  171. package/dist/registry/urls.d.ts.map +1 -0
  172. package/dist/registry/urls.js +15 -0
  173. package/dist/registry/urls.js.map +1 -0
  174. package/dist/{types-DvWPqxJr.d.ts → types-BBUlASQ7.d.ts} +30 -4
  175. package/dist/types-BBUlASQ7.d.ts.map +1 -0
  176. package/dist/{types-DXsYu6Tq.d.ts → types-BzWRXB7f.d.ts} +507 -16
  177. package/dist/types-BzWRXB7f.d.ts.map +1 -0
  178. package/dist/utils-DP122OSS.d.ts +18 -0
  179. package/dist/utils-DP122OSS.d.ts.map +1 -0
  180. package/dist/{utils-DKOFCM0Q.js → utils-aaTmfxFW.js} +45 -2
  181. package/dist/utils-aaTmfxFW.js.map +1 -0
  182. package/package.json +12 -1
  183. package/dist/clis/args/access-token.d.mts.map +0 -1
  184. package/dist/clis/args/access-token.mjs.map +0 -1
  185. package/dist/clis/args/common-dbsvksvf.mjs.map +0 -1
  186. package/dist/clis/args/connect.d.mts.map +0 -1
  187. package/dist/clis/args/connect.mjs.map +0 -1
  188. package/dist/clis/args/generate.d.mts.map +0 -1
  189. package/dist/clis/args/init.d.mts.map +0 -1
  190. package/dist/clis/args/init.mjs.map +0 -1
  191. package/dist/clis/args/inspect.d.mts.map +0 -1
  192. package/dist/clis/args/inspect.mjs.map +0 -1
  193. package/dist/clis/args/install.d.mts.map +0 -1
  194. package/dist/clis/args/install.mjs.map +0 -1
  195. package/dist/clis/args/list.d.mts.map +0 -1
  196. package/dist/clis/args/list.mjs.map +0 -1
  197. package/dist/clis/args/login.d.mts.map +0 -1
  198. package/dist/clis/args/login.mjs.map +0 -1
  199. package/dist/clis/args/migrate.d.mts.map +0 -1
  200. package/dist/clis/args/migrate.mjs.map +0 -1
  201. package/dist/clis/args/publish.d.mts.map +0 -1
  202. package/dist/clis/args/publish.mjs.map +0 -1
  203. package/dist/clis/args/registry.d.mts.map +0 -1
  204. package/dist/clis/args/registry.mjs.map +0 -1
  205. package/dist/clis/args/service.mjs.map +0 -1
  206. package/dist/clis/args/switchboard.d.mts.map +0 -1
  207. package/dist/clis/args/switchboard.mjs.map +0 -1
  208. package/dist/clis/args/uninstall.d.mts.map +0 -1
  209. package/dist/clis/args/uninstall.mjs.map +0 -1
  210. package/dist/clis/args/unpublish.d.mts.map +0 -1
  211. package/dist/clis/args/unpublish.mjs.map +0 -1
  212. package/dist/clis/args/vetra.d.mts.map +0 -1
  213. package/dist/clis/args/vetra.mjs.map +0 -1
  214. package/dist/config-loader-19K8n4DO.js.map +0 -1
  215. package/dist/constants-C_EQX4DY.d.ts.map +0 -1
  216. package/dist/index-CQDIrK1k.d.ts.map +0 -1
  217. package/dist/index-Dz7JrBXs.d.ts +0 -399
  218. package/dist/index-Dz7JrBXs.d.ts.map +0 -1
  219. package/dist/mock-CBcf78ra.d.ts +0 -7
  220. package/dist/mock-CBcf78ra.d.ts.map +0 -1
  221. package/dist/types-D0NNBVGA.d.ts +0 -167
  222. package/dist/types-D0NNBVGA.d.ts.map +0 -1
  223. package/dist/types-DXsYu6Tq.d.ts.map +0 -1
  224. package/dist/types-DvWPqxJr.d.ts.map +0 -1
  225. package/dist/utils-BEByNOHo.d.ts +0 -9
  226. package/dist/utils-BEByNOHo.d.ts.map +0 -1
  227. package/dist/utils-DKOFCM0Q.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { i as buildRuntimeConfig, n as deepMerge, r as DEFAULT_CONNECT_CONFIG, t as ConfigLoader } from "../config-loader-19K8n4DO.js";
1
+ import { i as buildRuntimeConfig, n as deepMerge, r as DEFAULT_CONNECT_CONFIG, t as ConfigLoader } from "../config-loader-B845Hidf.js";
2
2
  import { JsonConfigAdapter } from "./json-adapter.js";
3
3
  import { z } from "zod";
4
4
  //#region connect/env-config.ts
@@ -210,6 +210,225 @@ function getStorageNamespace(basePath) {
210
210
  return `${ROOT_STORAGE_NAMESPACE}--${normalized.slice(1, -1).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "default"}`;
211
211
  }
212
212
  //#endregion
213
+ //#region connect/pwa-config.ts
214
+ const MANIFEST_SCALAR_KEYS = [
215
+ "name",
216
+ "short_name",
217
+ "description",
218
+ "theme_color",
219
+ "background_color",
220
+ "display",
221
+ "start_url",
222
+ "scope",
223
+ "launch_handler"
224
+ ];
225
+ const ADDITIVE_MANIFEST_KEYS = new Set([
226
+ "icons",
227
+ "file_handlers",
228
+ "categories"
229
+ ]);
230
+ function iconKey(icon) {
231
+ const purpose = typeof icon.purpose === "string" ? icon.purpose : icon.purpose?.join(",") ?? "";
232
+ return `${icon.src}|${icon.sizes ?? ""}|${purpose}`;
233
+ }
234
+ /** Concatenate, keeping the first occurrence per `key`. */
235
+ function dedupeBy(items, key) {
236
+ const seen = /* @__PURE__ */ new Set();
237
+ const result = [];
238
+ for (const item of items) {
239
+ const k = key(item);
240
+ if (seen.has(k)) continue;
241
+ seen.add(k);
242
+ result.push(item);
243
+ }
244
+ return result;
245
+ }
246
+ /** Concatenate icons, keeping the first occurrence of each (src,sizes,purpose). */
247
+ function dedupeIcons(icons) {
248
+ return dedupeBy(icons, iconKey);
249
+ }
250
+ /** `JSON.stringify` with object keys sorted recursively, so two structurally
251
+ * equal values always serialise identically (accept-map key order etc.). */
252
+ function stableStringify(value) {
253
+ if (Array.isArray(value)) return `[${value.map(stableStringify).join(",")}]`;
254
+ if (value !== null && typeof value === "object") return `{${Object.entries(value).filter(([, v]) => v !== void 0).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`).join(",")}}`;
255
+ return JSON.stringify(value);
256
+ }
257
+ /**
258
+ * Concatenate file handlers, keeping the first occurrence of each entry.
259
+ * Deduped on the WHOLE entry (canonical JSON) rather than any single field:
260
+ * every handler shares Connect's fixed action, and two handlers accepting
261
+ * different file types are both real contributions — only the exact same
262
+ * fragment arriving via two layers is a duplicate. Structural, so it also
263
+ * works on the vite-plugin-pwa handler shape in builder-tools.
264
+ */
265
+ function dedupeFileHandlers(handlers) {
266
+ return dedupeBy(handlers, stableStringify);
267
+ }
268
+ /** Fold a manifest's top-level `category` string into a PWA config as a
269
+ * `categories: [category]` entry. PWA `categories` is DERIVED from the
270
+ * `category` field of every contributing `powerhouse.manifest.json` (never
271
+ * authored under `pwa`); `mergePwaConfig`/`mergeManifest` then union them
272
+ * across contributors. No-op when there is no usable category. */
273
+ function withInferredCategory(config, category) {
274
+ if (typeof category !== "string" || !category) return config;
275
+ return {
276
+ ...config,
277
+ manifest: {
278
+ ...config.manifest,
279
+ categories: [category]
280
+ }
281
+ };
282
+ }
283
+ /** Order-preserving string union (used for the precache glob lists). */
284
+ function unionStrings(base, extra) {
285
+ const result = [...base ?? []];
286
+ for (const item of extra) if (!result.includes(item)) result.push(item);
287
+ return result;
288
+ }
289
+ function patternKey(pattern) {
290
+ return typeof pattern === "string" ? `s:${pattern}` : `r:${pattern.source}:${pattern.flags ?? ""}`;
291
+ }
292
+ function unionPatterns(base, extra) {
293
+ const result = [...base ?? []];
294
+ const seen = new Set(result.map(patternKey));
295
+ for (const pattern of extra) {
296
+ const key = patternKey(pattern);
297
+ if (seen.has(key)) continue;
298
+ seen.add(key);
299
+ result.push(pattern);
300
+ }
301
+ return result;
302
+ }
303
+ /** Merge one fragment into `target` in place, applying the per-field
304
+ * strategies (manifest scalars deep-merge and win; icons/file_handlers/globs/
305
+ * rules/denylist are additive; size ceiling takes the max). */
306
+ function mergeInto(target, config) {
307
+ if (config.manifest) {
308
+ const { icons, file_handlers, categories, ...scalars } = config.manifest;
309
+ if (Object.keys(scalars).length > 0) target.manifest = deepMerge(target.manifest ?? {}, scalars);
310
+ if (icons?.length) target.manifest = {
311
+ ...target.manifest ?? {},
312
+ icons: dedupeIcons([...target.manifest?.icons ?? [], ...icons])
313
+ };
314
+ if (file_handlers?.length) target.manifest = {
315
+ ...target.manifest ?? {},
316
+ file_handlers: dedupeFileHandlers([...target.manifest?.file_handlers ?? [], ...file_handlers])
317
+ };
318
+ if (categories?.length) target.manifest = {
319
+ ...target.manifest ?? {},
320
+ categories: unionStrings(target.manifest?.categories, categories)
321
+ };
322
+ }
323
+ if (config.globPatterns?.length) target.globPatterns = unionStrings(target.globPatterns, config.globPatterns);
324
+ if (config.globIgnores?.length) target.globIgnores = unionStrings(target.globIgnores, config.globIgnores);
325
+ if (config.runtimeCaching?.length) target.runtimeCaching = [...target.runtimeCaching ?? [], ...config.runtimeCaching];
326
+ if (config.navigateFallbackDenylist?.length) target.navigateFallbackDenylist = unionPatterns(target.navigateFallbackDenylist, config.navigateFallbackDenylist);
327
+ if (typeof config.maximumFileSizeToCacheInBytes === "number") target.maximumFileSizeToCacheInBytes = Math.max(target.maximumFileSizeToCacheInBytes ?? 0, config.maximumFileSizeToCacheInBytes);
328
+ }
329
+ /**
330
+ * Fold the build-time-known package PWA fragments and the project's
331
+ * `connect.pwa` block into one effective fragment. Precedence is
332
+ * `packageContributions (in order) < projectConfig` — the project config wins
333
+ * scalar fields, while arrays (`icons`, globs, `runtimeCaching`,
334
+ * `navigateFallbackDenylist`) are additive across every layer and the size
335
+ * ceiling takes the max.
336
+ *
337
+ * `onWarn` fires when two or more PACKAGES set the same manifest scalar to
338
+ * different values and the project config doesn't settle it — the winner is
339
+ * otherwise decided silently by package load order. The operator resolves it
340
+ * by setting that field in `connect.pwa`, which both wins and silences the
341
+ * warning.
342
+ */
343
+ function mergePwaConfig(packageContributions, projectConfig, onWarn = () => {}) {
344
+ const merged = {};
345
+ const packageScalarSetters = {};
346
+ for (const { source, config } of packageContributions) {
347
+ mergeInto(merged, config);
348
+ for (const [key, value] of Object.entries(config.manifest ?? {})) {
349
+ if (ADDITIVE_MANIFEST_KEYS.has(key)) continue;
350
+ (packageScalarSetters[key] ??= []).push({
351
+ source,
352
+ value
353
+ });
354
+ }
355
+ }
356
+ if (projectConfig) mergeInto(merged, projectConfig);
357
+ const projectManifest = projectConfig?.manifest ?? {};
358
+ for (const key of MANIFEST_SCALAR_KEYS) {
359
+ const setters = packageScalarSetters[key];
360
+ const projectSettles = projectManifest[key] !== void 0;
361
+ if (!setters || setters.length < 2 || projectSettles) continue;
362
+ if (new Set(setters.map((s) => stableStringify(s.value))).size < 2) continue;
363
+ const sources = setters.map((s) => s.source);
364
+ onWarn(`PWA config: manifest.${key} set by multiple packages (${sources.join(", ")}); '${sources[sources.length - 1]}' wins by load order. Set connect.pwa.manifest.${key} in the project config to make the winner explicit.`);
365
+ }
366
+ return merged;
367
+ }
368
+ /** A serialisable URL pattern as Workbox consumes it: strings pass through
369
+ * verbatim, `{ source, flags }` is rebuilt into a RegExp. */
370
+ function toRegExpOrString(pattern) {
371
+ return typeof pattern === "string" ? pattern : new RegExp(pattern.source, pattern.flags);
372
+ }
373
+ //#endregion
374
+ //#region connect/pwa-manifest.ts
375
+ /**
376
+ * The one route launched files open at, shared by the built-in handler and
377
+ * injected into every contributed one. Not configurable: consuming launched
378
+ * files takes runtime code that lives in Connect itself, and a relative "."
379
+ * resolves against the manifest URL so it tracks any deploy base (the
380
+ * webmanifest is served dynamically and never rewritten by the dynamic-base
381
+ * plugin) — same trick as the base start_url/scope.
382
+ */
383
+ const PWA_FILE_HANDLER_ACTION = ".";
384
+ const PWA_IDB_NAME = "ph-pwa";
385
+ const PWA_IDB_STORE = "fragments";
386
+ const PWA_IDB_KEY = "merged";
387
+ const PWA_IDB_VERSION = 1;
388
+ /**
389
+ * Lay a `PHConnectPwaManifest` fragment over a base web-manifest object.
390
+ *
391
+ * - **scalars** (name, theme_color, launch_handler, …): governed by
392
+ * `scalarPolicy`. `"fragment-wins"` lets the fragment overwrite the base;
393
+ * `"base-wins"` keeps the base and only fills fields it left unset. Keys
394
+ * listed in `protectedScalars` always behave as base-wins even under a
395
+ * fragment-wins policy — used at runtime to fragment-win cosmetic scalars
396
+ * while still protecting navigation-critical ones (`start_url`/`scope`) from
397
+ * an untrusted dynamically-installed package.
398
+ * - **arrays** (icons, file_handlers): always additive, base entries first,
399
+ * de-duplicated — so a package can extend but never displace a built-in
400
+ * (Chromium is first-registered-wins per file extension, so `.phd`/`.phdm`
401
+ * stay Connect's).
402
+ * - **categories**: order-preserving string union (derived from the manifest
403
+ * `category` field, not authored under `pwa`).
404
+ *
405
+ * The Connect-owned file-handler action is injected idempotently.
406
+ */
407
+ function mergeManifest(base, fragment, opts) {
408
+ const scalarPolicy = opts?.scalarPolicy ?? "base-wins";
409
+ const protectedScalars = opts?.protectedScalars ?? [];
410
+ const result = { ...base };
411
+ const { icons, file_handlers, categories, ...scalars } = fragment ?? {};
412
+ const takeScalar = (key) => {
413
+ return (protectedScalars.includes(key) ? "base-wins" : scalarPolicy) === "fragment-wins" || result[key] === void 0;
414
+ };
415
+ for (const [key, value] of Object.entries(scalars)) if (takeScalar(key)) result[key] = value;
416
+ if (icons?.length) result.icons = dedupeIcons([...result.icons ?? [], ...icons]);
417
+ if (file_handlers?.length) {
418
+ const injected = file_handlers.map((handler) => ({
419
+ ...handler,
420
+ action: "."
421
+ }));
422
+ result.file_handlers = dedupeFileHandlers([...result.file_handlers ?? [], ...injected]);
423
+ }
424
+ if (categories?.length) result.categories = unionStrings(result.categories, categories);
425
+ if (result.file_handlers?.length) result.file_handlers = result.file_handlers.map((handler) => ({
426
+ ...handler,
427
+ action: "."
428
+ }));
429
+ return result;
430
+ }
431
+ //#endregion
213
432
  //#region connect/schema-fragments.ts
214
433
  const powerhousePackageSchema = {
215
434
  type: "object",
@@ -262,6 +481,35 @@ const driveSectionSchema = {
262
481
  }
263
482
  }
264
483
  };
484
+ const pwaUrlPatternSchema = {
485
+ description: "URL match. A string is matched verbatim by Workbox; { source, flags } is rebuilt into a RegExp at build time.",
486
+ oneOf: [{ type: "string" }, {
487
+ type: "object",
488
+ additionalProperties: false,
489
+ required: ["source"],
490
+ properties: {
491
+ source: {
492
+ type: "string",
493
+ description: "RegExp source."
494
+ },
495
+ flags: {
496
+ type: "string",
497
+ description: "RegExp flags (e.g. 'i')."
498
+ }
499
+ }
500
+ }]
501
+ };
502
+ const pwaIconSchema = {
503
+ type: "object",
504
+ additionalProperties: false,
505
+ required: ["src"],
506
+ properties: {
507
+ src: { type: "string" },
508
+ sizes: { type: "string" },
509
+ type: { type: "string" },
510
+ purpose: { type: "string" }
511
+ }
512
+ };
265
513
  const phConnectRuntimeConfigSchema = {
266
514
  type: "object",
267
515
  additionalProperties: false,
@@ -315,6 +563,16 @@ const phConnectRuntimeConfigSchema = {
315
563
  }
316
564
  }
317
565
  },
566
+ ai: {
567
+ type: "object",
568
+ additionalProperties: false,
569
+ description: "AI assistant (chat) behaviour.",
570
+ properties: { assistantEnabled: {
571
+ type: "boolean",
572
+ description: "When true, Connect mounts the in-browser AI assistant (bottom-right chat FAB that talks to a user-configured OpenAI-compatible endpoint and acts on the reactor). Disabled by default.",
573
+ default: false
574
+ } }
575
+ },
318
576
  packages: {
319
577
  type: "object",
320
578
  additionalProperties: false,
@@ -344,9 +602,9 @@ const phConnectRuntimeConfigSchema = {
344
602
  },
345
603
  defaultDrives: {
346
604
  type: "array",
347
- description: "Drives the SPA auto-connects to on first load. Each must specify a URL; name and icon are optional overrides.",
605
+ description: "Drives the SPA auto-connects to on first load. Each entry is either a remote drive (a URL, with optional name/icon overrides) or a local drive (created locally on first boot, with a stable id and optional name/icon/app).",
348
606
  default: [],
349
- items: {
607
+ items: { oneOf: [{
350
608
  type: "object",
351
609
  additionalProperties: false,
352
610
  required: ["url"],
@@ -355,7 +613,27 @@ const phConnectRuntimeConfigSchema = {
355
613
  name: { type: ["string", "null"] },
356
614
  icon: { type: ["string", "null"] }
357
615
  }
358
- }
616
+ }, {
617
+ type: "object",
618
+ additionalProperties: false,
619
+ required: ["local", "id"],
620
+ properties: {
621
+ local: {
622
+ const: true,
623
+ description: "Discriminator: this entry is a local drive created on first boot."
624
+ },
625
+ id: {
626
+ type: "string",
627
+ description: "Stable drive id. The drive is created with this id on first boot and is not re-created on later boots."
628
+ },
629
+ name: { type: ["string", "null"] },
630
+ icon: { type: ["string", "null"] },
631
+ app: {
632
+ type: "string",
633
+ description: "Drive app (preferred editor) to open on the drive."
634
+ }
635
+ }
636
+ }] }
359
637
  },
360
638
  preserveStrategy: {
361
639
  type: "string",
@@ -392,6 +670,56 @@ const phConnectRuntimeConfigSchema = {
392
670
  type: "number",
393
671
  description: "CAIP-2 chain reference within the network namespace.",
394
672
  default: 1
673
+ },
674
+ namespace: {
675
+ type: "string",
676
+ description: "Renown localStorage namespace; share it across Connects to share login."
677
+ },
678
+ switchboardUrl: {
679
+ type: "string",
680
+ description: "Switchboard GraphQL URL. When set, Connect enables in-page (no-redirect) Renown sign-in; otherwise it falls back to the redirect flow via `url`."
681
+ },
682
+ adapters: {
683
+ type: "object",
684
+ additionalProperties: false,
685
+ description: "Per-adapter wallet config for in-page auth. Presence of an adapter key enables it; omit or leave empty for redirect-only behaviour.",
686
+ properties: {
687
+ rainbow: {
688
+ type: "object",
689
+ additionalProperties: false,
690
+ description: "wagmi + RainbowKit external-wallet adapter config.",
691
+ properties: {
692
+ walletConnectProjectId: {
693
+ type: "string",
694
+ description: "WalletConnect project id; required for this adapter to function."
695
+ },
696
+ infuraProjectId: {
697
+ type: "string",
698
+ description: "Optional Infura project id used to build RPC transports."
699
+ }
700
+ }
701
+ },
702
+ privy: {
703
+ type: "object",
704
+ additionalProperties: false,
705
+ description: "Privy embedded/social adapter config.",
706
+ properties: {
707
+ appId: {
708
+ type: "string",
709
+ description: "Privy application id; required for this adapter to function."
710
+ },
711
+ clientId: {
712
+ type: "string",
713
+ description: "Optional Privy client id."
714
+ },
715
+ methods: {
716
+ type: "array",
717
+ description: "Login methods this adapter offers; default per adapter when omitted.",
718
+ items: { type: "string" }
719
+ }
720
+ }
721
+ }
722
+ }
395
723
  }
396
724
  }
397
725
  },
@@ -434,10 +762,208 @@ const phConnectRuntimeConfigSchema = {
434
762
  default: false
435
763
  }
436
764
  }
765
+ },
766
+ reactor: {
767
+ type: "object",
768
+ additionalProperties: false,
769
+ description: "Settings for the reactor Connect runs in the browser, on the main thread or in the shared worker alike.",
770
+ properties: { featureFlags: {
771
+ type: "object",
772
+ additionalProperties: false,
773
+ description: "Enforcement flags. Each implies its predecessors, and the reactor refuses to boot on a set that names a later flag without an earlier one. These are consensus settings: a Connect syncing with a fleet must carry the same flags the fleet does, or the two reach different replay outcomes for the same history and diverge.",
774
+ properties: {
775
+ documentDecisions: {
776
+ type: "boolean",
777
+ description: "Decide writes from the document stream rather than the document meta cache, so a backdated deletion denies the operations that sort after it.",
778
+ default: false
779
+ },
780
+ authEnforcement: {
781
+ type: "boolean",
782
+ description: "Enforce the auth scope's policy at admission, replay, and read. Requires documentDecisions.",
783
+ default: false
784
+ },
785
+ authGroups: {
786
+ type: "boolean",
787
+ description: "Let `{ group }` principals match against the rosters of the group documents a policy names. Requires authEnforcement.",
788
+ default: false
789
+ },
790
+ authConditions: {
791
+ type: "boolean",
792
+ description: "Evaluate `where` and `match` conditions on grants. Requires authGroups. Do not enable on a fleet `preflight:auth` reports as crossing a reducer version.",
793
+ default: false
794
+ }
795
+ }
796
+ } }
797
+ },
798
+ pwa: {
799
+ type: "object",
800
+ additionalProperties: false,
801
+ description: "Progressive-web-app / service-worker overrides, layered on Connect's built-in PWA defaults at build time. Scalar fields deep-merge (this layer wins); the array members (icons, file_handlers, globs, runtimeCaching and denylist patterns) are additive; maximumFileSizeToCacheInBytes takes the max across contributors. (categories is not set here — it is derived from the manifest's category field.) Only applied when connect.app.offline is true.",
802
+ properties: {
803
+ manifest: {
804
+ type: "object",
805
+ additionalProperties: false,
806
+ description: "Web-app-manifest field overrides.",
807
+ properties: {
808
+ name: { type: "string" },
809
+ short_name: { type: "string" },
810
+ description: { type: "string" },
811
+ theme_color: { type: "string" },
812
+ background_color: { type: "string" },
813
+ display: {
814
+ type: "string",
815
+ enum: [
816
+ "fullscreen",
817
+ "standalone",
818
+ "minimal-ui",
819
+ "browser"
820
+ ]
821
+ },
822
+ start_url: { type: "string" },
823
+ scope: { type: "string" },
824
+ icons: {
825
+ type: "array",
826
+ description: "Icons appended to the built-in set and de-duplicated by (src, sizes, purpose).",
827
+ items: pwaIconSchema
828
+ },
829
+ file_handlers: {
830
+ type: "array",
831
+ description: "File associations appended after Connect's built-in .phd/.phdm handler and de-duplicated on the whole entry. Entries only declare accepted types; there is no action field, because opening the files requires Connect's own runtime handling, so every handler opens at the app root.",
832
+ items: {
833
+ type: "object",
834
+ additionalProperties: false,
835
+ required: ["accept"],
836
+ properties: {
837
+ accept: {
838
+ type: "object",
839
+ description: "MIME type → file extensions. Each extension must start with '.'; browsers ignore entries without it.",
840
+ additionalProperties: {
841
+ type: "array",
842
+ items: {
843
+ type: "string",
844
+ pattern: "^\\."
845
+ }
846
+ }
847
+ },
848
+ icons: {
849
+ type: "array",
850
+ description: "OS-level file-type icons.",
851
+ items: pwaIconSchema
852
+ },
853
+ launch_type: {
854
+ type: "string",
855
+ enum: ["single-client", "multiple-clients"]
856
+ }
857
+ }
858
+ }
859
+ },
860
+ launch_handler: {
861
+ type: "object",
862
+ additionalProperties: false,
863
+ required: ["client_mode"],
864
+ description: "How the OS launches the app for handled files/links. Connect defaults to focus-existing.",
865
+ properties: { client_mode: {
866
+ type: "string",
867
+ enum: [
868
+ "auto",
869
+ "focus-existing",
870
+ "navigate-existing",
871
+ "navigate-new"
872
+ ]
873
+ } }
874
+ }
875
+ }
876
+ },
877
+ globPatterns: {
878
+ type: "array",
879
+ items: { type: "string" },
880
+ description: "Extra Workbox precache globs, unioned with the built-ins."
881
+ },
882
+ globIgnores: {
883
+ type: "array",
884
+ items: { type: "string" },
885
+ description: "Extra precache ignore globs, unioned with the built-ins."
886
+ },
887
+ maximumFileSizeToCacheInBytes: {
888
+ type: "number",
889
+ description: "Raise the precache file-size ceiling. The max across all contributors wins, so no contributor can shrink another's limit."
890
+ },
891
+ runtimeCaching: {
892
+ type: "array",
893
+ description: "Runtime-caching rules appended after the built-in rules. Workbox is first-match-wins, so these cannot override a built-in rule matching the same URL.",
894
+ items: {
895
+ type: "object",
896
+ additionalProperties: false,
897
+ required: ["urlPattern", "handler"],
898
+ properties: {
899
+ urlPattern: pwaUrlPatternSchema,
900
+ handler: {
901
+ type: "string",
902
+ enum: [
903
+ "CacheFirst",
904
+ "CacheOnly",
905
+ "NetworkFirst",
906
+ "NetworkOnly",
907
+ "StaleWhileRevalidate"
908
+ ]
909
+ },
910
+ method: {
911
+ type: "string",
912
+ enum: [
913
+ "GET",
914
+ "POST",
915
+ "PUT",
916
+ "DELETE",
917
+ "HEAD",
918
+ "PATCH"
919
+ ]
920
+ },
921
+ options: {
922
+ type: "object",
923
+ additionalProperties: false,
924
+ properties: {
925
+ cacheName: { type: "string" },
926
+ networkTimeoutSeconds: {
927
+ type: "number",
928
+ description: "Seconds a NetworkFirst rule waits for the network before falling back to the cache."
929
+ },
930
+ expiration: {
931
+ type: "object",
932
+ additionalProperties: false,
933
+ properties: {
934
+ maxEntries: { type: "number" },
935
+ maxAgeSeconds: { type: "number" }
936
+ }
937
+ },
938
+ cacheableResponse: {
939
+ type: "object",
940
+ additionalProperties: false,
941
+ properties: {
942
+ statuses: {
943
+ type: "array",
944
+ items: { type: "number" }
945
+ },
946
+ headers: {
947
+ type: "object",
948
+ additionalProperties: { type: "string" }
949
+ }
950
+ }
951
+ }
952
+ }
953
+ }
954
+ }
955
+ }
956
+ },
957
+ navigateFallbackDenylist: {
958
+ type: "array",
959
+ description: "Extra SPA navigate-fallback denylist patterns, unioned with the built-ins.",
960
+ items: pwaUrlPatternSchema
961
+ }
962
+ }
437
963
  }
438
964
  }
439
965
  };
440
966
  //#endregion
441
- export { ConfigLoader, DEFAULT_CONNECT_CONFIG, JsonConfigAdapter, ROOT_STORAGE_NAMESPACE, buildRuntimeConfig, connectEnvSchema, deepMerge, getStorageNamespace, loadConnectEnv, loadRuntimeEnv, normalizeBasePath, phConnectRuntimeConfigSchema, powerhousePackageSchema, runtimeEnvSchema, setConnectEnv };
967
+ export { ConfigLoader, DEFAULT_CONNECT_CONFIG, JsonConfigAdapter, PWA_FILE_HANDLER_ACTION, PWA_IDB_KEY, PWA_IDB_NAME, PWA_IDB_STORE, PWA_IDB_VERSION, ROOT_STORAGE_NAMESPACE, buildRuntimeConfig, connectEnvSchema, dedupeFileHandlers, dedupeIcons, deepMerge, getStorageNamespace, loadConnectEnv, loadRuntimeEnv, mergeManifest, mergePwaConfig, normalizeBasePath, phConnectRuntimeConfigSchema, powerhousePackageSchema, runtimeEnvSchema, setConnectEnv, toRegExpOrString, unionStrings, withInferredCategory };
442
968
 
443
969
  //# sourceMappingURL=index.js.map