@descryy/mcp 0.5.0 → 0.7.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/dist/action-handshake.d.ts +8 -75
- package/dist/action-handshake.d.ts.map +1 -1
- package/dist/action-handshake.js +9 -79
- package/dist/action-handshake.js.map +1 -1
- package/dist/bin/descry-mcp.d.ts +4 -15
- package/dist/bin/descry-mcp.d.ts.map +1 -1
- package/dist/bin/descry-mcp.js +12 -42
- package/dist/bin/descry-mcp.js.map +1 -1
- package/dist/browser/driver.d.ts +62 -178
- package/dist/browser/driver.d.ts.map +1 -1
- package/dist/browser/driver.js +14 -46
- package/dist/browser/driver.js.map +1 -1
- package/dist/browser/evidence.d.ts +11 -35
- package/dist/browser/evidence.d.ts.map +1 -1
- package/dist/browser/evidence.js +25 -51
- package/dist/browser/evidence.js.map +1 -1
- package/dist/browser/fake-driver.d.ts +12 -16
- package/dist/browser/fake-driver.d.ts.map +1 -1
- package/dist/browser/fake-driver.js +24 -17
- package/dist/browser/fake-driver.js.map +1 -1
- package/dist/browser/graph-write.d.ts +4 -45
- package/dist/browser/graph-write.d.ts.map +1 -1
- package/dist/browser/graph-write.js +8 -53
- package/dist/browser/graph-write.js.map +1 -1
- package/dist/browser/playwright-driver.d.ts +17 -67
- package/dist/browser/playwright-driver.d.ts.map +1 -1
- package/dist/browser/playwright-driver.js +169 -166
- package/dist/browser/playwright-driver.js.map +1 -1
- package/dist/browser/provider.d.ts +5 -34
- package/dist/browser/provider.d.ts.map +1 -1
- package/dist/browser/provider.js +4 -24
- package/dist/browser/provider.js.map +1 -1
- package/dist/browser/registry.d.ts +26 -106
- package/dist/browser/registry.d.ts.map +1 -1
- package/dist/browser/registry.js +20 -77
- package/dist/browser/registry.js.map +1 -1
- package/dist/browser/scenario-resolve.d.ts +10 -44
- package/dist/browser/scenario-resolve.d.ts.map +1 -1
- package/dist/browser/scenario-resolve.js +10 -41
- package/dist/browser/scenario-resolve.js.map +1 -1
- package/dist/browser/scenario-runner.d.ts +12 -70
- package/dist/browser/scenario-runner.d.ts.map +1 -1
- package/dist/browser/scenario-runner.js +33 -91
- package/dist/browser/scenario-runner.js.map +1 -1
- package/dist/browser/stack-parser.d.ts +4 -28
- package/dist/browser/stack-parser.d.ts.map +1 -1
- package/dist/browser/stack-parser.js +12 -39
- package/dist/browser/stack-parser.js.map +1 -1
- package/dist/browser/tool-support.d.ts +20 -67
- package/dist/browser/tool-support.d.ts.map +1 -1
- package/dist/browser/tool-support.js +22 -66
- package/dist/browser/tool-support.js.map +1 -1
- package/dist/browser/url-scheme.d.ts +14 -0
- package/dist/browser/url-scheme.d.ts.map +1 -0
- package/dist/browser/url-scheme.js +38 -0
- package/dist/browser/url-scheme.js.map +1 -0
- package/dist/cancellation.d.ts +11 -46
- package/dist/cancellation.d.ts.map +1 -1
- package/dist/cancellation.js +11 -46
- package/dist/cancellation.js.map +1 -1
- package/dist/capped.d.ts +17 -0
- package/dist/capped.d.ts.map +1 -0
- package/dist/capped.js +15 -0
- package/dist/capped.js.map +1 -0
- package/dist/disclosure-ledger.d.ts +6 -30
- package/dist/disclosure-ledger.d.ts.map +1 -1
- package/dist/disclosure-ledger.js +4 -26
- package/dist/disclosure-ledger.js.map +1 -1
- package/dist/index.d.ts +10 -26
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -17
- package/dist/index.js.map +1 -1
- package/dist/module-trust.d.ts +24 -0
- package/dist/module-trust.d.ts.map +1 -0
- package/dist/module-trust.js +60 -0
- package/dist/module-trust.js.map +1 -0
- package/dist/path-confinement.d.ts +31 -0
- package/dist/path-confinement.d.ts.map +1 -0
- package/dist/path-confinement.js +44 -0
- package/dist/path-confinement.js.map +1 -0
- package/dist/protocol.d.ts +10 -53
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +14 -60
- package/dist/protocol.js.map +1 -1
- package/dist/registry.d.ts +10 -58
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +38 -90
- package/dist/registry.js.map +1 -1
- package/dist/render.d.ts +79 -11
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +126 -14
- package/dist/render.js.map +1 -1
- package/dist/runtime-registry.d.ts +8 -49
- package/dist/runtime-registry.d.ts.map +1 -1
- package/dist/runtime-registry.js +72 -63
- package/dist/runtime-registry.js.map +1 -1
- package/dist/scenarios/index.d.ts +1 -1
- package/dist/scenarios/index.d.ts.map +1 -1
- package/dist/scenarios/index.js +1 -1
- package/dist/scenarios/index.js.map +1 -1
- package/dist/scenarios/parse.d.ts +4 -18
- package/dist/scenarios/parse.d.ts.map +1 -1
- package/dist/scenarios/parse.js +14 -34
- package/dist/scenarios/parse.js.map +1 -1
- package/dist/scenarios/scenario.d.ts +18 -74
- package/dist/scenarios/scenario.d.ts.map +1 -1
- package/dist/scenarios/scenario.js +7 -34
- package/dist/scenarios/scenario.js.map +1 -1
- package/dist/scenarios/storage.d.ts +11 -41
- package/dist/scenarios/storage.d.ts.map +1 -1
- package/dist/scenarios/storage.js +57 -47
- package/dist/scenarios/storage.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +55 -13
- package/dist/server.js.map +1 -1
- package/dist/session.d.ts +69 -239
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +76 -231
- package/dist/session.js.map +1 -1
- package/dist/tools/analyze.d.ts +27 -101
- package/dist/tools/analyze.d.ts.map +1 -1
- package/dist/tools/analyze.js +58 -148
- package/dist/tools/analyze.js.map +1 -1
- package/dist/tools/browser-click.d.ts +3 -21
- package/dist/tools/browser-click.d.ts.map +1 -1
- package/dist/tools/browser-click.js +10 -31
- package/dist/tools/browser-click.js.map +1 -1
- package/dist/tools/browser-close-session.d.ts +4 -13
- package/dist/tools/browser-close-session.d.ts.map +1 -1
- package/dist/tools/browser-close-session.js +4 -13
- package/dist/tools/browser-close-session.js.map +1 -1
- package/dist/tools/browser-fill.d.ts +5 -36
- package/dist/tools/browser-fill.d.ts.map +1 -1
- package/dist/tools/browser-fill.js +9 -44
- package/dist/tools/browser-fill.js.map +1 -1
- package/dist/tools/browser-navigate.d.ts +6 -27
- package/dist/tools/browser-navigate.d.ts.map +1 -1
- package/dist/tools/browser-navigate.js +6 -23
- package/dist/tools/browser-navigate.js.map +1 -1
- package/dist/tools/browser-run-scenario.d.ts +5 -31
- package/dist/tools/browser-run-scenario.d.ts.map +1 -1
- package/dist/tools/browser-run-scenario.js +10 -46
- package/dist/tools/browser-run-scenario.js.map +1 -1
- package/dist/tools/browser-save-scenario.d.ts +3 -28
- package/dist/tools/browser-save-scenario.d.ts.map +1 -1
- package/dist/tools/browser-save-scenario.js +102 -55
- package/dist/tools/browser-save-scenario.js.map +1 -1
- package/dist/tools/browser-snapshot.d.ts +6 -39
- package/dist/tools/browser-snapshot.d.ts.map +1 -1
- package/dist/tools/browser-snapshot.js +4 -31
- package/dist/tools/browser-snapshot.js.map +1 -1
- package/dist/tools/browser-start-session.d.ts +4 -23
- package/dist/tools/browser-start-session.d.ts.map +1 -1
- package/dist/tools/browser-start-session.js +38 -51
- package/dist/tools/browser-start-session.js.map +1 -1
- package/dist/tools/browser-type.d.ts +5 -35
- package/dist/tools/browser-type.d.ts.map +1 -1
- package/dist/tools/browser-type.js +10 -45
- package/dist/tools/browser-type.js.map +1 -1
- package/dist/tools/contracts.d.ts +17 -63
- package/dist/tools/contracts.d.ts.map +1 -1
- package/dist/tools/contracts.js +91 -47
- package/dist/tools/contracts.js.map +1 -1
- package/dist/tools/cross-pr.d.ts +56 -15
- package/dist/tools/cross-pr.d.ts.map +1 -1
- package/dist/tools/cross-pr.js +141 -38
- package/dist/tools/cross-pr.js.map +1 -1
- package/dist/tools/git-diff.d.ts +18 -2
- package/dist/tools/git-diff.d.ts.map +1 -1
- package/dist/tools/git-diff.js +143 -23
- package/dist/tools/git-diff.js.map +1 -1
- package/dist/tools/git-history.d.ts +5 -16
- package/dist/tools/git-history.d.ts.map +1 -1
- package/dist/tools/git-history.js +3 -10
- package/dist/tools/git-history.js.map +1 -1
- package/dist/tools/history.d.ts +4 -33
- package/dist/tools/history.d.ts.map +1 -1
- package/dist/tools/history.js +6 -31
- package/dist/tools/history.js.map +1 -1
- package/dist/tools/impact.d.ts +7 -51
- package/dist/tools/impact.d.ts.map +1 -1
- package/dist/tools/impact.js +15 -67
- package/dist/tools/impact.js.map +1 -1
- package/dist/tools/index.d.ts +3 -8
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -8
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/kit.d.ts +66 -113
- package/dist/tools/kit.d.ts.map +1 -1
- package/dist/tools/kit.js +60 -28
- package/dist/tools/kit.js.map +1 -1
- package/dist/tools/link-workspace.d.ts +7 -45
- package/dist/tools/link-workspace.d.ts.map +1 -1
- package/dist/tools/link-workspace.js +10 -48
- package/dist/tools/link-workspace.js.map +1 -1
- package/dist/tools/lookup.d.ts +4 -14
- package/dist/tools/lookup.d.ts.map +1 -1
- package/dist/tools/lookup.js +4 -14
- package/dist/tools/lookup.js.map +1 -1
- package/dist/tools/mark-incident.d.ts +7 -54
- package/dist/tools/mark-incident.d.ts.map +1 -1
- package/dist/tools/mark-incident.js +15 -68
- package/dist/tools/mark-incident.js.map +1 -1
- package/dist/tools/observe-runtime.d.ts +27 -210
- package/dist/tools/observe-runtime.d.ts.map +1 -1
- package/dist/tools/observe-runtime.js +258 -436
- package/dist/tools/observe-runtime.js.map +1 -1
- package/dist/tools/observe-tests.d.ts +9 -88
- package/dist/tools/observe-tests.d.ts.map +1 -1
- package/dist/tools/observe-tests.js +34 -108
- package/dist/tools/observe-tests.js.map +1 -1
- package/dist/tools/pr-analysis.d.ts +18 -2
- package/dist/tools/pr-analysis.d.ts.map +1 -1
- package/dist/tools/pr-analysis.js +73 -23
- package/dist/tools/pr-analysis.js.map +1 -1
- package/dist/tools/pre-push.d.ts +94 -9
- package/dist/tools/pre-push.d.ts.map +1 -1
- package/dist/tools/pre-push.js +139 -34
- package/dist/tools/pre-push.js.map +1 -1
- package/dist/tools/propagation.d.ts +11 -53
- package/dist/tools/propagation.d.ts.map +1 -1
- package/dist/tools/propagation.js +14 -57
- package/dist/tools/propagation.js.map +1 -1
- package/dist/tools/questions.d.ts +13 -63
- package/dist/tools/questions.d.ts.map +1 -1
- package/dist/tools/questions.js +33 -105
- package/dist/tools/questions.js.map +1 -1
- package/dist/tools/refusal-fetch.d.ts +4 -40
- package/dist/tools/refusal-fetch.d.ts.map +1 -1
- package/dist/tools/refusal-fetch.js +4 -40
- package/dist/tools/refusal-fetch.js.map +1 -1
- package/dist/tools/runtime-incident.d.ts +4 -63
- package/dist/tools/runtime-incident.d.ts.map +1 -1
- package/dist/tools/runtime-incident.js +10 -87
- package/dist/tools/runtime-incident.js.map +1 -1
- package/dist/tools/scope.d.ts +7 -25
- package/dist/tools/scope.d.ts.map +1 -1
- package/dist/tools/scope.js +17 -20
- package/dist/tools/scope.js.map +1 -1
- package/dist/tools/similar-incidents.d.ts +11 -86
- package/dist/tools/similar-incidents.d.ts.map +1 -1
- package/dist/tools/similar-incidents.js +7 -71
- package/dist/tools/similar-incidents.js.map +1 -1
- package/dist/tools/validate.d.ts +31 -47
- package/dist/tools/validate.d.ts.map +1 -1
- package/dist/tools/validate.js +133 -61
- package/dist/tools/validate.js.map +1 -1
- package/dist/tools/verification-status.d.ts +9 -64
- package/dist/tools/verification-status.d.ts.map +1 -1
- package/dist/tools/verification-status.js +9 -62
- package/dist/tools/verification-status.js.map +1 -1
- package/dist/tools/verify-claim.d.ts +5 -52
- package/dist/tools/verify-claim.d.ts.map +1 -1
- package/dist/tools/verify-claim.js +6 -56
- package/dist/tools/verify-claim.js.map +1 -1
- package/dist/transport.d.ts +15 -52
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +16 -60
- package/dist/transport.js.map +1 -1
- package/package.json +33 -16
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* drift: how a dead session is reported, how consent is checked, and how a
|
|
6
|
-
* reply is stamped. Seven copies of a refusal is seven chances for one of
|
|
7
|
-
* them to say something slightly different about the same state.
|
|
8
|
-
*/
|
|
1
|
+
/** What the seven browser tools share — kept in one place because the parts that repeat
|
|
2
|
+
* are the parts that must not drift: how a dead session is reported, how consent is
|
|
3
|
+
* checked, how a reply is stamped. Seven copies of a refusal is seven chances for one to
|
|
4
|
+
* say something slightly different about the same state. */
|
|
9
5
|
import { answer } from "../tools/kit.js";
|
|
10
6
|
import { evidenceNotes, evidenceReport } from "./evidence.js";
|
|
11
7
|
import { graphWriteNotes, writeBrowserObservations, NO_GRAPH_WRITE } from "./graph-write.js";
|
|
@@ -31,15 +27,9 @@ export function browserStamp(ctx) {
|
|
|
31
27
|
};
|
|
32
28
|
}
|
|
33
29
|
}
|
|
34
|
-
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* `resolutionFloor: 4` on a successful observation, and that is not
|
|
38
|
-
* generosity: R4 is "observed at runtime", and a page element this call
|
|
39
|
-
* actually saw is the definition of it. A refusal or a failure observed
|
|
40
|
-
* nothing, so it stamps R0 — the floor has to describe the evidence behind
|
|
41
|
-
* *this* reply, not the tool's best case.
|
|
42
|
-
*/
|
|
30
|
+
/** Every browser reply, stamped identically. `resolutionFloor: 4` on success — R4 is
|
|
31
|
+
* "observed at runtime", exactly what this call saw; a refusal/failure observed nothing,
|
|
32
|
+
* so stamps R0 — describing this reply's evidence, not the tool's best case. */
|
|
43
33
|
export function browserAnswer(options) {
|
|
44
34
|
const stamp = browserStamp(options.ctx);
|
|
45
35
|
const observed = (options.state ?? "ok") === "ok";
|
|
@@ -60,14 +50,9 @@ export function browserAnswer(options) {
|
|
|
60
50
|
...(options.fitToBudget === undefined ? {} : { fitToBudget: options.fitToBudget }),
|
|
61
51
|
});
|
|
62
52
|
}
|
|
63
|
-
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* The three dead states are deliberately not collapsed into one. "You never
|
|
67
|
-
* had this session", "it timed out five minutes ago, here is what it saw" and
|
|
68
|
-
* "the browser crashed" are three different things for a caller to do next,
|
|
69
|
-
* and only the last of them is a `failed`.
|
|
70
|
-
*/
|
|
53
|
+
/** Looks a session up, or says exactly why it can't be used. The three dead states stay
|
|
54
|
+
* apart — "never had it", "timed out, here's what it saw", "crashed" send a caller to
|
|
55
|
+
* three different things; only the last is `failed`. */
|
|
71
56
|
export async function useSession(registry, sessionId) {
|
|
72
57
|
const used = await registry.use(sessionId);
|
|
73
58
|
if (used.ok)
|
|
@@ -82,8 +67,7 @@ export async function useSession(registry, sessionId) {
|
|
|
82
67
|
return {
|
|
83
68
|
ok: false,
|
|
84
69
|
dead: {
|
|
85
|
-
// A crash is something breaking; a reap is Descry
|
|
86
|
-
// five states exist to keep those apart.
|
|
70
|
+
// A crash is something breaking; a reap is Descry tidying up — the five states keep those apart.
|
|
87
71
|
state: used.kind === "crashed" ? "failed" : "refused",
|
|
88
72
|
headline: used.kind === "crashed" ? `Browser session ${sessionId} crashed.` : `Browser session ${sessionId} is gone.`,
|
|
89
73
|
notes: [used.reason, ...carried],
|
|
@@ -91,19 +75,9 @@ export async function useSession(registry, sessionId) {
|
|
|
91
75
|
},
|
|
92
76
|
};
|
|
93
77
|
}
|
|
94
|
-
/**
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
* Every evidence-bearing browser tool goes through this rather than draining
|
|
99
|
-
* for itself. Two reasons, and the second is the one that matters: a tool
|
|
100
|
-
* that drained without correlating would be a tool through which the R4 write
|
|
101
|
-
* silently does not happen, and nothing about its reply would look different.
|
|
102
|
-
*
|
|
103
|
-
* A repository with no graph correlates nothing and says so. That is a real
|
|
104
|
-
* state — a developer can drive a browser against an app they have never
|
|
105
|
-
* analysed — and it must not look like "we looked and found no connection".
|
|
106
|
-
*/
|
|
78
|
+
/** Drains page evidence, relates it to the graph, and returns both in one place — every
|
|
79
|
+
* evidence-bearing tool routes through this so the R4 write can't silently not happen.
|
|
80
|
+
* No graph correlates nothing and says so; that's real, not "found no connection". */
|
|
107
81
|
export async function observeAndCorrelate(ctx, entry) {
|
|
108
82
|
const observation = await entry.page.drainEvidence();
|
|
109
83
|
const evidence = evidenceReport(observation);
|
|
@@ -116,10 +90,8 @@ export async function observeAndCorrelate(ctx, entry) {
|
|
|
116
90
|
driver: ctx.session.store().driver,
|
|
117
91
|
repo: ctx.session.config.repo,
|
|
118
92
|
runId: entry.runId,
|
|
119
|
-
// An edge records the commit the
|
|
120
|
-
//
|
|
121
|
-
// observation. Absent that, the observation is still real but cannot
|
|
122
|
-
// be dated against the source, so it is not written at all.
|
|
93
|
+
// An edge records the commit the app was built from, so a reader can tell if code
|
|
94
|
+
// moved since. Without it, the observation is real but undatable against source, so not written.
|
|
123
95
|
commitSha: commitSha ?? "",
|
|
124
96
|
repoRoot: ctx.session.repoPath,
|
|
125
97
|
requests: observation.requests,
|
|
@@ -134,32 +106,14 @@ export async function observeAndCorrelate(ctx, entry) {
|
|
|
134
106
|
return { evidence, graph, notes: [...evidenceNotes(evidence), ...notes] };
|
|
135
107
|
}
|
|
136
108
|
export function emptyEvidence() {
|
|
137
|
-
return { consoleErrors: [], failedRequests: [], totalRequests: 0, actions: [], unsettled: [] };
|
|
109
|
+
return { consoleErrors: [], failedRequests: [], pendingRequests: [], totalRequests: 0, actions: [], unsettled: [] };
|
|
138
110
|
}
|
|
139
111
|
export function reportOf(observation) {
|
|
140
112
|
return evidenceReport(observation);
|
|
141
113
|
}
|
|
142
|
-
/**
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
* The consent ruling's one hard bound. Checked here rather than in each verb
|
|
146
|
-
* so that a future eighth tool cannot forget it.
|
|
147
|
-
*/
|
|
148
|
-
/**
|
|
149
|
-
* Does this session's environment profile permit changing the application?
|
|
150
|
-
*
|
|
151
|
-
* Read off the profile the session was opened under — DEC-270's
|
|
152
|
-
* `safetyLevel`, the same field `observe_runtime` consults. Deliberately not
|
|
153
|
-
* a per-tool flag: two independent notions of "safe" is how a runtime run and
|
|
154
|
-
* a browser run end up disagreeing about the same environment.
|
|
155
|
-
*
|
|
156
|
-
* A session opened with no profile returns null here, and the session's own
|
|
157
|
-
* consent is then the only authorization — which is a real authorization,
|
|
158
|
-
* granted explicitly at `browser_start_session` against a named origin. The
|
|
159
|
-
* two are independent and both must pass: consent answers *may Descry drive a
|
|
160
|
-
* browser against this target at all*, the profile answers *may it mutate*,
|
|
161
|
-
* and neither excuses the other.
|
|
162
|
-
*/
|
|
114
|
+
/** Does the session's environment profile permit changing the application? Reads DEC-270's
|
|
115
|
+
* `safetyLevel` (same field `observe_runtime` consults), not a per-tool flag — two "safe"
|
|
116
|
+
* notions could disagree. No profile ⇒ null; consent and profile are independent, both must pass. */
|
|
163
117
|
export function mutationRefusal(entry) {
|
|
164
118
|
if (entry.profile === null)
|
|
165
119
|
return null;
|
|
@@ -170,6 +124,8 @@ export function mutationRefusal(entry) {
|
|
|
170
124
|
"browser_navigate and browser_snapshot read the page and remain available. This is a fact about the " +
|
|
171
125
|
"profile you supplied, not about the page — the session's own consent is intact and does not override it.");
|
|
172
126
|
}
|
|
127
|
+
/** Is `url` inside the origin this session was consented for? The consent ruling's one
|
|
128
|
+
* hard bound — checked here, not in each verb, so a future eighth tool can't forget it. */
|
|
173
129
|
export function withinConsent(entry, url) {
|
|
174
130
|
try {
|
|
175
131
|
return new URL(url).origin === entry.consentedOrigin;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-support.js","sourceRoot":"","sources":["../../src/browser/tool-support.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tool-support.js","sourceRoot":"","sources":["../../src/browser/tool-support.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which URL schemes `browser_start_session` may open (A-F7). `file:`/`data:` resolve
|
|
3
|
+
* `.origin` to `"null"`, so same-origin containment passes for every local file (e.g.
|
|
4
|
+
* `file:///etc/passwd` reads back as inside consent). Only http:/https: trusted by
|
|
5
|
+
* default; opt in extras via `DESCRY_ALLOW_BROWSER_URL_SCHEMES`. */
|
|
6
|
+
export declare const ALLOW_BROWSER_URL_SCHEMES_ENV_VAR = "DESCRY_ALLOW_BROWSER_URL_SCHEMES";
|
|
7
|
+
export type UrlSchemeDecision = {
|
|
8
|
+
readonly allowed: true;
|
|
9
|
+
} | {
|
|
10
|
+
readonly allowed: false;
|
|
11
|
+
readonly reason: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function checkUrlScheme(url: URL): UrlSchemeDecision;
|
|
14
|
+
//# sourceMappingURL=url-scheme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-scheme.d.ts","sourceRoot":"","sources":["../../src/browser/url-scheme.ts"],"names":[],"mappings":"AAAA;;;;oEAIoE;AAEpE,eAAO,MAAM,iCAAiC,qCAAqC,CAAC;AAepF,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAOlH,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB,CAa1D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which URL schemes `browser_start_session` may open (A-F7). `file:`/`data:` resolve
|
|
3
|
+
* `.origin` to `"null"`, so same-origin containment passes for every local file (e.g.
|
|
4
|
+
* `file:///etc/passwd` reads back as inside consent). Only http:/https: trusted by
|
|
5
|
+
* default; opt in extras via `DESCRY_ALLOW_BROWSER_URL_SCHEMES`. */
|
|
6
|
+
export const ALLOW_BROWSER_URL_SCHEMES_ENV_VAR = "DESCRY_ALLOW_BROWSER_URL_SCHEMES";
|
|
7
|
+
const DEFAULT_ALLOWED_SCHEMES = new Set(["http:", "https:"]);
|
|
8
|
+
function operatorAllowedSchemes() {
|
|
9
|
+
const raw = process.env[ALLOW_BROWSER_URL_SCHEMES_ENV_VAR];
|
|
10
|
+
if (raw === undefined || raw.trim() === "")
|
|
11
|
+
return DEFAULT_ALLOWED_SCHEMES;
|
|
12
|
+
const extra = raw
|
|
13
|
+
.split(",")
|
|
14
|
+
.map((s) => s.trim())
|
|
15
|
+
.filter((s) => s !== "")
|
|
16
|
+
.map((s) => (s.endsWith(":") ? s : `${s}:`));
|
|
17
|
+
return new Set([...DEFAULT_ALLOWED_SCHEMES, ...extra]);
|
|
18
|
+
}
|
|
19
|
+
/** The one exception: `about:blank` carries no content (no hazard like `file:`/`data:`)
|
|
20
|
+
* and is the standard pre-navigation target for browser automation. Other `about:`
|
|
21
|
+
* URLs (`about:config`, …) can expose browser-internal state and are excluded. */
|
|
22
|
+
const INERT_TARGET = "about:blank";
|
|
23
|
+
export function checkUrlScheme(url) {
|
|
24
|
+
if (url.href === INERT_TARGET)
|
|
25
|
+
return { allowed: true };
|
|
26
|
+
const allowed = operatorAllowedSchemes();
|
|
27
|
+
if (allowed.has(url.protocol))
|
|
28
|
+
return { allowed: true };
|
|
29
|
+
return {
|
|
30
|
+
allowed: false,
|
|
31
|
+
reason: `"${url.href}" uses the "${url.protocol}" scheme, which this tool does not open by default. Same-origin ` +
|
|
32
|
+
"containment (the check every other browser tool relies on) does not hold for a file: or data: URL — " +
|
|
33
|
+
'both resolve to the origin "null", so a session opened on one would treat every local file as inside ' +
|
|
34
|
+
`consent. Only http: and https: are allowed by default; set ${ALLOW_BROWSER_URL_SCHEMES_ENV_VAR} ` +
|
|
35
|
+
'(e.g. "file") in this server\'s own environment to add a scheme deliberately.',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=url-scheme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-scheme.js","sourceRoot":"","sources":["../../src/browser/url-scheme.ts"],"names":[],"mappings":"AAAA;;;;oEAIoE;AAEpE,MAAM,CAAC,MAAM,iCAAiC,GAAG,kCAAkC,CAAC;AAEpF,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE7D,SAAS,sBAAsB;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC3D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,uBAAuB,CAAC;IAC3E,MAAM,KAAK,GAAG,GAAG;SACd,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,uBAAuB,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;AACzD,CAAC;AAID;;mFAEmF;AACnF,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,MAAM,UAAU,cAAc,CAAC,GAAQ;IACrC,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxD,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IACzC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxD,OAAO;QACL,OAAO,EAAE,KAAK;QACd,MAAM,EACJ,IAAI,GAAG,CAAC,IAAI,eAAe,GAAG,CAAC,QAAQ,kEAAkE;YACzG,sGAAsG;YACtG,uGAAuG;YACvG,8DAA8D,iCAAiC,GAAG;YAClG,+EAA+E;KAClF,CAAC;AACJ,CAAC"}
|
package/dist/cancellation.d.ts
CHANGED
|
@@ -1,53 +1,18 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* something real — a browser, an application, a test runner — the work
|
|
7
|
-
* continuing after the reply is discarded is the whole problem: a Chromium
|
|
8
|
-
* nothing will ever close, an application still being driven, a scenario
|
|
9
|
-
* still clicking through a live system on behalf of a caller who cancelled.
|
|
10
|
-
*
|
|
11
|
-
* So `ctx.signal` is checked at the points where a tool is about to *start*
|
|
12
|
-
* something, and whatever the tool already started is released. Three rules
|
|
13
|
-
* hold everywhere it is used:
|
|
14
|
-
*
|
|
15
|
-
* 1. **Release what this call started, and nothing else.** A cancelled verb
|
|
16
|
-
* does not close the session `browser_start_session` opened, and a
|
|
17
|
-
* cancelled run does not kill a process it merely attached to. Cancellation
|
|
18
|
-
* stops the work it was asked to stop; tearing down a caller's own state
|
|
19
|
-
* because one call was cancelled is a second failure, not a cleanup.
|
|
20
|
-
* 2. **Keep the evidence.** Nothing witnessed before the cancellation is
|
|
21
|
-
* thrown away. Evidence captured and then dropped is worse than evidence
|
|
22
|
-
* never captured, because nothing discloses it.
|
|
23
|
-
* 3. **Never let a cancelled run render as a clean one.** A check that stopped
|
|
24
|
-
* a third of the way through has not passed, and the reply says so even
|
|
25
|
-
* though nobody is expected to read it — the reply is suppressed only when
|
|
26
|
-
* the cancellation arrived over the wire, and this same path is reachable
|
|
27
|
-
* when a signal is aborted for any other reason.
|
|
28
|
-
*
|
|
29
|
-
* The state is `refused`: cancellation is a fact about Descry — it stopped
|
|
30
|
-
* looking — and never a fact about the user's code. `empty` would say the run
|
|
31
|
-
* looked and found nothing, which is the one thing it must not say.
|
|
32
|
-
*/
|
|
1
|
+
/** What a tool does when the caller has already gone. `notifications/cancelled` stops the
|
|
2
|
+
* server from waiting, not the work itself — a browser or process would keep running
|
|
3
|
+
* unless released. Three rules: release only what this call started (never a caller's own
|
|
4
|
+
* state), keep evidence already witnessed, never render a cancelled run as clean. State is
|
|
5
|
+
* `refused` (a fact about Descry stopping) not `empty` (which would falsely say it looked and found nothing). */
|
|
33
6
|
/** The reply state for a call that stopped because its signal was aborted. */
|
|
34
7
|
export declare const CANCELLED_STATE: "refused";
|
|
35
8
|
export declare function cancellationHeadline(what: string): string;
|
|
36
|
-
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* when there was nothing to release — claiming a teardown that did not happen
|
|
40
|
-
* is the same class of false statement as hiding one that did.
|
|
41
|
-
*/
|
|
9
|
+
/** @param stopped What this call stopped doing, in the caller's terms.
|
|
10
|
+
* @param released What it tore down, if anything — omitted when nothing was released;
|
|
11
|
+
* claiming a teardown that didn't happen is as false as hiding one that did. */
|
|
42
12
|
export declare function cancellationNotes(stopped: string, released?: string): readonly string[];
|
|
43
|
-
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* The disposal half is the point. `Promise.race` leaves the losing promise
|
|
47
|
-
* pending forever, so a listener added per call and never removed accumulates
|
|
48
|
-
* on a signal that outlives the call — the standard leak this shape exists to
|
|
49
|
-
* avoid. Callers race and then dispose in a `finally`.
|
|
50
|
-
*/
|
|
13
|
+
/** A promise that settles when the signal aborts, plus a way to stop listening.
|
|
14
|
+
* `Promise.race` leaves the loser pending forever, so an unremoved listener leaks on a
|
|
15
|
+
* signal that outlives the call — callers race then dispose in a `finally`. */
|
|
51
16
|
export declare function whenAborted(signal: AbortSignal): {
|
|
52
17
|
readonly promise: Promise<void>;
|
|
53
18
|
dispose(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cancellation.d.ts","sourceRoot":"","sources":["../src/cancellation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cancellation.d.ts","sourceRoot":"","sources":["../src/cancellation.ts"],"names":[],"mappings":"AAAA;;;;kHAIkH;AAElH,8EAA8E;AAC9E,eAAO,MAAM,eAAe,EAAG,SAAkB,CAAC;AAElD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;iFAEiF;AACjF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAMvF;AAED;;gFAEgF;AAChF,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,OAAO,IAAI,IAAI,CAAA;CAAE,CAgBrG"}
|
package/dist/cancellation.js
CHANGED
|
@@ -1,46 +1,16 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* something real — a browser, an application, a test runner — the work
|
|
7
|
-
* continuing after the reply is discarded is the whole problem: a Chromium
|
|
8
|
-
* nothing will ever close, an application still being driven, a scenario
|
|
9
|
-
* still clicking through a live system on behalf of a caller who cancelled.
|
|
10
|
-
*
|
|
11
|
-
* So `ctx.signal` is checked at the points where a tool is about to *start*
|
|
12
|
-
* something, and whatever the tool already started is released. Three rules
|
|
13
|
-
* hold everywhere it is used:
|
|
14
|
-
*
|
|
15
|
-
* 1. **Release what this call started, and nothing else.** A cancelled verb
|
|
16
|
-
* does not close the session `browser_start_session` opened, and a
|
|
17
|
-
* cancelled run does not kill a process it merely attached to. Cancellation
|
|
18
|
-
* stops the work it was asked to stop; tearing down a caller's own state
|
|
19
|
-
* because one call was cancelled is a second failure, not a cleanup.
|
|
20
|
-
* 2. **Keep the evidence.** Nothing witnessed before the cancellation is
|
|
21
|
-
* thrown away. Evidence captured and then dropped is worse than evidence
|
|
22
|
-
* never captured, because nothing discloses it.
|
|
23
|
-
* 3. **Never let a cancelled run render as a clean one.** A check that stopped
|
|
24
|
-
* a third of the way through has not passed, and the reply says so even
|
|
25
|
-
* though nobody is expected to read it — the reply is suppressed only when
|
|
26
|
-
* the cancellation arrived over the wire, and this same path is reachable
|
|
27
|
-
* when a signal is aborted for any other reason.
|
|
28
|
-
*
|
|
29
|
-
* The state is `refused`: cancellation is a fact about Descry — it stopped
|
|
30
|
-
* looking — and never a fact about the user's code. `empty` would say the run
|
|
31
|
-
* looked and found nothing, which is the one thing it must not say.
|
|
32
|
-
*/
|
|
1
|
+
/** What a tool does when the caller has already gone. `notifications/cancelled` stops the
|
|
2
|
+
* server from waiting, not the work itself — a browser or process would keep running
|
|
3
|
+
* unless released. Three rules: release only what this call started (never a caller's own
|
|
4
|
+
* state), keep evidence already witnessed, never render a cancelled run as clean. State is
|
|
5
|
+
* `refused` (a fact about Descry stopping) not `empty` (which would falsely say it looked and found nothing). */
|
|
33
6
|
/** The reply state for a call that stopped because its signal was aborted. */
|
|
34
7
|
export const CANCELLED_STATE = "refused";
|
|
35
8
|
export function cancellationHeadline(what) {
|
|
36
9
|
return `The call was cancelled; ${what}.`;
|
|
37
10
|
}
|
|
38
|
-
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* when there was nothing to release — claiming a teardown that did not happen
|
|
42
|
-
* is the same class of false statement as hiding one that did.
|
|
43
|
-
*/
|
|
11
|
+
/** @param stopped What this call stopped doing, in the caller's terms.
|
|
12
|
+
* @param released What it tore down, if anything — omitted when nothing was released;
|
|
13
|
+
* claiming a teardown that didn't happen is as false as hiding one that did. */
|
|
44
14
|
export function cancellationNotes(stopped, released) {
|
|
45
15
|
return [
|
|
46
16
|
`This call was cancelled before it finished. ${stopped} Nothing here is a finding about your ` +
|
|
@@ -48,14 +18,9 @@ export function cancellationNotes(stopped, released) {
|
|
|
48
18
|
...(released === undefined ? [] : [released]),
|
|
49
19
|
];
|
|
50
20
|
}
|
|
51
|
-
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* The disposal half is the point. `Promise.race` leaves the losing promise
|
|
55
|
-
* pending forever, so a listener added per call and never removed accumulates
|
|
56
|
-
* on a signal that outlives the call — the standard leak this shape exists to
|
|
57
|
-
* avoid. Callers race and then dispose in a `finally`.
|
|
58
|
-
*/
|
|
21
|
+
/** A promise that settles when the signal aborts, plus a way to stop listening.
|
|
22
|
+
* `Promise.race` leaves the loser pending forever, so an unremoved listener leaks on a
|
|
23
|
+
* signal that outlives the call — callers race then dispose in a `finally`. */
|
|
59
24
|
export function whenAborted(signal) {
|
|
60
25
|
if (signal.aborted)
|
|
61
26
|
return { promise: Promise.resolve(), dispose: () => { } };
|
package/dist/cancellation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../src/cancellation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../src/cancellation.ts"],"names":[],"mappings":"AAAA;;;;kHAIkH;AAElH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,SAAkB,CAAC;AAElD,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,2BAA2B,IAAI,GAAG,CAAC;AAC5C,CAAC;AAED;;iFAEiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,QAAiB;IAClE,OAAO;QACL,+CAA+C,OAAO,wCAAwC;YAC5F,oDAAoD;QACtD,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED;;gFAEgF;AAChF,MAAM,UAAU,WAAW,CAAC,MAAmB;IAC7C,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IAE7E,IAAI,OAAO,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,OAAO,GAAG,GAAG,EAAE;YACb,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IACH,OAAO;QACL,OAAO;QACP,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/capped.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** `capped(items, limit) → { shown, detail }`, B6's fix. Three tools used to compute a list cut
|
|
2
|
+
* three different ways; two left `render.ts` filling the gap with a `{shown:-1,total:-1}`
|
|
3
|
+
* sentinel — worse than nothing, since it passes a presence check and poisons arithmetic. Now the
|
|
4
|
+
* slice and the fact it happened are computed together, so a tool can't hold one without the other. */
|
|
5
|
+
import type { TruncationDetail } from "./render.ts";
|
|
6
|
+
export interface Capped<T> {
|
|
7
|
+
/** The first `limit` items, in their original order. */
|
|
8
|
+
readonly shown: readonly T[];
|
|
9
|
+
/** `null` when nothing was withheld; otherwise the same `{shown, total}` shape `render.ts` puts
|
|
10
|
+
* on the wire, so a tool can pass it straight through as `truncatedDetail`. */
|
|
11
|
+
readonly detail: TruncationDetail | null;
|
|
12
|
+
}
|
|
13
|
+
/** Slices `items` to `limit` and reports the cost in the same call. A negative/fractional `limit`
|
|
14
|
+
* is treated as zero rather than thrown — defensive only, callers already validate at the schema
|
|
15
|
+
* boundary. */
|
|
16
|
+
export declare function capped<T>(items: readonly T[], limit: number): Capped<T>;
|
|
17
|
+
//# sourceMappingURL=capped.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capped.d.ts","sourceRoot":"","sources":["../src/capped.ts"],"names":[],"mappings":"AAAA;;;wGAGwG;AAExG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAC7B;oFACgF;IAChF,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1C;AAED;;gBAEgB;AAChB,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAKvE"}
|
package/dist/capped.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** `capped(items, limit) → { shown, detail }`, B6's fix. Three tools used to compute a list cut
|
|
2
|
+
* three different ways; two left `render.ts` filling the gap with a `{shown:-1,total:-1}`
|
|
3
|
+
* sentinel — worse than nothing, since it passes a presence check and poisons arithmetic. Now the
|
|
4
|
+
* slice and the fact it happened are computed together, so a tool can't hold one without the other. */
|
|
5
|
+
/** Slices `items` to `limit` and reports the cost in the same call. A negative/fractional `limit`
|
|
6
|
+
* is treated as zero rather than thrown — defensive only, callers already validate at the schema
|
|
7
|
+
* boundary. */
|
|
8
|
+
export function capped(items, limit) {
|
|
9
|
+
const bound = Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : 0;
|
|
10
|
+
const shown = items.slice(0, bound);
|
|
11
|
+
if (shown.length >= items.length)
|
|
12
|
+
return { shown, detail: null };
|
|
13
|
+
return { shown, detail: { shown: shown.length, total: items.length, more: null } };
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=capped.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capped.js","sourceRoot":"","sources":["../src/capped.ts"],"names":[],"mappings":"AAAA;;;wGAGwG;AAYxG;;gBAEgB;AAChB,MAAM,UAAU,MAAM,CAAI,KAAmB,EAAE,KAAa;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACjE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AACrF,CAAC"}
|
|
@@ -1,35 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* identical on the large majority of one session's thirty-odd tool calls.
|
|
7
|
-
* Nothing about it was wrong; it was simply the same paragraph, re-billed to
|
|
8
|
-
* the caller's context window every call, and the loop this server is built
|
|
9
|
-
* for (edit, re-check, edit again) is the one that pays it most.
|
|
10
|
-
*
|
|
11
|
-
* ## What the ledger is allowed to shorten, and what it is not
|
|
12
|
-
*
|
|
13
|
-
* Only the *argument* for a cap. The floor and the class it caps to stay on
|
|
14
|
-
* every reply, first or fiftieth, in `graph.resolutionFloor` /
|
|
15
|
-
* `graph.reliabilityCap` and in the short disclosure itself. Rule 7 is about
|
|
16
|
-
* what reaches the user, and a reply that stopped naming its own cap after
|
|
17
|
-
* the first call would be a reply that silently does less.
|
|
18
|
-
*
|
|
19
|
-
* ## Per connection, deliberately not per process
|
|
20
|
-
*
|
|
21
|
-
* "Already disclosed" is a fact about one conversation. A ledger shared across
|
|
22
|
-
* connections would let the *second* client's first call inherit the first
|
|
23
|
-
* client's history — that client would receive the short form of a sentence it
|
|
24
|
-
* has never seen, which is the exact failure this is supposed to avoid, only
|
|
25
|
-
* harder to notice. So one ledger is created per `createMcpServer`, and it
|
|
26
|
-
* lives as long as that server does.
|
|
27
|
-
*/
|
|
2
|
+
* Tracks disclosures this connection has already seen in full. Measured: the
|
|
3
|
+
* R0/class-C sentence is ~354 chars (~88 tokens), repeated on most of a 30-call
|
|
4
|
+
* session. Only the *argument* shortens — floor/cap stay on every reply (rule 7).
|
|
5
|
+
* Per connection, not per process — a second client can't inherit the first's history. */
|
|
28
6
|
export interface DisclosureLedger {
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
31
|
-
* Records the sighting — calling it is what marks the key as disclosed.
|
|
32
|
-
*/
|
|
7
|
+
/** `true` the first time this key is seen on this connection, `false` after —
|
|
8
|
+
* calling it is what marks the key as disclosed. */
|
|
33
9
|
firstSighting(key: string): boolean;
|
|
34
10
|
/** Keys disclosed in full so far. For tests and diagnostics. */
|
|
35
11
|
disclosed(): readonly string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disclosure-ledger.d.ts","sourceRoot":"","sources":["../src/disclosure-ledger.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"disclosure-ledger.d.ts","sourceRoot":"","sources":["../src/disclosure-ledger.ts"],"names":[],"mappings":"AAAA;;;;0FAI0F;AAE1F,MAAM,WAAW,gBAAgB;IAC/B;yDACqD;IACrD,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,gEAAgE;IAChE,SAAS,IAAI,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,wBAAgB,sBAAsB,IAAI,gBAAgB,CAUzD"}
|
|
@@ -1,30 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* identical on the large majority of one session's thirty-odd tool calls.
|
|
7
|
-
* Nothing about it was wrong; it was simply the same paragraph, re-billed to
|
|
8
|
-
* the caller's context window every call, and the loop this server is built
|
|
9
|
-
* for (edit, re-check, edit again) is the one that pays it most.
|
|
10
|
-
*
|
|
11
|
-
* ## What the ledger is allowed to shorten, and what it is not
|
|
12
|
-
*
|
|
13
|
-
* Only the *argument* for a cap. The floor and the class it caps to stay on
|
|
14
|
-
* every reply, first or fiftieth, in `graph.resolutionFloor` /
|
|
15
|
-
* `graph.reliabilityCap` and in the short disclosure itself. Rule 7 is about
|
|
16
|
-
* what reaches the user, and a reply that stopped naming its own cap after
|
|
17
|
-
* the first call would be a reply that silently does less.
|
|
18
|
-
*
|
|
19
|
-
* ## Per connection, deliberately not per process
|
|
20
|
-
*
|
|
21
|
-
* "Already disclosed" is a fact about one conversation. A ledger shared across
|
|
22
|
-
* connections would let the *second* client's first call inherit the first
|
|
23
|
-
* client's history — that client would receive the short form of a sentence it
|
|
24
|
-
* has never seen, which is the exact failure this is supposed to avoid, only
|
|
25
|
-
* harder to notice. So one ledger is created per `createMcpServer`, and it
|
|
26
|
-
* lives as long as that server does.
|
|
27
|
-
*/
|
|
2
|
+
* Tracks disclosures this connection has already seen in full. Measured: the
|
|
3
|
+
* R0/class-C sentence is ~354 chars (~88 tokens), repeated on most of a 30-call
|
|
4
|
+
* session. Only the *argument* shortens — floor/cap stay on every reply (rule 7).
|
|
5
|
+
* Per connection, not per process — a second client can't inherit the first's history. */
|
|
28
6
|
export function createDisclosureLedger() {
|
|
29
7
|
const seen = new Set();
|
|
30
8
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disclosure-ledger.js","sourceRoot":"","sources":["../src/disclosure-ledger.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"disclosure-ledger.js","sourceRoot":"","sources":["../src/disclosure-ledger.ts"],"names":[],"mappings":"AAAA;;;;0FAI0F;AAU1F,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO;QACL,aAAa,CAAC,GAAG;YACf,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QACD,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;KAC3B,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* A thin wrapper over the query layer, as DEC-002 requires: every consumer goes
|
|
5
|
-
* through here and **nothing touches storage directly**. That is why the tools
|
|
6
|
-
* hold a `Session` and not a driver.
|
|
7
|
-
*/
|
|
1
|
+
/** `@descryy/mcp` — the agent-facing front door. A thin wrapper over the query layer
|
|
2
|
+
* (DEC-002): every consumer goes through here and nothing touches storage directly —
|
|
3
|
+
* which is why tools hold a `Session`, not a driver. */
|
|
8
4
|
export { createMcpServer } from "./server.ts";
|
|
9
5
|
export type { McpServer, McpServerOptions } from "./server.ts";
|
|
10
6
|
export { Session, loadConfig, writeConfig, writeSources, ConfigError, CONFIG_RELATIVE_PATH, DEFAULT_GRAPH_RELATIVE_PATH, } from "./session.ts";
|
|
@@ -15,29 +11,17 @@ export { renderAnswer, renderFailed, renderHandshake, renderTimedOut, renderTool
|
|
|
15
11
|
export type { AnswerEnvelope, CallToolResult, Provenance, ResultState, ToolAnswer, ToolTier, TruncationDetail, } from "./render.ts";
|
|
16
12
|
export { TOOLS, TOOLS_BY_NAME, ToolInputError, resolveOneNode } from "./tools/index.ts";
|
|
17
13
|
export type { BriefNode, NodeCandidates, Progress, ToolContext, ToolDefinition, } from "./tools/index.ts";
|
|
18
|
-
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* `data` is `unknown` in the envelope by design — it differs per tool — but
|
|
22
|
-
* "read the handler" is not a contract, and an AI caller cannot rely on a
|
|
23
|
-
* shape nobody wrote down. Each of these describes what its tool returns
|
|
24
|
-
* **today**; where a tool's payload is genuinely conditional the type is a
|
|
25
|
-
* union that says so rather than a widening to `unknown`.
|
|
26
|
-
*/
|
|
14
|
+
/** The shape each tool puts in `AnswerEnvelope.data`. `data` is `unknown` in the envelope
|
|
15
|
+
* by design, but an AI caller can't rely on an unwritten shape — each type here describes
|
|
16
|
+
* what its tool returns today; genuinely conditional payloads are unions, not `unknown`. */
|
|
27
17
|
export type { AffectedRef, AnalyzeData, BlockedCheck, CoChangedFile, ConfigDependencyReport, ContractPathFinding, ContractShapeMismatchReport, ContractShapeStatus, ContractsData, CrossPrData, CrossPrEmptyDiff, CrossPrGitFailure, CrossPrReport, EnvFindingReport, HiddenDependencyCheck, HiddenDependencyFinding, HistoryData, HistoryFile, HistoryFileResolved, HistoryFileUnresolved, HistoryReport, ImpactData, ImpactReport, ImpactedNode, LinkWorkspaceData, MarkIncidentData, LinkedRepo, OverlapCheck, OverlapReportChecked, PrAnalysisData, PrAnalysisEmptyDiff, PrAnalysisGitFailure, PrAnalysisLists, PrAnalysisRange, PrAnalysisReport, PrAnalysisUnresolved, PropagationData, PropagationReport, QuestionsData, ReachedNode, RelatedNode, ScopeData, ScopeNotSeeded, ScopeReport, ScopeTierCount, ScopedNodeReport, SimilarIncidentReport, SimilarIncidentSignalReport, SimilarIncidentsData, SourceRun, SupersededCheck, TracedPath, ValidateData, } from "./tools/index.ts";
|
|
28
18
|
export { serveStdio, guardStdout, createLineReader } from "./transport.ts";
|
|
29
19
|
export type { Transport, StdioOptions } from "./transport.ts";
|
|
30
20
|
export { PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS, negotiateVersion, parseMessage, ProtocolError, } from "./protocol.ts";
|
|
31
21
|
export type { RpcRequest, RpcNotification, RpcResponse, RpcMessage, RpcId } from "./protocol.ts";
|
|
32
|
-
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
|
|
36
|
-
* module and must not reach past the package boundary to do it. A CLI that
|
|
37
|
-
* imported `./scenarios/storage.ts` by relative path would be a second reader
|
|
38
|
-
* of the format, free to drift from this one the day the schema changes; the
|
|
39
|
-
* whole argument for a format module is that there is exactly one.
|
|
40
|
-
*/
|
|
41
|
-
export { SCENARIO_SCHEMA_VERSION, isUnverifying, parseScenario, serializeScenario, scenariosDirectory, scenarioPath, listScenarios, readScenario, writeScenario, } from "./scenarios/index.ts";
|
|
22
|
+
/** The scenario format — storage, schema, refusals. Re-exported here so `descry check`
|
|
23
|
+
* doesn't reach past the package boundary — a second reader importing the relative path
|
|
24
|
+
* could drift from this one the day the schema changes. */
|
|
25
|
+
export { SCENARIO_SCHEMA_VERSION, isUnverifying, parseScenario, serializeScenario, scenariosDirectory, scenarioPath, listScenarios, ScenarioListError, readScenario, writeScenario, } from "./scenarios/index.ts";
|
|
42
26
|
export type { Scenario, ScenarioStep, ScenarioAssertion, ScenarioAssertionKind, ScenarioActionKind, ScenarioParseResult, TargetDescriptor, } from "./scenarios/index.ts";
|
|
43
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;yDAEyD;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EACL,OAAO,EACP,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1E,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEjG,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,EACf,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,cAAc,EACd,cAAc,EACd,UAAU,EACV,WAAW,EACX,UAAU,EACV,QAAQ,EACR,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACxF,YAAY,EACV,SAAS,EACT,cAAc,EACd,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B;;6FAE6F;AAC7F,YAAY,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,WAAW,EACX,SAAS,EACT,cAAc,EACd,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,2BAA2B,EAC3B,oBAAoB,EACpB,SAAS,EACT,eAAe,EACf,UAAU,EACV,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9D,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,gBAAgB,EAChB,YAAY,EACZ,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEjG;;4DAE4D;AAC5D,OAAO,EACL,uBAAuB,EACvB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC"}
|