@kodax-ai/kodax 0.7.78 → 0.7.79

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.
Files changed (124) hide show
  1. package/CHANGELOG.md +3475 -3197
  2. package/README.md +346 -275
  3. package/README_CN.md +274 -214
  4. package/config-templates/config.example.jsonc +11 -1
  5. package/config-templates/integrations/a2a.example.jsonc +23 -7
  6. package/dist/builtin/skill-creator/scripts/aggregate-benchmark.js +2 -1
  7. package/dist/builtin/skill-creator/scripts/analyze-benchmark.d.ts +1 -0
  8. package/dist/builtin/skill-creator/scripts/analyze-benchmark.js +4 -3
  9. package/dist/builtin/skill-creator/scripts/compare-runs.d.ts +1 -0
  10. package/dist/builtin/skill-creator/scripts/compare-runs.js +4 -3
  11. package/dist/builtin/skill-creator/scripts/generate-review.js +2 -1
  12. package/dist/builtin/skill-creator/scripts/grade-evals.d.ts +1 -0
  13. package/dist/builtin/skill-creator/scripts/grade-evals.js +4 -3
  14. package/dist/builtin/skill-creator/scripts/improve-description.js +2 -1
  15. package/dist/builtin/skill-creator/scripts/init-skill.d.ts +1 -0
  16. package/dist/builtin/skill-creator/scripts/init-skill.js +4 -3
  17. package/dist/builtin/skill-creator/scripts/install-skill.d.ts +1 -0
  18. package/dist/builtin/skill-creator/scripts/install-skill.js +4 -3
  19. package/dist/builtin/skill-creator/scripts/package-skill.d.ts +1 -0
  20. package/dist/builtin/skill-creator/scripts/package-skill.js +4 -3
  21. package/dist/builtin/skill-creator/scripts/quick-validate.d.ts +1 -0
  22. package/dist/builtin/skill-creator/scripts/quick-validate.js +4 -3
  23. package/dist/builtin/skill-creator/scripts/run-eval.d.ts +1 -0
  24. package/dist/builtin/skill-creator/scripts/run-eval.js +4 -3
  25. package/dist/builtin/skill-creator/scripts/run-loop.js +2 -1
  26. package/dist/builtin/skill-creator/scripts/run-trigger-eval.js +2 -1
  27. package/dist/builtin/skill-creator/scripts/utils.d.ts +3 -0
  28. package/dist/builtin/skill-creator/scripts/utils.js +5 -1
  29. package/dist/chunks/{agent-ASP4MS3X.js → agent-V4AC5JZD.js} +1 -1
  30. package/dist/chunks/argument-completer-ZPC2MLES.js +2 -0
  31. package/dist/chunks/{chunk-Z3KFRTSB.js → chunk-67THZRM6.js} +1 -1
  32. package/dist/chunks/chunk-6GVQDQTQ.js +292 -0
  33. package/dist/chunks/{chunk-TQDBTTIM.js → chunk-B6UY3VHV.js} +40 -40
  34. package/dist/chunks/{chunk-7OEBJGHK.js → chunk-BBOVVDQJ.js} +1 -1
  35. package/dist/chunks/chunk-CR2IF7VF.js +30 -0
  36. package/dist/chunks/{chunk-UID7BLAB.js → chunk-CXHEZY5G.js} +1 -1
  37. package/dist/chunks/chunk-EDZ4QILG.js +266 -0
  38. package/dist/chunks/chunk-GEECPO2H.js +218 -0
  39. package/dist/chunks/chunk-H5LLM7DB.js +89 -0
  40. package/dist/chunks/chunk-KLWP7POA.js +467 -0
  41. package/dist/chunks/{chunk-2CFHBKRE.js → chunk-M4N2JZTZ.js} +2 -2
  42. package/dist/chunks/{chunk-YAZQTC2L.js → chunk-OWQT3FTE.js} +1 -1
  43. package/dist/chunks/chunk-Q4M7DJOD.js +319 -0
  44. package/dist/chunks/{chunk-6FOJVETH.js → chunk-QCZLCLFL.js} +7 -7
  45. package/dist/chunks/chunk-RQPMGRTR.js +810 -0
  46. package/dist/chunks/chunk-SG6P4SZS.js +123 -0
  47. package/dist/chunks/chunk-TSTVAU5E.js +386 -0
  48. package/dist/chunks/chunk-ZCZZUE5E.js +662 -0
  49. package/dist/chunks/compaction-config-AEUGVROL.js +2 -0
  50. package/dist/chunks/{construction-bootstrap-VQLQGWPY.js → construction-bootstrap-K3ZGEN5N.js} +1 -1
  51. package/dist/chunks/dist-GFJFRPAV.js +2 -0
  52. package/dist/chunks/{dist-BFT5YIGU.js → dist-JMO47GJV.js} +1 -1
  53. package/dist/chunks/host-23K2Q6RZ.js +2 -0
  54. package/dist/chunks/run-manager-PGIR6ITA.js +2 -0
  55. package/dist/chunks/{utils-SID4HW2Q.js → utils-6LEKJPQN.js} +1 -1
  56. package/dist/index.d.ts +20 -20
  57. package/dist/index.js +2 -2
  58. package/dist/kodax_bootstrap.js +2 -1
  59. package/dist/kodax_cli.js +1816 -1458
  60. package/dist/kodax_resume.js +570 -34
  61. package/dist/provider-capabilities.json +85 -50
  62. package/dist/runtime-worker.js +1713 -1361
  63. package/dist/sandbox-workspace-session.js +285 -19
  64. package/dist/sdk-a2a.d.ts +19 -13
  65. package/dist/sdk-a2a.js +8 -8
  66. package/dist/sdk-agent.d.ts +73 -141
  67. package/dist/sdk-agent.js +1 -1
  68. package/dist/sdk-coding.d.ts +29 -60
  69. package/dist/sdk-coding.js +1 -1
  70. package/dist/sdk-experimental-memory.d.ts +3 -3
  71. package/dist/sdk-experimental-memory.js +1 -1
  72. package/dist/sdk-llm.d.ts +7 -7
  73. package/dist/sdk-llm.js +1 -1
  74. package/dist/sdk-mcp.d.ts +1 -1
  75. package/dist/sdk-mcp.js +1 -1
  76. package/dist/sdk-media.d.ts +1 -1
  77. package/dist/sdk-media.js +1 -1
  78. package/dist/sdk-repl.d.ts +25 -26
  79. package/dist/sdk-repl.js +2 -2
  80. package/dist/sdk-runtime.d.ts +227 -31
  81. package/dist/sdk-runtime.js +1 -1
  82. package/dist/sdk-sandbox.js +1 -1
  83. package/dist/sdk-session.d.ts +8 -8
  84. package/dist/sdk-session.js +1 -1
  85. package/dist/sdk-skills.js +1 -1
  86. package/dist/semantic-worker.js +283 -18
  87. package/dist/types-chunks/{base.d-4e74xDdy.d.ts → base.d-DxG0m09Z.d.ts} +1 -1
  88. package/dist/types-chunks/{bash-prefix-extractor.d-uAe2Oqda.d.ts → bash-prefix-extractor.d-CNSidpmv.d.ts} +28 -7
  89. package/dist/types-chunks/{capability-learning.d-CVsdHw4j.d.ts → capability-learning.d-iPSiAmc_.d.ts} +1 -1
  90. package/dist/types-chunks/{capsule.d-BlSv9l3V.d.ts → capsule.d-B3q98pLQ.d.ts} +9 -7
  91. package/dist/types-chunks/{types.d-BA-Jwpfs.d.ts → controller.d-RGV7Pjv9.d.ts} +328 -3
  92. package/dist/types-chunks/{guardrail.d-CXDYRgZ3.d.ts → guardrail.d-1NLSFTyN.d.ts} +126 -52
  93. package/dist/types-chunks/{history-retrieval.d-DtCy7x64.d.ts → history-retrieval.d-BAegI14A.d.ts} +16 -3
  94. package/dist/types-chunks/{oauth-login.d-Bgb4rdLN.d.ts → oauth-login.d-6i-vidxv.d.ts} +6 -2
  95. package/dist/types-chunks/{public-api.d-B3AohsxN.d.ts → public-api.d-BpJhHoa7.d.ts} +334 -25
  96. package/dist/types-chunks/{repl.d-Ie_ZXb_U.d.ts → repl.d-CZ12Ow3X.d.ts} +5 -5
  97. package/dist/types-chunks/{resolver.d-iAQ9ocLB.d.ts → resolver.d-C9IW4fmU.d.ts} +5 -2
  98. package/dist/types-chunks/{run-manager.d-D1twIhF9.d.ts → run-manager.d-CX3AUocA.d.ts} +1 -1
  99. package/dist/types-chunks/{sdk-session-DB9KksIx.d.ts → sdk-session-B3cfJKqF.d.ts} +3 -3
  100. package/dist/types-chunks/{side-query.d-DTuLPcC5.d.ts → side-query.d-CP1LiRiH.d.ts} +8 -2
  101. package/dist/types-chunks/{types-D3g6XUQr.d.ts → types-Bf3Y3mW-.d.ts} +1 -1
  102. package/dist/types-chunks/{types.d-BH0ZkTGf.d.ts → types.d-BZ9oXvTV.d.ts} +2 -2
  103. package/dist/types-chunks/{types.d-DVDTIfB_.d.ts → types.d-C0_rn--1.d.ts} +4 -4
  104. package/dist/types-chunks/{types.d-DIpZJKUl.d.ts → types.d-CgrXrFrq.d.ts} +16 -2
  105. package/dist/types-chunks/{utils.d-CVp6bFl9.d.ts → utils.d-CGpHavsU.d.ts} +14 -6
  106. package/docs/SDK_EMBEDDER_GUIDE.md +1144 -598
  107. package/package.json +4 -1
  108. package/dist/chunks/argument-completer-JYQ7FX3W.js +0 -2
  109. package/dist/chunks/chunk-35PPHOQ2.js +0 -292
  110. package/dist/chunks/chunk-43QNNDHR.js +0 -29
  111. package/dist/chunks/chunk-5GO6FH7L.js +0 -458
  112. package/dist/chunks/chunk-5NDCSFOP.js +0 -78
  113. package/dist/chunks/chunk-6XM4B6K2.js +0 -48
  114. package/dist/chunks/chunk-6YZUE6NC.js +0 -240
  115. package/dist/chunks/chunk-KQLQYHWU.js +0 -386
  116. package/dist/chunks/chunk-NXO6GWSY.js +0 -46
  117. package/dist/chunks/chunk-T2XZTLYE.js +0 -316
  118. package/dist/chunks/chunk-VAT2QYXM.js +0 -765
  119. package/dist/chunks/chunk-YVRYHC4C.js +0 -655
  120. package/dist/chunks/compaction-config-BQSSIWK5.js +0 -2
  121. package/dist/chunks/dist-PCFE24YP.js +0 -2
  122. package/dist/chunks/host-UTFXCYYM.js +0 -2
  123. package/dist/chunks/run-manager-PJU3WIFJ.js +0 -2
  124. package/dist/types-chunks/guardrail.d-BRE_ErEj.d.ts +0 -156
