glasspane-mcp 0.1.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.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +24 -0
  3. package/dist/audit-session.d.ts +22 -0
  4. package/dist/audit-session.d.ts.map +1 -0
  5. package/dist/audit-session.js +64 -0
  6. package/dist/audit-session.js.map +1 -0
  7. package/dist/canonical.d.ts +7 -0
  8. package/dist/canonical.d.ts.map +1 -0
  9. package/dist/canonical.js +23 -0
  10. package/dist/canonical.js.map +1 -0
  11. package/dist/dispatch.d.ts +47 -0
  12. package/dist/dispatch.d.ts.map +1 -0
  13. package/dist/dispatch.js +122 -0
  14. package/dist/dispatch.js.map +1 -0
  15. package/dist/engine-client.d.ts +54 -0
  16. package/dist/engine-client.d.ts.map +1 -0
  17. package/dist/engine-client.js +135 -0
  18. package/dist/engine-client.js.map +1 -0
  19. package/dist/errors.d.ts +23 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +22 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/evidence-report.d.ts +30 -0
  24. package/dist/evidence-report.d.ts.map +1 -0
  25. package/dist/evidence-report.js +161 -0
  26. package/dist/evidence-report.js.map +1 -0
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +1476 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/io.d.ts +51 -0
  32. package/dist/io.d.ts.map +1 -0
  33. package/dist/io.js +74 -0
  34. package/dist/io.js.map +1 -0
  35. package/dist/project-registry.d.ts +76 -0
  36. package/dist/project-registry.d.ts.map +1 -0
  37. package/dist/project-registry.js +144 -0
  38. package/dist/project-registry.js.map +1 -0
  39. package/dist/tools.d.ts +255 -0
  40. package/dist/tools.d.ts.map +1 -0
  41. package/dist/tools.js +556 -0
  42. package/dist/tools.js.map +1 -0
  43. package/package.json +51 -0
  44. package/schemas/decision-log-entry.schema.json +45 -0
  45. package/schemas/evidence-pack.schema.json +359 -0
  46. package/schemas/recipe-config.schema.json +36 -0
  47. package/schemas/schemas/decision-log-entry.schema.json +45 -0
  48. package/schemas/schemas/evidence-pack.schema.json +359 -0
  49. package/schemas/schemas/recipe-config.schema.json +36 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/io.d.ts ADDED
