@burdenoff/mcp-libs 2026.522.1 → 2026.523.1

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 (62) hide show
  1. package/dist/{chunk-4GBVJ4OY.js → chunk-N2CZNPYC.js} +31 -3
  2. package/dist/chunk-N2CZNPYC.js.map +1 -0
  3. package/dist/modules/auth/index.cjs +317 -0
  4. package/dist/modules/auth/index.cjs.map +1 -1
  5. package/dist/modules/auth/index.js +289 -1
  6. package/dist/modules/auth/index.js.map +1 -1
  7. package/dist/modules/channels/index.cjs +47 -0
  8. package/dist/modules/channels/index.cjs.map +1 -1
  9. package/dist/modules/channels/index.js +47 -0
  10. package/dist/modules/channels/index.js.map +1 -1
  11. package/dist/modules/conversations/index.cjs +181 -0
  12. package/dist/modules/conversations/index.cjs.map +1 -1
  13. package/dist/modules/conversations/index.js +181 -0
  14. package/dist/modules/conversations/index.js.map +1 -1
  15. package/dist/modules/devportal/index.cjs +281 -0
  16. package/dist/modules/devportal/index.cjs.map +1 -1
  17. package/dist/modules/devportal/index.js +281 -0
  18. package/dist/modules/devportal/index.js.map +1 -1
  19. package/dist/modules/files/index.cjs +244 -2
  20. package/dist/modules/files/index.cjs.map +1 -1
  21. package/dist/modules/files/index.js +244 -2
  22. package/dist/modules/files/index.js.map +1 -1
  23. package/dist/modules/organizations/index.cjs +211 -0
  24. package/dist/modules/organizations/index.cjs.map +1 -1
  25. package/dist/modules/organizations/index.js +211 -0
  26. package/dist/modules/organizations/index.js.map +1 -1
  27. package/dist/modules/products/index.cjs +131 -0
  28. package/dist/modules/products/index.cjs.map +1 -1
  29. package/dist/modules/products/index.js +131 -0
  30. package/dist/modules/products/index.js.map +1 -1
  31. package/dist/modules/rbac/index.cjs +114 -0
  32. package/dist/modules/rbac/index.cjs.map +1 -1
  33. package/dist/modules/rbac/index.js +114 -0
  34. package/dist/modules/rbac/index.js.map +1 -1
  35. package/dist/modules/sandbox/index.cjs.map +1 -1
  36. package/dist/modules/sandbox/index.js +1 -1
  37. package/dist/modules/scheduler/index.cjs +124 -0
  38. package/dist/modules/scheduler/index.cjs.map +1 -1
  39. package/dist/modules/scheduler/index.js +124 -0
  40. package/dist/modules/scheduler/index.js.map +1 -1
  41. package/dist/modules/security/index.cjs +51 -0
  42. package/dist/modules/security/index.cjs.map +1 -1
  43. package/dist/modules/security/index.js +51 -0
  44. package/dist/modules/security/index.js.map +1 -1
  45. package/dist/modules/store/index.cjs +102 -0
  46. package/dist/modules/store/index.cjs.map +1 -1
  47. package/dist/modules/store/index.js +102 -0
  48. package/dist/modules/store/index.js.map +1 -1
  49. package/dist/modules/tours/index.cjs +43 -0
  50. package/dist/modules/tours/index.cjs.map +1 -1
  51. package/dist/modules/tours/index.js +43 -0
  52. package/dist/modules/tours/index.js.map +1 -1
  53. package/dist/modules/vibecontrols/index.cjs +197 -0
  54. package/dist/modules/vibecontrols/index.cjs.map +1 -1
  55. package/dist/modules/vibecontrols/index.js +170 -1
  56. package/dist/modules/vibecontrols/index.js.map +1 -1
  57. package/dist/modules/workspaces/index.cjs +46 -3
  58. package/dist/modules/workspaces/index.cjs.map +1 -1
  59. package/dist/modules/workspaces/index.js +46 -3
  60. package/dist/modules/workspaces/index.js.map +1 -1
  61. package/package.json +4 -3
  62. package/dist/chunk-4GBVJ4OY.js.map +0 -1
@@ -70,6 +70,38 @@ var CHECK_PERMISSION = `
70
70
  }
71
71
  }
72
72
  `;
73
+ var LIST_POLICY_REFERENCES = `
74
+ query PolicyReferences($filter: PolicyReferenceFilterInput, $pagination: PaginationInput) {
75
+ policyReferences(filter: $filter, pagination: $pagination) {
76
+ id
77
+ name
78
+ description
79
+ opaPackage
80
+ resourceType
81
+ action
82
+ isActive
83
+ priority
84
+ createdAt
85
+ updatedAt
86
+ }
87
+ }
88
+ `;
89
+ var ATTACH_POLICY = `
90
+ mutation AttachPolicy($roleId: ID!, $policyId: ID!) {
91
+ attachPolicyToRole(roleId: $roleId, policyId: $policyId) {
92
+ id
93
+ name
94
+ resourceType
95
+ action
96
+ isActive
97
+ }
98
+ }
99
+ `;
100
+ var DETACH_POLICY = `
101
+ mutation DetachPolicy($roleId: ID!, $policyId: ID!) {
102
+ detachPolicyFromRole(roleId: $roleId, policyId: $policyId)
103
+ }
104
+ `;
73
105
 
74
106
  // src/modules/rbac/tools.ts
75
107
  var LayerEnum = z.enum(["workspace", "global"]);
@@ -258,6 +290,88 @@ function registerRbacTools(server, ctx, track) {
258
290
  }
259
291
  }
260
292
  );
