hngr 0.2.0 → 0.4.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/README.md +6 -3
- package/dist/{auth-BT8HuCif.mjs → auth-ByGgd_Yn.mjs} +221 -40
- package/dist/{catalog-jU0-wzh3.mjs → catalog-Bv304SXJ.mjs} +1154 -122
- package/dist/{commands-BchmocR_.mjs → commands-CLqLwQHY.mjs} +1 -1
- package/dist/{http-2HWxLIOq.mjs → http-DgHX7Fux.mjs} +13 -7
- package/dist/index.mjs +126 -29
- package/dist/{mcp-DeWHHgQK.mjs → mcp-DWF_ELDU.mjs} +29 -50
- package/dist/{pagination-BbKLKSw3.mjs → pagination-BXyFxGYA.mjs} +1 -1
- package/dist/{publish-D7zaQl9x.mjs → scope-Ch6wZCgE.mjs} +63 -12
- package/dist/{skills-DwoDzsXd.mjs → skills-CxMeJ5PF.mjs} +23 -39
- package/package.json +1 -1
|
@@ -28,7 +28,11 @@ function catalogFlagType(flag) {
|
|
|
28
28
|
* cannot decide lives here, so the ambiguity is reviewable in one place
|
|
29
29
|
* instead of hidden in the derivation algorithm.
|
|
30
30
|
*/
|
|
31
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* Endpoints that never appear in the command tree. An entry excludes that path
|
|
33
|
+
* and everything below it, so a subtree needs one line rather than one line
|
|
34
|
+
* per operation.
|
|
35
|
+
*/
|
|
32
36
|
const EXCLUDED_PATHS = [
|
|
33
37
|
"/api/v1/login",
|
|
34
38
|
"/api/v1/logout",
|
|
@@ -36,9 +40,36 @@ const EXCLUDED_PATHS = [
|
|
|
36
40
|
"/api/v1/me/sessions",
|
|
37
41
|
"/api/v1/me/sessions/{id}",
|
|
38
42
|
"/api/v1/capabilities/{capability_id}/versions/{version}/content",
|
|
43
|
+
"/api/v1/capabilities/{capability_id}/versions/{version}/files",
|
|
44
|
+
"/api/v1/capabilities/{capability_id}/versions/{version}/file",
|
|
39
45
|
"/api/v1/auth/methods",
|
|
40
46
|
"/api/v1/auth/oidc/login",
|
|
41
|
-
"/api/v1/auth/oidc/callback"
|
|
47
|
+
"/api/v1/auth/oidc/callback",
|
|
48
|
+
"/api/v1/auth/device/code",
|
|
49
|
+
"/api/v1/auth/device/token",
|
|
50
|
+
"/api/v1/auth/device/lookup",
|
|
51
|
+
"/api/v1/auth/device/approve",
|
|
52
|
+
"/api/v1/auth/device/deny",
|
|
53
|
+
"/api/v1/oauth"
|
|
54
|
+
];
|
|
55
|
+
/**
|
|
56
|
+
* Single operations whose path still generates other commands. Category
|
|
57
|
+
* curation lives in the Web console in v1, so `categories list` stays while
|
|
58
|
+
* create, rename and delete are hidden.
|
|
59
|
+
*/
|
|
60
|
+
const EXCLUDED_OPERATIONS = [
|
|
61
|
+
{
|
|
62
|
+
method: "POST",
|
|
63
|
+
path: "/api/v1/categories"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
method: "PATCH",
|
|
67
|
+
path: "/api/v1/categories/{category_id}"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
method: "DELETE",
|
|
71
|
+
path: "/api/v1/categories/{category_id}"
|
|
72
|
+
}
|
|
42
73
|
];
|
|
43
74
|
/**
|
|
44
75
|
* Root-noun aliases. Aliases only affect parsing: help annotates the canonical
|
|
@@ -124,13 +155,15 @@ const METHOD_KEY = {
|
|
|
124
155
|
*/
|
|
125
156
|
function deriveCommands(doc) {
|
|
126
157
|
const excluded = new Set(EXCLUDED_PATHS);
|
|
158
|
+
const excludedSubtrees = EXCLUDED_PATHS.map((path) => `${path}/`);
|
|
159
|
+
const excludedOperations = new Set(EXCLUDED_OPERATIONS.map((operation) => `${operation.method} ${operation.path}`));
|
|
127
160
|
const overrides = new Map(COMMAND_OVERRIDES.map((item) => [overrideKey(item), item]));
|
|
128
161
|
const commands = [];
|
|
129
162
|
for (const [path, pathItem] of Object.entries(doc.paths)) {
|
|
130
|
-
if (excluded.has(path)) continue;
|
|
163
|
+
if (excluded.has(path) || excludedSubtrees.some((prefix) => path.startsWith(prefix))) continue;
|
|
131
164
|
for (const method of METHODS) {
|
|
132
165
|
const operation = pathItem[METHOD_KEY[method]];
|
|
133
|
-
if (!operation) continue;
|
|
166
|
+
if (!operation || excludedOperations.has(`${method} ${path}`)) continue;
|
|
134
167
|
commands.push(deriveCommand(doc, path, pathItem, method, operation, overrides));
|
|
135
168
|
}
|
|
136
169
|
}
|
|
@@ -564,6 +597,111 @@ const COMMANDS = deriveCommands({
|
|
|
564
597
|
"default": { "$ref": "#/components/responses/Problem" }
|
|
565
598
|
}
|
|
566
599
|
} },
|
|
600
|
+
"/api/v1/auth/device/code": { "post": {
|
|
601
|
+
"operationId": "createDeviceAuthorization",
|
|
602
|
+
"summary": "Request a Device Authorization for the CLI.",
|
|
603
|
+
"description": "Anonymous, and rate-limited to 10 requests per client address in any\n15-minute window. The device code is a credential: it is returned once\nand stored only as a keyed digest. The user code is a short public\nidentifier shown on the verification page; it is 8 Crockford Base32\ncharacters displayed as `XXXX-XXXX`, and case, hyphens and spaces are\nignored on input with `I` read as `1` and `O` as `0`. Expired,\nunconsumed requests are cleared by the next successful create.\n",
|
|
604
|
+
"security": [],
|
|
605
|
+
"requestBody": {
|
|
606
|
+
"required": true,
|
|
607
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateDeviceAuthorizationRequest" } } }
|
|
608
|
+
},
|
|
609
|
+
"responses": {
|
|
610
|
+
"200": {
|
|
611
|
+
"description": "The new Device Authorization request.",
|
|
612
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeviceAuthorizationCode" } } }
|
|
613
|
+
},
|
|
614
|
+
"400": { "$ref": "#/components/responses/Problem" },
|
|
615
|
+
"413": { "$ref": "#/components/responses/Problem" },
|
|
616
|
+
"429": { "$ref": "#/components/responses/Problem" },
|
|
617
|
+
"default": { "$ref": "#/components/responses/Problem" }
|
|
618
|
+
}
|
|
619
|
+
} },
|
|
620
|
+
"/api/v1/auth/device/lookup": { "post": {
|
|
621
|
+
"operationId": "lookupDeviceAuthorization",
|
|
622
|
+
"summary": "Look up a Device Authorization by user code.",
|
|
623
|
+
"description": "Session-only; a Bearer Access Token is refused even though it\nauthenticates elsewhere. The code travels in the body, never in the\npath or query. Input is normalized like creation input. Denied and\nconsumed requests stay readable so a reload shows their resulting\nstate; unknown, expired and invalidated codes answer 404.\n",
|
|
624
|
+
"security": [{ "sessionCookie": [] }],
|
|
625
|
+
"requestBody": {
|
|
626
|
+
"required": true,
|
|
627
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/LookupDeviceAuthorizationRequest" } } }
|
|
628
|
+
},
|
|
629
|
+
"responses": {
|
|
630
|
+
"200": {
|
|
631
|
+
"description": "The request, in whatever state it reached.",
|
|
632
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeviceAuthorization" } } }
|
|
633
|
+
},
|
|
634
|
+
"400": { "$ref": "#/components/responses/Problem" },
|
|
635
|
+
"401": { "$ref": "#/components/responses/Problem" },
|
|
636
|
+
"403": { "$ref": "#/components/responses/Problem" },
|
|
637
|
+
"404": { "$ref": "#/components/responses/Problem" },
|
|
638
|
+
"default": { "$ref": "#/components/responses/Problem" }
|
|
639
|
+
}
|
|
640
|
+
} },
|
|
641
|
+
"/api/v1/auth/device/token": { "post": {
|
|
642
|
+
"operationId": "pollDeviceAuthorization",
|
|
643
|
+
"summary": "Poll a Device Authorization for its Access Token.",
|
|
644
|
+
"description": "Anonymous; the device code travels in the body. A pending request\nanswers 400 with the `authorization-pending` problem type, and a poll\ninside the advertised interval answers `slow-down`. A denied request\nanswers `access-denied`; an expired, invalidated, consumed or unknown\none answers `expired-token`. Approval mints nothing: the Access Token\nis created on the poll that observes the approval and its value is\nreturned exactly once. Unknown device codes are rate-limited per client\naddress.\n",
|
|
645
|
+
"security": [],
|
|
646
|
+
"requestBody": {
|
|
647
|
+
"required": true,
|
|
648
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/PollDeviceAuthorizationRequest" } } }
|
|
649
|
+
},
|
|
650
|
+
"responses": {
|
|
651
|
+
"200": {
|
|
652
|
+
"description": "The minted Access Token and its Principal.",
|
|
653
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeviceAuthorizationToken" } } }
|
|
654
|
+
},
|
|
655
|
+
"400": { "$ref": "#/components/responses/Problem" },
|
|
656
|
+
"413": { "$ref": "#/components/responses/Problem" },
|
|
657
|
+
"429": { "$ref": "#/components/responses/Problem" },
|
|
658
|
+
"default": { "$ref": "#/components/responses/Problem" }
|
|
659
|
+
}
|
|
660
|
+
} },
|
|
661
|
+
"/api/v1/auth/device/approve": { "post": {
|
|
662
|
+
"operationId": "approveDeviceAuthorization",
|
|
663
|
+
"summary": "Approve a Device Authorization.",
|
|
664
|
+
"description": "Session-only; a Bearer Access Token is refused. Records the approving\nPrincipal and the approval time and mints nothing. The Access Token is\ncreated only when the waiting CLI polls. A code that exists but is no\nlonger actionable counts as one failed attempt; at five attempts the\ncode is invalid for every operation and answers 404.\n",
|
|
665
|
+
"security": [{ "sessionCookie": [] }],
|
|
666
|
+
"requestBody": {
|
|
667
|
+
"required": true,
|
|
668
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApproveDeviceAuthorizationRequest" } } }
|
|
669
|
+
},
|
|
670
|
+
"responses": {
|
|
671
|
+
"200": {
|
|
672
|
+
"description": "The request in its approved state.",
|
|
673
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeviceAuthorization" } } }
|
|
674
|
+
},
|
|
675
|
+
"400": { "$ref": "#/components/responses/Problem" },
|
|
676
|
+
"401": { "$ref": "#/components/responses/Problem" },
|
|
677
|
+
"403": { "$ref": "#/components/responses/Problem" },
|
|
678
|
+
"404": { "$ref": "#/components/responses/Problem" },
|
|
679
|
+
"413": { "$ref": "#/components/responses/Problem" },
|
|
680
|
+
"default": { "$ref": "#/components/responses/Problem" }
|
|
681
|
+
}
|
|
682
|
+
} },
|
|
683
|
+
"/api/v1/auth/device/deny": { "post": {
|
|
684
|
+
"operationId": "denyDeviceAuthorization",
|
|
685
|
+
"summary": "Deny a Device Authorization.",
|
|
686
|
+
"description": "Session-only; a Bearer Access Token is refused. Records the denial and\nmints nothing. The waiting CLI's next poll answers `access-denied`. A\ncode that exists but is no longer actionable counts as one failed\nattempt; at five attempts the code is invalid for every operation and\nanswers 404.\n",
|
|
687
|
+
"security": [{ "sessionCookie": [] }],
|
|
688
|
+
"requestBody": {
|
|
689
|
+
"required": true,
|
|
690
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/DenyDeviceAuthorizationRequest" } } }
|
|
691
|
+
},
|
|
692
|
+
"responses": {
|
|
693
|
+
"200": {
|
|
694
|
+
"description": "The request in its denied state.",
|
|
695
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeviceAuthorization" } } }
|
|
696
|
+
},
|
|
697
|
+
"400": { "$ref": "#/components/responses/Problem" },
|
|
698
|
+
"401": { "$ref": "#/components/responses/Problem" },
|
|
699
|
+
"403": { "$ref": "#/components/responses/Problem" },
|
|
700
|
+
"404": { "$ref": "#/components/responses/Problem" },
|
|
701
|
+
"413": { "$ref": "#/components/responses/Problem" },
|
|
702
|
+
"default": { "$ref": "#/components/responses/Problem" }
|
|
703
|
+
}
|
|
704
|
+
} },
|
|
567
705
|
"/api/v1/logout": { "post": {
|
|
568
706
|
"operationId": "logout",
|
|
569
707
|
"summary": "Revoke the current Session and clear its cookie.",
|
|
@@ -744,10 +882,11 @@ const COMMANDS = deriveCommands({
|
|
|
744
882
|
"/api/v1/me/tokens/{token_id}": { "delete": {
|
|
745
883
|
"operationId": "revokeMyAccessToken",
|
|
746
884
|
"summary": "Revoke one of the authenticated Principal's Access Tokens.",
|
|
885
|
+
"description": "When the token belongs to an OAuth grant, every access token and\nrefresh token sharing its `grant_id` is revoked in the same\ntransaction.\n",
|
|
747
886
|
"security": [{ "sessionCookie": [] }, { "bearerToken": [] }],
|
|
748
887
|
"parameters": [{ "$ref": "#/components/parameters/TokenID" }],
|
|
749
888
|
"responses": {
|
|
750
|
-
"204": { "description": "Revoked. The token
|
|
889
|
+
"204": { "description": "Revoked. The token and, when it belongs to a grant, its siblings stop authenticating immediately." },
|
|
751
890
|
"400": { "$ref": "#/components/responses/Problem" },
|
|
752
891
|
"401": { "$ref": "#/components/responses/Problem" },
|
|
753
892
|
"403": { "$ref": "#/components/responses/Problem" },
|
|
@@ -755,6 +894,106 @@ const COMMANDS = deriveCommands({
|
|
|
755
894
|
"default": { "$ref": "#/components/responses/Problem" }
|
|
756
895
|
}
|
|
757
896
|
} },
|
|
897
|
+
"/api/v1/oauth/register": { "post": {
|
|
898
|
+
"operationId": "registerOAuthClient",
|
|
899
|
+
"summary": "Register a public OAuth client through Dynamic Client Registration.",
|
|
900
|
+
"description": "Anonymous. Implements RFC 7591 registration for the public native\nclients that connect to Native MCP: no client secret is issued, and\npossession of the `client_id` plus an exactly matching redirect URI is\nthe whole identity. `client_name` is 1–100 characters and\n`redirect_uris` holds 1–10 absolute URIs without a fragment: `https`\nanywhere, `http` only on localhost, 127.0.0.1 or [::1]. Exact\nduplicates are removed. Registration failures are RFC 6749 error\nbodies, not problem details.\n",
|
|
901
|
+
"security": [],
|
|
902
|
+
"requestBody": {
|
|
903
|
+
"required": true,
|
|
904
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthClientRegistrationRequest" } } }
|
|
905
|
+
},
|
|
906
|
+
"responses": {
|
|
907
|
+
"201": {
|
|
908
|
+
"description": "The registered client. Hangar never issues a client secret.",
|
|
909
|
+
"headers": { "Cache-Control": {
|
|
910
|
+
"description": "Always `no-store`.",
|
|
911
|
+
"schema": { "type": "string" }
|
|
912
|
+
} },
|
|
913
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthClientRegistration" } } }
|
|
914
|
+
},
|
|
915
|
+
"400": { "$ref": "#/components/responses/OAuthError" },
|
|
916
|
+
"413": { "$ref": "#/components/responses/OAuthProblem" },
|
|
917
|
+
"default": { "$ref": "#/components/responses/OAuthProblem" }
|
|
918
|
+
}
|
|
919
|
+
} },
|
|
920
|
+
"/api/v1/oauth/token": { "post": {
|
|
921
|
+
"operationId": "exchangeOAuthToken",
|
|
922
|
+
"summary": "Exchange an authorization code or refresh token for an MCP token pair.",
|
|
923
|
+
"description": "Anonymous and form-encoded. `grant_type=authorization_code` requires\n`code`, `redirect_uri`, `client_id` and `code_verifier`; the code is\nsingle use and the PKCE challenge must be S256.\n`grant_type=refresh_token` requires `refresh_token` and `client_id` and\nrotates the refresh token. Presenting an already rotated refresh token\nrevokes the whole grant. Every failure is an RFC 6749 error body with\nstatus 400.\n",
|
|
924
|
+
"security": [],
|
|
925
|
+
"requestBody": {
|
|
926
|
+
"required": true,
|
|
927
|
+
"content": { "application/x-www-form-urlencoded": { "schema": { "$ref": "#/components/schemas/ExchangeOAuthTokenRequest" } } }
|
|
928
|
+
},
|
|
929
|
+
"responses": {
|
|
930
|
+
"200": {
|
|
931
|
+
"description": "A fresh MCP access token and a refresh token.",
|
|
932
|
+
"headers": { "Cache-Control": {
|
|
933
|
+
"description": "Always `no-store`.",
|
|
934
|
+
"schema": { "type": "string" }
|
|
935
|
+
} },
|
|
936
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthToken" } } }
|
|
937
|
+
},
|
|
938
|
+
"400": { "$ref": "#/components/responses/OAuthError" },
|
|
939
|
+
"413": { "$ref": "#/components/responses/OAuthProblem" },
|
|
940
|
+
"default": { "$ref": "#/components/responses/OAuthProblem" }
|
|
941
|
+
}
|
|
942
|
+
} },
|
|
943
|
+
"/api/v1/oauth/authorization-request": {
|
|
944
|
+
"get": {
|
|
945
|
+
"operationId": "lookupOAuthAuthorizationRequest",
|
|
946
|
+
"summary": "Read the consent page preview of an authorization request.",
|
|
947
|
+
"description": "Session-only. Validates `response_type=code`, the registered client,\nthe exact `redirect_uri` and `code_challenge_method=S256` before\nreturning anything displayable. An invalid request answers 400 and\nnever redirects, so an unknown client cannot be used for an open\nredirect. The preview never includes the redirect URI itself.\n",
|
|
948
|
+
"security": [{ "sessionCookie": [] }],
|
|
949
|
+
"parameters": [
|
|
950
|
+
{ "$ref": "#/components/parameters/OAuthResponseType" },
|
|
951
|
+
{ "$ref": "#/components/parameters/OAuthClientID" },
|
|
952
|
+
{ "$ref": "#/components/parameters/OAuthRedirectURI" },
|
|
953
|
+
{ "$ref": "#/components/parameters/OAuthState" },
|
|
954
|
+
{ "$ref": "#/components/parameters/OAuthCodeChallenge" },
|
|
955
|
+
{ "$ref": "#/components/parameters/OAuthCodeChallengeMethod" }
|
|
956
|
+
],
|
|
957
|
+
"responses": {
|
|
958
|
+
"200": {
|
|
959
|
+
"description": "The client name and callback host shown on the consent page.",
|
|
960
|
+
"headers": { "Cache-Control": {
|
|
961
|
+
"description": "Always `no-store`.",
|
|
962
|
+
"schema": { "type": "string" }
|
|
963
|
+
} },
|
|
964
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthAuthorizationPreview" } } }
|
|
965
|
+
},
|
|
966
|
+
"400": { "$ref": "#/components/responses/OAuthProblem" },
|
|
967
|
+
"401": { "$ref": "#/components/responses/OAuthProblem" },
|
|
968
|
+
"default": { "$ref": "#/components/responses/OAuthProblem" }
|
|
969
|
+
}
|
|
970
|
+
},
|
|
971
|
+
"post": {
|
|
972
|
+
"operationId": "decideOAuthAuthorizationRequest",
|
|
973
|
+
"summary": "Approve or deny an authorization request.",
|
|
974
|
+
"description": "Session-only and CSRF protected. Repeats the authorization request's\nparameters plus `decision`. Approval issues a single-use ten-minute\ncode and answers with the client redirect carrying `code` and `state`;\ndenial answers with `error=access_denied` and `state`. The redirect\npreserves any query already present on the registered redirect URI.\nAn invalid request answers 400 and never redirects.\n",
|
|
975
|
+
"security": [{ "sessionCookie": [] }],
|
|
976
|
+
"requestBody": {
|
|
977
|
+
"required": true,
|
|
978
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/DecideOAuthAuthorizationRequest" } } }
|
|
979
|
+
},
|
|
980
|
+
"responses": {
|
|
981
|
+
"200": {
|
|
982
|
+
"description": "The URL the consent page navigates to.",
|
|
983
|
+
"headers": { "Cache-Control": {
|
|
984
|
+
"description": "Always `no-store`.",
|
|
985
|
+
"schema": { "type": "string" }
|
|
986
|
+
} },
|
|
987
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthAuthorizationDecision" } } }
|
|
988
|
+
},
|
|
989
|
+
"400": { "$ref": "#/components/responses/OAuthProblem" },
|
|
990
|
+
"401": { "$ref": "#/components/responses/OAuthProblem" },
|
|
991
|
+
"403": { "$ref": "#/components/responses/OAuthProblem" },
|
|
992
|
+
"413": { "$ref": "#/components/responses/OAuthProblem" },
|
|
993
|
+
"default": { "$ref": "#/components/responses/OAuthProblem" }
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
},
|
|
758
997
|
"/api/v1/principals/{principal_id}/tokens": {
|
|
759
998
|
"parameters": [{ "$ref": "#/components/parameters/PrincipalID" }],
|
|
760
999
|
"get": {
|
|
@@ -796,10 +1035,10 @@ const COMMANDS = deriveCommands({
|
|
|
796
1035
|
"delete": {
|
|
797
1036
|
"operationId": "revokePrincipalAccessToken",
|
|
798
1037
|
"summary": "Revoke one of a Principal's Access Tokens.",
|
|
799
|
-
"description": "Allowed for the Principal itself, and for a Platform Admin when the
|
|
1038
|
+
"description": "Allowed for the Principal itself, and for a Platform Admin when the\nPrincipal is an Agent. When the token belongs to an OAuth grant, every\naccess token and refresh token sharing its `grant_id` is revoked in\nthe same transaction.\n",
|
|
800
1039
|
"security": [{ "sessionCookie": [] }, { "bearerToken": [] }],
|
|
801
1040
|
"responses": {
|
|
802
|
-
"204": { "description": "Revoked. The token
|
|
1041
|
+
"204": { "description": "Revoked. The token and, when it belongs to a grant, its siblings stop authenticating immediately." },
|
|
803
1042
|
"400": { "$ref": "#/components/responses/Problem" },
|
|
804
1043
|
"401": { "$ref": "#/components/responses/Problem" },
|
|
805
1044
|
"403": { "$ref": "#/components/responses/Problem" },
|
|
@@ -1036,12 +1275,12 @@ const COMMANDS = deriveCommands({
|
|
|
1036
1275
|
}
|
|
1037
1276
|
},
|
|
1038
1277
|
{
|
|
1039
|
-
"name": "
|
|
1278
|
+
"name": "category",
|
|
1040
1279
|
"in": "query",
|
|
1041
|
-
"description": "
|
|
1280
|
+
"description": "A Category reference: `slug` for the system Namespace, otherwise\n`namespace/slug`. A Capability matches when it carries that\nCategory; the match combines with every other filter using AND.\nA syntactically invalid reference answers 400; a well-formed but\nunknown one matches nothing.\n",
|
|
1042
1281
|
"schema": {
|
|
1043
1282
|
"type": "string",
|
|
1044
|
-
"maxLength":
|
|
1283
|
+
"maxLength": 129
|
|
1045
1284
|
}
|
|
1046
1285
|
},
|
|
1047
1286
|
{ "$ref": "#/components/parameters/Cursor" },
|
|
@@ -1060,7 +1299,7 @@ const COMMANDS = deriveCommands({
|
|
|
1060
1299
|
"operationId": "createCapability",
|
|
1061
1300
|
"summary": "Create a Capability together with its first Version.",
|
|
1062
1301
|
"description": "An `application/json` body creates an MCP Capability; a\n`multipart/form-data` body creates a Skill Capability from its\nCapability Package. The Capability, its first Version and the Audit\nEvent are committed in one transaction. A rejected package returns 400\nwith a `detail` that names what to fix. The caller must manage the\ntarget Namespace: a Platform Admin for system, a member User of the Team for a Team Namespace, and\nthe owner for a principal Namespace. A live Capability with the same\nkind and name in the Namespace returns 409.\n",
|
|
1063
|
-
"security": [{ "sessionCookie": [] }],
|
|
1302
|
+
"security": [{ "sessionCookie": [] }, { "bearerToken": [] }],
|
|
1064
1303
|
"parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
|
|
1065
1304
|
"requestBody": {
|
|
1066
1305
|
"required": true,
|
|
@@ -1096,7 +1335,7 @@ const COMMANDS = deriveCommands({
|
|
|
1096
1335
|
"get": {
|
|
1097
1336
|
"operationId": "lookupCapability",
|
|
1098
1337
|
"summary": "Return a Capability the caller can read.",
|
|
1099
|
-
"description": "Anonymous callers read public Capabilities, authenticated Principals\nalso read internal ones, and the managers of the owning Namespace and\nPlatform Admins also read private ones. A Capability that is deleted,\nunavailable, owned by a disabled Team or Principal, or not readable by\nthe caller answers 404.\n\nThe `ETag` header covers management metadata only: it excludes
|
|
1338
|
+
"description": "Anonymous callers read public Capabilities, authenticated Principals\nalso read internal ones, and the managers of the owning Namespace and\nPlatform Admins also read private ones. A Capability that is deleted,\nunavailable, owned by a disabled Team or Principal, or not readable by\nthe caller answers 404.\n\nThe `ETag` header covers management metadata only: it includes the\nassigned Category's id, name and slug, and excludes `download_count`\nand any caller-relative field, so a download never invalidates an\neditor's `If-Match`.\n",
|
|
1100
1339
|
"security": [
|
|
1101
1340
|
{},
|
|
1102
1341
|
{ "sessionCookie": [] },
|
|
@@ -1115,8 +1354,8 @@ const COMMANDS = deriveCommands({
|
|
|
1115
1354
|
},
|
|
1116
1355
|
"patch": {
|
|
1117
1356
|
"operationId": "updateCapability",
|
|
1118
|
-
"summary": "Change a Capability's description or
|
|
1119
|
-
"description": "Omitted fields are left unchanged. The change
|
|
1357
|
+
"summary": "Change a Capability's description, visibility or Category.",
|
|
1358
|
+
"description": "Omitted fields are left unchanged. `category` is three-state: omitted\nleaves the Category unchanged, `null` clears it, and a slug replaces it\nwith a live Category of the Capability's own Namespace. The change\napplies to every Version at once and publishes none. `kind`,\n`namespace` and `name` are immutable, so sending any of them returns\n400.\n\nThe caller must manage the Capability's Namespace, under the same\nrules as `createCapability`. A deleted or unavailable Capability, one\nin an unusable Namespace, and a private one the caller does not manage\nreturn 404; those checks come before the precondition. `If-Match`\nmust then carry the current strong `ETag` of `lookupCapability`: a\nmissing value answers 428 and a stale one 412. That `ETag` covers\nmanagement metadata only, including the assigned Category's id, name\nand slug, and excluding `download_count` and caller-relative fields,\nso downloads do not cause spurious 412s.\n",
|
|
1120
1359
|
"security": [{ "sessionCookie": [] }, { "bearerToken": [] }],
|
|
1121
1360
|
"parameters": [{ "$ref": "#/components/parameters/IfMatch" }],
|
|
1122
1361
|
"requestBody": {
|
|
@@ -1180,7 +1419,7 @@ const COMMANDS = deriveCommands({
|
|
|
1180
1419
|
"operationId": "publishCapabilityVersion",
|
|
1181
1420
|
"summary": "Publish a new Version of a Capability and make it current.",
|
|
1182
1421
|
"description": "The media type must match the Capability's kind: `application/json`\nfor MCP and `multipart/form-data` for Skill; the other one returns\n400. The Version, the new current version and the Audit Event are\ncommitted in one transaction, and concurrent publishes each receive\ntheir own CalVer. The caller must manage the Capability's Namespace,\nunder the same rules as `createCapability`. A deleted or unavailable\nCapability, one in an unusable Namespace, and a private one the\ncaller does not manage return 404.\n",
|
|
1183
|
-
"security": [{ "sessionCookie": [] }],
|
|
1422
|
+
"security": [{ "sessionCookie": [] }, { "bearerToken": [] }],
|
|
1184
1423
|
"parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
|
|
1185
1424
|
"requestBody": {
|
|
1186
1425
|
"required": true,
|
|
@@ -1285,78 +1524,289 @@ const COMMANDS = deriveCommands({
|
|
|
1285
1524
|
"default": { "$ref": "#/components/responses/Problem" }
|
|
1286
1525
|
}
|
|
1287
1526
|
} },
|
|
1288
|
-
"/api/v1/
|
|
1289
|
-
"
|
|
1290
|
-
|
|
1291
|
-
|
|
1527
|
+
"/api/v1/categories": {
|
|
1528
|
+
"get": {
|
|
1529
|
+
"operationId": "listCategories",
|
|
1530
|
+
"summary": "List Categories as a usage view or one Namespace's full taxonomy.",
|
|
1531
|
+
"description": "The usage view lists only Categories carrying at least one Capability\nthe caller may read, with `count` set to those readable Capabilities. It\nis readable anonymously, under the same visibility rules as\n`listCapabilities`; `view=usage` with `namespace` scopes it to that\nNamespace without requiring any management fact. The taxonomy view lists\none live Namespace's full taxonomy, including Categories with\n`count: 0`, and requires `can_create_in_namespace` there or Platform\nAdmin: an unknown or non-live Namespace answers 404, an anonymous\ncaller 401 and a caller with neither fact 403. A Platform Admin may read\na team or principal taxonomy to assign a Category, but `can_manage`\nstays the `can_manage_category` fact, so it is `false` there. Omit\n`view` to keep the namespace-inferred behavior: `namespace` asks for the\ntaxonomy, no `namespace` for the usage view. `q` is a case-insensitive\nsubstring of the name or slug.\nUsage rows are ordered by `count` descending, then Namespace name, then\nname; taxonomy rows by name. The response is not paginated: counts\nchange with Capability edits, so `truncated` reports that more\nCategories exist than `limit` instead of offering a cursor.\n`can_manage` reports whether the caller may create, rename or delete\nCategories of that Namespace: it is the server's `can_manage_category`\nfact in the taxonomy view, and always `false` in the usage view, where\nno single Namespace is governed.\n",
|
|
1532
|
+
"security": [
|
|
1533
|
+
{},
|
|
1534
|
+
{ "sessionCookie": [] },
|
|
1535
|
+
{ "bearerToken": [] }
|
|
1536
|
+
],
|
|
1537
|
+
"parameters": [
|
|
1538
|
+
{
|
|
1539
|
+
"name": "view",
|
|
1540
|
+
"in": "query",
|
|
1541
|
+
"description": "`usage` lists Categories carrying at least one readable Capability,\noptionally scoped by `namespace`. `taxonomy` lists one Namespace's\nfull taxonomy and requires `namespace`. Omitted, a `namespace`\nselects the taxonomy and no `namespace` selects the usage view.\n",
|
|
1542
|
+
"schema": {
|
|
1543
|
+
"type": "string",
|
|
1544
|
+
"enum": ["usage", "taxonomy"]
|
|
1545
|
+
}
|
|
1546
|
+
},
|
|
1547
|
+
{
|
|
1548
|
+
"name": "namespace",
|
|
1549
|
+
"in": "query",
|
|
1550
|
+
"description": "With the taxonomy view, the live Namespace whose full taxonomy to\nlist. With the usage view, the Namespace its counts are scoped to.\n",
|
|
1551
|
+
"schema": { "$ref": "#/components/schemas/Name" }
|
|
1552
|
+
},
|
|
1553
|
+
{
|
|
1554
|
+
"name": "q",
|
|
1555
|
+
"in": "query",
|
|
1556
|
+
"description": "Case-insensitive text found in the name or slug. Empty means no filter.",
|
|
1557
|
+
"schema": {
|
|
1558
|
+
"type": "string",
|
|
1559
|
+
"maxLength": 200
|
|
1560
|
+
}
|
|
1561
|
+
},
|
|
1562
|
+
{
|
|
1563
|
+
"name": "limit",
|
|
1564
|
+
"in": "query",
|
|
1565
|
+
"description": "The most Categories the response holds.",
|
|
1566
|
+
"schema": {
|
|
1567
|
+
"type": "integer",
|
|
1568
|
+
"minimum": 1,
|
|
1569
|
+
"maximum": 200,
|
|
1570
|
+
"default": 100
|
|
1571
|
+
}
|
|
1572
|
+
}
|
|
1573
|
+
],
|
|
1574
|
+
"responses": {
|
|
1575
|
+
"200": {
|
|
1576
|
+
"description": "The matching Categories and their readable counts.",
|
|
1577
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/CategoryList" } } }
|
|
1578
|
+
},
|
|
1579
|
+
"400": { "$ref": "#/components/responses/Problem" },
|
|
1580
|
+
"401": { "$ref": "#/components/responses/Problem" },
|
|
1581
|
+
"403": { "$ref": "#/components/responses/Problem" },
|
|
1582
|
+
"404": { "$ref": "#/components/responses/Problem" },
|
|
1583
|
+
"default": { "$ref": "#/components/responses/Problem" }
|
|
1584
|
+
}
|
|
1585
|
+
},
|
|
1586
|
+
"post": {
|
|
1587
|
+
"operationId": "createCategory",
|
|
1588
|
+
"summary": "Create a Category in a Namespace the caller owns.",
|
|
1589
|
+
"description": "Allowed for the Namespace owner: a Platform Admin for `system`, an\nEffective Team Admin for a Team's Namespace and the owning Principal for\na principal Namespace. The name is normalized and must be 1–32\ncharacters without a comma or a control character. `slug` is optional;\nwhen omitted the server derives it from the normalized name and answers\n400 if the name cannot form a valid slug. Both name and slug are unique\nwithin the Namespace, and a duplicate answers 409.\n",
|
|
1590
|
+
"security": [{ "sessionCookie": [] }, { "bearerToken": [] }],
|
|
1591
|
+
"requestBody": {
|
|
1592
|
+
"required": true,
|
|
1593
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateCategoryRequest" } } }
|
|
1594
|
+
},
|
|
1595
|
+
"responses": {
|
|
1596
|
+
"201": {
|
|
1597
|
+
"description": "The created Category.",
|
|
1598
|
+
"headers": { "Location": {
|
|
1599
|
+
"description": "`/api/v1/categories/{id}`",
|
|
1600
|
+
"schema": { "type": "string" }
|
|
1601
|
+
} },
|
|
1602
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/Category" } } }
|
|
1603
|
+
},
|
|
1604
|
+
"400": { "$ref": "#/components/responses/Problem" },
|
|
1605
|
+
"401": { "$ref": "#/components/responses/Problem" },
|
|
1606
|
+
"403": { "$ref": "#/components/responses/Problem" },
|
|
1607
|
+
"404": { "$ref": "#/components/responses/Problem" },
|
|
1608
|
+
"409": { "$ref": "#/components/responses/Problem" },
|
|
1609
|
+
"default": { "$ref": "#/components/responses/Problem" }
|
|
1610
|
+
}
|
|
1611
|
+
}
|
|
1612
|
+
},
|
|
1613
|
+
"/api/v1/capabilities/{capability_id}/versions/{version}/files": { "get": {
|
|
1614
|
+
"operationId": "listCapabilityVersionFiles",
|
|
1615
|
+
"summary": "List the entries of one Skill Version's package.",
|
|
1616
|
+
"description": "The entries come from the package's ZIP central directory; no entry is\ndecompressed. They are returned as stored, including `__MACOSX/` and\n`.DS_Store` entries, and missing ancestor directories are synthesized\nwith `size` 0, `mode` `\"0755\"` and `is_dir` true. `mode` is the\nfour-digit octal permission bits the archive declares, `\"0644\"` for\nfiles and `\"0755\"` for directories when it declares none. Entries are\nsorted by `path` in byte order and the list is not paginated.\n\nAn MCP Version, a Version the caller cannot read, or a Capability with\nno such Version answers 404. A Skill package missing from storage or\nunreadable answers 500. Listing is not a download and leaves the\nCapability's `download_count` unchanged.\n",
|
|
1292
1617
|
"security": [
|
|
1293
1618
|
{},
|
|
1294
1619
|
{ "sessionCookie": [] },
|
|
1295
1620
|
{ "bearerToken": [] }
|
|
1296
1621
|
],
|
|
1297
|
-
"parameters": [{
|
|
1298
|
-
"name": "
|
|
1299
|
-
"in": "
|
|
1300
|
-
"
|
|
1301
|
-
"schema": {
|
|
1302
|
-
"type": "string",
|
|
1303
|
-
"maxLength": 200
|
|
1304
|
-
}
|
|
1305
|
-
}, {
|
|
1306
|
-
"name": "limit",
|
|
1307
|
-
"in": "query",
|
|
1308
|
-
"description": "The most tags the response holds.",
|
|
1309
|
-
"schema": {
|
|
1310
|
-
"type": "integer",
|
|
1311
|
-
"minimum": 1,
|
|
1312
|
-
"maximum": 200,
|
|
1313
|
-
"default": 100
|
|
1314
|
-
}
|
|
1622
|
+
"parameters": [{ "$ref": "#/components/parameters/CapabilityID" }, {
|
|
1623
|
+
"name": "version",
|
|
1624
|
+
"in": "path",
|
|
1625
|
+
"required": true,
|
|
1626
|
+
"schema": { "$ref": "#/components/schemas/CalVer" }
|
|
1315
1627
|
}],
|
|
1316
1628
|
"responses": {
|
|
1317
1629
|
"200": {
|
|
1318
|
-
"description": "
|
|
1319
|
-
"
|
|
1630
|
+
"description": "Every entry of the package.",
|
|
1631
|
+
"headers": { "Cache-Control": { "$ref": "#/components/headers/ContentCacheControl" } },
|
|
1632
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/PackageEntryList" } } }
|
|
1320
1633
|
},
|
|
1321
1634
|
"400": { "$ref": "#/components/responses/Problem" },
|
|
1635
|
+
"401": { "$ref": "#/components/responses/Problem" },
|
|
1636
|
+
"404": { "$ref": "#/components/responses/Problem" },
|
|
1322
1637
|
"default": { "$ref": "#/components/responses/Problem" }
|
|
1323
1638
|
}
|
|
1324
1639
|
} },
|
|
1325
|
-
"/api/v1/
|
|
1326
|
-
"operationId": "
|
|
1327
|
-
"summary": "
|
|
1328
|
-
"description": "
|
|
1329
|
-
"security": [
|
|
1640
|
+
"/api/v1/capabilities/{capability_id}/versions/{version}/file": { "get": {
|
|
1641
|
+
"operationId": "lookupCapabilityVersionFile",
|
|
1642
|
+
"summary": "Return one entry of a Skill Version's package.",
|
|
1643
|
+
"description": "`path` must equal an entry path exactly. It is never interpreted as a\nfilesystem path: a `..` segment, an absolute path, a backslash, a NUL\nbyte, a directory and an unknown name all answer 404. Nothing is\nextracted to disk.\n\n`Content-Length` is the size the central directory declares. The strong\n`ETag` is the quoted hex sha256 of the package digest, a NUL byte and\nthe entry path, so it is known before decompression and every package\nchange invalidates every entry; `If-None-Match` answers 304 with the\nsame tag. PNG, JPEG, GIF and WebP entries are served with their image\nmedia type, text-like entries (Markdown and common extensionless files\nsuch as `Dockerfile` and `LICENSE` included) as\n`text/plain; charset=utf-8`, and everything else, including SVG, HTML,\nXML, JavaScript and CSS, as `application/octet-stream` with\n`Content-Disposition: attachment`. Every response, including 304,\ncarries `X-Content-Type-Options: nosniff`.\n\nAn MCP Version, a Version the caller cannot read, or a Capability with\nno such Version answers 404. A Skill package missing from storage or\nunreadable answers 500. Reading one entry is not a download and leaves\nthe Capability's `download_count` unchanged.\n",
|
|
1644
|
+
"security": [
|
|
1645
|
+
{},
|
|
1646
|
+
{ "sessionCookie": [] },
|
|
1647
|
+
{ "bearerToken": [] }
|
|
1648
|
+
],
|
|
1330
1649
|
"parameters": [
|
|
1650
|
+
{ "$ref": "#/components/parameters/CapabilityID" },
|
|
1331
1651
|
{
|
|
1332
|
-
"name": "
|
|
1333
|
-
"in": "
|
|
1334
|
-
"
|
|
1335
|
-
|
|
1336
|
-
"format": "uuid"
|
|
1337
|
-
}
|
|
1652
|
+
"name": "version",
|
|
1653
|
+
"in": "path",
|
|
1654
|
+
"required": true,
|
|
1655
|
+
"schema": { "$ref": "#/components/schemas/CalVer" }
|
|
1338
1656
|
},
|
|
1339
1657
|
{
|
|
1340
|
-
"name": "
|
|
1658
|
+
"name": "path",
|
|
1341
1659
|
"in": "query",
|
|
1342
|
-
"description": "
|
|
1343
|
-
"
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1660
|
+
"description": "An entry path exactly as listed by the files endpoint.",
|
|
1661
|
+
"required": true,
|
|
1662
|
+
"schema": { "type": "string" }
|
|
1663
|
+
},
|
|
1664
|
+
{
|
|
1665
|
+
"name": "If-None-Match",
|
|
1666
|
+
"in": "header",
|
|
1667
|
+
"description": "Entity tags the caller holds. A match, or `*`, answers 304.",
|
|
1668
|
+
"required": false,
|
|
1669
|
+
"schema": { "type": "string" }
|
|
1670
|
+
}
|
|
1671
|
+
],
|
|
1672
|
+
"responses": {
|
|
1673
|
+
"200": {
|
|
1674
|
+
"description": "The entry's bytes.",
|
|
1675
|
+
"headers": {
|
|
1676
|
+
"ETag": { "$ref": "#/components/headers/ETag" },
|
|
1677
|
+
"Cache-Control": { "$ref": "#/components/headers/ContentCacheControl" },
|
|
1678
|
+
"Content-Disposition": { "$ref": "#/components/headers/ContentDisposition" },
|
|
1679
|
+
"X-Content-Type-Options": { "$ref": "#/components/headers/XContentTypeOptions" }
|
|
1680
|
+
},
|
|
1681
|
+
"content": {
|
|
1682
|
+
"application/octet-stream": { "schema": {
|
|
1683
|
+
"type": "string",
|
|
1684
|
+
"format": "binary"
|
|
1685
|
+
} },
|
|
1686
|
+
"image/png": { "schema": {
|
|
1687
|
+
"type": "string",
|
|
1688
|
+
"format": "binary"
|
|
1689
|
+
} },
|
|
1690
|
+
"image/jpeg": { "schema": {
|
|
1691
|
+
"type": "string",
|
|
1692
|
+
"format": "binary"
|
|
1693
|
+
} },
|
|
1694
|
+
"image/gif": { "schema": {
|
|
1695
|
+
"type": "string",
|
|
1696
|
+
"format": "binary"
|
|
1697
|
+
} },
|
|
1698
|
+
"image/webp": { "schema": {
|
|
1699
|
+
"type": "string",
|
|
1700
|
+
"format": "binary"
|
|
1701
|
+
} },
|
|
1702
|
+
"text/plain": { "schema": {
|
|
1703
|
+
"type": "string",
|
|
1704
|
+
"format": "binary"
|
|
1705
|
+
} }
|
|
1706
|
+
}
|
|
1707
|
+
},
|
|
1708
|
+
"304": {
|
|
1709
|
+
"description": "The caller's copy is current. No body.",
|
|
1710
|
+
"headers": {
|
|
1711
|
+
"ETag": { "$ref": "#/components/headers/ETag" },
|
|
1712
|
+
"Cache-Control": { "$ref": "#/components/headers/ContentCacheControl" },
|
|
1713
|
+
"X-Content-Type-Options": { "$ref": "#/components/headers/XContentTypeOptions" }
|
|
1714
|
+
}
|
|
1715
|
+
},
|
|
1716
|
+
"400": { "$ref": "#/components/responses/Problem" },
|
|
1717
|
+
"401": { "$ref": "#/components/responses/Problem" },
|
|
1718
|
+
"404": { "$ref": "#/components/responses/Problem" },
|
|
1719
|
+
"default": { "$ref": "#/components/responses/Problem" }
|
|
1720
|
+
}
|
|
1721
|
+
} },
|
|
1722
|
+
"/api/v1/categories/{category_id}": {
|
|
1723
|
+
"parameters": [{
|
|
1724
|
+
"name": "category_id",
|
|
1725
|
+
"in": "path",
|
|
1726
|
+
"required": true,
|
|
1727
|
+
"schema": {
|
|
1728
|
+
"type": "string",
|
|
1729
|
+
"format": "uuid"
|
|
1730
|
+
}
|
|
1731
|
+
}],
|
|
1732
|
+
"patch": {
|
|
1733
|
+
"operationId": "renameCategory",
|
|
1734
|
+
"summary": "Rename a Category, keeping its immutable slug.",
|
|
1735
|
+
"description": "Allowed for the same callers as `createCategory`. Only the display name\nchanges; the slug is immutable, so sending `slug` answers 400. A\nduplicate name in the same Namespace answers 409.\n",
|
|
1736
|
+
"security": [{ "sessionCookie": [] }, { "bearerToken": [] }],
|
|
1737
|
+
"requestBody": {
|
|
1738
|
+
"required": true,
|
|
1739
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/RenameCategoryRequest" } } }
|
|
1740
|
+
},
|
|
1741
|
+
"responses": {
|
|
1742
|
+
"200": {
|
|
1743
|
+
"description": "The renamed Category.",
|
|
1744
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/Category" } } }
|
|
1745
|
+
},
|
|
1746
|
+
"400": { "$ref": "#/components/responses/Problem" },
|
|
1747
|
+
"401": { "$ref": "#/components/responses/Problem" },
|
|
1748
|
+
"403": { "$ref": "#/components/responses/Problem" },
|
|
1749
|
+
"404": { "$ref": "#/components/responses/Problem" },
|
|
1750
|
+
"409": { "$ref": "#/components/responses/Problem" },
|
|
1751
|
+
"default": { "$ref": "#/components/responses/Problem" }
|
|
1752
|
+
}
|
|
1753
|
+
},
|
|
1754
|
+
"delete": {
|
|
1755
|
+
"operationId": "deleteCategory",
|
|
1756
|
+
"summary": "Delete an unused Category.",
|
|
1757
|
+
"description": "Allowed for the same callers as `createCategory`. Deletion is physical.\nA Category referenced by a live Capability answers 409 with the in-use\ncount; references held by soft-deleted Capabilities are nulled by the\nforeign key and do not block.\n",
|
|
1758
|
+
"security": [{ "sessionCookie": [] }, { "bearerToken": [] }],
|
|
1759
|
+
"responses": {
|
|
1760
|
+
"204": { "description": "The Category is deleted." },
|
|
1761
|
+
"400": { "$ref": "#/components/responses/Problem" },
|
|
1762
|
+
"401": { "$ref": "#/components/responses/Problem" },
|
|
1763
|
+
"403": { "$ref": "#/components/responses/Problem" },
|
|
1764
|
+
"404": { "$ref": "#/components/responses/Problem" },
|
|
1765
|
+
"409": { "$ref": "#/components/responses/Problem" },
|
|
1766
|
+
"default": { "$ref": "#/components/responses/Problem" }
|
|
1767
|
+
}
|
|
1768
|
+
}
|
|
1769
|
+
},
|
|
1770
|
+
"/api/v1/audit-events": { "get": {
|
|
1771
|
+
"operationId": "listAuditEvents",
|
|
1772
|
+
"summary": "List the Platform's Audit Events, newest first.",
|
|
1773
|
+
"description": "Only a Platform Admin may read Audit Events; anonymous callers answer\n401 and every other authenticated caller 403. Filters combine with\nAND. `from` is inclusive and `to` is exclusive, both RFC 3339; a\n`from` later than `to` answers 400. An event whose `actor` is null is\na system event, and a deleted actor's username and display name are\nstill returned, so historical facts keep their attribution. Reading\nAudit Events writes no Audit Event. The list is ordered by\n`created_at` then `id`, both descending, and paged by cursor without\na total.\n",
|
|
1774
|
+
"security": [{ "sessionCookie": [] }, { "bearerToken": [] }],
|
|
1775
|
+
"parameters": [
|
|
1776
|
+
{
|
|
1777
|
+
"name": "actor_principal_id",
|
|
1778
|
+
"in": "query",
|
|
1779
|
+
"schema": {
|
|
1780
|
+
"type": "string",
|
|
1781
|
+
"format": "uuid"
|
|
1782
|
+
}
|
|
1783
|
+
},
|
|
1784
|
+
{
|
|
1785
|
+
"name": "action",
|
|
1786
|
+
"in": "query",
|
|
1787
|
+
"description": "One action from the controlled vocabulary.",
|
|
1788
|
+
"schema": {
|
|
1789
|
+
"type": "string",
|
|
1790
|
+
"enum": [
|
|
1791
|
+
"access_token.created",
|
|
1792
|
+
"access_token.revoked",
|
|
1793
|
+
"capability.created",
|
|
1794
|
+
"capability.updated",
|
|
1795
|
+
"capability.deleted",
|
|
1796
|
+
"capability.version_published",
|
|
1797
|
+
"category.created",
|
|
1798
|
+
"category.renamed",
|
|
1799
|
+
"category.deleted",
|
|
1800
|
+
"cli.device_authorized",
|
|
1801
|
+
"cli.device_denied",
|
|
1802
|
+
"principal.created",
|
|
1803
|
+
"principal.disabled",
|
|
1804
|
+
"principal.enabled",
|
|
1805
|
+
"principal.deleted",
|
|
1806
|
+
"principal.profile_updated",
|
|
1807
|
+
"principal.password_changed",
|
|
1808
|
+
"principal.password_reset",
|
|
1809
|
+
"principal.role_changed",
|
|
1360
1810
|
"oidc.identity_linked",
|
|
1361
1811
|
"oidc.profile_synced",
|
|
1362
1812
|
"session.revoked",
|
|
@@ -1378,6 +1828,8 @@ const COMMANDS = deriveCommands({
|
|
|
1378
1828
|
"enum": [
|
|
1379
1829
|
"access_token",
|
|
1380
1830
|
"capability",
|
|
1831
|
+
"category",
|
|
1832
|
+
"device_authorization",
|
|
1381
1833
|
"principal",
|
|
1382
1834
|
"session",
|
|
1383
1835
|
"team"
|
|
@@ -1764,6 +2216,55 @@ const COMMANDS = deriveCommands({
|
|
|
1764
2216
|
"type": "string",
|
|
1765
2217
|
"format": "uuid"
|
|
1766
2218
|
}
|
|
2219
|
+
},
|
|
2220
|
+
"OAuthResponseType": {
|
|
2221
|
+
"name": "response_type",
|
|
2222
|
+
"in": "query",
|
|
2223
|
+
"required": true,
|
|
2224
|
+
"description": "Must be `code`.",
|
|
2225
|
+
"schema": {
|
|
2226
|
+
"type": "string",
|
|
2227
|
+
"enum": ["code"]
|
|
2228
|
+
}
|
|
2229
|
+
},
|
|
2230
|
+
"OAuthClientID": {
|
|
2231
|
+
"name": "client_id",
|
|
2232
|
+
"in": "query",
|
|
2233
|
+
"required": true,
|
|
2234
|
+
"schema": { "type": "string" }
|
|
2235
|
+
},
|
|
2236
|
+
"OAuthRedirectURI": {
|
|
2237
|
+
"name": "redirect_uri",
|
|
2238
|
+
"in": "query",
|
|
2239
|
+
"required": true,
|
|
2240
|
+
"description": "Must exactly match a URI registered for the client.",
|
|
2241
|
+
"schema": {
|
|
2242
|
+
"type": "string",
|
|
2243
|
+
"format": "uri"
|
|
2244
|
+
}
|
|
2245
|
+
},
|
|
2246
|
+
"OAuthState": {
|
|
2247
|
+
"name": "state",
|
|
2248
|
+
"in": "query",
|
|
2249
|
+
"required": false,
|
|
2250
|
+
"description": "Opaque value echoed on the client redirect.",
|
|
2251
|
+
"schema": { "type": "string" }
|
|
2252
|
+
},
|
|
2253
|
+
"OAuthCodeChallenge": {
|
|
2254
|
+
"name": "code_challenge",
|
|
2255
|
+
"in": "query",
|
|
2256
|
+
"required": true,
|
|
2257
|
+
"schema": { "type": "string" }
|
|
2258
|
+
},
|
|
2259
|
+
"OAuthCodeChallengeMethod": {
|
|
2260
|
+
"name": "code_challenge_method",
|
|
2261
|
+
"in": "query",
|
|
2262
|
+
"required": true,
|
|
2263
|
+
"description": "Must be `S256`.",
|
|
2264
|
+
"schema": {
|
|
2265
|
+
"type": "string",
|
|
2266
|
+
"enum": ["S256"]
|
|
2267
|
+
}
|
|
1767
2268
|
}
|
|
1768
2269
|
},
|
|
1769
2270
|
"requestBodies": { "CreateAccessToken": {
|
|
@@ -1772,7 +2273,7 @@ const COMMANDS = deriveCommands({
|
|
|
1772
2273
|
} },
|
|
1773
2274
|
"headers": {
|
|
1774
2275
|
"ETag": {
|
|
1775
|
-
"description": "A strong entity tag of the resource's management metadata: the fields\nthat describe how the resource is governed, such as a Capability's\
|
|
2276
|
+
"description": "A strong entity tag of the resource's management metadata: the fields\nthat describe how the resource is governed, such as a Capability's\nassigned Category's id, name and slug, excluding mutable counters like\na Capability's `download_count` and any caller-relative field. A\ndownload therefore never invalidates an editor's `If-Match`, and every\ncaller sees the same tag.\n",
|
|
1776
2277
|
"required": true,
|
|
1777
2278
|
"schema": { "type": "string" }
|
|
1778
2279
|
},
|
|
@@ -1780,6 +2281,16 @@ const COMMANDS = deriveCommands({
|
|
|
1780
2281
|
"description": "`private, no-store` when the Content is not public to anonymous\nreaders; absent for public Content.\n",
|
|
1781
2282
|
"required": false,
|
|
1782
2283
|
"schema": { "type": "string" }
|
|
2284
|
+
},
|
|
2285
|
+
"ContentDisposition": {
|
|
2286
|
+
"description": "`attachment` carrying the entry's file name for types served as\n`application/octet-stream`; absent when the entry is served inline.\n",
|
|
2287
|
+
"required": false,
|
|
2288
|
+
"schema": { "type": "string" }
|
|
2289
|
+
},
|
|
2290
|
+
"XContentTypeOptions": {
|
|
2291
|
+
"description": "Always `nosniff`.",
|
|
2292
|
+
"required": false,
|
|
2293
|
+
"schema": { "type": "string" }
|
|
1783
2294
|
}
|
|
1784
2295
|
},
|
|
1785
2296
|
"responses": {
|
|
@@ -1798,27 +2309,59 @@ const COMMANDS = deriveCommands({
|
|
|
1798
2309
|
"ReplayedAccessToken": {
|
|
1799
2310
|
"description": "A replayed creation under `Idempotency-Key`: the first created Access Token's metadata, never its value.",
|
|
1800
2311
|
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReplayedAccessToken" } } }
|
|
2312
|
+
},
|
|
2313
|
+
"OAuthError": {
|
|
2314
|
+
"description": "An RFC 6749 error. `Cache-Control` is always `no-store`.",
|
|
2315
|
+
"headers": { "Cache-Control": {
|
|
2316
|
+
"description": "Always `no-store`.",
|
|
2317
|
+
"schema": { "type": "string" }
|
|
2318
|
+
} },
|
|
2319
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthError" } } }
|
|
2320
|
+
},
|
|
2321
|
+
"OAuthProblem": {
|
|
2322
|
+
"description": "An RFC 9457 problem detail. `Cache-Control` is always `no-store`.",
|
|
2323
|
+
"headers": { "Cache-Control": {
|
|
2324
|
+
"description": "Always `no-store`.",
|
|
2325
|
+
"schema": { "type": "string" }
|
|
2326
|
+
} },
|
|
2327
|
+
"content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } }
|
|
1801
2328
|
}
|
|
1802
2329
|
},
|
|
1803
2330
|
"schemas": {
|
|
1804
2331
|
"CreateAccessTokenRequest": {
|
|
1805
2332
|
"type": "object",
|
|
1806
2333
|
"required": ["name"],
|
|
1807
|
-
"properties": {
|
|
1808
|
-
"
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
2334
|
+
"properties": {
|
|
2335
|
+
"name": {
|
|
2336
|
+
"type": "string",
|
|
2337
|
+
"minLength": 1,
|
|
2338
|
+
"maxLength": 64
|
|
2339
|
+
},
|
|
2340
|
+
"audience": {
|
|
2341
|
+
"type": "string",
|
|
2342
|
+
"enum": ["management", "mcp"],
|
|
2343
|
+
"default": "management",
|
|
2344
|
+
"description": "The surface the token may authenticate. `management` (the default)\nworks against `/api/v1`; `mcp` works against Native MCP and is\nrejected by every `/api/v1` operation.\n"
|
|
2345
|
+
}
|
|
2346
|
+
},
|
|
1812
2347
|
"additionalProperties": false
|
|
1813
2348
|
},
|
|
2349
|
+
"AccessTokenAudience": {
|
|
2350
|
+
"type": "string",
|
|
2351
|
+
"enum": ["management", "mcp"],
|
|
2352
|
+
"description": "The surface the token authenticates. Each surface rejects the other's\ntokens.\n"
|
|
2353
|
+
},
|
|
1814
2354
|
"AccessToken": {
|
|
1815
2355
|
"type": "object",
|
|
1816
2356
|
"required": [
|
|
1817
2357
|
"id",
|
|
1818
2358
|
"name",
|
|
1819
2359
|
"token_prefix",
|
|
2360
|
+
"audience",
|
|
1820
2361
|
"created_at",
|
|
1821
|
-
"last_used_at"
|
|
2362
|
+
"last_used_at",
|
|
2363
|
+
"expires_at",
|
|
2364
|
+
"client_name"
|
|
1822
2365
|
],
|
|
1823
2366
|
"properties": {
|
|
1824
2367
|
"id": {
|
|
@@ -1830,6 +2373,7 @@ const COMMANDS = deriveCommands({
|
|
|
1830
2373
|
"type": "string",
|
|
1831
2374
|
"description": "The first 8 characters after `hng_`, for recognising a token. Not a credential."
|
|
1832
2375
|
},
|
|
2376
|
+
"audience": { "$ref": "#/components/schemas/AccessTokenAudience" },
|
|
1833
2377
|
"created_at": {
|
|
1834
2378
|
"type": "string",
|
|
1835
2379
|
"format": "date-time"
|
|
@@ -1838,6 +2382,15 @@ const COMMANDS = deriveCommands({
|
|
|
1838
2382
|
"type": ["string", "null"],
|
|
1839
2383
|
"format": "date-time",
|
|
1840
2384
|
"description": "Recorded at most once every 5 minutes; null until first use."
|
|
2385
|
+
},
|
|
2386
|
+
"expires_at": {
|
|
2387
|
+
"type": ["string", "null"],
|
|
2388
|
+
"format": "date-time",
|
|
2389
|
+
"description": "Null for static tokens, which never expire and are revoked instead."
|
|
2390
|
+
},
|
|
2391
|
+
"client_name": {
|
|
2392
|
+
"type": ["string", "null"],
|
|
2393
|
+
"description": "The OAuth client that obtained the token; null for static tokens."
|
|
1841
2394
|
}
|
|
1842
2395
|
}
|
|
1843
2396
|
},
|
|
@@ -1849,6 +2402,192 @@ const COMMANDS = deriveCommands({
|
|
|
1849
2402
|
"items": { "$ref": "#/components/schemas/AccessToken" }
|
|
1850
2403
|
} }
|
|
1851
2404
|
},
|
|
2405
|
+
"OAuthClientRegistrationRequest": {
|
|
2406
|
+
"type": "object",
|
|
2407
|
+
"required": ["client_name", "redirect_uris"],
|
|
2408
|
+
"properties": {
|
|
2409
|
+
"client_name": {
|
|
2410
|
+
"type": "string",
|
|
2411
|
+
"minLength": 1,
|
|
2412
|
+
"maxLength": 100
|
|
2413
|
+
},
|
|
2414
|
+
"redirect_uris": {
|
|
2415
|
+
"type": "array",
|
|
2416
|
+
"minItems": 1,
|
|
2417
|
+
"maxItems": 10,
|
|
2418
|
+
"items": {
|
|
2419
|
+
"type": "string",
|
|
2420
|
+
"maxLength": 2048
|
|
2421
|
+
}
|
|
2422
|
+
},
|
|
2423
|
+
"token_endpoint_auth_method": {
|
|
2424
|
+
"type": "string",
|
|
2425
|
+
"enum": ["none"],
|
|
2426
|
+
"default": "none",
|
|
2427
|
+
"description": "The only accepted value; omitted means `none`."
|
|
2428
|
+
},
|
|
2429
|
+
"grant_types": {
|
|
2430
|
+
"type": "array",
|
|
2431
|
+
"items": {
|
|
2432
|
+
"type": "string",
|
|
2433
|
+
"enum": ["authorization_code", "refresh_token"]
|
|
2434
|
+
},
|
|
2435
|
+
"default": ["authorization_code"],
|
|
2436
|
+
"description": "Omitted means `[\"authorization_code\"]`; `refresh_token` may accompany it."
|
|
2437
|
+
},
|
|
2438
|
+
"response_types": {
|
|
2439
|
+
"type": "array",
|
|
2440
|
+
"items": {
|
|
2441
|
+
"type": "string",
|
|
2442
|
+
"enum": ["code"]
|
|
2443
|
+
},
|
|
2444
|
+
"default": ["code"],
|
|
2445
|
+
"description": "Omitted means `[\"code\"]`."
|
|
2446
|
+
}
|
|
2447
|
+
},
|
|
2448
|
+
"additionalProperties": false
|
|
2449
|
+
},
|
|
2450
|
+
"OAuthClientRegistration": {
|
|
2451
|
+
"type": "object",
|
|
2452
|
+
"required": [
|
|
2453
|
+
"client_id",
|
|
2454
|
+
"client_id_issued_at",
|
|
2455
|
+
"client_name",
|
|
2456
|
+
"redirect_uris",
|
|
2457
|
+
"token_endpoint_auth_method",
|
|
2458
|
+
"grant_types",
|
|
2459
|
+
"response_types"
|
|
2460
|
+
],
|
|
2461
|
+
"properties": {
|
|
2462
|
+
"client_id": {
|
|
2463
|
+
"type": "string",
|
|
2464
|
+
"description": "`hngc_` plus at least 20 characters."
|
|
2465
|
+
},
|
|
2466
|
+
"client_id_issued_at": {
|
|
2467
|
+
"type": "integer",
|
|
2468
|
+
"description": "Unix time in seconds."
|
|
2469
|
+
},
|
|
2470
|
+
"client_name": { "type": "string" },
|
|
2471
|
+
"redirect_uris": {
|
|
2472
|
+
"type": "array",
|
|
2473
|
+
"items": { "type": "string" }
|
|
2474
|
+
},
|
|
2475
|
+
"token_endpoint_auth_method": {
|
|
2476
|
+
"type": "string",
|
|
2477
|
+
"enum": ["none"]
|
|
2478
|
+
},
|
|
2479
|
+
"grant_types": {
|
|
2480
|
+
"type": "array",
|
|
2481
|
+
"items": { "type": "string" }
|
|
2482
|
+
},
|
|
2483
|
+
"response_types": {
|
|
2484
|
+
"type": "array",
|
|
2485
|
+
"items": { "type": "string" }
|
|
2486
|
+
}
|
|
2487
|
+
}
|
|
2488
|
+
},
|
|
2489
|
+
"ExchangeOAuthTokenRequest": {
|
|
2490
|
+
"type": "object",
|
|
2491
|
+
"properties": {
|
|
2492
|
+
"grant_type": {
|
|
2493
|
+
"type": "string",
|
|
2494
|
+
"enum": ["authorization_code", "refresh_token"]
|
|
2495
|
+
},
|
|
2496
|
+
"code": { "type": "string" },
|
|
2497
|
+
"redirect_uri": { "type": "string" },
|
|
2498
|
+
"client_id": { "type": "string" },
|
|
2499
|
+
"code_verifier": { "type": "string" },
|
|
2500
|
+
"refresh_token": { "type": "string" }
|
|
2501
|
+
}
|
|
2502
|
+
},
|
|
2503
|
+
"OAuthToken": {
|
|
2504
|
+
"type": "object",
|
|
2505
|
+
"required": [
|
|
2506
|
+
"access_token",
|
|
2507
|
+
"token_type",
|
|
2508
|
+
"expires_in",
|
|
2509
|
+
"refresh_token"
|
|
2510
|
+
],
|
|
2511
|
+
"properties": {
|
|
2512
|
+
"access_token": {
|
|
2513
|
+
"type": "string",
|
|
2514
|
+
"description": "An `hng_<value>` MCP token. Use it as `Authorization: Bearer <token>`."
|
|
2515
|
+
},
|
|
2516
|
+
"token_type": {
|
|
2517
|
+
"type": "string",
|
|
2518
|
+
"enum": ["Bearer"]
|
|
2519
|
+
},
|
|
2520
|
+
"expires_in": {
|
|
2521
|
+
"type": "integer",
|
|
2522
|
+
"description": "Access token lifetime in seconds."
|
|
2523
|
+
},
|
|
2524
|
+
"refresh_token": { "type": "string" }
|
|
2525
|
+
}
|
|
2526
|
+
},
|
|
2527
|
+
"OAuthError": {
|
|
2528
|
+
"type": "object",
|
|
2529
|
+
"required": ["error", "error_description"],
|
|
2530
|
+
"properties": {
|
|
2531
|
+
"error": {
|
|
2532
|
+
"type": "string",
|
|
2533
|
+
"enum": [
|
|
2534
|
+
"invalid_request",
|
|
2535
|
+
"invalid_grant",
|
|
2536
|
+
"unsupported_grant_type"
|
|
2537
|
+
]
|
|
2538
|
+
},
|
|
2539
|
+
"error_description": { "type": "string" }
|
|
2540
|
+
}
|
|
2541
|
+
},
|
|
2542
|
+
"OAuthAuthorizationPreview": {
|
|
2543
|
+
"type": "object",
|
|
2544
|
+
"required": ["client_name", "redirect_host"],
|
|
2545
|
+
"properties": {
|
|
2546
|
+
"client_name": { "type": "string" },
|
|
2547
|
+
"redirect_host": {
|
|
2548
|
+
"type": "string",
|
|
2549
|
+
"description": "The host of the registered redirect URI; the URI itself is never exposed."
|
|
2550
|
+
}
|
|
2551
|
+
}
|
|
2552
|
+
},
|
|
2553
|
+
"OAuthAuthorizationDecision": {
|
|
2554
|
+
"type": "object",
|
|
2555
|
+
"required": ["redirect_to"],
|
|
2556
|
+
"properties": { "redirect_to": {
|
|
2557
|
+
"type": "string",
|
|
2558
|
+
"description": "The client redirect carrying `code` or `error=access_denied`, plus `state`."
|
|
2559
|
+
} }
|
|
2560
|
+
},
|
|
2561
|
+
"DecideOAuthAuthorizationRequest": {
|
|
2562
|
+
"type": "object",
|
|
2563
|
+
"required": [
|
|
2564
|
+
"response_type",
|
|
2565
|
+
"client_id",
|
|
2566
|
+
"redirect_uri",
|
|
2567
|
+
"code_challenge",
|
|
2568
|
+
"code_challenge_method",
|
|
2569
|
+
"decision"
|
|
2570
|
+
],
|
|
2571
|
+
"properties": {
|
|
2572
|
+
"response_type": {
|
|
2573
|
+
"type": "string",
|
|
2574
|
+
"enum": ["code"]
|
|
2575
|
+
},
|
|
2576
|
+
"client_id": { "type": "string" },
|
|
2577
|
+
"redirect_uri": { "type": "string" },
|
|
2578
|
+
"state": { "type": "string" },
|
|
2579
|
+
"code_challenge": { "type": "string" },
|
|
2580
|
+
"code_challenge_method": {
|
|
2581
|
+
"type": "string",
|
|
2582
|
+
"enum": ["S256"]
|
|
2583
|
+
},
|
|
2584
|
+
"decision": {
|
|
2585
|
+
"type": "string",
|
|
2586
|
+
"enum": ["approve", "deny"]
|
|
2587
|
+
}
|
|
2588
|
+
},
|
|
2589
|
+
"additionalProperties": false
|
|
2590
|
+
},
|
|
1852
2591
|
"CreatedAccessToken": {
|
|
1853
2592
|
"type": "object",
|
|
1854
2593
|
"required": [
|
|
@@ -1938,6 +2677,168 @@ const COMMANDS = deriveCommands({
|
|
|
1938
2677
|
},
|
|
1939
2678
|
"additionalProperties": false
|
|
1940
2679
|
},
|
|
2680
|
+
"CreateDeviceAuthorizationRequest": {
|
|
2681
|
+
"type": "object",
|
|
2682
|
+
"required": ["device_name", "token_name"],
|
|
2683
|
+
"properties": {
|
|
2684
|
+
"device_name": {
|
|
2685
|
+
"type": "string",
|
|
2686
|
+
"minLength": 1,
|
|
2687
|
+
"maxLength": 128,
|
|
2688
|
+
"description": "The device name the CLI reports, shown to the approver."
|
|
2689
|
+
},
|
|
2690
|
+
"token_name": {
|
|
2691
|
+
"type": "string",
|
|
2692
|
+
"minLength": 1,
|
|
2693
|
+
"maxLength": 64,
|
|
2694
|
+
"description": "The name of the Access Token approval would create."
|
|
2695
|
+
}
|
|
2696
|
+
},
|
|
2697
|
+
"additionalProperties": false
|
|
2698
|
+
},
|
|
2699
|
+
"DeviceAuthorizationCode": {
|
|
2700
|
+
"type": "object",
|
|
2701
|
+
"required": [
|
|
2702
|
+
"device_code",
|
|
2703
|
+
"user_code",
|
|
2704
|
+
"verification_uri",
|
|
2705
|
+
"verification_uri_complete",
|
|
2706
|
+
"expires_in",
|
|
2707
|
+
"interval"
|
|
2708
|
+
],
|
|
2709
|
+
"properties": {
|
|
2710
|
+
"device_code": {
|
|
2711
|
+
"type": "string",
|
|
2712
|
+
"description": "The credential the CLI polls with. Returned only here and stored as\na keyed digest.\n"
|
|
2713
|
+
},
|
|
2714
|
+
"user_code": {
|
|
2715
|
+
"type": "string",
|
|
2716
|
+
"description": "The short public code displayed as `XXXX-XXXX`."
|
|
2717
|
+
},
|
|
2718
|
+
"verification_uri": {
|
|
2719
|
+
"type": "string",
|
|
2720
|
+
"description": "Where the user approves the request."
|
|
2721
|
+
},
|
|
2722
|
+
"verification_uri_complete": {
|
|
2723
|
+
"type": "string",
|
|
2724
|
+
"description": "The verification URI with the user code already applied."
|
|
2725
|
+
},
|
|
2726
|
+
"expires_in": {
|
|
2727
|
+
"type": "integer",
|
|
2728
|
+
"description": "Seconds until the request expires. Always 900."
|
|
2729
|
+
},
|
|
2730
|
+
"interval": {
|
|
2731
|
+
"type": "integer",
|
|
2732
|
+
"description": "The minimum seconds between polls. Always 5."
|
|
2733
|
+
}
|
|
2734
|
+
},
|
|
2735
|
+
"additionalProperties": false
|
|
2736
|
+
},
|
|
2737
|
+
"LookupDeviceAuthorizationRequest": {
|
|
2738
|
+
"type": "object",
|
|
2739
|
+
"required": ["user_code"],
|
|
2740
|
+
"properties": { "user_code": {
|
|
2741
|
+
"type": "string",
|
|
2742
|
+
"minLength": 1,
|
|
2743
|
+
"maxLength": 32
|
|
2744
|
+
} },
|
|
2745
|
+
"additionalProperties": false
|
|
2746
|
+
},
|
|
2747
|
+
"PollDeviceAuthorizationRequest": {
|
|
2748
|
+
"type": "object",
|
|
2749
|
+
"required": ["device_code"],
|
|
2750
|
+
"properties": { "device_code": {
|
|
2751
|
+
"type": "string",
|
|
2752
|
+
"minLength": 1,
|
|
2753
|
+
"maxLength": 128
|
|
2754
|
+
} },
|
|
2755
|
+
"additionalProperties": false
|
|
2756
|
+
},
|
|
2757
|
+
"ApproveDeviceAuthorizationRequest": {
|
|
2758
|
+
"type": "object",
|
|
2759
|
+
"required": ["user_code"],
|
|
2760
|
+
"properties": { "user_code": {
|
|
2761
|
+
"type": "string",
|
|
2762
|
+
"minLength": 1,
|
|
2763
|
+
"maxLength": 32
|
|
2764
|
+
} },
|
|
2765
|
+
"additionalProperties": false
|
|
2766
|
+
},
|
|
2767
|
+
"DenyDeviceAuthorizationRequest": {
|
|
2768
|
+
"type": "object",
|
|
2769
|
+
"required": ["user_code"],
|
|
2770
|
+
"properties": { "user_code": {
|
|
2771
|
+
"type": "string",
|
|
2772
|
+
"minLength": 1,
|
|
2773
|
+
"maxLength": 32
|
|
2774
|
+
} },
|
|
2775
|
+
"additionalProperties": false
|
|
2776
|
+
},
|
|
2777
|
+
"DeviceAuthorization": {
|
|
2778
|
+
"type": "object",
|
|
2779
|
+
"required": [
|
|
2780
|
+
"device_name",
|
|
2781
|
+
"source_ip",
|
|
2782
|
+
"requested_at",
|
|
2783
|
+
"token_name",
|
|
2784
|
+
"expires_at",
|
|
2785
|
+
"state"
|
|
2786
|
+
],
|
|
2787
|
+
"properties": {
|
|
2788
|
+
"device_name": { "type": "string" },
|
|
2789
|
+
"source_ip": { "type": "string" },
|
|
2790
|
+
"requested_at": {
|
|
2791
|
+
"type": "string",
|
|
2792
|
+
"format": "date-time"
|
|
2793
|
+
},
|
|
2794
|
+
"token_name": { "type": "string" },
|
|
2795
|
+
"expires_at": {
|
|
2796
|
+
"type": "string",
|
|
2797
|
+
"format": "date-time"
|
|
2798
|
+
},
|
|
2799
|
+
"state": {
|
|
2800
|
+
"type": "string",
|
|
2801
|
+
"enum": [
|
|
2802
|
+
"pending",
|
|
2803
|
+
"approved",
|
|
2804
|
+
"denied",
|
|
2805
|
+
"consumed"
|
|
2806
|
+
],
|
|
2807
|
+
"description": "The request's lifecycle state. Denied and consumed requests stay\nreadable so a reload shows the outcome.\n"
|
|
2808
|
+
}
|
|
2809
|
+
},
|
|
2810
|
+
"additionalProperties": false
|
|
2811
|
+
},
|
|
2812
|
+
"DeviceAuthorizationToken": {
|
|
2813
|
+
"type": "object",
|
|
2814
|
+
"required": [
|
|
2815
|
+
"token",
|
|
2816
|
+
"token_id",
|
|
2817
|
+
"token_prefix",
|
|
2818
|
+
"name",
|
|
2819
|
+
"principal"
|
|
2820
|
+
],
|
|
2821
|
+
"properties": {
|
|
2822
|
+
"token": {
|
|
2823
|
+
"type": "string",
|
|
2824
|
+
"description": "The Access Token value. Returned exactly once, by the poll that\nconsumes the approval.\n"
|
|
2825
|
+
},
|
|
2826
|
+
"token_id": {
|
|
2827
|
+
"type": "string",
|
|
2828
|
+
"format": "uuid"
|
|
2829
|
+
},
|
|
2830
|
+
"token_prefix": {
|
|
2831
|
+
"type": "string",
|
|
2832
|
+
"description": "The first eight random characters, for display."
|
|
2833
|
+
},
|
|
2834
|
+
"name": {
|
|
2835
|
+
"type": "string",
|
|
2836
|
+
"description": "The token name shown on the verification page."
|
|
2837
|
+
},
|
|
2838
|
+
"principal": { "$ref": "#/components/schemas/Principal" }
|
|
2839
|
+
},
|
|
2840
|
+
"additionalProperties": false
|
|
2841
|
+
},
|
|
1941
2842
|
"Principal": {
|
|
1942
2843
|
"type": "object",
|
|
1943
2844
|
"required": [
|
|
@@ -2035,6 +2936,8 @@ const COMMANDS = deriveCommands({
|
|
|
2035
2936
|
"enum": [
|
|
2036
2937
|
"access_token",
|
|
2037
2938
|
"capability",
|
|
2939
|
+
"category",
|
|
2940
|
+
"device_authorization",
|
|
2038
2941
|
"principal",
|
|
2039
2942
|
"session",
|
|
2040
2943
|
"team"
|
|
@@ -2255,7 +3158,7 @@ const COMMANDS = deriveCommands({
|
|
|
2255
3158
|
},
|
|
2256
3159
|
"Readme": {
|
|
2257
3160
|
"type": ["string", "null"],
|
|
2258
|
-
"description": "Markdown, at most 1 MiB of UTF-8. Omitted or null means no README; an
|
|
3161
|
+
"description": "Markdown, at most 1 MiB of UTF-8. Omitted or null means no README was\nattached; an empty string is kept as an empty README. A Skill Version\nwithout one reports its package's `SKILL.md` in place of a README.\n"
|
|
2259
3162
|
},
|
|
2260
3163
|
"MCPConfig": {
|
|
2261
3164
|
"type": "object",
|
|
@@ -2263,13 +3166,6 @@ const COMMANDS = deriveCommands({
|
|
|
2263
3166
|
"additionalProperties": true,
|
|
2264
3167
|
"x-go-type": "json.RawMessage"
|
|
2265
3168
|
},
|
|
2266
|
-
"Tag": {
|
|
2267
|
-
"type": "string",
|
|
2268
|
-
"description": "A normalized tag: 1–32 Unicode characters after trimming, collapsing\ninternal whitespace and case-folding to lowercase. It cannot contain a\ncomma or a control character. Writers and readers normalize the same\nway, so a tag compares and filters by its normalized form.\n",
|
|
2269
|
-
"minLength": 1,
|
|
2270
|
-
"maxLength": 32,
|
|
2271
|
-
"pattern": "^[^,\\x00-\\x1F\\x7F]+$"
|
|
2272
|
-
},
|
|
2273
3169
|
"CreateMCPCapabilityRequest": {
|
|
2274
3170
|
"type": "object",
|
|
2275
3171
|
"required": [
|
|
@@ -2288,11 +3184,9 @@ const COMMANDS = deriveCommands({
|
|
|
2288
3184
|
"description": { "$ref": "#/components/schemas/Description" },
|
|
2289
3185
|
"visibility": { "$ref": "#/components/schemas/Visibility" },
|
|
2290
3186
|
"readme": { "$ref": "#/components/schemas/Readme" },
|
|
2291
|
-
"
|
|
2292
|
-
"type": "
|
|
2293
|
-
"description": "
|
|
2294
|
-
"maxItems": 8,
|
|
2295
|
-
"items": { "$ref": "#/components/schemas/Tag" }
|
|
3187
|
+
"category": {
|
|
3188
|
+
"type": "string",
|
|
3189
|
+
"description": "A Category slug inside the target Namespace. Omit it or send an\nempty value for uncategorized; an unknown slug, or one owned by\nanother or a non-live Namespace, answers 400.\n"
|
|
2296
3190
|
},
|
|
2297
3191
|
"config": { "$ref": "#/components/schemas/MCPConfig" }
|
|
2298
3192
|
},
|
|
@@ -2318,12 +3212,11 @@ const COMMANDS = deriveCommands({
|
|
|
2318
3212
|
"visibility": { "$ref": "#/components/schemas/Visibility" },
|
|
2319
3213
|
"readme": {
|
|
2320
3214
|
"type": "string",
|
|
2321
|
-
"description": "Markdown, at most 1 MiB of UTF-8. Omitted means
|
|
3215
|
+
"description": "Markdown, at most 1 MiB of UTF-8. Omitted means the package's\n`SKILL.md` is reported as the Version's README.\n"
|
|
2322
3216
|
},
|
|
2323
|
-
"
|
|
3217
|
+
"category": {
|
|
2324
3218
|
"type": "string",
|
|
2325
|
-
"description": "
|
|
2326
|
-
"maxLength": 512
|
|
3219
|
+
"description": "A Category slug inside the target Namespace, sent as one multipart\nfield. Omit it or send an empty value for uncategorized; an unknown\nslug, or one owned by another or a non-live Namespace, answers 400.\n"
|
|
2327
3220
|
},
|
|
2328
3221
|
"package": {
|
|
2329
3222
|
"type": "string",
|
|
@@ -2337,11 +3230,11 @@ const COMMANDS = deriveCommands({
|
|
|
2337
3230
|
"properties": {
|
|
2338
3231
|
"description": { "$ref": "#/components/schemas/Description" },
|
|
2339
3232
|
"visibility": { "$ref": "#/components/schemas/Visibility" },
|
|
2340
|
-
"
|
|
2341
|
-
"
|
|
2342
|
-
"
|
|
2343
|
-
"
|
|
2344
|
-
"
|
|
3233
|
+
"category": {
|
|
3234
|
+
"description": "Three-state: omitted leaves the Category unchanged, `null` clears\nit, and a slug must name a live Category of this Capability's own\nNamespace. An unknown or foreign slug answers 400.\n",
|
|
3235
|
+
"type": ["string", "null"],
|
|
3236
|
+
"x-go-type": "json.RawMessage",
|
|
3237
|
+
"x-go-type-skip-optional-pointer": true
|
|
2345
3238
|
},
|
|
2346
3239
|
"kind": {
|
|
2347
3240
|
"description": "Immutable; any value returns 400.",
|
|
@@ -2377,7 +3270,7 @@ const COMMANDS = deriveCommands({
|
|
|
2377
3270
|
"properties": {
|
|
2378
3271
|
"readme": {
|
|
2379
3272
|
"type": "string",
|
|
2380
|
-
"description": "Markdown, at most 1 MiB of UTF-8. Omitted means
|
|
3273
|
+
"description": "Markdown, at most 1 MiB of UTF-8. Omitted means the package's\n`SKILL.md` is reported as the Version's README.\n"
|
|
2381
3274
|
},
|
|
2382
3275
|
"package": {
|
|
2383
3276
|
"type": "string",
|
|
@@ -2398,7 +3291,7 @@ const COMMANDS = deriveCommands({
|
|
|
2398
3291
|
"path",
|
|
2399
3292
|
"visibility",
|
|
2400
3293
|
"description",
|
|
2401
|
-
"
|
|
3294
|
+
"category",
|
|
2402
3295
|
"download_count",
|
|
2403
3296
|
"current_version",
|
|
2404
3297
|
"created_at",
|
|
@@ -2432,11 +3325,9 @@ const COMMANDS = deriveCommands({
|
|
|
2432
3325
|
},
|
|
2433
3326
|
"visibility": { "$ref": "#/components/schemas/Visibility" },
|
|
2434
3327
|
"description": { "$ref": "#/components/schemas/Description" },
|
|
2435
|
-
"
|
|
2436
|
-
"
|
|
2437
|
-
"
|
|
2438
|
-
"maxItems": 8,
|
|
2439
|
-
"items": { "$ref": "#/components/schemas/Tag" }
|
|
3328
|
+
"category": {
|
|
3329
|
+
"description": "The assigned Category, or null when the Capability is uncategorized.",
|
|
3330
|
+
"oneOf": [{ "$ref": "#/components/schemas/CategoryRef" }, { "type": "null" }]
|
|
2440
3331
|
},
|
|
2441
3332
|
"download_count": {
|
|
2442
3333
|
"type": "integer",
|
|
@@ -2455,32 +3346,120 @@ const COMMANDS = deriveCommands({
|
|
|
2455
3346
|
}
|
|
2456
3347
|
}
|
|
2457
3348
|
},
|
|
2458
|
-
"
|
|
3349
|
+
"CategoryRef": {
|
|
3350
|
+
"type": "object",
|
|
3351
|
+
"required": [
|
|
3352
|
+
"id",
|
|
3353
|
+
"name",
|
|
3354
|
+
"slug"
|
|
3355
|
+
],
|
|
3356
|
+
"properties": {
|
|
3357
|
+
"id": {
|
|
3358
|
+
"type": "string",
|
|
3359
|
+
"format": "uuid"
|
|
3360
|
+
},
|
|
3361
|
+
"name": {
|
|
3362
|
+
"type": "string",
|
|
3363
|
+
"minLength": 1,
|
|
3364
|
+
"maxLength": 32,
|
|
3365
|
+
"description": "The Category's normalized display name."
|
|
3366
|
+
},
|
|
3367
|
+
"slug": {
|
|
3368
|
+
"$ref": "#/components/schemas/Name",
|
|
3369
|
+
"description": "The Category's immutable ASCII reference inside its Namespace."
|
|
3370
|
+
}
|
|
3371
|
+
},
|
|
3372
|
+
"additionalProperties": false
|
|
3373
|
+
},
|
|
3374
|
+
"Category": {
|
|
2459
3375
|
"type": "object",
|
|
2460
|
-
"required": [
|
|
3376
|
+
"required": [
|
|
3377
|
+
"id",
|
|
3378
|
+
"namespace",
|
|
3379
|
+
"namespace_kind",
|
|
3380
|
+
"name",
|
|
3381
|
+
"slug",
|
|
3382
|
+
"count"
|
|
3383
|
+
],
|
|
2461
3384
|
"properties": {
|
|
2462
|
-
"
|
|
3385
|
+
"id": {
|
|
3386
|
+
"type": "string",
|
|
3387
|
+
"format": "uuid"
|
|
3388
|
+
},
|
|
3389
|
+
"namespace": { "$ref": "#/components/schemas/Name" },
|
|
3390
|
+
"namespace_kind": { "$ref": "#/components/schemas/NamespaceKind" },
|
|
3391
|
+
"name": {
|
|
3392
|
+
"type": "string",
|
|
3393
|
+
"minLength": 1,
|
|
3394
|
+
"maxLength": 32,
|
|
3395
|
+
"description": "The normalized display name: trimmed and with internal whitespace\ncollapsed, with the caller's case preserved. Chinese names are\nsupported.\n"
|
|
3396
|
+
},
|
|
3397
|
+
"slug": {
|
|
3398
|
+
"$ref": "#/components/schemas/Name",
|
|
3399
|
+
"description": "The immutable ASCII reference of the Category inside its Namespace.\n"
|
|
3400
|
+
},
|
|
2463
3401
|
"count": {
|
|
2464
3402
|
"type": "integer",
|
|
2465
3403
|
"format": "int64",
|
|
2466
|
-
"minimum": 0
|
|
3404
|
+
"minimum": 0,
|
|
3405
|
+
"description": "The number of Capabilities carrying the Category that the caller may\nread. It is 0 in the Namespace taxonomy when no readable Capability\nuses the Category.\n"
|
|
2467
3406
|
}
|
|
2468
3407
|
}
|
|
2469
3408
|
},
|
|
2470
|
-
"
|
|
3409
|
+
"CategoryList": {
|
|
2471
3410
|
"type": "object",
|
|
2472
|
-
"required": [
|
|
3411
|
+
"required": [
|
|
3412
|
+
"items",
|
|
3413
|
+
"truncated",
|
|
3414
|
+
"can_manage"
|
|
3415
|
+
],
|
|
2473
3416
|
"properties": {
|
|
2474
3417
|
"items": {
|
|
2475
3418
|
"type": "array",
|
|
2476
|
-
"items": { "$ref": "#/components/schemas/
|
|
3419
|
+
"items": { "$ref": "#/components/schemas/Category" }
|
|
2477
3420
|
},
|
|
2478
3421
|
"truncated": {
|
|
2479
3422
|
"type": "boolean",
|
|
2480
|
-
"description": "More
|
|
3423
|
+
"description": "More Categories exist than the requested `limit`."
|
|
3424
|
+
},
|
|
3425
|
+
"can_manage": {
|
|
3426
|
+
"type": "boolean",
|
|
3427
|
+
"description": "Whether the caller may create, rename or delete Categories of the\nlisted Namespace. It is the authoritative `can_manage_category`\nfact in the Namespace view and always `false` in the usage view,\nwhere no single Namespace is named.\n"
|
|
2481
3428
|
}
|
|
2482
3429
|
}
|
|
2483
3430
|
},
|
|
3431
|
+
"CreateCategoryRequest": {
|
|
3432
|
+
"type": "object",
|
|
3433
|
+
"required": ["namespace", "name"],
|
|
3434
|
+
"properties": {
|
|
3435
|
+
"namespace": {
|
|
3436
|
+
"$ref": "#/components/schemas/Name",
|
|
3437
|
+
"description": "The name of the live Namespace that will own the Category."
|
|
3438
|
+
},
|
|
3439
|
+
"name": {
|
|
3440
|
+
"type": "string",
|
|
3441
|
+
"minLength": 1,
|
|
3442
|
+
"maxLength": 64,
|
|
3443
|
+
"description": "The display name. The server trims it and collapses internal\nwhitespace, preserving case, then requires 1–32 characters without\na comma or a control character.\n"
|
|
3444
|
+
},
|
|
3445
|
+
"slug": {
|
|
3446
|
+
"$ref": "#/components/schemas/Name",
|
|
3447
|
+
"description": "Optional immutable slug. Omitted means derive it from the normalized\nname; a name that cannot form a valid slug then answers 400.\n"
|
|
3448
|
+
}
|
|
3449
|
+
},
|
|
3450
|
+
"additionalProperties": false
|
|
3451
|
+
},
|
|
3452
|
+
"RenameCategoryRequest": {
|
|
3453
|
+
"type": "object",
|
|
3454
|
+
"required": ["name"],
|
|
3455
|
+
"properties": { "name": {
|
|
3456
|
+
"type": "string",
|
|
3457
|
+
"minLength": 1,
|
|
3458
|
+
"maxLength": 64,
|
|
3459
|
+
"description": "The new display name, normalized like `CreateCategoryRequest.name`.\nSending a `slug` property answers 400: the slug is immutable, and\nthe server rejects the property even though it is not declared.\n"
|
|
3460
|
+
} },
|
|
3461
|
+
"additionalProperties": false
|
|
3462
|
+
},
|
|
2484
3463
|
"CapabilityList": {
|
|
2485
3464
|
"type": "object",
|
|
2486
3465
|
"required": ["items", "next_cursor"],
|
|
@@ -2527,7 +3506,11 @@ const COMMANDS = deriveCommands({
|
|
|
2527
3506
|
"version": { "$ref": "#/components/schemas/CalVer" },
|
|
2528
3507
|
"readme": {
|
|
2529
3508
|
"type": ["string", "null"],
|
|
2530
|
-
"description": "The Version's Markdown README
|
|
3509
|
+
"description": "The Version's Markdown README. A Skill Version that was published\nwithout one reports the package's `SKILL.md`, or null when the\nmanifest cannot be read as text within the README limit.\n"
|
|
3510
|
+
},
|
|
3511
|
+
"readme_from_manifest": {
|
|
3512
|
+
"type": "boolean",
|
|
3513
|
+
"description": "True when `readme` was derived from the package's `SKILL.md`\nbecause the Version has no attached README. Omitted otherwise.\n"
|
|
2531
3514
|
},
|
|
2532
3515
|
"created_at": {
|
|
2533
3516
|
"type": "string",
|
|
@@ -2596,6 +3579,53 @@ const COMMANDS = deriveCommands({
|
|
|
2596
3579
|
],
|
|
2597
3580
|
"additionalProperties": false
|
|
2598
3581
|
},
|
|
3582
|
+
"PackageEntry": {
|
|
3583
|
+
"type": "object",
|
|
3584
|
+
"description": "One entry of a Skill package's ZIP central directory.",
|
|
3585
|
+
"properties": {
|
|
3586
|
+
"path": {
|
|
3587
|
+
"type": "string",
|
|
3588
|
+
"description": "The entry path, without a trailing slash."
|
|
3589
|
+
},
|
|
3590
|
+
"size": {
|
|
3591
|
+
"type": "integer",
|
|
3592
|
+
"format": "int64",
|
|
3593
|
+
"minimum": 0,
|
|
3594
|
+
"description": "The declared uncompressed size; 0 for a directory."
|
|
3595
|
+
},
|
|
3596
|
+
"mode": {
|
|
3597
|
+
"type": "string",
|
|
3598
|
+
"pattern": "^[0-7]{4}$",
|
|
3599
|
+
"description": "Four-digit octal permission bits, such as `\"0644\"`."
|
|
3600
|
+
},
|
|
3601
|
+
"is_dir": {
|
|
3602
|
+
"type": "boolean",
|
|
3603
|
+
"description": "Whether the entry is a directory."
|
|
3604
|
+
}
|
|
3605
|
+
},
|
|
3606
|
+
"required": [
|
|
3607
|
+
"path",
|
|
3608
|
+
"size",
|
|
3609
|
+
"mode",
|
|
3610
|
+
"is_dir"
|
|
3611
|
+
],
|
|
3612
|
+
"additionalProperties": false
|
|
3613
|
+
},
|
|
3614
|
+
"PackageEntryList": {
|
|
3615
|
+
"type": "object",
|
|
3616
|
+
"required": ["items"],
|
|
3617
|
+
"properties": {
|
|
3618
|
+
"items": {
|
|
3619
|
+
"type": "array",
|
|
3620
|
+
"items": { "$ref": "#/components/schemas/PackageEntry" }
|
|
3621
|
+
},
|
|
3622
|
+
"default_path": {
|
|
3623
|
+
"type": "string",
|
|
3624
|
+
"description": "The entry the Package Browser selects by default: `SKILL.md` at the\npackage root or inside its single top-level directory. Omitted when\nthe package has none.\n"
|
|
3625
|
+
}
|
|
3626
|
+
},
|
|
3627
|
+
"additionalProperties": false
|
|
3628
|
+
},
|
|
2599
3629
|
"VersionList": {
|
|
2600
3630
|
"type": "object",
|
|
2601
3631
|
"required": ["items", "next_cursor"],
|
|
@@ -2925,7 +3955,7 @@ function workflowCatalog() {
|
|
|
2925
3955
|
},
|
|
2926
3956
|
{
|
|
2927
3957
|
name: "auth status",
|
|
2928
|
-
summary: "Show credential source, server, principal
|
|
3958
|
+
summary: "Show credential source, server, principal, token prefix and audience",
|
|
2929
3959
|
group: "auth",
|
|
2930
3960
|
args: [],
|
|
2931
3961
|
flags: [{
|
|
@@ -2941,7 +3971,11 @@ function workflowCatalog() {
|
|
|
2941
3971
|
summary: "Print the access token to stdout and nothing else",
|
|
2942
3972
|
group: "auth",
|
|
2943
3973
|
args: [],
|
|
2944
|
-
flags: [
|
|
3974
|
+
flags: [{
|
|
3975
|
+
name: "audience",
|
|
3976
|
+
type: "string",
|
|
3977
|
+
description: "management prints the stored token; mcp mints a new MCP token that can read and write the catalog content you have access to"
|
|
3978
|
+
}],
|
|
2945
3979
|
destructive: false,
|
|
2946
3980
|
dryRun: false
|
|
2947
3981
|
},
|
|
@@ -3037,10 +4071,9 @@ function workflowCatalog() {
|
|
|
3037
4071
|
description: "Markdown file to attach"
|
|
3038
4072
|
},
|
|
3039
4073
|
{
|
|
3040
|
-
name: "
|
|
4074
|
+
name: "category",
|
|
3041
4075
|
type: "string",
|
|
3042
|
-
|
|
3043
|
-
description: "Capability tag"
|
|
4076
|
+
description: "Category slug in the target namespace (create only)"
|
|
3044
4077
|
},
|
|
3045
4078
|
{
|
|
3046
4079
|
name: "new",
|
|
@@ -3119,10 +4152,9 @@ function workflowCatalog() {
|
|
|
3119
4152
|
description: "Markdown file to attach"
|
|
3120
4153
|
},
|
|
3121
4154
|
{
|
|
3122
|
-
name: "
|
|
4155
|
+
name: "category",
|
|
3123
4156
|
type: "string",
|
|
3124
|
-
|
|
3125
|
-
description: "Capability tag"
|
|
4157
|
+
description: "Category slug in the target namespace (create only)"
|
|
3126
4158
|
},
|
|
3127
4159
|
{
|
|
3128
4160
|
name: "new",
|