sliccy 6.150.2 → 6.150.4

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 (126) hide show
  1. package/dist/node-server/_shared/github-releases.d.ts +79 -0
  2. package/dist/node-server/_shared/github-releases.d.ts.map +1 -0
  3. package/dist/node-server/_shared/github-releases.js +86 -0
  4. package/dist/node-server/_shared/github-releases.js.map +1 -0
  5. package/dist/node-server/_shared/index.d.ts +1 -0
  6. package/dist/node-server/_shared/index.d.ts.map +1 -1
  7. package/dist/node-server/_shared/index.js +1 -0
  8. package/dist/node-server/_shared/index.js.map +1 -1
  9. package/dist/node-server/install-cli.d.ts +1 -1
  10. package/dist/node-server/install-cli.js +17 -38
  11. package/dist/ui/.vite/manifest.json +166 -166
  12. package/dist/ui/assets/CLAUDE-BcGVPwX6.js +1 -0
  13. package/dist/ui/assets/{account-store-WHtW2xQT.js → account-store-CV9MqwUm.js} +1 -1
  14. package/dist/ui/assets/{account-store-igNbS3Ak.js → account-store-D8e8oik0.js} +1 -1
  15. package/dist/ui/assets/{adobe-DES78X4G.js → adobe-BVISN7vp.js} +1 -1
  16. package/dist/ui/assets/{adobe-qGeGJSVK.js → adobe-BxjyXT87.js} +1 -1
  17. package/dist/ui/assets/{agent-bridge-Bj-PqjME.js → agent-bridge-BBkdIfsJ.js} +1 -1
  18. package/dist/ui/assets/{agent-panels-BWaMcEJL.js → agent-panels-CjeQdy1Y.js} +1 -1
  19. package/dist/ui/assets/{apply-layout-Cw4kGKTd.js → apply-layout-CvLXxRBE.js} +1 -1
  20. package/dist/ui/assets/{apps-GYMxMVb3.js → apps-DxHLnxIs.js} +1 -1
  21. package/dist/ui/assets/{azure-openai-BbxUu9bl.js → azure-openai-CeWhvhCg.js} +1 -1
  22. package/dist/ui/assets/{azure-openai-Df42STSp.js → azure-openai-CrXxL0yw.js} +1 -1
  23. package/dist/ui/assets/{budget-usage-source-CkdCr5f4.js → budget-usage-source-DKTPDwsD.js} +1 -1
  24. package/dist/ui/assets/{cdp-bzn_Xeev.js → cdp-C6pQEDl7.js} +1 -1
  25. package/dist/ui/assets/{cerebras-BdSVSPms.js → cerebras-Dy4v03m_.js} +1 -1
  26. package/dist/ui/assets/{cerebras-CnqGnpF2.js → cerebras-NYRgbfj7.js} +1 -1
  27. package/dist/ui/assets/{composer-speech-Bk2rlnG1.js → composer-speech-C_q-fKNK.js} +1 -1
  28. package/dist/ui/assets/{connect-surface-CHDb1bpy.js → connect-surface-DnqcwOmu.js} +1 -1
  29. package/dist/ui/assets/{directed-approval-KW7sZoq9.js → directed-approval-FjkkjI1B.js} +1 -1
  30. package/dist/ui/assets/{fs-FVRsAbgb.js → fs-DtsuwDhC.js} +1 -1
  31. package/dist/ui/assets/{fs-ih2eMSkQ.js → fs-cMwqXtFi.js} +2 -2
  32. package/dist/ui/assets/{github--5oROr4B.js → github-C9LAMuX2.js} +1 -1
  33. package/dist/ui/assets/{github-CMoh4wrN.js → github-DMrOAHK5.js} +2 -2
  34. package/dist/ui/assets/{github-copilot-DkYiMCsw.js → github-copilot-CIlYMLNf.js} +1 -1
  35. package/dist/ui/assets/{github-copilot-qWy0Zt4S.js → github-copilot-CMZIEIwW.js} +1 -1
  36. package/dist/ui/assets/{github-install-BNlfwzSw.js → github-install-Br7_N-Wz.js} +1 -1
  37. package/dist/ui/assets/{github-zip-BlzKyxxV.js → github-zip-JuyNsUge.js} +1 -1
  38. package/dist/ui/assets/{hear-DZ1gevW6.js → hear-WpLAGmLj.js} +1 -1
  39. package/dist/ui/assets/{help-AarM8EZw.js → help-DygoYzMM.js} +1 -1
  40. package/dist/ui/assets/{js-realm-worker-B0sapExQ.js → js-realm-worker-B_adS-Xa.js} +1 -1
  41. package/dist/ui/assets/{kernel-worker-BsjX-8Q_.js → kernel-worker-D6QiQmF8.js} +33 -33
  42. package/dist/ui/assets/{local-llm-Bm7qcibx.js → local-llm-BsNQFYst.js} +1 -1
  43. package/dist/ui/assets/{local-llm-oYJuPYM9.js → local-llm-CKk6H8PP.js} +1 -1
  44. package/dist/ui/assets/{main-0FLLRgpr.js → main-D1uZduJD.js} +3 -3
  45. package/dist/ui/assets/{main-cherry-DgWyX5j1.js → main-cherry-C309Ei0U.js} +1 -1
  46. package/dist/ui/assets/{memory-curation-seam-DaqkHe0O.js → memory-curation-seam-BHv-E0Wj.js} +1 -1
  47. package/dist/ui/assets/{mount-pNmGh8WK.js → mount-CvYjFqV-.js} +1 -1
  48. package/dist/ui/assets/{mount-BQVKp_Ky.js → mount-DEDbw6Zx.js} +3 -3
  49. package/dist/ui/assets/{mount-recovery-BAhGb_bv.js → mount-recovery-fCH5-MTl.js} +1 -1
  50. package/dist/ui/assets/{new-session-DTTLrwVg.js → new-session-B0QCLfxz.js} +2 -2
  51. package/dist/ui/assets/{oauth-bootstrap-CyfMMMHH.js → oauth-bootstrap-CGkRhQ3S.js} +2 -2
  52. package/dist/ui/assets/{onboarding-orchestrator-yYN6eJua.js → onboarding-orchestrator-CPTdYW2L.js} +1 -1
  53. package/dist/ui/assets/{openai-codex-DG43gisr.js → openai-codex-DYK7kjvj.js} +1 -1
  54. package/dist/ui/assets/{openai-codex-r3KGBkgC.js → openai-codex-DdHlWXt7.js} +1 -1
  55. package/dist/ui/assets/{openrouter-DssYc44Z.js → openrouter-BVTGfTQU.js} +1 -1
  56. package/dist/ui/assets/{openrouter-Bk7xqCwB.js → openrouter-DIGFK8vL.js} +1 -1
  57. package/dist/ui/assets/{openrouter-free-Bhx3nBtn.js → openrouter-free-3AcyjDsF.js} +1 -1
  58. package/dist/ui/assets/{openrouter-free-CSLhk_A7.js → openrouter-free-Ckpy86qX.js} +1 -1
  59. package/dist/ui/assets/{openrouter-oauth-ByDzZ41D.js → openrouter-oauth-BgOHLX8g.js} +1 -1
  60. package/dist/ui/assets/{openrouter-oauth-C8yHZzXx.js → openrouter-oauth-Dg6fl3Oy.js} +1 -1
  61. package/dist/ui/assets/{panel-rpc-handlers-S63g21yk.js → panel-rpc-handlers-CTskO2UP.js} +2 -2
  62. package/dist/ui/assets/{panelize-shell-B59FHf_a.js → panelize-shell-0NEazEbP.js} +1 -1
  63. package/dist/ui/assets/{provider-DTjGYfpI.js → provider-DZFS2iTq.js} +2 -2
  64. package/dist/ui/assets/{provider-B_5ZkOJ1.js → provider-c_Gkn3pV.js} +1 -1
  65. package/dist/ui/assets/provider-settings-CSEOVhGE.js +1 -0
  66. package/dist/ui/assets/provider-store-access-CVanUg7C.js +1 -0
  67. package/dist/ui/assets/provider-store-access-nMfbpDYJ.js +1 -0
  68. package/dist/ui/assets/{providers-w9myWTsL.js → providers-CraHfd4c.js} +1 -1
  69. package/dist/ui/assets/{providers-70klvlGo.js → providers-CuieHopm.js} +2 -2
  70. package/dist/ui/assets/{quick-llm-Bji5F30H.js → quick-llm-CFpL1uZA.js} +1 -1
  71. package/dist/ui/assets/{recovery-screen-lqxJwXM8.js → recovery-screen-CtXko1KE.js} +1 -1
  72. package/dist/ui/assets/{run-Ba8ggbts.js → run-5nsq-ysK.js} +2 -2
  73. package/dist/ui/assets/{run-BWhPamLe.js → run-DGB0hXS2.js} +1 -1
  74. package/dist/ui/assets/{run-Byf9dPJf.js → run-ydpfdHvF.js} +1 -1
  75. package/dist/ui/assets/{session-jsonl-BCOxqyX1.js → session-jsonl-C1iwca-E.js} +1 -1
  76. package/dist/ui/assets/{setup-feature-flags-remote-D1ban-xx.js → setup-feature-flags-remote-CbzffM1B.js} +1 -1
  77. package/dist/ui/assets/sidecar-repair-CXNpjnvd.js +1 -0
  78. package/dist/ui/assets/{silent-renew-backoff-DycrXmC_.js → silent-renew-backoff-gBUL-f53.js} +1 -1
  79. package/dist/ui/assets/{skills-CyvmUs8o.js → skills-9NWZ7vcj.js} +1 -1
  80. package/dist/ui/assets/slicc-version-uWYg_KNr.js +1 -0
  81. package/dist/ui/assets/{snapshot-CezJTIo1.js → snapshot-Czf24viR.js} +1 -1
  82. package/dist/ui/assets/{snapshot-features-i5G7O7jE.js → snapshot-features-DfvhK1Lt.js} +1 -1
  83. package/dist/ui/assets/{soundscape-B9l997Lg.js → soundscape-BLaJxYcC.js} +1 -1
  84. package/dist/ui/assets/{speak-DHglNoiP.js → speak-CAQFQMzh.js} +1 -1
  85. package/dist/ui/assets/{sprinkle-manager-oNv4Dxy0.js → sprinkle-manager-Buwj_jkg.js} +1 -1
  86. package/dist/ui/assets/{sprinkle-renderer-CeGc4B0L.js → sprinkle-renderer-BUZzvREL.js} +1 -1
  87. package/dist/ui/assets/{state-CENLKudR.js → state-MYRT4Xjf.js} +1 -1
  88. package/dist/ui/assets/{store-BZA4REpw.js → store-BDq6OolL.js} +1 -1
  89. package/dist/ui/assets/{store-L5QyZg_g.js → store-CB6g9ei3.js} +1 -1
  90. package/dist/ui/assets/{sudo-B6DNIqye.js → sudo-3qFVn_jk.js} +1 -1
  91. package/dist/ui/assets/{sync-dialog-CroF8oTi.js → sync-dialog-DLe5es1y.js} +1 -1
  92. package/dist/ui/assets/{transformers-env-CUhuRO-A.js → transformers-env-DZUIAHH5.js} +1 -1
  93. package/dist/ui/assets/{tray-sidecar-Djlc71w_.js → tray-sidecar-C7ntovgd.js} +1 -1
  94. package/dist/ui/assets/{upgrade-detection-BLcTRETI.js → upgrade-detection-D3hzscHI.js} +1 -1
  95. package/dist/ui/assets/{voice-reply-Pzf7yCCs.js → voice-reply-g-JL5D2I.js} +1 -1
  96. package/dist/ui/assets/{wc-attach-BBHTF92w.js → wc-attach-KSgc0h1w.js} +2 -2
  97. package/dist/ui/assets/{wc-extension-BVUF-GVc.js → wc-extension-bo5QJG1Y.js} +2 -2
  98. package/dist/ui/assets/{wc-follower-oauth-B-LgkRB6.js → wc-follower-oauth-DUFBBrud.js} +1 -1
  99. package/dist/ui/assets/{wc-follower-9mZwPNR8.js → wc-follower-rNFcP2rQ.js} +3 -3
  100. package/dist/ui/assets/{wc-gelatiere-Cse9kSXf.js → wc-gelatiere-GM9XFlw0.js} +1 -1
  101. package/dist/ui/assets/{wc-live-Ts1bLhjx.js → wc-live-DU8Ig125.js} +5 -5
  102. package/dist/ui/assets/{wc-nav-DO33b6Qg.js → wc-nav-CjA4TRbH.js} +2 -2
  103. package/dist/ui/assets/{wc-onboarding-DeCWfgKN.js → wc-onboarding-DHIjYBxt.js} +2 -2
  104. package/dist/ui/assets/{wc-placeholder-DgM1-HSU.js → wc-placeholder-B6MYdfoe.js} +3 -3
  105. package/dist/ui/assets/{wc-secret-request-BNTQEHzM.js → wc-secret-request-Cr4JjH2j.js} +1 -1
  106. package/dist/ui/assets/{wc-settings-CCJ-33PW.js → wc-settings-B0IuZcmh.js} +3 -3
  107. package/dist/ui/assets/{wc-shell-S_KQG-ZJ.js → wc-shell-BxKrLKUy.js} +3 -3
  108. package/dist/ui/assets/{wc-shortcut-config-DOL-7eLe.js → wc-shortcut-config-VG4rRXQ0.js} +1 -1
  109. package/dist/ui/assets/{wc-shortcuts-BU_YGmdb.js → wc-shortcuts-DqTUPTab.js} +1 -1
  110. package/dist/ui/assets/{wc-sprinkles-l4l891y6.js → wc-sprinkles-CJCiFv9X.js} +2 -2
  111. package/dist/ui/assets/{wc-transcript-export-DRwVoKZj.js → wc-transcript-export-BwmlRSNL.js} +2 -2
  112. package/dist/ui/assets/{wc-tray-qlcU6L0f.js → wc-tray-Csk1-trz.js} +4 -4
  113. package/dist/ui/assets/welcome-detection-CG-n5Lly.js +1 -0
  114. package/dist/ui/assets/{whisper-session-D3sdmYD8.js → whisper-session-CSoPKl8n.js} +2 -2
  115. package/dist/ui/assets/{xai-grok-DStVYmfz.js → xai-grok-CLJ0EDW2.js} +1 -1
  116. package/dist/ui/assets/{xai-grok-pQ6Q0CcQ.js → xai-grok-DY1YCas3.js} +1 -1
  117. package/dist/ui/index.html +3 -3
  118. package/dist/ui/packages/webapp/index.html +3 -3
  119. package/package.json +1 -1
  120. package/dist/ui/assets/CLAUDE-C2sAF3Q0.js +0 -1
  121. package/dist/ui/assets/provider-settings-uchEkvQy.js +0 -1
  122. package/dist/ui/assets/provider-store-access-Cz_2CeJI.js +0 -1
  123. package/dist/ui/assets/provider-store-access-kQEPDMDW.js +0 -1
  124. package/dist/ui/assets/sidecar-repair-CJngowmG.js +0 -1
  125. package/dist/ui/assets/slicc-version-BhF_V6lj.js +0 -1
  126. package/dist/ui/assets/welcome-detection-BFFz2Urt.js +0 -1
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Bounded newest→oldest scan of GitHub's releases API for the first asset
3
+ * matching a caller-supplied predicate.
4
+ *
5
+ * Pagination lives here so the worker DMG route, the worker CLI download
6
+ * route, and node-server `--install-cli` cannot drift on page size or the
7
+ * max-pages backstop (#3062). Callers keep only their asset predicate and
8
+ * their own failure policy (302 fallback vs 502 vs throw).
9
+ *
10
+ * `GITHUB_RELEASES_PER_PAGE` is GitHub's documented maximum (`per_page=100`).
11
+ * Five pages is a 500-release cap — enough to absorb sparse native-artifact
12
+ * gaps at the current release cadence without walking the whole history on
13
+ * every download hit. Do not reintroduce a smaller page size at a call site.
14
+ */
15
+ /** GitHub's maximum `per_page` for `/repos/{owner}/{repo}/releases`. */
16
+ export declare const GITHUB_RELEASES_PER_PAGE = 100;
17
+ /** Absolute backstop so a binary-less streak cannot exhaust the rate limit. */
18
+ export declare const GITHUB_RELEASES_MAX_PAGES = 5;
19
+ export declare const SLICC_GITHUB_RELEASES_URL = "https://api.github.com/repos/ai-ecoverse/slicc/releases";
20
+ export interface GithubReleaseAsset {
21
+ name?: string;
22
+ browser_download_url?: string;
23
+ }
24
+ export interface GithubRelease {
25
+ draft?: boolean;
26
+ prerelease?: boolean;
27
+ tag_name?: string;
28
+ assets?: GithubReleaseAsset[];
29
+ }
30
+ export interface GithubReleasesScanHit {
31
+ release: GithubRelease;
32
+ asset: GithubReleaseAsset;
33
+ }
34
+ /** Thrown when a page fetch returns a non-2xx status. Callers map this to 302 / 502 / throw. */
35
+ export declare class GithubReleasesHttpError extends Error {
36
+ readonly status: number;
37
+ readonly page: number;
38
+ constructor(status: number, page: number);
39
+ }
40
+ /** Thrown when a 2xx body is not JSON. Callers map this to 302 / 502 / throw. */
41
+ export declare class GithubReleasesParseError extends Error {
42
+ readonly page: number;
43
+ constructor(page: number, cause?: unknown);
44
+ }
45
+ /**
46
+ * Extra `fetch` init merged into every page request. Worker call sites pass
47
+ * Cloudflare `cf` cache hints; Node omits this. `headers` / `signal` on this
48
+ * object lose to the helper's User-Agent and `options.signal`.
49
+ */
50
+ export type GithubReleasesRequestInit = RequestInit & {
51
+ /** Cloudflare Workers cache API. Ignored by Node `fetch`. */
52
+ cf?: {
53
+ cacheTtl?: number;
54
+ cacheEverything?: boolean;
55
+ };
56
+ };
57
+ export interface ScanGithubReleasesOptions {
58
+ userAgent: string;
59
+ assetPredicate: (asset: GithubReleaseAsset, release: GithubRelease) => boolean;
60
+ /**
61
+ * After `assetPredicate` misses on a release, return null without scanning
62
+ * older releases (the DMG known-good pointer floor).
63
+ */
64
+ shouldStop?: (release: GithubRelease) => boolean;
65
+ signal?: AbortSignal;
66
+ requestInit?: GithubReleasesRequestInit;
67
+ /**
68
+ * Test-only overrides. Production callers omit these so every scan shares
69
+ * `GITHUB_RELEASES_PER_PAGE` × `GITHUB_RELEASES_MAX_PAGES`.
70
+ */
71
+ perPage?: number;
72
+ maxPages?: number;
73
+ }
74
+ /**
75
+ * Walk releases newest→oldest until `assetPredicate` hits, a short/empty page,
76
+ * `shouldStop`, or `maxPages`. Throws on `!res.ok` or unparseable JSON.
77
+ */
78
+ export declare function scanGithubReleases(fetchImpl: typeof fetch, options: ScanGithubReleasesOptions): Promise<GithubReleasesScanHit | null>;
79
+ //# sourceMappingURL=github-releases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-releases.d.ts","sourceRoot":"","sources":["../src/github-releases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,eAAO,MAAM,yBAAyB,4DAA4D,CAAC;AAEnG,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAED,gGAAgG;AAChG,qBAAa,uBAAwB,SAAQ,KAAK;IAE9C,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAFvB,YACW,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAItB;CACF;AAED,iFAAiF;AACjF,qBAAa,wBAAyB,SAAQ,KAAK;IAE/C,QAAQ,CAAC,IAAI,EAAE,MAAM;IADvB,YACW,IAAI,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,OAAO,EAOhB;CACF;AAED;;;;GAIG;AACH,MAAM,MAAM,yBAAyB,GAAG,WAAW,GAAG;IACpD,6DAA6D;IAC7D,EAAE,CAAC,EAAE;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC;IAC/E;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC;IACjD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,OAAO,KAAK,EACvB,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAsCvC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Bounded newest→oldest scan of GitHub's releases API for the first asset
3
+ * matching a caller-supplied predicate.
4
+ *
5
+ * Pagination lives here so the worker DMG route, the worker CLI download
6
+ * route, and node-server `--install-cli` cannot drift on page size or the
7
+ * max-pages backstop (#3062). Callers keep only their asset predicate and
8
+ * their own failure policy (302 fallback vs 502 vs throw).
9
+ *
10
+ * `GITHUB_RELEASES_PER_PAGE` is GitHub's documented maximum (`per_page=100`).
11
+ * Five pages is a 500-release cap — enough to absorb sparse native-artifact
12
+ * gaps at the current release cadence without walking the whole history on
13
+ * every download hit. Do not reintroduce a smaller page size at a call site.
14
+ */
15
+ /** GitHub's maximum `per_page` for `/repos/{owner}/{repo}/releases`. */
16
+ export const GITHUB_RELEASES_PER_PAGE = 100;
17
+ /** Absolute backstop so a binary-less streak cannot exhaust the rate limit. */
18
+ export const GITHUB_RELEASES_MAX_PAGES = 5;
19
+ export const SLICC_GITHUB_RELEASES_URL = 'https://api.github.com/repos/ai-ecoverse/slicc/releases';
20
+ /** Thrown when a page fetch returns a non-2xx status. Callers map this to 302 / 502 / throw. */
21
+ export class GithubReleasesHttpError extends Error {
22
+ status;
23
+ page;
24
+ constructor(status, page) {
25
+ super(`GitHub releases API responded ${status} for page ${page}`);
26
+ this.status = status;
27
+ this.page = page;
28
+ this.name = 'GithubReleasesHttpError';
29
+ }
30
+ }
31
+ /** Thrown when a 2xx body is not JSON. Callers map this to 302 / 502 / throw. */
32
+ export class GithubReleasesParseError extends Error {
33
+ page;
34
+ constructor(page, cause) {
35
+ super('GitHub releases API returned unparseable JSON');
36
+ this.page = page;
37
+ this.name = 'GithubReleasesParseError';
38
+ if (cause !== undefined) {
39
+ this.cause = cause;
40
+ }
41
+ }
42
+ }
43
+ /**
44
+ * Walk releases newest→oldest until `assetPredicate` hits, a short/empty page,
45
+ * `shouldStop`, or `maxPages`. Throws on `!res.ok` or unparseable JSON.
46
+ */
47
+ export async function scanGithubReleases(fetchImpl, options) {
48
+ const perPage = options.perPage ?? GITHUB_RELEASES_PER_PAGE;
49
+ const maxPages = options.maxPages ?? GITHUB_RELEASES_MAX_PAGES;
50
+ const { userAgent, assetPredicate, shouldStop, signal, requestInit } = options;
51
+ for (let page = 1; page <= maxPages; page++) {
52
+ const res = await fetchImpl(`${SLICC_GITHUB_RELEASES_URL}?per_page=${perPage}&page=${page}`, {
53
+ ...requestInit,
54
+ headers: { 'User-Agent': userAgent },
55
+ signal,
56
+ });
57
+ if (!res.ok) {
58
+ throw new GithubReleasesHttpError(res.status, page);
59
+ }
60
+ let body;
61
+ try {
62
+ body = await res.json();
63
+ }
64
+ catch (cause) {
65
+ throw new GithubReleasesParseError(page, cause);
66
+ }
67
+ if (!Array.isArray(body) || body.length === 0) {
68
+ return null;
69
+ }
70
+ for (const item of body) {
71
+ const release = item;
72
+ const asset = release.assets?.find((candidate) => assetPredicate(candidate, release));
73
+ if (asset) {
74
+ return { release, asset };
75
+ }
76
+ if (shouldStop?.(release)) {
77
+ return null;
78
+ }
79
+ }
80
+ if (body.length < perPage) {
81
+ return null;
82
+ }
83
+ }
84
+ return null;
85
+ }
86
+ //# sourceMappingURL=github-releases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-releases.js","sourceRoot":"","sources":["../src/github-releases.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ export * from './extension-bridge-protocol.js';
10
10
  export * from './extension-message.js';
11
11
  export * from './fetch-proxy-protocol.js';
12
12
  export * from './form-body-unmask.js';
13
+ export * from './github-releases.js';
13
14
  export * from './handoff-link.js';
14
15
  export * from './iframe-repaint.js';
15
16
  export * from './leader-ext-id.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
@@ -11,6 +11,7 @@ export * from './extension-bridge-protocol.js';
11
11
  export * from './extension-message.js';
12
12
  export * from './fetch-proxy-protocol.js';
13
13
  export * from './form-body-unmask.js';
14
+ export * from './github-releases.js';
14
15
  export * from './handoff-link.js';
15
16
  export * from './iframe-repaint.js';
16
17
  export * from './leader-ext-id.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
@@ -15,7 +15,7 @@ export declare function cliAssetName(platform: string, arch: string): string | n
15
15
  export declare function resolveInstallDir(env?: NodeJS.ProcessEnv, platform?: string, isWritableDir?: (dir: string) => boolean): string;
16
16
  /**
17
17
  * Scan releases newest→oldest for the first one carrying `assetName`.
18
- * Returns null when no release within MAX_RELEASE_PAGES pages has it.
18
+ * Returns null when no release within the shared page cap has it.
19
19
  */
20
20
  export declare function resolveLatestCliAsset(assetName: string, fetchImpl?: typeof fetch): Promise<ResolvedCliAsset | null>;
21
21
  export interface InstallCliOptions {
@@ -1,3 +1,4 @@
1
+ import { scanGithubReleases } from './_shared/index.js';
1
2
  import { accessSync, chmodSync, constants, mkdirSync, renameSync, rmSync, writeFileSync } from 'fs';
2
3
  import { delimiter, join } from 'path';
3
4
  /**
@@ -7,17 +8,10 @@ import { delimiter, join } from 'path';
7
8
  * Release binaries are attached to GitHub releases as bare
8
9
  * `slicc-<os>-<arch>[.exe]` assets, but only on releases where
9
10
  * `packages/slicc-cli/` actually changed (see release-native.mjs) — so the
10
- * newest release does not necessarily carry them. The installer scans releases
11
- * newest→oldest for the first one with this platform's asset, mirroring the
12
- * cloudflare-worker's /download/slicc.dmg scan.
11
+ * newest release does not necessarily carry them. `scanGithubReleases` walks
12
+ * newest→oldest for the first carrier (same helper as the worker DMG and CLI
13
+ * download routes).
13
14
  */
14
- const RELEASES_PER_PAGE = 100;
15
- const RELEASES_API = `https://api.github.com/repos/ai-ecoverse/slicc/releases?per_page=${RELEASES_PER_PAGE}`;
16
- // Bounded pagination (5 × 100 releases ≈ months of releases even at the
17
- // current cadence) so a rate-limited or looping API can't hang the installer;
18
- // the sparse-release gap this must absorb is bounded by how often
19
- // packages/slicc-cli actually changes.
20
- const MAX_RELEASE_PAGES = 5;
21
15
  const USER_AGENT = 'sliccy-install-cli';
22
16
  const API_TIMEOUT_MS = 30_000;
23
17
  const DOWNLOAD_TIMEOUT_MS = 180_000;
@@ -70,37 +64,22 @@ export function resolveInstallDir(env = process.env, platform = process.platform
70
64
  }
71
65
  /**
72
66
  * Scan releases newest→oldest for the first one carrying `assetName`.
73
- * Returns null when no release within MAX_RELEASE_PAGES pages has it.
67
+ * Returns null when no release within the shared page cap has it.
74
68
  */
75
69
  export async function resolveLatestCliAsset(assetName, fetchImpl = fetch) {
76
- for (let page = 1; page <= MAX_RELEASE_PAGES; page += 1) {
77
- const res = await fetchImpl(`${RELEASES_API}&page=${page}`, {
78
- headers: { 'User-Agent': USER_AGENT },
79
- signal: AbortSignal.timeout(API_TIMEOUT_MS),
80
- });
81
- if (!res.ok) {
82
- throw new Error(`GitHub releases API responded ${res.status} for page ${page}`);
83
- }
84
- const releases = (await res.json());
85
- if (!Array.isArray(releases) || releases.length === 0) {
86
- return null;
87
- }
88
- for (const release of releases) {
89
- const asset = release.assets?.find((candidate) => candidate.name === assetName);
90
- if (asset) {
91
- return {
92
- version: release.tag_name,
93
- assetName,
94
- downloadUrl: asset.browser_download_url,
95
- };
96
- }
97
- }
98
- // Fewer than a full page means we've reached the last page — stop early.
99
- if (releases.length < RELEASES_PER_PAGE) {
100
- return null;
101
- }
70
+ const hit = await scanGithubReleases(fetchImpl, {
71
+ userAgent: USER_AGENT,
72
+ signal: AbortSignal.timeout(API_TIMEOUT_MS),
73
+ assetPredicate: (asset) => asset.name === assetName && typeof asset.browser_download_url === 'string',
74
+ });
75
+ if (!hit || typeof hit.asset.browser_download_url !== 'string') {
76
+ return null;
102
77
  }
103
- return null;
78
+ return {
79
+ version: hit.release.tag_name ?? '',
80
+ assetName,
81
+ downloadUrl: hit.asset.browser_download_url,
82
+ };
104
83
  }
105
84
  function isDirOnPath(dir, env) {
106
85
  return (env.PATH ?? '').split(delimiter).includes(dir);