sliccy 6.250.1 → 6.250.3

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 (155) hide show
  1. package/README.md +1 -6
  2. package/dist/node-server/_shared/bridge-protocol.d.ts +1 -1
  3. package/dist/node-server/_shared/bridge-protocol.js +1 -1
  4. package/dist/node-server/_shared/extension-message.d.ts +2 -2
  5. package/dist/node-server/_shared/extension-message.js +2 -2
  6. package/dist/node-server/_shared/fetch-proxy-protocol.d.ts +5 -3
  7. package/dist/node-server/_shared/fetch-proxy-protocol.d.ts.map +1 -1
  8. package/dist/node-server/_shared/fetch-proxy-protocol.js +5 -3
  9. package/dist/node-server/_shared/fetch-proxy-protocol.js.map +1 -1
  10. package/dist/node-server/_shared/secrets-pipeline.d.ts +1 -1
  11. package/dist/node-server/_shared/secrets-pipeline.js +1 -1
  12. package/dist/node-server/_shared/sign-and-forward.d.ts +2 -2
  13. package/dist/node-server/_shared/sign-and-forward.js +2 -2
  14. package/dist/node-server/bridge-security.d.ts +1 -1
  15. package/dist/node-server/chrome-launch.d.ts +1 -2
  16. package/dist/node-server/chrome-launch.js +1 -19
  17. package/dist/node-server/index.js +1 -8
  18. package/dist/node-server/qa-setup.js +1 -9
  19. package/dist/node-server/release-package-main.js +0 -1
  20. package/dist/node-server/release-package.d.ts +0 -11
  21. package/dist/node-server/release-package.js +2 -142
  22. package/dist/ui/.vite/manifest.json +207 -207
  23. package/dist/ui/assets/{account-store-TdYUOIjJ.js → account-store-BSY823Th.js} +1 -1
  24. package/dist/ui/assets/{account-store-DD7aGZvf.js → account-store-vDeTbJF5.js} +1 -1
  25. package/dist/ui/assets/{adobe-DumzA8x5.js → adobe-B6Hh9EFz.js} +1 -1
  26. package/dist/ui/assets/{adobe-CLcJYzWu.js → adobe-BWkc2vK5.js} +1 -1
  27. package/dist/ui/assets/{agent-panels-CvpXcE7R.js → agent-panels-DcQMUGpc.js} +1 -1
  28. package/dist/ui/assets/{almost-bash-shell-headless-DPOfYSQP.js → almost-bash-shell-headless-DfwEsTUd.js} +12 -12
  29. package/dist/ui/assets/{apply-layout-DlETDigj.js → apply-layout-DrG4QDY5.js} +1 -1
  30. package/dist/ui/assets/{azure-openai-BQ6-o2LP.js → azure-openai-DE57hf2k.js} +1 -1
  31. package/dist/ui/assets/{azure-openai-O2doZfw5.js → azure-openai-H4eQGFzT.js} +1 -1
  32. package/dist/ui/assets/{cdp-Bf0_c3_M.js → cdp-cJDXWfDq.js} +1 -1
  33. package/dist/ui/assets/{cerebras-CgXhPBzs.js → cerebras-DQdfae7K.js} +1 -1
  34. package/dist/ui/assets/{cerebras-DHBdkibP.js → cerebras-WQTn3mBJ.js} +1 -1
  35. package/dist/ui/assets/{composer-speech-Bki9MZn4.js → composer-speech-DG-ztNGk.js} +1 -1
  36. package/dist/ui/assets/{connect-surface-CmM_P3sq.js → connect-surface-WaV9dTAE.js} +1 -1
  37. package/dist/ui/assets/{directed-approval-DRvPpy6S.js → directed-approval-USkVLdt2.js} +1 -1
  38. package/dist/ui/assets/{emscripten-vfs-hook-DwI78U3K.js → emscripten-vfs-hook-D0HK7VqG.js} +1 -1
  39. package/dist/ui/assets/{frozen-archive-writer-VzEx9Uxb.js → frozen-archive-writer-BgGTj_42.js} +1 -1
  40. package/dist/ui/assets/{frozen-archive-writer-vK12Y5G2.js → frozen-archive-writer-C1HeAlwI.js} +1 -1
  41. package/dist/ui/assets/{frozen-session-delete-Kz48fVP2.js → frozen-session-delete-BHDpJ46G.js} +1 -1
  42. package/dist/ui/assets/{frozen-session-identity-CiC29iff.js → frozen-session-identity-D9ueSxQx.js} +1 -1
  43. package/dist/ui/assets/{frozen-session-identity-CRN-tUZc.js → frozen-session-identity-DU4UPMK-.js} +1 -1
  44. package/dist/ui/assets/{gelatiere-unit-D-T2ymXP.js → gelatiere-unit-DyDvDiYv.js} +1 -1
  45. package/dist/ui/assets/{github-BdxrdL1N.js → github-0Vz3uXq2.js} +1 -1
  46. package/dist/ui/assets/{github-B6WV-Bq8.js → github-CxW8imY8.js} +1 -1
  47. package/dist/ui/assets/{github-copilot-56Piblm2.js → github-copilot-BYCvrhW4.js} +1 -1
  48. package/dist/ui/assets/{github-copilot-UXWfeNKP.js → github-copilot-DBMgt0Y3.js} +1 -1
  49. package/dist/ui/assets/{hear-C-HnWc_A.js → hear-DTIrfZQk.js} +1 -1
  50. package/dist/ui/assets/icons-CjpHZN3f.js +1 -0
  51. package/dist/ui/assets/{js-realm-worker-BZS-Xmt_.js → js-realm-worker-B34eLQ-J.js} +2 -2
  52. package/dist/ui/assets/{jsh-executor-BLam64qj.js → jsh-executor-p3QLj2y9.js} +3 -3
  53. package/dist/ui/assets/{kernel-worker-lENmG4bP.js → kernel-worker-DGqNXKSd.js} +8 -8
  54. package/dist/ui/assets/{lick-ws-bridge-vfKhSzZL.js → lick-ws-bridge-BXDmfY3J.js} +1 -1
  55. package/dist/ui/assets/{lick-ws-bridge-CjHZpUr-.js → lick-ws-bridge-DBqSU7XD.js} +1 -1
  56. package/dist/ui/assets/{live-session-curation-4f-Pxr3k.js → live-session-curation-BgrrqRCI.js} +1 -1
  57. package/dist/ui/assets/{live-session-curation-litknMlS.js → live-session-curation-DQe98p-I.js} +1 -1
  58. package/dist/ui/assets/{live-session-snapshot-Cfp5d-uH.js → live-session-snapshot-CjTjl8cQ.js} +1 -1
  59. package/dist/ui/assets/{local-llm-3O2-E7pW.js → local-llm-BfFbz0FV.js} +1 -1
  60. package/dist/ui/assets/{local-llm-CJ9yRTmi.js → local-llm-DO2wCaIh.js} +1 -1
  61. package/dist/ui/assets/{main-DRiMMy9V.js → main-Kvl5p9vS.js} +3 -3
  62. package/dist/ui/assets/{main-cherry-D_NVlApd.js → main-cherry-CbpxWxMr.js} +1 -1
  63. package/dist/ui/assets/{mcp-command-DxefWjIn.js → mcp-command-CzpkFAp-.js} +10 -10
  64. package/dist/ui/assets/{memory-curation-seam-DaX-gUbM.js → memory-curation-seam-IiLvYC-q.js} +1 -1
  65. package/dist/ui/assets/{memory-health-C0cVxkIo.js → memory-health-CgQDsCP2.js} +1 -1
  66. package/dist/ui/assets/{memory-write-execute-BN_0Dduw.js → memory-write-execute-DlZPGZdy.js} +1 -1
  67. package/dist/ui/assets/{merge-folded-cost-into-frozen-BBEIfAKT.js → merge-folded-cost-into-frozen-BJCTkDvm.js} +1 -1
  68. package/dist/ui/assets/{new-session-CniXjNwy.js → new-session-DbvrqvyK.js} +2 -2
  69. package/dist/ui/assets/{oauth-bootstrap-D5c2ywMe.js → oauth-bootstrap-Dk1QI712.js} +2 -2
  70. package/dist/ui/assets/{onboarding-orchestrator-BFWdgZBQ.js → onboarding-orchestrator--qdNyaKy.js} +1 -1
  71. package/dist/ui/assets/{openai-codex-BHWoMzBB.js → openai-codex-5nsA_jUT.js} +1 -1
  72. package/dist/ui/assets/{openai-codex-DiIoN2jW.js → openai-codex-DI2r6awT.js} +1 -1
  73. package/dist/ui/assets/{openrouter-qEI_Gf86.js → openrouter-BYR4AL2a.js} +1 -1
  74. package/dist/ui/assets/{openrouter-BbCIESyC.js → openrouter-XlmECx-y.js} +1 -1
  75. package/dist/ui/assets/{openrouter-free-CLSGIX6-.js → openrouter-free-Bs7rdZ_k.js} +1 -1
  76. package/dist/ui/assets/{openrouter-free-B6eg2iGs.js → openrouter-free-CrzFxH8c.js} +1 -1
  77. package/dist/ui/assets/{openrouter-oauth-CxrW_5ke.js → openrouter-oauth-B7OeoZHX.js} +1 -1
  78. package/dist/ui/assets/{openrouter-oauth-DBvIP1Fv.js → openrouter-oauth-D1kcZu5a.js} +1 -1
  79. package/dist/ui/assets/{panel-rpc-handlers-D0Bv9W3W.js → panel-rpc-handlers-vx_MsZ8U.js} +2 -2
  80. package/dist/ui/assets/{panelize-shell-CNda_L3t.js → panelize-shell-pHIevFYb.js} +1 -1
  81. package/dist/ui/assets/{pi-edit-execution-CeHWWNS2.js → pi-edit-execution-BUFV8VXN.js} +1 -1
  82. package/dist/ui/assets/{provider-5Fpof6O2.js → provider-DbglLiOG.js} +1 -1
  83. package/dist/ui/assets/{provider-C1kVKtik.js → provider-m35l_dE3.js} +1 -1
  84. package/dist/ui/assets/{provider-settings-hqphZqyh.js → provider-settings-FryhOIjB.js} +1 -1
  85. package/dist/ui/assets/provider-store-access-D9Oq7sQR.js +1 -0
  86. package/dist/ui/assets/provider-store-access-n5kcOuxn.js +1 -0
  87. package/dist/ui/assets/{providers-CCldG1kk.js → providers-Db6K2Zyb.js} +2 -2
  88. package/dist/ui/assets/{providers-DCgc8qSc.js → providers-XezAX3J-.js} +1 -1
  89. package/dist/ui/assets/{quick-llm-RkjBCU7w.js → quick-llm-B1PGuCq3.js} +1 -1
  90. package/dist/ui/assets/{realm-inprocess-DN19dDZX.js → realm-inprocess-BltUEnm6.js} +2 -2
  91. package/dist/ui/assets/{realm-unhandled-rejections-BV8bXXE6.js → realm-unhandled-rejections-DxGRfnIg.js} +1 -1
  92. package/dist/ui/assets/{realm-unhandled-rejections-DipkHq_u.js → realm-unhandled-rejections-JeJDKcP9.js} +1 -1
  93. package/dist/ui/assets/{recovery-screen-QV7Axkni.js → recovery-screen-CZwZAhHI.js} +1 -1
  94. package/dist/ui/assets/{remote-terminal-view-CSN_VNBt.js → remote-terminal-view-oXkTsBLu.js} +2 -2
  95. package/dist/ui/assets/{restore-BPFttXsi.js → restore-BvlCJIsk.js} +1 -1
  96. package/dist/ui/assets/{run-7ZIRaW5X.js → run-BJzkRYf6.js} +1 -1
  97. package/dist/ui/assets/{run-EnUM2hvy.js → run-DSk_7iwX.js} +2 -2
  98. package/dist/ui/assets/{run-DIB5i28B.js → run-DqgBHvM1.js} +1 -1
  99. package/dist/ui/assets/{run-HxMLgzrB.js → run-kPALt6Hm.js} +2 -2
  100. package/dist/ui/assets/{serve-command-DlLzXpXY.js → serve-command-sVozeEt7.js} +2 -2
  101. package/dist/ui/assets/{serve-runtime-D1JIu1_Y.js → serve-runtime-4jddeSPE.js} +1 -1
  102. package/dist/ui/assets/{session-command-memory-BbrtQmEU.js → session-command-memory-Ou9u4Nee.js} +2 -2
  103. package/dist/ui/assets/{session-jsonl-C6rqPjV7.js → session-jsonl-2DiesR4q.js} +1 -1
  104. package/dist/ui/assets/{session-jsonl-DJMgeCCB.js → session-jsonl-Djb-5UYE.js} +1 -1
  105. package/dist/ui/assets/{session-search-index-Qb4i8f2M.js → session-search-index-D2Rz-Wef.js} +1 -1
  106. package/dist/ui/assets/{setup-feature-flags-remote-DBLZzCqg.js → setup-feature-flags-remote-DDw2i0rJ.js} +1 -1
  107. package/dist/ui/assets/{setup-model-catalog-Bsp5KCBk.js → setup-model-catalog-Bq5NicwF.js} +1 -1
  108. package/dist/ui/assets/{silent-renew-backoff-DJt2jkfH.js → silent-renew-backoff-ChuRWS3b.js} +1 -1
  109. package/dist/ui/assets/slicc-version-wmX_2UjF.js +1 -0
  110. package/dist/ui/assets/{soundscape-C0mUi54_.js → soundscape-DQHFEB4V.js} +1 -1
  111. package/dist/ui/assets/{speak-Dm1RBTPa.js → speak-2DRJmFx5.js} +1 -1
  112. package/dist/ui/assets/{sprinkle-manager-DjPpY6C6.js → sprinkle-manager-BlzdHs-s.js} +1 -1
  113. package/dist/ui/assets/{sprinkle-renderer-BlU7CZk3.js → sprinkle-renderer-BOJKmlCd.js} +1 -1
  114. package/dist/ui/assets/{sudo-wARPrmoF.js → sudo-CtMTKJRX.js} +1 -1
  115. package/dist/ui/assets/{supervisor-G0Ieqy2i.js → supervisor-D2xgb1bV.js} +1 -1
  116. package/dist/ui/assets/{sync-dialog-BCn-I_sA.js → sync-dialog-CUVB503f.js} +1 -1
  117. package/dist/ui/assets/{transformers-env-DY3cJQh3.js → transformers-env-C49LeR3k.js} +1 -1
  118. package/dist/ui/assets/{tray-leader-CtXVFNPk.js → tray-leader-s0n-Kpuz.js} +1 -1
  119. package/dist/ui/assets/{tray-leave-runtime-B_plpNYb.js → tray-leave-runtime-B80-wOhQ.js} +1 -1
  120. package/dist/ui/assets/{tray-sidecar-uF-JzzJT.js → tray-sidecar-Dt1lvqkH.js} +1 -1
  121. package/dist/ui/assets/{upgrade-detection-DWZMQPQe.js → upgrade-detection-DoyeNE4-.js} +1 -1
  122. package/dist/ui/assets/{voice-reply-DmKkGmWk.js → voice-reply-BBnPDgiG.js} +1 -1
  123. package/dist/ui/assets/{wc-attach-2Qq95_sV.js → wc-attach-DE_d9bVs.js} +2 -2
  124. package/dist/ui/assets/{wc-browser-DZToDM8D.js → wc-browser-DBcRPj1k.js} +1 -1
  125. package/dist/ui/assets/{wc-computers-DRbvoN5u.js → wc-computers-BsqQYv2b.js} +1 -1
  126. package/dist/ui/assets/{wc-detached-OteGRS_q.js → wc-detached-BCzt9vyk.js} +1 -1
  127. package/dist/ui/assets/{wc-extension-DOA8tW4I.js → wc-extension-DVTc-Ojf.js} +2 -2
  128. package/dist/ui/assets/{wc-follower-f3tRLprw.js → wc-follower-Xk_Ox483.js} +3 -3
  129. package/dist/ui/assets/{wc-follower-oauth-C4qieZgw.js → wc-follower-oauth-CSVBNASl.js} +1 -1
  130. package/dist/ui/assets/{wc-gelatiere-CxAS-vUs.js → wc-gelatiere-B6x8kqKu.js} +1 -1
  131. package/dist/ui/assets/{wc-live-juyTzBAf.js → wc-live-D99yciOs.js} +5 -5
  132. package/dist/ui/assets/{wc-nav-Dia3R3wA.js → wc-nav-BScTM8lw.js} +2 -2
  133. package/dist/ui/assets/{wc-onboarding-HO8JXaCy.js → wc-onboarding-CKu_3o53.js} +2 -2
  134. package/dist/ui/assets/{wc-permissions-6SC2TR-K.js → wc-permissions-ondIR9-W.js} +2 -2
  135. package/dist/ui/assets/{wc-placeholder-wB46HeZ3.js → wc-placeholder-D8T1lb0k.js} +3 -3
  136. package/dist/ui/assets/{wc-secret-request-BktjK2oU.js → wc-secret-request-KFYqCpjM.js} +1 -1
  137. package/dist/ui/assets/{wc-settings-CW5rGLNc.js → wc-settings-DSIIhXqc.js} +3 -3
  138. package/dist/ui/assets/{wc-shell-CGOUh9yx.js → wc-shell-DQaHTvX5.js} +3 -3
  139. package/dist/ui/assets/{wc-shortcut-config-q381l1tk.js → wc-shortcut-config-DpnRbgv2.js} +1 -1
  140. package/dist/ui/assets/{wc-sprinkles-DpGYjjDu.js → wc-sprinkles-P-zui6mD.js} +2 -2
  141. package/dist/ui/assets/{wc-transcript-export-CBhlODFx.js → wc-transcript-export-Bq-MJ_Ed.js} +2 -2
  142. package/dist/ui/assets/{wc-tray-AW0o3NgW.js → wc-tray-BIteAih8.js} +4 -4
  143. package/dist/ui/assets/welcome-detection-y_L-9PfB.js +1 -0
  144. package/dist/ui/assets/{whisper-session-CNSgv_Zz.js → whisper-session-C1J00wiq.js} +2 -2
  145. package/dist/ui/assets/{xai-grok-C1jrKp_g.js → xai-grok-pxbhLyjg.js} +1 -1
  146. package/dist/ui/assets/{xai-grok-Csr4WxyO.js → xai-grok-tHcwZ5N8.js} +1 -1
  147. package/dist/ui/index.html +3 -3
  148. package/dist/ui/lucide-icons.js +327 -320
  149. package/dist/ui/packages/webapp/index.html +3 -3
  150. package/package.json +5 -9
  151. package/dist/ui/assets/icons-e-HJxbau.js +0 -1
  152. package/dist/ui/assets/provider-store-access-B5MO0o6w.js +0 -1
  153. package/dist/ui/assets/provider-store-access-hjB-sIz9.js +0 -1
  154. package/dist/ui/assets/slicc-version-C-MaHO30.js +0 -1
  155. package/dist/ui/assets/welcome-detection-qLDqzwSq.js +0 -1
