@petercjl/codex-own 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -76,7 +76,7 @@ $codexOwn = Join-Path (npm.cmd prefix --global) "codex-own.cmd"
76
76
  & $codexOwn install --yes
77
77
  ```
78
78
 
79
- 管理工具和桌面资源全部从 registry.npmjs.org 下载。Windows 桌面下载量约 878 MiB,安装时显示分片编号、下载百分比和已接收大小,然后显示校验、解压、安装。看到“安装完成”和 ok: true 才表示完成。
79
+ 管理工具和桌面资源全部从 registry.npmjs.org 下载。Windows 桌面下载量约 878 MiB,最多并行下载 4 个分片,安装时显示分片编号、下载百分比和已接收大小,然后显示校验、解压、安装。看到“安装完成”和 ok: true 才表示完成。
80
80
 
81
81
  若已有手动安装的 codex-own,先退出应用,将第二步的安装命令替换为以下接管命令;原安装会被备份。
82
82
 
package/capabilities.json CHANGED
@@ -29,6 +29,7 @@
29
29
  "cache": "verified platform parts retained for retries",
30
30
  "progress": "stderr; final result JSON on stdout",
31
31
  "idleTimeoutSeconds": 30,
32
- "downloadAttempts": 3
32
+ "downloadAttempts": 3,
33
+ "parallelDownloads": 4
33
34
  }
34
35
  }
package/lib/network.mjs CHANGED
@@ -13,17 +13,19 @@ export async function fileHash(file) {
13
13
  return h.digest('hex');
14
14
  }
15
15
  export async function verifiedDownload(url, dest, expected, {
16
- fetcher = networkFetch, report = progress, idleMs = 30000, attempts = 3, retryMs = 1000,
16
+ fetcher = networkFetch, report = progress, idleMs = 30000, attempts = 3, retryMs = 1000, signal,
17
17
  } = {}) {
18
18
  const error = (code, message) => Object.assign(new Error(message), {code});
19
19
  if (fs.existsSync(dest)) throw error('TARGET_EXISTS', 'Download destination already exists');
20
20
  for (let attempt = 1; attempt <= attempts; attempt++) {
21
+ if(signal?.aborted)throw error('CANCELLED','Download group cancelled');
21
22
  const controller = new AbortController();
22
23
  let file, bytes = 0, timer, cancelled = false;
23
24
  const start = Date.now();
24
25
  const cancel = () => { cancelled = true; controller.abort(); };
25
26
  const reset = () => { clearTimeout(timer); timer = setTimeout(() => controller.abort(), idleMs); };
26
27
  const tick = () => report(`下载 ${Math.floor(bytes / expected.size * 100)}% · ${(bytes / 1048576).toFixed(1)} / ${(expected.size / 1048576).toFixed(1)} MiB · ${((Date.now()-start)/1000).toFixed(0)}s`);
28
+ signal?.addEventListener('abort',cancel,{once:true});
27
29
  process.once('SIGINT', cancel);
28
30
  process.once('SIGTERM', cancel);
29
31
  const interval = setInterval(tick, 3000);
@@ -55,6 +57,7 @@ export async function verifiedDownload(url, dest, expected, {
55
57
  if (cancelled) throw error('CANCELLED', 'Download cancelled. Verified earlier parts are retained; rerun the install command to continue.');
56
58
  } finally {
57
59
  clearTimeout(timer); clearInterval(interval);
60
+ signal?.removeEventListener('abort',cancel);
58
61
  process.removeListener('SIGINT', cancel); process.removeListener('SIGTERM', cancel);
59
62
  if (file) await file.close();
60
63
  }
@@ -24,31 +24,44 @@ function safeCache(file) {
24
24
  if (fs.existsSync(file) && (!fs.lstatSync(file).isFile() || fs.lstatSync(file).isSymbolicLink()))
25
25
  throw Object.assign(new Error('Unexpected npm asset cache entry'), {code:'UNSAFE_PATH'});
26
26
  }
27
- export async function assembleNpmAsset(asset, dest, cache, tar, {download = verifiedDownload, report = progress} = {}) {
27
+ export async function assembleNpmAsset(asset, dest, cache, tar, {download = verifiedDownload, report = progress, concurrency = 4} = {}) {
28
28
  validateParts(asset);
29
29
  fs.mkdirSync(cache, {recursive:true, mode:0o700});
30
- const files = [];
31
- for (const [i, part] of asset.parts.entries()) {
30
+ if (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > 4) throw new Error('Invalid download concurrency');
31
+ const controller = new AbortController();
32
+ async function fetchPart(part, i) {
32
33
  report(`npm 资源分片 ${i+1}/${asset.parts.length}`);
33
34
  const file = path.join(cache, `${part.sha256}.bin`);
34
35
  safeCache(file);
35
36
  if (fs.existsSync(file) && fs.statSync(file).size === part.size && await fileHash(file) === part.sha256) {
36
- report('复用已校验分片'); files.push(file); continue;
37
+ report(`[${i+1}/${asset.parts.length}] 复用已校验分片`); return file;
37
38
  }
38
39
  if (fs.existsSync(file)) fs.unlinkSync(file);
39
40
  const scratch = fs.mkdtempSync(path.join(cache, 'fetch-'));
40
41
  try {
41
42
  const archive = path.join(scratch, 'package.tgz');
42
- await download(part.url, archive, {size:part.archiveSize, sha256:part.archiveSha256});
43
+ await download(part.url, archive, {size:part.archiveSize, sha256:part.archiveSha256}, {signal:controller.signal, report:message=>report(`[${i+1}/${asset.parts.length}] ${message}`)});
43
44
  // Extract only the fixed payload entry, never arbitrary paths from a package tarball.
44
45
  execFileSync(tar, ['-xf', archive, '-C', scratch, 'package/payload.bin'], {stdio:'pipe'});
45
46
  const payload = path.join(scratch, 'package', 'payload.bin');
46
47
  safeCache(payload);
47
48
  if (fs.statSync(payload).size !== part.size || await fileHash(payload) !== part.sha256)
48
49
  throw Object.assign(new Error('npm payload checksum mismatch'), {code:'CHECKSUM_MISMATCH'});
49
- fs.renameSync(payload, file); files.push(file);
50
+ fs.renameSync(payload, file); return file;
50
51
  } finally { fs.rmSync(scratch, {recursive:true,force:true}); }
51
52
  }
53
+ const unique = [...new Map(asset.parts.map((part,i)=>[part.sha256,{part,i}])).values()];
54
+ const completed = new Map(); let cursor = 0, failure;
55
+ async function worker() {
56
+ while(!controller.signal.aborted && cursor < unique.length) {
57
+ const {part,i}=unique[cursor++];
58
+ try { completed.set(part.sha256,await fetchPart(part,i)); }
59
+ catch(e) { if(!failure)failure=e;controller.abort();throw e; }
60
+ }
61
+ }
62
+ await Promise.allSettled(Array.from({length:Math.min(concurrency,unique.length)},worker));
63
+ if(failure)throw failure;
64
+ const files=asset.parts.map(part=>completed.get(part.sha256));
52
65
  report('合并并校验完整桌面安装包');
53
66
  const output = fs.createWriteStream(dest, {flags:'wx',mode:0o600});
54
67
  async function* chunks() { for (const f of files) yield* fs.createReadStream(f); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@petercjl/codex-own",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Independent codex-own desktop installation and update manager",
5
5
  "type": "module",
6
6
  "bin": {
@@ -44,7 +44,7 @@
44
44
  "ownDesktopManifest": {
45
45
  "schema": 2,
46
46
  "repository": "petercjl/codex-own",
47
- "version": "0.2.0",
47
+ "version": "0.2.2",
48
48
  "platforms": {
49
49
  "darwin-arm64": {
50
50
  "entry": "codex-own.app",
@@ -97,81 +97,71 @@
97
97
  },
98
98
  "win32-x64": {
99
99
  "entry": "app",
100
- "size": 920368892,
101
- "sha256": "f110a1e7e0f7c1e184ccc8733674d00280ecae02762530b07ca3b7d2547a4259",
100
+ "size": 919583599,
101
+ "sha256": "cec7d992c9a2f2aae19ac24b43ba6a5c64d07a3eeabf82633bc3a680789f0e01",
102
102
  "parts": [
103
103
  {
104
- "sha256": "f10bf3a916546c9b8d334b9bed9da2688cf48629aaa677b6b1265721ef695f09",
104
+ "sha256": "b4fffc930f64c0229fca0d882e1f5b41f1c7e06fbd500dae937078083a4e9659",
105
105
  "size": 134217728,
106
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hf10bf3a916546c9b8d334b9bed9da2688cf48629aaa677b6b1265721ef695f09.tgz",
107
- "archiveSize": 134146498,
108
- "archiveSha256": "cca9d9844548e9ada4d332be0620a248d20460c62b549faa3cb27532b1360ac9"
106
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hb4fffc930f64c0229fca0d882e1f5b41f1c7e06fbd500dae937078083a4e9659.tgz",
107
+ "archiveSize": 134172879,
108
+ "archiveSha256": "4a47ef63b0906d5b6414713c33158e065e6ede4338e27a2815447981d01f56d1"
109
109
  },
110
110
  {
111
- "sha256": "1c4eb544a87dae8072fbf6cfced05aba0c128be51ee59c1ba8a29ee1e06c2bb3",
111
+ "sha256": "5995fee8dc2495440d09ac2f55310c8511d2e4d2e0490b957e351257b85f2934",
112
112
  "size": 134217728,
113
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h1c4eb544a87dae8072fbf6cfced05aba0c128be51ee59c1ba8a29ee1e06c2bb3.tgz",
114
- "archiveSize": 134017345,
115
- "archiveSha256": "be3663292e80e953f48f2d3b59d93ea6030f78b411eca2333ff66c9b623f3e81"
113
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h5995fee8dc2495440d09ac2f55310c8511d2e4d2e0490b957e351257b85f2934.tgz",
114
+ "archiveSize": 133982893,
115
+ "archiveSha256": "17911fdd94f7809041f0aeb9fcd7851c256d0b85707d11986dc4630276490389"
116
116
  },
117
117
  {
118
- "sha256": "96515fb363ccdfd35cabccb0c6c80d7377c07a17d546cb3dcd0e9995abdc52e3",
118
+ "sha256": "e60ec278e8b741ffecd9c06b1275e42e001050123a0b366181f6e013447de8fd",
119
119
  "size": 134217728,
120
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h96515fb363ccdfd35cabccb0c6c80d7377c07a17d546cb3dcd0e9995abdc52e3.tgz",
121
- "archiveSize": 134217117,
122
- "archiveSha256": "b992e7d853bc0ee32acc4416b670238362473e91bb0cd0bb49b57d7a1431da30"
120
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.he60ec278e8b741ffecd9c06b1275e42e001050123a0b366181f6e013447de8fd.tgz",
121
+ "archiveSize": 134212766,
122
+ "archiveSha256": "f2dc5d39ac6f36d7ef1541e171ac8889bc4a11026381a6c4c90af57660f7ed1c"
123
123
  },
124
124
  {
125
- "sha256": "c72e99cd0a9b99fc023bfc53da528b16fcff89d9d11aa8ffb7cffe163ce15ac2",
125
+ "sha256": "9b6c9383abcab326115dfbb8d81780d918c9529444dbab236732ce544f8136c1",
126
126
  "size": 134217728,
127
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hc72e99cd0a9b99fc023bfc53da528b16fcff89d9d11aa8ffb7cffe163ce15ac2.tgz",
128
- "archiveSize": 134037874,
129
- "archiveSha256": "b7f72914ae410ca59d0f23038765683d096564f9a982880eeaaa2612121e9d98"
127
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h9b6c9383abcab326115dfbb8d81780d918c9529444dbab236732ce544f8136c1.tgz",
128
+ "archiveSize": 134036582,
129
+ "archiveSha256": "9c127af49140afc8119ca6a935f26fc1469f20467abc78b656e15b1811846938"
130
130
  },
131
131
  {
132
- "sha256": "4cdd4bb887ae5046cac17eb6b6f197f0fc74d8d6f6cc7548d74d45a099c71f00",
132
+ "sha256": "1b10c0d8a0b6c67ac85ccacf0ae374eade36d2e32371214296dc800032b1bc1f",
133
133
  "size": 134217728,
134
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h4cdd4bb887ae5046cac17eb6b6f197f0fc74d8d6f6cc7548d74d45a099c71f00.tgz",
135
- "archiveSize": 133901929,
136
- "archiveSha256": "51510b54827188f5957eb2814795e1d1fe9c5abb8cbe753715a87e3c666a5dc4"
134
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h1b10c0d8a0b6c67ac85ccacf0ae374eade36d2e32371214296dc800032b1bc1f.tgz",
135
+ "archiveSize": 133798951,
136
+ "archiveSha256": "3aaedeb6333318ce2de8bbef2795d868db917c3098d3fcd0922840c5f4daaebe"
137
137
  },
138
138
  {
139
- "sha256": "27eb58e92a273dac2abfad90fb5493634993f3c5f60249ac0074fadbfe93a7a3",
139
+ "sha256": "cc07c5fdc24fbc3855564e88dd00cff2f2ed3caec27a7e6002d91d6906a4e424",
140
140
  "size": 134217728,
141
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h27eb58e92a273dac2abfad90fb5493634993f3c5f60249ac0074fadbfe93a7a3.tgz",
142
- "archiveSize": 133616572,
143
- "archiveSha256": "651d527dac76787fd19459804e1dac9957df897be44098f49085bb26035fa0de"
141
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hcc07c5fdc24fbc3855564e88dd00cff2f2ed3caec27a7e6002d91d6906a4e424.tgz",
142
+ "archiveSize": 133729271,
143
+ "archiveSha256": "d1e8863c7a286d0d824e50e510f3073baf29533e6f8daa10d5ade434bde93ab0"
144
144
  },
145
145
  {
146
- "sha256": "b38a0db220f90da06049e05516387bffdfa0f3b3fd2e9106bc2a04135d0b4779",
147
- "size": 115062524,
148
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hb38a0db220f90da06049e05516387bffdfa0f3b3fd2e9106bc2a04135d0b4779.tgz",
149
- "archiveSize": 114529446,
150
- "archiveSha256": "8cba55fc4c9b3592ef80601ba8f65881720c26de0b5d8ae4d589ebb6bb4771fe"
146
+ "sha256": "3a82f5a5807221847a0f200dceaccfc94076afc7735fa7a2f6b7b0d28741a264",
147
+ "size": 114277231,
148
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h3a82f5a5807221847a0f200dceaccfc94076afc7735fa7a2f6b7b0d28741a264.tgz",
149
+ "archiveSize": 113734286,
150
+ "archiveSha256": "d142a464e09627569fac57546b7c8980e97ebac158f5f586d76bf4dc2c0fc695"
151
151
  }
152
152
  ]
153
153
  }
154
154
  },
155
155
  "provenance": {
156
156
  "darwin-arm64": {
157
- "darwin-arm64": {
158
- "sourceRelease": "own-v0.1.0"
159
- },
160
- "win32-x64": {
161
- "kind": "prepared-independent-build",
162
- "desktopVersion": "26.1007.21434",
163
- "guiAcceptance": "user-pending"
164
- }
157
+ "kind": "verified-i18n-repair",
158
+ "repairWindowsI18n": true,
159
+ "sourceVersion": "0.2.1"
165
160
  },
166
161
  "win32-x64": {
167
- "darwin-arm64": {
168
- "sourceRelease": "own-v0.1.0"
169
- },
170
- "win32-x64": {
171
- "kind": "prepared-independent-build",
172
- "desktopVersion": "26.1007.21434",
173
- "guiAcceptance": "user-pending"
174
- }
162
+ "kind": "verified-i18n-repair",
163
+ "repairWindowsI18n": true,
164
+ "sourceVersion": "0.2.1"
175
165
  }
176
166
  }
177
167
  }
package/release.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": 2,
3
3
  "repository": "petercjl/codex-own",
4
- "version": "0.2.0",
4
+ "version": "0.2.2",
5
5
  "platforms": {
6
6
  "darwin-arm64": {
7
7
  "entry": "codex-own.app",
@@ -54,81 +54,71 @@
54
54
  },
55
55
  "win32-x64": {
56
56
  "entry": "app",
57
- "size": 920368892,
58
- "sha256": "f110a1e7e0f7c1e184ccc8733674d00280ecae02762530b07ca3b7d2547a4259",
57
+ "size": 919583599,
58
+ "sha256": "cec7d992c9a2f2aae19ac24b43ba6a5c64d07a3eeabf82633bc3a680789f0e01",
59
59
  "parts": [
60
60
  {
61
- "sha256": "f10bf3a916546c9b8d334b9bed9da2688cf48629aaa677b6b1265721ef695f09",
61
+ "sha256": "b4fffc930f64c0229fca0d882e1f5b41f1c7e06fbd500dae937078083a4e9659",
62
62
  "size": 134217728,
63
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hf10bf3a916546c9b8d334b9bed9da2688cf48629aaa677b6b1265721ef695f09.tgz",
64
- "archiveSize": 134146498,
65
- "archiveSha256": "cca9d9844548e9ada4d332be0620a248d20460c62b549faa3cb27532b1360ac9"
63
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hb4fffc930f64c0229fca0d882e1f5b41f1c7e06fbd500dae937078083a4e9659.tgz",
64
+ "archiveSize": 134172879,
65
+ "archiveSha256": "4a47ef63b0906d5b6414713c33158e065e6ede4338e27a2815447981d01f56d1"
66
66
  },
67
67
  {
68
- "sha256": "1c4eb544a87dae8072fbf6cfced05aba0c128be51ee59c1ba8a29ee1e06c2bb3",
68
+ "sha256": "5995fee8dc2495440d09ac2f55310c8511d2e4d2e0490b957e351257b85f2934",
69
69
  "size": 134217728,
70
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h1c4eb544a87dae8072fbf6cfced05aba0c128be51ee59c1ba8a29ee1e06c2bb3.tgz",
71
- "archiveSize": 134017345,
72
- "archiveSha256": "be3663292e80e953f48f2d3b59d93ea6030f78b411eca2333ff66c9b623f3e81"
70
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h5995fee8dc2495440d09ac2f55310c8511d2e4d2e0490b957e351257b85f2934.tgz",
71
+ "archiveSize": 133982893,
72
+ "archiveSha256": "17911fdd94f7809041f0aeb9fcd7851c256d0b85707d11986dc4630276490389"
73
73
  },
74
74
  {
75
- "sha256": "96515fb363ccdfd35cabccb0c6c80d7377c07a17d546cb3dcd0e9995abdc52e3",
75
+ "sha256": "e60ec278e8b741ffecd9c06b1275e42e001050123a0b366181f6e013447de8fd",
76
76
  "size": 134217728,
77
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h96515fb363ccdfd35cabccb0c6c80d7377c07a17d546cb3dcd0e9995abdc52e3.tgz",
78
- "archiveSize": 134217117,
79
- "archiveSha256": "b992e7d853bc0ee32acc4416b670238362473e91bb0cd0bb49b57d7a1431da30"
77
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.he60ec278e8b741ffecd9c06b1275e42e001050123a0b366181f6e013447de8fd.tgz",
78
+ "archiveSize": 134212766,
79
+ "archiveSha256": "f2dc5d39ac6f36d7ef1541e171ac8889bc4a11026381a6c4c90af57660f7ed1c"
80
80
  },
81
81
  {
82
- "sha256": "c72e99cd0a9b99fc023bfc53da528b16fcff89d9d11aa8ffb7cffe163ce15ac2",
82
+ "sha256": "9b6c9383abcab326115dfbb8d81780d918c9529444dbab236732ce544f8136c1",
83
83
  "size": 134217728,
84
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hc72e99cd0a9b99fc023bfc53da528b16fcff89d9d11aa8ffb7cffe163ce15ac2.tgz",
85
- "archiveSize": 134037874,
86
- "archiveSha256": "b7f72914ae410ca59d0f23038765683d096564f9a982880eeaaa2612121e9d98"
84
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h9b6c9383abcab326115dfbb8d81780d918c9529444dbab236732ce544f8136c1.tgz",
85
+ "archiveSize": 134036582,
86
+ "archiveSha256": "9c127af49140afc8119ca6a935f26fc1469f20467abc78b656e15b1811846938"
87
87
  },
88
88
  {
89
- "sha256": "4cdd4bb887ae5046cac17eb6b6f197f0fc74d8d6f6cc7548d74d45a099c71f00",
89
+ "sha256": "1b10c0d8a0b6c67ac85ccacf0ae374eade36d2e32371214296dc800032b1bc1f",
90
90
  "size": 134217728,
91
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h4cdd4bb887ae5046cac17eb6b6f197f0fc74d8d6f6cc7548d74d45a099c71f00.tgz",
92
- "archiveSize": 133901929,
93
- "archiveSha256": "51510b54827188f5957eb2814795e1d1fe9c5abb8cbe753715a87e3c666a5dc4"
91
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h1b10c0d8a0b6c67ac85ccacf0ae374eade36d2e32371214296dc800032b1bc1f.tgz",
92
+ "archiveSize": 133798951,
93
+ "archiveSha256": "3aaedeb6333318ce2de8bbef2795d868db917c3098d3fcd0922840c5f4daaebe"
94
94
  },
95
95
  {
96
- "sha256": "27eb58e92a273dac2abfad90fb5493634993f3c5f60249ac0074fadbfe93a7a3",
96
+ "sha256": "cc07c5fdc24fbc3855564e88dd00cff2f2ed3caec27a7e6002d91d6906a4e424",
97
97
  "size": 134217728,
98
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h27eb58e92a273dac2abfad90fb5493634993f3c5f60249ac0074fadbfe93a7a3.tgz",
99
- "archiveSize": 133616572,
100
- "archiveSha256": "651d527dac76787fd19459804e1dac9957df897be44098f49085bb26035fa0de"
98
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hcc07c5fdc24fbc3855564e88dd00cff2f2ed3caec27a7e6002d91d6906a4e424.tgz",
99
+ "archiveSize": 133729271,
100
+ "archiveSha256": "d1e8863c7a286d0d824e50e510f3073baf29533e6f8daa10d5ade434bde93ab0"
101
101
  },
102
102
  {
103
- "sha256": "b38a0db220f90da06049e05516387bffdfa0f3b3fd2e9106bc2a04135d0b4779",
104
- "size": 115062524,
105
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hb38a0db220f90da06049e05516387bffdfa0f3b3fd2e9106bc2a04135d0b4779.tgz",
106
- "archiveSize": 114529446,
107
- "archiveSha256": "8cba55fc4c9b3592ef80601ba8f65881720c26de0b5d8ae4d589ebb6bb4771fe"
103
+ "sha256": "3a82f5a5807221847a0f200dceaccfc94076afc7735fa7a2f6b7b0d28741a264",
104
+ "size": 114277231,
105
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h3a82f5a5807221847a0f200dceaccfc94076afc7735fa7a2f6b7b0d28741a264.tgz",
106
+ "archiveSize": 113734286,
107
+ "archiveSha256": "d142a464e09627569fac57546b7c8980e97ebac158f5f586d76bf4dc2c0fc695"
108
108
  }
109
109
  ]
110
110
  }
111
111
  },
112
112
  "provenance": {
113
113
  "darwin-arm64": {
114
- "darwin-arm64": {
115
- "sourceRelease": "own-v0.1.0"
116
- },
117
- "win32-x64": {
118
- "kind": "prepared-independent-build",
119
- "desktopVersion": "26.1007.21434",
120
- "guiAcceptance": "user-pending"
121
- }
114
+ "kind": "verified-i18n-repair",
115
+ "repairWindowsI18n": true,
116
+ "sourceVersion": "0.2.1"
122
117
  },
123
118
  "win32-x64": {
124
- "darwin-arm64": {
125
- "sourceRelease": "own-v0.1.0"
126
- },
127
- "win32-x64": {
128
- "kind": "prepared-independent-build",
129
- "desktopVersion": "26.1007.21434",
130
- "guiAcceptance": "user-pending"
131
- }
119
+ "kind": "verified-i18n-repair",
120
+ "repairWindowsI18n": true,
121
+ "sourceVersion": "0.2.1"
132
122
  }
133
123
  }
134
124
  }
@@ -29,3 +29,5 @@ For installation-only acceptance, verify doctor, version, target and shortcut wi
29
29
  - Manage this bundled Skill through `skill status/install/update --agent codex|sealseek`. For another Agent use its configured `--target-root`, not a guessed path. Unknown existing Skill targets are refused, managed updates retain backups and customized UI metadata.
30
30
 
31
31
  The portable contract uses a terminal that can invoke the same CLI on either Agent. Agent-specific scheduling and publication are repository operations, outside ordinary installation. Runtime must not rewrite its own source. A recurring failure belongs in an authorized implementation/test change.
32
+
33
+ Downloads use at most four parallel npm payload requests, label progress by part, preserve archive order, and cancel active peer downloads on failure.