@kodax-ai/kodax 0.7.95 → 0.7.96-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +178 -1
- package/LICENSE +158 -158
- package/README.md +149 -24
- package/README_CN.md +117 -24
- package/config-templates/config.example.jsonc +2 -1
- package/config-templates/integrations/a2a.example.jsonc +91 -91
- package/config-templates/integrations/extensions.example.jsonc +7 -7
- package/config-templates/integrations/mcp.example.jsonc +16 -16
- package/dist/builtin/code-review/SKILL.md +82 -82
- package/dist/builtin/git-workflow/SKILL.md +84 -84
- package/dist/builtin/skill-creator/SKILL.md +127 -127
- package/dist/builtin/skill-creator/agents/analyzer.md +12 -12
- package/dist/builtin/skill-creator/agents/comparator.md +13 -13
- package/dist/builtin/skill-creator/agents/grader.md +13 -13
- package/dist/builtin/skill-creator/references/schemas.md +227 -227
- package/dist/builtin/skill-creator/scripts/aggregate-benchmark.d.ts +46 -46
- package/dist/builtin/skill-creator/scripts/aggregate-benchmark.js +208 -208
- package/dist/builtin/skill-creator/scripts/analyze-benchmark.d.ts +46 -46
- package/dist/builtin/skill-creator/scripts/analyze-benchmark.js +286 -286
- package/dist/builtin/skill-creator/scripts/compare-runs.d.ts +62 -62
- package/dist/builtin/skill-creator/scripts/compare-runs.js +330 -330
- package/dist/builtin/skill-creator/scripts/generate-review.d.ts +33 -33
- package/dist/builtin/skill-creator/scripts/generate-review.js +414 -414
- package/dist/builtin/skill-creator/scripts/grade-evals.d.ts +73 -73
- package/dist/builtin/skill-creator/scripts/grade-evals.js +402 -402
- package/dist/builtin/skill-creator/scripts/improve-description.d.ts +23 -23
- package/dist/builtin/skill-creator/scripts/improve-description.js +160 -160
- package/dist/builtin/skill-creator/scripts/init-skill.d.ts +14 -14
- package/dist/builtin/skill-creator/scripts/init-skill.js +155 -155
- package/dist/builtin/skill-creator/scripts/install-skill.d.ts +29 -29
- package/dist/builtin/skill-creator/scripts/install-skill.js +173 -173
- package/dist/builtin/skill-creator/scripts/package-skill.d.ts +38 -38
- package/dist/builtin/skill-creator/scripts/package-skill.js +121 -121
- package/dist/builtin/skill-creator/scripts/quick-validate.d.ts +8 -8
- package/dist/builtin/skill-creator/scripts/quick-validate.js +163 -163
- package/dist/builtin/skill-creator/scripts/run-eval.d.ts +66 -66
- package/dist/builtin/skill-creator/scripts/run-eval.js +353 -353
- package/dist/builtin/skill-creator/scripts/run-loop.d.ts +49 -49
- package/dist/builtin/skill-creator/scripts/run-loop.js +242 -242
- package/dist/builtin/skill-creator/scripts/run-trigger-eval.d.ts +58 -58
- package/dist/builtin/skill-creator/scripts/run-trigger-eval.js +224 -224
- package/dist/builtin/tdd/SKILL.md +56 -56
- package/dist/chunks/agent-4FABF6WK.js +2 -0
- package/dist/chunks/argument-completer-72VHB2VL.js +2 -0
- package/dist/chunks/{chunk-7JXA3533.js → chunk-4OIQZWA5.js} +223 -226
- package/dist/chunks/{chunk-BNVSKIAB.js → chunk-6BVF3HZ7.js} +136 -136
- package/dist/chunks/chunk-7JZZIFZH.js +501 -0
- package/dist/chunks/chunk-AC7Z2OIY.js +2 -0
- package/dist/chunks/{chunk-JS452J2F.js → chunk-C4KYZAFU.js} +2 -2
- package/dist/chunks/chunk-CHUPIWIF.js +251 -0
- package/dist/chunks/{chunk-C4DTUKTR.js → chunk-GYUU7XLH.js} +5 -4
- package/dist/chunks/{chunk-OK4AXDC5.js → chunk-HAX55GOQ.js} +1 -1
- package/dist/chunks/chunk-JKTJCGO2.js +418 -0
- package/dist/chunks/{chunk-O743AJ5V.js → chunk-LQYETRFK.js} +171 -175
- package/dist/chunks/{chunk-2PEDBGKN.js → chunk-LTUZTQ6W.js} +1 -1
- package/dist/chunks/chunk-LYWDUSKO.js +2 -0
- package/dist/chunks/chunk-NGH6T4FD.js +92 -0
- package/dist/chunks/{chunk-SRIJX5ZP.js → chunk-NVRWCSA5.js} +1 -1
- package/dist/chunks/chunk-O4DS7RIQ.js +384 -0
- package/dist/chunks/chunk-ORXU6OWZ.js +2 -0
- package/dist/chunks/chunk-POTW3O65.js +124 -0
- package/dist/chunks/{chunk-2TM3W3GK.js → chunk-RIQSS56Y.js} +1 -1
- package/dist/chunks/chunk-U27XKEN5.js +407 -0
- package/dist/chunks/{chunk-6ABQJUK6.js → chunk-XUX6OUCA.js} +2 -2
- package/dist/chunks/{client-JDOS3YJR.js → client-4C456K4O.js} +1 -1
- package/dist/chunks/compaction-config-3VQRDFF4.js +2 -0
- package/dist/chunks/{construction-bootstrap-YCWHHUYO.js → construction-bootstrap-AHN7EDGG.js} +1 -1
- package/dist/chunks/dist-BCBQXAGI.js +2 -0
- package/dist/chunks/dist-QK2YDWU6.js +2 -0
- package/dist/chunks/host-VIHV7ADG.js +2 -0
- package/dist/chunks/run-manager-NBVMU3KV.js +2 -0
- package/dist/chunks/utils-MEJZ2IGI.js +2 -0
- package/dist/index.d.ts +22 -21
- package/dist/index.js +7 -7
- package/dist/kodax_bootstrap.js +26 -26
- package/dist/kodax_cli.js +1905 -1882
- package/dist/native/darwin-arm64/LICENSE-APACHE.txt +13 -0
- package/dist/native/darwin-arm64/kodax-text-transaction.node +0 -0
- package/dist/native/darwin-arm64/manifest.json +16 -0
- package/dist/native/darwin-x64/LICENSE-APACHE.txt +13 -0
- package/dist/native/darwin-x64/kodax-text-transaction.node +0 -0
- package/dist/native/darwin-x64/manifest.json +16 -0
- package/dist/native/linux-arm64/LICENSE-APACHE.txt +13 -0
- package/dist/native/linux-arm64/kodax-text-transaction.node +0 -0
- package/dist/native/linux-arm64/manifest.json +16 -0
- package/dist/native/linux-x64/LICENSE-APACHE.txt +13 -0
- package/dist/native/linux-x64/kodax-text-transaction.node +0 -0
- package/dist/native/linux-x64/manifest.json +16 -0
- package/dist/native/win32-x64/LICENSE-APACHE.txt +13 -0
- package/dist/native/win32-x64/NOTICE-windows-sandbox.txt +8 -0
- package/dist/native/win32-x64/kodax-windows-sandbox.exe +0 -0
- package/dist/native/win32-x64/kodax-windows-text-transaction.node +0 -0
- package/dist/native/win32-x64/manifest.json +30 -0
- package/dist/provider-capabilities.json +108 -2
- package/dist/runtime-worker.js +1745 -1727
- package/dist/sandbox-network-broker.js +1715 -0
- package/dist/sdk-a2a.d.ts +13 -12
- package/dist/sdk-a2a.js +1 -1
- package/dist/sdk-agent.d.ts +27 -18
- package/dist/sdk-agent.js +1 -1
- package/dist/sdk-coding.d.ts +107 -58
- package/dist/sdk-coding.js +1 -1
- package/dist/sdk-experimental-memory.d.ts +4 -4
- package/dist/sdk-experimental-memory.js +1 -1
- package/dist/sdk-llm.d.ts +9 -10
- package/dist/sdk-llm.js +1 -1
- package/dist/sdk-mcp.js +1 -1
- package/dist/sdk-media.d.ts +1 -1
- package/dist/sdk-media.js +1 -1
- package/dist/sdk-repl.d.ts +25 -17
- package/dist/sdk-repl.js +1 -1
- package/dist/sdk-runtime.d.ts +41 -17
- package/dist/sdk-runtime.js +1 -1
- package/dist/sdk-sandbox.d.ts +17 -3
- package/dist/sdk-sandbox.js +1 -1
- package/dist/sdk-session.d.ts +8 -7
- package/dist/sdk-session.js +1 -1
- package/dist/sdk-skills.js +1 -1
- package/dist/semantic-worker.js +61 -61
- package/dist/types-chunks/{base.d-vopO1rml.d.ts → base.d-COo8E2dk.d.ts} +18 -27
- package/dist/types-chunks/{bash-prefix-extractor.d-B2rxNI4L.d.ts → bash-prefix-extractor.d-DQOlA8cy.d.ts} +72 -52
- package/dist/types-chunks/{capability-learning.d-CE1tm29C.d.ts → capability-learning.d-lRPgA3Or.d.ts} +1 -1
- package/dist/types-chunks/{capsule.d-Y7QRS4J2.d.ts → capsule.d-0zxsgXg_.d.ts} +3 -3
- package/dist/types-chunks/{controller.d-BR-UVeUR.d.ts → controller.d-BTtyIIC1.d.ts} +1 -1
- package/dist/types-chunks/{controller.d-C5noq5-w.d.ts → controller.d-C7tXUcXo.d.ts} +2 -2
- package/dist/types-chunks/{guardrail.d-DqHD-61O.d.ts → guardrail.d-DKTyEHJa.d.ts} +5 -5
- package/dist/types-chunks/{history-retrieval.d-CKU8zmt_.d.ts → history-retrieval.d-CHnL99S7.d.ts} +2 -2
- package/dist/types-chunks/{public-api.d-D7fXaWW8.d.ts → public-api.d-Dx3L3W4Z.d.ts} +7 -4
- package/dist/types-chunks/{repl.d-BYDb14s6.d.ts → repl.d-mO01olIa.d.ts} +5 -5
- package/dist/types-chunks/{resolver.d-CwHUwbdE.d.ts → resolver.d-DlXPjeyx.d.ts} +38 -6
- package/dist/types-chunks/{review-inbox.d-BSgFewyj.d.ts → review-inbox.d-WDSe1nze.d.ts} +1 -1
- package/dist/types-chunks/{run-manager.d-BVJSntpS.d.ts → run-manager.d-DENbbzgR.d.ts} +1 -1
- package/dist/types-chunks/{sdk-session-CqEG84oP.d.ts → sdk-session-DYHGXXH4.d.ts} +3 -3
- package/dist/types-chunks/{shell-command-sets.d-DqaaBwhU.d.ts → shell-command-sets.d-CjFqS4dp.d.ts} +1 -1
- package/dist/types-chunks/{side-query.d-iH0P9ASy.d.ts → side-query.d-j8A3sFv_.d.ts} +2 -2
- package/dist/types-chunks/{types.d-rUOjXych.d.ts → types.d-BbZjR0Wr.d.ts} +1 -1
- package/dist/types-chunks/{types.d-CaTXAW_Q.d.ts → types.d-BkTIKdH6.d.ts} +2 -2
- package/dist/types-chunks/{types.d-C5xQEFcj.d.ts → types.d-DncLrpu_.d.ts} +4 -4
- package/dist/types-chunks/{types.d-CK9A9rpP.d.ts → types.d-Xy0f3x4i.d.ts} +9 -0
- package/dist/types-chunks/{utils.d-CWUyLiXo.d.ts → utils.d-CnxefMos.d.ts} +6 -6
- package/package.json +10 -3
- package/public_docs/README.md +130 -0
- package/public_docs/configuration/sandbox.md +289 -0
- package/public_docs/sdk/embedder-guide.md +6674 -0
- package/scripts/kodax-bin.cjs +28 -28
- package/scripts/production-env.cjs +25 -25
- package/dist/chunks/agent-XXZMXKKA.js +0 -2
- package/dist/chunks/argument-completer-KCYDGTQW.js +0 -2
- package/dist/chunks/chunk-77PNP27P.js +0 -92
- package/dist/chunks/chunk-7QBWHCIZ.js +0 -2
- package/dist/chunks/chunk-BHE66SP3.js +0 -123
- package/dist/chunks/chunk-BR2OSB2I.js +0 -722
- package/dist/chunks/chunk-DSMONSVB.js +0 -407
- package/dist/chunks/chunk-Q5VRWSKG.js +0 -418
- package/dist/chunks/chunk-XWRPOGJN.js +0 -4
- package/dist/chunks/chunk-Y5VIQBT6.js +0 -383
- package/dist/chunks/compaction-config-EGS4577X.js +0 -2
- package/dist/chunks/dist-ITTXQHRJ.js +0 -2
- package/dist/chunks/dist-KFYN3OKD.js +0 -2
- package/dist/chunks/host-VAYADIPW.js +0 -2
- package/dist/chunks/run-manager-52IJZMZJ.js +0 -2
- package/dist/chunks/utils-P7PBSL3R.js +0 -2
- package/dist/sandbox-workspace-session.js +0 -1705
|
@@ -1,1705 +0,0 @@
|
|
|
1
|
-
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
-
var lo=Object.defineProperty;var o=(e,t)=>lo(e,"name",{value:t,configurable:!0});import{createHash as t$,randomUUID as fu}from"node:crypto";import{closeSync as r$,constants as o$,existsSync as i$,lstatSync as s$,mkdirSync as a$,openSync as c$,readFileSync as d$,readSync as l$,readdirSync as u$,realpathSync as f$,renameSync as p$,rmSync as m$,statSync as h$,writeFileSync as g$,writeSync as pu}from"node:fs";import{copyFile as w$,lstat as v$,mkdir as b$,readFile as mu,realpath as k$,rename as S$,rm as hu,rmdir as E$,stat as x$,writeFile as R$}from"node:fs/promises";import{createRequire as gu}from"node:module";import v from"node:path";import yu from"node:readline";import{fileURLToPath as P$,pathToFileURL as wu}from"node:url";import{AsyncLocalStorage as uo}from"node:async_hooks";var fo=new uo;function me(e){let t=fo.getStore()?.credential;return t?ee(e,t,new WeakMap):e}o(me,"redactScopedProviderCredential");function ee(e,t,n){if(typeof e=="string")return e.split(t).join("[REDACTED_CREDENTIAL]");if(e===null||typeof e!="object")return e;let r=n.get(e);if(r!==void 0)return r;if(e instanceof Error){let s=new Error(ee(e.message,t,n));return n.set(e,s),s.name=e.name,e.stack!==void 0&&(s.stack=ee(e.stack,t,n)),s}if(Array.isArray(e)){let s=[];n.set(e,s);for(let a of e)s.push(ee(a,t,n));return s}let i={};n.set(e,i);for(let[s,a]of Object.entries(Object.getOwnPropertyDescriptors(e))){if(!a.enumerable||!("value"in a))continue;let c=s.split(t).join("[REDACTED_CREDENTIAL]");i[c]=ee(a.value,t,n)}return i}o(ee,"redactCredentialValue");import{AsyncLocalStorage as po}from"node:async_hooks";var Zu=new po;var te={transport:"native-api",conversationSemantics:"full-history",mcpSupport:"none",contextFidelity:"full",toolCallingFidelity:"full",sessionSupport:"full",longRunningSupport:"full",multimodalSupport:"none",evidenceSupport:"full"},_t={...te,multimodalSupport:"image-input"},he={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"none",evidenceSupport:"limited"},Mt={...he,multimodalSupport:"image-input"};import{parse as wf}from"partial-json";var np=Object.freeze({status:"terminated"}),rp=Object.freeze({status:"already-exited"}),op=Object.freeze({status:"unknown"}),ip=String.raw`
|
|
3
|
-
using System;
|
|
4
|
-
using System.Runtime.InteropServices;
|
|
5
|
-
using System.Text;
|
|
6
|
-
public static class KodaXNativeProcessSnapshot {
|
|
7
|
-
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
|
|
8
|
-
private struct ProcessEntry32 {
|
|
9
|
-
public uint dwSize;
|
|
10
|
-
public uint cntUsage;
|
|
11
|
-
public uint th32ProcessID;
|
|
12
|
-
public IntPtr th32DefaultHeapID;
|
|
13
|
-
public uint th32ModuleID;
|
|
14
|
-
public uint cntThreads;
|
|
15
|
-
public uint th32ParentProcessID;
|
|
16
|
-
public int pcPriClassBase;
|
|
17
|
-
public uint dwFlags;
|
|
18
|
-
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
|
|
19
|
-
public string szExeFile;
|
|
20
|
-
}
|
|
21
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
22
|
-
private static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint processId);
|
|
23
|
-
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
24
|
-
private static extern bool Process32First(IntPtr snapshot, ref ProcessEntry32 entry);
|
|
25
|
-
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
26
|
-
private static extern bool Process32Next(IntPtr snapshot, ref ProcessEntry32 entry);
|
|
27
|
-
[StructLayout(LayoutKind.Sequential)]
|
|
28
|
-
private struct FileTime {
|
|
29
|
-
public uint Low;
|
|
30
|
-
public uint High;
|
|
31
|
-
}
|
|
32
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
33
|
-
private static extern IntPtr OpenProcess(uint access, bool inheritHandle, uint processId);
|
|
34
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
35
|
-
private static extern bool GetProcessTimes(IntPtr process, out FileTime creation, out FileTime exit, out FileTime kernel, out FileTime user);
|
|
36
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
37
|
-
private static extern bool TerminateProcess(IntPtr process, uint exitCode);
|
|
38
|
-
[DllImport("kernel32.dll")]
|
|
39
|
-
private static extern void GetSystemTimeAsFileTime(out FileTime systemTime);
|
|
40
|
-
[DllImport("kernel32.dll")]
|
|
41
|
-
private static extern bool CloseHandle(IntPtr handle);
|
|
42
|
-
private static ulong ReadCreationTime(uint processId) {
|
|
43
|
-
var process = OpenProcess(0x1000, false, processId);
|
|
44
|
-
if (process == IntPtr.Zero) return 0;
|
|
45
|
-
try {
|
|
46
|
-
FileTime creation, exit, kernel, user;
|
|
47
|
-
if (!GetProcessTimes(process, out creation, out exit, out kernel, out user)) return 0;
|
|
48
|
-
return ((ulong)creation.High << 32) | creation.Low;
|
|
49
|
-
} finally {
|
|
50
|
-
CloseHandle(process);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
public static int TerminateExact(uint processId, ulong expectedCreationTime) {
|
|
54
|
-
var process = OpenProcess(0x1001, false, processId);
|
|
55
|
-
if (process == IntPtr.Zero) return 0;
|
|
56
|
-
try {
|
|
57
|
-
FileTime creation, exit, kernel, user;
|
|
58
|
-
if (!GetProcessTimes(process, out creation, out exit, out kernel, out user)) return 0;
|
|
59
|
-
var actual = (((ulong)creation.High << 32) | creation.Low) / 10000;
|
|
60
|
-
if (actual != expectedCreationTime) return 2;
|
|
61
|
-
return TerminateProcess(process, 1) ? 1 : 0;
|
|
62
|
-
} finally {
|
|
63
|
-
CloseHandle(process);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
public static string ReadRows() {
|
|
67
|
-
FileTime cutoffTime;
|
|
68
|
-
GetSystemTimeAsFileTime(out cutoffTime);
|
|
69
|
-
var cutoff = (((ulong)cutoffTime.High << 32) | cutoffTime.Low) / 10000;
|
|
70
|
-
var snapshot = CreateToolhelp32Snapshot(2, 0);
|
|
71
|
-
if (snapshot == new IntPtr(-1)) return string.Empty;
|
|
72
|
-
var rows = new StringBuilder();
|
|
73
|
-
var entry = new ProcessEntry32();
|
|
74
|
-
entry.dwSize = (uint)Marshal.SizeOf(entry);
|
|
75
|
-
try {
|
|
76
|
-
if (!Process32First(snapshot, ref entry)) return string.Empty;
|
|
77
|
-
do {
|
|
78
|
-
var creationTime = ReadCreationTime(entry.th32ProcessID) / 10000;
|
|
79
|
-
if (creationTime == 0 || creationTime <= cutoff) {
|
|
80
|
-
rows.Append(entry.th32ProcessID).Append(',').Append(entry.th32ParentProcessID).Append(',').Append(creationTime).Append('\n');
|
|
81
|
-
}
|
|
82
|
-
entry.dwSize = (uint)Marshal.SizeOf(entry);
|
|
83
|
-
} while (Process32Next(snapshot, ref entry));
|
|
84
|
-
return rows.ToString();
|
|
85
|
-
} finally {
|
|
86
|
-
CloseHandle(snapshot);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}`;import jt from"node:fs";import Kt from"node:os";import Wt from"node:path";var Lo="gpt-5.4",No="auto-gemini-3",Fo=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],jo=["auto-gemini-3","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash"];function Bt(e){let t=new Set,n=[];for(let r of e){let i=r.trim();if(!i)continue;let s=i.toLowerCase();t.has(s)||(t.add(s),n.push(i))}return n}o(Bt,"dedupePreserveOrder");function Ko(){let e=Wt.join(Kt.homedir(),".codex","config.toml");try{return jt.readFileSync(e,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}o(Ko,"readCodexConfiguredModel");function Wo(){let e=Wt.join(Kt.homedir(),".gemini","settings.json");try{let t=JSON.parse(jt.readFileSync(e,"utf8")),n=typeof t.model=="string"?t.model.trim():"";return n||(typeof t.general?.model=="string"?t.general.model.trim():"")||null}catch{return null}}o(Wo,"readGeminiConfiguredModel");function q(){return Ko()||Lo}o(q,"getCodexCliDefaultModel");function z(){return Wo()||No}o(z,"getGeminiCliDefaultModel");function ne(){return Bt([q(),...Fo])}o(ne,"getCodexCliKnownModels");function re(){return Bt([z(),...jo])}o(re,"getGeminiCliKnownModels");var Wp=z(),Bp=re();var em=q(),tm=ne();import{existsSync as Qo,readFileSync as Zo}from"node:fs";import G from"node:path";import{fileURLToPath as ei}from"node:url";var Xt=["none","prompt-only","native-effort","native-budget","native-toggle","native-adaptive","unknown"],Ut=["openai-responses-effort","openai-chat-effort","codex-cli-config","anthropic-output-effort","anthropic-reasoning-effort","provider-budget","provider-toggle","prompt-only","none"],qt=["anthropic-adaptive","anthropic-budget","provider-budget","provider-toggle","none"],zt=["zai-glm-5.3","zai-glm-5.2","zai-glm-toggle","deepseek-v4-flash-openai","deepseek-v4-pro-openai","deepseek-v4-openai","deepseek-v4-anthropic","deepseek-toggle","kimi-k3","kimi-k2.7-code","kimi-hybrid-toggle","minimax-m3","minimax-m2-always","mimo-v2.5-toggle","qwen-hybrid-thinking","openai-chat-reasoning","openai-responses-reasoning","codex-cli-effort","claude-adaptive-xhigh","claude-adaptive-max","anthropic-budget","generic-thinking-toggle","none"],Ht=["max_tokens","max_completion_tokens"],Gt=["native","image-input-native","cli-bridge","image-input-cli-bridge"],Vt=["count-tokens","models-list","minimal-message","unsupported"];function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(O,"isPlainObject");function W(e,t){if(typeof e!="string"||e.length===0)throw new Error(`provider-capabilities.json: ${t} must be a non-empty string`);return e}o(W,"requireString");function H(e,t){if(e!==void 0)return W(e,t)}o(H,"optionalString");function Qt(e,t){if(e!==void 0){if(typeof e!="string"||!Ht.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Ht.join(", ")}, got ${JSON.stringify(e)}`);return e}}o(Qt,"optionalMaxOutputTokensField");function N(e,t){if(e!==void 0){if(typeof e!="number"||!Number.isFinite(e)||e<0)throw new Error(`provider-capabilities.json: ${t} must be a non-negative finite number`);return e}}o(N,"optionalNumber");function R(e,t){if(e!==void 0){if(typeof e!="boolean")throw new Error(`provider-capabilities.json: ${t} must be a boolean`);return e}}o(R,"optionalBoolean");function Jt(e,t){if(e!==void 0){if(!Array.isArray(e))throw new Error(`provider-capabilities.json: ${t} must be an array`);return e.map((n,r)=>W(n,`${t}[${r}]`))}}o(Jt,"optionalStringArray");function Xo(e,t){if(e===void 0)return;if(!O(e))throw new Error(`provider-capabilities.json: ${t} must be an object`);let n={};for(let[r,i]of Object.entries(e))n[r]=W(i,`${t}.${r}`);return n}o(Xo,"optionalStringMap");function Uo(e,t){if(e!==void 0){if(typeof e!="string"||!zt.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${zt.join(", ")}, got ${JSON.stringify(e)}`);return e}}o(Uo,"optionalReasoningPreset");function We(e,t){if(typeof e!="string"||!Xt.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Xt.join(", ")}, got ${JSON.stringify(e)}`);return e}o(We,"requireReasoningCapability");function qo(e,t){if(typeof e!="string"||!Ut.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Ut.join(", ")}, got ${JSON.stringify(e)}`);return e}o(qo,"requireEffortStrategy");function zo(e,t){if(e!==void 0){if(typeof e!="string"||!qt.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${qt.join(", ")}, got ${JSON.stringify(e)}`);return e}}o(zo,"optionalThinkingStrategy");function Yt(e,t){if(e===void 0)return;if(!O(e))throw new Error(`provider-capabilities.json: ${t} must be an object`);let n=qo(e.effortStrategy,`${t}.effortStrategy`),r=Uo(e.reasoningPreset,`${t}.reasoningPreset`),i=zo(e.thinkingStrategy,`${t}.thinkingStrategy`),s=H(e.defaultEffort,`${t}.defaultEffort`),a=Xo(e.effortAliases,`${t}.effortAliases`),c=Jt(e.disabledEfforts,`${t}.disabledEfforts`),d=Jt(e.localRejectEfforts,`${t}.localRejectEfforts`),l=R(e.allowCustomEffort,`${t}.allowCustomEffort`),u=R(e.supportsReasoningEffort,`${t}.supportsReasoningEffort`),p=R(e.supportsReasoningSummary,`${t}.supportsReasoningSummary`),h=R(e.supportsEncryptedReasoningReplay,`${t}.supportsEncryptedReasoningReplay`),f=R(e.supportsAdaptiveThinking,`${t}.supportsAdaptiveThinking`),m=R(e.supportsManualThinkingBudget,`${t}.supportsManualThinkingBudget`),y=R(e.supportsDisabledThinking,`${t}.supportsDisabledThinking`),w=R(e.requiresEffortBetaHeader,`${t}.requiresEffortBetaHeader`),g={effortStrategy:n};if(r!==void 0&&(g.reasoningPreset=r),i!==void 0&&(g.thinkingStrategy=i),s!==void 0&&(g.defaultEffort=s),a!==void 0&&(g.effortAliases=a),c!==void 0&&(g.disabledEfforts=c),d!==void 0&&(g.localRejectEfforts=d),e.supportedEfforts!==void 0){if(!Array.isArray(e.supportedEfforts))throw new Error(`provider-capabilities.json: ${t}.supportedEfforts must be an array`);g.supportedEfforts=e.supportedEfforts.map((E,b)=>{if(!O(E))throw new Error(`provider-capabilities.json: ${t}.supportedEfforts[${b}] must be an object`);return{value:W(E.value,`${t}.supportedEfforts[${b}].value`),...H(E.description,`${t}.supportedEfforts[${b}].description`)!==void 0?{description:H(E.description,`${t}.supportedEfforts[${b}].description`)}:{},...R(E.isDefault,`${t}.supportedEfforts[${b}].isDefault`)!==void 0?{isDefault:R(E.isDefault,`${t}.supportedEfforts[${b}].isDefault`)}:{},...R(E.isUserVisible,`${t}.supportedEfforts[${b}].isUserVisible`)!==void 0?{isUserVisible:R(E.isUserVisible,`${t}.supportedEfforts[${b}].isUserVisible`)}:{}}})}if(e.budgetByEffort!==void 0){if(!O(e.budgetByEffort))throw new Error(`provider-capabilities.json: ${t}.budgetByEffort must be an object`);let E={};for(let[b,Pt]of Object.entries(e.budgetByEffort))E[b]=N(Pt,`${t}.budgetByEffort.${b}`)??0;g.budgetByEffort=E}return l!==void 0&&(g.allowCustomEffort=l),u!==void 0&&(g.supportsReasoningEffort=u),p!==void 0&&(g.supportsReasoningSummary=p),h!==void 0&&(g.supportsEncryptedReasoningReplay=h),f!==void 0&&(g.supportsAdaptiveThinking=f),m!==void 0&&(g.supportsManualThinkingBudget=m),y!==void 0&&(g.supportsDisabledThinking=y),w!==void 0&&(g.requiresEffortBetaHeader=w),g}o(Yt,"validateReasoningProfile");function Zt(e,t){let n=e.reasoningProfile,r=e.reasoningCapabilityV2;if(n!==void 0&&r!==void 0)throw new Error(`provider-capabilities.json: ${t} must not define both reasoningProfile and deprecated reasoningCapabilityV2`);return n!==void 0?Yt(n,`${t}.reasoningProfile`):Yt(r,`${t}.reasoningCapabilityV2`)}o(Zt,"validateReasoningProfileField");function Ho(e,t){if(typeof e!="string"||!Gt.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Gt.join(", ")}, got ${JSON.stringify(e)}`);return e}o(Ho,"requireProfileName");function Go(e,t){if(typeof e!="string"||!Vt.includes(e))throw new Error(`provider-capabilities.json: ${t} must be one of ${Vt.join(", ")}, got ${JSON.stringify(e)}`);return e}o(Go,"requireVerifyStrategy");function Vo(e,t){if(!O(e))throw new Error(`provider-capabilities.json: ${t} must be an object`);let n=W(e.id,`${t}.id`),r=H(e.wireModel,`${t}.wireModel`),i=H(e.displayName,`${t}.displayName`),s=N(e.contextWindow,`${t}.contextWindow`),a=N(e.maxOutputTokens,`${t}.maxOutputTokens`),c=Qt(e.maxOutputTokensField,`${t}.maxOutputTokensField`),d=N(e.thinkingBudgetCap,`${t}.thinkingBudgetCap`),l=R(e.replayReasoningContent,`${t}.replayReasoningContent`),u=R(e.strictThinkingSignature,`${t}.strictThinkingSignature`),p=N(e.streamMaxDurationMs,`${t}.streamMaxDurationMs`),h=e.reasoningCapability===void 0?void 0:We(e.reasoningCapability,`${t}.reasoningCapability`),f=Zt(e,t),m={id:n};return r!==void 0&&(m.wireModel=r),i!==void 0&&(m.displayName=i),s!==void 0&&(m.contextWindow=s),a!==void 0&&(m.maxOutputTokens=a),c!==void 0&&(m.maxOutputTokensField=c),d!==void 0&&(m.thinkingBudgetCap=d),h!==void 0&&(m.reasoningCapability=h),f!==void 0&&(m.reasoningProfile=f),l!==void 0&&(m.replayReasoningContent=l),u!==void 0&&(m.strictThinkingSignature=u),p!==void 0&&(m.streamMaxDurationMs=p),m}o(Vo,"validateModelDescriptor");function Jo(e,t){if(e===void 0)return;if(!O(e))throw new Error(`provider-capabilities.json: ${t} must be an object`);let n={};for(let[r,i]of Object.entries(e))n[r]=We(i,`${t}.${r}`);return n}o(Jo,"validateModelReasoningCapabilities");function Yo(e,t){if(!O(e))throw new Error(`provider-capabilities.json: providers.${t} must be an object`);let n=R(e.cliBridge,`providers.${t}.cliBridge`),r=W(e.apiKeyEnv,`providers.${t}.apiKeyEnv`),i=We(e.reasoningCapability,`providers.${t}.reasoningCapability`),s=Zt(e,`providers.${t}`),a=Ho(e.capabilityProfile,`providers.${t}.capabilityProfile`),c=Go(e.verifyStrategy,`providers.${t}.verifyStrategy`);if(n&&c!=="unsupported")throw new Error(`provider-capabilities.json: providers.${t} is a cliBridge entry but verifyStrategy="${c}" \u2014 must be "unsupported" (CLI binary owns credentials)`);let d=N(e.contextWindow,`providers.${t}.contextWindow`),l=N(e.maxOutputTokens,`providers.${t}.maxOutputTokens`),u=Qt(e.maxOutputTokensField,`providers.${t}.maxOutputTokensField`),p=N(e.thinkingBudgetCap,`providers.${t}.thinkingBudgetCap`),h=R(e.supportsThinking,`providers.${t}.supportsThinking`),f=Jo(e.modelReasoningCapabilities,`providers.${t}.modelReasoningCapabilities`),m=H(e.model,`providers.${t}.model`);if(n&&(m!==void 0||e.models!==void 0))throw new Error(`provider-capabilities.json: providers.${t} is a cliBridge entry but defines model/models \u2014 must be omitted (filled at load time)`);if(!n&&m===void 0)throw new Error(`provider-capabilities.json: providers.${t}.model is required (only cliBridge entries may omit)`);let y;if(e.models!==void 0){if(!Array.isArray(e.models))throw new Error(`provider-capabilities.json: providers.${t}.models must be an array`);y=e.models.map((E,b)=>Vo(E,`providers.${t}.models[${b}]`));let g=new Set([...m===void 0?[]:[m],...y.map(E=>E.id)]);for(let[E,b]of y.entries())if(b.wireModel!==void 0&&!g.has(b.wireModel))throw new Error(`provider-capabilities.json: providers.${t}.models[${E}].wireModel must reference a declared model, got ${JSON.stringify(b.wireModel)}`)}let w={apiKeyEnv:r,reasoningCapability:i,capabilityProfile:a,verifyStrategy:c};return s!==void 0&&(w.reasoningProfile=s),m!==void 0&&(w.model=m),y!==void 0&&(w.models=y),d!==void 0&&(w.contextWindow=d),l!==void 0&&(w.maxOutputTokens=l),u!==void 0&&(w.maxOutputTokensField=u),p!==void 0&&(w.thinkingBudgetCap=p),h!==void 0&&(w.supportsThinking=h),f!==void 0&&(w.modelReasoningCapabilities=f),n&&(w.cliBridge=!0),w}o(Yo,"validateProviderEntry");function en(e){if(!O(e))throw new Error("provider-capabilities.json: root must be an object");if(e.version!==1)throw new Error(`provider-capabilities.json: version must be 1, got ${JSON.stringify(e.version)}`);let t=W(e.updatedAt,"updatedAt");if(!O(e.providers))throw new Error("provider-capabilities.json: providers must be an object");let n={};for(let[r,i]of Object.entries(e.providers))n[r]=Yo(i,r);return{version:1,updatedAt:t,providers:n}}o(en,"validateProviderCapabilitiesJson");var ti=Object.freeze({native:te,"image-input-native":_t,"cli-bridge":he,"image-input-cli-bridge":Mt}),ve=null;function ni(){if(process.env.KODAX_BUNDLED==="true")return G.join(G.dirname(process.execPath),"provider-capabilities.json");let e=G.dirname(ei(import.meta.url)),t=[G.join(e,"provider-capabilities.json"),G.join(G.dirname(e),"provider-capabilities.json")];for(let n of t)if(Qo(n))return n;return t[0]}o(ni,"resolveJsonPath");function ri(e){if(e.models){for(let t of e.models)t.reasoningProfile&&tn(t.reasoningProfile);for(let t of e.models)Object.freeze(t);Object.freeze(e.models)}return e.reasoningProfile&&tn(e.reasoningProfile),e.modelReasoningCapabilities&&Object.freeze(e.modelReasoningCapabilities),Object.freeze(e)}o(ri,"deepFreezeSnapshot");function tn(e){if(e.supportedEfforts){for(let t of e.supportedEfforts)Object.freeze(t);Object.freeze(e.supportedEfforts)}e.budgetByEffort&&Object.freeze(e.budgetByEffort),e.effortAliases&&Object.freeze(e.effortAliases),e.disabledEfforts&&Object.freeze(e.disabledEfforts),e.localRejectEfforts&&Object.freeze(e.localRejectEfforts),Object.freeze(e)}o(tn,"freezeReasoningProfile");function oi(e){if(e==="gemini-cli"){let t=z();return{model:t,models:re().filter(n=>n!==t).map(n=>({id:n}))}}if(e==="codex-cli"){let t=q();return{model:t,models:ne().filter(n=>n!==t).map(n=>({id:n}))}}throw new Error(`provider-capabilities loader: unknown cliBridge provider '${e}'`)}o(oi,"resolveCliBridgeModels");function ii(e,t){let n=ti[t.capabilityProfile];if(!n)throw new Error(`provider-capabilities loader: unknown capabilityProfile '${t.capabilityProfile}' for provider '${e}'`);if(t.cliBridge){let i=oi(e),s={model:i.model,models:i.models,apiKeyEnv:t.apiKeyEnv,reasoningCapability:t.reasoningCapability,capabilityProfile:n,verifyStrategy:t.verifyStrategy};return t.reasoningProfile!==void 0&&(s.reasoningProfile=t.reasoningProfile),t.supportsThinking!==void 0&&(s.supportsThinking=t.supportsThinking),s}let r={model:t.model,apiKeyEnv:t.apiKeyEnv,reasoningCapability:t.reasoningCapability,capabilityProfile:n,verifyStrategy:t.verifyStrategy};return t.reasoningProfile!==void 0&&(r.reasoningProfile=t.reasoningProfile),t.models!==void 0&&(r.models=t.models),t.modelReasoningCapabilities!==void 0&&(r.modelReasoningCapabilities=t.modelReasoningCapabilities),t.contextWindow!==void 0&&(r.contextWindow=t.contextWindow),t.maxOutputTokens!==void 0&&(r.maxOutputTokens=t.maxOutputTokens),t.maxOutputTokensField!==void 0&&(r.maxOutputTokensField=t.maxOutputTokensField),t.thinkingBudgetCap!==void 0&&(r.thinkingBudgetCap=t.thinkingBudgetCap),t.supportsThinking!==void 0&&(r.supportsThinking=t.supportsThinking),r}o(ii,"buildSnapshot");function nn(){if(ve)return ve;let e=ni(),t;try{let i=Zo(e,"utf8");t=JSON.parse(i)}catch(i){let s=i instanceof Error?i.message:String(i);throw new Error(`provider-capabilities loader: failed to read ${e}: ${s}`)}let n=en(t),r={};for(let[i,s]of Object.entries(n.providers))r[i]=ri(ii(i,s));return ve=Object.freeze(r),ve}o(nn,"getProviderSnapshots");var be=nn();var rn=process.env.KODAX_PROVIDER??"zhipu-coding";var Ni=[];function I(e){let t=me(e),n=Ni.at(-1)?.sink;if(n){try{n(t)}catch{}return}if(process.env.KODAX_DIAGNOSTICS_STDERR==="1")try{process.stderr.write(`${kn(t)}
|
|
90
|
-
`)}catch{}}o(I,"emitKodaXDiagnostic");function kn(e){let t=me(e),n=Fi(t.detail);return`[${t.source}] ${t.level}: ${t.message}${n?` ${n}`:""}`}o(kn,"formatKodaXDiagnostic");function Fi(e){if(e===void 0)return"";if(e instanceof Error)return e.stack??e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}o(Fi,"formatDiagnosticDetail");var oe=class e{static{o(this,"SpanImpl")}id;traceId;parentId;name;data;startedAt;_endedAt;_error;_children=[];now;nextSpanId;onChildCreated;onSpanEnd;_ended=!1;constructor(t){this.id=t.id,this.traceId=t.traceId,this.parentId=t.parentId,this.name=t.name,this.data=t.data,this.now=t.now??(()=>Date.now()),this.startedAt=t.startedAt??this.now(),this.nextSpanId=t.nextSpanId??ji,this.onChildCreated=t.onChildCreated,this.onSpanEnd=t.onSpanEnd}get endedAt(){return this._endedAt}get error(){return this._error}get children(){return this._children}addChild(t,n){let r=new e({id:this.nextSpanId(),traceId:this.traceId,parentId:this.id,name:t,data:n,now:this.now,nextSpanId:this.nextSpanId,onChildCreated:this.onChildCreated,onSpanEnd:this.onSpanEnd});return this._children.push(r),this.onChildCreated&&this.onChildCreated(r),r}setError(t){t instanceof Error?this._error={message:t.message,stack:t.stack}:this._error=t}end(){this._ended||(this._ended=!0,this._endedAt=this.now(),this.onSpanEnd&&this.onSpanEnd(this))}},Sn=0;function ji(){Sn+=1;let e=Math.random().toString(36).slice(2,8);return`span-${Date.now()}-${Sn}-${e}`}o(ji,"defaultNextSpanId");var En=0;function Ki(){En+=1;let e=Math.random().toString(36).slice(2,8);return`trace-${Date.now()}-${En}-${e}`}o(Ki,"defaultNextTraceId");function Ge(e={}){let t=e.now??(()=>Date.now()),n=e.id??(e.nextTraceId??Ki)(),r=t(),i=e.name??"trace",s=e.metadata??new Map,a=e.rootSpanData??{kind:"agent",agentName:i},c=!1,d,l,u=new oe({id:`${n}-root`,traceId:n,name:i,data:a,startedAt:r,now:t,nextSpanId:e.nextSpanId,onChildCreated:e.onSpanStart,onSpanEnd:e.onSpanEnd});e.onSpanStart&&e.onSpanStart(u);let p={id:n,startedAt:r,rootSpan:u,metadata:s,get endedAt(){return d},get error(){return l??u.error},end(){c||(c=!0,d=t(),u.end(),e.onTraceEnd&&e.onTraceEnd(p))}};return p}o(Ge,"createTrace");var Ve=[];function Je(e){for(let t of Ve)try{t.onSpanStart(e)}catch{}}o(Je,"_emitSpanStart");function Ye(e){for(let t of Ve)try{t.onSpanEnd(e)}catch{}}o(Ye,"_emitSpanEnd");function Qe(e){for(let t of Ve)try{t.onTraceEnd(e)}catch{}}o(Qe,"_emitTraceEnd");var ke=class{static{o(this,"Tracer")}options;constructor(t={}){this.options=t}startTrace(t={}){return Ge({id:t.id,name:t.name,rootSpanData:t.rootSpanData,metadata:t.metadata,now:this.options.now,nextSpanId:this.options.nextSpanId,nextTraceId:this.options.nextTraceId,onSpanStart:Je,onSpanEnd:Ye,onTraceEnd:Qe})}},xn=new ke;var zi=["read","edit","bash:test","bash:read-only","bash:mutating","bash:network","subagent"];var uy=new Set(zi);var Se="ELECTRON_RUN_AS_NODE";var Ee="data:text/javascript,delete%20process.env.ELECTRON_RUN_AS_NODE";var nw=String.raw`
|
|
91
|
-
using System;
|
|
92
|
-
using System.Runtime.InteropServices;
|
|
93
|
-
public static class KodaXWindowsJobMembership {
|
|
94
|
-
[StructLayout(LayoutKind.Sequential)]
|
|
95
|
-
private struct BasicLimitInformation {
|
|
96
|
-
public long PerProcessUserTimeLimit;
|
|
97
|
-
public long PerJobUserTimeLimit;
|
|
98
|
-
public uint LimitFlags;
|
|
99
|
-
public UIntPtr MinimumWorkingSetSize;
|
|
100
|
-
public UIntPtr MaximumWorkingSetSize;
|
|
101
|
-
public uint ActiveProcessLimit;
|
|
102
|
-
public UIntPtr Affinity;
|
|
103
|
-
public uint PriorityClass;
|
|
104
|
-
public uint SchedulingClass;
|
|
105
|
-
}
|
|
106
|
-
[StructLayout(LayoutKind.Sequential)]
|
|
107
|
-
private struct IoCounters {
|
|
108
|
-
public ulong ReadOperationCount;
|
|
109
|
-
public ulong WriteOperationCount;
|
|
110
|
-
public ulong OtherOperationCount;
|
|
111
|
-
public ulong ReadTransferCount;
|
|
112
|
-
public ulong WriteTransferCount;
|
|
113
|
-
public ulong OtherTransferCount;
|
|
114
|
-
}
|
|
115
|
-
[StructLayout(LayoutKind.Sequential)]
|
|
116
|
-
private struct ExtendedLimitInformation {
|
|
117
|
-
public BasicLimitInformation BasicLimitInformation;
|
|
118
|
-
public IoCounters IoInfo;
|
|
119
|
-
public UIntPtr ProcessMemoryLimit;
|
|
120
|
-
public UIntPtr JobMemoryLimit;
|
|
121
|
-
public UIntPtr PeakProcessMemoryUsed;
|
|
122
|
-
public UIntPtr PeakJobMemoryUsed;
|
|
123
|
-
}
|
|
124
|
-
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
|
|
125
|
-
private static extern IntPtr OpenJobObjectW(uint desiredAccess, bool inheritHandle, string name);
|
|
126
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
127
|
-
private static extern bool IsProcessInJob(IntPtr process, IntPtr job, out bool result);
|
|
128
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
129
|
-
private static extern bool QueryInformationJobObject(
|
|
130
|
-
IntPtr job,
|
|
131
|
-
int informationClass,
|
|
132
|
-
out ExtendedLimitInformation information,
|
|
133
|
-
uint informationLength,
|
|
134
|
-
IntPtr returnLength);
|
|
135
|
-
[DllImport("kernel32.dll")]
|
|
136
|
-
private static extern IntPtr GetCurrentProcess();
|
|
137
|
-
[DllImport("kernel32.dll")]
|
|
138
|
-
private static extern bool CloseHandle(IntPtr handle);
|
|
139
|
-
public static bool IsCurrentProcessContained(string name) {
|
|
140
|
-
var job = OpenJobObjectW(4, false, name);
|
|
141
|
-
if (job == IntPtr.Zero) return false;
|
|
142
|
-
try {
|
|
143
|
-
bool inJob;
|
|
144
|
-
if (!IsProcessInJob(GetCurrentProcess(), job, out inJob) || !inJob) return false;
|
|
145
|
-
ExtendedLimitInformation limits;
|
|
146
|
-
if (!QueryInformationJobObject(
|
|
147
|
-
job,
|
|
148
|
-
9,
|
|
149
|
-
out limits,
|
|
150
|
-
(uint)Marshal.SizeOf(typeof(ExtendedLimitInformation)),
|
|
151
|
-
IntPtr.Zero)) return false;
|
|
152
|
-
return (limits.BasicLimitInformation.LimitFlags & 0x00002000) != 0;
|
|
153
|
-
} finally {
|
|
154
|
-
CloseHandle(job);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}`,rw=String.raw`
|
|
158
|
-
$ErrorActionPreference = 'Stop'
|
|
159
|
-
$source = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($env:KODAX_INTERNAL_JOB_QUERY_SOURCE))
|
|
160
|
-
Add-Type -TypeDefinition $source
|
|
161
|
-
if ([KodaXWindowsJobMembership]::IsCurrentProcessContained($env:KODAX_DAEMON_JOB_NAME)) {
|
|
162
|
-
[Console]::Out.Write('1')
|
|
163
|
-
} else {
|
|
164
|
-
[Console]::Out.Write('0')
|
|
165
|
-
}`,ow=String.raw`
|
|
166
|
-
using System;
|
|
167
|
-
using System.Runtime.InteropServices;
|
|
168
|
-
using System.Text;
|
|
169
|
-
public static class KodaXNativeProcessSnapshot {
|
|
170
|
-
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
|
|
171
|
-
private struct ProcessEntry32 {
|
|
172
|
-
public uint dwSize;
|
|
173
|
-
public uint cntUsage;
|
|
174
|
-
public uint th32ProcessID;
|
|
175
|
-
public IntPtr th32DefaultHeapID;
|
|
176
|
-
public uint th32ModuleID;
|
|
177
|
-
public uint cntThreads;
|
|
178
|
-
public uint th32ParentProcessID;
|
|
179
|
-
public int pcPriClassBase;
|
|
180
|
-
public uint dwFlags;
|
|
181
|
-
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
|
|
182
|
-
public string szExeFile;
|
|
183
|
-
}
|
|
184
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
185
|
-
private static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint processId);
|
|
186
|
-
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
187
|
-
private static extern bool Process32First(IntPtr snapshot, ref ProcessEntry32 entry);
|
|
188
|
-
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
189
|
-
private static extern bool Process32Next(IntPtr snapshot, ref ProcessEntry32 entry);
|
|
190
|
-
[StructLayout(LayoutKind.Sequential)]
|
|
191
|
-
private struct FileTime {
|
|
192
|
-
public uint Low;
|
|
193
|
-
public uint High;
|
|
194
|
-
}
|
|
195
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
196
|
-
private static extern IntPtr OpenProcess(uint access, bool inheritHandle, uint processId);
|
|
197
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
198
|
-
private static extern bool GetProcessTimes(IntPtr process, out FileTime creation, out FileTime exit, out FileTime kernel, out FileTime user);
|
|
199
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
200
|
-
private static extern bool TerminateProcess(IntPtr process, uint exitCode);
|
|
201
|
-
[DllImport("kernel32.dll")]
|
|
202
|
-
private static extern void GetSystemTimeAsFileTime(out FileTime systemTime);
|
|
203
|
-
[DllImport("kernel32.dll")]
|
|
204
|
-
private static extern bool CloseHandle(IntPtr handle);
|
|
205
|
-
private static ulong ReadCreationTime(uint processId) {
|
|
206
|
-
var process = OpenProcess(0x1000, false, processId);
|
|
207
|
-
if (process == IntPtr.Zero) return 0;
|
|
208
|
-
try {
|
|
209
|
-
FileTime creation, exit, kernel, user;
|
|
210
|
-
if (!GetProcessTimes(process, out creation, out exit, out kernel, out user)) return 0;
|
|
211
|
-
return ((ulong)creation.High << 32) | creation.Low;
|
|
212
|
-
} finally {
|
|
213
|
-
CloseHandle(process);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
public static int TerminateExact(uint processId, ulong expectedCreationTime) {
|
|
217
|
-
var process = OpenProcess(0x1001, false, processId);
|
|
218
|
-
if (process == IntPtr.Zero) return 0;
|
|
219
|
-
try {
|
|
220
|
-
FileTime creation, exit, kernel, user;
|
|
221
|
-
if (!GetProcessTimes(process, out creation, out exit, out kernel, out user)) return 0;
|
|
222
|
-
var actual = (((ulong)creation.High << 32) | creation.Low) / 10000;
|
|
223
|
-
if (actual != expectedCreationTime) return 2;
|
|
224
|
-
return TerminateProcess(process, 1) ? 1 : 0;
|
|
225
|
-
} finally {
|
|
226
|
-
CloseHandle(process);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
public static string ReadRows() {
|
|
230
|
-
FileTime cutoffTime;
|
|
231
|
-
GetSystemTimeAsFileTime(out cutoffTime);
|
|
232
|
-
var cutoff = (((ulong)cutoffTime.High << 32) | cutoffTime.Low) / 10000;
|
|
233
|
-
var snapshot = CreateToolhelp32Snapshot(2, 0);
|
|
234
|
-
if (snapshot == new IntPtr(-1)) return string.Empty;
|
|
235
|
-
var rows = new StringBuilder();
|
|
236
|
-
var entry = new ProcessEntry32();
|
|
237
|
-
entry.dwSize = (uint)Marshal.SizeOf(entry);
|
|
238
|
-
try {
|
|
239
|
-
if (!Process32First(snapshot, ref entry)) return string.Empty;
|
|
240
|
-
do {
|
|
241
|
-
var creationTime = ReadCreationTime(entry.th32ProcessID) / 10000;
|
|
242
|
-
if (creationTime == 0 || creationTime <= cutoff) {
|
|
243
|
-
rows.Append(entry.th32ProcessID).Append(',').Append(entry.th32ParentProcessID).Append(',').Append(creationTime).Append('\n');
|
|
244
|
-
}
|
|
245
|
-
entry.dwSize = (uint)Marshal.SizeOf(entry);
|
|
246
|
-
} while (Process32Next(snapshot, ref entry));
|
|
247
|
-
return rows.ToString();
|
|
248
|
-
} finally {
|
|
249
|
-
CloseHandle(snapshot);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}`,iw=Object.freeze({status:"terminated"}),sw=Object.freeze({status:"already-exited"}),aw=Object.freeze({status:"unknown"});var Re="KODAX_EFFECT_JOB_PAYLOAD";var ms=String.raw`
|
|
253
|
-
using System;
|
|
254
|
-
using System.IO;
|
|
255
|
-
using System.Runtime.InteropServices;
|
|
256
|
-
using System.Threading;
|
|
257
|
-
|
|
258
|
-
public static class KodaXEffectJob {
|
|
259
|
-
[StructLayout(LayoutKind.Sequential)]
|
|
260
|
-
private struct IoCounters {
|
|
261
|
-
public ulong ReadOperationCount;
|
|
262
|
-
public ulong WriteOperationCount;
|
|
263
|
-
public ulong OtherOperationCount;
|
|
264
|
-
public ulong ReadTransferCount;
|
|
265
|
-
public ulong WriteTransferCount;
|
|
266
|
-
public ulong OtherTransferCount;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
[StructLayout(LayoutKind.Sequential)]
|
|
270
|
-
private struct BasicLimitInformation {
|
|
271
|
-
public long PerProcessUserTimeLimit;
|
|
272
|
-
public long PerJobUserTimeLimit;
|
|
273
|
-
public uint LimitFlags;
|
|
274
|
-
public UIntPtr MinimumWorkingSetSize;
|
|
275
|
-
public UIntPtr MaximumWorkingSetSize;
|
|
276
|
-
public uint ActiveProcessLimit;
|
|
277
|
-
public UIntPtr Affinity;
|
|
278
|
-
public uint PriorityClass;
|
|
279
|
-
public uint SchedulingClass;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
[StructLayout(LayoutKind.Sequential)]
|
|
283
|
-
private struct ExtendedLimitInformation {
|
|
284
|
-
public BasicLimitInformation BasicLimitInformation;
|
|
285
|
-
public IoCounters IoInfo;
|
|
286
|
-
public UIntPtr ProcessMemoryLimit;
|
|
287
|
-
public UIntPtr JobMemoryLimit;
|
|
288
|
-
public UIntPtr PeakProcessMemoryUsed;
|
|
289
|
-
public UIntPtr PeakJobMemoryUsed;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
[StructLayout(LayoutKind.Sequential)]
|
|
293
|
-
private struct BasicAccountingInformation {
|
|
294
|
-
public long TotalUserTime;
|
|
295
|
-
public long TotalKernelTime;
|
|
296
|
-
public long ThisPeriodTotalUserTime;
|
|
297
|
-
public long ThisPeriodTotalKernelTime;
|
|
298
|
-
public uint TotalPageFaultCount;
|
|
299
|
-
public uint TotalProcesses;
|
|
300
|
-
public uint ActiveProcesses;
|
|
301
|
-
public uint TotalTerminatedProcesses;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
|
|
305
|
-
private static extern IntPtr CreateJobObjectW(IntPtr attributes, string name);
|
|
306
|
-
|
|
307
|
-
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
|
|
308
|
-
private static extern IntPtr OpenJobObjectW(uint desiredAccess, bool inheritHandle, string name);
|
|
309
|
-
|
|
310
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
311
|
-
private static extern bool SetInformationJobObject(
|
|
312
|
-
IntPtr job,
|
|
313
|
-
int infoClass,
|
|
314
|
-
ref ExtendedLimitInformation info,
|
|
315
|
-
uint length);
|
|
316
|
-
|
|
317
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
318
|
-
private static extern bool QueryInformationJobObject(
|
|
319
|
-
IntPtr job,
|
|
320
|
-
int infoClass,
|
|
321
|
-
out BasicAccountingInformation info,
|
|
322
|
-
uint length,
|
|
323
|
-
IntPtr returnLength);
|
|
324
|
-
|
|
325
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
326
|
-
private static extern IntPtr OpenProcess(uint access, bool inheritHandle, uint processId);
|
|
327
|
-
|
|
328
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
329
|
-
private static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process);
|
|
330
|
-
|
|
331
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
332
|
-
private static extern uint WaitForSingleObject(IntPtr handle, uint milliseconds);
|
|
333
|
-
|
|
334
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
335
|
-
private static extern bool GetExitCodeProcess(IntPtr process, out uint exitCode);
|
|
336
|
-
|
|
337
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
338
|
-
private static extern bool TerminateJobObject(IntPtr job, uint exitCode);
|
|
339
|
-
|
|
340
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
341
|
-
private static extern bool CloseHandle(IntPtr handle);
|
|
342
|
-
|
|
343
|
-
private const uint Synchronize = 0x00100000;
|
|
344
|
-
private const uint ProcessTerminate = 0x0001;
|
|
345
|
-
private const uint ProcessSetQuota = 0x0100;
|
|
346
|
-
private const uint ProcessQueryLimitedInformation = 0x1000;
|
|
347
|
-
private const uint JobObjectTerminate = 0x0008;
|
|
348
|
-
private const uint JobObjectQuery = 0x0004;
|
|
349
|
-
private const uint JobObjectLimitKillOnJobClose = 0x00002000;
|
|
350
|
-
private const uint WaitObject0 = 0;
|
|
351
|
-
|
|
352
|
-
private static void Require(bool result, string operation) {
|
|
353
|
-
if (!result) throw new InvalidOperationException(
|
|
354
|
-
operation + " failed with Win32 error " + Marshal.GetLastWin32Error());
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
private static void PublishReady() {
|
|
358
|
-
Console.Out.WriteLine("READY");
|
|
359
|
-
Console.Out.Flush();
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
public static void Run(uint targetPid, uint ownerPid, string jobName) {
|
|
363
|
-
var job = CreateJobObjectW(IntPtr.Zero, jobName);
|
|
364
|
-
if (job == IntPtr.Zero) throw new InvalidOperationException(
|
|
365
|
-
"CreateJobObject failed with Win32 error " + Marshal.GetLastWin32Error());
|
|
366
|
-
var processAccess = Synchronize | ProcessTerminate | ProcessSetQuota | ProcessQueryLimitedInformation;
|
|
367
|
-
var target = OpenProcess(processAccess, false, targetPid);
|
|
368
|
-
var owner = OpenProcess(Synchronize, false, ownerPid);
|
|
369
|
-
if (target == IntPtr.Zero || owner == IntPtr.Zero) {
|
|
370
|
-
if (target != IntPtr.Zero) CloseHandle(target);
|
|
371
|
-
if (owner != IntPtr.Zero) CloseHandle(owner);
|
|
372
|
-
CloseHandle(job);
|
|
373
|
-
throw new InvalidOperationException(
|
|
374
|
-
"OpenProcess failed with Win32 error " + Marshal.GetLastWin32Error());
|
|
375
|
-
}
|
|
376
|
-
try {
|
|
377
|
-
var limits = new ExtendedLimitInformation();
|
|
378
|
-
limits.BasicLimitInformation.LimitFlags = JobObjectLimitKillOnJobClose;
|
|
379
|
-
Require(SetInformationJobObject(
|
|
380
|
-
job,
|
|
381
|
-
9,
|
|
382
|
-
ref limits,
|
|
383
|
-
(uint)Marshal.SizeOf(typeof(ExtendedLimitInformation))),
|
|
384
|
-
"SetInformationJobObject");
|
|
385
|
-
Require(AssignProcessToJobObject(job, target), "AssignProcessToJobObject");
|
|
386
|
-
PublishReady();
|
|
387
|
-
|
|
388
|
-
uint targetExitCode = 1;
|
|
389
|
-
while (true) {
|
|
390
|
-
if (WaitForSingleObject(owner, 0) == WaitObject0) break;
|
|
391
|
-
if (WaitForSingleObject(target, 0) == WaitObject0) {
|
|
392
|
-
GetExitCodeProcess(target, out targetExitCode);
|
|
393
|
-
break;
|
|
394
|
-
}
|
|
395
|
-
Thread.Sleep(20);
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
Require(TerminateJobObject(job, targetExitCode), "TerminateJobObject");
|
|
399
|
-
while (true) {
|
|
400
|
-
BasicAccountingInformation accounting;
|
|
401
|
-
Require(QueryInformationJobObject(
|
|
402
|
-
job,
|
|
403
|
-
1,
|
|
404
|
-
out accounting,
|
|
405
|
-
(uint)Marshal.SizeOf(typeof(BasicAccountingInformation)),
|
|
406
|
-
IntPtr.Zero),
|
|
407
|
-
"QueryInformationJobObject");
|
|
408
|
-
if (accounting.ActiveProcesses == 0) return;
|
|
409
|
-
Thread.Sleep(10);
|
|
410
|
-
}
|
|
411
|
-
} finally {
|
|
412
|
-
CloseHandle(owner);
|
|
413
|
-
CloseHandle(target);
|
|
414
|
-
CloseHandle(job);
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
public static bool TerminateAndDrain(string jobName) {
|
|
419
|
-
var job = OpenJobObjectW(JobObjectTerminate | JobObjectQuery, false, jobName);
|
|
420
|
-
if (job == IntPtr.Zero) {
|
|
421
|
-
var error = Marshal.GetLastWin32Error();
|
|
422
|
-
if (error == 2) return false;
|
|
423
|
-
throw new InvalidOperationException(
|
|
424
|
-
"OpenJobObject failed with Win32 error " + error);
|
|
425
|
-
}
|
|
426
|
-
try {
|
|
427
|
-
Require(TerminateJobObject(job, 1), "TerminateJobObject");
|
|
428
|
-
while (true) {
|
|
429
|
-
BasicAccountingInformation accounting;
|
|
430
|
-
Require(QueryInformationJobObject(
|
|
431
|
-
job,
|
|
432
|
-
1,
|
|
433
|
-
out accounting,
|
|
434
|
-
(uint)Marshal.SizeOf(typeof(BasicAccountingInformation)),
|
|
435
|
-
IntPtr.Zero),
|
|
436
|
-
"QueryInformationJobObject");
|
|
437
|
-
if (accounting.ActiveProcesses == 0) return true;
|
|
438
|
-
Thread.Sleep(10);
|
|
439
|
-
}
|
|
440
|
-
} finally {
|
|
441
|
-
CloseHandle(job);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
}`,hs=String.raw`
|
|
446
|
-
using System;
|
|
447
|
-
using System.Collections.Generic;
|
|
448
|
-
using System.Diagnostics;
|
|
449
|
-
using System.Runtime.InteropServices;
|
|
450
|
-
using System.Security.Principal;
|
|
451
|
-
|
|
452
|
-
public static class KodaXSidProbe {
|
|
453
|
-
[StructLayout(LayoutKind.Sequential)]
|
|
454
|
-
private struct WtsProcessInformation {
|
|
455
|
-
public uint SessionId;
|
|
456
|
-
public uint ProcessId;
|
|
457
|
-
public IntPtr ProcessName;
|
|
458
|
-
public IntPtr UserSid;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
462
|
-
private struct ProcessEntry32 {
|
|
463
|
-
public uint Size;
|
|
464
|
-
public uint Usage;
|
|
465
|
-
public uint ProcessId;
|
|
466
|
-
public UIntPtr DefaultHeapId;
|
|
467
|
-
public uint ModuleId;
|
|
468
|
-
public uint Threads;
|
|
469
|
-
public uint ParentProcessId;
|
|
470
|
-
public int PriorityClassBase;
|
|
471
|
-
public uint Flags;
|
|
472
|
-
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
|
|
473
|
-
public string ExecutableFile;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
[DllImport("wtsapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
|
|
477
|
-
private static extern bool WTSEnumerateProcessesW(
|
|
478
|
-
IntPtr server,
|
|
479
|
-
uint reserved,
|
|
480
|
-
uint version,
|
|
481
|
-
out IntPtr processInformation,
|
|
482
|
-
out uint count);
|
|
483
|
-
|
|
484
|
-
[DllImport("wtsapi32.dll")]
|
|
485
|
-
private static extern void WTSFreeMemory(IntPtr memory);
|
|
486
|
-
|
|
487
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
488
|
-
private static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint processId);
|
|
489
|
-
|
|
490
|
-
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
|
|
491
|
-
private static extern bool Process32FirstW(IntPtr snapshot, ref ProcessEntry32 entry);
|
|
492
|
-
|
|
493
|
-
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
|
|
494
|
-
private static extern bool Process32NextW(IntPtr snapshot, ref ProcessEntry32 entry);
|
|
495
|
-
|
|
496
|
-
[DllImport("kernel32.dll", SetLastError = true)]
|
|
497
|
-
private static extern bool CloseHandle(IntPtr handle);
|
|
498
|
-
|
|
499
|
-
private static Dictionary<uint, uint> ProcessParents() {
|
|
500
|
-
var parents = new Dictionary<uint, uint>();
|
|
501
|
-
var snapshot = CreateToolhelp32Snapshot(0x00000002, 0);
|
|
502
|
-
if (snapshot == new IntPtr(-1)) throw new InvalidOperationException(
|
|
503
|
-
"CreateToolhelp32Snapshot failed with Win32 error " + Marshal.GetLastWin32Error());
|
|
504
|
-
try {
|
|
505
|
-
var entry = new ProcessEntry32();
|
|
506
|
-
entry.Size = (uint)Marshal.SizeOf(typeof(ProcessEntry32));
|
|
507
|
-
if (!Process32FirstW(snapshot, ref entry)) throw new InvalidOperationException(
|
|
508
|
-
"Process32First failed with Win32 error " + Marshal.GetLastWin32Error());
|
|
509
|
-
do {
|
|
510
|
-
parents[entry.ProcessId] = entry.ParentProcessId;
|
|
511
|
-
entry.Size = (uint)Marshal.SizeOf(typeof(ProcessEntry32));
|
|
512
|
-
} while (Process32NextW(snapshot, ref entry));
|
|
513
|
-
} finally {
|
|
514
|
-
CloseHandle(snapshot);
|
|
515
|
-
}
|
|
516
|
-
return parents;
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
private static HashSet<uint> MatchingProcesses(SecurityIdentifier expected) {
|
|
520
|
-
var matches = new HashSet<uint>();
|
|
521
|
-
IntPtr processes;
|
|
522
|
-
uint count;
|
|
523
|
-
if (!WTSEnumerateProcessesW(IntPtr.Zero, 0, 1, out processes, out count)) {
|
|
524
|
-
throw new InvalidOperationException(
|
|
525
|
-
"WTSEnumerateProcesses failed with Win32 error " + Marshal.GetLastWin32Error());
|
|
526
|
-
}
|
|
527
|
-
try {
|
|
528
|
-
var entrySize = Marshal.SizeOf(typeof(WtsProcessInformation));
|
|
529
|
-
for (uint index = 0; index < count; index++) {
|
|
530
|
-
var address = new IntPtr(processes.ToInt64() + ((long)index * entrySize));
|
|
531
|
-
var entry = (WtsProcessInformation)Marshal.PtrToStructure(
|
|
532
|
-
address,
|
|
533
|
-
typeof(WtsProcessInformation));
|
|
534
|
-
if (entry.UserSid == IntPtr.Zero) continue;
|
|
535
|
-
if (new SecurityIdentifier(entry.UserSid).Equals(expected)) matches.Add(entry.ProcessId);
|
|
536
|
-
}
|
|
537
|
-
} finally {
|
|
538
|
-
WTSFreeMemory(processes);
|
|
539
|
-
}
|
|
540
|
-
return matches;
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
private static bool DescendsFrom(
|
|
544
|
-
uint process,
|
|
545
|
-
uint root,
|
|
546
|
-
Dictionary<uint, uint> parents
|
|
547
|
-
) {
|
|
548
|
-
var visited = new HashSet<uint>();
|
|
549
|
-
while (process != 0 && visited.Add(process)) {
|
|
550
|
-
if (process == root) return true;
|
|
551
|
-
if (!parents.ContainsKey(process)) return false;
|
|
552
|
-
process = parents[process];
|
|
553
|
-
}
|
|
554
|
-
return false;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
public static bool HasOtherProcessWithSid(string expectedSid, bool ignoreProbeTree) {
|
|
558
|
-
var expected = new SecurityIdentifier(expectedSid);
|
|
559
|
-
using (var identity = WindowsIdentity.GetCurrent()) {
|
|
560
|
-
var sameUser = identity.User != null && identity.User.Equals(expected);
|
|
561
|
-
var administrator = new WindowsPrincipal(identity)
|
|
562
|
-
.IsInRole(WindowsBuiltInRole.Administrator);
|
|
563
|
-
if (ignoreProbeTree && !sameUser) {
|
|
564
|
-
throw new InvalidOperationException("Process-tree SID probe must run as the expected sandbox user");
|
|
565
|
-
}
|
|
566
|
-
if (!ignoreProbeTree && !sameUser && !administrator) {
|
|
567
|
-
throw new InvalidOperationException(
|
|
568
|
-
"Machine-wide inspection of a foreign Windows SID requires an elevated administrator token");
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
var matches = MatchingProcesses(expected);
|
|
572
|
-
if (!ignoreProbeTree) return matches.Count > 0;
|
|
573
|
-
var current = (uint)Process.GetCurrentProcess().Id;
|
|
574
|
-
if (!matches.Contains(current)) throw new InvalidOperationException(
|
|
575
|
-
"SID probe could not observe its own process");
|
|
576
|
-
var parents = ProcessParents();
|
|
577
|
-
var root = parents.ContainsKey(current) ? parents[current] : current;
|
|
578
|
-
foreach (var process in matches) {
|
|
579
|
-
if (!DescendsFrom(process, root, parents)) return true;
|
|
580
|
-
}
|
|
581
|
-
return false;
|
|
582
|
-
}
|
|
583
|
-
}`,gs=String.raw`
|
|
584
|
-
$ErrorActionPreference = 'Stop'
|
|
585
|
-
try {
|
|
586
|
-
$payload = [Text.Encoding]::UTF8.GetString(
|
|
587
|
-
[Convert]::FromBase64String($env:${Re})) | ConvertFrom-Json
|
|
588
|
-
Remove-Item Env:${Re} -ErrorAction SilentlyContinue
|
|
589
|
-
$source = @'
|
|
590
|
-
${ms}
|
|
591
|
-
'@
|
|
592
|
-
Add-Type -TypeDefinition $source
|
|
593
|
-
if ($payload.action -eq 'recover') {
|
|
594
|
-
$drained = [KodaXEffectJob]::TerminateAndDrain([string]$payload.jobName)
|
|
595
|
-
[Console]::Out.WriteLine($(if ($drained) { 'DRAINED' } else { 'NOT_FOUND' }))
|
|
596
|
-
[Console]::Out.Flush()
|
|
597
|
-
} else {
|
|
598
|
-
[KodaXEffectJob]::Run(
|
|
599
|
-
[uint32]$payload.targetPid,
|
|
600
|
-
[uint32]$payload.ownerPid,
|
|
601
|
-
[string]$payload.jobName)
|
|
602
|
-
}
|
|
603
|
-
exit 0
|
|
604
|
-
} catch {
|
|
605
|
-
[Console]::Out.WriteLine('ERROR:' + $_.Exception.Message)
|
|
606
|
-
[Console]::Out.Flush()
|
|
607
|
-
exit 1
|
|
608
|
-
}`,ww=Buffer.from(gs,"utf16le").toString("base64"),ys=String.raw`
|
|
609
|
-
$ErrorActionPreference = 'Stop'
|
|
610
|
-
try {
|
|
611
|
-
$payload = [Text.Encoding]::UTF8.GetString(
|
|
612
|
-
[Convert]::FromBase64String($env:${Re})) | ConvertFrom-Json
|
|
613
|
-
Remove-Item Env:${Re} -ErrorAction SilentlyContinue
|
|
614
|
-
$source = @'
|
|
615
|
-
${hs}
|
|
616
|
-
'@
|
|
617
|
-
Add-Type -TypeDefinition $source
|
|
618
|
-
$active = [KodaXSidProbe]::HasOtherProcessWithSid(
|
|
619
|
-
[string]$payload.sid,
|
|
620
|
-
[bool]$payload.ignoreCurrentProcessTree)
|
|
621
|
-
[Console]::Out.WriteLine($(if ($active) { 'ACTIVE' } else { 'CLEAR' }))
|
|
622
|
-
[Console]::Out.Flush()
|
|
623
|
-
exit 0
|
|
624
|
-
} catch {
|
|
625
|
-
[Console]::Out.WriteLine('ERROR:' + $_.Exception.Message)
|
|
626
|
-
[Console]::Out.Flush()
|
|
627
|
-
exit 1
|
|
628
|
-
}`,vw=Buffer.from(ys,"utf16le").toString("base64");var Is=Math.floor(3.75*1024*1024);var As=1440*60*1e3;import{fileURLToPath as ta}from"url";import{dirname as na}from"path";var ra=ta(import.meta.url),zb=na(ra);import{readFile as ca,readdir as da}from"fs/promises";import{join as B,relative as la}from"path";import Ln from"yaml";var oa=["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","Stop","SubagentStop","Notification"];function ia(e){let t=e.split(`
|
|
629
|
-
`),n=[];for(let r of t){let i=r.indexOf(":");if(i>0){let s=r.slice(0,i).trim(),a=r.slice(i+1).trim();if(a.includes(":")&&!a.startsWith('"')&&!a.startsWith("'")&&!a.startsWith("[")&&!a.startsWith("|")&&!a.startsWith(">")){n.push(`${s}: |-`),n.push(` ${a}`);continue}}n.push(r)}return n.join(`
|
|
630
|
-
`)}o(ia,"sanitizeYaml");function Nn(e,t={}){let n=e.replace(/^/,"").replace(/\r\n/g,`
|
|
631
|
-
`).replace(/\r/g,`
|
|
632
|
-
`).trimStart();if(!n.startsWith(`---
|
|
633
|
-
`)){if(t.throwOnMissing)throw new Error("Invalid markdown: missing YAML frontmatter");return[null,e]}let r=n.indexOf(`
|
|
634
|
-
---
|
|
635
|
-
`,4);if(r===-1){let c=n.indexOf(`
|
|
636
|
-
---`,4);c!==-1&&c===n.length-4&&(r=c)}if(r===-1){if(t.throwOnMissing)throw new Error("Invalid markdown: unclosed YAML frontmatter");return[null,e]}let i=n.slice(4,r),s=n.slice(r+5).trim(),a;try{a=Ln.parse(i)??{}}catch{a=Ln.parse(ia(i))??{}}if(a==null||typeof a!="object"||Array.isArray(a)){if(t.throwOnMissing)throw new Error("Invalid markdown: YAML frontmatter must be an object");return[null,s]}return[a,s]}o(Nn,"parseYamlFrontmatter");function Fn(e){if(typeof e=="string"){let t=e.trim();return t.length>0?t:void 0}if(Array.isArray(e)){let t=e.map(n=>String(n).trim()).filter(n=>n.length>0);return t.length>0?t.join(", "):void 0}}o(Fn,"normalizeAllowedToolsString");function sa(e){if(typeof e=="string"){let t=e.trim();return t?{command:t}:void 0}if(e&&typeof e=="object"&&!Array.isArray(e)){let t=e,n=typeof t.command=="string"?t.command.trim():"";if(!n)return;let r=typeof t.matcher=="string"&&t.matcher.trim()?t.matcher.trim():void 0;return{command:n,matcher:r}}}o(sa,"normalizeYamlHookEntry");function aa(e){if(e==null)return;let n=(Array.isArray(e)?e:[e]).map(r=>sa(r)).filter(r=>r!==void 0);return n.length>0?n:void 0}o(aa,"normalizeYamlHookEntryList");function jn(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,n={};for(let r of oa){let i=aa(t[r]);i&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}o(jn,"normalizeYamlHookMap");function Kn(e){let[t,n]=Nn(e,{throwOnMissing:!0});if(!t)throw new Error("Invalid SKILL.md: YAML frontmatter must be an object");if(!t.name||typeof t.name!="string")throw new Error('Invalid SKILL.md: missing required "name" field');if(!t.description||typeof t.description!="string")throw new Error('Invalid SKILL.md: missing required "description" field');return{frontmatter:{name:t.name,description:t.description,disableModelInvocation:t["disable-model-invocation"]===!0,userInvocable:t["user-invocable"]!==!1,allowedTools:Fn(t["allowed-tools"]),context:t.context==="fork"?"fork":void 0,agent:typeof t.agent=="string"?t.agent:void 0,argumentHint:typeof t["argument-hint"]=="string"?t["argument-hint"]:void 0,model:typeof t.model=="string"?t.model:void 0,hooks:jn(t.hooks),license:typeof t.license=="string"?t.license:void 0,compatibility:typeof t.compatibility=="string"?t.compatibility:void 0,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?t.metadata:void 0},body:n}}o(Kn,"parseSkillMarkdown");async function Ie(e,t){let n=B(e,"SKILL.md");try{let r=await ca(n,"utf-8"),{frontmatter:i,body:s}=Kn(r),[a,c,d,l,u]=await Promise.all([V(B(e,"scripts")),V(B(e,"references")),V(B(e,"assets")),V(B(e,"templates")),V(B(e,"resources"))]);return{...i,userInvocable:!0,path:e,skillFilePath:n,content:s,rawContent:s,loaded:!0,source:t,...a.length>0&&{scripts:a},...c.length>0&&{references:c},...d.length>0&&{assets:d},...l.length>0&&{templates:l},...u.length>0&&{resources:u}}}catch(r){return I({source:"agent:skills",level:"error",message:`Failed to load skill from ${e}.`,detail:r}),null}}o(Ie,"loadFullSkill");async function V(e,t=e){let n=[];try{let r=await da(e,{withFileTypes:!0});r.sort((i,s)=>i.name.localeCompare(s.name));for(let i of r){let s=B(e,i.name);if(i.isDirectory()){n.push(...await V(s,t));continue}i.isFile()&&n.push({name:i.name,path:s,relativePath:la(t,s).replace(/\\/g,"/")})}}catch{}return n}o(V,"loadSkillFiles");var Wn=64*1024,Bn=256*1024;var Lk=1024*1024;var pS=16*1024;var SS=16*1024;import{execSync as za}from"child_process";import Ha from"path";var Ga=new Set(["ls","cat","pwd","echo","whoami","date","which","whereis","tree","dir","type","get-childitem","get-content","select-string","get-location","grep","find","awk","sed","head","tail","less","more","wc","git status","git diff","git log","git show","git branch","git remote","git ls-files","git rev-parse","git grep","node","npm","yarn","pnpm","tsc","python","pip","go","cargo","rustc"]);function rr(e){if(!e||!e.trim())return!1;let t=e.trim().replace(/\s+/g," ").toLowerCase();for(let n of Ga)if(t===n||t.startsWith(`${n} `)){if(n==="sed"&&t.split(/\s+/).some(s=>s.startsWith("-i")||s==="--in-place"))return!1;if(n==="awk"){let i=t.split(/\s+/);if(i.includes("-f")||i.includes("--file"))return!1}if(["node","npm","yarn","pnpm","tsc","python","pip","go","cargo","rustc"].includes(n)){let i=t.split(/\s+/).slice(1);if(i.length>0&&!i.every(s=>/^(-v|--version|-h|--help)$/.test(s)))return!1}return!0}return!1}o(rr,"isSingleSafeDynamicContextCommand");function Va(e){if(!e||!e.trim())return!1;let t=e.trim().replace(/\\\r?\n/g," ");if(/[<>|;`]|\$\(|(?<!&)&(?!&)/.test(t)||t.includes("\\")&&Ha.sep!=="\\"&&t.replace(/\\ /g,"").includes("\\"))return!1;let r=t.split(/\s*&&\s*/);if(r.length===1)return rr(r[0]);for(let i of r){let s=i?.trim();if(s&&!/^cd\s+/.test(s.toLowerCase())&&!rr(s))return!1}return!0}o(Va,"isSafeDynamicContextCommand");function or(e){let t=[],n="",r=!1,i="";for(let s=0;s<e.length;s++){let a=e[s];r?a===i?r=!1:n+=a:a==='"'||a==="'"?(r=!0,i=a):a===" "?n&&(t.push(n),n=""):n+=a}return n&&t.push(n),t}o(or,"parseArguments");var _e=class{static{o(this,"VariableResolver")}context;constructor(t){this.context=t}async resolve(t,n){let r=t,i=or(n);return r=this.resolvePositionalArgs(r,i),r=this.resolveArguments(r,n),r=this.resolveEnvVars(r),r=await this.resolveDynamicContext(r),r}resolvePositionalArgs(t,n){return t.replace(/\$(\d+)(?![a-zA-Z0-9_])/g,(r,i)=>{let s=parseInt(i,10);return n[s]??""})}resolveArguments(t,n){return t.replace(/\$ARGUMENTS/g,n)}resolveEnvVars(t){let n={...this.context.environment,CLAUDE_SESSION_ID:this.context.sessionId??"",KODAX_SESSION_ID:this.context.sessionId??"",KODAX_WORKING_DIR:this.context.workingDirectory};return t.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g,(r,i)=>n[i]??r)}async resolveDynamicContext(t){let n=/!`([^`]+)`/g,r=[],i;for(;(i=n.exec(t))!==null;)r.push({match:i[0],command:i[1]});if(r.length===0)return t;let s=t;for(let{match:a,command:c}of r)try{let d=await this.executeDynamicCommand(c);s=s.replace(a,d)}catch(d){let l=d instanceof Error?d.message:String(d);s=s.replace(a,`[Error: ${l}]`)}return s}async executeDynamicCommand(t){if(this.context.disableDynamicContext)throw new Error("Dynamic context disabled by host. Skill `!`cmd`` blocks are not allowed in this environment.");if(this.context.executeDynamicContext){let n=await this.context.executeDynamicContext(t,this.context.workingDirectory);return typeof n=="string"?n.trim():""}if(!Va(t))throw new Error("Unsafe dynamic context command blocked. Only simple read-only commands are allowed in !`...` blocks.");try{return za(t,{cwd:this.context.workingDirectory,encoding:"utf-8",timeout:5e3,maxBuffer:1048576,windowsHide:!0}).trim()}catch(n){throw n instanceof Error?new Error(`Command failed: ${n.message}`):n}}};async function ae(e,t,n){return new _e(n).resolve(e,t)}o(ae,"resolveSkillContent");function ir(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}o(ir,"escapeXml");var ct=120;function Me(e){return e.replace(/\\/g,"/")}o(Me,"formatDisplayPath");function Qa(e){return[...(e.references??[]).map(t=>({folder:"references",file:t})),...(e.scripts??[]).map(t=>({folder:"scripts",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}))]}o(Qa,"collectSupportFiles");function Za(e){let t=Qa(e);if(t.length===0)return[];let n=[["references",e.references],["scripts",e.scripts],["assets",e.assets],["templates",e.templates],["resources",e.resources]],r=["Skill support files are rooted at the skill root above. When the skill references `references/...`, `assets/...`, `scripts/...`, `templates/...`, or `resources/...`, read it from this skill root.","","Support roots:"];for(let[i,s]of n)s?.length&&r.push(`- ${i}/: ${Me(`${e.path}/${i}`)} (${s.length} files)`);r.push("","Support file inventory:");for(let{folder:i,file:s}of t.slice(0,ct))r.push(`- ${i}/${s.relativePath}: ${Me(s.path)}`);return t.length>ct&&r.push(`- ... ${t.length-ct} more files under ${Me(e.path)}`),r}o(Za,"buildSupportFileContext");function ec(e,t,n){let r=[];r.push(`<skill name="${ir(e.name)}" location="${ir(e.path)}">`),r.push(""),r.push(`Skill root: ${Me(e.path)}`),e.source==="builtin"?r.push("This is a built-in KodaX skill."):e.source==="project"?r.push("This is a project-defined skill. Project work paths are relative to the project root; skill support files are relative to the skill root above."):e.source==="user"&&r.push("This is a user-defined skill."),r.push("");let i=Za(e);return i.length>0&&(r.push(...i),r.push("")),r.push(t),n.trim()&&(r.push(""),r.push(`User provided arguments: ${n}`)),r.push(""),r.push("</skill>"),r.join(`
|
|
637
|
-
`)}o(ec,"buildSkillBlock");async function dt(e,t,n){let r=await ae(e.content,t,n);return{content:ec(e,r,t),disableModelInvocation:e.disableModelInvocation??!1,skill:e}}o(dt,"expandSkillForLLM");import{writeFile as lr}from"node:fs/promises";import j from"node:path";import{existsSync as tc}from"node:fs";import{mkdir as nc,readFile as lt,readdir as rc,stat as ar,writeFile as bE}from"node:fs/promises";import oc from"node:os";import $ from"node:path";import{fileURLToPath as cr,pathToFileURL as ic}from"node:url";import sc from"yaml";var Y=null;async function F(){if(Y)return Y;let e=$.dirname(cr(import.meta.url)),t=[],n=$.resolve(e,"../../../index.js");if(tc(n))return Y=await import(ic(n).href),Y;t.push(`relative SDK path not found: ${n}`);try{return Y=await import(["@kodax-ai","kodax"].join("/")),Y}catch(r){t.push(`bare-name @kodax-ai/kodax failed: ${r?.code??r?.message}`)}throw new Error(`Cannot locate KodaX SDK from helper script ${import.meta.url}.
|
|
638
|
-
Attempted:
|
|
639
|
-
- ${t.join(`
|
|
640
|
-
- `)}`)}o(F,"loadKodaXSDK");function ac(e){let t=e.replace(/^\uFEFF/,"").replace(/\r\n/g,`
|
|
641
|
-
`).replace(/\r/g,`
|
|
642
|
-
`).trimStart();if(!t.startsWith(`---
|
|
643
|
-
`))throw new Error("SKILL.md missing YAML frontmatter");let n=t.indexOf(`
|
|
644
|
-
---
|
|
645
|
-
`,4);if(n===-1)throw new Error("SKILL.md has unclosed YAML frontmatter");return{yamlText:t.slice(4,n),body:t.slice(n+5).trim()}}o(ac,"extractFrontmatter");function Oe(e){let{yamlText:t,body:n}=ac(e),r=sc.parse(t);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("Frontmatter must be a YAML object");return{frontmatter:r,body:n}}o(Oe,"parseSkillMarkdown");async function de(e){let t=$.join(e,"SKILL.md");if(!(await ar(t).catch(()=>null))?.isFile())throw new Error(`SKILL.md not found in ${e}`);let r=await lt(t,"utf8"),{frontmatter:i,body:s}=Oe(r);return{skillDir:$.resolve(e),skillMdPath:t,rawContent:r,body:s,frontmatter:i}}o(de,"loadSkill");async function le(e){try{return await ar(e),!0}catch{return!1}}o(le,"pathExists");function $e(e){if(!e.length)return{mean:0,stddev:0,min:0,max:0};let t=e.reduce((r,i)=>r+i,0)/e.length,n=e.length>1?e.reduce((r,i)=>r+(i-t)**2,0)/(e.length-1):0;return{mean:ce(t),stddev:ce(Math.sqrt(n)),min:ce(Math.min(...e)),max:ce(Math.max(...e))}}o($e,"calculateStats");function ce(e,t=4){return Number(e.toFixed(t))}o(ce,"roundNumber");function De(e){return e>=0?`+${e.toFixed(4)}`:e.toFixed(4)}o(De,"formatDelta");function sr(e){try{return JSON.parse(e)}catch{return null}}o(sr,"safeJsonParse");function Q(e){let t=sr(e.trim());if(t&&typeof t=="object")return t;let n=e.indexOf("{"),r=e.lastIndexOf("}");return n===-1||r===-1||r<=n?null:sr(e.slice(n,r+1))}o(Q,"extractJsonObject");async function _(e,t=null){try{return JSON.parse(await lt(e,"utf8"))}catch{return t}}o(_,"readJsonFile");async function Z(e,t){let n=$.dirname(cr(e));return lt($.resolve(n,t),"utf8")}o(Z,"loadRelativeText");function T(e,t=12e3){let n=typeof e=="string"?e:String(e??"");if(n.length<=t)return n;let r=n.length-t;return`${n.slice(0,t)}
|
|
646
|
-
|
|
647
|
-
[truncated ${r} chars]`}o(T,"truncateText");function dr(e){let t=Array.isArray(e)?e.length:0,n=Array.isArray(e)?e.filter(i=>i?.passed===!0).length:0,r=Math.max(t-n,0);return{passed:n,failed:r,total:t,pass_rate:t>0?ce(n/t):0}}o(dr,"computePassSummary");async function ut(e,t=e,n=[]){let r=await rc(t,{withFileTypes:!0}).catch(()=>[]);for(let i of r.sort((s,a)=>s.name.localeCompare(a.name))){let s=$.join(t,i.name);if(i.isDirectory()){await ut(e,s,n);continue}i.isFile()&&n.push({absolutePath:s,relativePath:$.relative(e,s).replace(/\\/g,"/")})}return n}o(ut,"collectFiles");function ue(){return $.join(oc.homedir(),".kodax","skills")}o(ue,"getDefaultSkillsDir");async function A(e){return await nc(e,{recursive:!0}),e}o(A,"ensureDirectory");function cc(e){return e.split("-").filter(Boolean).map(t=>t[0]?.toUpperCase()+t.slice(1)).join(" ")}o(cc,"titleFromSlug");function dc(e,t){let n=cc(e);return`---
|
|
648
|
-
name: ${e}
|
|
649
|
-
description: ${t}
|
|
650
|
-
user-invocable: true
|
|
651
|
-
disable-model-invocation: false
|
|
652
|
-
allowed-tools: "Read, Grep, Glob"
|
|
653
|
-
compatibility: "Optimized for KodaX and Agent Skills style directories."
|
|
654
|
-
---
|
|
655
|
-
|
|
656
|
-
# ${n}
|
|
657
|
-
|
|
658
|
-
Describe the task this skill handles, the trigger boundary, and the expected outcome.
|
|
659
|
-
|
|
660
|
-
## When to use
|
|
661
|
-
|
|
662
|
-
- Use this skill when the user asks for ${n.toLowerCase()}.
|
|
663
|
-
- Do not use this skill when the request only needs a short explanation or is out of scope.
|
|
664
|
-
|
|
665
|
-
## Workflow
|
|
666
|
-
|
|
667
|
-
1. Restate the task boundary in one sentence.
|
|
668
|
-
2. Gather the minimum context needed to do the work well.
|
|
669
|
-
3. Execute the task, preferring small, verifiable steps.
|
|
670
|
-
4. Summarize what changed, what was validated, and any remaining risks.
|
|
671
|
-
|
|
672
|
-
## References
|
|
673
|
-
|
|
674
|
-
- Put deeper guidance in \`references/\`.
|
|
675
|
-
- Put reusable templates or static files in \`assets/\`.
|
|
676
|
-
- Put repeatable helper scripts in \`scripts/\`.
|
|
677
|
-
`}o(dc,"renderSkillTemplate");function lc(e){return JSON.stringify({skill_name:e,evals:[{id:1,prompt:"TODO: Add a realistic user request to evaluate this skill.",expected_output:"Describe what a successful result should accomplish.",files:[],assertions:[]}]},null,2)}o(lc,"renderEvalTemplate");async function uc(e){let t=j.resolve(e.baseDir??ue()),n=j.join(t,e.name),r=e.description??`Describe what ${e.name} does and when it should be used.`;if(await le(n)&&!e.force)throw new Error(`Skill directory already exists: ${n}`);return await A(n),await A(j.join(n,"references")),await A(j.join(n,"assets")),await A(j.join(n,"scripts")),await lr(j.join(n,"SKILL.md"),dc(e.name,r),"utf8"),e.includeEvals!==!1&&(await A(j.join(n,"evals")),await lr(j.join(n,"evals","evals.json"),`${lc(e.name)}
|
|
678
|
-
`,"utf8")),{skillDir:n,created:["SKILL.md",...e.includeEvals!==!1?["evals/evals.json"]:[],"references/","assets/","scripts/"]}}o(uc,"initSkill");function fc(e){let t={name:e[2],baseDir:void 0,description:void 0,force:!1,includeEvals:!0};for(let n=3;n<e.length;n+=1){let r=e[n];(r==="--path"||r==="--dest")&&e[n+1]?t.baseDir=e[++n]:r==="--description"&&e[n+1]?t.description=e[++n]:r==="--force"?t.force=!0:r==="--no-evals"&&(t.includeEvals=!1)}return t}o(fc,"parseArgs");async function ur(e=process.argv){let t=fc(e);t.name||(console.error("Usage: node scripts/init-skill.js <skill-name> [--path <skills-dir>] [--description <text>] [--force] [--no-evals]"),process.exit(1));let n=await uc(t);console.log(`Initialized ${n.skillDir}`)}o(ur,"main");var pc=!1;pc&&ur().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import fr from"node:path";var mc=new Set(["name","description","license","compatibility","metadata","allowed-tools","disable-model-invocation","user-invocable","argument-hint","context","agent","model","hooks"]);async function fe(e){let t={valid:!1,errors:[],warnings:[],frontmatter:null},n;try{n=await de(e)}catch(d){return t.errors.push(d instanceof Error?d.message:String(d)),t}let{frontmatter:r,body:i}=n;t.frontmatter=r;let s=Object.keys(r).filter(d=>!mc.has(d));s.length>0&&t.errors.push(`Unexpected frontmatter keys: ${s.sort().join(", ")}`);let a=typeof r.name=="string"?r.name.trim():"",c=typeof r.description=="string"?r.description.trim():"";if(!a)t.errors.push("Missing required frontmatter field: name");else{/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(a)||t.errors.push(`Invalid skill name "${a}". Use lowercase kebab-case and avoid consecutive hyphens.`),a.length>64&&t.errors.push(`Skill name is too long (${a.length}/64).`);let d=fr.basename(fr.resolve(e));d!==a&&t.warnings.push(`Skill directory name "${d}" does not match frontmatter name "${a}".`)}if(c?(c.length>1024&&t.errors.push(`Description is too long (${c.length}/1024).`),/[<>]/.test(c)&&t.errors.push("Description cannot contain angle brackets."),/[。.!?]/.test(c)||t.warnings.push("Description may be too terse; consider making the trigger conditions clearer.")):t.errors.push("Missing required frontmatter field: description"),i.trim()||t.errors.push("SKILL.md body is empty."),r.compatibility!=null&&(typeof r.compatibility!="string"?t.errors.push("compatibility must be a string if provided."):r.compatibility.length>500&&t.errors.push(`compatibility is too long (${r.compatibility.length}/500).`)),r["allowed-tools"]!=null){let d=r["allowed-tools"];typeof d=="string"||Array.isArray(d)&&d.every(u=>typeof u=="string")||t.errors.push("allowed-tools must be a string or string array.")}return r["disable-model-invocation"]!=null&&typeof r["disable-model-invocation"]!="boolean"&&t.errors.push("disable-model-invocation must be a boolean."),r["user-invocable"]!=null&&typeof r["user-invocable"]!="boolean"&&t.errors.push("user-invocable must be a boolean."),r.context!=null&&r.context!=="fork"&&t.errors.push('context must be "fork" when provided.'),r.hooks!=null&&(typeof r.hooks!="object"||Array.isArray(r.hooks))&&t.errors.push("hooks must be an object when provided."),t.valid=t.errors.length===0,t}o(fe,"validateSkillDirectory");async function pr(e=process.argv){let t=e[2];t||(console.error("Usage: node scripts/quick-validate.js <skill-directory>"),process.exit(1));let n=await fe(t);if(n.errors.length===0)console.log("Skill is valid.");else{console.error("Skill validation failed:");for(let r of n.errors)console.error(`- ${r}`)}if(n.warnings.length>0){console.log("Warnings:");for(let r of n.warnings)console.log(`- ${r}`)}process.exit(n.valid?0:1)}o(pr,"main");var hc=!1;hc&&pr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readFile as ft,writeFile as D}from"node:fs/promises";import k from"node:path";function gc(e){return typeof e=="string"?{text:e}:e&&typeof e=="object"&&typeof e.text=="string"?{text:e.text}:null}o(gc,"normalizeAssertion");function yc(e){return e.reduce((t,n)=>Array.isArray(n.content)?t+n.content.filter(r=>r?.type==="tool_use").length:t,0)}o(yc,"countToolCalls");function wc(e){return e.reduce((t,n)=>Array.isArray(n.content)?t+n.content.filter(r=>r?.type==="tool_result"&&r.is_error===!0).length:t,0)}o(wc,"countToolErrors");function vc(e,t){return`${["# Skill Eval Transcript","","## Eval Prompt","",e,"","## Final Response","",t.lastText||"(No final text)","","## Result Flags","",`- success: ${t.success}`,`- signal: ${t.signal??"none"}`,`- interrupted: ${t.interrupted===!0}`,`- limit_reached: ${t.limitReached===!0}`].join(`
|
|
679
|
-
`)}
|
|
680
|
-
`}o(vc,"renderTranscript");async function bc(e,t){let n=k.dirname(k.resolve(t.evalsPath)),r=k.resolve(t.cwd??process.cwd()),i=[];for(let s of e??[]){let a=k.isAbsolute(s)?s:k.resolve(n,s),c=k.resolve(r,s),d=null,l=a;try{d=await ft(a,"utf8")}catch{d=await ft(c,"utf8").catch(()=>null),l=c}if(d==null)throw new Error(`Input file not found for eval: ${s}`);i.push(`### ${s}
|
|
681
|
-
\`\`\`
|
|
682
|
-
${d}
|
|
683
|
-
\`\`\`
|
|
684
|
-
(Resolved from ${l})`)}return i.length===0?"":`## Input Files
|
|
685
|
-
|
|
686
|
-
${i.join(`
|
|
687
|
-
|
|
688
|
-
`)}
|
|
689
|
-
|
|
690
|
-
`}o(bc,"readInputFiles");async function kc(e,t){let n=String(e.prompt??e.query??"").trim();return`${await bc(e.files,t)}${n}`.trim()}o(kc,"buildEvalPrompt");async function Sc(e,t){let{runKodaX:n,estimateTokens:r}=await F(),i=Date.now(),s=await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??30,reasoningMode:t.reasoningMode??"off",thinking:t.reasoningMode?t.reasoningMode!=="off":!1,context:{gitRoot:k.resolve(t.cwd??process.cwd())}},e);return{result:s,totalTokens:r(s.messages),durationMs:Date.now()-i}}o(Sc,"defaultRunAgent");async function Ec(e,t,n,r){return e==="with_skill"?(await dt(t,n,{workingDirectory:k.resolve(r.cwd??process.cwd()),projectRoot:k.resolve(r.cwd??process.cwd()),sessionId:"skill-eval",environment:{}})).content:n}o(Ec,"prepareConfigPrompt");async function xc(e,t,n,r,i){let s=k.join(e,"outputs");await A(s);let a={total_tool_calls:yc(i.result.messages),errors_encountered:wc(i.result.messages),output_chars:i.result.lastText.length};await D(k.join(s,"result.md"),`${i.result.lastText}
|
|
691
|
-
`,"utf8"),await D(k.join(s,"prompt.txt"),`${r}
|
|
692
|
-
`,"utf8"),await D(k.join(e,"transcript.md"),vc(r,i.result),"utf8"),await D(k.join(s,"metrics.json"),`${JSON.stringify({config:t,eval_id:n.id??null,session_id:i.result.sessionId,...a},null,2)}
|
|
693
|
-
`,"utf8"),await D(k.join(s,"messages.json"),`${JSON.stringify(i.result.messages,null,2)}
|
|
694
|
-
`,"utf8"),await D(k.join(e,"timing.json"),`${JSON.stringify({total_tokens:i.totalTokens,duration_ms:i.durationMs,total_duration_seconds:Number((i.durationMs/1e3).toFixed(4))},null,2)}
|
|
695
|
-
`,"utf8"),await D(k.join(e,"result.json"),`${JSON.stringify({success:i.result.success,signal:i.result.signal??null,signal_reason:i.result.signalReason??null,interrupted:i.result.interrupted===!0,limit_reached:i.result.limitReached===!0,session_id:i.result.sessionId,execution_metrics:a},null,2)}
|
|
696
|
-
`,"utf8")}o(xc,"writeRunArtifacts");async function Rc(e,t=Sc){let n=await Ie(k.resolve(e.skillPath),"user");if(!n)throw new Error(`Failed to load skill from ${e.skillPath}`);let r=k.resolve(e.workspaceDir);await A(r);let i=JSON.parse(await ft(e.evalsPath,"utf8")),s=Array.isArray(i.evals)?i.evals:[],a=e.configs?.length?e.configs:["with_skill","without_skill"],c=Number.isFinite(e.runsPerConfig)&&e.runsPerConfig>0?Math.floor(e.runsPerConfig):1,d=[];for(let l=0;l<s.length;l+=1){let u=s[l],p=k.join(r,`eval-${l}`);await A(p),await D(k.join(p,"eval_metadata.json"),`${JSON.stringify({eval_id:u.id??l,eval_name:u.name??`eval-${l}`,prompt:u.prompt??u.query??"",expected_output:u.expected_output??"",assertions:(Array.isArray(u.assertions)?u.assertions:[]).map(gc).filter(Boolean)},null,2)}
|
|
697
|
-
`,"utf8");let h=await kc(u,e),f={};for(let m of a){let y=k.join(p,m);await A(y),f[m]=[];for(let w=1;w<=c;w+=1){let g=k.join(y,`run-${w}`);await A(g);let E=await Ec(m,n,h,e),b=await t(E,{...e,configName:m,evalItem:u,runIndex:w});await xc(g,m,u,E,b),f[m].push({run_id:`run-${w}`,session_id:b.result.sessionId,success:b.result.success,total_tokens:b.totalTokens,duration_ms:b.durationMs,output_chars:b.result.lastText.length})}}d.push({eval_id:u.id??l,prompt:u.prompt??u.query??"",configs:f})}return{workspace:r,skill_name:n.name,eval_count:s.length,configs:a,runs_per_config:c,reports:d}}o(Rc,"runEvalWorkspace");function Ic(e){let t={skillPath:"",evalsPath:"",workspaceDir:"",provider:"anthropic",model:void 0,runsPerConfig:1,maxIter:30,reasoningMode:"off",cwd:process.cwd(),configs:["with_skill","without_skill"],output:void 0};for(let n=2;n<e.length;n+=1){let r=e[n];r==="--skill-path"&&e[n+1]?t.skillPath=e[++n]:r==="--evals"&&e[n+1]?t.evalsPath=e[++n]:r==="--workspace"&&e[n+1]?t.workspaceDir=e[++n]:r==="--provider"&&e[n+1]?t.provider=e[++n]:r==="--model"&&e[n+1]?t.model=e[++n]:r==="--runs"&&e[n+1]?t.runsPerConfig=Number(e[++n]):r==="--max-iter"&&e[n+1]?t.maxIter=Number(e[++n]):r==="--reasoning"&&e[n+1]?t.reasoningMode=e[++n]:r==="--cwd"&&e[n+1]?t.cwd=e[++n]:r==="--configs"&&e[n+1]?t.configs=e[++n].split(",").map(i=>i.trim()).filter(Boolean):r==="--output"&&e[n+1]&&(t.output=e[++n])}return t}o(Ic,"parseArgs");async function mr(e=process.argv){let t=Ic(e);(!t.skillPath||!t.evalsPath||!t.workspaceDir)&&(console.error("Usage: node scripts/run-eval.js --skill-path <dir> --evals <evals.json> --workspace <dir> [--provider anthropic] [--runs 1]"),process.exit(1));let n=await Rc(t),r=`${JSON.stringify(n,null,2)}
|
|
698
|
-
`;t.output?(await D(t.output,r,"utf8"),console.log(`Wrote ${k.resolve(t.output)}`)):process.stdout.write(r)}o(mr,"main");var Tc=!1;Tc&&mr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readdir as Ac,readFile as pt,writeFile as gr}from"node:fs/promises";import S from"node:path";function U(e){return String(e??"").trim()}o(U,"normalizeExpectationText");function yr(e){let n=(Array.isArray(e?.assertions)?e.assertions:[]).map(i=>typeof i=="string"?U(i):i&&typeof i=="object"&&typeof i.text=="string"?U(i.text):"").filter(Boolean);if(n.length>0)return n;let r=U(e?.expected_output);return r?[r]:[]}o(yr,"normalizeExpectedRubric");function mt(e){return Array.isArray(e)?e.map(t=>String(t??"").trim()).filter(Boolean):[]}o(mt,"normalizeStringArray");function hr(e,t){return{text:U(e?.text??t),passed:e?.passed===!0,evidence:U(e?.evidence)}}o(hr,"normalizeExpectationEntry");function Cc(e,t){let n=Q(e)??{},r=Array.isArray(n.expectations)?n.expectations:[],i=[],s=new Set;for(let a of t){let c=r.findIndex((d,l)=>s.has(l)?!1:U(d?.text).toLowerCase()===a.toLowerCase());if(c===-1){i.push({text:a,passed:!1,evidence:""});continue}s.add(c),i.push(hr(r[c],a))}if(t.length===0)for(let a of r){let c=hr(a,"");c.text&&i.push(c)}return{overall_summary:U(n.overall_summary),expectations:i,user_notes_summary:{uncertainties:mt(n.user_notes_summary?.uncertainties),needs_review:mt(n.user_notes_summary?.needs_review),workarounds:mt(n.user_notes_summary?.workarounds)}}}o(Cc,"normalizeParsedGrading");async function ht(e){return(await Ac(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>S.join(e,n.name)).sort((n,r)=>n.localeCompare(r))}o(ht,"listDirectories");async function Pc(e){let t=S.dirname(e),n=S.dirname(t),r=S.basename(t),i=S.basename(e),s=S.join(e,"outputs"),a=await _(S.join(n,"eval_metadata.json"),{}),c=await pt(S.join(s,"result.md"),"utf8").catch(()=>""),d=await pt(S.join(s,"prompt.txt"),"utf8").catch(()=>""),l=await pt(S.join(e,"transcript.md"),"utf8").catch(()=>""),u=await _(S.join(s,"metrics.json"),{}),p=await _(S.join(e,"result.json"),{}),h=await _(S.join(e,"timing.json"),{});return{evalDir:n,runDir:e,runId:i,configName:r,evalMetadata:a,outputsDir:s,resultText:c,promptText:d,transcript:l,metrics:u,result:p,timing:h}}o(Pc,"loadRunContext");function _c(e){let t=yr(e.evalMetadata),n=t.length>0?t.map((r,i)=>`${i+1}. ${r}`).join(`
|
|
699
|
-
`):"(No explicit assertions; infer one expectation from expected_output if present.)";return`${e.agentInstructions.trim()}
|
|
700
|
-
|
|
701
|
-
Return JSON with this shape:
|
|
702
|
-
{
|
|
703
|
-
"overall_summary": "short summary",
|
|
704
|
-
"expectations": [
|
|
705
|
-
{
|
|
706
|
-
"text": "expectation text",
|
|
707
|
-
"passed": true,
|
|
708
|
-
"evidence": "short evidence grounded in the output"
|
|
709
|
-
}
|
|
710
|
-
],
|
|
711
|
-
"user_notes_summary": {
|
|
712
|
-
"uncertainties": [],
|
|
713
|
-
"needs_review": [],
|
|
714
|
-
"workarounds": []
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
## Run Metadata
|
|
719
|
-
- eval_id: ${e.evalMetadata.eval_id??"unknown"}
|
|
720
|
-
- eval_name: ${e.evalMetadata.eval_name??"unknown"}
|
|
721
|
-
- config: ${e.configName}
|
|
722
|
-
- run_id: ${e.runId}
|
|
723
|
-
|
|
724
|
-
## Eval Prompt
|
|
725
|
-
${T(e.evalMetadata.prompt??e.promptText,4e3)}
|
|
726
|
-
|
|
727
|
-
## Expected Outcome
|
|
728
|
-
${T(e.evalMetadata.expected_output??"",2e3)}
|
|
729
|
-
|
|
730
|
-
## Assertions
|
|
731
|
-
${n}
|
|
732
|
-
|
|
733
|
-
## Final Output
|
|
734
|
-
${T(e.resultText,12e3)}
|
|
735
|
-
|
|
736
|
-
## Result Flags
|
|
737
|
-
${JSON.stringify({success:e.result.success??null,signal:e.result.signal??null,interrupted:e.result.interrupted??!1,limit_reached:e.result.limit_reached??e.result.limitReached??!1},null,2)}
|
|
738
|
-
|
|
739
|
-
## Execution Metrics
|
|
740
|
-
${JSON.stringify({total_tool_calls:e.metrics.total_tool_calls??e.result.execution_metrics?.total_tool_calls??0,errors_encountered:e.metrics.errors_encountered??e.result.execution_metrics?.errors_encountered??0,output_chars:e.metrics.output_chars??e.result.execution_metrics?.output_chars??e.resultText.length,total_tokens:e.timing.total_tokens??0,total_duration_seconds:e.timing.total_duration_seconds??0},null,2)}
|
|
741
|
-
|
|
742
|
-
## Transcript Excerpt
|
|
743
|
-
${T(e.transcript,5e3)}
|
|
744
|
-
`}o(_c,"buildGradingPrompt");async function wr(e,t){let{runKodaX:n}=await F();return(await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??20,reasoningMode:t.reasoningMode??"balanced",thinking:t.reasoningMode?t.reasoningMode!=="off":!0,context:{gitRoot:S.resolve(t.cwd??t.workspaceDir??process.cwd())}},e)).lastText}o(wr,"defaultRunJudge");async function Mc(e,t,n=wr){let r=await Pc(S.resolve(e)),i=yr(r.evalMetadata),s=await Z(import.meta.url,"../agents/grader.md"),a=_c({...r,agentInstructions:s}),c=await n(a,{...t,runDir:r.runDir,configName:r.configName,evalMetadata:r.evalMetadata,runId:r.runId}),d=Cc(c,i),l={total_tool_calls:r.metrics.total_tool_calls??r.result.execution_metrics?.total_tool_calls??0,errors_encountered:r.metrics.errors_encountered??r.result.execution_metrics?.errors_encountered??0,output_chars:r.metrics.output_chars??r.result.execution_metrics?.output_chars??r.resultText.length},u={summary:dr(d.expectations),expectations:d.expectations,execution_metrics:l,user_notes_summary:d.user_notes_summary,overall_summary:d.overall_summary,timing:{total_tokens:r.timing.total_tokens??0,total_duration_seconds:r.timing.total_duration_seconds??0},meta:{generated_at:new Date().toISOString(),eval_id:r.evalMetadata.eval_id??null,eval_name:r.evalMetadata.eval_name??null,config:r.configName,run_id:r.runId}};return await gr(S.join(r.runDir,"grading.json"),`${JSON.stringify(u,null,2)}
|
|
745
|
-
`,"utf8"),{runDir:r.runDir,grading:u,prompt:a,rawResponse:c}}o(Mc,"gradeRun");async function Oc(e,t=wr){let n=S.resolve(e.workspaceDir);await A(n);let r=new Set((e.configs??[]).map(c=>String(c).trim()).filter(Boolean)),i=[],s=[];for(let c of await ht(n))if(S.basename(c).startsWith("eval-"))for(let d of await ht(c)){let l=S.basename(d);if(!(r.size>0&&!r.has(l)))for(let u of await ht(d)){if(!S.basename(u).startsWith("run-"))continue;let p=S.join(u,"grading.json");if(await _(p,null)&&e.overwrite!==!0){s.push(S.relative(n,u).replace(/\\/g,"/"));continue}let f=await Mc(u,e,t);i.push({run:S.relative(n,u).replace(/\\/g,"/"),summary:f.grading.summary,config:f.grading.meta.config,eval_id:f.grading.meta.eval_id})}}let a={workspace:n,generated_at:new Date().toISOString(),processed:i.length,skipped:s.length,processed_runs:i,skipped_runs:s};return await gr(S.join(n,"grading-summary.json"),`${JSON.stringify(a,null,2)}
|
|
746
|
-
`,"utf8"),a}o(Oc,"gradeWorkspace");function $c(e){let t={workspaceDir:e[2]??"",provider:"anthropic",model:void 0,reasoningMode:"balanced",maxIter:20,cwd:process.cwd(),overwrite:!1,configs:[]};for(let n=3;n<e.length;n+=1){let r=e[n];r==="--provider"&&e[n+1]?t.provider=e[++n]:r==="--model"&&e[n+1]?t.model=e[++n]:r==="--reasoning"&&e[n+1]?t.reasoningMode=e[++n]:r==="--max-iter"&&e[n+1]?t.maxIter=Number(e[++n]):r==="--cwd"&&e[n+1]?t.cwd=e[++n]:r==="--overwrite"?t.overwrite=!0:r==="--configs"&&e[n+1]&&(t.configs=e[++n].split(",").map(i=>i.trim()).filter(Boolean))}return t}o($c,"parseArgs");async function vr(e=process.argv){let t=$c(e);t.workspaceDir||(console.error("Usage: node scripts/grade-evals.js <workspace> [--provider anthropic] [--configs with_skill,without_skill] [--overwrite]"),process.exit(1));let n=await Oc(t);process.stdout.write(`${JSON.stringify(n,null,2)}
|
|
747
|
-
`)}o(vr,"main");var Dc=!1;Dc&&vr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{writeFile as vt}from"node:fs/promises";import L from"node:path";import{readFile as Lc,readdir as Nc,stat as Fc,writeFile as br}from"node:fs/promises";import C from"node:path";async function gt(e){return JSON.parse(await Lc(e,"utf8"))}o(gt,"readJson");async function jc(e){try{return await Fc(e),!0}catch{return!1}}o(jc,"pathExists");async function yt(e){return(await Nc(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>C.join(e,n.name)).sort((n,r)=>n.localeCompare(r))}o(yt,"listDirectories");async function Le(e){let t=await jc(C.join(e,"runs"))?C.join(e,"runs"):e,n=(await yt(t)).filter(i=>C.basename(i).startsWith("eval-")),r={};for(let i of n){let s=C.join(i,"eval_metadata.json"),c=(await gt(s).catch(()=>({}))).eval_id??C.basename(i);for(let d of await yt(i)){let l=C.basename(d),u=(await yt(d)).filter(p=>C.basename(p).startsWith("run-"));if(u.length!==0){r[l]??=[];for(let p of u){let h=await gt(C.join(p,"grading.json")).catch(()=>null);if(!h)continue;let f=await gt(C.join(p,"timing.json")).catch(()=>({}));r[l].push({eval_id:c,run_id:C.basename(p),pass_rate:h.summary?.pass_rate??0,passed:h.summary?.passed??0,failed:h.summary?.failed??0,total:h.summary?.total??0,time_seconds:f.total_duration_seconds??h.timing?.total_duration_seconds??0,tokens:f.total_tokens??h.execution_metrics?.output_chars??0,tool_calls:h.execution_metrics?.total_tool_calls??0,errors:h.execution_metrics?.errors_encountered??0,expectations:Array.isArray(h.expectations)?h.expectations:[],notes:[...h.user_notes_summary?.uncertainties??[],...h.user_notes_summary?.needs_review??[],...h.user_notes_summary?.workarounds??[]]})}}}}return r}o(Le,"loadRunResults");function Kc(e){let t={};for(let[s,a]of Object.entries(e))t[s]={pass_rate:$e(a.map(c=>Number(c.pass_rate??0))),time_seconds:$e(a.map(c=>Number(c.time_seconds??0))),tokens:$e(a.map(c=>Number(c.tokens??0)))};let n=Object.keys(t),r=t[n[0]]??{pass_rate:{mean:0},time_seconds:{mean:0},tokens:{mean:0}},i=t[n[1]]??{pass_rate:{mean:0},time_seconds:{mean:0},tokens:{mean:0}};return{configs:t,delta:{pass_rate:De(r.pass_rate.mean-i.pass_rate.mean),time_seconds:De(r.time_seconds.mean-i.time_seconds.mean),tokens:De(r.tokens.mean-i.tokens.mean)}}}o(Kc,"summarizeConfigs");function wt(e,t,n){let r=Kc(n);return{skill_name:t,generated_at:new Date().toISOString(),workspace:C.resolve(e),configs:r.configs,delta:r.delta,runs:n}}o(wt,"buildBenchmarkDocument");function Wc(e){let t=[`# Benchmark: ${e.skill_name}`,"",`Generated: ${e.generated_at}`,"","| Config | Pass Rate | Time (s) | Tokens |","| --- | --- | --- | --- |"];for(let[n,r]of Object.entries(e.configs))t.push(`| ${n} | ${r.pass_rate.mean} \xB1 ${r.pass_rate.stddev} | ${r.time_seconds.mean} \xB1 ${r.time_seconds.stddev} | ${r.tokens.mean} \xB1 ${r.tokens.stddev} |`);return t.push(""),t.push("## Delta"),t.push(""),t.push(`- Pass rate: ${e.delta.pass_rate}`),t.push(`- Time (s): ${e.delta.time_seconds}`),t.push(`- Tokens: ${e.delta.tokens}`),t.join(`
|
|
748
|
-
`)}o(Wc,"renderBenchmarkMarkdown");function Bc(e){let t={iterationDir:e[2],skillName:"unknown-skill"};for(let n=3;n<e.length;n+=1)e[n]==="--skill-name"&&e[n+1]&&(t.skillName=e[n+1],n+=1);return t}o(Bc,"parseArgs");async function Xc(){let{iterationDir:e,skillName:t}=Bc(process.argv);e||(console.error("Usage: node scripts/aggregate-benchmark.js <iteration-dir> --skill-name <name>"),process.exit(1));let n=await Le(e);Object.keys(n).length===0&&(console.error(`No benchmark runs found in ${e}`),process.exit(1));let r=wt(e,t,n),i=C.join(e,"benchmark.json"),s=C.join(e,"benchmark.md");await br(i,JSON.stringify(r,null,2)),await br(s,`${Wc(r)}
|
|
749
|
-
`),console.log(`Wrote ${i}`),console.log(`Wrote ${s}`)}o(Xc,"main");var Uc=!1;Uc&&Xc().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});function Ne(e){return Array.isArray(e)?e.map(t=>String(t??"").trim()).filter(Boolean):[]}o(Ne,"normalizeStringArray");function qc(e){let t={};for(let[n,r]of Object.entries(e)){let i=new Map,s=[];for(let a of r){for(let c of a.expectations??[]){if(c?.passed===!0)continue;let d=String(c?.text??"").trim();d&&i.set(d,(i.get(d)??0)+1)}for(let c of a.notes??[]){let d=String(c??"").trim();d&&s.push(d)}}t[n]={repeated_failures:Array.from(i.entries()).sort((a,c)=>c[1]-a[1]).slice(0,10).map(([a,c])=>({text:a,count:c})),notes:s.slice(0,10)}}return t}o(qc,"summarizeFailureClusters");function zc(e,t,n){let r=Q(e)??{};return{skill_name:t.skill_name,generated_at:new Date().toISOString(),workspace:t.workspace,verdict:["improves","regresses","mixed","inconclusive"].includes(r.verdict)?r.verdict:"inconclusive",release_readiness:["ready","needs_iteration","needs_manual_review"].includes(r.release_readiness)?r.release_readiness:"needs_manual_review",recommendation:String(r.recommendation??"").trim(),key_findings:Ne(r.key_findings),variance_hotspots:Ne(r.variance_hotspots),suggested_actions:Ne(r.suggested_actions),watchouts:Ne(r.watchouts),supporting_metrics:{pass_rate_delta:t.delta?.pass_rate??"n/a",time_seconds_delta:t.delta?.time_seconds??"n/a",tokens_delta:t.delta?.tokens??"n/a"},failure_clusters:n}}o(zc,"normalizeAnalysisResult");function Hc(e){return`${e.agentInstructions.trim()}
|
|
750
|
-
|
|
751
|
-
Return JSON with this shape:
|
|
752
|
-
{
|
|
753
|
-
"verdict": "improves | regresses | mixed | inconclusive",
|
|
754
|
-
"release_readiness": "ready | needs_iteration | needs_manual_review",
|
|
755
|
-
"recommendation": "short recommendation",
|
|
756
|
-
"key_findings": [],
|
|
757
|
-
"variance_hotspots": [],
|
|
758
|
-
"suggested_actions": [],
|
|
759
|
-
"watchouts": []
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
## Benchmark Summary
|
|
763
|
-
${T(JSON.stringify({skill_name:e.benchmark.skill_name,configs:e.benchmark.configs,delta:e.benchmark.delta},null,2),12e3)}
|
|
764
|
-
|
|
765
|
-
## Failure Clusters
|
|
766
|
-
${T(JSON.stringify(e.failureClusters,null,2),8e3)}
|
|
767
|
-
`}o(Hc,"buildAnalysisPrompt");async function Gc(e,t){let{runKodaX:n}=await F();return(await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??20,reasoningMode:t.reasoningMode??"balanced",thinking:t.reasoningMode?t.reasoningMode!=="off":!0,context:{gitRoot:L.resolve(t.cwd??t.workspaceDir??process.cwd())}},e)).lastText}o(Gc,"defaultRunAnalyst");function Vc(e){let t=[`# Benchmark Analysis: ${e.skill_name}`,"",`Generated: ${e.generated_at}`,"",`- Verdict: ${e.verdict}`,`- Release readiness: ${e.release_readiness}`,`- Recommendation: ${e.recommendation||"n/a"}`,""],n=[["key_findings","Key Findings"],["variance_hotspots","Variance Hotspots"],["suggested_actions","Suggested Actions"],["watchouts","Watchouts"]];for(let[r,i]of n){t.push(`## ${i}`),t.push("");let s=Array.isArray(e[r])?e[r]:[];if(s.length===0)t.push("- None");else for(let a of s)t.push(`- ${a}`);t.push("")}return t.push("## Supporting Metrics"),t.push(""),t.push(`- Pass rate delta: ${e.supporting_metrics.pass_rate_delta}`),t.push(`- Time delta: ${e.supporting_metrics.time_seconds_delta}`),t.push(`- Tokens delta: ${e.supporting_metrics.tokens_delta}`),`${t.join(`
|
|
768
|
-
`)}
|
|
769
|
-
`}o(Vc,"renderAnalysisMarkdown");async function Jc(e,t=Gc){let n=L.resolve(e.workspaceDir),r=L.resolve(e.benchmarkPath??L.join(n,"benchmark.json")),i=await _(r,null);if(!i){let f=await Le(n);if(Object.keys(f).length===0)throw new Error(`No benchmark data found in ${n}`);i=wt(n,e.skillName??L.basename(n),f),await vt(r,`${JSON.stringify(i,null,2)}
|
|
770
|
-
`,"utf8")}let s=await Le(n),a=qc(s),c=await Z(import.meta.url,"../agents/analyzer.md"),d=Hc({agentInstructions:c,benchmark:i,failureClusters:a}),l=await t(d,{...e,workspaceDir:n,benchmarkPath:r,benchmark:i}),u=zc(l,i,a),p=L.resolve(e.outputPath??L.join(n,"analysis.json")),h=L.resolve(e.markdownPath??L.join(n,"analysis.md"));return await vt(p,`${JSON.stringify(u,null,2)}
|
|
771
|
-
`,"utf8"),await vt(h,Vc(u),"utf8"),{analysis:u,prompt:d,rawResponse:l,analysisJsonPath:p,analysisMdPath:h}}o(Jc,"analyzeBenchmark");function Yc(e){let t={workspaceDir:e[2]??"",benchmarkPath:void 0,outputPath:void 0,markdownPath:void 0,skillName:void 0,provider:"anthropic",model:void 0,reasoningMode:"balanced",maxIter:20,cwd:process.cwd()};for(let n=3;n<e.length;n+=1){let r=e[n];r==="--benchmark"&&e[n+1]?t.benchmarkPath=e[++n]:r==="--output"&&e[n+1]?t.outputPath=e[++n]:r==="--markdown"&&e[n+1]?t.markdownPath=e[++n]:r==="--skill-name"&&e[n+1]?t.skillName=e[++n]:r==="--provider"&&e[n+1]?t.provider=e[++n]:r==="--model"&&e[n+1]?t.model=e[++n]:r==="--reasoning"&&e[n+1]?t.reasoningMode=e[++n]:r==="--max-iter"&&e[n+1]?t.maxIter=Number(e[++n]):r==="--cwd"&&e[n+1]&&(t.cwd=e[++n])}return t}o(Yc,"parseArgs");async function kr(e=process.argv){let t=Yc(e);t.workspaceDir||(console.error("Usage: node scripts/analyze-benchmark.js <workspace> [--benchmark benchmark.json] [--output analysis.json] [--markdown analysis.md]"),process.exit(1));let n=await Jc(t);process.stdout.write(`${JSON.stringify({analysis:n.analysis,analysis_json:n.analysisJsonPath,analysis_md:n.analysisMdPath},null,2)}
|
|
772
|
-
`)}o(kr,"main");var Qc=!1;Qc&&kr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readdir as Zc,readFile as Sr,writeFile as Er}from"node:fs/promises";import x from"node:path";async function kt(e){return(await Zc(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>x.join(e,n.name)).sort((n,r)=>n.localeCompare(r))}o(kt,"listDirectories");function bt(e){return Array.isArray(e)?e.map(t=>String(t??"").trim()).filter(Boolean):[]}o(bt,"normalizeStringArray");function ed(e){let t=Q(e)??{},n=["A","B","tie","inconclusive"].includes(t.winner)?t.winner:"inconclusive",r=Number(t.confidence);return{winner:n,confidence:Number.isFinite(r)?Math.max(0,Math.min(1,Number(r.toFixed(4)))):0,rationale:String(t.rationale??"").trim(),strengths_a:bt(t.strengths_a),strengths_b:bt(t.strengths_b),risks:bt(t.risks)}}o(ed,"normalizeComparisonResult");async function td(e,t,n,r){let i=(await kt(x.join(e,t))).filter(p=>x.basename(p).startsWith("run-")),s=(await kt(x.join(e,n))).filter(p=>x.basename(p).startsWith("run-")),a=i[r],c=s[r];if(!a||!c)return null;let d=await _(x.join(e,"eval_metadata.json"),{}),l=await Sr(x.join(a,"outputs","result.md"),"utf8").catch(()=>""),u=await Sr(x.join(c,"outputs","result.md"),"utf8").catch(()=>"");return{evalDir:e,evalMetadata:d,runA:{runDir:a,runId:x.basename(a),configName:t,output:l},runB:{runDir:c,runId:x.basename(c),configName:n,output:u}}}o(td,"loadComparisonPair");function nd(e){let t=e.presentPrimaryFirst?{A:e.runA,B:e.runB}:{A:e.runB,B:e.runA};return`${e.agentInstructions.trim()}
|
|
773
|
-
|
|
774
|
-
Return JSON with this shape:
|
|
775
|
-
{
|
|
776
|
-
"winner": "A | B | tie | inconclusive",
|
|
777
|
-
"confidence": 0.0,
|
|
778
|
-
"rationale": "short explanation",
|
|
779
|
-
"strengths_a": [],
|
|
780
|
-
"strengths_b": [],
|
|
781
|
-
"risks": []
|
|
782
|
-
}
|
|
783
|
-
|
|
784
|
-
Judge only the visible outputs. Do not mention hidden config names in the rationale.
|
|
785
|
-
|
|
786
|
-
## Eval Prompt
|
|
787
|
-
${T(e.evalMetadata.prompt??"",4e3)}
|
|
788
|
-
|
|
789
|
-
## Expected Outcome
|
|
790
|
-
${T(e.evalMetadata.expected_output??"",2e3)}
|
|
791
|
-
|
|
792
|
-
## Assertions
|
|
793
|
-
${T(JSON.stringify(e.evalMetadata.assertions??[],null,2),4e3)}
|
|
794
|
-
|
|
795
|
-
## Candidate A
|
|
796
|
-
${T(t.A.output,12e3)}
|
|
797
|
-
|
|
798
|
-
## Candidate B
|
|
799
|
-
${T(t.B.output,12e3)}
|
|
800
|
-
`}o(nd,"buildComparisonPrompt");async function rd(e,t){let{runKodaX:n}=await F();return(await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??20,reasoningMode:t.reasoningMode??"balanced",thinking:t.reasoningMode?t.reasoningMode!=="off":!0,context:{gitRoot:x.resolve(t.cwd??t.workspaceDir??process.cwd())}},e)).lastText}o(rd,"defaultRunComparator");function od(e,t,n,r){return e==="A"?t?n:r:e==="B"?t?r:n:e}o(od,"mapWinnerToConfig");function id(e){let t=[`# Blind Comparison: ${e.config_a} vs ${e.config_b}`,"",`Generated: ${e.generated_at}`,"",`- ${e.config_a} wins: ${e.summary.config_a_wins}`,`- ${e.config_b} wins: ${e.summary.config_b_wins}`,`- ties: ${e.summary.ties}`,`- inconclusive: ${e.summary.inconclusive}`,""];for(let n of e.comparisons)t.push(`## Eval ${n.eval_id??n.eval_name??n.index}`),t.push(""),t.push(`- Winner: ${n.winner_config}`),t.push(`- Confidence: ${n.confidence}`),t.push(`- Rationale: ${n.rationale||"n/a"}`),t.push("");return`${t.join(`
|
|
801
|
-
`)}
|
|
802
|
-
`}o(id,"renderComparisonMarkdown");async function sd(e,t=rd){let n=x.resolve(e.workspaceDir),r=e.configA??"with_skill",i=e.configB??"without_skill",s=Number.isFinite(e.maxPairs)&&e.maxPairs>0?Math.floor(e.maxPairs):Number.POSITIVE_INFINITY,a=await Z(import.meta.url,"../agents/comparator.md"),c=[];for(let p of await kt(n))if(x.basename(p).startsWith("eval-"))for(let h=0;h<s;h+=1){let f=await td(p,r,i,h);if(!f)break;let m=c.length%2===0,y=nd({agentInstructions:a,evalMetadata:f.evalMetadata,runA:f.runA,runB:f.runB,presentPrimaryFirst:m}),w=await t(y,{...e,workspaceDir:n,evalDir:p,pairIndex:h,configA:r,configB:i}),g=ed(w),E=od(g.winner,m,r,i);c.push({index:c.length+1,eval_id:f.evalMetadata.eval_id??null,eval_name:f.evalMetadata.eval_name??null,run_a:x.relative(n,f.runA.runDir).replace(/\\/g,"/"),run_b:x.relative(n,f.runB.runDir).replace(/\\/g,"/"),presented_as:m?{A:r,B:i}:{A:i,B:r},winner_label:g.winner,winner_config:E,confidence:g.confidence,rationale:g.rationale,strengths_a:g.strengths_a,strengths_b:g.strengths_b,risks:g.risks})}if(c.length===0)throw new Error(`No comparable run pairs found for ${r} vs ${i} in ${n}`);let d={workspace:n,generated_at:new Date().toISOString(),config_a:r,config_b:i,summary:{total_pairs:c.length,config_a_wins:c.filter(p=>p.winner_config===r).length,config_b_wins:c.filter(p=>p.winner_config===i).length,ties:c.filter(p=>p.winner_config==="tie").length,inconclusive:c.filter(p=>p.winner_config==="inconclusive").length},comparisons:c},l=x.resolve(e.outputPath??x.join(n,"comparison.json")),u=x.resolve(e.markdownPath??x.join(n,"comparison.md"));return await Er(l,`${JSON.stringify(d,null,2)}
|
|
803
|
-
`,"utf8"),await Er(u,id(d),"utf8"),{document:d,outputPath:l,markdownPath:u}}o(sd,"compareWorkspace");function ad(e){let t={workspaceDir:e[2]??"",configA:"with_skill",configB:"without_skill",outputPath:void 0,markdownPath:void 0,provider:"anthropic",model:void 0,reasoningMode:"balanced",maxIter:20,maxPairs:void 0,cwd:process.cwd()};for(let n=3;n<e.length;n+=1){let r=e[n];r==="--config-a"&&e[n+1]?t.configA=e[++n]:r==="--config-b"&&e[n+1]?t.configB=e[++n]:r==="--output"&&e[n+1]?t.outputPath=e[++n]:r==="--markdown"&&e[n+1]?t.markdownPath=e[++n]:r==="--provider"&&e[n+1]?t.provider=e[++n]:r==="--model"&&e[n+1]?t.model=e[++n]:r==="--reasoning"&&e[n+1]?t.reasoningMode=e[++n]:r==="--max-iter"&&e[n+1]?t.maxIter=Number(e[++n]):r==="--max-pairs"&&e[n+1]?t.maxPairs=Number(e[++n]):r==="--cwd"&&e[n+1]&&(t.cwd=e[++n])}return t}o(ad,"parseArgs");async function xr(e=process.argv){let t=ad(e);t.workspaceDir||(console.error("Usage: node scripts/compare-runs.js <workspace> [--config-a with_skill] [--config-b without_skill] [--output comparison.json]"),process.exit(1));let n=await sd(t);process.stdout.write(`${JSON.stringify({comparison:n.document.summary,output:n.outputPath,markdown:n.markdownPath},null,2)}
|
|
804
|
-
`)}o(xr,"main");var cd=!1;cd&&xr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readFile as dd,writeFile as ld}from"node:fs/promises";import{createHash as ud}from"node:crypto";import St from"node:path";import{zipSync as fd,strToU8 as pd}from"fflate";var md=".kodax-package.json";function hd(e){return e instanceof Uint8Array?e:new Uint8Array(e)}o(hd,"toUint8Array");function gd(e){return ud("sha256").update(e).digest("hex")}o(gd,"sha256");function yd(e,t,n={}){return{format:"kodax-skill-package",version:1,created_at:n.createdAt??new Date().toISOString(),entrypoint:"SKILL.md",skill:{name:e.frontmatter.name,description:e.frontmatter.description,compatibility:e.frontmatter.compatibility??null,user_invocable:e.frontmatter["user-invocable"]??!0,disable_model_invocation:e.frontmatter["disable-model-invocation"]??!1},files:t.map(r=>({path:r.relativePath,size:r.bytes.length,sha256:r.sha256})),note:"This archive is a zip file with a .skill extension. Compatible agents can extract and install the included skill directory."}}o(yd,"createPackageManifest");async function wd(e,t={}){let n=await fe(e);if(!n.valid)throw new Error(`Cannot package invalid skill:
|
|
805
|
-
- ${n.errors.join(`
|
|
806
|
-
- `)}`);let r=await de(e),i=await ut(e),s=[];for(let d of i){if(d.relativePath.endsWith(".skill"))continue;let l=hd(await dd(d.absolutePath));s.push({...d,bytes:l,sha256:gd(l)})}let a=yd(r,s,t),c={[md]:pd(JSON.stringify(a,null,2))};for(let d of s)c[d.relativePath]=d.bytes;return{manifest:a,bytes:fd(c,{level:6})}}o(wd,"buildSkillPackage");async function vd(e,t,n={}){let r=await wd(e,n);return await ld(t,r.bytes),{...r,outputPath:St.resolve(t)}}o(vd,"writeSkillPackage");function bd(e){let t={skillDir:e[2],output:void 0};for(let n=3;n<e.length;n+=1)e[n]==="--output"&&e[n+1]&&(t.output=e[++n]);return t}o(bd,"parseArgs");async function Rr(e=process.argv){let t=bd(e);t.skillDir||(console.error("Usage: node scripts/package-skill.js <skill-dir> [--output <file.skill>]"),process.exit(1));let n=await de(t.skillDir),r=t.output??St.join(St.dirname(t.skillDir),`${n.frontmatter.name}.skill`),i=await vd(t.skillDir,r);console.log(`Wrote ${i.outputPath}`)}o(Rr,"main");var kd=!1;kd&&Rr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{cp as Sd,mkdir as Et,readFile as Ar,rm as Cr,stat as Ed,writeFile as xd}from"node:fs/promises";import M from"node:path";import{strFromU8 as Ir,unzipSync as Rd}from"fflate";var Tr=".kodax-package.json";function Id(e){return e.replace(/\\/g,"/").replace(/^\.?\//,"")}o(Id,"normalizeArchivePath");function Td(e){let t=Id(e);if(!t||t.startsWith("/")||t.includes("../"))throw new Error(`Unsafe archive entry path: ${e}`);return t}o(Td,"assertSafeArchivePath");function Ad(e){return/\.(skill|zip)$/i.test(e)}o(Ad,"isZipLike");function Cd(e){let t=Rd(e),n=Object.entries(t).map(([l,u])=>({relativePath:Td(l),bytes:u})),r=n.find(l=>l.relativePath==="SKILL.md");if(!r)throw new Error("Archive is missing SKILL.md");let i=Oe(Ir(r.bytes)),s=typeof i.frontmatter.name=="string"?i.frontmatter.name.trim():"",a=typeof i.frontmatter.description=="string"?i.frontmatter.description.trim():"";if(!s||!a)throw new Error("Archive SKILL.md is missing required frontmatter fields.");let c=n.find(l=>l.relativePath===Tr),d=c?JSON.parse(Ir(c.bytes)):null;return{skillName:s,manifest:d,entries:n.filter(l=>l.relativePath!==Tr)}}o(Cd,"readSkillPackageBuffer");async function Pd(e,t){if(await le(e)){if(!t)throw new Error(`Target skill already exists: ${e}`);await Cr(e,{recursive:!0,force:!0})}await Et(e,{recursive:!0})}o(Pd,"ensureInstallTarget");async function _d(e,t={}){let n=M.resolve(t.skillsDir??ue()),r=Cd(await Ar(e)),i=M.join(n,r.skillName);await Pd(i,t.force===!0);for(let s of r.entries){let a=M.join(i,s.relativePath);await Et(M.dirname(a),{recursive:!0}),await xd(a,s.bytes)}return{skillName:r.skillName,installedTo:i,source:M.resolve(e),manifest:r.manifest}}o(_d,"installSkillArchive");async function Md(e,t={}){let n=await fe(e);if(!n.valid)throw new Error(`Cannot install invalid skill:
|
|
807
|
-
- ${n.errors.join(`
|
|
808
|
-
- `)}`);let r=M.join(e,"SKILL.md"),i=Oe(await Ar(r,"utf8")),s=M.resolve(t.skillsDir??ue()),a=M.join(s,i.frontmatter.name);if(await le(a)){if(!t.force)throw new Error(`Target skill already exists: ${a}`);await Cr(a,{recursive:!0,force:!0})}return await Et(s,{recursive:!0}),await Sd(e,a,{recursive:!0}),{skillName:i.frontmatter.name,installedTo:a,source:M.resolve(e),manifest:null}}o(Md,"installSkillDirectory");async function Od(e,t={}){let n=M.resolve(e),r=await Ed(n).catch(()=>null);if(!r)throw new Error(`Input not found: ${n}`);if(r.isDirectory())return Md(n,t);if(r.isFile()&&Ad(n))return _d(n,t);throw new Error("Input must be a skill directory or a .skill/.zip archive.")}o(Od,"installSkill");function $d(e){let t={input:e[2],skillsDir:void 0,force:!1};for(let n=3;n<e.length;n+=1){let r=e[n];r==="--dest"&&e[n+1]?t.skillsDir=e[++n]:r==="--force"&&(t.force=!0)}return t}o($d,"parseArgs");async function Pr(e=process.argv){let t=$d(e);t.input||(console.error("Usage: node scripts/install-skill.js <skill-dir-or-archive> [--dest <skills-dir>] [--force]"),process.exit(1));let n=await Od(t.input,t);console.log(`Installed ${n.skillName} to ${n.installedTo}`)}o(Pr,"main");var Dd=!1;Dd&&Pr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});var _R=1440*60*1e3;var FR=5*6e4;var CI=new Intl.Segmenter("zh-CN",{granularity:"word"});var MT=String.raw`const TOOL_NAME = 'echo_tool';
|
|
809
|
-
const RESOURCE_URI = 'memory://guide';
|
|
810
|
-
const PROMPT_NAME = 'draft_prompt';
|
|
811
|
-
let buffer = '';
|
|
812
|
-
|
|
813
|
-
function writeMessage(payload) {
|
|
814
|
-
process.stdout.write(JSON.stringify(payload) + '\n');
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
function handleRequest(message) {
|
|
818
|
-
const id = message.id;
|
|
819
|
-
const method = message.method;
|
|
820
|
-
const params = message.params || {};
|
|
821
|
-
if (method === 'initialize') {
|
|
822
|
-
writeMessage({
|
|
823
|
-
jsonrpc: '2.0',
|
|
824
|
-
id,
|
|
825
|
-
result: {
|
|
826
|
-
protocolVersion: '2025-11-25',
|
|
827
|
-
capabilities: {
|
|
828
|
-
tools: {},
|
|
829
|
-
resources: {},
|
|
830
|
-
prompts: {},
|
|
831
|
-
},
|
|
832
|
-
serverInfo: {
|
|
833
|
-
name: 'kodax-mcp-test-server',
|
|
834
|
-
version: '1.0.0',
|
|
835
|
-
},
|
|
836
|
-
},
|
|
837
|
-
});
|
|
838
|
-
return;
|
|
839
|
-
}
|
|
840
|
-
if (method === 'tools/list') {
|
|
841
|
-
writeMessage({
|
|
842
|
-
jsonrpc: '2.0',
|
|
843
|
-
id,
|
|
844
|
-
result: {
|
|
845
|
-
tools: [{
|
|
846
|
-
name: TOOL_NAME,
|
|
847
|
-
title: 'Echo Tool',
|
|
848
|
-
description: 'Echo text back from the MCP test server.',
|
|
849
|
-
inputSchema: {
|
|
850
|
-
type: 'object',
|
|
851
|
-
properties: {
|
|
852
|
-
text: { type: 'string' },
|
|
853
|
-
mode: { type: 'string' },
|
|
854
|
-
},
|
|
855
|
-
required: ['text'],
|
|
856
|
-
},
|
|
857
|
-
annotations: {
|
|
858
|
-
destructive: false,
|
|
859
|
-
},
|
|
860
|
-
}],
|
|
861
|
-
},
|
|
862
|
-
});
|
|
863
|
-
return;
|
|
864
|
-
}
|
|
865
|
-
if (method === 'resources/list') {
|
|
866
|
-
writeMessage({
|
|
867
|
-
jsonrpc: '2.0',
|
|
868
|
-
id,
|
|
869
|
-
result: {
|
|
870
|
-
resources: [{
|
|
871
|
-
uri: RESOURCE_URI,
|
|
872
|
-
title: 'Guide Resource',
|
|
873
|
-
description: 'Provides guide text.',
|
|
874
|
-
mimeType: 'text/plain',
|
|
875
|
-
}],
|
|
876
|
-
},
|
|
877
|
-
});
|
|
878
|
-
return;
|
|
879
|
-
}
|
|
880
|
-
if (method === 'prompts/list') {
|
|
881
|
-
writeMessage({
|
|
882
|
-
jsonrpc: '2.0',
|
|
883
|
-
id,
|
|
884
|
-
result: {
|
|
885
|
-
prompts: [{
|
|
886
|
-
name: PROMPT_NAME,
|
|
887
|
-
title: 'Draft Prompt',
|
|
888
|
-
description: 'A simple prompt from the MCP test server.',
|
|
889
|
-
}],
|
|
890
|
-
},
|
|
891
|
-
});
|
|
892
|
-
return;
|
|
893
|
-
}
|
|
894
|
-
if (method === 'tools/call') {
|
|
895
|
-
const args = params.arguments || params.args || {};
|
|
896
|
-
writeMessage({
|
|
897
|
-
jsonrpc: '2.0',
|
|
898
|
-
id,
|
|
899
|
-
result: {
|
|
900
|
-
content: [{
|
|
901
|
-
type: 'text',
|
|
902
|
-
text: 'echo:' + String(args.text || ''),
|
|
903
|
-
}],
|
|
904
|
-
structuredContent: {
|
|
905
|
-
echo: args.text || '',
|
|
906
|
-
mode: args.mode || null,
|
|
907
|
-
},
|
|
908
|
-
},
|
|
909
|
-
});
|
|
910
|
-
return;
|
|
911
|
-
}
|
|
912
|
-
if (method === 'resources/read') {
|
|
913
|
-
const uri = params.uri || params.name || RESOURCE_URI;
|
|
914
|
-
writeMessage({
|
|
915
|
-
jsonrpc: '2.0',
|
|
916
|
-
id,
|
|
917
|
-
result: {
|
|
918
|
-
contents: [{
|
|
919
|
-
uri,
|
|
920
|
-
mimeType: 'text/plain',
|
|
921
|
-
text: 'resource:' + String(uri),
|
|
922
|
-
}],
|
|
923
|
-
},
|
|
924
|
-
});
|
|
925
|
-
return;
|
|
926
|
-
}
|
|
927
|
-
if (method === 'prompts/get') {
|
|
928
|
-
const args = params.arguments || params.args || {};
|
|
929
|
-
const topic = args.topic || 'none';
|
|
930
|
-
writeMessage({
|
|
931
|
-
jsonrpc: '2.0',
|
|
932
|
-
id,
|
|
933
|
-
result: {
|
|
934
|
-
description: 'Prompt result for ' + String(params.name || PROMPT_NAME),
|
|
935
|
-
messages: [{
|
|
936
|
-
role: 'user',
|
|
937
|
-
content: {
|
|
938
|
-
type: 'text',
|
|
939
|
-
text: 'prompt:' + String(params.name || PROMPT_NAME) + ':' + String(topic),
|
|
940
|
-
},
|
|
941
|
-
}],
|
|
942
|
-
},
|
|
943
|
-
});
|
|
944
|
-
return;
|
|
945
|
-
}
|
|
946
|
-
|
|
947
|
-
writeMessage({
|
|
948
|
-
jsonrpc: '2.0',
|
|
949
|
-
id,
|
|
950
|
-
error: {
|
|
951
|
-
code: -32601,
|
|
952
|
-
message: 'Method not found: ' + String(method),
|
|
953
|
-
},
|
|
954
|
-
});
|
|
955
|
-
}
|
|
956
|
-
|
|
957
|
-
function handleFrame(raw) {
|
|
958
|
-
let message;
|
|
959
|
-
try {
|
|
960
|
-
message = JSON.parse(raw);
|
|
961
|
-
} catch (error) {
|
|
962
|
-
process.stderr.write('bad json: ' + String(error) + '\n');
|
|
963
|
-
return;
|
|
964
|
-
}
|
|
965
|
-
if (message.id !== undefined) {
|
|
966
|
-
handleRequest(message);
|
|
967
|
-
}
|
|
968
|
-
}
|
|
969
|
-
|
|
970
|
-
process.stdin.setEncoding('utf8');
|
|
971
|
-
process.stdin.on('data', (chunk) => {
|
|
972
|
-
buffer += chunk;
|
|
973
|
-
while (true) {
|
|
974
|
-
const lineEnd = buffer.indexOf('\n');
|
|
975
|
-
if (lineEnd < 0) {
|
|
976
|
-
return;
|
|
977
|
-
}
|
|
978
|
-
const line = buffer.slice(0, lineEnd).replace(/\r$/, '').trim();
|
|
979
|
-
buffer = buffer.slice(lineEnd + 1);
|
|
980
|
-
if (line) {
|
|
981
|
-
handleFrame(line);
|
|
982
|
-
}
|
|
983
|
-
}
|
|
984
|
-
});
|
|
985
|
-
|
|
986
|
-
process.on('SIGTERM', () => process.exit(0));
|
|
987
|
-
process.on('SIGINT', () => process.exit(0));
|
|
988
|
-
`;var $r=Object.freeze(["message","label","compaction","branch_summary","archive_marker","rewind_marker","artifact_ledger","memory_outcome_digest","memory_review_receipt"]),rl=0,ol=0,Dr=o(e=>{let t=e==="label"?++rl:++ol,n=Math.random().toString(36).slice(2,8);return`${e}-${Date.now()}-${t}-${n}`},"nextId");async function il(e,t,n){let r=Dr("label");return await e.append({id:r,ts:Date.now(),type:"label",payload:{targetId:t,label:n}}),r}o(il,"appendLabel");async function sl(e,t,n){let r=Dr("artifact");return await e.append({id:r,ts:Date.now(),type:"artifact_ledger",payload:{ref:t,summary:n}}),r}o(sl,"appendArtifact");function al(e){let t=[],n=new Map,r=[],i=null;for(let s of e){if(s.type==="label"){let c=s.payload;c?.targetId&&r.push({targetId:c.targetId,label:c.label});continue}let a={entry:s,children:[]};if(s.type==="message"){t.push(a),n.set(s.id,a),i=a;continue}i?i.children.push(a):t.push(a)}for(let{targetId:s,label:a}of r){let c=n.get(s);c&&a!==void 0&&(c.label=a)}return t}o(al,"buildLineageTree");var cl=Object.freeze({name:"lineage",entryTypes:$r,operators:Object.freeze({label:o((async(e,...t)=>{let[n,r]=t;return il(e,n,r)}),"label"),attachArtifact:o((async(e,...t)=>{let[n,r]=t;return sl(e,n,r)}),"attachArtifact")}),reducers:Object.freeze({buildLineageTree:o(e=>al(e),"buildLineageTree")})});var yl=new Set(["skill","ask_user_question","exit_plan_mode","spawn_agent","send_message","followup_task","wait_agent","interrupt_agent","list_agents","agent_output","tool_search","get_goal","create_goal","update_goal","todo_create","todo_update","todo_list","todo_get","worktree_create","worktree_remove","undo","mcp_search","mcp_describe","mcp_call","mcp_read_resource","mcp_get_prompt","repo_overview","changed_scope","changed_diff","changed_diff_bundle","module_context","symbol_context","process_context","impact_estimate","relationship_scan","cyclic_dependencies","semantic_lookup"]),Rt=yl,Fe=`[\u5BF9\u8BDD\u5386\u53F2\u6458\u8981]
|
|
989
|
-
|
|
990
|
-
`;var JA=Fe.trimEnd();var YA=16*1024;var Sl={enabled:!1,maxAge:20,protectedTools:Array.from(Rt)};import{createRequire as Al}from"node:module";var Cl=Al(import.meta.url),Wr,i_=new Proxy({},{get(e,t){return Wr??=Cl("typescript"),Reflect.get(Wr,t)}});var k0=new Intl.Segmenter("en",{granularity:"grapheme"});var qO=process.env.VITEST_WORKER_ID===void 0?void 0:`${process.env.VITEST_WORKER_ID}-${process.pid}`.replace(/[^a-z0-9_-]/gi,"_");import{realpathSync as su,statSync as au}from"node:fs";import cu from"node:path";function Tt(e){let t=e.code;return t==="ENOENT"||t==="ENOTDIR"}o(Tt,"isMissingGitTrustPath");function Ur(e,t,n){try{let r=t(e).replaceAll("\\","/").replace(/\/+$/,"");return r===""?void 0:/^[A-Za-z]:$/.test(r)?`${r}/`:r}catch(r){if(n(r))return;throw r}}o(Ur,"normalizeGitSafeDirectoryRootImplementation");function du(e){return Ur(e,su,Tt)}o(du,"normalizeGitSafeDirectoryRoot");function qr(e,t,n,r){try{let s=t(n.join(e,".git"));if(s.isDirectory()||s.isFile())return!0}catch(s){if(!r(s))throw s}if(!(n.basename(e).toLowerCase()===".git"||/[/\\]\.git[/\\]modules[/\\]/i.test(e)))return!1;try{return t(n.join(e,"HEAD")).isFile()}catch(s){if(r(s))return!1;throw s}}o(qr,"isRepoBearingGitReadRootImplementation");function lu(e){return qr(e,au,cu,Tt)}o(lu,"isRepoBearingGitReadRoot");function zr(e,t,n,r,i){let s=[];typeof e=="string"&&e!==""&&s.push(e);for(let d of n??[])i(d)&&s.push(d);s.push(...t??[]);let a=[],c=new Set;for(let d of s){if(a.length>=8)break;let l=r(d);if(l===void 0)continue;let u=l.toLowerCase();c.has(u)||(c.add(u),a.push(l))}return a}o(zr,"windowsGitTrustRootsImplementation");function Hr(e,t,n){return zr(e,t,n,du,lu)}o(Hr,"windowsGitTrustRoots");function Gr(e){if(e==="git_config_count")return"count";if(/^git_config_key_\d+$/.test(e))return"key";if(/^git_config_value_\d+$/.test(e))return"value"}o(Gr,"gitConfigEnvKind");function Vr(e,t,n,r,i){let s=new Map,a=[],c,d=!1;for(let l=0;l<t;l+=1){if(e[l]!=="--env"||l+1>=t)continue;let u=e[l+1],p=u.indexOf("="),h=(p<0?u:u.slice(0,p)).toLowerCase(),f=n(h);if(f===void 0)continue;d=!0,a.push(l);let m=p<0?"":u.slice(p+1);if(f==="count"){let g=Number.parseInt(m,10);(c!==void 0||!Number.isSafeInteger(g)||g<0||String(g)!==m)&&r(),c=g;continue}let y=Number.parseInt(h.slice(`git_config_${f}_`.length),10),w=s.get(y)??{};(!Number.isSafeInteger(y)||y<0||w[f]!==void 0)&&r(),w[f]=m,s.set(y,w)}return i(s,a,c,d,r)}o(Vr,"parseGitConfigEnvironmentImplementation");function Jr(){throw new Error("ASRT GIT_CONFIG environment has an unexpected shape.")}o(Jr,"throwUnexpectedGitConfigShape");function Yr(e,t,n,r,i){!r||n!==void 0&&e.size===n&&[...e].every(([c,d])=>c<n&&d.key!==void 0&&d.value!==void 0)||i();let a=[...e].map(([c,d])=>({slot:c,key:d.key,value:d.value}));return{argumentIndices:t,pairs:a,sawAny:r}}o(Yr,"finishParsedGitConfigEnvironment");function uu(e,t){return Vr(e,t,Gr,Jr,Yr)}o(uu,"parseGitConfigEnvironment");function Qr(e,t){let n=[];for(let i of e)n.push({key:"safe.directory",value:i},{key:"safe.directory",value:`${i}/*`});n.push(...t);let r=n.flatMap((i,s)=>[`GIT_CONFIG_KEY_${s}=${i.key}`,`GIT_CONFIG_VALUE_${s}=${i.value}`]);return r.push(`GIT_CONFIG_COUNT=${n.length}`),r}o(Qr,"gitSafeDirectoryAssignments");function Zr(e,t,n,r){let i=new Set(n.argumentIndices),s=[],a=!1;for(let c=0;c<e.length;c+=1)if(i.has(c)){if(!a){for(let d of r)s.push("--env",d);a=!0}c+=1}else s.push(e[c]);return n.sawAny||s.splice(t,0,...r.flatMap(c=>["--env",c])),s}o(Zr,"replaceGitConfigEnvironment");function eo(e,t,n,r,i){let s=e.lastIndexOf("--");if(s<0)throw new Error("ASRT Windows wrapper omitted its child separator.");let a=n(e,s),c=a.pairs.filter(l=>l.key.toLowerCase()!=="safe.directory").sort((l,u)=>l.slot-u.slot),d=r(t,c);return i(e,s,a,d)}o(eo,"rewriteWindowsGitSafeDirectoryArgvImplementation");function to(e,t){return eo(e,t,uu,Qr,Zr)}o(to,"rewriteWindowsGitSafeDirectoryArgv");function no(){return String.raw`
|
|
991
|
-
const isMissingGitTrustPath = ${Tt.toString()};
|
|
992
|
-
const normalizeGitSafeDirectoryRootImplementation = ${Ur.toString()};
|
|
993
|
-
const normalizeGitSafeDirectoryRoot = (root) => (
|
|
994
|
-
normalizeGitSafeDirectoryRootImplementation(root, realpathSync, isMissingGitTrustPath)
|
|
995
|
-
);
|
|
996
|
-
const isRepoBearingGitReadRootImplementation = ${qr.toString()};
|
|
997
|
-
const isRepoBearingGitReadRoot = (root) => (
|
|
998
|
-
isRepoBearingGitReadRootImplementation(root, statSync, path, isMissingGitTrustPath)
|
|
999
|
-
);
|
|
1000
|
-
const windowsGitTrustRootsImplementation = ${zr.toString()};
|
|
1001
|
-
const windowsGitTrustRoots = (input) => {
|
|
1002
|
-
const filesystem = (input.config && input.config.filesystem) || {};
|
|
1003
|
-
return windowsGitTrustRootsImplementation(
|
|
1004
|
-
input.cwd,
|
|
1005
|
-
filesystem.allowWrite,
|
|
1006
|
-
filesystem.allowRead,
|
|
1007
|
-
normalizeGitSafeDirectoryRoot,
|
|
1008
|
-
isRepoBearingGitReadRoot,
|
|
1009
|
-
);
|
|
1010
|
-
};
|
|
1011
|
-
const gitConfigEnvKind = ${Gr.toString()};
|
|
1012
|
-
const throwUnexpectedGitConfigShape = ${Jr.toString()};
|
|
1013
|
-
const finishParsedGitConfigEnvironment = ${Yr.toString()};
|
|
1014
|
-
const parseGitConfigEnvironmentImplementation = ${Vr.toString()};
|
|
1015
|
-
const parseGitConfigEnvironment = (argv, separator) => (
|
|
1016
|
-
parseGitConfigEnvironmentImplementation(
|
|
1017
|
-
argv,
|
|
1018
|
-
separator,
|
|
1019
|
-
gitConfigEnvKind,
|
|
1020
|
-
throwUnexpectedGitConfigShape,
|
|
1021
|
-
finishParsedGitConfigEnvironment,
|
|
1022
|
-
)
|
|
1023
|
-
);
|
|
1024
|
-
const gitSafeDirectoryAssignments = ${Qr.toString()};
|
|
1025
|
-
const replaceGitConfigEnvironment = ${Zr.toString()};
|
|
1026
|
-
const rewriteWindowsGitSafeDirectoryArgvImplementation = ${eo.toString()};
|
|
1027
|
-
const rewriteWindowsGitSafeDirectoryArgv = (argv, trustRoots) => (
|
|
1028
|
-
rewriteWindowsGitSafeDirectoryArgvImplementation(
|
|
1029
|
-
argv,
|
|
1030
|
-
trustRoots,
|
|
1031
|
-
parseGitConfigEnvironment,
|
|
1032
|
-
gitSafeDirectoryAssignments,
|
|
1033
|
-
replaceGitConfigEnvironment,
|
|
1034
|
-
)
|
|
1035
|
-
);
|
|
1036
|
-
`}o(no,"windowsGitBrokerHelpersSource");var{DEFAULT_WINDOWS_PROXY_PORT_RANGE:$$,SandboxManager:K,getSrtWinPath:D$,getWindowsSandboxUserStatus:L$,grantWindowsAcl:N$,installWindowsSandbox:F$,resolveSrtWin:j$,revokeWindowsAcl:K$}=await import("@anthropic-ai/sandbox-runtime");var vu=gu(import.meta.url),W$=process.env.KODAX_BUNDLED==="true"?void 0:wu(vu.resolve("@anthropic-ai/sandbox-runtime")).href;var B$=[".ssh",".aws",".azure",".gnupg",".kube",".docker",".kodax",".agents",".codex",".claude",".gemini",".direnv",".terraform.d",v.join(".cargo","credentials.toml"),v.join(".config","gcloud"),v.join(".config","gh"),v.join(".config","openai"),v.join(".config","anthropic"),".gitconfig",v.join(".config","git","config"),".terraformrc",v.join(".config","pypoetry","auth.toml"),".condarc",".bashrc",".bash_profile",".zshrc",".zprofile",".profile",v.join(".config","fish","config.fish"),v.join(".config","fish","fish_variables"),".bash_history",".zsh_history",v.join(".m2","settings.xml"),v.join(".m2","settings-security.xml"),v.join(".gradle","gradle.properties"),v.join(".nuget","NuGet","NuGet.Config"),v.join(".pip","pip.conf"),v.join(".config","pip","pip.conf"),v.join(".cache","huggingface","token"),v.join(".huggingface","token"),v.join(".config","rclone","rclone.conf"),v.join(".local","share","keyrings"),v.join("Library","Keychains"),v.join("AppData","Roaming","Microsoft","Protect"),v.join("AppData","Roaming","Microsoft","Credentials"),v.join("AppData","Roaming","Microsoft","Vault"),v.join("AppData","Local","Microsoft","Credentials"),v.join("AppData","Local","Microsoft","Protect"),v.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"];var X$=String.raw`
|
|
1037
|
-
$ErrorActionPreference = 'Stop'
|
|
1038
|
-
$payload = [Console]::In.ReadToEnd() | ConvertFrom-Json
|
|
1039
|
-
$mutex = [System.Threading.Mutex]::new($false, 'Local\KodaXAsrtAclGuard-v1')
|
|
1040
|
-
$held = $false
|
|
1041
|
-
$missing = [System.Collections.Generic.List[string]]::new()
|
|
1042
|
-
function Test-KodaXAsrtAclRule($acl, $sidValue, $rights, $inheritance) {
|
|
1043
|
-
foreach ($rule in $acl.Access) {
|
|
1044
|
-
try {
|
|
1045
|
-
$ruleSid = $rule.IdentityReference.Translate(
|
|
1046
|
-
[System.Security.Principal.SecurityIdentifier]
|
|
1047
|
-
).Value
|
|
1048
|
-
} catch {
|
|
1049
|
-
continue
|
|
1050
|
-
}
|
|
1051
|
-
if (
|
|
1052
|
-
$ruleSid -eq $sidValue -and
|
|
1053
|
-
$rule.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Deny -and
|
|
1054
|
-
-not $rule.IsInherited -and
|
|
1055
|
-
$rule.InheritanceFlags -eq $inheritance -and
|
|
1056
|
-
$rule.PropagationFlags -eq [System.Security.AccessControl.PropagationFlags]::None -and
|
|
1057
|
-
(([int]$rule.FileSystemRights -band [int]$rights) -eq [int]$rights)
|
|
1058
|
-
) {
|
|
1059
|
-
return $true
|
|
1060
|
-
}
|
|
1061
|
-
}
|
|
1062
|
-
return $false
|
|
1063
|
-
}
|
|
1064
|
-
function Test-KodaXParentDeleteChildSafe($acl, $tokenSidValues) {
|
|
1065
|
-
foreach ($rule in $acl.Access) {
|
|
1066
|
-
try {
|
|
1067
|
-
$ruleSid = $rule.IdentityReference.Translate(
|
|
1068
|
-
[System.Security.Principal.SecurityIdentifier]
|
|
1069
|
-
).Value
|
|
1070
|
-
} catch {
|
|
1071
|
-
continue
|
|
1072
|
-
}
|
|
1073
|
-
if (
|
|
1074
|
-
$tokenSidValues -contains $ruleSid -and
|
|
1075
|
-
$rule.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Deny -and
|
|
1076
|
-
($rule.PropagationFlags -band [System.Security.AccessControl.PropagationFlags]::InheritOnly) -eq 0 -and
|
|
1077
|
-
(([int]$rule.FileSystemRights -band [int][System.Security.AccessControl.FileSystemRights]::DeleteSubdirectoriesAndFiles) -ne 0)
|
|
1078
|
-
) {
|
|
1079
|
-
return $true
|
|
1080
|
-
}
|
|
1081
|
-
}
|
|
1082
|
-
foreach ($rule in $acl.Access) {
|
|
1083
|
-
try {
|
|
1084
|
-
$ruleSid = $rule.IdentityReference.Translate(
|
|
1085
|
-
[System.Security.Principal.SecurityIdentifier]
|
|
1086
|
-
).Value
|
|
1087
|
-
} catch {
|
|
1088
|
-
continue
|
|
1089
|
-
}
|
|
1090
|
-
if (
|
|
1091
|
-
$tokenSidValues -contains $ruleSid -and
|
|
1092
|
-
$rule.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Allow -and
|
|
1093
|
-
($rule.PropagationFlags -band [System.Security.AccessControl.PropagationFlags]::InheritOnly) -eq 0 -and
|
|
1094
|
-
(([int]$rule.FileSystemRights -band [int][System.Security.AccessControl.FileSystemRights]::DeleteSubdirectoriesAndFiles) -ne 0)
|
|
1095
|
-
) {
|
|
1096
|
-
return $false
|
|
1097
|
-
}
|
|
1098
|
-
}
|
|
1099
|
-
return $true
|
|
1100
|
-
}
|
|
1101
|
-
function Test-KodaXAsrtAclRuleReadsData($acl, $sidValue) {
|
|
1102
|
-
foreach ($rule in $acl.Access) {
|
|
1103
|
-
try {
|
|
1104
|
-
$ruleSid = $rule.IdentityReference.Translate(
|
|
1105
|
-
[System.Security.Principal.SecurityIdentifier]
|
|
1106
|
-
).Value
|
|
1107
|
-
} catch {
|
|
1108
|
-
continue
|
|
1109
|
-
}
|
|
1110
|
-
if (
|
|
1111
|
-
$ruleSid -eq $sidValue -and
|
|
1112
|
-
$rule.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Deny -and
|
|
1113
|
-
-not $rule.IsInherited -and
|
|
1114
|
-
$rule.PropagationFlags -eq [System.Security.AccessControl.PropagationFlags]::None -and
|
|
1115
|
-
(([int]$rule.FileSystemRights -band ([int][System.Security.AccessControl.FileSystemRights]::ReadAndExecute -bor [int][System.Security.AccessControl.FileSystemRights]::Synchronize)) -ne 0)
|
|
1116
|
-
) {
|
|
1117
|
-
return $true
|
|
1118
|
-
}
|
|
1119
|
-
}
|
|
1120
|
-
return $false
|
|
1121
|
-
}
|
|
1122
|
-
function Add-KodaXAsrtAclRule($target, $sid, $rights, $inheritance, $ruleText) {
|
|
1123
|
-
$acl = Get-Acl -LiteralPath $target
|
|
1124
|
-
if (Test-KodaXAsrtAclRule $acl $sid.Value $rights $inheritance) {
|
|
1125
|
-
return
|
|
1126
|
-
}
|
|
1127
|
-
$principal = '*' + $sid.Value
|
|
1128
|
-
& "$env:SystemRoot\System32\icacls.exe" $target '/deny' "$($principal):$ruleText" | Out-Null
|
|
1129
|
-
if ($LASTEXITCODE -ne 0) {
|
|
1130
|
-
throw "icacls failed to install a KodaX sandbox guard on $target."
|
|
1131
|
-
}
|
|
1132
|
-
}
|
|
1133
|
-
function Add-KodaXAsrtWriteAclRule($target, $sid, $rights, $inheritance) {
|
|
1134
|
-
$acl = Get-Acl -LiteralPath $target
|
|
1135
|
-
if (Test-KodaXAsrtAclRule $acl $sid.Value $rights $inheritance) {
|
|
1136
|
-
return
|
|
1137
|
-
}
|
|
1138
|
-
$rule = [System.Security.AccessControl.FileSystemAccessRule]::new(
|
|
1139
|
-
$sid,
|
|
1140
|
-
$rights,
|
|
1141
|
-
$inheritance,
|
|
1142
|
-
[System.Security.AccessControl.PropagationFlags]::None,
|
|
1143
|
-
[System.Security.AccessControl.AccessControlType]::Deny
|
|
1144
|
-
)
|
|
1145
|
-
[void]$acl.AddAccessRule($rule)
|
|
1146
|
-
Set-Acl -LiteralPath $target -AclObject $acl
|
|
1147
|
-
}
|
|
1148
|
-
try {
|
|
1149
|
-
try {
|
|
1150
|
-
$held = $mutex.WaitOne(10000)
|
|
1151
|
-
} catch [System.Threading.AbandonedMutexException] {
|
|
1152
|
-
$held = $true
|
|
1153
|
-
}
|
|
1154
|
-
if (-not $held) {
|
|
1155
|
-
throw 'Timed out waiting for the KodaX ASRT ACL guard mutex.'
|
|
1156
|
-
}
|
|
1157
|
-
$sid = [System.Security.Principal.SecurityIdentifier]::new([string]$payload.sid)
|
|
1158
|
-
$tokenSidValues = @($payload.tokenSids | ForEach-Object { [string]$_ })
|
|
1159
|
-
foreach ($entry in $payload.paths) {
|
|
1160
|
-
$target = [System.IO.Path]::GetFullPath([string]$entry.path)
|
|
1161
|
-
if (-not (Test-Path -LiteralPath $target)) {
|
|
1162
|
-
throw "ACL guard target disappeared before it could be protected: $target"
|
|
1163
|
-
}
|
|
1164
|
-
$inheritance = if ([bool]$entry.directory) {
|
|
1165
|
-
[System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor
|
|
1166
|
-
[System.Security.AccessControl.InheritanceFlags]::ObjectInherit
|
|
1167
|
-
} else {
|
|
1168
|
-
[System.Security.AccessControl.InheritanceFlags]::None
|
|
1169
|
-
}
|
|
1170
|
-
$writeRights = [System.Security.AccessControl.FileSystemRights]::Write -bor
|
|
1171
|
-
[System.Security.AccessControl.FileSystemRights]::Delete -bor
|
|
1172
|
-
[System.Security.AccessControl.FileSystemRights]::ChangePermissions -bor
|
|
1173
|
-
[System.Security.AccessControl.FileSystemRights]::TakeOwnership
|
|
1174
|
-
if ([bool]$entry.directory) {
|
|
1175
|
-
$writeRights = $writeRights -bor [System.Security.AccessControl.FileSystemRights]::DeleteSubdirectoriesAndFiles
|
|
1176
|
-
}
|
|
1177
|
-
$targetRights = if ([string]$entry.mode -eq 'write') {
|
|
1178
|
-
$writeRights
|
|
1179
|
-
} else {
|
|
1180
|
-
[System.Security.AccessControl.FileSystemRights]::FullControl
|
|
1181
|
-
}
|
|
1182
|
-
$parent = [System.IO.Path]::GetDirectoryName($target)
|
|
1183
|
-
$targetAcl = Get-Acl -LiteralPath $target
|
|
1184
|
-
$targetReady = Test-KodaXAsrtAclRule $targetAcl $sid.Value $targetRights $inheritance
|
|
1185
|
-
$targetTooBroad = [string]$entry.mode -eq 'write' -and (Test-KodaXAsrtAclRuleReadsData $targetAcl $sid.Value)
|
|
1186
|
-
if ($targetTooBroad) {
|
|
1187
|
-
$targetReady = $false
|
|
1188
|
-
}
|
|
1189
|
-
$parentReady = -not $parent -or $parent -eq $target -or -not (Test-Path -LiteralPath $parent)
|
|
1190
|
-
if (-not $parentReady) {
|
|
1191
|
-
$parentAcl = Get-Acl -LiteralPath $parent
|
|
1192
|
-
$parentReady = (Test-KodaXAsrtAclRule $parentAcl $sid.Value ([System.Security.AccessControl.FileSystemRights]::DeleteSubdirectoriesAndFiles) ([System.Security.AccessControl.InheritanceFlags]::None)) -or (Test-KodaXParentDeleteChildSafe $parentAcl $tokenSidValues)
|
|
1193
|
-
}
|
|
1194
|
-
if (-not [bool]$payload.install) {
|
|
1195
|
-
if (-not $targetReady -or -not $parentReady) {
|
|
1196
|
-
[void]$missing.Add($target)
|
|
1197
|
-
}
|
|
1198
|
-
continue
|
|
1199
|
-
}
|
|
1200
|
-
if ($targetTooBroad) {
|
|
1201
|
-
$principal = '*' + $sid.Value
|
|
1202
|
-
& "$env:SystemRoot\System32\icacls.exe" $target '/remove:d' $principal | Out-Null
|
|
1203
|
-
if ($LASTEXITCODE -ne 0) {
|
|
1204
|
-
throw "icacls failed to remove an obsolete KodaX sandbox guard from $target."
|
|
1205
|
-
}
|
|
1206
|
-
}
|
|
1207
|
-
if (-not $targetReady) {
|
|
1208
|
-
if ([string]$entry.mode -eq 'write') {
|
|
1209
|
-
Add-KodaXAsrtWriteAclRule $target $sid $targetRights $inheritance
|
|
1210
|
-
} else {
|
|
1211
|
-
$targetRule = if ([bool]$entry.directory) { '(OI)(CI)(F)' } else { '(F)' }
|
|
1212
|
-
Add-KodaXAsrtAclRule $target $sid $targetRights $inheritance $targetRule
|
|
1213
|
-
}
|
|
1214
|
-
}
|
|
1215
|
-
if (-not $parentReady) {
|
|
1216
|
-
Add-KodaXAsrtAclRule $parent $sid ([System.Security.AccessControl.FileSystemRights]::DeleteSubdirectoriesAndFiles) ([System.Security.AccessControl.InheritanceFlags]::None) '(DC)'
|
|
1217
|
-
}
|
|
1218
|
-
}
|
|
1219
|
-
[Console]::Out.Write((@{ missing = @($missing) } | ConvertTo-Json -Compress))
|
|
1220
|
-
} finally {
|
|
1221
|
-
if ($held) {
|
|
1222
|
-
[void]$mutex.ReleaseMutex()
|
|
1223
|
-
}
|
|
1224
|
-
$mutex.Dispose()
|
|
1225
|
-
}
|
|
1226
|
-
`;var ro=JSON.stringify(Ee),At=JSON.stringify(Se),bu=String.raw`
|
|
1227
|
-
const { spawn } = require('node:child_process');
|
|
1228
|
-
const { writeSync } = require('node:fs');
|
|
1229
|
-
const input = JSON.parse(Buffer.from(process.argv[2], 'base64').toString('utf8'));
|
|
1230
|
-
const childEnv = { ...process.env };
|
|
1231
|
-
for (const name of Object.keys(childEnv)) {
|
|
1232
|
-
if (name.toLowerCase() === 'electron_run_as_node') delete childEnv[name];
|
|
1233
|
-
}
|
|
1234
|
-
if (input.electronRunAsNode === true) childEnv.ELECTRON_RUN_AS_NODE = '1';
|
|
1235
|
-
const child = spawn(input.command, input.args, {
|
|
1236
|
-
cwd: input.cwd,
|
|
1237
|
-
env: childEnv,
|
|
1238
|
-
shell: false,
|
|
1239
|
-
stdio: ['inherit', 'inherit', 'pipe'],
|
|
1240
|
-
windowsHide: true,
|
|
1241
|
-
windowsVerbatimArguments: input.windowsVerbatimArguments === true,
|
|
1242
|
-
});
|
|
1243
|
-
const stop = (signal) => child.kill(signal);
|
|
1244
|
-
process.once('SIGINT', () => stop('SIGINT'));
|
|
1245
|
-
process.once('SIGTERM', () => stop('SIGTERM'));
|
|
1246
|
-
child.once('spawn', () => {
|
|
1247
|
-
writeSync(2, input.targetStartedMarker);
|
|
1248
|
-
child.stderr.pipe(process.stderr);
|
|
1249
|
-
});
|
|
1250
|
-
child.once('error', (error) => {
|
|
1251
|
-
process.stderr.write((error instanceof Error ? error.message : String(error)) + '\n');
|
|
1252
|
-
process.exitCode = 1;
|
|
1253
|
-
});
|
|
1254
|
-
child.once('exit', (code, signal) => {
|
|
1255
|
-
process.exitCode = signal ? 1 : code ?? 1;
|
|
1256
|
-
});
|
|
1257
|
-
`,io="eval(Buffer.from(process.argv[1],'base64').toString('utf8'))",ku=JSON.stringify(io),so=Buffer.from(bu,"utf8").toString("base64"),Su=JSON.stringify(so),Eu=no(),U$=String.raw`
|
|
1258
|
-
const { spawn } = require('node:child_process');
|
|
1259
|
-
const { createWriteStream } = require('node:fs');
|
|
1260
|
-
const { readFile, rm } = require('node:fs/promises');
|
|
1261
|
-
const readline = require('node:readline');
|
|
1262
|
-
const input = readline.createInterface({ input: process.stdin, terminal: false });
|
|
1263
|
-
input.once('line', async (gate) => {
|
|
1264
|
-
input.close();
|
|
1265
|
-
if (gate !== 'go') { process.exitCode = 125; return; }
|
|
1266
|
-
const launchFile = process.argv[1];
|
|
1267
|
-
const launch = JSON.parse(await readFile(launchFile, 'utf8'));
|
|
1268
|
-
await rm(launchFile, { force: true });
|
|
1269
|
-
const child = spawn(launch.command, launch.args, {
|
|
1270
|
-
cwd: launch.cwd,
|
|
1271
|
-
env: launch.env,
|
|
1272
|
-
shell: false,
|
|
1273
|
-
stdio: launch.controlPipe === true
|
|
1274
|
-
? ['pipe', 'pipe', 'pipe', 'pipe']
|
|
1275
|
-
: ['pipe', 'pipe', 'pipe'],
|
|
1276
|
-
windowsHide: true,
|
|
1277
|
-
});
|
|
1278
|
-
process.stdin.pipe(child.stdin);
|
|
1279
|
-
child.stdout.pipe(process.stdout);
|
|
1280
|
-
child.stderr.pipe(process.stderr);
|
|
1281
|
-
if (launch.controlPipe === true && child.stdio[3]) {
|
|
1282
|
-
child.stdio[3].pipe(createWriteStream(null, { fd: 3, autoClose: false }));
|
|
1283
|
-
}
|
|
1284
|
-
child.once('error', (error) => {
|
|
1285
|
-
process.stderr.write(String(error?.message ?? error));
|
|
1286
|
-
process.exitCode = 1;
|
|
1287
|
-
});
|
|
1288
|
-
child.once('close', (code) => { process.exitCode = Number.isInteger(code) ? code : 1; });
|
|
1289
|
-
});
|
|
1290
|
-
`,q$=String.raw`
|
|
1291
|
-
import { spawn } from 'node:child_process';
|
|
1292
|
-
import { randomUUID } from 'node:crypto';
|
|
1293
|
-
import { readFile, rm, writeFile } from 'node:fs/promises';
|
|
1294
|
-
import { realpathSync, statSync } from 'node:fs';
|
|
1295
|
-
import path from 'node:path';
|
|
1296
|
-
let SandboxManager;
|
|
1297
|
-
const request = JSON.parse(await readFile(process.argv[2], 'utf8'));
|
|
1298
|
-
await rm(process.argv[2], { force: true });
|
|
1299
|
-
const targetStartedMarker = request.targetStartedMarker
|
|
1300
|
-
?? '\u0000KODAX_ASRT_TARGET_STARTED:' + randomUUID() + '\u0000\n';
|
|
1301
|
-
const endpoints = new Set(request.endpoints.map((item) => item.host.toLowerCase() + ':' + item.port));
|
|
1302
|
-
const callback = request.allowAllNetwork === true
|
|
1303
|
-
? async () => true
|
|
1304
|
-
: request.endpoints.length === 0
|
|
1305
|
-
? undefined
|
|
1306
|
-
: async ({ host, port }) => endpoints.has(host.toLowerCase() + ':' + port);
|
|
1307
|
-
${Eu}
|
|
1308
|
-
const withWindowsChildEnvironment = (argv, environment, gitTrustRoots) => {
|
|
1309
|
-
const separator = argv.lastIndexOf('--');
|
|
1310
|
-
if (separator < 0) throw new Error('ASRT Windows wrapper omitted its child separator.');
|
|
1311
|
-
const requested = [];
|
|
1312
|
-
const requestedNames = new Set();
|
|
1313
|
-
for (const [name, value] of Object.entries(environment ?? {})) {
|
|
1314
|
-
if (value === undefined) continue;
|
|
1315
|
-
if (!name || name.includes('=') || name.includes('\0') || value.includes('\0')) {
|
|
1316
|
-
throw new Error('Invalid environment entry for ASRT Windows child.');
|
|
1317
|
-
}
|
|
1318
|
-
const normalized = name.toLowerCase();
|
|
1319
|
-
if (requestedNames.has(normalized)) {
|
|
1320
|
-
throw new Error('Ambiguous Windows child environment variable: ' + name + '.');
|
|
1321
|
-
}
|
|
1322
|
-
requestedNames.add(normalized);
|
|
1323
|
-
requested.push([name, value]);
|
|
1324
|
-
}
|
|
1325
|
-
const requestedOverrides = new Set(requested.flatMap(([name]) => (
|
|
1326
|
-
['path', 'pathext'].includes(name.toLowerCase()) ? [name.toLowerCase()] : []
|
|
1327
|
-
)));
|
|
1328
|
-
const controlled = new Set();
|
|
1329
|
-
const prefix = [];
|
|
1330
|
-
for (let index = 0; index < separator; index += 1) {
|
|
1331
|
-
if (argv[index] !== '--env' || index + 1 >= separator) {
|
|
1332
|
-
prefix.push(argv[index]);
|
|
1333
|
-
continue;
|
|
1334
|
-
}
|
|
1335
|
-
const assignment = argv[index + 1];
|
|
1336
|
-
const name = assignment.split('=', 1)[0]?.toLowerCase();
|
|
1337
|
-
if (name) controlled.add(name);
|
|
1338
|
-
if (!name || !requestedOverrides.has(name)) prefix.push(argv[index], assignment);
|
|
1339
|
-
index += 1;
|
|
1340
|
-
}
|
|
1341
|
-
const injected = [];
|
|
1342
|
-
for (const [name, value] of requested) {
|
|
1343
|
-
const normalized = name.toLowerCase();
|
|
1344
|
-
if (controlled.has(normalized) && normalized !== 'path' && normalized !== 'pathext') continue;
|
|
1345
|
-
injected.push('--env', name + '=' + value);
|
|
1346
|
-
}
|
|
1347
|
-
const result = [...prefix, ...injected, ...argv.slice(separator)];
|
|
1348
|
-
const withGitTrust = rewriteWindowsGitSafeDirectoryArgv(result, gitTrustRoots);
|
|
1349
|
-
const estimate = withGitTrust.reduce((size, value) => size + value.length + 3, 0);
|
|
1350
|
-
if (estimate > 30000) throw new Error('ASRT Windows child environment exceeds the CreateProcess command-line limit.');
|
|
1351
|
-
return withGitTrust;
|
|
1352
|
-
};
|
|
1353
|
-
const writeObservation = async (observation) => {
|
|
1354
|
-
if (typeof request.observationFile !== 'string') return;
|
|
1355
|
-
await writeFile(request.observationFile, JSON.stringify(observation), { mode: 0o600 });
|
|
1356
|
-
};
|
|
1357
|
-
const waitForTarget = (target, observation) => {
|
|
1358
|
-
const marker = Buffer.from(targetStartedMarker, 'utf8');
|
|
1359
|
-
let pending = Buffer.alloc(0);
|
|
1360
|
-
let diagnostic = Buffer.alloc(0);
|
|
1361
|
-
let processError;
|
|
1362
|
-
let wrapperSpawned = false;
|
|
1363
|
-
let targetStarted = false;
|
|
1364
|
-
let observationWrite = Promise.resolve();
|
|
1365
|
-
return new Promise((resolve, reject) => {
|
|
1366
|
-
let settled = false;
|
|
1367
|
-
target.once('spawn', () => {
|
|
1368
|
-
wrapperSpawned = true;
|
|
1369
|
-
});
|
|
1370
|
-
const finish = (result) => {
|
|
1371
|
-
if (settled) return;
|
|
1372
|
-
settled = true;
|
|
1373
|
-
void observationWrite.then(() => resolve(result), reject);
|
|
1374
|
-
};
|
|
1375
|
-
target.stderr.on('data', (chunk) => {
|
|
1376
|
-
if (targetStarted) {
|
|
1377
|
-
process.stderr.write(chunk);
|
|
1378
|
-
return;
|
|
1379
|
-
}
|
|
1380
|
-
pending = Buffer.concat([pending, Buffer.from(chunk)]);
|
|
1381
|
-
const markerOffset = pending.indexOf(marker);
|
|
1382
|
-
if (markerOffset >= 0) {
|
|
1383
|
-
targetStarted = true;
|
|
1384
|
-
const suffix = pending.subarray(markerOffset + marker.length);
|
|
1385
|
-
pending = Buffer.alloc(0);
|
|
1386
|
-
diagnostic = Buffer.alloc(0);
|
|
1387
|
-
observationWrite = writeObservation(observation).catch(() => undefined);
|
|
1388
|
-
if (suffix.length > 0) process.stderr.write(suffix);
|
|
1389
|
-
return;
|
|
1390
|
-
}
|
|
1391
|
-
const retained = Math.max(0, marker.length - 1);
|
|
1392
|
-
if (pending.length > retained) {
|
|
1393
|
-
diagnostic = Buffer.concat([
|
|
1394
|
-
diagnostic,
|
|
1395
|
-
pending.subarray(0, pending.length - retained),
|
|
1396
|
-
]).subarray(-65536);
|
|
1397
|
-
pending = pending.subarray(pending.length - retained);
|
|
1398
|
-
}
|
|
1399
|
-
});
|
|
1400
|
-
target.once('error', (error) => {
|
|
1401
|
-
processError = error instanceof Error ? error.message : String(error);
|
|
1402
|
-
});
|
|
1403
|
-
target.once('close', (exitCode, signal) => {
|
|
1404
|
-
const preTarget = Buffer.concat([diagnostic, pending]).toString('utf8').trim();
|
|
1405
|
-
finish({
|
|
1406
|
-
exitCode: signal ? 1 : exitCode ?? 1,
|
|
1407
|
-
targetStarted,
|
|
1408
|
-
spawnFailedBeforeSpawn: processError !== undefined && !wrapperSpawned,
|
|
1409
|
-
diagnostic: preTarget || processError || undefined,
|
|
1410
|
-
});
|
|
1411
|
-
});
|
|
1412
|
-
});
|
|
1413
|
-
};
|
|
1414
|
-
let child;
|
|
1415
|
-
let targetStarted = false;
|
|
1416
|
-
let normalFallbackAttempted = false;
|
|
1417
|
-
const runDirect = async () => {
|
|
1418
|
-
const internalElectronNode = request.command === process.execPath && process.versions.electron !== undefined;
|
|
1419
|
-
const directArgs = internalElectronNode
|
|
1420
|
-
? ['--import', ${ro}, ...request.args]
|
|
1421
|
-
: request.args;
|
|
1422
|
-
const directEnv = internalElectronNode
|
|
1423
|
-
? { ...request.env, [${At}]: '1' }
|
|
1424
|
-
: request.env;
|
|
1425
|
-
child = spawn(request.command, directArgs, {
|
|
1426
|
-
cwd: request.cwd,
|
|
1427
|
-
env: directEnv,
|
|
1428
|
-
shell: false,
|
|
1429
|
-
stdio: 'inherit',
|
|
1430
|
-
windowsHide: true,
|
|
1431
|
-
windowsVerbatimArguments: request.windowsVerbatimArguments === true,
|
|
1432
|
-
});
|
|
1433
|
-
return await new Promise((resolve, reject) => {
|
|
1434
|
-
child.once('error', reject);
|
|
1435
|
-
child.once('exit', (exitCode, signal) => resolve(signal ? 1 : exitCode ?? 1));
|
|
1436
|
-
});
|
|
1437
|
-
};
|
|
1438
|
-
const runNormalFallback = async () => {
|
|
1439
|
-
if (
|
|
1440
|
-
request.fallbackToNormalExecution !== true
|
|
1441
|
-
|| targetStarted
|
|
1442
|
-
|| normalFallbackAttempted
|
|
1443
|
-
) return false;
|
|
1444
|
-
await writeObservation({
|
|
1445
|
-
version: 1,
|
|
1446
|
-
state: 'fallback',
|
|
1447
|
-
reason: 'backend_failed',
|
|
1448
|
-
execution: 'normal_permission_policy',
|
|
1449
|
-
}).catch(() => undefined);
|
|
1450
|
-
normalFallbackAttempted = true;
|
|
1451
|
-
process.exitCode = await runDirect();
|
|
1452
|
-
return true;
|
|
1453
|
-
};
|
|
1454
|
-
try {
|
|
1455
|
-
if (request.wrappedInvocation) {
|
|
1456
|
-
const wrapped = request.wrappedInvocation;
|
|
1457
|
-
child = spawn(wrapped.executable, wrapped.args, {
|
|
1458
|
-
cwd: request.cwd,
|
|
1459
|
-
env: wrapped.env,
|
|
1460
|
-
shell: wrapped.shell,
|
|
1461
|
-
stdio: ['inherit', 'inherit', 'pipe'],
|
|
1462
|
-
windowsHide: true,
|
|
1463
|
-
});
|
|
1464
|
-
const result = await waitForTarget(child, {
|
|
1465
|
-
version: 1,
|
|
1466
|
-
state: 'applied',
|
|
1467
|
-
backend: request.observationBackend ?? 'unsupported',
|
|
1468
|
-
policyId: 'kodax-workspace-shell-v1',
|
|
1469
|
-
});
|
|
1470
|
-
targetStarted = result.targetStarted;
|
|
1471
|
-
const fellBack = result.spawnFailedBeforeSpawn
|
|
1472
|
-
? await runNormalFallback()
|
|
1473
|
-
: false;
|
|
1474
|
-
if (!targetStarted && !fellBack) {
|
|
1475
|
-
process.stderr.write((result.diagnostic || 'Sandbox target launch could not be attested.') + '\n');
|
|
1476
|
-
}
|
|
1477
|
-
if (!fellBack) process.exitCode = targetStarted ? result.exitCode : 1;
|
|
1478
|
-
} else {
|
|
1479
|
-
({ SandboxManager } = await import(process.argv[1]));
|
|
1480
|
-
const bootstrap = request.bootstrapCommand ?? 'node';
|
|
1481
|
-
const bootstrapIsAbsolute = /^(?:[A-Za-z]:[\\/]|\\\\)/.test(bootstrap);
|
|
1482
|
-
const bootstrapIsElectronNode = bootstrap === process.execPath
|
|
1483
|
-
&& process.versions.electron !== undefined;
|
|
1484
|
-
const config = process.platform === 'win32' && bootstrapIsAbsolute
|
|
1485
|
-
? {
|
|
1486
|
-
...request.config,
|
|
1487
|
-
filesystem: {
|
|
1488
|
-
...request.config.filesystem,
|
|
1489
|
-
allowRead: [...new Set([
|
|
1490
|
-
...request.config.filesystem.allowRead,
|
|
1491
|
-
bootstrap,
|
|
1492
|
-
path.dirname(bootstrap),
|
|
1493
|
-
])],
|
|
1494
|
-
},
|
|
1495
|
-
}
|
|
1496
|
-
: request.config;
|
|
1497
|
-
await SandboxManager.initialize(config, callback);
|
|
1498
|
-
const quote = (value) => process.platform === 'win32'
|
|
1499
|
-
? '"' + value.replaceAll('"', '""') + '"'
|
|
1500
|
-
: "'" + value.replaceAll("'", "'\"'\"'") + "'";
|
|
1501
|
-
const internalElectronNode = request.command === process.execPath && process.versions.electron !== undefined;
|
|
1502
|
-
const childArgs = internalElectronNode
|
|
1503
|
-
? ['--import', ${ro}, ...request.args]
|
|
1504
|
-
: request.args;
|
|
1505
|
-
const command = [
|
|
1506
|
-
quote(bootstrap),
|
|
1507
|
-
'-e',
|
|
1508
|
-
quote(${ku}),
|
|
1509
|
-
${Su},
|
|
1510
|
-
Buffer.from(JSON.stringify({
|
|
1511
|
-
command: request.command,
|
|
1512
|
-
args: childArgs,
|
|
1513
|
-
windowsVerbatimArguments: request.windowsVerbatimArguments === true,
|
|
1514
|
-
cwd: request.cwd,
|
|
1515
|
-
targetStartedMarker,
|
|
1516
|
-
electronRunAsNode: internalElectronNode,
|
|
1517
|
-
}), 'utf8').toString('base64'),
|
|
1518
|
-
].join(' ');
|
|
1519
|
-
if (process.platform === 'win32') {
|
|
1520
|
-
const wrapped = await SandboxManager.wrapWithSandboxArgv(command, 'cmd', undefined, undefined, request.cwd);
|
|
1521
|
-
const requestedEnv = internalElectronNode || bootstrapIsElectronNode
|
|
1522
|
-
? { ...request.env, [${At}]: '1' }
|
|
1523
|
-
: request.env;
|
|
1524
|
-
const childArgv = withWindowsChildEnvironment(wrapped.argv, requestedEnv, windowsGitTrustRoots(request));
|
|
1525
|
-
child = spawn(childArgv[0], childArgv.slice(1), {
|
|
1526
|
-
cwd: request.cwd,
|
|
1527
|
-
env: wrapped.env,
|
|
1528
|
-
shell: false,
|
|
1529
|
-
stdio: ['inherit', 'inherit', 'pipe'],
|
|
1530
|
-
windowsHide: true,
|
|
1531
|
-
});
|
|
1532
|
-
} else {
|
|
1533
|
-
const wrapped = await SandboxManager.wrapWithSandbox(command);
|
|
1534
|
-
const childEnv = internalElectronNode || bootstrapIsElectronNode
|
|
1535
|
-
? { ...request.env, [${At}]: '1' }
|
|
1536
|
-
: request.env;
|
|
1537
|
-
child = spawn(wrapped, {
|
|
1538
|
-
cwd: request.cwd,
|
|
1539
|
-
env: childEnv,
|
|
1540
|
-
shell: true,
|
|
1541
|
-
stdio: ['inherit', 'inherit', 'pipe'],
|
|
1542
|
-
});
|
|
1543
|
-
}
|
|
1544
|
-
const stop = () => child?.kill('SIGTERM');
|
|
1545
|
-
process.once('SIGINT', stop);
|
|
1546
|
-
process.once('SIGTERM', stop);
|
|
1547
|
-
const result = await waitForTarget(child, {
|
|
1548
|
-
version: 1,
|
|
1549
|
-
state: 'applied',
|
|
1550
|
-
backend: request.observationBackend ?? 'unsupported',
|
|
1551
|
-
policyId: 'kodax-workspace-shell-v1',
|
|
1552
|
-
});
|
|
1553
|
-
targetStarted = result.targetStarted;
|
|
1554
|
-
try { SandboxManager.cleanupAfterCommand(); } catch {}
|
|
1555
|
-
await SandboxManager.reset().catch(() => undefined);
|
|
1556
|
-
const fellBack = result.spawnFailedBeforeSpawn
|
|
1557
|
-
? await runNormalFallback()
|
|
1558
|
-
: false;
|
|
1559
|
-
if (!targetStarted && !fellBack) {
|
|
1560
|
-
process.stderr.write((result.diagnostic || 'Sandbox target launch could not be attested.') + '\n');
|
|
1561
|
-
}
|
|
1562
|
-
if (!fellBack) process.exitCode = targetStarted ? result.exitCode : 1;
|
|
1563
|
-
}
|
|
1564
|
-
} catch (error) {
|
|
1565
|
-
await SandboxManager?.reset().catch(() => undefined);
|
|
1566
|
-
if (
|
|
1567
|
-
request.fallbackToNormalExecution === true
|
|
1568
|
-
&& !targetStarted
|
|
1569
|
-
&& !normalFallbackAttempted
|
|
1570
|
-
&& child === undefined
|
|
1571
|
-
) {
|
|
1572
|
-
try {
|
|
1573
|
-
await runNormalFallback();
|
|
1574
|
-
} catch (fallbackError) {
|
|
1575
|
-
process.stderr.write((fallbackError instanceof Error ? fallbackError.message : String(fallbackError)) + '\n');
|
|
1576
|
-
process.exitCode = 1;
|
|
1577
|
-
}
|
|
1578
|
-
} else {
|
|
1579
|
-
process.stderr.write((error instanceof Error ? error.message : String(error)) + '\n');
|
|
1580
|
-
process.exitCode = 1;
|
|
1581
|
-
}
|
|
1582
|
-
}
|
|
1583
|
-
`;function Ct(e){return e instanceof Error?e.message:String(e)}o(Ct,"errorText");function xu(){return process.env.KODAX_A2A_NODE!==void 0?process.env.KODAX_A2A_NODE:process.versions.electron!==void 0?process.execPath:process.env.KODAX_BUNDLED==="true"?"node":process.execPath}o(xu,"sandboxJavaScriptCommand");var z$=5*6e4;var H$=String.raw`
|
|
1584
|
-
const { createHash } = require('node:crypto');
|
|
1585
|
-
const fs = require('node:fs/promises');
|
|
1586
|
-
const path = require('node:path');
|
|
1587
|
-
const chunks = [];
|
|
1588
|
-
process.stdin.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
|
|
1589
|
-
process.stdin.once('end', async () => {
|
|
1590
|
-
const assertSingleLink = (stat) => {
|
|
1591
|
-
if (stat.nlink !== 1n) throw new Error('Text mutation target must not be hard-linked.');
|
|
1592
|
-
};
|
|
1593
|
-
const revision = (content, stat) => 'present:' + createHash('sha256')
|
|
1594
|
-
.update(stat.dev.toString())
|
|
1595
|
-
.update(':')
|
|
1596
|
-
.update(stat.ino.toString())
|
|
1597
|
-
.update(':')
|
|
1598
|
-
.update(stat.nlink.toString())
|
|
1599
|
-
.update('\0')
|
|
1600
|
-
.update(content)
|
|
1601
|
-
.digest('hex');
|
|
1602
|
-
const backupPath = async (target, openedStat) => {
|
|
1603
|
-
const canonical = await fs.realpath(target);
|
|
1604
|
-
let canonicalHandle;
|
|
1605
|
-
try {
|
|
1606
|
-
canonicalHandle = await fs.open(canonical, 'r');
|
|
1607
|
-
const canonicalStat = await canonicalHandle.stat({ bigint: true });
|
|
1608
|
-
assertSingleLink(canonicalStat);
|
|
1609
|
-
if (canonicalStat.dev !== openedStat.dev || canonicalStat.ino !== openedStat.ino) {
|
|
1610
|
-
throw new Error('Text mutation target identity changed while reading.');
|
|
1611
|
-
}
|
|
1612
|
-
return canonical;
|
|
1613
|
-
} finally {
|
|
1614
|
-
await canonicalHandle?.close();
|
|
1615
|
-
}
|
|
1616
|
-
};
|
|
1617
|
-
const snapshot = async (target) => {
|
|
1618
|
-
let handle;
|
|
1619
|
-
try {
|
|
1620
|
-
handle = await fs.open(target, 'r');
|
|
1621
|
-
} catch (error) {
|
|
1622
|
-
if (error && error.code === 'ENOENT') {
|
|
1623
|
-
return { state: 'missing', content: '', revision: 'missing', backupPath: path.resolve(target) };
|
|
1624
|
-
}
|
|
1625
|
-
throw error;
|
|
1626
|
-
}
|
|
1627
|
-
try {
|
|
1628
|
-
const [content, stat] = await Promise.all([
|
|
1629
|
-
handle.readFile('utf8'),
|
|
1630
|
-
handle.stat({ bigint: true }),
|
|
1631
|
-
]);
|
|
1632
|
-
assertSingleLink(stat);
|
|
1633
|
-
return {
|
|
1634
|
-
state: 'present',
|
|
1635
|
-
content,
|
|
1636
|
-
revision: revision(content, stat),
|
|
1637
|
-
backupPath: await backupPath(target, stat),
|
|
1638
|
-
};
|
|
1639
|
-
} finally {
|
|
1640
|
-
await handle?.close();
|
|
1641
|
-
}
|
|
1642
|
-
};
|
|
1643
|
-
const writeFully = async (handle, content) => {
|
|
1644
|
-
const encoded = Buffer.from(content, 'utf8');
|
|
1645
|
-
let written = 0;
|
|
1646
|
-
while (written < encoded.length) {
|
|
1647
|
-
const result = await handle.write(encoded, written, encoded.length - written, written);
|
|
1648
|
-
if (result.bytesWritten === 0) throw new Error('Text mutation write made no progress.');
|
|
1649
|
-
written += result.bytesWritten;
|
|
1650
|
-
}
|
|
1651
|
-
await handle.truncate(encoded.length);
|
|
1652
|
-
};
|
|
1653
|
-
try {
|
|
1654
|
-
const input = JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
1655
|
-
if (!input || typeof input.path !== 'string' || !path.isAbsolute(input.path)) {
|
|
1656
|
-
throw new Error('Text mutation target must be an absolute path.');
|
|
1657
|
-
}
|
|
1658
|
-
if (input.action === 'read') {
|
|
1659
|
-
process.stdout.write(JSON.stringify({ status: 'ok', snapshot: await snapshot(input.path) }));
|
|
1660
|
-
return;
|
|
1661
|
-
}
|
|
1662
|
-
if (
|
|
1663
|
-
input.action !== 'write'
|
|
1664
|
-
|| typeof input.content !== 'string'
|
|
1665
|
-
|| typeof input.expectedRevision !== 'string'
|
|
1666
|
-
|| typeof input.createParentDirectories !== 'boolean'
|
|
1667
|
-
) throw new Error('Invalid text mutation request.');
|
|
1668
|
-
if (input.createParentDirectories) await fs.mkdir(path.dirname(input.path), { recursive: true });
|
|
1669
|
-
let handle;
|
|
1670
|
-
try {
|
|
1671
|
-
if (input.expectedRevision === 'missing') {
|
|
1672
|
-
handle = await fs.open(input.path, 'wx');
|
|
1673
|
-
assertSingleLink(await handle.stat({ bigint: true }));
|
|
1674
|
-
} else {
|
|
1675
|
-
handle = await fs.open(input.path, 'r+');
|
|
1676
|
-
const [content, stat] = await Promise.all([
|
|
1677
|
-
handle.readFile('utf8'),
|
|
1678
|
-
handle.stat({ bigint: true }),
|
|
1679
|
-
]);
|
|
1680
|
-
assertSingleLink(stat);
|
|
1681
|
-
if (revision(content, stat) !== input.expectedRevision) {
|
|
1682
|
-
process.stdout.write(JSON.stringify({ status: 'conflict' }));
|
|
1683
|
-
return;
|
|
1684
|
-
}
|
|
1685
|
-
}
|
|
1686
|
-
await writeFully(handle, input.content);
|
|
1687
|
-
process.stdout.write(JSON.stringify({ status: 'written' }));
|
|
1688
|
-
} catch (error) {
|
|
1689
|
-
if (input.expectedRevision === 'missing' && error && error.code === 'EEXIST') {
|
|
1690
|
-
process.stdout.write(JSON.stringify({ status: 'conflict' }));
|
|
1691
|
-
return;
|
|
1692
|
-
}
|
|
1693
|
-
throw error;
|
|
1694
|
-
} finally {
|
|
1695
|
-
await handle?.close();
|
|
1696
|
-
}
|
|
1697
|
-
} catch (error) {
|
|
1698
|
-
process.stderr.write((error instanceof Error ? error.message : String(error)) + '\n');
|
|
1699
|
-
process.exitCode = 1;
|
|
1700
|
-
}
|
|
1701
|
-
});
|
|
1702
|
-
`,G$=64*1024*1024;var oo=!1;function Ru(){oo||(oo=!0,I({source:"sandbox:git-safe-directory",level:"warn",message:"ASRT git env block had an unexpected shape; execution was rejected."}))}o(Ru,"warnUnexpectedAsrtGitEnvShape");function Iu(e,t,n){let r=e.lastIndexOf("--");if(r<0)throw new Error("ASRT Windows wrapper omitted its child separator.");let i=[],s=new Set;for(let[f,m]of Object.entries(t)){if(m===void 0)continue;if(!f||f.includes("=")||f.includes("\0")||m.includes("\0"))throw new Error("Invalid environment entry for ASRT Windows child.");let y=f.toLowerCase();if(s.has(y))throw new Error(`Ambiguous Windows child environment variable: ${f}.`);s.add(y),i.push([f,m])}let a=new Set,c=new Set(i.flatMap(([f])=>["path","pathext"].includes(f.toLowerCase())?[f.toLowerCase()]:[])),d=[];for(let f=0;f<r;f+=1){if(e[f]!=="--env"||f+1>=r){d.push(e[f]);continue}let m=e[f+1],y=m.split("=",1)[0]?.toLowerCase();y&&a.add(y),(!y||!c.has(y))&&d.push(e[f],m),f+=1}let l=[];for(let[f,m]of i){let y=f.toLowerCase();a.has(y)&&y!=="path"&&y!=="pathext"||l.push("--env",`${f}=${m}`)}let u=[...d,...l,...e.slice(r)],p=u;if(n!==void 0)try{p=to(u,n)}catch(f){throw Ru(),f}if(p.reduce((f,m)=>f+m.length+3,0)>3e4)throw new Error("ASRT Windows child environment exceeds the CreateProcess command-line limit.");return p}o(Iu,"withWindowsSandboxChildEnvironment");async function Tu(e,t){let n=e.bootstrapCommand??xu(),r=n===process.execPath&&process.versions.electron!==void 0,i=e.command===process.execPath&&process.versions.electron!==void 0,s=i?["--import",Ee,...e.args]:e.args,a=i||r?{...e.env,[Se]:"1"}:e.env,c=o(l=>process.platform==="win32"?`"${l.replaceAll('"','""')}"`:`'${l.replaceAll("'",`'"'"'`)}'`,"quote"),d=[c(n),"-e",c(io),so,Buffer.from(JSON.stringify({command:e.command,args:s,windowsVerbatimArguments:e.windowsVerbatimArguments===!0,cwd:e.cwd,targetStartedMarker:t,electronRunAsNode:i}),"utf8").toString("base64")].join(" ");if(process.platform==="win32"){let l={filesystem:{denyRead:e.config.filesystem.denyRead,allowRead:[],allowWrite:[],denyWrite:e.config.filesystem.denyWrite}},u=await K.wrapWithSandboxArgv(d,"cmd",l,void 0,e.cwd),p=Iu(u.argv,a,process.platform==="win32"?Hr(e.cwd,e.config.filesystem.allowWrite,e.config.filesystem.allowRead):void 0);return{executable:p[0],args:p.slice(1),env:u.env,shell:!1}}return{executable:await K.wrapWithSandbox(d),args:[],env:a,shell:!0}}o(Tu,"wrapSandboxTarget");async function Au(){try{K.cleanupAfterCommand()}catch{}await K.reset().catch(()=>{})}o(Au,"resetSandboxManagerBestEffort");async function Cu(){try{K.cleanupAfterCommand()}catch(e){I({source:"sandbox:workspace-session",level:"warn",message:"Workspace sandbox command cleanup reported an error before ACL reset.",detail:e})}await K.reset()}o(Cu,"resetWorkspaceSessionSandboxManager");function pe(e){pu(3,`${JSON.stringify(e)}
|
|
1703
|
-
`)}o(pe,"writeWorkspaceSessionResponse");async function ao(e){try{let t=JSON.parse(await mu(e,"utf8"));await hu(e,{force:!0}),await K.initialize(t.config,async()=>!0),pe({type:"ready",ok:!0});let n=yu.createInterface({input:process.stdin}),r=Promise.resolve();for await(let i of n){let s=JSON.parse(i);r=r.then(async()=>{try{if(s.type==="cleanup"){K.cleanupAfterCommand(),pe({id:s.id,type:"result",ok:!0});return}if(!s.request)throw new Error("Missing workspace wrap request.");let a=s.request.targetStartedMarker??`\0KODAX_ASRT_TARGET_STARTED:${fu()}\0
|
|
1704
|
-
`,c=await Tu(s.request,a);pe({id:s.id,type:"result",ok:!0,invocation:c})}catch(a){pe({id:s.id,type:"result",ok:!1,error:Ct(a)})}})}return await r,await Cu(),0}catch(t){try{pe({type:"ready",ok:!1,error:Ct(t)})}catch(n){process.stderr.write(`ASRT workspace session could not report startup failure: ${Ct(n)}
|
|
1705
|
-
`)}return await Au(),1}}o(ao,"runAsrtWorkspaceSessionProcess");var co=process.argv[2];if(!co)throw new Error("Missing ASRT workspace session initialization file.");process.exitCode=await ao(co);
|