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.
- package/dist/node-server/_shared/github-releases.d.ts +79 -0
- package/dist/node-server/_shared/github-releases.d.ts.map +1 -0
- package/dist/node-server/_shared/github-releases.js +86 -0
- package/dist/node-server/_shared/github-releases.js.map +1 -0
- package/dist/node-server/_shared/index.d.ts +1 -0
- package/dist/node-server/_shared/index.d.ts.map +1 -1
- package/dist/node-server/_shared/index.js +1 -0
- package/dist/node-server/_shared/index.js.map +1 -1
- package/dist/node-server/install-cli.d.ts +1 -1
- package/dist/node-server/install-cli.js +17 -38
- package/dist/ui/.vite/manifest.json +166 -166
- package/dist/ui/assets/CLAUDE-BcGVPwX6.js +1 -0
- package/dist/ui/assets/{account-store-WHtW2xQT.js → account-store-CV9MqwUm.js} +1 -1
- package/dist/ui/assets/{account-store-igNbS3Ak.js → account-store-D8e8oik0.js} +1 -1
- package/dist/ui/assets/{adobe-DES78X4G.js → adobe-BVISN7vp.js} +1 -1
- package/dist/ui/assets/{adobe-qGeGJSVK.js → adobe-BxjyXT87.js} +1 -1
- package/dist/ui/assets/{agent-bridge-Bj-PqjME.js → agent-bridge-BBkdIfsJ.js} +1 -1
- package/dist/ui/assets/{agent-panels-BWaMcEJL.js → agent-panels-CjeQdy1Y.js} +1 -1
- package/dist/ui/assets/{apply-layout-Cw4kGKTd.js → apply-layout-CvLXxRBE.js} +1 -1
- package/dist/ui/assets/{apps-GYMxMVb3.js → apps-DxHLnxIs.js} +1 -1
- package/dist/ui/assets/{azure-openai-BbxUu9bl.js → azure-openai-CeWhvhCg.js} +1 -1
- package/dist/ui/assets/{azure-openai-Df42STSp.js → azure-openai-CrXxL0yw.js} +1 -1
- package/dist/ui/assets/{budget-usage-source-CkdCr5f4.js → budget-usage-source-DKTPDwsD.js} +1 -1
- package/dist/ui/assets/{cdp-bzn_Xeev.js → cdp-C6pQEDl7.js} +1 -1
- package/dist/ui/assets/{cerebras-BdSVSPms.js → cerebras-Dy4v03m_.js} +1 -1
- package/dist/ui/assets/{cerebras-CnqGnpF2.js → cerebras-NYRgbfj7.js} +1 -1
- package/dist/ui/assets/{composer-speech-Bk2rlnG1.js → composer-speech-C_q-fKNK.js} +1 -1
- package/dist/ui/assets/{connect-surface-CHDb1bpy.js → connect-surface-DnqcwOmu.js} +1 -1
- package/dist/ui/assets/{directed-approval-KW7sZoq9.js → directed-approval-FjkkjI1B.js} +1 -1
- package/dist/ui/assets/{fs-FVRsAbgb.js → fs-DtsuwDhC.js} +1 -1
- package/dist/ui/assets/{fs-ih2eMSkQ.js → fs-cMwqXtFi.js} +2 -2
- package/dist/ui/assets/{github--5oROr4B.js → github-C9LAMuX2.js} +1 -1
- package/dist/ui/assets/{github-CMoh4wrN.js → github-DMrOAHK5.js} +2 -2
- package/dist/ui/assets/{github-copilot-DkYiMCsw.js → github-copilot-CIlYMLNf.js} +1 -1
- package/dist/ui/assets/{github-copilot-qWy0Zt4S.js → github-copilot-CMZIEIwW.js} +1 -1
- package/dist/ui/assets/{github-install-BNlfwzSw.js → github-install-Br7_N-Wz.js} +1 -1
- package/dist/ui/assets/{github-zip-BlzKyxxV.js → github-zip-JuyNsUge.js} +1 -1
- package/dist/ui/assets/{hear-DZ1gevW6.js → hear-WpLAGmLj.js} +1 -1
- package/dist/ui/assets/{help-AarM8EZw.js → help-DygoYzMM.js} +1 -1
- package/dist/ui/assets/{js-realm-worker-B0sapExQ.js → js-realm-worker-B_adS-Xa.js} +1 -1
- package/dist/ui/assets/{kernel-worker-BsjX-8Q_.js → kernel-worker-D6QiQmF8.js} +33 -33
- package/dist/ui/assets/{local-llm-Bm7qcibx.js → local-llm-BsNQFYst.js} +1 -1
- package/dist/ui/assets/{local-llm-oYJuPYM9.js → local-llm-CKk6H8PP.js} +1 -1
- package/dist/ui/assets/{main-0FLLRgpr.js → main-D1uZduJD.js} +3 -3
- package/dist/ui/assets/{main-cherry-DgWyX5j1.js → main-cherry-C309Ei0U.js} +1 -1
- package/dist/ui/assets/{memory-curation-seam-DaqkHe0O.js → memory-curation-seam-BHv-E0Wj.js} +1 -1
- package/dist/ui/assets/{mount-pNmGh8WK.js → mount-CvYjFqV-.js} +1 -1
- package/dist/ui/assets/{mount-BQVKp_Ky.js → mount-DEDbw6Zx.js} +3 -3
- package/dist/ui/assets/{mount-recovery-BAhGb_bv.js → mount-recovery-fCH5-MTl.js} +1 -1
- package/dist/ui/assets/{new-session-DTTLrwVg.js → new-session-B0QCLfxz.js} +2 -2
- package/dist/ui/assets/{oauth-bootstrap-CyfMMMHH.js → oauth-bootstrap-CGkRhQ3S.js} +2 -2
- package/dist/ui/assets/{onboarding-orchestrator-yYN6eJua.js → onboarding-orchestrator-CPTdYW2L.js} +1 -1
- package/dist/ui/assets/{openai-codex-DG43gisr.js → openai-codex-DYK7kjvj.js} +1 -1
- package/dist/ui/assets/{openai-codex-r3KGBkgC.js → openai-codex-DdHlWXt7.js} +1 -1
- package/dist/ui/assets/{openrouter-DssYc44Z.js → openrouter-BVTGfTQU.js} +1 -1
- package/dist/ui/assets/{openrouter-Bk7xqCwB.js → openrouter-DIGFK8vL.js} +1 -1
- package/dist/ui/assets/{openrouter-free-Bhx3nBtn.js → openrouter-free-3AcyjDsF.js} +1 -1
- package/dist/ui/assets/{openrouter-free-CSLhk_A7.js → openrouter-free-Ckpy86qX.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-ByDzZ41D.js → openrouter-oauth-BgOHLX8g.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-C8yHZzXx.js → openrouter-oauth-Dg6fl3Oy.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-S63g21yk.js → panel-rpc-handlers-CTskO2UP.js} +2 -2
- package/dist/ui/assets/{panelize-shell-B59FHf_a.js → panelize-shell-0NEazEbP.js} +1 -1
- package/dist/ui/assets/{provider-DTjGYfpI.js → provider-DZFS2iTq.js} +2 -2
- package/dist/ui/assets/{provider-B_5ZkOJ1.js → provider-c_Gkn3pV.js} +1 -1
- package/dist/ui/assets/provider-settings-CSEOVhGE.js +1 -0
- package/dist/ui/assets/provider-store-access-CVanUg7C.js +1 -0
- package/dist/ui/assets/provider-store-access-nMfbpDYJ.js +1 -0
- package/dist/ui/assets/{providers-w9myWTsL.js → providers-CraHfd4c.js} +1 -1
- package/dist/ui/assets/{providers-70klvlGo.js → providers-CuieHopm.js} +2 -2
- package/dist/ui/assets/{quick-llm-Bji5F30H.js → quick-llm-CFpL1uZA.js} +1 -1
- package/dist/ui/assets/{recovery-screen-lqxJwXM8.js → recovery-screen-CtXko1KE.js} +1 -1
- package/dist/ui/assets/{run-Ba8ggbts.js → run-5nsq-ysK.js} +2 -2
- package/dist/ui/assets/{run-BWhPamLe.js → run-DGB0hXS2.js} +1 -1
- package/dist/ui/assets/{run-Byf9dPJf.js → run-ydpfdHvF.js} +1 -1
- package/dist/ui/assets/{session-jsonl-BCOxqyX1.js → session-jsonl-C1iwca-E.js} +1 -1
- package/dist/ui/assets/{setup-feature-flags-remote-D1ban-xx.js → setup-feature-flags-remote-CbzffM1B.js} +1 -1
- package/dist/ui/assets/sidecar-repair-CXNpjnvd.js +1 -0
- package/dist/ui/assets/{silent-renew-backoff-DycrXmC_.js → silent-renew-backoff-gBUL-f53.js} +1 -1
- package/dist/ui/assets/{skills-CyvmUs8o.js → skills-9NWZ7vcj.js} +1 -1
- package/dist/ui/assets/slicc-version-uWYg_KNr.js +1 -0
- package/dist/ui/assets/{snapshot-CezJTIo1.js → snapshot-Czf24viR.js} +1 -1
- package/dist/ui/assets/{snapshot-features-i5G7O7jE.js → snapshot-features-DfvhK1Lt.js} +1 -1
- package/dist/ui/assets/{soundscape-B9l997Lg.js → soundscape-BLaJxYcC.js} +1 -1
- package/dist/ui/assets/{speak-DHglNoiP.js → speak-CAQFQMzh.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-oNv4Dxy0.js → sprinkle-manager-Buwj_jkg.js} +1 -1
- package/dist/ui/assets/{sprinkle-renderer-CeGc4B0L.js → sprinkle-renderer-BUZzvREL.js} +1 -1
- package/dist/ui/assets/{state-CENLKudR.js → state-MYRT4Xjf.js} +1 -1
- package/dist/ui/assets/{store-BZA4REpw.js → store-BDq6OolL.js} +1 -1
- package/dist/ui/assets/{store-L5QyZg_g.js → store-CB6g9ei3.js} +1 -1
- package/dist/ui/assets/{sudo-B6DNIqye.js → sudo-3qFVn_jk.js} +1 -1
- package/dist/ui/assets/{sync-dialog-CroF8oTi.js → sync-dialog-DLe5es1y.js} +1 -1
- package/dist/ui/assets/{transformers-env-CUhuRO-A.js → transformers-env-DZUIAHH5.js} +1 -1
- package/dist/ui/assets/{tray-sidecar-Djlc71w_.js → tray-sidecar-C7ntovgd.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-BLcTRETI.js → upgrade-detection-D3hzscHI.js} +1 -1
- package/dist/ui/assets/{voice-reply-Pzf7yCCs.js → voice-reply-g-JL5D2I.js} +1 -1
- package/dist/ui/assets/{wc-attach-BBHTF92w.js → wc-attach-KSgc0h1w.js} +2 -2
- package/dist/ui/assets/{wc-extension-BVUF-GVc.js → wc-extension-bo5QJG1Y.js} +2 -2
- package/dist/ui/assets/{wc-follower-oauth-B-LgkRB6.js → wc-follower-oauth-DUFBBrud.js} +1 -1
- package/dist/ui/assets/{wc-follower-9mZwPNR8.js → wc-follower-rNFcP2rQ.js} +3 -3
- package/dist/ui/assets/{wc-gelatiere-Cse9kSXf.js → wc-gelatiere-GM9XFlw0.js} +1 -1
- package/dist/ui/assets/{wc-live-Ts1bLhjx.js → wc-live-DU8Ig125.js} +5 -5
- package/dist/ui/assets/{wc-nav-DO33b6Qg.js → wc-nav-CjA4TRbH.js} +2 -2
- package/dist/ui/assets/{wc-onboarding-DeCWfgKN.js → wc-onboarding-DHIjYBxt.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-DgM1-HSU.js → wc-placeholder-B6MYdfoe.js} +3 -3
- package/dist/ui/assets/{wc-secret-request-BNTQEHzM.js → wc-secret-request-Cr4JjH2j.js} +1 -1
- package/dist/ui/assets/{wc-settings-CCJ-33PW.js → wc-settings-B0IuZcmh.js} +3 -3
- package/dist/ui/assets/{wc-shell-S_KQG-ZJ.js → wc-shell-BxKrLKUy.js} +3 -3
- package/dist/ui/assets/{wc-shortcut-config-DOL-7eLe.js → wc-shortcut-config-VG4rRXQ0.js} +1 -1
- package/dist/ui/assets/{wc-shortcuts-BU_YGmdb.js → wc-shortcuts-DqTUPTab.js} +1 -1
- package/dist/ui/assets/{wc-sprinkles-l4l891y6.js → wc-sprinkles-CJCiFv9X.js} +2 -2
- package/dist/ui/assets/{wc-transcript-export-DRwVoKZj.js → wc-transcript-export-BwmlRSNL.js} +2 -2
- package/dist/ui/assets/{wc-tray-qlcU6L0f.js → wc-tray-Csk1-trz.js} +4 -4
- package/dist/ui/assets/welcome-detection-CG-n5Lly.js +1 -0
- package/dist/ui/assets/{whisper-session-D3sdmYD8.js → whisper-session-CSoPKl8n.js} +2 -2
- package/dist/ui/assets/{xai-grok-DStVYmfz.js → xai-grok-CLJ0EDW2.js} +1 -1
- package/dist/ui/assets/{xai-grok-pQ6Q0CcQ.js → xai-grok-DY1YCas3.js} +1 -1
- package/dist/ui/index.html +3 -3
- package/dist/ui/packages/webapp/index.html +3 -3
- package/package.json +1 -1
- package/dist/ui/assets/CLAUDE-C2sAF3Q0.js +0 -1
- package/dist/ui/assets/provider-settings-uchEkvQy.js +0 -1
- package/dist/ui/assets/provider-store-access-Cz_2CeJI.js +0 -1
- package/dist/ui/assets/provider-store-access-kQEPDMDW.js +0 -1
- package/dist/ui/assets/sidecar-repair-CJngowmG.js +0 -1
- package/dist/ui/assets/slicc-version-BhF_V6lj.js +0 -1
- 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
|
|
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.
|
|
11
|
-
* newest→oldest for the first
|
|
12
|
-
*
|
|
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
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
|
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);
|