293
+ server.registerTool(
294
+ track(mcpToolName(ctx.productName, "rbac_policies_list")),
295
+ {
296
+ title: "List Policy References",
297
+ description: "List OPA policy references registered on the chosen gateway (workspace or global), optionally filtered by resource/action/active state. Returns an array of PolicyReference.",
298
+ inputSchema: {
299
+ layer: LayerEnum.optional().describe("workspace or global (default: workspace)"),
300
+ resourceType: z.string().optional().describe("Filter by resource type (e.g. project)"),
301
+ action: z.string().optional().describe("Filter by action (e.g. read/write/delete)"),
302
+ isActive: z.boolean().optional().describe("Only active/inactive policies"),
303
+ limit: z.number().int().optional().describe("Page size (default 100)"),
304
+ offset: z.number().int().optional().describe("Pagination offset (default 0)")
305
+ }
306
+ },
307
+ async ({ layer, resourceType, action, isActive, limit, offset }) => {
308
+ try {
309
+ const targetLayer = layer ?? "workspace";
310
+ const filter = {};
311
+ if (resourceType !== void 0) filter.resourceType = resourceType;
312
+ if (action !== void 0) filter.action = action;
313
+ if (isActive !== void 0) filter.isActive = isActive;
314
+ const data = await clientForLayer(ctx, targetLayer).request(LIST_POLICY_REFERENCES, {
315
+ filter: Object.keys(filter).length ? filter : void 0,
316
+ pagination: { limit: limit ?? 100, offset: offset ?? 0 }
317
+ });
318
+ return jsonResult(data.policyReferences);
319
+ } catch (error) {
320
+ ctx.logger.error("rbac_policies_list failed", { error: String(error) });
321
+ return errorResult(
322
+ `Failed to list policy references: ${error instanceof Error ? error.message : String(error)}`
323
+ );
324
+ }
325
+ }
326
+ );
327
+ server.registerTool(
328
+ track(mcpToolName(ctx.productName, "rbac_policies_attach")),
329
+ {
330
+ title: "Attach Policy To Role",
331
+ description: "Attach an OPA policy reference to a role on the chosen gateway. Returns the attached PolicyReference.",
332
+ inputSchema: {
333
+ roleId: z.string().describe("Role ID"),
334
+ policyId: z.string().describe("PolicyReference ID"),
335
+ layer: LayerEnum.optional().describe("workspace or global (default: workspace)")
336
+ }
337
+ },
338
+ async ({ roleId, policyId, layer }) => {
339
+ try {
340
+ const targetLayer = layer ?? "workspace";
341
+ const data = await clientForLayer(ctx, targetLayer).request(ATTACH_POLICY, { roleId, policyId });
342
+ return jsonResult(data.attachPolicyToRole);
343
+ } catch (error) {
344
+ ctx.logger.error("rbac_policies_attach failed", { error: String(error) });
345
+ return errorResult(
346
+ `Failed to attach policy: ${error instanceof Error ? error.message : String(error)}`
347
+ );
348
+ }
349
+ }
350
+ );
351
+ server.registerTool(
352
+ track(mcpToolName(ctx.productName, "rbac_policies_detach")),
353
+ {
354
+ title: "Detach Policy From Role",
355
+ description: "Detach an OPA policy reference from a role on the chosen gateway. Returns { detached: boolean, roleId, policyId }.",
356
+ inputSchema: {
357
+ roleId: z.string().describe("Role ID"),
358
+ policyId: z.string().describe("PolicyReference ID"),
359
+ layer: LayerEnum.optional().describe("workspace or global (default: workspace)")
360
+ }
361
+ },
362
+ async ({ roleId, policyId, layer }) => {
363
+ try {
364
+ const targetLayer = layer ?? "workspace";
365
+ const data = await clientForLayer(ctx, targetLayer).request(DETACH_POLICY, { roleId, policyId });
366
+ return jsonResult({ detached: data.detachPolicyFromRole, roleId, policyId });
367
+ } catch (error) {
368
+ ctx.logger.error("rbac_policies_detach failed", { error: String(error) });
369
+ return errorResult(
370
+ `Failed to detach policy: ${error instanceof Error ? error.message : String(error)}`
371
+ );
372
+ }
373
+ }
374
+ );
261
375
  server.registerTool(
262
376
  track(mcpToolName(ctx.productName, "rbac_check")),
263
377
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/modules/rbac/operations.ts","../../../src/modules/rbac/tools.ts","../../../src/modules/rbac/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export const LIST_ROLES = `\n query ListRoles($filter: RoleFilterInput, $pagination: PaginationInput, $scopeId: String!) {\n roles(filter: $filter, pagination: $pagination, scopeId: $scopeId) {\n id\n name\n description\n isSystem\n scopeId\n priority\n defaultPermissions {\n level\n resourceType\n }\n }\n }\n`;\n\nexport const GET_ROLE = `\n query GetRole($id: ID!) {\n role(id: $id) {\n id\n name\n description\n isSystem\n scopeId\n priority\n defaultPermissions {\n level\n resourceType\n }\n }\n }\n`;\n\nexport const CREATE_ROLE = `\n mutation CreateRole($input: CreateRoleInput!) {\n createRole(input: $input) {\n id\n name\n description\n scopeId\n }\n }\n`;\n\nexport const UPDATE_ROLE = `\n mutation UpdateRole($id: ID!, $input: UpdateRoleInput!) {\n updateRole(id: $id, input: $input) {\n id\n name\n description\n priority\n }\n }\n`;\n\nexport const DELETE_ROLE = `\n mutation DeleteRole($id: ID!, $reassignToRoleId: ID) {\n deleteRole(id: $id, reassignToRoleId: $reassignToRoleId)\n }\n`;\n\nexport const CHECK_PERMISSION = `\n query CheckPermission($input: PermissionCheckInput!) {\n checkPermission(input: $input) {\n allowed\n decisionPath\n roleName\n roleLevel\n overrideType\n }\n }\n`;\n","import { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { jsonResult, errorResult, mcpToolName, type McpContext } from '../../core/index.js';\nimport {\n LIST_ROLES,\n GET_ROLE,\n CREATE_ROLE,\n UPDATE_ROLE,\n DELETE_ROLE,\n CHECK_PERMISSION,\n} from './operations.js';\n\nconst LayerEnum = z.enum(['workspace', 'global']);\nconst ActorTypeEnum = z.enum(['USER', 'BOT', 'GROUP', 'INTEGRATION', 'DELEGATED_AGENT']);\n\ntype Layer = 'workspace' | 'global';\n\nfunction clientForLayer(ctx: McpContext, layer: Layer) {\n return layer === 'workspace' ? ctx.gql.workspace : ctx.gql.global;\n}\n\nfunction defaultScopeId(ctx: McpContext, layer: Layer): string | null {\n const auth = ctx.auth.read();\n if (!auth) return null;\n if (layer === 'workspace') return auth.workspaceId ?? null;\n return auth.organizationId ?? null;\n}\n\nexport function registerRbacTools(\n server: McpServer,\n ctx: McpContext,\n track: (n: string) => string,\n): void {\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_roles_list')),\n {\n title: 'List Roles',\n description: 'List RBAC roles for a workspace or global scope.',\n inputSchema: {\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n scopeId: z.string().optional().describe('Override scope id (workspace or tenant)'),\n includeSystem: z.boolean().optional().describe('Include system roles'),\n limit: z.number().optional().describe('Page size'),\n },\n },\n async ({ layer, scopeId, includeSystem, limit }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const resolvedScope = scopeId ?? defaultScopeId(ctx, targetLayer);\n if (!resolvedScope) {\n return errorResult(\n `No ${targetLayer} scope. Pass scopeId or authenticate to a workspace/organization.`,\n );\n }\n const filter: Record<string, unknown> = {};\n if (includeSystem) filter.includeSystem = true;\n const data = await clientForLayer(ctx, targetLayer).request<{ roles: unknown }>(\n LIST_ROLES,\n {\n filter: Object.keys(filter).length ? filter : undefined,\n pagination: { limit: limit ?? 100, offset: 0 },\n scopeId: resolvedScope,\n },\n );\n return jsonResult(data.roles);\n } catch (error) {\n ctx.logger.error('rbac_roles_list failed', { error: String(error) });\n return errorResult(\n `Failed to list roles: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_roles_get')),\n {\n title: 'Get Role',\n description: 'Get a role by id from the workspace or global layer.',\n inputSchema: {\n id: z.string().describe('Role ID'),\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n },\n },\n async ({ id, layer }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const data = await clientForLayer(ctx, targetLayer).request<{ role: unknown | null }>(\n GET_ROLE,\n { id },\n );\n if (!data.role) return errorResult(`Role ${id} not found`);\n return jsonResult(data.role);\n } catch (error) {\n ctx.logger.error('rbac_roles_get failed', { error: String(error) });\n return errorResult(\n `Failed to get role: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_roles_create')),\n {\n title: 'Create Role',\n description: 'Create a new RBAC role at the workspace or global layer.',\n inputSchema: {\n name: z.string().describe('Role name'),\n description: z.string().optional().describe('Role description'),\n parentId: z.string().optional().describe('Parent role id'),\n priority: z.number().optional().describe('Priority'),\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n scopeId: z.string().optional().describe('Override scope id'),\n scopeType: z.string().optional().describe('wspace|entity (global layer only)'),\n },\n },\n async ({ name, description, parentId, priority, layer, scopeId, scopeType }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const resolvedScope = scopeId ?? defaultScopeId(ctx, targetLayer);\n if (!resolvedScope) {\n return errorResult(\n `No ${targetLayer} scope. Pass scopeId or authenticate to a workspace/organization.`,\n );\n }\n const input: Record<string, unknown> = { name, scopeId: resolvedScope };\n if (description !== undefined) input.description = description;\n if (parentId !== undefined) input.parentId = parentId;\n if (priority !== undefined) input.priority = priority;\n if (targetLayer === 'global' && scopeType) input.scopeType = scopeType;\n const data = await clientForLayer(ctx, targetLayer).request<{ createRole: unknown }>(\n CREATE_ROLE,\n { input },\n );\n return jsonResult(data.createRole);\n } catch (error) {\n ctx.logger.error('rbac_roles_create failed', { error: String(error) });\n return errorResult(\n `Failed to create role: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_roles_update')),\n {\n title: 'Update Role',\n description: 'Update an existing role.',\n inputSchema: {\n id: z.string().describe('Role ID'),\n name: z.string().optional().describe('Updated name'),\n description: z.string().optional().describe('Updated description'),\n priority: z.number().optional().describe('Updated priority'),\n parentId: z.string().optional().describe('Updated parent role id'),\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n },\n },\n async ({ id, name, description, priority, parentId, layer }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const input: Record<string, unknown> = {};\n if (name !== undefined) input.name = name;\n if (description !== undefined) input.description = description;\n if (priority !== undefined) input.priority = priority;\n if (parentId !== undefined) input.parentId = parentId;\n if (!Object.keys(input).length) {\n return errorResult('No updates specified');\n }\n const data = await clientForLayer(ctx, targetLayer).request<{ updateRole: unknown }>(\n UPDATE_ROLE,\n { id, input },\n );\n return jsonResult(data.updateRole);\n } catch (error) {\n ctx.logger.error('rbac_roles_update failed', { error: String(error) });\n return errorResult(\n `Failed to update role: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_roles_delete')),\n {\n title: 'Delete Role',\n description: 'Delete a role, optionally reassigning actors to another role.',\n inputSchema: {\n id: z.string().describe('Role ID'),\n reassignToRoleId: z.string().optional().describe('Reassign actors to this role'),\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n },\n },\n async ({ id, reassignToRoleId, layer }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const data = await clientForLayer(ctx, targetLayer).request<{ deleteRole: unknown }>(\n DELETE_ROLE,\n { id, reassignToRoleId },\n );\n return jsonResult({ deleted: data.deleteRole, roleId: id });\n } catch (error) {\n ctx.logger.error('rbac_roles_delete failed', { error: String(error) });\n return errorResult(\n `Failed to delete role: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_check')),\n {\n title: 'Check Permission',\n description: 'Check whether an actor has permission for an action on a resource.',\n inputSchema: {\n actorId: z.string().describe('Actor id (user/app/service/super_admin)'),\n action: z.string().describe('Action like read/write/delete'),\n resourceType: z.string().describe('Resource type like project/task'),\n actorType: ActorTypeEnum.optional().describe('Actor type (default: USER)'),\n resourceId: z.string().optional().describe('Specific resource id (optional)'),\n scopeId: z.string().optional().describe('Scope id (workspaceId or tenantId)'),\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n },\n },\n async ({ actorId, action, resourceType, actorType, resourceId, scopeId, layer }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const resolvedScope = scopeId ?? defaultScopeId(ctx, targetLayer);\n if (!resolvedScope) {\n return errorResult(\n `No ${targetLayer} scope. Pass scopeId or authenticate to a workspace/organization.`,\n );\n }\n const input: Record<string, unknown> = {\n actorId,\n actorType: actorType ?? 'USER',\n action,\n resourceType,\n scopeId: resolvedScope,\n };\n if (resourceId !== undefined) input.resourceId = resourceId;\n const data = await clientForLayer(ctx, targetLayer).request<{ checkPermission: unknown }>(\n CHECK_PERMISSION,\n { input },\n );\n return jsonResult(data.checkPermission);\n } catch (error) {\n ctx.logger.error('rbac_check failed', { error: String(error) });\n return errorResult(\n `Failed to check permission: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n}\n","/**\n * RBAC module — role-based access control across workspace + global layers.\n *\n * Tools:\n * <product>_rbac_roles_{list,get,create,update,delete}\n * <product>_rbac_check\n *\n * Backend: ~/products/wspace/rbac/wspace-rbac-svc/, ~/products/global/rbac/global-rbac-svc/.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { McpContext, McpModule, ModuleRegistration } from '../../core/index.js';\nimport { registerRbacTools } from './tools.js';\n\nconst rbacModule: McpModule = {\n id: 'rbac',\n version: '0.0.1',\n displayName: 'RBAC',\n dependsOn: ['auth'],\n capabilities: { tools: {} },\n\n register(server: McpServer, ctx: McpContext): ModuleRegistration {\n const tools: string[] = [];\n const track = (n: string): string => {\n tools.push(n);\n return n;\n };\n\n registerRbacTools(server, ctx, track);\n\n return { tools, resources: [], prompts: [] };\n },\n};\n\nexport default rbacModule;\n"]}
1
+ {"version":3,"sources":["../../../src/modules/rbac/operations.ts","../../../src/modules/rbac/tools.ts","../../../src/modules/rbac/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export const LIST_ROLES = `\n query ListRoles($filter: RoleFilterInput, $pagination: PaginationInput, $scopeId: String!) {\n roles(filter: $filter, pagination: $pagination, scopeId: $scopeId) {\n id\n name\n description\n isSystem\n scopeId\n priority\n defaultPermissions {\n level\n resourceType\n }\n }\n }\n`;\n\nexport const GET_ROLE = `\n query GetRole($id: ID!) {\n role(id: $id) {\n id\n name\n description\n isSystem\n scopeId\n priority\n defaultPermissions {\n level\n resourceType\n }\n }\n }\n`;\n\nexport const CREATE_ROLE = `\n mutation CreateRole($input: CreateRoleInput!) {\n createRole(input: $input) {\n id\n name\n description\n scopeId\n }\n }\n`;\n\nexport const UPDATE_ROLE = `\n mutation UpdateRole($id: ID!, $input: UpdateRoleInput!) {\n updateRole(id: $id, input: $input) {\n id\n name\n description\n priority\n }\n }\n`;\n\nexport const DELETE_ROLE = `\n mutation DeleteRole($id: ID!, $reassignToRoleId: ID) {\n deleteRole(id: $id, reassignToRoleId: $reassignToRoleId)\n }\n`;\n\nexport const CHECK_PERMISSION = `\n query CheckPermission($input: PermissionCheckInput!) {\n checkPermission(input: $input) {\n allowed\n decisionPath\n roleName\n roleLevel\n overrideType\n }\n }\n`;\n\nexport const LIST_POLICY_REFERENCES = `\n query PolicyReferences($filter: PolicyReferenceFilterInput, $pagination: PaginationInput) {\n policyReferences(filter: $filter, pagination: $pagination) {\n id\n name\n description\n opaPackage\n resourceType\n action\n isActive\n priority\n createdAt\n updatedAt\n }\n }\n`;\n\nexport const ATTACH_POLICY = `\n mutation AttachPolicy($roleId: ID!, $policyId: ID!) {\n attachPolicyToRole(roleId: $roleId, policyId: $policyId) {\n id\n name\n resourceType\n action\n isActive\n }\n }\n`;\n\nexport const DETACH_POLICY = `\n mutation DetachPolicy($roleId: ID!, $policyId: ID!) {\n detachPolicyFromRole(roleId: $roleId, policyId: $policyId)\n }\n`;\n","import { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { jsonResult, errorResult, mcpToolName, type McpContext } from '../../core/index.js';\nimport {\n LIST_ROLES,\n GET_ROLE,\n CREATE_ROLE,\n UPDATE_ROLE,\n DELETE_ROLE,\n CHECK_PERMISSION,\n LIST_POLICY_REFERENCES,\n ATTACH_POLICY,\n DETACH_POLICY,\n} from './operations.js';\n\nconst LayerEnum = z.enum(['workspace', 'global']);\nconst ActorTypeEnum = z.enum(['USER', 'BOT', 'GROUP', 'INTEGRATION', 'DELEGATED_AGENT']);\n\ntype Layer = 'workspace' | 'global';\n\nfunction clientForLayer(ctx: McpContext, layer: Layer) {\n return layer === 'workspace' ? ctx.gql.workspace : ctx.gql.global;\n}\n\nfunction defaultScopeId(ctx: McpContext, layer: Layer): string | null {\n const auth = ctx.auth.read();\n if (!auth) return null;\n if (layer === 'workspace') return auth.workspaceId ?? null;\n return auth.organizationId ?? null;\n}\n\nexport function registerRbacTools(\n server: McpServer,\n ctx: McpContext,\n track: (n: string) => string,\n): void {\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_roles_list')),\n {\n title: 'List Roles',\n description: 'List RBAC roles for a workspace or global scope.',\n inputSchema: {\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n scopeId: z.string().optional().describe('Override scope id (workspace or tenant)'),\n includeSystem: z.boolean().optional().describe('Include system roles'),\n limit: z.number().optional().describe('Page size'),\n },\n },\n async ({ layer, scopeId, includeSystem, limit }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const resolvedScope = scopeId ?? defaultScopeId(ctx, targetLayer);\n if (!resolvedScope) {\n return errorResult(\n `No ${targetLayer} scope. Pass scopeId or authenticate to a workspace/organization.`,\n );\n }\n const filter: Record<string, unknown> = {};\n if (includeSystem) filter.includeSystem = true;\n const data = await clientForLayer(ctx, targetLayer).request<{ roles: unknown }>(\n LIST_ROLES,\n {\n filter: Object.keys(filter).length ? filter : undefined,\n pagination: { limit: limit ?? 100, offset: 0 },\n scopeId: resolvedScope,\n },\n );\n return jsonResult(data.roles);\n } catch (error) {\n ctx.logger.error('rbac_roles_list failed', { error: String(error) });\n return errorResult(\n `Failed to list roles: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_roles_get')),\n {\n title: 'Get Role',\n description: 'Get a role by id from the workspace or global layer.',\n inputSchema: {\n id: z.string().describe('Role ID'),\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n },\n },\n async ({ id, layer }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const data = await clientForLayer(ctx, targetLayer).request<{ role: unknown | null }>(\n GET_ROLE,\n { id },\n );\n if (!data.role) return errorResult(`Role ${id} not found`);\n return jsonResult(data.role);\n } catch (error) {\n ctx.logger.error('rbac_roles_get failed', { error: String(error) });\n return errorResult(\n `Failed to get role: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_roles_create')),\n {\n title: 'Create Role',\n description: 'Create a new RBAC role at the workspace or global layer.',\n inputSchema: {\n name: z.string().describe('Role name'),\n description: z.string().optional().describe('Role description'),\n parentId: z.string().optional().describe('Parent role id'),\n priority: z.number().optional().describe('Priority'),\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n scopeId: z.string().optional().describe('Override scope id'),\n scopeType: z.string().optional().describe('wspace|entity (global layer only)'),\n },\n },\n async ({ name, description, parentId, priority, layer, scopeId, scopeType }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const resolvedScope = scopeId ?? defaultScopeId(ctx, targetLayer);\n if (!resolvedScope) {\n return errorResult(\n `No ${targetLayer} scope. Pass scopeId or authenticate to a workspace/organization.`,\n );\n }\n const input: Record<string, unknown> = { name, scopeId: resolvedScope };\n if (description !== undefined) input.description = description;\n if (parentId !== undefined) input.parentId = parentId;\n if (priority !== undefined) input.priority = priority;\n if (targetLayer === 'global' && scopeType) input.scopeType = scopeType;\n const data = await clientForLayer(ctx, targetLayer).request<{ createRole: unknown }>(\n CREATE_ROLE,\n { input },\n );\n return jsonResult(data.createRole);\n } catch (error) {\n ctx.logger.error('rbac_roles_create failed', { error: String(error) });\n return errorResult(\n `Failed to create role: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_roles_update')),\n {\n title: 'Update Role',\n description: 'Update an existing role.',\n inputSchema: {\n id: z.string().describe('Role ID'),\n name: z.string().optional().describe('Updated name'),\n description: z.string().optional().describe('Updated description'),\n priority: z.number().optional().describe('Updated priority'),\n parentId: z.string().optional().describe('Updated parent role id'),\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n },\n },\n async ({ id, name, description, priority, parentId, layer }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const input: Record<string, unknown> = {};\n if (name !== undefined) input.name = name;\n if (description !== undefined) input.description = description;\n if (priority !== undefined) input.priority = priority;\n if (parentId !== undefined) input.parentId = parentId;\n if (!Object.keys(input).length) {\n return errorResult('No updates specified');\n }\n const data = await clientForLayer(ctx, targetLayer).request<{ updateRole: unknown }>(\n UPDATE_ROLE,\n { id, input },\n );\n return jsonResult(data.updateRole);\n } catch (error) {\n ctx.logger.error('rbac_roles_update failed', { error: String(error) });\n return errorResult(\n `Failed to update role: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_roles_delete')),\n {\n title: 'Delete Role',\n description: 'Delete a role, optionally reassigning actors to another role.',\n inputSchema: {\n id: z.string().describe('Role ID'),\n reassignToRoleId: z.string().optional().describe('Reassign actors to this role'),\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n },\n },\n async ({ id, reassignToRoleId, layer }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const data = await clientForLayer(ctx, targetLayer).request<{ deleteRole: unknown }>(\n DELETE_ROLE,\n { id, reassignToRoleId },\n );\n return jsonResult({ deleted: data.deleteRole, roleId: id });\n } catch (error) {\n ctx.logger.error('rbac_roles_delete failed', { error: String(error) });\n return errorResult(\n `Failed to delete role: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ── Policies ────────────────────────────────────────────────────────────\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_policies_list')),\n {\n title: 'List Policy References',\n description:\n 'List OPA policy references registered on the chosen gateway (workspace or global), optionally filtered by resource/action/active state. Returns an array of PolicyReference.',\n inputSchema: {\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n resourceType: z.string().optional().describe('Filter by resource type (e.g. project)'),\n action: z.string().optional().describe('Filter by action (e.g. read/write/delete)'),\n isActive: z.boolean().optional().describe('Only active/inactive policies'),\n limit: z.number().int().optional().describe('Page size (default 100)'),\n offset: z.number().int().optional().describe('Pagination offset (default 0)'),\n },\n },\n async ({ layer, resourceType, action, isActive, limit, offset }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const filter: Record<string, unknown> = {};\n if (resourceType !== undefined) filter.resourceType = resourceType;\n if (action !== undefined) filter.action = action;\n if (isActive !== undefined) filter.isActive = isActive;\n const data = await clientForLayer(ctx, targetLayer).request<{\n policyReferences: unknown[];\n }>(LIST_POLICY_REFERENCES, {\n filter: Object.keys(filter).length ? filter : undefined,\n pagination: { limit: limit ?? 100, offset: offset ?? 0 },\n });\n return jsonResult(data.policyReferences);\n } catch (error) {\n ctx.logger.error('rbac_policies_list failed', { error: String(error) });\n return errorResult(\n `Failed to list policy references: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_policies_attach')),\n {\n title: 'Attach Policy To Role',\n description:\n 'Attach an OPA policy reference to a role on the chosen gateway. Returns the attached PolicyReference.',\n inputSchema: {\n roleId: z.string().describe('Role ID'),\n policyId: z.string().describe('PolicyReference ID'),\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n },\n },\n async ({ roleId, policyId, layer }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const data = await clientForLayer(ctx, targetLayer).request<{\n attachPolicyToRole: unknown;\n }>(ATTACH_POLICY, { roleId, policyId });\n return jsonResult(data.attachPolicyToRole);\n } catch (error) {\n ctx.logger.error('rbac_policies_attach failed', { error: String(error) });\n return errorResult(\n `Failed to attach policy: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_policies_detach')),\n {\n title: 'Detach Policy From Role',\n description:\n 'Detach an OPA policy reference from a role on the chosen gateway. Returns { detached: boolean, roleId, policyId }.',\n inputSchema: {\n roleId: z.string().describe('Role ID'),\n policyId: z.string().describe('PolicyReference ID'),\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n },\n },\n async ({ roleId, policyId, layer }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const data = await clientForLayer(ctx, targetLayer).request<{\n detachPolicyFromRole: boolean;\n }>(DETACH_POLICY, { roleId, policyId });\n return jsonResult({ detached: data.detachPolicyFromRole, roleId, policyId });\n } catch (error) {\n ctx.logger.error('rbac_policies_detach failed', { error: String(error) });\n return errorResult(\n `Failed to detach policy: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'rbac_check')),\n {\n title: 'Check Permission',\n description: 'Check whether an actor has permission for an action on a resource.',\n inputSchema: {\n actorId: z.string().describe('Actor id (user/app/service/super_admin)'),\n action: z.string().describe('Action like read/write/delete'),\n resourceType: z.string().describe('Resource type like project/task'),\n actorType: ActorTypeEnum.optional().describe('Actor type (default: USER)'),\n resourceId: z.string().optional().describe('Specific resource id (optional)'),\n scopeId: z.string().optional().describe('Scope id (workspaceId or tenantId)'),\n layer: LayerEnum.optional().describe('workspace or global (default: workspace)'),\n },\n },\n async ({ actorId, action, resourceType, actorType, resourceId, scopeId, layer }) => {\n try {\n const targetLayer: Layer = layer ?? 'workspace';\n const resolvedScope = scopeId ?? defaultScopeId(ctx, targetLayer);\n if (!resolvedScope) {\n return errorResult(\n `No ${targetLayer} scope. Pass scopeId or authenticate to a workspace/organization.`,\n );\n }\n const input: Record<string, unknown> = {\n actorId,\n actorType: actorType ?? 'USER',\n action,\n resourceType,\n scopeId: resolvedScope,\n };\n if (resourceId !== undefined) input.resourceId = resourceId;\n const data = await clientForLayer(ctx, targetLayer).request<{ checkPermission: unknown }>(\n CHECK_PERMISSION,\n { input },\n );\n return jsonResult(data.checkPermission);\n } catch (error) {\n ctx.logger.error('rbac_check failed', { error: String(error) });\n return errorResult(\n `Failed to check permission: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n}\n","/**\n * RBAC module — role-based access control across workspace + global layers.\n *\n * Tools:\n * <product>_rbac_roles_{list,get,create,update,delete}\n * <product>_rbac_check\n *\n * Backend: ~/products/wspace/rbac/wspace-rbac-svc/, ~/products/global/rbac/global-rbac-svc/.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { McpContext, McpModule, ModuleRegistration } from '../../core/index.js';\nimport { registerRbacTools } from './tools.js';\n\nconst rbacModule: McpModule = {\n id: 'rbac',\n version: '0.0.1',\n displayName: 'RBAC',\n dependsOn: ['auth'],\n capabilities: { tools: {} },\n\n register(server: McpServer, ctx: McpContext): ModuleRegistration {\n const tools: string[] = [];\n const track = (n: string): string => {\n tools.push(n);\n return n;\n };\n\n registerRbacTools(server, ctx, track);\n\n return { tools, resources: [], prompts: [] };\n },\n};\n\nexport default rbacModule;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/errors.ts","../../../src/core/result.ts","../../../src/core/tool-name.ts","../../../src/modules/vibecontrols/operations.ts","../../../src/modules/sandbox/tools.ts","../../../src/modules/sandbox/index.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error classes for MCP SDK.\n *\n * Modules MUST throw these instead of throwing raw Errors. The registerTool\n * wrapper in result.ts catches and maps them to MCP-protocol-compliant\n * `{ isError: true, content: [...] }` responses.\n *\n * Throwing past the wrapper to the protocol surfaces as JSON-RPC -32603 to\n * the client and is a protocol bug.\n */\n\nexport class McpUserError extends Error {\n public readonly hint: string | undefined;\n\n constructor(message: string, opts?: { hint?: string }) {\n super(message);\n this.name = 'McpUserError';\n this.hint = opts?.hint;\n }\n}\n\nexport class McpAuthError extends McpUserError {\n constructor(message: string, opts?: { hint?: string }) {\n super(message, {\n hint: opts?.hint ?? 'Run the auth_login tool to authenticate.',\n });\n this.name = 'McpAuthError';\n }\n}\n\nexport class McpInternalError extends Error {\n public override readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'McpInternalError';\n this.cause = cause;\n }\n}\n","/**\n * MCP tool result helpers + central handler.\n *\n * Modules NEVER call server.registerTool directly — they use registerTool()\n * from this module so the central try/catch wraps the handler and:\n * - maps thrown McpUserError / McpAuthError / McpInternalError to\n * MCP-protocol-compliant `{ isError: true, content: [...] }` shapes\n * - threads `_meta.progressToken` into ctx.progress for long ops\n * - emits a structured log line on every error\n * - never leaks `cause` from McpInternalError to the client\n *\n * This is the analog of cli-sdk's createProgram() central error handler.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ZodRawShape } from 'zod';\nimport type { McpContext } from './context.js';\nimport { McpAuthError, McpInternalError, McpUserError } from './errors.js';\n\nexport interface ToolTextContent {\n type: 'text';\n text: string;\n [k: string]: unknown;\n}\n\nexport interface ToolResult {\n content: ToolTextContent[];\n isError?: boolean;\n structuredContent?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\nexport interface ToolMeta {\n progressToken?: string | number;\n}\n\n/**\n * Build a successful tool result with JSON content (pretty-printed).\n */\nexport function jsonResult(data: unknown, structured?: Record<string, unknown>): ToolResult {\n const result: ToolResult = {\n content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],\n };\n if (structured !== undefined) {\n result.structuredContent = structured;\n }\n return result;\n}\n\n/**\n * Build a successful tool result with plain text content.\n */\nexport function textResult(text: string): ToolResult {\n return { content: [{ type: 'text', text }] };\n}\n\n/**\n * Build an error tool result. Honors MCP's `{ isError: true, content }` shape.\n * Optional hint is appended on a new line so the LLM can react.\n */\nexport function errorResult(message: string, hint?: string): ToolResult {\n const text = hint ? `${message}\\n\\nHint: ${hint}` : message;\n return { content: [{ type: 'text', text }], isError: true };\n}\n\nexport interface ToolMetadata {\n title: string;\n description: string;\n inputSchema?: ZodRawShape;\n}\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n ctx: McpContext,\n meta: ToolMeta,\n) => Promise<unknown>;\n\n/**\n * Register a tool with the central error wrapper.\n *\n * The handler returns a plain value or void. The wrapper:\n * - wraps non-undefined returns in jsonResult()\n * - if the value already looks like a ToolResult (has `content`), passes through\n * - catches McpAuthError / McpUserError / McpInternalError / generic Error\n * - logs every error via ctx.logger.error\n */\nexport function registerTool<TArgs extends Record<string, unknown>>(\n server: McpServer,\n ctx: McpContext,\n name: string,\n metadata: ToolMetadata,\n handler: ToolHandler<TArgs>,\n): void {\n const sdkConfig = {\n title: metadata.title,\n description: metadata.description,\n ...(metadata.inputSchema ? { inputSchema: metadata.inputSchema } : {}),\n };\n\n // The MCP SDK's registerTool signature is `(name, config, handler)`. The\n // handler arity depends on whether inputSchema is present (1-arg without,\n // 2-arg with). We accept a unified handler shape and dispatch at runtime.\n // The SDK's typing is strict and conditional on the inputSchema generic;\n // bypass with a cast since runtime acceptance is unconditional.\n const wrapped = async (...callbackArgs: unknown[]): Promise<ToolResult> => {\n const hasArgs = callbackArgs.length === 2;\n const args = (hasArgs ? callbackArgs[0] : {}) as TArgs;\n const extra = (hasArgs ? callbackArgs[1] : callbackArgs[0]) as\n | { _meta?: { progressToken?: string | number } }\n | undefined;\n\n const progressToken = extra?._meta?.progressToken;\n const meta: ToolMeta = progressToken !== undefined ? { progressToken } : {};\n\n try {\n const result = await handler(args, ctx, meta);\n if (isToolResult(result)) return result;\n if (result === undefined) return textResult('OK');\n return jsonResult(result);\n } catch (error) {\n return mapErrorToResult(error, ctx, name);\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (server as any).registerTool(name, sdkConfig, wrapped);\n}\n\nfunction isToolResult(value: unknown): value is ToolResult {\n return (\n !!value &&\n typeof value === 'object' &&\n 'content' in value &&\n Array.isArray((value as ToolResult).content)\n );\n}\n\nfunction mapErrorToResult(error: unknown, ctx: McpContext, toolName: string): ToolResult {\n if (error instanceof McpAuthError) {\n ctx.logger.warn(`${toolName}: auth required`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpUserError) {\n ctx.logger.info(`${toolName}: user error`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpInternalError) {\n ctx.logger.error(`${toolName}: internal error`, {\n message: error.message,\n cause: stringifyCause(error.cause),\n });\n return errorResult(`Internal error in ${toolName}.`);\n }\n const message = error instanceof Error ? error.message : String(error);\n ctx.logger.error(`${toolName}: unhandled error`, { message });\n return errorResult(`${toolName}: ${message}`);\n}\n\nfunction stringifyCause(cause: unknown): string | undefined {\n if (cause === undefined || cause === null) return undefined;\n if (cause instanceof Error) return cause.message;\n try {\n return JSON.stringify(cause);\n } catch {\n return String(cause);\n }\n}\n","/**\n * Tool / resource / prompt naming helpers.\n *\n * Mandatory product prefix avoids collisions when Claude Desktop runs\n * multiple MCP servers concurrently (typical setup is ~6).\n *\n * Tool names are capped at 63 characters — Claude Desktop pre-1.x\n * truncated at 64 in some versions.\n */\n\nimport { McpInternalError } from './errors.js';\n\nconst MAX_TOOL_NAME_LENGTH = 63;\n\nfunction assertSafeName(name: string, kind: 'tool' | 'resource' | 'prompt'): string {\n if (kind === 'tool' && name.length > MAX_TOOL_NAME_LENGTH) {\n throw new McpInternalError(\n `Tool name '${name}' exceeds ${MAX_TOOL_NAME_LENGTH} characters (some MCP clients truncate at 64).`,\n );\n }\n return name;\n}\n\n/**\n * Build a tool name. Format: `<productName>_<...parts>` (snake_case).\n * Example: mcpToolName('vibecontrols', 'vibes', 'list') -> 'vibecontrols_vibes_list'\n */\nexport function mcpToolName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpToolName: productName is required');\n }\n const name = [productName, ...parts].filter(Boolean).join('_');\n return assertSafeName(name, 'tool');\n}\n\n/**\n * Build a resource URI. Format: `<productName>://<...parts>`.\n * Example: mcpResourceUri('vibecontrols', 'schema') -> 'vibecontrols://schema'\n */\nexport function mcpResourceUri(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpResourceUri: productName is required');\n }\n return `${productName}://${parts.filter(Boolean).join('/')}`;\n}\n\n/**\n * Build a prompt name. Format: `<productName>-<...parts>` (kebab-case).\n * Example: mcpPromptName('vibecontrols', 'setup') -> 'vibecontrols-setup'\n */\nexport function mcpPromptName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpPromptName: productName is required');\n }\n return [productName, ...parts].filter(Boolean).join('-');\n}\n\nexport const TOOL_NAME_LIMIT = MAX_TOOL_NAME_LENGTH;\n","/**\n * Centralized GraphQL operations for the VibeControls MCP server.\n * Adapted from vibecontrols-cli/src/graphql/operations.ts with superset field selections.\n * Uses template string interpolation pattern (not gql tagged fragments).\n */\n\n// ---------------------------------------------------------------------------\n// Field Fragments (template string constants for interpolation)\n// ---------------------------------------------------------------------------\n\nexport const AGENT_FIELDS = `\n id name hostname platform architecture version\n tunnelUrl tunnelStatus apiUrl agentApiKey appId appClientId\n capabilities configuration isActive lastHeartbeat metadata\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const VIBE_FIELDS = `\n id name description path type status agentId parentId\n gitBranch gitRemote gitStatus environmentVariables tags metadata\n workspaceId archivedAt createdAt updatedAt deletedAt\n`;\n\nexport const SESSION_FIELDS = `\n id name command workingDirectory type status agentId vibeId\n providerSessionName providerWindowId providerPaneId pid exitCode ttydUrl lastOutput\n autoStart environmentVariables metadata startedAt stoppedAt\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const NOTE_FIELDS = `\n id title content tags isPinned vibeId createdBy metadata\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const CONFIG_FIELDS = `\n id key value scope scopeId isSecret\n workspaceId createdAt updatedAt\n`;\n\nexport const WEBHOOK_FIELDS = `\n id name url events agentIds isActive signingKey retryPolicy\n deliveryCount failureCount lastDelivery lastError\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const UI_SESSION_FIELDS = `\n id userId state activeVibeId activeSessionId\n recentVibes recentSessions workspaceId createdAt updatedAt\n`;\n\nexport const TUNNEL_FIELDS = `\n id agentId sessionId localPort publicUrl status isPrimary errorMessage createdAt agentName\n`;\n\nexport const TARGET_FIELDS = `\n id name type host port username status\n workspaceId createdAt updatedAt\n`;\n\nexport const AGENT_CONNECTION_FIELDS = `\n id sourceAgentId targetId protocol status permissions\n createdAt updatedAt\n`;\n\nexport const VIBEDECK_FIELDS = `\n id name description isDefault\n workspaceId createdAt updatedAt\n`;\n\nexport const VIBEDECK_BUTTON_FIELDS = `\n id vibeDeckId label icon actionType actionId\n action { id name actionType }\n command script webhookUrl\n row column color category tags\n confirmationRequired keyboardShortcut style sortOrder\n createdAt updatedAt\n`;\n\nexport const AI_TOOL_EVENT_FIELDS = `\n id source eventType payload agentId\n workspaceId createdAt\n`;\n\nexport const DOCS_SITE_FIELDS = `\n id vibeId name visibility runtime\n workspaceId createdAt updatedAt\n`;\n\nexport const DOCS_PAGE_FIELDS = `\n id siteId title slug content parentId sidebarPosition status\n createdAt updatedAt\n`;\n\nexport const DOCS_REVISION_FIELDS = `\n id siteId revisionNumber status buildDurationMs artifactSizeBytes\n errorMessage publishedAt\n createdAt updatedAt\n`;\n\nexport const AUDIT_LOG_FIELDS = `\n id action resourceType resourceId actorId actorType\n status description ipAddress userAgent requestId\n workspaceId createdAt\n`;\n\nexport const SESSION_SHARE_FIELDS = `\n id sessionId sharedWithId permission status message\n createdBy createdAt expiresAt lastAccessAt accessCount revokedAt revokedBy\n`;\n\nexport const SESSION_SHARE_LINK_FIELDS = `\n id sessionId token permission expiresAt\n createdAt\n`;\n\n// ---------------------------------------------------------------------------\n// Agent Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_AGENTS = `\n query VibecontrolsAgents($filter: VibecontrolsAgentFilterInput) {\n vibecontrolsAgents(filter: $filter) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const GET_AGENT = `\n query VibecontrolsAgent($id: ID!) {\n vibecontrolsAgent(id: $id) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const CREATE_AGENT = `\n mutation CreateVibecontrolsAgent($input: CreateVibecontrolsAgentInput!) {\n createVibecontrolsAgent(input: $input) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const UPDATE_AGENT = `\n mutation UpdateVibecontrolsAgent($id: ID!, $input: UpdateVibecontrolsAgentInput!) {\n updateVibecontrolsAgent(id: $id, input: $input) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const DELETE_AGENT = `\n mutation DeleteVibecontrolsAgent($id: ID!) {\n deleteVibecontrolsAgent(id: $id)\n }\n`;\n\nexport const PROBE_AGENT_CONNECTION = `\n query ProbeAgentConnection($id: ID!) {\n probeAgentConnection(id: $id) {\n agentId reachable latencyMs error version tunnelUrl\n }\n }\n`;\n\nexport const AGENT_HEALTH_PROBES = `\n query VibecontrolsAgentHealthProbes {\n vibecontrolsAgentHealthProbes {\n agentId agentName healthy agentVersion errorMessage tunnelUrl uptime\n }\n }\n`;\n\nexport const AGENT_PLUGINS = `\n query AgentPlugins($agentId: ID!) {\n agentPlugins(agentId: $agentId) {\n agentId\n plugins {\n name packageName version description isActive tags metadata\n }\n total\n }\n }\n`;\n\nexport const INSTALL_AGENT_PLUGIN = `\n mutation InstallAgentPlugin($agentId: ID!, $packageName: String!) {\n installAgentPlugin(agentId: $agentId, packageName: $packageName) {\n success message\n plugin { name packageName version description isActive tags metadata }\n }\n }\n`;\n\nexport const REMOVE_AGENT_PLUGIN = `\n mutation RemoveAgentPlugin($agentId: ID!, $packageName: String!) {\n removeAgentPlugin(agentId: $agentId, packageName: $packageName) {\n success message\n plugin { name packageName version description isActive tags metadata }\n }\n }\n`;\n\nexport const AGENT_HEARTBEAT = `\n mutation VibecontrolsAgentHeartbeat($id: ID!) {\n vibecontrolsAgentHeartbeat(id: $id) { id isActive lastHeartbeat }\n }\n`;\n\nexport const DEACTIVATE_AGENT = `\n mutation DeactivateVibecontrolsAgent($id: ID!) {\n deactivateVibecontrolsAgent(id: $id) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const AGENT_GRAPH = `\n query AgentGraph($workspaceId: ID!, $rootAgentId: ID) {\n agentGraph(workspaceId: $workspaceId, rootAgentId: $rootAgentId) {\n agents { ${AGENT_FIELDS} }\n connections { ${AGENT_CONNECTION_FIELDS} }\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Vibe Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_VIBES = `\n query Vibes($filter: VibeFilterInput, $pagination: PaginationInput) {\n vibes(filter: $filter, pagination: $pagination) {\n items { ${VIBE_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_VIBE = `\n query Vibe($id: ID!) {\n vibe(id: $id) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const CREATE_VIBE = `\n mutation CreateVibe($input: CreateVibeInput!) {\n createVibe(input: $input) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE = `\n mutation UpdateVibe($id: ID!, $input: UpdateVibeInput!) {\n updateVibe(id: $id, input: $input) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const DELETE_VIBE = `\n mutation DeleteVibe($id: ID!) { deleteVibe(id: $id) }\n`;\n\nexport const ARCHIVE_VIBE = `\n mutation ArchiveVibe($id: ID!) {\n archiveVibe(id: $id) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const RESTORE_VIBE = `\n mutation RestoreVibe($id: ID!) {\n restoreVibe(id: $id) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const MOVE_VIBE = `\n mutation MoveVibe($id: ID!, $newParentId: ID) {\n moveVibe(id: $id, newParentId: $newParentId) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE_STATUS = `\n mutation UpdateVibeStatus($id: ID!, $status: VibeStatus!) {\n updateVibeStatus(id: $id, status: $status) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const VIBE_HIERARCHY = `\n query VibeHierarchy($rootId: ID) {\n vibeHierarchy(rootId: $rootId) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const SEARCH_VIBES = `\n query SearchVibes($query: String!, $limit: Int) {\n searchVibes(query: $query, limit: $limit) { ${VIBE_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Session Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_SESSIONS = `\n query Sessions($filter: SessionFilterInput, $pagination: PaginationInput) {\n sessions(filter: $filter, pagination: $pagination) {\n items { ${SESSION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_SESSION = `\n query Session($id: ID!) {\n session(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const CREATE_SESSION = `\n mutation CreateSession($input: CreateSessionInput!) {\n createSession(input: $input) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const START_SESSION = `\n mutation StartSession($id: ID!) {\n startSession(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const STOP_SESSION = `\n mutation StopSession($id: ID!) {\n stopSession(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const RESTART_SESSION = `\n mutation RestartSession($id: ID!) {\n restartSession(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const TERMINATE_SESSION = `\n mutation TerminateSession($id: ID!) {\n terminateSession(id: $id)\n }\n`;\n\nexport const SEND_SESSION_INPUT = `\n mutation SendSessionInput($id: ID!, $input: String!) {\n sendSessionInput(id: $id, input: $input)\n }\n`;\n\nexport const START_SESSION_TERMINAL = `\n mutation StartSessionTerminal($id: ID!) {\n startSessionTerminal(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const SESSION_OUTPUT = `\n query SessionOutput($id: ID!, $lines: Int) {\n sessionOutput(id: $id, lines: $lines)\n }\n`;\n\nexport const ACTIVE_SESSIONS = `\n query ActiveSessions($vibeId: ID) {\n activeSessions(vibeId: $vibeId) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const CHECK_SESSION_HEALTH = `\n mutation CheckSessionHealth {\n checkSessionHealth { checked updated errors }\n }\n`;\n\nexport const BULK_RESTART_SESSIONS = `\n mutation BulkRestartSessions($ids: [ID!]!) {\n bulkRestartSessions(ids: $ids) { succeeded failed }\n }\n`;\n\nexport const BULK_STOP_SESSIONS = `\n mutation BulkStopSessions($ids: [ID!]!) {\n bulkStopSessions(ids: $ids) { succeeded failed }\n }\n`;\n\nexport const BULK_TERMINATE_SESSIONS = `\n mutation BulkTerminateSessions($ids: [ID!]!) {\n bulkTerminateSessions(ids: $ids) { succeeded failed }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Session Sharing Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const SHARE_SESSION = `\n mutation ShareSession($input: ShareSessionInput!) {\n shareSession(input: $input) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const CREATE_SESSION_SHARE_LINK = `\n mutation CreateSessionShareLink($input: CreateSessionShareLinkInput!) {\n createSessionShareLink(input: $input) { ${SESSION_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const REVOKE_SESSION_SHARE = `\n mutation RevokeSessionShare($id: ID!) {\n revokeSessionShare(id: $id) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const REVOKE_SESSION_SHARE_LINK = `\n mutation RevokeSessionShareLink($id: ID!) {\n revokeSessionShareLink(id: $id) { ${SESSION_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const SESSION_SHARES = `\n query SessionShares($sessionId: ID!) {\n sessionShares(sessionId: $sessionId) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const SESSION_SHARE_LINKS = `\n query SessionShareLinks($sessionId: ID!) {\n sessionShareLinks(sessionId: $sessionId) { ${SESSION_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const SESSION_COLLABORATORS = `\n query SessionCollaborators($sessionId: ID!) {\n sessionCollaborators(sessionId: $sessionId) { userId hasControl joinedAt }\n }\n`;\n\nexport const SESSIONS_SHARED_WITH_ME = `\n query SessionsSharedWithMe($filter: SharedWithMeFilterInput, $pagination: PaginationInput) {\n sessionsSharedWithMe(filter: $filter, pagination: $pagination) {\n totalCount\n edges {\n cursor\n node { ${SESSION_SHARE_FIELDS} }\n }\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Note Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_NOTES = `\n query Notes($filter: VibecontrolsNoteFilterInput, $pagination: PaginationInput) {\n notes(filter: $filter, pagination: $pagination) {\n items { ${NOTE_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_NOTE = `\n query Note($id: ID!) {\n note(id: $id) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const CREATE_NOTE = `\n mutation CreateNote($input: CreateVibecontrolsNoteInput!) {\n createNote(input: $input) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const UPDATE_NOTE = `\n mutation UpdateNote($id: ID!, $input: UpdateVibecontrolsNoteInput!) {\n updateNote(id: $id, input: $input) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const DELETE_NOTE = `\n mutation DeleteNote($id: ID!) { deleteNote(id: $id) }\n`;\n\nexport const SEARCH_NOTES = `\n query SearchNotes($query: String!, $vibeId: ID, $limit: Int) {\n searchNotes(query: $query, vibeId: $vibeId, limit: $limit) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const PIN_NOTE = `\n mutation PinNote($id: ID!) {\n pinNote(id: $id) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const UNPIN_NOTE = `\n mutation UnpinNote($id: ID!) {\n unpinNote(id: $id) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const PINNED_NOTES = `\n query PinnedNotes($vibeId: ID) {\n pinnedNotes(vibeId: $vibeId) { ${NOTE_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Configuration Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_CONFIGURATIONS = `\n query Configurations($filter: ConfigurationFilterInput!, $pagination: PaginationInput) {\n configurations(filter: $filter, pagination: $pagination) {\n items { ${CONFIG_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_CONFIGURATION = `\n query Configuration($key: String!, $scope: ConfigScope!, $scopeId: String) {\n configuration(key: $key, scope: $scope, scopeId: $scopeId) { ${CONFIG_FIELDS} }\n }\n`;\n\nexport const CONFIGURATIONS_BY_SCOPE = `\n query ConfigurationsByScope($scope: ConfigScope!, $scopeId: String) {\n configurationsByScope(scope: $scope, scopeId: $scopeId) { ${CONFIG_FIELDS} }\n }\n`;\n\nexport const SET_CONFIGURATION = `\n mutation SetConfiguration($key: String!, $scope: ConfigScope!, $scopeId: ID, $value: JSON!, $isSecret: Boolean) {\n setConfiguration(key: $key, scope: $scope, scopeId: $scopeId, value: $value, isSecret: $isSecret) { ${CONFIG_FIELDS} }\n }\n`;\n\nexport const DELETE_CONFIGURATION = `\n mutation DeleteConfiguration($key: String!, $scope: ConfigScope!, $scopeId: String) {\n deleteConfiguration(key: $key, scope: $scope, scopeId: $scopeId)\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Webhook Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_WEBHOOKS = `\n query Webhooks($filter: WebhookFilterInput, $pagination: PaginationInput) {\n webhooks(filter: $filter, pagination: $pagination) {\n items { ${WEBHOOK_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_WEBHOOK = `\n query Webhook($id: ID!) {\n webhook(id: $id) { ${WEBHOOK_FIELDS} }\n }\n`;\n\nexport const CREATE_WEBHOOK = `\n mutation CreateWebhook($input: CreateWebhookInput!) {\n createWebhook(input: $input) { ${WEBHOOK_FIELDS} }\n }\n`;\n\nexport const UPDATE_WEBHOOK = `\n mutation UpdateWebhook($id: ID!, $input: UpdateWebhookInput!) {\n updateWebhook(id: $id, input: $input) { ${WEBHOOK_FIELDS} }\n }\n`;\n\nexport const DELETE_WEBHOOK = `\n mutation DeleteWebhook($id: ID!) { deleteWebhook(id: $id) }\n`;\n\nexport const TEST_WEBHOOK = `\n mutation TestWebhook($id: ID!) { testWebhook(id: $id) }\n`;\n\nexport const TRIGGER_WEBHOOK = `\n mutation TriggerWebhook($id: ID!, $payload: JSON) {\n triggerWebhook(id: $id, payload: $payload)\n }\n`;\n\nexport const RESET_WEBHOOK_FAILURES = `\n mutation ResetWebhookFailures($id: ID!) {\n resetWebhookFailures(id: $id) { ${WEBHOOK_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Tunnel Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_TUNNELS = `\n query VibecontrolsAgentTunnels {\n vibecontrolsAgentTunnels {\n tunnels { ${TUNNEL_FIELDS} }\n agentStatuses { agentId agentName connected errorMessage tunnelUrl }\n error\n }\n }\n`;\n\nexport const CREATE_TUNNEL = `\n mutation CreateAgentTunnel($input: CreateAgentTunnelInput!) {\n createAgentTunnel(input: $input) { ${TUNNEL_FIELDS} }\n }\n`;\n\nexport const STOP_TUNNEL = `\n mutation StopAgentTunnel($agentId: ID!, $tunnelId: ID!) {\n stopAgentTunnel(agentId: $agentId, tunnelId: $tunnelId)\n }\n`;\n\nexport const DELETE_TUNNEL = `\n mutation DeleteAgentTunnel($agentId: ID!, $tunnelId: ID!) {\n deleteAgentTunnel(agentId: $agentId, tunnelId: $tunnelId)\n }\n`;\n\n// ---------------------------------------------------------------------------\n// UI Session Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const GET_UI_SESSION = `\n query { uiSession { ${UI_SESSION_FIELDS} } }\n`;\n\nexport const SAVE_UI_SESSION = `\n mutation SaveUISession($input: SaveUISessionInput!) {\n saveUISession(input: $input) { ${UI_SESSION_FIELDS} }\n }\n`;\n\nexport const CLEAR_UI_SESSION = `\n mutation { clearUISession }\n`;\n\n// ---------------------------------------------------------------------------\n// AI Tool Event Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_AI_TOOL_EVENTS = `\n query AiToolEvents($filter: AiToolEventFilterInput, $pagination: PaginationInput) {\n aiToolEvents(filter: $filter, pagination: $pagination) {\n items { ${AI_TOOL_EVENT_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const RECENT_AI_TOOL_EVENTS = `\n query RecentAiToolEvents($agentId: ID!, $limit: Int) {\n recentAiToolEvents(agentId: $agentId, limit: $limit) { ${AI_TOOL_EVENT_FIELDS} }\n }\n`;\n\nexport const CREATE_AI_TOOL_EVENT = `\n mutation CreateAiToolEvent($input: CreateAiToolEventInput!) {\n createAiToolEvent(input: $input) { ${AI_TOOL_EVENT_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Target Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_TARGETS = `\n query Targets($workspaceId: ID!, $filter: TargetFilterInput, $limit: Int, $offset: Int) {\n targets(workspaceId: $workspaceId, filter: $filter, limit: $limit, offset: $offset) {\n items { ${TARGET_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_TARGET = `\n query Target($id: ID!) {\n target(id: $id) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const CREATE_TARGET = `\n mutation CreateTarget($workspaceId: ID!, $input: CreateTargetInput!) {\n createTarget(workspaceId: $workspaceId, input: $input) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const UPDATE_TARGET = `\n mutation UpdateTarget($id: ID!, $input: UpdateTargetInput!) {\n updateTarget(id: $id, input: $input) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const DELETE_TARGET = `\n mutation DeleteTarget($id: ID!) { deleteTarget(id: $id) }\n`;\n\nexport const TEST_TARGET = `\n query TestTarget($id: ID!) {\n testTarget(id: $id) { success error latencyMs }\n }\n`;\n\nexport const IMPORT_TARGETS_FROM_CONFIG = `\n mutation ImportTargetsFromConfig($agentId: ID!, $hosts: [ConfigHostInput!]!, $workspaceId: ID!) {\n importTargetsFromConfig(agentId: $agentId, hosts: $hosts, workspaceId: $workspaceId) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const SCAN_SSH_CONFIG = `\n mutation ScanSSHConfig($agentId: ID!, $configPath: String) {\n scanSSHConfig(agentId: $agentId, configPath: $configPath) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const INSTALL_AGENT_ON_TARGET = `\n mutation InstallAgentOnTarget($sourceAgentId: ID!, $targetId: ID!, $agentPort: Int) {\n installAgentOnTarget(sourceAgentId: $sourceAgentId, targetId: $targetId, agentPort: $agentPort) { success error }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// VibeDeck Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_VIBEDECKS = `\n query VibeDecks($filter: VibeDeckFilterInput, $pagination: PaginationInput) {\n vibeDecks(filter: $filter, pagination: $pagination) {\n items { ${VIBEDECK_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_VIBEDECK = `\n query VibeDeck($id: ID!) {\n vibeDeck(id: $id) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const DEFAULT_VIBEDECK = `\n query { defaultVibeDeck { ${VIBEDECK_FIELDS} } }\n`;\n\nexport const CREATE_VIBEDECK = `\n mutation CreateVibeDeck($input: CreateVibeDeckInput!) {\n createVibeDeck(input: $input) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBEDECK = `\n mutation UpdateVibeDeck($id: ID!, $input: UpdateVibeDeckInput!) {\n updateVibeDeck(id: $id, input: $input) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const DELETE_VIBEDECK = `\n mutation DeleteVibeDeck($id: ID!) { deleteVibeDeck(id: $id) }\n`;\n\nexport const DUPLICATE_VIBEDECK = `\n mutation DuplicateVibeDeck($id: ID!, $name: String) {\n duplicateVibeDeck(id: $id, name: $name) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const SET_DEFAULT_VIBEDECK = `\n mutation SetDefaultVibeDeck($id: ID!) {\n setDefaultVibeDeck(id: $id) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const LIST_VIBEDECK_BUTTONS = `\n query VibeDeckButtons($filter: VibeDeckButtonFilterInput, $pagination: PaginationInput) {\n vibeDeckButtons(filter: $filter, pagination: $pagination) {\n items { ${VIBEDECK_BUTTON_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_VIBEDECK_BUTTON = `\n query VibeDeckButton($id: ID!) {\n vibeDeckButton(id: $id) { ${VIBEDECK_BUTTON_FIELDS} }\n }\n`;\n\nexport const CREATE_VIBEDECK_BUTTON = `\n mutation CreateVibeDeckButton($input: CreateVibeDeckButtonInput!) {\n createVibeDeckButton(input: $input) { ${VIBEDECK_BUTTON_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBEDECK_BUTTON = `\n mutation UpdateVibeDeckButton($id: ID!, $input: UpdateVibeDeckButtonInput!) {\n updateVibeDeckButton(id: $id, input: $input) { ${VIBEDECK_BUTTON_FIELDS} }\n }\n`;\n\nexport const DELETE_VIBEDECK_BUTTON = `\n mutation DeleteVibeDeckButton($id: ID!) { deleteVibeDeckButton(id: $id) }\n`;\n\nexport const EXECUTE_VIBEDECK_BUTTON = `\n mutation ExecuteVibeDeckButton($id: ID!, $agentId: ID!) {\n executeVibeDeckButton(id: $id, agentId: $agentId) { success output error }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Action Field Fragments\n// ---------------------------------------------------------------------------\n\nexport const ACTION_FIELDS = `\n id name description actionType sourceType triggerType\n command script webhookUrl workflowDefinition\n tags storeItemId storeVersion metadata\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const ACTION_EXECUTION_FIELDS = `\n id actionId status input output error\n startedAt completedAt durationMs triggeredBy metadata\n workspaceId createdAt updatedAt\n`;\n\n// ---------------------------------------------------------------------------\n// Action Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_ACTIONS = `\n query Actions($filter: ActionFilterInput, $pagination: PaginationInput) {\n actions(filter: $filter, pagination: $pagination) {\n items { ${ACTION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_ACTION = `\n query Action($id: ID!) {\n action(id: $id) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const CREATE_ACTION = `\n mutation CreateAction($input: CreateActionInput!) {\n createAction(input: $input) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const UPDATE_ACTION = `\n mutation UpdateAction($id: ID!, $input: UpdateActionInput!) {\n updateAction(id: $id, input: $input) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const DELETE_ACTION = `\n mutation DeleteAction($id: ID!) { deleteAction(id: $id) }\n`;\n\nexport const DUPLICATE_ACTION = `\n mutation DuplicateAction($id: ID!, $name: String) {\n duplicateAction(id: $id, name: $name) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const EXECUTE_ACTION = `\n mutation ExecuteAction($id: ID!, $input: ExecuteActionInput) {\n executeAction(id: $id, input: $input) { ${ACTION_EXECUTION_FIELDS} }\n }\n`;\n\nexport const INSTALL_ACTION_FROM_STORE = `\n mutation InstallActionFromStore($storeItemId: String!, $version: String, $name: String) {\n installActionFromStore(storeItemId: $storeItemId, version: $version, name: $name) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const CANCEL_ACTION_EXECUTION = `\n mutation CancelActionExecution($id: ID!) {\n cancelActionExecution(id: $id) { ${ACTION_EXECUTION_FIELDS} }\n }\n`;\n\nexport const LIST_ACTION_EXECUTIONS = `\n query ActionExecutions($filter: ActionExecutionFilterInput, $pagination: PaginationInput) {\n actionExecutions(filter: $filter, pagination: $pagination) {\n items { ${ACTION_EXECUTION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_ACTION_EXECUTION = `\n query ActionExecution($id: ID!) {\n actionExecution(id: $id) { ${ACTION_EXECUTION_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Scheduled Job Field Fragments\n// ---------------------------------------------------------------------------\n\nexport const SCHEDULED_JOB_FIELDS = `\n id name scheduleType status actionId\n cronExpression timezone scheduledAt\n interval intervalUnit startDate endDate\n nextExecutionAt lastExecutionAt\n priority tags\n`;\n\n// ---------------------------------------------------------------------------\n// Scheduled Job Queries / Mutations (wspace-scheduler-svc via gateway)\n// ---------------------------------------------------------------------------\n\nexport const CREATE_SCHEDULED_JOB = `\n mutation CreateScheduledJob($workspaceId: ID!, $input: CreateScheduledJobInput!) {\n createScheduledJob(workspaceId: $workspaceId, input: $input) { ${SCHEDULED_JOB_FIELDS} }\n }\n`;\n\nexport const DELETE_SCHEDULED_JOB = `\n mutation DeleteScheduledJob($id: ID!) { deleteScheduledJob(id: $id) }\n`;\n\nexport const LIST_SCHEDULED_JOBS = `\n query ScheduledJobs($workspaceId: ID!, $filter: JobFilterInput, $pagination: SchedulerPaginationInput) {\n scheduledJobs(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n jobs { ${SCHEDULED_JOB_FIELDS} }\n total hasMore\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Docs Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_DOCS_SITES = `\n query DocsSites($filter: VibecontrolsDocsSiteFilterInput, $pagination: PaginationInput) {\n docsSites(filter: $filter, pagination: $pagination) {\n items { ${DOCS_SITE_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_DOCS_SITE = `\n query DocsSite($vibeId: ID!) {\n docsSite(vibeId: $vibeId) { ${DOCS_SITE_FIELDS} }\n }\n`;\n\nexport const CREATE_DOCS_SITE = `\n mutation CreateDocsSite($input: CreateVibecontrolsDocsSiteInput!) {\n createDocsSite(input: $input) { ${DOCS_SITE_FIELDS} }\n }\n`;\n\nexport const UPDATE_DOCS_SITE = `\n mutation UpdateDocsSite($id: ID!, $input: UpdateVibecontrolsDocsSiteInput!) {\n updateDocsSite(id: $id, input: $input) { ${DOCS_SITE_FIELDS} }\n }\n`;\n\nexport const DELETE_DOCS_SITE = `\n mutation DeleteDocsSite($id: ID!) { deleteDocsSite(id: $id) }\n`;\n\nexport const LIST_DOCS_PAGES = `\n query DocsPages($siteId: ID!, $filter: VibecontrolsDocsPageFilterInput) {\n docsPages(siteId: $siteId, filter: $filter) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const GET_DOCS_PAGE = `\n query DocsPage($id: ID!) {\n docsPage(id: $id) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const CREATE_DOCS_PAGE = `\n mutation CreateDocsPage($input: CreateVibecontrolsDocsPageInput!) {\n createDocsPage(input: $input) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const UPDATE_DOCS_PAGE = `\n mutation UpdateDocsPage($id: ID!, $input: UpdateVibecontrolsDocsPageInput!) {\n updateDocsPage(id: $id, input: $input) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const DELETE_DOCS_PAGE = `\n mutation DeleteDocsPage($id: ID!) { deleteDocsPage(id: $id) }\n`;\n\nexport const LIST_DOCS_REVISIONS = `\n query DocsRevisions($siteId: ID!, $pagination: PaginationInput) {\n docsRevisions(siteId: $siteId, pagination: $pagination) {\n items { ${DOCS_REVISION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const COMPILE_DOCS_SITE = `\n mutation CompileDocsSite($siteId: ID!, $publish: Boolean) {\n compileDocsSite(siteId: $siteId, publish: $publish) { ${DOCS_REVISION_FIELDS} }\n }\n`;\n\nexport const PUBLISH_DOCS_REVISION = `\n mutation PublishDocsRevision($revisionId: ID!) {\n publishDocsRevision(revisionId: $revisionId) { ${DOCS_REVISION_FIELDS} }\n }\n`;\n\nexport const ROLLBACK_DOCS_REVISION = `\n mutation RollbackDocsRevision($siteId: ID!, $revisionId: ID!) {\n rollbackDocsRevision(siteId: $siteId, revisionId: $revisionId) { ${DOCS_REVISION_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Audit Log Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_AUDIT_LOGS = `\n query VibeAuditLogs($filter: VibeAuditLogFilterInput, $pagination: PaginationInput) {\n vibeAuditLogs(filter: $filter, pagination: $pagination) {\n items { ${AUDIT_LOG_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_AUDIT_LOG = `\n query VibeAuditLog($id: ID!) {\n vibeAuditLog(id: $id) { ${AUDIT_LOG_FIELDS} }\n }\n`;\n\nexport const AUDIT_LOG_STATS = `\n query VibeAuditLogStats($filter: VibeAuditLogFilterInput) {\n vibeAuditLogStats(filter: $filter) {\n totalLogs\n logsByAction { action count }\n logsByResourceType { resourceType count }\n logsByStatus { status count }\n }\n }\n`;\n\nexport const EXPORT_AUDIT_LOGS = `\n mutation ExportVibeAuditLogs($filter: VibeAuditLogFilterInput, $format: String) {\n exportVibeAuditLogs(filter: $filter, format: $format)\n }\n`;\n\nexport const DELETE_AUDIT_LOG = `\n mutation DeleteVibeAuditLog($id: ID!, $reason: String) {\n deleteVibeAuditLog(id: $id, reason: $reason)\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Auth Operations (Global Gateway)\n// ---------------------------------------------------------------------------\n\nexport const MY_WORKSPACES = `\n query MyWorkspaces($limit: Int) {\n myWorkspaces(limit: $limit) {\n items { id name slug tenantId organizationId }\n }\n }\n`;\n\nexport const ISSUE_WORKSPACE_TOKEN = `\n mutation IssueWorkspaceToken($input: IssueWorkspaceTokenInput!) {\n issueWorkspaceToken(input: $input) {\n success token expiresAt scopes\n error { code message }\n }\n }\n`;\n\nexport const REFRESH_TOKEN = `\n mutation RefreshToken($token: String!) {\n refreshToken(token: $token) { accessToken refreshToken expiresIn }\n }\n`;\n\nexport const SIGN_OUT = `mutation { signOut }`;\n\n// ---------------------------------------------------------------------------\n// Analytics\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Sandbox Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const SANDBOX_FIELDS = `\n id name description template mode status\n crdName podName namespace runtimeClass\n containers { name image ports { containerPort name protocol } env { name value } command args resources { requestsCpu requestsMemory limitsCpu limitsMemory } }\n containerStatuses { name ready port restartCount }\n resources { cpuRequest cpuLimit memoryRequest memoryLimit }\n storage { mode sizeGi mountPath retainOnDelete }\n network { exposeService internalUrl containerUrls serviceName }\n ttlSeconds expiresAt metadata errorMessage\n workspaceId createdBy createdAt updatedAt stoppedAt\n`;\n\nexport const LIST_SANDBOXES = `\n query ListSandboxes($filter: SandboxFilterInput, $pagination: SandboxPaginationInput, $context: ContextInput!) {\n listSandboxes(filter: $filter, pagination: $pagination, context: $context) {\n items { ${SANDBOX_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_SANDBOX = `\n query GetSandbox($id: ID!, $context: ContextInput!) {\n getSandbox(id: $id, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const CREATE_SANDBOX = `\n mutation CreateSandbox($input: CreateSandboxInput!) {\n createSandbox(input: $input) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const DELETE_SANDBOX = `\n mutation DeleteSandbox($id: ID!, $context: ContextInput!) {\n deleteSandbox(id: $id, context: $context)\n }\n`;\n\nexport const STOP_SANDBOX = `\n mutation StopSandbox($id: ID!, $context: ContextInput!) {\n stopSandbox(id: $id, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const EXTEND_SANDBOX_TTL = `\n mutation ExtendSandboxTTL($id: ID!, $additionalSeconds: Int!, $context: ContextInput!) {\n extendSandboxTTL(id: $id, additionalSeconds: $additionalSeconds, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Analytics\n// ---------------------------------------------------------------------------\n\nexport const VIBECONTROLS_ANALYTICS = `\n query VibecontrolsAnalytics($input: VibecontrolsAnalyticsInput!) {\n vibecontrolsAnalytics(input: $input) {\n agents { total active inactive staleHeartbeatCount byPlatform { key count } byArchitecture { key count } createdOverTime { timestamp value } }\n targets { total connectionCount byType { key count } byStatus { key count } }\n sessions { total active avgDurationMs totalCollaborators totalShares totalShareLinks byType { key count } byStatus { key count } createdOverTime { timestamp value } }\n vibes { total withAgent withoutAgent byType { key count } byStatus { key count } createdOverTime { timestamp value } }\n actions { total totalExecutions successRate avgDurationMs byActionType { key count } byTriggerType { key count } bySourceType { key count } executionsByStatus { key count } executionsOverTime { timestamp value } }\n webhooks { total active inactive totalDeliveries totalFailures deliverySuccessRate }\n aiEvents { total bySource { key count } byEventType { key count } eventsOverTime { timestamp value } }\n vibeDecks { totalDecks totalButtons buttonsByActionType { key count } }\n audit { total byAction { key count } byResourceType { key count } byStatus { key count } eventsOverTime { timestamp value } }\n docs { totalSites totalPages totalRevisions buildSuccessRate totalBuildImages pagesByStatus { key count } revisionsByStatus { key count } }\n notes { total pinned unpinned createdOverTime { timestamp value } }\n configurations { total secretCount byScope { key count } }\n executionTimeMs\n cached\n }\n }\n`;\n","import { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { jsonResult, errorResult, mcpToolName, type McpContext } from '../../core/index.js';\nimport {\n LIST_SANDBOXES,\n GET_SANDBOX,\n CREATE_SANDBOX,\n DELETE_SANDBOX,\n STOP_SANDBOX,\n EXTEND_SANDBOX_TTL,\n} from '../vibecontrols/operations.js';\n\nexport function registerSandboxTools(\n server: McpServer,\n ctx: McpContext,\n track: (n: string) => string,\n): void {\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_list')),\n {\n title: 'List Sandboxes',\n description: 'List Kubernetes-native sandboxes with optional filters and pagination.',\n inputSchema: {\n status: z\n .string()\n .optional()\n .describe(\n 'Filter by status (PENDING, PROVISIONING, RUNNING, STOPPING, STOPPED, EXPIRED, FAILED)',\n ),\n template: z\n .string()\n .optional()\n .describe(\n 'Filter by template (VIBECONTROLS, AI_BUILDER, WORKFLOW_MULTI_NODE, MISC_SHELL, CUSTOM)',\n ),\n limit: z.number().optional().describe('Max results'),\n offset: z.number().optional().describe('Skip results'),\n },\n },\n async ({ status, template, limit, offset }) => {\n try {\n const filter: Record<string, unknown> = {};\n if (status !== undefined) filter.status = status;\n if (template !== undefined) filter.template = template;\n\n const pagination: Record<string, unknown> = {};\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n\n const data = await ctx.gql.workspace.request<{ listSandboxes: unknown }>(LIST_SANDBOXES, {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n pagination: Object.keys(pagination).length > 0 ? pagination : undefined,\n });\n return jsonResult(data.listSandboxes);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_list failed', { error });\n return errorResult(\n `Failed to list sandboxes: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_get')),\n {\n title: 'Get Sandbox',\n description: 'Get a sandbox by its ID.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandbox: unknown }>(GET_SANDBOX, { id });\n return jsonResult(data.getSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_get failed', { error });\n return errorResult(\n `Failed to get sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_create')),\n {\n title: 'Create Sandbox',\n description:\n 'Create a new Kubernetes-native sandbox environment with Kata Containers isolation.',\n inputSchema: {\n name: z.string().describe('Sandbox name'),\n template: z\n .enum(['VIBECONTROLS', 'AI_BUILDER', 'WORKFLOW_MULTI_NODE', 'MISC_SHELL', 'CUSTOM'])\n .describe('Sandbox template type'),\n mode: z\n .enum(['DEPLOYMENT', 'JOB'])\n .optional()\n .describe('Run mode: DEPLOYMENT (long-running) or JOB (run-to-completion)'),\n containers: z\n .array(\n z.object({\n name: z.string().describe('Container name'),\n image: z.string().describe('Container image'),\n ports: z\n .array(\n z.object({\n containerPort: z.number().describe('Container port'),\n name: z.string().optional().describe('Port name'),\n protocol: z.string().optional().describe('Protocol (TCP, UDP)'),\n }),\n )\n .optional()\n .describe('Exposed ports'),\n env: z\n .array(\n z.object({\n name: z.string().describe('Env var name'),\n value: z.string().describe('Env var value'),\n }),\n )\n .optional()\n .describe('Environment variables'),\n command: z.array(z.string()).optional().describe('Container entrypoint command'),\n args: z.array(z.string()).optional().describe('Container arguments'),\n }),\n )\n .optional()\n .describe('Container specifications (uses template defaults if omitted)'),\n ttlSeconds: z.number().optional().describe('Time-to-live in seconds'),\n resources: z\n .object({\n cpuRequest: z.string().optional(),\n cpuLimit: z.string().optional(),\n memoryRequest: z.string().optional(),\n memoryLimit: z.string().optional(),\n })\n .optional()\n .describe('Resource requests/limits'),\n description: z.string().optional().describe('Sandbox description'),\n templateId: z.string().optional().describe('Sandbox template config ID to use'),\n },\n },\n async ({\n name,\n template,\n mode,\n containers,\n ttlSeconds,\n resources,\n description,\n templateId,\n }) => {\n try {\n const input: Record<string, unknown> = { name, template };\n if (mode !== undefined) input.mode = mode;\n if (containers !== undefined) input.containers = containers;\n if (ttlSeconds !== undefined) input.ttlSeconds = ttlSeconds;\n if (resources !== undefined) input.resources = resources;\n if (description !== undefined) input.description = description;\n if (templateId !== undefined) input.templateId = templateId;\n\n const data = await ctx.gql.workspace.request<{ createSandbox: unknown }>(CREATE_SANDBOX, {\n input,\n });\n return jsonResult(data.createSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_create failed', { error });\n return errorResult(\n `Failed to create sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_delete')),\n {\n title: 'Delete Sandbox',\n description: 'Delete a sandbox and its Kubernetes resources.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ deleteSandbox: unknown }>(DELETE_SANDBOX, {\n id,\n });\n return jsonResult({ deleted: data.deleteSandbox, sandboxId: id });\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_delete failed', { error });\n return errorResult(\n `Failed to delete sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_stop')),\n {\n title: 'Stop Sandbox',\n description: 'Stop a running sandbox.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ stopSandbox: unknown }>(STOP_SANDBOX, {\n id,\n });\n return jsonResult(data.stopSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_stop failed', { error });\n return errorResult(\n `Failed to stop sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_extend')),\n {\n title: 'Extend Sandbox TTL',\n description: 'Extend the time-to-live of a sandbox.',\n inputSchema: {\n id: z.string().describe('Sandbox ID'),\n additionalSeconds: z.number().describe('Number of seconds to add to the TTL'),\n },\n },\n async ({ id, additionalSeconds }) => {\n try {\n const data = await ctx.gql.workspace.request<{ extendSandboxTTL: unknown }>(\n EXTEND_SANDBOX_TTL,\n {\n id,\n additionalSeconds,\n },\n );\n return jsonResult(data.extendSandboxTTL);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_extend failed', { error });\n return errorResult(\n `Failed to extend sandbox TTL: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n}\n","/**\n * Sandbox module — Kubernetes-native sandbox management\n * (<product>_sandbox_{list,get,create,delete,stop,extend}).\n *\n * Backend: ~/products/wspace/sandbox/wspace-sandbox-svc/.\n * Lifted verbatim from vibecontrols-mcp/src/tools/sandboxes.ts.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { McpContext, McpModule, ModuleRegistration } from '../../core/index.js';\nimport { registerSandboxTools } from './tools.js';\n\nconst sandboxModule: McpModule = {\n id: 'sandbox',\n version: '0.0.1',\n displayName: 'Sandbox',\n capabilities: { tools: {} },\n\n register(server: McpServer, ctx: McpContext): ModuleRegistration {\n const tools: string[] = [];\n const track = (n: string): string => {\n tools.push(n);\n return n;\n };\n\n registerSandboxTools(server, ctx, track);\n\n return { tools, resources: [], prompts: [] };\n },\n};\n\nexport default sandboxModule;\n"]}
1
+ {"version":3,"sources":["../../../src/core/errors.ts","../../../src/core/result.ts","../../../src/core/tool-name.ts","../../../src/modules/vibecontrols/operations.ts","../../../src/modules/sandbox/tools.ts","../../../src/modules/sandbox/index.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error classes for MCP SDK.\n *\n * Modules MUST throw these instead of throwing raw Errors. The registerTool\n * wrapper in result.ts catches and maps them to MCP-protocol-compliant\n * `{ isError: true, content: [...] }` responses.\n *\n * Throwing past the wrapper to the protocol surfaces as JSON-RPC -32603 to\n * the client and is a protocol bug.\n */\n\nexport class McpUserError extends Error {\n public readonly hint: string | undefined;\n\n constructor(message: string, opts?: { hint?: string }) {\n super(message);\n this.name = 'McpUserError';\n this.hint = opts?.hint;\n }\n}\n\nexport class McpAuthError extends McpUserError {\n constructor(message: string, opts?: { hint?: string }) {\n super(message, {\n hint: opts?.hint ?? 'Run the auth_login tool to authenticate.',\n });\n this.name = 'McpAuthError';\n }\n}\n\nexport class McpInternalError extends Error {\n public override readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'McpInternalError';\n this.cause = cause;\n }\n}\n","/**\n * MCP tool result helpers + central handler.\n *\n * Modules NEVER call server.registerTool directly — they use registerTool()\n * from this module so the central try/catch wraps the handler and:\n * - maps thrown McpUserError / McpAuthError / McpInternalError to\n * MCP-protocol-compliant `{ isError: true, content: [...] }` shapes\n * - threads `_meta.progressToken` into ctx.progress for long ops\n * - emits a structured log line on every error\n * - never leaks `cause` from McpInternalError to the client\n *\n * This is the analog of cli-sdk's createProgram() central error handler.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ZodRawShape } from 'zod';\nimport type { McpContext } from './context.js';\nimport { McpAuthError, McpInternalError, McpUserError } from './errors.js';\n\nexport interface ToolTextContent {\n type: 'text';\n text: string;\n [k: string]: unknown;\n}\n\nexport interface ToolResult {\n content: ToolTextContent[];\n isError?: boolean;\n structuredContent?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\nexport interface ToolMeta {\n progressToken?: string | number;\n}\n\n/**\n * Build a successful tool result with JSON content (pretty-printed).\n */\nexport function jsonResult(data: unknown, structured?: Record<string, unknown>): ToolResult {\n const result: ToolResult = {\n content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],\n };\n if (structured !== undefined) {\n result.structuredContent = structured;\n }\n return result;\n}\n\n/**\n * Build a successful tool result with plain text content.\n */\nexport function textResult(text: string): ToolResult {\n return { content: [{ type: 'text', text }] };\n}\n\n/**\n * Build an error tool result. Honors MCP's `{ isError: true, content }` shape.\n * Optional hint is appended on a new line so the LLM can react.\n */\nexport function errorResult(message: string, hint?: string): ToolResult {\n const text = hint ? `${message}\\n\\nHint: ${hint}` : message;\n return { content: [{ type: 'text', text }], isError: true };\n}\n\nexport interface ToolMetadata {\n title: string;\n description: string;\n inputSchema?: ZodRawShape;\n}\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n ctx: McpContext,\n meta: ToolMeta,\n) => Promise<unknown>;\n\n/**\n * Register a tool with the central error wrapper.\n *\n * The handler returns a plain value or void. The wrapper:\n * - wraps non-undefined returns in jsonResult()\n * - if the value already looks like a ToolResult (has `content`), passes through\n * - catches McpAuthError / McpUserError / McpInternalError / generic Error\n * - logs every error via ctx.logger.error\n */\nexport function registerTool<TArgs extends Record<string, unknown>>(\n server: McpServer,\n ctx: McpContext,\n name: string,\n metadata: ToolMetadata,\n handler: ToolHandler<TArgs>,\n): void {\n const sdkConfig = {\n title: metadata.title,\n description: metadata.description,\n ...(metadata.inputSchema ? { inputSchema: metadata.inputSchema } : {}),\n };\n\n // The MCP SDK's registerTool signature is `(name, config, handler)`. The\n // handler arity depends on whether inputSchema is present (1-arg without,\n // 2-arg with). We accept a unified handler shape and dispatch at runtime.\n // The SDK's typing is strict and conditional on the inputSchema generic;\n // bypass with a cast since runtime acceptance is unconditional.\n const wrapped = async (...callbackArgs: unknown[]): Promise<ToolResult> => {\n const hasArgs = callbackArgs.length === 2;\n const args = (hasArgs ? callbackArgs[0] : {}) as TArgs;\n const extra = (hasArgs ? callbackArgs[1] : callbackArgs[0]) as\n | { _meta?: { progressToken?: string | number } }\n | undefined;\n\n const progressToken = extra?._meta?.progressToken;\n const meta: ToolMeta = progressToken !== undefined ? { progressToken } : {};\n\n try {\n const result = await handler(args, ctx, meta);\n if (isToolResult(result)) return result;\n if (result === undefined) return textResult('OK');\n return jsonResult(result);\n } catch (error) {\n return mapErrorToResult(error, ctx, name);\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (server as any).registerTool(name, sdkConfig, wrapped);\n}\n\nfunction isToolResult(value: unknown): value is ToolResult {\n return (\n !!value &&\n typeof value === 'object' &&\n 'content' in value &&\n Array.isArray((value as ToolResult).content)\n );\n}\n\nfunction mapErrorToResult(error: unknown, ctx: McpContext, toolName: string): ToolResult {\n if (error instanceof McpAuthError) {\n ctx.logger.warn(`${toolName}: auth required`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpUserError) {\n ctx.logger.info(`${toolName}: user error`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpInternalError) {\n ctx.logger.error(`${toolName}: internal error`, {\n message: error.message,\n cause: stringifyCause(error.cause),\n });\n return errorResult(`Internal error in ${toolName}.`);\n }\n const message = error instanceof Error ? error.message : String(error);\n ctx.logger.error(`${toolName}: unhandled error`, { message });\n return errorResult(`${toolName}: ${message}`);\n}\n\nfunction stringifyCause(cause: unknown): string | undefined {\n if (cause === undefined || cause === null) return undefined;\n if (cause instanceof Error) return cause.message;\n try {\n return JSON.stringify(cause);\n } catch {\n return String(cause);\n }\n}\n","/**\n * Tool / resource / prompt naming helpers.\n *\n * Mandatory product prefix avoids collisions when Claude Desktop runs\n * multiple MCP servers concurrently (typical setup is ~6).\n *\n * Tool names are capped at 63 characters — Claude Desktop pre-1.x\n * truncated at 64 in some versions.\n */\n\nimport { McpInternalError } from './errors.js';\n\nconst MAX_TOOL_NAME_LENGTH = 63;\n\nfunction assertSafeName(name: string, kind: 'tool' | 'resource' | 'prompt'): string {\n if (kind === 'tool' && name.length > MAX_TOOL_NAME_LENGTH) {\n throw new McpInternalError(\n `Tool name '${name}' exceeds ${MAX_TOOL_NAME_LENGTH} characters (some MCP clients truncate at 64).`,\n );\n }\n return name;\n}\n\n/**\n * Build a tool name. Format: `<productName>_<...parts>` (snake_case).\n * Example: mcpToolName('vibecontrols', 'vibes', 'list') -> 'vibecontrols_vibes_list'\n */\nexport function mcpToolName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpToolName: productName is required');\n }\n const name = [productName, ...parts].filter(Boolean).join('_');\n return assertSafeName(name, 'tool');\n}\n\n/**\n * Build a resource URI. Format: `<productName>://<...parts>`.\n * Example: mcpResourceUri('vibecontrols', 'schema') -> 'vibecontrols://schema'\n */\nexport function mcpResourceUri(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpResourceUri: productName is required');\n }\n return `${productName}://${parts.filter(Boolean).join('/')}`;\n}\n\n/**\n * Build a prompt name. Format: `<productName>-<...parts>` (kebab-case).\n * Example: mcpPromptName('vibecontrols', 'setup') -> 'vibecontrols-setup'\n */\nexport function mcpPromptName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpPromptName: productName is required');\n }\n return [productName, ...parts].filter(Boolean).join('-');\n}\n\nexport const TOOL_NAME_LIMIT = MAX_TOOL_NAME_LENGTH;\n","/**\n * Centralized GraphQL operations for the VibeControls MCP server.\n * Adapted from vibecontrols-cli/src/graphql/operations.ts with superset field selections.\n * Uses template string interpolation pattern (not gql tagged fragments).\n */\n\n// ---------------------------------------------------------------------------\n// Field Fragments (template string constants for interpolation)\n// ---------------------------------------------------------------------------\n\nexport const AGENT_FIELDS = `\n id name hostname platform architecture version\n tunnelUrl tunnelStatus apiUrl agentApiKey appId appClientId\n capabilities configuration isActive lastHeartbeat metadata\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const VIBE_FIELDS = `\n id name description path type status agentId parentId\n gitBranch gitRemote gitStatus environmentVariables tags metadata\n workspaceId archivedAt createdAt updatedAt deletedAt\n`;\n\nexport const SESSION_FIELDS = `\n id name command workingDirectory type status agentId vibeId\n providerSessionName providerWindowId providerPaneId pid exitCode ttydUrl lastOutput\n autoStart environmentVariables metadata startedAt stoppedAt\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const NOTE_FIELDS = `\n id title content tags isPinned vibeId createdBy metadata\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const CONFIG_FIELDS = `\n id key value scope scopeId isSecret\n workspaceId createdAt updatedAt\n`;\n\nexport const WEBHOOK_FIELDS = `\n id name url events agentIds isActive signingKey retryPolicy\n deliveryCount failureCount lastDelivery lastError\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const UI_SESSION_FIELDS = `\n id userId state activeVibeId activeSessionId\n recentVibes recentSessions workspaceId createdAt updatedAt\n`;\n\nexport const TUNNEL_FIELDS = `\n id agentId sessionId localPort publicUrl status isPrimary errorMessage createdAt agentName\n`;\n\nexport const TARGET_FIELDS = `\n id name type host port username status\n workspaceId createdAt updatedAt\n`;\n\nexport const AGENT_CONNECTION_FIELDS = `\n id sourceAgentId targetId protocol status permissions\n createdAt updatedAt\n`;\n\nexport const VIBEDECK_FIELDS = `\n id name description isDefault\n workspaceId createdAt updatedAt\n`;\n\nexport const VIBEDECK_BUTTON_FIELDS = `\n id vibeDeckId label icon actionType actionId\n action { id name actionType }\n command script webhookUrl\n row column color category tags\n confirmationRequired keyboardShortcut style sortOrder\n createdAt updatedAt\n`;\n\nexport const AI_TOOL_EVENT_FIELDS = `\n id source eventType payload agentId\n workspaceId createdAt\n`;\n\nexport const DOCS_SITE_FIELDS = `\n id vibeId name visibility runtime\n workspaceId createdAt updatedAt\n`;\n\nexport const DOCS_PAGE_FIELDS = `\n id siteId title slug content parentId sidebarPosition status\n createdAt updatedAt\n`;\n\nexport const DOCS_REVISION_FIELDS = `\n id siteId revisionNumber status buildDurationMs artifactSizeBytes\n errorMessage publishedAt\n createdAt updatedAt\n`;\n\nexport const AUDIT_LOG_FIELDS = `\n id action resourceType resourceId actorId actorType\n status description ipAddress userAgent requestId\n workspaceId createdAt\n`;\n\nexport const SESSION_SHARE_FIELDS = `\n id sessionId sharedWithId permission status message\n createdBy createdAt expiresAt lastAccessAt accessCount revokedAt revokedBy\n`;\n\nexport const SESSION_SHARE_LINK_FIELDS = `\n id sessionId token permission expiresAt\n createdAt\n`;\n\n// ---------------------------------------------------------------------------\n// Agent Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_AGENTS = `\n query VibecontrolsAgents($filter: VibecontrolsAgentFilterInput) {\n vibecontrolsAgents(filter: $filter) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const GET_AGENT = `\n query VibecontrolsAgent($id: ID!) {\n vibecontrolsAgent(id: $id) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const CREATE_AGENT = `\n mutation CreateVibecontrolsAgent($input: CreateVibecontrolsAgentInput!) {\n createVibecontrolsAgent(input: $input) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const UPDATE_AGENT = `\n mutation UpdateVibecontrolsAgent($id: ID!, $input: UpdateVibecontrolsAgentInput!) {\n updateVibecontrolsAgent(id: $id, input: $input) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const DELETE_AGENT = `\n mutation DeleteVibecontrolsAgent($id: ID!) {\n deleteVibecontrolsAgent(id: $id)\n }\n`;\n\nexport const PROBE_AGENT_CONNECTION = `\n query ProbeAgentConnection($id: ID!) {\n probeAgentConnection(id: $id) {\n agentId reachable latencyMs error version tunnelUrl\n }\n }\n`;\n\nexport const AGENT_HEALTH_PROBES = `\n query VibecontrolsAgentHealthProbes {\n vibecontrolsAgentHealthProbes {\n agentId agentName healthy agentVersion errorMessage tunnelUrl uptime\n }\n }\n`;\n\nexport const AGENT_PLUGINS = `\n query AgentPlugins($agentId: ID!) {\n agentPlugins(agentId: $agentId) {\n agentId\n plugins {\n name packageName version description isActive tags metadata\n }\n total\n }\n }\n`;\n\nexport const INSTALL_AGENT_PLUGIN = `\n mutation InstallAgentPlugin($agentId: ID!, $packageName: String!) {\n installAgentPlugin(agentId: $agentId, packageName: $packageName) {\n success message\n plugin { name packageName version description isActive tags metadata }\n }\n }\n`;\n\nexport const REMOVE_AGENT_PLUGIN = `\n mutation RemoveAgentPlugin($agentId: ID!, $packageName: String!) {\n removeAgentPlugin(agentId: $agentId, packageName: $packageName) {\n success message\n plugin { name packageName version description isActive tags metadata }\n }\n }\n`;\n\nexport const AGENT_HEARTBEAT = `\n mutation VibecontrolsAgentHeartbeat($id: ID!) {\n vibecontrolsAgentHeartbeat(id: $id) { id isActive lastHeartbeat }\n }\n`;\n\nexport const DEACTIVATE_AGENT = `\n mutation DeactivateVibecontrolsAgent($id: ID!) {\n deactivateVibecontrolsAgent(id: $id) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const AGENT_GRAPH = `\n query AgentGraph($workspaceId: ID!, $rootAgentId: ID) {\n agentGraph(workspaceId: $workspaceId, rootAgentId: $rootAgentId) {\n agents { ${AGENT_FIELDS} }\n connections { ${AGENT_CONNECTION_FIELDS} }\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Vibe Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_VIBES = `\n query Vibes($filter: VibeFilterInput, $pagination: PaginationInput) {\n vibes(filter: $filter, pagination: $pagination) {\n items { ${VIBE_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_VIBE = `\n query Vibe($id: ID!) {\n vibe(id: $id) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const CREATE_VIBE = `\n mutation CreateVibe($input: CreateVibeInput!) {\n createVibe(input: $input) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE = `\n mutation UpdateVibe($id: ID!, $input: UpdateVibeInput!) {\n updateVibe(id: $id, input: $input) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const DELETE_VIBE = `\n mutation DeleteVibe($id: ID!) { deleteVibe(id: $id) }\n`;\n\nexport const ARCHIVE_VIBE = `\n mutation ArchiveVibe($id: ID!) {\n archiveVibe(id: $id) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const RESTORE_VIBE = `\n mutation RestoreVibe($id: ID!) {\n restoreVibe(id: $id) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const MOVE_VIBE = `\n mutation MoveVibe($id: ID!, $newParentId: ID) {\n moveVibe(id: $id, newParentId: $newParentId) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE_STATUS = `\n mutation UpdateVibeStatus($id: ID!, $status: VibeStatus!) {\n updateVibeStatus(id: $id, status: $status) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const VIBE_HIERARCHY = `\n query VibeHierarchy($rootId: ID) {\n vibeHierarchy(rootId: $rootId) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const SEARCH_VIBES = `\n query SearchVibes($query: String!, $limit: Int) {\n searchVibes(query: $query, limit: $limit) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE_GIT = `\n mutation UpdateVibeGit($id: ID!, $gitBranch: String, $gitRemote: String, $gitStatus: JSON) {\n updateVibeGit(id: $id, gitBranch: $gitBranch, gitRemote: $gitRemote, gitStatus: $gitStatus) {\n ${VIBE_FIELDS}\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Session Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_SESSIONS = `\n query Sessions($filter: SessionFilterInput, $pagination: PaginationInput) {\n sessions(filter: $filter, pagination: $pagination) {\n items { ${SESSION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_SESSION = `\n query Session($id: ID!) {\n session(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const CREATE_SESSION = `\n mutation CreateSession($input: CreateSessionInput!) {\n createSession(input: $input) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const START_SESSION = `\n mutation StartSession($id: ID!) {\n startSession(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const STOP_SESSION = `\n mutation StopSession($id: ID!) {\n stopSession(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const RESTART_SESSION = `\n mutation RestartSession($id: ID!) {\n restartSession(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const TERMINATE_SESSION = `\n mutation TerminateSession($id: ID!) {\n terminateSession(id: $id)\n }\n`;\n\nexport const SEND_SESSION_INPUT = `\n mutation SendSessionInput($id: ID!, $input: String!) {\n sendSessionInput(id: $id, input: $input)\n }\n`;\n\nexport const START_SESSION_TERMINAL = `\n mutation StartSessionTerminal($id: ID!) {\n startSessionTerminal(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const SESSION_OUTPUT = `\n query SessionOutput($id: ID!, $lines: Int) {\n sessionOutput(id: $id, lines: $lines)\n }\n`;\n\nexport const ACTIVE_SESSIONS = `\n query ActiveSessions($vibeId: ID) {\n activeSessions(vibeId: $vibeId) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const CHECK_SESSION_HEALTH = `\n mutation CheckSessionHealth {\n checkSessionHealth { checked updated errors }\n }\n`;\n\nexport const BULK_RESTART_SESSIONS = `\n mutation BulkRestartSessions($ids: [ID!]!) {\n bulkRestartSessions(ids: $ids) { succeeded failed }\n }\n`;\n\nexport const BULK_STOP_SESSIONS = `\n mutation BulkStopSessions($ids: [ID!]!) {\n bulkStopSessions(ids: $ids) { succeeded failed }\n }\n`;\n\nexport const BULK_TERMINATE_SESSIONS = `\n mutation BulkTerminateSessions($ids: [ID!]!) {\n bulkTerminateSessions(ids: $ids) { succeeded failed }\n }\n`;\n\nexport const UPDATE_SESSION = `\n mutation UpdateSession($id: ID!, $input: UpdateSessionInput!) {\n updateSession(id: $id, input: $input) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const UPDATE_SESSION_STATUS = `\n mutation UpdateSessionStatus($id: ID!, $status: VibecontrolsSessionStatus!) {\n updateSessionStatus(id: $id, status: $status) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const DELETE_SESSION = `\n mutation DeleteSession($id: ID!) { deleteSession(id: $id) }\n`;\n\nexport const KILL_SESSION = `\n mutation KillSession($id: ID!) { killSession(id: $id) }\n`;\n\n// ---------------------------------------------------------------------------\n// Session Sharing Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const SHARE_SESSION = `\n mutation ShareSession($input: ShareSessionInput!) {\n shareSession(input: $input) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const CREATE_SESSION_SHARE_LINK = `\n mutation CreateSessionShareLink($input: CreateSessionShareLinkInput!) {\n createSessionShareLink(input: $input) { ${SESSION_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const REVOKE_SESSION_SHARE = `\n mutation RevokeSessionShare($id: ID!) {\n revokeSessionShare(id: $id) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const REVOKE_SESSION_SHARE_LINK = `\n mutation RevokeSessionShareLink($id: ID!) {\n revokeSessionShareLink(id: $id) { ${SESSION_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const SESSION_SHARES = `\n query SessionShares($sessionId: ID!) {\n sessionShares(sessionId: $sessionId) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const SESSION_SHARE_LINKS = `\n query SessionShareLinks($sessionId: ID!) {\n sessionShareLinks(sessionId: $sessionId) { ${SESSION_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const SESSION_COLLABORATORS = `\n query SessionCollaborators($sessionId: ID!) {\n sessionCollaborators(sessionId: $sessionId) { userId hasControl joinedAt }\n }\n`;\n\nexport const SESSIONS_SHARED_WITH_ME = `\n query SessionsSharedWithMe($filter: SharedWithMeFilterInput, $pagination: PaginationInput) {\n sessionsSharedWithMe(filter: $filter, pagination: $pagination) {\n totalCount\n edges {\n cursor\n node { ${SESSION_SHARE_FIELDS} }\n }\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Note Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_NOTES = `\n query Notes($filter: VibecontrolsNoteFilterInput, $pagination: PaginationInput) {\n notes(filter: $filter, pagination: $pagination) {\n items { ${NOTE_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_NOTE = `\n query Note($id: ID!) {\n note(id: $id) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const CREATE_NOTE = `\n mutation CreateNote($input: CreateVibecontrolsNoteInput!) {\n createNote(input: $input) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const UPDATE_NOTE = `\n mutation UpdateNote($id: ID!, $input: UpdateVibecontrolsNoteInput!) {\n updateNote(id: $id, input: $input) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const DELETE_NOTE = `\n mutation DeleteNote($id: ID!) { deleteNote(id: $id) }\n`;\n\nexport const SEARCH_NOTES = `\n query SearchNotes($query: String!, $vibeId: ID, $limit: Int) {\n searchNotes(query: $query, vibeId: $vibeId, limit: $limit) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const PIN_NOTE = `\n mutation PinNote($id: ID!) {\n pinNote(id: $id) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const UNPIN_NOTE = `\n mutation UnpinNote($id: ID!) {\n unpinNote(id: $id) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const PINNED_NOTES = `\n query PinnedNotes($vibeId: ID) {\n pinnedNotes(vibeId: $vibeId) { ${NOTE_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Configuration Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_CONFIGURATIONS = `\n query Configurations($filter: ConfigurationFilterInput!, $pagination: PaginationInput) {\n configurations(filter: $filter, pagination: $pagination) {\n items { ${CONFIG_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_CONFIGURATION = `\n query Configuration($key: String!, $scope: ConfigScope!, $scopeId: String) {\n configuration(key: $key, scope: $scope, scopeId: $scopeId) { ${CONFIG_FIELDS} }\n }\n`;\n\nexport const CONFIGURATIONS_BY_SCOPE = `\n query ConfigurationsByScope($scope: ConfigScope!, $scopeId: String) {\n configurationsByScope(scope: $scope, scopeId: $scopeId) { ${CONFIG_FIELDS} }\n }\n`;\n\nexport const SET_CONFIGURATION = `\n mutation SetConfiguration($key: String!, $scope: ConfigScope!, $scopeId: ID, $value: JSON!, $isSecret: Boolean) {\n setConfiguration(key: $key, scope: $scope, scopeId: $scopeId, value: $value, isSecret: $isSecret) { ${CONFIG_FIELDS} }\n }\n`;\n\nexport const DELETE_CONFIGURATION = `\n mutation DeleteConfiguration($key: String!, $scope: ConfigScope!, $scopeId: String) {\n deleteConfiguration(key: $key, scope: $scope, scopeId: $scopeId)\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Webhook Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_WEBHOOKS = `\n query Webhooks($filter: WebhookFilterInput, $pagination: PaginationInput) {\n webhooks(filter: $filter, pagination: $pagination) {\n items { ${WEBHOOK_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_WEBHOOK = `\n query Webhook($id: ID!) {\n webhook(id: $id) { ${WEBHOOK_FIELDS} }\n }\n`;\n\nexport const CREATE_WEBHOOK = `\n mutation CreateWebhook($input: CreateWebhookInput!) {\n createWebhook(input: $input) { ${WEBHOOK_FIELDS} }\n }\n`;\n\nexport const UPDATE_WEBHOOK = `\n mutation UpdateWebhook($id: ID!, $input: UpdateWebhookInput!) {\n updateWebhook(id: $id, input: $input) { ${WEBHOOK_FIELDS} }\n }\n`;\n\nexport const DELETE_WEBHOOK = `\n mutation DeleteWebhook($id: ID!) { deleteWebhook(id: $id) }\n`;\n\nexport const TEST_WEBHOOK = `\n mutation TestWebhook($id: ID!) { testWebhook(id: $id) }\n`;\n\nexport const TRIGGER_WEBHOOK = `\n mutation TriggerWebhook($id: ID!, $payload: JSON) {\n triggerWebhook(id: $id, payload: $payload)\n }\n`;\n\nexport const RESET_WEBHOOK_FAILURES = `\n mutation ResetWebhookFailures($id: ID!) {\n resetWebhookFailures(id: $id) { ${WEBHOOK_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Tunnel Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_TUNNELS = `\n query VibecontrolsAgentTunnels {\n vibecontrolsAgentTunnels {\n tunnels { ${TUNNEL_FIELDS} }\n agentStatuses { agentId agentName connected errorMessage tunnelUrl }\n error\n }\n }\n`;\n\nexport const CREATE_TUNNEL = `\n mutation CreateAgentTunnel($input: CreateAgentTunnelInput!) {\n createAgentTunnel(input: $input) { ${TUNNEL_FIELDS} }\n }\n`;\n\nexport const STOP_TUNNEL = `\n mutation StopAgentTunnel($agentId: ID!, $tunnelId: ID!) {\n stopAgentTunnel(agentId: $agentId, tunnelId: $tunnelId)\n }\n`;\n\nexport const DELETE_TUNNEL = `\n mutation DeleteAgentTunnel($agentId: ID!, $tunnelId: ID!) {\n deleteAgentTunnel(agentId: $agentId, tunnelId: $tunnelId)\n }\n`;\n\n// ---------------------------------------------------------------------------\n// UI Session Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const GET_UI_SESSION = `\n query { uiSession { ${UI_SESSION_FIELDS} } }\n`;\n\nexport const SAVE_UI_SESSION = `\n mutation SaveUISession($input: SaveUISessionInput!) {\n saveUISession(input: $input) { ${UI_SESSION_FIELDS} }\n }\n`;\n\nexport const CLEAR_UI_SESSION = `\n mutation { clearUISession }\n`;\n\n// ---------------------------------------------------------------------------\n// AI Tool Event Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_AI_TOOL_EVENTS = `\n query AiToolEvents($filter: AiToolEventFilterInput, $pagination: PaginationInput) {\n aiToolEvents(filter: $filter, pagination: $pagination) {\n items { ${AI_TOOL_EVENT_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const RECENT_AI_TOOL_EVENTS = `\n query RecentAiToolEvents($agentId: ID!, $limit: Int) {\n recentAiToolEvents(agentId: $agentId, limit: $limit) { ${AI_TOOL_EVENT_FIELDS} }\n }\n`;\n\nexport const CREATE_AI_TOOL_EVENT = `\n mutation CreateAiToolEvent($input: CreateAiToolEventInput!) {\n createAiToolEvent(input: $input) { ${AI_TOOL_EVENT_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Target Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_TARGETS = `\n query Targets($workspaceId: ID!, $filter: TargetFilterInput, $limit: Int, $offset: Int) {\n targets(workspaceId: $workspaceId, filter: $filter, limit: $limit, offset: $offset) {\n items { ${TARGET_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_TARGET = `\n query Target($id: ID!) {\n target(id: $id) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const CREATE_TARGET = `\n mutation CreateTarget($workspaceId: ID!, $input: CreateTargetInput!) {\n createTarget(workspaceId: $workspaceId, input: $input) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const UPDATE_TARGET = `\n mutation UpdateTarget($id: ID!, $input: UpdateTargetInput!) {\n updateTarget(id: $id, input: $input) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const DELETE_TARGET = `\n mutation DeleteTarget($id: ID!) { deleteTarget(id: $id) }\n`;\n\nexport const TEST_TARGET = `\n query TestTarget($id: ID!) {\n testTarget(id: $id) { success error latencyMs }\n }\n`;\n\nexport const IMPORT_TARGETS_FROM_CONFIG = `\n mutation ImportTargetsFromConfig($agentId: ID!, $hosts: [ConfigHostInput!]!, $workspaceId: ID!) {\n importTargetsFromConfig(agentId: $agentId, hosts: $hosts, workspaceId: $workspaceId) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const SCAN_SSH_CONFIG = `\n mutation ScanSSHConfig($agentId: ID!, $configPath: String) {\n scanSSHConfig(agentId: $agentId, configPath: $configPath) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const INSTALL_AGENT_ON_TARGET = `\n mutation InstallAgentOnTarget($sourceAgentId: ID!, $targetId: ID!, $agentPort: Int) {\n installAgentOnTarget(sourceAgentId: $sourceAgentId, targetId: $targetId, agentPort: $agentPort) { success error }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// VibeDeck Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_VIBEDECKS = `\n query VibeDecks($filter: VibeDeckFilterInput, $pagination: PaginationInput) {\n vibeDecks(filter: $filter, pagination: $pagination) {\n items { ${VIBEDECK_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_VIBEDECK = `\n query VibeDeck($id: ID!) {\n vibeDeck(id: $id) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const DEFAULT_VIBEDECK = `\n query { defaultVibeDeck { ${VIBEDECK_FIELDS} } }\n`;\n\nexport const CREATE_VIBEDECK = `\n mutation CreateVibeDeck($input: CreateVibeDeckInput!) {\n createVibeDeck(input: $input) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBEDECK = `\n mutation UpdateVibeDeck($id: ID!, $input: UpdateVibeDeckInput!) {\n updateVibeDeck(id: $id, input: $input) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const DELETE_VIBEDECK = `\n mutation DeleteVibeDeck($id: ID!) { deleteVibeDeck(id: $id) }\n`;\n\nexport const DUPLICATE_VIBEDECK = `\n mutation DuplicateVibeDeck($id: ID!, $name: String) {\n duplicateVibeDeck(id: $id, name: $name) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const SET_DEFAULT_VIBEDECK = `\n mutation SetDefaultVibeDeck($id: ID!) {\n setDefaultVibeDeck(id: $id) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const LIST_VIBEDECK_BUTTONS = `\n query VibeDeckButtons($filter: VibeDeckButtonFilterInput, $pagination: PaginationInput) {\n vibeDeckButtons(filter: $filter, pagination: $pagination) {\n items { ${VIBEDECK_BUTTON_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_VIBEDECK_BUTTON = `\n query VibeDeckButton($id: ID!) {\n vibeDeckButton(id: $id) { ${VIBEDECK_BUTTON_FIELDS} }\n }\n`;\n\nexport const CREATE_VIBEDECK_BUTTON = `\n mutation CreateVibeDeckButton($input: CreateVibeDeckButtonInput!) {\n createVibeDeckButton(input: $input) { ${VIBEDECK_BUTTON_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBEDECK_BUTTON = `\n mutation UpdateVibeDeckButton($id: ID!, $input: UpdateVibeDeckButtonInput!) {\n updateVibeDeckButton(id: $id, input: $input) { ${VIBEDECK_BUTTON_FIELDS} }\n }\n`;\n\nexport const DELETE_VIBEDECK_BUTTON = `\n mutation DeleteVibeDeckButton($id: ID!) { deleteVibeDeckButton(id: $id) }\n`;\n\nexport const EXECUTE_VIBEDECK_BUTTON = `\n mutation ExecuteVibeDeckButton($id: ID!, $agentId: ID!) {\n executeVibeDeckButton(id: $id, agentId: $agentId) { success output error }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Action Field Fragments\n// ---------------------------------------------------------------------------\n\nexport const ACTION_FIELDS = `\n id name description actionType sourceType triggerType\n command script webhookUrl workflowDefinition\n tags storeItemId storeVersion metadata\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const ACTION_EXECUTION_FIELDS = `\n id actionId status input output error\n startedAt completedAt durationMs triggeredBy metadata\n workspaceId createdAt updatedAt\n`;\n\n// ---------------------------------------------------------------------------\n// Action Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_ACTIONS = `\n query Actions($filter: ActionFilterInput, $pagination: PaginationInput) {\n actions(filter: $filter, pagination: $pagination) {\n items { ${ACTION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_ACTION = `\n query Action($id: ID!) {\n action(id: $id) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const CREATE_ACTION = `\n mutation CreateAction($input: CreateActionInput!) {\n createAction(input: $input) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const UPDATE_ACTION = `\n mutation UpdateAction($id: ID!, $input: UpdateActionInput!) {\n updateAction(id: $id, input: $input) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const DELETE_ACTION = `\n mutation DeleteAction($id: ID!) { deleteAction(id: $id) }\n`;\n\nexport const DUPLICATE_ACTION = `\n mutation DuplicateAction($id: ID!, $name: String) {\n duplicateAction(id: $id, name: $name) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const EXECUTE_ACTION = `\n mutation ExecuteAction($id: ID!, $input: ExecuteActionInput) {\n executeAction(id: $id, input: $input) { ${ACTION_EXECUTION_FIELDS} }\n }\n`;\n\nexport const INSTALL_ACTION_FROM_STORE = `\n mutation InstallActionFromStore($storeItemId: String!, $version: String, $name: String) {\n installActionFromStore(storeItemId: $storeItemId, version: $version, name: $name) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const CANCEL_ACTION_EXECUTION = `\n mutation CancelActionExecution($id: ID!) {\n cancelActionExecution(id: $id) { ${ACTION_EXECUTION_FIELDS} }\n }\n`;\n\nexport const LIST_ACTION_EXECUTIONS = `\n query ActionExecutions($filter: ActionExecutionFilterInput, $pagination: PaginationInput) {\n actionExecutions(filter: $filter, pagination: $pagination) {\n items { ${ACTION_EXECUTION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_ACTION_EXECUTION = `\n query ActionExecution($id: ID!) {\n actionExecution(id: $id) { ${ACTION_EXECUTION_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Scheduled Job Field Fragments\n// ---------------------------------------------------------------------------\n\nexport const SCHEDULED_JOB_FIELDS = `\n id name scheduleType status actionId\n cronExpression timezone scheduledAt\n interval intervalUnit startDate endDate\n nextExecutionAt lastExecutionAt\n priority tags\n`;\n\n// ---------------------------------------------------------------------------\n// Scheduled Job Queries / Mutations (wspace-scheduler-svc via gateway)\n// ---------------------------------------------------------------------------\n\nexport const CREATE_SCHEDULED_JOB = `\n mutation CreateScheduledJob($workspaceId: ID!, $input: CreateScheduledJobInput!) {\n createScheduledJob(workspaceId: $workspaceId, input: $input) { ${SCHEDULED_JOB_FIELDS} }\n }\n`;\n\nexport const DELETE_SCHEDULED_JOB = `\n mutation DeleteScheduledJob($id: ID!) { deleteScheduledJob(id: $id) }\n`;\n\nexport const LIST_SCHEDULED_JOBS = `\n query ScheduledJobs($workspaceId: ID!, $filter: JobFilterInput, $pagination: SchedulerPaginationInput) {\n scheduledJobs(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n jobs { ${SCHEDULED_JOB_FIELDS} }\n total hasMore\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Docs Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_DOCS_SITES = `\n query DocsSites($filter: VibecontrolsDocsSiteFilterInput, $pagination: PaginationInput) {\n docsSites(filter: $filter, pagination: $pagination) {\n items { ${DOCS_SITE_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_DOCS_SITE = `\n query DocsSite($vibeId: ID!) {\n docsSite(vibeId: $vibeId) { ${DOCS_SITE_FIELDS} }\n }\n`;\n\nexport const CREATE_DOCS_SITE = `\n mutation CreateDocsSite($input: CreateVibecontrolsDocsSiteInput!) {\n createDocsSite(input: $input) { ${DOCS_SITE_FIELDS} }\n }\n`;\n\nexport const UPDATE_DOCS_SITE = `\n mutation UpdateDocsSite($id: ID!, $input: UpdateVibecontrolsDocsSiteInput!) {\n updateDocsSite(id: $id, input: $input) { ${DOCS_SITE_FIELDS} }\n }\n`;\n\nexport const DELETE_DOCS_SITE = `\n mutation DeleteDocsSite($id: ID!) { deleteDocsSite(id: $id) }\n`;\n\nexport const LIST_DOCS_PAGES = `\n query DocsPages($siteId: ID!, $filter: VibecontrolsDocsPageFilterInput) {\n docsPages(siteId: $siteId, filter: $filter) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const GET_DOCS_PAGE = `\n query DocsPage($id: ID!) {\n docsPage(id: $id) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const CREATE_DOCS_PAGE = `\n mutation CreateDocsPage($input: CreateVibecontrolsDocsPageInput!) {\n createDocsPage(input: $input) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const UPDATE_DOCS_PAGE = `\n mutation UpdateDocsPage($id: ID!, $input: UpdateVibecontrolsDocsPageInput!) {\n updateDocsPage(id: $id, input: $input) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const DELETE_DOCS_PAGE = `\n mutation DeleteDocsPage($id: ID!) { deleteDocsPage(id: $id) }\n`;\n\nexport const LIST_DOCS_REVISIONS = `\n query DocsRevisions($siteId: ID!, $pagination: PaginationInput) {\n docsRevisions(siteId: $siteId, pagination: $pagination) {\n items { ${DOCS_REVISION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const COMPILE_DOCS_SITE = `\n mutation CompileDocsSite($siteId: ID!, $publish: Boolean) {\n compileDocsSite(siteId: $siteId, publish: $publish) { ${DOCS_REVISION_FIELDS} }\n }\n`;\n\nexport const PUBLISH_DOCS_REVISION = `\n mutation PublishDocsRevision($revisionId: ID!) {\n publishDocsRevision(revisionId: $revisionId) { ${DOCS_REVISION_FIELDS} }\n }\n`;\n\nexport const ROLLBACK_DOCS_REVISION = `\n mutation RollbackDocsRevision($siteId: ID!, $revisionId: ID!) {\n rollbackDocsRevision(siteId: $siteId, revisionId: $revisionId) { ${DOCS_REVISION_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Audit Log Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_AUDIT_LOGS = `\n query VibeAuditLogs($filter: VibeAuditLogFilterInput, $pagination: PaginationInput) {\n vibeAuditLogs(filter: $filter, pagination: $pagination) {\n items { ${AUDIT_LOG_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_AUDIT_LOG = `\n query VibeAuditLog($id: ID!) {\n vibeAuditLog(id: $id) { ${AUDIT_LOG_FIELDS} }\n }\n`;\n\nexport const AUDIT_LOG_STATS = `\n query VibeAuditLogStats($filter: VibeAuditLogFilterInput) {\n vibeAuditLogStats(filter: $filter) {\n totalLogs\n logsByAction { action count }\n logsByResourceType { resourceType count }\n logsByStatus { status count }\n }\n }\n`;\n\nexport const EXPORT_AUDIT_LOGS = `\n mutation ExportVibeAuditLogs($filter: VibeAuditLogFilterInput, $format: String) {\n exportVibeAuditLogs(filter: $filter, format: $format)\n }\n`;\n\nexport const DELETE_AUDIT_LOG = `\n mutation DeleteVibeAuditLog($id: ID!, $reason: String) {\n deleteVibeAuditLog(id: $id, reason: $reason)\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Auth Operations (Global Gateway)\n// ---------------------------------------------------------------------------\n\nexport const MY_WORKSPACES = `\n query MyWorkspaces($limit: Int) {\n myWorkspaces(limit: $limit) {\n items { id name slug tenantId organizationId }\n }\n }\n`;\n\nexport const ISSUE_WORKSPACE_TOKEN = `\n mutation IssueWorkspaceToken($input: IssueWorkspaceTokenInput!) {\n issueWorkspaceToken(input: $input) {\n success token expiresAt scopes\n error { code message }\n }\n }\n`;\n\nexport const REFRESH_TOKEN = `\n mutation RefreshToken($token: String!) {\n refreshToken(token: $token) { accessToken refreshToken expiresIn }\n }\n`;\n\nexport const SIGN_OUT = `mutation { signOut }`;\n\n// ---------------------------------------------------------------------------\n// Analytics\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Sandbox Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const SANDBOX_FIELDS = `\n id name description template mode status\n crdName podName namespace runtimeClass\n containers { name image ports { containerPort name protocol } env { name value } command args resources { requestsCpu requestsMemory limitsCpu limitsMemory } }\n containerStatuses { name ready port restartCount }\n resources { cpuRequest cpuLimit memoryRequest memoryLimit }\n storage { mode sizeGi mountPath retainOnDelete }\n network { exposeService internalUrl containerUrls serviceName }\n ttlSeconds expiresAt metadata errorMessage\n workspaceId createdBy createdAt updatedAt stoppedAt\n`;\n\nexport const LIST_SANDBOXES = `\n query ListSandboxes($filter: SandboxFilterInput, $pagination: SandboxPaginationInput, $context: ContextInput!) {\n listSandboxes(filter: $filter, pagination: $pagination, context: $context) {\n items { ${SANDBOX_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_SANDBOX = `\n query GetSandbox($id: ID!, $context: ContextInput!) {\n getSandbox(id: $id, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const CREATE_SANDBOX = `\n mutation CreateSandbox($input: CreateSandboxInput!) {\n createSandbox(input: $input) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const DELETE_SANDBOX = `\n mutation DeleteSandbox($id: ID!, $context: ContextInput!) {\n deleteSandbox(id: $id, context: $context)\n }\n`;\n\nexport const STOP_SANDBOX = `\n mutation StopSandbox($id: ID!, $context: ContextInput!) {\n stopSandbox(id: $id, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const EXTEND_SANDBOX_TTL = `\n mutation ExtendSandboxTTL($id: ID!, $additionalSeconds: Int!, $context: ContextInput!) {\n extendSandboxTTL(id: $id, additionalSeconds: $additionalSeconds, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Analytics\n// ---------------------------------------------------------------------------\n\nexport const VIBECONTROLS_ANALYTICS = `\n query VibecontrolsAnalytics($input: VibecontrolsAnalyticsInput!) {\n vibecontrolsAnalytics(input: $input) {\n agents { total active inactive staleHeartbeatCount byPlatform { key count } byArchitecture { key count } createdOverTime { timestamp value } }\n targets { total connectionCount byType { key count } byStatus { key count } }\n sessions { total active avgDurationMs totalCollaborators totalShares totalShareLinks byType { key count } byStatus { key count } createdOverTime { timestamp value } }\n vibes { total withAgent withoutAgent byType { key count } byStatus { key count } createdOverTime { timestamp value } }\n actions { total totalExecutions successRate avgDurationMs byActionType { key count } byTriggerType { key count } bySourceType { key count } executionsByStatus { key count } executionsOverTime { timestamp value } }\n webhooks { total active inactive totalDeliveries totalFailures deliverySuccessRate }\n aiEvents { total bySource { key count } byEventType { key count } eventsOverTime { timestamp value } }\n vibeDecks { totalDecks totalButtons buttonsByActionType { key count } }\n audit { total byAction { key count } byResourceType { key count } byStatus { key count } eventsOverTime { timestamp value } }\n docs { totalSites totalPages totalRevisions buildSuccessRate totalBuildImages pagesByStatus { key count } revisionsByStatus { key count } }\n notes { total pinned unpinned createdOverTime { timestamp value } }\n configurations { total secretCount byScope { key count } }\n executionTimeMs\n cached\n }\n }\n`;\n","import { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { jsonResult, errorResult, mcpToolName, type McpContext } from '../../core/index.js';\nimport {\n LIST_SANDBOXES,\n GET_SANDBOX,\n CREATE_SANDBOX,\n DELETE_SANDBOX,\n STOP_SANDBOX,\n EXTEND_SANDBOX_TTL,\n} from '../vibecontrols/operations.js';\n\nexport function registerSandboxTools(\n server: McpServer,\n ctx: McpContext,\n track: (n: string) => string,\n): void {\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_list')),\n {\n title: 'List Sandboxes',\n description: 'List Kubernetes-native sandboxes with optional filters and pagination.',\n inputSchema: {\n status: z\n .string()\n .optional()\n .describe(\n 'Filter by status (PENDING, PROVISIONING, RUNNING, STOPPING, STOPPED, EXPIRED, FAILED)',\n ),\n template: z\n .string()\n .optional()\n .describe(\n 'Filter by template (VIBECONTROLS, AI_BUILDER, WORKFLOW_MULTI_NODE, MISC_SHELL, CUSTOM)',\n ),\n limit: z.number().optional().describe('Max results'),\n offset: z.number().optional().describe('Skip results'),\n },\n },\n async ({ status, template, limit, offset }) => {\n try {\n const filter: Record<string, unknown> = {};\n if (status !== undefined) filter.status = status;\n if (template !== undefined) filter.template = template;\n\n const pagination: Record<string, unknown> = {};\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n\n const data = await ctx.gql.workspace.request<{ listSandboxes: unknown }>(LIST_SANDBOXES, {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n pagination: Object.keys(pagination).length > 0 ? pagination : undefined,\n });\n return jsonResult(data.listSandboxes);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_list failed', { error });\n return errorResult(\n `Failed to list sandboxes: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_get')),\n {\n title: 'Get Sandbox',\n description: 'Get a sandbox by its ID.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandbox: unknown }>(GET_SANDBOX, { id });\n return jsonResult(data.getSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_get failed', { error });\n return errorResult(\n `Failed to get sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_create')),\n {\n title: 'Create Sandbox',\n description:\n 'Create a new Kubernetes-native sandbox environment with Kata Containers isolation.',\n inputSchema: {\n name: z.string().describe('Sandbox name'),\n template: z\n .enum(['VIBECONTROLS', 'AI_BUILDER', 'WORKFLOW_MULTI_NODE', 'MISC_SHELL', 'CUSTOM'])\n .describe('Sandbox template type'),\n mode: z\n .enum(['DEPLOYMENT', 'JOB'])\n .optional()\n .describe('Run mode: DEPLOYMENT (long-running) or JOB (run-to-completion)'),\n containers: z\n .array(\n z.object({\n name: z.string().describe('Container name'),\n image: z.string().describe('Container image'),\n ports: z\n .array(\n z.object({\n containerPort: z.number().describe('Container port'),\n name: z.string().optional().describe('Port name'),\n protocol: z.string().optional().describe('Protocol (TCP, UDP)'),\n }),\n )\n .optional()\n .describe('Exposed ports'),\n env: z\n .array(\n z.object({\n name: z.string().describe('Env var name'),\n value: z.string().describe('Env var value'),\n }),\n )\n .optional()\n .describe('Environment variables'),\n command: z.array(z.string()).optional().describe('Container entrypoint command'),\n args: z.array(z.string()).optional().describe('Container arguments'),\n }),\n )\n .optional()\n .describe('Container specifications (uses template defaults if omitted)'),\n ttlSeconds: z.number().optional().describe('Time-to-live in seconds'),\n resources: z\n .object({\n cpuRequest: z.string().optional(),\n cpuLimit: z.string().optional(),\n memoryRequest: z.string().optional(),\n memoryLimit: z.string().optional(),\n })\n .optional()\n .describe('Resource requests/limits'),\n description: z.string().optional().describe('Sandbox description'),\n templateId: z.string().optional().describe('Sandbox template config ID to use'),\n },\n },\n async ({\n name,\n template,\n mode,\n containers,\n ttlSeconds,\n resources,\n description,\n templateId,\n }) => {\n try {\n const input: Record<string, unknown> = { name, template };\n if (mode !== undefined) input.mode = mode;\n if (containers !== undefined) input.containers = containers;\n if (ttlSeconds !== undefined) input.ttlSeconds = ttlSeconds;\n if (resources !== undefined) input.resources = resources;\n if (description !== undefined) input.description = description;\n if (templateId !== undefined) input.templateId = templateId;\n\n const data = await ctx.gql.workspace.request<{ createSandbox: unknown }>(CREATE_SANDBOX, {\n input,\n });\n return jsonResult(data.createSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_create failed', { error });\n return errorResult(\n `Failed to create sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_delete')),\n {\n title: 'Delete Sandbox',\n description: 'Delete a sandbox and its Kubernetes resources.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ deleteSandbox: unknown }>(DELETE_SANDBOX, {\n id,\n });\n return jsonResult({ deleted: data.deleteSandbox, sandboxId: id });\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_delete failed', { error });\n return errorResult(\n `Failed to delete sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_stop')),\n {\n title: 'Stop Sandbox',\n description: 'Stop a running sandbox.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ stopSandbox: unknown }>(STOP_SANDBOX, {\n id,\n });\n return jsonResult(data.stopSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_stop failed', { error });\n return errorResult(\n `Failed to stop sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_extend')),\n {\n title: 'Extend Sandbox TTL',\n description: 'Extend the time-to-live of a sandbox.',\n inputSchema: {\n id: z.string().describe('Sandbox ID'),\n additionalSeconds: z.number().describe('Number of seconds to add to the TTL'),\n },\n },\n async ({ id, additionalSeconds }) => {\n try {\n const data = await ctx.gql.workspace.request<{ extendSandboxTTL: unknown }>(\n EXTEND_SANDBOX_TTL,\n {\n id,\n additionalSeconds,\n },\n );\n return jsonResult(data.extendSandboxTTL);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_extend failed', { error });\n return errorResult(\n `Failed to extend sandbox TTL: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n}\n","/**\n * Sandbox module — Kubernetes-native sandbox management\n * (<product>_sandbox_{list,get,create,delete,stop,extend}).\n *\n * Backend: ~/products/wspace/sandbox/wspace-sandbox-svc/.\n * Lifted verbatim from vibecontrols-mcp/src/tools/sandboxes.ts.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { McpContext, McpModule, ModuleRegistration } from '../../core/index.js';\nimport { registerSandboxTools } from './tools.js';\n\nconst sandboxModule: McpModule = {\n id: 'sandbox',\n version: '0.0.1',\n displayName: 'Sandbox',\n capabilities: { tools: {} },\n\n register(server: McpServer, ctx: McpContext): ModuleRegistration {\n const tools: string[] = [];\n const track = (n: string): string => {\n tools.push(n);\n return n;\n };\n\n registerSandboxTools(server, ctx, track);\n\n return { tools, resources: [], prompts: [] };\n },\n};\n\nexport default sandboxModule;\n"]}
@@ -1,4 +1,4 @@
1
- import { LIST_SANDBOXES, GET_SANDBOX, CREATE_SANDBOX, DELETE_SANDBOX, STOP_SANDBOX, EXTEND_SANDBOX_TTL } from '../../chunk-4GBVJ4OY.js';
1
+ import { LIST_SANDBOXES, GET_SANDBOX, CREATE_SANDBOX, DELETE_SANDBOX, STOP_SANDBOX, EXTEND_SANDBOX_TTL } from '../../chunk-N2CZNPYC.js';
2
2
  import { mcpToolName, jsonResult, errorResult } from '../../chunk-H2OYWLOA.js';
3
3
  import { z } from 'zod';
4
4