@alpic-ai/api 0.0.0-dev.gfb11de8 → 0.0.0-dev.gfbdef08

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
@@ -212,7 +212,7 @@ declare const contract: {
212
212
  name: z.ZodString;
213
213
  sourceBranch: z.ZodNullable<z.ZodString>;
214
214
  mcpServerUrl: z.ZodString;
215
- domains: z.ZodArray<z.ZodURL>;
215
+ domains: z.ZodArray<z.ZodCustomStringFormat<"hostname">>;
216
216
  createdAt: z.ZodCoercedDate<unknown>;
217
217
  projectId: z.ZodString;
218
218
  }, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, {
@@ -831,6 +831,9 @@ declare const contract: {
831
831
  }, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, {
832
832
  NOT_FOUND: {};
833
833
  BAD_REQUEST: {};
834
+ DNS_RESOLUTION_FAILED: {
835
+ status: number;
836
+ };
834
837
  }>, Record<never, never>>;
835
838
  };
836
839
  get: {
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(),
@@ -100,6 +225,12 @@ z.object({
100
225
  createdAt: z.coerce.date(),
101
226
  updatedAt: z.coerce.date()
102
227
  });
228
+ z.enum([
229
+ "INFO",
230
+ "WARNING",
231
+ "DEBUG",
232
+ "ERROR"
233
+ ]);
103
234
  const runtimeSchema = z.enum([
104
235
  "python3.13",
105
236
  "python3.14",
@@ -111,6 +242,60 @@ const transportSchema = z.enum([
111
242
  "sse",
112
243
  "streamablehttp"
113
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
+ });
114
299
  const toolDefinitionSchema = z.object({
115
300
  name: z.string(),
116
301
  title: z.string().optional().describe("Human-friendly name for the tool, used in the UI. If not provided, `name` will be used."),
@@ -128,6 +313,10 @@ const positiveTestCaseSchema = z.object({
128
313
  toolTriggered: z.string().optional(),
129
314
  expectedOutput: z.string().optional()
130
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.");
131
320
  /** Accepts either a valid email or URL. */
132
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" });
133
322
  const chatgptCategorySchema = z.enum([
@@ -168,7 +357,7 @@ const chatgptTranslationSchema = z.object({
168
357
  */
169
358
  const chatgptSubmissionFormDataSchema = z.object({
170
359
  logoLight: z.string().describe("Logo icon for light mode. Square PNG, no borders or rounded corners (clients apply circular cropping)."),
171
- 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."),
172
361
  appName: z.string().describe("The name users will see in ChatGPT and in the Apps Directory."),
173
362
  tagline: z.string().max(30).describe("Plain-language phrase focused on function and user value. 30 chars max."),
174
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."),
@@ -186,7 +375,7 @@ const chatgptSubmissionFormDataSchema = z.object({
186
375
  toolJustifications: z.array(chatgptToolJustificationSchema).describe("Per-tool justification of `readOnlyHint`, `openWorldHint`, and `destructiveHint` annotation values."),
187
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."),
188
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."),
189
- 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."),
190
379
  translations: z.array(chatgptTranslationSchema).describe("Per-locale translation of tagline + description. English (US) is the default."),
191
380
  allowedCountries: chatgptAllowedCountriesSchema.describe("'Allow all' or restrict to a specific list. See OpenAI's supported countries list."),
192
381
  releaseNotes: z.string().describe("Publicly displayed on the app details page.")
@@ -366,19 +555,20 @@ Reviewers test every single tool you list here — don't list tools that don't w
366
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).
367
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).
368
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.`),
369
- 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:
370
559
  • Format: SVG only
371
560
  • Aspect ratio: square (1:1)
372
- • Should work on both light and dark backgrounds (or you can provide separate light/dark versions)
561
+ • Should work on a light background
373
562
  • Provide via URL (Google Drive link is fine) or upload directly
374
563
  Tip: use a simple, recognizable icon — not a full wordmark. The logo appears at small sizes in the directory grid.`),
375
- 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:
376
566
  • 3–5 images is ideal
377
567
  • Minimum 1000px width, PNG format preferred
568
+ • Each screenshot is paired with the user prompt that produced it
378
569
  • Crop to just the relevant part of the Claude interface (the tool response area)
379
570
  • Show your connector doing something impressive and useful — real data, real results
380
571
  • If you're an MCP App, include screenshots of your interactive UI elements
381
- • Videos are also welcome
382
572
  These images appear in your directory listing and are a key factor in driving user installs.`)
383
573
  });
384
574
  claudeSubmissionFormDataSchema.pick({
@@ -421,6 +611,22 @@ const subscriptionPlanSchema = z.enum([
421
611
  "enterprise"
422
612
  ]);
423
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
+ });
424
630
  //#endregion
425
631
  //#region src/schemas.ts
426
632
  const RESERVED_KEYS = [
@@ -577,7 +783,7 @@ const getEnvironmentContractV1 = oc.route({
577
783
  name: z.string(),
578
784
  sourceBranch: z.string().nullable(),
579
785
  mcpServerUrl: z.string(),
580
- domains: z.array(z.url()),
786
+ domains: z.array(z.hostname()),
581
787
  createdAt: z.coerce.date(),
582
788
  projectId: z.string()
583
789
  }));
@@ -1026,7 +1232,7 @@ const upsertPlaygroundContractV1 = oc.route({
1026
1232
  name: z.string().min(1).max(100).optional(),
1027
1233
  description: z.string().min(1).max(500).optional(),
1028
1234
  headers: z.array(playgroundHeaderSchema).optional(),
1029
- examplePrompts: z.array(playgroundExamplePromptSchema).max(3).optional()
1235
+ examplePrompts: z.array(playgroundExamplePromptSchema).max(5).optional()
1030
1236
  })).output(playgroundOutputSchema);
1031
1237
  const createBeaconContractV1 = oc.route({
1032
1238
  path: "/v1/beacon/audits",
@@ -1037,7 +1243,8 @@ const createBeaconContractV1 = oc.route({
1037
1243
  successDescription: "The audit has been created"
1038
1244
  }).errors({
1039
1245
  NOT_FOUND: {},
1040
- BAD_REQUEST: {}
1246
+ BAD_REQUEST: {},
1247
+ DNS_RESOLUTION_FAILED: { status: 400 }
1041
1248
  }).input(z.object({
1042
1249
  targetUrl: z.url().describe("The HTTPS URL of the MCP server to audit"),
1043
1250
  teamId: z.string().optional().describe("The team ID to associate the audit with"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alpic-ai/api",
3
- "version": "0.0.0-dev.gfb11de8",
3
+ "version": "0.0.0-dev.gfbdef08",
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": {