context-guardian-deepseek-harness 0.1.1 → 0.2.0

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.md CHANGED
@@ -2,13 +2,17 @@
2
2
 
3
3
  [English](README.md) · [简体中文](README.zh-CN.md)
4
4
 
5
- This adapter adds a human review step before DeepSeek Harness's native context compaction:
5
+ This adapter audits a native Preview before DeepSeek Harness commits context compaction:
6
6
 
7
7
  ```text
8
- Harness history → Context Guardian inspection → Keep / Drop review → native Harness summary
8
+ Harness native Preview → Context Guardian Audit → auto correction / max 3 topic questions
9
+ → incremental guidance → native Harness compaction commit
9
10
  ```
10
11
 
11
- It is a decorator over `dsh-compaction-basic`. DeepSeek Harness continues to own compaction range selection, token accounting, durable session events, summary framing, persistence, and the `/compact` command. If Python, the bridge, model extraction, or human review is unavailable, the adapter logs a warning and continues with native compaction.
12
+ It is a decorator over `dsh-compaction-basic`. DeepSeek Harness continues to own compaction range selection, token accounting, durable session events, summary framing, persistence, and the `/compact` command. An accurate Preview is returned without a retry. If Python, the bridge, audit, review UI, or guided retry is unavailable, the adapter logs a warning and accepts the successful Preview. This is experimental and does not guarantee better summaries or agent performance.
13
+
14
+ The hard review budget is controlled by `CONTEXT_GUARDIAN_MAX_REVIEW_QUESTIONS=0..3`;
15
+ zero disables questions and resolves uncertain topics conservatively.
12
16
 
13
17
  ## Install
14
18
 
@@ -62,13 +66,30 @@ The adapter does not receive or forward `DEEPSEEK_API_KEY`. Structured inspectio
62
66
  If the core is installed in a virtual environment, set
63
67
  `CONTEXT_GUARDIAN_PYTHON=/absolute/path/to/venv/bin/python` before starting Harness.
64
68
 
69
+ On Windows, the bridge preserves the runtime variables required by Python's networking
70
+ stack while still passing only an explicit minimal environment to the child process. If
71
+ the `python3` command resolves to the Microsoft Store placeholder, set the interpreter
72
+ explicitly in the same PowerShell session used to start Harness:
73
+
74
+ ```powershell
75
+ $env:CONTEXT_GUARDIAN_PYTHON = (Get-Command python).Source
76
+ $env:CONTEXT_GUARDIAN_DEBUG = "1"
77
+ $env:CONTEXT_GUARDIAN_TIMEOUT_MS = "120000"
78
+ dsh --profile web
79
+ ```
80
+
81
+ The bridge timeout defaults to 120 seconds and can be lowered with
82
+ `CONTEXT_GUARDIAN_TIMEOUT_MS` (up to 120 seconds). With debug enabled, the adapter logs
83
+ when it loads and reports only audit finding and topic-question counts (never raw prompt contents).
84
+
65
85
  Start the web profile and use a sufficiently long session or `/compact`:
66
86
 
67
87
  ```bash
68
88
  dsh --profile web
69
89
  ```
70
90
 
71
- Review candidates appear through Harness's user-question UI. In headless compositions without an answerer, uncertain candidates are conservatively kept. For deterministic local testing, `CONTEXT_GUARDIAN_REVIEW_MODE=keep` or `drop` bypasses the question UI.
91
+ Review topics appear through Harness's user-question UI. In headless compositions
92
+ without an answerer, high-risk topics are kept and low-risk topics accept the Preview.
72
93
 
73
94
  For a repeatable end-to-end UI test that does not require a long real conversation:
74
95
 
@@ -77,9 +98,12 @@ env PATH="/path/to/node-22.19/bin:$PATH" npm run dsh-fixture-smoke
77
98
  ```
78
99
 
79
100
  The fixture creates an isolated Web profile, seeds a sufficiently large conversation,
80
- opens the Harness UI, and pauses on a reviewable SQLite candidate. Select Keep or Drop,
81
- then confirm the native `/compact` result. It uses a replay model, so no DeepSeek API
82
- key is required. Exit the temporary Web process with Ctrl-C when finished.
101
+ deliberately omits selected facts from the replayed native Preview, and opens the
102
+ Harness UI. Select the session named `Context Guardian 预置长对话(请先选择)`
103
+ (or the `context-guardian-fixture-long` workspace), then enter `/compact`. The UI
104
+ should show at most three topic questions; select Keep or Drop and confirm the guided
105
+ native compaction result. It uses a replay model, so no DeepSeek API key is required.
106
+ Exit the temporary Web process with Ctrl-C when finished.
83
107
 
84
108
  ## Disable or uninstall
85
109
 
package/README.zh-CN.md CHANGED
@@ -2,15 +2,21 @@
2
2
 
3
3
  [English](README.md) · 简体中文
4
4
 
5
- 这个适配器在 DeepSeek Harness 原生上下文压缩前增加人工审查:
5
+ 这个适配器在 DeepSeek Harness 提交原生上下文压缩前审计 Preview:
6
6
 
7
7
  ```text
