@petercjl/codex-own 0.2.2 → 0.3.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/README.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  独立桌面应用的 npm 安装与更新工具。支持 Mac ARM64 和 Windows x64。管理工具和桌面资源均从 npm 下载。
4
4
 
5
+ ## 应用内更新
6
+
7
+ 带有 npm 更新组件的桌面版本会在启动 15 秒后、以及运行期间每 6 小时检查稳定版。也可以打开菜单“更新 → 检查 codex-own 更新…”。发现新版后点击“下载更新”,下载期间可以继续使用 App。下载完成后结束正在运行的任务,点击“重启并安装”;更新进程会等待 App 退出,备份程序及独立数据,再安装并重新打开。
8
+
9
+ 日常应用内更新使用随 App 交付的更新组件,无需手动更新全局 npm 管理工具。API Key、配置、对话和语言偏好会保留。断网时当前 App 保持可用;下载失败可以重试,已校验分片会复用;已准备好的更新会在下次打开时恢复。旧版本首次升级到带更新组件的版本,以及故障恢复,可以使用下文的终端更新命令。
10
+
5
11
  ## 在 Mac 上通过 Terminal 安装和更新
6
12
 
7
13
  适用于 Apple 芯片 Mac(ARM64)。从 Node.js 官网安装 LTS 版本(要求 Node.js 22 或以上,包含 npm),重新打开 Terminal。建议预留 10 GB 空间,用于下载、解压和备份。
package/capabilities.json CHANGED
@@ -19,7 +19,7 @@
19
19
  "win32-x64": "implemented"
20
20
  },
21
21
  "dataPolicy": "independent external directories; preserve credentials and conversations",
22
- "updatePolicy": "explicit update; pinned verified build; refuse running app; backup before switch; restore data snapshot for rollback",
22
+ "updatePolicy": "desktop checks npm latest at startup and every six hours; explicit download and restart/install; pinned verified build; backup before switch; CLI remains available for recovery",
23
23
  "authentication": "npm install does not grant model access; existing independent credentials remain local",
24
24
  "distribution": {
25
25
  "runtimeHosts": [
@@ -31,5 +31,16 @@
31
31
  "idleTimeoutSeconds": 30,
32
32
  "downloadAttempts": 3,
33
33
  "parallelDownloads": 4
34
+ },
35
+ "desktopUpdater": {
36
+ "source": "https://registry.npmjs.org/@petercjl%2fcodex-own/latest",
37
+ "channel": "latest",
38
+ "checkOnStartupSeconds": 15,
39
+ "checkIntervalHours": 6,
40
+ "download": "explicit user click; verified chunks cached; current app remains usable",
41
+ "install": "explicit restart confirmation; copied standalone helper waits for app exit; backup and transactional switch",
42
+ "runtime": "bundled standalone Node; no global npm upgrade required",
43
+ "menu": "更新 → 检查 codex-own 更新…",
44
+ "offline": "current installation remains usable; manual retry; verified prepared update survives restart"
34
45
  }
35
46
  }
