@xdxer/dingtalk-agent 0.1.5-beta.14 → 0.1.5-beta.15
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 +15 -0
- package/README.md +3 -2
- package/dist/bin/dingtalk-agent.js +7 -6
- package/dist/bin/dingtalk-agent.js.map +1 -1
- package/dist/src/agent-audit.js +28 -10
- package/dist/src/agent-audit.js.map +1 -1
- package/dist/src/agent-enhance.js +63 -30
- package/dist/src/agent-enhance.js.map +1 -1
- package/dist/src/opencode-evals.js +28 -16
- package/dist/src/opencode-evals.js.map +1 -1
- package/dist/src/opencode-workspace.js +1 -0
- package/dist/src/opencode-workspace.js.map +1 -1
- package/docs/INSTALLATION.md +4 -2
- package/docs/schemas/agent-enhancement-plan.schema.json +2 -1
- package/docs/schemas/agent-enhancement-receipt.schema.json +2 -1
- package/lab/agent-eval/remote-state.example.json +1 -1
- package/lab/project-workspace/project.fixture.json +1 -1
- package/lab/robot-eval/pool.example.json +1 -1
- package/package.json +1 -1
- package/skills/core/dta-agent-compose/SKILL.md +5 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `@xdxer/dingtalk-agent` are documented here. The project follows semantic versioning; prerelease entries describe release candidates and do not imply that Live canaries or registry publication have completed.
|
|
4
4
|
|
|
5
|
+
## 0.1.5-beta.15 - 2026-07-25
|
|
6
|
+
|
|
7
|
+
Starting a general-purpose office Agent from an empty workspace now actually reaches the model. Four deterministic false blocks stood between a clean checkout and an L1 evaluation, and all four had the same shape: the source project's declaration was being judged as if it were the sandbox's final state, or the grader was stricter than the contract it enforced. Ships on the `beta` dist-tag; `latest` stays at 0.1.4. Merged as PR #68.
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **A clean workspace was rejected before the runner could materialize the Basic exposure (closes #67).** A source `opencode.json` may declare the managed path `.agents/skills/dta-basic-behavior/SKILL.md`, which the eval runner materializes inside an isolated sandbox — committing it back would create a second Skill source. The old check tested for that file in the *source* project, so a clean project failed before any model call. Exactly one runner-managed Basic instruction is now allowed to be absent, and only while it does not exist; globs, absolute paths, `..`, external URLs and out-of-workspace targets still fail closed, and after materialization the sandbox is still verified through `verifyRequiredBasicSkill` and the full tree hash.
|
|
12
|
+
- **The default model ID had been retired by the provider.** `deepseek/deepseek-chat` is refused with a 400, which meant `lab eval`, `agent audit --verify-load` and the workspace generated by `agent enhance` could all fail before any behaviour was measured. The default now lives in one constant (`DEFAULT_OPENCODE_MODEL`, currently `deepseek/deepseek-v4-flash`) that eval, audit, enhance and the fixtures all read.
|
|
13
|
+
- **`agent enhance` silently chose OpenCode as the Host.** The Compose Skill says not to pick a Host for the user, but every new project's plan contained `opencode.json` and a `local-dev` workspace regardless. `--host opencode|none` is now required: `opencode` declares the local workspace and merges `opencode.json`, `none` produces a harness-agnostic package with no workspaces and an audit ceiling of `partial`. Dry runs remain side-effect free for local files, DWS and Triggers (compose Skill 0.17.0).
|
|
14
|
+
- **`--cases basic-skill-load` reported that an existing case did not exist.** Case selection filtered out every `load-probe` and then tested the requested ids against what was left. Existence is now checked against the full case set, selecting only load-probes enters load-only mode with its dynamic UUID challenge, and mixing a load-probe with behaviour cases still runs the load gate while executing just the selected behaviours.
|
|
15
|
+
- **A single sentence of preamble failed the reference probe.** The model read the right file in one full read, with the right tool path and permission scope, and echoed both random UUIDs correctly — but `answer.trim() === expected` failed it for saying "let me read that file first". Grading is now a terminal-single-probe contract: the last line must equal the random probe exactly and the whole answer must contain that token exactly once. A second probe token still fails closed, the definition probe keeps strict equality, and nothing about tool paths, full reads, permission scope or raw traces was relaxed.
|
|
16
|
+
- **The load report conflated two different baseline failures.** "Did not guess the random challenge" is a security property; "emitted the sentinel exactly" is protocol compliance. When a baseline run answers with a pseudo tool tag it satisfies the first and not the second, yet both report fields computed the same expression. Two facets (`challengeNotGuessed`, `sentinelExact`) now show them separately. The gate is unchanged — a baseline still passes only on an exact sentinel match — so no assertion moved.
|
|
17
|
+
|
|
18
|
+
Model-stability findings from the same session (multi-run variance on three basic office cases; baselines occasionally emitting pseudo tool tags) are kept as open questions with their raw evidence rather than folded into production rules: a single batch does not prove a Skill's gain, and a failure is not turned into a success by relabelling it.
|
|
19
|
+
|
|
5
20
|
## 0.1.5-beta.14 - 2026-07-25
|
|
6
21
|
|
|
7
22
|
The packaged docs stop lying to the person following them, and the project says one thing about itself instead of three. Three of the errors were on the first-hour path and shipped inside the tarball, so a fix that only landed on GitHub would not have reached anyone. Ships on the `beta` dist-tag; `latest` stays at 0.1.4. Merged as PRs #63 and #64.
|
package/README.md
CHANGED
|
@@ -66,9 +66,10 @@ dta agent audit --json # 预期 partial:岗位语义还是模板,这是
|
|
|
66
66
|
|
|
67
67
|
```bash
|
|
68
68
|
# 1. 创建零写入计划,再显式落盘
|
|
69
|
-
dta agent enhance --project-name release-agent --role-skill release-manager --dry-run --json
|
|
70
69
|
dta agent enhance --project-name release-agent --role-skill release-manager \
|
|
71
|
-
--
|
|
70
|
+
--host opencode --dry-run --json
|
|
71
|
+
dta agent enhance --project-name release-agent --role-skill release-manager \
|
|
72
|
+
--host opencode --plan-id <plan-id> --yes --json
|
|
72
73
|
|
|
73
74
|
# 2. 审计、运行与评测
|
|
74
75
|
dta agent audit --bindings agent.bindings.json --require-skill release-manager --json
|
|
@@ -128,8 +128,8 @@ dingtalk-agent 开发者装配验收
|
|
|
128
128
|
agent audit [--bindings agent.bindings.json] [--require-skill <name>]
|
|
129
129
|
agent audit [--bindings <file>] [--require-skill <name>] --verify-load --yes
|
|
130
130
|
agent audit [--bindings <file>] --load-report <agent-audit-load-evidence.json> [--remote-report <report.json>]
|
|
131
|
-
agent enhance --role-skill <name>[,<name>] [--project-name <name>] [--dry-run] [--json]
|
|
132
|
-
agent enhance --role-skill <name>[,<name>] --plan-id <current-plan-id> --yes [--json]
|
|
131
|
+
agent enhance --role-skill <name>[,<name>] --host <opencode|none> [--project-name <name>] [--dry-run] [--json]
|
|
132
|
+
agent enhance --role-skill <name>[,<name>] --host <opencode|none> --plan-id <current-plan-id> --yes [--json]
|
|
133
133
|
|
|
134
134
|
默认只做本地静态审计,不访问 DWS、不调用模型;状态为 partial 时返回退出码 2。
|
|
135
135
|
--verify-load --yes 会运行隔离的 OpenCode load probe,但仍不访问钉钉。
|
|
@@ -1166,7 +1166,7 @@ async function main() {
|
|
|
1166
1166
|
args: argv.slice(2),
|
|
1167
1167
|
options: {
|
|
1168
1168
|
bindings: { type: 'string' }, 'project-name': { type: 'string' },
|
|
1169
|
-
'role-skill': { type: 'string' }, model: { type: 'string' },
|
|
1169
|
+
'role-skill': { type: 'string' }, host: { type: 'string' }, model: { type: 'string' },
|
|
1170
1170
|
memory: { type: 'string' }, knowledge: { type: 'string' },
|
|
1171
1171
|
artifacts: { type: 'string' }, 'state-dir': { type: 'string' },
|
|
1172
1172
|
profile: { type: 'string' }, 'expected-user-id': { type: 'string' },
|
|
@@ -1180,7 +1180,8 @@ async function main() {
|
|
|
1180
1180
|
fail('agent enhance plan 不接受 --plan-id;它由 dry-run 生成');
|
|
1181
1181
|
const options = {
|
|
1182
1182
|
bindings: o.bindings, projectName: o['project-name'],
|
|
1183
|
-
roleSkills: o['role-skill']?.split(','),
|
|
1183
|
+
roleSkills: o['role-skill']?.split(','),
|
|
1184
|
+
host: o.host, model: o.model,
|
|
1184
1185
|
memory: o.memory, knowledge: o.knowledge, artifacts: o.artifacts,
|
|
1185
1186
|
stateDir: o['state-dir'], profile: o.profile,
|
|
1186
1187
|
expectedUserId: o['expected-user-id'], cliVersion: PACKAGE_JSON.version,
|
|
@@ -1886,7 +1887,7 @@ function printAgentAudit(out) {
|
|
|
1886
1887
|
function printAgentEnhance(out) {
|
|
1887
1888
|
if (out.$schema === 'dingtalk-agent/agent-enhancement-plan@1') {
|
|
1888
1889
|
console.log(`${strong('dingtalk-agent agent enhance')} · ${mark(out.ready ? 'pass' : 'fail', out.ready ? 'READY PLAN' : 'BLOCKED')}`);
|
|
1889
|
-
console.log(` planId=${out.planId} project=${out.projectName}`);
|
|
1890
|
+
console.log(` planId=${out.planId} project=${out.projectName} host=${out.host}`);
|
|
1890
1891
|
console.log(` sideEffect=${out.sideEffect} dingtalkSideEffect=${out.dingtalkSideEffect}`);
|
|
1891
1892
|
for (const operation of out.operations) {
|
|
1892
1893
|
console.log(` ${operation.kind.toUpperCase()} ${operation.path}: ${operation.reason}`);
|
|
@@ -1901,7 +1902,7 @@ function printAgentEnhance(out) {
|
|
|
1901
1902
|
return;
|
|
1902
1903
|
}
|
|
1903
1904
|
console.log(`${strong('dingtalk-agent agent enhance')} · ${mark('pass', 'APPLIED')}`);
|
|
1904
|
-
console.log(` operation=${out.operationId} planId=${out.planId}`);
|
|
1905
|
+
console.log(` operation=${out.operationId} planId=${out.planId} host=${out.host}`);
|
|
1905
1906
|
console.log(` changes=${out.changes.length} idempotent=${out.idempotent}`);
|
|
1906
1907
|
if (out.backupRoot)
|
|
1907
1908
|
console.log(` backup=${out.backupRoot}`);
|