niceeval 0.16.2-canary.94 → 0.16.2-canary.96
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/dist/agents/bub-install-spec.cjs +3 -3
- package/dist/agents/bub-install-spec.cjs.map +1 -1
- package/dist/agents/bub-install-spec.d.cts +3 -3
- package/dist/agents/bub-install-spec.d.mts +3 -3
- package/dist/agents/bub-install-spec.d.ts +3 -3
- package/dist/agents/bub.cjs +1 -1
- package/dist/agents/bub.cjs.map +1 -1
- package/dist/agents/bub.d.cts +1 -1
- package/dist/agents/bub.d.mts +1 -1
- package/dist/agents/bub.d.ts +1 -1
- package/dist/agents/coding-cli-versions.cjs +2 -3
- package/dist/agents/coding-cli-versions.cjs.map +1 -1
- package/dist/agents/coding-cli-versions.d.cts +1 -1
- package/dist/agents/coding-cli-versions.d.mts +1 -1
- package/dist/agents/coding-cli-versions.d.ts +1 -1
- package/dist/agents/openclaw.cjs +7 -3
- package/dist/agents/openclaw.cjs.map +1 -1
- package/docs-site/zh/reference/builtin-agents.mdx +1 -1
- package/docs-site/zh/tutorials/prebuilt-sandbox.mdx +1 -1
- package/package.json +1 -1
|
@@ -18,13 +18,13 @@ exports.DEFAULT_BUB_OTEL_PLUGIN = "git+https://github.com/bubbuild/bub-contrib.g
|
|
|
18
18
|
/** 装哪一版 Bub:`uv tool install` 的 requirement,版本单源在 `coding-cli-versions.ts`。 */
|
|
19
19
|
exports.DEFAULT_BUB_REQUIREMENT = bubRequirement(coding_cli_versions_ts_1.DEFAULT_BUB_VERSION);
|
|
20
20
|
/**
|
|
21
|
-
* Bub 0.
|
|
21
|
+
* Bub 0.5.1 的上游 lockfile 所验证的模型客户端闭包。
|
|
22
22
|
*
|
|
23
|
-
* Bub 自己的 PyPI metadata
|
|
23
|
+
* Bub 自己的 PyPI metadata 没有精确锁定这两个依赖;若只钉 `bub==0.5.1`,每次安装仍会
|
|
24
24
|
* 解析当天最新的客户端,使同一实验在没有配置变更时改变请求协议。
|
|
25
25
|
*/
|
|
26
26
|
exports.DEFAULT_BUB_DEPENDENCY_OVERRIDES = [
|
|
27
|
-
"any-llm-sdk==1.
|
|
27
|
+
"any-llm-sdk==1.22.1",
|
|
28
28
|
"openai==2.31.0",
|
|
29
29
|
];
|
|
30
30
|
exports.BUB_CHECKPOINT_SUBDIRS = [".local"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bub-install-spec.js","sourceRoot":"","sources":["bub-install-spec.ts"],"names":[],"mappings":";;;AA8BA,wCAEC;AACD,oDAEC;AACD,wCAKC;AACD,wCAKC;AA/CD,6CAAyC;AACzC,qEAA+D;AAC/D;;;;;;GAMG;AACU,QAAA,uBAAuB,GAAG,mIAAmI,CAAC;AAC3K,+EAA+E;AAClE,QAAA,uBAAuB,GAAG,cAAc,CAAC,4CAAmB,CAAC,CAAC;AAC3E;;;;;GAKG;AACU,QAAA,gCAAgC,GAAG;IAC5C,qBAAqB;IACrB,gBAAgB;CACV,CAAC;AACE,QAAA,sBAAsB,GAAG,CAAC,QAAQ,CAAU,CAAC;AAC7C,QAAA,kBAAkB,GAAG,wCAAwC,CAAC;AAC3E;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,OAAe;IAC1C,OAAO,QAAQ,OAAO,EAAE,CAAC;AAC7B,CAAC;AACD,SAAgB,oBAAoB,CAAC,QAA2B;IAC5D,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACtF,CAAC;AACD,SAAgB,cAAc,CAAC,QAA2B,EAAE,WAAW,GAAG,+BAAuB,EAAE,UAAU,GAAG,+BAAuB,EAAE,sBAAyC,EAAE;IAChL,MAAM,UAAU,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpG,OAAO,GAAG,WAAW,GAAG,SAAS,WAAW,UAAU,GAAG,OAAO,iBAAiB,8BAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACzH,CAAC;AACD,SAAgB,cAAc,CAAC,QAA2B,EAAE,WAAW,GAAG,+BAAuB,EAAE,UAAU,GAAG,+BAAuB,EAAE,sBAAyC,EAAE;IAChL,OAAO,IAAA,wBAAU,EAAC,KAAK,CAAC;SACnB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC;SAC9E,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { DEFAULT_BUB_VERSION } from \"./coding-cli-versions.ts\";\n/**\n * Bub 的 OTel tape store 插件——时间轨的来源。插件不发 PyPI,git 依赖是唯一安装方式。\n *\n * 插件与 Bub 的 tape 协议同代:这个 pin(bub-contrib#53 之后)从 `bub.tape` 取类型,\n * 要求 Bub ≥ 0.3.10;更早的 pin 按 republic 的类型校验,配 Bub ≤ 0.3.9。配错代不会安装失败,\n * 而是 span 全被拒、时间轨静默为空(台账见 memory/bub-tapestore-otel-tapeentry-drift.md)。\n */\nexport const DEFAULT_BUB_OTEL_PLUGIN = \"git+https://github.com/bubbuild/bub-contrib.git@34715077877041b21472dcca39d91529296a1a9e#subdirectory=packages/bub-tapestore-otel\";\n/** 装哪一版 Bub:`uv tool install` 的 requirement,版本单源在 `coding-cli-versions.ts`。 */\nexport const DEFAULT_BUB_REQUIREMENT = bubRequirement(DEFAULT_BUB_VERSION);\n/**\n * Bub 0.
|
|
1
|
+
{"version":3,"file":"bub-install-spec.js","sourceRoot":"","sources":["bub-install-spec.ts"],"names":[],"mappings":";;;AA8BA,wCAEC;AACD,oDAEC;AACD,wCAKC;AACD,wCAKC;AA/CD,6CAAyC;AACzC,qEAA+D;AAC/D;;;;;;GAMG;AACU,QAAA,uBAAuB,GAAG,mIAAmI,CAAC;AAC3K,+EAA+E;AAClE,QAAA,uBAAuB,GAAG,cAAc,CAAC,4CAAmB,CAAC,CAAC;AAC3E;;;;;GAKG;AACU,QAAA,gCAAgC,GAAG;IAC5C,qBAAqB;IACrB,gBAAgB;CACV,CAAC;AACE,QAAA,sBAAsB,GAAG,CAAC,QAAQ,CAAU,CAAC;AAC7C,QAAA,kBAAkB,GAAG,wCAAwC,CAAC;AAC3E;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,OAAe;IAC1C,OAAO,QAAQ,OAAO,EAAE,CAAC;AAC7B,CAAC;AACD,SAAgB,oBAAoB,CAAC,QAA2B;IAC5D,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACtF,CAAC;AACD,SAAgB,cAAc,CAAC,QAA2B,EAAE,WAAW,GAAG,+BAAuB,EAAE,UAAU,GAAG,+BAAuB,EAAE,sBAAyC,EAAE;IAChL,MAAM,UAAU,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpG,OAAO,GAAG,WAAW,GAAG,SAAS,WAAW,UAAU,GAAG,OAAO,iBAAiB,8BAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACzH,CAAC;AACD,SAAgB,cAAc,CAAC,QAA2B,EAAE,WAAW,GAAG,+BAAuB,EAAE,UAAU,GAAG,+BAAuB,EAAE,sBAAyC,EAAE;IAChL,OAAO,IAAA,wBAAU,EAAC,KAAK,CAAC;SACnB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC;SAC9E,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { DEFAULT_BUB_VERSION } from \"./coding-cli-versions.ts\";\n/**\n * Bub 的 OTel tape store 插件——时间轨的来源。插件不发 PyPI,git 依赖是唯一安装方式。\n *\n * 插件与 Bub 的 tape 协议同代:这个 pin(bub-contrib#53 之后)从 `bub.tape` 取类型,\n * 要求 Bub ≥ 0.3.10;更早的 pin 按 republic 的类型校验,配 Bub ≤ 0.3.9。配错代不会安装失败,\n * 而是 span 全被拒、时间轨静默为空(台账见 memory/bub-tapestore-otel-tapeentry-drift.md)。\n */\nexport const DEFAULT_BUB_OTEL_PLUGIN = \"git+https://github.com/bubbuild/bub-contrib.git@34715077877041b21472dcca39d91529296a1a9e#subdirectory=packages/bub-tapestore-otel\";\n/** 装哪一版 Bub:`uv tool install` 的 requirement,版本单源在 `coding-cli-versions.ts`。 */\nexport const DEFAULT_BUB_REQUIREMENT = bubRequirement(DEFAULT_BUB_VERSION);\n/**\n * Bub 0.5.1 的上游 lockfile 所验证的模型客户端闭包。\n *\n * Bub 自己的 PyPI metadata 没有精确锁定这两个依赖;若只钉 `bub==0.5.1`,每次安装仍会\n * 解析当天最新的客户端,使同一实验在没有配置变更时改变请求协议。\n */\nexport const DEFAULT_BUB_DEPENDENCY_OVERRIDES = [\n \"any-llm-sdk==1.22.1\",\n \"openai==2.31.0\",\n] as const;\nexport const BUB_CHECKPOINT_SUBDIRS = [\".local\"] as const;\nexport const BUB_INSTALL_MARKER = \".local/share/niceeval/bub-install-hash\";\n/**\n * PyPI requirement for a pinned Bub version.\n *\n * 这行同时是安装用的 uv override:OTel 插件所在 workspace 把 `bub` 声明成 git 依赖,\n * 不覆盖的话每次安装都会去拉 Bub 主干,版本失控。\n */\nexport function bubRequirement(version: string): string {\n return `bub==${version}`;\n}\nexport function normalizeBubPackages(packages: readonly string[]): string[] {\n return [...new Set(packages.map((value) => value.trim()).filter(Boolean))].sort();\n}\nexport function bubInstallSpec(packages: readonly string[], requirement = DEFAULT_BUB_REQUIREMENT, otelPlugin = DEFAULT_BUB_OTEL_PLUGIN, dependencyOverrides: readonly string[] = []): string {\n const normalized = normalizeBubPackages(packages);\n const plugins = normalized.length ? ` --with ${normalized.join(\" --with \")}` : \"\";\n const overrides = dependencyOverrides.length ? ` --overrides ${dependencyOverrides.join(\" \")}` : \"\";\n return `${requirement}${overrides} --with ${otelPlugin}${plugins} --checkpoint(${BUB_CHECKPOINT_SUBDIRS.join(\",\")})`;\n}\nexport function bubInstallHash(packages: readonly string[], requirement = DEFAULT_BUB_REQUIREMENT, otelPlugin = DEFAULT_BUB_OTEL_PLUGIN, dependencyOverrides: readonly string[] = []): string {\n return createHash(\"md5\")\n .update(bubInstallSpec(packages, requirement, otelPlugin, dependencyOverrides))\n .digest(\"hex\")\n .slice(0, 12);\n}\n"]}
|
|
@@ -9,12 +9,12 @@ export declare const DEFAULT_BUB_OTEL_PLUGIN = "git+https://github.com/bubbuild/
|
|
|
9
9
|
/** 装哪一版 Bub:`uv tool install` 的 requirement,版本单源在 `coding-cli-versions.ts`。 */
|
|
10
10
|
export declare const DEFAULT_BUB_REQUIREMENT: string;
|
|
11
11
|
/**
|
|
12
|
-
* Bub 0.
|
|
12
|
+
* Bub 0.5.1 的上游 lockfile 所验证的模型客户端闭包。
|
|
13
13
|
*
|
|
14
|
-
* Bub 自己的 PyPI metadata
|
|
14
|
+
* Bub 自己的 PyPI metadata 没有精确锁定这两个依赖;若只钉 `bub==0.5.1`,每次安装仍会
|
|
15
15
|
* 解析当天最新的客户端,使同一实验在没有配置变更时改变请求协议。
|
|
16
16
|
*/
|
|
17
|
-
export declare const DEFAULT_BUB_DEPENDENCY_OVERRIDES: readonly ["any-llm-sdk==1.
|
|
17
|
+
export declare const DEFAULT_BUB_DEPENDENCY_OVERRIDES: readonly ["any-llm-sdk==1.22.1", "openai==2.31.0"];
|
|
18
18
|
export declare const BUB_CHECKPOINT_SUBDIRS: readonly [".local"];
|
|
19
19
|
export declare const BUB_INSTALL_MARKER = ".local/share/niceeval/bub-install-hash";
|
|
20
20
|
/**
|
|
@@ -9,12 +9,12 @@ export declare const DEFAULT_BUB_OTEL_PLUGIN = "git+https://github.com/bubbuild/
|
|
|
9
9
|
/** 装哪一版 Bub:`uv tool install` 的 requirement,版本单源在 `coding-cli-versions.ts`。 */
|
|
10
10
|
export declare const DEFAULT_BUB_REQUIREMENT: string;
|
|
11
11
|
/**
|
|
12
|
-
* Bub 0.
|
|
12
|
+
* Bub 0.5.1 的上游 lockfile 所验证的模型客户端闭包。
|
|
13
13
|
*
|
|
14
|
-
* Bub 自己的 PyPI metadata
|
|
14
|
+
* Bub 自己的 PyPI metadata 没有精确锁定这两个依赖;若只钉 `bub==0.5.1`,每次安装仍会
|
|
15
15
|
* 解析当天最新的客户端,使同一实验在没有配置变更时改变请求协议。
|
|
16
16
|
*/
|
|
17
|
-
export declare const DEFAULT_BUB_DEPENDENCY_OVERRIDES: readonly ["any-llm-sdk==1.
|
|
17
|
+
export declare const DEFAULT_BUB_DEPENDENCY_OVERRIDES: readonly ["any-llm-sdk==1.22.1", "openai==2.31.0"];
|
|
18
18
|
export declare const BUB_CHECKPOINT_SUBDIRS: readonly [".local"];
|
|
19
19
|
export declare const BUB_INSTALL_MARKER = ".local/share/niceeval/bub-install-hash";
|
|
20
20
|
/**
|
|
@@ -9,12 +9,12 @@ export declare const DEFAULT_BUB_OTEL_PLUGIN = "git+https://github.com/bubbuild/
|
|
|
9
9
|
/** 装哪一版 Bub:`uv tool install` 的 requirement,版本单源在 `coding-cli-versions.ts`。 */
|
|
10
10
|
export declare const DEFAULT_BUB_REQUIREMENT: string;
|
|
11
11
|
/**
|
|
12
|
-
* Bub 0.
|
|
12
|
+
* Bub 0.5.1 的上游 lockfile 所验证的模型客户端闭包。
|
|
13
13
|
*
|
|
14
|
-
* Bub 自己的 PyPI metadata
|
|
14
|
+
* Bub 自己的 PyPI metadata 没有精确锁定这两个依赖;若只钉 `bub==0.5.1`,每次安装仍会
|
|
15
15
|
* 解析当天最新的客户端,使同一实验在没有配置变更时改变请求协议。
|
|
16
16
|
*/
|
|
17
|
-
export declare const DEFAULT_BUB_DEPENDENCY_OVERRIDES: readonly ["any-llm-sdk==1.
|
|
17
|
+
export declare const DEFAULT_BUB_DEPENDENCY_OVERRIDES: readonly ["any-llm-sdk==1.22.1", "openai==2.31.0"];
|
|
18
18
|
export declare const BUB_CHECKPOINT_SUBDIRS: readonly [".local"];
|
|
19
19
|
export declare const BUB_INSTALL_MARKER = ".local/share/niceeval/bub-install-hash";
|
|
20
20
|
/**
|
package/dist/agents/bub.cjs
CHANGED
|
@@ -31,7 +31,7 @@ function resolvePin(config) {
|
|
|
31
31
|
requirement: config?.version ? (0, bub_install_spec_ts_1.bubRequirement)(config.version) : bub_install_spec_ts_1.DEFAULT_BUB_REQUIREMENT,
|
|
32
32
|
otelPlugin: config?.otelPlugin ?? bub_install_spec_ts_1.DEFAULT_BUB_OTEL_PLUGIN,
|
|
33
33
|
// NiceEval can reproduce the default release's upstream lock exactly. A caller-selected
|
|
34
|
-
// historical Bub version owns a different closure, so do not silently apply
|
|
34
|
+
// historical Bub version owns a different closure, so do not silently apply the default pins.
|
|
35
35
|
dependencyOverrides: version === coding_cli_versions_ts_1.DEFAULT_BUB_VERSION ? bub_install_spec_ts_1.DEFAULT_BUB_DEPENDENCY_OVERRIDES : [],
|
|
36
36
|
};
|
|
37
37
|
}
|
package/dist/agents/bub.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bub.js","sourceRoot":"","sources":["bub.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"effect\";\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { makeSandboxAgent } from \"../define.ts\";\nimport { requireEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { mapBubSpans } from \"../o11y/otlp/mappers/bub.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { registerAgentLifecycleHookCommands, runPostSetupHooks, runPreTeardownHooks, } from \"./post-setup.ts\";\nimport type { Agent, AgentSetupManifest, SkillSpec, TurnEvidenceCoverage } from \"../types.ts\";\nimport type { SandboxCommand } from \"../sandbox/commands.ts\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { BUB_INSTALL_MARKER, DEFAULT_BUB_DEPENDENCY_OVERRIDES, DEFAULT_BUB_OTEL_PLUGIN, DEFAULT_BUB_REQUIREMENT, bubInstallHash, bubRequirement, normalizeBubPackages, } from \"./bub-install-spec.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { defineSandboxCommand } from \"../sandbox/commands.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport { DEFAULT_BUB_VERSION } from \"./coding-cli-versions.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// bub 的 agent adapter(沙箱型)。\n//\n// ⚠️ 现实校正:bub 是 PyPI 上的 `bub`(alpha,Python 3.12),不是 npm 包。\n// · 安装:uv tool install bub(uv 自带 python 3.12,免 root)。\n// · 调用:bub run \"<prompt>\" --session-id <id> --workspace <path>\n// · 模型 + 代理:BUB_MODEL=openai:<model>、BUB_API_BASE、BUB_API_KEY。\n// · 记忆:tape(总是开),落盘在 ~/.bub/tapes/<md5(ws)[:16]>__<md5(sess)[:16]>.jsonl。\n// ───────────────────────────────────────────────────────────────────────────\n/**\n * Bub 的扩展单元 —— **只属于 Bub**:Bub 的插件是运行环境里的 Python Package,\n * 与 Claude Code / Codex 的 native plugin 没有共同的安装协议,不共用类型。\n */\nexport interface PythonPluginSpec {\n /** PyPI Package、Version Specifier 或 Git URL(如 `bub-plugin-memory==1.3.0`、`git+https://…@8f3c1a2`)。 */\n package: string;\n}\nexport interface BubConfig {\n /** OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。 */\n apiKey?: string;\n /** OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。 */\n apiBase?: string;\n /**\n * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md(bub 没有原生 Skill 加载机制)。\n */\n skills?: SkillSpec[];\n /**\n * 装哪一版 Bub(PyPI 版本号,如 `\"0.4.0\"`)。省略时用 NiceEval 钉的默认版本;\n * 永远是确定版本,不装 latest —— 被测对象的版本要能从实验配置读出来。\n */\n version?: string;\n /**\n * OTel tape store 插件的 git 依赖(时间轨的来源)。省略时用 NiceEval 钉的默认 pin。\n *\n * 插件与 Bub 的 tape 协议同代:默认 pin 从 `bub.tape` 取类型,要求 Bub ≥ 0.3.10;更早的\n * 插件 commit 按 republic 的类型校验,配 Bub ≤ 0.3.9。配错代不会安装失败,而是 span 全被拒、\n * 时间轨静默为空 —— 所以往回钉 `version` 时必须同批钉配套的插件 commit。\n */\n otelPlugin?: string;\n /**\n * 额外装进 bub tool 环境的 Python Package,每个 Sandbox setup 时进 `uv tool install … --with <pkg>`。\n * 规范化后的 package 列表进安装 checkpoint key:plugin 集合不同的两个 agent 变体不会复用同一个\n * 安装 checkpoint(否则第二个变体会静默拿到第一个变体的环境)。\n */\n pythonPlugins?: PythonPluginSpec[];\n /**\n * 安装后按数组顺序运行的用户 Hook(复用 SandboxCommand 的窄上下文):在装 bub、装 Skills /\n * Python package、写 manifest 全部完成后执行。抛错按基础设施错误计(attempt errored)。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n postSetup?: SandboxCommand[];\n /**\n * 与 `postSetup` 成对的收尾 Hook:按 `postSetup` 的逆序语义,在 agent 自己的 teardown 步骤\n * 之前执行(LIFO 镜像 —— `postSetup` 跑在 agent 安装之后,`preTeardown` 就跑在 agent 收尾\n * 之前),当且仅当 `postSetup` 的时点走到过才触发。抛错按基础设施错误计,由 teardown 段\n * 按 teardown-failed 诊断收束。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n preTeardown?: SandboxCommand[];\n}\nconst UV = \"$HOME/.local/bin/uv\";\n/** bub 的 skill 目录(`skills` 生态的「通用」目录);bub 不原生扫描它,靠 AGENTS.md 的发现指引。 */\nconst SKILL_DIR = \".agents/skills\";\n// bub 与 OTel 插件的 pin 都从 config 来(缺省用源码里的默认 pin)——不设环境变量后门:\n// 装哪个包是配置,配置的家是代码(边界见 docs/architecture.md「配置从代码来,凭据从环境来」)。\n//\n// override 文件不是历史包袱:插件所在 workspace 把 `bub` 声明成 git 依赖,不覆盖的话每次\n// 安装都会去拉 Bub 主干,版本失控。所以安装前总是先把 `bub==<version>` 写进这个文件。\nconst BUB_OVERRIDE_FILE = \"/tmp/bub-override.txt\";\n/** 一个 agent 变体装的那套 bub:requirement + OTel 插件,两者都进安装指纹。 */\ninterface BubInstallPin {\n requirement: string;\n otelPlugin: string;\n dependencyOverrides: readonly string[];\n}\nfunction resolvePin(config?: BubConfig): BubInstallPin {\n const version = config?.version ?? DEFAULT_BUB_VERSION;\n return {\n requirement: config?.version ? bubRequirement(config.version) : DEFAULT_BUB_REQUIREMENT,\n otelPlugin: config?.otelPlugin ?? DEFAULT_BUB_OTEL_PLUGIN,\n // NiceEval can reproduce the default release's upstream lock exactly. A caller-selected\n // historical Bub version owns a different closure, so do not silently apply 0.4.0's pins.\n dependencyOverrides: version === DEFAULT_BUB_VERSION ? DEFAULT_BUB_DEPENDENCY_OVERRIDES : [],\n };\n}\n// NiceEval 的预制配方与运行时安装都写到 $HOME/.local;显式使用该路径,避免 PATH 上\n// 另一个未知版本的 bub 抢先命中。\nconst BUB = \"$HOME/.local/bin/bub\";\n/** 规范化 python plugin:去空白、丢空串、去重 —— 安装命令与 checkpoint key 用同一份列表。 */\nfunction normalizePackages(plugins?: readonly PythonPluginSpec[]): string[] {\n return normalizeBubPackages((plugins ?? []).map((plugin) => plugin.package));\n}\nfunction installHashOf(packages: readonly string[], pin: BubInstallPin): string {\n return bubInstallHash(packages, pin.requirement, pin.otelPlugin, pin.dependencyOverrides);\n}\nfunction tapePath(workspace: string, sessionId: string, bubHome: string): string {\n const w = createHash(\"md5\").update(workspace).digest(\"hex\").slice(0, 16);\n const s = createHash(\"md5\").update(sessionId).digest(\"hex\").slice(0, 16);\n return `${bubHome}/tapes/${w}__${s}.jsonl`;\n}\n// @concord-code ne-adapter-bub-agent\n// @concord-implements docs/feature/adapters/README.md\n// @concord-implements docs/feature/adapters/sdk/bub/README.md\nexport function bubAgent(config?: BubConfig): Agent {\n const getApiKey = () => config?.apiKey ?? requireEnv(\"BUB_API_KEY\");\n const getApiBase = () => config?.apiBase ?? requireEnv(\"BUB_API_BASE\");\n const packages = normalizePackages(config?.pythonPlugins);\n const pin = resolvePin(config);\n const identity = {\n agent: \"bub\",\n version: config?.version ?? DEFAULT_BUB_VERSION,\n revision: installHashOf(packages, pin),\n } as const;\n const marker = `$HOME/${BUB_INSTALL_MARKER}`;\n const probe = defineSandboxCommand({ id: \"niceeval.agent.probe.bub\", revision: identity.revision, inputs: identity }, async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${BUB} && test \"$(cat ${marker} 2>/dev/null)\" = ${shellQuote(identity.revision)}`);\n });\n // sandboxId → { home, workspace }; persists values detected in setup() so send() can use them.\n const sessionInfo = new Map<string, {\n home: string;\n workspace: string;\n }>();\n return registerAgentLifecycleHookCommands(makeSandboxAgent({\n name: \"bub\",\n ensure: { identity, probe },\n installers: [{\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${UV} || (curl -LsSf https://astral.sh/uv/install.sh | sh)`);\n await sandbox.writeText(BUB_OVERRIDE_FILE, `${[pin.requirement, ...pin.dependencyOverrides].join(\"\\n\")}\\n`);\n const withPlugins = packages.map((pkg) => `--with ${shellQuote(pkg)}`).join(\" \");\n let last = \"\";\n for (let attempt = 1; attempt <= 3; attempt += 1) {\n const result = await sandbox.runShell(`${UV} tool install --reinstall --python 3.12 --prerelease allow 'bub' --overrides ${BUB_OVERRIDE_FILE} --with ${shellQuote(pin.otelPlugin)}${withPlugins ? ` ${withPlugins}` : \"\"}`);\n if (result.exitCode === 0) {\n await sandbox.runShellOrThrow(`mkdir -p \"$(dirname ${marker})\" && printf '%s' ${shellQuote(identity.revision)} > ${marker}`);\n return;\n }\n last = (result.stdout + result.stderr).split(\"\\n\").slice(-15).join(\"\\n\");\n }\n throw new Error(`bub install failed after ${3} attempts:\n${last}`);\n },\n }],\n // 官方 adapter:transcript 经生命周期 fixture 验证,全通道 complete。\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapBubSpans,\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n BUB_TAPESTORE_OTEL_ENABLED: \"true\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n }),\n },\n setup: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n // home 必须来自运行时探测:各 sandbox provider 不同(/home/node、/home/vercel-sandbox…),\n // 兜一个 provider 专属常量会静默走错路径(tape 读不到 → 空事件流 → 负断言假通过)。\n const home = (await sb.runShell(\"printf '%s' $HOME\")).stdout.trim();\n if (!home)\n throw new Error(`Failed to detect sandbox $HOME (empty output from \\`printf $HOME\\`). Refusing to fall back to a provider-specific path; check the sandbox provider.`);\n const workspace = sb.workdir;\n sessionInfo.set(sb.sandboxId, { home, workspace });\n // Agent CLI 已由 runner 的 agent.ensure 循环完成安装与复检。\n // adapter setup 只写本 Attempt 的 runtime config。\n if (!(await sb.pathExists(`${workspace}/AGENTS.md`))) {\n await shared.writeFile(sb, `${workspace}/AGENTS.md`, [\n `You are a coding agent working in a Next.js project at ${workspace}.`,\n ``,\n `Implement the requested feature by writing files directly to disk with the available tools:`,\n `- fs_write(path, content): create or overwrite a file`,\n `- fs_edit(path, old, new): edit an existing file`,\n `- bash(cmd): run shell commands`,\n ``,\n `Do NOT respond with only a text explanation — write the actual code files.`,\n `After writing, verify with bash(\"cd ${workspace} && npm run build\").`,\n ].join(\"\\n\"));\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // bub 没有原生 Skill 加载机制:装进目录不等于会被读到,发现指引跟着一起写。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (packages.length)\n manifest.pythonPlugins = packages.map((pkg) => ({ package: pkg }));\n if (manifest.skills.length || manifest.pythonPlugins?.length) {\n ctx.reportSetup(manifest);\n }\n // 安装后钩子(postSetup):排在 manifest 之后——manifest 审计 Adapter 自身的安装事实,\n // 钩子失败不该丢掉这份证据。\n await runPostSetupHooks(sb, ctx, \"bub\", config?.postSetup);\n },\n catch: (cause) => cause,\n }),\n teardown: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n // preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。\n // bub 目前没有其它收尾步骤,这段就是整个 teardown。\n await runPreTeardownHooks(sb, ctx, \"bub\", config?.preTeardown);\n },\n catch: (cause) => cause,\n }),\n send: (input, ctx) => Effect.tryPromise({\n try: async () => {\n const sb = ctx.sandbox;\n const info = sessionInfo.get(sb.sandboxId);\n if (!info)\n throw new Error(`bub adapter setup() has not run in this sandbox (missing home/workspace info). The runner must call setup before send.`);\n const { home, workspace } = info;\n const bubHome = `${home}/.bub`;\n // 会话契约:ctx.session.id 未记录时开新 tape(新 sessionId),否则 resume 传入的 id。\n // tape 路径由 md5(workspace)+md5(sessionId) 决定,同沙箱多会话靠 sessionId 区分。\n const sessionId = ctx.session.id ?? `fe-${sb.sandboxId}-${randomUUID().slice(0, 8)}`;\n ctx.session.capture(sessionId);\n const apiKey = getApiKey();\n const env: globalThis.Record<string, string> = {\n BUB_API_KEY: apiKey,\n BUB_API_BASE: getApiBase(),\n BUB_HOME: bubHome,\n ...ctx.telemetry?.env,\n };\n // model 归属:实验决定(ctx.model),省略时交给 bub 原生默认 / 用户环境,不硬编码。\n if (ctx.model)\n env.BUB_MODEL = `openai:${ctx.model}`;\n const res = await sb.runShell(`${BUB} --workspace ${workspace} run ${shared.shellQuote(input.text)} --session-id ${sessionId}`, { env, sensitiveValues: [apiKey], stream: true });\n const raw = await sb.readText(tapePath(workspace, sessionId, bubHome)).catch(() => undefined);\n const parsed = shared.parseBub(raw);\n const events = [...parsed.events];\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (!raw?.trim()) {\n const reason = \"Bub tape was unavailable; tool trajectory was not observed.\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n }\n else if (!parsed.parseSuccess) {\n const reason = \"Some Bub tape lines could not be parsed.\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage: parsed.usage,\n process: res,\n });\n }\n return {\n events,\n usage: parsed.usage,\n status: \"completed\",\n ...(turnEvidenceCoverage === undefined ? {} : { evidenceCoverage: turnEvidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n }),\n }), config?.postSetup, config?.preTeardown);\n}\nexport default bubAgent();\n"]}
|
|
1
|
+
{"version":3,"file":"bub.js","sourceRoot":"","sources":["bub.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"effect\";\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { makeSandboxAgent } from \"../define.ts\";\nimport { requireEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { mapBubSpans } from \"../o11y/otlp/mappers/bub.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { registerAgentLifecycleHookCommands, runPostSetupHooks, runPreTeardownHooks, } from \"./post-setup.ts\";\nimport type { Agent, AgentSetupManifest, SkillSpec, TurnEvidenceCoverage } from \"../types.ts\";\nimport type { SandboxCommand } from \"../sandbox/commands.ts\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { BUB_INSTALL_MARKER, DEFAULT_BUB_DEPENDENCY_OVERRIDES, DEFAULT_BUB_OTEL_PLUGIN, DEFAULT_BUB_REQUIREMENT, bubInstallHash, bubRequirement, normalizeBubPackages, } from \"./bub-install-spec.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { defineSandboxCommand } from \"../sandbox/commands.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport { DEFAULT_BUB_VERSION } from \"./coding-cli-versions.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// bub 的 agent adapter(沙箱型)。\n//\n// ⚠️ 现实校正:bub 是 PyPI 上的 `bub`(alpha,Python 3.12),不是 npm 包。\n// · 安装:uv tool install bub(uv 自带 python 3.12,免 root)。\n// · 调用:bub run \"<prompt>\" --session-id <id> --workspace <path>\n// · 模型 + 代理:BUB_MODEL=openai:<model>、BUB_API_BASE、BUB_API_KEY。\n// · 记忆:tape(总是开),落盘在 ~/.bub/tapes/<md5(ws)[:16]>__<md5(sess)[:16]>.jsonl。\n// ───────────────────────────────────────────────────────────────────────────\n/**\n * Bub 的扩展单元 —— **只属于 Bub**:Bub 的插件是运行环境里的 Python Package,\n * 与 Claude Code / Codex 的 native plugin 没有共同的安装协议,不共用类型。\n */\nexport interface PythonPluginSpec {\n /** PyPI Package、Version Specifier 或 Git URL(如 `bub-plugin-memory==1.3.0`、`git+https://…@8f3c1a2`)。 */\n package: string;\n}\nexport interface BubConfig {\n /** OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。 */\n apiKey?: string;\n /** OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。 */\n apiBase?: string;\n /**\n * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md(bub 没有原生 Skill 加载机制)。\n */\n skills?: SkillSpec[];\n /**\n * 装哪一版 Bub(PyPI 版本号,如 `\"0.5.1\"`)。省略时用 NiceEval 钉的默认版本;\n * 永远是确定版本,不装 latest —— 被测对象的版本要能从实验配置读出来。\n */\n version?: string;\n /**\n * OTel tape store 插件的 git 依赖(时间轨的来源)。省略时用 NiceEval 钉的默认 pin。\n *\n * 插件与 Bub 的 tape 协议同代:默认 pin 从 `bub.tape` 取类型,要求 Bub ≥ 0.3.10;更早的\n * 插件 commit 按 republic 的类型校验,配 Bub ≤ 0.3.9。配错代不会安装失败,而是 span 全被拒、\n * 时间轨静默为空 —— 所以往回钉 `version` 时必须同批钉配套的插件 commit。\n */\n otelPlugin?: string;\n /**\n * 额外装进 bub tool 环境的 Python Package,每个 Sandbox setup 时进 `uv tool install … --with <pkg>`。\n * 规范化后的 package 列表进安装 checkpoint key:plugin 集合不同的两个 agent 变体不会复用同一个\n * 安装 checkpoint(否则第二个变体会静默拿到第一个变体的环境)。\n */\n pythonPlugins?: PythonPluginSpec[];\n /**\n * 安装后按数组顺序运行的用户 Hook(复用 SandboxCommand 的窄上下文):在装 bub、装 Skills /\n * Python package、写 manifest 全部完成后执行。抛错按基础设施错误计(attempt errored)。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n postSetup?: SandboxCommand[];\n /**\n * 与 `postSetup` 成对的收尾 Hook:按 `postSetup` 的逆序语义,在 agent 自己的 teardown 步骤\n * 之前执行(LIFO 镜像 —— `postSetup` 跑在 agent 安装之后,`preTeardown` 就跑在 agent 收尾\n * 之前),当且仅当 `postSetup` 的时点走到过才触发。抛错按基础设施错误计,由 teardown 段\n * 按 teardown-failed 诊断收束。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n preTeardown?: SandboxCommand[];\n}\nconst UV = \"$HOME/.local/bin/uv\";\n/** bub 的 skill 目录(`skills` 生态的「通用」目录);bub 不原生扫描它,靠 AGENTS.md 的发现指引。 */\nconst SKILL_DIR = \".agents/skills\";\n// bub 与 OTel 插件的 pin 都从 config 来(缺省用源码里的默认 pin)——不设环境变量后门:\n// 装哪个包是配置,配置的家是代码(边界见 docs/architecture.md「配置从代码来,凭据从环境来」)。\n//\n// override 文件不是历史包袱:插件所在 workspace 把 `bub` 声明成 git 依赖,不覆盖的话每次\n// 安装都会去拉 Bub 主干,版本失控。所以安装前总是先把 `bub==<version>` 写进这个文件。\nconst BUB_OVERRIDE_FILE = \"/tmp/bub-override.txt\";\n/** 一个 agent 变体装的那套 bub:requirement + OTel 插件,两者都进安装指纹。 */\ninterface BubInstallPin {\n requirement: string;\n otelPlugin: string;\n dependencyOverrides: readonly string[];\n}\nfunction resolvePin(config?: BubConfig): BubInstallPin {\n const version = config?.version ?? DEFAULT_BUB_VERSION;\n return {\n requirement: config?.version ? bubRequirement(config.version) : DEFAULT_BUB_REQUIREMENT,\n otelPlugin: config?.otelPlugin ?? DEFAULT_BUB_OTEL_PLUGIN,\n // NiceEval can reproduce the default release's upstream lock exactly. A caller-selected\n // historical Bub version owns a different closure, so do not silently apply the default pins.\n dependencyOverrides: version === DEFAULT_BUB_VERSION ? DEFAULT_BUB_DEPENDENCY_OVERRIDES : [],\n };\n}\n// NiceEval 的预制配方与运行时安装都写到 $HOME/.local;显式使用该路径,避免 PATH 上\n// 另一个未知版本的 bub 抢先命中。\nconst BUB = \"$HOME/.local/bin/bub\";\n/** 规范化 python plugin:去空白、丢空串、去重 —— 安装命令与 checkpoint key 用同一份列表。 */\nfunction normalizePackages(plugins?: readonly PythonPluginSpec[]): string[] {\n return normalizeBubPackages((plugins ?? []).map((plugin) => plugin.package));\n}\nfunction installHashOf(packages: readonly string[], pin: BubInstallPin): string {\n return bubInstallHash(packages, pin.requirement, pin.otelPlugin, pin.dependencyOverrides);\n}\nfunction tapePath(workspace: string, sessionId: string, bubHome: string): string {\n const w = createHash(\"md5\").update(workspace).digest(\"hex\").slice(0, 16);\n const s = createHash(\"md5\").update(sessionId).digest(\"hex\").slice(0, 16);\n return `${bubHome}/tapes/${w}__${s}.jsonl`;\n}\n// @concord-code ne-adapter-bub-agent\n// @concord-implements docs/feature/adapters/README.md\n// @concord-implements docs/feature/adapters/sdk/bub/README.md\nexport function bubAgent(config?: BubConfig): Agent {\n const getApiKey = () => config?.apiKey ?? requireEnv(\"BUB_API_KEY\");\n const getApiBase = () => config?.apiBase ?? requireEnv(\"BUB_API_BASE\");\n const packages = normalizePackages(config?.pythonPlugins);\n const pin = resolvePin(config);\n const identity = {\n agent: \"bub\",\n version: config?.version ?? DEFAULT_BUB_VERSION,\n revision: installHashOf(packages, pin),\n } as const;\n const marker = `$HOME/${BUB_INSTALL_MARKER}`;\n const probe = defineSandboxCommand({ id: \"niceeval.agent.probe.bub\", revision: identity.revision, inputs: identity }, async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${BUB} && test \"$(cat ${marker} 2>/dev/null)\" = ${shellQuote(identity.revision)}`);\n });\n // sandboxId → { home, workspace }; persists values detected in setup() so send() can use them.\n const sessionInfo = new Map<string, {\n home: string;\n workspace: string;\n }>();\n return registerAgentLifecycleHookCommands(makeSandboxAgent({\n name: \"bub\",\n ensure: { identity, probe },\n installers: [{\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${UV} || (curl -LsSf https://astral.sh/uv/install.sh | sh)`);\n await sandbox.writeText(BUB_OVERRIDE_FILE, `${[pin.requirement, ...pin.dependencyOverrides].join(\"\\n\")}\\n`);\n const withPlugins = packages.map((pkg) => `--with ${shellQuote(pkg)}`).join(\" \");\n let last = \"\";\n for (let attempt = 1; attempt <= 3; attempt += 1) {\n const result = await sandbox.runShell(`${UV} tool install --reinstall --python 3.12 --prerelease allow 'bub' --overrides ${BUB_OVERRIDE_FILE} --with ${shellQuote(pin.otelPlugin)}${withPlugins ? ` ${withPlugins}` : \"\"}`);\n if (result.exitCode === 0) {\n await sandbox.runShellOrThrow(`mkdir -p \"$(dirname ${marker})\" && printf '%s' ${shellQuote(identity.revision)} > ${marker}`);\n return;\n }\n last = (result.stdout + result.stderr).split(\"\\n\").slice(-15).join(\"\\n\");\n }\n throw new Error(`bub install failed after ${3} attempts:\n${last}`);\n },\n }],\n // 官方 adapter:transcript 经生命周期 fixture 验证,全通道 complete。\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapBubSpans,\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n BUB_TAPESTORE_OTEL_ENABLED: \"true\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n }),\n },\n setup: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n // home 必须来自运行时探测:各 sandbox provider 不同(/home/node、/home/vercel-sandbox…),\n // 兜一个 provider 专属常量会静默走错路径(tape 读不到 → 空事件流 → 负断言假通过)。\n const home = (await sb.runShell(\"printf '%s' $HOME\")).stdout.trim();\n if (!home)\n throw new Error(`Failed to detect sandbox $HOME (empty output from \\`printf $HOME\\`). Refusing to fall back to a provider-specific path; check the sandbox provider.`);\n const workspace = sb.workdir;\n sessionInfo.set(sb.sandboxId, { home, workspace });\n // Agent CLI 已由 runner 的 agent.ensure 循环完成安装与复检。\n // adapter setup 只写本 Attempt 的 runtime config。\n if (!(await sb.pathExists(`${workspace}/AGENTS.md`))) {\n await shared.writeFile(sb, `${workspace}/AGENTS.md`, [\n `You are a coding agent working in a Next.js project at ${workspace}.`,\n ``,\n `Implement the requested feature by writing files directly to disk with the available tools:`,\n `- fs_write(path, content): create or overwrite a file`,\n `- fs_edit(path, old, new): edit an existing file`,\n `- bash(cmd): run shell commands`,\n ``,\n `Do NOT respond with only a text explanation — write the actual code files.`,\n `After writing, verify with bash(\"cd ${workspace} && npm run build\").`,\n ].join(\"\\n\"));\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // bub 没有原生 Skill 加载机制:装进目录不等于会被读到,发现指引跟着一起写。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (packages.length)\n manifest.pythonPlugins = packages.map((pkg) => ({ package: pkg }));\n if (manifest.skills.length || manifest.pythonPlugins?.length) {\n ctx.reportSetup(manifest);\n }\n // 安装后钩子(postSetup):排在 manifest 之后——manifest 审计 Adapter 自身的安装事实,\n // 钩子失败不该丢掉这份证据。\n await runPostSetupHooks(sb, ctx, \"bub\", config?.postSetup);\n },\n catch: (cause) => cause,\n }),\n teardown: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n // preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。\n // bub 目前没有其它收尾步骤,这段就是整个 teardown。\n await runPreTeardownHooks(sb, ctx, \"bub\", config?.preTeardown);\n },\n catch: (cause) => cause,\n }),\n send: (input, ctx) => Effect.tryPromise({\n try: async () => {\n const sb = ctx.sandbox;\n const info = sessionInfo.get(sb.sandboxId);\n if (!info)\n throw new Error(`bub adapter setup() has not run in this sandbox (missing home/workspace info). The runner must call setup before send.`);\n const { home, workspace } = info;\n const bubHome = `${home}/.bub`;\n // 会话契约:ctx.session.id 未记录时开新 tape(新 sessionId),否则 resume 传入的 id。\n // tape 路径由 md5(workspace)+md5(sessionId) 决定,同沙箱多会话靠 sessionId 区分。\n const sessionId = ctx.session.id ?? `fe-${sb.sandboxId}-${randomUUID().slice(0, 8)}`;\n ctx.session.capture(sessionId);\n const apiKey = getApiKey();\n const env: globalThis.Record<string, string> = {\n BUB_API_KEY: apiKey,\n BUB_API_BASE: getApiBase(),\n BUB_HOME: bubHome,\n ...ctx.telemetry?.env,\n };\n // model 归属:实验决定(ctx.model),省略时交给 bub 原生默认 / 用户环境,不硬编码。\n if (ctx.model)\n env.BUB_MODEL = `openai:${ctx.model}`;\n const res = await sb.runShell(`${BUB} --workspace ${workspace} run ${shared.shellQuote(input.text)} --session-id ${sessionId}`, { env, sensitiveValues: [apiKey], stream: true });\n const raw = await sb.readText(tapePath(workspace, sessionId, bubHome)).catch(() => undefined);\n const parsed = shared.parseBub(raw);\n const events = [...parsed.events];\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (!raw?.trim()) {\n const reason = \"Bub tape was unavailable; tool trajectory was not observed.\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n }\n else if (!parsed.parseSuccess) {\n const reason = \"Some Bub tape lines could not be parsed.\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage: parsed.usage,\n process: res,\n });\n }\n return {\n events,\n usage: parsed.usage,\n status: \"completed\",\n ...(turnEvidenceCoverage === undefined ? {} : { evidenceCoverage: turnEvidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n }),\n }), config?.postSetup, config?.preTeardown);\n}\nexport default bubAgent();\n"]}
|
package/dist/agents/bub.d.cts
CHANGED
package/dist/agents/bub.d.mts
CHANGED
package/dist/agents/bub.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ exports.DEFAULT_CLAUDE_CODE_CLI_VERSION = "2.1.207";
|
|
|
11
11
|
* 换版本时同批核对 `bub-install-spec.ts` 的 OTel 插件 pin:插件与 Bub 的 tape 协议同代,
|
|
12
12
|
* 配错代不会安装失败,而是时间轨静默为空。
|
|
13
13
|
*/
|
|
14
|
-
exports.DEFAULT_BUB_VERSION = "0.
|
|
14
|
+
exports.DEFAULT_BUB_VERSION = "0.5.1";
|
|
15
15
|
/** OpenCode CLI(npm `opencode-ai`)默认钉的版本。 */
|
|
16
16
|
exports.DEFAULT_OPENCODE_CLI_VERSION = "1.18.5";
|
|
17
17
|
/** Hermes Agent(PyPI `hermes-agent`)默认钉的版本。 */
|
|
@@ -53,8 +53,7 @@ exports.AGENT_BASELINE_RECIPE_REVISION = {
|
|
|
53
53
|
// r4: 同上「USER node」配方变更
|
|
54
54
|
// r5: 同上「跨 provider 基线工具面统一」配方变更(含可写性)
|
|
55
55
|
codex: 6,
|
|
56
|
-
|
|
57
|
-
bub: 3,
|
|
56
|
+
bub: 1,
|
|
58
57
|
// r2: 同上「USER node」配方变更
|
|
59
58
|
// r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)
|
|
60
59
|
opencode: 4,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coding-cli-versions.js","sourceRoot":"","sources":["coding-cli-versions.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"coding-cli-versions.js","sourceRoot":"","sources":["coding-cli-versions.ts"],"names":[],"mappings":";;;AA6EA,0DAEC;AA/ED,gGAAgG;AACnF,QAAA,yBAAyB,GAAG,SAAS,CAAC;AACtC,QAAA,+BAA+B,GAAG,SAAS,CAAC;AACzD;;;;;GAKG;AACU,QAAA,mBAAmB,GAAG,OAAO,CAAC;AAC3C,6CAA6C;AAChC,QAAA,4BAA4B,GAAG,QAAQ,CAAC;AACrD,+CAA+C;AAClC,QAAA,0BAA0B,GAAG,QAAQ,CAAC;AACnD,0CAA0C;AAC7B,QAAA,4BAA4B,GAAG,YAAY,CAAC;AACzD,2DAA2D;AAC9C,QAAA,uBAAuB,GAAG,QAAQ,CAAC;AACnC,QAAA,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,qDAAqD;AACxC,QAAA,oCAAoC,GAAG,YAAY,CAAC;AAQjE,0CAA0C;AAC7B,QAAA,sBAAsB,GAAmD;IAClF,aAAa,EAAE,uCAA+B;IAC9C,KAAK,EAAE,iCAAyB;IAChC,GAAG,EAAE,2BAAmB;IACxB,QAAQ,EAAE,oCAA4B;IACtC,MAAM,EAAE,kCAA0B;IAClC,QAAQ,EAAE,oCAA4B;IACtC,GAAG,EAAE,+BAAuB;IAC5B,kBAAkB,EAAE,4CAAoC;CAC3D,CAAC;AACF;;;;;;GAMG;AACH,uDAAuD;AAC1C,QAAA,8BAA8B,GAAmD;IAC1F,yDAAyD;IACzD,6EAA6E;IAC7E,kDAAkD;IAClD,8EAA8E;IAC9E,sBAAsB;IACtB,aAAa,EAAE,CAAC;IAChB,kDAAkD;IAClD,wBAAwB;IACxB,uCAAuC;IACvC,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,wBAAwB;IACxB,uCAAuC;IACvC,QAAQ,EAAE,CAAC;IACX,gEAAgE;IAChE,iCAAiC;IACjC,MAAM,EAAE,CAAC;IACT,wBAAwB;IACxB,uCAAuC;IACvC,QAAQ,EAAE,CAAC;IACX,GAAG,EAAE,CAAC;IACN,kBAAkB,EAAE,CAAC;CACxB,CAAC;AACF;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,KAA0B;IAC9D,OAAO,GAAG,8BAAsB,CAAC,KAAK,CAAC,KAAK,sCAA8B,CAAC,KAAK,CAAC,EAAE,CAAC;AACxF,CAAC","sourcesContent":["/** Coding-agent CLI versions used by runtime fallback installs and official sandbox recipes. */\nexport const DEFAULT_CODEX_CLI_VERSION = \"0.144.1\";\nexport const DEFAULT_CLAUDE_CODE_CLI_VERSION = \"2.1.207\";\n/**\n * Bub release installed from PyPI by runtime fallback installs and official sandbox recipes.\n *\n * 换版本时同批核对 `bub-install-spec.ts` 的 OTel 插件 pin:插件与 Bub 的 tape 协议同代,\n * 配错代不会安装失败,而是时间轨静默为空。\n */\nexport const DEFAULT_BUB_VERSION = \"0.5.1\";\n/** OpenCode CLI(npm `opencode-ai`)默认钉的版本。 */\nexport const DEFAULT_OPENCODE_CLI_VERSION = \"1.18.5\";\n/** Hermes Agent(PyPI `hermes-agent`)默认钉的版本。 */\nexport const DEFAULT_HERMES_CLI_VERSION = \"0.19.0\";\n/** OpenClaw CLI(npm `openclaw`)默认钉的版本。 */\nexport const DEFAULT_OPENCLAW_CLI_VERSION = \"2026.7.1-2\";\n/** Oh My Pi coding-agent CLI (npm) and its Bun runtime. */\nexport const DEFAULT_OMP_CLI_VERSION = \"17.3.5\";\nexport const DEFAULT_BUN_VERSION = \"1.3.14\";\n/** DeepSeek Harness CLI (npm `@deepseek-ai/dsh`). */\nexport const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = \"0.1.7-rc.2\";\n/**\n * 有官方公共基线制品的 coding agent。\n *\n * Docker 侧八家齐全;E2B 侧目前只发布 Claude Code / Codex / Bub\n *(见 `E2BCodingAgent`),其余 Agent 的 E2B 模板尚未进台账。\n */\nexport type CodingAgentBaseline = \"claude-code\" | \"codex\" | \"bub\" | \"opencode\" | \"hermes\" | \"openclaw\" | \"omp\" | \"deepseek-harness\";\n/** 每个官方基线制品里装的那个 Agent 的版本——制品版本号的版本位。 */\nexport const AGENT_BASELINE_VERSION: globalThis.Record<CodingAgentBaseline, string> = {\n \"claude-code\": DEFAULT_CLAUDE_CODE_CLI_VERSION,\n codex: DEFAULT_CODEX_CLI_VERSION,\n bub: DEFAULT_BUB_VERSION,\n opencode: DEFAULT_OPENCODE_CLI_VERSION,\n hermes: DEFAULT_HERMES_CLI_VERSION,\n openclaw: DEFAULT_OPENCLAW_CLI_VERSION,\n omp: DEFAULT_OMP_CLI_VERSION,\n \"deepseek-harness\": DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION,\n};\n/**\n * NiceEval 基线配方自身的修订号——制品版本号的 `-r` 位。\n *\n * Agent 版本没变、配方变了(Node 工具契约、PATH 规范化、换 pin 的 commit、插件集合)就 +1;\n * Agent 版本一变归 1。已发布的 tag 不可原地覆盖,配方变更必须在版本里有位置表达。\n * 一个 Agent 的 E2B 与 Docker 制品共用这个号:一个版本号 = 一套基线配方,两侧同步重建。\n */\n// Docker base 支持非 root Node runtime 切换,并显式安装 Corepack。\nexport const AGENT_BASELINE_RECIPE_REVISION: globalThis.Record<CodingAgentBaseline, number> = {\n // r3: Dockerfile 里 npm 全局装完后显式 `USER node`——运行时不再强加执行身份,\n // 改为沿用镜像自己声明的 USER,非 root 必须由配方自己声明(见 docs/feature/sandbox/library.md「执行身份」)\n // r4: 跨 provider 基线工具面统一——不预装 yarn 实体,补齐 python3,\n // 并补 /usr/local 对运行用户可写(docs/feature/sandbox/library/prebuilt-environments.md\n // 「跨 provider 基线工具面」)\n \"claude-code\": 5,\n // r3: staged 安装改用自带运行时的原生平台包(不再要求沙箱里有 node / npm)\n // r4: 同上「USER node」配方变更\n // r5: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n codex: 6,\n bub: 1,\n // r2: 同上「USER node」配方变更\n // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n opencode: 4,\n // r2: 跨 provider 基线工具面统一——本 target 原本单独装的 python3 现由 base 统一提供,\n // 配方内容变了但不预装 yarn 不改变行为(同上,含可写性)\n hermes: 3,\n // r2: 同上「USER node」配方变更\n // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n openclaw: 4,\n omp: 2,\n \"deepseek-harness\": 1,\n};\n/**\n * 官方基线制品的版本 tag:`<Agent 版本>-r<配方修订>`,如 `0.144.1-r2`。\n *\n * niceeval 自身的版本不参与命名——库与制品内容无关,发版不该连带重建没变的制品,\n * 换 Agent 版本也不该等库发版。\n */\nexport function agentBaselineVersionTag(agent: CodingAgentBaseline): string {\n return `${AGENT_BASELINE_VERSION[agent]}-r${AGENT_BASELINE_RECIPE_REVISION[agent]}`;\n}\n"]}
|
|
@@ -7,7 +7,7 @@ export declare const DEFAULT_CLAUDE_CODE_CLI_VERSION = "2.1.207";
|
|
|
7
7
|
* 换版本时同批核对 `bub-install-spec.ts` 的 OTel 插件 pin:插件与 Bub 的 tape 协议同代,
|
|
8
8
|
* 配错代不会安装失败,而是时间轨静默为空。
|
|
9
9
|
*/
|
|
10
|
-
export declare const DEFAULT_BUB_VERSION = "0.
|
|
10
|
+
export declare const DEFAULT_BUB_VERSION = "0.5.1";
|
|
11
11
|
/** OpenCode CLI(npm `opencode-ai`)默认钉的版本。 */
|
|
12
12
|
export declare const DEFAULT_OPENCODE_CLI_VERSION = "1.18.5";
|
|
13
13
|
/** Hermes Agent(PyPI `hermes-agent`)默认钉的版本。 */
|
|
@@ -7,7 +7,7 @@ export declare const DEFAULT_CLAUDE_CODE_CLI_VERSION = "2.1.207";
|
|
|
7
7
|
* 换版本时同批核对 `bub-install-spec.ts` 的 OTel 插件 pin:插件与 Bub 的 tape 协议同代,
|
|
8
8
|
* 配错代不会安装失败,而是时间轨静默为空。
|
|
9
9
|
*/
|
|
10
|
-
export declare const DEFAULT_BUB_VERSION = "0.
|
|
10
|
+
export declare const DEFAULT_BUB_VERSION = "0.5.1";
|
|
11
11
|
/** OpenCode CLI(npm `opencode-ai`)默认钉的版本。 */
|
|
12
12
|
export declare const DEFAULT_OPENCODE_CLI_VERSION = "1.18.5";
|
|
13
13
|
/** Hermes Agent(PyPI `hermes-agent`)默认钉的版本。 */
|
|
@@ -7,7 +7,7 @@ export declare const DEFAULT_CLAUDE_CODE_CLI_VERSION = "2.1.207";
|
|
|
7
7
|
* 换版本时同批核对 `bub-install-spec.ts` 的 OTel 插件 pin:插件与 Bub 的 tape 协议同代,
|
|
8
8
|
* 配错代不会安装失败,而是时间轨静默为空。
|
|
9
9
|
*/
|
|
10
|
-
export declare const DEFAULT_BUB_VERSION = "0.
|
|
10
|
+
export declare const DEFAULT_BUB_VERSION = "0.5.1";
|
|
11
11
|
/** OpenCode CLI(npm `opencode-ai`)默认钉的版本。 */
|
|
12
12
|
export declare const DEFAULT_OPENCODE_CLI_VERSION = "1.18.5";
|
|
13
13
|
/** Hermes Agent(PyPI `hermes-agent`)默认钉的版本。 */
|
package/dist/agents/openclaw.cjs
CHANGED
|
@@ -36,13 +36,13 @@ function openClawPluginLayer(cliVersion, plugins) {
|
|
|
36
36
|
const identity = {
|
|
37
37
|
agent: "openclaw-plugins",
|
|
38
38
|
version: cliVersion,
|
|
39
|
-
revision: (0, exact_npm_plugins_ts_1.exactNpmPluginRevision)(plugins)
|
|
39
|
+
revision: `umask-022:${(0, exact_npm_plugins_ts_1.exactNpmPluginRevision)(plugins)}`,
|
|
40
40
|
};
|
|
41
41
|
const verifyFiles = `const fs=require("node:fs"),path=require("node:path");` +
|
|
42
42
|
`const expected=${JSON.stringify(plugins)},base=path.join(process.env.HOME,".openclaw");` +
|
|
43
43
|
`const projects=path.join(base,"npm/projects"),found=[];` +
|
|
44
44
|
`for(const dir of fs.readdirSync(projects)){const root=path.join(projects,dir),p=JSON.parse(fs.readFileSync(path.join(root,"package.json"),"utf8"));` +
|
|
45
|
-
`for(const [name,version] of Object.entries(p.dependencies||{})){const pkg=JSON.parse(fs.readFileSync(path.join(
|
|
45
|
+
`for(const [name,version] of Object.entries(p.dependencies||{})){const packageRoot=path.join(root,"node_modules",name);if(fs.statSync(packageRoot).mode&0o002)process.exit(1);const pkg=JSON.parse(fs.readFileSync(path.join(packageRoot,"package.json"),"utf8"));` +
|
|
46
46
|
`const manifest=JSON.parse(fs.readFileSync(path.join(root,"node_modules",name,"openclaw.plugin.json"),"utf8"));found.push({name,version,pkgVersion:pkg.version,id:manifest.id});}}` +
|
|
47
47
|
`if(found.length!==expected.length)process.exit(1);` +
|
|
48
48
|
`const config=JSON.parse(fs.readFileSync(path.join(base,"openclaw.json"),"utf8"));` +
|
|
@@ -55,9 +55,13 @@ function openClawPluginLayer(cliVersion, plugins) {
|
|
|
55
55
|
installMode: "sandbox-network",
|
|
56
56
|
install: async (sandbox, context) => {
|
|
57
57
|
const installs = plugins
|
|
58
|
-
.map((plugin) => `openclaw plugins install --pin ${(0, shell_ts_1.shellQuote)(plugin.spec)}`)
|
|
58
|
+
.map((plugin) => `openclaw plugins install --force --pin ${(0, shell_ts_1.shellQuote)(plugin.spec)}`)
|
|
59
59
|
.join("\n");
|
|
60
|
+
// Docker exec can inherit umask 0000. OpenClaw refuses world-writable
|
|
61
|
+
// plugin roots; use ordinary package permissions and let its native
|
|
62
|
+
// installer replace a previously blocked installation.
|
|
60
63
|
const script = `set -eu
|
|
64
|
+
umask 022
|
|
61
65
|
ids=$(openclaw plugins list --json | node -e ${(0, shell_ts_1.shellQuote)(`let s="";process.stdin.on("data",c=>s+=c).on("end",()=>{const x=JSON.parse(s);for(const p of x.plugins||[])if(p.origin==="global")console.log(p.id)})`)})
|
|
62
66
|
for id in $ids; do openclaw plugins uninstall --force "$id"; done
|
|
63
67
|
${installs}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclaw.js","sourceRoot":"","sources":["openclaw.ts"],"names":[],"mappings":"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","sourcesContent":["import { makeSandboxAgent } from \"../define.ts\";\nimport { Effect } from \"effect\";\nimport { requireEnv, getEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { mapGenericSpans } from \"../o11y/otlp/canonical.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { parseOpenClawTranscript, parseOpenClawRunJson } from \"../o11y/parsers/openclaw.ts\";\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { DEFAULT_OPENCLAW_CLI_VERSION, AGENT_BASELINE_RECIPE_REVISION } from \"./coding-cli-versions.ts\";\nimport { createNpmCliInstaller, resolveAgentBinEffect } from \"./npm-staged.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Agent, AgentSetupManifest, SkillSpec, StreamEvent, TurnEvidenceCoverage } from \"../types.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { shell } from \"../sandbox/commands.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport type { AgentEnsure, AgentInstaller } from \"./types.ts\";\nimport { exactNpmPluginRevision, normalizeExactNpmPlugins, type ExactNpmPlugin, } from \"./exact-npm-plugins.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// OpenClaw 的 agent adapter(沙箱型)。\n//\n// 连接方式:在沙箱里 spawn `openclaw agent --local --json`(嵌入式 agent 循环,不依赖\n// 长驻 gateway),读回结果封包 + session transcript → 标准事件流。方言解析全部住\n// src/o11y/parsers/openclaw.ts,不进 core(契约见 docs/feature/adapters/sdk/openclaw/README.md)。\n//\n// 行为轨优先级(collection.md):session transcript(完整工具轨迹)优先;transcript 拿不到\n// 时只保留 `--json` 封包的最终回复,不从最终文本猜工具行为——此时负断言不可信,send 会\n// 经 ctx.log 明确记录这个限制。\n// ───────────────────────────────────────────────────────────────────────────\n/** OpenClaw 的 skill 目录(`skills` 生态的「通用」目录);发现靠 AGENTS.md 指引,不依赖原生扫描。 */\nconst SKILL_DIR = \".agents/skills\";\n/** 自定义 OpenAI 兼容网关在 openclaw.json 里的 provider id。 */\nconst COMPAT_PROVIDER = \"compat\";\nexport interface OpenClawConfig {\n /** 模型 API key。省略时读 OPENCLAW_API_KEY,再回落 ANTHROPIC_API_KEY。 */\n apiKey?: string;\n /** OpenAI 兼容端点。省略时读 OPENCLAW_BASE_URL。 */\n baseUrl?: string;\n /** 固定安装的 openclaw npm 版本(如 \"1.2.3\");省略时用内置默认。 */\n version?: string;\n /**\n * 装进沙箱的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md。\n */\n skills?: SkillSpec[];\n /** Native OpenClaw plugins as exact npm package@version declarations. */\n plugins?: readonly string[];\n}\nfunction openClawPluginLayer(cliVersion: string, plugins: readonly ExactNpmPlugin[]): {\n ensure: AgentEnsure;\n installer: AgentInstaller;\n} {\n const identity = {\n agent: \"openclaw-plugins\",\n version: cliVersion,\n revision: exactNpmPluginRevision(plugins),\n };\n const verifyFiles = `const fs=require(\"node:fs\"),path=require(\"node:path\");` +\n `const expected=${JSON.stringify(plugins)},base=path.join(process.env.HOME,\".openclaw\");` +\n `const projects=path.join(base,\"npm/projects\"),found=[];` +\n `for(const dir of fs.readdirSync(projects)){const root=path.join(projects,dir),p=JSON.parse(fs.readFileSync(path.join(root,\"package.json\"),\"utf8\"));` +\n `for(const [name,version] of Object.entries(p.dependencies||{})){const pkg=JSON.parse(fs.readFileSync(path.join(root,\"node_modules\",name,\"package.json\"),\"utf8\"));` +\n `const manifest=JSON.parse(fs.readFileSync(path.join(root,\"node_modules\",name,\"openclaw.plugin.json\"),\"utf8\"));found.push({name,version,pkgVersion:pkg.version,id:manifest.id});}}` +\n `if(found.length!==expected.length)process.exit(1);` +\n `const config=JSON.parse(fs.readFileSync(path.join(base,\"openclaw.json\"),\"utf8\"));` +\n `const ordered=expected.map(e=>found.find(x=>x.name===e.name&&x.version===e.version));` +\n `for(const x of ordered){if(!x||x.pkgVersion!==x.version||!config.plugins?.entries?.[x.id]?.enabled||!/^[A-Za-z0-9._-]+$/.test(x.id))process.exit(1);}`;\n return {\n ensure: { identity, probe: shell(`node -e ${shellQuote(verifyFiles)}`) },\n installer: {\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox, context) => {\n const installs = plugins\n .map((plugin) => `openclaw plugins install --pin ${shellQuote(plugin.spec)}`)\n .join(\"\\n\");\n const script = `set -eu\nids=$(openclaw plugins list --json | node -e ${shellQuote(`let s=\"\";process.stdin.on(\"data\",c=>s+=c).on(\"end\",()=>{const x=JSON.parse(s);for(const p of x.plugins||[])if(p.origin===\"global\")console.log(p.id)})`)})\nfor id in $ids; do openclaw plugins uninstall --force \"$id\"; done\n${installs}`;\n await sandbox.runShellOrThrow(script, { signal: context.signal });\n },\n },\n };\n}\nfunction resolveApiKey(config?: OpenClawConfig): string {\n return config?.apiKey ?? getEnv(\"OPENCLAW_API_KEY\") ?? requireEnv(\"ANTHROPIC_API_KEY\");\n}\nfunction resolveBaseUrl(config?: OpenClawConfig): string | undefined {\n return config?.baseUrl ?? getEnv(\"OPENCLAW_BASE_URL\");\n}\n/** experiment.model → `--model`。裸模型名在自定义网关下补成 `compat/<model>`。 */\nfunction resolveModelFlag(model: string | undefined, hasCompatBase: boolean): string | undefined {\n if (!model)\n return undefined;\n if (model.includes(\"/\"))\n return model;\n return hasCompatBase ? `${COMPAT_PROVIDER}/${model}` : model;\n}\n/**\n * OpenClaw 的内置 sandbox Agent 工厂。复用 `defineSandboxAgent`、`shared` 安装工具、\n * `ctx.session` 存取器与 canonical OTel 通用 mapper(`mapGenericSpans`);OpenClaw 方言\n * (transcript / `agent --json` 字段)只住 `src/o11y/parsers/openclaw.ts`,不进 core。\n *\n * 会话契约:首轮显式发一个全新 session id 并 `ctx.session.capture()`(不依赖 OpenClaw 的\n * 默认主会话——否则相邻 attempt 会静默共享历史),后续轮用 `ctx.session.id` resume;\n * `t.newSession()` 后的新会话线自然拿到新 id,session 之间互相隔离。\n */\n// @concord-code ne-adapter-openclaw-agent\n// @concord-implements docs/feature/adapters/README.md\n// @concord-implements docs/feature/adapters/sdk/openclaw/README.md\nexport function openClawAgent(config?: OpenClawConfig): Agent {\n const version = config?.version ?? DEFAULT_OPENCLAW_CLI_VERSION;\n const plugins = normalizeExactNpmPlugins(config?.plugins, \"openClawAgent plugins\");\n const { ensure, installer } = createNpmCliInstaller({\n identity: {\n agent: \"openclaw\",\n version,\n revision: String(AGENT_BASELINE_RECIPE_REVISION.openclaw),\n },\n packageName: \"openclaw\",\n bin: \"openclaw\",\n });\n const pluginLayer = plugins.length === 0 ? undefined : openClawPluginLayer(version, plugins);\n return makeSandboxAgent({\n name: \"openclaw\",\n // e2e 已用真实 CLI 证明 session transcript 能给出工具轨 / 消息 / 用量;\n // 采集失败的单轮仍会在 send 里把 coverage 降成 unavailable/partial。\n evidenceCoverage: completeEvidenceCoverage,\n // OpenClaw 没有专属 span 方言 mapper:原生 span 走 canonical 通用 heuristic。\n // OTel 内容采集关闭时只影响 trace 证据面;行为轨(下面的 transcript 解析)不受影响。\n spanMapper: mapGenericSpans,\n ensure: pluginLayer === undefined ? ensure : [ensure, pluginLayer.ensure],\n installers: pluginLayer === undefined ? [installer] : [installer, pluginLayer.installer],\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n OTEL_TRACES_EXPORTER: \"otlp\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n }),\n },\n setup: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n const baseUrl = resolveBaseUrl(config);\n if (baseUrl) {\n const apiKey = resolveApiKey(config);\n // OpenAI 兼容网关走自定义 provider + openai-completions;\n // skipBootstrap 跳过首轮身份仪式,否则 agent 会先问 \"Who am I\"。\n // workspace 钉沙箱工作目录,文件工具写到 eval 可见的路径。\n let persistentConfig: globalThis.Record<string, unknown> = {};\n try {\n const existing = await sb.runShell('cat \"$HOME/.openclaw/openclaw.json\"');\n if (existing.exitCode === 0)\n persistentConfig = JSON.parse(existing.stdout);\n }\n catch {\n persistentConfig = {};\n }\n const openclawConfig = {\n ...persistentConfig,\n agents: {\n defaults: {\n skipBootstrap: true,\n workspace: sb.workdir,\n },\n },\n models: {\n mode: \"merge\",\n providers: {\n [COMPAT_PROVIDER]: {\n baseUrl,\n apiKey,\n api: \"openai-completions\",\n models: [\n { id: \"gpt-5.6-luna\", name: \"gpt-5.6-luna\" },\n { id: \"gpt-6-luna\", name: \"gpt-6-luna\" },\n { id: \"gpt-5.4-mini\", name: \"gpt-5.4-mini\" },\n { id: \"gpt-5.4\", name: \"gpt-5.4\" },\n ],\n },\n },\n },\n };\n await shared.writeFile(sb, \"~/.openclaw/openclaw.json\", JSON.stringify(openclawConfig, null, 2), { sensitiveValues: [apiKey] });\n // 预置最小身份文件,避免缺 IDENTITY 时仍触发仪式文案。\n await shared.writeFile(sb, `${sb.workdir}/IDENTITY.md`, \"# Identity\\n\\nName: niceeval\\nEmoji: ✓\\n\");\n await shared.writeFile(sb, `${sb.workdir}/USER.md`, \"# User\\n\\nEval harness operator.\\n\");\n await shared.writeFile(sb, `${sb.workdir}/SOUL.md`, \"# Soul\\n\\nExecute the user's task directly. Do not ask who you are.\\n\");\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // 发现指引跟着一起写:不提示 = 白装。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (manifest.skills.length) {\n ctx.reportSetup(manifest);\n }\n },\n catch: (cause) => cause,\n }),\n send: (input, ctx) => Effect.gen(function* () {\n const sb = ctx.sandbox;\n const openclawBin = yield* resolveAgentBinEffect(sb, \"openclaw\");\n return yield* Effect.tryPromise({\n try: async (signal) => {\n // 会话契约:新会话线显式发新 session id(隔离);后续轮 resume 记录的 id。\n const sessionId = ctx.session.id ?? `niceeval-${sb.sandboxId}-${randomUUID().slice(0, 8)}`;\n ctx.session.capture(sessionId);\n const baseUrl = resolveBaseUrl(config);\n const args = [\"agent\", \"--local\", \"--session-id\", sessionId, \"--message\", input.text, \"--json\"];\n const model = resolveModelFlag(ctx.model, Boolean(baseUrl));\n if (model)\n args.push(\"--model\", model);\n const apiKey = resolveApiKey(config);\n const env: globalThis.Record<string, string> = {\n OPENCLAW_API_KEY: apiKey,\n ANTHROPIC_API_KEY: apiKey,\n OPENAI_API_KEY: apiKey,\n ...ctx.telemetry?.env,\n };\n if (baseUrl) {\n env.OPENCLAW_BASE_URL = baseUrl;\n env.OPENAI_BASE_URL = baseUrl;\n }\n const res = await sb.runCommand(openclawBin, args, {\n env,\n sensitiveValues: [apiKey],\n stream: true,\n signal,\n });\n const runJson = parseOpenClawRunJson(res.stdout);\n // 封包若带回服务端分配的 session key,后续轮以它为准(capture first-writer-wins,\n // 首轮已用自发 id 落地时不覆盖)。\n ctx.session.capture(runJson.sessionId);\n // 完整工具轨迹的唯一来源:session transcript。\n // 优先读封包给出的 sessionFile(精确);否则在 agents 目录取最新 *.jsonl,\n // 但排除同目录旁路产物 *.trajectory.jsonl(mtime 常更新、却不是消息轨——\n // 误读会导致 events 为空、整轮 coverage 降成 unavailable)。\n let raw: string | undefined;\n if (runJson.sessionFile) {\n try {\n raw = await sb.readText(runJson.sessionFile);\n }\n catch {\n raw = undefined;\n }\n }\n if (raw === undefined) {\n raw = await shared.captureLatestJsonl(sb, \"~/.openclaw/agents\", {\n excludeName: /\\.trajectory\\.jsonl$/i,\n });\n }\n const parsed = parseOpenClawTranscript(raw);\n const events: StreamEvent[] = [...parsed.events];\n // transcript 缺失 / 有解析不了的行:这一轮的工具轨迹不可信,coverage 降级说出来\n // (负断言由此落 unavailable,而不是在空流上假通过),不从最终文本猜工具行为。\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (raw === undefined || parsed.events.length === 0) {\n const reason = \"session transcript unavailable; only the --json final reply was collected\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n ctx.log(\"openclaw transcript unavailable: tool trajectory missing for this turn, negative assertions are unreliable\");\n if (runJson.text)\n events.push({ type: \"message\", role: \"assistant\", text: runJson.text });\n }\n else if (!parsed.parseSuccess) {\n const reason = \"some transcript lines could not be parsed\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n // 用量:transcript 逐消息累加优先;transcript 没报时用封包摘要,都没有就是空对象。\n const usage = (parsed.usage.inputTokens ?? 0) > 0 || (parsed.usage.outputTokens ?? 0) > 0\n ? parsed.usage\n : (runJson.usage ?? parsed.usage);\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage,\n process: res,\n });\n }\n if (runJson.failed)\n events.push({ type: \"error\", message: shared.diagnoseFailure(res, parsed.events, raw) });\n return {\n events,\n usage,\n status: runJson.failed ? \"failed\" as const : \"completed\" as const,\n ...(turnEvidenceCoverage ? { evidenceCoverage: turnEvidenceCoverage } : {}),\n };\n },\n catch: (cause) => cause,\n });\n }),\n });\n}\nexport default openClawAgent();\n"]}
|
|
1
|
+
{"version":3,"file":"openclaw.js","sourceRoot":"","sources":["openclaw.ts"],"names":[],"mappings":"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","sourcesContent":["import { makeSandboxAgent } from \"../define.ts\";\nimport { Effect } from \"effect\";\nimport { requireEnv, getEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { mapGenericSpans } from \"../o11y/otlp/canonical.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { parseOpenClawTranscript, parseOpenClawRunJson } from \"../o11y/parsers/openclaw.ts\";\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { DEFAULT_OPENCLAW_CLI_VERSION, AGENT_BASELINE_RECIPE_REVISION } from \"./coding-cli-versions.ts\";\nimport { createNpmCliInstaller, resolveAgentBinEffect } from \"./npm-staged.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Agent, AgentSetupManifest, SkillSpec, StreamEvent, TurnEvidenceCoverage } from \"../types.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { shell } from \"../sandbox/commands.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport type { AgentEnsure, AgentInstaller } from \"./types.ts\";\nimport { exactNpmPluginRevision, normalizeExactNpmPlugins, type ExactNpmPlugin, } from \"./exact-npm-plugins.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// OpenClaw 的 agent adapter(沙箱型)。\n//\n// 连接方式:在沙箱里 spawn `openclaw agent --local --json`(嵌入式 agent 循环,不依赖\n// 长驻 gateway),读回结果封包 + session transcript → 标准事件流。方言解析全部住\n// src/o11y/parsers/openclaw.ts,不进 core(契约见 docs/feature/adapters/sdk/openclaw/README.md)。\n//\n// 行为轨优先级(collection.md):session transcript(完整工具轨迹)优先;transcript 拿不到\n// 时只保留 `--json` 封包的最终回复,不从最终文本猜工具行为——此时负断言不可信,send 会\n// 经 ctx.log 明确记录这个限制。\n// ───────────────────────────────────────────────────────────────────────────\n/** OpenClaw 的 skill 目录(`skills` 生态的「通用」目录);发现靠 AGENTS.md 指引,不依赖原生扫描。 */\nconst SKILL_DIR = \".agents/skills\";\n/** 自定义 OpenAI 兼容网关在 openclaw.json 里的 provider id。 */\nconst COMPAT_PROVIDER = \"compat\";\nexport interface OpenClawConfig {\n /** 模型 API key。省略时读 OPENCLAW_API_KEY,再回落 ANTHROPIC_API_KEY。 */\n apiKey?: string;\n /** OpenAI 兼容端点。省略时读 OPENCLAW_BASE_URL。 */\n baseUrl?: string;\n /** 固定安装的 openclaw npm 版本(如 \"1.2.3\");省略时用内置默认。 */\n version?: string;\n /**\n * 装进沙箱的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md。\n */\n skills?: SkillSpec[];\n /** Native OpenClaw plugins as exact npm package@version declarations. */\n plugins?: readonly string[];\n}\nfunction openClawPluginLayer(cliVersion: string, plugins: readonly ExactNpmPlugin[]): {\n ensure: AgentEnsure;\n installer: AgentInstaller;\n} {\n const identity = {\n agent: \"openclaw-plugins\",\n version: cliVersion,\n revision: `umask-022:${exactNpmPluginRevision(plugins)}`,\n };\n const verifyFiles = `const fs=require(\"node:fs\"),path=require(\"node:path\");` +\n `const expected=${JSON.stringify(plugins)},base=path.join(process.env.HOME,\".openclaw\");` +\n `const projects=path.join(base,\"npm/projects\"),found=[];` +\n `for(const dir of fs.readdirSync(projects)){const root=path.join(projects,dir),p=JSON.parse(fs.readFileSync(path.join(root,\"package.json\"),\"utf8\"));` +\n `for(const [name,version] of Object.entries(p.dependencies||{})){const packageRoot=path.join(root,\"node_modules\",name);if(fs.statSync(packageRoot).mode&0o002)process.exit(1);const pkg=JSON.parse(fs.readFileSync(path.join(packageRoot,\"package.json\"),\"utf8\"));` +\n `const manifest=JSON.parse(fs.readFileSync(path.join(root,\"node_modules\",name,\"openclaw.plugin.json\"),\"utf8\"));found.push({name,version,pkgVersion:pkg.version,id:manifest.id});}}` +\n `if(found.length!==expected.length)process.exit(1);` +\n `const config=JSON.parse(fs.readFileSync(path.join(base,\"openclaw.json\"),\"utf8\"));` +\n `const ordered=expected.map(e=>found.find(x=>x.name===e.name&&x.version===e.version));` +\n `for(const x of ordered){if(!x||x.pkgVersion!==x.version||!config.plugins?.entries?.[x.id]?.enabled||!/^[A-Za-z0-9._-]+$/.test(x.id))process.exit(1);}`;\n return {\n ensure: { identity, probe: shell(`node -e ${shellQuote(verifyFiles)}`) },\n installer: {\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox, context) => {\n const installs = plugins\n .map((plugin) => `openclaw plugins install --force --pin ${shellQuote(plugin.spec)}`)\n .join(\"\\n\");\n // Docker exec can inherit umask 0000. OpenClaw refuses world-writable\n // plugin roots; use ordinary package permissions and let its native\n // installer replace a previously blocked installation.\n const script = `set -eu\numask 022\nids=$(openclaw plugins list --json | node -e ${shellQuote(`let s=\"\";process.stdin.on(\"data\",c=>s+=c).on(\"end\",()=>{const x=JSON.parse(s);for(const p of x.plugins||[])if(p.origin===\"global\")console.log(p.id)})`)})\nfor id in $ids; do openclaw plugins uninstall --force \"$id\"; done\n${installs}`;\n await sandbox.runShellOrThrow(script, { signal: context.signal });\n },\n },\n };\n}\nfunction resolveApiKey(config?: OpenClawConfig): string {\n return config?.apiKey ?? getEnv(\"OPENCLAW_API_KEY\") ?? requireEnv(\"ANTHROPIC_API_KEY\");\n}\nfunction resolveBaseUrl(config?: OpenClawConfig): string | undefined {\n return config?.baseUrl ?? getEnv(\"OPENCLAW_BASE_URL\");\n}\n/** experiment.model → `--model`。裸模型名在自定义网关下补成 `compat/<model>`。 */\nfunction resolveModelFlag(model: string | undefined, hasCompatBase: boolean): string | undefined {\n if (!model)\n return undefined;\n if (model.includes(\"/\"))\n return model;\n return hasCompatBase ? `${COMPAT_PROVIDER}/${model}` : model;\n}\n/**\n * OpenClaw 的内置 sandbox Agent 工厂。复用 `defineSandboxAgent`、`shared` 安装工具、\n * `ctx.session` 存取器与 canonical OTel 通用 mapper(`mapGenericSpans`);OpenClaw 方言\n * (transcript / `agent --json` 字段)只住 `src/o11y/parsers/openclaw.ts`,不进 core。\n *\n * 会话契约:首轮显式发一个全新 session id 并 `ctx.session.capture()`(不依赖 OpenClaw 的\n * 默认主会话——否则相邻 attempt 会静默共享历史),后续轮用 `ctx.session.id` resume;\n * `t.newSession()` 后的新会话线自然拿到新 id,session 之间互相隔离。\n */\n// @concord-code ne-adapter-openclaw-agent\n// @concord-implements docs/feature/adapters/README.md\n// @concord-implements docs/feature/adapters/sdk/openclaw/README.md\nexport function openClawAgent(config?: OpenClawConfig): Agent {\n const version = config?.version ?? DEFAULT_OPENCLAW_CLI_VERSION;\n const plugins = normalizeExactNpmPlugins(config?.plugins, \"openClawAgent plugins\");\n const { ensure, installer } = createNpmCliInstaller({\n identity: {\n agent: \"openclaw\",\n version,\n revision: String(AGENT_BASELINE_RECIPE_REVISION.openclaw),\n },\n packageName: \"openclaw\",\n bin: \"openclaw\",\n });\n const pluginLayer = plugins.length === 0 ? undefined : openClawPluginLayer(version, plugins);\n return makeSandboxAgent({\n name: \"openclaw\",\n // e2e 已用真实 CLI 证明 session transcript 能给出工具轨 / 消息 / 用量;\n // 采集失败的单轮仍会在 send 里把 coverage 降成 unavailable/partial。\n evidenceCoverage: completeEvidenceCoverage,\n // OpenClaw 没有专属 span 方言 mapper:原生 span 走 canonical 通用 heuristic。\n // OTel 内容采集关闭时只影响 trace 证据面;行为轨(下面的 transcript 解析)不受影响。\n spanMapper: mapGenericSpans,\n ensure: pluginLayer === undefined ? ensure : [ensure, pluginLayer.ensure],\n installers: pluginLayer === undefined ? [installer] : [installer, pluginLayer.installer],\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n OTEL_TRACES_EXPORTER: \"otlp\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n }),\n },\n setup: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n const baseUrl = resolveBaseUrl(config);\n if (baseUrl) {\n const apiKey = resolveApiKey(config);\n // OpenAI 兼容网关走自定义 provider + openai-completions;\n // skipBootstrap 跳过首轮身份仪式,否则 agent 会先问 \"Who am I\"。\n // workspace 钉沙箱工作目录,文件工具写到 eval 可见的路径。\n let persistentConfig: globalThis.Record<string, unknown> = {};\n try {\n const existing = await sb.runShell('cat \"$HOME/.openclaw/openclaw.json\"');\n if (existing.exitCode === 0)\n persistentConfig = JSON.parse(existing.stdout);\n }\n catch {\n persistentConfig = {};\n }\n const openclawConfig = {\n ...persistentConfig,\n agents: {\n defaults: {\n skipBootstrap: true,\n workspace: sb.workdir,\n },\n },\n models: {\n mode: \"merge\",\n providers: {\n [COMPAT_PROVIDER]: {\n baseUrl,\n apiKey,\n api: \"openai-completions\",\n models: [\n { id: \"gpt-5.6-luna\", name: \"gpt-5.6-luna\" },\n { id: \"gpt-6-luna\", name: \"gpt-6-luna\" },\n { id: \"gpt-5.4-mini\", name: \"gpt-5.4-mini\" },\n { id: \"gpt-5.4\", name: \"gpt-5.4\" },\n ],\n },\n },\n },\n };\n await shared.writeFile(sb, \"~/.openclaw/openclaw.json\", JSON.stringify(openclawConfig, null, 2), { sensitiveValues: [apiKey] });\n // 预置最小身份文件,避免缺 IDENTITY 时仍触发仪式文案。\n await shared.writeFile(sb, `${sb.workdir}/IDENTITY.md`, \"# Identity\\n\\nName: niceeval\\nEmoji: ✓\\n\");\n await shared.writeFile(sb, `${sb.workdir}/USER.md`, \"# User\\n\\nEval harness operator.\\n\");\n await shared.writeFile(sb, `${sb.workdir}/SOUL.md`, \"# Soul\\n\\nExecute the user's task directly. Do not ask who you are.\\n\");\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // 发现指引跟着一起写:不提示 = 白装。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (manifest.skills.length) {\n ctx.reportSetup(manifest);\n }\n },\n catch: (cause) => cause,\n }),\n send: (input, ctx) => Effect.gen(function* () {\n const sb = ctx.sandbox;\n const openclawBin = yield* resolveAgentBinEffect(sb, \"openclaw\");\n return yield* Effect.tryPromise({\n try: async (signal) => {\n // 会话契约:新会话线显式发新 session id(隔离);后续轮 resume 记录的 id。\n const sessionId = ctx.session.id ?? `niceeval-${sb.sandboxId}-${randomUUID().slice(0, 8)}`;\n ctx.session.capture(sessionId);\n const baseUrl = resolveBaseUrl(config);\n const args = [\"agent\", \"--local\", \"--session-id\", sessionId, \"--message\", input.text, \"--json\"];\n const model = resolveModelFlag(ctx.model, Boolean(baseUrl));\n if (model)\n args.push(\"--model\", model);\n const apiKey = resolveApiKey(config);\n const env: globalThis.Record<string, string> = {\n OPENCLAW_API_KEY: apiKey,\n ANTHROPIC_API_KEY: apiKey,\n OPENAI_API_KEY: apiKey,\n ...ctx.telemetry?.env,\n };\n if (baseUrl) {\n env.OPENCLAW_BASE_URL = baseUrl;\n env.OPENAI_BASE_URL = baseUrl;\n }\n const res = await sb.runCommand(openclawBin, args, {\n env,\n sensitiveValues: [apiKey],\n stream: true,\n signal,\n });\n const runJson = parseOpenClawRunJson(res.stdout);\n // 封包若带回服务端分配的 session key,后续轮以它为准(capture first-writer-wins,\n // 首轮已用自发 id 落地时不覆盖)。\n ctx.session.capture(runJson.sessionId);\n // 完整工具轨迹的唯一来源:session transcript。\n // 优先读封包给出的 sessionFile(精确);否则在 agents 目录取最新 *.jsonl,\n // 但排除同目录旁路产物 *.trajectory.jsonl(mtime 常更新、却不是消息轨——\n // 误读会导致 events 为空、整轮 coverage 降成 unavailable)。\n let raw: string | undefined;\n if (runJson.sessionFile) {\n try {\n raw = await sb.readText(runJson.sessionFile);\n }\n catch {\n raw = undefined;\n }\n }\n if (raw === undefined) {\n raw = await shared.captureLatestJsonl(sb, \"~/.openclaw/agents\", {\n excludeName: /\\.trajectory\\.jsonl$/i,\n });\n }\n const parsed = parseOpenClawTranscript(raw);\n const events: StreamEvent[] = [...parsed.events];\n // transcript 缺失 / 有解析不了的行:这一轮的工具轨迹不可信,coverage 降级说出来\n // (负断言由此落 unavailable,而不是在空流上假通过),不从最终文本猜工具行为。\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (raw === undefined || parsed.events.length === 0) {\n const reason = \"session transcript unavailable; only the --json final reply was collected\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n ctx.log(\"openclaw transcript unavailable: tool trajectory missing for this turn, negative assertions are unreliable\");\n if (runJson.text)\n events.push({ type: \"message\", role: \"assistant\", text: runJson.text });\n }\n else if (!parsed.parseSuccess) {\n const reason = \"some transcript lines could not be parsed\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n // 用量:transcript 逐消息累加优先;transcript 没报时用封包摘要,都没有就是空对象。\n const usage = (parsed.usage.inputTokens ?? 0) > 0 || (parsed.usage.outputTokens ?? 0) > 0\n ? parsed.usage\n : (runJson.usage ?? parsed.usage);\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage,\n process: res,\n });\n }\n if (runJson.failed)\n events.push({ type: \"error\", message: shared.diagnoseFailure(res, parsed.events, raw) });\n return {\n events,\n usage,\n status: runJson.failed ? \"failed\" as const : \"completed\" as const,\n ...(turnEvidenceCoverage ? { evidenceCoverage: turnEvidenceCoverage } : {}),\n };\n },\n catch: (cause) => cause,\n });\n }),\n });\n}\nexport default openClawAgent();\n"]}
|
|
@@ -23,7 +23,7 @@ NiceEval 只读取构建结果的 ID,不提供跨 Provider 的构建命令。D
|
|
|
23
23
|
|
|
24
24
|
- Codex 送进 Sandbox 的是自带运行时的原生安装包,镜像里没有 Node 也能装。
|
|
25
25
|
- Claude Code 要求镜像里有 npm。
|
|
26
|
-
- 默认的 Bub 0.
|
|
26
|
+
- 默认的 Bub 0.5.1 除了 OTel 插件,还固定了 `any-llm-sdk==1.22.1` 和 `openai==2.31.0`。Bub 版本、这两个依赖、OTel 插件或 Python 插件列表任何一项变了,都会重新安装,不能只凭 `command -v bub` 判断已经装好。用旧安装标记做的预制环境会重装一次。你显式选了其它 Bub 版本时,它依赖的其它包由你自己负责。
|
|
27
27
|
|
|
28
28
|
## 从官方基线继续构建
|
|
29
29
|
|