dsh-decision-layer 0.6.3 → 0.6.4
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/README.en.md +2 -2
- package/README.md +2 -2
- package/lib/client.js +6 -1
- package/package.json +1 -1
- package/service/self-check.mjs +11 -3
package/README.en.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
`dsh-decision-layer` adds structured, explicitly scoped decisions to the DeepSeek Harness (DSH) agent loop, backed by a pluggable adjudication backend. Dangerous-call gating, output self-check, tool narrowing, and loop prevention hook into the agent loop as automatic interventions.
|
|
6
6
|
|
|
7
|
-
> **0.6.
|
|
7
|
+
> **0.6.4 is a preview release.** The plugin works, but how much real value the adjudication interventions add is still being explored — every threshold is an unvalidated heuristic default. Treat it as something to observe, not a proven guarantee of impact. See [ROADMAP.md](<ROADMAP.md>) for scope and progress.
|
|
8
8
|
|
|
9
9
|
## Installation
|
|
10
10
|
|
|
@@ -50,4 +50,4 @@ Restart `dsh web` and refresh after installing or updating: the host and client
|
|
|
50
50
|
|
|
51
51
|
## Safety boundary and development
|
|
52
52
|
|
|
53
|
-
Automatic intervention only subtracts: the gate only denies, narrowing only removes tools, and neither grants new permissions. The gate defers to native DSH approval on backend failure rather than allowing; self-check, narrowing, and loop-guard errors skip intervention. The redacted summary sent to the backend carries only tool name and command/path with secret redaction — never file content. Node.js `>=20.11`; `npm test` and `npm run build:client` run local checks. Rebuild and commit `lib/client.js` with any client change. 0.6.
|
|
53
|
+
Automatic intervention only subtracts: the gate only denies, narrowing only removes tools, and neither grants new permissions. The gate defers to native DSH approval on backend failure rather than allowing; self-check, narrowing, and loop-guard errors skip intervention. The redacted summary sent to the backend carries only tool name and command/path with secret redaction — never file content. Node.js `>=20.11`; `npm test` and `npm run build:client` run local checks. Rebuild and commit `lib/client.js` with any client change. 0.6.4 is a preview: the interventions work, but their real value and thresholds are still being explored — feedback on misjudgments and feel observed in the decision log is welcome.
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
DeepSeek Harness(DSH)的结构化裁决插件。它把有明确判断标准的问题交给同协议的裁决后端,供 agent 在需要时使用,并在 agent loop 上接入危险门控、产出自检、工具收窄和防循环等自动介入。
|
|
6
6
|
|
|
7
|
-
> **0.6.
|
|
7
|
+
> **0.6.4 是体验版。** 插件功能已可用,但裁决介入能带来多少实际价值仍在探索中——各决策点的阈值都是未经验证的启发式默认值,建议先以观察心态体验,别当成经过验证的效果保证。功能与后续进度以 [ROADMAP.md](<ROADMAP.md>) 为准。
|
|
8
8
|
|
|
9
9
|
## 安装
|
|
10
10
|
|
|
@@ -54,4 +54,4 @@ dsh plugin --profile web add file:/绝对路径/dsh-decision-layer
|
|
|
54
54
|
|
|
55
55
|
## 开发
|
|
56
56
|
|
|
57
|
-
服务端使用 Node.js `>=20.11`(`.mjs`,无需构建);客户端用 TypeScript + esbuild 构建。`npm test` 跑本地测试,`npm run build:client` 生成 `lib/client.js`。改动客户端后需重建并连同 `lib/client.js` 一起提交,否则 GitHub 安装拿到的是旧 bundle。0.6.
|
|
57
|
+
服务端使用 Node.js `>=20.11`(`.mjs`,无需构建);客户端用 TypeScript + esbuild 构建。`npm test` 跑本地测试,`npm run build:client` 生成 `lib/client.js`。改动客户端后需重建并连同 `lib/client.js` 一起提交,否则 GitHub 安装拿到的是旧 bundle。0.6.4 为体验版:介入能力已可用,但实际价值与阈值仍在探索,欢迎反馈决策日志观察到的误判与体感。
|
package/lib/client.js
CHANGED
|
@@ -452,7 +452,11 @@ function renderGate({ t }, entry) {
|
|
|
452
452
|
}
|
|
453
453
|
function renderCheck({ t }, entry) {
|
|
454
454
|
const label = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { title: t("logCheckHint"), children: t("logCheck") });
|
|
455
|
-
const subject = entry.subject ? /* @__PURE__ */ (0, import_jsx_runtime.
|
|
455
|
+
const subject = entry.subject ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "decision-log-subject", title: `${t("logSubjectLabel")}${entry.subject}`, children: [
|
|
456
|
+
"\u300C",
|
|
457
|
+
entry.subject.length > 60 ? `${entry.subject.slice(0, 60)}\u2026` : entry.subject,
|
|
458
|
+
"\u300D"
|
|
459
|
+
] }) : null;
|
|
456
460
|
if (entry.outcome === "error") return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
457
461
|
label,
|
|
458
462
|
subject ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
@@ -1647,6 +1651,7 @@ var css = `
|
|
|
1647
1651
|
.decision-rate-summary{margin-top:.5rem}
|
|
1648
1652
|
.decision-log-tool{font-size:.76rem;padding:.05rem .35rem;border-radius:5px;background:var(--dsw-alias-bg-layer-1,#f2f4f6);color:var(--dsw-alias-label-primary,#202124)}
|
|
1649
1653
|
.decision-log-cmd{font-size:.74rem;padding:.05rem .35rem;border-radius:5px;background:var(--dsw-alias-bg-layer-1,#f2f4f6);color:var(--dsw-alias-label-secondary,#59636e);word-break:break-all}
|
|
1654
|
+
.decision-log-subject{font-size:.74rem;color:var(--dsw-alias-label-secondary,#59636e);font-style:italic}
|
|
1650
1655
|
.decision-log-verdict{font-weight:600}
|
|
1651
1656
|
.decision-log-deny .decision-log-verdict{color:#c0392b}
|
|
1652
1657
|
.decision-log-ok .decision-log-verdict{color:#1f8a70}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-decision-layer",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"description": "A structured decision layer for the DeepSeek Harness agent loop: a danger-call gate, output self-check, tool narrowing, and loop guard backed by a pluggable adjudication model.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|
package/service/self-check.mjs
CHANGED
|
@@ -12,11 +12,19 @@ const STEER_TEXT = '本回合自检得分偏低:请复核是否答到了用户
|
|
|
12
12
|
|
|
13
13
|
// A short, single-line hint of the request this self-check judged, so a human
|
|
14
14
|
// reviewing the log knows WHICH turn's output was scored (not just "self-check").
|
|
15
|
-
// Best-effort over an untrusted string
|
|
15
|
+
// Best-effort over an untrusted string: injected OpenViking memory context blocks
|
|
16
|
+
// (which are not part of the user's actual request) are stripped first, then
|
|
17
|
+
// whitespace collapses and the length is capped.
|
|
16
18
|
function subjectOf(text) {
|
|
17
19
|
if (typeof text !== 'string') return undefined;
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
+
const cleaned = text
|
|
21
|
+
// Drop any complete injected memory blocks (there can be several, multi-line).
|
|
22
|
+
.replace(/<openviking-context\b[^>]*>[\s\S]*?<\/openviking-context>/gi, ' ')
|
|
23
|
+
// Drop a dangling, unclosed block (e.g. a truncated tail) through to the end.
|
|
24
|
+
.replace(/<openviking-context\b[\s\S]*$/i, ' ')
|
|
25
|
+
.replace(/\s+/g, ' ')
|
|
26
|
+
.trim();
|
|
27
|
+
return cleaned ? cleaned.slice(0, 120) : undefined;
|
|
20
28
|
}
|
|
21
29
|
|
|
22
30
|
function boundedRubric(rubric) {
|