8
- Harness 历史 → Context Guardian 检查 → Keep / Drop 审查 → Harness 原生摘要
8
+ Harness 原生 Preview → Context Guardian 审计 → 自动修正 / 最多 3 个主题问题
9
+ → 增量指导 → Harness 原生 compaction 提交
9
10
  ```
10
11
 
11
12
  它是 `dsh-compaction-basic` 的装饰器。DeepSeek Harness 继续负责压缩范围、
12
13
  token 统计、会话事件、摘要格式、持久化和 `/compact` 命令。如果 Python、桥接、
13
- 模型抽取或人工审查不可用,适配器会记录 warning 并继续原生 compaction。
14
+ 模型审计或 UI 不可用,适配器会记录 warning 并接受已经成功的 Preview;如果
15
+ Preview 本身失败才回到 Harness 原生 fallback。这是实验性能力,不保证一定改善
16
+ 摘要或 Agent 表现。
17
+
18
+ 可用 `CONTEXT_GUARDIAN_MAX_REVIEW_QUESTIONS=0..3` 设置问题硬上限;设为 0 表示
19
+ 不弹窗,对未决主题采用保守处理。
14
20
 
15
21
  ## 安装
16
22
 
@@ -65,6 +71,21 @@ export CONTEXT_GUARDIAN_PYTHON=/absolute/path/to/python
65
71
  如果核心安装在虚拟环境中,启动 Harness 前设置
66
72
  `CONTEXT_GUARDIAN_PYTHON=/absolute/path/to/venv/bin/python`。
67
73
 
74
+ 在 Windows 上,bridge 会在保持最小子进程环境的同时传递 Python 网络栈所需的运行时变量。
75
+ 如果 `python3` 解析到了 Microsoft Store 占位符,请在启动 Harness 的同一个 PowerShell
76
+ 会话中显式指定解释器:
77
+
78
+ ```powershell
79
+ $env:CONTEXT_GUARDIAN_PYTHON = (Get-Command python).Source
80
+ $env:CONTEXT_GUARDIAN_DEBUG = "1"
81
+ $env:CONTEXT_GUARDIAN_TIMEOUT_MS = "120000"
82
+ dsh --profile web
83
+ ```
84
+
85
+ bridge 默认超时为 120 秒,也可以用 `CONTEXT_GUARDIAN_TIMEOUT_MS` 调低(上限为 120 秒)。
86
+ 启用 debug 后,适配器会记录已加载,并只报告审计 finding 和主题问题数量,不输出
87
+ 原始 prompt 内容。
88
+
68
89
  ## 交互式验证
69
90
 
70
91
  启动 Web profile:
@@ -79,12 +100,15 @@ dsh --profile web
79
100
  env PATH="/path/to/node-22.19/bin:$PATH" npm run dsh-fixture-smoke
80
101
  ```
81
102
 
82
- fixture 会创建隔离的 Web profile,预置足够长的会话,打开 Harness UI,并在
83
- SQLite 候选上暂停,让你选择 Keep 或 Drop,随后确认原生 `/compact` 成功。它
84
- 使用 replay model,不需要 DeepSeek API Key。结束临时 Web 进程时按 Ctrl-C。
103
+ fixture 会创建隔离的 Web profile,预置足够长的会话,并故意让 replay 的原生
104
+ Preview 缺少部分事实。打开 Harness UI 后,先选择名为
105
+ `Context Guardian 预置长对话(请先选择)` 的会话(或选择
106
+ `context-guardian-fixture-long` 工作区中的该会话),再输入 `/compact`。界面应
107
+ 最多显示 3 个主题问题;请手动选择 Keep 或 Drop,然后确认带增量指导的原生
108
+ 压缩成功。它使用 replay model,不需要 DeepSeek API Key。结束临时 Web 进程时
109
+ 按 Ctrl-C。
85
110
 
86
- 在没有 answerer 的无头模式中,未决候选会保守地 Keep;也可以用
87
- `CONTEXT_GUARDIAN_REVIEW_MODE=keep` 或 `drop` 绕过询问 UI。
111
+ 在没有 answerer 的无头模式中,高风险主题会保守地 Keep,低风险主题接受 Preview。
88
112
 
89
113
  ## 禁用或卸载
90
114
 
package/lib/bridge.d.ts CHANGED
@@ -1,15 +1,27 @@
1
1
  import type { Context } from "@deepseek-ai/cordis";
2
2
  import type { Agent } from "@deepseek-ai/dsh-agent";
3
- import type { Guidance, GuardianMessage, InspectionResult, MemoryCandidate } from "./types.js";
3
+ import type { Guidance, GuardianMessage, InspectionResult, MemoryCandidate, ReviewPlan } from "./types.js";
4
+ export type GuardianBridgeErrorCode = "spawn" | "timeout" | "protocol" | "process_exit";
4
5
  export declare class GuardianBridgeError extends Error {
6
+ readonly code: GuardianBridgeErrorCode;
7
+ constructor(message: string, code: GuardianBridgeErrorCode);
5
8
  }
9
+ export declare function pythonCommand(source?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): string;
10
+ export declare function pythonEnvironment(source?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): NodeJS.ProcessEnv;
6
11
  export declare function normalizeDeepSeekMessages(_system: string | undefined, messages: readonly any[]): GuardianMessage[];
