edgegate-mcp 0.11.0 → 0.15.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 (51) hide show
  1. package/dist/client.d.ts +21 -1
  2. package/dist/client.js +42 -0
  3. package/dist/client.js.map +1 -1
  4. package/dist/server.js +139 -0
  5. package/dist/server.js.map +1 -1
  6. package/dist/tools/cancel_run.d.ts +20 -0
  7. package/dist/tools/cancel_run.js +51 -0
  8. package/dist/tools/cancel_run.js.map +1 -0
  9. package/dist/tools/capture_reference.d.ts +49 -0
  10. package/dist/tools/capture_reference.js +102 -0
  11. package/dist/tools/capture_reference.js.map +1 -0
  12. package/dist/tools/check_genie_compile_status.d.ts +15 -0
  13. package/dist/tools/check_genie_compile_status.js +36 -0
  14. package/dist/tools/check_genie_compile_status.js.map +1 -0
  15. package/dist/tools/check_reference_capture_status.d.ts +15 -0
  16. package/dist/tools/check_reference_capture_status.js +31 -0
  17. package/dist/tools/check_reference_capture_status.js.map +1 -0
  18. package/dist/tools/compile_genie.d.ts +46 -0
  19. package/dist/tools/compile_genie.js +101 -0
  20. package/dist/tools/compile_genie.js.map +1 -0
  21. package/dist/tools/create_bg_run.d.ts +41 -0
  22. package/dist/tools/create_bg_run.js +109 -0
  23. package/dist/tools/create_bg_run.js.map +1 -0
  24. package/dist/tools/create_eval_set.d.ts +89 -0
  25. package/dist/tools/create_eval_set.js +128 -0
  26. package/dist/tools/create_eval_set.js.map +1 -0
  27. package/dist/tools/list_eval_packs.d.ts +6 -0
  28. package/dist/tools/list_eval_packs.js +38 -0
  29. package/dist/tools/list_eval_packs.js.map +1 -0
  30. package/dist/tools/list_eval_sets.d.ts +12 -0
  31. package/dist/tools/list_eval_sets.js +38 -0
  32. package/dist/tools/list_eval_sets.js.map +1 -0
  33. package/dist/tools/new_eval_set_version.d.ts +18 -0
  34. package/dist/tools/new_eval_set_version.js +47 -0
  35. package/dist/tools/new_eval_set_version.js.map +1 -0
  36. package/dist/tools/publish_eval_set.d.ts +18 -0
  37. package/dist/tools/publish_eval_set.js +74 -0
  38. package/dist/tools/publish_eval_set.js.map +1 -0
  39. package/dist/tools/rerun_bg.d.ts +20 -0
  40. package/dist/tools/rerun_bg.js +61 -0
  41. package/dist/tools/rerun_bg.js.map +1 -0
  42. package/dist/tools/setup_bg_github_action.d.ts +44 -0
  43. package/dist/tools/setup_bg_github_action.js +109 -0
  44. package/dist/tools/setup_bg_github_action.js.map +1 -0
  45. package/dist/tools/update_eval_set.d.ts +56 -0
  46. package/dist/tools/update_eval_set.js +60 -0
  47. package/dist/tools/update_eval_set.js.map +1 -0
  48. package/dist/types.d.ts +147 -0
  49. package/dist/version.d.ts +2 -2
  50. package/dist/version.js +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateError } from "../client.js";
