@alpic-ai/api 0.0.0-dev.gf883282 → 0.0.0-dev.gf8890bd
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/index.d.mts +1534 -59
- package/dist/index.mjs +591 -194
- package/package.json +24 -8
package/dist/index.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import * as z$1 from "zod/v4";
|
|
3
3
|
import { oc } from "@orpc/contract";
|
|
4
4
|
import ms from "ms";
|
|
5
|
-
//#region ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.
|
|
5
|
+
//#region ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.30.0_supports-color@7.2.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/auth.js
|
|
6
6
|
/**
|
|
7
7
|
* Reusable URL validation that disallows javascript: scheme
|
|
8
8
|
*/
|
|
@@ -169,11 +169,21 @@ z$1.object({
|
|
|
169
169
|
token: z$1.string(),
|
|
170
170
|
token_type_hint: z$1.string().optional()
|
|
171
171
|
}).strip();
|
|
172
|
-
|
|
172
|
+
//#endregion
|
|
173
|
+
//#region ../domains/dist/index.mjs
|
|
174
|
+
const AI_PLATFORMS = ["chatgpt", "claudeai"];
|
|
175
|
+
const platformSchema = z.enum(AI_PLATFORMS);
|
|
173
176
|
const PLATFORM_LABELS = {
|
|
174
177
|
chatgpt: "ChatGPT",
|
|
175
178
|
claudeai: "Claude.ai"
|
|
176
179
|
};
|
|
180
|
+
const WAF_PLATFORMS = [
|
|
181
|
+
"akamai",
|
|
182
|
+
"cloudflare",
|
|
183
|
+
"fastly"
|
|
184
|
+
];
|
|
185
|
+
const ALLOWED_PLATFORMS = [...AI_PLATFORMS, ...WAF_PLATFORMS];
|
|
186
|
+
const allowedPlatformSchema = z.enum(ALLOWED_PLATFORMS);
|
|
177
187
|
const auditStatusSchema = z.enum([
|
|
178
188
|
"pending",
|
|
179
189
|
"partial",
|
|
@@ -246,6 +256,16 @@ z.object({
|
|
|
246
256
|
clientSecret: z.string(),
|
|
247
257
|
clientScopes: z.array(z.string())
|
|
248
258
|
});
|
|
259
|
+
z.enum([
|
|
260
|
+
"opening_balance",
|
|
261
|
+
"free_seed",
|
|
262
|
+
"paid_conversion_floor",
|
|
263
|
+
"top_up",
|
|
264
|
+
"usage",
|
|
265
|
+
"refund",
|
|
266
|
+
"admin_adjustment"
|
|
267
|
+
]);
|
|
268
|
+
z.enum(["playground"]);
|
|
249
269
|
const deploymentStatusSchema$1 = z.enum([
|
|
250
270
|
"ongoing",
|
|
251
271
|
"deployed",
|
|
@@ -273,34 +293,51 @@ const deploymentSummarySchema = z.object({
|
|
|
273
293
|
createdAt: z.coerce.date(),
|
|
274
294
|
updatedAt: z.coerce.date()
|
|
275
295
|
});
|
|
276
|
-
/**
|
|
277
|
-
* Public environment
|
|
278
|
-
*
|
|
279
|
-
* No OAuth metadata exposed.
|
|
280
|
-
*/
|
|
296
|
+
/** Public environment: answers anonymously and exposes no OAuth metadata. */
|
|
281
297
|
const publicEnvironmentSchema = z.object({
|
|
298
|
+
allowsAnonymous: z.literal(true),
|
|
299
|
+
oAuthMetadata: z.strictObject({})
|
|
300
|
+
});
|
|
301
|
+
/** Protected environment whose external resource metadata URL is returned in the WWW-Authenticate header on the first 401; everything after is handled outside the MCP server scope. */
|
|
302
|
+
const externalResourceMetadataEnvironmentSchema = z.object({
|
|
303
|
+
allowsAnonymous: z.boolean(),
|
|
304
|
+
oAuthMetadata: z.object({ externalResourceMetadataUrl: z.url() }),
|
|
305
|
+
scope: z.string().optional()
|
|
306
|
+
});
|
|
307
|
+
/** Protected environment whose own /.well-known/oauth-protected-resource endpoint points at an external authorization server; everything after is handled outside the MCP server scope. */
|
|
308
|
+
const externalAuthorizationServerEnvironmentSchema = z.object({
|
|
309
|
+
allowsAnonymous: z.boolean(),
|
|
310
|
+
oAuthMetadata: z.object({
|
|
311
|
+
externalAuthorizationServerUrl: z.url(),
|
|
312
|
+
resourceMetadata: OAuthProtectedResourceMetadataSchema.optional()
|
|
313
|
+
}),
|
|
314
|
+
scope: z.string().optional()
|
|
315
|
+
});
|
|
316
|
+
/** Standalone protected environment: the server itself exposes both the /.well-known/oauth-protected-resource and /.well-known/oauth-authorization-server endpoints. */
|
|
317
|
+
const standaloneEnvironmentSchema = z.object({
|
|
318
|
+
allowsAnonymous: z.boolean(),
|
|
319
|
+
oAuthMetadata: z.object({
|
|
320
|
+
authorizationServerMetadata: z.union([OAuthMetadataSchema, OpenIdProviderDiscoveryMetadataSchema]),
|
|
321
|
+
resourceMetadata: OAuthProtectedResourceMetadataSchema.optional()
|
|
322
|
+
}),
|
|
323
|
+
scope: z.string().optional()
|
|
324
|
+
});
|
|
325
|
+
/** Protected environment that enforces authentication but advertises no OAuth discovery metadata; clients must obtain credentials out-of-band. */
|
|
326
|
+
const protectedWithoutDiscoveryEnvironmentSchema = z.object({
|
|
327
|
+
allowsAnonymous: z.literal(false),
|
|
328
|
+
oAuthMetadata: z.strictObject({}),
|
|
329
|
+
scope: z.string().optional()
|
|
330
|
+
});
|
|
331
|
+
const legacyPublicEnvironmentSchema = z.object({
|
|
282
332
|
isPublic: z.literal(true),
|
|
283
333
|
oAuthMetadata: z.undefined().optional()
|
|
284
334
|
});
|
|
285
|
-
|
|
286
|
-
* Protected environment with an external resource metadata URL
|
|
287
|
-
*
|
|
288
|
-
* An external resource metadata URL is returned in the WWW-Authenticate header during the first 401 response.
|
|
289
|
-
* Everything that follows is handled outside of the MCP server scope.
|
|
290
|
-
*/
|
|
291
|
-
const externalResourceMetadataEnvironmentSchema = z.object({
|
|
335
|
+
const legacyExternalResourceMetadataEnvironmentSchema = z.object({
|
|
292
336
|
isPublic: z.literal(false),
|
|
293
337
|
oAuthMetadata: z.object({ externalResourceMetadataUrl: z.url() }),
|
|
294
338
|
scope: z.string().optional()
|
|
295
339
|
});
|
|
296
|
-
|
|
297
|
-
* Protected environment with an external authorization server URL
|
|
298
|
-
*
|
|
299
|
-
* The server itself exposes the /.well-known/oauth-protected-resource endpoint.
|
|
300
|
-
* An external authorization server URL is returned when requesting the endpoint.
|
|
301
|
-
* Everything that follows is handled outside of the MCP server scope.
|
|
302
|
-
*/
|
|
303
|
-
const externalAuthorizationServerEnvironmentSchema = z.object({
|
|
340
|
+
const legacyExternalAuthorizationServerEnvironmentSchema = z.object({
|
|
304
341
|
isPublic: z.literal(false),
|
|
305
342
|
oAuthMetadata: z.object({
|
|
306
343
|
externalAuthorizationServerUrl: z.url(),
|
|
@@ -308,13 +345,7 @@ const externalAuthorizationServerEnvironmentSchema = z.object({
|
|
|
308
345
|
}),
|
|
309
346
|
scope: z.string().optional()
|
|
310
347
|
});
|
|
311
|
-
|
|
312
|
-
* Standalone protected environment
|
|
313
|
-
*
|
|
314
|
-
* The server itself exposes the /.well-known/oauth-protected-resource endpoint.
|
|
315
|
-
* The server itself exposes the /.well-known/oauth-authorization-server endpoint.
|
|
316
|
-
*/
|
|
317
|
-
const standaloneEnvironmentSchema = z.object({
|
|
348
|
+
const legacyStandaloneEnvironmentSchema = z.object({
|
|
318
349
|
isPublic: z.literal(false),
|
|
319
350
|
oAuthMetadata: z.object({
|
|
320
351
|
authorizationServerMetadata: z.union([OAuthMetadataSchema, OpenIdProviderDiscoveryMetadataSchema]),
|
|
@@ -322,14 +353,7 @@ const standaloneEnvironmentSchema = z.object({
|
|
|
322
353
|
}),
|
|
323
354
|
scope: z.string().optional()
|
|
324
355
|
});
|
|
325
|
-
|
|
326
|
-
* Protected environment without OAuth discovery
|
|
327
|
-
*
|
|
328
|
-
* The server enforces authentication but exposes no OAuth discovery metadata.
|
|
329
|
-
* Neither /.well-known/oauth-protected-resource nor /.well-known/oauth-authorization-server
|
|
330
|
-
* are advertised. Clients must obtain credentials out-of-band.
|
|
331
|
-
*/
|
|
332
|
-
const protectedWithoutDiscoveryEnvironmentSchema = z.object({
|
|
356
|
+
const legacyProtectedWithoutDiscoveryEnvironmentSchema = z.object({
|
|
333
357
|
isPublic: z.literal(false),
|
|
334
358
|
oAuthMetadata: z.strictObject({}),
|
|
335
359
|
scope: z.string().optional()
|
|
@@ -339,9 +363,13 @@ z.union([
|
|
|
339
363
|
externalResourceMetadataEnvironmentSchema,
|
|
340
364
|
externalAuthorizationServerEnvironmentSchema,
|
|
341
365
|
standaloneEnvironmentSchema,
|
|
342
|
-
protectedWithoutDiscoveryEnvironmentSchema
|
|
366
|
+
protectedWithoutDiscoveryEnvironmentSchema,
|
|
367
|
+
legacyPublicEnvironmentSchema,
|
|
368
|
+
legacyExternalResourceMetadataEnvironmentSchema,
|
|
369
|
+
legacyExternalAuthorizationServerEnvironmentSchema,
|
|
370
|
+
legacyStandaloneEnvironmentSchema,
|
|
371
|
+
legacyProtectedWithoutDiscoveryEnvironmentSchema
|
|
343
372
|
]);
|
|
344
|
-
const allowedPlatformSchema = platformSchema;
|
|
345
373
|
const playgroundModelSchema = z.enum([
|
|
346
374
|
"global.anthropic.claude-haiku-4-5-20251001-v1:0",
|
|
347
375
|
"global.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
|
@@ -381,14 +409,16 @@ z.object({
|
|
|
381
409
|
collectRequestPayload: z.boolean(),
|
|
382
410
|
collectResponsePayload: z.boolean(),
|
|
383
411
|
collectErrorMessage: z.boolean(),
|
|
384
|
-
collectUserData: z.boolean()
|
|
412
|
+
collectUserData: z.boolean(),
|
|
413
|
+
identityTraitKey: z.string().min(1).max(200).nullable()
|
|
385
414
|
});
|
|
386
|
-
z.object({
|
|
415
|
+
const feedbackSchema = z.object({
|
|
387
416
|
id: z.string(),
|
|
388
417
|
createdAt: z.coerce.date(),
|
|
389
418
|
environmentId: z.string(),
|
|
390
419
|
content: z.string(),
|
|
391
|
-
source: z.enum(["model", "user"])
|
|
420
|
+
source: z.enum(["model", "user"]),
|
|
421
|
+
clientName: z.string().nullable()
|
|
392
422
|
});
|
|
393
423
|
z.object({
|
|
394
424
|
content: z.string(),
|
|
@@ -404,7 +434,7 @@ const intentCategoryColorSchema = z.enum([
|
|
|
404
434
|
"pink",
|
|
405
435
|
"gray"
|
|
406
436
|
]);
|
|
407
|
-
intentCategoryColorSchema.options;
|
|
437
|
+
const INTENT_CATEGORY_COLORS = intentCategoryColorSchema.options;
|
|
408
438
|
const intentCategorySchema = z.object({
|
|
409
439
|
id: z.string(),
|
|
410
440
|
createdAt: z.coerce.date(),
|
|
@@ -412,7 +442,7 @@ const intentCategorySchema = z.object({
|
|
|
412
442
|
name: z.string(),
|
|
413
443
|
color: intentCategoryColorSchema
|
|
414
444
|
});
|
|
415
|
-
z.object({
|
|
445
|
+
const intentCategorySummarySchema = z.object({
|
|
416
446
|
id: z.string(),
|
|
417
447
|
name: z.string(),
|
|
418
448
|
color: intentCategoryColorSchema,
|
|
@@ -424,6 +454,7 @@ z.object({
|
|
|
424
454
|
environmentId: z.string(),
|
|
425
455
|
toolName: z.string(),
|
|
426
456
|
message: z.string(),
|
|
457
|
+
clientName: z.string().nullable(),
|
|
427
458
|
categories: z.array(intentCategorySchema)
|
|
428
459
|
});
|
|
429
460
|
const signalCategorySchema = z.object({
|
|
@@ -488,6 +519,246 @@ z.enum([
|
|
|
488
519
|
"DEBUG",
|
|
489
520
|
"ERROR"
|
|
490
521
|
]);
|
|
522
|
+
/** Only names a vendor actually ships belong here: lookalikes like `claude-code-test` are customers' own scripts. */
|
|
523
|
+
const MCP_CLIENT_GROUPS = [
|
|
524
|
+
{
|
|
525
|
+
id: "claude_code",
|
|
526
|
+
label: "Claude Code",
|
|
527
|
+
vendor: "anthropic",
|
|
528
|
+
rawNames: ["claude-code", "Anthropic/ClaudeCodeDesktop"]
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
id: "claude",
|
|
532
|
+
label: "Claude",
|
|
533
|
+
vendor: "anthropic",
|
|
534
|
+
rawNames: [
|
|
535
|
+
"Anthropic/ClaudeAI",
|
|
536
|
+
"claude-ai",
|
|
537
|
+
"claude",
|
|
538
|
+
"Claude",
|
|
539
|
+
"claude-desktop",
|
|
540
|
+
"claude-desktop-3p"
|
|
541
|
+
]
|
|
542
|
+
},
|
|
543
|
+
{
|
|
544
|
+
id: "claude_mobile",
|
|
545
|
+
label: "Claude mobile",
|
|
546
|
+
vendor: "anthropic",
|
|
547
|
+
rawNames: ["claude-ios", "ClaudeAndroid"]
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
id: "claude_cowork",
|
|
551
|
+
label: "Claude Cowork",
|
|
552
|
+
vendor: "anthropic",
|
|
553
|
+
rawNames: ["Anthropic/Cowork"]
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
id: "claude_toolbox",
|
|
557
|
+
label: "Claude Toolbox",
|
|
558
|
+
vendor: "anthropic",
|
|
559
|
+
rawNames: ["Anthropic/Toolbox", "Anthropic/toolbox-bootstrap"]
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
id: "anthropic_api",
|
|
563
|
+
label: "Anthropic API",
|
|
564
|
+
vendor: "anthropic",
|
|
565
|
+
rawNames: ["Anthropic/API"]
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
id: "anthropic_connector_refresh",
|
|
569
|
+
label: "Anthropic (connector refresh)",
|
|
570
|
+
vendor: "anthropic",
|
|
571
|
+
rawNames: ["Anthropic"]
|
|
572
|
+
},
|
|
573
|
+
{
|
|
574
|
+
id: "codex",
|
|
575
|
+
label: "Codex",
|
|
576
|
+
vendor: "openai",
|
|
577
|
+
rawNames: [
|
|
578
|
+
"codex-mcp-client",
|
|
579
|
+
"codex",
|
|
580
|
+
"Codex",
|
|
581
|
+
"codex-cli",
|
|
582
|
+
"openai-mcp (Codex)"
|
|
583
|
+
]
|
|
584
|
+
},
|
|
585
|
+
{
|
|
586
|
+
id: "chatgpt",
|
|
587
|
+
label: "ChatGPT",
|
|
588
|
+
vendor: "openai",
|
|
589
|
+
rawNames: ["openai-mcp (ChatGPT)"]
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
id: "openai_responses_api",
|
|
593
|
+
label: "OpenAI Responses API",
|
|
594
|
+
vendor: "openai",
|
|
595
|
+
rawNames: ["openai-mcp (Responses API)"]
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
id: "openai_agent_builder",
|
|
599
|
+
label: "OpenAI Agent Builder",
|
|
600
|
+
vendor: "openai",
|
|
601
|
+
rawNames: ["openai-mcp (Agent Builder)"]
|
|
602
|
+
},
|
|
603
|
+
{
|
|
604
|
+
id: "openai_other",
|
|
605
|
+
label: "OpenAI Other",
|
|
606
|
+
vendor: "openai",
|
|
607
|
+
rawNames: ["openai-mcp"]
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
id: "cursor",
|
|
611
|
+
label: "Cursor",
|
|
612
|
+
vendor: "cursor",
|
|
613
|
+
rawNames: [
|
|
614
|
+
"cursor-vscode",
|
|
615
|
+
"Cursor",
|
|
616
|
+
"cursor"
|
|
617
|
+
]
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
id: "cline",
|
|
621
|
+
label: "Cline",
|
|
622
|
+
vendor: "cline",
|
|
623
|
+
rawNames: [
|
|
624
|
+
"Cline",
|
|
625
|
+
"cline",
|
|
626
|
+
"@cline/core"
|
|
627
|
+
]
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
id: "github_copilot",
|
|
631
|
+
label: "GitHub Copilot",
|
|
632
|
+
vendor: "githubCopilot",
|
|
633
|
+
rawNames: [
|
|
634
|
+
"Copilot",
|
|
635
|
+
"github-copilot-developer",
|
|
636
|
+
"Copilot MCP Gateway",
|
|
637
|
+
"Xcode/copilot-xcode"
|
|
638
|
+
]
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
id: "gemini_cli",
|
|
642
|
+
label: "Gemini CLI",
|
|
643
|
+
vendor: "google",
|
|
644
|
+
rawNames: ["gemini-cli-mcp-client", "gemini-cli"]
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
id: "antigravity",
|
|
648
|
+
label: "Antigravity",
|
|
649
|
+
vendor: "google",
|
|
650
|
+
rawNames: ["antigravity-client"]
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
id: "gemini",
|
|
654
|
+
label: "Gemini",
|
|
655
|
+
vendor: "google",
|
|
656
|
+
rawNames: ["Gemini", "google-ai-edge-gallery"]
|
|
657
|
+
},
|
|
658
|
+
{
|
|
659
|
+
id: "windsurf",
|
|
660
|
+
label: "Windsurf",
|
|
661
|
+
vendor: "windsurf",
|
|
662
|
+
rawNames: ["Windsurf", "windsurf-client"]
|
|
663
|
+
},
|
|
664
|
+
{
|
|
665
|
+
id: "mistral",
|
|
666
|
+
label: "Mistral / Le Chat",
|
|
667
|
+
vendor: "mistral",
|
|
668
|
+
rawNames: ["Mistral"],
|
|
669
|
+
rawNamePrefixes: ["connector:custom-mcp:"]
|
|
670
|
+
},
|
|
671
|
+
{
|
|
672
|
+
id: "n8n",
|
|
673
|
+
label: "n8n",
|
|
674
|
+
vendor: "n8n",
|
|
675
|
+
rawNames: [
|
|
676
|
+
"@n8n/n8n-nodes-langchain.mcpClient",
|
|
677
|
+
"@n8n/n8n-nodes-langchain.mcpClientTool",
|
|
678
|
+
"n8n"
|
|
679
|
+
]
|
|
680
|
+
},
|
|
681
|
+
{
|
|
682
|
+
id: "alpic_playground",
|
|
683
|
+
label: "Alpic Playground",
|
|
684
|
+
vendor: "alpic",
|
|
685
|
+
rawNames: ["alpic-playground", "playground"]
|
|
686
|
+
},
|
|
687
|
+
{
|
|
688
|
+
id: "opencode",
|
|
689
|
+
label: "opencode",
|
|
690
|
+
vendor: "opencode",
|
|
691
|
+
rawNames: ["opencode"]
|
|
692
|
+
},
|
|
693
|
+
{
|
|
694
|
+
id: "zed",
|
|
695
|
+
label: "Zed",
|
|
696
|
+
vendor: "zed",
|
|
697
|
+
rawNames: ["Zed", "zed"]
|
|
698
|
+
},
|
|
699
|
+
{
|
|
700
|
+
id: "zapier",
|
|
701
|
+
label: "Zapier",
|
|
702
|
+
vendor: "zapier",
|
|
703
|
+
rawNames: ["Zapier", "zapier"]
|
|
704
|
+
},
|
|
705
|
+
{
|
|
706
|
+
id: "make",
|
|
707
|
+
label: "Make",
|
|
708
|
+
vendor: "make",
|
|
709
|
+
rawNames: ["Make", "make"]
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
id: "librechat",
|
|
713
|
+
label: "LibreChat",
|
|
714
|
+
vendor: "mcp",
|
|
715
|
+
rawNames: ["LibreChat", "librechat"]
|
|
716
|
+
},
|
|
717
|
+
{
|
|
718
|
+
id: "jan",
|
|
719
|
+
label: "Jan",
|
|
720
|
+
vendor: "mcp",
|
|
721
|
+
rawNames: ["Jan", "jan"]
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
id: "goose",
|
|
725
|
+
label: "goose",
|
|
726
|
+
vendor: "mcp",
|
|
727
|
+
rawNames: ["goose", "Goose"]
|
|
728
|
+
},
|
|
729
|
+
{
|
|
730
|
+
id: "mcphost",
|
|
731
|
+
label: "mcphost",
|
|
732
|
+
vendor: "mcp",
|
|
733
|
+
rawNames: ["mcphost"]
|
|
734
|
+
},
|
|
735
|
+
{
|
|
736
|
+
id: "mcporter",
|
|
737
|
+
label: "mcporter",
|
|
738
|
+
vendor: "mcp",
|
|
739
|
+
rawNames: ["mcporter"]
|
|
740
|
+
},
|
|
741
|
+
{
|
|
742
|
+
id: "rmcp",
|
|
743
|
+
label: "rmcp",
|
|
744
|
+
vendor: "mcp",
|
|
745
|
+
rawNames: ["rmcp"]
|
|
746
|
+
},
|
|
747
|
+
{
|
|
748
|
+
id: "unnamed_client",
|
|
749
|
+
label: "Unnamed client",
|
|
750
|
+
vendor: "mcp",
|
|
751
|
+
rawNames: [
|
|
752
|
+
"mcp",
|
|
753
|
+
"unknown",
|
|
754
|
+
""
|
|
755
|
+
]
|
|
756
|
+
}
|
|
757
|
+
];
|
|
758
|
+
/** A source pattern, not a RegExp, because analytics renders the same rule into ClickHouse RE2, which shares this syntax. */
|
|
759
|
+
const MCP_REMOTE_WRAPPER_SUFFIX = String.raw` \(via mcp-remote [^\n]+?\)$`;
|
|
760
|
+
new RegExp(MCP_REMOTE_WRAPPER_SUFFIX);
|
|
761
|
+
new Map(MCP_CLIENT_GROUPS.map((group) => [group.id, group]));
|
|
491
762
|
const runtimeSchema = z.enum([
|
|
492
763
|
"python3.13",
|
|
493
764
|
"python3.14",
|
|
@@ -522,6 +793,10 @@ const domainFailureReasonSchema = z.enum([
|
|
|
522
793
|
"invalid_domain",
|
|
523
794
|
"other"
|
|
524
795
|
]);
|
|
796
|
+
const projectDomainMappingSchema = z.object({
|
|
797
|
+
pathPrefix: z.string(),
|
|
798
|
+
environment: environmentSchema$1
|
|
799
|
+
});
|
|
525
800
|
z.object({
|
|
526
801
|
name: z.string(),
|
|
527
802
|
createdAt: z.coerce.date(),
|
|
@@ -531,7 +806,8 @@ z.object({
|
|
|
531
806
|
"failed"
|
|
532
807
|
]),
|
|
533
808
|
failureReason: domainFailureReasonSchema.nullable(),
|
|
534
|
-
environment: environmentSchema$1
|
|
809
|
+
environment: environmentSchema$1,
|
|
810
|
+
mappings: z.array(projectDomainMappingSchema)
|
|
535
811
|
});
|
|
536
812
|
const serverFieldsSchema$1 = z.object({
|
|
537
813
|
$schema: z.string(),
|
|
@@ -560,15 +836,7 @@ z.object({
|
|
|
560
836
|
serverFields: serverFieldsSchema$1,
|
|
561
837
|
source: z.enum(["registry", "defaults"])
|
|
562
838
|
});
|
|
563
|
-
/**
|
|
564
|
-
* Returns a variant of a `maxLength`-constrained string that clamps (truncates) instead of
|
|
565
|
-
* rejecting on overflow — used for AI-generated copy where the model routinely overshoots.
|
|
566
|
-
*
|
|
567
|
-
* NOTE: this rebuilds the schema from scratch, carrying over only `maxLength` (as a clamp),
|
|
568
|
-
* `minLength`, and the description. Any other validators on the source field (`.regex()`,
|
|
569
|
-
* `.email()`, custom refinements) are intentionally dropped — this helper is meant for plain
|
|
570
|
-
* free-text length caps only. A field with `null` `maxLength` is returned unchanged.
|
|
571
|
-
*/
|
|
839
|
+
/** Clamps instead of rejecting on max-length overflow (for AI-generated copy that overshoots); intentionally carries over only maxLength, minLength, and description, dropping any other validators. */
|
|
572
840
|
const clampStringField = (field) => {
|
|
573
841
|
const max = field.maxLength;
|
|
574
842
|
if (max === null) return field;
|
|
@@ -595,8 +863,9 @@ const positiveTestCaseSchema = z.object({
|
|
|
595
863
|
}).partial().describe("Each case: Scenario, User prompt, Tool triggered, Expected output.");
|
|
596
864
|
const screenshotEntrySchema = z.object({
|
|
597
865
|
prompt: z.string(),
|
|
598
|
-
url: z.url()
|
|
866
|
+
url: z.url()
|
|
599
867
|
}).describe("Each screenshot: the user prompt that produced it + the image URL.");
|
|
868
|
+
const screenshotDraftEntrySchema = screenshotEntrySchema.extend({ url: z.string() });
|
|
600
869
|
/** Accepts either a valid email or URL. */
|
|
601
870
|
const supportChannelSchema = z.string().refine((value) => z.email().safeParse(value).success || z.url().safeParse(value).success, { error: "Must be a valid email or URL" });
|
|
602
871
|
/** A URL field whose error spells out that the scheme is required. */
|
|
@@ -913,11 +1182,7 @@ const chatgptToolJustificationSchema = z.object({
|
|
|
913
1182
|
openWorldJustification: z.string().describe("One sentence on whether the tool reaches external systems beyond your own service."),
|
|
914
1183
|
destructiveJustification: z.string().describe("One sentence on whether the tool changes data. For a read-only tool, state the full triad: \"No data is created, modified, or deleted.\"")
|
|
915
1184
|
}).describe("Per-tool justification of each MCP annotation value (one specific sentence per hint).");
|
|
916
|
-
/**
|
|
917
|
-
* Base copy fields, defined once and reused by both the submission form and per-locale
|
|
918
|
-
* translations so the constraints (tagline ≤ 30 chars) never drift. The translation generation
|
|
919
|
-
* path wraps these in {@link clampStringField} since the LLM tends to overshoot the limit.
|
|
920
|
-
*/
|
|
1185
|
+
/** Defined once and reused by both the submission form and per-locale translations so the tagline ≤ 30 chars constraint never drifts. */
|
|
921
1186
|
const chatgptTaglineSchema = z.string().max(30);
|
|
922
1187
|
const chatgptDescriptionSchema = z.string();
|
|
923
1188
|
const chatgptTranslationSchema = z.object({
|
|
@@ -926,10 +1191,7 @@ const chatgptTranslationSchema = z.object({
|
|
|
926
1191
|
description: chatgptDescriptionSchema
|
|
927
1192
|
}).describe("Locale-scoped override for tagline + description. English (US) is the default.");
|
|
928
1193
|
chatgptTranslationSchema.extend({ tagline: clampStringField(chatgptTaglineSchema) });
|
|
929
|
-
/**
|
|
930
|
-
* Field order mirrors the ChatGPT (OpenAI) submission spreadsheet, grouped by section.
|
|
931
|
-
* When adding/removing/reordering fields, keep this in sync with the sheet.
|
|
932
|
-
*/
|
|
1194
|
+
/** Field order mirrors the ChatGPT (OpenAI) submission spreadsheet, grouped by section; keep it in sync with the sheet. */
|
|
933
1195
|
const chatgptSubmissionFormDataSchema = z.object({
|
|
934
1196
|
logoLight: z.string().describe("Logo icon for light mode. Square PNG, no borders or rounded corners (clients apply circular cropping)."),
|
|
935
1197
|
logoDark: z.string().optional().describe("Optional dark-mode logo icon. Square PNG, same specs as the light icon. Leave empty if the light icon also works on dark backgrounds."),
|
|
@@ -955,6 +1217,17 @@ const chatgptSubmissionFormDataSchema = z.object({
|
|
|
955
1217
|
allowedCountries: chatgptAllowedCountriesSchema.describe("Availability: all supported countries, or an allow-list / block-list of specific ones (ISO alpha-2)."),
|
|
956
1218
|
releaseNotes: z.string().describe("Publicly displayed on the app details page.")
|
|
957
1219
|
});
|
|
1220
|
+
const chatgptSubmissionDraftSchema = chatgptSubmissionFormDataSchema.partial().extend({
|
|
1221
|
+
tagline: z.string().optional(),
|
|
1222
|
+
companyUrl: z.string().optional(),
|
|
1223
|
+
supportChannel: z.string().optional(),
|
|
1224
|
+
privacyPolicyUrl: z.string().optional(),
|
|
1225
|
+
termsOfServiceUrl: z.string().optional(),
|
|
1226
|
+
demoRecordingUrl: z.string().optional(),
|
|
1227
|
+
serverUrl: z.string().optional(),
|
|
1228
|
+
screenshots: z.array(screenshotDraftEntrySchema).optional(),
|
|
1229
|
+
translations: z.array(chatgptTranslationSchema.extend({ tagline: z.string() })).optional()
|
|
1230
|
+
});
|
|
958
1231
|
chatgptSubmissionFormDataSchema.pick({
|
|
959
1232
|
appName: true,
|
|
960
1233
|
developerName: true,
|
|
@@ -1015,11 +1288,7 @@ const claudePolicyAcknowledgementSchema = z.enum([
|
|
|
1015
1288
|
"My connector does not collect conversation data beyond what is needed for its function.",
|
|
1016
1289
|
"Public documentation for this connector will be live by the publish date."
|
|
1017
1290
|
]);
|
|
1018
|
-
/**
|
|
1019
|
-
* Field order mirrors the claude.ai directory submission wizard
|
|
1020
|
-
* (`claude.ai/admin-settings/directory/submissions/new`), grouped by step.
|
|
1021
|
-
* When adding/removing/reordering fields, keep this in sync with the wizard.
|
|
1022
|
-
*/
|
|
1291
|
+
/** Field order mirrors the claude.ai directory submission wizard (`claude.ai/admin-settings/directory/submissions/new`), grouped by step; keep it in sync with the wizard. */
|
|
1023
1292
|
const claudeSubmissionFormDataSchema = z.object({
|
|
1024
1293
|
serverUrl: z.url().describe(`The full https:// URL where your MCP server is hosted and reachable. In the claude.ai wizard this is read live
|
|
1025
1294
|
from the custom connector you select — the connection is used to verify the URL and the tool list at submission time.
|
|
@@ -1081,6 +1350,21 @@ fully populated account.`),
|
|
|
1081
1350
|
submission. Each is an attestation you are legally agreeing to by submitting.`),
|
|
1082
1351
|
additionalNotes: z.string().optional().describe("Anything else the review team should know about your connector. Optional.")
|
|
1083
1352
|
});
|
|
1353
|
+
const claudeSubmissionDraftSchema = claudeSubmissionFormDataSchema.partial().extend({
|
|
1354
|
+
serverUrl: z.string().optional(),
|
|
1355
|
+
name: z.string().optional(),
|
|
1356
|
+
slug: z.string().optional(),
|
|
1357
|
+
oneLiner: z.string().optional(),
|
|
1358
|
+
description: z.string().optional(),
|
|
1359
|
+
iconUrl: z.string().optional(),
|
|
1360
|
+
documentation: z.string().optional(),
|
|
1361
|
+
support: z.string().optional(),
|
|
1362
|
+
privacyPolicy: z.string().optional(),
|
|
1363
|
+
companyWebsite: z.string().optional(),
|
|
1364
|
+
primaryContactEmail: z.string().optional(),
|
|
1365
|
+
categories: z.array(claudeCategorySchema).optional(),
|
|
1366
|
+
screenshots: z.array(screenshotDraftEntrySchema).optional()
|
|
1367
|
+
});
|
|
1084
1368
|
claudeSubmissionFormDataSchema.pick({
|
|
1085
1369
|
serverUrl: true,
|
|
1086
1370
|
name: true,
|
|
@@ -1096,12 +1380,7 @@ claudeSubmissionFormDataSchema.pick({
|
|
|
1096
1380
|
connectionRequirements: claudeSubmissionFormDataSchema.shape.connectionRequirements.optional(),
|
|
1097
1381
|
testInstructions: claudeSubmissionFormDataSchema.shape.testInstructions.optional()
|
|
1098
1382
|
});
|
|
1099
|
-
/**
|
|
1100
|
-
* Narrative fields the LLM-backed generation step produces for Claude submissions.
|
|
1101
|
-
* This schema accepts the slightly loose shape returned by AI generation, then normalizes it into
|
|
1102
|
-
* the strict form shape. Keep transforms here rather than in callers so generation leniency is
|
|
1103
|
-
* colocated with the Claude contract.
|
|
1104
|
-
*/
|
|
1383
|
+
/** Loose shape returned by AI generation for Claude narrative fields; transforms live here so generation leniency stays colocated with the Claude contract. */
|
|
1105
1384
|
const claudeAiGeneratedFormDataRawSchema = z.object({
|
|
1106
1385
|
oneLiner: claudeSubmissionFormDataSchema.shape.oneLiner,
|
|
1107
1386
|
description: claudeSubmissionFormDataSchema.shape.description,
|
|
@@ -1121,14 +1400,19 @@ const submissionMetaFieldsSchema = z.object({
|
|
|
1121
1400
|
});
|
|
1122
1401
|
const claudeSubmissionSchemaInternal = submissionMetaFieldsSchema.extend({
|
|
1123
1402
|
platform: z.literal("claudeai"),
|
|
1124
|
-
formData:
|
|
1403
|
+
formData: claudeSubmissionDraftSchema
|
|
1125
1404
|
});
|
|
1126
1405
|
const chatgptSubmissionSchemaInternal = submissionMetaFieldsSchema.extend({
|
|
1127
1406
|
platform: z.literal("chatgpt"),
|
|
1128
|
-
formData:
|
|
1407
|
+
formData: chatgptSubmissionDraftSchema
|
|
1129
1408
|
});
|
|
1130
1409
|
z.discriminatedUnion("platform", [claudeSubmissionSchemaInternal, chatgptSubmissionSchemaInternal]);
|
|
1131
|
-
z.union([
|
|
1410
|
+
z.union([claudeSubmissionDraftSchema, chatgptSubmissionDraftSchema]);
|
|
1411
|
+
z.literal([
|
|
1412
|
+
100,
|
|
1413
|
+
75,
|
|
1414
|
+
50
|
|
1415
|
+
]);
|
|
1132
1416
|
const subscriptionPlanSchema = z.enum([
|
|
1133
1417
|
"pro",
|
|
1134
1418
|
"business",
|
|
@@ -1146,6 +1430,7 @@ const customerUsageSchema = z.object({
|
|
|
1146
1430
|
periodEnd: z.number()
|
|
1147
1431
|
});
|
|
1148
1432
|
const partnerDiscountSchema = z.object({ endsAt: z.number() });
|
|
1433
|
+
z.object({ balanceInNanoUSD: z.number() });
|
|
1149
1434
|
z.object({
|
|
1150
1435
|
customerCredits: customerCreditsSchema.nullable(),
|
|
1151
1436
|
customerUsage: customerUsageSchema.nullable(),
|
|
@@ -1193,7 +1478,10 @@ const RESERVED_KEYS = [
|
|
|
1193
1478
|
"BUILD_ARG_START_COMMAND",
|
|
1194
1479
|
"ALPIC_HOST",
|
|
1195
1480
|
"ALPIC_CUSTOM_DOMAINS",
|
|
1196
|
-
"ALPIC_INTENT_META_KEY"
|
|
1481
|
+
"ALPIC_INTENT_META_KEY",
|
|
1482
|
+
"ALPIC_FEEDBACK_META_KEY",
|
|
1483
|
+
"ALPIC_EVENTS_META_KEY",
|
|
1484
|
+
"ALPIC_IDENTIFY_META_KEY"
|
|
1197
1485
|
];
|
|
1198
1486
|
const environmentVariableSchema = z.object({
|
|
1199
1487
|
key: z.string().min(2, "Key must be at least 2 characters").regex(/^[a-zA-Z]([a-zA-Z0-9_])+$/, "Key must start with a letter and contain only letters, numbers, and underscores").refine((key) => !RESERVED_KEYS.includes(key), "This key is reserved and cannot be used as an environment variable key"),
|
|
@@ -1274,21 +1562,20 @@ const deploymentSchema = z.object({
|
|
|
1274
1562
|
isCurrent: z.boolean(),
|
|
1275
1563
|
deploymentPageUrl: z.url().nullable()
|
|
1276
1564
|
});
|
|
1277
|
-
const
|
|
1565
|
+
const isValidTimeInput = (value) => {
|
|
1278
1566
|
if (ms(value) !== void 0) return true;
|
|
1279
1567
|
return !Number.isNaN(new Date(value).getTime());
|
|
1280
1568
|
};
|
|
1281
|
-
const
|
|
1569
|
+
const timeInputSchema = z.string().refine(isValidTimeInput, { message: "Invalid time. Use relative (1h, 30m, 2d) or ISO 8601 format." });
|
|
1570
|
+
const base = oc.errors({ BAD_REQUEST: {} });
|
|
1571
|
+
const createEnvironmentContractV1 = base.route({
|
|
1282
1572
|
path: "/v1/environments",
|
|
1283
1573
|
method: "POST",
|
|
1284
1574
|
summary: "Create an environment",
|
|
1285
1575
|
description: "Create an environment for a project",
|
|
1286
1576
|
tags: ["environments"],
|
|
1287
1577
|
successDescription: "The environment has been created successfully"
|
|
1288
|
-
}).errors({
|
|
1289
|
-
NOT_FOUND: {},
|
|
1290
|
-
BAD_REQUEST: {}
|
|
1291
|
-
}).input(z.object({
|
|
1578
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1292
1579
|
projectId: z.string().describe("The ID of the project to create the environment for"),
|
|
1293
1580
|
name: z.string().min(1).describe("The name of the environment"),
|
|
1294
1581
|
sourceBranch: z.string().min(1).describe("The branch used to build the environment"),
|
|
@@ -1301,7 +1588,7 @@ const createEnvironmentContractV1 = oc.route({
|
|
|
1301
1588
|
createdAt: z.coerce.date(),
|
|
1302
1589
|
projectId: z.string().describe("The ID of the project the environment belongs to")
|
|
1303
1590
|
}));
|
|
1304
|
-
const getEnvironmentContractV1 =
|
|
1591
|
+
const getEnvironmentContractV1 = base.route({
|
|
1305
1592
|
path: "/v1/environments/{environmentId}",
|
|
1306
1593
|
method: "GET",
|
|
1307
1594
|
summary: "Get an environment",
|
|
@@ -1358,7 +1645,7 @@ const projectOutputSchema = z.object({
|
|
|
1358
1645
|
productionEnvironment: productionEnvironmentSchema.nullable(),
|
|
1359
1646
|
environments: z.array(environmentSchema)
|
|
1360
1647
|
});
|
|
1361
|
-
const getProjectContractV1 =
|
|
1648
|
+
const getProjectContractV1 = base.route({
|
|
1362
1649
|
path: "/v1/projects/{projectId}",
|
|
1363
1650
|
method: "GET",
|
|
1364
1651
|
summary: "Get a project",
|
|
@@ -1366,18 +1653,15 @@ const getProjectContractV1 = oc.route({
|
|
|
1366
1653
|
tags: ["projects"],
|
|
1367
1654
|
successDescription: "The project details"
|
|
1368
1655
|
}).errors({ NOT_FOUND: {} }).input(z.object({ projectId: z.string().describe("The ID of the project") })).output(projectOutputSchema);
|
|
1369
|
-
const listProjectsContractV1 =
|
|
1656
|
+
const listProjectsContractV1 = base.route({
|
|
1370
1657
|
path: "/v1/projects",
|
|
1371
1658
|
method: "GET",
|
|
1372
1659
|
summary: "List projects",
|
|
1373
1660
|
description: "List all projects for a team",
|
|
1374
1661
|
tags: ["projects"],
|
|
1375
1662
|
successDescription: "The list of projects"
|
|
1376
|
-
}).errors({
|
|
1377
|
-
|
|
1378
|
-
BAD_REQUEST: {}
|
|
1379
|
-
}).input(z.object({ teamId: z.string().optional() }).optional()).output(z.array(projectOutputSchema));
|
|
1380
|
-
const createProjectContractV1 = oc.route({
|
|
1663
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({ teamId: z.string().optional() }).optional()).output(z.array(projectOutputSchema));
|
|
1664
|
+
const createProjectContractV1 = base.route({
|
|
1381
1665
|
path: "/v1/projects",
|
|
1382
1666
|
method: "POST",
|
|
1383
1667
|
summary: "Create a project",
|
|
@@ -1386,7 +1670,6 @@ const createProjectContractV1 = oc.route({
|
|
|
1386
1670
|
successDescription: "The project has been created successfully"
|
|
1387
1671
|
}).errors({
|
|
1388
1672
|
NOT_FOUND: {},
|
|
1389
|
-
BAD_REQUEST: {},
|
|
1390
1673
|
FORBIDDEN: {}
|
|
1391
1674
|
}).input(z.object({
|
|
1392
1675
|
teamId: z.string().optional(),
|
|
@@ -1427,7 +1710,7 @@ const environmentVariableOutputSchema = z.object({
|
|
|
1427
1710
|
isSecret: z.boolean(),
|
|
1428
1711
|
createdAt: z.coerce.date()
|
|
1429
1712
|
});
|
|
1430
|
-
const listEnvironmentVariablesContractV1 =
|
|
1713
|
+
const listEnvironmentVariablesContractV1 = base.route({
|
|
1431
1714
|
path: "/v1/environments/{environmentId}/environment-variables",
|
|
1432
1715
|
method: "GET",
|
|
1433
1716
|
summary: "List environment variables",
|
|
@@ -1435,48 +1718,39 @@ const listEnvironmentVariablesContractV1 = oc.route({
|
|
|
1435
1718
|
tags: ["environments"],
|
|
1436
1719
|
successDescription: "The list of environment variables"
|
|
1437
1720
|
}).errors({ NOT_FOUND: {} }).input(z.object({ environmentId: z.string().describe("The ID of the environment") })).output(z.array(environmentVariableOutputSchema));
|
|
1438
|
-
const createEnvironmentVariablesContractV1 =
|
|
1721
|
+
const createEnvironmentVariablesContractV1 = base.route({
|
|
1439
1722
|
path: "/v1/environments/{environmentId}/environment-variables",
|
|
1440
1723
|
method: "POST",
|
|
1441
1724
|
summary: "Add environment variables",
|
|
1442
1725
|
description: "Add one or more environment variables to an environment",
|
|
1443
1726
|
tags: ["environments"],
|
|
1444
1727
|
successDescription: "The environment variables have been added successfully"
|
|
1445
|
-
}).errors({
|
|
1446
|
-
NOT_FOUND: {},
|
|
1447
|
-
BAD_REQUEST: {}
|
|
1448
|
-
}).input(z.object({
|
|
1728
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1449
1729
|
environmentId: z.string().describe("The ID of the environment"),
|
|
1450
1730
|
environmentVariables: environmentVariablesSchema
|
|
1451
1731
|
})).output(z.object({ success: z.literal(true) }));
|
|
1452
|
-
const updateEnvironmentVariableContractV1 =
|
|
1732
|
+
const updateEnvironmentVariableContractV1 = base.route({
|
|
1453
1733
|
path: "/v1/environment-variables/{environmentVariableId}",
|
|
1454
1734
|
method: "PATCH",
|
|
1455
1735
|
summary: "Update an environment variable",
|
|
1456
1736
|
description: "Update an environment variable by ID",
|
|
1457
1737
|
tags: ["environments"],
|
|
1458
1738
|
successDescription: "The environment variable has been updated successfully"
|
|
1459
|
-
}).errors({
|
|
1460
|
-
NOT_FOUND: {},
|
|
1461
|
-
BAD_REQUEST: {}
|
|
1462
|
-
}).input(z.object({
|
|
1739
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1463
1740
|
environmentVariableId: z.string().describe("The ID of the environment variable"),
|
|
1464
1741
|
key: environmentVariableSchema.shape.key,
|
|
1465
1742
|
value: environmentVariableSchema.shape.value.optional(),
|
|
1466
1743
|
isSecret: environmentVariableSchema.shape.isSecret.optional()
|
|
1467
1744
|
})).output(z.object({ success: z.literal(true) }));
|
|
1468
|
-
const deleteEnvironmentVariableContractV1 =
|
|
1745
|
+
const deleteEnvironmentVariableContractV1 = base.route({
|
|
1469
1746
|
path: "/v1/environment-variables/{environmentVariableId}",
|
|
1470
1747
|
method: "DELETE",
|
|
1471
1748
|
summary: "Delete an environment variable",
|
|
1472
1749
|
description: "Delete an environment variable by ID",
|
|
1473
1750
|
tags: ["environments"],
|
|
1474
1751
|
successDescription: "The environment variable has been deleted successfully"
|
|
1475
|
-
}).errors({
|
|
1476
|
-
|
|
1477
|
-
BAD_REQUEST: {}
|
|
1478
|
-
}).input(z.object({ environmentVariableId: z.string().describe("The ID of the environment variable") })).output(z.object({ success: z.literal(true) }));
|
|
1479
|
-
const deleteProjectContractV1 = oc.route({
|
|
1752
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({ environmentVariableId: z.string().describe("The ID of the environment variable") })).output(z.object({ success: z.literal(true) }));
|
|
1753
|
+
const deleteProjectContractV1 = base.route({
|
|
1480
1754
|
path: "/v1/projects/{projectId}",
|
|
1481
1755
|
method: "DELETE",
|
|
1482
1756
|
summary: "Delete a project",
|
|
@@ -1484,7 +1758,7 @@ const deleteProjectContractV1 = oc.route({
|
|
|
1484
1758
|
tags: ["projects"],
|
|
1485
1759
|
successDescription: "The project has been deleted successfully"
|
|
1486
1760
|
}).errors({ NOT_FOUND: {} }).input(z.object({ projectId: z.string().describe("The ID of the project") })).output(z.object({ success: z.literal(true) }));
|
|
1487
|
-
const updateProjectContractV1 =
|
|
1761
|
+
const updateProjectContractV1 = base.route({
|
|
1488
1762
|
path: "/v1/projects/{projectId}",
|
|
1489
1763
|
method: "PATCH",
|
|
1490
1764
|
summary: "Update a project",
|
|
@@ -1493,14 +1767,13 @@ const updateProjectContractV1 = oc.route({
|
|
|
1493
1767
|
successDescription: "The project has been updated successfully"
|
|
1494
1768
|
}).errors({
|
|
1495
1769
|
NOT_FOUND: {},
|
|
1496
|
-
BAD_REQUEST: {},
|
|
1497
1770
|
FORBIDDEN: {}
|
|
1498
1771
|
}).input(z.object({
|
|
1499
1772
|
projectId: z.string().describe("The ID of the project"),
|
|
1500
1773
|
name: z.string().min(1).max(100).optional().describe("The new name for the project"),
|
|
1501
1774
|
sourceRepository: z.string().nullable().optional().describe("The source repository to connect to the project")
|
|
1502
1775
|
})).output(projectOutputSchema);
|
|
1503
|
-
const deployEnvironmentContractV1 =
|
|
1776
|
+
const deployEnvironmentContractV1 = base.route({
|
|
1504
1777
|
path: "/v1/environments/{environmentId}/deploy",
|
|
1505
1778
|
method: "POST",
|
|
1506
1779
|
summary: "Deploy an environment",
|
|
@@ -1509,27 +1782,25 @@ const deployEnvironmentContractV1 = oc.route({
|
|
|
1509
1782
|
successDescription: "The environment has been deployed successfully"
|
|
1510
1783
|
}).errors({
|
|
1511
1784
|
NOT_FOUND: {},
|
|
1512
|
-
|
|
1785
|
+
CONFLICT: {}
|
|
1513
1786
|
}).input(z.object({
|
|
1514
1787
|
environmentId: z.string().describe("The ID of the environment to deploy"),
|
|
1515
|
-
token: z.string().describe("The token to identify the source archive").optional()
|
|
1788
|
+
token: z.string().describe("The token to identify the source archive").optional(),
|
|
1789
|
+
settings: buildSettingsSchema.extend({ transport: transportSchema }).optional().describe("Project settings detected by the client from the source. When provided, the server skips downloading and extracting the source archive to detect them.")
|
|
1516
1790
|
})).output(deploymentSchema);
|
|
1517
|
-
const uploadDeploymentArtifactContractV1 =
|
|
1791
|
+
const uploadDeploymentArtifactContractV1 = base.route({
|
|
1518
1792
|
path: "/v1/deployments/upload",
|
|
1519
1793
|
method: "POST",
|
|
1520
1794
|
summary: "Upload deployment artifacts",
|
|
1521
1795
|
description: "Return a presigned S3 URL to upload a deployment artifact",
|
|
1522
1796
|
tags: ["deployments"],
|
|
1523
1797
|
successDescription: "The presigned upload URL has been generated successfully"
|
|
1524
|
-
}).errors({
|
|
1525
|
-
NOT_FOUND: {},
|
|
1526
|
-
BAD_REQUEST: {}
|
|
1527
|
-
}).input(z.object({ teamId: z.string().optional() }).optional()).output(z.object({
|
|
1798
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({ teamId: z.string().optional() }).optional()).output(z.object({
|
|
1528
1799
|
uploadUrl: z.url().describe("Presigned S3 URL to upload the source archive with HTTP PUT"),
|
|
1529
1800
|
token: z.string().describe("Token to identify the source archive"),
|
|
1530
1801
|
expiresAt: z.coerce.date().describe("Expiration date of the presigned URL")
|
|
1531
1802
|
}));
|
|
1532
|
-
const listDeploymentsContractV1 =
|
|
1803
|
+
const listDeploymentsContractV1 = base.route({
|
|
1533
1804
|
path: "/v1/projects/{projectId}/deployments",
|
|
1534
1805
|
method: "GET",
|
|
1535
1806
|
summary: "List project deployments",
|
|
@@ -1541,7 +1812,7 @@ const listDeploymentsContractV1 = oc.route({
|
|
|
1541
1812
|
status: z.array(deploymentStatusSchema).optional().describe("Filter by one or more statuses"),
|
|
1542
1813
|
environmentId: z.string().optional().describe("Filter by environment ID")
|
|
1543
1814
|
})).output(z.array(deploymentSchema));
|
|
1544
|
-
const getDeploymentContractV1 =
|
|
1815
|
+
const getDeploymentContractV1 = base.route({
|
|
1545
1816
|
path: "/v1/deployments/{deploymentId}",
|
|
1546
1817
|
method: "GET",
|
|
1547
1818
|
summary: "Get a deployment",
|
|
@@ -1549,20 +1820,32 @@ const getDeploymentContractV1 = oc.route({
|
|
|
1549
1820
|
tags: ["deployments"],
|
|
1550
1821
|
successDescription: "The deployment details"
|
|
1551
1822
|
}).errors({ NOT_FOUND: {} }).input(z.object({ deploymentId: z.string().describe("The ID of the deployment") })).output(deploymentSchema);
|
|
1552
|
-
const
|
|
1823
|
+
const logEntrySchema = z.object({
|
|
1824
|
+
timestamp: z.coerce.date(),
|
|
1825
|
+
type: z.enum([
|
|
1826
|
+
"START",
|
|
1827
|
+
"END",
|
|
1828
|
+
"INFO",
|
|
1829
|
+
"ERROR",
|
|
1830
|
+
"WARNING",
|
|
1831
|
+
"DEBUG"
|
|
1832
|
+
]),
|
|
1833
|
+
requestId: z.string(),
|
|
1834
|
+
content: z.string().optional(),
|
|
1835
|
+
method: z.string().optional(),
|
|
1836
|
+
durationInMs: z.number().optional()
|
|
1837
|
+
});
|
|
1838
|
+
const getLogsContractV1 = base.route({
|
|
1553
1839
|
path: "/v1/environments/{environmentId}/logs",
|
|
1554
1840
|
method: "GET",
|
|
1555
1841
|
summary: "Get logs",
|
|
1556
1842
|
description: "Get logs for an environment",
|
|
1557
1843
|
tags: ["environments"],
|
|
1558
1844
|
successDescription: "The logs"
|
|
1559
|
-
}).errors({
|
|
1560
|
-
NOT_FOUND: {},
|
|
1561
|
-
BAD_REQUEST: {}
|
|
1562
|
-
}).input(z.object({
|
|
1845
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1563
1846
|
environmentId: z.string().describe("The ID of the environment"),
|
|
1564
|
-
since:
|
|
1565
|
-
until:
|
|
1847
|
+
since: timeInputSchema.optional().describe("Start time — ISO 8601 (2024-01-01T00:00:00Z) or relative (1h, 30m, 2d)"),
|
|
1848
|
+
until: timeInputSchema.optional().describe("End time — ISO 8601 or relative"),
|
|
1566
1849
|
limit: z.coerce.number().int().min(1).max(1e3).default(1e3).describe("Maximum number of log entries to return."),
|
|
1567
1850
|
level: z.array(z.enum([
|
|
1568
1851
|
"INFO",
|
|
@@ -1573,34 +1856,17 @@ const getLogsContractV1 = oc.route({
|
|
|
1573
1856
|
search: z.string().optional().describe("Filter pattern to search for in log content"),
|
|
1574
1857
|
nextToken: z.string().optional().describe("Pagination token from a previous response")
|
|
1575
1858
|
})).output(z.object({
|
|
1576
|
-
logs: z.array(
|
|
1577
|
-
timestamp: z.coerce.date(),
|
|
1578
|
-
type: z.enum([
|
|
1579
|
-
"START",
|
|
1580
|
-
"END",
|
|
1581
|
-
"INFO",
|
|
1582
|
-
"ERROR",
|
|
1583
|
-
"WARNING",
|
|
1584
|
-
"DEBUG"
|
|
1585
|
-
]),
|
|
1586
|
-
requestId: z.string(),
|
|
1587
|
-
content: z.string().optional(),
|
|
1588
|
-
method: z.string().optional(),
|
|
1589
|
-
durationInMs: z.number().optional()
|
|
1590
|
-
})),
|
|
1859
|
+
logs: z.array(logEntrySchema),
|
|
1591
1860
|
nextToken: z.string().nullable()
|
|
1592
1861
|
}));
|
|
1593
|
-
const getLatestLogsContractV1 =
|
|
1862
|
+
const getLatestLogsContractV1 = base.route({
|
|
1594
1863
|
path: "/v1/environments/{environmentId}/latest-logs",
|
|
1595
1864
|
method: "GET",
|
|
1596
1865
|
summary: "Get latest logs",
|
|
1597
1866
|
description: "Get the N most recent logs for an environment",
|
|
1598
1867
|
tags: ["environments"],
|
|
1599
1868
|
successDescription: "The latest logs"
|
|
1600
|
-
}).errors({
|
|
1601
|
-
NOT_FOUND: {},
|
|
1602
|
-
BAD_REQUEST: {}
|
|
1603
|
-
}).input(z.object({
|
|
1869
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1604
1870
|
environmentId: z.string().describe("The ID of the environment"),
|
|
1605
1871
|
limit: z.coerce.number().int().min(1).max(1e3).default(100).describe("Number of most recent log entries to return"),
|
|
1606
1872
|
level: z.array(z.enum([
|
|
@@ -1610,22 +1876,8 @@ const getLatestLogsContractV1 = oc.route({
|
|
|
1610
1876
|
"DEBUG"
|
|
1611
1877
|
])).optional().describe("Filter by log level"),
|
|
1612
1878
|
search: z.string().optional().describe("Filter pattern to search for in log content")
|
|
1613
|
-
})).output(z.object({ logs: z.array(
|
|
1614
|
-
|
|
1615
|
-
type: z.enum([
|
|
1616
|
-
"START",
|
|
1617
|
-
"END",
|
|
1618
|
-
"INFO",
|
|
1619
|
-
"ERROR",
|
|
1620
|
-
"WARNING",
|
|
1621
|
-
"DEBUG"
|
|
1622
|
-
]),
|
|
1623
|
-
requestId: z.string(),
|
|
1624
|
-
content: z.string().optional(),
|
|
1625
|
-
method: z.string().optional(),
|
|
1626
|
-
durationInMs: z.number().optional()
|
|
1627
|
-
})) }));
|
|
1628
|
-
const getDeploymentLogsContractV1 = oc.route({
|
|
1879
|
+
})).output(z.object({ logs: z.array(logEntrySchema) }));
|
|
1880
|
+
const getDeploymentLogsContractV1 = base.route({
|
|
1629
1881
|
path: "/v1/deployments/{deploymentId}/logs",
|
|
1630
1882
|
method: "GET",
|
|
1631
1883
|
summary: "Get deployment logs",
|
|
@@ -1652,17 +1904,14 @@ const analyticsTimeSeriesSchema = z.object({
|
|
|
1652
1904
|
output_token_mean: z.array(analyticsDataPointSchema),
|
|
1653
1905
|
task_count: z.array(analyticsDataPointSchema)
|
|
1654
1906
|
});
|
|
1655
|
-
const getProjectAnalyticsContractV1 =
|
|
1907
|
+
const getProjectAnalyticsContractV1 = base.route({
|
|
1656
1908
|
path: "/v1/analytics/{projectId}",
|
|
1657
1909
|
method: "GET",
|
|
1658
1910
|
summary: "Get project analytics",
|
|
1659
1911
|
description: "Get analytics data for a project over a time range",
|
|
1660
1912
|
tags: ["analytics"],
|
|
1661
1913
|
successDescription: "The project analytics data"
|
|
1662
|
-
}).errors({
|
|
1663
|
-
NOT_FOUND: {},
|
|
1664
|
-
BAD_REQUEST: {}
|
|
1665
|
-
}).input(z.object({
|
|
1914
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1666
1915
|
projectId: z.string().describe("The ID of the project"),
|
|
1667
1916
|
startTimestamp: z.coerce.number().describe("Start timestamp in milliseconds"),
|
|
1668
1917
|
endTimestamp: z.coerce.number().describe("End timestamp in milliseconds"),
|
|
@@ -1677,7 +1926,132 @@ const getProjectAnalyticsContractV1 = oc.route({
|
|
|
1677
1926
|
}),
|
|
1678
1927
|
timeSeries: analyticsTimeSeriesSchema
|
|
1679
1928
|
}));
|
|
1680
|
-
const
|
|
1929
|
+
const paginatedInsightsInputShape = {
|
|
1930
|
+
environmentId: z.string().describe("The ID of the environment"),
|
|
1931
|
+
since: timeInputSchema.default("7d").describe("Start time — ISO 8601 (2024-01-01T00:00:00Z) or relative (1h, 30m, 2d)"),
|
|
1932
|
+
until: timeInputSchema.optional().describe("End time — ISO 8601 or relative"),
|
|
1933
|
+
limit: z.coerce.number().int().min(1).max(200).default(50),
|
|
1934
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
1935
|
+
search: z.string().trim().min(1).max(200).optional()
|
|
1936
|
+
};
|
|
1937
|
+
const listIntentsContractV1 = base.route({
|
|
1938
|
+
path: "/v1/environments/{environmentId}/intents",
|
|
1939
|
+
method: "GET",
|
|
1940
|
+
summary: "List intents",
|
|
1941
|
+
description: "List grouped user intents for an environment over a time range",
|
|
1942
|
+
tags: ["insights"],
|
|
1943
|
+
successDescription: "The grouped user intents"
|
|
1944
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1945
|
+
...paginatedInsightsInputShape,
|
|
1946
|
+
tools: z.array(z.string().trim().min(1)).min(1).max(100).optional(),
|
|
1947
|
+
clientIds: z.array(z.string().min(1)).min(1).max(100).optional(),
|
|
1948
|
+
categoryIds: z.array(z.string().trim().min(1)).min(1).max(100).optional(),
|
|
1949
|
+
sortDir: z.enum(["asc", "desc"]).default("desc")
|
|
1950
|
+
})).output(z.object({
|
|
1951
|
+
intents: z.array(z.object({
|
|
1952
|
+
id: z.string(),
|
|
1953
|
+
intentIds: z.array(z.string()).min(1),
|
|
1954
|
+
environmentId: z.string(),
|
|
1955
|
+
message: z.string(),
|
|
1956
|
+
toolName: z.string(),
|
|
1957
|
+
createdAt: z.coerce.date(),
|
|
1958
|
+
occurrenceCount: z.number().int().positive(),
|
|
1959
|
+
clientName: z.string().nullable(),
|
|
1960
|
+
clientId: z.string().nullable(),
|
|
1961
|
+
categories: z.array(z.object({
|
|
1962
|
+
id: z.string(),
|
|
1963
|
+
name: z.string(),
|
|
1964
|
+
color: intentCategoryColorSchema
|
|
1965
|
+
}))
|
|
1966
|
+
})),
|
|
1967
|
+
totalCount: z.number().int().nonnegative()
|
|
1968
|
+
}));
|
|
1969
|
+
const listFeedbacksContractV1 = base.route({
|
|
1970
|
+
path: "/v1/environments/{environmentId}/feedbacks",
|
|
1971
|
+
method: "GET",
|
|
1972
|
+
summary: "List feedbacks",
|
|
1973
|
+
description: "List user feedback for an environment over a time range",
|
|
1974
|
+
tags: ["insights"],
|
|
1975
|
+
successDescription: "The user feedback"
|
|
1976
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1977
|
+
...paginatedInsightsInputShape,
|
|
1978
|
+
clientIds: z.array(z.string().min(1)).min(1).max(100).optional()
|
|
1979
|
+
})).output(z.object({
|
|
1980
|
+
feedbacks: z.array(feedbackSchema.extend({ clientId: z.string().nullable() })),
|
|
1981
|
+
totalCount: z.number().int().nonnegative()
|
|
1982
|
+
}));
|
|
1983
|
+
const intentCategoryNameSchema = z.string().trim().min(1).max(100).describe("The category name");
|
|
1984
|
+
const categorizableIntentIdsSchema = z.array(z.string().trim().min(1)).min(1).max(100).describe("IDs of the intents to categorize");
|
|
1985
|
+
const listIntentCategoriesContractV1 = base.route({
|
|
1986
|
+
path: "/v1/environments/{environmentId}/intent-categories",
|
|
1987
|
+
method: "GET",
|
|
1988
|
+
summary: "List intent categories",
|
|
1989
|
+
description: "List intent categories for an environment, including how many intents each category is linked to",
|
|
1990
|
+
tags: ["insights"],
|
|
1991
|
+
successDescription: "The intent categories"
|
|
1992
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({ environmentId: z.string().describe("The ID of the environment") })).output(z.array(intentCategorySummarySchema));
|
|
1993
|
+
const createIntentCategoryContractV1 = base.route({
|
|
1994
|
+
path: "/v1/environments/{environmentId}/intent-categories",
|
|
1995
|
+
method: "POST",
|
|
1996
|
+
summary: "Create an intent category",
|
|
1997
|
+
description: "Create an intent category, optionally linking it to existing intents",
|
|
1998
|
+
tags: ["insights"],
|
|
1999
|
+
successDescription: "The created intent category"
|
|
2000
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
2001
|
+
environmentId: z.string().describe("The ID of the environment"),
|
|
2002
|
+
name: intentCategoryNameSchema,
|
|
2003
|
+
color: intentCategoryColorSchema.optional().describe("The category color; derived from the name when omitted"),
|
|
2004
|
+
intentIds: categorizableIntentIdsSchema.optional().describe("IDs of intents to link to the new category")
|
|
2005
|
+
})).output(intentCategorySchema);
|
|
2006
|
+
const updateIntentCategoryContractV1 = base.route({
|
|
2007
|
+
path: "/v1/environments/{environmentId}/intent-categories/{categoryId}",
|
|
2008
|
+
method: "PATCH",
|
|
2009
|
+
summary: "Update an intent category",
|
|
2010
|
+
description: "Rename or recolor an intent category",
|
|
2011
|
+
tags: ["insights"],
|
|
2012
|
+
successDescription: "The updated intent category"
|
|
2013
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
2014
|
+
environmentId: z.string().describe("The ID of the environment"),
|
|
2015
|
+
categoryId: z.string().describe("The ID of the category"),
|
|
2016
|
+
name: intentCategoryNameSchema.optional(),
|
|
2017
|
+
color: intentCategoryColorSchema.optional().describe("The category color")
|
|
2018
|
+
}).refine(({ name, color }) => name !== void 0 || color !== void 0, { message: "At least one of name or color must be provided" })).output(intentCategorySchema);
|
|
2019
|
+
const deleteIntentCategoryContractV1 = base.route({
|
|
2020
|
+
path: "/v1/environments/{environmentId}/intent-categories/{categoryId}",
|
|
2021
|
+
method: "DELETE",
|
|
2022
|
+
summary: "Delete an intent category",
|
|
2023
|
+
description: "Delete an intent category; its intents are unlinked but not deleted",
|
|
2024
|
+
tags: ["insights"],
|
|
2025
|
+
successDescription: "The intent category has been deleted successfully"
|
|
2026
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
2027
|
+
environmentId: z.string().describe("The ID of the environment"),
|
|
2028
|
+
categoryId: z.string().describe("The ID of the category")
|
|
2029
|
+
})).output(z.object({ success: z.literal(true) }));
|
|
2030
|
+
const linkIntentCategoryContractV1 = base.route({
|
|
2031
|
+
path: "/v1/environments/{environmentId}/intent-categories/{categoryId}/link",
|
|
2032
|
+
method: "POST",
|
|
2033
|
+
summary: "Link an intent category",
|
|
2034
|
+
description: "Link an intent category to intents; already linked intents are ignored",
|
|
2035
|
+
tags: ["insights"],
|
|
2036
|
+
successDescription: "The intents have been linked successfully"
|
|
2037
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
2038
|
+
environmentId: z.string().describe("The ID of the environment"),
|
|
2039
|
+
categoryId: z.string().describe("The ID of the category"),
|
|
2040
|
+
intentIds: categorizableIntentIdsSchema
|
|
2041
|
+
})).output(z.object({ success: z.literal(true) }));
|
|
2042
|
+
const unlinkIntentCategoryContractV1 = base.route({
|
|
2043
|
+
path: "/v1/environments/{environmentId}/intent-categories/{categoryId}/unlink",
|
|
2044
|
+
method: "POST",
|
|
2045
|
+
summary: "Unlink an intent category",
|
|
2046
|
+
description: "Unlink an intent category from intents; intents without the category are ignored",
|
|
2047
|
+
tags: ["insights"],
|
|
2048
|
+
successDescription: "The intents have been unlinked successfully"
|
|
2049
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
2050
|
+
environmentId: z.string().describe("The ID of the environment"),
|
|
2051
|
+
categoryId: z.string().describe("The ID of the category"),
|
|
2052
|
+
intentIds: categorizableIntentIdsSchema
|
|
2053
|
+
})).output(z.object({ success: z.literal(true) }));
|
|
2054
|
+
const listTeamsContractV1 = base.route({
|
|
1681
2055
|
path: "/v1/teams",
|
|
1682
2056
|
method: "GET",
|
|
1683
2057
|
summary: "List teams",
|
|
@@ -1690,7 +2064,22 @@ const listTeamsContractV1 = oc.route({
|
|
|
1690
2064
|
createdAt: z.coerce.date(),
|
|
1691
2065
|
hasStripeAccount: z.boolean()
|
|
1692
2066
|
})));
|
|
1693
|
-
const
|
|
2067
|
+
const getTeamUsageContractV1 = base.route({
|
|
2068
|
+
path: "/v1/teams/{teamId}/usage",
|
|
2069
|
+
method: "GET",
|
|
2070
|
+
summary: "Get team usage",
|
|
2071
|
+
description: "Get the MCP request usage of a team for its current billing window. A team that has made no request in the window reports zero.",
|
|
2072
|
+
tags: ["teams"],
|
|
2073
|
+
successDescription: "The current billing window usage"
|
|
2074
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({ teamId: z.string().describe("The ID of the team") })).output(z.object({
|
|
2075
|
+
teamId: z.string(),
|
|
2076
|
+
plan: subscriptionPlanSchema.nullable().describe("The plan in force for the window, null on the Free plan"),
|
|
2077
|
+
periodStart: z.coerce.date().describe("Start of the current billing window"),
|
|
2078
|
+
periodEnd: z.coerce.date().describe("End of the current billing window"),
|
|
2079
|
+
requestCount: z.number().int().describe("MCP requests settled during the current billing window"),
|
|
2080
|
+
includedRequests: z.number().int().nullable().describe("Requests included in the plan for one window, null when the allowance is contract-specific")
|
|
2081
|
+
}));
|
|
2082
|
+
const getTunnelTicketContractV1 = base.route({
|
|
1694
2083
|
path: "/v1/tunnels/ticket",
|
|
1695
2084
|
method: "GET",
|
|
1696
2085
|
summary: "Get a tunnel ticket",
|
|
@@ -1702,16 +2091,13 @@ const getTunnelTicketContractV1 = oc.route({
|
|
|
1702
2091
|
ticket: z.string().describe("The signed tunnel ticket"),
|
|
1703
2092
|
tunnelHost: z.string().describe("The tunnel host to connect to")
|
|
1704
2093
|
}));
|
|
1705
|
-
const publishServerContractV1 =
|
|
2094
|
+
const publishServerContractV1 = base.route({
|
|
1706
2095
|
path: "/v1/distribution/publish",
|
|
1707
2096
|
method: "POST",
|
|
1708
2097
|
summary: "Publish a server to the MCP registry",
|
|
1709
2098
|
tags: ["distribution"],
|
|
1710
2099
|
successDescription: "The server has been published successfully"
|
|
1711
|
-
}).errors({
|
|
1712
|
-
NOT_FOUND: {},
|
|
1713
|
-
BAD_REQUEST: {}
|
|
1714
|
-
}).input(z.object({
|
|
2100
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1715
2101
|
projectId: z.string(),
|
|
1716
2102
|
domain: z.string(),
|
|
1717
2103
|
title: z.string().min(1).max(100),
|
|
@@ -1720,17 +2106,14 @@ const publishServerContractV1 = oc.route({
|
|
|
1720
2106
|
iconSrc: z.url().max(255).optional(),
|
|
1721
2107
|
dryRun: z.boolean().optional()
|
|
1722
2108
|
})).output(z.object({ serverFields: serverFieldsSchema }));
|
|
1723
|
-
const getServerInfoContractV1 =
|
|
2109
|
+
const getServerInfoContractV1 = base.route({
|
|
1724
2110
|
path: "/v1/distribution/get",
|
|
1725
2111
|
method: "GET",
|
|
1726
2112
|
summary: "Get server info",
|
|
1727
2113
|
description: "Get info about a server",
|
|
1728
2114
|
tags: ["distribution"],
|
|
1729
2115
|
successDescription: "The server info"
|
|
1730
|
-
}).errors({
|
|
1731
|
-
NOT_FOUND: {},
|
|
1732
|
-
BAD_REQUEST: {}
|
|
1733
|
-
}).input(z.object({
|
|
2116
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1734
2117
|
projectId: z.string(),
|
|
1735
2118
|
domain: z.string()
|
|
1736
2119
|
})).output(z.object({ serverFields: serverFieldsSchema }));
|
|
@@ -1749,7 +2132,7 @@ const playgroundOutputSchema = z.object({
|
|
|
1749
2132
|
isPlaygroundEnabled: z.boolean(),
|
|
1750
2133
|
serverMetadata: playgroundServerMetadataOutputSchema.nullable()
|
|
1751
2134
|
});
|
|
1752
|
-
const getPlaygroundContractV1 =
|
|
2135
|
+
const getPlaygroundContractV1 = base.route({
|
|
1753
2136
|
path: "/v1/environments/{environmentId}/playground",
|
|
1754
2137
|
method: "GET",
|
|
1755
2138
|
summary: "Get playground configuration",
|
|
@@ -1757,17 +2140,14 @@ const getPlaygroundContractV1 = oc.route({
|
|
|
1757
2140
|
tags: ["environments"],
|
|
1758
2141
|
successDescription: "The playground configuration"
|
|
1759
2142
|
}).errors({ NOT_FOUND: {} }).input(z.object({ environmentId: z.string().describe("The ID of the environment") })).output(playgroundOutputSchema);
|
|
1760
|
-
const upsertPlaygroundContractV1 =
|
|
2143
|
+
const upsertPlaygroundContractV1 = base.route({
|
|
1761
2144
|
path: "/v1/environments/{environmentId}/playground",
|
|
1762
2145
|
method: "PUT",
|
|
1763
2146
|
summary: "Update playground configuration",
|
|
1764
2147
|
description: "Update the playground configuration for an environment. All fields are optional — only provided fields are updated.",
|
|
1765
2148
|
tags: ["environments"],
|
|
1766
2149
|
successDescription: "The updated playground configuration"
|
|
1767
|
-
}).errors({
|
|
1768
|
-
NOT_FOUND: {},
|
|
1769
|
-
BAD_REQUEST: {}
|
|
1770
|
-
}).input(z.object({
|
|
2150
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1771
2151
|
environmentId: z.string().describe("The ID of the environment"),
|
|
1772
2152
|
isPlaygroundEnabled: z.boolean().optional(),
|
|
1773
2153
|
name: z.string().min(1).max(100).optional(),
|
|
@@ -1775,7 +2155,7 @@ const upsertPlaygroundContractV1 = oc.route({
|
|
|
1775
2155
|
headers: z.array(playgroundHeaderSchema).optional(),
|
|
1776
2156
|
examplePrompts: z.array(playgroundExamplePromptSchema).max(5).optional()
|
|
1777
2157
|
})).output(playgroundOutputSchema);
|
|
1778
|
-
const createBeaconContractV1 =
|
|
2158
|
+
const createBeaconContractV1 = base.route({
|
|
1779
2159
|
path: "/v1/beacon/audits",
|
|
1780
2160
|
method: "POST",
|
|
1781
2161
|
summary: "Create a beacon audit",
|
|
@@ -1784,7 +2164,6 @@ const createBeaconContractV1 = oc.route({
|
|
|
1784
2164
|
successDescription: "The audit has been created"
|
|
1785
2165
|
}).errors({
|
|
1786
2166
|
NOT_FOUND: {},
|
|
1787
|
-
BAD_REQUEST: {},
|
|
1788
2167
|
DNS_RESOLUTION_FAILED: { status: 400 }
|
|
1789
2168
|
}).input(z.object({
|
|
1790
2169
|
targetUrl: z.url().describe("The HTTPS URL of the MCP server to audit"),
|
|
@@ -1792,7 +2171,7 @@ const createBeaconContractV1 = oc.route({
|
|
|
1792
2171
|
projectId: z.string().optional().describe("The project ID to associate the audit with"),
|
|
1793
2172
|
excludeCategories: z.array(checkCategorySchema).optional().describe("Check categories to exclude from the audit")
|
|
1794
2173
|
})).output(z.object({ id: z.string() }));
|
|
1795
|
-
const getBeaconContractV1 =
|
|
2174
|
+
const getBeaconContractV1 = base.route({
|
|
1796
2175
|
path: "/v1/beacon/audits/{auditId}",
|
|
1797
2176
|
method: "GET",
|
|
1798
2177
|
summary: "Get a beacon audit",
|
|
@@ -1808,8 +2187,21 @@ const getBeaconContractV1 = oc.route({
|
|
|
1808
2187
|
report: auditReportWithScreenshotsSchema.nullable()
|
|
1809
2188
|
}));
|
|
1810
2189
|
const contract = {
|
|
1811
|
-
teams: {
|
|
2190
|
+
teams: {
|
|
2191
|
+
list: { v1: listTeamsContractV1 },
|
|
2192
|
+
getUsage: { v1: getTeamUsageContractV1 }
|
|
2193
|
+
},
|
|
1812
2194
|
analytics: { get: { v1: getProjectAnalyticsContractV1 } },
|
|
2195
|
+
intents: { list: { v1: listIntentsContractV1 } },
|
|
2196
|
+
intentCategories: {
|
|
2197
|
+
list: { v1: listIntentCategoriesContractV1 },
|
|
2198
|
+
create: { v1: createIntentCategoryContractV1 },
|
|
2199
|
+
update: { v1: updateIntentCategoryContractV1 },
|
|
2200
|
+
delete: { v1: deleteIntentCategoryContractV1 },
|
|
2201
|
+
link: { v1: linkIntentCategoryContractV1 },
|
|
2202
|
+
unlink: { v1: unlinkIntentCategoryContractV1 }
|
|
2203
|
+
},
|
|
2204
|
+
feedbacks: { list: { v1: listFeedbacksContractV1 } },
|
|
1813
2205
|
deployments: {
|
|
1814
2206
|
list: { v1: listDeploymentsContractV1 },
|
|
1815
2207
|
get: { v1: getDeploymentContractV1 },
|
|
@@ -1850,5 +2242,10 @@ const contract = {
|
|
|
1850
2242
|
get: { v1: getBeaconContractV1 }
|
|
1851
2243
|
}
|
|
1852
2244
|
};
|
|
2245
|
+
const { uploadArtifact: _discard, ...deploymentsForDocs } = contract.deployments;
|
|
2246
|
+
const contractForDocs = {
|
|
2247
|
+
...contract,
|
|
2248
|
+
deployments: deploymentsForDocs
|
|
2249
|
+
};
|
|
1853
2250
|
//#endregion
|
|
1854
|
-
export { AUTH_SCOPE_ANY, AUTH_SCOPE_USER, PLATFORM_LABELS, buildSettingsSchema, contract, createEnvironmentContractV1, deploymentStatusSchema, environmentVariableSchema, environmentVariablesSchema, playgroundExamplePromptSchema, playgroundHeaderSchema, runtimeSchema, serverFieldsSchema, transportSchema, updateEnvironmentVariableSchema };
|
|
2251
|
+
export { AUTH_SCOPE_ANY, AUTH_SCOPE_USER, INTENT_CATEGORY_COLORS, PLATFORM_LABELS, buildSettingsSchema, contract, contractForDocs, createEnvironmentContractV1, deploymentStatusSchema, environmentVariableSchema, environmentVariablesSchema, intentCategoryColorSchema, playgroundExamplePromptSchema, playgroundHeaderSchema, runtimeSchema, serverFieldsSchema, transportSchema, updateEnvironmentVariableSchema };
|