edgegate-mcp 0.4.1 → 0.8.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 (83) hide show
  1. package/README.md +27 -3
  2. package/dist/client.d.ts +43 -1
  3. package/dist/client.js +83 -0
  4. package/dist/client.js.map +1 -1
  5. package/dist/server.js +178 -0
  6. package/dist/server.js.map +1 -1
  7. package/dist/tools/change_member_role.d.ts +18 -0
  8. package/dist/tools/change_member_role.js +61 -0
  9. package/dist/tools/change_member_role.js.map +1 -0
  10. package/dist/tools/check_byo_bucket.d.ts +12 -0
  11. package/dist/tools/check_byo_bucket.js +89 -0
  12. package/dist/tools/check_byo_bucket.js.map +1 -0
  13. package/dist/tools/check_status.d.ts +2 -2
  14. package/dist/tools/compare_runs.d.ts +2 -2
  15. package/dist/tools/connect_huggingface.d.ts +15 -0
  16. package/dist/tools/connect_huggingface.js +83 -0
  17. package/dist/tools/connect_huggingface.js.map +1 -0
  18. package/dist/tools/connect_qaihub.d.ts +15 -0
  19. package/dist/tools/connect_qaihub.js +62 -0
  20. package/dist/tools/connect_qaihub.js.map +1 -0
  21. package/dist/tools/create_api_key.d.ts +18 -0
  22. package/dist/tools/create_api_key.js +73 -0
  23. package/dist/tools/create_api_key.js.map +1 -0
  24. package/dist/tools/create_pipeline.d.ts +34 -4
  25. package/dist/tools/create_pipeline.js +31 -0
  26. package/dist/tools/create_pipeline.js.map +1 -1
  27. package/dist/tools/create_workspace.d.ts +12 -0
  28. package/dist/tools/create_workspace.js +51 -0
  29. package/dist/tools/create_workspace.js.map +1 -0
  30. package/dist/tools/disconnect_byo_bucket.d.ts +12 -0
  31. package/dist/tools/disconnect_byo_bucket.js +90 -0
  32. package/dist/tools/disconnect_byo_bucket.js.map +1 -0
  33. package/dist/tools/disconnect_huggingface.d.ts +12 -0
  34. package/dist/tools/disconnect_huggingface.js +44 -0
  35. package/dist/tools/disconnect_huggingface.js.map +1 -0
  36. package/dist/tools/disconnect_qaihub.d.ts +12 -0
  37. package/dist/tools/disconnect_qaihub.js +42 -0
  38. package/dist/tools/disconnect_qaihub.js.map +1 -0
  39. package/dist/tools/export_run_report.d.ts +2 -2
  40. package/dist/tools/get_audit_report.d.ts +2 -2
  41. package/dist/tools/get_byo_audit.d.ts +27 -0
  42. package/dist/tools/get_byo_audit.js +125 -0
  43. package/dist/tools/get_byo_audit.js.map +1 -0
  44. package/dist/tools/get_huggingface_integration.d.ts +12 -0
  45. package/dist/tools/get_huggingface_integration.js +52 -0
  46. package/dist/tools/get_huggingface_integration.js.map +1 -0
  47. package/dist/tools/get_qaihub_integration.d.ts +12 -0
  48. package/dist/tools/get_qaihub_integration.js +52 -0
  49. package/dist/tools/get_qaihub_integration.js.map +1 -0
  50. package/dist/tools/get_report.d.ts +1 -1
  51. package/dist/tools/invite_member.d.ts +18 -0
  52. package/dist/tools/invite_member.js +85 -0
  53. package/dist/tools/invite_member.js.map +1 -0
  54. package/dist/tools/list_api_keys.d.ts +12 -0
  55. package/dist/tools/list_api_keys.js +51 -0
  56. package/dist/tools/list_api_keys.js.map +1 -0
  57. package/dist/tools/list_members.d.ts +12 -0
  58. package/dist/tools/list_members.js +43 -0
  59. package/dist/tools/list_members.js.map +1 -0
  60. package/dist/tools/register_byo_artifact.d.ts +27 -0
  61. package/dist/tools/register_byo_artifact.js +122 -0
  62. package/dist/tools/register_byo_artifact.js.map +1 -0
  63. package/dist/tools/register_byo_bucket.d.ts +24 -0
  64. package/dist/tools/register_byo_bucket.js +143 -0
  65. package/dist/tools/register_byo_bucket.js.map +1 -0
  66. package/dist/tools/remove_member.d.ts +15 -0
  67. package/dist/tools/remove_member.js +64 -0
  68. package/dist/tools/remove_member.js.map +1 -0
  69. package/dist/tools/revoke_api_key.d.ts +15 -0
  70. package/dist/tools/revoke_api_key.js +49 -0
  71. package/dist/tools/revoke_api_key.js.map +1 -0
  72. package/dist/types.d.ts +169 -0
  73. package/dist/version.d.ts +2 -2
  74. package/dist/version.js +1 -1
  75. package/package.json +1 -1
  76. package/plugin.json +7 -2
  77. package/skills/edgegate-byo-storage.md +148 -0
  78. package/skills/edgegate-connect-huggingface.md +64 -0
  79. package/skills/edgegate-connect-qaihub.md +56 -0
  80. package/skills/edgegate-import.md +2 -2
  81. package/skills/edgegate-init.md +17 -0
  82. package/skills/edgegate-members.md +51 -0
  83. package/skills/edgegate-workspace-setup.md +74 -0
