@mcp-index/sdk 0.14.1 → 0.16.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 +26 -0
- package/README.md +53 -22
- package/dist/src/canonical.d.ts +7 -0
- package/dist/src/canonical.d.ts.map +1 -1
- package/dist/src/canonical.js +56 -0
- package/dist/src/canonical.js.map +1 -1
- package/dist/src/fileLock.d.ts +20 -0
- package/dist/src/fileLock.d.ts.map +1 -0
- package/dist/src/fileLock.js +191 -0
- package/dist/src/fileLock.js.map +1 -0
- package/dist/src/gate.d.ts +23 -3
- package/dist/src/gate.d.ts.map +1 -1
- package/dist/src/gate.js +56 -3
- package/dist/src/gate.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/listingFilter.d.ts +41 -0
- package/dist/src/listingFilter.d.ts.map +1 -0
- package/dist/src/listingFilter.js +186 -0
- package/dist/src/listingFilter.js.map +1 -0
- package/dist/src/pendingStore.d.ts +53 -0
- package/dist/src/pendingStore.d.ts.map +1 -0
- package/dist/src/pendingStore.js +307 -0
- package/dist/src/pendingStore.js.map +1 -0
- package/dist/src/preflight.d.ts +49 -6
- package/dist/src/preflight.d.ts.map +1 -1
- package/dist/src/preflight.js +487 -6
- package/dist/src/preflight.js.map +1 -1
- package/dist/src/wrap.d.ts +27 -14
- package/dist/src/wrap.d.ts.map +1 -1
- package/dist/src/wrap.js +196 -19
- package/dist/src/wrap.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,8 +5,34 @@ additive feature, patch = fix). Backward-compatible additions only in 0.2.0.
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## 0.16.0 - 2026-10-11
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- Under guard and strict, a new tool on an already-pinned server is left out of the tool list and cannot be called until it is reviewed. `approvePending(name, digest)` pins the stored definition when the digest over its full public contract matches. `onWithheld` carries that digest.
|
|
13
|
+
- A change that arrives without an upgrade is held for review and is never bulk-approved. `newTools: "tofu"` restores first-sight trust for that wrapper.
|
|
14
|
+
- The file pin store takes a lock and merges from disk before each write, so a Python CLI approval and a TypeScript process on the same pin file cannot lose each other's pins. The lock uses only Node built-ins and works on Windows. The package has no runtime dependencies. Pins may carry an optional `launchKey`.
|
|
15
|
+
- A pin store that goes missing, stops being a regular file, or no longer holds pins for a server it held before is treated as tampered, whether that happens while the process runs or before a restart. Pins already loaded are kept, every call holds, and the store refuses writes. `resetPins(serverId)` is the deliberate recovery: it clears the store and its ever-pinned record so the next list pins from the current contract.
|
|
16
|
+
- A pin reload that fails under a lock timeout classifies held tools as changed-without-upgrade, not floating.
|
|
17
|
+
- The SDK client's own listChanged refresh is still not filtered.
|
|
18
|
+
|
|
19
|
+
## 0.15.0 - 2026-10-05
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Under guard and strict, a tool whose description or input-schema text changed is left out of the tool list, and a call to that tool holds until it is reviewed.
|
|
24
|
+
- Monitor still shows the full list.
|
|
25
|
+
- When you pass a `serverId`, pins are kept on disk by default, under `MCPINDEX_STATE_DIR/pins/<server id>.json` or `~/.mcpindex/pins/<server id>.json`, and survive a restart. Without a `serverId` they stay in memory, as before, so unnamed sessions never share a pin file. `pinStore: "memory"` or `pinStore: "file"` overrides either default.
|
|
26
|
+
- These fields are not yet covered, so a change in only one of them still reaches the host: tool title, icons, _meta, annotations.title, a new annotation key, and first-time outputSchema text on an otherwise unchanged tool.
|
|
27
|
+
- The SDK client's listChanged refresh calls the inner client, so that refresh is not filtered.
|
|
28
|
+
- A list longer than 2,000 tools, or a list the gate cannot filter, comes back with every tool left out. It does not throw.
|
|
29
|
+
|
|
8
30
|
## 0.14.1 - 2026-10-04
|
|
9
31
|
|
|
32
|
+
### Security
|
|
33
|
+
|
|
34
|
+
- Fixes GHSA-g737-65vx-q7qm (https://github.com/mcpindex-ai/mcpindex-sdk-ts/security/advisories/GHSA-g737-65vx-q7qm), cases where a changed tool contract was treated as unchanged or auto-accepted. Affected: @mcp-index/sdk < 0.14.1 and mcpindex-gate < 0.16.1.
|
|
35
|
+
|
|
10
36
|
### Changed
|
|
11
37
|
|
|
12
38
|
- Some changes that used to auto-accept now hold for review.
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
The TypeScript client of [mcpindex.ai](https://mcpindex.ai) - the drift-monitored
|
|
4
4
|
MCP server index with an in-path trust gate for agent tool calls.
|
|
5
5
|
|
|
6
|
-
Pre-flight MCP tool-contract drift interceptor. One line
|
|
6
|
+
Pre-flight MCP tool-contract drift interceptor. One line - `wrap()` an MCP client
|
|
7
7
|
session and the gate **HOLDs a tool call before your agent acts** the moment the
|
|
8
8
|
tool's contract silently changes from what you pinned. In-path, on your host; no
|
|
9
9
|
credentials, no egress.
|
|
@@ -22,28 +22,54 @@ Peer dependency: `@modelcontextprotocol/sdk` >=1.0.0 <2 (the wrapper gates by se
|
|
|
22
22
|
import { wrap } from '@mcp-index/sdk';
|
|
23
23
|
|
|
24
24
|
// wrap an already-connected MCP client session
|
|
25
|
-
const guarded = wrap(session); // pins
|
|
25
|
+
const guarded = wrap(session); // in-memory pins for this process only
|
|
26
26
|
|
|
27
27
|
// use `guarded` exactly like `session`; a drifted contract is HELD before the call
|
|
28
28
|
// fires. A PreflightHold surfaces (Guard/Strict) so you can route the agent to
|
|
29
29
|
// Review / Re-pin / Validate.
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
`wrap(session)`
|
|
33
|
-
process
|
|
34
|
-
|
|
32
|
+
`wrap(session)` with no server id keeps an **in-memory** pin baseline that dies
|
|
33
|
+
with the process. Pass a stable server id and the baseline is kept on disk and
|
|
34
|
+
survives restarts, under `MCPINDEX_STATE_DIR/pins/<server id>.json` or
|
|
35
|
+
`~/.mcpindex/pins/<server id>.json`:
|
|
35
36
|
|
|
36
37
|
```ts
|
|
37
|
-
import { wrap
|
|
38
|
+
import { wrap } from '@mcp-index/sdk';
|
|
39
|
+
|
|
40
|
+
const guarded = wrap(session, { serverId: 'my-mcp-server' }); // pins on disk
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`pinStore: 'memory'` keeps pins in the process even with a server id, and
|
|
44
|
+
`pinStore: 'file'` forces the file store without one. You can also pass your own
|
|
45
|
+
`PreflightPin` as `pin`.
|
|
38
46
|
|
|
39
|
-
|
|
40
|
-
|
|
47
|
+
### New tools on an already-pinned server
|
|
48
|
+
|
|
49
|
+
Under `guard` and `strict`, when a server you already pinned adds a tool, that
|
|
50
|
+
tool is left out of the list and a call to it holds. It is not trusted mid-session on
|
|
51
|
+
first sight. A process running as you that rewrites the pin store with its own
|
|
52
|
+
well-formed pins is still trusted. `onWithheld` receives the definition digest. Pin
|
|
53
|
+
the stored definition with `approvePending(name, digest)` when you have reviewed it:
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
const guarded = wrap(session, {
|
|
57
|
+
serverId: 'my-mcp-server',
|
|
58
|
+
onWithheld: (_server, name, _reason, digest) => {
|
|
59
|
+
// review the held tool, then:
|
|
60
|
+
// guarded.approvePending(name, digest);
|
|
61
|
+
},
|
|
62
|
+
});
|
|
41
63
|
```
|
|
42
64
|
|
|
43
|
-
|
|
65
|
+
Pass `newTools: 'tofu'` to restore first-sight trust for new tools on that
|
|
66
|
+
wrapper. The MCP client's own `listChanged` refresh calls the inner client and
|
|
67
|
+
is not filtered.
|
|
68
|
+
|
|
69
|
+
## Sign in (optional) - `mcpindex login`
|
|
44
70
|
|
|
45
71
|
Signs you in with GitHub and stores a free API key at `~/.mcpindex/credentials.json`
|
|
46
|
-
(mode `0600`), used to authenticate deeper trust checks. Optional
|
|
72
|
+
(mode `0600`), used to authenticate deeper trust checks. Optional - `wrap()` needs no
|
|
47
73
|
account and sends nothing on its own.
|
|
48
74
|
|
|
49
75
|
```sh
|
|
@@ -57,40 +83,45 @@ npx -p @mcp-index/sdk mcpindex login
|
|
|
57
83
|
```
|
|
58
84
|
|
|
59
85
|
The key is minted server-side after GitHub OAuth and handed to a one-shot HTTP listener
|
|
60
|
-
bound to `127.0.0.1`
|
|
86
|
+
bound to `127.0.0.1` - it never transits a third party. Point `MCPINDEX_WEB_BASE` at a
|
|
61
87
|
different host to override the default (`https://mcpindex.ai`).
|
|
62
88
|
|
|
63
89
|
## What it does
|
|
64
90
|
|
|
65
|
-
- Pins each MCP tool's contract
|
|
91
|
+
- Pins each MCP tool's contract on first sight in an empty store. With a `serverId`
|
|
92
|
+
(or `pinStore: 'file'`), those pins are kept on disk and survive restarts. Without
|
|
93
|
+
one they stay in memory for the process only.
|
|
94
|
+
- Under `guard` and `strict`, a new tool on an already-pinned server is left out of
|
|
95
|
+
the list until you review it (`approvePending`). `newTools: 'tofu'` restores
|
|
96
|
+
first-sight trust for that wrapper.
|
|
66
97
|
- Runs a **deterministic** contract-diff (the ChangeKind taxonomy: added-required-param,
|
|
67
98
|
constraint-narrowed, annotation-flip-to-destructive, output-schema-changed,
|
|
68
|
-
type/enum/removed,
|
|
69
|
-
- **HOLDs** the call with the
|
|
99
|
+
type/enum/removed, ...) plus an injection/exfil marker scan over input and output schema.
|
|
100
|
+
- **HOLDs** the call with the mcpindex hold banner when the contract drifted; **PROCEEDs** silently
|
|
70
101
|
on a benign change (no false alarm).
|
|
71
102
|
- Postures: `Monitor` (notify + proceed) / `Guard` (default; hold dangerous) /
|
|
72
103
|
`Strict` (hold any drift).
|
|
73
104
|
- Grades each call's **blast radius** (Tier-0a action classification) on the verdict:
|
|
74
|
-
action type (read / write / delete / send /
|
|
75
|
-
autonomy ceiling, computed locally from the live contract. **Advisory**
|
|
105
|
+
action type (read / write / delete / send / ...), reversibility, egress, and a static
|
|
106
|
+
autonomy ceiling, computed locally from the live contract. **Advisory** - it rides
|
|
76
107
|
alongside the decision and never moves HOLD/PROCEED. On by default; opt out with
|
|
77
108
|
`MCPINDEX_ACTION_CLASSIFICATION_ENABLED=0`.
|
|
78
109
|
|
|
79
110
|
## What it is NOT
|
|
80
111
|
|
|
81
|
-
The verdict is a **contract-diff, not a safety oracle**
|
|
112
|
+
The verdict is a **contract-diff, not a safety oracle** - it tells you the contract
|
|
82
113
|
*changed* versus your pin, not that the new contract is safe. It does not "block attacks"
|
|
83
114
|
or "guarantee safe." You decide what a HOLD means for your agent.
|
|
84
115
|
|
|
85
116
|
## Result-content scanning (opt-in, OFF by default)
|
|
86
117
|
|
|
87
118
|
Beyond the contract diff, the SDK can scan a tool's **returned result** (text blocks and
|
|
88
|
-
`structuredContent`) for prompt-injection / exfiltration / credential-path markers
|
|
119
|
+
`structuredContent`) for prompt-injection / exfiltration / credential-path markers - the
|
|
89
120
|
attack where a *compromised result*, not a changed contract, tries to steer your agent. It
|
|
90
121
|
is **off by default** (zero behavior change) and enabled per-wrap:
|
|
91
122
|
|
|
92
123
|
```ts
|
|
93
|
-
const safe = wrap(session, { scanResults: true, onHold: (v) => { /*
|
|
124
|
+
const safe = wrap(session, { scanResults: true, onHold: (v) => { /* ... */ } });
|
|
94
125
|
```
|
|
95
126
|
|
|
96
127
|
Once on, a tainted result is **withheld under `Guard` / `Strict`** and **passes through
|
|
@@ -100,7 +131,7 @@ client's `wrap(..., scan_results=...)`.
|
|
|
100
131
|
|
|
101
132
|
## Drift telemetry (opt-in, OFF by default)
|
|
102
133
|
|
|
103
|
-
The SDK can report **that** a tool's contract drifted
|
|
134
|
+
The SDK can report **that** a tool's contract drifted - so mcpindex can track drift on servers
|
|
104
135
|
it can't crawl itself (private / auth-gated). It is **off by default and sends nothing** unless
|
|
105
136
|
you turn it on:
|
|
106
137
|
|
|
@@ -113,7 +144,7 @@ When enabled, each tool you pin and each contract drift sends **one one-way sign
|
|
|
113
144
|
- **What it sends:** fingerprints (HMAC) of the server/tool id, the contract hashes, the
|
|
114
145
|
change type (the fixed ChangeKind vocabulary), a safety flag, an **hour-rounded** timestamp,
|
|
115
146
|
a random install id (a token that links one machine's signals so distinct installs can be
|
|
116
|
-
counted
|
|
147
|
+
counted - not derived from you), and a client SDK tag (`py` or `ts`).
|
|
117
148
|
- **What it NEVER sends:** tool schemas, arguments, descriptions, URLs, or any of your data.
|
|
118
149
|
The fingerprints carry no plaintext name and they are **not anonymity**: the salt is a
|
|
119
150
|
constant in this client and the registry is public, so a listed server's fingerprint
|
|
@@ -140,5 +171,5 @@ Three ways to bring mcpindex into an agent, for different surfaces:
|
|
|
140
171
|
|
|
141
172
|
## License
|
|
142
173
|
|
|
143
|
-
PolyForm Noncommercial 1.0.0
|
|
174
|
+
PolyForm Noncommercial 1.0.0 - (c) Bhartis LLC. Free for noncommercial use; commercial use
|
|
144
175
|
requires a separate license. See [`LICENSE`](./LICENSE) and https://mcpindex.ai.
|
package/dist/src/canonical.d.ts
CHANGED
|
@@ -43,4 +43,11 @@ export declare function toolHash(name: string, description: string, inputSchema:
|
|
|
43
43
|
* to `hashTool({description: null})` that bypasses the wrapper's normalization —
|
|
44
44
|
* we keep the `""` coercion (it is the wrapper-faithful value) and note the gap. */
|
|
45
45
|
export declare function hashTool(defn: Record<string, unknown>): string;
|
|
46
|
+
/**
|
|
47
|
+
* Digest over the whole public contract a person reviews (port of Python
|
|
48
|
+
* ``approval_digest``). Covers name, description, inputSchema, outputSchema,
|
|
49
|
+
* annotations, and title. Pending approve tokens use this; pin drift still
|
|
50
|
+
* uses ``hashTool``.
|
|
51
|
+
*/
|
|
52
|
+
export declare function approvalDigest(defn: Record<string, unknown>): string;
|
|
46
53
|
//# sourceMappingURL=canonical.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,kDAAkD;AAClD,MAAM,MAAM,IAAI,GACZ,IAAI,GACJ,OAAO,GACP,MAAM,GACN,MAAM,GACN,IAAI,EAAE,GACN;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAiM1B;kCACkC;AAClC,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED;;yEAEyE;AACzE,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAElD;AAED;8EAC8E;AAC9E,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,MAAM,CAOR;AAED;;;;;;;;;oFASoF;AACpF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAY9D"}
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,kDAAkD;AAClD,MAAM,MAAM,IAAI,GACZ,IAAI,GACJ,OAAO,GACP,MAAM,GACN,MAAM,GACN,IAAI,EAAE,GACN;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAiM1B;kCACkC;AAClC,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED;;yEAEyE;AACzE,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAElD;AAED;8EAC8E;AAC9E,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,MAAM,CAOR;AAED;;;;;;;;;oFASoF;AACpF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAY9D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA6BpE"}
|
package/dist/src/canonical.js
CHANGED
|
@@ -265,4 +265,60 @@ export function hashTool(defn) {
|
|
|
265
265
|
: {};
|
|
266
266
|
return toolHash(name, desc, inSch);
|
|
267
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* Digest over the whole public contract a person reviews (port of Python
|
|
270
|
+
* ``approval_digest``). Covers name, description, inputSchema, outputSchema,
|
|
271
|
+
* annotations, and title. Pending approve tokens use this; pin drift still
|
|
272
|
+
* uses ``hashTool``.
|
|
273
|
+
*/
|
|
274
|
+
export function approvalDigest(defn) {
|
|
275
|
+
const payload = {
|
|
276
|
+
name: defn.name === undefined || defn.name === null ? "" : String(defn.name),
|
|
277
|
+
description: defn.description === undefined || defn.description === null
|
|
278
|
+
? ""
|
|
279
|
+
: String(defn.description),
|
|
280
|
+
inputSchema: defn.inputSchema !== null &&
|
|
281
|
+
typeof defn.inputSchema === "object" &&
|
|
282
|
+
!Array.isArray(defn.inputSchema)
|
|
283
|
+
? defn.inputSchema
|
|
284
|
+
: {},
|
|
285
|
+
};
|
|
286
|
+
const outp = defn.outputSchema;
|
|
287
|
+
if (outp !== null && typeof outp === "object" && !Array.isArray(outp)) {
|
|
288
|
+
payload.outputSchema = outp;
|
|
289
|
+
}
|
|
290
|
+
const ann = defn.annotations;
|
|
291
|
+
if (ann !== null && typeof ann === "object" && !Array.isArray(ann)) {
|
|
292
|
+
payload.annotations = ann;
|
|
293
|
+
}
|
|
294
|
+
const title = defn.title;
|
|
295
|
+
if (typeof title === "string" && title.length > 0) {
|
|
296
|
+
payload.title = title;
|
|
297
|
+
}
|
|
298
|
+
// Python: json.dumps(..., sort_keys=True, separators=(",", ":"), ensure_ascii=False)
|
|
299
|
+
const stable = dumpsSorted(payload);
|
|
300
|
+
return createHash("sha256").update(Buffer.from(stable, "utf8")).digest("hex");
|
|
301
|
+
}
|
|
302
|
+
function dumpsSorted(value) {
|
|
303
|
+
if (value === null)
|
|
304
|
+
return "null";
|
|
305
|
+
if (typeof value === "boolean")
|
|
306
|
+
return value ? "true" : "false";
|
|
307
|
+
if (typeof value === "number") {
|
|
308
|
+
if (!Number.isFinite(value))
|
|
309
|
+
throw new Error("non-finite number");
|
|
310
|
+
return Number.isInteger(value) ? String(value) : JSON.stringify(value);
|
|
311
|
+
}
|
|
312
|
+
if (typeof value === "string")
|
|
313
|
+
return JSON.stringify(value);
|
|
314
|
+
if (Array.isArray(value)) {
|
|
315
|
+
return "[" + value.map(dumpsSorted).join(",") + "]";
|
|
316
|
+
}
|
|
317
|
+
if (typeof value === "object") {
|
|
318
|
+
const keys = Object.keys(value).sort();
|
|
319
|
+
const parts = keys.map((key) => JSON.stringify(key) + ":" + dumpsSorted(value[key]));
|
|
320
|
+
return "{" + parts.join(",") + "}";
|
|
321
|
+
}
|
|
322
|
+
throw new Error("unsupported JSON value");
|
|
323
|
+
}
|
|
268
324
|
//# sourceMappingURL=canonical.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/canonical.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/canonical.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exclusive lock for a pin or pending file.
|
|
3
|
+
*
|
|
4
|
+
* Sibling path ``<path>.lck``, created with ``O_CREAT | O_EXCL`` (and
|
|
5
|
+
* ``O_NOFOLLOW`` where it exists). The holder writes its pid and an ISO
|
|
6
|
+
* timestamp, then closes the file. Another process that sees the file waits
|
|
7
|
+
* and retries. A lock older than the stale threshold is broken by renaming it
|
|
8
|
+
* aside and unlinking the aside name; only the rename winner proceeds. Release
|
|
9
|
+
* unlinks the file when it still carries our pid and timestamp.
|
|
10
|
+
*
|
|
11
|
+
* Built from the Node standard library only. No native addons. An empty
|
|
12
|
+
* leftover ``<path>.lock`` from an older flock-based build is ignored.
|
|
13
|
+
*/
|
|
14
|
+
export declare class LockTimeoutError extends Error {
|
|
15
|
+
constructor(message: string);
|
|
16
|
+
}
|
|
17
|
+
export declare function lockPathFor(path: string): string;
|
|
18
|
+
/** Hold an exclusive create-excl lock on ``path + '.lck'`` for ``fn``. */
|
|
19
|
+
export declare function withExclusiveLock<T>(path: string, fn: () => T): T;
|
|
20
|
+
//# sourceMappingURL=fileLock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileLock.d.ts","sourceRoot":"","sources":["../../src/fileLock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAsBH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AA8HD,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CA6BjE"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exclusive lock for a pin or pending file.
|
|
3
|
+
*
|
|
4
|
+
* Sibling path ``<path>.lck``, created with ``O_CREAT | O_EXCL`` (and
|
|
5
|
+
* ``O_NOFOLLOW`` where it exists). The holder writes its pid and an ISO
|
|
6
|
+
* timestamp, then closes the file. Another process that sees the file waits
|
|
7
|
+
* and retries. A lock older than the stale threshold is broken by renaming it
|
|
8
|
+
* aside and unlinking the aside name; only the rename winner proceeds. Release
|
|
9
|
+
* unlinks the file when it still carries our pid and timestamp.
|
|
10
|
+
*
|
|
11
|
+
* Built from the Node standard library only. No native addons. An empty
|
|
12
|
+
* leftover ``<path>.lock`` from an older flock-based build is ignored.
|
|
13
|
+
*/
|
|
14
|
+
import { closeSync, constants, linkSync, lstatSync, mkdirSync, openSync, readFileSync, renameSync, rmdirSync, unlinkSync, writeSync, } from "node:fs";
|
|
15
|
+
import { dirname } from "node:path";
|
|
16
|
+
const SUFFIX = ".lck";
|
|
17
|
+
const STALE_MS = 30_000;
|
|
18
|
+
const DEADLINE_MS = 5_000;
|
|
19
|
+
const SLEEP_MS = 50;
|
|
20
|
+
export class LockTimeoutError extends Error {
|
|
21
|
+
constructor(message) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = "LockTimeoutError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function lockPathFor(path) {
|
|
27
|
+
return `${path}${SUFFIX}`;
|
|
28
|
+
}
|
|
29
|
+
function nowIso() {
|
|
30
|
+
return new Date().toISOString();
|
|
31
|
+
}
|
|
32
|
+
function sleepSync(ms) {
|
|
33
|
+
const buf = new Int32Array(new SharedArrayBuffer(4));
|
|
34
|
+
Atomics.wait(buf, 0, 0, ms);
|
|
35
|
+
}
|
|
36
|
+
function createLock(lockPath, pid, stamp) {
|
|
37
|
+
let flags = constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL;
|
|
38
|
+
if (typeof constants.O_NOFOLLOW === "number") {
|
|
39
|
+
flags |= constants.O_NOFOLLOW;
|
|
40
|
+
}
|
|
41
|
+
const fd = openSync(lockPath, flags, 0o600);
|
|
42
|
+
try {
|
|
43
|
+
writeSync(fd, Buffer.from(`${pid}\n${stamp}\n`, "ascii"));
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
closeSync(fd);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function readLockIdentity(lockPath) {
|
|
50
|
+
try {
|
|
51
|
+
const text = readFileSync(lockPath, "ascii");
|
|
52
|
+
const lines = text.split(/\r?\n/);
|
|
53
|
+
if (lines.length < 2)
|
|
54
|
+
return null;
|
|
55
|
+
const pid = Number(lines[0]);
|
|
56
|
+
if (!Number.isFinite(pid))
|
|
57
|
+
return null;
|
|
58
|
+
return { pid, stamp: lines[1] ?? "" };
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function tryBreakStale(lockPath) {
|
|
65
|
+
let st;
|
|
66
|
+
try {
|
|
67
|
+
st = lstatSync(lockPath);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (Date.now() - st.mtimeMs < STALE_MS)
|
|
73
|
+
return;
|
|
74
|
+
if (!st.isFile()) {
|
|
75
|
+
// A symlink or directory at the lock path blocks every write forever.
|
|
76
|
+
if (st.isDirectory()) {
|
|
77
|
+
try {
|
|
78
|
+
rmdirSync(lockPath);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
throw new LockTimeoutError(`lock path ${lockPath} is a non-empty directory`);
|
|
82
|
+
}
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
unlinkSync(lockPath);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// best effort
|
|
90
|
+
}
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Capture the holder we judged stale. If a new holder rewrote the file
|
|
94
|
+
// before we rename, leave it alone and retry.
|
|
95
|
+
const identity = readLockIdentity(lockPath);
|
|
96
|
+
if (identity === null)
|
|
97
|
+
return;
|
|
98
|
+
const again = readLockIdentity(lockPath);
|
|
99
|
+
if (again === null ||
|
|
100
|
+
again.pid !== identity.pid ||
|
|
101
|
+
again.stamp !== identity.stamp) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// Remaining window: a third process can still create a lock between this
|
|
105
|
+
// re-read and the rename below. The post-rename inode check restores when
|
|
106
|
+
// the aside inode differs from the stale lstat; that does not close a
|
|
107
|
+
// create that lands after rename. Documented, not closed.
|
|
108
|
+
const aside = `${lockPath}.stale.${process.pid}.${process.hrtime.bigint()}`;
|
|
109
|
+
try {
|
|
110
|
+
renameSync(lockPath, aside);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
let asideSt;
|
|
116
|
+
try {
|
|
117
|
+
asideSt = lstatSync(aside);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (asideSt.ino !== st.ino) {
|
|
123
|
+
try {
|
|
124
|
+
linkSync(aside, lockPath);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// A new lock already exists at lockPath.
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
unlinkSync(aside);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// best effort
|
|
134
|
+
}
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
unlinkSync(aside);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// best effort
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function stillOurs(lockPath, pid, stamp) {
|
|
145
|
+
const identity = readLockIdentity(lockPath);
|
|
146
|
+
return identity !== null && identity.pid === pid && identity.stamp === stamp;
|
|
147
|
+
}
|
|
148
|
+
function release(lockPath, pid, stamp) {
|
|
149
|
+
if (!stillOurs(lockPath, pid, stamp))
|
|
150
|
+
return;
|
|
151
|
+
try {
|
|
152
|
+
unlinkSync(lockPath);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// best effort
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Hold an exclusive create-excl lock on ``path + '.lck'`` for ``fn``. */
|
|
159
|
+
export function withExclusiveLock(path, fn) {
|
|
160
|
+
const lockPath = lockPathFor(path);
|
|
161
|
+
const directory = dirname(lockPath) || ".";
|
|
162
|
+
mkdirSync(directory, { recursive: true });
|
|
163
|
+
const pid = process.pid;
|
|
164
|
+
const stamp = nowIso();
|
|
165
|
+
const deadline = Date.now() + DEADLINE_MS;
|
|
166
|
+
for (;;) {
|
|
167
|
+
try {
|
|
168
|
+
createLock(lockPath, pid, stamp);
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
const code = err !== null && typeof err === "object" && "code" in err
|
|
173
|
+
? String(err.code)
|
|
174
|
+
: "";
|
|
175
|
+
if (code !== "EEXIST")
|
|
176
|
+
throw err;
|
|
177
|
+
tryBreakStale(lockPath);
|
|
178
|
+
if (Date.now() >= deadline) {
|
|
179
|
+
throw new LockTimeoutError(`timed out waiting for pin store lock ${lockPath}`);
|
|
180
|
+
}
|
|
181
|
+
sleepSync(SLEEP_MS);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
return fn();
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
release(lockPath, pid, stamp);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=fileLock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileLock.js","sourceRoot":"","sources":["../../src/fileLock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,SAAS,EACT,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,MAAM,GAAG,MAAM,CAAC;AACtB,MAAM,QAAQ,GAAG,MAAM,CAAC;AACxB,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,QAAQ,GAAG,EAAE,CAAC;AAEpB,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,MAAM;IACb,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,SAAS,CAAC,EAAU;IAC3B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB,EAAE,GAAW,EAAE,KAAa;IAC9D,IAAI,KAAK,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;IACtE,IAAI,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC7C,KAAK,IAAI,SAAS,CAAC,UAAU,CAAC;IAChC,CAAC;IACD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,EAAE,CAAC;IACP,IAAI,CAAC;QACH,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,GAAG,QAAQ;QAAE,OAAO;IAC/C,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;QACjB,sEAAsE;QACtE,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,SAAS,CAAC,QAAQ,CAAC,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,gBAAgB,CACxB,aAAa,QAAQ,2BAA2B,CACjD,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QACD,OAAO;IACT,CAAC;IACD,uEAAuE;IACvE,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO;IAC9B,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACzC,IACE,KAAK,KAAK,IAAI;QACd,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;QAC1B,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,EAC9B,CAAC;QACD,OAAO;IACT,CAAC;IACD,yEAAyE;IACzE,0EAA0E;IAC1E,sEAAsE;IACtE,0DAA0D;IAC1D,MAAM,KAAK,GAAG,GAAG,QAAQ,UAAU,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;IAC5E,IAAI,CAAC;QACH,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;QACD,IAAI,CAAC;YACH,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,GAAW,EAAE,KAAa;IAC7D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,GAAG,KAAK,GAAG,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC;AAC/E,CAAC;AAED,SAAS,OAAO,CAAC,QAAgB,EAAE,GAAW,EAAE,KAAa;IAC3D,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC;QAAE,OAAO;IAC7C,IAAI,CAAC;QACH,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,iBAAiB,CAAI,IAAY,EAAE,EAAW;IAC5D,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;IAC3C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;IAC1C,SAAS,CAAC;QACR,IAAI,CAAC;YACH,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACjC,MAAM;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GACR,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG;gBACtD,CAAC,CAAC,MAAM,CAAE,GAA0B,CAAC,IAAI,CAAC;gBAC1C,CAAC,CAAC,EAAE,CAAC;YACT,IAAI,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YACjC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,gBAAgB,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;YACjF,CAAC;YACD,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;AACH,CAAC"}
|
package/dist/src/gate.d.ts
CHANGED
|
@@ -114,6 +114,8 @@ export interface GateOptions {
|
|
|
114
114
|
verifier?: BehavioralVerifier | null;
|
|
115
115
|
posture?: Posture;
|
|
116
116
|
errors?: ErrorStore | null;
|
|
117
|
+
/** ``review`` (default) holds a new tool on an already-pinned server. ``tofu`` pins it. */
|
|
118
|
+
newTools?: "review" | "tofu";
|
|
117
119
|
}
|
|
118
120
|
export interface GateEffect {
|
|
119
121
|
kind: "repin" | "drift" | "fleet";
|
|
@@ -134,15 +136,31 @@ export declare class Gate {
|
|
|
134
136
|
private readonly _verifier;
|
|
135
137
|
private readonly _posture;
|
|
136
138
|
private readonly errors;
|
|
139
|
+
private readonly _newTools;
|
|
137
140
|
constructor(opts: GateOptions);
|
|
138
141
|
get serverId(): string;
|
|
142
|
+
get pinPath(): string | null;
|
|
139
143
|
get posture(): Posture;
|
|
144
|
+
get newTools(): "review" | "tofu";
|
|
140
145
|
get verifier(): BehavioralVerifier | null;
|
|
141
146
|
get ownership(): Ownership;
|
|
147
|
+
/** The pin store for approvePending and other wrapper helpers. */
|
|
148
|
+
get pinStore(): PreflightPin;
|
|
149
|
+
reloadPins(): void;
|
|
150
|
+
pinnedTools(): PinnedTool[];
|
|
142
151
|
pinFor(name: string): PinnedTool | null;
|
|
143
|
-
/**
|
|
144
|
-
|
|
145
|
-
|
|
152
|
+
/**
|
|
153
|
+
* Pin one observed tool if it has no pin yet. The caller decides which tools
|
|
154
|
+
* reach this method. On an already-pinned server, guard and strict do not call
|
|
155
|
+
* it for a tool that was not pinned before the current list.
|
|
156
|
+
*/
|
|
157
|
+
observe(name: string, defn: ToolDef, opts?: {
|
|
158
|
+
launchKey?: string;
|
|
159
|
+
}): void;
|
|
160
|
+
repinOne(name: string, observed: ToolDef, opts?: {
|
|
161
|
+
via?: string;
|
|
162
|
+
launchKey?: string;
|
|
163
|
+
}): PinnedTool;
|
|
146
164
|
/** Decide PROCEED/HOLD on the live contract, then attach the advisory Tier-0a
|
|
147
165
|
* action classification (blast radius) computed locally from the live definition.
|
|
148
166
|
* The classification rides ALONGSIDE the decision and never moves it (AD-1); it is
|
|
@@ -168,6 +186,8 @@ export declare class Gate {
|
|
|
168
186
|
private holdOrFailopen;
|
|
169
187
|
applyPosture(stat: PreflightVerdict): PreflightVerdict;
|
|
170
188
|
decide(name: string, observed: ToolDef | null): [PreflightVerdict, PreflightVerdict];
|
|
189
|
+
private tamperReason;
|
|
190
|
+
private tamperHold;
|
|
171
191
|
internalErrorVerdict(name: string): PreflightVerdict;
|
|
172
192
|
captureError(exc: unknown, operation: Operation, ourCodeLocation: string): void;
|
|
173
193
|
private isUnambiguousDangerous;
|
package/dist/src/gate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/gate.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/gate.ts"],"names":[],"mappings":"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"}
|