@@ -0,0 +1,71 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import {latest,manifestFor,validateManifest,paths,state,locked,rejectLinks,exclusive,digestFile,tarExecutable,install,fail,running,launch} from './manager.mjs';
4
+ import {assembleNpmAsset} from './npm-assets.mjs';
5
+
6
+ // Desktop release versions use the stable npm channel, independently of upstream's app version.
7
+ export function isNewer(candidate,current) {
8
+ const parse=v=>/^\d+\.\d+\.\d+$/.test(v||'')?v.split('.').map(Number):null;
9
+ const a=parse(candidate),b=parse(current);
10
+ if(!a||!b)fail('INVALID_VERSION','Expected stable desktop release versions');
11
+ for(let i=0;i<3;i++){if(a[i]!==b[i])return a[i]>b[i];}return false;
12
+ }
13
+ export async function checkUpdate(current,{resolve=latest,manifest=manifestFor,p=paths()}={}) {
14
+ const available=await resolve();
15
+ const updateAvailable=isNewer(available,current);
16
+ if(updateAvailable){const m=await manifest(available);if(m.schema!==2)fail('NPM_ASSETS_REQUIRED','This update is not distributed through npm');if(m.version!==available)fail('INVALID_MANIFEST','Manifest version does not match npm');validateManifest(m,p.platform);}
17
+ return {ok:true,current,available,updateAvailable};
18
+ }
19
+ export async function prepareUpdate(current,{p=paths(),resolve=latest,manifest=manifestFor,assemble=assembleNpmAsset,report=()=>{},signal}={}) {
20
+ return locked(p,async()=>{
21
+ if(state(p)?.version!==current)fail('UNMANAGED_TARGET','The running desktop must match its managed installation');
22
+ const checked=await checkUpdate(current,{resolve,manifest,p});
23
+ if(!checked.updateAvailable)return {...checked,unchanged:true};
24
+ const m=await manifest(checked.available),asset=validateManifest(m,p.platform);
25
+ if(m.schema!==2||m.version!==checked.available)fail('INVALID_MANIFEST','Unexpected desktop manifest');
26
+ const base=path.join(p.manager,'prepared');rejectLinks(base);fs.mkdirSync(base,{recursive:true,mode:0o700});
27
+ const dir=fs.mkdtempSync(path.join(base,'update-')),archive=path.join(dir,'desktop.tar.gz');
28
+ const cache=path.join(p.manager,'npm-assets');rejectLinks(cache);
29
+ try{
30
+ await assemble(asset,archive,cache,tarExecutable(),{report,signal});
31
+ // Verify even when a download adapter is supplied.
32
+ if(fs.statSync(archive).size!==asset.size||await digestFile(archive)!==asset.sha256)fail('CHECKSUM_MISMATCH','Prepared update checksum mismatch');
33
+ const receipt=path.join(dir,'receipt.json');
34
+ exclusive(receipt,{schema:1,current,version:m.version,platform:p.platform,manifest:m});
35
+ return {...checked,receipt};
36
+ }catch(e){fs.rmSync(dir,{recursive:true,force:true});throw e;}
37
+ });
38
+ }
39
+ export function readPrepared(receipt,p=paths()) {
40
+ const base=path.join(p.manager,'prepared');rejectLinks(receipt);
41
+ if(path.basename(receipt)!=='receipt.json'||path.dirname(path.dirname(path.resolve(receipt)))!==path.resolve(base))fail('UNSAFE_PATH','Unexpected update receipt');
42
+ const r=JSON.parse(fs.readFileSync(receipt,'utf8'));
43
+ if(r.schema!==1||r.platform!==p.platform||r.version!==r.manifest?.version||r.manifest?.schema!==2||!isNewer(r.version,r.current))fail('INVALID_MANIFEST','Invalid prepared update');
44
+ validateManifest(r.manifest,p.platform);
45
+ return {...r,archive:path.join(path.dirname(receipt),'desktop.tar.gz')};
46
+ }
47
+ export async function applyPrepared(receipt,{p=paths(),apply=install}={}) {
48
+ const r=readPrepared(receipt,p);
49
+ return apply({version:r.version,manifest:r.manifest,archive:r.archive,expectedCurrent:r.current});
50
+ }
51
+ export async function restorePrepared(current,p=paths()) {
52
+ const base=path.join(p.manager,'prepared');rejectLinks(base);
53
+ if(!fs.existsSync(base))return null;
54
+ const candidates=[];
55
+ for(const name of fs.readdirSync(base).filter(n=>/^update-[a-zA-Z0-9]+$/.test(n))){
56
+ const receipt=path.join(base,name,'receipt.json');
57
+ try{const r=readPrepared(receipt,p);if(r.current===current&&fs.statSync(r.archive).size===validateManifest(r.manifest,p.platform).size&&await digestFile(r.archive)===validateManifest(r.manifest,p.platform).sha256)candidates.push({ok:true,current,available:r.version,updateAvailable:true,receipt});}catch{}
58
+ }
59
+ return candidates.sort((a,b)=>isNewer(a.available,b.available)?-1:isNewer(b.available,a.available)?1:0)[0]||null;
60
+ }
61
+ export async function waitForExit({isRunning=running,timeoutMs=120000,intervalMs=500,sleep=ms=>new Promise(r=>setTimeout(r,ms))}={}) {
62
+ const end=Date.now()+timeoutMs;
63
+ while(isRunning().length){if(Date.now()>=end)fail('APP_RUNNING','The app did not quit; the current installation was preserved');await sleep(intervalMs);}
64
+ }
65
+ export async function finishUpdate(receipt,{wait=waitForExit,apply=applyPrepared,restart=launch}={}) {
66
+ await wait(); // Never force-kill a user task or the original Codex.
67
+ let result;
68
+ try{result=await apply(receipt);}catch(e){try{restart();}catch{}throw e;}
69
+ // Installation success and launch success are separate outcomes.
70
+ try{return {...result,restarted:true,launch:restart()};}catch{return {...result,restarted:false};}
71
+ }
package/lib/manager.mjs CHANGED
@@ -95,10 +95,11 @@ export async function configure(keyFile){if(!keyFile)fail('KEY_FILE_REQUIRED','P
95
95
  const auth=path.join(p.core,'auth.json');rejectLinks(auth);let backup=null;if(fs.existsSync(auth)){backup=auth+'.backup-'+crypto.randomUUID();fs.copyFileSync(auth,backup,fs.constants.COPYFILE_EXCL);fs.chmodSync(backup,0o600);}const tmp=auth+'.new-'+crypto.randomUUID();exclusive(tmp,{auth_mode:'apikey',OPENAI_API_KEY:key});fs.renameSync(tmp,auth);
96
96
  const models=path.join(p.core,'models.json');if(!fs.existsSync(models))fs.copyFileSync(path.join(packageRoot,'defaults','models.json'),models,fs.constants.COPYFILE_EXCL);
97
97
  const config=path.join(p.core,'config.toml');if(!fs.existsSync(config))fs.writeFileSync(config,`model = "deepseek-v4.1-flash"\nmodel_provider = "dashscope_deepseek"\nforced_login_method = "api"\ncli_auth_credentials_store = "file"\nmodel_catalog_json = ${JSON.stringify(models.replaceAll('\\','/'))}\nmodel_reasoning_effort = "high"\nweb_search = "disabled"\n[model_providers.dashscope_deepseek]\nname = "DeepSeek-DashScope"\nbase_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"\nwire_api = "responses"\nrequires_openai_auth = true\n`,{flag:'wx',mode:0o600});return {ok:true,configured:true,backup,configPreserved:true};});}