12
+ export declare function preferredLanguage(messages: readonly GuardianMessage[]): "zh-CN" | "en";
7
13
  export declare class GuardianBridge {
8
14
  inspect(ctx: Context, agent: Agent, messages: GuardianMessage[], signal: AbortSignal): Promise<InspectionResult>;
9
15
  guidance(ctx: Context, agent: Agent, candidates: MemoryCandidate[], decisions: Array<{
10
16
  candidate_id: string;
11
17
  action: "keep" | "drop";
12
18
  }>, signal: AbortSignal): Promise<Guidance>;
19
+ auditPreview(ctx: Context, agent: Agent, messages: GuardianMessage[], preview: string, previousSummary: string, retainedContext: string, signal: AbortSignal, maxReviewQuestions?: number): Promise<ReviewPlan>;
20
+ revisionGuidance(ctx: Context, agent: Agent, reviewPlan: ReviewPlan, answers: Array<{
21
+ question_id: string;
22
+ topic_id: string;
23
+ action: "keep" | "drop";
24
+ }>, signal: AbortSignal): Promise<Guidance>;
13
25
  private request;
14
26
  }
15
27
  //# sourceMappingURL=bridge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAiB,MAAM,YAAY,CAAC;AAK9G,qBAAa,mBAAoB,SAAQ,KAAK;CAAG;AAsBjD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,QAAQ,EAAE,SAAS,GAAG,EAAE,GACvB,eAAe,EAAE,CA8BnB;AAED,qBAAa,cAAc;IACnB,OAAO,CACX,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,eAAe,EAAE,EAC3B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,CAAC;IAKtB,QAAQ,CACZ,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,eAAe,EAAE,EAC7B,SAAS,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,EACnE,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,QAAQ,CAAC;YASN,OAAO;CAmFtB"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAiB,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ1H,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,CAAC;AAExF,qBAAa,mBAAoB,SAAQ,KAAK;IACf,QAAQ,CAAC,IAAI,EAAE,uBAAuB;gBAAvD,OAAO,EAAE,MAAM,EAAW,IAAI,EAAE,uBAAuB;CAIpE;AAED,wBAAgB,aAAa,CAC3B,MAAM,GAAE,MAAM,CAAC,UAAwB,EACvC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAER;AAOD,wBAAgB,iBAAiB,CAC/B,MAAM,GAAE,MAAM,CAAC,UAAwB,EACvC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAAC,UAAU,CAYnB;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,QAAQ,EAAE,SAAS,GAAG,EAAE,GACvB,eAAe,EAAE,CA8BnB;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,GAAG,IAAI,CAQtF;AAED,qBAAa,cAAc;IACnB,OAAO,CACX,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,eAAe,EAAE,EAC3B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,CAAC;IAKtB,QAAQ,CACZ,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,eAAe,EAAE,EAC7B,SAAS,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,EACnE,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,QAAQ,CAAC;IASd,YAAY,CAChB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,eAAe,EAAE,EAC3B,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,WAAW,EACnB,kBAAkB,SAAI,GACrB,OAAO,CAAC,UAAU,CAAC;IAahB,gBAAgB,CACpB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,EAClF,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,QAAQ,CAAC;YAQN,OAAO;CAwGtB"}
package/lib/bridge.js CHANGED
@@ -3,24 +3,36 @@ import { spawn } from "node:child_process";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { generateStructuredWithHost } from "./host-model.js";
5
5
  const PROTOCOL_VERSION = 1;
6
- const DEFAULT_TIMEOUT_MS = 30_000;
6
+ const DEFAULT_TIMEOUT_MS = 120_000;
7
+ const MAX_TIMEOUT_MS = 120_000;
8
+ const BASE_ENVIRONMENT_NAMES = ["PATH", "LANG", "LC_ALL", "TMPDIR", "TMP", "TEMP"];
9
+ const WINDOWS_ENVIRONMENT_NAMES = ["SystemRoot", "windir"];
7
10
  export class GuardianBridgeError extends Error {
11
+ code;
12
+ constructor(message, code) {
13
+ super(message);
14
+ this.code = code;
15
+ this.name = "GuardianBridgeError";
16
+ }
8
17
  }
