@descryy/mcp 0.6.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 +59 -224
- package/dist/browser/driver.d.ts.map +1 -1
- package/dist/browser/driver.js +9 -55
- package/dist/browser/driver.js.map +1 -1
- package/dist/browser/evidence.d.ts +10 -43
- package/dist/browser/evidence.d.ts.map +1 -1
- package/dist/browser/evidence.js +20 -54
- package/dist/browser/evidence.js.map +1 -1
- package/dist/browser/fake-driver.d.ts +4 -16
- package/dist/browser/fake-driver.d.ts.map +1 -1
- package/dist/browser/fake-driver.js +6 -20
- 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 +7 -91
- package/dist/browser/playwright-driver.d.ts.map +1 -1
- package/dist/browser/playwright-driver.js +40 -194
- 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 +30 -90
- 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 +21 -65
- 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 +9 -33
- package/dist/capped.d.ts.map +1 -1
- package/dist/capped.js +7 -27
- package/dist/capped.js.map +1 -1
- 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 +42 -11
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +74 -10
- package/dist/render.js.map +1 -1
- package/dist/runtime-registry.d.ts +7 -66
- package/dist/runtime-registry.d.ts.map +1 -1
- package/dist/runtime-registry.js +39 -114
- 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 +37 -17
- package/dist/server.js.map +1 -1
- package/dist/session.d.ts +67 -259
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +69 -250
- package/dist/session.js.map +1 -1
- package/dist/tools/analyze.d.ts +24 -118
- package/dist/tools/analyze.d.ts.map +1 -1
- package/dist/tools/analyze.js +44 -166
- 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 +15 -74
- 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 +33 -55
- 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 +9 -86
- package/dist/tools/contracts.d.ts.map +1 -1
- package/dist/tools/contracts.js +24 -80
- package/dist/tools/contracts.js.map +1 -1
- package/dist/tools/cross-pr.d.ts +42 -30
- package/dist/tools/cross-pr.d.ts.map +1 -1
- package/dist/tools/cross-pr.js +81 -62
- 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 +118 -26
- 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 +257 -435
- package/dist/tools/observe-runtime.js.map +1 -1
- package/dist/tools/observe-tests.d.ts +9 -100
- package/dist/tools/observe-tests.d.ts.map +1 -1
- package/dist/tools/observe-tests.js +24 -152
- 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 +68 -16
- package/dist/tools/pre-push.d.ts.map +1 -1
- package/dist/tools/pre-push.js +98 -35
- 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 +10 -29
- 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 +14 -69
- package/dist/tools/validate.d.ts.map +1 -1
- package/dist/tools/validate.js +23 -74
- 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 +30 -21
package/dist/session.d.ts
CHANGED
|
@@ -1,27 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* One
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* what lets the whole tool layer be tested against an in-memory graph.
|
|
7
|
-
*
|
|
8
|
-
* ## Configuration is read once and reported, not read repeatedly and assumed
|
|
9
|
-
*
|
|
10
|
-
* `.descry/config.json` is optional. Everything in it has a default that makes
|
|
11
|
-
* local mode work unconfigured, per the architecture's local-first guarantee —
|
|
12
|
-
* except the source list, which cannot have one: this repository must not name
|
|
13
|
-
* an adapter (see `registry.ts`). So an unconfigured session can query a graph
|
|
14
|
-
* and cannot build one, and `analyze` says exactly that rather than reporting a
|
|
15
|
-
* successful run over zero sources.
|
|
16
|
-
*
|
|
17
|
-
* ## The graph is opened lazily
|
|
18
|
-
*
|
|
19
|
-
* A server that opened the database at startup would fail to start on a repo
|
|
20
|
-
* that has never been analysed — the worst possible first experience for the
|
|
21
|
-
* primary UX. Opening on first use means `tools/list` works everywhere, and a
|
|
22
|
-
* query against a missing graph fails as a *tool* result the agent can read and
|
|
23
|
-
* act on ("run analyze first"), not as a crash before the handshake.
|
|
24
|
-
*/
|
|
2
|
+
* One repo, one graph, one process — owns the SQLite handle, config, sources; tools
|
|
3
|
+
* own nothing. `.descry/config.json` is optional, defaults to local-first, except the
|
|
4
|
+
* source list (this repo names no adapter, `registry.ts`): unconfigured sessions can
|
|
5
|
+
* query, not build. Graph opens lazily so a missing one fails as a tool result, not a crash. */
|
|
25
6
|
import type { ConfirmedFact, ConfirmedIncident, RepoRoot } from "@descryy/ir";
|
|
26
7
|
import { type AdjacencyProvider, type Store } from "@descryy/core";
|
|
27
8
|
import type { BrowserDriver } from "./browser/driver.ts";
|
|
@@ -31,55 +12,26 @@ import { type SourceSpec } from "./registry.ts";
|
|
|
31
12
|
export interface DescryConfig {
|
|
32
13
|
/** Identity scope for repo-scoped nodes. Never a path — see DEC-004. */
|
|
33
14
|
readonly repo: string;
|
|
34
|
-
/**
|
|
35
|
-
*
|
|
36
|
-
* of the workspace; a mismatch produces a graph that joins nothing silently.
|
|
37
|
-
*/
|
|
15
|
+
/** The contract boundary (DEC-054). Must be byte-identical across the workspace;
|
|
16
|
+
* a mismatch joins nothing, silently. */
|
|
38
17
|
readonly workspace?: string | undefined;
|
|
39
18
|
/** Graph file, relative to the repository root unless absolute. */
|
|
40
19
|
readonly graph: string;
|
|
41
20
|
readonly sources: readonly SourceSpec[];
|
|
42
|
-
/**
|
|
43
|
-
*
|
|
44
|
-
* rows, in the same small, field-additive, human-inspectable file as
|
|
45
|
-
* `repo`/`workspace` rather than a new store table — recommended there on
|
|
46
|
-
* measured population (a handful of facts per repository, not thousands;
|
|
47
|
-
* see DEC-223 for the number this rests on). Revisit if that stops holding.
|
|
48
|
-
*/
|
|
21
|
+
/** DEC-223 §4: human-confirmed refusal answers, stored in this small field-additive
|
|
22
|
+
* file (not a store table) — measured population is a handful per repo, not thousands. */
|
|
49
23
|
readonly confirmedFacts: readonly ConfirmedFact[];
|
|
50
|
-
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* from a directory listing (`link_workspace`'s own header, one level up).
|
|
54
|
-
*
|
|
55
|
-
* Recorded because a workspace *name* alone tells a session nothing about
|
|
56
|
-
* where its siblings are on disk, and a workspace-scoped confirmed fact
|
|
57
|
-
* lives in the config of whichever repository it was recorded in.
|
|
58
|
-
*
|
|
59
|
-
* Optional rather than required: `loadConfig` always sets it, and a
|
|
60
|
-
* hand-built config (a test, an embedder) that predates this field means
|
|
61
|
-
* "no siblings declared", which is the same thing an empty list means.
|
|
62
|
-
*/
|
|
24
|
+
/** Other repos `link_workspace` declared — exactly as supplied, never discovered or
|
|
25
|
+
* inferred. Optional: `loadConfig` always sets it; absent means "no siblings", same
|
|
26
|
+
* as empty. */
|
|
63
27
|
readonly workspaceRepos?: readonly WorkspaceRepo[];
|
|
64
|
-
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* Beside `confirmedFacts` and for the same reason (DEC-223's storage
|
|
68
|
-
* decision): a handful of small, human-inspectable records per repository,
|
|
69
|
-
* versioned with the code, in a file a person can read and correct. The graph
|
|
70
|
-
* holds a *projection* of these — see `createConfirmedIncidentSource` — so a
|
|
71
|
-
* schema bump dropping every derived table costs nothing.
|
|
72
|
-
*/
|
|
28
|
+
/** Defects recorded via `mark_incident`. Same DEC-223 storage choice as
|
|
29
|
+
* `confirmedFacts` — human-inspectable, versioned with code. The graph holds
|
|
30
|
+
* only a projection (`createConfirmedIncidentSource`); a schema bump costs nothing. */
|
|
73
31
|
readonly confirmedIncidents?: readonly ConfirmedIncident[];
|
|
74
|
-
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* Kept separate from `confirmedFacts` rather than merged: "recorded here"
|
|
78
|
-
* and "recorded next door and declared to reach here" are different facts,
|
|
79
|
-
* and a consumer that cannot tell them apart cannot disclose the difference.
|
|
80
|
-
* Only facts with `scope: "workspace"` and this workspace's id appear —
|
|
81
|
-
* see DEC-NEXT-workspace-scoped-confirmed-facts.
|
|
82
|
-
*/
|
|
32
|
+
/** Workspace-scoped facts read from sibling configs. Kept separate from
|
|
33
|
+
* `confirmedFacts` — "recorded here" vs "recorded next door, declared to reach
|
|
34
|
+
* here" are different facts a consumer must be able to disclose apart. */
|
|
83
35
|
readonly linkedFacts?: readonly ConfirmedFact[];
|
|
84
36
|
/** Where the settings came from, so a surprising run can be explained. */
|
|
85
37
|
readonly configPath: string | null;
|
|
@@ -101,91 +53,35 @@ export interface ConfigPatch {
|
|
|
101
53
|
/** Omit to leave a previously-set workspace untouched; there is no way to clear one here. */
|
|
102
54
|
readonly workspace?: string | undefined;
|
|
103
55
|
}
|
|
104
|
-
/**
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
* One writer for one file, used by both front doors that set the workspace
|
|
108
|
-
* id — `descry init` (`@descryy/cli`) and the `link_workspace` MCP tool — so
|
|
109
|
-
* the two can never drift into writing two different shapes of the same
|
|
110
|
-
* file. Fields this function does not know about (`graph`, `sources`, or
|
|
111
|
-
* anything a future version adds) survive a re-run untouched: this patches
|
|
112
|
-
* `repo` and `workspace`, it does not own the whole file.
|
|
113
|
-
*/
|
|
56
|
+
/** `.descry/config.json`'s writer, paired with `loadConfig`. One writer used by both
|
|
57
|
+
* `descry init` and `link_workspace` so they can't drift into writing different
|
|
58
|
+
* shapes. Patches `repo`/`workspace` only — other fields survive untouched. */
|
|
114
59
|
export declare function writeConfig(repoPath: string, patch: ConfigPatch): Promise<{
|
|
115
60
|
readonly path: string;
|
|
116
61
|
readonly previousWorkspace: string | undefined;
|
|
117
62
|
}>;
|
|
118
|
-
/**
|
|
119
|
-
* `
|
|
120
|
-
*
|
|
121
|
-
* and `writeSources` (`sources`), for the reason those three stayed separate:
|
|
122
|
-
* a shared file gets one writer per field it owns, not one function that
|
|
123
|
-
* grows a branch per field.
|
|
124
|
-
*
|
|
125
|
-
* Replaces the whole list rather than merging into it. A workspace's
|
|
126
|
-
* membership is one declaration made at one moment — merging would mean a
|
|
127
|
-
* repository silently retaining a sibling a later, corrected `link_workspace`
|
|
128
|
-
* call deliberately left out.
|
|
129
|
-
*/
|
|
63
|
+
/** `workspaceRepos`' writer — one writer per field a shared file owns (see
|
|
64
|
+
* `writeConfig`, `writeConfirmedFact`, `writeSources`). Replaces the whole list
|
|
65
|
+
* rather than merging: membership is one declaration made at one moment. */
|
|
130
66
|
export declare function writeWorkspaceRepos(repoPath: string, repos: readonly WorkspaceRepo[]): Promise<{
|
|
131
67
|
readonly path: string;
|
|
132
68
|
}>;
|
|
133
|
-
/**
|
|
134
|
-
* `
|
|
135
|
-
*
|
|
136
|
-
* `writeConfig`'s own doc is explicit that it "patches `repo` and
|
|
137
|
-
* `workspace`, it does not own the whole file" — a second, narrow writer for
|
|
138
|
-
* a second, narrow field keeps that boundary rather than growing one
|
|
139
|
-
* function into "the file's owner." Both read-modify-write the same JSON
|
|
140
|
-
* file the same way, so a future field gets a third writer, not a branch in
|
|
141
|
-
* this one.
|
|
142
|
-
*
|
|
143
|
-
* Keyed on exact `(repo, blockedBy, environment)` — DEC-223 §3 and
|
|
144
|
-
* `ConfirmedFact`'s own doc; `environment` is `undefined` for an unscoped
|
|
145
|
-
* answer, which is its own distinct key value, not a wildcard that a later
|
|
146
|
-
* environment-scoped answer would collide with. A second call with the same
|
|
147
|
-
* key **replaces** the first rather than appending a duplicate: a
|
|
148
|
-
* re-confirmation (the value changed, or the same value is being
|
|
149
|
-
* re-asserted after §7's staleness note) updates in place, and a caller can
|
|
150
|
-
* always find out what was overwritten from the return value rather than
|
|
151
|
-
* having to read the file first. A second call with a *different*
|
|
152
|
-
* environment for the same `blockedBy` adds a second fact rather than
|
|
153
|
-
* replacing the first — a repository can genuinely need one value per
|
|
154
|
-
* environment.
|
|
155
|
-
*/
|
|
69
|
+
/** `confirmedFacts`' writer, separate from `writeConfig` (one writer per field). Keyed
|
|
70
|
+
* on exact `(repo, blockedBy, environment)` (DEC-223 §3) — undefined environment is its
|
|
71
|
+
* own key, not a wildcard. Same key replaces; a different environment adds a new fact. */
|
|
156
72
|
export declare function writeConfirmedFact(repoPath: string, fact: ConfirmedFact): Promise<{
|
|
157
73
|
readonly path: string;
|
|
158
74
|
readonly replaced: ConfirmedFact | null;
|
|
159
75
|
}>;
|
|
160
|
-
/**
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
* field it owns, not one function that grows a branch per field.
|
|
164
|
-
*
|
|
165
|
-
* **Appends, never replaces.** Unlike `writeConfirmedFact`, which keys on
|
|
166
|
-
* `(repo, blockedBy, environment)` because re-confirming a value updates one
|
|
167
|
-
* answer, two incidents are two incidents even when they name the same files
|
|
168
|
-
* and read alike. Collapsing them would lose the fact that something broke
|
|
169
|
-
* twice, which is precisely the signal an incident corpus exists to carry.
|
|
170
|
-
* `confirmedAt` is the record's identity, so a second call at the same instant
|
|
171
|
-
* with the same summary is the only case that de-duplicates.
|
|
172
|
-
*/
|
|
76
|
+
/** `confirmedIncidents`' writer — appends, never replaces (unlike `writeConfirmedFact`,
|
|
77
|
+
* which keys on one answer). Two incidents naming the same files are still two
|
|
78
|
+
* incidents; `confirmedAt`+`summary` is the only dedup key. */
|
|
173
79
|
export declare function writeConfirmedIncident(repoPath: string, incident: ConfirmedIncident): Promise<{
|
|
174
80
|
readonly path: string;
|
|
175
81
|
readonly total: number;
|
|
176
82
|
}>;
|
|
177
|
-
/**
|
|
178
|
-
* `
|
|
179
|
-
* (`repo`/`workspace`) and `writeConfirmedFact` (`confirmedFacts`), for the
|
|
180
|
-
* same reason those two stayed separate: a shared file gets one writer per
|
|
181
|
-
* field it owns, not one function that grows a branch per field.
|
|
182
|
-
*
|
|
183
|
-
* Unconditional: the caller (`descry init`) decides whether writing is
|
|
184
|
-
* appropriate — reading `loadConfig(repoPath).sources` first and skipping
|
|
185
|
-
* this call when it is already non-empty — because "should this overwrite
|
|
186
|
-
* what's there" is a policy question `writeConfig`'s own precedent leaves to
|
|
187
|
-
* the caller, not to the file-writing primitive.
|
|
188
|
-
*/
|
|
83
|
+
/** `sources`' writer, one writer per field like the others. Unconditional — the caller
|
|
84
|
+
* (`descry init`) decides whether overwriting is appropriate, not this primitive. */
|
|
189
85
|
export declare function writeSources(repoPath: string, sources: readonly string[]): Promise<{
|
|
190
86
|
readonly path: string;
|
|
191
87
|
}>;
|
|
@@ -195,12 +91,9 @@ export interface SessionOptions {
|
|
|
195
91
|
readonly openGraph?: (path: string) => Store;
|
|
196
92
|
readonly config?: DescryConfig;
|
|
197
93
|
}
|
|
198
|
-
/**
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
* received — not the pre-render `ToolAnswer` — so a citation checks against
|
|
202
|
-
* what was actually read, not an internal shape the host never saw.
|
|
203
|
-
*/
|
|
94
|
+
/** One completed tool call, kept for `verify_claim` to check a citation against.
|
|
95
|
+
* `result` is the exact `structuredContent` the host received, not the pre-render
|
|
96
|
+
* `ToolAnswer` — a citation checks what was actually seen. */
|
|
204
97
|
export interface RecordedToolCall {
|
|
205
98
|
/** Stable within this session only — see `Session#recordCall`'s doc. */
|
|
206
99
|
readonly id: string;
|
|
@@ -218,137 +111,52 @@ export declare class Session {
|
|
|
218
111
|
get graphPath(): string;
|
|
219
112
|
/** Open on first use; reuse thereafter. */
|
|
220
113
|
store(): Store;
|
|
221
|
-
/**
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
* Every other tool goes through `store()`/`provider()` and keeps refusing a
|
|
225
|
-
* version mismatch per DEC-017 (`SchemaVersionError`'s own message names
|
|
226
|
-
* this method's caller as the fix). `analyze` is different: it is about to
|
|
227
|
-
* rebuild the graph from source regardless, so there is nothing lost by
|
|
228
|
-
* repairing the derived tables first instead of stopping.
|
|
229
|
-
*
|
|
230
|
-
* Opens a short-lived `NodeSqliteDriver` directly rather than going through
|
|
231
|
-
* `this.#openGraph` — the injected-store path a test fixture uses bypasses
|
|
232
|
-
* a real file on disk entirely, and a `SchemaVersionError` from `migrate()`
|
|
233
|
-
* only exists for a real one. A no-op here on that path (nothing found to
|
|
234
|
-
* repair, `rebuilt: false`) is correct: an injected in-memory fixture store
|
|
235
|
-
* is never stale by construction, and `store()` right after this still
|
|
236
|
-
* goes through the real, checked path either way — this only ever removes
|
|
237
|
-
* a refusal that check would otherwise have hit first.
|
|
238
|
-
*/
|
|
114
|
+
/** `analyze`'s own repair path — the only caller entitled to one (others refuse a
|
|
115
|
+
* version mismatch per DEC-017). Opens a short-lived driver directly, bypassing an
|
|
116
|
+
* injected test store; no-op there since an in-memory fixture is never stale. */
|
|
239
117
|
repairStaleGraph(): {
|
|
240
118
|
readonly rebuilt: boolean;
|
|
241
119
|
};
|
|
242
120
|
provider(): AdjacencyProvider;
|
|
243
|
-
/**
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
* The commit sha is read from git and **is not defaulted** when git is absent:
|
|
247
|
-
* every node and edge is stamped with it, and a placeholder would make the
|
|
248
|
-
* staleness stamp a lie that nothing downstream could detect.
|
|
249
|
-
*/
|
|
121
|
+
/** Repo root for an analysis run. Commit sha comes from git and is never defaulted
|
|
122
|
+
* when git is absent — every node/edge is stamped with it, and a placeholder would
|
|
123
|
+
* make the staleness stamp a lie nothing downstream could detect. */
|
|
250
124
|
root(): Promise<RepoRoot>;
|
|
251
|
-
/**
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
* Created lazily and only on the connection that asks for one, the same
|
|
256
|
-
* reason the graph is opened lazily: a server that started a sweeper for
|
|
257
|
-
* every session would pay for browser bookkeeping on the overwhelming
|
|
258
|
-
* majority of connections that never call a browser tool.
|
|
259
|
-
*
|
|
260
|
-
* It hangs here rather than in a module-level map because "per connection,
|
|
261
|
-
* never global" is the property that has to hold, and this object already
|
|
262
|
-
* *is* the connection's lifetime. A global registry keyed by session would
|
|
263
|
-
* be the same thing with one more way to get it wrong.
|
|
264
|
-
*/
|
|
125
|
+
/** Live browser sessions for this connection (`mcp-browser-tools.md` §4). Created
|
|
126
|
+
* lazily, same reason as the graph — most connections never touch a browser tool.
|
|
127
|
+
* Lives here, not a module-level map, so "per connection, never global" actually holds. */
|
|
265
128
|
browserSessions(): BrowserSessionRegistry;
|
|
266
|
-
/**
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
* Unavailable by default, and that is the honest state of this build:
|
|
270
|
-
* `@descryy/runtime-browser` is not in the installed closure yet, so there
|
|
271
|
-
* is no page to drive. Reported as a refusal with a remedy rather than as a
|
|
272
|
-
* tool that silently returns an empty page — an empty snapshot and "this
|
|
273
|
-
* build cannot open a browser" are different claims, and only one of them
|
|
274
|
-
* is true here (rule 7).
|
|
275
|
-
*/
|
|
129
|
+
/** The browser this connection drives, or a named reason there is none. Unavailable
|
|
130
|
+
* by default — `@descryy/runtime-browser` isn't installed yet — reported as a refusal
|
|
131
|
+
* with a remedy, never a silently-empty page (rule 7). */
|
|
276
132
|
browserBackend(): BrowserBackend;
|
|
277
|
-
/**
|
|
278
|
-
*
|
|
279
|
-
*
|
|
280
|
-
* The seam the final swap goes through, and the seam every browser test
|
|
281
|
-
* goes through today. It is a method rather than a constructor argument
|
|
282
|
-
* because the overwhelming majority of sessions never touch a browser and
|
|
283
|
-
* should not have to name one to be constructed.
|
|
284
|
-
*/
|
|
133
|
+
/** Installs the driver this connection's browser tools use. A method, not a
|
|
134
|
+
* constructor arg — most sessions never touch a browser and shouldn't have to
|
|
135
|
+
* name one to be constructed. */
|
|
285
136
|
useBrowserDriver(driver: BrowserDriver): void;
|
|
286
|
-
/**
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
* A factory rather than a driver because the stack-trace parser is named
|
|
290
|
-
* per call (`browser_start_session`'s `stackParser`), and a parser is
|
|
291
|
-
* language-specific — one process can legitimately drive a browser against
|
|
292
|
-
* two applications written in different languages.
|
|
293
|
-
*/
|
|
137
|
+
/** Installs a factory that builds a driver per session. A factory, not a driver,
|
|
138
|
+
* because the stack-trace parser (`browser_start_session`'s `stackParser`) is
|
|
139
|
+
* language-specific and named per call. */
|
|
294
140
|
useBrowserDriverFactory(factory: BrowserDriverFactory): void;
|
|
295
|
-
/**
|
|
296
|
-
*
|
|
297
|
-
*
|
|
298
|
-
* Deliberately left synchronous and left as the thing every existing caller
|
|
299
|
-
* calls. A browser session cannot be closed synchronously, so the reap
|
|
300
|
-
* lives in `dispose()` — and this method stays the one that a caller with
|
|
301
|
-
* no browser sessions can keep using unchanged.
|
|
302
|
-
*/
|
|
141
|
+
/** Synchronous teardown, no I/O to wait on. A browser session can't close
|
|
142
|
+
* synchronously, so that reap lives in `dispose()` — this stays the method
|
|
143
|
+
* every existing no-browser caller keeps using unchanged. */
|
|
303
144
|
close(): void;
|
|
304
|
-
/**
|
|
305
|
-
*
|
|
306
|
-
*
|
|
307
|
-
* This is what a client disconnect must reach. §4 requires the transport
|
|
308
|
-
* closing to reap every session that connection owns, and a browser is the
|
|
309
|
-
* one thing this session holds that keeps running after the process stops
|
|
310
|
-
* caring about it — a leaked SQLite handle costs a file descriptor, a
|
|
311
|
-
* leaked Chromium costs the developer's machine.
|
|
312
|
-
*
|
|
313
|
-
* Awaits the reap before closing the rest, so the evidence flush has a
|
|
314
|
-
* live registry to record itself against.
|
|
315
|
-
*/
|
|
145
|
+
/** Full teardown, including any live browser — what a client disconnect must
|
|
146
|
+
* reach (§4). A leaked Chromium costs the developer's machine, not just a file
|
|
147
|
+
* descriptor. Awaits the reap first so the evidence flush has a live registry. */
|
|
316
148
|
dispose(): Promise<void>;
|
|
317
|
-
/**
|
|
318
|
-
*
|
|
319
|
-
*
|
|
320
|
-
* `server.ts` calls this before `renderAnswer` so the envelope can carry
|
|
321
|
-
* the id as `callId` (`render.ts`'s own doc on that field), and records
|
|
322
|
-
* under the same value afterwards with `recordCallWithId` — one id, used
|
|
323
|
-
* for both, rather than one minted for the reply and a different one
|
|
324
|
-
* minted later for the record. Exposed as its own method (rather than
|
|
325
|
-
* folded into `recordCall`) because the id has to exist *before* the
|
|
326
|
-
* result it will be recorded with does; there is no result yet at the
|
|
327
|
-
* point this is called.
|
|
328
|
-
*/
|
|
149
|
+
/** Mints the next call id without recording anything yet. `server.ts` calls this
|
|
150
|
+
* before render so the reply can carry `callId`, then records under the same id
|
|
151
|
+
* with `recordCallWithId` — one id used for both. */
|
|
329
152
|
allocateCallId(): string;
|
|
330
|
-
/**
|
|
331
|
-
*
|
|
332
|
-
*
|
|
333
|
-
* `structuredContent` the host received.
|
|
334
|
-
*
|
|
335
|
-
* IDs are sequential and scoped to this process's lifetime only —
|
|
336
|
-
* `"one repository, one graph, one process"` above is what makes "this
|
|
337
|
-
* session's recorded tool calls" a coherent, checkable population at all.
|
|
338
|
-
* A citation naming an id from a *different* process's session cannot
|
|
339
|
-
* resolve here, which is exactly `ai-governance-spec.md` §2's G1 negative
|
|
340
|
-
* control ("a citation pointing at a tool call from a different run") —
|
|
341
|
-
* not a defect to guard against, the mechanism doing its job.
|
|
342
|
-
*/
|
|
153
|
+
/** `verify_claim`'s fact boundary — called once per call with the exact
|
|
154
|
+
* `structuredContent` the host received. IDs are scoped to this process only, so a
|
|
155
|
+
* citation from a different run can't resolve (§2's G1 negative control). */
|
|
343
156
|
recordCall(tool: string, args: Record<string, unknown>, result: Record<string, unknown>): RecordedToolCall;
|
|
344
|
-
/**
|
|
345
|
-
* `
|
|
346
|
-
*
|
|
347
|
-
* `callId` is this exact value, so `recordedCall(id)` finds it: the
|
|
348
|
-
* positive path that was previously unreachable because the id the
|
|
349
|
-
* envelope would need did not exist until one step after the envelope was
|
|
350
|
-
* already built.
|
|
351
|
-
*/
|
|
157
|
+
/** `recordCall` under an id minted earlier by `allocateCallId`, not one minted here
|
|
158
|
+
* — so `recordedCall(id)` can find the exact id a caller read off the reply's
|
|
159
|
+
* `callId`, which didn't exist until after the envelope was built. */
|
|
352
160
|
recordCallWithId(id: string, tool: string, args: Record<string, unknown>, result: Record<string, unknown>): RecordedToolCall;
|
|
353
161
|
/** All calls recorded this session, oldest first. */
|
|
354
162
|
recordedCalls(): readonly RecordedToolCall[];
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|