@alpic-ai/api 0.0.0-dev.gffa23ba → 0.0.0-dev.gffb860b

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 CHANGED
@@ -29,7 +29,7 @@ declare const createEnvironmentContractV1: _$_orpc_contract0.ContractProcedureBu
29
29
  id: z.ZodString;
30
30
  name: z.ZodString;
31
31
  sourceBranch: z.ZodNullable<z.ZodString>;
32
- urls: z.ZodArray<z.ZodString>;
32
+ urls: z.ZodArray<z.ZodURL>;
33
33
  createdAt: z.ZodCoercedDate<unknown>;
34
34
  projectId: z.ZodString;
35
35
  }, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, {
@@ -165,7 +165,10 @@ declare const contract: {
165
165
  uploadUrl: z.ZodURL;
166
166
  token: z.ZodString;
167
167
  expiresAt: z.ZodCoercedDate<unknown>;
168
- }, z.core.$strip>, Record<never, never>, Record<never, never>>;
168
+ }, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, {
169
+ NOT_FOUND: {};
170
+ BAD_REQUEST: {};
171
+ }>, Record<never, never>>;
169
172
  };
170
173
  getLogs: {
171
174
  v1: _$_orpc_contract0.ContractProcedureBuilderWithInputOutput<z.ZodObject<{
@@ -196,7 +199,7 @@ declare const contract: {
196
199
  id: z.ZodString;
197
200
  name: z.ZodString;
198
201
  sourceBranch: z.ZodNullable<z.ZodString>;
199
- urls: z.ZodArray<z.ZodString>;
202
+ urls: z.ZodArray<z.ZodURL>;
200
203
  createdAt: z.ZodCoercedDate<unknown>;
201
204
  projectId: z.ZodString;
202
205
  }, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, {
@@ -212,7 +215,7 @@ declare const contract: {
212
215
  name: z.ZodString;
213
216
  sourceBranch: z.ZodNullable<z.ZodString>;
214
217
  mcpServerUrl: z.ZodString;
215
- domains: z.ZodArray<z.ZodURL>;
218
+ domains: z.ZodArray<z.ZodCustomStringFormat<"hostname">>;
216
219
  createdAt: z.ZodCoercedDate<unknown>;
217
220
  projectId: z.ZodString;
218
221
  }, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, {
@@ -365,6 +368,7 @@ declare const contract: {
365
368
  success: z.ZodLiteral<true>;
366
369
  }, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, {
367
370
  NOT_FOUND: {};
371
+ BAD_REQUEST: {};
368
372
  }>, Record<never, never>>;
369
373
  };
370
374
  };
@@ -593,7 +597,10 @@ declare const contract: {
593
597
  completedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
594
598
  }, z.core.$strip>>;
595
599
  }, z.core.$strip>>;
596
- }, z.core.$strip>>, Record<never, never>, Record<never, never>>;
600
+ }, z.core.$strip>>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, {
601
+ NOT_FOUND: {};
602
+ BAD_REQUEST: {};
603
+ }>, Record<never, never>>;
597
604
  };
598
605
  create: {
599
606
  v1: _$_orpc_contract0.ContractProcedureBuilderWithInputOutput<z.ZodObject<{
@@ -737,7 +744,9 @@ declare const contract: {
737
744
  subdomain: z.ZodString;
738
745
  ticket: z.ZodString;
739
746
  tunnelHost: z.ZodString;
740
- }, z.core.$strip>, Record<never, never>, Record<never, never>>;
747
+ }, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, {
748
+ FORBIDDEN: {};
749
+ }>, Record<never, never>>;
741
750
  };
742
751
  };
743
752
  distribution: {
package/dist/index.mjs CHANGED
@@ -71,7 +71,7 @@ const auditReportWithScreenshotsSchema = auditReportSchema.extend({ widgetScreen
71
71
  chatgpt: widgetScreenshotSchema.optional(),
72
72
  claudeai: widgetScreenshotSchema.optional()
73
73
  }) });
