@deksden-com/cpa-kit 0.0.0-stage → 0.1.3
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/NOTICE +1 -0
- package/README.md +27 -2
- package/dist/chunk-T47QB7AC.js +234 -0
- package/dist/chunk-T47QB7AC.js.map +1 -0
- package/dist/client/index.d.ts +35 -0
- package/dist/client/index.js +99 -0
- package/dist/client/index.js.map +1 -0
- package/dist/contracts/index.d.ts +571 -0
- package/dist/contracts/index.js +41 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/server/index.d.ts +317 -0
- package/dist/server/index.js +2271 -0
- package/dist/server/index.js.map +1 -0
- package/package.json +52 -3
package/NOTICE
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
CPA Kit is original integration code. CLIProxyAPI is a separately installed upstream product, not bundled. Dependencies retain their own licenses: zod (MIT), yauzl (MIT). No credentials, runtime data or CPA binary are included.
|
package/README.md
CHANGED
|
@@ -1,3 +1,28 @@
|
|
|
1
|
-
#
|
|
1
|
+
# CPA Kit
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Встраиваемое администрирование CLIProxyAPI, не отдельное приложение и не inference SDK.
|
|
4
|
+
Node.js `>=22.23.2` без верхней границы. ESM; browser-safe contracts/client,
|
|
5
|
+
серверные адаптеры — только через `/server`.
|
|
6
|
+
|
|
7
|
+
Доступен на [npm](https://www.npmjs.com/package/@deksden-com/cpa-kit):
|
|
8
|
+
`pnpm add @deksden-com/cpa-kit`. Токен для установки не требуется.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
import { createCpaAdminClient } from '@deksden-com/cpa-kit/client';
|
|
12
|
+
const client = createCpaAdminClient({
|
|
13
|
+
baseUrl: '/api/cpa', instanceId: 'primary',
|
|
14
|
+
});
|
|
15
|
+
const status = await client.status();
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Это клиент **вашего** защищённого административного API, не прямого CPA endpoint.
|
|
19
|
+
Для cookie mutations передайте `headers: () => ({ 'X-CSRF-Token': token })`.
|
|
20
|
+
На сервере `createCpaManager(config, adapters)` принимает durable store, staging,
|
|
21
|
+
backend и authorization. Import не запускает процесс, worker или таймеры.
|
|
22
|
+
Секреты, маршруты, supervised worker и maintenance/drain принадлежат приложению.
|
|
23
|
+
|
|
24
|
+
- [Индекс документации](https://github.com/deksden-com/dd-cpa-kit/blob/main/docs/index.md): рецепты интеграции и API.
|
|
25
|
+
- [Обновления и соединения](https://github.com/deksden-com/dd-cpa-kit/blob/main/docs/operations.md): безопасная остановка, drain, rollback и cleanup.
|
|
26
|
+
|
|
27
|
+
UI доступен отдельным пакетом `@deksden-com/cpa-kit-react`. Для генерации используйте
|
|
28
|
+
собственный HTTP/AI SDK клиент с endpoint CPA; Kit его не подменяет.
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
// src/contracts/index.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var idSchema = z.string().regex(/^[A-Za-z0-9_.:-]{1,128}$/);
|
|
4
|
+
var errorCodes = [
|
|
5
|
+
"INVALID_INPUT",
|
|
6
|
+
"UNSUPPORTED_CAPABILITY",
|
|
7
|
+
"NOT_AUTHORIZED",
|
|
8
|
+
"REVISION_CONFLICT",
|
|
9
|
+
"IDEMPOTENCY_CONFLICT",
|
|
10
|
+
"KEY_EXPIRED",
|
|
11
|
+
"INSTANCE_BUSY",
|
|
12
|
+
"UPLOAD_LIMIT",
|
|
13
|
+
"ARCHIVE_UNSAFE",
|
|
14
|
+
"CREDENTIAL_INVALID",
|
|
15
|
+
"MANAGEMENT_UNAVAILABLE",
|
|
16
|
+
"DRAIN_TIMEOUT",
|
|
17
|
+
"PROBE_QUOTA_LIMITED",
|
|
18
|
+
"PROBE_FAILED",
|
|
19
|
+
"APPLY_PARTIAL",
|
|
20
|
+
"OUTCOME_UNKNOWN",
|
|
21
|
+
"RECOVERY_REQUIRED",
|
|
22
|
+
"CANCELLED",
|
|
23
|
+
"INTERNAL"
|
|
24
|
+
];
|
|
25
|
+
var states = [
|
|
26
|
+
"queued",
|
|
27
|
+
"running",
|
|
28
|
+
"succeeded",
|
|
29
|
+
"failed",
|
|
30
|
+
"cancelled",
|
|
31
|
+
"partially_applied",
|
|
32
|
+
"recovery_required"
|
|
33
|
+
];
|
|
34
|
+
var payloadSchemas = {
|
|
35
|
+
"import.stage": z.object({ uploadId: idSchema, format: z.literal("auto").default("auto") }).strict(),
|
|
36
|
+
"import.apply": z.object({
|
|
37
|
+
candidateId: idSchema,
|
|
38
|
+
previewRevision: z.string().min(1).max(128),
|
|
39
|
+
mode: z.enum(["merge", "replace"]),
|
|
40
|
+
overwriteIds: z.array(idSchema).max(1e3),
|
|
41
|
+
confirmedRemovals: z.array(idSchema).max(1e3)
|
|
42
|
+
}).strict(),
|
|
43
|
+
"import.cancel": z.object({ candidateId: idSchema }).strict(),
|
|
44
|
+
"credential.delete": z.object({ credentialId: idSchema, confirmed: z.literal(true) }).strict(),
|
|
45
|
+
"catalog.refresh": z.object({}).strict(),
|
|
46
|
+
"release.discover": z.object({}).strict(),
|
|
47
|
+
"release.install": z.object({ releaseId: idSchema }).strict(),
|
|
48
|
+
"release.activate": z.object({ installedReleaseId: idSchema, confirmed: z.literal(true) }).strict(),
|
|
49
|
+
"release.delete": z.object({ installedReleaseId: idSchema, confirmed: z.literal(true) }).strict(),
|
|
50
|
+
"release.rollback": z.object({ lastKnownGoodReleaseId: idSchema, confirmed: z.literal(true) }).strict(),
|
|
51
|
+
"model.probe": z.object({
|
|
52
|
+
modelId: z.string().min(1).max(256),
|
|
53
|
+
protocol: z.string().min(1).max(64),
|
|
54
|
+
reasoningProfile: z.string().max(64).nullable()
|
|
55
|
+
}).strict(),
|
|
56
|
+
"operation.cancel": z.object({ operationId: idSchema }).strict()
|
|
57
|
+
};
|
|
58
|
+
var commandSchema = z.object({
|
|
59
|
+
apiVersion: z.literal(1),
|
|
60
|
+
instanceId: idSchema,
|
|
61
|
+
kind: z.enum(
|
|
62
|
+
Object.keys(payloadSchemas)
|
|
63
|
+
),
|
|
64
|
+
payload: z.unknown(),
|
|
65
|
+
idempotencyKey: z.string().regex(/^[A-Za-z0-9_.:-]{16,128}$/),
|
|
66
|
+
expectedRevision: z.string().min(1).max(128).nullable()
|
|
67
|
+
}).strict().transform((value, ctx) => {
|
|
68
|
+
const parsed = payloadSchemas[value.kind].safeParse(value.payload);
|
|
69
|
+
if (!parsed.success) {
|
|
70
|
+
ctx.addIssue({ code: "custom", message: "Invalid command payload" });
|
|
71
|
+
return z.NEVER;
|
|
72
|
+
}
|
|
73
|
+
if ([
|
|
74
|
+
"import.apply",
|
|
75
|
+
"credential.delete",
|
|
76
|
+
"release.activate",
|
|
77
|
+
"release.delete",
|
|
78
|
+
"release.rollback"
|
|
79
|
+
].includes(value.kind) && !value.expectedRevision) {
|
|
80
|
+
ctx.addIssue({ code: "custom", message: "Revision required" });
|
|
81
|
+
return z.NEVER;
|
|
82
|
+
}
|
|
83
|
+
return { ...value, payload: parsed.data };
|
|
84
|
+
});
|
|
85
|
+
var errorSchema = z.object({
|
|
86
|
+
code: z.enum(errorCodes),
|
|
87
|
+
message: z.string().max(512),
|
|
88
|
+
retryable: z.boolean(),
|
|
89
|
+
retryAt: z.string().nullable(),
|
|
90
|
+
operationId: z.string().nullable()
|
|
91
|
+
}).strict();
|
|
92
|
+
var acceptSchema = z.object({
|
|
93
|
+
apiVersion: z.literal(1),
|
|
94
|
+
operationId: idSchema,
|
|
95
|
+
state: z.enum(states),
|
|
96
|
+
reused: z.boolean()
|
|
97
|
+
}).strict();
|
|
98
|
+
var operationSchema = z.object({
|
|
99
|
+
apiVersion: z.literal(1),
|
|
100
|
+
instanceId: idSchema,
|
|
101
|
+
id: idSchema,
|
|
102
|
+
kind: z.enum(
|
|
103
|
+
Object.keys(payloadSchemas)
|
|
104
|
+
),
|
|
105
|
+
actorId: idSchema,
|
|
106
|
+
state: z.enum(states),
|
|
107
|
+
phase: z.enum([
|
|
108
|
+
"validate",
|
|
109
|
+
"preview",
|
|
110
|
+
"drain",
|
|
111
|
+
"prepare",
|
|
112
|
+
"switch",
|
|
113
|
+
"verify",
|
|
114
|
+
"commit",
|
|
115
|
+
"cleanup"
|
|
116
|
+
]),
|
|
117
|
+
progress: z.object({
|
|
118
|
+
completed: z.number().int().nonnegative(),
|
|
119
|
+
total: z.number().int().nonnegative().nullable()
|
|
120
|
+
}).strict(),
|
|
121
|
+
createdAt: z.string(),
|
|
122
|
+
startedAt: z.string().nullable(),
|
|
123
|
+
updatedAt: z.string(),
|
|
124
|
+
finishedAt: z.string().nullable(),
|
|
125
|
+
revision: z.number().int(),
|
|
126
|
+
error: errorSchema.nullable(),
|
|
127
|
+
result: z.record(z.string(), z.unknown()).nullable(),
|
|
128
|
+
recoveryDisposition: z.string().nullable(),
|
|
129
|
+
cancelRequested: z.boolean()
|
|
130
|
+
}).strict();
|
|
131
|
+
function isTerminal(state) {
|
|
132
|
+
return !["queued", "running", "recovery_required"].includes(state);
|
|
133
|
+
}
|
|
134
|
+
var nullableDate = z.iso.datetime().nullable();
|
|
135
|
+
var capabilitySchema = z.object({
|
|
136
|
+
enabled: z.boolean(),
|
|
137
|
+
reasonCode: z.string().max(128).nullable(),
|
|
138
|
+
modes: z.array(z.enum(["merge", "replace"])).optional(),
|
|
139
|
+
overwrite: z.boolean().optional()
|
|
140
|
+
}).strict();
|
|
141
|
+
var credentialSchema = z.object({
|
|
142
|
+
id: idSchema,
|
|
143
|
+
provider: z.string().min(1).max(64),
|
|
144
|
+
fingerprint: z.string().max(64),
|
|
145
|
+
usability: z.enum(["usable", "unknown", "disabled"]),
|
|
146
|
+
updatedAt: nullableDate
|
|
147
|
+
}).strict();
|
|
148
|
+
var modelSchema = z.object({
|
|
149
|
+
id: z.string().min(1).max(256),
|
|
150
|
+
capabilities: z.array(z.string().max(64)).max(32)
|
|
151
|
+
}).strict();
|
|
152
|
+
var modelsSchema = z.object({
|
|
153
|
+
apiVersion: z.literal(1),
|
|
154
|
+
instanceId: idSchema,
|
|
155
|
+
models: z.array(modelSchema).max(1e3),
|
|
156
|
+
fetchedAt: nullableDate,
|
|
157
|
+
expiresAt: nullableDate,
|
|
158
|
+
stale: z.boolean(),
|
|
159
|
+
revision: z.string().min(1).max(128)
|
|
160
|
+
}).strict();
|
|
161
|
+
var releaseSchema = z.object({
|
|
162
|
+
id: idSchema,
|
|
163
|
+
version: z.string().min(1).max(128),
|
|
164
|
+
installed: z.boolean(),
|
|
165
|
+
active: z.boolean(),
|
|
166
|
+
lastKnownGood: z.boolean(),
|
|
167
|
+
installedAt: nullableDate
|
|
168
|
+
}).strict();
|
|
169
|
+
var statusSchema = z.object({
|
|
170
|
+
apiVersion: z.literal(1),
|
|
171
|
+
instanceId: idSchema,
|
|
172
|
+
revision: z.string().min(1).max(128),
|
|
173
|
+
runtime: z.object({
|
|
174
|
+
mode: z.enum(["managed", "remote"]),
|
|
175
|
+
version: z.string().max(128).nullable(),
|
|
176
|
+
state: z.enum(["running", "stopped", "unknown"])
|
|
177
|
+
}).strict(),
|
|
178
|
+
management: z.object({
|
|
179
|
+
protocol: z.string().max(64).nullable(),
|
|
180
|
+
availability: z.enum(["available", "unavailable", "unknown"])
|
|
181
|
+
}).strict(),
|
|
182
|
+
inference: z.object({
|
|
183
|
+
reachable: z.boolean().nullable(),
|
|
184
|
+
catalogState: z.enum(["fresh", "stale", "unknown"]),
|
|
185
|
+
probeState: z.enum(["passed", "failed", "unknown"]),
|
|
186
|
+
checkedAt: nullableDate
|
|
187
|
+
}).strict(),
|
|
188
|
+
capabilities: z.record(z.string().max(64), capabilitySchema),
|
|
189
|
+
busyOperationId: idSchema.nullable()
|
|
190
|
+
}).strict();
|
|
191
|
+
var importPreviewSchema = z.object({
|
|
192
|
+
apiVersion: z.literal(1),
|
|
193
|
+
instanceId: idSchema,
|
|
194
|
+
candidateId: idSchema,
|
|
195
|
+
revision: z.string().min(1).max(128),
|
|
196
|
+
expiresAt: z.iso.datetime(),
|
|
197
|
+
previewExpiresAt: z.iso.datetime(),
|
|
198
|
+
accepted: z.number().int().nonnegative(),
|
|
199
|
+
skipped: z.number().int().nonnegative(),
|
|
200
|
+
additions: z.array(idSchema).max(1e3),
|
|
201
|
+
preserved: z.array(idSchema).max(1e3),
|
|
202
|
+
replacements: z.array(idSchema).max(1e3),
|
|
203
|
+
removals: z.array(idSchema).max(1e3),
|
|
204
|
+
reasons: z.record(z.string().max(64), z.number().int().nonnegative())
|
|
205
|
+
}).strict();
|
|
206
|
+
var uploadResultSchema = z.object({ apiVersion: z.literal(1), uploadId: idSchema }).strict();
|
|
207
|
+
var listSchema = (item) => z.object({
|
|
208
|
+
apiVersion: z.literal(1),
|
|
209
|
+
instanceId: idSchema,
|
|
210
|
+
items: z.array(item).max(1e3),
|
|
211
|
+
nextCursor: z.string().max(2048).nullable()
|
|
212
|
+
}).strict();
|
|
213
|
+
|
|
214
|
+
export {
|
|
215
|
+
idSchema,
|
|
216
|
+
errorCodes,
|
|
217
|
+
states,
|
|
218
|
+
payloadSchemas,
|
|
219
|
+
commandSchema,
|
|
220
|
+
errorSchema,
|
|
221
|
+
acceptSchema,
|
|
222
|
+
operationSchema,
|
|
223
|
+
isTerminal,
|
|
224
|
+
capabilitySchema,
|
|
225
|
+
credentialSchema,
|
|
226
|
+
modelSchema,
|
|
227
|
+
modelsSchema,
|
|
228
|
+
releaseSchema,
|
|
229
|
+
statusSchema,
|
|
230
|
+
importPreviewSchema,
|
|
231
|
+
uploadResultSchema,
|
|
232
|
+
listSchema
|
|
233
|
+
};
|
|
234
|
+
//# sourceMappingURL=chunk-T47QB7AC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contracts/index.ts"],"sourcesContent":["import { z } from \"zod\";\nexport const idSchema = z.string().regex(/^[A-Za-z0-9_.:-]{1,128}$/);\nexport const errorCodes = [\n \"INVALID_INPUT\",\n \"UNSUPPORTED_CAPABILITY\",\n \"NOT_AUTHORIZED\",\n \"REVISION_CONFLICT\",\n \"IDEMPOTENCY_CONFLICT\",\n \"KEY_EXPIRED\",\n \"INSTANCE_BUSY\",\n \"UPLOAD_LIMIT\",\n \"ARCHIVE_UNSAFE\",\n \"CREDENTIAL_INVALID\",\n \"MANAGEMENT_UNAVAILABLE\",\n \"DRAIN_TIMEOUT\",\n \"PROBE_QUOTA_LIMITED\",\n \"PROBE_FAILED\",\n \"APPLY_PARTIAL\",\n \"OUTCOME_UNKNOWN\",\n \"RECOVERY_REQUIRED\",\n \"CANCELLED\",\n \"INTERNAL\",\n] as const;\nexport type ErrorCode = (typeof errorCodes)[number];\nexport interface ErrorDto {\n code: ErrorCode;\n message: string;\n retryable: boolean;\n retryAt: string | null;\n operationId: string | null;\n}\nexport const states = [\n \"queued\",\n \"running\",\n \"succeeded\",\n \"failed\",\n \"cancelled\",\n \"partially_applied\",\n \"recovery_required\",\n] as const;\nexport type OperationState = (typeof states)[number];\nexport type Phase =\n | \"validate\"\n | \"preview\"\n | \"drain\"\n | \"prepare\"\n | \"switch\"\n | \"verify\"\n | \"commit\"\n | \"cleanup\";\nexport const payloadSchemas = {\n \"import.stage\": z\n .object({ uploadId: idSchema, format: z.literal(\"auto\").default(\"auto\") })\n .strict(),\n \"import.apply\": z\n .object({\n candidateId: idSchema,\n previewRevision: z.string().min(1).max(128),\n mode: z.enum([\"merge\", \"replace\"]),\n overwriteIds: z.array(idSchema).max(1000),\n confirmedRemovals: z.array(idSchema).max(1000),\n })\n .strict(),\n \"import.cancel\": z.object({ candidateId: idSchema }).strict(),\n \"credential.delete\": z\n .object({ credentialId: idSchema, confirmed: z.literal(true) })\n .strict(),\n \"catalog.refresh\": z.object({}).strict(),\n \"release.discover\": z.object({}).strict(),\n \"release.install\": z.object({ releaseId: idSchema }).strict(),\n \"release.activate\": z\n .object({ installedReleaseId: idSchema, confirmed: z.literal(true) })\n .strict(),\n \"release.delete\": z\n .object({ installedReleaseId: idSchema, confirmed: z.literal(true) })\n .strict(),\n \"release.rollback\": z\n .object({ lastKnownGoodReleaseId: idSchema, confirmed: z.literal(true) })\n .strict(),\n \"model.probe\": z\n .object({\n modelId: z.string().min(1).max(256),\n protocol: z.string().min(1).max(64),\n reasoningProfile: z.string().max(64).nullable(),\n })\n .strict(),\n \"operation.cancel\": z.object({ operationId: idSchema }).strict(),\n} as const;\nexport type CommandKind = keyof typeof payloadSchemas;\nexport type Command = {\n [K in CommandKind]: {\n apiVersion: 1;\n instanceId: string;\n kind: K;\n payload: z.infer<(typeof payloadSchemas)[K]>;\n idempotencyKey: string;\n expectedRevision: string | null;\n };\n}[CommandKind];\nexport const commandSchema = z\n .object({\n apiVersion: z.literal(1),\n instanceId: idSchema,\n kind: z.enum(\n Object.keys(payloadSchemas) as [CommandKind, ...CommandKind[]],\n ),\n payload: z.unknown(),\n idempotencyKey: z.string().regex(/^[A-Za-z0-9_.:-]{16,128}$/),\n expectedRevision: z.string().min(1).max(128).nullable(),\n })\n .strict()\n .transform((value, ctx) => {\n const parsed = payloadSchemas[value.kind].safeParse(value.payload);\n if (!parsed.success) {\n ctx.addIssue({ code: \"custom\", message: \"Invalid command payload\" });\n return z.NEVER;\n }\n if (\n [\n \"import.apply\",\n \"credential.delete\",\n \"release.activate\",\n \"release.delete\",\n \"release.rollback\",\n ].includes(value.kind) &&\n !value.expectedRevision\n ) {\n ctx.addIssue({ code: \"custom\", message: \"Revision required\" });\n return z.NEVER;\n }\n return { ...value, payload: parsed.data } as Command;\n });\nexport interface Actor {\n id: string;\n admin?: boolean;\n}\nexport interface Capability {\n enabled: boolean;\n reasonCode: string | null;\n modes?: (\"merge\" | \"replace\")[];\n overwrite?: boolean;\n}\nexport type Capabilities = Partial<\n Record<\n CommandKind | \"credentials.list\" | \"models.get\" | \"releases.list\",\n Capability\n >\n>;\nexport interface CredentialDto {\n id: string;\n provider: string;\n fingerprint: string;\n usability: \"usable\" | \"unknown\" | \"disabled\";\n updatedAt: string | null;\n}\nexport interface ModelDto {\n id: string;\n capabilities: string[];\n}\nexport interface ModelsDto {\n apiVersion: 1;\n instanceId: string;\n models: ModelDto[];\n fetchedAt: string | null;\n expiresAt: string | null;\n stale: boolean;\n revision: string;\n}\nexport interface ReleaseDto {\n id: string;\n version: string;\n installed: boolean;\n active: boolean;\n lastKnownGood: boolean;\n installedAt: string | null;\n}\nexport interface StatusDto {\n apiVersion: 1;\n instanceId: string;\n revision: string;\n runtime: {\n mode: \"managed\" | \"remote\";\n version: string | null;\n state: \"running\" | \"stopped\" | \"unknown\";\n };\n management: {\n protocol: string | null;\n availability: \"available\" | \"unavailable\" | \"unknown\";\n };\n inference: {\n reachable: boolean | null;\n catalogState: \"fresh\" | \"stale\" | \"unknown\";\n probeState: \"passed\" | \"failed\" | \"unknown\";\n checkedAt: string | null;\n };\n capabilities: Capabilities;\n busyOperationId: string | null;\n}\nexport interface OperationDto {\n apiVersion: 1;\n instanceId: string;\n id: string;\n kind: CommandKind;\n actorId: string;\n state: OperationState;\n phase: Phase;\n progress: { completed: number; total: number | null };\n createdAt: string;\n startedAt: string | null;\n updatedAt: string;\n finishedAt: string | null;\n revision: number;\n error: ErrorDto | null;\n result: Record<string, unknown> | null;\n recoveryDisposition: string | null;\n cancelRequested: boolean;\n}\nexport interface AcceptResult {\n apiVersion: 1;\n operationId: string;\n state: OperationState;\n reused: boolean;\n}\nexport interface ImportPreviewDto {\n apiVersion: 1;\n instanceId: string;\n candidateId: string;\n revision: string;\n expiresAt: string;\n previewExpiresAt: string;\n accepted: number;\n skipped: number;\n additions: string[];\n preserved: string[];\n replacements: string[];\n removals: string[];\n reasons: Record<string, number>;\n}\nexport interface ListDto<T> {\n apiVersion: 1;\n instanceId: string;\n items: T[];\n nextCursor: string | null;\n}\nexport interface UploadResult {\n apiVersion: 1;\n uploadId: string;\n}\nexport const errorSchema = z\n .object({\n code: z.enum(errorCodes),\n message: z.string().max(512),\n retryable: z.boolean(),\n retryAt: z.string().nullable(),\n operationId: z.string().nullable(),\n })\n .strict();\nexport const acceptSchema = z\n .object({\n apiVersion: z.literal(1),\n operationId: idSchema,\n state: z.enum(states),\n reused: z.boolean(),\n })\n .strict();\nexport const operationSchema = z\n .object({\n apiVersion: z.literal(1),\n instanceId: idSchema,\n id: idSchema,\n kind: z.enum(\n Object.keys(payloadSchemas) as [CommandKind, ...CommandKind[]],\n ),\n actorId: idSchema,\n state: z.enum(states),\n phase: z.enum([\n \"validate\",\n \"preview\",\n \"drain\",\n \"prepare\",\n \"switch\",\n \"verify\",\n \"commit\",\n \"cleanup\",\n ]),\n progress: z\n .object({\n completed: z.number().int().nonnegative(),\n total: z.number().int().nonnegative().nullable(),\n })\n .strict(),\n createdAt: z.string(),\n startedAt: z.string().nullable(),\n updatedAt: z.string(),\n finishedAt: z.string().nullable(),\n revision: z.number().int(),\n error: errorSchema.nullable(),\n result: z.record(z.string(), z.unknown()).nullable(),\n recoveryDisposition: z.string().nullable(),\n cancelRequested: z.boolean(),\n })\n .strict();\nexport function isTerminal(state: OperationState) {\n return ![\"queued\", \"running\", \"recovery_required\"].includes(state);\n}\nconst nullableDate = z.iso.datetime().nullable();\nexport const capabilitySchema = z\n .object({\n enabled: z.boolean(),\n reasonCode: z.string().max(128).nullable(),\n modes: z.array(z.enum([\"merge\", \"replace\"])).optional(),\n overwrite: z.boolean().optional(),\n })\n .strict();\nexport const credentialSchema = z\n .object({\n id: idSchema,\n provider: z.string().min(1).max(64),\n fingerprint: z.string().max(64),\n usability: z.enum([\"usable\", \"unknown\", \"disabled\"]),\n updatedAt: nullableDate,\n })\n .strict();\nexport const modelSchema = z\n .object({\n id: z.string().min(1).max(256),\n capabilities: z.array(z.string().max(64)).max(32),\n })\n .strict();\nexport const modelsSchema = z\n .object({\n apiVersion: z.literal(1),\n instanceId: idSchema,\n models: z.array(modelSchema).max(1000),\n fetchedAt: nullableDate,\n expiresAt: nullableDate,\n stale: z.boolean(),\n revision: z.string().min(1).max(128),\n })\n .strict();\nexport const releaseSchema = z\n .object({\n id: idSchema,\n version: z.string().min(1).max(128),\n installed: z.boolean(),\n active: z.boolean(),\n lastKnownGood: z.boolean(),\n installedAt: nullableDate,\n })\n .strict();\nexport const statusSchema = z\n .object({\n apiVersion: z.literal(1),\n instanceId: idSchema,\n revision: z.string().min(1).max(128),\n runtime: z\n .object({\n mode: z.enum([\"managed\", \"remote\"]),\n version: z.string().max(128).nullable(),\n state: z.enum([\"running\", \"stopped\", \"unknown\"]),\n })\n .strict(),\n management: z\n .object({\n protocol: z.string().max(64).nullable(),\n availability: z.enum([\"available\", \"unavailable\", \"unknown\"]),\n })\n .strict(),\n inference: z\n .object({\n reachable: z.boolean().nullable(),\n catalogState: z.enum([\"fresh\", \"stale\", \"unknown\"]),\n probeState: z.enum([\"passed\", \"failed\", \"unknown\"]),\n checkedAt: nullableDate,\n })\n .strict(),\n capabilities: z.record(z.string().max(64), capabilitySchema),\n busyOperationId: idSchema.nullable(),\n })\n .strict();\nexport const importPreviewSchema = z\n .object({\n apiVersion: z.literal(1),\n instanceId: idSchema,\n candidateId: idSchema,\n revision: z.string().min(1).max(128),\n expiresAt: z.iso.datetime(),\n previewExpiresAt: z.iso.datetime(),\n accepted: z.number().int().nonnegative(),\n skipped: z.number().int().nonnegative(),\n additions: z.array(idSchema).max(1000),\n preserved: z.array(idSchema).max(1000),\n replacements: z.array(idSchema).max(1000),\n removals: z.array(idSchema).max(1000),\n reasons: z.record(z.string().max(64), z.number().int().nonnegative()),\n })\n .strict();\nexport const uploadResultSchema = z\n .object({ apiVersion: z.literal(1), uploadId: idSchema })\n .strict();\nexport const listSchema = <T extends z.ZodType>(item: T) =>\n z\n .object({\n apiVersion: z.literal(1),\n instanceId: idSchema,\n items: z.array(item).max(1000),\n nextCursor: z.string().max(2048).nullable(),\n })\n .strict();\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { StatusDto, ListDto, CredentialDto, ModelsDto, ReleaseDto, OperationDto, ImportPreviewDto, Command, AcceptResult, UploadResult, ErrorDto } from '../contracts/index.js';
|
|
2
|
+
import 'zod';
|
|
3
|
+
|
|
4
|
+
interface CpaAdminClient {
|
|
5
|
+
status(signal?: AbortSignal): Promise<StatusDto>;
|
|
6
|
+
credentials(signal?: AbortSignal): Promise<ListDto<CredentialDto>>;
|
|
7
|
+
models(signal?: AbortSignal): Promise<ModelsDto>;
|
|
8
|
+
releases(signal?: AbortSignal): Promise<ListDto<ReleaseDto>>;
|
|
9
|
+
operations(options?: {
|
|
10
|
+
cursor?: string;
|
|
11
|
+
limit?: number;
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
}): Promise<ListDto<OperationDto>>;
|
|
14
|
+
operation(id: string, signal?: AbortSignal): Promise<OperationDto>;
|
|
15
|
+
preview(candidateId: string, options?: {
|
|
16
|
+
mode?: "merge" | "replace";
|
|
17
|
+
overwriteIds?: string[];
|
|
18
|
+
signal?: AbortSignal;
|
|
19
|
+
}): Promise<ImportPreviewDto>;
|
|
20
|
+
command(command: Command, signal?: AbortSignal): Promise<AcceptResult>;
|
|
21
|
+
upload(files: File[], signal?: AbortSignal): Promise<UploadResult>;
|
|
22
|
+
}
|
|
23
|
+
declare class CpaClientError extends Error {
|
|
24
|
+
readonly detail: ErrorDto;
|
|
25
|
+
readonly status: number;
|
|
26
|
+
constructor(detail: ErrorDto, status: number);
|
|
27
|
+
}
|
|
28
|
+
declare function createCpaAdminClient(options: {
|
|
29
|
+
baseUrl: string;
|
|
30
|
+
instanceId: string;
|
|
31
|
+
fetch?: typeof fetch;
|
|
32
|
+
headers?: () => HeadersInit;
|
|
33
|
+
}): CpaAdminClient;
|
|
34
|
+
|
|
35
|
+
export { type CpaAdminClient, CpaClientError, createCpaAdminClient };
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import {
|
|
2
|
+
acceptSchema,
|
|
3
|
+
commandSchema,
|
|
4
|
+
credentialSchema,
|
|
5
|
+
errorSchema,
|
|
6
|
+
importPreviewSchema,
|
|
7
|
+
listSchema,
|
|
8
|
+
modelsSchema,
|
|
9
|
+
operationSchema,
|
|
10
|
+
releaseSchema,
|
|
11
|
+
statusSchema,
|
|
12
|
+
uploadResultSchema
|
|
13
|
+
} from "../chunk-T47QB7AC.js";
|
|
14
|
+
|
|
15
|
+
// src/client/index.ts
|
|
16
|
+
var CpaClientError = class extends Error {
|
|
17
|
+
constructor(detail, status) {
|
|
18
|
+
super(detail.message);
|
|
19
|
+
this.detail = detail;
|
|
20
|
+
this.status = status;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
function createCpaAdminClient(options) {
|
|
24
|
+
const base = options.baseUrl.replace(/\/$/, "");
|
|
25
|
+
const request = async (path, init = {}) => {
|
|
26
|
+
const headers = new Headers(options.headers?.());
|
|
27
|
+
if (init.body && typeof init.body === "string")
|
|
28
|
+
headers.set("Content-Type", "application/json");
|
|
29
|
+
const response = await (options.fetch ?? fetch)(`${base}${path}`, {
|
|
30
|
+
credentials: "same-origin",
|
|
31
|
+
...init,
|
|
32
|
+
headers
|
|
33
|
+
});
|
|
34
|
+
const value = await response.json();
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
const parsed = errorSchema.safeParse(value);
|
|
37
|
+
throw new CpaClientError(
|
|
38
|
+
parsed.success ? parsed.data : {
|
|
39
|
+
code: "INTERNAL",
|
|
40
|
+
message: "Administration request failed",
|
|
41
|
+
retryable: response.status >= 500,
|
|
42
|
+
retryAt: null,
|
|
43
|
+
operationId: null
|
|
44
|
+
},
|
|
45
|
+
response.status
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
};
|
|
50
|
+
const scope = `instanceId=${encodeURIComponent(options.instanceId)}`;
|
|
51
|
+
return {
|
|
52
|
+
status: async (s) => statusSchema.parse(await request(`/status?${scope}`, { signal: s })),
|
|
53
|
+
credentials: async (s) => listSchema(credentialSchema).parse(
|
|
54
|
+
await request(`/credentials?${scope}`, { signal: s })
|
|
55
|
+
),
|
|
56
|
+
models: async (s) => modelsSchema.parse(await request(`/models?${scope}`, { signal: s })),
|
|
57
|
+
releases: async (s) => listSchema(releaseSchema).parse(
|
|
58
|
+
await request(`/releases?${scope}`, { signal: s })
|
|
59
|
+
),
|
|
60
|
+
operations: async (o) => listSchema(operationSchema).parse(
|
|
61
|
+
await request(
|
|
62
|
+
`/operations?${scope}&limit=${o?.limit ?? 50}${o?.cursor ? `&cursor=${encodeURIComponent(o.cursor)}` : ""}`,
|
|
63
|
+
{ signal: o?.signal }
|
|
64
|
+
)
|
|
65
|
+
),
|
|
66
|
+
operation: async (id, s) => operationSchema.parse(
|
|
67
|
+
await request(`/operations/${encodeURIComponent(id)}?${scope}`, {
|
|
68
|
+
signal: s
|
|
69
|
+
})
|
|
70
|
+
),
|
|
71
|
+
preview: async (id, o) => importPreviewSchema.parse(
|
|
72
|
+
await request(
|
|
73
|
+
`/imports/${encodeURIComponent(id)}/preview?${scope}&mode=${o?.mode ?? "merge"}&overwriteIds=${encodeURIComponent(JSON.stringify(o?.overwriteIds ?? []))}`,
|
|
74
|
+
{ signal: o?.signal }
|
|
75
|
+
)
|
|
76
|
+
),
|
|
77
|
+
command: async (c, s) => acceptSchema.parse(
|
|
78
|
+
await request("/commands", {
|
|
79
|
+
method: "POST",
|
|
80
|
+
body: JSON.stringify(commandSchema.parse(c)),
|
|
81
|
+
signal: s
|
|
82
|
+
})
|
|
83
|
+
),
|
|
84
|
+
upload: async (files, s) => {
|
|
85
|
+
const data = new FormData();
|
|
86
|
+
data.set("instanceId", options.instanceId);
|
|
87
|
+
for (const file of files)
|
|
88
|
+
data.append("files", file, file.webkitRelativePath || file.name);
|
|
89
|
+
return uploadResultSchema.parse(
|
|
90
|
+
await request("/uploads", { method: "POST", body: data, signal: s })
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export {
|
|
96
|
+
CpaClientError,
|
|
97
|
+
createCpaAdminClient
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/client/index.ts"],"sourcesContent":["import {\n acceptSchema,\n commandSchema,\n errorSchema,\n operationSchema,\n statusSchema,\n credentialSchema,\n modelsSchema,\n releaseSchema,\n importPreviewSchema,\n uploadResultSchema,\n listSchema,\n type AcceptResult,\n type Command,\n type CredentialDto,\n type ImportPreviewDto,\n type ListDto,\n type ModelsDto,\n type OperationDto,\n type ReleaseDto,\n type StatusDto,\n type UploadResult,\n} from \"../contracts/index.js\";\nexport interface CpaAdminClient {\n status(signal?: AbortSignal): Promise<StatusDto>;\n credentials(signal?: AbortSignal): Promise<ListDto<CredentialDto>>;\n models(signal?: AbortSignal): Promise<ModelsDto>;\n releases(signal?: AbortSignal): Promise<ListDto<ReleaseDto>>;\n operations(options?: {\n cursor?: string;\n limit?: number;\n signal?: AbortSignal;\n }): Promise<ListDto<OperationDto>>;\n operation(id: string, signal?: AbortSignal): Promise<OperationDto>;\n preview(\n candidateId: string,\n options?: {\n mode?: \"merge\" | \"replace\";\n overwriteIds?: string[];\n signal?: AbortSignal;\n },\n ): Promise<ImportPreviewDto>;\n command(command: Command, signal?: AbortSignal): Promise<AcceptResult>;\n upload(files: File[], signal?: AbortSignal): Promise<UploadResult>;\n}\nexport class CpaClientError extends Error {\n constructor(\n public readonly detail: import(\"../contracts/index.js\").ErrorDto,\n public readonly status: number,\n ) {\n super(detail.message);\n }\n}\nexport function createCpaAdminClient(options: {\n baseUrl: string;\n instanceId: string;\n fetch?: typeof fetch;\n headers?: () => HeadersInit;\n}): CpaAdminClient {\n const base = options.baseUrl.replace(/\\/$/, \"\");\n const request = async <T>(\n path: string,\n init: RequestInit = {},\n ): Promise<T> => {\n const headers = new Headers(options.headers?.());\n if (init.body && typeof init.body === \"string\")\n headers.set(\"Content-Type\", \"application/json\");\n const response = await (options.fetch ?? fetch)(`${base}${path}`, {\n credentials: \"same-origin\",\n ...init,\n headers,\n });\n const value = await response.json();\n if (!response.ok) {\n const parsed = errorSchema.safeParse(value);\n throw new CpaClientError(\n parsed.success\n ? parsed.data\n : {\n code: \"INTERNAL\",\n message: \"Administration request failed\",\n retryable: response.status >= 500,\n retryAt: null,\n operationId: null,\n },\n response.status,\n );\n }\n return value as T;\n };\n const scope = `instanceId=${encodeURIComponent(options.instanceId)}`;\n return {\n status: async (s) =>\n statusSchema.parse(await request(`/status?${scope}`, { signal: s })),\n credentials: async (s) =>\n listSchema(credentialSchema).parse(\n await request(`/credentials?${scope}`, { signal: s }),\n ),\n models: async (s) =>\n modelsSchema.parse(await request(`/models?${scope}`, { signal: s })),\n releases: async (s) =>\n listSchema(releaseSchema).parse(\n await request(`/releases?${scope}`, { signal: s }),\n ),\n operations: async (o) =>\n listSchema(operationSchema).parse(\n await request(\n `/operations?${scope}&limit=${o?.limit ?? 50}${o?.cursor ? `&cursor=${encodeURIComponent(o.cursor)}` : \"\"}`,\n { signal: o?.signal },\n ),\n ),\n operation: async (id, s) =>\n operationSchema.parse(\n await request(`/operations/${encodeURIComponent(id)}?${scope}`, {\n signal: s,\n }),\n ),\n preview: async (id, o) =>\n importPreviewSchema.parse(\n await request(\n `/imports/${encodeURIComponent(id)}/preview?${scope}&mode=${o?.mode ?? \"merge\"}&overwriteIds=${encodeURIComponent(JSON.stringify(o?.overwriteIds ?? []))}`,\n { signal: o?.signal },\n ),\n ),\n command: async (c, s) =>\n acceptSchema.parse(\n await request(\"/commands\", {\n method: \"POST\",\n body: JSON.stringify(commandSchema.parse(c)),\n signal: s,\n }),\n ),\n upload: async (files, s) => {\n const data = new FormData();\n data.set(\"instanceId\", options.instanceId);\n for (const file of files)\n data.append(\"files\", file, file.webkitRelativePath || file.name);\n return uploadResultSchema.parse(\n await request(\"/uploads\", { method: \"POST\", body: data, signal: s }),\n );\n },\n };\n}\n"],"mappings":"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","names":[]}
|