@alpic-ai/api 0.0.0-staging.g19c2d9f → 0.0.0-staging.g1c7818f
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 +4 -1
- package/dist/index.mjs +210 -9
- package/package.json +1 -10
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.
|
|
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(),
|
|
@@ -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("
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
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 = [
|
|
@@ -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.
|
|
786
|
+
domains: z.array(z.hostname()),
|
|
587
787
|
createdAt: z.coerce.date(),
|
|
588
788
|
projectId: z.string()
|
|
589
789
|
}));
|
|
@@ -1043,7 +1243,8 @@ const createBeaconContractV1 = oc.route({
|
|
|
1043
1243
|
successDescription: "The audit has been created"
|
|
1044
1244
|
}).errors({
|
|
1045
1245
|
NOT_FOUND: {},
|
|
1046
|
-
BAD_REQUEST: {}
|
|
1246
|
+
BAD_REQUEST: {},
|
|
1247
|
+
DNS_RESOLUTION_FAILED: { status: 400 }
|
|
1047
1248
|
}).input(z.object({
|
|
1048
1249
|
targetUrl: z.url().describe("The HTTPS URL of the MCP server to audit"),
|
|
1049
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-staging.
|
|
3
|
+
"version": "0.0.0-staging.g1c7818f",
|
|
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": {
|