74
- z.enum([
74
+ const deploymentStatusSchema$1 = z.enum([
75
75
  "ongoing",
76
76
  "deployed",
77
77
  "failed",
@@ -81,6 +81,51 @@ z.object({
81
81
  timestamp: z.coerce.date().optional(),
82
82
  content: z.string().optional()
83
83
  });
84
+ const deploymentSummarySchema = z.object({
85
+ id: z.string(),
86
+ status: deploymentStatusSchema$1,
87
+ sourceBucket: z.string().nullable(),
88
+ sourceObjectKey: z.string().nullable(),
89
+ sourceRef: z.string().nullable(),
90
+ sourceCommitId: z.string().nullable(),
91
+ sourceCommitMessage: z.string().nullable(),
92
+ environmentId: z.string(),
93
+ authorUsername: z.string().nullable(),
94
+ authorAvatarUrl: z.string().nullable(),
95
+ startedAt: z.coerce.date().nullable(),
96
+ completedAt: z.coerce.date().nullable(),
97
+ isCurrent: z.boolean().optional(),
98
+ createdAt: z.coerce.date(),
99
+ updatedAt: z.coerce.date()
100
+ });
101
+ const allowedPlatformSchema = platformSchema;
102
+ const environmentDomainSchema = z.object({
103
+ domain: z.string(),
104
+ status: z.enum([
105
+ "ongoing",
106
+ "deployed",
107
+ "failed"
108
+ ]),
109
+ createdAt: z.coerce.date(),
110
+ updatedAt: z.coerce.date()
111
+ });
112
+ const environmentSchema$1 = z.object({
113
+ id: z.string(),
114
+ name: z.string(),
115
+ sourceBranch: z.string().nullable(),
116
+ mcpServerUrl: z.string(),
117
+ activeDeployment: deploymentSummarySchema.optional(),
118
+ latestDeployment: deploymentSummarySchema.optional(),
119
+ openaiAppsChallenge: z.string().nullable().optional(),
120
+ isPlaygroundEnabled: z.boolean(),
121
+ isIpWhitelistEnabled: z.boolean(),
122
+ ipAllowlist: z.array(z.string()).nullable(),
123
+ allowedPlatforms: z.array(allowedPlatformSchema),
124
+ projectId: z.string(),
125
+ createdAt: z.coerce.date(),
126
+ updatedAt: z.coerce.date()
127
+ });
128
+ const environmentWithDomainsSchema = environmentSchema$1.extend({ domains: z.array(environmentDomainSchema) });
84
129
  z.object({
85
130
  id: z.string(),
86
131
  createdAt: z.coerce.date(),
@@ -92,6 +137,86 @@ z.object({
92
137
  content: z.string(),
93
138
  source: z.enum(["model", "user"])
94
139
  });
140
+ const intentCategoryColorSchema = z.enum([
141
+ "red",
142
+ "orange",
143
+ "yellow",
144
+ "green",
145
+ "blue",
146
+ "purple",
147
+ "pink",
148
+ "gray"
149
+ ]);
150
+ intentCategoryColorSchema.options;
151
+ const intentCategorySchema = z.object({
152
+ id: z.string(),
153
+ createdAt: z.coerce.date(),
154
+ environmentId: z.string(),
155
+ name: z.string(),
156
+ color: intentCategoryColorSchema
157
+ });
158
+ z.object({
159
+ id: z.string(),
160
+ name: z.string(),
161
+ color: intentCategoryColorSchema,
162
+ intentCount: z.number().int().nonnegative()
163
+ });
164
+ z.object({
165
+ id: z.string(),
166
+ createdAt: z.coerce.date(),
167
+ environmentId: z.string(),
168
+ toolName: z.string(),
169
+ message: z.string(),
170
+ categories: z.array(intentCategorySchema)
171
+ });
172
+ const signalCategorySchema = z.object({
173
+ id: z.string(),
174
+ name: z.string(),
175
+ color: intentCategoryColorSchema
176
+ });
177
+ z.discriminatedUnion("kind", [
178
+ z.object({
179
+ kind: z.literal("new"),
180
+ category: signalCategorySchema,
181
+ currentCount: z.number().int().nonnegative(),
182
+ currentShare: z.number()
183
+ }),
184
+ z.object({
185
+ kind: z.literal("resurging"),
186
+ category: signalCategorySchema,
187
+ currentCount: z.number().int().nonnegative(),
188
+ daysQuiet: z.number(),
189
+ currentShare: z.number()
190
+ }),
191
+ z.object({
192
+ kind: z.literal("spike"),
193
+ category: signalCategorySchema,
194
+ currentCount: z.number().int().nonnegative(),
195
+ previousCount: z.number().int().nonnegative(),
196
+ currentShare: z.number(),
197
+ previousShare: z.number(),
198
+ changeRatio: z.number()
199
+ }),
200
+ z.object({
201
+ kind: z.literal("declining"),
202
+ category: signalCategorySchema,
203
+ currentCount: z.number().int().nonnegative(),
204
+ previousCount: z.number().int().nonnegative(),
205
+ currentShare: z.number(),
206
+ previousShare: z.number(),
207
+ changeRatio: z.number()
208
+ })
209
+ ]);
210
+ z.discriminatedUnion("kind", [z.object({
211
+ kind: z.literal("existing"),
212
+ categoryId: z.string(),
213
+ categoryName: z.string(),
214
+ intentIds: z.array(z.string())
215
+ }), z.object({
216
+ kind: z.literal("new"),
217
+ categoryName: z.string(),
218
+ intentIds: z.array(z.string())
219
+ })]);
95
220
  z.object({
96
221
  id: z.string(),
97
222
  teamId: z.string(),
@@ -117,6 +242,60 @@ const transportSchema = z.enum([
117
242
  "sse",
118
243
  "streamablehttp"
119
244
  ]);
245
+ z.object({
246
+ id: z.string(),
247
+ name: z.string(),
248
+ teamId: z.string(),
249
+ sourceRepository: z.string().nullable(),
250
+ createdAt: z.coerce.date().optional(),
251
+ runtime: runtimeSchema,
252
+ transport: transportSchema.nullable(),
253
+ rootDirectory: z.string().nullable(),
254
+ installCommand: z.string().nullable(),
255
+ buildCommand: z.string().nullable(),
256
+ buildOutputDir: z.string().nullable(),
257
+ startCommand: z.string().nullable(),
258
+ fixedOutboundIp: z.boolean(),
259
+ environments: z.array(environmentWithDomainsSchema),
260
+ productionEnvironment: environmentWithDomainsSchema.nullable()
261
+ });
262
+ z.object({
263
+ domain: z.string(),
264
+ createdAt: z.coerce.date(),
265
+ status: z.enum([
266
+ "ongoing",
267
+ "deployed",
268
+ "failed"
269
+ ]),
270
+ environment: environmentSchema$1
271
+ });
272
+ const serverFieldsSchema$1 = z.object({
273
+ $schema: z.string(),
274
+ name: z.string(),
275
+ description: z.string(),
276
+ version: z.string().optional(),
277
+ title: z.string().optional(),
278
+ websiteUrl: z.string().optional(),
279
+ icons: z.array(z.object({
280
+ src: z.string(),
281
+ mimeType: z.string().optional(),
282
+ sizes: z.array(z.string()).optional()
283
+ })).optional(),
284
+ remotes: z.array(z.object({
285
+ type: z.string(),
286
+ url: z.string().optional(),
287
+ headers: z.array(z.object({
288
+ name: z.string(),
289
+ description: z.string(),
290
+ isRequired: z.boolean().optional(),
291
+ isSecret: z.boolean().optional()
292
+ })).optional()
293
+ })).optional()
294
+ }).catchall(z.unknown());
295
+ z.object({
296
+ serverFields: serverFieldsSchema$1,
297
+ source: z.enum(["registry", "defaults"])
298
+ });
120
299
  const toolDefinitionSchema = z.object({
121
300
  name: z.string(),
122
301
  title: z.string().optional().describe("Human-friendly name for the tool, used in the UI. If not provided, `name` will be used."),
@@ -134,6 +313,10 @@ const positiveTestCaseSchema = z.object({
134
313
  toolTriggered: z.string().optional(),
135
314
  expectedOutput: z.string().optional()
136
315
  }).partial().describe("Each case: Scenario, User prompt, Tool triggered, Expected output.");
316
+ const screenshotEntrySchema = z.object({
317
+ prompt: z.string(),
318
+ url: z.url()
319
+ }).describe("Each screenshot: the user prompt that produced it + the image URL.");
137
320
  /** Accepts either a valid email or URL. */
138
321
  const supportChannelSchema = z.string().refine((value) => z.email().safeParse(value).success || z.url().safeParse(value).success, { error: "Must be a valid email or URL" });
139
322
  const chatgptCategorySchema = z.enum([
@@ -174,7 +357,7 @@ const chatgptTranslationSchema = z.object({
174
357
  */
175
358
  const chatgptSubmissionFormDataSchema = z.object({
176
359
  logoLight: z.string().describe("Logo icon for light mode. Square PNG, no borders or rounded corners (clients apply circular cropping)."),
177
- logoDark: z.string().describe("Logo icon for dark mode. Square PNG. Same specs as the light icon."),
360
+ 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."),
178
361
  appName: z.string().describe("The name users will see in ChatGPT and in the Apps Directory."),
179
362
  tagline: z.string().max(30).describe("Plain-language phrase focused on function and user value. 30 chars max."),
180
363
  description: z.string().describe("Clear, engaging description highlighting what the app does and why people will love it. Appears publicly on the directory page."),
@@ -192,7 +375,7 @@ const chatgptSubmissionFormDataSchema = z.object({
192
375
  toolJustifications: z.array(chatgptToolJustificationSchema).describe("Per-tool justification of `readOnlyHint`, `openWorldHint`, and `destructiveHint` annotation values."),
193
376
  testCases: z.array(positiveTestCaseSchema).describe("At least 5 positive test cases. Each: Scenario, User prompt, Tool triggered, Expected output. Coverage over all major use cases."),
194
377
  negativeTestCases: z.array(negativeTestCaseSchema).describe("3 negative test cases — prompts where the app should NOT trigger but the model might think it's relevant."),
195
- screenshots: z.array(z.url()).describe("URLs of in-app screenshots. Widget apps must show the widget UI; non-widget apps show the model response. Min 1, max 4. First three are public."),
378
+ screenshots: z.array(screenshotEntrySchema).describe("In-app screenshots paired with the user prompt that produced them. Widget apps must show the widget UI; non-widget apps show the model response. Min 1, max 4 entries. First three are public. Images: 706px wide, 400–860px tall, PNG."),
196
379
  translations: z.array(chatgptTranslationSchema).describe("Per-locale translation of tagline + description. English (US) is the default."),
197
380
  allowedCountries: chatgptAllowedCountriesSchema.describe("'Allow all' or restrict to a specific list. See OpenAI's supported countries list."),
198
381
  releaseNotes: z.string().describe("Publicly displayed on the app details page.")
@@ -372,19 +555,20 @@ Reviewers test every single tool you list here — don't list tools that don't w
372
555
  • 'I've specified user-friendly titles for all tools' — every tool has a 'title' annotation (a human-readable label, different from the tool name).
373
556
  • 'I've specified accurate tool annotations for all tools' — every tool has the correct annotation: readOnlyHint: true for read operations (search, get, list, fetch), OR destructiveHint: true for write operations (create, update, delete, send).
374
557
  This is the #1 reason submissions get rejected (30% of all rejections). Do not check these boxes without actually having implemented the annotations. See MCP spec for how to add them.`),
375
- logoLight: z.string().describe(`Your connector's logo as displayed in the directory. Requirements:
558
+ logoLight: z.string().describe(`Your connector's logo for light backgrounds. Requirements:
376
559
  • Format: SVG only
377
560
  • Aspect ratio: square (1:1)
378
- • Should work on both light and dark backgrounds (or you can provide separate light/dark versions)
561
+ • Should work on a light background
379
562
  • Provide via URL (Google Drive link is fine) or upload directly
380
563
  Tip: use a simple, recognizable icon — not a full wordmark. The logo appears at small sizes in the directory grid.`),
381
- screenshots: z.array(z.url()).describe(`Screenshots or promotional images of your connector in action within Claude. Strongly recommended for all connectors, and required for MCP Apps (interactive UI). Guidelines:
564
+ logoDark: z.string().optional().describe(`Optional dark-mode variant of the connector logo. Same specs as the light variant (SVG, square 1:1) but designed to read on a dark background. Leave empty if the light logo already works on dark.`),
565
+ screenshots: z.array(screenshotEntrySchema).describe(`Screenshots or promotional images of your connector in action within Claude. Strongly recommended for all connectors, and required for MCP Apps (interactive UI). Guidelines:
382
566
  • 3–5 images is ideal
383
567
  • Minimum 1000px width, PNG format preferred
568
+ • Each screenshot is paired with the user prompt that produced it
384
569
  • Crop to just the relevant part of the Claude interface (the tool response area)
385
570
  • Show your connector doing something impressive and useful — real data, real results
386
571
  • If you're an MCP App, include screenshots of your interactive UI elements
387
- • Videos are also welcome
388
572
  These images appear in your directory listing and are a key factor in driving user installs.`)
389
573
  });
390
574
  claudeSubmissionFormDataSchema.pick({
@@ -427,6 +611,22 @@ const subscriptionPlanSchema = z.enum([
427
611
  "enterprise"
428
612
  ]);
429
613
  z.object({ plan: subscriptionPlanSchema.nullable() });
614
+ const customerCreditsSchema = z.object({
615
+ balanceInCents: z.number(),
616
+ expiresAt: z.number().nullable(),
617
+ currency: z.string()
618
+ });
619
+ const customerUsageSchema = z.object({
620
+ amountInCents: z.number(),
621
+ currency: z.string(),
622
+ periodEnd: z.number()
623
+ });
624
+ const partnerDiscountSchema = z.object({ endsAt: z.number() });
625
+ z.object({
626
+ customerCredits: customerCreditsSchema.nullable(),
627
+ customerUsage: customerUsageSchema.nullable(),
628
+ partnerDiscount: partnerDiscountSchema.nullable()
629
+ });
430
630
  //#endregion
431
631
  //#region src/schemas.ts
432
632
  const RESERVED_KEYS = [
@@ -567,7 +767,7 @@ const createEnvironmentContractV1 = oc.route({
567
767
  id: z.string(),
568
768
  name: z.string(),
569
769
  sourceBranch: z.string().nullable().describe("The branch used to build the environment"),
570
- urls: z.array(z.string().url()).describe("The URLs of the MCP server"),
770
+ urls: z.array(z.url()).describe("The URLs of the MCP server"),
571
771
  createdAt: z.coerce.date(),
572
772
  projectId: z.string().describe("The ID of the project the environment belongs to")
573
773
  }));
@@ -583,7 +783,7 @@ const getEnvironmentContractV1 = oc.route({
583
783
  name: z.string(),
584
784
  sourceBranch: z.string().nullable(),
585
785
  mcpServerUrl: z.string(),
586
- domains: z.array(z.url()),
786
+ domains: z.array(z.hostname()),
587
787
  createdAt: z.coerce.date(),
588
788
  projectId: z.string()
589
789
  }));
@@ -643,6 +843,9 @@ const listProjectsContractV1 = oc.route({
643
843
  description: "List all projects for a team",
644
844
  tags: ["projects"],
645
845
  successDescription: "The list of projects"
846
+ }).errors({
847
+ NOT_FOUND: {},
848
+ BAD_REQUEST: {}
646
849
  }).input(z.object({ teamId: z.string().optional() }).optional()).output(z.array(projectOutputSchema));
647
850
  const createProjectContractV1 = oc.route({
648
851
  path: "/v1/projects",
@@ -738,7 +941,10 @@ const deleteEnvironmentVariableContractV1 = oc.route({
738
941
  description: "Delete an environment variable by ID",
739
942
  tags: ["environments"],
740
943
  successDescription: "The environment variable has been deleted successfully"
741
- }).errors({ NOT_FOUND: {} }).input(z.object({ environmentVariableId: z.string().describe("The ID of the environment variable") })).output(z.object({ success: z.literal(true) }));
944
+ }).errors({
945
+ NOT_FOUND: {},
946
+ BAD_REQUEST: {}
947
+ }).input(z.object({ environmentVariableId: z.string().describe("The ID of the environment variable") })).output(z.object({ success: z.literal(true) }));
742
948
  const deleteProjectContractV1 = oc.route({
743
949
  path: "/v1/projects/{projectId}",
744
950
  method: "DELETE",
@@ -783,6 +989,9 @@ const uploadDeploymentArtifactContractV1 = oc.route({
783
989
  description: "Return a presigned S3 URL to upload a deployment artifact",
784
990
  tags: ["deployments"],
785
991
  successDescription: "The presigned upload URL has been generated successfully"
992
+ }).errors({
993
+ NOT_FOUND: {},
994
+ BAD_REQUEST: {}
786
995
  }).input(z.object({ teamId: z.string().optional() }).optional()).output(z.object({
787
996
  uploadUrl: z.url().describe("Presigned S3 URL to upload the source archive with HTTP PUT"),
788
997
  token: z.string().describe("Token to identify the source archive"),
@@ -956,7 +1165,7 @@ const getTunnelTicketContractV1 = oc.route({
956
1165
  description: "Get a signed ticket for establishing a tunnel connection. Requires user authentication (API keys are not supported).",
957
1166
  tags: ["tunnels"],
958
1167
  successDescription: "The tunnel ticket"
959
- }).output(z.object({
1168
+ }).errors({ FORBIDDEN: {} }).output(z.object({
960
1169
  subdomain: z.string().describe("The subdomain assigned to the user"),
961
1170
  ticket: z.string().describe("The signed tunnel ticket"),
962
1171
  tunnelHost: z.string().describe("The tunnel host to connect to")
@@ -1032,7 +1241,7 @@ const upsertPlaygroundContractV1 = oc.route({
1032
1241
  name: z.string().min(1).max(100).optional(),
1033
1242
  description: z.string().min(1).max(500).optional(),
1034
1243
  headers: z.array(playgroundHeaderSchema).optional(),
1035
- examplePrompts: z.array(playgroundExamplePromptSchema).max(3).optional()
1244
+ examplePrompts: z.array(playgroundExamplePromptSchema).max(5).optional()
1036
1245
  })).output(playgroundOutputSchema);
1037
1246
  const createBeaconContractV1 = oc.route({
1038
1247
  path: "/v1/beacon/audits",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alpic-ai/api",
3
- "version": "0.0.0-dev.gffa23ba",
3
+ "version": "0.0.0-dev.gffb860b",
4
4
  "description": "Contract for the Alpic API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -14,15 +14,6 @@
14
14
  "files": [
15
15
  "dist"
16
16
  ],
17
- "nx": {
18
- "targets": {
19
- "build": {
20
- "dependsOn": [
21
- "^build"
22
- ]
23
- }
24
- }
25
- },
26
17
  "author": "Alpic",
27
18
  "license": "ISC",
28
19
  "dependencies": {