@codexdock/sdk 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tahooki
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # @codexdock/sdk
2
+
3
+ Server-side SDK for routing app AI invocations to local CodexDock workers.
4
+
5
+ Use this package inside a host web app. It stores invocations through a persistence adapter, exposes route-handler helpers, and lets local workers claim work and submit results.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pnpm add @codexdock/sdk
11
+ ```
12
+
13
+ ## Basic Usage
14
+
15
+ ```ts
16
+ import {
17
+ createCodexDock,
18
+ createMemoryPersistence,
19
+ } from "@codexdock/sdk";
20
+
21
+ export const codexdock = createCodexDock({
22
+ persistence: createMemoryPersistence(),
23
+ workerToken: process.env.CODEXDOCK_WORKER_TOKEN,
24
+ });
25
+
26
+ const invocation = await codexdock.invoke({
27
+ type: "generate_data",
28
+ prompt: "Create product card data.",
29
+ payload: { count: 4 },
30
+ });
31
+
32
+ console.log(invocation.invocationId);
33
+ ```
34
+
35
+ ## Next.js Route Handlers
36
+
37
+ ```ts
38
+ export const POST = codexdock.handlers.invoke;
39
+ ```
40
+
41
+ Worker endpoints are also exposed through `codexdock.handlers.workerConnect`, `workerNext`, `workerResult`, and `workerStatus`.
42
+
43
+ ## Status
44
+
45
+ The in-memory persistence adapter is intended for examples and local smoke tests. Production apps should provide their own database-backed persistence adapter.
@@ -0,0 +1,111 @@
1
+ import type { CodexDockError, InvocationRecord, NormalizedInvokeRequest, NormalizedWorkerConnectRequest, WorkerNextResponse, WorkerRecord } from "@codexdock/protocol";
2
+ export interface CodexDockPersistence {
3
+ createInvocation(input: CreateInvocationInput): Promise<InvocationRecord>;
4
+ getInvocation(invocationId: string): Promise<InvocationRecord | null>;
5
+ listInvocations?(): Promise<InvocationRecord[]>;
6
+ claimNextInvocation(workerId: string): Promise<InvocationRecord | null>;
7
+ completeInvocation(input: CompleteInvocationInput): Promise<InvocationRecord>;
8
+ failInvocation(input: FailInvocationInput): Promise<InvocationRecord>;
9
+ upsertWorker(input: UpsertWorkerInput): Promise<WorkerRecord>;
10
+ getWorker(workerId: string): Promise<WorkerRecord | null>;
11
+ listWorkers?(): Promise<WorkerRecord[]>;
12
+ }
13
+ export interface CreateInvocationInput extends NormalizedInvokeRequest {
14
+ invocationId?: string;
15
+ expiresAt?: string;
16
+ }
17
+ export interface CompleteInvocationInput {
18
+ workerId: string;
19
+ invocationId: string;
20
+ result: unknown;
21
+ }
22
+ export interface FailInvocationInput {
23
+ workerId: string;
24
+ invocationId: string;
25
+ error: CodexDockError;
26
+ }
27
+ export interface UpsertWorkerInput extends NormalizedWorkerConnectRequest {
28
+ status?: WorkerRecord["status"];
29
+ }
30
+ export interface CodexDockOptions {
31
+ persistence: CodexDockPersistence;
32
+ workerToken?: string;
33
+ now?: () => Date;
34
+ invocationTtlMs?: number;
35
+ }
36
+ export interface InvokeAccepted {
37
+ invocationId: string;
38
+ status: "pending";
39
+ statusUrl: string;
40
+ }
41
+ export interface WorkerConnectResult {
42
+ ok: true;
43
+ worker: WorkerRecord;
44
+ polling: {
45
+ emptyMinMs: number;
46
+ emptyMaxMs: number;
47
+ };
48
+ }
49
+ export interface WorkerStatusResult {
50
+ ok: true;
51
+ workers: WorkerRecord[];
52
+ counts: Record<InvocationRecord["status"], number>;
53
+ }
54
+ export declare class CodexDockHttpError extends Error {
55
+ readonly status: number;
56
+ readonly error: CodexDockError;
57
+ constructor(status: number, error: CodexDockError);
58
+ }
59
+ export declare function createCodexDock(options: CodexDockOptions): {
60
+ invoke: (input: unknown) => Promise<InvokeAccepted>;
61
+ getInvocation: (invocationId: string) => Promise<InvocationRecord | null>;
62
+ getWorkerStatus: () => Promise<WorkerStatusResult>;
63
+ workerConnect: (input: unknown) => Promise<WorkerConnectResult>;
64
+ workerNext: (workerId: string) => Promise<WorkerNextResponse | null>;
65
+ workerResult: (input: unknown) => Promise<InvocationRecord>;
66
+ handlers: {
67
+ invoke: (request: Request) => Promise<Response>;
68
+ getInvocation: (_request: Request, context: {
69
+ params: Promise<{
70
+ invocationId: string;
71
+ }>;
72
+ } | {
73
+ params: {
74
+ invocationId: string;
75
+ };
76
+ }) => Promise<Response>;
77
+ workerStatus: () => Promise<Response>;
78
+ workerConnect: (request: Request) => Promise<Response>;
79
+ workerNext: (request: Request) => Promise<Response>;
80
+ workerResult: (request: Request) => Promise<Response>;
81
+ };
82
+ };
83
+ export interface RouteHandlerDeps {
84
+ requireWorkerToken(request: Request): void;
85
+ invoke(input: unknown): Promise<InvokeAccepted>;
86
+ getInvocation(invocationId: string): Promise<InvocationRecord | null>;
87
+ workerConnect(input: unknown): Promise<WorkerConnectResult>;
88
+ workerNext(workerId: string): Promise<WorkerNextResponse | null>;
89
+ workerResult(input: unknown): Promise<InvocationRecord>;
90
+ getWorkerStatus(): Promise<WorkerStatusResult>;
91
+ }
92
+ export declare function createRouteHandlers(deps: RouteHandlerDeps): {
93
+ invoke: (request: Request) => Promise<Response>;
94
+ getInvocation: (_request: Request, context: {
95
+ params: Promise<{
96
+ invocationId: string;
97
+ }>;
98
+ } | {
99
+ params: {
100
+ invocationId: string;
101
+ };
102
+ }) => Promise<Response>;
103
+ workerStatus: () => Promise<Response>;
104
+ workerConnect: (request: Request) => Promise<Response>;
105
+ workerNext: (request: Request) => Promise<Response>;
106
+ workerResult: (request: Request) => Promise<Response>;
107
+ };
108
+ export declare function createMemoryPersistence(options?: {
109
+ now?: () => Date;
110
+ }): CodexDockPersistence;
111
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,318 @@
1
+ import { createHash, randomUUID, timingSafeEqual } from "node:crypto";
2
+ import { codexDockErrorSchema, invocationRecordSchema, invokeRequestSchema, makeCodexDockError, workerConnectRequestSchema, workerNextResponseSchema, workerResultRequestSchema, } from "@codexdock/protocol";
3
+ export class CodexDockHttpError extends Error {
4
+ status;
5
+ error;
6
+ constructor(status, error) {
7
+ super(error.message);
8
+ this.status = status;
9
+ this.error = error;
10
+ }
11
+ }
12
+ export function createCodexDock(options) {
13
+ const now = options.now ?? (() => new Date());
14
+ const invocationTtlMs = options.invocationTtlMs ?? 10 * 60 * 1000;
15
+ function requireWorkerToken(request) {
16
+ if (!options.workerToken)
17
+ return;
18
+ const auth = request.headers.get("authorization") ?? "";
19
+ const expected = `Bearer ${options.workerToken}`;
20
+ if (!safeEqual(auth, expected)) {
21
+ throw new CodexDockHttpError(401, makeCodexDockError("WORKER_AUTH_INVALID", "Invalid worker token."));
22
+ }
23
+ }
24
+ async function invoke(input) {
25
+ const parsed = invokeRequestSchema.safeParse(input);
26
+ if (!parsed.success) {
27
+ throw new CodexDockHttpError(400, makeCodexDockError("INVALID_PAYLOAD", "Invalid invoke payload.", {
28
+ details: { issues: parsed.error.issues },
29
+ }));
30
+ }
31
+ const expiresAt = new Date(now().getTime() + invocationTtlMs).toISOString();
32
+ const record = await options.persistence.createInvocation({
33
+ ...parsed.data,
34
+ expiresAt,
35
+ });
36
+ return {
37
+ invocationId: record.invocationId,
38
+ status: "pending",
39
+ statusUrl: `/api/codexdock/invocations/${record.invocationId}`,
40
+ };
41
+ }
42
+ async function getInvocation(invocationId) {
43
+ return options.persistence.getInvocation(invocationId);
44
+ }
45
+ async function workerConnect(input) {
46
+ const parsed = workerConnectRequestSchema.safeParse(input);
47
+ if (!parsed.success) {
48
+ throw new CodexDockHttpError(400, makeCodexDockError("INVALID_PAYLOAD", "Invalid worker connect payload."));
49
+ }
50
+ const worker = await options.persistence.upsertWorker({
51
+ ...parsed.data,
52
+ status: "online",
53
+ });
54
+ return {
55
+ ok: true,
56
+ worker,
57
+ polling: {
58
+ emptyMinMs: 2_000,
59
+ emptyMaxMs: 30_000,
60
+ },
61
+ };
62
+ }
63
+ async function workerNext(workerId) {
64
+ const worker = await options.persistence.getWorker(workerId);
65
+ if (worker?.status === "revoked") {
66
+ throw new CodexDockHttpError(403, makeCodexDockError("WORKER_REVOKED", "Worker has been revoked."));
67
+ }
68
+ const invocation = await options.persistence.claimNextInvocation(workerId);
69
+ if (!invocation)
70
+ return null;
71
+ return workerNextResponseSchema.parse({
72
+ invocationId: invocation.invocationId,
73
+ type: invocation.type,
74
+ prompt: invocation.prompt,
75
+ payload: invocation.payload,
76
+ });
77
+ }
78
+ async function workerResult(input) {
79
+ const parsed = workerResultRequestSchema.safeParse(input);
80
+ if (!parsed.success) {
81
+ throw new CodexDockHttpError(400, makeCodexDockError("INVALID_PAYLOAD", "Invalid worker result payload."));
82
+ }
83
+ if (parsed.data.ok) {
84
+ return options.persistence.completeInvocation({
85
+ workerId: parsed.data.workerId,
86
+ invocationId: parsed.data.invocationId,
87
+ result: parsed.data.result ?? null,
88
+ });
89
+ }
90
+ return options.persistence.failInvocation({
91
+ workerId: parsed.data.workerId,
92
+ invocationId: parsed.data.invocationId,
93
+ error: parsed.data.error ??
94
+ makeCodexDockError("CODEX_RUN_FAILED", "Worker failed without details."),
95
+ });
96
+ }
97
+ async function getWorkerStatus() {
98
+ const workers = options.persistence.listWorkers
99
+ ? await options.persistence.listWorkers()
100
+ : [];
101
+ const invocations = options.persistence.listInvocations
102
+ ? await options.persistence.listInvocations()
103
+ : [];
104
+ const counts = {
105
+ pending: 0,
106
+ running: 0,
107
+ completed: 0,
108
+ failed: 0,
109
+ expired: 0,
110
+ cancelled: 0,
111
+ };
112
+ for (const invocation of invocations) {
113
+ counts[invocation.status] += 1;
114
+ }
115
+ return { ok: true, workers, counts };
116
+ }
117
+ const handlers = createRouteHandlers({
118
+ requireWorkerToken,
119
+ invoke,
120
+ getInvocation,
121
+ workerConnect,
122
+ workerNext,
123
+ workerResult,
124
+ getWorkerStatus,
125
+ });
126
+ return {
127
+ invoke,
128
+ getInvocation,
129
+ getWorkerStatus,
130
+ workerConnect,
131
+ workerNext,
132
+ workerResult,
133
+ handlers,
134
+ };
135
+ }
136
+ export function createRouteHandlers(deps) {
137
+ return {
138
+ invoke: async (request) => jsonResponse(await deps.invoke(await readJson(request)), { status: 202 }),
139
+ getInvocation: async (_request, context) => {
140
+ const params = await context.params;
141
+ const invocation = await deps.getInvocation(params.invocationId);
142
+ if (!invocation) {
143
+ return jsonResponse({ ok: false, error: makeCodexDockError("INVALID_PAYLOAD", "Invocation not found.") }, { status: 404 });
144
+ }
145
+ return jsonResponse({ ok: true, invocation });
146
+ },
147
+ workerStatus: async () => jsonResponse(await deps.getWorkerStatus()),
148
+ workerConnect: async (request) => {
149
+ deps.requireWorkerToken(request);
150
+ return jsonResponse(await deps.workerConnect(await readJson(request)));
151
+ },
152
+ workerNext: async (request) => {
153
+ deps.requireWorkerToken(request);
154
+ const input = await readJson(request);
155
+ const workerId = getStringField(input, "workerId");
156
+ const next = await deps.workerNext(workerId);
157
+ if (!next)
158
+ return new Response(null, { status: 204 });
159
+ return jsonResponse(next);
160
+ },
161
+ workerResult: async (request) => {
162
+ deps.requireWorkerToken(request);
163
+ return jsonResponse({ ok: true, invocation: await deps.workerResult(await readJson(request)) });
164
+ },
165
+ };
166
+ }
167
+ export function createMemoryPersistence(options = {}) {
168
+ const now = options.now ?? (() => new Date());
169
+ const invocations = new Map();
170
+ const workers = new Map();
171
+ const idempotencyIndex = new Map();
172
+ function stamp() {
173
+ return now().toISOString();
174
+ }
175
+ function assertClaimedBy(invocation, workerId) {
176
+ if (invocation.workerId !== workerId || invocation.status !== "running") {
177
+ throw new CodexDockHttpError(403, makeCodexDockError("WORKER_AUTH_INVALID", "Worker cannot submit a result for an invocation it did not claim."));
178
+ }
179
+ }
180
+ return {
181
+ async createInvocation(input) {
182
+ if (input.idempotencyKey) {
183
+ const existingId = idempotencyIndex.get(input.idempotencyKey);
184
+ if (existingId) {
185
+ const existing = invocations.get(existingId);
186
+ if (existing)
187
+ return existing;
188
+ }
189
+ }
190
+ const invocation = invocationRecordSchema.parse({
191
+ invocationId: input.invocationId ?? `inv_${randomUUID()}`,
192
+ type: input.type,
193
+ prompt: input.prompt,
194
+ payload: input.payload,
195
+ status: "pending",
196
+ attempts: 0,
197
+ idempotencyKey: input.idempotencyKey,
198
+ createdAt: stamp(),
199
+ expiresAt: input.expiresAt,
200
+ });
201
+ invocations.set(invocation.invocationId, invocation);
202
+ if (input.idempotencyKey) {
203
+ idempotencyIndex.set(input.idempotencyKey, invocation.invocationId);
204
+ }
205
+ return invocation;
206
+ },
207
+ async getInvocation(invocationId) {
208
+ return invocations.get(invocationId) ?? null;
209
+ },
210
+ async listInvocations() {
211
+ return [...invocations.values()].sort((a, b) => b.createdAt.localeCompare(a.createdAt));
212
+ },
213
+ async claimNextInvocation(workerId) {
214
+ const worker = workers.get(workerId);
215
+ if (worker?.status === "revoked") {
216
+ throw new CodexDockHttpError(403, makeCodexDockError("WORKER_REVOKED", "Worker has been revoked."));
217
+ }
218
+ const pending = [...invocations.values()]
219
+ .filter((invocation) => invocation.status === "pending")
220
+ .sort((a, b) => a.createdAt.localeCompare(b.createdAt))[0];
221
+ if (!pending)
222
+ return null;
223
+ const nextRecord = invocationRecordSchema.parse({
224
+ ...pending,
225
+ status: "running",
226
+ workerId,
227
+ attempts: (pending.attempts ?? 0) + 1,
228
+ claimedAt: stamp(),
229
+ });
230
+ invocations.set(nextRecord.invocationId, nextRecord);
231
+ return nextRecord;
232
+ },
233
+ async completeInvocation(input) {
234
+ const existing = invocations.get(input.invocationId);
235
+ if (!existing) {
236
+ throw new CodexDockHttpError(404, makeCodexDockError("INVALID_PAYLOAD", "Invocation not found."));
237
+ }
238
+ assertClaimedBy(existing, input.workerId);
239
+ const updated = invocationRecordSchema.parse({
240
+ ...existing,
241
+ status: "completed",
242
+ result: input.result,
243
+ error: undefined,
244
+ completedAt: stamp(),
245
+ });
246
+ invocations.set(updated.invocationId, updated);
247
+ return updated;
248
+ },
249
+ async failInvocation(input) {
250
+ const existing = invocations.get(input.invocationId);
251
+ if (!existing) {
252
+ throw new CodexDockHttpError(404, makeCodexDockError("INVALID_PAYLOAD", "Invocation not found."));
253
+ }
254
+ assertClaimedBy(existing, input.workerId);
255
+ const updated = invocationRecordSchema.parse({
256
+ ...existing,
257
+ status: "failed",
258
+ result: undefined,
259
+ error: codexDockErrorSchema.parse(input.error),
260
+ completedAt: stamp(),
261
+ });
262
+ invocations.set(updated.invocationId, updated);
263
+ return updated;
264
+ },
265
+ async upsertWorker(input) {
266
+ const existing = workers.get(input.workerId);
267
+ const worker = {
268
+ workerId: input.workerId,
269
+ deviceName: input.deviceName,
270
+ capabilities: input.capabilities,
271
+ status: input.status ?? existing?.status ?? "online",
272
+ lastSeenAt: stamp(),
273
+ createdAt: existing?.createdAt ?? stamp(),
274
+ revokedAt: existing?.revokedAt,
275
+ };
276
+ workers.set(worker.workerId, worker);
277
+ return worker;
278
+ },
279
+ async getWorker(workerId) {
280
+ return workers.get(workerId) ?? null;
281
+ },
282
+ async listWorkers() {
283
+ return [...workers.values()].sort((a, b) => b.lastSeenAt.localeCompare(a.lastSeenAt));
284
+ },
285
+ };
286
+ }
287
+ async function readJson(request) {
288
+ const text = await request.text();
289
+ if (!text.trim())
290
+ return {};
291
+ return JSON.parse(text);
292
+ }
293
+ function jsonResponse(value, init = {}) {
294
+ return new Response(JSON.stringify(value, null, 2), {
295
+ ...init,
296
+ headers: {
297
+ "content-type": "application/json; charset=utf-8",
298
+ "cache-control": "no-store",
299
+ ...init.headers,
300
+ },
301
+ });
302
+ }
303
+ function getStringField(input, field) {
304
+ if (!input || typeof input !== "object" || !(field in input)) {
305
+ throw new CodexDockHttpError(400, makeCodexDockError("INVALID_PAYLOAD", `Missing ${field}.`));
306
+ }
307
+ const value = input[field];
308
+ if (typeof value !== "string" || !value.trim()) {
309
+ throw new CodexDockHttpError(400, makeCodexDockError("INVALID_PAYLOAD", `Invalid ${field}.`));
310
+ }
311
+ return value;
312
+ }
313
+ function safeEqual(a, b) {
314
+ const aHash = createHash("sha256").update(a).digest();
315
+ const bHash = createHash("sha256").update(b).digest();
316
+ return timingSafeEqual(aHash, bHash);
317
+ }
318
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@codexdock/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Server-side SDK for routing app AI invocations to local CodexDock workers.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "package.json"
19
+ ],
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/tahooki/codexdock.git",
23
+ "directory": "packages/sdk"
24
+ },
25
+ "homepage": "https://github.com/tahooki/codexdock#readme",
26
+ "bugs": {
27
+ "url": "https://github.com/tahooki/codexdock/issues"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "dependencies": {
33
+ "@codexdock/protocol": "0.1.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^24.10.1",
37
+ "typescript": "^5.9.3"
38
+ },
39
+ "scripts": {
40
+ "build": "tsc -p tsconfig.json",
41
+ "check": "tsc -p tsconfig.json --noEmit"
42
+ }
43
+ }