@alpic-ai/api 0.0.0-dev.gd339486 → 0.0.0-dev.gd35ddf5

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.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.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/auth.js
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
- const platformSchema = z.enum(["chatgpt", "claudeai"]);
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",
@@ -273,34 +283,51 @@ const deploymentSummarySchema = z.object({
273
283
  createdAt: z.coerce.date(),
274
284
  updatedAt: z.coerce.date()
275
285
  });
276
- /**
277
- * Public environment
278
- *
279
- * No OAuth metadata exposed.
280
- */
286
+ /** Public environment: answers anonymously and exposes no OAuth metadata. */
281
287
  const publicEnvironmentSchema = z.object({
288
+ allowsAnonymous: z.literal(true),
289
+ oAuthMetadata: z.strictObject({})
290
+ });
291
+ /** 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. */
292
+ const externalResourceMetadataEnvironmentSchema = z.object({
293
+ allowsAnonymous: z.boolean(),
294
+ oAuthMetadata: z.object({ externalResourceMetadataUrl: z.url() }),
295
+ scope: z.string().optional()
296
+ });
297
+ /** 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. */
298
+ const externalAuthorizationServerEnvironmentSchema = z.object({
299
+ allowsAnonymous: z.boolean(),
300
+ oAuthMetadata: z.object({
301
+ externalAuthorizationServerUrl: z.url(),
302
+ resourceMetadata: OAuthProtectedResourceMetadataSchema.optional()
303
+ }),
304
+ scope: z.string().optional()
305
+ });
306
+ /** Standalone protected environment: the server itself exposes both the /.well-known/oauth-protected-resource and /.well-known/oauth-authorization-server endpoints. */
307
+ const standaloneEnvironmentSchema = z.object({
308
+ allowsAnonymous: z.boolean(),
309
+ oAuthMetadata: z.object({
310
+ authorizationServerMetadata: z.union([OAuthMetadataSchema, OpenIdProviderDiscoveryMetadataSchema]),
311
+ resourceMetadata: OAuthProtectedResourceMetadataSchema.optional()
312
+ }),
313
+ scope: z.string().optional()
314
+ });
315
+ /** Protected environment that enforces authentication but advertises no OAuth discovery metadata; clients must obtain credentials out-of-band. */
316
+ const protectedWithoutDiscoveryEnvironmentSchema = z.object({
317
+ allowsAnonymous: z.literal(false),
318
+ oAuthMetadata: z.strictObject({}),
319
+ scope: z.string().optional()
320
+ });
321
+ const legacyPublicEnvironmentSchema = z.object({
282
322
  isPublic: z.literal(true),
283
323
  oAuthMetadata: z.undefined().optional()
284
324
  });
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({
325
+ const legacyExternalResourceMetadataEnvironmentSchema = z.object({
292
326
  isPublic: z.literal(false),
293
327
  oAuthMetadata: z.object({ externalResourceMetadataUrl: z.url() }),
294
328
  scope: z.string().optional()
295
329
  });
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({
330
+ const legacyExternalAuthorizationServerEnvironmentSchema = z.object({
304
331
  isPublic: z.literal(false),
305
332
  oAuthMetadata: z.object({
306
333
  externalAuthorizationServerUrl: z.url(),
@@ -308,13 +335,7 @@ const externalAuthorizationServerEnvironmentSchema = z.object({
308
335
  }),
309
336
  scope: z.string().optional()
310
337
  });
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({
338
+ const legacyStandaloneEnvironmentSchema = z.object({
318
339
  isPublic: z.literal(false),
319
340
  oAuthMetadata: z.object({
320
341
  authorizationServerMetadata: z.union([OAuthMetadataSchema, OpenIdProviderDiscoveryMetadataSchema]),
@@ -322,14 +343,7 @@ const standaloneEnvironmentSchema = z.object({
322
343
  }),
323
344
  scope: z.string().optional()
324
345
  });
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({
346
+ const legacyProtectedWithoutDiscoveryEnvironmentSchema = z.object({
333
347
  isPublic: z.literal(false),
334
348
  oAuthMetadata: z.strictObject({}),
335
349
  scope: z.string().optional()
@@ -339,9 +353,13 @@ z.union([
339
353
  externalResourceMetadataEnvironmentSchema,
340
354
  externalAuthorizationServerEnvironmentSchema,
341
355
  standaloneEnvironmentSchema,
342
- protectedWithoutDiscoveryEnvironmentSchema
356
+ protectedWithoutDiscoveryEnvironmentSchema,
357
+ legacyPublicEnvironmentSchema,
358
+ legacyExternalResourceMetadataEnvironmentSchema,
359
+ legacyExternalAuthorizationServerEnvironmentSchema,
360
+ legacyStandaloneEnvironmentSchema,
361
+ legacyProtectedWithoutDiscoveryEnvironmentSchema
343
362
  ]);
344
- const allowedPlatformSchema = platformSchema;
345
363
  const playgroundModelSchema = z.enum([
346
364
  "global.anthropic.claude-haiku-4-5-20251001-v1:0",
347
365
  "global.anthropic.claude-sonnet-4-5-20250929-v1:0",
@@ -381,7 +399,8 @@ z.object({
381
399
  collectRequestPayload: z.boolean(),
382
400
  collectResponsePayload: z.boolean(),
383
401
  collectErrorMessage: z.boolean(),
384
- collectUserData: z.boolean()
402
+ collectUserData: z.boolean(),
403
+ identityTraitKey: z.string().min(1).max(200).nullable()
385
404
  });
386
405
  z.object({
387
406
  id: z.string(),
@@ -488,6 +507,246 @@ z.enum([
488
507
  "DEBUG",
489
508
  "ERROR"
490
509
  ]);
510
+ /** Only names a vendor actually ships belong here: lookalikes like `claude-code-test` are customers' own scripts. */
511
+ const MCP_CLIENT_GROUPS = [
512
+ {
513
+ id: "claude_code",
514
+ label: "Claude Code",
515
+ vendor: "anthropic",
516
+ rawNames: ["claude-code", "Anthropic/ClaudeCodeDesktop"]
517
+ },
518
+ {
519
+ id: "claude",
520
+ label: "Claude",
521
+ vendor: "anthropic",
522
+ rawNames: [
523
+ "Anthropic/ClaudeAI",
524
+ "claude-ai",
525
+ "claude",
526
+ "Claude",
527
+ "claude-desktop",
528
+ "claude-desktop-3p"
529
+ ]
530
+ },
531
+ {
532
+ id: "claude_mobile",
533
+ label: "Claude mobile",
534
+ vendor: "anthropic",
535
+ rawNames: ["claude-ios", "ClaudeAndroid"]
536
+ },
537
+ {
538
+ id: "claude_cowork",
539
+ label: "Claude Cowork",
540
+ vendor: "anthropic",
541
+ rawNames: ["Anthropic/Cowork"]
542
+ },
543
+ {
544
+ id: "claude_toolbox",
545
+ label: "Claude Toolbox",
546
+ vendor: "anthropic",
547
+ rawNames: ["Anthropic/Toolbox", "Anthropic/toolbox-bootstrap"]
548
+ },
549
+ {
550
+ id: "anthropic_api",
551
+ label: "Anthropic API",
552
+ vendor: "anthropic",
553
+ rawNames: ["Anthropic/API"]
554
+ },
555
+ {
556
+ id: "anthropic_connector_refresh",
557
+ label: "Anthropic (connector refresh)",
558
+ vendor: "anthropic",
559
+ rawNames: ["Anthropic"]
560
+ },
561
+ {
562
+ id: "codex",
563
+ label: "Codex",
564
+ vendor: "openai",
565
+ rawNames: [
566
+ "codex-mcp-client",
567
+ "codex",
568
+ "Codex",
569
+ "codex-cli",
570
+ "openai-mcp (Codex)"
571
+ ]
572
+ },
573
+ {
574
+ id: "chatgpt",
575
+ label: "ChatGPT",
576
+ vendor: "openai",
577
+ rawNames: ["openai-mcp (ChatGPT)"]
578
+ },
579
+ {
580
+ id: "openai_responses_api",
581
+ label: "OpenAI Responses API",
582
+ vendor: "openai",
583
+ rawNames: ["openai-mcp (Responses API)"]
584
+ },
585
+ {
586
+ id: "openai_agent_builder",
587
+ label: "OpenAI Agent Builder",
588
+ vendor: "openai",
589
+ rawNames: ["openai-mcp (Agent Builder)"]
590
+ },
591
+ {
592
+ id: "openai_other",
593
+ label: "OpenAI Other",
594
+ vendor: "openai",
595
+ rawNames: ["openai-mcp"]
596
+ },
597
+ {
598
+ id: "cursor",
599
+ label: "Cursor",
600
+ vendor: "cursor",
601
+ rawNames: [
602
+ "cursor-vscode",
603
+ "Cursor",
604
+ "cursor"
605
+ ]
606
+ },
607
+ {
608
+ id: "cline",
609
+ label: "Cline",
610
+ vendor: "cline",
611
+ rawNames: [
612
+ "Cline",
613
+ "cline",
614
+ "@cline/core"
615
+ ]
616
+ },
617
+ {
618
+ id: "github_copilot",
619
+ label: "GitHub Copilot",
620
+ vendor: "githubCopilot",
621
+ rawNames: [
622
+ "Copilot",
623
+ "github-copilot-developer",
624
+ "Copilot MCP Gateway",
625
+ "Xcode/copilot-xcode"
626
+ ]
627
+ },
628
+ {
629
+ id: "gemini_cli",
630
+ label: "Gemini CLI",
631
+ vendor: "google",
632
+ rawNames: ["gemini-cli-mcp-client", "gemini-cli"]
633
+ },
634
+ {
635
+ id: "antigravity",
636
+ label: "Antigravity",
637
+ vendor: "google",
638
+ rawNames: ["antigravity-client"]
639
+ },
640
+ {
641
+ id: "gemini",
642
+ label: "Gemini",
643
+ vendor: "google",
644
+ rawNames: ["Gemini", "google-ai-edge-gallery"]
645
+ },
646
+ {
647
+ id: "windsurf",
648
+ label: "Windsurf",
649
+ vendor: "windsurf",
650
+ rawNames: ["Windsurf", "windsurf-client"]
651
+ },
652
+ {
653
+ id: "mistral",
654
+ label: "Mistral / Le Chat",
655
+ vendor: "mistral",
656
+ rawNames: ["Mistral"],
657
+ rawNamePrefixes: ["connector:custom-mcp:"]
658
+ },
659
+ {
660
+ id: "n8n",
661
+ label: "n8n",
662
+ vendor: "n8n",
663
+ rawNames: [
664
+ "@n8n/n8n-nodes-langchain.mcpClient",
665
+ "@n8n/n8n-nodes-langchain.mcpClientTool",
666
+ "n8n"
667
+ ]
668
+ },
669
+ {
670
+ id: "alpic_playground",
671
+ label: "Alpic Playground",
672
+ vendor: "alpic",
673
+ rawNames: ["alpic-playground", "playground"]
674
+ },
675
+ {
676
+ id: "opencode",
677
+ label: "opencode",
678
+ vendor: "opencode",
679
+ rawNames: ["opencode"]
680
+ },
681
+ {
682
+ id: "zed",
683
+ label: "Zed",
684
+ vendor: "zed",
685
+ rawNames: ["Zed", "zed"]
686
+ },
687
+ {
688
+ id: "zapier",
689
+ label: "Zapier",
690
+ vendor: "zapier",
691
+ rawNames: ["Zapier", "zapier"]
692
+ },
693
+ {
694
+ id: "make",
695
+ label: "Make",
696
+ vendor: "make",
697
+ rawNames: ["Make", "make"]
698
+ },
699
+ {
700
+ id: "librechat",
701
+ label: "LibreChat",
702
+ vendor: "mcp",
703
+ rawNames: ["LibreChat", "librechat"]
704
+ },
705
+ {
706
+ id: "jan",
707
+ label: "Jan",
708
+ vendor: "mcp",
709
+ rawNames: ["Jan", "jan"]
710
+ },
711
+ {
712
+ id: "goose",
713
+ label: "goose",
714
+ vendor: "mcp",
715
+ rawNames: ["goose", "Goose"]
716
+ },
717
+ {
718
+ id: "mcphost",
719
+ label: "mcphost",
720
+ vendor: "mcp",
721
+ rawNames: ["mcphost"]
722
+ },
723
+ {
724
+ id: "mcporter",
725
+ label: "mcporter",
726
+ vendor: "mcp",
727
+ rawNames: ["mcporter"]
728
+ },
729
+ {
730
+ id: "rmcp",
731
+ label: "rmcp",
732
+ vendor: "mcp",
733
+ rawNames: ["rmcp"]
734
+ },
735
+ {
736
+ id: "unnamed_client",
737
+ label: "Unnamed client",
738
+ vendor: "mcp",
739
+ rawNames: [
740
+ "mcp",
741
+ "unknown",
742
+ ""
743
+ ]
744
+ }
745
+ ];
746
+ /** A source pattern, not a RegExp, because analytics renders the same rule into ClickHouse RE2, which shares this syntax. */
747
+ const MCP_REMOTE_WRAPPER_SUFFIX = String.raw` \(via mcp-remote [^\n]+?\)$`;
748
+ new RegExp(MCP_REMOTE_WRAPPER_SUFFIX);
749
+ new Map(MCP_CLIENT_GROUPS.map((group) => [group.id, group]));
491
750
  const runtimeSchema = z.enum([
492
751
  "python3.13",
493
752
  "python3.14",
@@ -522,6 +781,10 @@ const domainFailureReasonSchema = z.enum([
522
781
  "invalid_domain",
523
782
  "other"
524
783
  ]);
784
+ const projectDomainMappingSchema = z.object({
785
+ pathPrefix: z.string(),
786
+ environment: environmentSchema$1
787
+ });
525
788
  z.object({
526
789
  name: z.string(),
527
790
  createdAt: z.coerce.date(),
@@ -531,7 +794,8 @@ z.object({
531
794
  "failed"
532
795
  ]),
533
796
  failureReason: domainFailureReasonSchema.nullable(),
534
- environment: environmentSchema$1
797
+ environment: environmentSchema$1,
798
+ mappings: z.array(projectDomainMappingSchema)
535
799
  });
536
800
  const serverFieldsSchema$1 = z.object({
537
801
  $schema: z.string(),
@@ -560,15 +824,7 @@ z.object({
560
824
  serverFields: serverFieldsSchema$1,
561
825
  source: z.enum(["registry", "defaults"])
562
826
  });
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
- */
827
+ /** 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
828
  const clampStringField = (field) => {
573
829
  const max = field.maxLength;
574
830
  if (max === null) return field;
@@ -595,8 +851,9 @@ const positiveTestCaseSchema = z.object({
595
851
  }).partial().describe("Each case: Scenario, User prompt, Tool triggered, Expected output.");
596
852
  const screenshotEntrySchema = z.object({
597
853
  prompt: z.string(),
598
- url: z.url().or(z.literal(""))
854
+ url: z.url()
599
855
  }).describe("Each screenshot: the user prompt that produced it + the image URL.");
856
+ const screenshotDraftEntrySchema = screenshotEntrySchema.extend({ url: z.string() });
600
857
  /** Accepts either a valid email or URL. */
601
858
  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
859
  /** A URL field whose error spells out that the scheme is required. */
@@ -913,11 +1170,7 @@ const chatgptToolJustificationSchema = z.object({
913
1170
  openWorldJustification: z.string().describe("One sentence on whether the tool reaches external systems beyond your own service."),
914
1171
  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
1172
  }).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
- */
1173
+ /** Defined once and reused by both the submission form and per-locale translations so the tagline ≤ 30 chars constraint never drifts. */
921
1174
  const chatgptTaglineSchema = z.string().max(30);
922
1175
  const chatgptDescriptionSchema = z.string();
923
1176
  const chatgptTranslationSchema = z.object({
@@ -926,10 +1179,7 @@ const chatgptTranslationSchema = z.object({
926
1179
  description: chatgptDescriptionSchema
927
1180
  }).describe("Locale-scoped override for tagline + description. English (US) is the default.");
928
1181
  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
- */
1182
+ /** Field order mirrors the ChatGPT (OpenAI) submission spreadsheet, grouped by section; keep it in sync with the sheet. */
933
1183
  const chatgptSubmissionFormDataSchema = z.object({
934
1184
  logoLight: z.string().describe("Logo icon for light mode. Square PNG, no borders or rounded corners (clients apply circular cropping)."),
935
1185
  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 +1205,17 @@ const chatgptSubmissionFormDataSchema = z.object({
955
1205
  allowedCountries: chatgptAllowedCountriesSchema.describe("Availability: all supported countries, or an allow-list / block-list of specific ones (ISO alpha-2)."),
956
1206
  releaseNotes: z.string().describe("Publicly displayed on the app details page.")
957
1207
  });
1208
+ const chatgptSubmissionDraftSchema = chatgptSubmissionFormDataSchema.partial().extend({
1209
+ tagline: z.string().optional(),
1210
+ companyUrl: z.string().optional(),
1211
+ supportChannel: z.string().optional(),
1212
+ privacyPolicyUrl: z.string().optional(),
1213
+ termsOfServiceUrl: z.string().optional(),
1214
+ demoRecordingUrl: z.string().optional(),
1215
+ serverUrl: z.string().optional(),
1216
+ screenshots: z.array(screenshotDraftEntrySchema).optional(),
1217
+ translations: z.array(chatgptTranslationSchema.extend({ tagline: z.string() })).optional()
1218
+ });
958
1219
  chatgptSubmissionFormDataSchema.pick({
959
1220
  appName: true,
960
1221
  developerName: true,
@@ -1015,11 +1276,7 @@ const claudePolicyAcknowledgementSchema = z.enum([
1015
1276
  "My connector does not collect conversation data beyond what is needed for its function.",
1016
1277
  "Public documentation for this connector will be live by the publish date."
1017
1278
  ]);
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
- */
1279
+ /** 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
1280
  const claudeSubmissionFormDataSchema = z.object({
1024
1281
  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
1282
  from the custom connector you select — the connection is used to verify the URL and the tool list at submission time.
@@ -1081,6 +1338,21 @@ fully populated account.`),
1081
1338
  submission. Each is an attestation you are legally agreeing to by submitting.`),
1082
1339
  additionalNotes: z.string().optional().describe("Anything else the review team should know about your connector. Optional.")
1083
1340
  });
1341
+ const claudeSubmissionDraftSchema = claudeSubmissionFormDataSchema.partial().extend({
1342
+ serverUrl: z.string().optional(),
1343
+ name: z.string().optional(),
1344
+ slug: z.string().optional(),
1345
+ oneLiner: z.string().optional(),
1346
+ description: z.string().optional(),
1347
+ iconUrl: z.string().optional(),
1348
+ documentation: z.string().optional(),
1349
+ support: z.string().optional(),
1350
+ privacyPolicy: z.string().optional(),
1351
+ companyWebsite: z.string().optional(),
1352
+ primaryContactEmail: z.string().optional(),
1353
+ categories: z.array(claudeCategorySchema).optional(),
1354
+ screenshots: z.array(screenshotDraftEntrySchema).optional()
1355
+ });
1084
1356
  claudeSubmissionFormDataSchema.pick({
1085
1357
  serverUrl: true,
1086
1358
  name: true,
@@ -1096,12 +1368,7 @@ claudeSubmissionFormDataSchema.pick({
1096
1368
  connectionRequirements: claudeSubmissionFormDataSchema.shape.connectionRequirements.optional(),
1097
1369
  testInstructions: claudeSubmissionFormDataSchema.shape.testInstructions.optional()
1098
1370
  });
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
- */
1371
+ /** Loose shape returned by AI generation for Claude narrative fields; transforms live here so generation leniency stays colocated with the Claude contract. */
1105
1372
  const claudeAiGeneratedFormDataRawSchema = z.object({
1106
1373
  oneLiner: claudeSubmissionFormDataSchema.shape.oneLiner,
1107
1374
  description: claudeSubmissionFormDataSchema.shape.description,
@@ -1121,14 +1388,14 @@ const submissionMetaFieldsSchema = z.object({
1121
1388
  });
1122
1389
  const claudeSubmissionSchemaInternal = submissionMetaFieldsSchema.extend({
1123
1390
  platform: z.literal("claudeai"),
1124
- formData: claudeSubmissionFormDataSchema.partial()
1391
+ formData: claudeSubmissionDraftSchema
1125
1392
  });
1126
1393
  const chatgptSubmissionSchemaInternal = submissionMetaFieldsSchema.extend({
1127
1394
  platform: z.literal("chatgpt"),
1128
- formData: chatgptSubmissionFormDataSchema.partial()
1395
+ formData: chatgptSubmissionDraftSchema
1129
1396
  });
1130
1397
  z.discriminatedUnion("platform", [claudeSubmissionSchemaInternal, chatgptSubmissionSchemaInternal]);
1131
- z.union([claudeSubmissionFormDataSchema.partial(), chatgptSubmissionFormDataSchema.partial()]);
1398
+ z.union([claudeSubmissionDraftSchema, chatgptSubmissionDraftSchema]);
1132
1399
  const subscriptionPlanSchema = z.enum([
1133
1400
  "pro",
1134
1401
  "business",
@@ -1193,7 +1460,10 @@ const RESERVED_KEYS = [
1193
1460
  "BUILD_ARG_START_COMMAND",
1194
1461
  "ALPIC_HOST",
1195
1462
  "ALPIC_CUSTOM_DOMAINS",
1196
- "ALPIC_INTENT_META_KEY"
1463
+ "ALPIC_INTENT_META_KEY",
1464
+ "ALPIC_FEEDBACK_META_KEY",
1465
+ "ALPIC_EVENTS_META_KEY",
1466
+ "ALPIC_IDENTIFY_META_KEY"
1197
1467
  ];
1198
1468
  const environmentVariableSchema = z.object({
1199
1469
  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"),
@@ -1509,10 +1779,12 @@ const deployEnvironmentContractV1 = oc.route({
1509
1779
  successDescription: "The environment has been deployed successfully"
1510
1780
  }).errors({
1511
1781
  NOT_FOUND: {},
1512
- BAD_REQUEST: {}
1782
+ BAD_REQUEST: {},
1783
+ CONFLICT: {}
1513
1784
  }).input(z.object({
1514
1785
  environmentId: z.string().describe("The ID of the environment to deploy"),
1515
- token: z.string().describe("The token to identify the source archive").optional()
1786
+ token: z.string().describe("The token to identify the source archive").optional(),
1787
+ 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
1788
  })).output(deploymentSchema);
1517
1789
  const uploadDeploymentArtifactContractV1 = oc.route({
1518
1790
  path: "/v1/deployments/upload",
@@ -1549,6 +1821,21 @@ const getDeploymentContractV1 = oc.route({
1549
1821
  tags: ["deployments"],
1550
1822
  successDescription: "The deployment details"
1551
1823
  }).errors({ NOT_FOUND: {} }).input(z.object({ deploymentId: z.string().describe("The ID of the deployment") })).output(deploymentSchema);
1824
+ const logEntrySchema = z.object({
1825
+ timestamp: z.coerce.date(),
1826
+ type: z.enum([
1827
+ "START",
1828
+ "END",
1829
+ "INFO",
1830
+ "ERROR",
1831
+ "WARNING",
1832
+ "DEBUG"
1833
+ ]),
1834
+ requestId: z.string(),
1835
+ content: z.string().optional(),
1836
+ method: z.string().optional(),
1837
+ durationInMs: z.number().optional()
1838
+ });
1552
1839
  const getLogsContractV1 = oc.route({
1553
1840
  path: "/v1/environments/{environmentId}/logs",
1554
1841
  method: "GET",
@@ -1573,21 +1860,7 @@ const getLogsContractV1 = oc.route({
1573
1860
  search: z.string().optional().describe("Filter pattern to search for in log content"),
1574
1861
  nextToken: z.string().optional().describe("Pagination token from a previous response")
1575
1862
  })).output(z.object({
1576
- logs: z.array(z.object({
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
- })),
1863
+ logs: z.array(logEntrySchema),
1591
1864
  nextToken: z.string().nullable()
1592
1865
  }));
1593
1866
  const getLatestLogsContractV1 = oc.route({
@@ -1610,21 +1883,7 @@ const getLatestLogsContractV1 = oc.route({
1610
1883
  "DEBUG"
1611
1884
  ])).optional().describe("Filter by log level"),
1612
1885
  search: z.string().optional().describe("Filter pattern to search for in log content")
1613
- })).output(z.object({ logs: z.array(z.object({
1614
- timestamp: z.coerce.date(),
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
- })) }));
1886
+ })).output(z.object({ logs: z.array(logEntrySchema) }));
1628
1887
  const getDeploymentLogsContractV1 = oc.route({
1629
1888
  path: "/v1/deployments/{deploymentId}/logs",
1630
1889
  method: "GET",
@@ -1850,5 +2109,10 @@ const contract = {
1850
2109
  get: { v1: getBeaconContractV1 }
1851
2110
  }
1852
2111
  };
2112
+ const { uploadArtifact: _discard, ...deploymentsForDocs } = contract.deployments;
2113
+ const contractForDocs = {
2114
+ ...contract,
2115
+ deployments: deploymentsForDocs
2116
+ };
1853
2117
  //#endregion
1854
- export { AUTH_SCOPE_ANY, AUTH_SCOPE_USER, PLATFORM_LABELS, buildSettingsSchema, contract, createEnvironmentContractV1, deploymentStatusSchema, environmentVariableSchema, environmentVariablesSchema, playgroundExamplePromptSchema, playgroundHeaderSchema, runtimeSchema, serverFieldsSchema, transportSchema, updateEnvironmentVariableSchema };
2118
+ export { AUTH_SCOPE_ANY, AUTH_SCOPE_USER, PLATFORM_LABELS, buildSettingsSchema, contract, contractForDocs, createEnvironmentContractV1, deploymentStatusSchema, environmentVariableSchema, environmentVariablesSchema, playgroundExamplePromptSchema, playgroundHeaderSchema, runtimeSchema, serverFieldsSchema, transportSchema, updateEnvironmentVariableSchema };