9
- function pythonCommand() {
10
- return process.env.CONTEXT_GUARDIAN_PYTHON || "python3";
18
+ export function pythonCommand(source = process.env, platform = process.platform) {
19
+ return source.CONTEXT_GUARDIAN_PYTHON || (platform === "win32" ? "python" : "python3");
11
20
  }
12
21
  function timeoutMs() {
13
22
  const value = Number(process.env.CONTEXT_GUARDIAN_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);
14
- return Number.isFinite(value) && value > 0 ? Math.min(Math.floor(value), 120_000) : DEFAULT_TIMEOUT_MS;
23
+ return Number.isFinite(value) && value > 0 ? Math.min(Math.floor(value), MAX_TIMEOUT_MS) : DEFAULT_TIMEOUT_MS;
15
24
  }
16
- function pythonEnvironment() {
25
+ export function pythonEnvironment(source = process.env, platform = process.platform) {
17
26
  const environment = {};
18
- for (const name of ["PATH", "LANG", "LC_ALL", "TMPDIR", "TMP", "TEMP"]) {
19
- const value = process.env[name];
27
+ const names = platform === "win32"
28
+ ? [...WINDOWS_ENVIRONMENT_NAMES, ...BASE_ENVIRONMENT_NAMES]
29
+ : BASE_ENVIRONMENT_NAMES;
30
+ for (const name of names) {
31
+ const value = source[name];
20
32
  if (value !== undefined)
21
33
  environment[name] = value;
22
34
  }
23
- const pythonPath = process.env.CONTEXT_GUARDIAN_PYTHONPATH;
35
+ const pythonPath = source.CONTEXT_GUARDIAN_PYTHONPATH;
24
36
  if (pythonPath !== undefined)
25
37
  environment.PYTHONPATH = pythonPath;
26
38
  return environment;
@@ -59,6 +71,15 @@ export function normalizeDeepSeekMessages(_system, messages) {
59
71
  }
60
72
  return result;
61
73
  }
74
+ export function preferredLanguage(messages) {
75
+ const userText = messages
76
+ .filter((message) => message.role === "user")
77
+ .map((message) => message.content)
78
+ .join(" ");
79
+ const chinese = (userText.match(/[\u4e00-\u9fff]/g) ?? []).length;
80
+ const latin = (userText.match(/[A-Za-z]/g) ?? []).length;
81
+ return chinese > latin ? "zh-CN" : "en";
82
+ }
62
83
  export class GuardianBridge {
63
84
  async inspect(ctx, agent, messages, signal) {
64
85
  const result = await this.request(ctx, agent, "inspect", { messages, provider: "host" }, signal);
@@ -72,8 +93,28 @@ export class GuardianBridge {
72
93
  }, signal);
73
94
  return result;
74
95
  }
96
+ async auditPreview(ctx, agent, messages, preview, previousSummary, retainedContext, signal, maxReviewQuestions = 3) {
97
+ const result = await this.request(ctx, agent, "audit_preview", {
98
+ messages,
99
+ preview,
100
+ previous_summary: previousSummary,
101
+ retained_context: retainedContext,
102
+ max_review_questions: maxReviewQuestions,
103
+ language: preferredLanguage(messages),
104
+ provider: "host",
105
+ }, signal);
106
+ return result;
107
+ }
108
+ async revisionGuidance(ctx, agent, reviewPlan, answers, signal) {
109
+ const result = await this.request(ctx, agent, "revision_guidance", {
110
+ review_plan: reviewPlan,
111
+ answers,
112
+ }, signal);
113
+ return result;
114
+ }
75
115
  async request(ctx, agent, operation, body, signal) {
76
- const child = spawn(pythonCommand(), ["-m", "context_guardian", "bridge", "--stdio"], {
116
+ const command = pythonCommand();
117
+ const child = spawn(command, ["-m", "context_guardian", "bridge", "--stdio"], {
77
118
  cwd: agent.session.header.cwd ?? process.cwd(),
78
119
  shell: false,
79
120
  env: pythonEnvironment(),
@@ -82,10 +123,17 @@ export class GuardianBridge {
82
123
  const requestId = randomUUID();
83
124
  const readline = createInterface({ input: child.stdout });
84
125
  let stderr = "";
126
+ let childError;
127
+ let timedOut = false;
128
+ child.once("error", (error) => { childError = error; });
85
129
  child.stderr.on("data", (chunk) => { stderr = `${stderr}${String(chunk)}`.slice(-4000); });
86
130
  const abort = () => child.kill("SIGTERM");
87
131
  signal.addEventListener("abort", abort, { once: true });
88
- const timer = setTimeout(() => child.kill("SIGTERM"), timeoutMs());
132
+ const limit = timeoutMs();
133
+ const timer = setTimeout(() => {
134
+ timedOut = true;
135
+ child.kill("SIGTERM");
136
+ }, limit);
89
137
  try {
90
138
  child.stdin.write(JSON.stringify({
91
139
  protocol_version: PROTOCOL_VERSION,
@@ -102,16 +150,17 @@ export class GuardianBridge {
102
150
  frame = JSON.parse(line);
103
151
  }
104
152
  catch {
105
- throw new GuardianBridgeError("Context Guardian returned invalid JSON");
153
+ throw new GuardianBridgeError("Context Guardian returned invalid JSON", "protocol");
106
154
  }
107
155
  if (frame.protocol_version !== PROTOCOL_VERSION) {
108
- throw new GuardianBridgeError("Context Guardian returned an unsupported protocol version");
156
+ throw new GuardianBridgeError("Context Guardian returned an unsupported protocol version", "protocol");
157
+ }
158
+ if (frame.type === "error") {
159
+ throw new GuardianBridgeError(frame.error ?? "Context Guardian protocol error", "protocol");
109
160
  }
110
- if (frame.type === "error")
111
- throw new GuardianBridgeError(frame.error ?? "Context Guardian protocol error");
112
161
  if (frame.type === "provider_request") {
113
162
  if (!frame.request_id || !frame.prompt || !frame.schema) {
114
- throw new GuardianBridgeError("Context Guardian provider request is malformed");
163
+ throw new GuardianBridgeError("Context Guardian provider request is malformed", "protocol");
115
164
  }
116
165
  try {
117
166
  const data = await generateStructuredWithHost(ctx, agent, frame.prompt, frame.schema, signal);
@@ -135,13 +184,20 @@ export class GuardianBridge {
135
184
  continue;
136
185
  }
137
186
  if (frame.type !== "result" || frame.request_id !== requestId) {
138
- throw new GuardianBridgeError("Context Guardian returned an unrelated response");
187
+ throw new GuardianBridgeError("Context Guardian returned an unrelated response", "protocol");
188
+ }
189
+ if (!frame.ok) {
190
+ throw new GuardianBridgeError(frame.error ?? "Context Guardian request failed", "protocol");
139
191
  }
140
- if (!frame.ok)
141
- throw new GuardianBridgeError(frame.error ?? "Context Guardian request failed");
142
192
  return frame.result;
143
193
  }
144
- throw new GuardianBridgeError(stderr || "Context Guardian process exited without a result");
194
+ if (childError) {
195
+ throw new GuardianBridgeError(`Context Guardian failed to start ${JSON.stringify(command)}: ${childError.message}`, "spawn");
196
+ }
197
+ if (timedOut) {
198
+ throw new GuardianBridgeError(`Context Guardian timed out after ${String(limit)} ms`, "timeout");
199
+ }
200
+ throw new GuardianBridgeError(stderr || "Context Guardian process exited without a result", "process_exit");
145
201
  }
146
202
  finally {
147
203
  clearTimeout(timer);
package/lib/bridge.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1,15 +1,25 @@
1
1
  import { BasicCompactionEngine } from "@deepseek-ai/dsh-compaction-basic";
2
2
  import type { Agent } from "@deepseek-ai/dsh-agent";
3
+ import type { ReviewPlan } from "./types.js";
3
4
  export declare const name = "context-guardian-deepseek-harness";
4
5
  type NativeSummarize = BasicCompactionEngine["summarize"];
5
6
  type NativeSummarizeInput = Parameters<NativeSummarize>[0];
6
7
  type NativeSummarizeResult = Awaited<ReturnType<NativeSummarize>>;
8
+ export declare function answersForNoUi(plan: ReviewPlan): Array<{
9
+ question_id: string;
10
+ topic_id: string;
11
+ action: "keep" | "drop";
12
+ }>;
13
+ export declare function needsRevision(plan: ReviewPlan, answers: readonly {
14
+ action: "keep" | "drop";
15
+ }[]): boolean;
7
16
  /**
8
- * Decorates DeepSeek Harness's native backend with Context Guardian review.
9
- * The inherited engine still owns selection, shrink checks, durable markers,
10
- * session replacement, and the final structured checkpoint summary.
17
+ * Decorates the native DeepSeek Harness compactor. The native engine owns the
18
+ * single transaction; this override only performs an uncommitted preview,
19
+ * an external audit, and (when needed) one guided native retry.
11
20
  */
12
21
  export declare class ContextGuardianCompactionEngine extends BasicCompactionEngine {
22
+ static inject: string[];
13
23
  protected summarize(input: NativeSummarizeInput, agent: Agent, signal?: AbortSignal): Promise<NativeSummarizeResult>;
14
24
  }
15
25
  export default ContextGuardianCompactionEngine;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAMpD,eAAO,MAAM,IAAI,sCAAsC,CAAC;AAMxD,KAAK,eAAe,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;AAC1D,KAAK,oBAAoB,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,KAAK,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;AAkGlE;;;;GAIG;AACH,qBAAa,+BAAgC,SAAQ,qBAAqB;cAC/C,SAAS,CAChC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,KAAK,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,qBAAqB,CAAC;CA+BlC;AAED,eAAe,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,YAAY,CAAC;AAG7D,eAAO,MAAM,IAAI,sCAAsC,CAAC;AAOxD,KAAK,eAAe,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;AAC1D,KAAK,oBAAoB,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,KAAK,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;AAsClE,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,KAAK,CAAC;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB,CAAC,CAMD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS;IAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAAE,GAAG,OAAO,CAExG;AAiGD;;;;GAIG;AACH,qBAAa,+BAAgC,SAAQ,qBAAqB;IAIxE,OAAgB,MAAM,WAAsD;cAEnD,SAAS,CAChC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,KAAK,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,qBAAqB,CAAC;CA2DlC;AAED,eAAe,+BAA+B,CAAC"}
package/lib/index.js CHANGED
@@ -1,13 +1,29 @@
1
1
  import { BasicCompactionEngine } from "@deepseek-ai/dsh-compaction-basic";
2
2
  import { createUserMessage } from "@deepseek-ai/dsh-llm";
3
- import { GuardianBridge, normalizeDeepSeekMessages } from "./bridge.js";
3
+ import { GuardianBridge, normalizeDeepSeekMessages, preferredLanguage } from "./bridge.js";
4
4
  export const name = "context-guardian-deepseek-harness";
5
+ const MAX_REVIEW_QUESTIONS = 3;
5
6
  if (process.env.CONTEXT_GUARDIAN_DEBUG === "1") {
6
7
  console.error("context guardian: adapter module loaded");
7
8
  }
8
9
  const bridge = new GuardianBridge();
9
- const KEEP = "Keep";
10
- const DROP = "Drop";
10
+ const UI_MESSAGES = {
11
+ en: {
12
+ auditUnavailable: "Context Guardian audit unavailable; accepting the successful native preview.",
13
+ reviewCancelled: "Context Guardian review unavailable; accepting the successful native preview.",
14
+ revisionUnavailable: "Context Guardian revision unavailable; accepting the successful native preview.",
15
+ finalFailed: "Context Guardian final compaction failed; accepting the successful native preview.",
16
+ },
17
+ "zh-CN": {
18
+ auditUnavailable: "Context Guardian 审计不可用;接受已经成功生成的原生预览。",
19
+ reviewCancelled: "Context Guardian 人工审查不可用;接受已经成功生成的原生预览。",
20
+ revisionUnavailable: "Context Guardian 修正指导不可用;接受已经成功生成的原生预览。",
21
+ finalFailed: "Context Guardian 最终压缩失败;接受已经成功生成的原生预览。",
22
+ },
23
+ };
24
+ function uiMessage(language, key) {
25
+ return UI_MESSAGES[language][key];
26
+ }
11
27
  function debug(ctx, message) {
12
28
  if (process.env.CONTEXT_GUARDIAN_DEBUG === "1") {
13
29
  const line = `context guardian: ${message}`;
@@ -15,71 +31,85 @@ function debug(ctx, message) {
15
31
  ctx.logger.info(line);
16
32
  }
17
33
  }
18
- function candidateDetail(candidate) {
19
- const reason = candidate.reason ? `\n\nReason: ${candidate.reason}` : "";
20
- return `Category: ${candidate.category}\nImportance: ${candidate.importance.toFixed(2)} · Confidence: ${candidate.confidence.toFixed(2)}\n\n${candidate.content}${reason}`;
34
+ function configuredReviewBudget() {
35
+ const value = Number(process.env.CONTEXT_GUARDIAN_MAX_REVIEW_QUESTIONS ?? MAX_REVIEW_QUESTIONS);
36
+ return Number.isInteger(value) && value >= 0 && value <= MAX_REVIEW_QUESTIONS ? value : MAX_REVIEW_QUESTIONS;
21
37
  }
22
- function reviewQuestions(candidates) {
23
- return candidates.map((candidate) => ({
24
- id: candidate.id,
25
- header: `Context Guardian · ${candidate.category}`,
26
- question: "Keep this memory in the compaction guidance?",
27
- detail: candidateDetail(candidate),
28
- options: [
29
- { label: KEEP, description: "Tell the native compactor to preserve this item." },
30
- { label: DROP, description: "Tell the native compactor this item may be discarded." },
31
- ],
38
+ export function answersForNoUi(plan) {
39
+ return plan.review_questions.map((question) => ({
40
+ question_id: question.id,
41
+ topic_id: question.topic_id,
42
+ action: question.recommendation,
32
43
  }));
33
44
  }
34
- function keepAll(candidates) {
35
- return candidates.map((candidate) => ({ candidate_id: candidate.id, action: "keep" }));
45
+ export function needsRevision(plan, answers) {
46
+ return plan.auto_corrections.length > 0 || answers.some((answer) => answer.action === "keep");
36
47
  }
37
- function errorCode(error) {
38
- return typeof error === "object" && error !== null && "code" in error
39
- ? String(error.code)
40
- : undefined;
48
+ function reviewQuestionsForUi(plan) {
49
+ return plan.review_questions.slice(0, MAX_REVIEW_QUESTIONS).map((question) => ({
50
+ id: question.id,
51
+ header: question.title,
52
+ question: question.question,
53
+ detail: `${plan.overview}\n\n${question.context}\n\n${question.why_it_matters}\n\n${question.options.map((option) => `${option.label}: ${option.description}`).join("\n")}`,
54
+ options: question.options.map((option) => ({
55
+ label: option.label,
56
+ description: option.description,
57
+ })),
58
+ }));
41
59
  }
42
- async function review(ctx, agent, candidates, signal) {
43
- if (candidates.length === 0)
60
+ async function answerReviewQuestions(ctx, agent, plan, signal) {
61
+ if (plan.review_questions.length === 0)
44
62
  return [];
45
- const mode = process.env.CONTEXT_GUARDIAN_REVIEW_MODE;
46
- if (mode === "keep")
47
- return keepAll(candidates);
48
- if (mode === "drop")
49
- return candidates.map((candidate) => ({ candidate_id: candidate.id, action: "drop" }));
50
- const interaction = ctx.get("userQuestions");
51
- debug(ctx, `reviewing ${String(candidates.length)} candidate(s); userQuestions=${interaction === undefined ? "unavailable" : "available"}`);
63
+ // `Context.get()` deliberately bypasses a plugin's injected dependency map.
64
+ // Compaction is an isolated Cordis plugin, so read the injected property
65
+ // instead; otherwise the Web answerer is present in the host but invisible
66
+ // to this adapter and every review silently takes the no-UI fallback.
67
+ let interaction;
68
+ try {
69
+ interaction = ctx.userQuestions;
70
+ }
71
+ catch (error) {
72
+ debug(ctx, `userQuestions unavailable; policy fallback ${errorCode(error) ?? "missing"}`);
73
+ return answersForNoUi(plan);
74
+ }
52
75
  if (interaction === undefined)
53
- return keepAll(candidates);
76
+ return answersForNoUi(plan);
54
77
  try {
55
78
  const answer = await interaction.ask({
56
- questions: reviewQuestions(candidates),
79
+ questions: reviewQuestionsForUi(plan),
57
80
  agent,
58
81
  signal,
59
82
  });
60
83
  const byId = new Map(answer.answers.map((item) => [item.id, item]));
61
- return candidates.map((candidate) => {
62
- const item = byId.get(candidate.id);
84
+ return plan.review_questions.slice(0, MAX_REVIEW_QUESTIONS).map((question) => {
85
+ const item = byId.get(question.id);
63
86
  if (item?.custom !== undefined || item?.selected.length !== 1) {
64
- throw new Error(`Context Guardian received an invalid answer for ${candidate.id}`);
87
+ throw new Error(`Context Guardian received an invalid answer for ${question.id}`);
65
88
  }
66
- if (item.selected[0] === KEEP)
67
- return { candidate_id: candidate.id, action: "keep" };
68
- if (item.selected[0] === DROP)
69
- return { candidate_id: candidate.id, action: "drop" };
70
- throw new Error(`Context Guardian received an unknown answer for ${candidate.id}`);
89
+ const selected = item.selected[0];
90
+ const option = question.options.find((candidate) => candidate.label === selected);
91
+ if (!option)
92
+ throw new Error(`Context Guardian received an unknown answer for ${question.id}`);
93
+ return {
94
+ question_id: question.id,
95
+ topic_id: question.topic_id,
96
+ action: option.id,
97
+ };
71
98
  });
72
99
  }
73
100
  catch (error) {
74
- debug(ctx, `userQuestions failed with ${errorCode(error) ?? (error instanceof Error ? error.message : String(error))}`);
75
- // Headless compositions commonly provide the service seam without a UI
76
- // answerer. Treat that case conservatively; an explicit cancellation or
77
- // protocol failure is allowed to fail open to native compaction below.
78
- if (errorCode(error) === "NO_PROVIDER")
79
- return keepAll(candidates);
101
+ const code = errorCode(error);
102
+ debug(ctx, `userQuestions unavailable; policy fallback ${code ?? "unknown"}`);
103
+ if (code === "NO_PROVIDER")
104
+ return answersForNoUi(plan);
80
105
  throw error;
81
106
  }
82
107
  }
108
+ function errorCode(error) {
109
+ return typeof error === "object" && error !== null && "code" in error
110
+ ? String(error.code)
111
+ : undefined;
112
+ }
83
113
  function nativeInputWithGuidance(input, text) {
84
114
  const guidanceMessage = createUserMessage({
85
115
  content: [{ type: "text", text }],
@@ -94,32 +124,71 @@ function normalizeInput(input) {
94
124
  const candidate = input;
95
125
  return normalizeDeepSeekMessages(candidate.system, input.messages);
96
126
  }
127
+ function textFromSummary(result) {
128
+ const blocks = result.summary;
129
+ return blocks
130
+ .filter((block) => block?.type === "text" || block?.type === "reasoning")
131
+ .map((block) => block.text ?? "")
132
+ .join("\n")
133
+ .trim();
134
+ }
97
135
  /**
98
- * Decorates DeepSeek Harness's native backend with Context Guardian review.
99
- * The inherited engine still owns selection, shrink checks, durable markers,
100
- * session replacement, and the final structured checkpoint summary.
136
+ * Decorates the native DeepSeek Harness compactor. The native engine owns the
137
+ * single transaction; this override only performs an uncommitted preview,
138
+ * an external audit, and (when needed) one guided native retry.
101
139
  */
102
140
  export class ContextGuardianCompactionEngine extends BasicCompactionEngine {
141
+ // Compaction runs in its own isolated Cordis scope. Declare the human
142
+ // question capability explicitly so the Web answerer is visible there;
143
+ // without this dependency the adapter silently took its no-UI fallback.
144
+ static inject = [...BasicCompactionEngine.inject, "userQuestions"];
103
145
  async summarize(input, agent, signal) {
104
- let guidedInput;
146
+ const operationSignal = signal ?? new AbortController().signal;
147
+ const preview = await super.summarize(input, agent, signal);
148
+ const messages = normalizeInput(input);
149
+ let uiLanguage = preferredLanguage(messages);
150
+ let plan;
151
+ try {
152
+ plan = await bridge.auditPreview(this.ctx, agent, messages, textFromSummary(preview), "", "", operationSignal, configuredReviewBudget());
153
+ debug(this.ctx, `preview ready: findings=${String(plan.findings.length)}, topics=${String(plan.audit_topics.length)}, `
154
+ + `auto_corrections=${String(plan.auto_corrections.length)}, accepted=${String(plan.accepted_omissions.length)}, `
155
+ + `questions=${String(plan.review_questions.length)}`);
156
+ }
157
+ catch (error) {
158
+ this.ctx.logger.warn(uiMessage(uiLanguage, "auditUnavailable"));
159
+ return preview;
160
+ }
161
+ uiLanguage = plan.language;
162
+ let answers;
163
+ try {
164
+ answers = await answerReviewQuestions(this.ctx, agent, plan, operationSignal);
165
+ }
166
+ catch (error) {
167
+ this.ctx.logger.warn(uiMessage(uiLanguage, "reviewCancelled"));
168
+ return preview;
169
+ }
170
+ if (!needsRevision(plan, answers)) {
171
+ debug(this.ctx, "native preview reused; final compaction not needed");
172
+ return preview;
173
+ }
174
+ let guidance;
175
+ try {
176
+ guidance = await bridge.revisionGuidance(this.ctx, agent, plan, answers, operationSignal);
177
+ }
178
+ catch (error) {
179
+ this.ctx.logger.warn(uiMessage(uiLanguage, "revisionUnavailable"));
180
+ return preview;
181
+ }
182
+ if (!guidance.text)
183
+ return preview;
105
184
  try {
106
- const operationSignal = signal ?? new AbortController().signal;
107
- const inspection = await bridge.inspect(this.ctx, agent, normalizeInput(input), operationSignal);
108
- debug(this.ctx, `inspection returned ${String(inspection.candidates.length)} candidate(s), ${String(inspection.review.length)} for review`);
109
- const decisions = [
110
- ...keepAll(inspection.auto_keep),
111
- ...inspection.auto_drop.map((candidate) => ({ candidate_id: candidate.id, action: "drop" })),
112
- ...await review(this.ctx, agent, inspection.review, operationSignal),
113
- ];
114
- const guidance = await bridge.guidance(this.ctx, agent, inspection.candidates, decisions, operationSignal);
115
- guidedInput = nativeInputWithGuidance(input, guidance.text);
185
+ debug(this.ctx, "running one guided native final compaction");
186
+ return await super.summarize(nativeInputWithGuidance(input, guidance.text), agent, signal);
116
187
  }
117
188
  catch (error) {
118
- const message = error instanceof Error ? error.message : String(error);
119
- this.ctx.logger.warn(`context guardian unavailable; continuing native compaction: ${message}`);
120
- return super.summarize(input, agent, signal);
189
+ this.ctx.logger.warn(uiMessage(uiLanguage, "finalFailed"));
190
+ return preview;
121
191
  }
122
- return super.summarize(guidedInput, agent, signal);
123
192
  }
124
193
  }
125
194
  export default ContextGuardianCompactionEngine;
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/lib/types.d.ts CHANGED
@@ -24,6 +24,56 @@ export interface InspectionResult {
24
24
  mode: "rules" | "provider";
25
25
  policy_version: string;
26
26
  }
27
+ export interface AuditFinding {
28
+ id: string;
29
+ issue_type: "missing" | "incorrect" | "stale" | "ambiguous";
30
+ category: string;
31
+ summary: string;
32
+ why_it_matters: string;
33
+ suggested_correction: string;
34
+ importance: number;
35
+ confidence: number;
36
+ source_message_ids: string[];
37
+ evidence_snippets: string[];
38
+ }
39
+ export interface AuditTopic {
40
+ id: string;
41
+ title: string;
42
+ summary: string;
43
+ finding_ids: string[];
44
+ impact: number;
45
+ confidence: number;
46
+ relevance_to_main_goal: number;
47
+ requires_user_preference: boolean;
48
+ disposition: "auto_correct" | "accept_preview" | "ask_user";
49
+ recommended_action: "keep" | "drop" | "correct" | "accept_preview";
50
+ suggested_correction?: string | null;
51
+ }
52
+ export interface ReviewOption {
53
+ id: "keep" | "drop";
54
+ label: string;
55
+ description: string;
56
+ }
57
+ export interface ReviewQuestion {
58
+ id: string;
59
+ topic_id: string;
60
+ title: string;
61
+ question: string;
62
+ context: string;
63
+ why_it_matters: string;
64
+ recommendation: "keep" | "drop";
65
+ options: ReviewOption[];
66
+ }
67
+ export interface ReviewPlan {
68
+ language: "zh-CN" | "en";
69
+ overview: string;
70
+ auto_preserve_summary: string;
71
+ findings: AuditFinding[];
72
+ audit_topics: AuditTopic[];
73
+ auto_corrections: string[];
74
+ accepted_omissions: string[];
75
+ review_questions: ReviewQuestion[];
76
+ }
27
77
  export interface Guidance {
28
78
  must_preserve: string[];
29
79
  can_discard: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,CAAC;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,wBAAwB,EAAE,OAAO,CAAC;IAClC,WAAW,EAAE,cAAc,GAAG,gBAAgB,GAAG,UAAU,CAAC;IAC5D,kBAAkB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,gBAAgB,CAAC;IACnE,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,QAAQ;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "context-guardian-deepseek-harness",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Human review before DeepSeek Harness context compaction",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",