@@ -0,0 +1,51 @@
1
+ import { Readable, Writable } from "node:stream";
2
+ /** Single-frame cap shared with the engine protocol (P0 spec §3.1). */
3
+ export declare const MAX_FRAME_BYTES: number;
4
+ export interface LineSink {
5
+ onLine(line: string): void;
6
+ onOversize(bytes: number): void;
7
+ }
8
+ /**
9
+ * Splits a byte-or-string stream on line boundaries. Keeps the current
10
+ * partial line until a newline arrives (so a JSON message split across
11
+ * chunks still reassembles correctly), mirrors engine FrameCodec.
12
+ */
13
+ export declare class LineReader {
14
+ private readonly sink;
15
+ private buffer;
16
+ constructor(sink: LineSink);
17
+ /** @param chunk UTF-8 text fragment received from the stream. */
18
+ push(chunk: string): void;
19
+ /** Unconsumed partial line (tests / graceful close inspection). */
20
+ pendingText(): string;
21
+ }
22
+ /**
23
+ * Low-level line I/O boundary used by the engine client. Production uses
24
+ * a Unix socket; tests inject an in-memory fake transport.
25
+ */
26
+ export interface LineIo {
27
+ writeLine(line: string): void;
28
+ onMessage(handler: (line: string) => void): void;
29
+ onClose(handler: () => void): void;
30
+ onError(handler: (error: Error) => void): void;
31
+ close(): void;
32
+ }
33
+ /**
34
+ * Wraps a Node Stream as a line-oriented transport. Calls encode the plain
35
+ * newline-delimited frames the daemon speaks (Section 3.1).
36
+ */
37
+ export declare class StreamLineIo implements LineIo {
38
+ readonly input: Readable;
39
+ private readonly output;
40
+ private readonly reader;
41
+ private messageHandler;
42
+ private closeHandler;
43
+ private errorHandler;
44
+ constructor(input: Readable, output: Writable);
45
+ writeLine(line: string): void;
46
+ onMessage(handler: (line: string) => void): void;
47
+ onClose(handler: () => void): void;
48
+ onError(handler: (error: Error) => void): void;
49
+ close(): void;
50
+ }
51
+ //# sourceMappingURL=io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEjD,uEAAuE;AACvE,eAAO,MAAM,eAAe,QAAkB,CAAC;AAE/C,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;;;GAIG;AACH,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,MAAM,CAAM;gBAES,IAAI,EAAE,QAAQ;IAE3C,iEAAiE;IACjE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAezB,mEAAmE;IACnE,WAAW,IAAI,MAAM;CAGtB;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IACjD,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACnC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/C,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;GAGG;AACH,qBAAa,YAAa,YAAW,MAAM;IAOvC,QAAQ,CAAC,KAAK,EAAE,QAAQ;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAAyC;gBAGlD,KAAK,EAAE,QAAQ,EACP,MAAM,EAAE,QAAQ;IAcnC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIhD,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIlC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAI9C,KAAK,IAAI,IAAI;CAGd"}
package/dist/io.js ADDED
@@ -0,0 +1,74 @@
1
+ /** Single-frame cap shared with the engine protocol (P0 spec §3.1). */
2
+ export const MAX_FRAME_BYTES = 4 * 1024 * 1024;
3
+ /**
4
+ * Splits a byte-or-string stream on line boundaries. Keeps the current
5
+ * partial line until a newline arrives (so a JSON message split across
6
+ * chunks still reassembles correctly), mirrors engine FrameCodec.
7
+ */
8
+ export class LineReader {
9
+ sink;
10
+ buffer = "";
11
+ constructor(sink) {
12
+ this.sink = sink;
13
+ }
14
+ /** @param chunk UTF-8 text fragment received from the stream. */
15
+ push(chunk) {
16
+ this.buffer += chunk;
17
+ let nl;
18
+ while ((nl = this.buffer.indexOf("\n")) !== -1) {
19
+ const line = this.buffer.slice(0, nl);
20
+ this.buffer = this.buffer.slice(nl + 1);
21
+ const bytes = Buffer.byteLength(line, "utf8");
22
+ if (bytes > MAX_FRAME_BYTES) {
23
+ this.sink.onOversize(bytes);
24
+ }
25
+ else {
26
+ this.sink.onLine(line);
27
+ }
28
+ }
29
+ }
30
+ /** Unconsumed partial line (tests / graceful close inspection). */
31
+ pendingText() {
32
+ return this.buffer;
33
+ }
34
+ }
35
+ /**
36
+ * Wraps a Node Stream as a line-oriented transport. Calls encode the plain
37
+ * newline-delimited frames the daemon speaks (Section 3.1).
38
+ */
39
+ export class StreamLineIo {
40
+ input;
41
+ output;
42
+ reader;
43
+ messageHandler = null;
44
+ closeHandler = null;
45
+ errorHandler = null;
46
+ constructor(input, output) {
47
+ this.input = input;
48
+ this.output = output;
49
+ this.reader = new LineReader({
50
+ onLine: (line) => this.messageHandler?.(line),
51
+ onOversize: () => this.errorHandler?.(new Error("frame exceeds " + MAX_FRAME_BYTES + " bytes")),
52
+ });
53
+ input.setEncoding("utf8");
54
+ input.on("data", (chunk) => this.reader.push(chunk));
55
+ input.on("close", () => this.closeHandler?.());
56
+ input.on("error", (error) => this.errorHandler?.(error));
57
+ }
58
+ writeLine(line) {
59
+ this.output.write(line + "\n");
60
+ }
61
+ onMessage(handler) {
62
+ this.messageHandler = handler;
63
+ }
64
+ onClose(handler) {
65
+ this.closeHandler = handler;
66
+ }
67
+ onError(handler) {
68
+ this.errorHandler = handler;
69
+ }
70
+ close() {
71
+ this.input.destroy();
72
+ }
73
+ }
74
+ //# sourceMappingURL=io.js.map
package/dist/io.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { z } from "zod";
2
+ export interface ProjectEntry {
3
+ projectId: string;
4
+ displayName: string;
5
+ bundleId?: string;
6
+ pid?: number;
7
+ recipeConfigPath?: string;
8
+ calibrationAssetsPath?: string;
9
+ evidenceStoragePath?: string;
10
+ createdAt: string;
11
+ }
12
+ export declare const ProjectListArgs: z.ZodObject<{}, "strict", z.ZodTypeAny, {}, {}>;
13
+ export type ProjectListArgs = z.infer<typeof ProjectListArgs>;
14
+ export declare const ProjectGetArgs: z.ZodObject<{
15
+ projectId: z.ZodString;
16
+ }, "strict", z.ZodTypeAny, {
17
+ projectId: string;
18
+ }, {
19
+ projectId: string;
20
+ }>;
21
+ export type ProjectGetArgs = z.infer<typeof ProjectGetArgs>;
22
+ export declare const ProjectSetArgs: z.ZodEffects<z.ZodObject<{
23
+ projectId: z.ZodOptional<z.ZodString>;
24
+ displayName: z.ZodString;
25
+ bundleId: z.ZodOptional<z.ZodString>;
26
+ pid: z.ZodOptional<z.ZodNumber>;
27
+ recipeConfigPath: z.ZodOptional<z.ZodString>;
28
+ calibrationAssetsPath: z.ZodOptional<z.ZodString>;
29
+ evidenceStoragePath: z.ZodOptional<z.ZodString>;
30
+ }, "strict", z.ZodTypeAny, {
31
+ displayName: string;
32
+ projectId?: string | undefined;
33
+ bundleId?: string | undefined;
34
+ pid?: number | undefined;
35
+ recipeConfigPath?: string | undefined;
36
+ calibrationAssetsPath?: string | undefined;
37
+ evidenceStoragePath?: string | undefined;
38
+ }, {
39
+ displayName: string;
40
+ projectId?: string | undefined;
41
+ bundleId?: string | undefined;
42
+ pid?: number | undefined;
43
+ recipeConfigPath?: string | undefined;
44
+ calibrationAssetsPath?: string | undefined;
45
+ evidenceStoragePath?: string | undefined;
46
+ }>, {
47
+ displayName: string;
48
+ projectId?: string | undefined;
49
+ bundleId?: string | undefined;
50
+ pid?: number | undefined;
51
+ recipeConfigPath?: string | undefined;
52
+ calibrationAssetsPath?: string | undefined;
53
+ evidenceStoragePath?: string | undefined;
54
+ }, {
55
+ displayName: string;
56
+ projectId?: string | undefined;
57
+ bundleId?: string | undefined;
58
+ pid?: number | undefined;
59
+ recipeConfigPath?: string | undefined;
60
+ calibrationAssetsPath?: string | undefined;
61
+ evidenceStoragePath?: string | undefined;
62
+ }>;
63
+ export type ProjectSetArgs = z.infer<typeof ProjectSetArgs>;
64
+ export declare function projectList(): ProjectEntry[];
65
+ export declare function projectGet(projectId: string): ProjectEntry | undefined;
66
+ /**
67
+ * Create or update a project. If `projectId` is undefined, a new entry is
68
+ * created; otherwise the existing entry is updated (GP_E_NOT_FOUND on miss).
69
+ */
70
+ export declare function projectSet(args: ProjectSetArgs): ProjectEntry;
71
+ /** Thrown for GP_E_PROJECT_LIMIT / GP_E_NOT_FOUND / GP_E_BAD_PARAMS. */
72
+ export declare class ProjectRegistryError extends Error {
73
+ readonly code: string;
74
+ constructor(code: string, message: string);
75
+ }
76
+ //# sourceMappingURL=project-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-registry.d.ts","sourceRoot":"","sources":["../src/project-registry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAkBxB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,eAAO,MAAM,eAAe,iDAAqB,CAAC;AAClD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,eAAO,MAAM,cAAc;;;;;;EAEzB,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW1B,CAAC;AACF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAgC5D,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAE5C;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAGtE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CA6C7D;AAsBD,wEAAwE;AACxE,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C"}
@@ -0,0 +1,144 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { z } from "zod";
5
+ /* ------------------------------------------------------------------ *
6
+ * Project Registry — MCP-layer access (P1 spec v1.4 §4)
7
+ *
8
+ * This module operates directly on the shared projects.json file.
9
+ * The daemon's Swift ProjectRegistry writes this file; the MCP shell
10
+ * reads/writes the same file with mirrored validation constraints.
11
+ * No socket methods are added (spec 变更说明: "不改变 socket 协议方法表").
12
+ * ------------------------------------------------------------------ */
13
+ const CROCKFORD_BODY_RE = "[0-9A-HJKMNP-TV-Z]{26}";
14
+ const PROJECT_ID_RE = new RegExp(`^prj_${CROCKFORD_BODY_RE}$`);
15
+ const MAX_PROJECTS = 128;
16
+ const MAX_DISPLAY_NAME_LENGTH = 256;
17
+ const MAX_FIELD_LENGTH = 1024;
18
+ // ----- Zod schemas for MCP input validation -----
19
+ export const ProjectListArgs = z.strictObject({});
20
+ export const ProjectGetArgs = z.strictObject({
21
+ projectId: z.string().regex(PROJECT_ID_RE, "projectId must match prj_ + 26 Crockford chars"),
22
+ });
23
+ export const ProjectSetArgs = z.strictObject({
24
+ projectId: z.string().regex(PROJECT_ID_RE).optional(),
25
+ displayName: z.string().min(1).max(MAX_DISPLAY_NAME_LENGTH),
26
+ bundleId: z.string().max(256).optional(),
27
+ pid: z.number().int().nonnegative().optional(),
28
+ recipeConfigPath: z.string().max(MAX_FIELD_LENGTH).optional(),
29
+ calibrationAssetsPath: z.string().max(MAX_FIELD_LENGTH).optional(),
30
+ evidenceStoragePath: z.string().max(MAX_FIELD_LENGTH).optional(),
31
+ }).refine((v) => (v.bundleId !== undefined) !== (v.pid !== undefined), { message: "exactly one of bundleId or pid is required" });
32
+ // ----- File access -----
33
+ function projectsPath() {
34
+ const envPath = process.env["GLASSPANE_PROJECTS_FILE"];
35
+ if (envPath)
36
+ return envPath;
37
+ return path.join(os.homedir(), ".glasspane", "projects.json");
38
+ }
39
+ function loadProjects(filePath) {
40
+ try {
41
+ const raw = fs.readFileSync(filePath, "utf8");
42
+ const parsed = JSON.parse(raw);
43
+ if (!Array.isArray(parsed))
44
+ return [];
45
+ return parsed;
46
+ }
47
+ catch {
48
+ return [];
49
+ }
50
+ }
51
+ function saveProjects(filePath, entries) {
52
+ const dir = path.dirname(filePath);
53
+ fs.mkdirSync(dir, { recursive: true });
54
+ // Atomic write: tmp + rename.
55
+ const tmpPath = `${filePath}.tmp`;
56
+ fs.writeFileSync(tmpPath, JSON.stringify(entries, null, 2), "utf8");
57
+ fs.renameSync(tmpPath, filePath);
58
+ }
59
+ // ----- Public operations -----
60
+ export function projectList() {
61
+ return loadProjects(projectsPath());
62
+ }
63
+ export function projectGet(projectId) {
64
+ const projects = loadProjects(projectsPath());
65
+ return projects.find((p) => p.projectId === projectId);
66
+ }
67
+ /**
68
+ * Create or update a project. If `projectId` is undefined, a new entry is
69
+ * created; otherwise the existing entry is updated (GP_E_NOT_FOUND on miss).
70
+ */
71
+ export function projectSet(args) {
72
+ const filePath = projectsPath();
73
+ const projects = loadProjects(filePath);
74
+ let entry;
75
+ const projectId = args.projectId;
76
+ if (projectId) {
77
+ // Update.
78
+ const idx = projects.findIndex((p) => p.projectId === projectId);
79
+ if (idx === -1) {
80
+ throw new ProjectRegistryError("GP_E_NOT_FOUND", `unknown projectId ${projectId}`);
81
+ }
82
+ const existing = projects[idx];
83
+ entry = {
84
+ ...existing,
85
+ displayName: args.displayName,
86
+ ...(args.bundleId !== undefined ? { bundleId: args.bundleId } : {}),
87
+ ...(args.pid !== undefined ? { pid: args.pid } : {}),
88
+ ...(args.recipeConfigPath !== undefined ? { recipeConfigPath: args.recipeConfigPath } : {}),
89
+ ...(args.calibrationAssetsPath !== undefined ? { calibrationAssetsPath: args.calibrationAssetsPath } : {}),
90
+ ...(args.evidenceStoragePath !== undefined ? { evidenceStoragePath: args.evidenceStoragePath } : {}),
91
+ };
92
+ projects[idx] = entry;
93
+ }
94
+ else {
95
+ // Create.
96
+ if (projects.length >= MAX_PROJECTS) {
97
+ throw new ProjectRegistryError("GP_E_PROJECT_LIMIT", `project limit reached (${MAX_PROJECTS})`);
98
+ }
99
+ const projectId = generateProjectId();
100
+ entry = {
101
+ projectId,
102
+ displayName: args.displayName,
103
+ bundleId: args.bundleId,
104
+ pid: args.pid,
105
+ recipeConfigPath: args.recipeConfigPath,
106
+ calibrationAssetsPath: args.calibrationAssetsPath,
107
+ evidenceStoragePath: args.evidenceStoragePath,
108
+ createdAt: new Date().toISOString(),
109
+ };
110
+ projects.push(entry);
111
+ }
112
+ saveProjects(filePath, projects);
113
+ return entry;
114
+ }
115
+ // ----- Helpers -----
116
+ /** Crockford base32 ULID-shaped project ID (P1 spec v1.4 §1.1). */
117
+ function generateProjectId() {
118
+ const CROCKFORD = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
119
+ const body = [];
120
+ const bytes = new Uint8Array(26);
121
+ // Node 16+ crypto is safe; use globalThis for older runtimes.
122
+ if (typeof globalThis.crypto?.getRandomValues === "function") {
123
+ globalThis.crypto.getRandomValues(bytes);
124
+ }
125
+ else {
126
+ for (let i = 0; i < 26; i++)
127
+ bytes[i] = Math.floor(Math.random() * 256);
128
+ }
129
+ for (let i = 0; i < 26; i++) {
130
+ const byte = bytes[i];
131
+ body.push(CROCKFORD.charAt(byte % 32));
132
+ }
133
+ return `prj_${body.join("")}`;
134
+ }
135
+ /** Thrown for GP_E_PROJECT_LIMIT / GP_E_NOT_FOUND / GP_E_BAD_PARAMS. */
136
+ export class ProjectRegistryError extends Error {
137
+ code;
138
+ constructor(code, message) {
139
+ super(message);
140
+ this.name = "ProjectRegistryError";
141
+ this.code = code;
142
+ }
143
+ }
144
+ //# sourceMappingURL=project-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-registry.js","sourceRoot":"","sources":["../src/project-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,255 @@
1
+ import { z } from "zod";
2
+ import { type Selector, type Action, type AssertionProperty } from "@iterate/kernel";
3
+ import { EngineJsonRpcClient } from "./engine-client.js";
4
+ import { EvidenceAuditSession } from "./audit-session.js";
5
+ export declare const AttachArgs: z.ZodEffects<z.ZodObject<{
6
+ bundleId: z.ZodOptional<z.ZodString>;
7
+ pid: z.ZodOptional<z.ZodNumber>;
8
+ projectId: z.ZodOptional<z.ZodString>;
9
+ }, "strict", z.ZodTypeAny, {
10
+ projectId?: string | undefined;
11
+ bundleId?: string | undefined;
12
+ pid?: number | undefined;
13
+ }, {
14
+ projectId?: string | undefined;
15
+ bundleId?: string | undefined;
16
+ pid?: number | undefined;
17
+ }>, {
18
+ projectId?: string | undefined;
19
+ bundleId?: string | undefined;
20
+ pid?: number | undefined;
21
+ }, {
22
+ projectId?: string | undefined;
23
+ bundleId?: string | undefined;
24
+ pid?: number | undefined;
25
+ }>;
26
+ export type AttachArgs = z.infer<typeof AttachArgs>;
27
+ export declare const ObserveArgs: z.ZodObject<{
28
+ maxDepth: z.ZodOptional<z.ZodNumber>;
29
+ role: z.ZodOptional<z.ZodString>;
30
+ }, "strict", z.ZodTypeAny, {
31
+ role?: string | undefined;
32
+ maxDepth?: number | undefined;
33
+ }, {
34
+ role?: string | undefined;
35
+ maxDepth?: number | undefined;
36
+ }>;
37
+ export type ObserveArgs = z.infer<typeof ObserveArgs>;
38
+ export declare const ActArgs: z.ZodObject<{
39
+ selector: z.ZodObject<{
40
+ role: z.ZodString;
41
+ title: z.ZodOptional<z.ZodString>;
42
+ identifier: z.ZodOptional<z.ZodString>;
43
+ }, "strict", z.ZodTypeAny, {
44
+ role: string;
45
+ title?: string | undefined;
46
+ identifier?: string | undefined;
47
+ }, {
48
+ role: string;
49
+ title?: string | undefined;
50
+ identifier?: string | undefined;
51
+ }>;
52
+ action: z.ZodEnum<["press", "increment", "decrement", "showMenu", "confirm", "cancel", "pick"]>;
53
+ degrade: z.ZodOptional<z.ZodBoolean>;
54
+ }, "strict", z.ZodTypeAny, {
55
+ selector: {
56
+ role: string;
57
+ title?: string | undefined;
58
+ identifier?: string | undefined;
59
+ };
60
+ action: "press" | "increment" | "decrement" | "showMenu" | "confirm" | "cancel" | "pick";
61
+ degrade?: boolean | undefined;
62
+ }, {
63
+ selector: {
64
+ role: string;
65
+ title?: string | undefined;
66
+ identifier?: string | undefined;
67
+ };
68
+ action: "press" | "increment" | "decrement" | "showMenu" | "confirm" | "cancel" | "pick";
69
+ degrade?: boolean | undefined;
70
+ }>;
71
+ export type ActArgs = z.infer<typeof ActArgs>;
72
+ export declare const AssertElementArgs: z.ZodObject<{
73
+ selector: z.ZodObject<{
74
+ role: z.ZodString;
75
+ title: z.ZodOptional<z.ZodString>;
76
+ identifier: z.ZodOptional<z.ZodString>;
77
+ }, "strict", z.ZodTypeAny, {
78
+ role: string;
79
+ title?: string | undefined;
80
+ identifier?: string | undefined;
81
+ }, {
82
+ role: string;
83
+ title?: string | undefined;
84
+ identifier?: string | undefined;
85
+ }>;
86
+ property: z.ZodEnum<["title", "value", "role", "enabled", "focused"]>;
87
+ expected: z.ZodUnion<[z.ZodString, z.ZodBoolean]>;
88
+ }, "strict", z.ZodTypeAny, {
89
+ expected: string | boolean;
90
+ selector: {
91
+ role: string;
92
+ title?: string | undefined;
93
+ identifier?: string | undefined;
94
+ };
95
+ property: "value" | "role" | "title" | "enabled" | "focused";
96
+ }, {
97
+ expected: string | boolean;
98
+ selector: {
99
+ role: string;
100
+ title?: string | undefined;
101
+ identifier?: string | undefined;
102
+ };
103
+ property: "value" | "role" | "title" | "enabled" | "focused";
104
+ }>;
105
+ export type AssertElementArgs = z.infer<typeof AssertElementArgs>;
106
+ export declare const DiagnoseArgs: z.ZodObject<{
107
+ operationId: z.ZodOptional<z.ZodString>;
108
+ }, "strict", z.ZodTypeAny, {
109
+ operationId?: string | undefined;
110
+ }, {
111
+ operationId?: string | undefined;
112
+ }>;
113
+ export type DiagnoseArgs = z.infer<typeof DiagnoseArgs>;
114
+ export declare const LastEvidenceArgs: z.ZodObject<{
115
+ operationId: z.ZodOptional<z.ZodString>;
116
+ }, "strict", z.ZodTypeAny, {
117
+ operationId?: string | undefined;
118
+ }, {
119
+ operationId?: string | undefined;
120
+ }>;
121
+ export type LastEvidenceArgs = z.infer<typeof LastEvidenceArgs>;
122
+ export declare const SnapshotArgs: z.ZodObject<{
123
+ maxDepth: z.ZodOptional<z.ZodNumber>;
124
+ }, "strict", z.ZodTypeAny, {
125
+ maxDepth?: number | undefined;
126
+ }, {
127
+ maxDepth?: number | undefined;
128
+ }>;
129
+ export type SnapshotArgs = z.infer<typeof SnapshotArgs>;
130
+ export declare const RestoreArgs: z.ZodObject<{
131
+ snapshotId: z.ZodString;
132
+ steps: z.ZodOptional<z.ZodArray<z.ZodObject<{
133
+ selector: z.ZodObject<{
134
+ role: z.ZodString;
135
+ title: z.ZodOptional<z.ZodString>;
136
+ identifier: z.ZodOptional<z.ZodString>;
137
+ }, "strict", z.ZodTypeAny, {
138
+ role: string;
139
+ title?: string | undefined;
140
+ identifier?: string | undefined;
141
+ }, {
142
+ role: string;
143
+ title?: string | undefined;
144
+ identifier?: string | undefined;
145
+ }>;
146
+ action: z.ZodEnum<["press", "increment", "decrement", "showMenu", "confirm", "cancel", "pick"]>;
147
+ }, "strict", z.ZodTypeAny, {
148
+ selector: {
149
+ role: string;
150
+ title?: string | undefined;
151
+ identifier?: string | undefined;
152
+ };
153
+ action: "press" | "increment" | "decrement" | "showMenu" | "confirm" | "cancel" | "pick";
154
+ }, {
155
+ selector: {
156
+ role: string;
157
+ title?: string | undefined;
158
+ identifier?: string | undefined;
159
+ };
160
+ action: "press" | "increment" | "decrement" | "showMenu" | "confirm" | "cancel" | "pick";
161
+ }>, "many">>;
162
+ mode: z.ZodOptional<z.ZodString>;
163
+ }, "strict", z.ZodTypeAny, {
164
+ snapshotId: string;
165
+ steps?: {
166
+ selector: {
167
+ role: string;
168
+ title?: string | undefined;
169
+ identifier?: string | undefined;
170
+ };
171
+ action: "press" | "increment" | "decrement" | "showMenu" | "confirm" | "cancel" | "pick";
172
+ }[] | undefined;
173
+ mode?: string | undefined;
174
+ }, {
175
+ snapshotId: string;
176
+ steps?: {
177
+ selector: {
178
+ role: string;
179
+ title?: string | undefined;
180
+ identifier?: string | undefined;
181
+ };
182
+ action: "press" | "increment" | "decrement" | "showMenu" | "confirm" | "cancel" | "pick";
183
+ }[] | undefined;
184
+ mode?: string | undefined;
185
+ }>;
186
+ export type RestoreArgs = z.infer<typeof RestoreArgs>;
187
+ /** P6 §5.4: probe connectivity query takes no arguments. */
188
+ export declare const ProbeStatusArgs: z.ZodObject<{}, "strict", z.ZodTypeAny, {}, {}>;
189
+ export type ProbeStatusArgs = z.infer<typeof ProbeStatusArgs>;
190
+ export declare const ExportEvidenceArgs: z.ZodObject<{
191
+ operationId: z.ZodString;
192
+ format: z.ZodDefault<z.ZodEnum<["html", "markdown"]>>;
193
+ }, "strict", z.ZodTypeAny, {
194
+ operationId: string;
195
+ format: "html" | "markdown";
196
+ }, {
197
+ operationId: string;
198
+ format?: "html" | "markdown" | undefined;
199
+ }>;
200
+ export type ExportEvidenceArgs = z.infer<typeof ExportEvidenceArgs>;
201
+ export declare const RecentReportsArgs: z.ZodObject<{
202
+ limit: z.ZodDefault<z.ZodNumber>;
203
+ format: z.ZodDefault<z.ZodEnum<["html", "markdown"]>>;
204
+ }, "strict", z.ZodTypeAny, {
205
+ format: "html" | "markdown";
206
+ limit: number;
207
+ }, {
208
+ format?: "html" | "markdown" | undefined;
209
+ limit?: number | undefined;
210
+ }>;
211
+ export type RecentReportsArgs = z.infer<typeof RecentReportsArgs>;
212
+ export interface ToolSpec {
213
+ name: string;
214
+ description: string;
215
+ /** Engine method forwarded after validation; pseudo-method for orchestrated tools. */
216
+ engineMethod: string;
217
+ /** JSON Schema emitted by tools/list (hand-written contract, spec §6.2). */
218
+ inputSchema: Record<string, unknown>;
219
+ validate: (args: unknown) => {
220
+ ok: true;
221
+ value: Record<string, unknown>;
222
+ } | {
223
+ ok: false;
224
+ issues: string;
225
+ };
226
+ /**
227
+ * Orchestrated tools (spec v1.3 §10.3) run their own logic instead of the
228
+ * default forward-then-relay path — e.g. the audit tools fetch evidence
229
+ * packs and render them through the report generator.
230
+ */
231
+ execute?: (args: Record<string, unknown>, context: ToolExecuteContext) => Promise<ToolResult>;
232
+ }
233
+ export interface ToolExecuteContext {
234
+ engine: EngineJsonRpcClient;
235
+ session: EvidenceAuditSession;
236
+ }
237
+ /** Tool result shape shared by the default path and custom executors. */
238
+ export interface ToolResult {
239
+ content: Array<{
240
+ type: "text";
241
+ text: string;
242
+ }>;
243
+ isError: boolean;
244
+ }
245
+ export declare const TOOL_SPECS: readonly ToolSpec[];
246
+ export declare const TOOL_BY_NAME: ReadonlyMap<string, ToolSpec>;
247
+ /**
248
+ * Execute a tool against the engine client. Validates arguments against
249
+ * the tool's zod schema (isError + GP_E_BAD_PARAMS on failure), then either
250
+ * runs the tool's own `execute` (orchestrated tools) or forwards the method
251
+ * to the engine and maps engine/connection errors to agent-facing errors.
252
+ */
253
+ export declare function executeTool(spec: ToolSpec, args: unknown, engine: EngineJsonRpcClient, session?: EvidenceAuditSession): Promise<ToolResult>;
254
+ export type { Selector, Action, AssertionProperty };
255
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}