@josephyulei/summon-foundation 0.1.0
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/LICENSE +21 -0
- package/README.md +18 -0
- package/THIRD_PARTY_NOTICES.txt +13 -0
- package/bin/summon.mjs +69 -0
- package/lib/acquire.mjs +128 -0
- package/lib/public-policy.json +6 -0
- package/lib/release-proof.mjs +31 -0
- package/npm-shrinkwrap.json +617 -0
- package/package.json +19 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Foundation contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# summon foundation
|
|
2
|
+
|
|
3
|
+
Foundation 的薄获取入口,不包含完整运行包,没有 npm 安装生命周期脚本。
|
|
4
|
+
只有明确执行才查询/获取;安装和 Skill 注册继续各自需要用户确认。
|
|
5
|
+
|
|
6
|
+
可用性以 npm registry 的实际版本和公共 GitHub Release 为准;本目录或说明存在不是发布回执。只使用本项目已核验的包名,缺包时不换同名来源。
|
|
7
|
+
|
|
8
|
+
```text
|
|
9
|
+
npx --yes --package @josephyulei/summon-foundation@0.1.0 summon foundation
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
由 Codex 读取返回的固定安装说明后继续对话,先解释版本、目录、写入影响和权限;`--prepare --version <固定版本> --destination <绝对目录>` 获取后进入本人确认。`--acquire --version <固定版本>` 只准备更新输入,不执行更新;更新使用已安装稳定入口。没有 npm 时可先从 GitHub 安装说明开始检查环境,不自动安装全局依赖。
|
|
13
|
+
|
|
14
|
+
需要 macOS arm64、Node.js 22.9+ 与 npm。首次命令在 Codex 任务中查询版本并提供固定来源的接续信息;普通终端不能操控或唤醒 Codex。
|
|
15
|
+
固定版本准备阶段匿名校验 GitHub 仓库身份、不可变 Release、签名证明、时间戳、源码提交和资产字节,随后使用随包运行时进入现有 Foundation 确认页面。
|
|
16
|
+
不关闭 Gatekeeper、不清除隔离属性,不冒充 Apple 签名或公证。遇到权限问题安全停止。
|
|
17
|
+
|
|
18
|
+
尚无 Foundation / Skill 的缓存说明:[公开清理指南](https://github.com/y15801172513-lang/foundation/blob/main/docs/cache-cleanup.md)。该链接须在正式发布后回读核验;当前 README 不是发布完成回执。
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
The Foundation launcher code is MIT licensed. Its dependencies are separately
|
|
2
|
+
licensed and distributed by npm with their original license files retained:
|
|
3
|
+
|
|
4
|
+
@sigstore/verify, @sigstore/bundle, @sigstore/protobuf-specs: Apache-2.0
|
|
5
|
+
tuf-js: MIT
|
|
6
|
+
snappyjs: MIT
|
|
7
|
+
|
|
8
|
+
GitHub's public TUF bootstrap root is fetched from the fixed GitHub CLI v2.98.0
|
|
9
|
+
source URL and checked against a packaged SHA-256 before TUF refresh. This is
|
|
10
|
+
GitHub's existing release trust infrastructure, not a Foundation signing key.
|
|
11
|
+
|
|
12
|
+
This file does not replace the original dependency license texts installed by
|
|
13
|
+
npm. No third-party source is relicensed under Foundation's MIT license.
|
package/bin/summon.mjs
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import {spawnSync} from 'node:child_process';
|
|
5
|
+
import {inspectRelease,acquireRelease,plainPath} from '../lib/acquire.mjs';
|
|
6
|
+
|
|
7
|
+
const help=`summon foundation [--inspect] [--version x.y.z]
|
|
8
|
+
summon foundation --prepare --version x.y.z --destination /absolute/folder
|
|
9
|
+
summon foundation --acquire --version x.y.z
|
|
10
|
+
首次命令只查询发行并提供对话接续信息,不安装或注册 Skill。
|
|
11
|
+
--prepare 下载并核验固定发行,打开 Foundation 本人确认流程;不会代替确认。
|
|
12
|
+
--acquire 仅下载并核验更新材料,返回候选与回执;不启动安装或执行更新。
|
|
13
|
+
仅 macOS arm64。npm 入口需要 Node/npm;已安装 Foundation 使用随包运行时。
|
|
14
|
+
普通终端不能控制 Codex 对话或内置浏览器。无需 npm 的引导见公共仓库安装说明。`;
|
|
15
|
+
function fail(message){throw Error(message);}
|
|
16
|
+
function parse(args){
|
|
17
|
+
if(args.length===0||args.length===1&&['--help','-h'].includes(args[0]))return {help:true};
|
|
18
|
+
if(args.shift()!=='foundation')fail('仅支持 summon foundation');
|
|
19
|
+
const result={prepare:false};const seen=new Set();
|
|
20
|
+
while(args.length){const flag=args.shift();if(seen.has(flag))fail('重复参数');seen.add(flag);
|
|
21
|
+
if(flag==='--prepare')result.prepare=true;
|
|
22
|
+
else if(flag==='--acquire')result.acquire=true;
|
|
23
|
+
else if(flag==='--inspect')result.inspect=true;
|
|
24
|
+
else if(flag==='--version'||flag==='--destination'){if(!args.length||args[0].startsWith('--'))fail('参数缺值');result[flag.slice(2)]=args.shift();}
|
|
25
|
+
else fail('未知参数;请查看 --help');
|
|
26
|
+
}
|
|
27
|
+
if((result.prepare||result.acquire)&&result.inspect||result.prepare&&result.acquire||result.destination&&!result.prepare)fail('参数组合不支持');
|
|
28
|
+
if(result.prepare&&(!result.version||!result.destination))fail('准备前须由对话明确固定版本和意向目录');
|
|
29
|
+
if(result.acquire&&!result.version)fail('获取更新材料前须固定版本');
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
function sourceGuard(){
|
|
33
|
+
for(const start of [fs.realpathSync(process.cwd()),fs.realpathSync(import.meta.dirname)]){
|
|
34
|
+
for(let p=start;p!==path.dirname(p);p=path.dirname(p)){
|
|
35
|
+
if(fs.existsSync(path.join(p,'AGENTS.md'))&&fs.existsSync(path.join(p,'packages/core/trusted-authority.mjs')))fail('SOURCE_ONLY:源码建设目录不得操作真实安装缓存;请在有安装权限的独立任务使用正式 npm 入口');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function stageDirectory(){
|
|
40
|
+
const account=spawnSync('/usr/bin/id',['-un'],{encoding:'utf8'});if(account.status!==0)fail('无法读取 OS 账户');
|
|
41
|
+
const r=spawnSync('/usr/bin/dscl',['.','-read',`/Users/${account.stdout.trim()}`,'NFSHomeDirectory'],{encoding:'utf8'});
|
|
42
|
+
const match=/^NFSHomeDirectory: (\/[^\n]+)\n?$/.exec(r.stdout);if(r.status!==0||!match)fail('无法核验 OS 主目录;不使用 HOME 替代');
|
|
43
|
+
const home=plainPath(match[1]);const cache=path.join(home,'Library/Caches/ai-product-foundation-kit-acquisition');
|
|
44
|
+
console.log(`确认前将写入获取缓存:${cache}。下载材料暂时保留;安装目录仍需本人在页面确认。npm 自己的下载缓存由 npm 管理。`);
|
|
45
|
+
for(const p of [path.join(home,'Library'),path.join(home,'Library/Caches'),cache]){plainPath(p);if(!fs.existsSync(p))fs.mkdirSync(p,{mode:0o700});if(!fs.lstatSync(p).isDirectory())fail('缓存祖先不是目录');}
|
|
46
|
+
const stat=fs.lstatSync(cache);if(stat.uid!==process.getuid()||(stat.mode&0o777)!==0o700)fail('获取缓存必须由当前用户独占 0700;不会自动 chmod 已有目录');
|
|
47
|
+
return fs.mkdtempSync(path.join(cache,'acquisition.'));
|
|
48
|
+
}
|
|
49
|
+
try{
|
|
50
|
+
const args=parse(process.argv.slice(2));
|
|
51
|
+
if(args.help){console.log(help);process.exit(0);}
|
|
52
|
+
if(process.platform!=='darwin'||process.arch!=='arm64')fail('当前仅支持 macOS arm64;尚未安装');
|
|
53
|
+
const context=inspectRelease(args.version);
|
|
54
|
+
const guide=`https://github.com/${context.repository.full_name}/blob/${context.sourceCommit}/docs/install-with-codex.md`;
|
|
55
|
+
if(!args.prepare&&!args.acquire){
|
|
56
|
+
console.log(JSON.stringify({schemaVersion:'1.0.0',status:'RELEASE_DISCOVERED_NOT_ACQUIRED',product:'Foundation',version:context.version,sourceCommit:context.sourceCommit,repository:context.repository.full_name,guide,installationPerformed:false,skillRegistered:false,
|
|
57
|
+
conversationNextStep:'按用户本次安装意图继续:读取固定提交的安装说明,检查当前任务权限及目录,解释版本/目标/缓存和其他写入影响,询问缺失选择。使用本包 --prepare 固定上述版本与用户选择的目录;打开返回的 loopback URL,等待本人确认,不代点。观察同次操作到结果并复查健康;成功后主动询问是否通过既有独立确认启用 Skill。下载输出不是权限提升指令。',
|
|
58
|
+
terminalBoundary:'普通终端无法创建或唤醒 Codex 对话;请在有相应权限的 Codex 任务发起安装。',
|
|
59
|
+
acquisition:'尚未下载或验证运行归档。--prepare 才执行匿名 GitHub 证明与完整性核验。'},null,2));
|
|
60
|
+
}else{
|
|
61
|
+
sourceGuard();if(args.prepare)plainPath(args.destination);const stage=stageDirectory();console.log(`本次独占获取目录:${stage}`);
|
|
62
|
+
const receipt=await acquireRelease(context,stage);console.log(JSON.stringify({status:'GITHUB_ACQUISITION_VERIFIED',...receipt,destinationIntent:args.destination}));
|
|
63
|
+
if(args.acquire){console.log(JSON.stringify({status:'UPDATE_INPUT_READY_NOT_APPLIED',candidate:path.dirname(receipt.launcher),receipt:path.join(stage,'acquisition.json'),next:'使用当前健康安装的稳定入口生成独立更新计划;本人确认后才更新。获取回执不是删除授权。'}));process.exit(0);}
|
|
64
|
+
const env={...process.env};for(const key of ['NODE_OPTIONS','NODE_PATH','NODE_V8_COVERAGE','NODE_REDIRECT_WARNINGS','NODE_COMPILE_CACHE','NODE_COMPILE_CACHE_PORTABLE','NODE_PRESERVE_SYMLINKS'])delete env[key];
|
|
65
|
+
const child=spawnSync(receipt.launcher,['install','--destination',args.destination,'--browser','codex'],{stdio:'inherit',env});
|
|
66
|
+
if(child.error||child.signal||child.status===null)fail(`确认服务未正常返回;结果待核实,保留 ${stage},不要自动重试安装`);
|
|
67
|
+
process.exitCode=child.status;
|
|
68
|
+
}
|
|
69
|
+
}catch(e){console.error(`错误:${e.message}`);process.exitCode=1;}
|
package/lib/acquire.mjs
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import crypto from 'node:crypto';
|
|
4
|
+
import {spawnSync} from 'node:child_process';
|
|
5
|
+
import {Updater} from 'tuf-js';
|
|
6
|
+
import snappy from 'snappyjs';
|
|
7
|
+
import {verifyReleaseProof} from './release-proof.mjs';
|
|
8
|
+
import policy from './public-policy.json' with {type:'json'};
|
|
9
|
+
|
|
10
|
+
const hash = bytes => crypto.createHash('sha256').update(bytes).digest('hex');
|
|
11
|
+
const fail = message => { throw new Error(`错误:${message}`); };
|
|
12
|
+
const semver = /^\d+\.\d+\.\d+$/;
|
|
13
|
+
const json = bytes => JSON.parse(bytes.toString('utf8'));
|
|
14
|
+
const canonical = value => Array.isArray(value) ? `[${value.map(canonical).join(',')}]` : value && typeof value==='object' ? `{${Object.keys(value).sort().map(k=>`${JSON.stringify(k)}:${canonical(value[k])}`).join(',')}}` : JSON.stringify(value);
|
|
15
|
+
// Public transport never reads gh credentials or curl configuration. Proxy
|
|
16
|
+
// environment remains optional; neither Mono nor an author path is packaged.
|
|
17
|
+
function download(url, limit=10_000_000) {
|
|
18
|
+
const u = new URL(url);
|
|
19
|
+
if (u.protocol !== 'https:' || u.username || u.password) fail('只接受无凭证 HTTPS 地址');
|
|
20
|
+
const env = {PATH:'/usr/bin:/bin'};
|
|
21
|
+
for (const key of ['HTTPS_PROXY','HTTP_PROXY','ALL_PROXY','NO_PROXY','https_proxy','http_proxy','all_proxy','no_proxy','TMPDIR']) if (process.env[key]) env[key]=process.env[key];
|
|
22
|
+
const r=spawnSync('/usr/bin/curl',['-q','--fail','--silent','--show-error','--location','--max-redirs','4','--proto','=https','--proto-redir','=https','--connect-timeout','15','--max-time','120',url],{env,maxBuffer:limit});
|
|
23
|
+
if(r.status!==0 || r.error) fail(`匿名获取失败(${u.hostname});保留本次材料,不自动重试安装`);
|
|
24
|
+
return r.stdout;
|
|
25
|
+
}
|
|
26
|
+
function api(endpoint) { return json(download(`https://api.github.com/repos/${policy.repository}/${endpoint}`)); }
|
|
27
|
+
function regular(file) { const s=fs.lstatSync(file); if(!s.isFile()||s.isSymbolicLink())fail('不是普通文件');return s; }
|
|
28
|
+
export function plainPath(file) {
|
|
29
|
+
if(!path.isAbsolute(file)||path.normalize(file)!==file)fail('路径必须是规范化绝对路径');
|
|
30
|
+
for(let cursor=file;cursor!==path.dirname(cursor);cursor=path.dirname(cursor)){
|
|
31
|
+
if(fs.existsSync(cursor)||fs.lstatSync(cursor,{throwIfNoEntry:false})){
|
|
32
|
+
const s=fs.lstatSync(cursor);if(s.isSymbolicLink())fail('路径包含符号链接');
|
|
33
|
+
if(fs.realpathSync(cursor)!==cursor)fail('路径真实位置不一致');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return file;
|
|
37
|
+
}
|
|
38
|
+
export function inspectRelease(version) {
|
|
39
|
+
if(!Number.isSafeInteger(policy.repositoryId)||policy.repositoryId<=0)fail('公共仓库身份尚未绑定;此源码不是可用发行入口');
|
|
40
|
+
if(version!==undefined&&!semver.test(version))fail('版本必须是明确的 x.y.z');
|
|
41
|
+
const repository=json(download(`https://api.github.com/repos/${policy.repository}`));
|
|
42
|
+
if(repository.id!==policy.repositoryId||repository.full_name!==policy.repository||repository.private!==false)fail('公共仓库身份漂移');
|
|
43
|
+
const release=api(version?`releases/tags/v${version}`:'releases/latest');
|
|
44
|
+
if(!/^v\d+\.\d+\.\d+$/.test(release.tag_name)||!release.immutable||release.draft||release.prerelease)fail('没有可用的正式不可变发行');
|
|
45
|
+
const commit=api(`commits/${release.tag_name}`);
|
|
46
|
+
if(!/^[a-f0-9]{40}$/.test(commit.sha))fail('无法解析发行提交');
|
|
47
|
+
return {repository,release,sourceCommit:commit.sha,version:release.tag_name.slice(1)};
|
|
48
|
+
}
|
|
49
|
+
async function trustRoot(stage) {
|
|
50
|
+
const metadata=path.join(stage,'tuf-metadata'),targets=path.join(stage,'tuf-targets');
|
|
51
|
+
fs.mkdirSync(metadata,{mode:0o700});fs.mkdirSync(targets,{mode:0o700});
|
|
52
|
+
const bootstrap=download(policy.bootstrapRootUrl);
|
|
53
|
+
if(hash(bootstrap)!==policy.bootstrapRootSha256)fail('GitHub 初始信任数据摘要漂移');
|
|
54
|
+
fs.writeFileSync(path.join(metadata,'root.json'),bootstrap,{flag:'wx',mode:0o600});
|
|
55
|
+
// TUF validates root rotation, metadata signatures, expiry and target hashes.
|
|
56
|
+
const updater=new Updater({metadataDir:metadata,targetDir:targets,metadataBaseUrl:'https://tuf-repo.github.com',targetBaseUrl:'https://tuf-repo.github.com/targets',config:{fetchTimeout:30000,fetchRetries:0}});
|
|
57
|
+
await updater.refresh();const info=await updater.getTargetInfo('trusted_root.json');if(!info)fail('GitHub 信任目标缺失');
|
|
58
|
+
return json(fs.readFileSync(await updater.downloadTarget(info)));
|
|
59
|
+
}
|
|
60
|
+
async function verifiedAsset(context,asset,stage,trust) {
|
|
61
|
+
if(!asset||!Number.isSafeInteger(asset.size)||asset.size<=0||asset.size>250_000_000||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(asset.name)||!/^sha256:[a-f0-9]{64}$/.test(asset.digest)||asset.browser_download_url!==`https://github.com/${policy.repository}/releases/download/${context.release.tag_name}/${asset.name}`)fail('资产元数据无效');
|
|
62
|
+
const bytes=download(asset.browser_download_url,asset.size+1);
|
|
63
|
+
if(bytes.length!==asset.size||`sha256:${hash(bytes)}`!==asset.digest)fail('下载长度或摘要不匹配');
|
|
64
|
+
const proofs=api(`attestations/${asset.digest}?predicate_type=release&per_page=100`).attestations;
|
|
65
|
+
if(!Array.isArray(proofs)||proofs.length>=100)fail('证明列表不完整或分页待核实');
|
|
66
|
+
const matches=[];
|
|
67
|
+
for(const item of proofs){
|
|
68
|
+
if(item.initiator!=='github'||item.repository_id!==policy.repositoryId)continue;
|
|
69
|
+
let bundle=item.bundle;
|
|
70
|
+
if(!bundle){
|
|
71
|
+
const url=new URL(item.bundle_url);
|
|
72
|
+
if(url.protocol!=='https:'||url.hostname!=='tmaproduction.blob.core.windows.net'||!url.pathname.startsWith('/attestations/'))fail('证明存储来源不符合 GitHub 公共来源');
|
|
73
|
+
bundle=json(Buffer.from(snappy.uncompress(download(url.href),10_000_000)));
|
|
74
|
+
}
|
|
75
|
+
const statement=json(Buffer.from(bundle.dsseEnvelope.payload,'base64'));
|
|
76
|
+
if(statement.predicate?.tag===context.release.tag_name)matches.push(bundle);
|
|
77
|
+
}
|
|
78
|
+
if(matches.length!==1)fail('无法唯一确定对应发行证明');
|
|
79
|
+
const evidence=verifyReleaseProof({...context,bundle:matches[0],trustedRoot:trust,asset,bytes});
|
|
80
|
+
fs.writeFileSync(path.join(stage,asset.name),bytes,{flag:'wx',mode:0o600});
|
|
81
|
+
fs.writeFileSync(path.join(stage,asset.name+'.verification.json'),JSON.stringify(evidence,null,2)+'\n',{flag:'wx',mode:0o600});
|
|
82
|
+
return {bytes,file:path.join(stage,asset.name),evidence};
|
|
83
|
+
}
|
|
84
|
+
function validateCandidate(root,release,sourceCommit) {
|
|
85
|
+
const manifestFile=path.join(root,'manifest.json');regular(plainPath(manifestFile));const manifest=json(fs.readFileSync(manifestFile));
|
|
86
|
+
const {candidateHash,...manifestBody}=manifest;
|
|
87
|
+
if(candidateHash!==hash(canonical(manifestBody)))fail('候选清单摘要不匹配');
|
|
88
|
+
if(manifest.candidateHash!==release.candidateHash||manifest.productVersion!==release.version||manifest.platform!=='darwin'||manifest.arch!=='arm64'||manifest.build?.identity!==sourceCommit||manifest.source?.kind!=='repository-local-build'||manifest.runtime?.officialSourceVerified!==true||manifest.signature?.status!=='unsigned'||manifest.signature?.productionDistribution!==false)fail('候选身份、运行时或构建提交不匹配');
|
|
89
|
+
const expected=new Map([['manifest.json',null],['foundation-kit',manifest.launcher]]);
|
|
90
|
+
if(!Array.isArray(manifest.files)||manifest.launcher?.path!=='foundation-kit')fail('候选清单无效');
|
|
91
|
+
for(const record of manifest.files){
|
|
92
|
+
if(typeof record.path!=='string'||record.path.split('/').some(s=>!s||s==='.'||s==='..')||record.path.includes('\\'))fail('候选清单路径越界');
|
|
93
|
+
const rel='payload/'+record.path;if(expected.has(rel))fail('候选清单路径重复');expected.set(rel,record);
|
|
94
|
+
}
|
|
95
|
+
const actual=new Set();
|
|
96
|
+
const walk=(dir)=>{for(const name of fs.readdirSync(dir)){const file=path.join(dir,name),s=fs.lstatSync(file);if(s.isSymbolicLink())fail('候选含链接');if(s.uid!==process.getuid()||(s.mode&0o7000)!==0)fail('候选所有者或特殊权限无效');if(s.isDirectory())walk(file);else {if(!s.isFile())fail('候选含特殊文件');const rel=path.relative(root,file);actual.add(rel);if(!expected.has(rel))fail('候选包含未知文件');const r=expected.get(rel);if(r&&(r.size!==s.size||r.mode!==(s.mode&0o777)||r.sha256!==hash(fs.readFileSync(file))))fail('候选字节或模式不匹配');}}};walk(root);
|
|
97
|
+
if(actual.size!==expected.size||[...expected.keys()].some(k=>!actual.has(k)))fail('候选缺失文件');
|
|
98
|
+
const node=path.join(root,'payload/runtime/bin/node');if(hash(fs.readFileSync(node))!==release.runtime.binarySha256)fail('官方运行时摘要不匹配');
|
|
99
|
+
return {manifest,launcher:path.join(root,'foundation-kit')};
|
|
100
|
+
}
|
|
101
|
+
// stage is always created by the CLI from the OS account in production.
|
|
102
|
+
// Keeping this module callable allows contained engineering validation without
|
|
103
|
+
// adding an install/cache override to the user-facing executable.
|
|
104
|
+
export async function acquireRelease(context,stage) {
|
|
105
|
+
plainPath(stage);const s=fs.lstatSync(stage);if(!s.isDirectory()||(s.mode&0o777)!==0o700||s.uid!==process.getuid()||fs.readdirSync(stage).length)fail('获取目录必须是当前用户的新建独占空目录');
|
|
106
|
+
const beforeTmp=process.env.TMPDIR;process.env.TMPDIR=stage;
|
|
107
|
+
try{
|
|
108
|
+
const trust=await trustRoot(stage);
|
|
109
|
+
const name=`foundation-release-${context.version}-macos-arm64.json`;
|
|
110
|
+
const catalogs=context.release.assets.filter(x=>x.name===name);if(catalogs.length!==1)fail('发行清单缺失或重复');
|
|
111
|
+
const catalog=json((await verifiedAsset(context,catalogs[0],stage,trust)).bytes);
|
|
112
|
+
const releases=catalog.releases?.filter(x=>x.version===context.version&&x.platform==='darwin'&&x.arch==='arm64');
|
|
113
|
+
if(catalog.schemaVersion!=='1.0.0'||catalog.product!=='ai-product-foundation-kit'||catalog.keyId!==null||!Number.isSafeInteger(catalog.issuedAt)||catalog.issuedAt>Date.now()||!Number.isSafeInteger(catalog.expiresAt)||catalog.expiresAt<=Date.now()||catalog.expiresAt<=catalog.issuedAt||releases?.length!==1)fail('发行清单身份、有效期或架构不匹配');
|
|
114
|
+
const release=releases[0];const assetName=`foundation-${release.sha256}.tar.gz`;
|
|
115
|
+
if(release.repositoryId!==policy.repositoryId||release.sourceCommit!==context.sourceCommit||!/^[a-f0-9]{64}$/.test(release.candidateHash)||release.url!==`https://github.com/${policy.repository}/releases/download/${context.release.tag_name}/${assetName}`||!/^\d+\.\d+\.\d+$/.test(release.runtime?.version)||release.runtime.url!==`https://nodejs.org/dist/v${release.runtime.version}/node-v${release.runtime.version}-darwin-arm64.tar.gz`)fail('清单不能更换仓库、提交或官方运行时来源');
|
|
116
|
+
const assets=context.release.assets.filter(x=>x.name===assetName&&x.size===release.bytes&&x.digest===`sha256:${release.sha256}`);if(assets.length!==1)fail('归档身份不匹配');
|
|
117
|
+
const archive=await verifiedAsset(context,assets[0],stage,trust);
|
|
118
|
+
const listing=spawnSync('/usr/bin/tar',['-tzf',archive.file],{encoding:'utf8',maxBuffer:10_000_000});
|
|
119
|
+
const types=spawnSync('/usr/bin/tar',['-tvzf',archive.file],{encoding:'utf8',maxBuffer:10_000_000});
|
|
120
|
+
if(listing.status!==0||types.status!==0||listing.stdout.trim().split('\n').some(p=>p.startsWith('/')||p.includes('\\')||p.split('/').includes('..'))||types.stdout.trim().split('\n').some(p=>!['d','-'].includes(p[0])||/[sStT]/.test(p.slice(1,10))))fail('归档包含不安全路径、链接或特殊权限');
|
|
121
|
+
const candidate=path.join(stage,'candidate');fs.mkdirSync(candidate,{mode:0o700});
|
|
122
|
+
const extracted=spawnSync('/usr/bin/tar',['-xzf',archive.file,'-p','--no-same-owner','--no-acls','--no-fflags','--no-mac-metadata','--no-xattrs','-C',candidate],{stdio:'pipe'});if(extracted.status!==0)fail('归档展开失败;未执行');
|
|
123
|
+
const checked=validateCandidate(candidate,release,context.sourceCommit);
|
|
124
|
+
const receipt={...archive.evidence,candidateHash:release.candidateHash,launcher:checked.launcher,purpose:'acquisition-cache',retained:true,deletionAuthority:false,installationConfirmed:false};
|
|
125
|
+
fs.writeFileSync(path.join(stage,'acquisition.json'),JSON.stringify(receipt,null,2)+'\n',{flag:'wx',mode:0o600});
|
|
126
|
+
return receipt;
|
|
127
|
+
}finally{if(beforeTmp===undefined)delete process.env.TMPDIR;else process.env.TMPDIR=beforeTmp;}
|
|
128
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"repository": "y15801172513-lang/foundation",
|
|
3
|
+
"repositoryId": 1363748227,
|
|
4
|
+
"bootstrapRootUrl": "https://raw.githubusercontent.com/cli/cli/v2.98.0/pkg/cmd/attestation/verification/embed/tuf-repo.github.com/root.json",
|
|
5
|
+
"bootstrapRootSha256": "98cba97be9075bc98b2322de3de85fbd1b70ec7392991dfd2f53d215bede1a8d"
|
|
6
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import {Verifier, toSignedEntity, toTrustMaterial} from '@sigstore/verify';
|
|
3
|
+
import {bundleFromJSON} from '@sigstore/bundle';
|
|
4
|
+
import {TrustedRoot} from '@sigstore/protobuf-specs';
|
|
5
|
+
|
|
6
|
+
const sha256 = bytes => crypto.createHash('sha256').update(bytes).digest('hex');
|
|
7
|
+
const reject = message => { throw new Error(`发行校验失败:${message}`); };
|
|
8
|
+
|
|
9
|
+
// The caller obtains trustedRoot from a successfully refreshed GitHub TUF
|
|
10
|
+
// target rooted in the packaged, reviewed GitHub bootstrap root. Never from
|
|
11
|
+
// the downloaded release, caller approval booleans, or a catalog field.
|
|
12
|
+
export function verifyReleaseProof({bundle, trustedRoot, repository, release, sourceCommit, asset, bytes}) {
|
|
13
|
+
if (!repository || !Number.isSafeInteger(repository.id) || repository.id <= 0 || repository.private !== false || !/^[A-Za-z0-9-]+\/[A-Za-z0-9_.-]+$/.test(repository.full_name)) reject('仓库身份无效');
|
|
14
|
+
if (!release || !Number.isSafeInteger(release.id) || release.immutable !== true || release.draft !== false || release.prerelease !== false || !/^v\d+\.\d+\.\d+$/.test(release.tag_name) || !/^[a-f0-9]{40}$/.test(sourceCommit)) reject('版本不是绑定提交的正式不可变发行');
|
|
15
|
+
if (!Buffer.isBuffer(bytes) || !asset || !Number.isSafeInteger(asset.size) || bytes.length !== asset.size || !/^sha256:[a-f0-9]{64}$/.test(asset.digest) || asset.digest !== `sha256:${sha256(bytes)}`) reject('资产长度或摘要不匹配');
|
|
16
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(asset.name) || asset.state !== 'uploaded' || asset.browser_download_url !== `https://github.com/${repository.full_name}/releases/download/${release.tag_name}/${asset.name}`) reject('资产不是固定版本下载地址');
|
|
17
|
+
if (release.assets?.filter(x => x.id === asset.id && x.name === asset.name && x.size === asset.size && x.digest === asset.digest).length !== 1) reject('资产不属于对应发行');
|
|
18
|
+
// GitHub releases use its TSA, not public-good Rekor/SCT logs. This matches
|
|
19
|
+
// gh release verify-asset's GitHub policy: real TSA >=1 + CA + exact SAN.
|
|
20
|
+
// No timestamp or signature check is disabled.
|
|
21
|
+
const verifier = new Verifier(toTrustMaterial(TrustedRoot.fromJSON(trustedRoot)), {ctlogThreshold: 0, tlogThreshold: 0, timestampThreshold: 1});
|
|
22
|
+
const entity = toSignedEntity(bundleFromJSON(bundle));
|
|
23
|
+
if (!entity.timestamps.some(t => t.$case === 'timestamp-authority')) reject('缺少 GitHub 签名时间戳');
|
|
24
|
+
verifier.verify(entity, {subjectAlternativeName: /^https:\/\/dotcom\.releases\.github\.com$/});
|
|
25
|
+
const statement = JSON.parse(Buffer.from(bundle.dsseEnvelope.payload, 'base64').toString('utf8'));
|
|
26
|
+
const purl = `pkg:github/${repository.full_name}@${release.tag_name}`;
|
|
27
|
+
const predicate = statement.predicate;
|
|
28
|
+
if (statement._type !== 'https://in-toto.io/Statement/v1' || statement.predicateType !== 'https://in-toto.io/attestation/release/v0.2' || predicate?.repository !== repository.full_name || String(predicate.repositoryId) !== String(repository.id) || String(predicate.databaseId) !== String(release.id) || predicate.tag !== release.tag_name || predicate.purl !== purl) reject('签名证明的仓库或发行身份不匹配');
|
|
29
|
+
if (statement.subject?.filter(s => s.uri === purl && s.digest?.sha1 === sourceCommit).length !== 1 || statement.subject?.filter(s => s.name === asset.name && s.digest?.sha256 === asset.digest.slice(7)).length !== 1) reject('签名证明未绑定提交和资产');
|
|
30
|
+
return Object.freeze({repository: repository.full_name, repositoryId: repository.id, releaseId: release.id, tag: release.tag_name, sourceCommit, asset: asset.name, bytes: bytes.length, sha256: sha256(bytes), verification: 'github-release-signature-timestamp-and-byte-binding'});
|
|
31
|
+
}
|
|
@@ -0,0 +1,617 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@josephyulei/summon-foundation",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"lockfileVersion": 3,
|
|
5
|
+
"requires": true,
|
|
6
|
+
"packages": {
|
|
7
|
+
"": {
|
|
8
|
+
"name": "@josephyulei/summon-foundation",
|
|
9
|
+
"version": "0.1.0",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@sigstore/bundle": "4.0.0",
|
|
13
|
+
"@sigstore/protobuf-specs": "0.5.0",
|
|
14
|
+
"@sigstore/verify": "3.1.1",
|
|
15
|
+
"snappyjs": "0.7.0",
|
|
16
|
+
"tuf-js": "4.1.0"
|
|
17
|
+
},
|
|
18
|
+
"bin": {
|
|
19
|
+
"summon": "bin/summon.mjs"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=22.9.0"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"node_modules/@gar/promise-retry": {
|
|
26
|
+
"version": "1.0.3",
|
|
27
|
+
"resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz",
|
|
28
|
+
"integrity": "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"node_modules/@npmcli/agent": {
|
|
35
|
+
"version": "4.0.2",
|
|
36
|
+
"resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.2.tgz",
|
|
37
|
+
"integrity": "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==",
|
|
38
|
+
"license": "ISC",
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"agent-base": "^7.1.0",
|
|
41
|
+
"http-proxy-agent": "^7.0.0",
|
|
42
|
+
"https-proxy-agent": "^7.0.1",
|
|
43
|
+
"lru-cache": "^11.2.1",
|
|
44
|
+
"socks-proxy-agent": "^8.0.3"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"node_modules/@npmcli/fs": {
|
|
51
|
+
"version": "5.0.0",
|
|
52
|
+
"resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz",
|
|
53
|
+
"integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==",
|
|
54
|
+
"license": "ISC",
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"semver": "^7.3.5"
|
|
57
|
+
},
|
|
58
|
+
"engines": {
|
|
59
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"node_modules/@npmcli/redact": {
|
|
63
|
+
"version": "4.0.0",
|
|
64
|
+
"resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz",
|
|
65
|
+
"integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==",
|
|
66
|
+
"license": "ISC",
|
|
67
|
+
"engines": {
|
|
68
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"node_modules/@sigstore/bundle": {
|
|
72
|
+
"version": "4.0.0",
|
|
73
|
+
"resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz",
|
|
74
|
+
"integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==",
|
|
75
|
+
"license": "Apache-2.0",
|
|
76
|
+
"dependencies": {
|
|
77
|
+
"@sigstore/protobuf-specs": "^0.5.0"
|
|
78
|
+
},
|
|
79
|
+
"engines": {
|
|
80
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"node_modules/@sigstore/core": {
|
|
84
|
+
"version": "3.2.1",
|
|
85
|
+
"resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.2.1.tgz",
|
|
86
|
+
"integrity": "sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==",
|
|
87
|
+
"license": "Apache-2.0",
|
|
88
|
+
"engines": {
|
|
89
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"node_modules/@sigstore/protobuf-specs": {
|
|
93
|
+
"version": "0.5.0",
|
|
94
|
+
"resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz",
|
|
95
|
+
"integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==",
|
|
96
|
+
"license": "Apache-2.0",
|
|
97
|
+
"engines": {
|
|
98
|
+
"node": "^18.17.0 || >=20.5.0"
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"node_modules/@sigstore/verify": {
|
|
102
|
+
"version": "3.1.1",
|
|
103
|
+
"resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.1.tgz",
|
|
104
|
+
"integrity": "sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==",
|
|
105
|
+
"license": "Apache-2.0",
|
|
106
|
+
"dependencies": {
|
|
107
|
+
"@sigstore/bundle": "^4.0.0",
|
|
108
|
+
"@sigstore/core": "^3.2.1",
|
|
109
|
+
"@sigstore/protobuf-specs": "^0.5.0"
|
|
110
|
+
},
|
|
111
|
+
"engines": {
|
|
112
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"node_modules/@tufjs/canonical-json": {
|
|
116
|
+
"version": "2.0.0",
|
|
117
|
+
"resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz",
|
|
118
|
+
"integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==",
|
|
119
|
+
"license": "MIT",
|
|
120
|
+
"engines": {
|
|
121
|
+
"node": "^16.14.0 || >=18.0.0"
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"node_modules/@tufjs/models": {
|
|
125
|
+
"version": "4.1.0",
|
|
126
|
+
"resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz",
|
|
127
|
+
"integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==",
|
|
128
|
+
"license": "MIT",
|
|
129
|
+
"dependencies": {
|
|
130
|
+
"@tufjs/canonical-json": "2.0.0",
|
|
131
|
+
"minimatch": "^10.1.1"
|
|
132
|
+
},
|
|
133
|
+
"engines": {
|
|
134
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"node_modules/agent-base": {
|
|
138
|
+
"version": "7.1.4",
|
|
139
|
+
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
|
|
140
|
+
"integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
|
|
141
|
+
"license": "MIT",
|
|
142
|
+
"engines": {
|
|
143
|
+
"node": ">= 14"
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
"node_modules/balanced-match": {
|
|
147
|
+
"version": "4.0.4",
|
|
148
|
+
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
|
|
149
|
+
"integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
|
|
150
|
+
"license": "MIT",
|
|
151
|
+
"engines": {
|
|
152
|
+
"node": "18 || 20 || >=22"
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
"node_modules/brace-expansion": {
|
|
156
|
+
"version": "5.0.9",
|
|
157
|
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
|
|
158
|
+
"integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
|
|
159
|
+
"license": "MIT",
|
|
160
|
+
"dependencies": {
|
|
161
|
+
"balanced-match": "^4.0.2"
|
|
162
|
+
},
|
|
163
|
+
"engines": {
|
|
164
|
+
"node": "20 || >=22"
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
"node_modules/cacache": {
|
|
168
|
+
"version": "20.0.4",
|
|
169
|
+
"resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz",
|
|
170
|
+
"integrity": "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==",
|
|
171
|
+
"license": "ISC",
|
|
172
|
+
"dependencies": {
|
|
173
|
+
"@npmcli/fs": "^5.0.0",
|
|
174
|
+
"fs-minipass": "^3.0.0",
|
|
175
|
+
"glob": "^13.0.0",
|
|
176
|
+
"lru-cache": "^11.1.0",
|
|
177
|
+
"minipass": "^7.0.3",
|
|
178
|
+
"minipass-collect": "^2.0.1",
|
|
179
|
+
"minipass-flush": "^1.0.5",
|
|
180
|
+
"minipass-pipeline": "^1.2.4",
|
|
181
|
+
"p-map": "^7.0.2",
|
|
182
|
+
"ssri": "^13.0.0"
|
|
183
|
+
},
|
|
184
|
+
"engines": {
|
|
185
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
"node_modules/content-type": {
|
|
189
|
+
"version": "2.1.0",
|
|
190
|
+
"resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz",
|
|
191
|
+
"integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==",
|
|
192
|
+
"license": "MIT",
|
|
193
|
+
"engines": {
|
|
194
|
+
"node": ">=18"
|
|
195
|
+
},
|
|
196
|
+
"funding": {
|
|
197
|
+
"type": "opencollective",
|
|
198
|
+
"url": "https://opencollective.com/express"
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
"node_modules/debug": {
|
|
202
|
+
"version": "4.4.3",
|
|
203
|
+
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
|
|
204
|
+
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
|
|
205
|
+
"license": "MIT",
|
|
206
|
+
"dependencies": {
|
|
207
|
+
"ms": "^2.1.3"
|
|
208
|
+
},
|
|
209
|
+
"engines": {
|
|
210
|
+
"node": ">=6.0"
|
|
211
|
+
},
|
|
212
|
+
"peerDependenciesMeta": {
|
|
213
|
+
"supports-color": {
|
|
214
|
+
"optional": true
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
"node_modules/fs-minipass": {
|
|
219
|
+
"version": "3.0.3",
|
|
220
|
+
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
|
|
221
|
+
"integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
|
|
222
|
+
"license": "ISC",
|
|
223
|
+
"dependencies": {
|
|
224
|
+
"minipass": "^7.0.3"
|
|
225
|
+
},
|
|
226
|
+
"engines": {
|
|
227
|
+
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
"node_modules/glob": {
|
|
231
|
+
"version": "13.0.6",
|
|
232
|
+
"resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
|
|
233
|
+
"integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
|
|
234
|
+
"license": "BlueOak-1.0.0",
|
|
235
|
+
"dependencies": {
|
|
236
|
+
"minimatch": "^10.2.2",
|
|
237
|
+
"minipass": "^7.1.3",
|
|
238
|
+
"path-scurry": "^2.0.2"
|
|
239
|
+
},
|
|
240
|
+
"engines": {
|
|
241
|
+
"node": "18 || 20 || >=22"
|
|
242
|
+
},
|
|
243
|
+
"funding": {
|
|
244
|
+
"url": "https://github.com/sponsors/isaacs"
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
"node_modules/http-cache-semantics": {
|
|
248
|
+
"version": "4.2.0",
|
|
249
|
+
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
|
|
250
|
+
"integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
|
|
251
|
+
"license": "BSD-2-Clause"
|
|
252
|
+
},
|
|
253
|
+
"node_modules/http-proxy-agent": {
|
|
254
|
+
"version": "7.0.2",
|
|
255
|
+
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
|
|
256
|
+
"integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
|
|
257
|
+
"license": "MIT",
|
|
258
|
+
"dependencies": {
|
|
259
|
+
"agent-base": "^7.1.0",
|
|
260
|
+
"debug": "^4.3.4"
|
|
261
|
+
},
|
|
262
|
+
"engines": {
|
|
263
|
+
"node": ">= 14"
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
"node_modules/https-proxy-agent": {
|
|
267
|
+
"version": "7.0.6",
|
|
268
|
+
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
|
|
269
|
+
"integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
|
|
270
|
+
"license": "MIT",
|
|
271
|
+
"dependencies": {
|
|
272
|
+
"agent-base": "^7.1.2",
|
|
273
|
+
"debug": "4"
|
|
274
|
+
},
|
|
275
|
+
"engines": {
|
|
276
|
+
"node": ">= 14"
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
"node_modules/iconv-lite": {
|
|
280
|
+
"version": "0.7.3",
|
|
281
|
+
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz",
|
|
282
|
+
"integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==",
|
|
283
|
+
"license": "MIT",
|
|
284
|
+
"optional": true,
|
|
285
|
+
"dependencies": {
|
|
286
|
+
"safer-buffer": ">= 2.1.2 < 3.0.0"
|
|
287
|
+
},
|
|
288
|
+
"engines": {
|
|
289
|
+
"node": ">=0.10.0"
|
|
290
|
+
},
|
|
291
|
+
"funding": {
|
|
292
|
+
"type": "opencollective",
|
|
293
|
+
"url": "https://opencollective.com/express"
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
"node_modules/ip-address": {
|
|
297
|
+
"version": "10.7.0",
|
|
298
|
+
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.0.tgz",
|
|
299
|
+
"integrity": "sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA==",
|
|
300
|
+
"license": "MIT",
|
|
301
|
+
"engines": {
|
|
302
|
+
"node": ">= 12"
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
"node_modules/lru-cache": {
|
|
306
|
+
"version": "11.5.2",
|
|
307
|
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
|
|
308
|
+
"integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
|
|
309
|
+
"license": "BlueOak-1.0.0",
|
|
310
|
+
"engines": {
|
|
311
|
+
"node": "20 || >=22"
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
"node_modules/make-fetch-happen": {
|
|
315
|
+
"version": "15.0.6",
|
|
316
|
+
"resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.6.tgz",
|
|
317
|
+
"integrity": "sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==",
|
|
318
|
+
"license": "ISC",
|
|
319
|
+
"dependencies": {
|
|
320
|
+
"@gar/promise-retry": "^1.0.0",
|
|
321
|
+
"@npmcli/agent": "^4.0.0",
|
|
322
|
+
"@npmcli/redact": "^4.0.0",
|
|
323
|
+
"cacache": "^20.0.1",
|
|
324
|
+
"http-cache-semantics": "^4.1.1",
|
|
325
|
+
"minipass": "^7.0.2",
|
|
326
|
+
"minipass-fetch": "^5.0.0",
|
|
327
|
+
"minipass-flush": "^1.0.5",
|
|
328
|
+
"minipass-pipeline": "^1.2.4",
|
|
329
|
+
"negotiator": "^1.0.0",
|
|
330
|
+
"proc-log": "^6.0.0",
|
|
331
|
+
"ssri": "^13.0.0"
|
|
332
|
+
},
|
|
333
|
+
"engines": {
|
|
334
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
"node_modules/minimatch": {
|
|
338
|
+
"version": "10.2.6",
|
|
339
|
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
|
|
340
|
+
"integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
|
|
341
|
+
"license": "BlueOak-1.0.0",
|
|
342
|
+
"dependencies": {
|
|
343
|
+
"brace-expansion": "^5.0.8"
|
|
344
|
+
},
|
|
345
|
+
"engines": {
|
|
346
|
+
"node": "18 || 20 || >=22"
|
|
347
|
+
},
|
|
348
|
+
"funding": {
|
|
349
|
+
"url": "https://github.com/sponsors/isaacs"
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
"node_modules/minipass": {
|
|
353
|
+
"version": "7.1.3",
|
|
354
|
+
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
|
|
355
|
+
"integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
|
|
356
|
+
"license": "BlueOak-1.0.0",
|
|
357
|
+
"engines": {
|
|
358
|
+
"node": ">=16 || 14 >=14.17"
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
"node_modules/minipass-collect": {
|
|
362
|
+
"version": "2.0.1",
|
|
363
|
+
"resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
|
|
364
|
+
"integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
|
|
365
|
+
"license": "ISC",
|
|
366
|
+
"dependencies": {
|
|
367
|
+
"minipass": "^7.0.3"
|
|
368
|
+
},
|
|
369
|
+
"engines": {
|
|
370
|
+
"node": ">=16 || 14 >=14.17"
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
"node_modules/minipass-fetch": {
|
|
374
|
+
"version": "5.0.2",
|
|
375
|
+
"resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz",
|
|
376
|
+
"integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==",
|
|
377
|
+
"license": "MIT",
|
|
378
|
+
"dependencies": {
|
|
379
|
+
"minipass": "^7.0.3",
|
|
380
|
+
"minipass-sized": "^2.0.0",
|
|
381
|
+
"minizlib": "^3.0.1"
|
|
382
|
+
},
|
|
383
|
+
"engines": {
|
|
384
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
385
|
+
},
|
|
386
|
+
"optionalDependencies": {
|
|
387
|
+
"iconv-lite": "^0.7.2"
|
|
388
|
+
}
|
|
389
|
+
},
|
|
390
|
+
"node_modules/minipass-flush": {
|
|
391
|
+
"version": "1.0.7",
|
|
392
|
+
"resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz",
|
|
393
|
+
"integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==",
|
|
394
|
+
"license": "BlueOak-1.0.0",
|
|
395
|
+
"dependencies": {
|
|
396
|
+
"minipass": "^3.0.0"
|
|
397
|
+
},
|
|
398
|
+
"engines": {
|
|
399
|
+
"node": ">= 8"
|
|
400
|
+
}
|
|
401
|
+
},
|
|
402
|
+
"node_modules/minipass-flush/node_modules/minipass": {
|
|
403
|
+
"version": "3.3.6",
|
|
404
|
+
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
|
|
405
|
+
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
|
|
406
|
+
"license": "ISC",
|
|
407
|
+
"dependencies": {
|
|
408
|
+
"yallist": "^4.0.0"
|
|
409
|
+
},
|
|
410
|
+
"engines": {
|
|
411
|
+
"node": ">=8"
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
"node_modules/minipass-pipeline": {
|
|
415
|
+
"version": "1.2.4",
|
|
416
|
+
"resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
|
|
417
|
+
"integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
|
|
418
|
+
"license": "ISC",
|
|
419
|
+
"dependencies": {
|
|
420
|
+
"minipass": "^3.0.0"
|
|
421
|
+
},
|
|
422
|
+
"engines": {
|
|
423
|
+
"node": ">=8"
|
|
424
|
+
}
|
|
425
|
+
},
|
|
426
|
+
"node_modules/minipass-pipeline/node_modules/minipass": {
|
|
427
|
+
"version": "3.3.6",
|
|
428
|
+
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
|
|
429
|
+
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
|
|
430
|
+
"license": "ISC",
|
|
431
|
+
"dependencies": {
|
|
432
|
+
"yallist": "^4.0.0"
|
|
433
|
+
},
|
|
434
|
+
"engines": {
|
|
435
|
+
"node": ">=8"
|
|
436
|
+
}
|
|
437
|
+
},
|
|
438
|
+
"node_modules/minipass-sized": {
|
|
439
|
+
"version": "2.0.0",
|
|
440
|
+
"resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz",
|
|
441
|
+
"integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==",
|
|
442
|
+
"license": "ISC",
|
|
443
|
+
"dependencies": {
|
|
444
|
+
"minipass": "^7.1.2"
|
|
445
|
+
},
|
|
446
|
+
"engines": {
|
|
447
|
+
"node": ">=8"
|
|
448
|
+
}
|
|
449
|
+
},
|
|
450
|
+
"node_modules/minizlib": {
|
|
451
|
+
"version": "3.1.0",
|
|
452
|
+
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
|
|
453
|
+
"integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
|
|
454
|
+
"license": "MIT",
|
|
455
|
+
"dependencies": {
|
|
456
|
+
"minipass": "^7.1.2"
|
|
457
|
+
},
|
|
458
|
+
"engines": {
|
|
459
|
+
"node": ">= 18"
|
|
460
|
+
}
|
|
461
|
+
},
|
|
462
|
+
"node_modules/ms": {
|
|
463
|
+
"version": "2.1.3",
|
|
464
|
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
|
465
|
+
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
|
466
|
+
"license": "MIT"
|
|
467
|
+
},
|
|
468
|
+
"node_modules/negotiator": {
|
|
469
|
+
"version": "1.1.0",
|
|
470
|
+
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz",
|
|
471
|
+
"integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==",
|
|
472
|
+
"license": "MIT",
|
|
473
|
+
"dependencies": {
|
|
474
|
+
"content-type": "^2.1.0"
|
|
475
|
+
},
|
|
476
|
+
"engines": {
|
|
477
|
+
"node": ">=18"
|
|
478
|
+
},
|
|
479
|
+
"funding": {
|
|
480
|
+
"type": "opencollective",
|
|
481
|
+
"url": "https://opencollective.com/express"
|
|
482
|
+
}
|
|
483
|
+
},
|
|
484
|
+
"node_modules/p-map": {
|
|
485
|
+
"version": "7.0.7",
|
|
486
|
+
"resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.7.tgz",
|
|
487
|
+
"integrity": "sha512-VaWRu2i4FJNRtiRWCuuQRgfQ1B7a6+gMSrO+3j0EQi/k0ULfS9kosRxGoiqwzIjZTDI02tGfk5mXXltLg6QtfQ==",
|
|
488
|
+
"license": "MIT",
|
|
489
|
+
"engines": {
|
|
490
|
+
"node": ">=18"
|
|
491
|
+
},
|
|
492
|
+
"funding": {
|
|
493
|
+
"url": "https://github.com/sponsors/sindresorhus"
|
|
494
|
+
}
|
|
495
|
+
},
|
|
496
|
+
"node_modules/path-scurry": {
|
|
497
|
+
"version": "2.0.2",
|
|
498
|
+
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
|
|
499
|
+
"integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
|
|
500
|
+
"license": "BlueOak-1.0.0",
|
|
501
|
+
"dependencies": {
|
|
502
|
+
"lru-cache": "^11.0.0",
|
|
503
|
+
"minipass": "^7.1.2"
|
|
504
|
+
},
|
|
505
|
+
"engines": {
|
|
506
|
+
"node": "18 || 20 || >=22"
|
|
507
|
+
},
|
|
508
|
+
"funding": {
|
|
509
|
+
"url": "https://github.com/sponsors/isaacs"
|
|
510
|
+
}
|
|
511
|
+
},
|
|
512
|
+
"node_modules/proc-log": {
|
|
513
|
+
"version": "6.1.0",
|
|
514
|
+
"resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
|
|
515
|
+
"integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==",
|
|
516
|
+
"license": "ISC",
|
|
517
|
+
"engines": {
|
|
518
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
519
|
+
}
|
|
520
|
+
},
|
|
521
|
+
"node_modules/safer-buffer": {
|
|
522
|
+
"version": "2.1.2",
|
|
523
|
+
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
|
524
|
+
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
|
525
|
+
"license": "MIT",
|
|
526
|
+
"optional": true
|
|
527
|
+
},
|
|
528
|
+
"node_modules/semver": {
|
|
529
|
+
"version": "7.8.5",
|
|
530
|
+
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
|
|
531
|
+
"integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
|
|
532
|
+
"license": "ISC",
|
|
533
|
+
"bin": {
|
|
534
|
+
"semver": "bin/semver.js"
|
|
535
|
+
},
|
|
536
|
+
"engines": {
|
|
537
|
+
"node": ">=10"
|
|
538
|
+
}
|
|
539
|
+
},
|
|
540
|
+
"node_modules/smart-buffer": {
|
|
541
|
+
"version": "4.2.0",
|
|
542
|
+
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
|
|
543
|
+
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
|
|
544
|
+
"license": "MIT",
|
|
545
|
+
"engines": {
|
|
546
|
+
"node": ">= 6.0.0",
|
|
547
|
+
"npm": ">= 3.0.0"
|
|
548
|
+
}
|
|
549
|
+
},
|
|
550
|
+
"node_modules/snappyjs": {
|
|
551
|
+
"version": "0.7.0",
|
|
552
|
+
"resolved": "https://registry.npmjs.org/snappyjs/-/snappyjs-0.7.0.tgz",
|
|
553
|
+
"integrity": "sha512-u5iEEXkMe2EInQio6Wv9LWHOQYRDbD2O9hzS27GpT/lwfIQhTCnHCTqedqHIHe9ZcvQo+9au6vngQayipz1NYw==",
|
|
554
|
+
"license": "MIT"
|
|
555
|
+
},
|
|
556
|
+
"node_modules/socks": {
|
|
557
|
+
"version": "2.8.10",
|
|
558
|
+
"resolved": "https://registry.npmjs.org/socks/-/socks-2.8.10.tgz",
|
|
559
|
+
"integrity": "sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==",
|
|
560
|
+
"license": "MIT",
|
|
561
|
+
"dependencies": {
|
|
562
|
+
"ip-address": "^10.1.1",
|
|
563
|
+
"smart-buffer": "^4.2.0"
|
|
564
|
+
},
|
|
565
|
+
"engines": {
|
|
566
|
+
"node": ">= 10.0.0",
|
|
567
|
+
"npm": ">= 3.0.0"
|
|
568
|
+
}
|
|
569
|
+
},
|
|
570
|
+
"node_modules/socks-proxy-agent": {
|
|
571
|
+
"version": "8.0.5",
|
|
572
|
+
"resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
|
|
573
|
+
"integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
|
|
574
|
+
"license": "MIT",
|
|
575
|
+
"dependencies": {
|
|
576
|
+
"agent-base": "^7.1.2",
|
|
577
|
+
"debug": "^4.3.4",
|
|
578
|
+
"socks": "^2.8.3"
|
|
579
|
+
},
|
|
580
|
+
"engines": {
|
|
581
|
+
"node": ">= 14"
|
|
582
|
+
}
|
|
583
|
+
},
|
|
584
|
+
"node_modules/ssri": {
|
|
585
|
+
"version": "13.0.1",
|
|
586
|
+
"resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz",
|
|
587
|
+
"integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==",
|
|
588
|
+
"license": "ISC",
|
|
589
|
+
"dependencies": {
|
|
590
|
+
"minipass": "^7.0.3"
|
|
591
|
+
},
|
|
592
|
+
"engines": {
|
|
593
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
594
|
+
}
|
|
595
|
+
},
|
|
596
|
+
"node_modules/tuf-js": {
|
|
597
|
+
"version": "4.1.0",
|
|
598
|
+
"resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz",
|
|
599
|
+
"integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==",
|
|
600
|
+
"license": "MIT",
|
|
601
|
+
"dependencies": {
|
|
602
|
+
"@tufjs/models": "4.1.0",
|
|
603
|
+
"debug": "^4.4.3",
|
|
604
|
+
"make-fetch-happen": "^15.0.1"
|
|
605
|
+
},
|
|
606
|
+
"engines": {
|
|
607
|
+
"node": "^20.17.0 || >=22.9.0"
|
|
608
|
+
}
|
|
609
|
+
},
|
|
610
|
+
"node_modules/yallist": {
|
|
611
|
+
"version": "4.0.0",
|
|
612
|
+
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
|
613
|
+
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
|
|
614
|
+
"license": "ISC"
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@josephyulei/summon-foundation",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Prepare a verified Foundation release for an explicitly confirmed Codex installation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {"summon": "bin/summon.mjs"},
|
|
7
|
+
"files": ["bin/", "lib/", "README.md", "LICENSE", "THIRD_PARTY_NOTICES.txt", "npm-shrinkwrap.json"],
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"engines": {"node": ">=22.9.0"},
|
|
10
|
+
"repository": {"type": "git", "url": "git+https://github.com/y15801172513-lang/foundation.git", "directory": "distribution/summon-foundation"},
|
|
11
|
+
"publishConfig": {"access": "public", "registry": "https://registry.npmjs.org/"},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@sigstore/verify": "3.1.1",
|
|
14
|
+
"@sigstore/bundle": "4.0.0",
|
|
15
|
+
"@sigstore/protobuf-specs": "0.5.0",
|
|
16
|
+
"tuf-js": "4.1.0",
|
|
17
|
+
"snappyjs": "0.7.0"
|
|
18
|
+
}
|
|
19
|
+
}
|