@@ -0,0 +1,292 @@
1
+ // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
+ import{Ja as Ee,La as Ae,Na as J,Ta as de,Wa as ce}from"./chunk-RQPMGRTR.js";import{d as B,g as U}from"./chunk-GEECPO2H.js";import{a}from"./chunk-ONUPGMER.js";import{spawn as De,spawnSync as Be}from"node:child_process";import{createHash as Ye,randomUUID as W}from"node:crypto";import{once as _e}from"node:events";import{constants as Ze,readdirSync as Qe,statSync as Ie,writeSync as sn}from"node:fs";import{copyFile as Le,lstat as er,mkdir as T,readFile as q,realpath as H,rename as rr,rm as N,stat as te,writeFile as K}from"node:fs/promises";import{createRequire as nr}from"node:module";import{createServer as tr}from"node:net";import se from"node:os";import o from"node:path";import or from"node:readline";import{fileURLToPath as Te,pathToFileURL as sr}from"node:url";import{DEFAULT_WINDOWS_PROXY_PORT_RANGE as ar,SandboxManager as le,getSrtWinPath as ir,getWindowsSandboxUserStatus as dr,grantWindowsAcl as cr,installWindowsSandbox as lr,resolveSrtWin as ur,revokeWindowsAcl as Me}from"@anthropic-ai/sandbox-runtime";var j="0.0.65";function pr(){let e=process.platform==="win32"?"windows-restricted-user":process.platform==="darwin"?"macos-seatbelt":process.platform==="linux"?"linux-bubblewrap":"unsupported";return{version:1,asrtVersion:j,platform:process.platform,backend:e,genericCommandExecution:!0,controls:["filesystem","network","environment","timeout","output"],ordinaryCallsTriggerSetup:!1,setupMayElevate:process.platform==="win32",unavailableBehavior:"structured-no-execution",permissionFallback:"normal-permission-policy"}}a(pr,"sandboxRuntimeCapability");var be=1048576,ye=12e4,$e=nr(import.meta.url),je=process.env.KODAX_BUNDLED==="true"?void 0:sr($e.resolve("@anthropic-ai/sandbox-runtime")).href,fr=new Set([".ssh",".aws",".azure",".gnupg",".kodax",".agents",".codex",".claude",".gemini",".direnv",".terraform.d"]),mr=new Set([".env",".envrc",".pgpass",".npmrc",".pypirc","credentials","id_rsa","id_ed25519"]),wr=[".ssh",".aws",".azure",".gnupg",".kube",".docker",".kodax",".agents",".codex",".claude",".gemini",".direnv",".terraform.d",o.join(".cargo","credentials.toml"),o.join(".config","gcloud"),o.join(".config","gh"),o.join(".config","openai"),o.join(".config","anthropic"),".gitconfig",o.join(".config","git","config"),".terraformrc",o.join(".config","pypoetry","auth.toml"),".condarc",".bashrc",".bash_profile",".zshrc",".zprofile",".profile",o.join(".config","fish","config.fish"),o.join(".config","fish","fish_variables"),".bash_history",".zsh_history",o.join(".m2","settings.xml"),o.join(".m2","settings-security.xml"),o.join(".gradle","gradle.properties"),o.join(".nuget","NuGet","NuGet.Config"),o.join(".pip","pip.conf"),o.join(".config","pip","pip.conf"),o.join(".cache","huggingface","token"),o.join(".huggingface","token"),o.join(".config","rclone","rclone.conf"),o.join(".local","share","keyrings"),o.join("Library","Keychains"),o.join("AppData","Roaming","Microsoft","Protect"),o.join("AppData","Roaming","Microsoft","Credentials"),o.join("AppData","Roaming","Microsoft","Vault"),o.join("AppData","Local","Microsoft","Credentials"),o.join("AppData","Local","Microsoft","Protect"),o.join("AppData","Local","Microsoft","Vault"),".password-store",".env",".envrc",".pgpass",".env.local",".env.development",".env.production",".env.test",".env.staging",".npmrc",".pypirc",".netrc",".git-credentials","credentials","credentials.json","application_default_credentials.json","id_rsa","id_dsa","id_ecdsa","id_ed25519"],Pe=JSON.stringify(Ae),ue=JSON.stringify(Ee),gr=String.raw`
3
+ const { spawn } = require('node:child_process');
4
+ const { writeSync } = require('node:fs');
5
+ const input = JSON.parse(Buffer.from(process.argv[2], 'base64').toString('utf8'));
6
+ const child = spawn(input.command, input.args, {
7
+ cwd: input.cwd,
8
+ env: process.env,
9
+ shell: false,
10
+ stdio: ['inherit', 'inherit', 'pipe'],
11
+ windowsHide: true,
12
+ });
13
+ const stop = (signal) => child.kill(signal);
14
+ process.once('SIGINT', () => stop('SIGINT'));
15
+ process.once('SIGTERM', () => stop('SIGTERM'));
16
+ child.once('spawn', () => {
17
+ writeSync(2, input.targetStartedMarker);
18
+ child.stderr.pipe(process.stderr);
19
+ });
20
+ child.once('error', (error) => {
21
+ process.stderr.write((error instanceof Error ? error.message : String(error)) + '\n');
22
+ process.exitCode = 1;
23
+ });
24
+ child.once('exit', (code, signal) => {
25
+ process.exitCode = signal ? 1 : code ?? 1;
26
+ });
27
+ `,Sr="eval(Buffer.from(process.argv[1],'base64').toString('utf8'))",br=JSON.stringify(Sr),yr=Buffer.from(gr,"utf8").toString("base64"),hr=JSON.stringify(yr),qe=String.raw`
28
+ import { spawn } from 'node:child_process';
29
+ import { randomUUID } from 'node:crypto';
30
+ import { readFile, rm, writeFile } from 'node:fs/promises';
31
+ let SandboxManager;
32
+ const request = JSON.parse(await readFile(process.argv[2], 'utf8'));
33
+ await rm(process.argv[2], { force: true });
34
+ const targetStartedMarker = request.targetStartedMarker
35
+ ?? '\u0000KODAX_ASRT_TARGET_STARTED:' + randomUUID() + '\u0000\n';
36
+ const endpoints = new Set(request.endpoints.map((item) => item.host.toLowerCase() + ':' + item.port));
37
+ const callback = request.allowAllNetwork === true
38
+ ? async () => true
39
+ : request.endpoints.length === 0
40
+ ? undefined
41
+ : async ({ host, port }) => endpoints.has(host.toLowerCase() + ':' + port);
42
+ const withWindowsChildEnvironment = (argv, environment) => {
43
+ const separator = argv.lastIndexOf('--');
44
+ if (separator < 0) throw new Error('ASRT Windows wrapper omitted its child separator.');
45
+ const controlled = new Set();
46
+ for (let index = 0; index < separator - 1; index += 1) {
47
+ if (argv[index] !== '--env') continue;
48
+ const name = argv[index + 1].split('=', 1)[0];
49
+ if (name) controlled.add(name.toLowerCase());
50
+ }
51
+ const injected = [];
52
+ for (const [name, value] of Object.entries(environment ?? {})) {
53
+ if (value === undefined) continue;
54
+ if (!name || name.includes('=') || name.includes('\0') || value.includes('\0')) {
55
+ throw new Error('Invalid environment entry for ASRT Windows child.');
56
+ }
57
+ const normalized = name.toLowerCase();
58
+ if (controlled.has(normalized) && normalized !== 'path' && normalized !== 'pathext') continue;
59
+ injected.push('--env', name + '=' + value);
60
+ }
61
+ const result = [...argv.slice(0, separator), ...injected, ...argv.slice(separator)];
62
+ const estimate = result.reduce((size, value) => size + value.length + 3, 0);
63
+ if (estimate > 30000) throw new Error('ASRT Windows child environment exceeds the CreateProcess command-line limit.');
64
+ return result;
65
+ };
66
+ const writeObservation = async (observation) => {
67
+ if (typeof request.observationFile !== 'string') return;
68
+ await writeFile(request.observationFile, JSON.stringify(observation), { mode: 0o600 });
69
+ };
70
+ const waitForTarget = (target, observation) => {
71
+ const marker = Buffer.from(targetStartedMarker, 'utf8');
72
+ let pending = Buffer.alloc(0);
73
+ let diagnostic = Buffer.alloc(0);
74
+ let processError;
75
+ let targetStarted = false;
76
+ let observationWrite = Promise.resolve();
77
+ return new Promise((resolve, reject) => {
78
+ let settled = false;
79
+ const finish = (result) => {
80
+ if (settled) return;
81
+ settled = true;
82
+ void observationWrite.then(() => resolve(result), reject);
83
+ };
84
+ target.stderr.on('data', (chunk) => {
85
+ if (targetStarted) {
86
+ process.stderr.write(chunk);
87
+ return;
88
+ }
89
+ pending = Buffer.concat([pending, Buffer.from(chunk)]);
90
+ const markerOffset = pending.indexOf(marker);
91
+ if (markerOffset >= 0) {
92
+ targetStarted = true;
93
+ const suffix = pending.subarray(markerOffset + marker.length);
94
+ pending = Buffer.alloc(0);
95
+ diagnostic = Buffer.alloc(0);
96
+ observationWrite = writeObservation(observation).catch(() => undefined);
97
+ if (suffix.length > 0) process.stderr.write(suffix);
98
+ return;
99
+ }
100
+ const retained = Math.max(0, marker.length - 1);
101
+ if (pending.length > retained) {
102
+ diagnostic = Buffer.concat([
103
+ diagnostic,
104
+ pending.subarray(0, pending.length - retained),
105
+ ]).subarray(-65536);
106
+ pending = pending.subarray(pending.length - retained);
107
+ }
108
+ });
109
+ target.once('error', (error) => {
110
+ processError = error instanceof Error ? error.message : String(error);
111
+ });
112
+ target.once('close', (exitCode, signal) => {
113
+ const preTarget = Buffer.concat([diagnostic, pending]).toString('utf8').trim();
114
+ finish({
115
+ exitCode: signal ? 1 : exitCode ?? 1,
116
+ targetStarted,
117
+ diagnostic: preTarget || processError || undefined,
118
+ });
119
+ });
120
+ });
121
+ };
122
+ let child;
123
+ let targetStarted = false;
124
+ let normalFallbackAttempted = false;
125
+ const runDirect = async () => {
126
+ const internalElectronNode = request.command === process.execPath && process.versions.electron !== undefined;
127
+ const directArgs = internalElectronNode
128
+ ? ['--import', ${Pe}, ...request.args]
129
+ : request.args;
130
+ const directEnv = internalElectronNode
131
+ ? { ...request.env, [${ue}]: '1' }
132
+ : request.env;
133
+ child = spawn(request.command, directArgs, {
134
+ cwd: request.cwd,
135
+ env: directEnv,
136
+ shell: false,
137
+ stdio: 'inherit',
138
+ windowsHide: true,
139
+ });
140
+ return await new Promise((resolve, reject) => {
141
+ child.once('error', reject);
142
+ child.once('exit', (exitCode, signal) => resolve(signal ? 1 : exitCode ?? 1));
143
+ });
144
+ };
145
+ try {
146
+ if (request.wrappedInvocation) {
147
+ const wrapped = request.wrappedInvocation;
148
+ child = spawn(wrapped.executable, wrapped.args, {
149
+ cwd: request.cwd,
150
+ env: wrapped.env,
151
+ shell: wrapped.shell,
152
+ stdio: ['inherit', 'inherit', 'pipe'],
153
+ windowsHide: true,
154
+ });
155
+ const result = await waitForTarget(child, {
156
+ version: 1,
157
+ state: 'applied',
158
+ backend: request.observationBackend ?? 'unsupported',
159
+ policyId: 'kodax-workspace-shell-v1',
160
+ });
161
+ targetStarted = result.targetStarted;
162
+ if (request.fallbackToNormalExecution === true && !targetStarted) {
163
+ await writeObservation({
164
+ version: 1,
165
+ state: 'fallback',
166
+ reason: 'backend_failed',
167
+ execution: 'normal_permission_policy',
168
+ }).catch(() => undefined);
169
+ normalFallbackAttempted = true;
170
+ process.exitCode = await runDirect();
171
+ } else {
172
+ if (!targetStarted && result.diagnostic) {
173
+ process.stderr.write(result.diagnostic + '\n');
174
+ }
175
+ process.exitCode = result.exitCode;
176
+ }
177
+ } else {
178
+ ({ SandboxManager } = await import(process.argv[1]));
179
+ const bootstrap = request.bootstrapCommand ?? 'node';
180
+ const bootstrapIsAbsolute = /^(?:[A-Za-z]:[\\/]|\\\\)/.test(bootstrap);
181
+ const bootstrapIsElectronNode = bootstrap === process.execPath
182
+ && process.versions.electron !== undefined;
183
+ const config = process.platform === 'win32' && bootstrapIsAbsolute
184
+ ? {
185
+ ...request.config,
186
+ filesystem: {
187
+ ...request.config.filesystem,
188
+ allowRead: [...new Set([...request.config.filesystem.allowRead, bootstrap])],
189
+ },
190
+ }
191
+ : request.config;
192
+ await SandboxManager.initialize(config, callback);
193
+ const quote = (value) => process.platform === 'win32'
194
+ ? '"' + value.replaceAll('"', '""') + '"'
195
+ : "'" + value.replaceAll("'", "'\"'\"'") + "'";
196
+ const internalElectronNode = request.command === process.execPath && process.versions.electron !== undefined;
197
+ const childArgs = internalElectronNode
198
+ ? ['--import', ${Pe}, ...request.args]
199
+ : request.args;
200
+ const command = [
201
+ quote(bootstrap),
202
+ '-e',
203
+ quote(${br}),
204
+ ${hr},
205
+ Buffer.from(JSON.stringify({
206
+ command: request.command,
207
+ args: childArgs,
208
+ cwd: request.cwd,
209
+ targetStartedMarker,
210
+ }), 'utf8').toString('base64'),
211
+ ].join(' ');
212
+ if (process.platform === 'win32') {
213
+ const wrapped = await SandboxManager.wrapWithSandboxArgv(command, 'cmd', undefined, undefined, request.cwd);
214
+ const requestedEnv = internalElectronNode || bootstrapIsElectronNode
215
+ ? { ...request.env, [${ue}]: '1' }
216
+ : request.env;
217
+ const childArgv = withWindowsChildEnvironment(wrapped.argv, requestedEnv);
218
+ child = spawn(childArgv[0], childArgv.slice(1), {
219
+ cwd: request.cwd,
220
+ env: wrapped.env,
221
+ shell: false,
222
+ stdio: ['inherit', 'inherit', 'pipe'],
223
+ windowsHide: true,
224
+ });
225
+ } else {
226
+ const wrapped = await SandboxManager.wrapWithSandbox(command);
227
+ const childEnv = internalElectronNode || bootstrapIsElectronNode
228
+ ? { ...request.env, [${ue}]: '1' }
229
+ : request.env;
230
+ child = spawn(wrapped, {
231
+ cwd: request.cwd,
232
+ env: childEnv,
233
+ shell: true,
234
+ stdio: ['inherit', 'inherit', 'pipe'],
235
+ });
236
+ }
237
+ const stop = () => child?.kill('SIGTERM');
238
+ process.once('SIGINT', stop);
239
+ process.once('SIGTERM', stop);
240
+ const result = await waitForTarget(child, {
241
+ version: 1,
242
+ state: 'applied',
243
+ backend: request.observationBackend ?? 'unsupported',
244
+ policyId: 'kodax-workspace-shell-v1',
245
+ });
246
+ targetStarted = result.targetStarted;
247
+ try { SandboxManager.cleanupAfterCommand(); } catch {}
248
+ await SandboxManager.reset().catch(() => undefined);
249
+ if (request.fallbackToNormalExecution === true && !targetStarted) {
250
+ await writeObservation({
251
+ version: 1,
252
+ state: 'fallback',
253
+ reason: 'backend_failed',
254
+ execution: 'normal_permission_policy',
255
+ }).catch(() => undefined);
256
+ normalFallbackAttempted = true;
257
+ process.exitCode = await runDirect();
258
+ } else {
259
+ if (!targetStarted && result.diagnostic) {
260
+ process.stderr.write(result.diagnostic + '\n');
261
+ }
262
+ process.exitCode = result.exitCode;
263
+ }
264
+ }
265
+ } catch (error) {
266
+ await SandboxManager?.reset().catch(() => undefined);
267
+ if (
268
+ request.fallbackToNormalExecution === true
269
+ && !targetStarted
270
+ && !normalFallbackAttempted
271
+ ) {
272
+ try {
273
+ await writeObservation({
274
+ version: 1,
275
+ state: 'fallback',
276
+ reason: 'backend_failed',
277
+ execution: 'normal_permission_policy',
278
+ }).catch(() => undefined);
279
+ normalFallbackAttempted = true;
280
+ process.exitCode = await runDirect();
281
+ } catch (fallbackError) {
282
+ process.stderr.write((fallbackError instanceof Error ? fallbackError.message : String(fallbackError)) + '\n');
283
+ process.exitCode = 1;
284
+ }
285
+ } else {
286
+ process.stderr.write((error instanceof Error ? error.message : String(error)) + '\n');
287
+ process.exitCode = 1;
288
+ }
289
+ }
290
+ `,M,ee=0,vr=3e4,G,oe,I;function we(e){return e instanceof Error?e.message:String(e)}a(we,"errorText");function ge(e,...n){return e instanceof Error&&"code"in e&&typeof e.code=="string"&&n.includes(e.code)}a(ge,"isFileSystemError");async function Ce(e){try{return await q(e)}catch(n){if(ge(n,"ENOENT"))return;throw n}}a(Ce,"readFileIfPresent");async function xr(e,n){let r=await Ce(n);if(r?.equals(e))return;if(r!==void 0)throw new Error(`Prepared Windows sandbox runner failed integrity verification: ${n}.`);let t=`${n}.${process.pid}.${W()}.tmp`;try{await K(t,e,{flag:"wx",mode:448});try{await rr(t,n)}catch(s){if(!(await Ce(n))?.equals(e))throw s}}finally{await N(t,{force:!0})}}a(xr,"installWindowsRunnerCopy");async function kr(){if(G===void 0){let e=(async()=>{let n=await q(ir()),r=Ye("sha256").update(n).digest("hex").slice(0,16),t=o.join(o.resolve(U()),"sandbox-runtime","runner",j,process.arch,r),s=o.join(t,"srt-win.exe");await T(t,{recursive:!0,mode:448}),await xr(n,s);let i={path:s,directory:t,srtWin:ur({path:s})};return oe=i,i})();G=e,e.catch(()=>{G===e&&(G=void 0,oe=void 0)})}return G}a(kr,"prepareWindowsSandboxRunner");function he(){if(process.platform!=="win32")throw new Error("A prepared Windows sandbox runner was requested on a non-Windows platform.");if(oe===void 0)throw new Error("Windows sandbox runner is not prepared; run the sandbox readiness check first.");return oe}a(he,"requirePreparedWindowsRunner");function pe(){I!==void 0&&(Me({sandboxUserSid:I.sandboxUserSid,holderPid:process.pid,srtWin:I.runner.srtWin}),I=void 0)}a(pe,"releasePreparedWindowsRunnerGrant");function Rr(e,n){if(!(I?.runner.path===e.path&&I.sandboxUserSid===n)){process.removeListener("exit",pe),pe();try{cr({read:[e.directory,e.path],write:[],sandboxUserSid:n,holderPid:process.pid,srtWin:e.srtWin})}catch(r){try{Me({sandboxUserSid:n,holderPid:process.pid,srtWin:e.srtWin})}catch(t){throw new AggregateError([r,t],"Windows sandbox runner ACL grant failed and its partial grant could not be revoked.")}throw r}I={runner:e,sandboxUserSid:n},process.once("exit",pe)}}a(Rr,"retainPreparedWindowsRunnerGrant");async function Er(){let[e,n]=ar;for(let r=0;r<5;r+=1){let t=tr();t.listen(0,"127.0.0.1"),await _e(t,"listening");let s=t.address();if(typeof s=="object"&&s!==null&&(s.port<e||s.port>n))return{server:t,target:`127.0.0.1:${s.port}`};let i=_e(t,"close");t.close(),await i}throw new Error(`[wfp_probe_bind_failed] Could not bind a loopback listener outside the Windows sandbox proxy range [${e},${n}].`)}a(Er,"bindWindowsWfpProbe");function Oe(e){return/0x80070005|access (?:is )?denied|拒绝访问/i.test(e)?"runner_launch_access_denied":/seclogon|secondary logon/i.test(e)?"secondary_logon_unavailable":"wfp_probe_failed"}a(Oe,"windowsRunnerFailureCode");function Ar(e){return ge(e,"ETIMEDOUT")?"wfp_probe_timeout":ge(e,"EACCES","EPERM")?"runner_launch_access_denied":"runner_spawn_failed"}a(Ar,"windowsRunnerSpawnFailureCode");async function _r(e){let{server:n,target:r}=await Er();try{let t=Be(e.srtWin.exe,[...e.srtWin.prependArgs,"wfp","verify","--target",r],{cwd:e.directory,encoding:"utf8",timeout:3e4,windowsHide:!0}),s=(t.stderr??"").trim();if(t.error)throw new Error(`[${Ar(t.error)}] Windows sandbox runner failed to start: ${t.error.message}`);let i;try{i=JSON.parse((t.stdout??"").trim())}catch{let c=t.status===null?"wfp_probe_timeout":Oe(s);throw new Error(`[${c}] Windows sandbox WFP probe exited ${String(t.status)}${t.signal?` (signal ${t.signal})`:""} with unparseable output; stderr: ${s||"(empty)"}.`)}if(t.status===3)throw new Error(`[wfp_fence_inactive] Direct outbound access to ${String(i.target??r)} succeeded. Run "kodax sandbox setup" to reinstall the Windows network policy.`);if(t.status!==0||i.egress_probe!=="blocked")throw new Error(`[${Oe(s)}] Windows sandbox WFP probe to ${String(i.target??r)} was ${String(i.egress_probe)} (exit ${String(t.status)}): ${s||"(empty stderr)"}.`)}finally{n.close()}}a(_r,"verifyPreparedWindowsWfp");function Tr(e){let n=[];return e.provisioned||n.push("Windows sandbox account does not exist."),e.sid||n.push("Windows sandbox account SID is unavailable."),(!e.groupExists||!e.groupSid)&&n.push("Windows sandbox local group is unavailable."),e.inBuiltinUsers||n.push("Windows sandbox account is not in the built-in Users group."),e.inSandboxGroup||n.push("Windows sandbox account is not in the sandbox-runtime-users group."),e.hiddenFromLogon||n.push("Windows sandbox account is not hidden from interactive logon."),e.credPresent||n.push("Windows sandbox account credential is unavailable."),n}a(Tr,"windowsSandboxAccountDiagnostics");function Pr(e){let n=JSON.parse(e);if(typeof n!="object"||n===null)return;let r=n;if(r.version===1&&(r.state==="applied"&&r.policyId==="kodax-workspace-shell-v1"&&(r.backend==="windows-restricted-user"||r.backend==="macos-seatbelt"||r.backend==="linux-bubblewrap"||r.backend==="unsupported")||r.state==="fallback"&&r.reason==="backend_failed"&&r.execution==="normal_permission_policy"))return r}a(Pr,"parseBrokerObservation");function ae(){return process.env.KODAX_A2A_NODE??(process.env.KODAX_BUNDLED==="true"?"node":process.execPath)}a(ae,"sandboxJavaScriptCommand");async function L(e={}){if(e.refresh||M===void 0||Date.now()>=ee){let n=Cr();M=n,ee=Number.POSITIVE_INFINITY,n.then(r=>{M===n&&(ee=r.ready?Number.POSITIVE_INFINITY:Date.now()+vr)},()=>{M===n&&(M=void 0,ee=0)})}return M}a(L,"doctorSandboxRuntime");async function Cr(){let e=[];le.isSupportedPlatform()||e.push(`Unsupported platform: ${process.platform}.`);let n=le.checkDependencies();e.push(...n.warnings,...n.errors);let r=n.errors.length>0;if(process.env.KODAX_BUNDLED!=="true")try{let c=JSON.parse(await q($e.resolve("@anthropic-ai/sandbox-runtime/package.json"),"utf8"));c.version!==j&&(r=!0,e.push(`ASRT package version mismatch: expected ${j}, found ${String(c.version)}.`))}catch(c){r=!0,e.push(`ASRT package provenance check failed: ${we(c)}`)}let t=ae(),s=J({args:["--version"],env:X(),isElectron:t===process.execPath&&process.versions.electron!==void 0}),i=Be(t,s.args,{env:s.env,shell:!1,encoding:"utf8",windowsHide:!0,timeout:5e3});if(i.status!==0){r=!0;let c=i.error?.message??(i.stderr.trim()||t);e.push(`JavaScript Skill interpreter is unavailable: ${c}.`)}if(process.platform==="win32")try{let c=await kr(),d=dr({srtWin:c.srtWin}),l=Tr(d);l.length>0||!d.sid?(r=!0,e.push(...l)):(Rr(c,d.sid),await _r(c))}catch(c){r=!0,e.push(we(c))}return{ready:le.isSupportedPlatform()&&!r,platform:process.platform,version:j,diagnostics:e,setupRequired:r}}a(Cr,"inspectSandboxRuntime");async function Or(){if(process.platform!=="win32")return L({refresh:!0});if(lr().cancelled)throw new Error("Sandbox setup was cancelled.");return L({refresh:!0})}a(Or,"setupSandboxRuntime");function re(e){return e.ready?[`KodaX sandbox is active (${e.platform}, ASRT ${e.version}).`]:e.platform==="win32"?['Run "kodax sandbox setup". Windows will show a UAC prompt for the one-time sandbox account and network policy setup.',"The terminal itself does not need to be started as Administrator; approve the UAC prompt when it appears."]:e.platform==="darwin"?['KodaX uses macOS Seatbelt through sandbox-exec. Install the missing dependency, then rerun "kodax sandbox doctor".',"Homebrew: brew install ripgrep"]:e.platform==="linux"?['KodaX uses bubblewrap on Linux. Install bubblewrap, socat, and ripgrep, then rerun "kodax sandbox doctor".',"Debian/Ubuntu: sudo apt install bubblewrap socat ripgrep","Fedora/RHEL: sudo dnf install bubblewrap socat ripgrep","Arch Linux: sudo pacman -S bubblewrap socat ripgrep"]:[`KodaX sandbox is not supported on ${e.platform}.`]}a(re,"sandboxSetupGuidance");async function gn(e={}){let n=await L({refresh:!0});if(n.ready)return{status:"ready",attempted:!1,doctor:n,guidance:re(n)};if(n.platform!=="win32"||e.allowElevation===!1)return{status:"unavailable",attempted:!1,doctor:n,guidance:re(n)};try{let r=await Or();return{status:r.ready?"ready":"unavailable",attempted:!0,doctor:r,guidance:re(r)}}catch(r){let t=await L({refresh:!0}),s=we(r);return{status:/cancelled/i.test(s)?"cancelled":"unavailable",attempted:!0,doctor:t,guidance:re(t),error:s}}}a(gn,"prepareSandboxRuntimeForSetup");function D(e,n){let r=e.replaceAll("\\","/").replace(/^\.\//,"");if(!r||o.posix.isAbsolute(r)||r.split("/").includes(".."))throw new Error(`${n} must be a safe relative path.`);return r}a(D,"canonicalRelative");function F(e,n){let r=o.relative(e,n);return r===""||!r.startsWith("..")&&!o.isAbsolute(r)}a(F,"isInside");function Ke(e){let n=e.split(o.sep).map(r=>r.toLowerCase());return n.some(r=>fr.has(r))||n.some(r=>mr.has(r)||r.startsWith(".env."))}a(Ke,"isSensitiveRelative");async function Wr(e,n){await T(n,{recursive:!0,mode:448});let r=[...(e.scripts??[]).map(t=>({folder:"scripts",file:t})),...(e.references??[]).map(t=>({folder:"references",file:t})),...(e.assets??[]).map(t=>({folder:"assets",file:t})),...(e.templates??[]).map(t=>({folder:"templates",file:t})),...(e.resources??[]).map(t=>({folder:"resources",file:t}))];await K(o.join(n,"SKILL.md"),await q(e.skillFilePath),{mode:384});for(let{folder:t,file:s}of r){let i=D(s.relativePath,`Skill ${e.name} support file`),c=o.join(n,t,...i.split("/"));await T(o.dirname(c),{recursive:!0,mode:448}),await K(c,await q(s.path),{mode:384})}}a(Wr,"copySkillSnapshot");async function Nr(e,n){let r=new Map;for(let[t,s]of Object.entries(e.admissions)){let i=await e.registry.loadFull(t),c=new Map((i.scripts??[]).map(l=>[`scripts/${D(l.relativePath,`Skill ${t} script`)}`,l])),d=o.join(n,t.replace(/[^A-Za-z0-9._-]/g,"_"));await Wr(i,d);for(let l of s){let u=D(l,`toolPolicy.skillScripts.${t}`);if(!c.has(u))throw new Error(`Skill "${t}" has no script "${u}".`);r.set(`${t}\0${u}`,{skill:t,relativePath:u,snapshotPath:o.join(d,...u.split("/"))})}}return r}a(Nr,"snapshotAdmissions");function Dr(e){return e.mode==="deny"?[]:e.origins.map(n=>{let r=new URL(n);return{host:r.hostname.toLowerCase(),port:r.port?Number(r.port):r.protocol==="https:"?443:80}})}a(Dr,"networkEndpoints");function X(){let e=["PATH","Path","PATHEXT","SystemRoot","COMSPEC","TEMP","TMP","HOME","USERPROFILE","LOCALAPPDATA","LANG"],n={NO_COLOR:"1"};for(let r of e)process.env[r]!==void 0&&(n[r]=process.env[r]);for(let[r,t]of Object.entries(process.env))r.startsWith("LC_")&&t!==void 0&&(n[r]=t);return n}a(X,"sanitizedEnvironment");function Br(e){let n=o.extname(e).toLowerCase();if([".js",".mjs",".cjs"].includes(n))return{command:process.env.KODAX_A2A_NODE??(process.env.KODAX_BUNDLED==="true"?"node":process.execPath),args:[e]};if(n===".py")return{command:process.env.KODAX_A2A_PYTHON??(process.platform==="win32"?"python.exe":"python3"),args:[e]};if(n===".ps1")return{command:process.env.KODAX_A2A_POWERSHELL??(process.platform==="win32"?o.join(process.env.SystemRoot??"C:\\Windows","System32","WindowsPowerShell","v1.0","powershell.exe"):"pwsh"),args:["-NoProfile","-NonInteractive","-File",e]};if(n===".sh"&&process.platform!=="win32")return{command:"/bin/sh",args:[e]};if([".cmd",".bat"].includes(n)&&process.platform==="win32")return{command:process.env.COMSPEC??o.join(process.env.SystemRoot??"C:\\Windows","System32","cmd.exe"),args:["/d","/s","/c",e]};throw new Error(`Unsupported admitted Skill script type: ${n||"<none>"}.`)}a(Br,"interpreterFor");var We=250,Ir=1500;async function Lr(e,n,r=ye,t=be){let s=[],i=[],c=0,d,l=a(()=>{},"rejectStopped"),u,w=new Promise((m,f)=>{l=f}),b=a(m=>{if(d!==void 0)return;d=m;let f=!1,h=a(()=>{f||(f=!0,u!==void 0&&clearTimeout(u),l(m))},"finish");u=setTimeout(()=>{try{e.kill("SIGKILL")}finally{h()}},Ir),ce(e,{forceMs:We,taskkillMs:We}).then(h,h)},"requestStop"),v=a((m,f)=>{c+=f.byteLength,c>t?b(new Error(`Sandboxed command output exceeded ${t} bytes.`)):m.push(f)},"append");e.stdout?.on("data",m=>{v(s,m)}),e.stderr?.on("data",m=>{v(i,m)});let y=setTimeout(()=>{b(new Error(`Sandboxed command exceeded its ${r} ms timeout.`))},r),g=a(()=>{let m=n?.reason;b(m instanceof Error?m:new Error("Sandboxed command was cancelled."))},"abort");n?.addEventListener("abort",g,{once:!0}),n?.aborted&&g();try{let m=new Promise((h,P)=>{e.once("error",P),e.once("close",z=>h(z??1))}),f=await Promise.race([m,w]);if(d!==void 0)throw d;return{exitCode:f,stdout:Buffer.concat(s).toString("utf8"),stderr:Buffer.concat(i).toString("utf8")}}finally{clearTimeout(y),u!==void 0&&clearTimeout(u),n?.removeEventListener("abort",g)}}a(Lr,"collectProcess");async function Fe(e,n,r=ye,t=be){let s=o.join(se.tmpdir(),`kodax-asrt-${process.pid}-${W()}.json`),i={...e,bootstrapCommand:e.bootstrapCommand??ae(),config:{...e.config,filesystem:{...e.config.filesystem,denyRead:[...e.config.filesystem.denyRead,s]}}};await K(s,JSON.stringify(i),{mode:384});try{let c=process.env.KODAX_BUNDLED==="true"?["__asrt-broker",s]:["--input-type=module","-e",qe,je,s],d=J({args:c,env:X(),isElectron:process.versions.electron!==void 0}),l=De(process.execPath,d.args,{cwd:process.platform==="win32"?he().directory:void 0,env:d.env,shell:!1,stdio:["ignore","pipe","pipe"],windowsHide:!0,detached:process.platform!=="win32"});return de(l),await Lr(l,n,r,t)}finally{await N(s,{force:!0})}}a(Fe,"runBrokerResult");async function Mr(e,n){let r=await Fe(e,n);if(r.exitCode!==0){let t=r.stderr.trim()||r.stdout.trim();throw new Error(`Sandboxed Skill script failed (${r.exitCode}): ${t}`)}return r.stdout}a(Mr,"runBroker");async function $r(e,n){let r=await H(e),t=o.resolve(e,D(n,"Skill script input")),s=await H(t);if(!F(r,s)||Ke(o.relative(r,s)))throw new Error("Skill script input is outside the permitted workspace surface.");if(!(await te(s)).isFile())throw new Error("Skill script inputs must be files.");return s}a($r,"workspaceSource");async function jr(e,n){let r=await H(e),t=o.resolve(e,D(n,"Skill script output target"));if(!F(o.resolve(e),t)||Ke(o.relative(o.resolve(e),t)))throw new Error("Skill script output target is outside the permitted workspace surface.");if(await T(o.dirname(t),{recursive:!0}),!F(r,await H(o.dirname(t))))throw new Error("Skill script output target escapes through a symlink.");try{throw await te(t),new Error("Skill script output target already exists.")}catch(s){if(s.code!=="ENOENT")throw s}return t}a(jr,"workspaceTarget");async function qr(e,n,r,t){if(r.inputs.length>0&&t==="none")throw new Error("Skill script inputs require workspace read access.");for(let s of r.inputs){let i=await $r(e,s.path),c=D(s.as??o.basename(i),"Skill script staged input"),d=o.resolve(n,"inputs",...c.split("/"));if(!F(o.join(n,"inputs"),d))throw new Error("Skill script staged input escapes staging.");await T(o.dirname(d),{recursive:!0,mode:448}),await Le(i,d)}}a(qr,"stageInputFiles");async function Kr(e,n,r,t,s){if(r.outputs.length>0&&t!=="write")throw new Error("Skill script outputs require workspace write access.");let i=[];for(let c of r.outputs){let d=D(c.path,"Skill script staged output"),l=o.resolve(n,"outputs",...d.split("/")),u=await H(l);if(!F(o.join(n,"outputs"),u)||(await er(l)).isSymbolicLink()||!(await te(l)).isFile())throw new Error(`Skill script did not produce output "${d}".`);let w=await jr(e,c.target);if(s!==void 0&&Xe(e,!0)+(await te(l)).size>s)throw new Error("Skill script outputs would exceed the remote workspace byte quota.");await Le(l,w,Ze.COPYFILE_EXCL),i.push(o.relative(e,w))}return i}a(Kr,"promoteOutputs");function Xe(e,n=!1){let r=0;for(let t of Qe(e,{withFileTypes:!0})){if(n&&t.name===".kodax-a2a-script"||t.isSymbolicLink())continue;let s=o.join(e,t.name);t.isDirectory()?r+=Xe(s):t.isFile()&&(r+=Ie(s).size)}return r}a(Xe,"directorySize");function ve(e){if(process.platform!=="win32")return e;let n=he();return{...e,windows:{...e.windows,srtWin:{path:n.path}},filesystem:{...e.filesystem,allowRead:[...new Set([...e.filesystem.allowRead,n.directory])],denyWrite:[...new Set([...e.filesystem.denyWrite??[],n.directory])]}}}a(ve,"withPreparedWindowsRunner");function Fr(e,n,r,t){let s=se.homedir(),i=o.isAbsolute(t)?[t]:[];return ve({network:{allowedDomains:[],deniedDomains:[],strictAllowlist:r.length===0,allowUnixSockets:[],allowAllUnixSockets:!1,allowLocalBinding:!1},filesystem:{denyRead:[s],allowRead:[e,n,process.execPath,...i],allowWrite:[e],denyWrite:[s]}})}a(Fr,"sandboxConfig");function Xr(){let e=[se.tmpdir(),process.env.TEMP,process.env.TMP,process.env.TMPDIR,...process.platform==="win32"?[]:["/tmp","/var/tmp"]];return[...new Set(e.filter(n=>typeof n=="string"&&o.isAbsolute(n)).map(n=>o.resolve(n)))]}a(Xr,"canonicalTempDirectories");function Ur(e){return[o.join(e,".git","config"),o.join(e,".git","hooks")].filter(r=>{try{return Ie(r),!0}catch{return!1}})}a(Ur,"existingWorkspaceDenyWrites");function Jr(e,n,r){return[...new Set([o.resolve(r),o.resolve(n),...wr.map(t=>o.resolve(e,t))])]}a(Jr,"workspaceShellSensitiveReadDenies");function Ue(e){let n=o.resolve(U()),r=o.join(n,"sandbox-runtime"),t=o.resolve(se.homedir()),s=Jr(t,n,r),i=(process.env.PATH??process.env.Path??"").split(o.delimiter).map(d=>d.replace(/^"|"$/g,"")).filter(d=>o.isAbsolute(d)).map(d=>o.resolve(d)).filter(d=>{let l=o.relative(t,d);return l!==""&&!l.startsWith("..")&&!o.isAbsolute(l)&&!s.some(u=>F(u,d))}),c=ae();return ve({network:{allowedDomains:[],deniedDomains:[],strictAllowlist:!1,allowUnixSockets:[],allowAllUnixSockets:!1,allowLocalBinding:!1},filesystem:{denyRead:s,allowRead:[...new Set([...i,...o.isAbsolute(c)?[c]:[]])],allowWrite:[e,...Xr()],denyWrite:[r,...Ur(e)]}})}a(Ue,"workspaceShellSandboxConfig");function Gr(e){let n=Ue(e);return process.platform!=="win32"?n:{...n,filesystem:{...n.filesystem,denyRead:[o.resolve(U(),"sandbox-runtime")]}}}a(Gr,"workspaceShellSessionSandboxConfig");function ne(e,n){return[...new Set((e??[]).map(r=>o.resolve(n,r)))]}a(ne,"normalizedSandboxPaths");function Hr(e){return e.mode!=="allowlist"?[]:e.origins.map(n=>{let r=new URL(n);if(r.protocol!=="http:"&&r.protocol!=="https:"||r.username||r.password||r.pathname!=="/"||r.search||r.hash)throw new Error(`Sandbox network origin must be an HTTP(S) origin: ${n}`);return{host:r.hostname.toLowerCase(),port:r.port?Number(r.port):r.protocol==="https:"?443:80}})}a(Hr,"sdkSandboxEndpoints");async function Sn(e){if(!e.command.trim())throw new Error("Sandbox command must not be empty.");if(e.timeoutMs!==void 0&&(!Number.isFinite(e.timeoutMs)||e.timeoutMs<=0))throw new Error("Sandbox timeoutMs must be a positive finite number.");if(e.maxOutputBytes!==void 0&&(!Number.isSafeInteger(e.maxOutputBytes)||e.maxOutputBytes<=0))throw new Error("Sandbox maxOutputBytes must be a positive safe integer.");let n=o.resolve(e.cwd),r=e.network??{mode:"deny"},t=Hr(r),s=await L();if(!s.ready)return{status:"unavailable",sandboxed:!1,doctor:s};let i={...e.inheritEnvironment===!0?process.env:X(),...e.env},c={config:ve({network:{allowedDomains:[],deniedDomains:[],strictAllowlist:r.mode==="deny",allowUnixSockets:[],allowAllUnixSockets:!1,allowLocalBinding:!1},filesystem:{allowRead:ne(e.filesystem.allowRead,n),allowWrite:ne(e.filesystem.allowWrite,n),denyRead:ne(e.filesystem.denyRead,n),denyWrite:ne(e.filesystem.denyWrite,n)}}),command:e.command,args:e.args??[],cwd:n,env:i,endpoints:t,allowAllNetwork:r.mode==="allow"},d=await Fe(c,e.signal,e.timeoutMs??ye,e.maxOutputBytes??be);return{status:"completed",sandboxed:!0,exitCode:d.exitCode,stdout:d.stdout,stderr:d.stderr}}a(Sn,"runKodaXSandboxed");var zr=5*6e4,Vr=18e4,Yr=3e4,fe=1500,Zr=13e4,$=new Map;function Je(){let e=new Error("ASRT workspace session preparation timed out.");return e.name="TimeoutError",e}a(Je,"workspacePreparationTimeoutError");function Se(e,n){if(e?.aborted)throw new DOMException("Operation aborted","AbortError");if(n!==void 0&&Date.now()>=n)throw Je()}a(Se,"throwIfWorkspacePreparationStopped");function Ge(e,n,r){return Se(n,r),n===void 0&&r===void 0?e:new Promise((t,s)=>{let i=!1,c,d=a(u=>{i||(i=!0,c&&clearTimeout(c),n?.removeEventListener("abort",l),u())},"finish"),l=a(()=>{d(()=>s(new DOMException("Operation aborted","AbortError")))},"onAbort");n?.addEventListener("abort",l,{once:!0}),r!==void 0&&(c=setTimeout(()=>{d(()=>s(Je()))},Math.max(0,r-Date.now())),c.unref()),e.then(u=>d(()=>t(u)),u=>d(()=>s(u)))})}a(Ge,"waitForWorkspacePreparation");async function He(){let e=o.join(U(),"sandbox-runtime");return await T(e,{recursive:!0,mode:448}),e}a(He,"sandboxControlDirectory");function Qr(e){if(process.env.KODAX_BUNDLED==="true")return["__asrt-workspace-session",e];if(import.meta.url.endsWith(".ts"))return["--import","tsx",Te(new URL("./sandbox-workspace-session-entry.ts",import.meta.url)),e];let n=o.dirname(Te(import.meta.url)),r=o.basename(n)==="chunks"?o.dirname(n):n;return[o.join(r,"sandbox-workspace-session.js"),e]}a(Qr,"workspaceSessionEntryArgs");function me(e,n){let r=n?"ref":"unref";e[r]();for(let t of e.stdio){if(!t)continue;t[r]?.()}}a(me,"setWorkspaceSessionReferenced");async function en(e,n){let r=await He(),t=o.join(r,`workspace-${process.pid}-${W()}.json`);await K(t,JSON.stringify({config:Gr(e)}),{mode:384});let s=J({args:Qr(t),env:X(),isElectron:process.versions.electron!==void 0}),i=De(process.execPath,s.args,{cwd:process.platform==="win32"?he().directory:void 0,env:s.env,shell:!1,stdio:["pipe","pipe","pipe","pipe"],windowsHide:!0});de(i);let c=i.stdio[3];if(!c)throw new Error("ASRT workspace session control pipe was not created.");let d=or.createInterface({input:c}),l=new Map,u="",w=!1,b=!1,v=!1,y=0,g=0,m,f,h,P=new Promise(p=>{i.once("exit",()=>p())}),z,ie,ze=new Promise((p,S)=>{z=p,ie=S}),xe=a(()=>{v||(v=!0,n())},"evict"),V,C=a(()=>V||(V=(async()=>{try{await ce(i,{gracefulStdinEnd:!0,gracefulMs:process.platform==="win32"?Zr:fe,forceMs:fe,taskkillMs:fe})}finally{d.close(),c.destroy(),i.stdin.destroy()}})().finally(xe),V),"terminate"),O=a(p=>{if(!w){w=!0,ie(p);for(let S of l.values())S.reject(p);l.clear()}},"fail");i.stderr.on("data",p=>{u=(u+p.toString("utf8")).slice(-16384)}),i.stdout.on("data",p=>{u=(u+p.toString("utf8")).slice(-16384)}),d.on("line",p=>{let S;try{S=JSON.parse(p)}catch{O(new Error("ASRT workspace session returned malformed control data.")),C();return}if(S.type==="ready"){S.ok?z():ie(new Error(S.error??"ASRT workspace session failed."));return}if(S.type!=="result"||!S.id){O(new Error("ASRT workspace session returned an invalid control response.")),C();return}let k=l.get(S.id);k&&(l.delete(S.id),k.resolve(S))}),i.once("error",p=>{O(p),C()}),d.once("close",()=>{b||w||(O(new Error("ASRT workspace session control pipe closed unexpectedly.")),C())}),i.once("exit",p=>{f&&clearTimeout(f),O(new Error(`ASRT workspace session exited ${p??1}: ${u.trim()||"no diagnostics"}`)),xe()});let Ve=setTimeout(()=>{O(new Error("ASRT workspace session initialization timed out.")),C()},Vr);try{await ze.finally(()=>clearTimeout(Ve))}catch(p){throw await C(),await N(t,{force:!0}),p}let Y=a(async(p,S)=>{if(w||b&&p==="wrap")throw new Error("ASRT workspace session is unavailable.");let k=`workspace_${++y}`,Z=new Promise((x,E)=>{l.set(k,{resolve:x,reject:E})}),R=setTimeout(()=>{O(new Error(`ASRT workspace session ${p} request timed out.`)),C()},Yr);R.unref();try{await new Promise((x,E)=>{i.stdin.write(`${JSON.stringify({id:k,type:p,request:S})}
291
+ `,A=>A?E(A):x())})}catch(x){throw l.delete(k),clearTimeout(R),O(x instanceof Error?x:new Error(String(x))),C(),x}return Z.finally(()=>clearTimeout(R))},"request"),ke=a(()=>{f&&clearTimeout(f),!(g>0||b||w)&&(f=setTimeout(()=>{Re.close()},zr),f.unref(),me(i,!1))},"scheduleIdleClose"),Re={async acquire(p,S,k){if(Se(S,k),w||b)throw new Error("ASRT workspace session is unavailable.");f&&clearTimeout(f),me(i,!0),g+=1;let Z=!1,R=a(()=>{Z||(Z=!0,g-=1,g===0&&(m?.(),m=void 0),ke())},"finalize"),x=Y("wrap",p),E;try{E=await Ge(x,S,k)}catch(A){throw x.then(async _=>{if(!_.ok||!_.invocation)return;let Q=await Y("cleanup");if(!Q.ok)throw new Error(Q.error??"ASRT command cleanup failed.")}).catch(_=>{B({source:"sandbox:workspace-session",level:"warn",message:"Late workspace sandbox preparation cleanup failed.",detail:_})}).finally(R),A}try{if(!E.ok||!E.invocation)throw R(),new Error(E.error??"ASRT workspace wrapping failed.");try{Se(S,k)}catch(_){try{await Y("cleanup")}catch(Q){B({source:"sandbox:workspace-session",level:"warn",message:"Cancelled workspace sandbox preparation cleanup failed.",detail:Q})}throw R(),_}let A=!1;return{invocation:E.invocation,async release(){if(!A){A=!0;try{let _=await Y("cleanup");if(!_.ok)throw new Error(_.error??"ASRT command cleanup failed.")}finally{R()}}}}}catch(A){throw R(),A}},async close(){return h||(b=!0,h=(async()=>{f&&clearTimeout(f),!w&&(me(i,!0),g>0&&await new Promise(p=>{m=p}),!w&&(i.stdin.end(),await P))})(),h)}};return ke(),Re}a(en,"startWorkspaceSessionClient");async function Ne(e){if(!(await L()).ready)return;let r=process.platform==="win32"?e.toLowerCase():e,t=$.get(r);return t||(t=en(e,()=>{$.get(r)===t&&$.delete(r)}),$.set(r,t),t.catch(()=>{$.get(r)===t&&$.delete(r)})),t}a(Ne,"getWorkspaceSession");function bn(e){let n=o.resolve(e.workspaceRoot);return Ne(n).catch(r=>{B({source:"sandbox:workspace-session",level:"warn",message:"Workspace sandbox warm-up failed; commands will use normal permission fallback.",detail:r})}),{async prepare(r){if(!r.toolCallId){r.reportObservation?.({version:1,state:"not_selected"});return}let t={id:r.toolCallId,name:"bash",input:{...r.toolInput}};if(!e.shouldSandbox(t)){r.reportObservation?.({version:1,state:"not_selected"});return}let s;try{let i=await Ge(Ne(n),r.signal,r.deadlineAt);if(!i){r.reportObservation?.({version:1,state:"fallback",reason:"not_ready",execution:"normal_permission_policy"});return}let c=r.executable??(process.platform==="win32"?process.env.COMSPEC??o.join(process.env.SystemRoot??"C:\\Windows","System32","cmd.exe"):"/bin/sh"),d=r.args??(process.platform==="win32"?["/d","/s","/c",r.command]:["-c",r.command]),l=await He(),u=o.join(l,`kodax-asrt-shell-${process.pid}-${W()}.json`),w=o.join(l,`kodax-asrt-observation-${process.pid}-${W()}.json`),b={...r.env},v={config:Ue(n),command:c,args:d,cwd:r.cwd,env:b,endpoints:[],allowAllNetwork:!0,bootstrapCommand:ae(),fallbackToNormalExecution:!0,observationBackend:pr().backend,observationFile:w,targetStartedMarker:`\0KODAX_ASRT_TARGET_STARTED:${W()}\0
292
+ `},y=await i.acquire(v,r.signal,r.deadlineAt);s=y;let g={...v,wrappedInvocation:y.invocation},m=process.env.KODAX_BUNDLED==="true"?["__asrt-broker",u]:["--input-type=module","-e",qe,je,u],f=J({args:m,env:X(),isElectron:process.versions.electron!==void 0});return await K(u,JSON.stringify(g),{mode:384}),{executable:process.execPath,args:f.args,env:f.env,async cleanup(){let h;try{h=await q(w,"utf8").then(Pr).catch(P=>{if(P.code!=="ENOENT")throw P})}finally{await Promise.all([N(u,{force:!0}),N(w,{force:!0})]);try{await y.release()}catch(P){B({source:"sandbox:workspace-session",level:"warn",message:"Workspace sandbox command cleanup failed.",detail:P})}}return h}}}catch(i){if(s&&await s.release().catch(c=>{B({source:"sandbox:workspace-session",level:"warn",message:"Workspace sandbox lease release failed.",detail:c})}),r.signal?.aborted||r.deadlineAt!==void 0&&Date.now()>=r.deadlineAt)throw i;B({source:"sandbox:workspace-session",level:"warn",message:"Workspace sandbox preparation failed; using normal permission fallback.",detail:i}),r.reportObservation?.({version:1,state:"fallback",reason:"prepare_failed",execution:"normal_permission_policy"});return}}}}a(bn,"createAsrtShellSandbox");async function yn(e){let n=await L();if(!n.ready)throw new Error(`ASRT ${j} is not ready: ${n.diagnostics.join(" ")||"run kodax sandbox setup"}`);let r=o.join(e.snapshotRoot,W()),t=o.join(r,"skills");await T(t,{recursive:!0,mode:448});try{let s=await Nr(e,t),i=Dr(e.network),c=Promise.resolve();return{async run(d,l){let u=c,w;if(c=new Promise(b=>{w=b}),await u,l.signal?.aborted)throw w?.(),l.signal.reason??new Error("Sandboxed Skill script was cancelled.");try{if(d.args.length>64||d.args.some(g=>g.length>8192))throw new Error("Skill script arguments exceed the bounded remote contract.");if(d.inputs.length>32||d.outputs.length>32)throw new Error("Skill script file mappings exceed the bounded remote contract.");let b=D(d.script,"Skill script"),v=s.get(`${d.skill}\0${b}`);if(!v)throw new Error("Skill script is not admitted by this Runtime binding.");if([".cmd",".bat"].includes(o.extname(v.snapshotPath).toLowerCase())&&d.args.some(g=>/[&|<>^]/.test(g)))throw new Error("Batch Skill script arguments cannot contain command operators.");let y=o.join(l.workspaceRoot,".kodax-a2a-script",W());try{await T(o.join(y,"inputs"),{recursive:!0,mode:448}),await T(o.join(y,"outputs"),{recursive:!0,mode:448}),await qr(l.workspaceRoot,y,d,e.workspaceAccess);let g=Br(v.snapshotPath),m=await Mr({config:Fr(y,r,i,g.command),command:g.command,args:[...g.args,...d.args],cwd:y,env:X(),endpoints:i},l.signal),f=await Kr(l.workspaceRoot,y,d,e.workspaceAccess,e.workspaceByteLimit);return JSON.stringify({stdout:m.trim(),outputs:f})}finally{await N(y,{recursive:!0,force:!0})}}finally{w?.()}},async dispose(){await c,await N(r,{recursive:!0,force:!0})}}}catch(s){throw await N(r,{recursive:!0,force:!0}),s}}a(yn,"createAsrtSkillScriptRunner");export{j as a,pr as b,L as c,Or as d,re as e,gn as f,Sn as g,bn as h,yn as i};