98
- export async function install({version,adopt=false,archive,manifest}={}) {
98
+ export async function install({version,adopt=false,archive,manifest,expectedCurrent}={}) {
99
99
  const p=paths();if(!['darwin-arm64','win32-x64'].includes(p.platform))fail('UNSUPPORTED_PLATFORM',p.platform);
100
100
  progress('准备安装:检查版本、平台与独立目录');
101
101
  return locked(p,async()=>{const m=manifest||await manifestFor(version||pkg.version);const a=validateManifest(m,p.platform);
102
+ if(expectedCurrent!==undefined&&state(p)?.version!==expectedCurrent)fail('INSTALLATION_CHANGED','Installation changed after the update was prepared; check again');
102
103
  if(state(p)?.version===m.version&&!archive)return {ok:true,unchanged:true,version:m.version};
103
104
  if(running(p).length)fail('APP_RUNNING','Quit codex-own before install/update');
104
105
  const stage=fs.mkdtempSync(path.join(p.manager,'stage-'));let f=archive;
@@ -24,11 +24,14 @@ 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, concurrency = 4} = {}) {
27
+ export async function assembleNpmAsset(asset, dest, cache, tar, {download = verifiedDownload, report = progress, concurrency = 4,signal} = {}) {
28
28
  validateParts(asset);
29
29
  fs.mkdirSync(cache, {recursive:true, mode:0o700});
30
30
  if (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > 4) throw new Error('Invalid download concurrency');
31
31
  const controller = new AbortController();
32
+ const cancel=()=>controller.abort();signal?.addEventListener('abort',cancel,{once:true});
33
+ if(signal?.aborted)controller.abort();
34
+ try{
32
35
  async function fetchPart(part, i) {
33
36
  report(`npm 资源分片 ${i+1}/${asset.parts.length}`);
34
37
  const file = path.join(cache, `${part.sha256}.bin`);
@@ -61,11 +64,13 @@ export async function assembleNpmAsset(asset, dest, cache, tar, {download = veri
61
64
  }
62
65
  await Promise.allSettled(Array.from({length:Math.min(concurrency,unique.length)},worker));
63
66
  if(failure)throw failure;
67
+ if(controller.signal.aborted)throw Object.assign(Error('Download cancelled'),{code:'CANCELLED'});
64
68
  const files=asset.parts.map(part=>completed.get(part.sha256));
65
69
  report('合并并校验完整桌面安装包');
66
70
  const output = fs.createWriteStream(dest, {flags:'wx',mode:0o600});
67
71
  async function* chunks() { for (const f of files) yield* fs.createReadStream(f); }
68
- await pipeline(chunks(), output);
72
+ await pipeline(chunks(), output,{signal:controller.signal});
69
73
  if (fs.statSync(dest).size !== asset.size || await fileHash(dest) !== asset.sha256)
70
74
  throw Object.assign(new Error('Assembled desktop checksum mismatch'), {code:'CHECKSUM_MISMATCH'});
75
+ }finally{signal?.removeEventListener('abort',cancel);}
71
76
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@petercjl/codex-own",
3
- "version": "0.2.2",
3
+ "version": "0.3.0",
4
4
  "description": "Independent codex-own desktop installation and update manager",
5
5
  "type": "module",
6
6
  "bin": {
@@ -44,124 +44,138 @@
44
44
  "ownDesktopManifest": {
45
45
  "schema": 2,
46
46
  "repository": "petercjl/codex-own",
47
- "version": "0.2.2",
47
+ "version": "0.3.0",
48
48
  "platforms": {
49
49
  "darwin-arm64": {
50
50
  "entry": "codex-own.app",
51
- "size": 781692456,
52
- "sha256": "6512d6d2e8ef46f64339ca1233fe833a067329cf006b17b3a0aa1bd27fd8e457",
51
+ "size": 823001243,
52
+ "sha256": "eab56a9de3b5b8e799756e8c0db435de34760b73202b7e1b4982e5cc9d781caa",
53
53
  "parts": [
54
54
  {
55
- "sha256": "c7fe9284f617e60fdebbedc2b551d59a021f3c03249e11224d15720ce90d968e",
55
+ "sha256": "9d006bfa7d79badc73e5f24e5b46a110f2a3a8f2827dedf435191f962b82a3a4",
56
56
  "size": 134217728,
57
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hc7fe9284f617e60fdebbedc2b551d59a021f3c03249e11224d15720ce90d968e.tgz",
58
- "archiveSize": 134068421,
59
- "archiveSha256": "7692f1071c0ed3a3c1937e00824815dfd50710a1bf16ff45b7ef54e3fc63a7da"
57
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h9d006bfa7d79badc73e5f24e5b46a110f2a3a8f2827dedf435191f962b82a3a4.tgz",
58
+ "archiveSize": 134070211,
59
+ "archiveSha256": "75140a2f6e77ff7b5f87e98998efa5faa88729ae00f61d01d6fab77d0a5a61f7"
60
60
  },
61
61
  {
62
- "sha256": "7ff2d11fbccf0d6f53b46eb0f62f12a399440640b4443a7770dab0e2aed07c86",
62
+ "sha256": "985218ae3804c4911a363210901867a4f36362190d62e42a64059305698ac18f",
63
63
  "size": 134217728,
64
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h7ff2d11fbccf0d6f53b46eb0f62f12a399440640b4443a7770dab0e2aed07c86.tgz",
65
- "archiveSize": 134125467,
66
- "archiveSha256": "dab67fa0d1e9ea1ce11414cc1f90175513e7cd433c530fb94bf3e02075da97aa"
64
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h985218ae3804c4911a363210901867a4f36362190d62e42a64059305698ac18f.tgz",
65
+ "archiveSize": 134127781,
66
+ "archiveSha256": "de7860aefafe40e425440b3d8b5374109bfba08a496717818c4f0039b4e0b087"
67
67
  },
68
68
  {
69
- "sha256": "e3bc7bf7a8857fd325ba5a6c328a8ec15701a87c623d08f2c66565736a8b2125",
69
+ "sha256": "7fd5f1626df9ae6ea23ab980246ff0aecad637fd960ecc457578399f9d71e0aa",
70
70
  "size": 134217728,
71
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.he3bc7bf7a8857fd325ba5a6c328a8ec15701a87c623d08f2c66565736a8b2125.tgz",
72
- "archiveSize": 134200688,
73
- "archiveSha256": "8dd17509eee96f46e48b9dca3ef798df2b78ca1ad8d63f4cf914a6e6cfdff587"
71
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h7fd5f1626df9ae6ea23ab980246ff0aecad637fd960ecc457578399f9d71e0aa.tgz",
72
+ "archiveSize": 134204275,
73
+ "archiveSha256": "61fe1de2b17dea3b782bff2a5c9568940922e146f086bd55623bac9dbff29abc"
74
74
  },
75
75
  {
76
- "sha256": "206c25d0e17fee0419b7d498b223e43a12a11a367fddef9ba7ceea5f8d031c4a",
76
+ "sha256": "71225dffca06f8ac21bf44e9c5a2917db2868b8852309664b4b865830122190c",
77
77
  "size": 134217728,
78
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h206c25d0e17fee0419b7d498b223e43a12a11a367fddef9ba7ceea5f8d031c4a.tgz",
79
- "archiveSize": 133964876,
80
- "archiveSha256": "013d7c22e993e2375f2ebac83954bb66c6b9e1e58ea62fea80339b4262922b62"
78
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h71225dffca06f8ac21bf44e9c5a2917db2868b8852309664b4b865830122190c.tgz",
79
+ "archiveSize": 133976798,
80
+ "archiveSha256": "55557635ddb68309132bb934876c1e2e3780c3c3ce541272f8272c0e0881f510"
81
81
  },
82
82
  {
83
- "sha256": "1e91bfbc20b3140e1f5770aaa732dcda1242a254bcd30b5d7c5cd1f350bc55fc",
83
+ "sha256": "e44dfaf0aa2c16b51de40c451b24172c47768d4a063c9841a5216fedd57d0a00",
84
84
  "size": 134217728,
85
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h1e91bfbc20b3140e1f5770aaa732dcda1242a254bcd30b5d7c5cd1f350bc55fc.tgz",
86
- "archiveSize": 133524640,
87
- "archiveSha256": "ab6368325f52c53f437dfdf774a13d24bf82c7c1102b3b4e588004cd850f3411"
85
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.he44dfaf0aa2c16b51de40c451b24172c47768d4a063c9841a5216fedd57d0a00.tgz",
86
+ "archiveSize": 133316661,
87
+ "archiveSha256": "de4998ec79938c571df9d3867c1de97c3293658f8b7ed3e7a5d941c9f4254082"
88
88
  },
89
89
  {
90
- "sha256": "1ab437b67cd09e7d3551ca659f41e7bfd984e7c763023d3b0575fa33f8be892a",
91
- "size": 110603816,
92
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h1ab437b67cd09e7d3551ca659f41e7bfd984e7c763023d3b0575fa33f8be892a.tgz",
93
- "archiveSize": 110416084,
94
- "archiveSha256": "0e0f0c34bf12238e6b737c90369aa014a70d70250dba37ccf9ebffd4c5af96a0"
90
+ "sha256": "c39739a6f8f6f5f3d167bb5edb49c0ebbe21a8c22a88abec2220ab0e6431058f",
91
+ "size": 134217728,
92
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hc39739a6f8f6f5f3d167bb5edb49c0ebbe21a8c22a88abec2220ab0e6431058f.tgz",
93
+ "archiveSize": 133861772,
94
+ "archiveSha256": "4f681e0ad56e5be418162d2de2708491f77c96b5875d0ef24c34fec8716c5c33"
95
+ },
96
+ {
97
+ "sha256": "093bf40cd85b78dd7ef32d1ec5123c3b4771f0a221de5928db64e396623cc8e7",
98
+ "size": 17694875,
99
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h093bf40cd85b78dd7ef32d1ec5123c3b4771f0a221de5928db64e396623cc8e7.tgz",
100
+ "archiveSize": 17635943,
101
+ "archiveSha256": "d387a82628dc20d43ad5b0f93f58eca2054ee081850e6671f442451fdc6d8983"
95
102
  }
96
103
  ]
97
104
  },
98
105
  "win32-x64": {
99
106
  "entry": "app",
100
- "size": 919583599,
101
- "sha256": "cec7d992c9a2f2aae19ac24b43ba6a5c64d07a3eeabf82633bc3a680789f0e01",
107
+ "size": 954933634,
108
+ "sha256": "f47c73c039632f759a10f40a1ccba7eb75e1d205aa8f245b0cd7c6b5e460389f",
102
109
  "parts": [
103
110
  {
104
- "sha256": "b4fffc930f64c0229fca0d882e1f5b41f1c7e06fbd500dae937078083a4e9659",
111
+ "sha256": "851ecf90528365bb7b9a49e4f643eaf83ccdcda289c8031cfb89aed0acfa8389",
112
+ "size": 134217728,
113
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h851ecf90528365bb7b9a49e4f643eaf83ccdcda289c8031cfb89aed0acfa8389.tgz",
114
+ "archiveSize": 134172878,
115
+ "archiveSha256": "72918fc7121785581029885c079a94748485ec9bc37acbb10d7735f77f5729e3"
116
+ },
117
+ {
118
+ "sha256": "e10c649f89f877f71831273b60235b84f681467cbfcaa8b51c4889bd22693e00",
105
119
  "size": 134217728,
106
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hb4fffc930f64c0229fca0d882e1f5b41f1c7e06fbd500dae937078083a4e9659.tgz",
107
- "archiveSize": 134172879,
108
- "archiveSha256": "4a47ef63b0906d5b6414713c33158e065e6ede4338e27a2815447981d01f56d1"
120
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.he10c649f89f877f71831273b60235b84f681467cbfcaa8b51c4889bd22693e00.tgz",
121
+ "archiveSize": 133977679,
122
+ "archiveSha256": "402df042eff6fb3ae4ed2410fdc836b714e0a23b35be44bad332005ba08a357d"
109
123
  },
110
124
  {
111
- "sha256": "5995fee8dc2495440d09ac2f55310c8511d2e4d2e0490b957e351257b85f2934",
125
+ "sha256": "5f709cdad5f91d9929b5fef1352cfdb403ef59e4f9922044fc4a3c391d7189d7",
112
126
  "size": 134217728,
113
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h5995fee8dc2495440d09ac2f55310c8511d2e4d2e0490b957e351257b85f2934.tgz",
114
- "archiveSize": 133982893,
115
- "archiveSha256": "17911fdd94f7809041f0aeb9fcd7851c256d0b85707d11986dc4630276490389"
127
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h5f709cdad5f91d9929b5fef1352cfdb403ef59e4f9922044fc4a3c391d7189d7.tgz",
128
+ "archiveSize": 134212490,
129
+ "archiveSha256": "02f60aa9a8ee7d8bc8335b5ca6148cad4f16146d8473f003c3fa46f1c590df6e"
116
130
  },
117
131
  {
118
- "sha256": "e60ec278e8b741ffecd9c06b1275e42e001050123a0b366181f6e013447de8fd",
132
+ "sha256": "7590edf2d36b5f374f1727ae0d574530c0c6d2edb5265839f016d45c7e459c2b",
119
133
  "size": 134217728,
120
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.he60ec278e8b741ffecd9c06b1275e42e001050123a0b366181f6e013447de8fd.tgz",
121
- "archiveSize": 134212766,
122
- "archiveSha256": "f2dc5d39ac6f36d7ef1541e171ac8889bc4a11026381a6c4c90af57660f7ed1c"
134
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h7590edf2d36b5f374f1727ae0d574530c0c6d2edb5265839f016d45c7e459c2b.tgz",
135
+ "archiveSize": 134032141,
136
+ "archiveSha256": "877fdc8c4095e5cbf54d041a55974771059e2cd7426035cb5c868e238d669ac6"
123
137
  },
124
138
  {
125
- "sha256": "9b6c9383abcab326115dfbb8d81780d918c9529444dbab236732ce544f8136c1",
139
+ "sha256": "19a103e9012b91c3424be82c2fd94c1c5680214e69ec897fa5029258242bfa59",
126
140
  "size": 134217728,
127
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h9b6c9383abcab326115dfbb8d81780d918c9529444dbab236732ce544f8136c1.tgz",
128
- "archiveSize": 134036582,
129
- "archiveSha256": "9c127af49140afc8119ca6a935f26fc1469f20467abc78b656e15b1811846938"
141
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h19a103e9012b91c3424be82c2fd94c1c5680214e69ec897fa5029258242bfa59.tgz",
142
+ "archiveSize": 133801432,
143
+ "archiveSha256": "b8c54adadaa5397e873ccf37b3b6240e5728fc7757151d99df74f5cabc93d5d7"
130
144
  },
131
145
  {
132
- "sha256": "1b10c0d8a0b6c67ac85ccacf0ae374eade36d2e32371214296dc800032b1bc1f",
146
+ "sha256": "7a5924ee9646a505a7b767b5247d49538e76e9f4b1ab5577e185595af1280946",
133
147
  "size": 134217728,
134
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h1b10c0d8a0b6c67ac85ccacf0ae374eade36d2e32371214296dc800032b1bc1f.tgz",
135
- "archiveSize": 133798951,
136
- "archiveSha256": "3aaedeb6333318ce2de8bbef2795d868db917c3098d3fcd0922840c5f4daaebe"
148
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h7a5924ee9646a505a7b767b5247d49538e76e9f4b1ab5577e185595af1280946.tgz",
149
+ "archiveSize": 133721025,
150
+ "archiveSha256": "04c0761ad0e4257d3202ccbabede1545ec5c30b3569c9774cfbe945b58636e69"
137
151
  },
138
152
  {
139
- "sha256": "cc07c5fdc24fbc3855564e88dd00cff2f2ed3caec27a7e6002d91d6906a4e424",
153
+ "sha256": "4ea5c3c4d3545f9a6c169318402d066c015f528d3543b842cfe1c1d8a03fdb58",
140
154
  "size": 134217728,
141
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hcc07c5fdc24fbc3855564e88dd00cff2f2ed3caec27a7e6002d91d6906a4e424.tgz",
142
- "archiveSize": 133729271,
143
- "archiveSha256": "d1e8863c7a286d0d824e50e510f3073baf29533e6f8daa10d5ade434bde93ab0"
155
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h4ea5c3c4d3545f9a6c169318402d066c015f528d3543b842cfe1c1d8a03fdb58.tgz",
156
+ "archiveSize": 133452661,
157
+ "archiveSha256": "b5a22c77f0778997704ad5f2c6a23249a446c454a9242cfc49f8b29e05c9242b"
144
158
  },
145
159
  {
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"
160
+ "sha256": "df9a45b05208bb3098cc620c838877562d9c3573b72ad90e54353ec86b62a16a",
161
+ "size": 15409538,
162
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hdf9a45b05208bb3098cc620c838877562d9c3573b72ad90e54353ec86b62a16a.tgz",
163
+ "archiveSize": 15407373,
164
+ "archiveSha256": "4b96afcb960c722dc40f34ebda487a671a849c5c5a42f6305864efc3e6c3c54f"
151
165
  }
152
166
  ]
153
167
  }
154
168
  },
155
169
  "provenance": {
156
170
  "darwin-arm64": {
157
- "kind": "verified-i18n-repair",
158
- "repairWindowsI18n": true,
159
- "sourceVersion": "0.2.1"
171
+ "kind": "verified-own-overlay-upgrade",
172
+ "sourceVersion": "0.2.2",
173
+ "upgradeNpmUpdater": true
160
174
  },
161
175
  "win32-x64": {
162
- "kind": "verified-i18n-repair",
163
- "repairWindowsI18n": true,
164
- "sourceVersion": "0.2.1"
176
+ "kind": "verified-own-overlay-upgrade",
177
+ "sourceVersion": "0.2.2",
178
+ "upgradeNpmUpdater": true
165
179
  }
166
180
  }
167
181
  }
package/release.json CHANGED
@@ -1,124 +1,138 @@
1
1
  {
2
2
  "schema": 2,
3
3
  "repository": "petercjl/codex-own",
4
- "version": "0.2.2",
4
+ "version": "0.3.0",
5
5
  "platforms": {
6
6
  "darwin-arm64": {
7
7
  "entry": "codex-own.app",
8
- "size": 781692456,
9
- "sha256": "6512d6d2e8ef46f64339ca1233fe833a067329cf006b17b3a0aa1bd27fd8e457",
8
+ "size": 823001243,
9
+ "sha256": "eab56a9de3b5b8e799756e8c0db435de34760b73202b7e1b4982e5cc9d781caa",
10
10
  "parts": [
11
11
  {
12
- "sha256": "c7fe9284f617e60fdebbedc2b551d59a021f3c03249e11224d15720ce90d968e",
12
+ "sha256": "9d006bfa7d79badc73e5f24e5b46a110f2a3a8f2827dedf435191f962b82a3a4",
13
13
  "size": 134217728,
14
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hc7fe9284f617e60fdebbedc2b551d59a021f3c03249e11224d15720ce90d968e.tgz",
15
- "archiveSize": 134068421,
16
- "archiveSha256": "7692f1071c0ed3a3c1937e00824815dfd50710a1bf16ff45b7ef54e3fc63a7da"
14
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h9d006bfa7d79badc73e5f24e5b46a110f2a3a8f2827dedf435191f962b82a3a4.tgz",
15
+ "archiveSize": 134070211,
16
+ "archiveSha256": "75140a2f6e77ff7b5f87e98998efa5faa88729ae00f61d01d6fab77d0a5a61f7"
17
17
  },
18
18
  {
19
- "sha256": "7ff2d11fbccf0d6f53b46eb0f62f12a399440640b4443a7770dab0e2aed07c86",
19
+ "sha256": "985218ae3804c4911a363210901867a4f36362190d62e42a64059305698ac18f",
20
20
  "size": 134217728,
21
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h7ff2d11fbccf0d6f53b46eb0f62f12a399440640b4443a7770dab0e2aed07c86.tgz",
22
- "archiveSize": 134125467,
23
- "archiveSha256": "dab67fa0d1e9ea1ce11414cc1f90175513e7cd433c530fb94bf3e02075da97aa"
21
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h985218ae3804c4911a363210901867a4f36362190d62e42a64059305698ac18f.tgz",
22
+ "archiveSize": 134127781,
23
+ "archiveSha256": "de7860aefafe40e425440b3d8b5374109bfba08a496717818c4f0039b4e0b087"
24
24
  },
25
25
  {
26
- "sha256": "e3bc7bf7a8857fd325ba5a6c328a8ec15701a87c623d08f2c66565736a8b2125",
26
+ "sha256": "7fd5f1626df9ae6ea23ab980246ff0aecad637fd960ecc457578399f9d71e0aa",
27
27
  "size": 134217728,
28
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.he3bc7bf7a8857fd325ba5a6c328a8ec15701a87c623d08f2c66565736a8b2125.tgz",
29
- "archiveSize": 134200688,
30
- "archiveSha256": "8dd17509eee96f46e48b9dca3ef798df2b78ca1ad8d63f4cf914a6e6cfdff587"
28
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h7fd5f1626df9ae6ea23ab980246ff0aecad637fd960ecc457578399f9d71e0aa.tgz",
29
+ "archiveSize": 134204275,
30
+ "archiveSha256": "61fe1de2b17dea3b782bff2a5c9568940922e146f086bd55623bac9dbff29abc"
31
31
  },
32
32
  {
33
- "sha256": "206c25d0e17fee0419b7d498b223e43a12a11a367fddef9ba7ceea5f8d031c4a",
33
+ "sha256": "71225dffca06f8ac21bf44e9c5a2917db2868b8852309664b4b865830122190c",
34
34
  "size": 134217728,
35
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h206c25d0e17fee0419b7d498b223e43a12a11a367fddef9ba7ceea5f8d031c4a.tgz",
36
- "archiveSize": 133964876,
37
- "archiveSha256": "013d7c22e993e2375f2ebac83954bb66c6b9e1e58ea62fea80339b4262922b62"
35
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h71225dffca06f8ac21bf44e9c5a2917db2868b8852309664b4b865830122190c.tgz",
36
+ "archiveSize": 133976798,
37
+ "archiveSha256": "55557635ddb68309132bb934876c1e2e3780c3c3ce541272f8272c0e0881f510"
38
38
  },
39
39
  {
40
- "sha256": "1e91bfbc20b3140e1f5770aaa732dcda1242a254bcd30b5d7c5cd1f350bc55fc",
40
+ "sha256": "e44dfaf0aa2c16b51de40c451b24172c47768d4a063c9841a5216fedd57d0a00",
41
41
  "size": 134217728,
42
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h1e91bfbc20b3140e1f5770aaa732dcda1242a254bcd30b5d7c5cd1f350bc55fc.tgz",
43
- "archiveSize": 133524640,
44
- "archiveSha256": "ab6368325f52c53f437dfdf774a13d24bf82c7c1102b3b4e588004cd850f3411"
42
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.he44dfaf0aa2c16b51de40c451b24172c47768d4a063c9841a5216fedd57d0a00.tgz",
43
+ "archiveSize": 133316661,
44
+ "archiveSha256": "de4998ec79938c571df9d3867c1de97c3293658f8b7ed3e7a5d941c9f4254082"
45
45
  },
46
46
  {
47
- "sha256": "1ab437b67cd09e7d3551ca659f41e7bfd984e7c763023d3b0575fa33f8be892a",
48
- "size": 110603816,
49
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h1ab437b67cd09e7d3551ca659f41e7bfd984e7c763023d3b0575fa33f8be892a.tgz",
50
- "archiveSize": 110416084,
51
- "archiveSha256": "0e0f0c34bf12238e6b737c90369aa014a70d70250dba37ccf9ebffd4c5af96a0"
47
+ "sha256": "c39739a6f8f6f5f3d167bb5edb49c0ebbe21a8c22a88abec2220ab0e6431058f",
48
+ "size": 134217728,
49
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hc39739a6f8f6f5f3d167bb5edb49c0ebbe21a8c22a88abec2220ab0e6431058f.tgz",
50
+ "archiveSize": 133861772,
51
+ "archiveSha256": "4f681e0ad56e5be418162d2de2708491f77c96b5875d0ef24c34fec8716c5c33"
52
+ },
53
+ {
54
+ "sha256": "093bf40cd85b78dd7ef32d1ec5123c3b4771f0a221de5928db64e396623cc8e7",
55
+ "size": 17694875,
56
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h093bf40cd85b78dd7ef32d1ec5123c3b4771f0a221de5928db64e396623cc8e7.tgz",
57
+ "archiveSize": 17635943,
58
+ "archiveSha256": "d387a82628dc20d43ad5b0f93f58eca2054ee081850e6671f442451fdc6d8983"
52
59
  }
53
60
  ]
54
61
  },
55
62
  "win32-x64": {
56
63
  "entry": "app",
57
- "size": 919583599,
58
- "sha256": "cec7d992c9a2f2aae19ac24b43ba6a5c64d07a3eeabf82633bc3a680789f0e01",
64
+ "size": 954933634,
65
+ "sha256": "f47c73c039632f759a10f40a1ccba7eb75e1d205aa8f245b0cd7c6b5e460389f",
59
66
  "parts": [
60
67
  {
61
- "sha256": "b4fffc930f64c0229fca0d882e1f5b41f1c7e06fbd500dae937078083a4e9659",
68
+ "sha256": "851ecf90528365bb7b9a49e4f643eaf83ccdcda289c8031cfb89aed0acfa8389",
69
+ "size": 134217728,
70
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h851ecf90528365bb7b9a49e4f643eaf83ccdcda289c8031cfb89aed0acfa8389.tgz",
71
+ "archiveSize": 134172878,
72
+ "archiveSha256": "72918fc7121785581029885c079a94748485ec9bc37acbb10d7735f77f5729e3"
73
+ },
74
+ {
75
+ "sha256": "e10c649f89f877f71831273b60235b84f681467cbfcaa8b51c4889bd22693e00",
62
76
  "size": 134217728,
63
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hb4fffc930f64c0229fca0d882e1f5b41f1c7e06fbd500dae937078083a4e9659.tgz",
64
- "archiveSize": 134172879,
65
- "archiveSha256": "4a47ef63b0906d5b6414713c33158e065e6ede4338e27a2815447981d01f56d1"
77
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.he10c649f89f877f71831273b60235b84f681467cbfcaa8b51c4889bd22693e00.tgz",
78
+ "archiveSize": 133977679,
79
+ "archiveSha256": "402df042eff6fb3ae4ed2410fdc836b714e0a23b35be44bad332005ba08a357d"
66
80
  },
67
81
  {
68
- "sha256": "5995fee8dc2495440d09ac2f55310c8511d2e4d2e0490b957e351257b85f2934",
82
+ "sha256": "5f709cdad5f91d9929b5fef1352cfdb403ef59e4f9922044fc4a3c391d7189d7",
69
83
  "size": 134217728,
70
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h5995fee8dc2495440d09ac2f55310c8511d2e4d2e0490b957e351257b85f2934.tgz",
71
- "archiveSize": 133982893,
72
- "archiveSha256": "17911fdd94f7809041f0aeb9fcd7851c256d0b85707d11986dc4630276490389"
84
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h5f709cdad5f91d9929b5fef1352cfdb403ef59e4f9922044fc4a3c391d7189d7.tgz",
85
+ "archiveSize": 134212490,
86
+ "archiveSha256": "02f60aa9a8ee7d8bc8335b5ca6148cad4f16146d8473f003c3fa46f1c590df6e"
73
87
  },
74
88
  {
75
- "sha256": "e60ec278e8b741ffecd9c06b1275e42e001050123a0b366181f6e013447de8fd",
89
+ "sha256": "7590edf2d36b5f374f1727ae0d574530c0c6d2edb5265839f016d45c7e459c2b",
76
90
  "size": 134217728,
77
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.he60ec278e8b741ffecd9c06b1275e42e001050123a0b366181f6e013447de8fd.tgz",
78
- "archiveSize": 134212766,
79
- "archiveSha256": "f2dc5d39ac6f36d7ef1541e171ac8889bc4a11026381a6c4c90af57660f7ed1c"
91
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h7590edf2d36b5f374f1727ae0d574530c0c6d2edb5265839f016d45c7e459c2b.tgz",
92
+ "archiveSize": 134032141,
93
+ "archiveSha256": "877fdc8c4095e5cbf54d041a55974771059e2cd7426035cb5c868e238d669ac6"
80
94
  },
81
95
  {
82
- "sha256": "9b6c9383abcab326115dfbb8d81780d918c9529444dbab236732ce544f8136c1",
96
+ "sha256": "19a103e9012b91c3424be82c2fd94c1c5680214e69ec897fa5029258242bfa59",
83
97
  "size": 134217728,
84
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h9b6c9383abcab326115dfbb8d81780d918c9529444dbab236732ce544f8136c1.tgz",
85
- "archiveSize": 134036582,
86
- "archiveSha256": "9c127af49140afc8119ca6a935f26fc1469f20467abc78b656e15b1811846938"
98
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h19a103e9012b91c3424be82c2fd94c1c5680214e69ec897fa5029258242bfa59.tgz",
99
+ "archiveSize": 133801432,
100
+ "archiveSha256": "b8c54adadaa5397e873ccf37b3b6240e5728fc7757151d99df74f5cabc93d5d7"
87
101
  },
88
102
  {
89
- "sha256": "1b10c0d8a0b6c67ac85ccacf0ae374eade36d2e32371214296dc800032b1bc1f",
103
+ "sha256": "7a5924ee9646a505a7b767b5247d49538e76e9f4b1ab5577e185595af1280946",
90
104
  "size": 134217728,
91
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h1b10c0d8a0b6c67ac85ccacf0ae374eade36d2e32371214296dc800032b1bc1f.tgz",
92
- "archiveSize": 133798951,
93
- "archiveSha256": "3aaedeb6333318ce2de8bbef2795d868db917c3098d3fcd0922840c5f4daaebe"
105
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h7a5924ee9646a505a7b767b5247d49538e76e9f4b1ab5577e185595af1280946.tgz",
106
+ "archiveSize": 133721025,
107
+ "archiveSha256": "04c0761ad0e4257d3202ccbabede1545ec5c30b3569c9774cfbe945b58636e69"
94
108
  },
95
109
  {
96
- "sha256": "cc07c5fdc24fbc3855564e88dd00cff2f2ed3caec27a7e6002d91d6906a4e424",
110
+ "sha256": "4ea5c3c4d3545f9a6c169318402d066c015f528d3543b842cfe1c1d8a03fdb58",
97
111
  "size": 134217728,
98
- "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hcc07c5fdc24fbc3855564e88dd00cff2f2ed3caec27a7e6002d91d6906a4e424.tgz",
99
- "archiveSize": 133729271,
100
- "archiveSha256": "d1e8863c7a286d0d824e50e510f3073baf29533e6f8daa10d5ade434bde93ab0"
112
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.h4ea5c3c4d3545f9a6c169318402d066c015f528d3543b842cfe1c1d8a03fdb58.tgz",
113
+ "archiveSize": 133452661,
114
+ "archiveSha256": "b5a22c77f0778997704ad5f2c6a23249a446c454a9242cfc49f8b29e05c9242b"
101
115
  },
102
116
  {
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"
117
+ "sha256": "df9a45b05208bb3098cc620c838877562d9c3573b72ad90e54353ec86b62a16a",
118
+ "size": 15409538,
119
+ "url": "https://registry.npmjs.org/@petercjl/codex-own/-/codex-own-0.0.0-payload.hdf9a45b05208bb3098cc620c838877562d9c3573b72ad90e54353ec86b62a16a.tgz",
120
+ "archiveSize": 15407373,
121
+ "archiveSha256": "4b96afcb960c722dc40f34ebda487a671a849c5c5a42f6305864efc3e6c3c54f"
108
122
  }
109
123
  ]
110
124
  }
111
125
  },
112
126
  "provenance": {
113
127
  "darwin-arm64": {
114
- "kind": "verified-i18n-repair",
115
- "repairWindowsI18n": true,
116
- "sourceVersion": "0.2.1"
128
+ "kind": "verified-own-overlay-upgrade",
129
+ "sourceVersion": "0.2.2",
130
+ "upgradeNpmUpdater": true
117
131
  },
118
132
  "win32-x64": {
119
- "kind": "verified-i18n-repair",
120
- "repairWindowsI18n": true,
121
- "sourceVersion": "0.2.1"
133
+ "kind": "verified-own-overlay-upgrade",
134
+ "sourceVersion": "0.2.2",
135
+ "upgradeNpmUpdater": true
122
136
  }
123
137
  }
124
138
  }
@@ -18,6 +18,8 @@ Use the installed `codex-own` CLI. Resolve its current bundled instructions with
18
18
 
19
19
  For installation-only acceptance, verify doctor, version, target and shortcut without configuring credentials or launching the GUI unless requested. Progress goes to stderr; final results remain JSON on stdout.
20
20
 
21
+ Desktop builds with the bundled npm updater check stable latest 15 seconds after startup and every six hours. The user-facing menu is 更新 → 检查 codex-own 更新…. Download runs while the app remains usable; 重启并安装 asks the user to end active tasks, then an independent helper waits for exit, backs up and replaces the app. The helper uses bundled Node and npm payloads, so daily in-app updates do not require updating global npm tooling. Inspect the installed app's own updater version separately from the global CLI version. Retain CLI step 3 for older builds and recovery. Prepared, verified downloads survive restarts; offline checks preserve the current installation. Install logs and unique result records live under the independent manager directory; never delete locks to bypass a failed update.
22
+
21
23
  ## Recovery and boundaries
22
24
 
23
25
  - APP_RUNNING: request or perform authorized graceful exit, then return to step 3.