@liwu1995/afu-context 0.0.0-stage → 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.
@@ -0,0 +1,64 @@
1
+ /** Release-owned platform packs, copied only after manifest verification. */
2
+ import {createRequire} from 'node:module';
3
+ import {readFileSync,existsSync,lstatSync,realpathSync,readdirSync,mkdirSync,mkdtempSync,renameSync,rmSync,writeFileSync} from 'node:fs';
4
+ import {join,resolve,sep} from 'node:path';
5
+ import {createHash} from 'node:crypto';
6
+ import {homedir} from 'node:os';
7
+ import {runInstall} from './install-process.mjs';
8
+ export function packName(kind){
9
+ if(!['runtime','pi','dsh'].includes(kind))throw Error('INVALID_PACK_KIND');
10
+ if(!['darwin','linux','win32'].includes(process.platform)||!['arm64','x64'].includes(process.arch))throw Error('UNSUPPORTED_PLATFORM');
11
+ return `@liwu1995/afu-context-${kind}-${process.platform}-${process.arch}`;
12
+ }
13
+ export function verifyPack(folder,manifest,kind){
14
+ const info=JSON.parse(readFileSync(join(folder,'pack-manifest.json'),'utf8'));
15
+ if(info.build!==manifest.build||info.kind!==kind||info.platform!==process.platform||info.arch!==process.arch)throw Error('PLATFORM_PACK_MISMATCH');
16
+ const root=realpathSync(folder);
17
+ const listed=new Set(Object.keys(info.files));
18
+ function walk(dir){for(const entry of readdirSync(dir,{withFileTypes:true})){const file=join(dir,entry.name);if(entry.isDirectory())walk(file);else {const name=file.slice(root.length+1);if(!listed.has(name))throw Error('PACK_UNLISTED_FILE');if(lstatSync(file).isSymbolicLink()&&lstatSync(realpathSync(file)).isDirectory())throw Error('PACK_DIRECTORY_LINK');}}}
19
+ walk(join(root,'payload'));
20
+ // COSEC: signed npm integrity plus per-file release hashes; forbid escaping
21
+ // paths/symlinks before copying any executable into the private runtime.
22
+ for(const [name,hash] of Object.entries(info.files)){
23
+ const file=resolve(root,name);
24
+ if(!file.startsWith(root+sep)||!realpathSync(file).startsWith(root+sep))throw Error('PACK_PATH_ESCAPE');
25
+ const stat=lstatSync(file);
26
+ const actual=createHash('sha256').update(readFileSync(file)).digest('hex');
27
+ if(!stat.isFile()&&!stat.isSymbolicLink()||actual!==hash)throw Error('PACK_INTEGRITY_FAILED');
28
+ }
29
+ if(!info.files['payload/'+(kind==='runtime'?'bin/python3':'package.json')])throw Error('PACK_ENTRY_MISSING');
30
+ return join(folder,'payload');
31
+ }
32
+ export async function obtainPack(root,manifest,kind,env=process.env,onChild=()=>{}){
33
+ const name=packName(kind);let folder;
34
+ if(env.AFU_BUNDLE_DIR)folder=join(resolve(env.AFU_BUNDLE_DIR),name);
35
+ else{
36
+ try{folder=createRequire(join(root,'package.json')).resolve(name+'/package.json').replace(/[/\\]package.json$/,'');}catch{}
37
+ if(!folder){
38
+ const base=resolve(env.AFU_RUNTIME_DIR??join(homedir(),'.local/share/afu-context/runtimes'),'downloads',manifest.build+'-'+kind);
39
+ // COSEC: only release-owned sibling generations can be selected by this pointer.
40
+ let cached=base;
41
+ try{const selected=JSON.parse(readFileSync(base+'.json','utf8')).generation;
42
+ if(typeof selected==='string'&&selected.startsWith(manifest.build+'-'+kind+'-')&&!/[\\/]/.test(selected))cached=join(resolve(base,'..'),selected);
43
+ }catch{}
44
+ try{return verifyPack(join(cached,'node_modules',name),manifest,kind);}catch{}
45
+ mkdirSync(resolve(base,'..'),{recursive:true,mode:0o700});
46
+ const stage=mkdtempSync(base+'-');let committed=false;
47
+ try{
48
+ console.error(`AFU: downloading ${kind} pack for ${process.platform}/${process.arch}`);
49
+ // npm retries transient fetch failures and validates its content-addressed cache.
50
+ await runInstall('npm',['install','--prefix',stage,'--registry=https://registry.npmjs.org','--ignore-scripts','--no-audit','--no-fund','--package-lock=false','--fetch-retries=2','--fetch-retry-mintimeout=1000','--fetch-retry-maxtimeout=5000','--fetch-timeout=30000',name+'@'+manifest.version],env,onChild);
51
+ folder=join(stage,'node_modules',name);
52
+ const payload=verifyPack(folder,manifest,kind);
53
+ const temporary=stage+'.json';
54
+ writeFileSync(temporary,JSON.stringify({generation:stage.slice(resolve(base,'..').length+1)}),{mode:0o600});
55
+ renameSync(temporary,base+'.json');committed=true;
56
+ return payload;
57
+ }finally{
58
+ // Never delete a previously usable pack; only this attempt's unpublished files.
59
+ if(!committed){rmSync(stage,{recursive:true,force:true});rmSync(stage+'.json',{force:true});}
60
+ }
61
+ }
62
+ }
63
+ return verifyPack(folder,manifest,kind);
64
+ }
@@ -0,0 +1,111 @@
1
+ import {obtainPack} from './prebuilt.mjs';
2
+ import {cpSync} from 'node:fs';
3
+ import {runInstall} from './install-process.mjs';
4
+ /** Isolated, recoverable bootstrap. Never touches host integrations. */
5
+ import {spawnSync} from 'node:child_process';
6
+ import {existsSync,mkdirSync,readFileSync,writeFileSync,rmSync,statSync,renameSync} from 'node:fs';
7
+ import {join,resolve,dirname,basename} from 'node:path';
8
+ import {homedir} from 'node:os';
9
+ import {randomUUID} from 'node:crypto';
10
+ const sleep=ms=>new Promise(r=>setTimeout(r,ms));
11
+ const read=p=>{try{return JSON.parse(readFileSync(p,'utf8'));}catch{return null;}};
12
+ const alive=pid=>{if(!Number.isSafeInteger(pid)||pid<=0)return false;try{process.kill(pid,0);return true;}catch(e){return e.code!=='ESRCH';}};
13
+ export function recoverLock(lock, now=Date.now()) {
14
+ // Serialize recovery contenders inside the old lock. Never steal a living owner.
15
+ const guard=join(lock,'recover');
16
+ let age;
17
+ try{age=now-(statSync(lock).birthtimeMs || statSync(lock).mtimeMs);}catch{return false;}
18
+ try{mkdirSync(guard);writeFileSync(join(guard,'owner.json'),JSON.stringify({pid:process.pid}));}
19
+ catch{
20
+ try {
21
+ const reaper=read(join(guard,'owner.json'));
22
+ if(reaper ? !alive(reaper.pid) : now-statSync(guard).mtimeMs>180000)rmSync(guard,{recursive:true,force:true});
23
+ } catch {}
24
+ return false;
25
+ }
26
+ let moved=false;
27
+ try{
28
+ const owner=read(join(lock,'owner.json'));
29
+ if(owner && (alive(owner.pid)||alive(owner.childPid)))return false;
30
+ // Missing/partial ownership may be a just-created lock, not a crashed install.
31
+ if(!owner && age<180000)return false;
32
+ const tomb=lock+'.abandoned-'+randomUUID();
33
+ renameSync(lock,tomb);moved=true;rmSync(tomb,{recursive:true,force:true});return true;
34
+ }catch{return false;}finally{if(!moved)rmSync(guard,{recursive:true,force:true});}
35
+ }
36
+ export function runtimeReady(location, build) {
37
+ const marker=read(join(location,'afu-ready.json'));
38
+ const python=join(location,process.platform==='win32'?'Scripts/python.exe':'bin/python');
39
+ if(marker?.build!==build || !existsSync(python))return false;
40
+ // A surviving marker is not proof that imports and the interpreter still work.
41
+ return spawnSync(python,['-c','import afu_context.local_cli, aiohttp, tiktoken'],{stdio:'ignore',timeout:10000}).status===0;
42
+ }
43
+ export async function prepareRuntime(root,manifest,env=process.env) {
44
+ const base=env.AFU_RUNTIME_DIR ?? join(homedir(),'.local/share/afu-context/runtimes');
45
+ const location=join(base,manifest.build), lock=location+'.lock';
46
+ const token=randomUUID();
47
+ const current=()=>{
48
+ const pointer=read(join(base,manifest.build+'.location.json'))?.location;
49
+ // COSEC: a cache pointer may select only this build's sibling repair directories.
50
+ if(typeof pointer==='string' && dirname(resolve(pointer))===resolve(base) && basename(pointer).startsWith(manifest.build+'-repair-'))return pointer;
51
+ return location;
52
+ };
53
+ mkdirSync(base,{recursive:true,mode:0o700});
54
+ if(runtimeReady(current(),manifest.build))return current();
55
+ const deadline=Date.now()+180000;
56
+ while(true){
57
+ try{mkdirSync(lock,{mode:0o700});writeFileSync(join(lock,'owner.json'),JSON.stringify({pid:process.pid,token}),{mode:0o600});break;}
58
+ catch(e){if(e.code!=='EEXIST')throw e;}
59
+ recoverLock(lock);
60
+ if(runtimeReady(current(),manifest.build))return current();
61
+ if(Date.now()>deadline)throw Error('Runtime installation is still owned by another process: '+lock);
62
+ await sleep(300);
63
+ }
64
+ const owns=()=>read(join(lock,'owner.json'))?.token===token;
65
+ const run=async(command,args)=>{
66
+ if(!owns())throw Error('Runtime installation ownership changed');
67
+ try{await runInstall(command,args,env,pid=>writeFileSync(join(lock,'owner.json'),JSON.stringify({pid:process.pid,childPid:pid,token}),{mode:0o600}));}
68
+ finally{if(owns())writeFileSync(join(lock,'owner.json'),JSON.stringify({pid:process.pid,token}),{mode:0o600});}
69
+ };
70
+ let createdTarget;
71
+ try{
72
+ if(runtimeReady(current(),manifest.build))return current();
73
+ if(manifest.prebuilt && process.platform!=='win32'){
74
+ const payload=await obtainPack(root,manifest,'runtime',env,pid=>writeFileSync(join(lock,'owner.json'),JSON.stringify({pid:process.pid,childPid:pid,token}),{mode:0o600}));
75
+ const target=existsSync(location)?location+'-repair-'+randomUUID():location;
76
+ createdTarget=target;
77
+ cpSync(payload,target,{recursive:true,verbatimSymlinks:true});
78
+ const python=join(target,'bin/python');
79
+ await run(python,['-c','import afu_context.local_cli, aiohttp, tiktoken']);
80
+ writeFileSync(join(target,'afu-release.json'),JSON.stringify(manifest),{mode:0o600});
81
+ writeFileSync(join(target,'afu-ready.json'),JSON.stringify({build:manifest.build,cache_protocol:1}),{mode:0o600});
82
+ if(target!==location){const pointer=join(base,manifest.build+'.location.json'),temp=pointer+'.'+token;writeFileSync(temp,JSON.stringify({location:target}),{mode:0o600});renameSync(temp,pointer);}
83
+ return target;
84
+ }
85
+ const choices=env.AFU_PYTHON ? [[env.AFU_PYTHON,[]]] : process.platform==='win32' ? [['py',['-3']],['python',[]]] : [['python3',[]],['python',[]]];
86
+ const selected=choices.find(([cmd,args])=>spawnSync(cmd,[...args,'-c','import sys;sys.exit(sys.version_info<(3,11))'],{stdio:'ignore',timeout:10000}).status===0);
87
+ if(!selected)throw Error('Python 3.11+ is required. Install it or set AFU_PYTHON.');
88
+ // Keep a damaged environment at its old path so existing processes/files are not removed.
89
+ // New preparation uses a fresh directory; the venv must be created at its final path.
90
+ let target=location;
91
+ if(existsSync(location))target=location+'-repair-'+randomUUID();
92
+ const python=join(target,process.platform==='win32'?'Scripts/python.exe':'bin/python');
93
+ createdTarget=target;
94
+ await run(selected[0],[...selected[1],'-m','venv',target]);
95
+ const inputs=['-c',join(root,'python/constraints.txt'),join(root,'python',manifest.wheel)];
96
+ if(spawnSync('uv',['--version'],{stdio:'ignore',timeout:10000}).status===0)await run('uv',['pip','install','--python',python,...inputs]);
97
+ else await run(python,['-m','pip','install','--disable-pip-version-check',...inputs]);
98
+ await run(python,['-c','import afu_context.local_cli, aiohttp, tiktoken']);
99
+ writeFileSync(join(target,'afu-release.json'),JSON.stringify(manifest),{mode:0o600});
100
+ writeFileSync(join(target,'afu-ready.json'),JSON.stringify({build:manifest.build,cache_protocol:1}),{mode:0o600});
101
+ if(target!==location){
102
+ const pointer=join(base,manifest.build+'.location.json');
103
+ const temporary=pointer+'.'+token;
104
+ writeFileSync(temporary,JSON.stringify({location:target}),{mode:0o600});renameSync(temporary,pointer);
105
+ }
106
+ return target;
107
+ }catch(error){
108
+ if(owns()&&createdTarget)rmSync(createdTarget,{recursive:true,force:true});
109
+ throw error;
110
+ }finally{if(owns())rmSync(lock,{recursive:true,force:true});}
111
+ }
package/package.json CHANGED
@@ -1,6 +1,35 @@
1
1
  {
2
2
  "name": "@liwu1995/afu-context",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "license": "Apache-2.0",
6
+ "description": "Local asynchronous context compression and diagnostics",
7
+ "bin": {
8
+ "afu": "bin/afu.mjs"
9
+ },
10
+ "engines": {
11
+ "node": "^22.19.0 || >=24.0.0"
12
+ },
13
+ "dependencies": {},
14
+ "files": [
15
+ "platform-dependencies.json",
16
+ "platform-locks",
17
+ "bin",
18
+ "python",
19
+ "src/afu_host_integrations",
20
+ "scripts",
21
+ "release.json",
22
+ "README.md",
23
+ "README.zh-CN.md",
24
+ "LICENSE"
25
+ ],
26
+ "optionalDependencies": {
27
+ "@liwu1995/afu-context-runtime-darwin-arm64": "0.1.0",
28
+ "@liwu1995/afu-context-runtime-linux-x64": "0.1.0"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public",
32
+ "registry": "https://registry.npmjs.org",
33
+ "tag": "next"
34
+ }
35
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "pi": {
3
+ "@earendil-works/pi-coding-agent": "0.84.4"
4
+ },
5
+ "dsh": {
6
+ "@deepseek-ai/cordis": "4.0.2",
7
+ "@deepseek-ai/dsh-agent": "0.1.2-rc.1",
8
+ "@deepseek-ai/dsh-compaction": "0.1.2-rc.1",
9
+ "@deepseek-ai/dsh-compaction-basic": "0.1.2-rc.1",
10
+ "@deepseek-ai/dsh-llm": "0.1.2-rc.1",
11
+ "@deepseek-ai/cordis-plugin-include": "1.0.7",
12
+ "js-yaml": "4.3.2",
13
+ "@deepseek-ai/cordis-plugin-loader": "1.0.3"
14
+ }
15
+ }
@@ -0,0 +1,410 @@
1
+ {
2
+ "name": "afu-dsh-runtime",
3
+ "version": "0.1.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "afu-dsh-runtime",
9
+ "version": "0.1.0",
10
+ "dependencies": {
11
+ "@deepseek-ai/cordis": "4.0.2",
12
+ "@deepseek-ai/dsh-agent": "0.1.2-rc.1",
13
+ "@deepseek-ai/dsh-compaction": "0.1.2-rc.1",
14
+ "@deepseek-ai/dsh-compaction-basic": "0.1.2-rc.1",
15
+ "@deepseek-ai/dsh-llm": "0.1.2-rc.1",
16
+ "@deepseek-ai/cordis-plugin-include": "1.0.7",
17
+ "js-yaml": "4.3.2",
18
+ "@deepseek-ai/cordis-plugin-loader": "1.0.3"
19
+ }
20
+ },
21
+ "node_modules/@deepseek-ai/cordis-plugin-loader": {
22
+ "version": "1.0.3",
23
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/cordis-plugin-loader/-/cordis-plugin-loader-1.0.3.tgz",
24
+ "integrity": "sha512-YNcHiH7TRFrgnRbQU7qdS1spABUFFHg04QpB9DdboPEjgKLTFfeEAvr6Y7qll3/nGgqywDQdk1tYshqKO0p1WQ==",
25
+ "license": "MIT",
26
+ "peer": true,
27
+ "dependencies": {
28
+ "@deepseek-ai/cosmokit": "^1.8.3"
29
+ },
30
+ "peerDependencies": {
31
+ "@deepseek-ai/cordis": "^4.0.2",
32
+ "node-addon-require-builtin": "^0.1.4"
33
+ },
34
+ "peerDependenciesMeta": {
35
+ "node-addon-require-builtin": {
36
+ "optional": true
37
+ }
38
+ }
39
+ },
40
+ "node_modules/@deepseek-ai/cordis": {
41
+ "version": "4.0.2",
42
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/cordis/-/cordis-4.0.2.tgz",
43
+ "integrity": "sha512-asOnXP1TzFSFQlHb1iegDZp0z/8WD1c7YNrwJR/Tx2bzNuMXfcekE/I67Iv6SQXeLB4csxqCngzQKANP7gdw0g==",
44
+ "license": "MIT",
45
+ "peer": true,
46
+ "dependencies": {
47
+ "@deepseek-ai/cosmokit": "^1.8.3",
48
+ "@standard-schema/spec": "^1.1.0"
49
+ },
50
+ "bin": {
51
+ "cordis": "bin.js"
52
+ },
53
+ "peerDependencies": {
54
+ "@deepseek-ai/cordis-plugin-include": "^1.0.7",
55
+ "@deepseek-ai/cordis-plugin-loader": "^1.0.3"
56
+ },
57
+ "peerDependenciesMeta": {
58
+ "@deepseek-ai/cordis-plugin-include": {
59
+ "optional": true
60
+ },
61
+ "@deepseek-ai/cordis-plugin-loader": {
62
+ "optional": true
63
+ }
64
+ }
65
+ },
66
+ "node_modules/@deepseek-ai/cordis-plugin-include": {
67
+ "version": "1.0.7",
68
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/cordis-plugin-include/-/cordis-plugin-include-1.0.7.tgz",
69
+ "integrity": "sha512-bZ4S1YuOmwOeE97HnslQ6ggVQbaWz4GejJ8OcY4P/DIyc1Qhu/3Szt1XSw6c/pd37kRkxxJXGwt4cmCxWSBBuw==",
70
+ "license": "MIT",
71
+ "peer": true,
72
+ "dependencies": {
73
+ "@deepseek-ai/cosmokit": "^1.8.3",
74
+ "js-yaml": "^4.1.0"
75
+ },
76
+ "peerDependencies": {
77
+ "@deepseek-ai/cordis": "^4.0.2",
78
+ "@deepseek-ai/cordis-plugin-loader": "^1.0.3"
79
+ }
80
+ },
81
+ "node_modules/js-yaml": {
82
+ "version": "4.3.2",
83
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz",
84
+ "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==",
85
+ "funding": [
86
+ {
87
+ "type": "github",
88
+ "url": "https://github.com/sponsors/puzrin"
89
+ },
90
+ {
91
+ "type": "github",
92
+ "url": "https://github.com/sponsors/nodeca"
93
+ }
94
+ ],
95
+ "license": "MIT",
96
+ "dependencies": {
97
+ "argparse": "^2.0.1"
98
+ },
99
+ "bin": {
100
+ "js-yaml": "bin/js-yaml.js"
101
+ }
102
+ },
103
+ "node_modules/argparse": {
104
+ "version": "2.0.1",
105
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
106
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
107
+ "license": "Python-2.0"
108
+ },
109
+ "node_modules/@deepseek-ai/cosmokit": {
110
+ "version": "1.8.6",
111
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/cosmokit/-/cosmokit-1.8.6.tgz",
112
+ "integrity": "sha512-ZSD/fN52L498LBIOYwjIOlaLv5veY6ZEwI2yzvZUKQtctn0QAPqu8tKdJ+OF5+Tv6NBq1U+wJWH+QI6OGy5EvQ==",
113
+ "license": "MIT"
114
+ },
115
+ "node_modules/@standard-schema/spec": {
116
+ "version": "1.1.0",
117
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
118
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
119
+ "license": "MIT"
120
+ },
121
+ "node_modules/@deepseek-ai/dsh-llm": {
122
+ "version": "0.1.2-rc.1",
123
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-llm/-/dsh-llm-0.1.2-rc.1.tgz",
124
+ "integrity": "sha512-7VYsha5AXsVLnsAwYJffWXz9bwUbElw8i5N8tlTSdai9Bupk3sMbsotzPf8ZbsuGAxQYErahMwQwgGEu4qZO6g==",
125
+ "license": "MIT",
126
+ "peer": true,
127
+ "dependencies": {
128
+ "@deepseek-ai/dsh-brand": "^0.1.2-rc.1",
129
+ "@deepseek-ai/dsh-timeout": "^0.1.2-rc.1",
130
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.2-rc.1",
131
+ "@deepseek-ai/dsh-util-crypto": "^0.1.2-rc.1",
132
+ "@deepseek-ai/dsh-util-values": "^0.1.2-rc.1",
133
+ "@deepseek-ai/schemastery": "^3.18.2",
134
+ "zod": "^4.4.3"
135
+ },
136
+ "peerDependencies": {
137
+ "@deepseek-ai/cordis": "^4.0.2"
138
+ }
139
+ },
140
+ "node_modules/zod": {
141
+ "version": "4.6.7",
142
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz",
143
+ "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==",
144
+ "license": "MIT",
145
+ "funding": {
146
+ "url": "https://github.com/sponsors/colinhacks"
147
+ }
148
+ },
149
+ "node_modules/@deepseek-ai/schemastery": {
150
+ "version": "3.18.5",
151
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/schemastery/-/schemastery-3.18.5.tgz",
152
+ "integrity": "sha512-Mnobvqf9rHsZYv4g5edj5ddxS1oF1kIdSlz0DunUgnY3LWG5F26MqvH3YOOsSaodCgyzJ16OMN9O99/s5Crtdw==",
153
+ "license": "MIT",
154
+ "dependencies": {
155
+ "@deepseek-ai/cosmokit": "~1.8.6",
156
+ "@standard-schema/spec": "^1.1.0"
157
+ }
158
+ },
159
+ "node_modules/@deepseek-ai/dsh-util-values": {
160
+ "version": "0.1.2-rc.1",
161
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-util-values/-/dsh-util-values-0.1.2-rc.1.tgz",
162
+ "integrity": "sha512-FQdgoK+KYVR0pBQb9fTsajvGb3gzUxEzJQEYnFOt+Qdwc4nkxJOPwJJdIvXuqvZaQ33DaOoqpnpcr2p5HpLu4g==",
163
+ "license": "MIT",
164
+ "peerDependencies": {
165
+ "@deepseek-ai/cordis": "^4.0.2"
166
+ }
167
+ },
168
+ "node_modules/@deepseek-ai/dsh-util-crypto": {
169
+ "version": "0.1.2-rc.1",
170
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-util-crypto/-/dsh-util-crypto-0.1.2-rc.1.tgz",
171
+ "integrity": "sha512-gE8FznQ1hkknw9QMrHNSlm3UEyRYuj3MLVvlJ6NyH1kmOsdjnbrVbSs+Pn72k2oIV4Fiyu3Umg0sLznUEcsiXw==",
172
+ "license": "MIT",
173
+ "peerDependencies": {
174
+ "@deepseek-ai/cordis": "^4.0.2"
175
+ }
176
+ },
177
+ "node_modules/@deepseek-ai/dsh-typert-protocol": {
178
+ "version": "0.1.2-rc.1",
179
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-typert-protocol/-/dsh-typert-protocol-0.1.2-rc.1.tgz",
180
+ "integrity": "sha512-vBWD0NpriPd96ltbWaAw+iKeWFIEjiAcCWYtmqEcV1Ms+FaV02usjjm7LCmhSQhMZpBSBc7EZUX0spGlpjI1bA==",
181
+ "license": "MIT",
182
+ "peer": true,
183
+ "peerDependencies": {
184
+ "@deepseek-ai/cordis": "^4.0.2"
185
+ }
186
+ },
187
+ "node_modules/@deepseek-ai/dsh-timeout": {
188
+ "version": "0.1.2-rc.1",
189
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-timeout/-/dsh-timeout-0.1.2-rc.1.tgz",
190
+ "integrity": "sha512-llz11yxWeJB8suKCa6hRLjNBWVaPn3Fbd0XoBS0bkZLhPFzO1mDorx/XMca2GhI7XF9A86CURQcDt+aGjjvqJA==",
191
+ "license": "MIT",
192
+ "peer": true,
193
+ "peerDependencies": {
194
+ "@deepseek-ai/cordis": "^4.0.2"
195
+ }
196
+ },
197
+ "node_modules/@deepseek-ai/dsh-brand": {
198
+ "version": "0.1.2-rc.1",
199
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-brand/-/dsh-brand-0.1.2-rc.1.tgz",
200
+ "integrity": "sha512-y2RHIag3kzLdY8kTBuSUSTsKzWPscJrysNObXTiNM7stXLpa3jXpshsB1caqGzNx50vYcmHeN1gFVECgx3NZHg==",
201
+ "license": "MIT",
202
+ "peer": true,
203
+ "peerDependencies": {
204
+ "@deepseek-ai/cordis": "^4.0.2"
205
+ }
206
+ },
207
+ "node_modules/@deepseek-ai/dsh-compaction-basic": {
208
+ "version": "0.1.2-rc.1",
209
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-compaction-basic/-/dsh-compaction-basic-0.1.2-rc.1.tgz",
210
+ "integrity": "sha512-x4HEQ4hiPwHE5nljFXsVzG8nOVnEQIwmIxVB9csnWyKcika6yoAGPujeFcGdZKoMPiADt2JglO8fLuAj3ROCXg==",
211
+ "license": "MIT",
212
+ "peer": true,
213
+ "dependencies": {
214
+ "@deepseek-ai/dsh-util-values": "^0.1.2-rc.1",
215
+ "@deepseek-ai/schemastery": "^3.18.2"
216
+ },
217
+ "peerDependencies": {
218
+ "@deepseek-ai/cordis": "^4.0.2",
219
+ "@deepseek-ai/dsh-agent": "^0.1.2-rc.1",
220
+ "@deepseek-ai/dsh-commands": "^0.1.2-rc.1",
221
+ "@deepseek-ai/dsh-compaction": "^0.1.2-rc.1",
222
+ "@deepseek-ai/dsh-compaction-tool-result-pruner": "^0.1.2-rc.1",
223
+ "@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
224
+ "@deepseek-ai/dsh-session": "^0.1.2-rc.1",
225
+ "@deepseek-ai/dsh-token-meter": "^0.1.2-rc.1"
226
+ },
227
+ "peerDependenciesMeta": {
228
+ "@deepseek-ai/dsh-compaction-tool-result-pruner": {
229
+ "optional": true
230
+ }
231
+ }
232
+ },
233
+ "node_modules/@deepseek-ai/dsh-token-meter": {
234
+ "version": "0.1.2-rc.1",
235
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-token-meter/-/dsh-token-meter-0.1.2-rc.1.tgz",
236
+ "integrity": "sha512-6mlC89JNGudPvR9LekEo2mnEo/DXf60ZjekIKXxZqpf66AOQ2/pa2HJuFikEd9WWRvu2D96Qvx3rILxi1vXVww==",
237
+ "license": "MIT",
238
+ "peer": true,
239
+ "dependencies": {
240
+ "@deepseek-ai/dsh-util-values": "^0.1.2-rc.1",
241
+ "@deepseek-ai/schemastery": "^3.18.2",
242
+ "zod": "^4.4.3"
243
+ },
244
+ "peerDependencies": {
245
+ "@deepseek-ai/cordis": "^4.0.2",
246
+ "@deepseek-ai/dsh-compaction": "^0.1.2-rc.1",
247
+ "@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
248
+ "@deepseek-ai/dsh-llm-retry": "^0.1.2-rc.1",
249
+ "@deepseek-ai/dsh-session": "^0.1.2-rc.1",
250
+ "@deepseek-ai/dsh-session-projection": "^0.1.2-rc.1"
251
+ }
252
+ },
253
+ "node_modules/@deepseek-ai/dsh-session-projection": {
254
+ "version": "0.1.2-rc.1",
255
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-session-projection/-/dsh-session-projection-0.1.2-rc.1.tgz",
256
+ "integrity": "sha512-qVWlIzPm4u9vzQ5G/QtE6jeSJ3b3b42hWVJj664BurEZlHbAfdqkhYc1QsoBU+5k5kUEJFHh07z8HxuXA9kTnQ==",
257
+ "license": "MIT",
258
+ "peer": true,
259
+ "dependencies": {
260
+ "zod": "^4.4.3"
261
+ },
262
+ "peerDependencies": {
263
+ "@deepseek-ai/cordis": "^4.0.2",
264
+ "@deepseek-ai/dsh-session": "^0.1.2-rc.1"
265
+ }
266
+ },
267
+ "node_modules/@deepseek-ai/dsh-session": {
268
+ "version": "0.1.2-rc.1",
269
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-session/-/dsh-session-0.1.2-rc.1.tgz",
270
+ "integrity": "sha512-jRGNPTbQcvIx1F2MVmmkoiHLgpC3Btqo1wkl/3JDLlOWRVWKOuaC+5fQiMrFPOYfno6YiX/c2UvmA0td8qB92w==",
271
+ "license": "MIT",
272
+ "peer": true,
273
+ "dependencies": {
274
+ "@deepseek-ai/dsh-brand": "^0.1.2-rc.1",
275
+ "@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
276
+ "@deepseek-ai/dsh-util-values": "^0.1.2-rc.1"
277
+ },
278
+ "peerDependencies": {
279
+ "@deepseek-ai/cordis": "^4.0.2",
280
+ "@deepseek-ai/dsh-scope": "^0.1.2-rc.1"
281
+ }
282
+ },
283
+ "node_modules/@deepseek-ai/dsh-scope": {
284
+ "version": "0.1.2-rc.1",
285
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-scope/-/dsh-scope-0.1.2-rc.1.tgz",
286
+ "integrity": "sha512-GHwbzWrGbmE0ZGzAZsXBudpyCM9ENCpXxlKODIaPFbIWhRePh6nH2jW47TAOqCIsPPedWC2p3w8Tx5WAa3I/2A==",
287
+ "license": "MIT",
288
+ "peer": true,
289
+ "peerDependencies": {
290
+ "@deepseek-ai/cordis": "^4.0.2",
291
+ "@deepseek-ai/dsh-invariants": "^0.1.2-rc.1"
292
+ }
293
+ },
294
+ "node_modules/@deepseek-ai/dsh-invariants": {
295
+ "version": "0.1.2-rc.1",
296
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-invariants/-/dsh-invariants-0.1.2-rc.1.tgz",
297
+ "integrity": "sha512-zSjuFJYcEB94kPwn7SicqAV1dfVWZkjt1I8luDboxtjfp5CN6ziwJhLv3KaB+Dh9tgkyGY4mvo886W/HhE9L9g==",
298
+ "license": "MIT",
299
+ "peer": true,
300
+ "dependencies": {
301
+ "@deepseek-ai/schemastery": "^3.18.2"
302
+ },
303
+ "peerDependencies": {
304
+ "@deepseek-ai/cordis": "^4.0.2"
305
+ }
306
+ },
307
+ "node_modules/@deepseek-ai/dsh-llm-retry": {
308
+ "version": "0.1.2-rc.1",
309
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-llm-retry/-/dsh-llm-retry-0.1.2-rc.1.tgz",
310
+ "integrity": "sha512-WRpanzi4u2Z2X2uv/rwRZh5HTYUtd5smFTBMT4jYd1UpFOmjoMY/grDboZG9KI1OsgaS1vadiBJT4vvixFDEAA==",
311
+ "license": "MIT",
312
+ "peer": true,
313
+ "dependencies": {
314
+ "@deepseek-ai/schemastery": "^3.18.2",
315
+ "zod": "^4.4.3"
316
+ },
317
+ "peerDependencies": {
318
+ "@deepseek-ai/cordis": "^4.0.2",
319
+ "@deepseek-ai/dsh-agent": "^0.1.2-rc.1",
320
+ "@deepseek-ai/dsh-brand": "^0.1.2-rc.1",
321
+ "@deepseek-ai/dsh-invariants": "^0.1.2-rc.1",
322
+ "@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
323
+ "@deepseek-ai/dsh-session": "^0.1.2-rc.1",
324
+ "@deepseek-ai/dsh-session-projection": "^0.1.2-rc.1",
325
+ "@deepseek-ai/dsh-timeout": "^0.1.2-rc.1"
326
+ }
327
+ },
328
+ "node_modules/@deepseek-ai/dsh-agent": {
329
+ "version": "0.1.2-rc.1",
330
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-agent/-/dsh-agent-0.1.2-rc.1.tgz",
331
+ "integrity": "sha512-lfaqN34vUCWvbn1kJVHrhfJ6Dvt1HDHCm33ZCpmKkl07/5q6FxWqVv6rOdVX5QnM/9xz/uYiN0nQwUtBg4+Skg==",
332
+ "license": "MIT",
333
+ "peer": true,
334
+ "peerDependencies": {
335
+ "@deepseek-ai/cordis": "^4.0.2",
336
+ "@deepseek-ai/dsh-invariants": "^0.1.2-rc.1",
337
+ "@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
338
+ "@deepseek-ai/dsh-scope": "^0.1.2-rc.1",
339
+ "@deepseek-ai/dsh-session": "^0.1.2-rc.1",
340
+ "@deepseek-ai/dsh-session-projection": "^0.1.2-rc.1",
341
+ "@deepseek-ai/dsh-system-prompt": "^0.1.2-rc.1",
342
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.2-rc.1"
343
+ }
344
+ },
345
+ "node_modules/@deepseek-ai/dsh-system-prompt": {
346
+ "version": "0.1.2-rc.1",
347
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-system-prompt/-/dsh-system-prompt-0.1.2-rc.1.tgz",
348
+ "integrity": "sha512-7W93PZKIk4CHvjZGgLIxrrEKpk+6t8nQXje1vKR5vG73dfXH0t1MJ5WWH/fngadYc7c6KzM84ihQ66tJqJqyNQ==",
349
+ "license": "MIT",
350
+ "peer": true,
351
+ "dependencies": {
352
+ "@deepseek-ai/schemastery": "^3.18.2"
353
+ },
354
+ "peerDependencies": {
355
+ "@deepseek-ai/cordis": "^4.0.2",
356
+ "@deepseek-ai/dsh-invariants": "^0.1.2-rc.1",
357
+ "@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
358
+ "@deepseek-ai/dsh-scope": "^0.1.2-rc.1"
359
+ }
360
+ },
361
+ "node_modules/@deepseek-ai/dsh-compaction": {
362
+ "version": "0.1.2-rc.1",
363
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-compaction/-/dsh-compaction-0.1.2-rc.1.tgz",
364
+ "integrity": "sha512-omzrM2EQdoUvQ41PbbXiFERC7I4FYiLNmHIYrlCZfCAdxo0G4u3kt7eahhVaSSi2YsinL7sW79C7cTVaUWlZVg==",
365
+ "license": "MIT",
366
+ "peer": true,
367
+ "peerDependencies": {
368
+ "@deepseek-ai/cordis": "^4.0.2",
369
+ "@deepseek-ai/dsh-brand": "^0.1.2-rc.1",
370
+ "@deepseek-ai/dsh-commands": "^0.1.2-rc.1",
371
+ "@deepseek-ai/dsh-invariants": "^0.1.2-rc.1",
372
+ "@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
373
+ "@deepseek-ai/dsh-session": "^0.1.2-rc.1"
374
+ }
375
+ },
376
+ "node_modules/@deepseek-ai/dsh-commands": {
377
+ "version": "0.1.2-rc.1",
378
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-commands/-/dsh-commands-0.1.2-rc.1.tgz",
379
+ "integrity": "sha512-uBh4JTX7pOkFhmbWjXjVLnOQOawyccC7+DazbHrLRN6/wy4OgTRH+DaW0+ibLq+XRAO19OvBTtuoh3x/KkJx1Q==",
380
+ "license": "MIT",
381
+ "peer": true,
382
+ "dependencies": {
383
+ "@deepseek-ai/dsh-util-crypto": "^0.1.2-rc.1",
384
+ "zod": "^4.4.3"
385
+ },
386
+ "peerDependencies": {
387
+ "@deepseek-ai/cordis": "^4.0.2",
388
+ "@deepseek-ai/dsh-agent": "^0.1.2-rc.1",
389
+ "@deepseek-ai/dsh-attachment": "^0.1.2-rc.1",
390
+ "@deepseek-ai/dsh-brand": "^0.1.2-rc.1",
391
+ "@deepseek-ai/dsh-invariants": "^0.1.2-rc.1",
392
+ "@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
393
+ "@deepseek-ai/dsh-scope": "^0.1.2-rc.1",
394
+ "@deepseek-ai/dsh-session": "^0.1.2-rc.1",
395
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.2-rc.1"
396
+ }
397
+ },
398
+ "node_modules/@deepseek-ai/dsh-attachment": {
399
+ "version": "0.1.2-rc.1",
400
+ "resolved": "https://registry.npmjs.org/@deepseek-ai/dsh-attachment/-/dsh-attachment-0.1.2-rc.1.tgz",
401
+ "integrity": "sha512-QISKUjEITusLvAkqPLRn70xDUt+GjjY41pISjtPKYcZ4EGmayzhgZ3VJNYEcC+rbaF44hs2o/0VhOwHA7lyxjw==",
402
+ "license": "MIT",
403
+ "peer": true,
404
+ "peerDependencies": {
405
+ "@deepseek-ai/cordis": "^4.0.2",
406
+ "@deepseek-ai/dsh-brand": "^0.1.2-rc.1"
407
+ }
408
+ }
409
+ }
410
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "afu-dsh-runtime",
3
+ "private": true,
4
+ "version": "0.1.0",
5
+ "type": "module",
6
+ "dependencies": {
7
+ "@deepseek-ai/cordis": "4.0.2",
8
+ "@deepseek-ai/dsh-agent": "0.1.2-rc.1",
9
+ "@deepseek-ai/dsh-compaction": "0.1.2-rc.1",
10
+ "@deepseek-ai/dsh-compaction-basic": "0.1.2-rc.1",
11
+ "@deepseek-ai/dsh-llm": "0.1.2-rc.1",
12
+ "@deepseek-ai/cordis-plugin-include": "1.0.7",
13
+ "js-yaml": "4.3.2",
14
+ "@deepseek-ai/cordis-plugin-loader": "1.0.3"
15
+ }
16
+ }