@sema-ai/core 1.275.1 → 1.276.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/CHANGELOG.md +11 -0
- package/dist/brain/anthropic.d.ts.map +1 -1
- package/dist/brain/anthropic.js +15 -4
- package/dist/brain/anthropic.js.map +1 -1
- package/dist/brain/openai.d.ts.map +1 -1
- package/dist/brain/openai.js +17 -5
- package/dist/brain/openai.js.map +1 -1
- package/dist/brain/repetition.d.ts +31 -0
- package/dist/brain/repetition.d.ts.map +1 -1
- package/dist/brain/repetition.js +55 -0
- package/dist/brain/repetition.js.map +1 -1
- package/dist/brain/stream-engine.d.ts.map +1 -1
- package/dist/brain/stream-engine.js +5 -0
- package/dist/brain/stream-engine.js.map +1 -1
- package/dist/core/auto-mode-prompt-assets.d.ts +11 -0
- package/dist/core/auto-mode-prompt-assets.d.ts.map +1 -0
- package/dist/core/auto-mode-prompt-assets.js +19 -0
- package/dist/core/auto-mode-prompt-assets.js.map +1 -0
- package/dist/core/auto-mode-prompt.d.ts +49 -0
- package/dist/core/auto-mode-prompt.d.ts.map +1 -0
- package/dist/core/auto-mode-prompt.js +125 -0
- package/dist/core/auto-mode-prompt.js.map +1 -0
- package/dist/core/auto-mode.d.ts +86 -0
- package/dist/core/auto-mode.d.ts.map +1 -0
- package/dist/core/auto-mode.js +144 -0
- package/dist/core/auto-mode.js.map +1 -0
- package/dist/core/hooks.d.ts +20 -1
- package/dist/core/hooks.d.ts.map +1 -1
- package/dist/core/hooks.js +45 -2
- package/dist/core/hooks.js.map +1 -1
- package/dist/core/memory-engine/file-backend.d.ts +4 -0
- package/dist/core/memory-engine/file-backend.d.ts.map +1 -1
- package/dist/core/memory-engine/file-backend.js +86 -25
- package/dist/core/memory-engine/file-backend.js.map +1 -1
- package/dist/core/memory-engine/frontmatter.d.ts +5 -0
- package/dist/core/memory-engine/frontmatter.d.ts.map +1 -1
- package/dist/core/memory-engine/frontmatter.js +8 -1
- package/dist/core/memory-engine/frontmatter.js.map +1 -1
- package/dist/core/memory-engine/memory-backend-contract.d.ts.map +1 -1
- package/dist/core/memory-engine/memory-backend-contract.js +17 -0
- package/dist/core/memory-engine/memory-backend-contract.js.map +1 -1
- package/dist/core/memory-engine/sync-client.d.ts +3 -1
- package/dist/core/memory-engine/sync-client.d.ts.map +1 -1
- package/dist/core/memory-engine/sync-client.js +41 -8
- package/dist/core/memory-engine/sync-client.js.map +1 -1
- package/dist/core/memory-engine/types.d.ts +4 -2
- package/dist/core/memory-engine/types.d.ts.map +1 -1
- package/dist/core/roles.d.ts.map +1 -1
- package/dist/core/roles.js +2 -0
- package/dist/core/roles.js.map +1 -1
- package/dist/core/runner/prepare-task.d.ts.map +1 -1
- package/dist/core/runner/prepare-task.js +46 -0
- package/dist/core/runner/prepare-task.js.map +1 -1
- package/dist/core/runner/tool-disclosure.d.ts.map +1 -1
- package/dist/core/runner/tool-disclosure.js +0 -0
- package/dist/core/runner/tool-disclosure.js.map +1 -1
- package/dist/core/stub-env.d.ts.map +1 -1
- package/dist/core/stub-env.js +4 -0
- package/dist/core/stub-env.js.map +1 -1
- package/dist/core/task-registry.d.ts +9 -0
- package/dist/core/task-registry.d.ts.map +1 -1
- package/dist/core/task-registry.js +32 -0
- package/dist/core/task-registry.js.map +1 -1
- package/dist/core/types.d.ts +55 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/engine/execution-env/node-execution-env.d.ts +6 -0
- package/dist/engine/execution-env/node-execution-env.d.ts.map +1 -1
- package/dist/engine/execution-env/node-execution-env.js +37 -0
- package/dist/engine/execution-env/node-execution-env.js.map +1 -1
- package/dist/engine/harness/types.d.ts +17 -0
- package/dist/engine/harness/types.d.ts.map +1 -1
- package/dist/engine/harness/types.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/fs/index.d.ts +9 -2
- package/dist/tools/fs/index.d.ts.map +1 -1
- package/dist/tools/fs/index.js +27 -5
- package/dist/tools/fs/index.js.map +1 -1
- package/dist/tools/fs/search.d.ts.map +1 -1
- package/dist/tools/fs/search.js +17 -7
- package/dist/tools/fs/search.js.map +1 -1
- package/docs/KNOWN-ISSUES.md +11 -11
- package/package.json +1 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { ToolCallRequest } from "./tool-policy.js";
|
|
2
|
+
/** The classifier's verdict over one pending `ask`. */
|
|
3
|
+
export type AutoModeVerdict = {
|
|
4
|
+
kind: "allow";
|
|
5
|
+
}
|
|
6
|
+
/** `category` is the matched BLOCK rule name (207 output contract); `reason` starts with `[Rule Name]`. */
|
|
7
|
+
| {
|
|
8
|
+
kind: "block";
|
|
9
|
+
category: string;
|
|
10
|
+
reason: string;
|
|
11
|
+
}
|
|
12
|
+
/** The classifier could not run: model error/timeout, or the session breaker is open. NOT a decision. */
|
|
13
|
+
| {
|
|
14
|
+
kind: "unavailable";
|
|
15
|
+
cause: "error" | "timeout" | "breaker_open";
|
|
16
|
+
}
|
|
17
|
+
/** The model responded but not in the `<block>…` contract shape. NOT a decision. */
|
|
18
|
+
| {
|
|
19
|
+
kind: "parse_error";
|
|
20
|
+
raw: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Parse the 207 classifier output contract:
|
|
24
|
+
* blocked: `<block>yes</block><category>Rule Name</category><reason>[Rule Name] …</reason>`
|
|
25
|
+
* allowed: `<block>no</block>`
|
|
26
|
+
* The contract says the ENTIRE response must begin with `<block>` — we strip `<thinking>` blocks
|
|
27
|
+
* first (CC-anchored: the 206 body's `dJi` removes closed thinking blocks AND a dangling unclosed
|
|
28
|
+
* tail before its own block-scan — a reasoning model's scratch space is not part of the verdict),
|
|
29
|
+
* then tolerate leading whitespace (models routinely emit a leading newline) but nothing else: any
|
|
30
|
+
* other preamble is a `parse_error` (fail-closed; 207 vocabulary: `automode-parsing-error`).
|
|
31
|
+
*
|
|
32
|
+
* Declared STRICTER than the CC parser (`iJi`: first `<block>` ANYWHERE in the response, closing tag
|
|
33
|
+
* optional): a free-scan lets a prompt-injected preamble seed the verdict; our contract-anchored
|
|
34
|
+
* parse costs only a fallback to the original human chain on the mismatch, never a silent allow.
|
|
35
|
+
*
|
|
36
|
+
* Strictness is polarity-asymmetric (codex review, confirmed HIGH):
|
|
37
|
+
* - an ALLOW must be UNAMBIGUOUS: `<block>no</block>` followed by anything but whitespace —
|
|
38
|
+
* a second conflicting `<block>yes</block>`, trailing prose, any tail at all — violates the
|
|
39
|
+
* contract and maps to `parse_error` (the ask flows the original human chain, never a silent
|
|
40
|
+
* allow on a malformed response);
|
|
41
|
+
* - a stated BLOCK tolerates a tail (that is where `<category>`/`<reason>` live, and extra
|
|
42
|
+
* content after a block verdict can only ever be judged in the blocking direction) — a
|
|
43
|
+
* `<block>yes</block>` with MISSING/empty `<category>`/`<reason>` still maps to `block`
|
|
44
|
+
* (with "" placeholders): the block intent is unambiguous, and downgrading a stated block
|
|
45
|
+
* to parse_error (⇒ the ask may later auto-deny OR a human may approve) would weaken the
|
|
46
|
+
* classifier's explicit verdict on the exact calls it flagged.
|
|
47
|
+
*/
|
|
48
|
+
export declare function parseAutoModeResponse(text: string): AutoModeVerdict;
|
|
49
|
+
/** What the decider hands the deployment's `classify` hook (the assembled prompt is the hook's job
|
|
50
|
+
* when it owns assembly; when using {@link buildAutoModePrompt} the decider passes its output). */
|
|
51
|
+
export interface AutoModeClassifyInput {
|
|
52
|
+
/** The pending tool call — FINAL post-hook/post-rewrite args (the same args the gate adjudicated). */
|
|
53
|
+
req: ToolCallRequest;
|
|
54
|
+
/** The human-readable text of the ask being decided (policy/safety message), when present. */
|
|
55
|
+
askMessage?: string;
|
|
56
|
+
}
|
|
57
|
+
/** The pluggable model leg: given the classify input, return the model's raw text response.
|
|
58
|
+
* Deployment-injected (roster cheap tier per [672]③); MAY throw / reject — the decider fail-closes. */
|
|
59
|
+
export type AutoModeClassifyFn = (input: AutoModeClassifyInput, signal?: AbortSignal) => Promise<string>;
|
|
60
|
+
export interface AutoModeDeciderOptions {
|
|
61
|
+
classify: AutoModeClassifyFn;
|
|
62
|
+
/** Hard cap on one classification round-trip. Default 15_000 ms (sema 裁量 — CC's constant is not
|
|
63
|
+
* established; a permission gate must not stall the whole run on a slow classifier). */
|
|
64
|
+
timeoutMs?: number;
|
|
65
|
+
/** Consecutive-failure threshold that opens the session breaker (default 3, [672]② "连续 N 失败").
|
|
66
|
+
* Failures = unavailable(error|timeout) + parse_error. A successful round (allow/block) resets it. */
|
|
67
|
+
failureThreshold?: number;
|
|
68
|
+
/** Fired ONCE when the breaker opens ([672]②: "本 session 退回非 auto + 一次性告警"). */
|
|
69
|
+
onBreakerOpen?: (info: {
|
|
70
|
+
consecutiveFailures: number;
|
|
71
|
+
lastCause: string;
|
|
72
|
+
}) => void;
|
|
73
|
+
}
|
|
74
|
+
export interface AutoModeDecider {
|
|
75
|
+
/** Never rejects. Any internal failure surfaces as `unavailable`/`parse_error` (fail-closed). */
|
|
76
|
+
decide(input: AutoModeClassifyInput, signal?: AbortSignal): Promise<AutoModeVerdict>;
|
|
77
|
+
/** True once the session breaker has opened (it never half-opens: [672]② is a SESSION fallback
|
|
78
|
+
* to non-auto, not a retry window — a flapping classifier must not oscillate the permission mode). */
|
|
79
|
+
breakerOpen(): boolean;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Session-scoped decider: timeout + fail-closed error mapping + a one-way circuit breaker.
|
|
83
|
+
* One instance per run/session — the breaker state is the session's "退回非 auto" latch.
|
|
84
|
+
*/
|
|
85
|
+
export declare function createAutoModeDecider(opts: AutoModeDeciderOptions): AutoModeDecider;
|
|
86
|
+
//# sourceMappingURL=auto-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-mode.d.ts","sourceRoot":"","sources":["../../src/core/auto-mode.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,uDAAuD;AACvD,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE;AACnB,2GAA2G;GACzG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACrD,yGAAyG;GACvG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,cAAc,CAAA;CAAE;AACtE,oFAAoF;GAClF;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAenE;AAED;oGACoG;AACpG,MAAM,WAAW,qBAAqB;IACpC,sGAAsG;IACtG,GAAG,EAAE,eAAe,CAAC;IACrB,8FAA8F;IAC9F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;wGACwG;AACxG,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEzG,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B;6FACyF;IACzF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;2GACuG;IACvG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gFAAgF;IAChF,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,mBAAmB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACpF;AAED,MAAM,WAAW,eAAe;IAC9B,iGAAiG;IACjG,MAAM,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACrF;2GACuG;IACvG,WAAW,IAAI,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,sBAAsB,GAAG,eAAe,CAsEnF"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// design/143 批2 ([672]-A, clay 拍 A 案): the auto-mode CLASSIFIER decides a permission `ask` in the
|
|
2
|
+
// core permission chain — CC 2.1.207 parity. In auto mode a surviving `ask` is routed to a small-model
|
|
3
|
+
// policy classifier instead of a human; the classifier's verdict maps to:
|
|
4
|
+
// allow → the ask resolves to allow (decisionReason "classifier") — no human, no suspend;
|
|
5
|
+
// block → deny (decisionReason "classifier"; the CC outcome vocabulary calls this `automode-blocked`);
|
|
6
|
+
// anything else (unreachable model / unparseable response / open breaker / timeout) → FAIL-CLOSED:
|
|
7
|
+
// the ask stays an ask and flows down the ORIGINAL resolution chain (durable suspend / onAsk /
|
|
8
|
+
// headless auto-deny). CC vocabulary: `automode-unavailable` / `automode-parsing-error` — explicitly
|
|
9
|
+
// "NOT a policy decision"; the classifier can never silently allow by failing (207 anchor, the BASE
|
|
10
|
+
// prompt's own outcome legend).
|
|
11
|
+
//
|
|
12
|
+
// Trust gate (207 `psl`, [672]①): classifier RULES are accepted from the user / flags / policy planes
|
|
13
|
+
// only — never from a repo-controlled layer. core enforces this STRUCTURALLY: there is no TaskSpec /
|
|
14
|
+
// file-plane field that feeds rules into the classifier; rules enter exclusively through the
|
|
15
|
+
// deployment-injected decider options (the caps/deps assembly face, which the repo cannot write).
|
|
16
|
+
/**
|
|
17
|
+
* Parse the 207 classifier output contract:
|
|
18
|
+
* blocked: `<block>yes</block><category>Rule Name</category><reason>[Rule Name] …</reason>`
|
|
19
|
+
* allowed: `<block>no</block>`
|
|
20
|
+
* The contract says the ENTIRE response must begin with `<block>` — we strip `<thinking>` blocks
|
|
21
|
+
* first (CC-anchored: the 206 body's `dJi` removes closed thinking blocks AND a dangling unclosed
|
|
22
|
+
* tail before its own block-scan — a reasoning model's scratch space is not part of the verdict),
|
|
23
|
+
* then tolerate leading whitespace (models routinely emit a leading newline) but nothing else: any
|
|
24
|
+
* other preamble is a `parse_error` (fail-closed; 207 vocabulary: `automode-parsing-error`).
|
|
25
|
+
*
|
|
26
|
+
* Declared STRICTER than the CC parser (`iJi`: first `<block>` ANYWHERE in the response, closing tag
|
|
27
|
+
* optional): a free-scan lets a prompt-injected preamble seed the verdict; our contract-anchored
|
|
28
|
+
* parse costs only a fallback to the original human chain on the mismatch, never a silent allow.
|
|
29
|
+
*
|
|
30
|
+
* Strictness is polarity-asymmetric (codex review, confirmed HIGH):
|
|
31
|
+
* - an ALLOW must be UNAMBIGUOUS: `<block>no</block>` followed by anything but whitespace —
|
|
32
|
+
* a second conflicting `<block>yes</block>`, trailing prose, any tail at all — violates the
|
|
33
|
+
* contract and maps to `parse_error` (the ask flows the original human chain, never a silent
|
|
34
|
+
* allow on a malformed response);
|
|
35
|
+
* - a stated BLOCK tolerates a tail (that is where `<category>`/`<reason>` live, and extra
|
|
36
|
+
* content after a block verdict can only ever be judged in the blocking direction) — a
|
|
37
|
+
* `<block>yes</block>` with MISSING/empty `<category>`/`<reason>` still maps to `block`
|
|
38
|
+
* (with "" placeholders): the block intent is unambiguous, and downgrading a stated block
|
|
39
|
+
* to parse_error (⇒ the ask may later auto-deny OR a human may approve) would weaken the
|
|
40
|
+
* classifier's explicit verdict on the exact calls it flagged.
|
|
41
|
+
*/
|
|
42
|
+
export function parseAutoModeResponse(text) {
|
|
43
|
+
// CC `dJi` verbatim: closed <thinking> blocks anywhere, then an unclosed trailing one.
|
|
44
|
+
const t = text
|
|
45
|
+
.replace(/<thinking>[\s\S]*?<\/thinking>/g, "")
|
|
46
|
+
.replace(/<thinking>[\s\S]*$/, "")
|
|
47
|
+
.trimStart();
|
|
48
|
+
const m = /^<block>\s*(yes|no)\s*<\/block>/i.exec(t);
|
|
49
|
+
if (!m)
|
|
50
|
+
return { kind: "parse_error", raw: text };
|
|
51
|
+
if (m[1].toLowerCase() === "no") {
|
|
52
|
+
if (t.slice(m[0].length).trim() !== "")
|
|
53
|
+
return { kind: "parse_error", raw: text };
|
|
54
|
+
return { kind: "allow" };
|
|
55
|
+
}
|
|
56
|
+
const category = /<category>([\s\S]*?)<\/category>/i.exec(t)?.[1]?.trim() ?? "";
|
|
57
|
+
const reason = /<reason>([\s\S]*?)<\/reason>/i.exec(t)?.[1]?.trim() ?? "";
|
|
58
|
+
return { kind: "block", category, reason };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Session-scoped decider: timeout + fail-closed error mapping + a one-way circuit breaker.
|
|
62
|
+
* One instance per run/session — the breaker state is the session's "退回非 auto" latch.
|
|
63
|
+
*/
|
|
64
|
+
export function createAutoModeDecider(opts) {
|
|
65
|
+
const timeoutMs = opts.timeoutMs ?? 15_000;
|
|
66
|
+
const threshold = Math.max(1, Math.floor(opts.failureThreshold ?? 3));
|
|
67
|
+
let consecutiveFailures = 0;
|
|
68
|
+
let open = false;
|
|
69
|
+
const recordFailure = (cause) => {
|
|
70
|
+
consecutiveFailures++;
|
|
71
|
+
if (!open && consecutiveFailures >= threshold) {
|
|
72
|
+
open = true;
|
|
73
|
+
try {
|
|
74
|
+
opts.onBreakerOpen?.({ consecutiveFailures, lastCause: cause });
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// the alarm hook must never break the gate
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
return {
|
|
82
|
+
breakerOpen: () => open,
|
|
83
|
+
async decide(input, signal) {
|
|
84
|
+
if (open)
|
|
85
|
+
return { kind: "unavailable", cause: "breaker_open" };
|
|
86
|
+
let timer;
|
|
87
|
+
try {
|
|
88
|
+
const raw = await new Promise((resolve, reject) => {
|
|
89
|
+
let settled = false;
|
|
90
|
+
timer = setTimeout(() => {
|
|
91
|
+
if (!settled) {
|
|
92
|
+
settled = true;
|
|
93
|
+
reject(new AutoModeTimeout());
|
|
94
|
+
}
|
|
95
|
+
}, timeoutMs);
|
|
96
|
+
opts.classify(input, signal).then((v) => {
|
|
97
|
+
if (!settled) {
|
|
98
|
+
settled = true;
|
|
99
|
+
resolve(v);
|
|
100
|
+
}
|
|
101
|
+
}, (e) => {
|
|
102
|
+
if (!settled) {
|
|
103
|
+
settled = true;
|
|
104
|
+
reject(e);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
// codex review (confirmed MED): re-check the latch AFTER the round-trip. Concurrent decides
|
|
109
|
+
// all enter while `open === false`; if the OTHER calls' failures opened the breaker while this
|
|
110
|
+
// classify was in flight, its late verdict must not leak through — the one-way "session fell
|
|
111
|
+
// back to non-auto" latch covers in-flight rounds too (no allow/block escapes an open breaker).
|
|
112
|
+
if (open)
|
|
113
|
+
return { kind: "unavailable", cause: "breaker_open" };
|
|
114
|
+
const verdict = parseAutoModeResponse(raw);
|
|
115
|
+
if (verdict.kind === "parse_error")
|
|
116
|
+
recordFailure("parse_error");
|
|
117
|
+
else
|
|
118
|
+
consecutiveFailures = 0; // allow AND block both prove the leg healthy
|
|
119
|
+
return verdict;
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
// fable review (confirmed LOW): a CANCELLED classify (the task/run abort signal fired) says
|
|
123
|
+
// nothing about classifier health — counting it would let one cancelled parallel batch open
|
|
124
|
+
// the one-way session breaker and fire a misattributed alarm. Still fail-closed (unavailable
|
|
125
|
+
// → the ask flows the original chain); just not a failure-streak event.
|
|
126
|
+
if (signal?.aborted)
|
|
127
|
+
return { kind: "unavailable", cause: "error" };
|
|
128
|
+
const timedOut = e instanceof AutoModeTimeout;
|
|
129
|
+
recordFailure(timedOut ? "timeout" : "error");
|
|
130
|
+
return { kind: "unavailable", cause: timedOut ? "timeout" : "error" };
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
if (timer !== undefined)
|
|
134
|
+
clearTimeout(timer);
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
class AutoModeTimeout extends Error {
|
|
140
|
+
constructor() {
|
|
141
|
+
super("auto-mode classify timeout");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=auto-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-mode.js","sourceRoot":"","sources":["../../src/core/auto-mode.ts"],"names":[],"mappings":"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"}
|
package/dist/core/hooks.d.ts
CHANGED
|
@@ -107,7 +107,7 @@ export interface Hooks {
|
|
|
107
107
|
* `TaskSpec.shellGate` doctrine (design/80 D-E), not an explicit per-tool mark.
|
|
108
108
|
* - `"planMode"` — the design/108 plan-mode write-deny short-circuit (a read-only fidelity gate).
|
|
109
109
|
*/
|
|
110
|
-
export type PermissionDeniedSource = "policy" | "hook" | "safety" | "shellGate" | "planMode";
|
|
110
|
+
export type PermissionDeniedSource = "policy" | "hook" | "safety" | "shellGate" | "planMode" | "classifier";
|
|
111
111
|
/** The payload a {@link Hooks.permissionDenied} callback observes (CC-exact fields + `source`). */
|
|
112
112
|
export interface PermissionDeniedPayload {
|
|
113
113
|
toolName: string;
|
|
@@ -351,6 +351,25 @@ export interface ToolGateInput {
|
|
|
351
351
|
* per-tool mark — attributes a tighten-deny to `source:"shellGate"` instead of `"safety"`.
|
|
352
352
|
*/
|
|
353
353
|
shellGated?: boolean;
|
|
354
|
+
/**
|
|
355
|
+
* design/143 批2 ([672]-A, CC 2.1.207 auto mode): when present, a surviving `ask` is routed to the
|
|
356
|
+
* small-model policy CLASSIFIER before any human/durable resolution:
|
|
357
|
+
* - verdict `allow` → the ask resolves to allow (`decisionReason:"classifier"`) — no suspend, no onAsk;
|
|
358
|
+
* - verdict `block` → deny (`decisionReason:"classifier"`, `source:"classifier"`; CC `automode-blocked`);
|
|
359
|
+
* - `unavailable`/`parse_error` → FAIL-CLOSED: the ask continues down the ORIGINAL chain
|
|
360
|
+
* (durable suspend / onAsk / headless auto-deny) exactly as if auto mode were absent
|
|
361
|
+
* (CC `automode-unavailable`/`automode-parsing-error` — "NOT a policy decision").
|
|
362
|
+
* SCOPE (declared semantic): this covers EVERY surviving ask, INCLUDING the deterministic egress/
|
|
363
|
+
* irreversibility safety tightens — auto mode is the deployment's explicit choice to let the
|
|
364
|
+
* classifier be the "explicit ask-resolution" for this session (its rule set covers exactly those
|
|
365
|
+
* action classes: outbound writes, irreversible operations, and sensitive-value handling). A
|
|
366
|
+
* deployment that wants human-only
|
|
367
|
+
* resolution for safety asks simply does not arm auto mode. The classifier can never AUTO-ALLOW by
|
|
368
|
+
* failing — only an affirmative `<block>no</block>` allows.
|
|
369
|
+
*/
|
|
370
|
+
autoMode?: {
|
|
371
|
+
decider: import("./auto-mode.js").AutoModeDecider;
|
|
372
|
+
};
|
|
354
373
|
}
|
|
355
374
|
/**
|
|
356
375
|
* The design/37 **two-phase tool gate** — the single chokepoint that makes the load-bearing invariant
|
package/dist/core/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/core/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/core/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/core/hooks.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { decisionText } from "./tool-policy.js";
|
|
2
|
+
import { inlineUntrusted } from "./untrusted-text.js";
|
|
2
3
|
/**
|
|
3
4
|
* 1.256 复审 MED-1 — observe-only payload isolation for {@link Hooks.permissionDenied}: clone the tool
|
|
4
5
|
* args before they ride the observer payload, so a hook mutating `payload.input` can never pollute the
|
|
@@ -194,10 +195,49 @@ export async function runToolGate(input) {
|
|
|
194
195
|
currentInput = policyRewrite;
|
|
195
196
|
req.args = policyRewrite;
|
|
196
197
|
}
|
|
198
|
+
// design/143 批2 (CC 207 auto mode): route the surviving ask to the classifier FIRST — before the
|
|
199
|
+
// durable-suspend / onAsk legs — on the FINAL post-rewrite args (the same args a human would see).
|
|
200
|
+
// Ordering is load-bearing: after the policyRewrite merge (the classifier judges redacted args, and
|
|
201
|
+
// an allow executes the redacted form), before suspendAsk (an allow/deny must not mint a checkpoint).
|
|
202
|
+
// Fail-closed by construction: only an affirmative `allow` verdict skips the human chain; `block`
|
|
203
|
+
// funnels into the single deny exit below; anything else leaves `decision` untouched as the ask.
|
|
204
|
+
if (input.autoMode && decision.action === "ask") {
|
|
205
|
+
// The decider CONTRACT says decide never rejects — but the field is an interface a deployment
|
|
206
|
+
// may hand-implement, and a throwing classifier must degrade to "unavailable" (the ask flows
|
|
207
|
+
// the original chain), never fault the whole gate.
|
|
208
|
+
const verdict = await input.autoMode.decider
|
|
209
|
+
.decide({ req, askMessage: decisionText(decision) }, input.abortSignal)
|
|
210
|
+
.catch(() => ({ kind: "unavailable", cause: "error" }));
|
|
211
|
+
if (verdict.kind === "allow") {
|
|
212
|
+
decision = {
|
|
213
|
+
action: "allow",
|
|
214
|
+
message: "auto-mode classifier allowed this call",
|
|
215
|
+
decisionReason: "classifier",
|
|
216
|
+
...(policyRewrite !== undefined ? { updatedInput: policyRewrite } : {}),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
else if (verdict.kind === "block") {
|
|
220
|
+
// codex review (confirmed MED): the category/reason are CLASSIFIER-MODEL output — untrusted
|
|
221
|
+
// text headed for a model-facing feedback line (`formatHookFeedback` deliberately does not
|
|
222
|
+
// escape). Inline-sanitize so a crafted reason cannot forge a `</system-reminder>` boundary
|
|
223
|
+
// or smuggle a new top-level prompt line into the deny message.
|
|
224
|
+
const reason = verdict.reason ? inlineUntrusted(verdict.reason) : "";
|
|
225
|
+
const category = verdict.category ? inlineUntrusted(verdict.category) : "";
|
|
226
|
+
decision = {
|
|
227
|
+
action: "deny",
|
|
228
|
+
message: `auto-mode classifier blocked this call${reason ? `: ${reason}` : category ? `: [${category}]` : ""}`,
|
|
229
|
+
decisionReason: "classifier",
|
|
230
|
+
};
|
|
231
|
+
denySource = "classifier";
|
|
232
|
+
}
|
|
233
|
+
// unavailable / parse_error: fall through — the ask continues down the original chain.
|
|
234
|
+
}
|
|
197
235
|
// design/45: in durable mode, persist a checkpoint + abort instead of asking synchronously. The
|
|
198
236
|
// suspend decision lives ONLY in this `ask` branch (the policy already ran and stays pure). On
|
|
199
237
|
// `undefined` (no durable mode, or capture failed) fall through to the synchronous onAsk path.
|
|
200
|
-
|
|
238
|
+
// design/143: guarded on the decision STILL being an ask — a classifier allow/deny above must not
|
|
239
|
+
// mint a checkpoint or invoke onAsk (the ask is already resolved).
|
|
240
|
+
if (suspendAsk && decision.action === "ask") {
|
|
201
241
|
// design/80 D-2 (council BLOCKER fix): thread the SAFETY grade to the mint-site from the AUTHORITATIVE
|
|
202
242
|
// TOOL MARKS (`input.egress` / `input.irreversibility`), NOT from how the ask arose. The gate's egress/
|
|
203
243
|
// irreversibility tightens only fire from a surviving `allow`; if a POLICY or PreToolUse HOOK already
|
|
@@ -217,7 +257,10 @@ export async function runToolGate(input) {
|
|
|
217
257
|
return { suspend: suspended, preToolContext };
|
|
218
258
|
}
|
|
219
259
|
}
|
|
220
|
-
|
|
260
|
+
// design/143: same guard — a classifier-resolved decision never re-enters the onAsk chain.
|
|
261
|
+
if (decision.action === "ask") {
|
|
262
|
+
decision = await resolveAsk(decision, req);
|
|
263
|
+
}
|
|
221
264
|
}
|
|
222
265
|
if (decision.action === "deny") {
|
|
223
266
|
// design/134 R5 — the SINGLE deny exit of the adjudicate chain (every path funnels here: a direct
|
package/dist/core/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/core/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA+
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/core/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,6 +60,10 @@ export declare class FileMemoryEngineBackend implements MemoryBackend {
|
|
|
60
60
|
/** B2 — inbound-gate findings accumulated by read-side syncs; the engine drains them into
|
|
61
61
|
* `HarvestReport.inboundFindings` at harvest. */
|
|
62
62
|
private inboundFindings;
|
|
63
|
+
/** Batch-planning scan memo (applyPatchesLocked only): planning reads pre-batch disk exclusively,
|
|
64
|
+
* so one `readScope(scope, false)` per scope serves every patch of the batch. Set for the planning
|
|
65
|
+
* loop, cleared before EXECUTE mutates the disk. Never caches `sync:true` reads. */
|
|
66
|
+
private batchScan;
|
|
63
67
|
/** ⚠️ [508] service 逮的分家坑:不显式传 `controlDir` 时,控制平面按无参 `resolveMemoryEngineRoot()`
|
|
64
68
|
* 派生(env/默认 config 根)——若你的记忆目录带自定义根,控制面会与记忆目录分家。自建 backend 的
|
|
65
69
|
* consumer 应显式钉 `controlDir`(engine 同参)。`now` = 注入时钟(determinism,engine 同款)。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-backend.d.ts","sourceRoot":"","sources":["../../../src/core/memory-engine/file-backend.ts"],"names":[],"mappings":"AAwBA,OAAO,EAWL,YAAY,EACb,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE7I;0DAC0D;AAC1D,eAAO,MAAM,qBAAqB,cAAc,CAAC;AAEjD,yGAAyG;AACzG,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,gGAAgG;IAChG,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IACJ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,mGAAmG;IACnG,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC;CAC7E,GACL,gBAAgB,EAAE,CA0CpB;AA2CD;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAwB,YAAW,aAAa;IAC3D,mGAAmG;IACnG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B;;iGAE6F;IAC7F,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC,6FAA6F;IAC7F,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IAEnC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAqC;IAEnD;sDACkD;IAClD,OAAO,CAAC,eAAe,CAA0B;IAEjD;;qFAEiF;gBACrE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KAAO;IAS/E;;qDAEiD;IACjD,iBAAiB,IAAI,IAAI;IAOzB,mFAAmF;IACnF,oBAAoB,IAAI,gBAAgB,EAAE;IAM1C;;0EAEsE;IACtE,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAInD,OAAO,CAAC,UAAU;IAIlB;;;;2FAIuF;IACvF,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,UAAU;IA6BlB;6DACyD;IACzD,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,cAAc;IAyCtB;wGACoG;IACpG,OAAO,CAAC,gBAAgB;IA0BxB,uGAAuG;IACvG,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,QAAQ;IAIhB;sGACkG;IAClG,OAAO,CAAC,WAAW;IAkBnB;;;;;;;mGAO+F;IAC/F,OAAO,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"file-backend.d.ts","sourceRoot":"","sources":["../../../src/core/memory-engine/file-backend.ts"],"names":[],"mappings":"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"}
|