@runpod/mcp-server 4.9.1 → 4.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/http.cjs CHANGED
@@ -432,6 +432,104 @@ function coerceScalars(value, schema, defs, depth = 0) {
432
432
 
433
433
  // src/specgen/generated/tools.gen.ts
434
434
  var generatedTools = [
435
+ {
436
+ name: "add-organization-group-member",
437
+ title: "Add organization group member",
438
+ operationId: "addOrganizationGroupMember",
439
+ description: "Add a member to a group. Adds the organization member to the group. The group and user must belong to the current organization. Adding an existing member is idempotent and returns the same no-content response.",
440
+ method: "PUT",
441
+ path: "/v2/organization/groups/{id}/members/{userId}",
442
+ params: [
443
+ {
444
+ name: "id",
445
+ location: "path"
446
+ },
447
+ {
448
+ name: "userId",
449
+ location: "path"
450
+ }
451
+ ],
452
+ hasBody: false,
453
+ annotations: {
454
+ readOnlyHint: false,
455
+ destructiveHint: false,
456
+ idempotentHint: true,
457
+ openWorldHint: true
458
+ },
459
+ inputSchema: {
460
+ type: "object",
461
+ properties: {
462
+ id: {
463
+ type: "string",
464
+ minLength: 1,
465
+ description: "Group ID."
466
+ },
467
+ userId: {
468
+ type: "string",
469
+ minLength: 1,
470
+ description: "Organization member user ID."
471
+ }
472
+ },
473
+ required: ["id", "userId"]
474
+ }
475
+ },
476
+ {
477
+ name: "attach-cost-center-resource",
478
+ title: "Attach cost center resource",
479
+ operationId: "attachCostCenterResource",
480
+ description: "Attribute a resource to a cost center. Attributes a resource to a cost center. Repeating the request is a no-op. A resource belongs to at most one cost center; one already attributed elsewhere is rejected with 409 rather than moved.",
481
+ method: "PUT",
482
+ path: "/v2/cost-centers/{id}/{resourceType}/{resourceId}",
483
+ params: [
484
+ {
485
+ name: "id",
486
+ location: "path"
487
+ },
488
+ {
489
+ name: "resourceType",
490
+ location: "path"
491
+ },
492
+ {
493
+ name: "resourceId",
494
+ location: "path"
495
+ }
496
+ ],
497
+ hasBody: false,
498
+ annotations: {
499
+ readOnlyHint: false,
500
+ destructiveHint: false,
501
+ idempotentHint: true,
502
+ openWorldHint: true
503
+ },
504
+ inputSchema: {
505
+ type: "object",
506
+ properties: {
507
+ id: {
508
+ type: "string",
509
+ minLength: 1,
510
+ description: "Cost center identifier."
511
+ },
512
+ resourceType: {
513
+ $ref: "#/$defs/ResourceType",
514
+ description: "Kind of resource.",
515
+ type: "string"
516
+ },
517
+ resourceId: {
518
+ type: "string",
519
+ minLength: 1,
520
+ description: "Resource identifier."
521
+ }
522
+ },
523
+ required: ["id", "resourceType", "resourceId"],
524
+ $defs: {
525
+ ResourceType: {
526
+ type: "string",
527
+ description: "Kind of resource a cost center or tag can be attached to.",
528
+ enum: ["POD", "CLUSTER", "SERVERLESS_ENDPOINT", "NETWORK_VOLUME"]
529
+ }
530
+ }
531
+ }
532
+ },
435
533
  {
436
534
  name: "create-cluster",
437
535
  title: "Create cluster",
@@ -530,7 +628,6 @@ var generatedTools = [
530
628
  },
531
629
  network: {
532
630
  type: "array",
533
- maxItems: 1,
534
631
  items: {
535
632
  $ref: "#/$defs/NetworkMount"
536
633
  }
@@ -552,7 +649,7 @@ var generatedTools = [
552
649
  gpuCountPerPod: {
553
650
  type: "integer",
554
651
  minimum: 1,
555
- description: "Number of GPUs on each pod. Bounded above by the GPU type's per-cloud maximum (GpuType.maxCount); the upstream rejects values beyond it.",
652
+ description: "Number of GPUs on each pod. Bounded above by the GPU type's per-cloud maximum (GpuType.maxCount); values beyond it are rejected.",
556
653
  examples: [8]
557
654
  },
558
655
  podCount: {
@@ -565,7 +662,7 @@ var generatedTools = [
565
662
  }
566
663
  },
567
664
  ClusterMounts: {
568
- description: "Storage mounts for a cluster create: `persistent` or `network`, not both. Clusters cannot mount global volumes, so `global` is rejected.",
665
+ description: "Storage mounts for a cluster create: `persistent` or one `network` volume, not both. Clusters cannot mount global volumes, so `global` is rejected.",
569
666
  "x-go-type": "BaseMounts",
570
667
  allOf: [
571
668
  {
@@ -585,6 +682,7 @@ var generatedTools = [
585
682
  },
586
683
  network: {
587
684
  type: "array",
685
+ maxItems: 1,
588
686
  items: {
589
687
  type: "object",
590
688
  properties: {
@@ -663,7 +761,7 @@ var generatedTools = [
663
761
  type: "object",
664
762
  required: ["volumeId", "path"],
665
763
  additionalProperties: false,
666
- description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods. The underlying `volumeId` is immutable post-create; the mount `path` may be changed via PATCH.",
764
+ description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods. On a pod, the volume can be mounted, moved, or unmounted after creation (see `UpdatePodMounts`).",
667
765
  properties: {
668
766
  volumeId: {
669
767
  type: "string",
@@ -686,7 +784,7 @@ var generatedTools = [
686
784
  size: {
687
785
  type: "integer",
688
786
  minimum: 10,
689
- description: "Host-local persistent storage in GB. Upstream enforces a 10 GB floor.",
787
+ description: "Host-local persistent storage in GB. Minimum 10 GB.",
690
788
  examples: [20]
691
789
  },
692
790
  path: {
@@ -699,6 +797,77 @@ var generatedTools = [
699
797
  }
700
798
  }
701
799
  },
800
+ {
801
+ name: "create-cost-center",
802
+ title: "Create cost center",
803
+ operationId: "createCostCenter",
804
+ description: "Create a cost center. Creates a cost center \u2014 a named label that groups resource spend so it can be broken out in billing. Pass `resources` to attribute resources at creation time; attaching is all-or-nothing, and a resource that already belongs to another cost center is rejected rather than moved.",
805
+ method: "POST",
806
+ path: "/v2/cost-centers",
807
+ params: [],
808
+ hasBody: true,
809
+ annotations: {
810
+ readOnlyHint: false,
811
+ destructiveHint: false,
812
+ idempotentHint: false,
813
+ openWorldHint: true
814
+ },
815
+ inputSchema: {
816
+ type: "object",
817
+ properties: {
818
+ body: {
819
+ $ref: "#/$defs/CreateCostCenterRequest",
820
+ type: "object"
821
+ }
822
+ },
823
+ required: ["body"],
824
+ $defs: {
825
+ CostCenterResource: {
826
+ type: "object",
827
+ additionalProperties: false,
828
+ required: ["id", "type"],
829
+ properties: {
830
+ id: {
831
+ type: "string",
832
+ minLength: 1,
833
+ examples: ["p9k2m4n6q8"]
834
+ },
835
+ type: {
836
+ $ref: "#/$defs/ResourceType"
837
+ }
838
+ }
839
+ },
840
+ CreateCostCenterRequest: {
841
+ type: "object",
842
+ additionalProperties: false,
843
+ required: ["value"],
844
+ properties: {
845
+ value: {
846
+ type: "string",
847
+ minLength: 1,
848
+ maxLength: 50,
849
+ pattern: "^\\s*\\S",
850
+ description: "Leading and trailing whitespace is trimmed.",
851
+ examples: ["team-ml"]
852
+ },
853
+ resources: {
854
+ type: "array",
855
+ description: "Resources to attribute to the new cost center.",
856
+ maxItems: 100,
857
+ items: {
858
+ $ref: "#/$defs/CostCenterResource"
859
+ }
860
+ }
861
+ }
862
+ },
863
+ ResourceType: {
864
+ type: "string",
865
+ description: "Kind of resource a cost center or tag can be attached to.",
866
+ enum: ["POD", "CLUSTER", "SERVERLESS_ENDPOINT", "NETWORK_VOLUME"]
867
+ }
868
+ }
869
+ }
870
+ },
702
871
  {
703
872
  name: "create-delegation",
704
873
  title: "Create ECR delegation",
@@ -1227,6 +1396,7 @@ var generatedTools = [
1227
1396
  type: "string",
1228
1397
  minLength: 1,
1229
1398
  maxLength: 191,
1399
+ pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
1230
1400
  description: "Human-readable name, 1\u2013191 characters with at least one non-whitespace character. Leading and trailing whitespace is trimmed.",
1231
1401
  examples: ["training-data"]
1232
1402
  }
@@ -1302,6 +1472,169 @@ var generatedTools = [
1302
1472
  }
1303
1473
  }
1304
1474
  },
1475
+ {
1476
+ name: "create-organization-group",
1477
+ title: "Create organization group",
1478
+ operationId: "createOrganizationGroup",
1479
+ description: "Create a group in your current organization",
1480
+ method: "POST",
1481
+ path: "/v2/organization/groups",
1482
+ params: [],
1483
+ hasBody: true,
1484
+ annotations: {
1485
+ readOnlyHint: false,
1486
+ destructiveHint: false,
1487
+ idempotentHint: false,
1488
+ openWorldHint: true
1489
+ },
1490
+ inputSchema: {
1491
+ type: "object",
1492
+ properties: {
1493
+ body: {
1494
+ $ref: "#/$defs/CreateOrganizationGroupRequest",
1495
+ type: "object"
1496
+ }
1497
+ },
1498
+ required: ["body"],
1499
+ $defs: {
1500
+ CreateOrganizationGroupRequest: {
1501
+ type: "object",
1502
+ additionalProperties: false,
1503
+ required: ["name"],
1504
+ properties: {
1505
+ name: {
1506
+ type: "string",
1507
+ minLength: 1,
1508
+ maxLength: 191,
1509
+ pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
1510
+ description: "Group name with at least one non-whitespace character; surrounding whitespace is trimmed.",
1511
+ examples: ["Engineering"]
1512
+ }
1513
+ }
1514
+ }
1515
+ }
1516
+ }
1517
+ },
1518
+ {
1519
+ name: "create-organization-invite",
1520
+ title: "Create organization invite",
1521
+ operationId: "createOrganizationInvite",
1522
+ description: "Invite a user to your organization. Sends an invitation to join the authenticated caller's organization and returns the pending invite; `expiresAt` is when it lapses. The invitee receives an email carrying the acceptance link, which is never returned here. Returns 409 when the address already belongs to a member or to a pending invite, or when the organization has reached its pending-invite limit; 404 when the role is unknown to the organization; and 403 when the caller does not hold every capability the role grants. Inviting requires the organization's invite-management capability, which the built-in admin role holds; other members, and callers outside an organization, receive 403, as does a caller for whom organizations are unavailable.",
1523
+ method: "POST",
1524
+ path: "/v2/organization/invites",
1525
+ params: [],
1526
+ hasBody: true,
1527
+ annotations: {
1528
+ readOnlyHint: false,
1529
+ destructiveHint: false,
1530
+ idempotentHint: false,
1531
+ openWorldHint: true
1532
+ },
1533
+ inputSchema: {
1534
+ type: "object",
1535
+ properties: {
1536
+ body: {
1537
+ $ref: "#/$defs/CreateOrganizationInviteRequest",
1538
+ type: "object"
1539
+ }
1540
+ },
1541
+ required: ["body"],
1542
+ $defs: {
1543
+ CreateOrganizationInviteRequest: {
1544
+ type: "object",
1545
+ additionalProperties: false,
1546
+ required: ["email", "role"],
1547
+ properties: {
1548
+ email: {
1549
+ type: "string",
1550
+ format: "email",
1551
+ minLength: 1,
1552
+ maxLength: 254,
1553
+ description: "Address to invite, stored lowercased. The invitee accepts by signing in with a verified account on this address.",
1554
+ examples: ["new-member@example.com"]
1555
+ },
1556
+ role: {
1557
+ $ref: "#/$defs/OrganizationRoleInput"
1558
+ }
1559
+ }
1560
+ },
1561
+ OrganizationRoleInput: {
1562
+ type: "object",
1563
+ description: "An organization role to assign, by ID.",
1564
+ additionalProperties: false,
1565
+ required: ["id"],
1566
+ properties: {
1567
+ id: {
1568
+ type: "string",
1569
+ minLength: 1,
1570
+ description: "Role ID, as reported on a member or an invite: `builtin:admin`, `builtin:dev`, `builtin:billing`, `builtin:basic`, or a custom role's own ID.",
1571
+ examples: ["builtin:dev"]
1572
+ }
1573
+ }
1574
+ }
1575
+ }
1576
+ }
1577
+ },
1578
+ {
1579
+ name: "create-organization-role",
1580
+ title: "Create organization role",
1581
+ operationId: "createOrganizationRole",
1582
+ description: "Create a custom organization role. Creates a custom role in the authenticated caller's organization and returns it. Returns 409 when the organization already has a role with this name or has reached its custom-role limit; 422 when a capability is unknown or the name is reserved; and 403 when the caller does not hold every capability the role grants. Creating roles requires the organization's role-management capability, which the built-in admin role holds; other members, and callers outside an organization, receive 403, as does a caller for whom organizations are unavailable.",
1583
+ method: "POST",
1584
+ path: "/v2/organization/roles",
1585
+ params: [],
1586
+ hasBody: true,
1587
+ annotations: {
1588
+ readOnlyHint: false,
1589
+ destructiveHint: false,
1590
+ idempotentHint: false,
1591
+ openWorldHint: true
1592
+ },
1593
+ inputSchema: {
1594
+ type: "object",
1595
+ properties: {
1596
+ body: {
1597
+ $ref: "#/$defs/CreateOrganizationRoleRequest",
1598
+ type: "object"
1599
+ }
1600
+ },
1601
+ required: ["body"],
1602
+ $defs: {
1603
+ CreateOrganizationRoleRequest: {
1604
+ type: "object",
1605
+ additionalProperties: false,
1606
+ required: ["name", "capabilities"],
1607
+ properties: {
1608
+ name: {
1609
+ $ref: "#/$defs/OrganizationRoleName"
1610
+ },
1611
+ capabilities: {
1612
+ $ref: "#/$defs/OrganizationRoleCapabilitiesInput"
1613
+ }
1614
+ }
1615
+ },
1616
+ OrganizationRoleCapabilitiesInput: {
1617
+ type: "array",
1618
+ description: "What the role grants, as `FAMILY:VERB` capabilities from `get-organization-role-capabilities`. The caller must hold every capability it lists.",
1619
+ minItems: 1,
1620
+ uniqueItems: true,
1621
+ items: {
1622
+ type: "string",
1623
+ pattern: "^[A-Z0-9_]+:[A-Z0-9_]+$"
1624
+ },
1625
+ examples: [["POD:VIEW"]]
1626
+ },
1627
+ OrganizationRoleName: {
1628
+ type: "string",
1629
+ minLength: 1,
1630
+ maxLength: 191,
1631
+ pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
1632
+ description: "Display name, 1\u2013191 characters with at least one non-whitespace character. Leading and trailing whitespace is trimmed. It must be unique within the organization and cannot be a built-in role's name.",
1633
+ examples: ["Pod viewer"]
1634
+ }
1635
+ }
1636
+ }
1637
+ },
1305
1638
  {
1306
1639
  name: "create-pod",
1307
1640
  title: "Create Pod",
@@ -1422,6 +1755,7 @@ var generatedTools = [
1422
1755
  count: {
1423
1756
  type: "integer",
1424
1757
  minimum: 1,
1758
+ maximum: 1024,
1425
1759
  default: 1,
1426
1760
  description: "Number of GPUs",
1427
1761
  examples: [1]
@@ -1436,7 +1770,6 @@ var generatedTools = [
1436
1770
  },
1437
1771
  network: {
1438
1772
  type: "array",
1439
- maxItems: 1,
1440
1773
  items: {
1441
1774
  $ref: "#/$defs/NetworkMount"
1442
1775
  }
@@ -1500,12 +1833,14 @@ var generatedTools = [
1500
1833
  minRamPerGpu: {
1501
1834
  type: "integer",
1502
1835
  minimum: 1,
1836
+ maximum: 65536,
1503
1837
  description: "Minimum host system RAM in GB per requested GPU. This is a placement filter, not a resource request. The actual total allocated system RAM may be higher and is returned in gpu.memory.",
1504
1838
  examples: [8]
1505
1839
  },
1506
1840
  minVcpuCountPerGpu: {
1507
1841
  type: "integer",
1508
1842
  minimum: 1,
1843
+ maximum: 4096,
1509
1844
  description: "Minimum host vCPU count per requested GPU. This is a placement filter, not a resource request. The actual total allocated vCPU count may be higher and is returned in gpu.vcpuCount.",
1510
1845
  examples: [2]
1511
1846
  }
@@ -1596,7 +1931,7 @@ var generatedTools = [
1596
1931
  type: "object",
1597
1932
  required: ["volumeId"],
1598
1933
  additionalProperties: false,
1599
- description: "Reference to a GlobalVolume. Usage-billed, so it has no size. The underlying `volumeId` is immutable post-create; the mount `path` may be changed via PATCH.",
1934
+ description: "Reference to a GlobalVolume. Usage-billed, so it has no size. On a pod, the volume can be mounted, moved, or unmounted after creation (see `UpdatePodMounts`).",
1600
1935
  properties: {
1601
1936
  volumeId: {
1602
1937
  type: "string",
@@ -1605,7 +1940,7 @@ var generatedTools = [
1605
1940
  },
1606
1941
  path: {
1607
1942
  type: "string",
1608
- description: "Mount path inside the container. Optional on create, where a default is chosen for you; a PATCH that omits it leaves the path unchanged.",
1943
+ description: "Mount path inside the container. Optional; a default is chosen for you when omitted.",
1609
1944
  examples: ["/data"]
1610
1945
  }
1611
1946
  }
@@ -1619,10 +1954,18 @@ var generatedTools = [
1619
1954
  {
1620
1955
  type: "object",
1621
1956
  properties: {
1957
+ network: {
1958
+ type: "array",
1959
+ maxItems: 4,
1960
+ description: "Up to 4 network volumes, all in the pod's data center.",
1961
+ items: {
1962
+ $ref: "#/$defs/NetworkMount"
1963
+ }
1964
+ },
1622
1965
  global: {
1623
1966
  type: "array",
1624
1967
  maxItems: 1,
1625
- description: "At most one global volume, on GPU and CPU pods, with no data center constraint. Combinable with `network` but not with `persistent` (rejected): upstream drops a persistent disk whenever a volume is attached.",
1968
+ description: "At most one global volume, on GPU and CPU pods, with no data center constraint. Combinable with `network` but not with `persistent` (rejected): a persistent disk is dropped whenever a volume is attached. Same PATCH rules as `network`.",
1626
1969
  items: {
1627
1970
  $ref: "#/$defs/GlobalMount"
1628
1971
  }
@@ -1636,7 +1979,7 @@ var generatedTools = [
1636
1979
  type: "object",
1637
1980
  required: ["volumeId", "path"],
1638
1981
  additionalProperties: false,
1639
- description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods. The underlying `volumeId` is immutable post-create; the mount `path` may be changed via PATCH.",
1982
+ description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods. On a pod, the volume can be mounted, moved, or unmounted after creation (see `UpdatePodMounts`).",
1640
1983
  properties: {
1641
1984
  volumeId: {
1642
1985
  type: "string",
@@ -1659,7 +2002,7 @@ var generatedTools = [
1659
2002
  size: {
1660
2003
  type: "integer",
1661
2004
  minimum: 10,
1662
- description: "Host-local persistent storage in GB. Upstream enforces a 10 GB floor.",
2005
+ description: "Host-local persistent storage in GB. Minimum 10 GB.",
1663
2006
  examples: [20]
1664
2007
  },
1665
2008
  path: {
@@ -1956,7 +2299,7 @@ var generatedTools = [
1956
2299
  size: {
1957
2300
  type: "integer",
1958
2301
  minimum: 10,
1959
- description: "Host-local persistent storage in GB. Upstream enforces a 10 GB floor.",
2302
+ description: "Host-local persistent storage in GB. Minimum 10 GB.",
1960
2303
  examples: [20]
1961
2304
  },
1962
2305
  path: {
@@ -2017,13 +2360,12 @@ var generatedTools = [
2017
2360
  }
2018
2361
  },
2019
2362
  {
2020
- name: "delete-endpoint",
2021
- title: "Delete endpoint",
2022
- operationId: "deleteEndpoint",
2023
- description: "Delete a serverless endpoint permanently and immediately. Verify the id belongs to the intended endpoint (get-endpoint) before deleting; delete only endpoints your own tool calls created in this conversation, or the one the user asked you to delete by id \u2014 a name found by listing is not attribution.",
2024
- directoryDescription: "Delete a Serverless endpoint permanently and immediately.",
2363
+ name: "delete-cost-center",
2364
+ title: "Delete cost center",
2365
+ operationId: "deleteCostCenter",
2366
+ description: "Delete a cost center. Deletes a cost center. The delete fails with 409 while any resource is still attributed to the cost center; detach those resources first.",
2025
2367
  method: "DELETE",
2026
- path: "/v2/serverless/{id}",
2368
+ path: "/v2/cost-centers/{id}",
2027
2369
  params: [
2028
2370
  {
2029
2371
  name: "id",
@@ -2042,21 +2384,54 @@ var generatedTools = [
2042
2384
  properties: {
2043
2385
  id: {
2044
2386
  type: "string",
2045
- description: "Serverless endpoint identifier"
2387
+ minLength: 1,
2388
+ description: "Cost center identifier."
2046
2389
  }
2047
2390
  },
2048
2391
  required: ["id"]
2049
2392
  }
2050
2393
  },
2051
2394
  {
2052
- name: "delete-global-volume",
2053
- title: "Delete global volume",
2054
- operationId: "deleteGlobalVolume",
2055
- description: "Delete a global volume. Permanently deletes a global volume and its stored data. Fails with `409` while the volume is still mounted: terminate every pod that mounts it (stopped pods count) and detach it from every serverless endpoint first. Nothing is detached or terminated on your behalf.",
2056
- method: "DELETE",
2057
- path: "/v2/global-volumes/{id}",
2058
- params: [
2059
- {
2395
+ name: "delete-endpoint",
2396
+ title: "Delete endpoint",
2397
+ operationId: "deleteEndpoint",
2398
+ description: "Delete a serverless endpoint permanently and immediately. Verify the id belongs to the intended endpoint (get-endpoint) before deleting; delete only endpoints your own tool calls created in this conversation, or the one the user asked you to delete by id \u2014 a name found by listing is not attribution.",
2399
+ directoryDescription: "Delete a Serverless endpoint permanently and immediately.",
2400
+ method: "DELETE",
2401
+ path: "/v2/serverless/{id}",
2402
+ params: [
2403
+ {
2404
+ name: "id",
2405
+ location: "path"
2406
+ }
2407
+ ],
2408
+ hasBody: false,
2409
+ annotations: {
2410
+ readOnlyHint: false,
2411
+ destructiveHint: true,
2412
+ idempotentHint: true,
2413
+ openWorldHint: true
2414
+ },
2415
+ inputSchema: {
2416
+ type: "object",
2417
+ properties: {
2418
+ id: {
2419
+ type: "string",
2420
+ description: "Serverless endpoint identifier"
2421
+ }
2422
+ },
2423
+ required: ["id"]
2424
+ }
2425
+ },
2426
+ {
2427
+ name: "delete-global-volume",
2428
+ title: "Delete global volume",
2429
+ operationId: "deleteGlobalVolume",
2430
+ description: "Delete a global volume. Permanently deletes a global volume and its stored data. Fails with `409` while the volume is still mounted: terminate every pod that mounts it (stopped pods count) and detach it from every serverless endpoint first. Nothing is detached or terminated on your behalf.",
2431
+ method: "DELETE",
2432
+ path: "/v2/global-volumes/{id}",
2433
+ params: [
2434
+ {
2060
2435
  name: "id",
2061
2436
  location: "path"
2062
2437
  }
@@ -2110,6 +2485,131 @@ var generatedTools = [
2110
2485
  required: ["id"]
2111
2486
  }
2112
2487
  },
2488
+ {
2489
+ name: "delete-organization-group",
2490
+ title: "Delete organization group",
2491
+ operationId: "deleteOrganizationGroup",
2492
+ description: "Delete a group in your current organization. Permanently deletes the group and its group memberships. Organization members are not removed. Returns 404 when the group does not exist in your current organization, including when it has already been deleted.",
2493
+ method: "DELETE",
2494
+ path: "/v2/organization/groups/{id}",
2495
+ params: [
2496
+ {
2497
+ name: "id",
2498
+ location: "path"
2499
+ }
2500
+ ],
2501
+ hasBody: false,
2502
+ annotations: {
2503
+ readOnlyHint: false,
2504
+ destructiveHint: true,
2505
+ idempotentHint: true,
2506
+ openWorldHint: true
2507
+ },
2508
+ inputSchema: {
2509
+ type: "object",
2510
+ properties: {
2511
+ id: {
2512
+ type: "string",
2513
+ minLength: 1,
2514
+ description: "Group ID."
2515
+ }
2516
+ },
2517
+ required: ["id"]
2518
+ }
2519
+ },
2520
+ {
2521
+ name: "delete-organization-invite",
2522
+ title: "Delete organization invite",
2523
+ operationId: "deleteOrganizationInvite",
2524
+ description: "Cancel an organization invite. Cancels one invitation to the authenticated caller's organization; the invitee can no longer accept it. Returns 404 when the ID is unknown to the caller's organization: never issued, already accepted, already cancelled, or issued by another organization. An expired invite can still be cancelled. Cancelling invites requires the organization's invite-management capability, which the built-in admin role holds; other members, and callers outside an organization, receive 403, as does a caller for whom organizations are unavailable.",
2525
+ method: "DELETE",
2526
+ path: "/v2/organization/invites/{id}",
2527
+ params: [
2528
+ {
2529
+ name: "id",
2530
+ location: "path"
2531
+ }
2532
+ ],
2533
+ hasBody: false,
2534
+ annotations: {
2535
+ readOnlyHint: false,
2536
+ destructiveHint: true,
2537
+ idempotentHint: true,
2538
+ openWorldHint: true
2539
+ },
2540
+ inputSchema: {
2541
+ type: "object",
2542
+ properties: {
2543
+ id: {
2544
+ type: "string",
2545
+ description: "Invite identifier"
2546
+ }
2547
+ },
2548
+ required: ["id"]
2549
+ }
2550
+ },
2551
+ {
2552
+ name: "delete-organization-role",
2553
+ title: "Delete organization role",
2554
+ operationId: "deleteOrganizationRole",
2555
+ description: "Delete a custom organization role. Deletes a custom role from the authenticated caller's organization. Returns 409 while a member or a pending invite holds the role: reassign those members and cancel those invites first, since deleting never changes anyone's role. Expired invites do not block deletion. Returns 400 for a built-in role, which cannot be deleted; 404 when the ID is unknown, names another organization's role, or was already deleted. Deleting roles requires the organization's role-management capability, which the built-in admin role holds; other members, and callers outside an organization, receive 403, as does a caller for whom organizations are unavailable.",
2556
+ method: "DELETE",
2557
+ path: "/v2/organization/roles/{id}",
2558
+ params: [
2559
+ {
2560
+ name: "id",
2561
+ location: "path"
2562
+ }
2563
+ ],
2564
+ hasBody: false,
2565
+ annotations: {
2566
+ readOnlyHint: false,
2567
+ destructiveHint: true,
2568
+ idempotentHint: true,
2569
+ openWorldHint: true
2570
+ },
2571
+ inputSchema: {
2572
+ type: "object",
2573
+ properties: {
2574
+ id: {
2575
+ type: "string",
2576
+ description: "Role identifier"
2577
+ }
2578
+ },
2579
+ required: ["id"]
2580
+ }
2581
+ },
2582
+ {
2583
+ name: "delete-organization-user",
2584
+ title: "Delete organization user",
2585
+ operationId: "deleteOrganizationUser",
2586
+ description: "Remove an organization member. Removes one member from the authenticated caller's organization by user ID. Their group memberships end and the API keys attributed to them within the organization are revoked; the resources they created stay with the organization. Removing another member requires the organization's member-removal capability, which the built-in admin role holds; any member can remove themselves. The organization keeps at least one member with the built-in admin role, so removing the last one returns 409. A user who is not a member, including one from another organization, returns 404. A member without the capability removing someone else, a caller outside an organization, and a caller for whom organizations are unavailable receive 403.",
2587
+ method: "DELETE",
2588
+ path: "/v2/organization/users/{id}",
2589
+ params: [
2590
+ {
2591
+ name: "id",
2592
+ location: "path"
2593
+ }
2594
+ ],
2595
+ hasBody: false,
2596
+ annotations: {
2597
+ readOnlyHint: false,
2598
+ destructiveHint: true,
2599
+ idempotentHint: true,
2600
+ openWorldHint: true
2601
+ },
2602
+ inputSchema: {
2603
+ type: "object",
2604
+ properties: {
2605
+ id: {
2606
+ type: "string",
2607
+ description: "User identifier"
2608
+ }
2609
+ },
2610
+ required: ["id"]
2611
+ }
2612
+ },
2113
2613
  {
2114
2614
  name: "delete-pod",
2115
2615
  title: "Delete Pod",
@@ -2235,6 +2735,63 @@ var generatedTools = [
2235
2735
  required: ["id"]
2236
2736
  }
2237
2737
  },
2738
+ {
2739
+ name: "detach-cost-center-resource",
2740
+ title: "Detach cost center resource",
2741
+ operationId: "detachCostCenterResource",
2742
+ description: "Remove a resource from a cost center. Removes a resource's attribution to a cost center. The resource itself is untouched. Returns 404 when the cost center does not exist or the resource is not attributed to it, so repeating a DELETE that succeeded returns 404.",
2743
+ method: "DELETE",
2744
+ path: "/v2/cost-centers/{id}/{resourceType}/{resourceId}",
2745
+ params: [
2746
+ {
2747
+ name: "id",
2748
+ location: "path"
2749
+ },
2750
+ {
2751
+ name: "resourceType",
2752
+ location: "path"
2753
+ },
2754
+ {
2755
+ name: "resourceId",
2756
+ location: "path"
2757
+ }
2758
+ ],
2759
+ hasBody: false,
2760
+ annotations: {
2761
+ readOnlyHint: false,
2762
+ destructiveHint: true,
2763
+ idempotentHint: true,
2764
+ openWorldHint: true
2765
+ },
2766
+ inputSchema: {
2767
+ type: "object",
2768
+ properties: {
2769
+ id: {
2770
+ type: "string",
2771
+ minLength: 1,
2772
+ description: "Cost center identifier."
2773
+ },
2774
+ resourceType: {
2775
+ $ref: "#/$defs/ResourceType",
2776
+ description: "Kind of resource.",
2777
+ type: "string"
2778
+ },
2779
+ resourceId: {
2780
+ type: "string",
2781
+ minLength: 1,
2782
+ description: "Resource identifier."
2783
+ }
2784
+ },
2785
+ required: ["id", "resourceType", "resourceId"],
2786
+ $defs: {
2787
+ ResourceType: {
2788
+ type: "string",
2789
+ description: "Kind of resource a cost center or tag can be attached to.",
2790
+ enum: ["POD", "CLUSTER", "SERVERLESS_ENDPOINT", "NETWORK_VOLUME"]
2791
+ }
2792
+ }
2793
+ }
2794
+ },
2238
2795
  {
2239
2796
  name: "get-cluster",
2240
2797
  title: "Get cluster",
@@ -2266,6 +2823,38 @@ var generatedTools = [
2266
2823
  required: ["id"]
2267
2824
  }
2268
2825
  },
2826
+ {
2827
+ name: "get-cost-center",
2828
+ title: "Get cost center",
2829
+ operationId: "getCostCenter",
2830
+ description: "Get a cost center. Returns one cost center. Its attributed resources are listed by `GET /v2/cost-centers/{id}/resources`. Returns 404 when the cost center does not exist or is not the caller's.",
2831
+ method: "GET",
2832
+ path: "/v2/cost-centers/{id}",
2833
+ params: [
2834
+ {
2835
+ name: "id",
2836
+ location: "path"
2837
+ }
2838
+ ],
2839
+ hasBody: false,
2840
+ annotations: {
2841
+ readOnlyHint: true,
2842
+ destructiveHint: false,
2843
+ idempotentHint: true,
2844
+ openWorldHint: true
2845
+ },
2846
+ inputSchema: {
2847
+ type: "object",
2848
+ properties: {
2849
+ id: {
2850
+ type: "string",
2851
+ minLength: 1,
2852
+ description: "Cost center identifier."
2853
+ }
2854
+ },
2855
+ required: ["id"]
2856
+ }
2857
+ },
2269
2858
  {
2270
2859
  name: "get-cpu-type",
2271
2860
  title: "Get CPU type",
@@ -2418,27 +3007,252 @@ var generatedTools = [
2418
3007
  properties: {
2419
3008
  id: {
2420
3009
  type: "string",
2421
- description: "Serverless endpoint identifier"
3010
+ description: "Serverless endpoint identifier"
3011
+ }
3012
+ },
3013
+ required: ["id"]
3014
+ }
3015
+ },
3016
+ {
3017
+ name: "get-endpoint-build",
3018
+ title: "Get endpoint build",
3019
+ operationId: "getEndpointBuild",
3020
+ description: "Get a serverless endpoint build. Returns one of the endpoint's GitHub builds by id, regardless of age \u2014 no need to page through `GET /v2/serverless/{id}/builds` to reach it.",
3021
+ method: "GET",
3022
+ path: "/v2/serverless/{id}/builds/{buildId}",
3023
+ params: [
3024
+ {
3025
+ name: "id",
3026
+ location: "path"
3027
+ },
3028
+ {
3029
+ name: "buildId",
3030
+ location: "path"
3031
+ }
3032
+ ],
3033
+ hasBody: false,
3034
+ annotations: {
3035
+ readOnlyHint: true,
3036
+ destructiveHint: false,
3037
+ idempotentHint: true,
3038
+ openWorldHint: true
3039
+ },
3040
+ inputSchema: {
3041
+ type: "object",
3042
+ properties: {
3043
+ id: {
3044
+ type: "string",
3045
+ description: "Serverless endpoint identifier"
3046
+ },
3047
+ buildId: {
3048
+ type: "string",
3049
+ description: "GitHub build identifier (from `list-endpoint-builds` or a release's `buildId`)"
3050
+ }
3051
+ },
3052
+ required: ["id", "buildId"]
3053
+ }
3054
+ },
3055
+ {
3056
+ name: "get-endpoint-cold-start-metrics",
3057
+ title: "Get endpoint cold start metrics",
3058
+ operationId: "getEndpointColdStartMetrics",
3059
+ description: "Get serverless endpoint cold start metrics. Returns the cold start series shown on the endpoint's Metrics tab in the console. **Window.** `startTime` is inclusive and `endTime` is exclusive. Both are optional: `endTime` defaults to now and `startTime` to 24 hours before `endTime`, rounded down to the start of an `interval` bucket. An `endTime` in the future is treated as now. Metrics are kept for 90 days, so `startTime` must be within the last 90 days. **Interval.** Each record covers one `interval`-sized bucket, aligned to UTC. **Paging.** Records are oldest first, at most `limit` (default 1000) per page. Follow `pagination.nextCursor` while `pagination.hasNextPage` is true. The cursor keeps the first page's window, so `startTime`, `endTime`, and `interval` can be left out on later pages; if sent, they must match the first page or the cursor is rejected with 422. **Sparse series.** Buckets with no activity are omitted, not zero-filled, so `records` can be shorter than the number of buckets in the window, or empty. **Units.** `durationMs` is how long each cold start took, in milliseconds.",
3060
+ method: "GET",
3061
+ path: "/v2/serverless/{id}/metrics/cold-starts",
3062
+ params: [
3063
+ {
3064
+ name: "id",
3065
+ location: "path"
3066
+ },
3067
+ {
3068
+ name: "startTime",
3069
+ location: "query"
3070
+ },
3071
+ {
3072
+ name: "endTime",
3073
+ location: "query"
3074
+ },
3075
+ {
3076
+ name: "interval",
3077
+ location: "query"
3078
+ },
3079
+ {
3080
+ name: "cursor",
3081
+ location: "query"
3082
+ },
3083
+ {
3084
+ name: "limit",
3085
+ location: "query"
3086
+ }
3087
+ ],
3088
+ hasBody: false,
3089
+ annotations: {
3090
+ readOnlyHint: true,
3091
+ destructiveHint: false,
3092
+ idempotentHint: true,
3093
+ openWorldHint: true
3094
+ },
3095
+ inputSchema: {
3096
+ type: "object",
3097
+ properties: {
3098
+ id: {
3099
+ type: "string",
3100
+ description: "Serverless endpoint identifier"
3101
+ },
3102
+ startTime: {
3103
+ type: "string",
3104
+ format: "date-time",
3105
+ description: "Start of the window (RFC 3339), inclusive. Defaults to 24 hours before endTime, rounded down to the start of an interval bucket. Must be within the last 90 days."
3106
+ },
3107
+ endTime: {
3108
+ type: "string",
3109
+ format: "date-time",
3110
+ description: "End of the window (RFC 3339), exclusive. Defaults to now; a future value is treated as now."
3111
+ },
3112
+ interval: {
3113
+ $ref: "#/$defs/EndpointMetricsInterval",
3114
+ description: "Bucket size. Defaults to 1h.",
3115
+ type: "string"
3116
+ },
3117
+ cursor: {
3118
+ type: "string",
3119
+ minLength: 1,
3120
+ description: "Opaque resume cursor \u2014 pass the previous response's `pagination.nextCursor` through verbatim; omit for the first page. A cursor is only valid for the operation and parameters that issued it; a malformed or foreign cursor is rejected."
3121
+ },
3122
+ limit: {
3123
+ type: "integer",
3124
+ minimum: 1,
3125
+ maximum: 1e3,
3126
+ description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
3127
+ }
3128
+ },
3129
+ required: ["id"],
3130
+ $defs: {
3131
+ EndpointMetricsInterval: {
3132
+ type: "string",
3133
+ enum: ["1m", "5m", "15m", "30m", "1h", "6h", "12h", "1d"],
3134
+ default: "1h",
3135
+ description: "Bucket size for endpoint metrics."
3136
+ }
3137
+ }
3138
+ }
3139
+ },
3140
+ {
3141
+ name: "get-endpoint-request-metrics",
3142
+ title: "Get endpoint request metrics",
3143
+ operationId: "getEndpointRequestMetrics",
3144
+ description: "Get serverless endpoint request metrics. Returns the request series shown on the endpoint's Metrics tab in the console. **Window.** `startTime` is inclusive and `endTime` is exclusive. Both are optional: `endTime` defaults to now and `startTime` to 24 hours before `endTime`, rounded down to the start of an `interval` bucket. An `endTime` in the future is treated as now. Metrics are kept for 90 days, so `startTime` must be within the last 90 days. **Interval.** Each record covers one `interval`-sized bucket, aligned to UTC. **Paging.** Records are oldest first, at most `limit` (default 1000) per page. Follow `pagination.nextCursor` while `pagination.hasNextPage` is true. The cursor keeps the first page's window, so `startTime`, `endTime`, and `interval` can be left out on later pages; if sent, they must match the first page or the cursor is rejected with 422. **Sparse series.** Buckets with no activity are omitted, not zero-filled, so `records` can be shorter than the number of buckets in the window, or empty. **Units.** Durations are milliseconds. `executionTimeMs` is the time a worker spent running a request; `delayTimeMs` is the time a request waited in the queue before a worker picked it up.",
3145
+ method: "GET",
3146
+ path: "/v2/serverless/{id}/metrics/requests",
3147
+ params: [
3148
+ {
3149
+ name: "id",
3150
+ location: "path"
3151
+ },
3152
+ {
3153
+ name: "startTime",
3154
+ location: "query"
3155
+ },
3156
+ {
3157
+ name: "endTime",
3158
+ location: "query"
3159
+ },
3160
+ {
3161
+ name: "interval",
3162
+ location: "query"
3163
+ },
3164
+ {
3165
+ name: "cursor",
3166
+ location: "query"
3167
+ },
3168
+ {
3169
+ name: "limit",
3170
+ location: "query"
3171
+ }
3172
+ ],
3173
+ hasBody: false,
3174
+ annotations: {
3175
+ readOnlyHint: true,
3176
+ destructiveHint: false,
3177
+ idempotentHint: true,
3178
+ openWorldHint: true
3179
+ },
3180
+ inputSchema: {
3181
+ type: "object",
3182
+ properties: {
3183
+ id: {
3184
+ type: "string",
3185
+ description: "Serverless endpoint identifier"
3186
+ },
3187
+ startTime: {
3188
+ type: "string",
3189
+ format: "date-time",
3190
+ description: "Start of the window (RFC 3339), inclusive. Defaults to 24 hours before endTime, rounded down to the start of an interval bucket. Must be within the last 90 days."
3191
+ },
3192
+ endTime: {
3193
+ type: "string",
3194
+ format: "date-time",
3195
+ description: "End of the window (RFC 3339), exclusive. Defaults to now; a future value is treated as now."
3196
+ },
3197
+ interval: {
3198
+ $ref: "#/$defs/EndpointMetricsInterval",
3199
+ description: "Bucket size. Defaults to 1h.",
3200
+ type: "string"
3201
+ },
3202
+ cursor: {
3203
+ type: "string",
3204
+ minLength: 1,
3205
+ description: "Opaque resume cursor \u2014 pass the previous response's `pagination.nextCursor` through verbatim; omit for the first page. A cursor is only valid for the operation and parameters that issued it; a malformed or foreign cursor is rejected."
3206
+ },
3207
+ limit: {
3208
+ type: "integer",
3209
+ minimum: 1,
3210
+ maximum: 1e3,
3211
+ description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
3212
+ }
3213
+ },
3214
+ required: ["id"],
3215
+ $defs: {
3216
+ EndpointMetricsInterval: {
3217
+ type: "string",
3218
+ enum: ["1m", "5m", "15m", "30m", "1h", "6h", "12h", "1d"],
3219
+ default: "1h",
3220
+ description: "Bucket size for endpoint metrics."
2422
3221
  }
2423
- },
2424
- required: ["id"]
3222
+ }
2425
3223
  }
2426
3224
  },
2427
3225
  {
2428
- name: "get-endpoint-build",
2429
- title: "Get endpoint build",
2430
- operationId: "getEndpointBuild",
2431
- description: "Get a serverless endpoint build. Returns one of the endpoint's GitHub builds by id, regardless of age \u2014 no need to page through `GET /v2/serverless/{id}/builds` to reach it.",
3226
+ name: "get-endpoint-worker-metrics",
3227
+ title: "Get endpoint worker metrics",
3228
+ operationId: "getEndpointWorkerMetrics",
3229
+ description: "Get serverless endpoint worker metrics. Returns the worker state series shown on the endpoint's Metrics tab in the console. For the current worker list, use `GET /v2/serverless/{id}/workers`. **Window.** `startTime` is inclusive and `endTime` is exclusive. Both are optional: `endTime` defaults to now and `startTime` to 24 hours before `endTime`, rounded down to the start of an `interval` bucket. An `endTime` in the future is treated as now. Metrics are kept for 90 days, so `startTime` must be within the last 90 days. **Interval.** Each record covers one `interval`-sized bucket, aligned to UTC. **Paging.** Records are oldest first, at most `limit` (default 1000) per page. Follow `pagination.nextCursor` while `pagination.hasNextPage` is true. The cursor keeps the first page's window, so `startTime`, `endTime`, and `interval` can be left out on later pages; if sent, they must match the first page or the cursor is rejected with 422. **Sparse series.** Buckets with no activity are omitted, not zero-filled, so `records` can be shorter than the number of buckets in the window, or empty. **Snapshots.** Each record holds the last worker-count snapshot in its bucket, as point-in-time counts.",
2432
3230
  method: "GET",
2433
- path: "/v2/serverless/{id}/builds/{buildId}",
3231
+ path: "/v2/serverless/{id}/metrics/workers",
2434
3232
  params: [
2435
3233
  {
2436
3234
  name: "id",
2437
3235
  location: "path"
2438
3236
  },
2439
3237
  {
2440
- name: "buildId",
2441
- location: "path"
3238
+ name: "startTime",
3239
+ location: "query"
3240
+ },
3241
+ {
3242
+ name: "endTime",
3243
+ location: "query"
3244
+ },
3245
+ {
3246
+ name: "interval",
3247
+ location: "query"
3248
+ },
3249
+ {
3250
+ name: "cursor",
3251
+ location: "query"
3252
+ },
3253
+ {
3254
+ name: "limit",
3255
+ location: "query"
2442
3256
  }
2443
3257
  ],
2444
3258
  hasBody: false,
@@ -2455,12 +3269,42 @@ var generatedTools = [
2455
3269
  type: "string",
2456
3270
  description: "Serverless endpoint identifier"
2457
3271
  },
2458
- buildId: {
3272
+ startTime: {
2459
3273
  type: "string",
2460
- description: "GitHub build identifier (from `list-endpoint-builds` or a release's `buildId`)"
3274
+ format: "date-time",
3275
+ description: "Start of the window (RFC 3339), inclusive. Defaults to 24 hours before endTime, rounded down to the start of an interval bucket. Must be within the last 90 days."
3276
+ },
3277
+ endTime: {
3278
+ type: "string",
3279
+ format: "date-time",
3280
+ description: "End of the window (RFC 3339), exclusive. Defaults to now; a future value is treated as now."
3281
+ },
3282
+ interval: {
3283
+ $ref: "#/$defs/EndpointMetricsInterval",
3284
+ description: "Bucket size. Defaults to 1h.",
3285
+ type: "string"
3286
+ },
3287
+ cursor: {
3288
+ type: "string",
3289
+ minLength: 1,
3290
+ description: "Opaque resume cursor \u2014 pass the previous response's `pagination.nextCursor` through verbatim; omit for the first page. A cursor is only valid for the operation and parameters that issued it; a malformed or foreign cursor is rejected."
3291
+ },
3292
+ limit: {
3293
+ type: "integer",
3294
+ minimum: 1,
3295
+ maximum: 1e3,
3296
+ description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
2461
3297
  }
2462
3298
  },
2463
- required: ["id", "buildId"]
3299
+ required: ["id"],
3300
+ $defs: {
3301
+ EndpointMetricsInterval: {
3302
+ type: "string",
3303
+ enum: ["1m", "5m", "15m", "30m", "1h", "6h", "12h", "1d"],
3304
+ default: "1h",
3305
+ description: "Bucket size for endpoint metrics."
3306
+ }
3307
+ }
2464
3308
  }
2465
3309
  },
2466
3310
  {
@@ -2575,7 +3419,7 @@ var generatedTools = [
2575
3419
  },
2576
3420
  cloud: {
2577
3421
  $ref: "#/$defs/GpuCloudFilter",
2578
- description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY. Upstream default when omitted: SECURE.",
3422
+ description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY. Default when omitted: SECURE.",
2579
3423
  type: "string"
2580
3424
  },
2581
3425
  countryCodes: {
@@ -2671,6 +3515,146 @@ var generatedTools = [
2671
3515
  properties: {}
2672
3516
  }
2673
3517
  },
3518
+ {
3519
+ name: "get-organization-group",
3520
+ title: "Get organization group",
3521
+ operationId: "getOrganizationGroup",
3522
+ description: "Get a group in your current organization. Returns the group without its members. Returns 404 when the ID is unknown or belongs to another organization, or when the caller does not belong to an organization.",
3523
+ method: "GET",
3524
+ path: "/v2/organization/groups/{id}",
3525
+ params: [
3526
+ {
3527
+ name: "id",
3528
+ location: "path"
3529
+ }
3530
+ ],
3531
+ hasBody: false,
3532
+ annotations: {
3533
+ readOnlyHint: true,
3534
+ destructiveHint: false,
3535
+ idempotentHint: true,
3536
+ openWorldHint: true
3537
+ },
3538
+ inputSchema: {
3539
+ type: "object",
3540
+ properties: {
3541
+ id: {
3542
+ type: "string",
3543
+ minLength: 1,
3544
+ description: "Group ID."
3545
+ }
3546
+ },
3547
+ required: ["id"]
3548
+ }
3549
+ },
3550
+ {
3551
+ name: "get-organization-invite",
3552
+ title: "Get organization invite",
3553
+ operationId: "getOrganizationInvite",
3554
+ description: "Get a pending organization invite. Returns one pending invitation to the authenticated caller's organization. Only unexpired invites are pending: an invite that has expired, been accepted or been revoked returns 404, as does an ID from another organization. Reading invites requires the organization's invite-management capability, which the built-in admin role holds; other members receive 403. Returns 404 when the caller does not belong to an organization, or 403 when organizations are unavailable to the caller.",
3555
+ method: "GET",
3556
+ path: "/v2/organization/invites/{id}",
3557
+ params: [
3558
+ {
3559
+ name: "id",
3560
+ location: "path"
3561
+ }
3562
+ ],
3563
+ hasBody: false,
3564
+ annotations: {
3565
+ readOnlyHint: true,
3566
+ destructiveHint: false,
3567
+ idempotentHint: true,
3568
+ openWorldHint: true
3569
+ },
3570
+ inputSchema: {
3571
+ type: "object",
3572
+ properties: {
3573
+ id: {
3574
+ type: "string",
3575
+ description: "Invite identifier"
3576
+ }
3577
+ },
3578
+ required: ["id"]
3579
+ }
3580
+ },
3581
+ {
3582
+ name: "get-organization-role",
3583
+ title: "Get organization role",
3584
+ operationId: "getOrganizationRole",
3585
+ description: "Get an organization role. Returns one role a member or invite of the authenticated caller's organization can hold: a built-in role, or one of the organization's custom roles. Returns 404 when the ID is unknown or names another organization's custom role, or when the caller does not belong to an organization; 403 when the caller may not view the organization's roles or organizations are unavailable to the caller.",
3586
+ method: "GET",
3587
+ path: "/v2/organization/roles/{id}",
3588
+ params: [
3589
+ {
3590
+ name: "id",
3591
+ location: "path"
3592
+ }
3593
+ ],
3594
+ hasBody: false,
3595
+ annotations: {
3596
+ readOnlyHint: true,
3597
+ destructiveHint: false,
3598
+ idempotentHint: true,
3599
+ openWorldHint: true
3600
+ },
3601
+ inputSchema: {
3602
+ type: "object",
3603
+ properties: {
3604
+ id: {
3605
+ type: "string",
3606
+ description: "Role identifier"
3607
+ }
3608
+ },
3609
+ required: ["id"]
3610
+ }
3611
+ },
3612
+ {
3613
+ name: "get-organization-role-capabilities",
3614
+ title: "Get organization role capabilities",
3615
+ operationId: "getOrganizationRoleCapabilities",
3616
+ description: "List grantable role capabilities. Returns the capabilities a custom role can grant, grouped by family: each capability is a family and one of its verbs, written `FAMILY:VERB`. This is the set role creation accepts, not filtered to the caller's own access; saving a role also requires the caller to hold every capability it grants. `family` and `verb` narrow the result and apply together; with neither, the whole catalog is returned. Reading the catalog requires organization membership; other callers receive 403.",
3617
+ method: "GET",
3618
+ path: "/v2/organization/roles/capabilities",
3619
+ params: [
3620
+ {
3621
+ name: "family",
3622
+ location: "query",
3623
+ explode: false
3624
+ },
3625
+ {
3626
+ name: "verb",
3627
+ location: "query",
3628
+ explode: false
3629
+ }
3630
+ ],
3631
+ hasBody: false,
3632
+ annotations: {
3633
+ readOnlyHint: true,
3634
+ destructiveHint: false,
3635
+ idempotentHint: true,
3636
+ openWorldHint: true
3637
+ },
3638
+ inputSchema: {
3639
+ type: "object",
3640
+ properties: {
3641
+ family: {
3642
+ type: "array",
3643
+ items: {
3644
+ type: "string"
3645
+ },
3646
+ description: "Only return these capability families, matched exactly. Comma-separated; a family matching any listed value is returned. An empty value is ignored."
3647
+ },
3648
+ verb: {
3649
+ type: "array",
3650
+ items: {
3651
+ type: "string"
3652
+ },
3653
+ description: "Only return these verbs, matched exactly. Comma-separated. Each family lists only the requested verbs it has, and a family with none of them is left out. An empty value is ignored."
3654
+ }
3655
+ }
3656
+ }
3657
+ },
2674
3658
  {
2675
3659
  name: "get-organization-user",
2676
3660
  title: "Get organization user",
@@ -3050,46 +4034,126 @@ var generatedTools = [
3050
4034
  },
3051
4035
  endTime: {
3052
4036
  type: "string",
3053
- format: "date-time",
3054
- description: "End of the billing period (RFC 3339), exclusive. Defaults to now. Snapped up to the end of the bucketSize bucket it lands in (unless already on a boundary) so the window aligns with the returned records."
3055
- },
3056
- bucketSize: {
3057
- $ref: "#/$defs/BillingBucketSize",
3058
- description: "Length of each billing time bucket. Defaults to day.",
3059
- type: "string"
4037
+ format: "date-time",
4038
+ description: "End of the billing period (RFC 3339), exclusive. Defaults to now. Snapped up to the end of the bucketSize bucket it lands in (unless already on a boundary) so the window aligns with the returned records."
4039
+ },
4040
+ bucketSize: {
4041
+ $ref: "#/$defs/BillingBucketSize",
4042
+ description: "Length of each billing time bucket. Defaults to day.",
4043
+ type: "string"
4044
+ },
4045
+ lastN: {
4046
+ type: "integer",
4047
+ minimum: 1,
4048
+ description: 'Return the last N buckets of bucketSize, ending with the current (in-progress) bucket \u2014 e.g. lastN=100 with bucketSize=day is "last 100 days".'
4049
+ },
4050
+ clusterId: {
4051
+ type: "string",
4052
+ description: "Filter to a specific cluster."
4053
+ }
4054
+ },
4055
+ $defs: {
4056
+ BillingBucketSize: {
4057
+ type: "string",
4058
+ enum: ["hour", "day", "week", "month", "year"],
4059
+ default: "day",
4060
+ description: "Length of each billing time bucket.",
4061
+ examples: ["day"]
4062
+ }
4063
+ }
4064
+ }
4065
+ },
4066
+ {
4067
+ name: "list-cluster-pods",
4068
+ title: "List cluster Pods",
4069
+ operationId: "listClusterPods",
4070
+ description: "List a cluster's pods. Returns the full member pods of a cluster. The cluster summary (`GET /v2/clusters/{id}`) carries only aggregate pod counts; this endpoint returns each member as a complete Pod object.",
4071
+ method: "GET",
4072
+ path: "/v2/clusters/{id}/pods",
4073
+ params: [
4074
+ {
4075
+ name: "id",
4076
+ location: "path"
4077
+ }
4078
+ ],
4079
+ hasBody: false,
4080
+ annotations: {
4081
+ readOnlyHint: true,
4082
+ destructiveHint: false,
4083
+ idempotentHint: true,
4084
+ openWorldHint: true
4085
+ },
4086
+ inputSchema: {
4087
+ type: "object",
4088
+ properties: {
4089
+ id: {
4090
+ type: "string",
4091
+ description: "Cluster identifier"
4092
+ }
4093
+ },
4094
+ required: ["id"]
4095
+ }
4096
+ },
4097
+ {
4098
+ name: "list-clusters",
4099
+ title: "List clusters",
4100
+ operationId: "listClusters",
4101
+ description: "List clusters. Returns clusters owned by the authenticated user, cursor-paginated newest-first; an omitted `limit` defaults to 1000. Follow `pagination.nextCursor` until `hasNextPage` is false.",
4102
+ method: "GET",
4103
+ path: "/v2/clusters",
4104
+ params: [
4105
+ {
4106
+ name: "cursor",
4107
+ location: "query"
4108
+ },
4109
+ {
4110
+ name: "limit",
4111
+ location: "query"
4112
+ }
4113
+ ],
4114
+ hasBody: false,
4115
+ annotations: {
4116
+ readOnlyHint: true,
4117
+ destructiveHint: false,
4118
+ idempotentHint: true,
4119
+ openWorldHint: true
4120
+ },
4121
+ inputSchema: {
4122
+ type: "object",
4123
+ properties: {
4124
+ cursor: {
4125
+ type: "string",
4126
+ minLength: 1,
4127
+ description: "Opaque resume cursor \u2014 pass the previous response's `pagination.nextCursor` through verbatim; omit for the first page. A cursor is only valid for the operation and parameters that issued it; a malformed or foreign cursor is rejected."
3060
4128
  },
3061
- lastN: {
4129
+ limit: {
3062
4130
  type: "integer",
3063
4131
  minimum: 1,
3064
- description: 'Return the last N buckets of bucketSize, ending with the current (in-progress) bucket \u2014 e.g. lastN=100 with bucketSize=day is "last 100 days".'
3065
- },
3066
- clusterId: {
3067
- type: "string",
3068
- description: "Filter to a specific cluster."
3069
- }
3070
- },
3071
- $defs: {
3072
- BillingBucketSize: {
3073
- type: "string",
3074
- enum: ["hour", "day", "week", "month", "year"],
3075
- default: "day",
3076
- description: "Length of each billing time bucket.",
3077
- examples: ["day"]
4132
+ maximum: 1e3,
4133
+ description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
3078
4134
  }
3079
4135
  }
3080
4136
  }
3081
4137
  },
3082
4138
  {
3083
- name: "list-cluster-pods",
3084
- title: "List cluster Pods",
3085
- operationId: "listClusterPods",
3086
- description: "List a cluster's pods. Returns the full member pods of a cluster. The cluster summary (`GET /v2/clusters/{id}`) carries only aggregate pod counts; this endpoint returns each member as a complete Pod object.",
4139
+ name: "list-cost-center-resources",
4140
+ title: "List cost center resources",
4141
+ operationId: "listCostCenterResources",
4142
+ description: "List a cost center's resources. Returns the resources attributed to one cost center, cursor-paginated; an omitted `limit` defaults to 1000. Each entry is the `{type}/{id}` pair `DELETE /v2/cost-centers/{id}/{resourceType}/{resourceId}` takes. A cost center with nothing attributed returns an empty list; one that does not exist or is not the caller's returns 404.",
3087
4143
  method: "GET",
3088
- path: "/v2/clusters/{id}/pods",
4144
+ path: "/v2/cost-centers/{id}/resources",
3089
4145
  params: [
3090
4146
  {
3091
4147
  name: "id",
3092
4148
  location: "path"
4149
+ },
4150
+ {
4151
+ name: "cursor",
4152
+ location: "query"
4153
+ },
4154
+ {
4155
+ name: "limit",
4156
+ location: "query"
3093
4157
  }
3094
4158
  ],
3095
4159
  hasBody: false,
@@ -3104,20 +4168,36 @@ var generatedTools = [
3104
4168
  properties: {
3105
4169
  id: {
3106
4170
  type: "string",
3107
- description: "Cluster identifier"
4171
+ minLength: 1,
4172
+ description: "Cost center identifier."
4173
+ },
4174
+ cursor: {
4175
+ type: "string",
4176
+ minLength: 1,
4177
+ description: "Opaque resume cursor \u2014 pass the previous response's `pagination.nextCursor` through verbatim; omit for the first page. A cursor is only valid for the operation and parameters that issued it; a malformed or foreign cursor is rejected."
4178
+ },
4179
+ limit: {
4180
+ type: "integer",
4181
+ minimum: 1,
4182
+ maximum: 1e3,
4183
+ description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
3108
4184
  }
3109
4185
  },
3110
4186
  required: ["id"]
3111
4187
  }
3112
4188
  },
3113
4189
  {
3114
- name: "list-clusters",
3115
- title: "List clusters",
3116
- operationId: "listClusters",
3117
- description: "List clusters. Returns clusters owned by the authenticated user, cursor-paginated newest-first; an omitted `limit` defaults to 1000. Follow `pagination.nextCursor` until `hasNextPage` is false.",
4190
+ name: "list-cost-centers",
4191
+ title: "List cost centers",
4192
+ operationId: "listCostCenters",
4193
+ description: "List cost centers. Returns the caller's cost centers, cursor-paginated newest-first; an omitted `limit` defaults to 1000. Follow `pagination.nextCursor` until `hasNextPage` is false.",
3118
4194
  method: "GET",
3119
- path: "/v2/clusters",
4195
+ path: "/v2/cost-centers",
3120
4196
  params: [
4197
+ {
4198
+ name: "search",
4199
+ location: "query"
4200
+ },
3121
4201
  {
3122
4202
  name: "cursor",
3123
4203
  location: "query"
@@ -3137,6 +4217,11 @@ var generatedTools = [
3137
4217
  inputSchema: {
3138
4218
  type: "object",
3139
4219
  properties: {
4220
+ search: {
4221
+ type: "string",
4222
+ minLength: 1,
4223
+ description: "Case-insensitive substring match against `value`."
4224
+ },
3140
4225
  cursor: {
3141
4226
  type: "string",
3142
4227
  minLength: 1,
@@ -3681,7 +4766,7 @@ var generatedTools = [
3681
4766
  },
3682
4767
  cloud: {
3683
4768
  $ref: "#/$defs/GpuCloudFilter",
3684
- description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY. Upstream default when omitted: SECURE.",
4769
+ description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY. Default when omitted: SECURE.",
3685
4770
  type: "string"
3686
4771
  },
3687
4772
  countryCodes: {
@@ -3841,6 +4926,146 @@ var generatedTools = [
3841
4926
  }
3842
4927
  }
3843
4928
  },
4929
+ {
4930
+ name: "list-organization-group-members",
4931
+ title: "List organization group members",
4932
+ operationId: "listOrganizationGroupMembers",
4933
+ description: "List members of a group. Members are ordered newest first by membership creation time, with a unique upstream tie-breaker. Returns 404 when the group does not exist in the current organization, or when the caller does not belong to an organization.",
4934
+ method: "GET",
4935
+ path: "/v2/organization/groups/{id}/members",
4936
+ params: [
4937
+ {
4938
+ name: "id",
4939
+ location: "path"
4940
+ },
4941
+ {
4942
+ name: "cursor",
4943
+ location: "query"
4944
+ },
4945
+ {
4946
+ name: "limit",
4947
+ location: "query"
4948
+ }
4949
+ ],
4950
+ hasBody: false,
4951
+ annotations: {
4952
+ readOnlyHint: true,
4953
+ destructiveHint: false,
4954
+ idempotentHint: true,
4955
+ openWorldHint: true
4956
+ },
4957
+ inputSchema: {
4958
+ type: "object",
4959
+ properties: {
4960
+ id: {
4961
+ type: "string",
4962
+ minLength: 1,
4963
+ description: "Group ID."
4964
+ },
4965
+ cursor: {
4966
+ type: "string",
4967
+ minLength: 1,
4968
+ description: "Opaque resume cursor \u2014 pass the previous response's `pagination.nextCursor` through verbatim; omit for the first page. A cursor is only valid for the operation and parameters that issued it; a malformed or foreign cursor is rejected."
4969
+ },
4970
+ limit: {
4971
+ type: "integer",
4972
+ minimum: 1,
4973
+ maximum: 100,
4974
+ description: "Page size, 1\u2013100. Defaults to 100 when omitted."
4975
+ }
4976
+ },
4977
+ required: ["id"]
4978
+ }
4979
+ },
4980
+ {
4981
+ name: "list-organization-groups",
4982
+ title: "List organization groups",
4983
+ operationId: "listOrganizationGroups",
4984
+ description: "List groups in your current organization. Returns groups without their members or roles, ordered by creation time descending and then ID descending for deterministic pagination.",
4985
+ method: "GET",
4986
+ path: "/v2/organization/groups",
4987
+ params: [
4988
+ {
4989
+ name: "name",
4990
+ location: "query"
4991
+ },
4992
+ {
4993
+ name: "cursor",
4994
+ location: "query"
4995
+ },
4996
+ {
4997
+ name: "limit",
4998
+ location: "query"
4999
+ }
5000
+ ],
5001
+ hasBody: false,
5002
+ annotations: {
5003
+ readOnlyHint: true,
5004
+ destructiveHint: false,
5005
+ idempotentHint: true,
5006
+ openWorldHint: true
5007
+ },
5008
+ inputSchema: {
5009
+ type: "object",
5010
+ properties: {
5011
+ name: {
5012
+ type: "string",
5013
+ description: "Optional case-insensitive substring of the group name. An empty value applies no filter."
5014
+ },
5015
+ cursor: {
5016
+ type: "string",
5017
+ minLength: 1,
5018
+ description: "Opaque resume cursor \u2014 pass the previous response's `pagination.nextCursor` through verbatim; omit for the first page. A cursor is only valid for the operation and parameters that issued it; a malformed or foreign cursor is rejected."
5019
+ },
5020
+ limit: {
5021
+ type: "integer",
5022
+ minimum: 1,
5023
+ maximum: 100,
5024
+ description: "Page size, 1\u2013100. Defaults to 100 when omitted."
5025
+ }
5026
+ }
5027
+ }
5028
+ },
5029
+ {
5030
+ name: "list-organization-invites",
5031
+ title: "List organization invites",
5032
+ operationId: "listOrganizationInvites",
5033
+ description: "List pending organization invites. Returns the pending invitations to the authenticated caller's organization, newest first. Only unexpired invites are pending: an invite leaves the list once it is accepted, revoked or expired. The list is complete and takes no pagination parameters, because an organization's pending invites are capped. Reading invites requires the organization's invite-management capability, which the built-in admin role holds; other members receive 403. Returns 404 when the caller does not belong to an organization, or 403 when organizations are unavailable to the caller.",
5034
+ method: "GET",
5035
+ path: "/v2/organization/invites",
5036
+ params: [],
5037
+ hasBody: false,
5038
+ annotations: {
5039
+ readOnlyHint: true,
5040
+ destructiveHint: false,
5041
+ idempotentHint: true,
5042
+ openWorldHint: true
5043
+ },
5044
+ inputSchema: {
5045
+ type: "object",
5046
+ properties: {}
5047
+ }
5048
+ },
5049
+ {
5050
+ name: "list-organization-roles",
5051
+ title: "List organization roles",
5052
+ operationId: "listOrganizationRoles",
5053
+ description: "List organization roles. Returns every role a member or invite of the authenticated caller's organization can hold: Runpod's built-in roles and the organization's custom roles, oldest first. The list is complete and takes no pagination parameters, because an organization's custom roles are capped. Returns 404 when the caller does not belong to an organization, or 403 when organizations are unavailable to the caller.",
5054
+ method: "GET",
5055
+ path: "/v2/organization/roles",
5056
+ params: [],
5057
+ hasBody: false,
5058
+ annotations: {
5059
+ readOnlyHint: true,
5060
+ destructiveHint: false,
5061
+ idempotentHint: true,
5062
+ openWorldHint: true
5063
+ },
5064
+ inputSchema: {
5065
+ type: "object",
5066
+ properties: {}
5067
+ }
5068
+ },
3844
5069
  {
3845
5070
  name: "list-organization-users",
3846
5071
  title: "List organization users",
@@ -4195,6 +5420,47 @@ var generatedTools = [
4195
5420
  }
4196
5421
  }
4197
5422
  },
5423
+ {
5424
+ name: "remove-organization-group-member",
5425
+ title: "Remove organization group member",
5426
+ operationId: "removeOrganizationGroupMember",
5427
+ description: "Remove a member from a group. Removes the organization member from the group. The group and user must belong to the current organization. Returns 404 when the membership is absent, including repeated deletion, or when the group is unknown or belongs to another organization.",
5428
+ method: "DELETE",
5429
+ path: "/v2/organization/groups/{id}/members/{userId}",
5430
+ params: [
5431
+ {
5432
+ name: "id",
5433
+ location: "path"
5434
+ },
5435
+ {
5436
+ name: "userId",
5437
+ location: "path"
5438
+ }
5439
+ ],
5440
+ hasBody: false,
5441
+ annotations: {
5442
+ readOnlyHint: false,
5443
+ destructiveHint: true,
5444
+ idempotentHint: true,
5445
+ openWorldHint: true
5446
+ },
5447
+ inputSchema: {
5448
+ type: "object",
5449
+ properties: {
5450
+ id: {
5451
+ type: "string",
5452
+ minLength: 1,
5453
+ description: "Group ID."
5454
+ },
5455
+ userId: {
5456
+ type: "string",
5457
+ minLength: 1,
5458
+ description: "Organization member user ID."
5459
+ }
5460
+ },
5461
+ required: ["id", "userId"]
5462
+ }
5463
+ },
4198
5464
  {
4199
5465
  name: "revoke-delegation",
4200
5466
  title: "Revoke ECR delegation",
@@ -4221,17 +5487,67 @@ var generatedTools = [
4221
5487
  id: {
4222
5488
  type: "string"
4223
5489
  }
4224
- },
4225
- required: ["id"]
5490
+ },
5491
+ required: ["id"]
5492
+ }
5493
+ },
5494
+ {
5495
+ name: "update-cluster",
5496
+ title: "Update cluster",
5497
+ operationId: "updateCluster",
5498
+ description: "Rename a cluster. Renames a cluster. This endpoint only changes the cluster name \u2014 compute shape, type, and container configuration are fixed at creation and cannot be updated.",
5499
+ method: "PATCH",
5500
+ path: "/v2/clusters/{id}",
5501
+ params: [
5502
+ {
5503
+ name: "id",
5504
+ location: "path"
5505
+ }
5506
+ ],
5507
+ hasBody: true,
5508
+ annotations: {
5509
+ readOnlyHint: false,
5510
+ destructiveHint: false,
5511
+ idempotentHint: true,
5512
+ openWorldHint: true
5513
+ },
5514
+ inputSchema: {
5515
+ type: "object",
5516
+ properties: {
5517
+ id: {
5518
+ type: "string",
5519
+ description: "Cluster identifier"
5520
+ },
5521
+ body: {
5522
+ $ref: "#/$defs/UpdateClusterRequest",
5523
+ type: "object"
5524
+ }
5525
+ },
5526
+ required: ["id", "body"],
5527
+ $defs: {
5528
+ UpdateClusterRequest: {
5529
+ type: "object",
5530
+ additionalProperties: false,
5531
+ minProperties: 1,
5532
+ description: "Request body for updating a cluster. Only the cluster name can be changed \u2014 this endpoint is a rename. Compute shape, type, and container configuration are fixed at creation.",
5533
+ properties: {
5534
+ name: {
5535
+ type: "string",
5536
+ minLength: 1,
5537
+ examples: ["renamed-cluster"]
5538
+ }
5539
+ }
5540
+ }
5541
+ }
4226
5542
  }
4227
5543
  },
4228
5544
  {
4229
- name: "update-cluster",
4230
- title: "Update cluster",
4231
- operationId: "updateCluster",
4232
- description: "Rename a cluster. Renames a cluster. This endpoint only changes the cluster name \u2014 compute shape, type, and container configuration are fixed at creation and cannot be updated.",
5545
+ name: "update-cost-center",
5546
+ title: "Update cost center",
5547
+ operationId: "updateCostCenter",
5548
+ description: "Rename a cost center. Renames a cost center. Resources attributed to it are unaffected and follow the new name \u2014 the attribution is by identifier, not by name.",
4233
5549
  method: "PATCH",
4234
- path: "/v2/clusters/{id}",
5550
+ path: "/v2/cost-centers/{id}",
4235
5551
  params: [
4236
5552
  {
4237
5553
  name: "id",
@@ -4250,25 +5566,28 @@ var generatedTools = [
4250
5566
  properties: {
4251
5567
  id: {
4252
5568
  type: "string",
4253
- description: "Cluster identifier"
5569
+ minLength: 1,
5570
+ description: "Cost center identifier."
4254
5571
  },
4255
5572
  body: {
4256
- $ref: "#/$defs/UpdateClusterRequest",
5573
+ $ref: "#/$defs/UpdateCostCenterRequest",
4257
5574
  type: "object"
4258
5575
  }
4259
5576
  },
4260
5577
  required: ["id", "body"],
4261
5578
  $defs: {
4262
- UpdateClusterRequest: {
5579
+ UpdateCostCenterRequest: {
4263
5580
  type: "object",
4264
5581
  additionalProperties: false,
4265
- minProperties: 1,
4266
- description: "Request body for updating a cluster. Only the cluster name can be changed \u2014 this endpoint is a rename. Compute shape, type, and container configuration are fixed at creation.",
5582
+ required: ["value"],
4267
5583
  properties: {
4268
- name: {
5584
+ value: {
4269
5585
  type: "string",
4270
5586
  minLength: 1,
4271
- examples: ["renamed-cluster"]
5587
+ maxLength: 50,
5588
+ pattern: "^\\s*\\S",
5589
+ description: "Leading and trailing whitespace is trimmed.",
5590
+ examples: ["team-ml-eu"]
4272
5591
  }
4273
5592
  }
4274
5593
  }
@@ -4712,6 +6031,7 @@ var generatedTools = [
4712
6031
  type: "string",
4713
6032
  minLength: 1,
4714
6033
  maxLength: 191,
6034
+ pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
4715
6035
  description: "New human-readable name, 1\u2013191 characters with at least one non-whitespace character. Leading and trailing whitespace is trimmed.",
4716
6036
  examples: ["renamed-volume"]
4717
6037
  }
@@ -4778,11 +6098,218 @@ var generatedTools = [
4778
6098
  }
4779
6099
  }
4780
6100
  },
6101
+ {
6102
+ name: "update-organization-group",
6103
+ title: "Update organization group",
6104
+ operationId: "updateOrganizationGroup",
6105
+ description: "Rename a group in your current organization",
6106
+ method: "PATCH",
6107
+ path: "/v2/organization/groups/{id}",
6108
+ params: [
6109
+ {
6110
+ name: "id",
6111
+ location: "path"
6112
+ }
6113
+ ],
6114
+ hasBody: true,
6115
+ annotations: {
6116
+ readOnlyHint: false,
6117
+ destructiveHint: false,
6118
+ idempotentHint: true,
6119
+ openWorldHint: true
6120
+ },
6121
+ inputSchema: {
6122
+ type: "object",
6123
+ properties: {
6124
+ id: {
6125
+ type: "string",
6126
+ minLength: 1,
6127
+ description: "Group ID."
6128
+ },
6129
+ body: {
6130
+ $ref: "#/$defs/UpdateOrganizationGroupRequest",
6131
+ type: "object"
6132
+ }
6133
+ },
6134
+ required: ["id", "body"],
6135
+ $defs: {
6136
+ UpdateOrganizationGroupRequest: {
6137
+ type: "object",
6138
+ additionalProperties: false,
6139
+ required: ["name"],
6140
+ properties: {
6141
+ name: {
6142
+ type: "string",
6143
+ minLength: 1,
6144
+ maxLength: 191,
6145
+ pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
6146
+ description: "Group name with at least one non-whitespace character; surrounding whitespace is trimmed.",
6147
+ examples: ["Research"]
6148
+ }
6149
+ }
6150
+ }
6151
+ }
6152
+ }
6153
+ },
6154
+ {
6155
+ name: "update-organization-role",
6156
+ title: "Update organization role",
6157
+ operationId: "updateOrganizationRole",
6158
+ description: "Update a custom organization role. Changes a custom role's name, its capabilities, or both, and returns the role. Sent capabilities replace the whole grant set. Returns 400 for a built-in role, which cannot be changed; 404 when the ID is unknown or names another organization's role; 403 when the caller does not hold every capability the role grants, before or after the change; 409 when the organization already has a role with the new name; and 422 when a capability is unknown or the name is reserved. Updating roles requires the organization's role-management capability, which the built-in admin role holds; other members, and callers outside an organization, receive 403, as does a caller for whom organizations are unavailable.",
6159
+ method: "PATCH",
6160
+ path: "/v2/organization/roles/{id}",
6161
+ params: [
6162
+ {
6163
+ name: "id",
6164
+ location: "path"
6165
+ }
6166
+ ],
6167
+ hasBody: true,
6168
+ annotations: {
6169
+ readOnlyHint: false,
6170
+ destructiveHint: true,
6171
+ idempotentHint: true,
6172
+ openWorldHint: true
6173
+ },
6174
+ inputSchema: {
6175
+ type: "object",
6176
+ properties: {
6177
+ id: {
6178
+ type: "string",
6179
+ description: "Role identifier"
6180
+ },
6181
+ body: {
6182
+ $ref: "#/$defs/UpdateOrganizationRoleRequest",
6183
+ type: "object"
6184
+ }
6185
+ },
6186
+ required: ["id", "body"],
6187
+ $defs: {
6188
+ OrganizationRoleCapabilitiesInput: {
6189
+ type: "array",
6190
+ description: "What the role grants, as `FAMILY:VERB` capabilities from `get-organization-role-capabilities`. The caller must hold every capability it lists.",
6191
+ minItems: 1,
6192
+ uniqueItems: true,
6193
+ items: {
6194
+ type: "string",
6195
+ pattern: "^[A-Z0-9_]+:[A-Z0-9_]+$"
6196
+ },
6197
+ examples: [["POD:VIEW"]]
6198
+ },
6199
+ OrganizationRoleName: {
6200
+ type: "string",
6201
+ minLength: 1,
6202
+ maxLength: 191,
6203
+ pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
6204
+ description: "Display name, 1\u2013191 characters with at least one non-whitespace character. Leading and trailing whitespace is trimmed. It must be unique within the organization and cannot be a built-in role's name.",
6205
+ examples: ["Pod viewer"]
6206
+ },
6207
+ UpdateOrganizationRoleRequest: {
6208
+ type: "object",
6209
+ additionalProperties: false,
6210
+ minProperties: 1,
6211
+ description: "The fields to change; omitted fields are unchanged. `capabilities` replaces the role's whole grant set rather than adding to it.",
6212
+ properties: {
6213
+ name: {
6214
+ $ref: "#/$defs/OrganizationRoleName"
6215
+ },
6216
+ capabilities: {
6217
+ $ref: "#/$defs/OrganizationRoleCapabilitiesInput"
6218
+ }
6219
+ }
6220
+ }
6221
+ }
6222
+ }
6223
+ },
6224
+ {
6225
+ name: "update-organization-user",
6226
+ title: "Update organization user",
6227
+ operationId: "updateOrganizationUser",
6228
+ description: "Update an organization member. Changes one member of the authenticated caller's organization by user ID: assigns a role, replaces their set of groups, or both, applied together or not at all. Send at least one field; an omitted field is left as it is, and an empty `groups` list removes the member from every group. Updating members requires the organization's member-management capability, which the built-in admin role holds; other members, and callers outside an organization, receive 403, as does a caller for whom organizations are unavailable. Returns 403 when the caller changes their own role or assigns a role granting a capability the caller lacks; 409 when the change would leave the organization without a member in the built-in admin role; and 404 when the user is not a member or the role or a group is unknown to the organization, with the detail naming which.",
6229
+ method: "PATCH",
6230
+ path: "/v2/organization/users/{id}",
6231
+ params: [
6232
+ {
6233
+ name: "id",
6234
+ location: "path"
6235
+ }
6236
+ ],
6237
+ hasBody: true,
6238
+ annotations: {
6239
+ readOnlyHint: false,
6240
+ destructiveHint: true,
6241
+ idempotentHint: true,
6242
+ openWorldHint: true
6243
+ },
6244
+ inputSchema: {
6245
+ type: "object",
6246
+ properties: {
6247
+ id: {
6248
+ type: "string",
6249
+ description: "User identifier"
6250
+ },
6251
+ body: {
6252
+ $ref: "#/$defs/UpdateOrganizationUserRequest",
6253
+ type: "object"
6254
+ }
6255
+ },
6256
+ required: ["id", "body"],
6257
+ $defs: {
6258
+ OrganizationGroupInput: {
6259
+ type: "object",
6260
+ description: "An organization group, by ID.",
6261
+ additionalProperties: false,
6262
+ required: ["id"],
6263
+ properties: {
6264
+ id: {
6265
+ type: "string",
6266
+ minLength: 1,
6267
+ description: "Group ID.",
6268
+ examples: ["group_id_abc_123"]
6269
+ }
6270
+ }
6271
+ },
6272
+ OrganizationRoleInput: {
6273
+ type: "object",
6274
+ description: "An organization role to assign, by ID.",
6275
+ additionalProperties: false,
6276
+ required: ["id"],
6277
+ properties: {
6278
+ id: {
6279
+ type: "string",
6280
+ minLength: 1,
6281
+ description: "Role ID, as reported on a member or an invite: `builtin:admin`, `builtin:dev`, `builtin:billing`, `builtin:basic`, or a custom role's own ID.",
6282
+ examples: ["builtin:dev"]
6283
+ }
6284
+ }
6285
+ },
6286
+ UpdateOrganizationUserRequest: {
6287
+ type: "object",
6288
+ description: "Changes to a member. Send `role`, `groups`, or both; an omitted field is left as it is.",
6289
+ additionalProperties: false,
6290
+ minProperties: 1,
6291
+ properties: {
6292
+ role: {
6293
+ $ref: "#/$defs/OrganizationRoleInput"
6294
+ },
6295
+ groups: {
6296
+ type: "array",
6297
+ description: "The member's groups after the change: the whole set, by ID. An empty list removes the member from every group.",
6298
+ uniqueItems: true,
6299
+ items: {
6300
+ $ref: "#/$defs/OrganizationGroupInput"
6301
+ }
6302
+ }
6303
+ }
6304
+ }
6305
+ }
6306
+ }
6307
+ },
4781
6308
  {
4782
6309
  name: "update-pod",
4783
6310
  title: "Update Pod",
4784
6311
  operationId: "updatePod",
4785
- description: "Update a pod. Partially updates a pod's configuration. This is a PATCH: only the fields present in the body are changed, and omitted fields are left untouched. Use empty values only when you explicitly mean to clear a field (for example, set `registry` to `null` or set `ports` to `[]`). See `UpdatePodRequest` for the full body. Mutable fields: `name`, `image`, `args`, `disk`, `ports`, `env`, `registry`, `mounts`, `locked`, and `globalNetworking`. Some changes apply immediately while others (e.g. `globalNetworking`) take effect on the pod's next start/restart, as noted on the individual fields. Pods that belong to a Cluster cannot be updated here \u2014 manage them through `/v2/clusters/{id}`. Returns `200` with the full updated pod.",
6312
+ description: "Update a pod. Partially updates a pod's configuration. This is a PATCH: only the fields present in the body are changed, and omitted fields are left untouched. Use empty values only when you explicitly mean to clear a field (for example, set `registry` to `null` or set `ports` to `[]`). See `UpdatePodRequest` for the full body. Mutable fields: `name`, `image`, `args`, `disk`, `ports`, `env`, `registry`, `mounts`, `locked`, and `globalNetworking`. Some changes apply immediately while others (e.g. `globalNetworking`) take effect on the pod's next start/restart, as noted on the individual fields. Volumes can be mounted, moved, or unmounted after creation through `mounts`, one entry per volume; see `UpdatePodMounts` for the rules. Pods that belong to a Cluster cannot be updated here \u2014 manage them through `/v2/clusters/{id}`. Returns `200` with the full updated pod.",
4786
6313
  method: "PATCH",
4787
6314
  path: "/v2/pods/{id}",
4788
6315
  params: [
@@ -4876,21 +6403,6 @@ var generatedTools = [
4876
6403
  }
4877
6404
  }
4878
6405
  },
4879
- BaseMounts: {
4880
- type: "object",
4881
- properties: {
4882
- persistent: {
4883
- $ref: "#/$defs/PersistentMount"
4884
- },
4885
- network: {
4886
- type: "array",
4887
- maxItems: 1,
4888
- items: {
4889
- $ref: "#/$defs/NetworkMount"
4890
- }
4891
- }
4892
- }
4893
- },
4894
6406
  ContainerConfig: {
4895
6407
  allOf: [
4896
6408
  {
@@ -4908,11 +6420,11 @@ var generatedTools = [
4908
6420
  }
4909
6421
  ]
4910
6422
  },
4911
- GlobalMount: {
6423
+ GlobalMountPatch: {
4912
6424
  type: "object",
4913
6425
  required: ["volumeId"],
4914
6426
  additionalProperties: false,
4915
- description: "Reference to a GlobalVolume. Usage-billed, so it has no size. The underlying `volumeId` is immutable post-create; the mount `path` may be changed via PATCH.",
6427
+ description: "Mounts, moves, or unmounts the pod's global volume.",
4916
6428
  properties: {
4917
6429
  volumeId: {
4918
6430
  type: "string",
@@ -4921,38 +6433,21 @@ var generatedTools = [
4921
6433
  },
4922
6434
  path: {
4923
6435
  type: "string",
4924
- description: "Mount path inside the container. Optional on create, where a default is chosen for you; a PATCH that omits it leaves the path unchanged.",
6436
+ minLength: 1,
6437
+ description: "Mount path inside the container. Optional; when mounting, a default is chosen for you if omitted.",
4925
6438
  examples: ["/data"]
4926
- }
4927
- }
4928
- },
4929
- Mounts: {
4930
- description: "Storage mounts for the pod: `persistent` (size + path) excludes both `network` and `global`; `network` (volumeId + path) and `global` (volumeId, optional path) take one entry each and can be combined. Every entry needs its full shape. On update, omit the field to leave the mounts as they are; the mount kind and a volume's volumeId cannot change, and mounts cannot be cleared.",
4931
- allOf: [
4932
- {
4933
- $ref: "#/$defs/BaseMounts"
4934
6439
  },
4935
- {
4936
- type: "object",
4937
- properties: {
4938
- global: {
4939
- type: "array",
4940
- maxItems: 1,
4941
- description: "At most one global volume, on GPU and CPU pods, with no data center constraint. Combinable with `network` but not with `persistent` (rejected): upstream drops a persistent disk whenever a volume is attached.",
4942
- items: {
4943
- $ref: "#/$defs/GlobalMount"
4944
- }
4945
- }
4946
- }
6440
+ remove: {
6441
+ type: "boolean",
6442
+ description: "Unmount the volume. Cannot be combined with `path`."
4947
6443
  }
4948
- ],
4949
- unevaluatedProperties: false
6444
+ }
4950
6445
  },
4951
- NetworkMount: {
6446
+ NetworkMountPatch: {
4952
6447
  type: "object",
4953
- required: ["volumeId", "path"],
6448
+ required: ["volumeId"],
4954
6449
  additionalProperties: false,
4955
- description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods. The underlying `volumeId` is immutable post-create; the mount `path` may be changed via PATCH.",
6450
+ description: "Mounts, moves, or unmounts one network volume. Mounting a volume the pod does not have requires `path`.",
4956
6451
  properties: {
4957
6452
  volumeId: {
4958
6453
  type: "string",
@@ -4961,27 +6456,62 @@ var generatedTools = [
4961
6456
  },
4962
6457
  path: {
4963
6458
  type: "string",
4964
- description: "Mount path inside the container. No default \u2014 must be specified explicitly.",
6459
+ minLength: 1,
6460
+ description: "Mount path inside the container. Required when mounting; optional when moving a mounted volume.",
4965
6461
  examples: ["/runpod-volume"]
6462
+ },
6463
+ remove: {
6464
+ type: "boolean",
6465
+ description: "Unmount the volume. Cannot be combined with `path`."
4966
6466
  }
4967
6467
  }
4968
6468
  },
4969
- PersistentMount: {
6469
+ PersistentMountPatch: {
4970
6470
  type: "object",
4971
- required: ["size", "path"],
4972
6471
  additionalProperties: false,
4973
- description: "Host-local persistent storage. Pinned to the pod's host machine \u2014 data does not survive a host failure. Disallowed on CPU pods. Mutually exclusive with NetworkMount. Deprecated: prefer NetworkMount for any data you cannot recreate.",
6472
+ description: "Adds the pod's volume disk, grows it, or moves it. Adding a disk requires `size`; on a pod that already has one, omitted fields are left as they are. Not available on CPU pods.",
4974
6473
  properties: {
4975
6474
  size: {
4976
6475
  type: "integer",
4977
6476
  minimum: 10,
4978
- description: "Host-local persistent storage in GB. Upstream enforces a 10 GB floor.",
4979
- examples: [20]
6477
+ description: "Volume disk size in GB. Can only grow; a smaller size than the current one is rejected.",
6478
+ examples: [50]
4980
6479
  },
4981
6480
  path: {
4982
6481
  type: "string",
4983
- description: "Mount path inside the container. May be changed via PATCH.",
6482
+ minLength: 1,
6483
+ description: "Mount path inside the container.",
4984
6484
  examples: ["/workspace"]
6485
+ },
6486
+ remove: {
6487
+ type: "boolean",
6488
+ description: "Removes the volume disk. Not supported yet: `remove: true` is rejected."
6489
+ }
6490
+ }
6491
+ },
6492
+ UpdatePodMounts: {
6493
+ type: "object",
6494
+ additionalProperties: false,
6495
+ description: "Changes to a pod's mounts. Each entry names one volume by `volumeId` and changes only that volume; volumes that are not listed, and kinds that are omitted, are left as they are. Omitting `mounts` or sending `{}` changes nothing.",
6496
+ properties: {
6497
+ persistent: {
6498
+ $ref: "#/$defs/PersistentMountPatch"
6499
+ },
6500
+ network: {
6501
+ type: "array",
6502
+ maxItems: 8,
6503
+ description: "Network volumes to mount, move, or unmount. Up to 8 entries, so a request can unmount 4 volumes and mount 4 others; the pod can still hold at most 4 afterwards.",
6504
+ items: {
6505
+ $ref: "#/$defs/NetworkMountPatch"
6506
+ }
6507
+ },
6508
+ global: {
6509
+ type: "array",
6510
+ maxItems: 2,
6511
+ description: "Global volumes to mount, move, or unmount. Up to 2 entries, so a request can swap the global volume; the pod can still hold at most 1 afterwards.",
6512
+ items: {
6513
+ $ref: "#/$defs/GlobalMountPatch"
6514
+ }
4985
6515
  }
4986
6516
  }
4987
6517
  },
@@ -5002,7 +6532,7 @@ var generatedTools = [
5002
6532
  description: "Lock the pod (true) or unlock it (false). Locked pods cannot be stopped or reset."
5003
6533
  },
5004
6534
  mounts: {
5005
- $ref: "#/$defs/Mounts"
6535
+ $ref: "#/$defs/UpdatePodMounts"
5006
6536
  },
5007
6537
  name: {
5008
6538
  type: "string",
@@ -5249,7 +6779,7 @@ var generatedTools = [
5249
6779
  size: {
5250
6780
  type: "integer",
5251
6781
  minimum: 10,
5252
- description: "Host-local persistent storage in GB. Upstream enforces a 10 GB floor.",
6782
+ description: "Host-local persistent storage in GB. Minimum 10 GB.",
5253
6783
  examples: [20]
5254
6784
  },
5255
6785
  path: {
@@ -5510,33 +7040,53 @@ var CREDENTIAL_MANAGEMENT = "Manages stored credentials; OpenAI restricts plugin
5510
7040
  var CREDENTIAL_INPUT = "Takes a secret or password as input; directories forbid collecting credentials.";
5511
7041
  var ALP = "Collects conversation-derived data beyond the task; the directory profile never serves it.";
5512
7042
  var DIRECTORY_TOOLS = {
7043
+ "add-organization-group-member": IN,
7044
+ "attach-cost-center-resource": IN,
5513
7045
  "cancel-job": IN,
5514
7046
  "create-cluster": IN,
7047
+ "create-cost-center": IN,
5515
7048
  "create-delegation": IN,
5516
7049
  "create-endpoint": IN,
5517
7050
  "create-global-volume": IN,
5518
7051
  "create-network-volume": IN,
7052
+ "create-organization-group": IN,
7053
+ "create-organization-invite": IN,
7054
+ "create-organization-role": IN,
5519
7055
  "create-pod": IN,
5520
7056
  "create-template": IN,
5521
7057
  "delete-cluster": IN,
7058
+ "delete-cost-center": IN,
5522
7059
  "delete-endpoint": IN,
5523
7060
  "delete-global-volume": IN,
5524
7061
  "delete-network-volume": IN,
7062
+ "delete-organization-group": IN,
7063
+ "delete-organization-invite": IN,
7064
+ "delete-organization-role": IN,
7065
+ "delete-organization-user": IN,
5525
7066
  "delete-pod": IN,
5526
7067
  "delete-template": IN,
5527
7068
  "deploy-hub-repo": IN,
7069
+ "detach-cost-center-resource": IN,
5528
7070
  "endpoint-health": IN,
5529
7071
  "get-capacity": IN,
5530
7072
  "get-cluster": IN,
7073
+ "get-cost-center": IN,
5531
7074
  "get-cpu-type": IN,
5532
7075
  "get-data-center": IN,
5533
7076
  "get-endpoint": IN,
5534
7077
  "get-endpoint-build": IN,
7078
+ "get-endpoint-cold-start-metrics": IN,
7079
+ "get-endpoint-request-metrics": IN,
7080
+ "get-endpoint-worker-metrics": IN,
5535
7081
  "get-global-volume": IN,
5536
7082
  "get-gpu-type": IN,
5537
7083
  "get-job-status": IN,
5538
7084
  "get-network-volume": IN,
5539
7085
  "get-organization": IN,
7086
+ "get-organization-group": IN,
7087
+ "get-organization-invite": IN,
7088
+ "get-organization-role": IN,
7089
+ "get-organization-role-capabilities": IN,
5540
7090
  "get-organization-user": IN,
5541
7091
  "get-pod": IN,
5542
7092
  "get-ssh-keys": IN,
@@ -5546,6 +7096,8 @@ var DIRECTORY_TOOLS = {
5546
7096
  "list-cluster-billing": IN,
5547
7097
  "list-cluster-pods": IN,
5548
7098
  "list-clusters": IN,
7099
+ "list-cost-center-resources": IN,
7100
+ "list-cost-centers": IN,
5549
7101
  "list-cpu-types": IN,
5550
7102
  "list-data-centers": IN,
5551
7103
  "list-delegations": IN,
@@ -5559,6 +7111,10 @@ var DIRECTORY_TOOLS = {
5559
7111
  "list-hub-repos": IN,
5560
7112
  "list-network-volume-billing": IN,
5561
7113
  "list-network-volumes": IN,
7114
+ "list-organization-group-members": IN,
7115
+ "list-organization-groups": IN,
7116
+ "list-organization-invites": IN,
7117
+ "list-organization-roles": IN,
5562
7118
  "list-organization-users": IN,
5563
7119
  "list-pod-billing": IN,
5564
7120
  "list-pods": IN,
@@ -5568,6 +7124,7 @@ var DIRECTORY_TOOLS = {
5568
7124
  "list-templates": IN,
5569
7125
  "lookup-concept": IN,
5570
7126
  "purge-endpoint-queue": IN,
7127
+ "remove-organization-group-member": IN,
5571
7128
  "retry-job": IN,
5572
7129
  "revoke-delegation": IN,
5573
7130
  "search-concepts": IN,
@@ -5577,9 +7134,13 @@ var DIRECTORY_TOOLS = {
5577
7134
  "stream-pod-logs": IN,
5578
7135
  "stream-worker-logs": IN,
5579
7136
  "update-cluster": IN,
7137
+ "update-cost-center": IN,
5580
7138
  "update-endpoint": IN,
5581
7139
  "update-global-volume": IN,
5582
7140
  "update-network-volume": IN,
7141
+ "update-organization-group": IN,
7142
+ "update-organization-role": IN,
7143
+ "update-organization-user": IN,
5583
7144
  "update-pod": IN,
5584
7145
  "update-ssh-keys": IN,
5585
7146
  "update-template": IN,
@@ -8679,6 +10240,23 @@ var listPublicEndpoints = {
8679
10240
  // src/specgen/tools/knowledge.ts
8680
10241
  var import_plugin_knowledge = require("@runpod/plugin-knowledge");
8681
10242
  var knowledge = (0, import_plugin_knowledge.loadKnowledge)();
10243
+ var hiddenRules = new Set(
10244
+ (process.env.KNOWLEDGE_HIDDEN_RULES ?? "").split(",").map((id) => id.trim()).filter(Boolean)
10245
+ );
10246
+ var concepts = knowledge.concepts.map((concept) => ({
10247
+ ...concept,
10248
+ rules: concept.rules.filter((rule) => !hiddenRules.has(rule.id))
10249
+ }));
10250
+ for (const id of hiddenRules) {
10251
+ if (!knowledge.concepts.some(
10252
+ (concept) => concept.rules.some((rule) => rule.id === id)
10253
+ ))
10254
+ console.warn("knowledge_hidden_rule_unknown", {
10255
+ id,
10256
+ plugin_version: knowledge.version
10257
+ });
10258
+ }
10259
+ var visibleRuleIds = (ids) => ids.filter((id) => !hiddenRules.has(id));
8682
10260
  var GUIDE_KINDS = ["skill", "reference", "golden-path"];
8683
10261
  var STOPWORDS = new Set(
8684
10262
  "a an and are as at be by can do does for from how i in is it my of on or the to what when why with you your".split(
@@ -8721,7 +10299,7 @@ var guideSummary = ({
8721
10299
  lanes,
8722
10300
  mcp,
8723
10301
  needs_shell,
8724
- concepts
10302
+ concepts: concepts2
8725
10303
  }) => ({
8726
10304
  id,
8727
10305
  kind,
@@ -8730,7 +10308,7 @@ var guideSummary = ({
8730
10308
  lanes,
8731
10309
  mcp,
8732
10310
  needs_shell,
8733
- concepts
10311
+ concepts: concepts2
8734
10312
  });
8735
10313
  function linkedGuides(conceptId) {
8736
10314
  const byId = new Map(knowledge.guides.map((guide) => [guide.id, guide]));
@@ -8742,19 +10320,20 @@ function linkedGuides(conceptId) {
8742
10320
  seen.add(link.from);
8743
10321
  const guide = byId.get(link.from);
8744
10322
  if (!guide) continue;
10323
+ const rules = link.rules && visibleRuleIds(link.rules);
8745
10324
  if (guide.kind === "golden-path")
8746
10325
  examples.push({ id: guide.id, title: guide.title, mcp: guide.mcp });
8747
10326
  else
8748
10327
  docs.push({
8749
10328
  id: guide.id,
8750
10329
  title: guide.title,
8751
- ...link.rules ? { rules: link.rules } : {}
10330
+ ...rules?.length ? { rules } : {}
8752
10331
  });
8753
10332
  }
8754
10333
  return { examples, docs };
8755
10334
  }
8756
10335
  var conceptIndex = /* @__PURE__ */ new Map();
8757
- for (const concept of knowledge.concepts) {
10336
+ for (const concept of concepts) {
8758
10337
  for (const key of [concept.id, concept.name, ...concept.aliases]) {
8759
10338
  if (!conceptIndex.has(key.toLowerCase()))
8760
10339
  conceptIndex.set(key.toLowerCase(), concept);
@@ -8788,7 +10367,7 @@ function resolveConcept(input) {
8788
10367
  return best && !tied ? { concept: best.concept, matchedAs: best.key } : void 0;
8789
10368
  }
8790
10369
  var ruleIndex = /* @__PURE__ */ new Map();
8791
- for (const concept of knowledge.concepts) {
10370
+ for (const concept of concepts) {
8792
10371
  for (const rule of concept.rules) ruleIndex.set(rule.id, { rule, concept });
8793
10372
  }
8794
10373
  var source = {
@@ -8907,7 +10486,7 @@ var lookupConcept = {
8907
10486
  };
8908
10487
  }
8909
10488
  const { concept, matchedAs } = resolved;
8910
- const pointedAtBy = knowledge.concepts.flatMap((other) => [
10489
+ const pointedAtBy = concepts.flatMap((other) => [
8911
10490
  ...other.is_a === concept.id ? [{ concept: other.id, type: "is_a" }] : [],
8912
10491
  ...other.part_of === concept.id ? [{ concept: other.id, type: "part_of" }] : [],
8913
10492
  ...other.relations.filter((relation) => relation.target === concept.id).map((relation) => ({ concept: other.id, type: relation.type }))
@@ -8921,6 +10500,14 @@ var lookupConcept = {
8921
10500
  ...source,
8922
10501
  ...matchedAs ? { matched_as: matchedAs } : {},
8923
10502
  ...concept,
10503
+ steps: concept.steps.map((step) => ({
10504
+ ...step,
10505
+ rules: visibleRuleIds(step.rules)
10506
+ })),
10507
+ rules: concept.rules.map((rule) => ({
10508
+ ...rule,
10509
+ see: visibleRuleIds(rule.see)
10510
+ })),
8924
10511
  pointed_at_by: pointedAtBy,
8925
10512
  linked_rules: linkedRules,
8926
10513
  ...linkedGuides(concept.id)
@@ -9179,7 +10766,7 @@ function words2(name) {
9179
10766
 
9180
10767
  // src/server.ts
9181
10768
  var SERVER_NAME = "Runpod API Server";
9182
- var SERVER_VERSION = true ? "4.9.1" : "dev";
10769
+ var SERVER_VERSION = true ? "4.10.0" : "dev";
9183
10770
 
9184
10771
  // src/specgen/analytics.ts
9185
10772
  var import_node_crypto = require("crypto");