package/README.md CHANGED
@@ -142,12 +142,7 @@ npm run dev
142
142
 
143
143
  The extension is a **thin CDP bridge** — no bundled UI, no offscreen agent engine. The full SLICC webapp loads from the hosted leader tab (`https://www.sliccy.ai/?slicc=leader`); the extension just pins that tab, proxies `chrome.debugger` to it, and — when you click the toolbar icon — opens an on-demand Chrome side panel that iframes the hosted `?cherry=1` follower for inline use.
144
144
 
145
- ```bash
146
- npm install
147
- npm run build -w @slicc/chrome-extension
148
- ```
149
-
150
- Load `dist/extension/` as an unpacked extension in `chrome://extensions`. The service worker pins the hosted leader tab on install; clicking the toolbar icon focuses it (or recreates it if the user closed it). Each page you visit gets the launcher overlay, which iframes the same hosted webapp as an auto-follow follower.
145
+ Install it from the [Chrome Web Store](https://chromewebstore.google.com/detail/slicc/akjjllgokmbgpbdbmafpiefnhidlmbgf). The extension's source, build, and release live in [ai-ecoverse/slicc-extension](https://github.com/ai-ecoverse/slicc-extension); this repo keeps only the webapp side of the protocol it speaks. The service worker pins the hosted leader tab on install; clicking the toolbar icon focuses it (or recreates it if the user closed it). Each page you visit gets the launcher overlay, which iframes the same hosted webapp as an auto-follow follower.
151
146
 
152
147
  ### 5. Run a second browser
153
148
 
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * Consumers: `packages/node-server/src/bridge-security.ts` (server gate),
10
10
  * `packages/webapp/src/ui/boot/bridge-launch-params.ts` (leader boot),
11
- * `packages/chrome-extension/src/bridge-sw.ts` (SW port allowlist),
11
+ * ai-ecoverse/slicc-extension `six/extension/bridge-sw.ts` (SW port allowlist),
12
12
  * `packages/webapp/src/ui/llm-proxy-sw.ts` (header pass-through).
13
13
  * Swift mirror: `packages/swift-server/Sources/Server/BridgeSecurity.swift`
14
14
  * — update it when these values change.
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * Consumers: `packages/node-server/src/bridge-security.ts` (server gate),
10
10
  * `packages/webapp/src/ui/boot/bridge-launch-params.ts` (leader boot),
11
- * `packages/chrome-extension/src/bridge-sw.ts` (SW port allowlist),
11
+ * ai-ecoverse/slicc-extension `six/extension/bridge-sw.ts` (SW port allowlist),
12
12
  * `packages/webapp/src/ui/llm-proxy-sw.ts` (header pass-through).
13
13
  * Swift mirror: `packages/swift-server/Sources/Server/BridgeSecurity.swift`
14
14
  * — update it when these values change.
@@ -4,8 +4,8 @@
4
4
  *
5
5
  * The full `ExtensionMessage` union lives in webapp `kernel/messages.ts`
6
6
  * (kernel-internal, 11+ webapp callers). This guard is the runtime check
7
- * both packages share so chrome-extension tests never value-import
8
- * `packages/webapp/src` (#3047).
7
+ * webapp and the extension (ai-ecoverse/slicc-extension) share, so extension
8
+ * code never value-imports `packages/webapp/src` (#3047).
9
9
  */
10
10
  export declare function isExtensionMessage(msg: unknown): msg is {
11
11
  source: string;
@@ -4,8 +4,8 @@
4
4
  *
5
5
  * The full `ExtensionMessage` union lives in webapp `kernel/messages.ts`
6
6
  * (kernel-internal, 11+ webapp callers). This guard is the runtime check
7
- * both packages share so chrome-extension tests never value-import
8
- * `packages/webapp/src` (#3047).
7
+ * webapp and the extension (ai-ecoverse/slicc-extension) share, so extension
8
+ * code never value-imports `packages/webapp/src` (#3047).
9
9
  */
10
10
  export function isExtensionMessage(msg) {
11
11
  return (typeof msg === 'object' &&
@@ -1,8 +1,10 @@
1
1
  /**
2
2
  * Port-streamed fetch-proxy wire protocol shared by the extension backend and
3
- * browser clients. Platform-agnostic on purpose so `@slicc/webapp` and
4
- * `@slicc/chrome-extension` both import it *downward* from here rather than the
5
- * webapp reaching *up* into the extension for a duplicate copy.
3
+ * browser clients. Platform-agnostic on purpose so `@slicc/webapp` and the
4
+ * extension (ai-ecoverse/slicc-extension, which carries a copy of shared-ts)
5
+ * both import it *downward* from here rather than the webapp reaching *up*
6
+ * into the extension for a duplicate copy. A wire change here must also land
7
+ * in slicc-extension.
6
8
  */
7
9
  /**
8
10
  * Request the page/SW side sends to the fetch-proxy backend. One `request` per
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-proxy-protocol.d.ts","sourceRoot":"","sources":["../src/fetch-proxy-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,GACD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"fetch-proxy-protocol.d.ts","sourceRoot":"","sources":["../src/fetch-proxy-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,GACD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -1,8 +1,10 @@
1
1
  /**
2
2
  * Port-streamed fetch-proxy wire protocol shared by the extension backend and
3
- * browser clients. Platform-agnostic on purpose so `@slicc/webapp` and
4
- * `@slicc/chrome-extension` both import it *downward* from here rather than the
5
- * webapp reaching *up* into the extension for a duplicate copy.
3
+ * browser clients. Platform-agnostic on purpose so `@slicc/webapp` and the
4
+ * extension (ai-ecoverse/slicc-extension, which carries a copy of shared-ts)
5
+ * both import it *downward* from here rather than the webapp reaching *up*
6
+ * into the extension for a duplicate copy. A wire change here must also land
7
+ * in slicc-extension.
6
8
  */
7
9
  export {};
8
10
  //# sourceMappingURL=fetch-proxy-protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-proxy-protocol.js","sourceRoot":"","sources":["../src/fetch-proxy-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
1
+ {"version":3,"file":"fetch-proxy-protocol.js","sourceRoot":"","sources":["../src/fetch-proxy-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -72,7 +72,7 @@ export interface SecretsPipelineOpts {
72
72
  }
73
73
  /**
74
74
  * Stateful unmask/scrub pipeline shared between node-server's /api/fetch-proxy
75
- * and the chrome-extension SW's fetch-proxy.fetch Port handler.
75
+ * and the extension SW's fetch-proxy.fetch Port handler (ai-ecoverse/slicc-extension).
76
76
  *
77
77
  * Public surface has four method families:
78
78
  *
@@ -47,7 +47,7 @@ function replaceAllBytes(haystack, needle, replacement) {
47
47
  export const HMAC_SIGN_HEADER = 'x-slicc-hmac-sign';
48
48
  /**
49
49
  * Stateful unmask/scrub pipeline shared between node-server's /api/fetch-proxy
50
- * and the chrome-extension SW's fetch-proxy.fetch Port handler.
50
+ * and the extension SW's fetch-proxy.fetch Port handler (ai-ecoverse/slicc-extension).
51
51
  *
52
52
  * Public surface has four method families:
53
53
  *
@@ -10,8 +10,8 @@
10
10
  * to upstream, and returns a JSON-cloneable reply.
11
11
  *
12
12
  * `executeS3SignAndForward` / `executeDaSignAndForward` are consumed by:
13
- * - `packages/chrome-extension/src/service-worker.ts` (extension path,
14
- * reads from `chrome.storage.local`)
13
+ * - ai-ecoverse/slicc-extension `six/extension/service-worker.ts`
14
+ * (extension path, reads from `chrome.storage.local`)
15
15
  * - `packages/node-server/src/secrets/sign-and-forward.ts` (CLI path,
16
16
  * wraps these in Express handlers via a SecretStore adapter)
17
17
  * - tests in `packages/shared-ts/tests/sign-and-forward.test.ts`
@@ -10,8 +10,8 @@
10
10
  * to upstream, and returns a JSON-cloneable reply.
11
11
  *
12
12
  * `executeS3SignAndForward` / `executeDaSignAndForward` are consumed by:
13
- * - `packages/chrome-extension/src/service-worker.ts` (extension path,
14
- * reads from `chrome.storage.local`)
13
+ * - ai-ecoverse/slicc-extension `six/extension/service-worker.ts`
14
+ * (extension path, reads from `chrome.storage.local`)
15
15
  * - `packages/node-server/src/secrets/sign-and-forward.ts` (CLI path,
16
16
  * wraps these in Express handlers via a SecretStore adapter)
17
17
  * - tests in `packages/shared-ts/tests/sign-and-forward.test.ts`
@@ -113,7 +113,7 @@ export interface BridgeUpgradeGateResult {
113
113
  /**
114
114
  * Reason exposed in logs for rejection. Intentionally coarse — does not
115
115
  * tell the caller WHICH check failed, mirroring `validateBridgePin` in
116
- * the chrome-extension bridge SW.
116
+ * the extension's bridge SW (ai-ecoverse/slicc-extension).
117
117
  */
118
118
  reason?: 'origin-not-allowed' | 'subprotocol-missing-or-mismatched';
119
119
  }
@@ -8,13 +8,12 @@ import { request as httpRequest } from 'http';
8
8
  */
9
9
  export declare const DEFAULT_CDP_LAUNCH_TIMEOUT_MS = 15000;
10
10
  export declare function getDefaultCdpLaunchTimeoutMs(env?: NodeJS.ProcessEnv): number;
11
- export declare const CLI_PROFILE_NAMES: readonly ['leader', 'follower', 'extension'];
11
+ export declare const CLI_PROFILE_NAMES: readonly ['leader', 'follower'];
12
12
  export type CliProfileName = (typeof CLI_PROFILE_NAMES)[number];
13
13
  export interface ChromeLaunchProfile {
14
14
  id: CliProfileName | null;
15
15
  displayName: string;
16
16
  userDataDir: string;
17
- extensionPath: string | null;
18
17
  }
19
18
  interface FindChromeExecutableOptions {
20
19
  env?: NodeJS.ProcessEnv;
@@ -19,7 +19,7 @@ export function getDefaultCdpLaunchTimeoutMs(env = process.env) {
19
19
  return DEFAULT_CDP_LAUNCH_TIMEOUT_MS;
20
20
  return parsed;
21
21
  }
22
- export const CLI_PROFILE_NAMES = ['leader', 'follower', 'extension'];
22
+ export const CLI_PROFILE_NAMES = ['leader', 'follower'];
23
23
  const DEFAULT_USER_DATA_DIR_NAME = 'browser-coding-agent-chrome';
24
24
  const QA_PROFILE_ROOT_SEGMENTS = ['.qa', 'chrome'];
25
25
  function argbToSignedInt(argbHex) {
@@ -32,7 +32,6 @@ const CLI_PROFILE_DEFINITIONS = {
32
32
  avatarIcon: 'chrome://theme/IDR_PROFILE_AVATAR_0',
33
33
  profileColorSeed: argbToSignedInt(0xff4285f4),
34
34
  profileHighlightColor: argbToSignedInt(0xff4285f4),
35
- loadsExtension: false,
36
35
  },
37
36
  follower: {
38
37
  displayName: 'SLICC QA Follower',
@@ -40,15 +39,6 @@ const CLI_PROFILE_DEFINITIONS = {
40
39
  avatarIcon: 'chrome://theme/IDR_PROFILE_AVATAR_7',
41
40
  profileColorSeed: argbToSignedInt(0xff34a853),
42
41
  profileHighlightColor: argbToSignedInt(0xff34a853),
43
- loadsExtension: false,
44
- },
45
- extension: {
46
- displayName: 'SLICC QA Extension',
47
- avatarIndex: 19,
48
- avatarIcon: 'chrome://theme/IDR_PROFILE_AVATAR_19',
49
- profileColorSeed: argbToSignedInt(0xffa142f4),
50
- profileHighlightColor: argbToSignedInt(0xffa142f4),
51
- loadsExtension: true,
52
42
  },
53
43
  };
54
44
  function isJsonObject(value) {
@@ -154,7 +144,6 @@ export function resolveChromeLaunchProfile(options) {
154
144
  id: null,
155
145
  displayName: 'Chrome',
156
146
  userDataDir: resolveDefaultChromeUserDataDir(options.tmpDir ?? undefined, options.servePort),
157
- extensionPath: null,
158
147
  };
159
148
  }
160
149
  if (!isCliProfileName(profile)) {
@@ -165,9 +154,6 @@ export function resolveChromeLaunchProfile(options) {
165
154
  id: profile,
166
155
  displayName: definition.displayName,
167
156
  userDataDir: join(resolveQaProfilesRoot(options.projectRoot), profile),
168
- extensionPath: definition.loadsExtension
169
- ? join(options.projectRoot, 'dist', 'extension')
170
- : null,
171
157
  };
172
158
  }
173
159
  /**
@@ -259,10 +245,6 @@ export function buildChromeLaunchArgs(options) {
259
245
  // profile would lose every saved cookie.
260
246
  args.push('--use-mock-keychain', '--password-store=basic');
261
247
  }
262
- if (options.profile.extensionPath) {
263
- args.push(`--disable-extensions-except=${options.profile.extensionPath}`);
264
- args.push(`--load-extension=${options.profile.extensionPath}`);
265
- }
266
248
  if (options.hosted) {
267
249
  // One --disable-features switch: Chromium keeps a single value, so the
268
250
  // hosted addition replaces the base flag rather than stacking a second.
@@ -4,7 +4,7 @@ import { createSubstrate } from './_cloud_core/src/index.js';
4
4
  import { parseTrayJoinUrl, SLICC_HOSTED_ORIGIN } from './_shared/index.js';
5
5
  import { spawn } from 'child_process';
6
6
  import express from 'express';
7
- import { existsSync, readFileSync } from 'fs';
7
+ import { readFileSync } from 'fs';
8
8
  import { createServer as createNetServer } from 'net';
9
9
  import { homedir } from 'os';
10
10
  import { basename, dirname, join, resolve } from 'path';
@@ -462,16 +462,9 @@ async function launchChromeTarget(state) {
462
462
  const profileDirName = basename(chromeProfile.userDataDir);
463
463
  await migrateLegacyDefaultChromeProfile(chromeProfile.userDataDir, legacyChromeCandidates(profileDirName));
464
464
  }
465
- if (chromeProfile.extensionPath && !existsSync(chromeProfile.extensionPath)) {
466
- console.error(`Extension profile requires ${chromeProfile.extensionPath}. Run \`npm run build -w @slicc/chrome-extension\` first.`);
467
- process.exit(1);
468
- }
469
465
  if (chromeProfile.id) {
470
466
  console.log(`Using QA Chrome profile: ${chromeProfile.id}`);
471
467
  console.log(`Profile directory: ${chromeProfile.userDataDir}`);
472
- if (chromeProfile.extensionPath) {
473
- console.log(`Auto-loading unpacked extension from ${chromeProfile.extensionPath}`);
474
- }
475
468
  }
476
469
  const chromeArgs = buildChromeLaunchArgs({
477
470
  cdpPort: state.requestedCdpPort,
@@ -1,4 +1,3 @@
1
- import { existsSync } from 'fs';
2
1
  import { resolve } from 'path';
3
2
  import { fileURLToPath } from 'url';
4
3
  import { CLI_PROFILE_NAMES, ensureQaProfileScaffold, findChromeExecutable, resolveQaProfilesRoot, } from './chrome-launch.js';
@@ -10,20 +9,13 @@ async function main() {
10
9
  console.error('Could not find Chrome or Chrome for Testing. Set CHROME_PATH and retry.');
11
10
  process.exit(1);
12
11
  }
13
- const extensionPath = resolve(projectRoot, 'dist', 'extension');
14
- if (!existsSync(extensionPath)) {
15
- console.error('dist/extension was not found. Run `npm run build:extension` first.');
16
- process.exit(1);
17
- }
18
12
  const profiles = await ensureQaProfileScaffold(projectRoot);
19
13
  console.log('SLICC QA profiles are ready.');
20
14
  console.log(`Chrome executable: ${chromePath}`);
21
15
  console.log(`QA profile root: ${resolveQaProfilesRoot(projectRoot)}`);
22
- console.log(`Extension build: ${extensionPath}`);
23
16
  console.log('Profiles:');
24
17
  for (const profile of profiles) {
25
- const extensionLabel = profile.extensionPath ? ' (auto-loads dist/extension)' : '';
26
- console.log(`- ${profile.id}: ${profile.userDataDir}${extensionLabel}`);
18
+ console.log(`- ${profile.id}: ${profile.userDataDir}`);
27
19
  }
28
20
  console.log('Next commands:');
29
21
  for (const profileName of CLI_PROFILE_NAMES) {
@@ -6,7 +6,6 @@ const projectRoot = resolve(dirname, '..', '..');
6
6
  const releaseDir = resolve(projectRoot, 'artifacts', 'release');
7
7
  try {
8
8
  const manifest = packageReleaseArtifacts({ projectRoot, releaseDir });
9
- console.log(`Created extension archive: ${manifest.extensionArchive}`);
10
9
  console.log(`Created npm package tarball: ${manifest.npmPackageTarball}`);
11
10
  console.log(`Created release manifest: ${toProjectRelative(projectRoot, resolve(releaseDir, 'release-artifacts.json'))}`);
12
11
  }
@@ -2,20 +2,10 @@ export interface PackageMetadata {
2
2
  name: string;
3
3
  version: string;
4
4
  }
5
- export interface ZipEntry {
6
- path: string;
7
- data: Buffer;
8
- mode: number;
9
- }
10
5
  export interface ReleaseManifest {
11
6
  version: string;
12
- extensionArchive: string;
13
7
  npmPackageTarball: string;
14
8
  }
15
- export declare function comparePaths(left: string, right: string): number;
16
- export declare function sanitizeArtifactName(value: string): string;
17
- export declare function collectZipEntries(rootDir: string): ZipEntry[];
18
- export declare function createDeterministicZip(entries: readonly ZipEntry[]): Buffer;
19
9
  export declare function requirePath(path: string, description: string): void;
20
10
  export declare function toProjectRelative(projectRoot: string, path: string): string;
21
11
  export declare function resolveNpmCommand(options?: {
@@ -27,7 +17,6 @@ export declare function resolveNpmCommand(options?: {
27
17
  argsPrefix: string[];
28
18
  };
29
19
  export declare function parseNpmPackFilename(output: string): string;
30
- export declare function createExtensionArchive(metadata: PackageMetadata, projectRoot: string, releaseDir: string): string;
31
20
  interface NpmPackResult {
32
21
  status: number | null;
33
22
  stdout: string;
@@ -1,136 +1,6 @@
1
1
  import { spawnSync } from 'child_process';
2
- import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync, } from 'fs';
3
- import { join, relative, resolve } from 'path';
4
- import { deflateRawSync } from 'zlib';
5
- const FIXED_ZIP_DATE = new Date(Date.UTC(1980, 0, 1, 0, 0, 0));
6
- const ZIP_VERSION = 20;
7
- const ZIP_UTF8_FLAG = 0x0800;
8
- const ZIP_METHOD_DEFLATE = 8;
9
- const ZIP_FILE_MODE = 0o100644;
10
- const CRC32_TABLE = buildCrc32Table();
11
- export function comparePaths(left, right) {
12
- if (left < right)
13
- return -1;
14
- if (left > right)
15
- return 1;
16
- return 0;
17
- }
18
- export function sanitizeArtifactName(value) {
19
- return value
20
- .trim()
21
- .toLowerCase()
22
- .replace(/^@/, '')
23
- .replace(/[\\/]+/g, '-')
24
- .replace(/[^a-z0-9._-]+/g, '-')
25
- .replace(/-+/g, '-')
26
- .replace(/^-|-$/g, '');
27
- }
28
- export function collectZipEntries(rootDir) {
29
- const entries = [];
30
- const walk = (currentDir) => {
31
- for (const name of readdirSync(currentDir).sort(comparePaths)) {
32
- const fullPath = join(currentDir, name);
33
- const stats = statSync(fullPath);
34
- if (stats.isDirectory()) {
35
- walk(fullPath);
36
- continue;
37
- }
38
- if (!stats.isFile())
39
- continue;
40
- entries.push({
41
- path: relative(rootDir, fullPath).split('\\').join('/'),
42
- data: readFileSync(fullPath),
43
- mode: ZIP_FILE_MODE,
44
- });
45
- }
46
- };
47
- walk(rootDir);
48
- return entries;
49
- }
50
- export function createDeterministicZip(entries) {
51
- const sortedEntries = [...entries].sort((left, right) => comparePaths(left.path, right.path));
52
- const { dosDate, dosTime } = encodeDosDateTime(FIXED_ZIP_DATE);
53
- const localSections = [];
54
- const centralSections = [];
55
- let offset = 0;
56
- for (const entry of sortedEntries) {
57
- const fileName = Buffer.from(entry.path, 'utf8');
58
- const compressed = deflateRawSync(entry.data, { level: 9 });
59
- const crc = crc32(entry.data);
60
- const localHeader = Buffer.alloc(30);
61
- localHeader.writeUInt32LE(0x04034b50, 0);
62
- localHeader.writeUInt16LE(ZIP_VERSION, 4);
63
- localHeader.writeUInt16LE(ZIP_UTF8_FLAG, 6);
64
- localHeader.writeUInt16LE(ZIP_METHOD_DEFLATE, 8);
65
- localHeader.writeUInt16LE(dosTime, 10);
66
- localHeader.writeUInt16LE(dosDate, 12);
67
- localHeader.writeUInt32LE(crc, 14);
68
- localHeader.writeUInt32LE(compressed.length, 18);
69
- localHeader.writeUInt32LE(entry.data.length, 22);
70
- localHeader.writeUInt16LE(fileName.length, 26);
71
- localHeader.writeUInt16LE(0, 28);
72
- const localSection = Buffer.concat([localHeader, fileName, compressed]);
73
- localSections.push(localSection);
74
- const centralHeader = Buffer.alloc(46);
75
- centralHeader.writeUInt32LE(0x02014b50, 0);
76
- centralHeader.writeUInt16LE((3 << 8) | ZIP_VERSION, 4);
77
- centralHeader.writeUInt16LE(ZIP_VERSION, 6);
78
- centralHeader.writeUInt16LE(ZIP_UTF8_FLAG, 8);
79
- centralHeader.writeUInt16LE(ZIP_METHOD_DEFLATE, 10);
80
- centralHeader.writeUInt16LE(dosTime, 12);
81
- centralHeader.writeUInt16LE(dosDate, 14);
82
- centralHeader.writeUInt32LE(crc, 16);
83
- centralHeader.writeUInt32LE(compressed.length, 20);
84
- centralHeader.writeUInt32LE(entry.data.length, 24);
85
- centralHeader.writeUInt16LE(fileName.length, 28);
86
- centralHeader.writeUInt16LE(0, 30);
87
- centralHeader.writeUInt16LE(0, 32);
88
- centralHeader.writeUInt16LE(0, 34);
89
- centralHeader.writeUInt16LE(0, 36);
90
- centralHeader.writeUInt32LE((entry.mode << 16) >>> 0, 38);
91
- centralHeader.writeUInt32LE(offset, 42);
92
- const centralSection = Buffer.concat([centralHeader, fileName]);
93
- centralSections.push(centralSection);
94
- offset += localSection.length;
95
- }
96
- const centralDirectory = Buffer.concat(centralSections);
97
- const endRecord = Buffer.alloc(22);
98
- endRecord.writeUInt32LE(0x06054b50, 0);
99
- endRecord.writeUInt16LE(0, 4);
100
- endRecord.writeUInt16LE(0, 6);
101
- endRecord.writeUInt16LE(sortedEntries.length, 8);
102
- endRecord.writeUInt16LE(sortedEntries.length, 10);
103
- endRecord.writeUInt32LE(centralDirectory.length, 12);
104
- endRecord.writeUInt32LE(offset, 16);
105
- endRecord.writeUInt16LE(0, 20);
106
- return Buffer.concat([...localSections, centralDirectory, endRecord]);
107
- }
108
- function buildCrc32Table() {
109
- const table = new Uint32Array(256);
110
- for (let index = 0; index < 256; index += 1) {
111
- let value = index;
112
- for (let bit = 0; bit < 8; bit += 1) {
113
- value = (value & 1) === 1 ? (value >>> 1) ^ 0xedb88320 : value >>> 1;
114
- }
115
- table[index] = value >>> 0;
116
- }
117
- return table;
118
- }
119
- function crc32(buffer) {
120
- let crc = 0xffffffff;
121
- for (const value of buffer) {
122
- crc = CRC32_TABLE[(crc ^ value) & 0xff] ^ (crc >>> 8);
123
- }
124
- return (crc ^ 0xffffffff) >>> 0;
125
- }
126
- function encodeDosDateTime(value) {
127
- const year = Math.max(value.getUTCFullYear(), 1980);
128
- const dosDate = ((year - 1980) << 9) | ((value.getUTCMonth() + 1) << 5) | value.getUTCDate();
129
- const dosTime = (value.getUTCHours() << 11) |
130
- (value.getUTCMinutes() << 5) |
131
- Math.floor(value.getUTCSeconds() / 2);
132
- return { dosDate, dosTime };
133
- }
2
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'fs';
3
+ import { relative, resolve } from 'path';
134
4
  function readJsonFile(path) {
135
5
  return JSON.parse(readFileSync(path, 'utf8'));
136
6
  }
@@ -160,14 +30,6 @@ export function parseNpmPackFilename(output) {
160
30
  }
161
31
  return filename;
162
32
  }
163
- export function createExtensionArchive(metadata, projectRoot, releaseDir) {
164
- const extensionDir = resolve(projectRoot, 'dist', 'extension');
165
- requirePath(extensionDir, 'Extension build output');
166
- const zipPath = resolve(releaseDir, `${sanitizeArtifactName(metadata.name)}-extension-v${metadata.version}.zip`);
167
- const zipBuffer = createDeterministicZip(collectZipEntries(extensionDir));
168
- writeFileSync(zipPath, zipBuffer);
169
- return zipPath;
170
- }
171
33
  export function createNpmPackageTarball(options) {
172
34
  requirePath(resolve(options.projectRoot, 'dist', 'node-server'), 'CLI build output');
173
35
  requirePath(resolve(options.projectRoot, 'dist', 'ui'), 'UI build output');
@@ -203,7 +65,6 @@ export function packageReleaseArtifacts(options) {
203
65
  const packageJson = readJsonFile(resolve(options.projectRoot, 'package.json'));
204
66
  rmSync(releaseDir, { recursive: true, force: true });
205
67
  mkdirSync(releaseDir, { recursive: true });
206
- const extensionArchive = createExtensionArchive(packageJson, options.projectRoot, releaseDir);
207
68
  const npmPackageTarball = createNpmPackageTarball({
208
69
  projectRoot: options.projectRoot,
209
70
  releaseDir,
@@ -211,7 +72,6 @@ export function packageReleaseArtifacts(options) {
211
72
  });
212
73
  const manifest = {
213
74
  version: packageJson.version,
214
- extensionArchive: toProjectRelative(options.projectRoot, extensionArchive),
215
75
  npmPackageTarball: toProjectRelative(options.projectRoot, npmPackageTarball),
216
76
  };
217
77
  writeReleaseManifest(manifest, releaseDir);