@@ -0,0 +1,85 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateError } from "../client.js";
3
+ export const inviteMemberInputSchema = z.object({
4
+ workspace_id: z.string().uuid(),
5
+ user_email: z
6
+ .string()
7
+ .email()
8
+ .describe("Email of an existing EdgeGate user to add. The user must already have " +
9
+ "an EdgeGate account — this tool does NOT send invitation emails to " +
10
+ "external addresses (v1 only attaches existing users)."),
11
+ role: z
12
+ .enum(["owner", "admin", "viewer"])
13
+ .describe("Their role in this workspace. `owner` = full control including billing " +
14
+ "and member management; `admin` = can manage pipelines and runs but not " +
15
+ "billing or delete the workspace; `viewer` = read-only."),
16
+ });
17
+ export async function inviteMemberHandler(client, input) {
18
+ try {
19
+ const member = await client.addMember(input.workspace_id, {
20
+ user_email: input.user_email,
21
+ role: input.role,
22
+ });
23
+ return {
24
+ content: [
25
+ {
26
+ type: "text",
27
+ text: [
28
+ `Added **${member.email}** to this workspace as **${member.role}**.`,
29
+ ``,
30
+ `- user_id: \`${member.user_id}\``,
31
+ ``,
32
+ `They can now sign in and access the workspace at their permission level. Change their role with \`edgegate_change_member_role\` or remove them with \`edgegate_remove_member\`.`,
33
+ ].join("\n"),
34
+ },
35
+ ],
36
+ };
37
+ }
38
+ catch (err) {
39
+ if (err instanceof EdgeGateError) {
40
+ if (err.status === 404) {
41
+ return {
42
+ isError: true,
43
+ content: [
44
+ {
45
+ type: "text",
46
+ text: `No EdgeGate user with email \`${input.user_email}\` found.\n\n` +
47
+ `EdgeGate v1 only adds existing users — they need to register at ` +
48
+ `https://edgegate.frozo.ai/register first, then re-run this tool.`,
49
+ },
50
+ ],
51
+ };
52
+ }
53
+ if (err.status === 409) {
54
+ return {
55
+ isError: true,
56
+ content: [
57
+ {
58
+ type: "text",
59
+ text: `\`${input.user_email}\` is already a member of this workspace. Use \`edgegate_change_member_role\` to update their role.`,
60
+ },
61
+ ],
62
+ };
63
+ }
64
+ if (err.status === 403) {
65
+ return {
66
+ isError: true,
67
+ content: [
68
+ {
69
+ type: "text",
70
+ text: `Add-member blocked: ${err.detail}\n\n` +
71
+ `Common causes: only owners can add other owners, or the workspace seat limit is reached. ` +
72
+ `Upgrade at https://edgegate.frozo.ai/pricing if it's a plan limit.`,
73
+ },
74
+ ],
75
+ };
76
+ }
77
+ return {
78
+ isError: true,
79
+ content: [{ type: "text", text: `EdgeGate returned ${err.status}: ${err.detail}` }],
80
+ };
81
+ }
82
+ throw err;
83
+ }
84
+ }
85
+ //# sourceMappingURL=invite_member.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite_member.js","sourceRoot":"","sources":["../../src/tools/invite_member.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC/B,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,KAAK,EAAE;SACP,QAAQ,CACP,wEAAwE;QACtE,qEAAqE;QACrE,uDAAuD,CAC1D;IACH,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;SAClC,QAAQ,CACP,yEAAyE;QACvE,yEAAyE;QACzE,wDAAwD,CAC3D;CACJ,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAsB,EACtB,KAAwB;IAExB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE;YACxD,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC,CAAC;QACH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;wBACJ,WAAW,MAAM,CAAC,KAAK,6BAA6B,MAAM,CAAC,IAAI,KAAK;wBACpE,EAAE;wBACF,gBAAgB,MAAM,CAAC,OAAO,IAAI;wBAClC,EAAE;wBACF,iLAAiL;qBAClL,CAAC,IAAI,CAAC,IAAI,CAAC;iBACb;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,iCAAiC,KAAK,CAAC,UAAU,eAAe;gCAChE,kEAAkE;gCAClE,kEAAkE;yBACrE;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,EAAE,KAAK,KAAK,CAAC,UAAU,qGAAqG;yBACjI;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,uBAAuB,GAAG,CAAC,MAAM,MAAM;gCACvC,2FAA2F;gCAC3F,oEAAoE;yBACvE;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;aACpF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateClient } from "../client.js";
3
+ import type { ToolResult } from "./setup_workspace.js";
4
+ export declare const listApiKeysInputSchema: z.ZodObject<{
5
+ workspace_id: z.ZodString;
6
+ }, "strip", z.ZodTypeAny, {
7
+ workspace_id: string;
8
+ }, {
9
+ workspace_id: string;
10
+ }>;
11
+ export type ListApiKeysInput = z.infer<typeof listApiKeysInputSchema>;
12
+ export declare function listApiKeysHandler(client: EdgeGateClient, input: ListApiKeysInput): Promise<ToolResult>;
@@ -0,0 +1,51 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateError } from "../client.js";
3
+ export const listApiKeysInputSchema = z.object({
4
+ workspace_id: z.string().uuid(),
5
+ });
6
+ export async function listApiKeysHandler(client, input) {
7
+ try {
8
+ const keys = await client.listApiKeys(input.workspace_id);
9
+ if (keys.length === 0) {
10
+ return {
11
+ content: [
12
+ {
13
+ type: "text",
14
+ text: "No API keys in this workspace yet. Create one with `edgegate_create_api_key`.",
15
+ },
16
+ ],
17
+ };
18
+ }
19
+ return {
20
+ content: [{ type: "text", text: formatTable(keys) }],
21
+ };
22
+ }
23
+ catch (err) {
24
+ if (err instanceof EdgeGateError) {
25
+ return {
26
+ isError: true,
27
+ content: [{ type: "text", text: `EdgeGate returned ${err.status}: ${err.detail}` }],
28
+ };
29
+ }
30
+ throw err;
31
+ }
32
+ }
33
+ function formatTable(keys) {
34
+ const lines = [
35
+ `Found ${keys.length} API key${keys.length === 1 ? "" : "s"} in this workspace:`,
36
+ ``,
37
+ `| name | id | prefix...suffix | status | last used |`,
38
+ `|---|---|---|---|---|`,
39
+ ];
40
+ for (const k of keys) {
41
+ const status = k.revoked_at
42
+ ? "revoked"
43
+ : k.expires_at && new Date(k.expires_at) < new Date()
44
+ ? "expired"
45
+ : "active";
46
+ lines.push(`| ${k.name} | \`${k.id}\` | \`${k.prefix}...${k.suffix}\` | ${status} | ${k.last_used_at ?? "never"} |`);
47
+ }
48
+ lines.push(``, `Revoke a key with \`edgegate_revoke_api_key({ workspace_id, key_id })\`. The plaintext is never recoverable — if it was lost, rotate by creating a new key and revoking the old.`);
49
+ return lines.join("\n");
50
+ }
51
+ //# sourceMappingURL=list_api_keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_api_keys.js","sourceRoot":"","sources":["../../src/tools/list_api_keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,aAAa,EAAE,MAAM,cAAc,CAAC;AAI7D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CAChC,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAsB,EACtB,KAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,+EAA+E;qBACtF;iBACF;aACF,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;SACrD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;aACpF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAsB;IACzC,MAAM,KAAK,GAAa;QACtB,SAAS,IAAI,CAAC,MAAM,WAAW,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,qBAAqB;QAChF,EAAE;QACF,sDAAsD;QACtD,uBAAuB;KACxB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU;YACzB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,EAAE;gBACnD,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,QAAQ,CAAC;QACf,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,QAAQ,MAAM,MAAM,CAAC,CAAC,YAAY,IAAI,OAAO,IAAI,CACzG,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CACR,EAAE,EACF,kLAAkL,CACnL,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateClient } from "../client.js";
3
+ import type { ToolResult } from "./setup_workspace.js";
4
+ export declare const listMembersInputSchema: z.ZodObject<{
5
+ workspace_id: z.ZodString;
6
+ }, "strip", z.ZodTypeAny, {
7
+ workspace_id: string;
8
+ }, {
9
+ workspace_id: string;
10
+ }>;
11
+ export type ListMembersInput = z.infer<typeof listMembersInputSchema>;
12
+ export declare function listMembersHandler(client: EdgeGateClient, input: ListMembersInput): Promise<ToolResult>;
@@ -0,0 +1,43 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateError } from "../client.js";
3
+ export const listMembersInputSchema = z.object({
4
+ workspace_id: z.string().uuid(),
5
+ });
6
+ export async function listMembersHandler(client, input) {
7
+ try {
8
+ const members = await client.listMembers(input.workspace_id);
9
+ if (members.length === 0) {
10
+ return {
11
+ content: [
12
+ { type: "text", text: "No members in this workspace yet (which should be impossible — the owner is always a member)." },
13
+ ],
14
+ };
15
+ }
16
+ return {
17
+ content: [{ type: "text", text: formatTable(members) }],
18
+ };
19
+ }
20
+ catch (err) {
21
+ if (err instanceof EdgeGateError) {
22
+ return {
23
+ isError: true,
24
+ content: [{ type: "text", text: `EdgeGate returned ${err.status}: ${err.detail}` }],
25
+ };
26
+ }
27
+ throw err;
28
+ }
29
+ }
30
+ function formatTable(members) {
31
+ const lines = [
32
+ `Found ${members.length} member${members.length === 1 ? "" : "s"} in this workspace:`,
33
+ ``,
34
+ `| email | role | user_id |`,
35
+ `|---|---|---|`,
36
+ ];
37
+ for (const m of members) {
38
+ lines.push(`| ${m.email} | ${m.role} | \`${m.user_id}\` |`);
39
+ }
40
+ lines.push(``, `Invite with \`edgegate_invite_member\`, change role with \`edgegate_change_member_role\`, remove with \`edgegate_remove_member\`. Roles: \`owner\` (full control), \`admin\` (manage pipelines + runs, can't change billing or delete workspace), \`viewer\` (read-only).`);
41
+ return lines.join("\n");
42
+ }
43
+ //# sourceMappingURL=list_members.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_members.js","sourceRoot":"","sources":["../../src/tools/list_members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,aAAa,EAAE,MAAM,cAAc,CAAC;AAI7D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CAChC,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAsB,EACtB,KAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,+FAA+F,EAAE;iBACxH;aACF,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;aACpF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,OAAiB;IACpC,MAAM,KAAK,GAAa;QACtB,SAAS,OAAO,CAAC,MAAM,UAAU,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,qBAAqB;QACrF,EAAE;QACF,4BAA4B;QAC5B,eAAe;KAChB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC;IAC9D,CAAC;IACD,KAAK,CAAC,IAAI,CACR,EAAE,EACF,2QAA2Q,CAC5Q,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateClient } from "../client.js";
3
+ import type { ToolResult } from "./setup_workspace.js";
4
+ export declare const registerByoArtifactInputSchema: z.ZodObject<{
5
+ workspace_id: z.ZodString;
6
+ s3_uri: z.ZodString;
7
+ expected_sha256: z.ZodOptional<z.ZodString>;
8
+ expected_size: z.ZodOptional<z.ZodNumber>;
9
+ kind: z.ZodOptional<z.ZodString>;
10
+ original_filename: z.ZodOptional<z.ZodString>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ workspace_id: string;
13
+ s3_uri: string;
14
+ expected_sha256?: string | undefined;
15
+ expected_size?: number | undefined;
16
+ kind?: string | undefined;
17
+ original_filename?: string | undefined;
18
+ }, {
19
+ workspace_id: string;
20
+ s3_uri: string;
21
+ expected_sha256?: string | undefined;
22
+ expected_size?: number | undefined;
23
+ kind?: string | undefined;
24
+ original_filename?: string | undefined;
25
+ }>;
26
+ export type RegisterByoArtifactInput = z.infer<typeof registerByoArtifactInputSchema>;
27
+ export declare function registerByoArtifactHandler(client: EdgeGateClient, input: RegisterByoArtifactInput): Promise<ToolResult>;
@@ -0,0 +1,122 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateError } from "../client.js";
3
+ export const registerByoArtifactInputSchema = z.object({
4
+ workspace_id: z.string().uuid(),
5
+ s3_uri: z
6
+ .string()
7
+ .regex(/^s3:\/\/[a-z0-9][a-z0-9\-.]{1,253}\/.+$/)
8
+ .describe("Full S3 URI of the object in your registered bucket, e.g. " +
9
+ "s3://my-bucket/models/mobilenet-v2.onnx. Must live in the same " +
10
+ "bucket the grant was registered with."),
11
+ expected_sha256: z
12
+ .string()
13
+ .regex(/^[a-f0-9]{64}$/)
14
+ .optional()
15
+ .describe("Optional SHA-256 of the object (hex). If supplied, downstream cells " +
16
+ "will fail with BYO_INTEGRITY_MISMATCH when the actual bytes don't " +
17
+ "match — a strong guarantee that you ran what you thought you ran."),
18
+ expected_size: z
19
+ .number()
20
+ .int()
21
+ .positive()
22
+ .optional()
23
+ .describe("Optional size in bytes. EdgeGate cross-checks against the HeadObject " +
24
+ "response and rejects the registration if they disagree — protects " +
25
+ "against stale pointers when an object was overwritten in S3."),
26
+ kind: z
27
+ .string()
28
+ .optional()
29
+ .describe("Artifact kind. Defaults to 'model'."),
30
+ original_filename: z
31
+ .string()
32
+ .optional()
33
+ .describe("Optional display filename for run reports."),
34
+ });
35
+ export async function registerByoArtifactHandler(client, input) {
36
+ try {
37
+ const artifact = await client.registerByoArtifact(input.workspace_id, {
38
+ s3_uri: input.s3_uri,
39
+ expected_sha256: input.expected_sha256,
40
+ expected_size: input.expected_size,
41
+ kind: input.kind,
42
+ original_filename: input.original_filename,
43
+ });
44
+ return renderArtifact(artifact);
45
+ }
46
+ catch (err) {
47
+ if (err instanceof EdgeGateError) {
48
+ if (err.status === 402) {
49
+ return {
50
+ isError: true,
51
+ content: [
52
+ {
53
+ type: "text",
54
+ text: `BYO storage requires the Enterprise plan. ` +
55
+ `Contact sales: https://edgegate.frozo.ai/enterprise.`,
56
+ },
57
+ ],
58
+ };
59
+ }
60
+ if (err.status === 400) {
61
+ return {
62
+ isError: true,
63
+ content: [
64
+ {
65
+ type: "text",
66
+ text: [
67
+ `EdgeGate rejected the BYO artifact registration:`,
68
+ ``,
69
+ `\`${err.detail}\``,
70
+ ``,
71
+ `Most common causes:`,
72
+ `- **No active grant** — register one with \`edgegate_register_byo_bucket\` first.`,
73
+ `- **Bucket mismatch** — the s3_uri's bucket is not the one this workspace ` +
74
+ `registered. Cross-bucket pointers are not allowed.`,
75
+ `- **BYO_OBJECT_NOT_FOUND** — the s3_uri's key doesn't exist in the bucket. ` +
76
+ `Double-check the path; HeadObject is case-sensitive.`,
77
+ `- **BYO_OBJECT_ACCESS_DENIED** — the IAM role lacks \`s3:GetObject\` ` +
78
+ `on this specific key (a bucket-policy or resource-condition denial).`,
79
+ `- **Size mismatch** — the \`expected_size\` you supplied doesn't match the ` +
80
+ `actual object. Drop it (or update it) and retry.`,
81
+ ].join("\n"),
82
+ },
83
+ ],
84
+ };
85
+ }
86
+ return {
87
+ isError: true,
88
+ content: [
89
+ { type: "text", text: `EdgeGate returned ${err.status}: ${err.detail}` },
90
+ ],
91
+ };
92
+ }
93
+ throw err;
94
+ }
95
+ }
96
+ function renderArtifact(artifact) {
97
+ return {
98
+ content: [
99
+ {
100
+ type: "text",
101
+ text: [
102
+ `Registered BYO artifact — bytes never left your AWS account.`,
103
+ ``,
104
+ `- artifact_id: \`${artifact.id}\``,
105
+ `- storage: \`${artifact.storage_url}\``,
106
+ `- kind: ${artifact.kind}`,
107
+ `- size: ${artifact.size_bytes.toLocaleString()} bytes`,
108
+ `- sha256: \`${artifact.sha256}\``,
109
+ artifact.original_filename
110
+ ? `- filename: \`${artifact.original_filename}\``
111
+ : `- filename: (none)`,
112
+ ``,
113
+ `Pass this \`artifact_id\` to \`edgegate_create_pipeline\` (in \`model_matrix\`) ` +
114
+ `or \`edgegate_run_gate\` (as \`model_artifact_id\`) to run it. ` +
115
+ `When a cell needs the model, EdgeGate's worker will AssumeRole into your ` +
116
+ `account and GetObject directly from S3.`,
117
+ ].join("\n"),
118
+ },
119
+ ],
120
+ };
121
+ }
122
+ //# sourceMappingURL=register_byo_artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register_byo_artifact.js","sourceRoot":"","sources":["../../src/tools/register_byo_artifact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateClient } from "../client.js";
3
+ import type { ToolResult } from "./setup_workspace.js";
4
+ export declare const registerByoBucketInputSchema: z.ZodObject<{
5
+ workspace_id: z.ZodString;
6
+ role_arn: z.ZodString;
7
+ bucket: z.ZodString;
8
+ region: z.ZodString;
9
+ kms_key_id: z.ZodOptional<z.ZodString>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ workspace_id: string;
12
+ role_arn: string;
13
+ bucket: string;
14
+ region: string;
15
+ kms_key_id?: string | undefined;
16
+ }, {
17
+ workspace_id: string;
18
+ role_arn: string;
19
+ bucket: string;
20
+ region: string;
21
+ kms_key_id?: string | undefined;
22
+ }>;
23
+ export type RegisterByoBucketInput = z.infer<typeof registerByoBucketInputSchema>;
24
+ export declare function registerByoBucketHandler(client: EdgeGateClient, input: RegisterByoBucketInput): Promise<ToolResult>;
@@ -0,0 +1,143 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateError } from "../client.js";
3
+ export const registerByoBucketInputSchema = z.object({
4
+ workspace_id: z.string().uuid(),
5
+ role_arn: z
6
+ .string()
7
+ .regex(/^arn:aws:iam::\d{12}:role\/.+$/)
8
+ .describe("ARN of the IAM role EdgeGate's workers will assume to read your bucket. " +
9
+ "Created by the EdgeGate CloudFormation launch stack (or your equivalent " +
10
+ "Terraform module). Format: arn:aws:iam::<account-id>:role/<name>."),
11
+ bucket: z
12
+ .string()
13
+ .min(3)
14
+ .max(255)
15
+ .regex(/^[a-z0-9][a-z0-9\-.]{1,253}$/)
16
+ .describe("S3 bucket name (not the URI — just the bucket name)."),
17
+ region: z
18
+ .string()
19
+ .min(4)
20
+ .max(64)
21
+ .describe("AWS region the bucket lives in, e.g. us-east-1."),
22
+ kms_key_id: z
23
+ .string()
24
+ .max(2048)
25
+ .optional()
26
+ .describe("Optional KMS key ARN if the bucket uses SSE-KMS. The IAM role must " +
27
+ "have kms:Decrypt on this key."),
28
+ });
29
+ export async function registerByoBucketHandler(client, input) {
30
+ try {
31
+ const grant = await client.registerByoGrant(input.workspace_id, {
32
+ role_arn: input.role_arn,
33
+ bucket: input.bucket,
34
+ region: input.region,
35
+ kms_key_id: input.kms_key_id,
36
+ });
37
+ return successText(grant);
38
+ }
39
+ catch (err) {
40
+ if (err instanceof EdgeGateError) {
41
+ if (err.status === 402) {
42
+ return {
43
+ isError: true,
44
+ content: [
45
+ {
46
+ type: "text",
47
+ text: [
48
+ `BYO storage requires the **Enterprise plan**.`,
49
+ ``,
50
+ `Reach out to sales at https://edgegate.frozo.ai/enterprise ` +
51
+ `to enable BYO storage on this workspace. ` +
52
+ `Once enabled, re-run \`edgegate_register_byo_bucket\` with the ` +
53
+ `same role + bucket details.`,
54
+ ].join("\n"),
55
+ },
56
+ ],
57
+ };
58
+ }
59
+ if (err.status === 409) {
60
+ // Do NOT auto-rotate — the existing grant may belong to a different
61
+ // role_arn the customer doesn't want overwritten by accident.
62
+ return {
63
+ isError: true,
64
+ content: [
65
+ {
66
+ type: "text",
67
+ text: [
68
+ `This workspace already has a BYO storage grant registered.`,
69
+ ``,
70
+ `Two safe paths forward:`,
71
+ `1. Inspect the existing grant with \`edgegate_check_byo_bucket\` ` +
72
+ `to confirm it's the one you intended.`,
73
+ `2. If you want to replace it: \`edgegate_disconnect_byo_bucket\` ` +
74
+ `first (will 409 if artifacts still reference it), then re-run ` +
75
+ `\`edgegate_register_byo_bucket\` with the new role/bucket.`,
76
+ ``,
77
+ `External-ID rotation (without replacing the grant) is available ` +
78
+ `via the dashboard at ` +
79
+ `https://edgegate.frozo.ai/workspace/${input.workspace_id}/settings#byo-storage.`,
80
+ ].join("\n"),
81
+ },
82
+ ],
83
+ };
84
+ }
85
+ return {
86
+ isError: true,
87
+ content: [
88
+ {
89
+ type: "text",
90
+ text: `EdgeGate returned ${err.status}: ${err.detail}`,
91
+ },
92
+ ],
93
+ };
94
+ }
95
+ throw err;
96
+ }
97
+ }
98
+ function roleArnTail(roleArn) {
99
+ // arn:aws:iam::123456789012:role/edgegate-byo-storage-prod
100
+ // Render the trailing role name + last 4 of the account id so the user can
101
+ // confirm at a glance that they registered the right role.
102
+ const parts = roleArn.split(":");
103
+ if (parts.length < 6)
104
+ return roleArn;
105
+ const account = parts[4];
106
+ const roleName = parts.slice(5).join(":").replace(/^role\//, "");
107
+ const acctTail = account.length > 4 ? `…${account.slice(-4)}` : account;
108
+ return `${roleName} (acct ${acctTail})`;
109
+ }
110
+ function successText(grant) {
111
+ return {
112
+ content: [
113
+ {
114
+ type: "text",
115
+ text: [
116
+ `Registered BYO storage grant for this workspace.`,
117
+ ``,
118
+ `- role: \`${roleArnTail(grant.role_arn)}\``,
119
+ `- bucket: \`${grant.bucket}\` (${grant.region})`,
120
+ grant.kms_key_id
121
+ ? `- kms key: \`${grant.kms_key_id}\``
122
+ : `- kms key: (none — SSE-S3 or no encryption)`,
123
+ `- status: **${grant.status}**`,
124
+ `- external_id: \`${grant.external_id}\``,
125
+ ``,
126
+ `**Action required if you haven't already:** add this External ID to ` +
127
+ `your IAM role's trust policy under \`Condition.StringEquals.sts:ExternalId\`. ` +
128
+ `Without it, AssumeRole will fail with BYO_ASSUME_ROLE_FAILED.`,
129
+ ``,
130
+ grant.status === "active"
131
+ ? `The readiness probe just passed. You can register your first artifact ` +
132
+ `with \`edgegate_register_byo_artifact\`.`
133
+ : grant.last_verify_error
134
+ ? `The readiness probe FAILED: \`${grant.last_verify_error}\`. Fix the ` +
135
+ `IAM/bucket/KMS configuration, then re-probe with ` +
136
+ `\`edgegate_check_byo_bucket\`.`
137
+ : `Probe outcome pending — run \`edgegate_check_byo_bucket\` to verify.`,
138
+ ].join("\n"),
139
+ },
140
+ ],
141
+ };
142
+ }
143
+ //# sourceMappingURL=register_byo_bucket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register_byo_bucket.js","sourceRoot":"","sources":["../../src/tools/register_byo_bucket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateClient } from "../client.js";
3
+ import type { ToolResult } from "./setup_workspace.js";
4
+ export declare const removeMemberInputSchema: z.ZodObject<{
5
+ workspace_id: z.ZodString;
6
+ user_id: z.ZodString;
7
+ }, "strip", z.ZodTypeAny, {
8
+ workspace_id: string;
9
+ user_id: string;
10
+ }, {
11
+ workspace_id: string;
12
+ user_id: string;
13
+ }>;
14
+ export type RemoveMemberInput = z.infer<typeof removeMemberInputSchema>;
15
+ export declare function removeMemberHandler(client: EdgeGateClient, input: RemoveMemberInput): Promise<ToolResult>;
@@ -0,0 +1,64 @@
1
+ import { z } from "zod";
2
+ import { EdgeGateError } from "../client.js";
3
+ export const removeMemberInputSchema = z.object({
4
+ workspace_id: z.string().uuid(),
5
+ user_id: z
6
+ .string()
7
+ .uuid()
8
+ .describe("Target member's user_id (from `edgegate_list_members`). The user immediately " +
9
+ "loses access to the workspace. Their pipelines and runs are preserved — " +
10
+ "this only removes the membership row."),
11
+ });
12
+ export async function removeMemberHandler(client, input) {
13
+ try {
14
+ await client.removeMember(input.workspace_id, input.user_id);
15
+ return {
16
+ content: [
17
+ {
18
+ type: "text",
19
+ text: [
20
+ `Removed user \`${input.user_id}\` from this workspace.`,
21
+ ``,
22
+ `Pipelines and runs they created are preserved. Re-invite any time with \`edgegate_invite_member\` if it was a mistake.`,
23
+ ].join("\n"),
24
+ },
25
+ ],
26
+ };
27
+ }
28
+ catch (err) {
29
+ if (err instanceof EdgeGateError) {
30
+ if (err.status === 400) {
31
+ // Most likely "Cannot remove the last owner from workspace".
32
+ return {
33
+ isError: true,
34
+ content: [
35
+ {
36
+ type: "text",
37
+ text: `Member removal rejected: ${err.detail}\n\n` +
38
+ `If you're trying to remove the last owner, promote another member ` +
39
+ `to owner first via \`edgegate_change_member_role\`, then remove ` +
40
+ `the original owner.`,
41
+ },
42
+ ],
43
+ };
44
+ }
45
+ if (err.status === 404) {
46
+ return {
47
+ isError: true,
48
+ content: [
49
+ {
50
+ type: "text",
51
+ text: `User \`${input.user_id}\` is not a member of this workspace.`,
52
+ },
53
+ ],
54
+ };
55
+ }
56
+ return {
57
+ isError: true,
58
+ content: [{ type: "text", text: `EdgeGate returned ${err.status}: ${err.detail}` }],
59
+ };
60
+ }
61
+ throw err;
62
+ }
63
+ }
64
+ //# sourceMappingURL=remove_member.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove_member.js","sourceRoot":"","sources":["../../src/tools/remove_member.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC/B,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,IAAI,EAAE;SACN,QAAQ,CACP,+EAA+E;QAC7E,0EAA0E;QAC1E,uCAAuC,CAC1C;CACJ,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAsB,EACtB,KAAwB;IAExB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;wBACJ,kBAAkB,KAAK,CAAC,OAAO,yBAAyB;wBACxD,EAAE;wBACF,wHAAwH;qBACzH,CAAC,IAAI,CAAC,IAAI,CAAC;iBACb;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,6DAA6D;gBAC7D,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EACF,4BAA4B,GAAG,CAAC,MAAM,MAAM;gCAC5C,oEAAoE;gCACpE,kEAAkE;gCAClE,qBAAqB;yBACxB;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,EAAE,UAAU,KAAK,CAAC,OAAO,uCAAuC;yBACrE;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;aACpF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}