3
+ import { surfaceEvalError } from "./create_eval_set.js";
4
+ export const listEvalSetsInputSchema = z
5
+ .object({
6
+ workspace_id: z.string().uuid(),
7
+ })
8
+ .strict();
9
+ export async function listEvalSetsHandler(client, input) {
10
+ try {
11
+ const sets = await client.listEvalSets(input.workspace_id);
12
+ if (sets.length === 0) {
13
+ return {
14
+ content: [
15
+ {
16
+ type: "text",
17
+ text: `No eval sets yet in this workspace.\n\n` +
18
+ `Create one with \`edgegate_create_eval_set\` (optionally cloning a ` +
19
+ `bundled pack from \`edgegate_list_eval_packs\`).`,
20
+ },
21
+ ],
22
+ };
23
+ }
24
+ const header = `Found ${sets.length} eval set(s) in this workspace:\n\n` +
25
+ `| eval_set_id | name | latest_version | created |\n` +
26
+ `|---|---|---|---|\n`;
27
+ const rows = sets
28
+ .map((s) => `| ${s.id} | ${s.name} | ${s.latest_version} | ${s.created_at.slice(0, 10)} |`)
29
+ .join("\n");
30
+ return { content: [{ type: "text", text: header + rows }] };
31
+ }
32
+ catch (err) {
33
+ if (err instanceof EdgeGateError)
34
+ return surfaceEvalError(err);
35
+ throw err;
36
+ }
37
+ }
38
+ //# sourceMappingURL=list_eval_sets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_eval_sets.js","sourceRoot":"","sources":["../../src/tools/list_eval_sets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC;KACrC,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CAChC,CAAC;KACD,MAAM,EAAE,CAAC;AAIZ,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAsB,EACtB,KAAwB;IAExB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAE3D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EACF,yCAAyC;4BACzC,qEAAqE;4BACrE,kDAAkD;qBACrD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GACV,SAAS,IAAI,CAAC,MAAM,qCAAqC;YACzD,qDAAqD;YACrD,qBAAqB,CAAC;QAExB,MAAM,IAAI,GAAG,IAAI;aACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,cAAc,MAAM,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;aAC1F,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,aAAa;YAAE,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC/D,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateClient } from "../client.js";
3
+ import type { ToolResult } from "./setup_workspace.js";
4
+ export declare const newEvalSetVersionInputSchema: z.ZodObject<{
5
+ workspace_id: z.ZodString;
6
+ eval_set_id: z.ZodString;
7
+ from_version: z.ZodString;
8
+ }, "strict", z.ZodTypeAny, {
9
+ workspace_id: string;
10
+ eval_set_id: string;
11
+ from_version: string;
12
+ }, {
13
+ workspace_id: string;
14
+ eval_set_id: string;
15
+ from_version: string;
16
+ }>;
17
+ export type NewEvalSetVersionInput = z.infer<typeof newEvalSetVersionInputSchema>;
18
+ export declare function newEvalSetVersionHandler(client: EdgeGateClient, input: NewEvalSetVersionInput): Promise<ToolResult>;
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateError } from "../client.js";
3
+ import { formatVersion, surfaceEvalError } from "./create_eval_set.js";
4
+ export const newEvalSetVersionInputSchema = z
5
+ .object({
6
+ workspace_id: z.string().uuid(),
7
+ eval_set_id: z.string().uuid(),
8
+ from_version: z
9
+ .string()
10
+ .uuid()
11
+ .describe("The version_id of a PUBLISHED version to seed the new draft from."),
12
+ })
13
+ .strict();
14
+ export async function newEvalSetVersionHandler(client, input) {
15
+ try {
16
+ const version = await client.newEvalSetVersion(input.workspace_id, input.eval_set_id, input.from_version);
17
+ return {
18
+ content: [
19
+ {
20
+ type: "text",
21
+ text: formatVersion(version, `Forked a new draft version seeded from the published cases:`) +
22
+ `\n\nEdit it with \`edgegate_update_eval_set\`, then \`edgegate_publish_eval_set\` to re-publish. ` +
23
+ `The original published version (and any references / runs bound to its sha) is untouched.`,
24
+ },
25
+ ],
26
+ };
27
+ }
28
+ catch (err) {
29
+ if (err instanceof EdgeGateError) {
30
+ if (err.status === 404) {
31
+ return {
32
+ isError: true,
33
+ content: [
34
+ {
35
+ type: "text",
36
+ text: `Unknown eval set or from_version="${input.from_version}". ` +
37
+ `Check the ids with \`edgegate_list_eval_sets\`.`,
38
+ },
39
+ ],
40
+ };
41
+ }
42
+ return surfaceEvalError(err);
43
+ }
44
+ throw err;
45
+ }
46
+ }
47
+ //# sourceMappingURL=new_eval_set_version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new_eval_set_version.js","sourceRoot":"","sources":["../../src/tools/new_eval_set_version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC;KAC1C,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC9B,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,IAAI,EAAE;SACN,QAAQ,CAAC,mEAAmE,CAAC;CACjF,CAAC;KACD,MAAM,EAAE,CAAC;AAIZ,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAsB,EACtB,KAA6B;IAE7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAC5C,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,CACnB,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EACF,aAAa,CACX,OAAO,EACP,6DAA6D,CAC9D;wBACD,mGAAmG;wBACnG,2FAA2F;iBAC9F;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;YACjC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EACF,qCAAqC,KAAK,CAAC,YAAY,KAAK;gCAC5D,iDAAiD;yBACpD;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateClient } from "../client.js";
3
+ import type { ToolResult } from "./setup_workspace.js";
4
+ export declare const publishEvalSetInputSchema: z.ZodObject<{
5
+ workspace_id: z.ZodString;
6
+ eval_set_id: z.ZodString;
7
+ version_id: z.ZodString;
8
+ }, "strict", z.ZodTypeAny, {
9
+ workspace_id: string;
10
+ eval_set_id: string;
11
+ version_id: string;
12
+ }, {
13
+ workspace_id: string;
14
+ eval_set_id: string;
15
+ version_id: string;
16
+ }>;
17
+ export type PublishEvalSetInput = z.infer<typeof publishEvalSetInputSchema>;
18
+ export declare function publishEvalSetHandler(client: EdgeGateClient, input: PublishEvalSetInput): Promise<ToolResult>;
@@ -0,0 +1,74 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateError } from "../client.js";
3
+ import { formatVersion, surfaceEvalError } from "./create_eval_set.js";
4
+ export const publishEvalSetInputSchema = z
5
+ .object({
6
+ workspace_id: z.string().uuid(),
7
+ eval_set_id: z.string().uuid(),
8
+ version_id: z.string().uuid(),
9
+ })
10
+ .strict();
11
+ export async function publishEvalSetHandler(client, input) {
12
+ try {
13
+ const version = await client.publishEvalSet(input.workspace_id, input.eval_set_id, input.version_id);
14
+ const next = `\n\nFeed \`artifact_id\` and \`eval_set_sha256\` into a Behavioral-Gate run ` +
15
+ `(3b create-bg-run) as the eval-set inputs. The runner recomputes the sha after ` +
16
+ `download and confirms it matches.`;
17
+ return {
18
+ content: [
19
+ {
20
+ type: "text",
21
+ text: formatVersion(version, `Published eval set version — validated, hashed, signed, and frozen:`) + next,
22
+ },
23
+ ],
24
+ };
25
+ }
26
+ catch (err) {
27
+ if (err instanceof EdgeGateError) {
28
+ if (err.status === 422) {
29
+ const violations = extractViolations(err.detail);
30
+ const body = violations.length > 0
31
+ ? `Validation failed with ${violations.length} violation(s) — the version stays a draft:\n` +
32
+ violations.map((v) => ` - ${v}`).join("\n")
33
+ : `Validation failed (422) — the version stays a draft:\n${err.detail}`;
34
+ return { isError: true, content: [{ type: "text", text: body }] };
35
+ }
36
+ if (err.status === 404) {
37
+ return {
38
+ isError: true,
39
+ content: [
40
+ {
41
+ type: "text",
42
+ text: "Unknown eval set or version. Check the eval_set_id / version_id " +
43
+ "with `edgegate_list_eval_sets`.",
44
+ },
45
+ ],
46
+ };
47
+ }
48
+ return surfaceEvalError(err);
49
+ }
50
+ throw err;
51
+ }
52
+ }
53
+ /**
54
+ * Pull the `violations` array out of a 422 `detail`. The backend returns
55
+ * `422 {detail: {violations: [...]}}`; the client stringifies `detail`, so
56
+ * `err.detail` is the JSON-stringified `{violations: [...]}` object (or a
57
+ * plain string fallback).
58
+ */
59
+ function extractViolations(detail) {
60
+ try {
61
+ const parsed = JSON.parse(detail);
62
+ if (parsed &&
63
+ typeof parsed === "object" &&
64
+ "violations" in parsed &&
65
+ Array.isArray(parsed.violations)) {
66
+ return parsed.violations.map((v) => String(v));
67
+ }
68
+ }
69
+ catch {
70
+ // detail was plain text — fall through
71
+ }
72
+ return [];
73
+ }
74
+ //# sourceMappingURL=publish_eval_set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish_eval_set.js","sourceRoot":"","sources":["../../src/tools/publish_eval_set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CAC9B,CAAC;KACD,MAAM,EAAE,CAAC;AAIZ,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAsB,EACtB,KAA0B;IAE1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CACzC,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,UAAU,CACjB,CAAC;QAEF,MAAM,IAAI,GACR,8EAA8E;YAC9E,iFAAiF;YACjF,mCAAmC,CAAC;QAEtC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EACF,aAAa,CACX,OAAO,EACP,qEAAqE,CACtE,GAAG,IAAI;iBACX;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;YACjC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACjD,MAAM,IAAI,GACR,UAAU,CAAC,MAAM,GAAG,CAAC;oBACnB,CAAC,CAAC,0BAA0B,UAAU,CAAC,MAAM,8CAA8C;wBACzF,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC9C,CAAC,CAAC,yDAAyD,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACpE,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EACF,kEAAkE;gCAClE,iCAAiC;yBACpC;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,MAAc;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAY,CAAC;QAC7C,IACE,MAAM;YACN,OAAO,MAAM,KAAK,QAAQ;YAC1B,YAAY,IAAI,MAAM;YACtB,KAAK,CAAC,OAAO,CAAE,MAAkC,CAAC,UAAU,CAAC,EAC7D,CAAC;YACD,OAAQ,MAAoC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateClient } from "../client.js";
3
+ import type { ToolResult } from "./setup_workspace.js";
4
+ /**
5
+ * Re-run an existing behavioral-gate run: clones its already-validated config
6
+ * (same bundle + eval set + reference + system prompt + device) into a fresh
7
+ * QUEUED run for the self-hosted runner to pick up. No need to re-supply ids.
8
+ */
9
+ export declare const rerunBgInputSchema: z.ZodObject<{
10
+ workspace_id: z.ZodString;
11
+ run_id: z.ZodString;
12
+ }, "strict", z.ZodTypeAny, {
13
+ run_id: string;
14
+ workspace_id: string;
15
+ }, {
16
+ run_id: string;
17
+ workspace_id: string;
18
+ }>;
19
+ export type RerunBgInput = z.infer<typeof rerunBgInputSchema>;
20
+ export declare function rerunBgHandler(client: EdgeGateClient, input: RerunBgInput): Promise<ToolResult>;
@@ -0,0 +1,61 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateError } from "../client.js";
3
+ /**
4
+ * Re-run an existing behavioral-gate run: clones its already-validated config
5
+ * (same bundle + eval set + reference + system prompt + device) into a fresh
6
+ * QUEUED run for the self-hosted runner to pick up. No need to re-supply ids.
7
+ */
8
+ export const rerunBgInputSchema = z
9
+ .object({
10
+ workspace_id: z.string().uuid(),
11
+ run_id: z
12
+ .string()
13
+ .uuid()
14
+ .describe("An existing behavioral-gate run to re-run (same config, fresh run)."),
15
+ })
16
+ .strict();
17
+ export async function rerunBgHandler(client, input) {
18
+ try {
19
+ const run = await client.rerunBg(input.workspace_id, input.run_id);
20
+ return {
21
+ content: [
22
+ {
23
+ type: "text",
24
+ text: [
25
+ `Re-ran the behavioral-gate run as a new run:`,
26
+ ``,
27
+ `- run_id: ${run.run_id}`,
28
+ `- status: ${run.status}`,
29
+ ``,
30
+ `Point the self-hosted runner at this new run to execute the gate on-device ` +
31
+ `(\`edgegate-runner run --run-id ${run.run_id} --adb-serial <serial>\`).`,
32
+ ].join("\n"),
33
+ },
34
+ ],
35
+ };
36
+ }
37
+ catch (err) {
38
+ if (err instanceof EdgeGateError) {
39
+ return {
40
+ isError: true,
41
+ content: [
42
+ {
43
+ type: "text",
44
+ text: err.status === 404
45
+ ? "Unknown run or workspace — re-check the ids."
46
+ : err.status === 422
47
+ ? "That run is not a behavioral-gate run, so it can't be re-run here."
48
+ : err.status === 409
49
+ ? "The workspace already has an active run. Wait for it to finish, or cancel " +
50
+ "it with edgegate_cancel_run, then retry."
51
+ : err.status === 403
52
+ ? "You need admin access on this workspace to re-run."
53
+ : `EdgeGate returned ${err.status}: ${err.detail}`,
54
+ },
55
+ ],
56
+ };
57
+ }
58
+ throw err;
59
+ }
60
+ }
61
+ //# sourceMappingURL=rerun_bg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rerun_bg.js","sourceRoot":"","sources":["../../src/tools/rerun_bg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7D;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC/B,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,IAAI,EAAE;SACN,QAAQ,CAAC,qEAAqE,CAAC;CACnF,CAAC;KACD,MAAM,EAAE,CAAC;AAIZ,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAsB,EACtB,KAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;wBACJ,8CAA8C;wBAC9C,EAAE;wBACF,aAAa,GAAG,CAAC,MAAM,EAAE;wBACzB,aAAa,GAAG,CAAC,MAAM,EAAE;wBACzB,EAAE;wBACF,6EAA6E;4BAC3E,mCAAmC,GAAG,CAAC,MAAM,4BAA4B;qBAC5E,CAAC,IAAI,CAAC,IAAI,CAAC;iBACb;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EACF,GAAG,CAAC,MAAM,KAAK,GAAG;4BAChB,CAAC,CAAC,8CAA8C;4BAChD,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG;gCAClB,CAAC,CAAC,oEAAoE;gCACtE,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG;oCAClB,CAAC,CAAC,4EAA4E;wCAC5E,0CAA0C;oCAC5C,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG;wCAClB,CAAC,CAAC,oDAAoD;wCACtD,CAAC,CAAC,qBAAqB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE;qBAC7D;iBACF;aACF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateClient } from "../client.js";
3
+ import type { ToolResult } from "./setup_workspace.js";
4
+ /**
5
+ * Emit everything needed to wire the **Behavioral Gate** into GitHub Actions.
6
+ * Unlike the standard run gate (server-side, HMAC CI endpoints), BG runs the
7
+ * quantized model on a REAL device, so it must run on a self-hosted runner with
8
+ * the device attached, via the `edgegate-bg` composite action. This is a
9
+ * guidance generator — it composes the workflow + `gh secret` commands + the
10
+ * self-hosted-runner prerequisites; it makes no API call.
11
+ */
12
+ export declare const setupBgGithubActionInputSchema: z.ZodObject<{
13
+ workspace_id: z.ZodString;
14
+ api_url: z.ZodOptional<z.ZodString>;
15
+ runner_label: z.ZodOptional<z.ZodString>;
16
+ bundle_artifact_id: z.ZodOptional<z.ZodString>;
17
+ eval_set_artifact_id: z.ZodOptional<z.ZodString>;
18
+ reference_artifact_id: z.ZodOptional<z.ZodString>;
19
+ adb_serial: z.ZodOptional<z.ZodString>;
20
+ system_prompt: z.ZodOptional<z.ZodString>;
21
+ device_label: z.ZodOptional<z.ZodString>;
22
+ }, "strict", z.ZodTypeAny, {
23
+ workspace_id: string;
24
+ eval_set_artifact_id?: string | undefined;
25
+ system_prompt?: string | undefined;
26
+ bundle_artifact_id?: string | undefined;
27
+ reference_artifact_id?: string | undefined;
28
+ device_label?: string | undefined;
29
+ api_url?: string | undefined;
30
+ runner_label?: string | undefined;
31
+ adb_serial?: string | undefined;
32
+ }, {
33
+ workspace_id: string;
34
+ eval_set_artifact_id?: string | undefined;
35
+ system_prompt?: string | undefined;
36
+ bundle_artifact_id?: string | undefined;
37
+ reference_artifact_id?: string | undefined;
38
+ device_label?: string | undefined;
39
+ api_url?: string | undefined;
40
+ runner_label?: string | undefined;
41
+ adb_serial?: string | undefined;
42
+ }>;
43
+ export type SetupBgGithubActionInput = z.infer<typeof setupBgGithubActionInputSchema>;
44
+ export declare function setupBgGithubActionHandler(_client: EdgeGateClient, input: SetupBgGithubActionInput): Promise<ToolResult>;
@@ -0,0 +1,109 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Emit everything needed to wire the **Behavioral Gate** into GitHub Actions.
4
+ * Unlike the standard run gate (server-side, HMAC CI endpoints), BG runs the
5
+ * quantized model on a REAL device, so it must run on a self-hosted runner with
6
+ * the device attached, via the `edgegate-bg` composite action. This is a
7
+ * guidance generator — it composes the workflow + `gh secret` commands + the
8
+ * self-hosted-runner prerequisites; it makes no API call.
9
+ */
10
+ export const setupBgGithubActionInputSchema = z
11
+ .object({
12
+ workspace_id: z.string().uuid(),
13
+ api_url: z
14
+ .string()
15
+ .optional()
16
+ .describe('EdgeGate API URL. Defaults to "https://edgegateapi.frozo.ai".'),
17
+ runner_label: z
18
+ .string()
19
+ .optional()
20
+ .describe('Self-hosted runner label. Defaults to "snapdragon".'),
21
+ bundle_artifact_id: z.string().uuid().optional(),
22
+ eval_set_artifact_id: z.string().uuid().optional(),
23
+ reference_artifact_id: z.string().uuid().optional(),
24
+ adb_serial: z.string().optional().describe("adb serial of the attached device."),
25
+ system_prompt: z.string().optional(),
26
+ device_label: z.string().optional(),
27
+ })
28
+ .strict();
29
+ function shquote(v) {
30
+ return `'${v.replace(/'/g, "'\\''")}'`;
31
+ }
32
+ export async function setupBgGithubActionHandler(_client, input) {
33
+ const apiUrl = input.api_url ?? "https://edgegateapi.frozo.ai";
34
+ const label = input.runner_label ?? "snapdragon";
35
+ const deviceLabel = input.device_label ?? "Samsung Galaxy S23 Ultra / Snapdragon 8 Gen 2 (SM8550)";
36
+ const workflow = [
37
+ `name: Behavioral Gate`,
38
+ `on:`,
39
+ ` pull_request:`,
40
+ ` paths: ['models/**'] # adjust to where your model / quantization lives`,
41
+ `jobs:`,
42
+ ` behavioral-gate:`,
43
+ ` runs-on: [self-hosted, ${label}]`,
44
+ ` steps:`,
45
+ ` - uses: actions/checkout@v4`,
46
+ ` - uses: ./.github/actions/edgegate-bg`,
47
+ ` with:`,
48
+ ` api-url: ${apiUrl}`,
49
+ ` workspace-id: \${{ secrets.EDGEGATE_WORKSPACE_ID }}`,
50
+ ` token: \${{ secrets.EDGEGATE_TOKEN }}`,
51
+ ` adb-serial: \${{ secrets.EDGEGATE_ADB_SERIAL }}`,
52
+ ` bundle-artifact-id: \${{ secrets.EDGEGATE_BUNDLE_ARTIFACT_ID }}`,
53
+ ` eval-set-artifact-id: \${{ secrets.EDGEGATE_EVAL_SET_ARTIFACT_ID }}`,
54
+ ` reference-artifact-id: \${{ secrets.EDGEGATE_REFERENCE_ARTIFACT_ID }}`,
55
+ ` system-prompt: \${{ secrets.EDGEGATE_SYSTEM_PROMPT }}`,
56
+ ` device-label: ${shquote(deviceLabel)}`,
57
+ ].join("\n");
58
+ const secrets = [
59
+ ["EDGEGATE_WORKSPACE_ID", input.workspace_id],
60
+ ["EDGEGATE_TOKEN", "<your workspace API key>"],
61
+ ["EDGEGATE_ADB_SERIAL", input.adb_serial],
62
+ ["EDGEGATE_BUNDLE_ARTIFACT_ID", input.bundle_artifact_id],
63
+ ["EDGEGATE_EVAL_SET_ARTIFACT_ID", input.eval_set_artifact_id],
64
+ ["EDGEGATE_REFERENCE_ARTIFACT_ID", input.reference_artifact_id],
65
+ ["EDGEGATE_SYSTEM_PROMPT", input.system_prompt],
66
+ ];
67
+ const ghCommands = secrets
68
+ .map(([k, v]) => `gh secret set ${k} -b ${shquote(v ?? `<${k.toLowerCase()}>`)}`)
69
+ .join("\n");
70
+ const text = [
71
+ `## EdgeGate Behavioral Gate — GitHub Actions setup`,
72
+ ``,
73
+ `The Behavioral Gate runs the quantized model on a **real device**, so it cannot run on`,
74
+ `GitHub-hosted runners. It needs a **self-hosted runner with the device attached**, and`,
75
+ `the runner's exit code is the gate (nonzero on RED → the build fails).`,
76
+ ``,
77
+ `**Step 1 — Self-hosted runner.** In your repo: *Settings → Actions → Runners → New`,
78
+ `self-hosted runner*. Install it on the machine with the device and give it the label`,
79
+ `\`${label}\`. On that machine install **Python 3.10+** and **Android platform-tools (\`adb\`)**,`,
80
+ `connect the device over USB, enable USB debugging, and accept the prompt. Verify with`,
81
+ `\`adb devices\` (must show "device", not "unauthorized").`,
82
+ ``,
83
+ `**Step 2 — Copy the action.** Copy the \`.github/actions/edgegate-bg/\` directory`,
84
+ `(\`action.yml\` + \`create_bg_run.py\`) into your repo — it's self-contained.`,
85
+ ``,
86
+ `**Step 3 — Workflow.** Write this to \`.github/workflows/behavioral-gate.yml\`:`,
87
+ ``,
88
+ "```yaml",
89
+ workflow,
90
+ "```",
91
+ ``,
92
+ `**Step 4 — Secrets.** From the repo root:`,
93
+ ``,
94
+ "```bash",
95
+ ghCommands,
96
+ "```",
97
+ ``,
98
+ `Get the artifact ids from \`edgegate_check_genie_compile_status\` (bundle),`,
99
+ `\`edgegate_publish_eval_set\` (eval-set), and \`edgegate_check_reference_capture_status\``,
100
+ `(reference). Generate the API key at`,
101
+ `https://edgegate.frozo.ai/workspace/${input.workspace_id}/settings#api-keys`,
102
+ ``,
103
+ `Once pushed, each matching PR runs the gate on the device and fails the build on a`,
104
+ `behavioral/safety regression. The signed verdict is stored on the run and joins the`,
105
+ `evidence chain.`,
106
+ ].join("\n");
107
+ return { content: [{ type: "text", text }] };
108
+ }
109
+ //# sourceMappingURL=setup_bg_github_action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup_bg_github_action.js","sourceRoot":"","sources":["../../src/tools/setup_bg_github_action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC;KAC5C,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC/B,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;IAC5E,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,qDAAqD,CAAC;IAClE,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IAChD,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IAClD,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACnD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAChF,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC;KACD,MAAM,EAAE,CAAC;AAIZ,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAuB,EACvB,KAA+B;IAE/B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,IAAI,8BAA8B,CAAC;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,IAAI,YAAY,CAAC;IACjD,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,IAAI,wDAAwD,CAAC;IAEnG,MAAM,QAAQ,GAAG;QACf,uBAAuB;QACvB,KAAK;QACL,iBAAiB;QACjB,8EAA8E;QAC9E,OAAO;QACP,oBAAoB;QACpB,8BAA8B,KAAK,GAAG;QACtC,YAAY;QACZ,mCAAmC;QACnC,6CAA6C;QAC7C,eAAe;QACf,sBAAsB,MAAM,EAAE;QAC9B,+DAA+D;QAC/D,iDAAiD;QACjD,2DAA2D;QAC3D,2EAA2E;QAC3E,+EAA+E;QAC/E,iFAAiF;QACjF,iEAAiE;QACjE,2BAA2B,OAAO,CAAC,WAAW,CAAC,EAAE;KAClD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,OAAO,GAAwC;QACnD,CAAC,uBAAuB,EAAE,KAAK,CAAC,YAAY,CAAC;QAC7C,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;QAC9C,CAAC,qBAAqB,EAAE,KAAK,CAAC,UAAU,CAAC;QACzC,CAAC,6BAA6B,EAAE,KAAK,CAAC,kBAAkB,CAAC;QACzD,CAAC,+BAA+B,EAAE,KAAK,CAAC,oBAAoB,CAAC;QAC7D,CAAC,gCAAgC,EAAE,KAAK,CAAC,qBAAqB,CAAC;QAC/D,CAAC,wBAAwB,EAAE,KAAK,CAAC,aAAa,CAAC;KAChD,CAAC;IACF,MAAM,UAAU,GAAG,OAAO;SACvB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC;SAChF,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,IAAI,GAAG;QACX,oDAAoD;QACpD,EAAE;QACF,wFAAwF;QACxF,wFAAwF;QACxF,wEAAwE;QACxE,EAAE;QACF,oFAAoF;QACpF,sFAAsF;QACtF,KAAK,KAAK,wFAAwF;QAClG,uFAAuF;QACvF,2DAA2D;QAC3D,EAAE;QACF,mFAAmF;QACnF,+EAA+E;QAC/E,EAAE;QACF,iFAAiF;QACjF,EAAE;QACF,SAAS;QACT,QAAQ;QACR,KAAK;QACL,EAAE;QACF,2CAA2C;QAC3C,EAAE;QACF,SAAS;QACT,UAAU;QACV,KAAK;QACL,EAAE;QACF,6EAA6E;QAC7E,2FAA2F;QAC3F,sCAAsC;QACtC,uCAAuC,KAAK,CAAC,YAAY,oBAAoB;QAC7E,EAAE;QACF,oFAAoF;QACpF,qFAAqF;QACrF,iBAAiB;KAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateClient } from "../client.js";
3
+ import type { ToolResult } from "./setup_workspace.js";
4
+ export declare const updateEvalSetInputSchema: z.ZodObject<{
5
+ workspace_id: z.ZodString;
6
+ eval_set_id: z.ZodString;
7
+ version_id: z.ZodString;
8
+ cases: z.ZodArray<z.ZodObject<{
9
+ case_id: z.ZodString;
10
+ prompt: z.ZodString;
11
+ category: z.ZodEnum<["jailbreak", "forbidden_action", "task", "format"]>;
12
+ forbidden_actions: z.ZodArray<z.ZodString, "many">;
13
+ must_refuse: z.ZodBoolean;
14
+ expected_task_answer: z.ZodNullable<z.ZodString>;
15
+ }, "strict", z.ZodTypeAny, {
16
+ prompt: string;
17
+ case_id: string;
18
+ category: "jailbreak" | "forbidden_action" | "task" | "format";
19
+ forbidden_actions: string[];
20
+ must_refuse: boolean;
21
+ expected_task_answer: string | null;
22
+ }, {
23
+ prompt: string;
24
+ case_id: string;
25
+ category: "jailbreak" | "forbidden_action" | "task" | "format";
26
+ forbidden_actions: string[];
27
+ must_refuse: boolean;
28
+ expected_task_answer: string | null;
29
+ }>, "many">;
30
+ }, "strict", z.ZodTypeAny, {
31
+ workspace_id: string;
32
+ cases: {
33
+ prompt: string;
34
+ case_id: string;
35
+ category: "jailbreak" | "forbidden_action" | "task" | "format";
36
+ forbidden_actions: string[];
37
+ must_refuse: boolean;
38
+ expected_task_answer: string | null;
39
+ }[];
40
+ eval_set_id: string;
41
+ version_id: string;
42
+ }, {
43
+ workspace_id: string;
44
+ cases: {
45
+ prompt: string;
46
+ case_id: string;
47
+ category: "jailbreak" | "forbidden_action" | "task" | "format";
48
+ forbidden_actions: string[];
49
+ must_refuse: boolean;
50
+ expected_task_answer: string | null;
51
+ }[];
52
+ eval_set_id: string;
53
+ version_id: string;
54
+ }>;
55
+ export type UpdateEvalSetInput = z.infer<typeof updateEvalSetInputSchema>;
56
+ export declare function updateEvalSetHandler(client: EdgeGateClient, input: UpdateEvalSetInput): Promise<ToolResult>;
@@ -0,0 +1,60 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateError } from "../client.js";
3
+ import { evalCaseSchema, formatVersion, surfaceEvalError, } from "./create_eval_set.js";
4
+ export const updateEvalSetInputSchema = z
5
+ .object({
6
+ workspace_id: z.string().uuid(),
7
+ eval_set_id: z.string().uuid(),
8
+ version_id: z.string().uuid(),
9
+ cases: z
10
+ .array(evalCaseSchema)
11
+ .describe("The FULL replacement list of case dicts for this draft version."),
12
+ })
13
+ .strict();
14
+ export async function updateEvalSetHandler(client, input) {
15
+ try {
16
+ const version = await client.updateEvalSet(input.workspace_id, input.eval_set_id, input.version_id, input.cases);
17
+ return {
18
+ content: [
19
+ {
20
+ type: "text",
21
+ text: formatVersion(version, `Updated draft version (cases fully replaced):`) +
22
+ `\n\nStill a draft — call \`edgegate_publish_eval_set\` to validate, hash, sign, and freeze it.`,
23
+ },
24
+ ],
25
+ };
26
+ }
27
+ catch (err) {
28
+ if (err instanceof EdgeGateError) {
29
+ if (err.status === 409) {
30
+ return {
31
+ isError: true,
32
+ content: [
33
+ {
34
+ type: "text",
35
+ text: "This version is already published and is immutable. To change a " +
36
+ "published set, fork a fresh draft with " +
37
+ `\`edgegate_new_eval_set_version({ workspace_id, eval_set_id, from_version: "${input.version_id}" })\`, ` +
38
+ "edit that draft, then publish it.",
39
+ },
40
+ ],
41
+ };
42
+ }
43
+ if (err.status === 404) {
44
+ return {
45
+ isError: true,
46
+ content: [
47
+ {
48
+ type: "text",
49
+ text: "Unknown eval set or version. Check the eval_set_id / version_id " +
50
+ "with `edgegate_list_eval_sets`.",
51
+ },
52
+ ],
53
+ };
54
+ }
55
+ return surfaceEvalError(err);
56
+ }
57
+ throw err;
58
+ }
59
+ }
60
+ //# sourceMappingURL=update_eval_set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update_eval_set.js","sourceRoot":"","sources":["../../src/tools/update_eval_set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,EACL,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC7B,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,cAAc,CAAC;SACrB,QAAQ,CAAC,iEAAiE,CAAC;CAC/E,CAAC;KACD,MAAM,EAAE,CAAC;AAIZ,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAsB,EACtB,KAAyB;IAEzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CACxC,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,KAAK,CACZ,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EACF,aAAa,CAAC,OAAO,EAAE,+CAA+C,CAAC;wBACvE,gGAAgG;iBACnG;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;YACjC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EACF,kEAAkE;gCAClE,yCAAyC;gCACzC,+EAA+E,KAAK,CAAC,UAAU,UAAU;gCACzG,mCAAmC;yBACtC;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EACF,kEAAkE;gCAClE,iCAAiC;yBACpC;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}