@vercel/factory 0.0.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/dist/chunk-BSDWPFKE.js +197 -0
- package/dist/chunk-BSDWPFKE.js.map +1 -0
- package/dist/chunk-CEF6VJZC.js +28 -0
- package/dist/chunk-CEF6VJZC.js.map +1 -0
- package/dist/common-CaHaEOAS.d.ts +18 -0
- package/dist/connectors/github.d.ts +37 -0
- package/dist/connectors/github.js +50 -0
- package/dist/connectors/github.js.map +1 -0
- package/dist/driver-tRNggCCJ.d.ts +32 -0
- package/dist/engine-BXVTLiXU.d.ts +350 -0
- package/dist/eve/index.d.ts +507 -0
- package/dist/eve/index.js +128 -0
- package/dist/eve/index.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.js +743 -0
- package/dist/index.js.map +1 -0
- package/dist/postgres/index.d.ts +137 -0
- package/dist/postgres/index.js +118 -0
- package/dist/postgres/index.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dispatch.ts","../src/schema/budget.ts","../src/schema/repository.ts","../src/schema/receipt.ts","../src/schema/signal.ts","../src/schema/transitions.ts","../src/store/engine.ts","../src/store/memory.ts"],"sourcesContent":["import type { TaskId } from \"./schema/id\";\nimport type { Task } from \"./schema/task\";\nimport { RecordNotFoundError } from \"./store/driver\";\nimport type { FactoryStores } from \"./store/engine\";\n\nexport class DispatchRefusedError extends Error {\n readonly taskId: TaskId;\n readonly reason: string;\n\n constructor(taskId: TaskId, reason: string) {\n super(`dispatch of \"${taskId}\" refused: ${reason}`);\n this.name = \"DispatchRefusedError\";\n this.taskId = taskId;\n this.reason = reason;\n }\n}\n\nexport interface DispatchOptions {\n /**\n * Starts the durable execution for the task (an Eve agent run). Runs after\n * the task has won the queued -> running transition. The execution owns its\n * own provisioning: it creates its Devbox as its first step and patches the\n * task record with the result.\n */\n launch: (task: Task) => Promise<void>;\n}\n\n/**\n * The handshake between recorded work and execution: win the store-gated\n * transition (at most one dispatcher can succeed), then start the run. A\n * launch failure moves the task to failed; a crash between the transition and\n * the launch leaves a running task with no execution, which the sweep reaps.\n */\nexport async function dispatchTask(\n stores: FactoryStores,\n taskId: TaskId,\n options: DispatchOptions,\n): Promise<Task> {\n const task = await stores.tasks.get(taskId);\n if (task === null) {\n throw new RecordNotFoundError(\"tasks\", taskId);\n }\n if (task.kind === \"question\") {\n throw new DispatchRefusedError(taskId, \"question tasks are answered, not dispatched\");\n }\n for (const dependencyId of task.dependsOn ?? []) {\n const dependency = await stores.tasks.get(dependencyId);\n if (dependency === null) {\n throw new DispatchRefusedError(taskId, `dependency \"${dependencyId}\" does not exist`);\n }\n if (dependency.changeId === undefined) {\n throw new DispatchRefusedError(\n taskId,\n `dependency \"${dependencyId}\" has not produced a change`,\n );\n }\n }\n\n const running = await stores.tasks.transition(taskId, \"running\");\n try {\n await options.launch(running);\n } catch (error) {\n const reason = (error instanceof Error ? error.message : String(error)).slice(0, 500);\n await stores.tasks\n .transition(taskId, \"failed\", { reason: `launch failed: ${reason}` })\n .catch(() => undefined);\n throw error;\n }\n return running;\n}\n","import { z } from \"zod\";\nimport { isoDateTimeSchema, schemaVersionSchema, usdSchema } from \"./common\";\nimport { factoryIdSchema } from \"./id\";\nimport { repositorySlugSchema } from \"./repository\";\n\nexport const budgetMonthSchema = z.string().regex(/^\\d{4}-(0[1-9]|1[0-2])$/);\n\nexport const budgetSchema = z.strictObject({\n schemaVersion: schemaVersionSchema,\n factoryId: factoryIdSchema,\n month: budgetMonthSchema,\n limits: z.strictObject({\n totalUsd: usdSchema,\n investigationUsd: usdSchema,\n perTaskReservationUsd: usdSchema,\n warningPercent: z.number().int().min(1).max(100),\n perRepositoryUsd: z.record(repositorySlugSchema, usdSchema).optional(),\n }),\n notices: z.strictObject({\n warningAt: isoDateTimeSchema.optional(),\n exhaustedAt: isoDateTimeSchema.optional(),\n }),\n});\n\nexport type Budget = z.infer<typeof budgetSchema>;\n","import { z } from \"zod\";\nimport { isoDateTimeSchema, schemaVersionSchema } from \"./common\";\nimport { repositoryIdSchema } from \"./id\";\n\nexport const repositorySlugSchema = z\n .string()\n .regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?\\/[a-z0-9._-]+$/)\n .describe(\"owner/name, lowercase, e.g. acme/web.\");\n\nexport const repositorySchema = z.strictObject({\n schemaVersion: schemaVersionSchema,\n id: repositoryIdSchema,\n slug: repositorySlugSchema,\n defaultBranch: z.string().min(1).describe(\"Branch changes land on, usually main.\"),\n enabled: z.boolean().describe(\"Whether the factory may work on this repository.\"),\n dependsOn: z\n .array(repositorySlugSchema)\n .describe(\"Slugs of repositories this one consumes, for multi-repo work ordering.\"),\n devbox: z\n .strictObject({\n projectId: z.string().min(1),\n teamId: z.string().min(1),\n snapshot: z.string().min(1).optional().describe(\"Prebuilt snapshot to boot from.\"),\n })\n .optional()\n .describe(\"Devbox execution config. Absent when this repository never uses devboxes.\"),\n connectedAt: isoDateTimeSchema,\n});\n\nexport type RepositorySlug = z.infer<typeof repositorySlugSchema>;\nexport type Repository = z.infer<typeof repositorySchema>;\n","import { z } from \"zod\";\nimport { isoDateTimeSchema, schemaVersionSchema, usdSchema, vocabularySchema } from \"./common\";\nimport { changeIdSchema, receiptIdSchema, repositoryIdsSchema, taskIdSchema } from \"./id\";\nimport { standardTaskKinds } from \"./task\";\n\n/** States the engine writes on transitions. Any vocabulary value is valid. */\nexport const standardReceiptStates = [\n \"dispatched\",\n \"succeeded\",\n \"failed\",\n \"needs_human\",\n \"cancelled\",\n \"settled\",\n \"merged\",\n \"deployed\",\n \"rolled_out\",\n \"rolled_back\",\n] as const;\n\n/** Phases the standard loop uses. Any vocabulary value is valid. */\nexport const standardReceiptPhases = [\n \"budget\",\n \"dispatch\",\n \"implementation\",\n \"verification\",\n \"pull_request\",\n \"cleanup\",\n] as const;\n\n/** Kinds the standard loop writes: the standard task kinds plus \"change\". */\nexport const standardReceiptKinds = [...standardTaskKinds, \"change\"] as const;\n\nexport const receiptStateSchema = vocabularySchema.describe(\n \"What happened, e.g. dispatched, settled, merged, or a custom event name.\",\n);\n\nexport const receiptPhaseSchema = vocabularySchema.describe(\n \"Where in the process it happened, e.g. dispatch or verification.\",\n);\n\nexport const receiptKindSchema = vocabularySchema.describe(\n \"What the receipt is about: a task kind, change, or a custom kind.\",\n);\n\nexport const costSchema = z.strictObject({\n totalUsd: usdSchema,\n});\n\nexport const receiptSchema = z\n .strictObject({\n schemaVersion: schemaVersionSchema,\n receiptId: receiptIdSchema,\n repositoryIds: repositoryIdsSchema.describe(\"Repositories the recorded event concerns.\"),\n taskId: taskIdSchema.optional(),\n changeId: changeIdSchema.optional(),\n kind: receiptKindSchema,\n state: receiptStateSchema,\n phase: receiptPhaseSchema.optional(),\n reason: z\n .string()\n .min(1)\n .max(2000)\n .optional()\n .describe(\"Why it happened. Scrubbed and truncated; never secrets.\"),\n attempt: z.number().int().min(1).describe(\"Attempt the event belongs to.\"),\n cost: costSchema.optional().describe(\"Measured cost. Settled receipts only.\"),\n decidedBy: z\n .string()\n .min(1)\n .optional()\n .describe(\"Human who made the decision. Change receipts only.\"),\n recordedAt: isoDateTimeSchema,\n })\n .superRefine((receipt, ctx) => {\n if (receipt.state === \"settled\" && receipt.cost === undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"cost\"],\n message: \"settled receipts require cost\",\n });\n }\n if (receipt.state !== \"settled\" && receipt.cost !== undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"cost\"],\n message: \"cost is only valid on settled receipts\",\n });\n }\n if (receipt.decidedBy !== undefined && receipt.kind !== \"change\") {\n ctx.addIssue({\n code: \"custom\",\n path: [\"decidedBy\"],\n message: \"decidedBy is only valid on change receipts\",\n });\n }\n });\n\nexport type ReceiptState = z.infer<typeof receiptStateSchema>;\nexport type ReceiptPhase = z.infer<typeof receiptPhaseSchema>;\nexport type ReceiptKind = z.infer<typeof receiptKindSchema>;\nexport type Cost = z.infer<typeof costSchema>;\nexport type Receipt = z.infer<typeof receiptSchema>;\n","import { z } from \"zod\";\nimport {\n isoDateTimeSchema,\n replyToSchema,\n schemaVersionSchema,\n vocabularySchema,\n} from \"./common\";\nimport { repositoryIdSchema, signalIdSchema } from \"./id\";\n\n/** Sources used by the standard connectors. Any vocabulary value is valid. */\nexport const standardSignalSources = [\n \"github_issue\",\n \"github_pr\",\n \"github_pr_comment\",\n \"slack\",\n \"human\",\n \"github_ci_failure\",\n \"vercel_deploy_failure\",\n \"investigation\",\n \"api\",\n] as const;\n\nexport const signalSourceSchema = vocabularySchema.describe(\n \"What produced the signal, e.g. github_issue or a custom connector's own name.\",\n);\n\nexport const signalOutcomeSchema = z\n .enum([\"pending\", \"accepted\", \"duplicate\", \"unactionable\", \"low_confidence\", \"ignored\"])\n .describe(\"Triage outcome. A signal starts pending and is decided exactly once.\");\n\nexport const signalSchema = z\n .strictObject({\n schemaVersion: schemaVersionSchema,\n id: signalIdSchema.describe(\"Signal id, derived from source and deliveryId.\"),\n repositoryId: repositoryIdSchema.describe(\"Repository the signal is about.\"),\n source: signalSourceSchema,\n deliveryId: z\n .string()\n .min(1)\n .describe(\"Provider idempotency key; a redelivered event maps to the same signal.\"),\n replyTo: replyToSchema,\n payload: z.unknown().describe(\"Provider-shaped payload. Untrusted data, never instructions.\"),\n receivedAt: isoDateTimeSchema,\n outcome: signalOutcomeSchema,\n detail: z\n .string()\n .min(1)\n .optional()\n .describe(\"Outcome nuance, e.g. severity when accepted or the duplicate-of signal id.\"),\n reason: z.string().min(1).optional().describe(\"Why the outcome was chosen.\"),\n decidedAt: isoDateTimeSchema.optional(),\n })\n .superRefine((signal, ctx) => {\n if (signal.outcome === \"pending\" && signal.decidedAt !== undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"decidedAt\"],\n message: \"pending signals must not carry decidedAt\",\n });\n }\n if (signal.outcome !== \"pending\" && signal.decidedAt === undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"decidedAt\"],\n message: \"decided signals require decidedAt\",\n });\n }\n });\n\nexport type SignalSource = z.infer<typeof signalSourceSchema>;\nexport type SignalOutcome = z.infer<typeof signalOutcomeSchema>;\nexport type Signal = z.infer<typeof signalSchema>;\n","import type { ChangeState } from \"./change\";\nimport type { SignalOutcome } from \"./signal\";\nimport type { TaskState } from \"./task\";\n\nexport type TransitionActor =\n | \"system\"\n | \"reconciler\"\n | \"foreman\"\n | \"operator\"\n | \"webhook\"\n | \"human\";\n\nexport interface Transition<State extends string> {\n readonly from: State;\n readonly to: State;\n readonly trigger: string;\n readonly actor: TransitionActor;\n}\n\nexport const taskInitialState = \"queued\" satisfies TaskState;\n\nexport const taskTransitions: readonly Transition<TaskState>[] = [\n {\n from: \"queued\",\n to: \"running\",\n trigger: \"dependencies have a change, reservation succeeded, devbox created\",\n actor: \"reconciler\",\n },\n { from: \"queued\", to: \"failed\", trigger: \"reservation refused\", actor: \"reconciler\" },\n { from: \"queued\", to: \"needs_human\", trigger: \"kind is question\", actor: \"system\" },\n { from: \"queued\", to: \"cancelled\", trigger: \"cancel or kill\", actor: \"operator\" },\n { from: \"running\", to: \"verifying\", trigger: \"devbox task reported complete\", actor: \"reconciler\" },\n {\n from: \"running\",\n to: \"failed\",\n trigger: \"devbox task errored or deadline exceeded\",\n actor: \"reconciler\",\n },\n {\n from: \"running\",\n to: \"needs_human\",\n trigger: \"devbox task requires attention\",\n actor: \"reconciler\",\n },\n { from: \"running\", to: \"cancelled\", trigger: \"cancel or kill\", actor: \"operator\" },\n { from: \"verifying\", to: \"succeeded\", trigger: \"kind criterion true\", actor: \"reconciler\" },\n {\n from: \"verifying\",\n to: \"running\",\n trigger: \"verification failed below attempt limit\",\n actor: \"reconciler\",\n },\n {\n from: \"verifying\",\n to: \"failed\",\n trigger: \"verification failed at attempt limit\",\n actor: \"reconciler\",\n },\n { from: \"verifying\", to: \"cancelled\", trigger: \"cancel or kill\", actor: \"operator\" },\n { from: \"needs_human\", to: \"succeeded\", trigger: \"question answered\", actor: \"operator\" },\n { from: \"needs_human\", to: \"queued\", trigger: \"operator retry\", actor: \"operator\" },\n { from: \"needs_human\", to: \"cancelled\", trigger: \"cancel or kill\", actor: \"operator\" },\n { from: \"failed\", to: \"queued\", trigger: \"operator retry\", actor: \"operator\" },\n];\n\nexport const changeInitialState = \"verifying\" satisfies ChangeState;\n\nexport const changeTransitions: readonly Transition<ChangeState>[] = [\n {\n from: \"verifying\",\n to: \"ready\",\n trigger: \"verification task succeeded, risk and confidence written\",\n actor: \"reconciler\",\n },\n {\n from: \"verifying\",\n to: \"closed\",\n trigger: \"verification failed at attempt limit or pr closed upstream\",\n actor: \"reconciler\",\n },\n { from: \"ready\", to: \"merged\", trigger: \"pr merged on github\", actor: \"webhook\" },\n { from: \"ready\", to: \"closed\", trigger: \"pr closed without merge\", actor: \"webhook\" },\n {\n from: \"merged\",\n to: \"deployed\",\n trigger: \"production deployment ready containing the merge sha\",\n actor: \"webhook\",\n },\n {\n from: \"deployed\",\n to: \"rolled_out\",\n trigger: \"no flag, or flag ramped to full and held\",\n actor: \"foreman\",\n },\n { from: \"deployed\", to: \"rolled_back\", trigger: \"rollback rule crossed\", actor: \"foreman\" },\n {\n from: \"rolled_out\",\n to: \"rolled_back\",\n trigger: \"rollback rule crossed or flag flipped off\",\n actor: \"foreman\",\n },\n { from: \"rolled_back\", to: \"deployed\", trigger: \"human retried the ramp\", actor: \"human\" },\n];\n\nexport const signalInitialOutcome = \"pending\" satisfies SignalOutcome;\n\nexport const signalOutcomeTransitions: readonly Transition<SignalOutcome>[] = [\n { from: \"pending\", to: \"accepted\", trigger: \"classified as actionable\", actor: \"reconciler\" },\n { from: \"pending\", to: \"duplicate\", trigger: \"classified as duplicate\", actor: \"reconciler\" },\n {\n from: \"pending\",\n to: \"unactionable\",\n trigger: \"classified as unactionable\",\n actor: \"reconciler\",\n },\n {\n from: \"pending\",\n to: \"low_confidence\",\n trigger: \"classified below confidence threshold\",\n actor: \"reconciler\",\n },\n { from: \"pending\", to: \"ignored\", trigger: \"classified as ignorable\", actor: \"reconciler\" },\n];\n\nexport function isTransitionAllowed<State extends string>(\n transitions: readonly Transition<State>[],\n from: State,\n to: State,\n): boolean {\n return transitions.some((transition) => transition.from === from && transition.to === to);\n}\n\nexport function legalNextStates<State extends string>(\n transitions: readonly Transition<State>[],\n from: State,\n): readonly State[] {\n return [\n ...new Set(\n transitions.filter((transition) => transition.from === from).map((t) => t.to),\n ),\n ];\n}\n\nexport class InvalidTransitionError<State extends string> extends Error {\n readonly from: State;\n readonly to: State;\n readonly legalNextStates: readonly State[];\n\n constructor(from: State, to: State, legal: readonly State[]) {\n super(\n legal.length > 0\n ? `invalid transition from \"${from}\" to \"${to}\"; legal next states: ${legal\n .map((state) => `\"${state}\"`)\n .join(\", \")}`\n : `invalid transition from \"${from}\" to \"${to}\"; \"${from}\" is terminal`,\n );\n this.name = \"InvalidTransitionError\";\n this.from = from;\n this.to = to;\n this.legalNextStates = legal;\n }\n}\n\nexport function assertTransition<State extends string>(\n transitions: readonly Transition<State>[],\n from: State,\n to: State,\n): void {\n if (!isTransitionAllowed(transitions, from, to)) {\n throw new InvalidTransitionError(from, to, legalNextStates(transitions, from));\n }\n}\n\nexport function terminalStates<State extends string>(\n transitions: readonly Transition<State>[],\n): readonly State[] {\n const states = new Set<State>();\n for (const transition of transitions) {\n states.add(transition.from);\n states.add(transition.to);\n }\n return [...states].filter(\n (state) => !transitions.some((transition) => transition.from === state),\n );\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport type { ZodType } from \"zod\";\nimport { SCHEMA_VERSION, type ReplyTo } from \"../schema/common\";\nimport type { ChangeId, RepositoryId, SignalId, TaskId } from \"../schema/id\";\nimport { changeSchema, type Change, type ChangeState, type Level } from \"../schema/change\";\nimport { receiptSchema, type Cost, type Receipt, type ReceiptState } from \"../schema/receipt\";\nimport { repositorySchema, type Repository } from \"../schema/repository\";\nimport { signalSchema, type Signal, type SignalOutcome, type SignalSource } from \"../schema/signal\";\nimport { taskSchema, type Task, type TaskState } from \"../schema/task\";\nimport {\n assertTransition,\n changeInitialState,\n changeTransitions,\n signalOutcomeTransitions,\n taskInitialState,\n taskTransitions,\n} from \"../schema/transitions\";\nimport { RecordExistsError, RecordNotFoundError, type CollectionName, type StoreDriver } from \"./driver\";\n\nexport interface CreateSignalInput {\n repositoryId: RepositoryId;\n source: SignalSource;\n deliveryId: string;\n replyTo: ReplyTo;\n payload: unknown;\n}\n\nexport interface DecideSignalOptions {\n detail?: string;\n reason?: string;\n}\n\nexport interface CreateTaskInput {\n repositoryIds: RepositoryId[];\n kind: Task[\"kind\"];\n origin: Task[\"origin\"];\n replyTo: ReplyTo;\n area?: string;\n dependsOn?: TaskId[];\n question?: Task[\"question\"];\n}\n\nexport type TaskPatch = Partial<\n Pick<Task, \"devbox\" | \"changeId\" | \"reportRef\" | \"reservedUsd\" | \"settledUsd\" | \"question\">\n>;\n\nexport interface TaskTransitionOptions {\n patch?: TaskPatch;\n reason?: string;\n}\n\nexport interface CreateChangeInput {\n repositoryId: RepositoryId;\n taskId?: TaskId;\n groupId?: TaskId;\n prNumber: number;\n prUrl: string;\n author: string;\n risk: Level;\n confidence: Level;\n evidence: Change[\"evidence\"];\n}\n\nexport type ChangePatch = Partial<Pick<Change, \"confidence\" | \"evidence\" | \"decidedBy\">>;\n\nexport interface ChangeTransitionOptions {\n patch?: ChangePatch;\n reason?: string;\n}\n\nexport interface AppendReceiptInput {\n repositoryIds: RepositoryId[];\n taskId?: TaskId;\n changeId?: ChangeId;\n kind: string;\n state: string;\n phase?: string;\n reason?: string;\n attempt?: number;\n cost?: Cost;\n decidedBy?: string;\n /** Same key twice appends one receipt and returns the existing one. */\n dedupeKey?: string;\n}\n\nexport interface FactoryStores {\n driverName: string;\n repositories: {\n put(repository: Repository): Promise<Repository>;\n get(id: RepositoryId): Promise<Repository | null>;\n list(): Promise<Repository[]>;\n };\n signals: {\n create(input: CreateSignalInput): Promise<Signal>;\n get(id: SignalId): Promise<Signal | null>;\n decide(id: SignalId, outcome: SignalOutcome, options?: DecideSignalOptions): Promise<Signal>;\n list(): Promise<Signal[]>;\n };\n tasks: {\n create(input: CreateTaskInput): Promise<Task>;\n get(id: TaskId): Promise<Task | null>;\n transition(id: TaskId, to: TaskState, options?: TaskTransitionOptions): Promise<Task>;\n list(): Promise<Task[]>;\n };\n changes: {\n create(input: CreateChangeInput): Promise<Change>;\n get(id: ChangeId): Promise<Change | null>;\n transition(id: ChangeId, to: ChangeState, options?: ChangeTransitionOptions): Promise<Change>;\n list(): Promise<Change[]>;\n };\n receipts: {\n append(input: AppendReceiptInput): Promise<Receipt>;\n get(id: string): Promise<Receipt | null>;\n list(): Promise<Receipt[]>;\n };\n}\n\nexport interface CreateStoresOptions {\n driver: StoreDriver;\n now?: () => string;\n}\n\nconst taskReceiptStates: Partial<Record<TaskState, ReceiptState>> = {\n running: \"dispatched\",\n succeeded: \"succeeded\",\n failed: \"failed\",\n needs_human: \"needs_human\",\n cancelled: \"cancelled\",\n};\n\nconst changeReceiptStates: Partial<Record<ChangeState, ReceiptState>> = {\n merged: \"merged\",\n deployed: \"deployed\",\n rolled_out: \"rolled_out\",\n rolled_back: \"rolled_back\",\n};\n\nfunction randomId(prefix: string): string {\n return `${prefix}_${randomUUID().replaceAll(\"-\", \"\")}`;\n}\n\nfunction derivedId(prefix: string, key: string): string {\n return `${prefix}_${createHash(\"sha256\").update(key).digest(\"hex\").slice(0, 32)}`;\n}\n\nfunction bumpsAttempt(from: TaskState, to: TaskState): boolean {\n return to === \"queued\" || (from === \"verifying\" && to === \"running\");\n}\n\nexport function createStores(options: CreateStoresOptions): FactoryStores {\n const { driver } = options;\n const now = options.now ?? (() => new Date().toISOString());\n\n async function read<T>(\n collection: CollectionName,\n id: string,\n schema: ZodType<T>,\n ): Promise<{ value: T; version: number } | null> {\n const record = await driver.get(collection, id);\n if (record === null) {\n return null;\n }\n return { value: schema.parse(record.value), version: record.version };\n }\n\n async function mustRead<T>(\n collection: CollectionName,\n id: string,\n schema: ZodType<T>,\n ): Promise<{ value: T; version: number }> {\n const record = await read(collection, id, schema);\n if (record === null) {\n throw new RecordNotFoundError(collection, id);\n }\n return record;\n }\n\n async function listAll<T>(collection: CollectionName, schema: ZodType<T>): Promise<T[]> {\n const entries = await driver.list(collection);\n return entries.map((entry) => schema.parse(entry.record.value));\n }\n\n // Receipts are append-only and their inserts are idempotent: an existing id\n // returns the stored receipt instead of writing a second one. Transition\n // receipts use ids derived from their content key and are written before\n // the entity transition persists, so a failed write leaves the transition\n // unpersisted and a retry re-runs both.\n async function insertReceipt(\n receiptId: string,\n receipt: Omit<Receipt, \"schemaVersion\" | \"receiptId\" | \"recordedAt\">,\n ): Promise<Receipt> {\n const full = receiptSchema.parse({\n ...receipt,\n schemaVersion: SCHEMA_VERSION,\n receiptId,\n recordedAt: now(),\n });\n try {\n await driver.insert(\"receipts\", receiptId, full);\n return full;\n } catch (error) {\n if (error instanceof RecordExistsError) {\n const existing = await mustRead(\"receipts\", receiptId, receiptSchema);\n return existing.value;\n }\n throw error;\n }\n }\n\n async function appendReceipt(\n key: string,\n receipt: Omit<Receipt, \"schemaVersion\" | \"receiptId\" | \"recordedAt\">,\n ): Promise<void> {\n await insertReceipt(derivedId(\"rcpt\", key), receipt);\n }\n\n return {\n driverName: driver.name,\n\n repositories: {\n async put(repository) {\n const parsed = repositorySchema.parse(repository);\n const existing = await read(\"repositories\", parsed.id, repositorySchema);\n if (existing === null) {\n await driver.insert(\"repositories\", parsed.id, parsed);\n } else {\n await driver.update(\"repositories\", parsed.id, parsed, existing.version);\n }\n return parsed;\n },\n async get(id) {\n const record = await read(\"repositories\", id, repositorySchema);\n return record === null ? null : record.value;\n },\n list() {\n return listAll(\"repositories\", repositorySchema);\n },\n },\n\n signals: {\n async create(input) {\n const id = derivedId(\"sig\", `${input.source}:${input.deliveryId}`);\n const signal = signalSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n repositoryId: input.repositoryId,\n source: input.source,\n deliveryId: input.deliveryId,\n replyTo: input.replyTo,\n payload: input.payload,\n receivedAt: now(),\n outcome: \"pending\",\n });\n try {\n await driver.insert(\"signals\", id, signal);\n return signal;\n } catch (error) {\n if (error instanceof RecordExistsError) {\n const existing = await mustRead(\"signals\", id, signalSchema);\n return existing.value;\n }\n throw error;\n }\n },\n async get(id) {\n const record = await read(\"signals\", id, signalSchema);\n return record === null ? null : record.value;\n },\n async decide(id, outcome, decideOptions = {}) {\n const existing = await mustRead(\"signals\", id, signalSchema);\n assertTransition(signalOutcomeTransitions, existing.value.outcome, outcome);\n const next = signalSchema.parse({\n ...existing.value,\n outcome,\n detail: decideOptions.detail,\n reason: decideOptions.reason,\n decidedAt: now(),\n });\n await driver.update(\"signals\", id, next, existing.version);\n return next;\n },\n list() {\n return listAll(\"signals\", signalSchema);\n },\n },\n\n tasks: {\n async create(input) {\n const timestamp = now();\n const task = taskSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id: randomId(\"task\"),\n repositoryIds: input.repositoryIds,\n kind: input.kind,\n area: input.area,\n state: taskInitialState,\n origin: input.origin,\n dependsOn: input.dependsOn,\n replyTo: input.replyTo,\n attempt: 1,\n question: input.question,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n await driver.insert(\"tasks\", task.id, task);\n return task;\n },\n async get(id) {\n const record = await read(\"tasks\", id, taskSchema);\n return record === null ? null : record.value;\n },\n async transition(id, to, transitionOptions = {}) {\n const existing = await mustRead(\"tasks\", id, taskSchema);\n assertTransition(taskTransitions, existing.value.state, to);\n const attempt = bumpsAttempt(existing.value.state, to)\n ? existing.value.attempt + 1\n : existing.value.attempt;\n const next = taskSchema.parse({\n ...existing.value,\n ...transitionOptions.patch,\n state: to,\n attempt,\n updatedAt: now(),\n });\n const receiptState = taskReceiptStates[to];\n if (receiptState !== undefined && next.repositoryIds !== undefined) {\n await appendReceipt(`task:${id}:${receiptState}:${attempt}`, {\n repositoryIds: next.repositoryIds,\n taskId: id,\n changeId: next.changeId,\n kind: next.kind,\n state: receiptState,\n reason: transitionOptions.reason,\n attempt,\n });\n }\n await driver.update(\"tasks\", id, next, existing.version);\n return next;\n },\n list() {\n return listAll(\"tasks\", taskSchema);\n },\n },\n\n changes: {\n async create(input) {\n const timestamp = now();\n const change = changeSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id: randomId(\"chg\"),\n repositoryId: input.repositoryId,\n taskId: input.taskId,\n groupId: input.groupId,\n prNumber: input.prNumber,\n prUrl: input.prUrl,\n author: input.author,\n risk: input.risk,\n confidence: input.confidence,\n evidence: input.evidence,\n state: changeInitialState,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n await driver.insert(\"changes\", change.id, change);\n return change;\n },\n async get(id) {\n const record = await read(\"changes\", id, changeSchema);\n return record === null ? null : record.value;\n },\n async transition(id, to, transitionOptions = {}) {\n const existing = await mustRead(\"changes\", id, changeSchema);\n assertTransition(changeTransitions, existing.value.state, to);\n const next = changeSchema.parse({\n ...existing.value,\n ...transitionOptions.patch,\n state: to,\n updatedAt: now(),\n });\n const receiptState = changeReceiptStates[to];\n if (receiptState !== undefined) {\n await appendReceipt(`change:${id}:${receiptState}`, {\n repositoryIds: [next.repositoryId],\n taskId: next.taskId,\n changeId: id,\n kind: \"change\",\n state: receiptState,\n reason: transitionOptions.reason,\n attempt: 1,\n decidedBy: next.decidedBy,\n });\n }\n await driver.update(\"changes\", id, next, existing.version);\n return next;\n },\n list() {\n return listAll(\"changes\", changeSchema);\n },\n },\n\n receipts: {\n append(input) {\n const { dedupeKey, attempt, ...fields } = input;\n const receiptId =\n dedupeKey === undefined ? randomId(\"rcpt\") : derivedId(\"rcpt\", `custom:${dedupeKey}`);\n return insertReceipt(receiptId, { ...fields, attempt: attempt ?? 1 });\n },\n async get(id) {\n const record = await read(\"receipts\", id, receiptSchema);\n return record === null ? null : record.value;\n },\n list() {\n return listAll(\"receipts\", receiptSchema);\n },\n },\n };\n}\n","import {\n RecordExistsError,\n RecordNotFoundError,\n VersionConflictError,\n type CollectionName,\n type StoredEntry,\n type StoredRecord,\n type StoreDriver,\n} from \"./driver\";\n\nexport function createInMemoryDriver(): StoreDriver {\n const collections = new Map<CollectionName, Map<string, StoredRecord>>();\n\n function collection(name: CollectionName): Map<string, StoredRecord> {\n let existing = collections.get(name);\n if (existing === undefined) {\n existing = new Map();\n collections.set(name, existing);\n }\n return existing;\n }\n\n return {\n name: \"memory\",\n\n get(name, id) {\n const record = collection(name).get(id);\n return Promise.resolve(record === undefined ? null : structuredClone(record));\n },\n\n insert(name, id, value) {\n const records = collection(name);\n if (records.has(id)) {\n return Promise.reject(new RecordExistsError(name, id));\n }\n records.set(id, { value: structuredClone(value), version: 1 });\n return Promise.resolve();\n },\n\n update(name, id, value, expectedVersion) {\n const records = collection(name);\n const existing = records.get(id);\n if (existing === undefined) {\n return Promise.reject(new RecordNotFoundError(name, id));\n }\n if (existing.version !== expectedVersion) {\n return Promise.reject(new VersionConflictError(name, id, expectedVersion));\n }\n records.set(id, { value: structuredClone(value), version: existing.version + 1 });\n return Promise.resolve();\n },\n\n list(name) {\n const entries: StoredEntry[] = [...collection(name)].map(([id, record]) => ({\n id,\n record: structuredClone(record),\n }));\n return Promise.resolve(entries);\n },\n };\n}\n"],"mappings":"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","names":["z","z","z","z","z","z"]}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
|
2
|
+
import { PgDatabase, PgQueryResultHKT } from 'drizzle-orm/pg-core';
|
|
3
|
+
import { S as StoreDriver } from '../driver-tRNggCCJ.js';
|
|
4
|
+
|
|
5
|
+
type FactoryDatabase = PgDatabase<PgQueryResultHKT>;
|
|
6
|
+
declare const factoryRecords: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
7
|
+
name: "factory_records";
|
|
8
|
+
schema: undefined;
|
|
9
|
+
columns: {
|
|
10
|
+
collection: drizzle_orm_pg_core.PgColumn<{
|
|
11
|
+
name: "collection";
|
|
12
|
+
tableName: "factory_records";
|
|
13
|
+
dataType: "string";
|
|
14
|
+
columnType: "PgText";
|
|
15
|
+
data: string;
|
|
16
|
+
driverParam: string;
|
|
17
|
+
notNull: true;
|
|
18
|
+
hasDefault: false;
|
|
19
|
+
isPrimaryKey: false;
|
|
20
|
+
isAutoincrement: false;
|
|
21
|
+
hasRuntimeDefault: false;
|
|
22
|
+
enumValues: [string, ...string[]];
|
|
23
|
+
baseColumn: never;
|
|
24
|
+
identity: undefined;
|
|
25
|
+
generated: undefined;
|
|
26
|
+
}, {}, {}>;
|
|
27
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
28
|
+
name: "id";
|
|
29
|
+
tableName: "factory_records";
|
|
30
|
+
dataType: "string";
|
|
31
|
+
columnType: "PgText";
|
|
32
|
+
data: string;
|
|
33
|
+
driverParam: string;
|
|
34
|
+
notNull: true;
|
|
35
|
+
hasDefault: false;
|
|
36
|
+
isPrimaryKey: false;
|
|
37
|
+
isAutoincrement: false;
|
|
38
|
+
hasRuntimeDefault: false;
|
|
39
|
+
enumValues: [string, ...string[]];
|
|
40
|
+
baseColumn: never;
|
|
41
|
+
identity: undefined;
|
|
42
|
+
generated: undefined;
|
|
43
|
+
}, {}, {}>;
|
|
44
|
+
value: drizzle_orm_pg_core.PgColumn<{
|
|
45
|
+
name: "value";
|
|
46
|
+
tableName: "factory_records";
|
|
47
|
+
dataType: "json";
|
|
48
|
+
columnType: "PgJsonb";
|
|
49
|
+
data: unknown;
|
|
50
|
+
driverParam: unknown;
|
|
51
|
+
notNull: true;
|
|
52
|
+
hasDefault: false;
|
|
53
|
+
isPrimaryKey: false;
|
|
54
|
+
isAutoincrement: false;
|
|
55
|
+
hasRuntimeDefault: false;
|
|
56
|
+
enumValues: undefined;
|
|
57
|
+
baseColumn: never;
|
|
58
|
+
identity: undefined;
|
|
59
|
+
generated: undefined;
|
|
60
|
+
}, {}, {
|
|
61
|
+
$type: unknown;
|
|
62
|
+
}>;
|
|
63
|
+
version: drizzle_orm_pg_core.PgColumn<{
|
|
64
|
+
name: "version";
|
|
65
|
+
tableName: "factory_records";
|
|
66
|
+
dataType: "number";
|
|
67
|
+
columnType: "PgInteger";
|
|
68
|
+
data: number;
|
|
69
|
+
driverParam: string | number;
|
|
70
|
+
notNull: true;
|
|
71
|
+
hasDefault: false;
|
|
72
|
+
isPrimaryKey: false;
|
|
73
|
+
isAutoincrement: false;
|
|
74
|
+
hasRuntimeDefault: false;
|
|
75
|
+
enumValues: undefined;
|
|
76
|
+
baseColumn: never;
|
|
77
|
+
identity: undefined;
|
|
78
|
+
generated: undefined;
|
|
79
|
+
}, {}, {}>;
|
|
80
|
+
};
|
|
81
|
+
dialect: "pg";
|
|
82
|
+
}>;
|
|
83
|
+
declare const factoryMigrationsLedger: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
84
|
+
name: "factory_migrations";
|
|
85
|
+
schema: undefined;
|
|
86
|
+
columns: {
|
|
87
|
+
tag: drizzle_orm_pg_core.PgColumn<{
|
|
88
|
+
name: "tag";
|
|
89
|
+
tableName: "factory_migrations";
|
|
90
|
+
dataType: "string";
|
|
91
|
+
columnType: "PgText";
|
|
92
|
+
data: string;
|
|
93
|
+
driverParam: string;
|
|
94
|
+
notNull: true;
|
|
95
|
+
hasDefault: false;
|
|
96
|
+
isPrimaryKey: true;
|
|
97
|
+
isAutoincrement: false;
|
|
98
|
+
hasRuntimeDefault: false;
|
|
99
|
+
enumValues: [string, ...string[]];
|
|
100
|
+
baseColumn: never;
|
|
101
|
+
identity: undefined;
|
|
102
|
+
generated: undefined;
|
|
103
|
+
}, {}, {}>;
|
|
104
|
+
appliedAt: drizzle_orm_pg_core.PgColumn<{
|
|
105
|
+
name: "applied_at";
|
|
106
|
+
tableName: "factory_migrations";
|
|
107
|
+
dataType: "date";
|
|
108
|
+
columnType: "PgTimestamp";
|
|
109
|
+
data: Date;
|
|
110
|
+
driverParam: string;
|
|
111
|
+
notNull: true;
|
|
112
|
+
hasDefault: true;
|
|
113
|
+
isPrimaryKey: false;
|
|
114
|
+
isAutoincrement: false;
|
|
115
|
+
hasRuntimeDefault: false;
|
|
116
|
+
enumValues: undefined;
|
|
117
|
+
baseColumn: never;
|
|
118
|
+
identity: undefined;
|
|
119
|
+
generated: undefined;
|
|
120
|
+
}, {}, {}>;
|
|
121
|
+
};
|
|
122
|
+
dialect: "pg";
|
|
123
|
+
}>;
|
|
124
|
+
interface FactoryMigration {
|
|
125
|
+
readonly tag: string;
|
|
126
|
+
readonly statements: readonly string[];
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Checked-in, append-only migration list. Statements must be idempotent:
|
|
130
|
+
* they run before the ledger records them, so an interrupted run re-executes
|
|
131
|
+
* them on retry. Never edit or reorder an entry that has shipped.
|
|
132
|
+
*/
|
|
133
|
+
declare const factoryMigrations: readonly FactoryMigration[];
|
|
134
|
+
declare function applyFactoryMigrations(db: FactoryDatabase): Promise<readonly string[]>;
|
|
135
|
+
declare function createPostgresDriver(db: FactoryDatabase): StoreDriver;
|
|
136
|
+
|
|
137
|
+
export { type FactoryDatabase, type FactoryMigration, applyFactoryMigrations, createPostgresDriver, factoryMigrations, factoryMigrationsLedger, factoryRecords };
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import {
|
|
2
|
+
RecordExistsError,
|
|
3
|
+
RecordNotFoundError,
|
|
4
|
+
VersionConflictError
|
|
5
|
+
} from "../chunk-CEF6VJZC.js";
|
|
6
|
+
|
|
7
|
+
// src/postgres/index.ts
|
|
8
|
+
import { and, eq, sql } from "drizzle-orm";
|
|
9
|
+
import {
|
|
10
|
+
integer,
|
|
11
|
+
jsonb,
|
|
12
|
+
pgTable,
|
|
13
|
+
primaryKey,
|
|
14
|
+
text,
|
|
15
|
+
timestamp
|
|
16
|
+
} from "drizzle-orm/pg-core";
|
|
17
|
+
var factoryRecords = pgTable(
|
|
18
|
+
"factory_records",
|
|
19
|
+
{
|
|
20
|
+
collection: text("collection").notNull(),
|
|
21
|
+
id: text("id").notNull(),
|
|
22
|
+
value: jsonb("value").$type().notNull(),
|
|
23
|
+
version: integer("version").notNull()
|
|
24
|
+
},
|
|
25
|
+
(table) => [primaryKey({ columns: [table.collection, table.id] })]
|
|
26
|
+
);
|
|
27
|
+
var factoryMigrationsLedger = pgTable("factory_migrations", {
|
|
28
|
+
tag: text("tag").primaryKey(),
|
|
29
|
+
appliedAt: timestamp("applied_at", { withTimezone: true }).notNull().defaultNow()
|
|
30
|
+
});
|
|
31
|
+
var factoryMigrations = [
|
|
32
|
+
{
|
|
33
|
+
tag: "0000_factory_records",
|
|
34
|
+
statements: [
|
|
35
|
+
`CREATE TABLE IF NOT EXISTS "factory_records" (
|
|
36
|
+
"collection" text NOT NULL,
|
|
37
|
+
"id" text NOT NULL,
|
|
38
|
+
"value" jsonb NOT NULL,
|
|
39
|
+
"version" integer NOT NULL,
|
|
40
|
+
CONSTRAINT "factory_records_pk" PRIMARY KEY ("collection", "id")
|
|
41
|
+
)`
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
];
|
|
45
|
+
var migrationsLedgerDdl = `CREATE TABLE IF NOT EXISTS "factory_migrations" (
|
|
46
|
+
"tag" text PRIMARY KEY,
|
|
47
|
+
"applied_at" timestamptz NOT NULL DEFAULT now()
|
|
48
|
+
)`;
|
|
49
|
+
async function applyFactoryMigrations(db) {
|
|
50
|
+
await db.execute(sql.raw(migrationsLedgerDdl));
|
|
51
|
+
const applied = [];
|
|
52
|
+
for (const migration of factoryMigrations) {
|
|
53
|
+
const existing = await db.select({ tag: factoryMigrationsLedger.tag }).from(factoryMigrationsLedger).where(eq(factoryMigrationsLedger.tag, migration.tag)).limit(1);
|
|
54
|
+
if (existing.length > 0) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
for (const statement of migration.statements) {
|
|
58
|
+
await db.execute(sql.raw(statement));
|
|
59
|
+
}
|
|
60
|
+
await db.insert(factoryMigrationsLedger).values({ tag: migration.tag }).onConflictDoNothing();
|
|
61
|
+
applied.push(migration.tag);
|
|
62
|
+
}
|
|
63
|
+
return applied;
|
|
64
|
+
}
|
|
65
|
+
function createPostgresDriver(db) {
|
|
66
|
+
async function readRecord(collection, id) {
|
|
67
|
+
const rows = await db.select({ value: factoryRecords.value, version: factoryRecords.version }).from(factoryRecords).where(and(eq(factoryRecords.collection, collection), eq(factoryRecords.id, id))).limit(1);
|
|
68
|
+
const row = rows[0];
|
|
69
|
+
return row === void 0 ? null : { value: row.value, version: row.version };
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
name: "postgres",
|
|
73
|
+
get(collection, id) {
|
|
74
|
+
return readRecord(collection, id);
|
|
75
|
+
},
|
|
76
|
+
async insert(collection, id, value) {
|
|
77
|
+
const inserted = await db.insert(factoryRecords).values({ collection, id, value, version: 1 }).onConflictDoNothing().returning({ id: factoryRecords.id });
|
|
78
|
+
if (inserted.length === 0) {
|
|
79
|
+
throw new RecordExistsError(collection, id);
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
async update(collection, id, value, expectedVersion) {
|
|
83
|
+
const updated = await db.update(factoryRecords).set({ value, version: expectedVersion + 1 }).where(
|
|
84
|
+
and(
|
|
85
|
+
eq(factoryRecords.collection, collection),
|
|
86
|
+
eq(factoryRecords.id, id),
|
|
87
|
+
eq(factoryRecords.version, expectedVersion)
|
|
88
|
+
)
|
|
89
|
+
).returning({ id: factoryRecords.id });
|
|
90
|
+
if (updated.length === 0) {
|
|
91
|
+
const existing = await readRecord(collection, id);
|
|
92
|
+
if (existing === null) {
|
|
93
|
+
throw new RecordNotFoundError(collection, id);
|
|
94
|
+
}
|
|
95
|
+
throw new VersionConflictError(collection, id, expectedVersion);
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
async list(collection) {
|
|
99
|
+
const rows = await db.select({
|
|
100
|
+
id: factoryRecords.id,
|
|
101
|
+
value: factoryRecords.value,
|
|
102
|
+
version: factoryRecords.version
|
|
103
|
+
}).from(factoryRecords).where(eq(factoryRecords.collection, collection));
|
|
104
|
+
return rows.map((row) => ({
|
|
105
|
+
id: row.id,
|
|
106
|
+
record: { value: row.value, version: row.version }
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export {
|
|
112
|
+
applyFactoryMigrations,
|
|
113
|
+
createPostgresDriver,
|
|
114
|
+
factoryMigrations,
|
|
115
|
+
factoryMigrationsLedger,
|
|
116
|
+
factoryRecords
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/postgres/index.ts"],"sourcesContent":["import { and, eq, sql } from \"drizzle-orm\";\nimport {\n integer,\n jsonb,\n pgTable,\n primaryKey,\n text,\n timestamp,\n type PgDatabase,\n type PgQueryResultHKT,\n} from \"drizzle-orm/pg-core\";\nimport {\n RecordExistsError,\n RecordNotFoundError,\n VersionConflictError,\n type CollectionName,\n type StoreDriver,\n} from \"../store/driver\";\n\nexport type FactoryDatabase = PgDatabase<PgQueryResultHKT>;\n\nexport const factoryRecords = pgTable(\n \"factory_records\",\n {\n collection: text(\"collection\").notNull(),\n id: text(\"id\").notNull(),\n value: jsonb(\"value\").$type<unknown>().notNull(),\n version: integer(\"version\").notNull(),\n },\n (table) => [primaryKey({ columns: [table.collection, table.id] })],\n);\n\nexport const factoryMigrationsLedger = pgTable(\"factory_migrations\", {\n tag: text(\"tag\").primaryKey(),\n appliedAt: timestamp(\"applied_at\", { withTimezone: true }).notNull().defaultNow(),\n});\n\nexport interface FactoryMigration {\n readonly tag: string;\n readonly statements: readonly string[];\n}\n\n/**\n * Checked-in, append-only migration list. Statements must be idempotent:\n * they run before the ledger records them, so an interrupted run re-executes\n * them on retry. Never edit or reorder an entry that has shipped.\n */\nexport const factoryMigrations: readonly FactoryMigration[] = [\n {\n tag: \"0000_factory_records\",\n statements: [\n `CREATE TABLE IF NOT EXISTS \"factory_records\" (\n \"collection\" text NOT NULL,\n \"id\" text NOT NULL,\n \"value\" jsonb NOT NULL,\n \"version\" integer NOT NULL,\n CONSTRAINT \"factory_records_pk\" PRIMARY KEY (\"collection\", \"id\")\n )`,\n ],\n },\n];\n\nconst migrationsLedgerDdl = `CREATE TABLE IF NOT EXISTS \"factory_migrations\" (\n \"tag\" text PRIMARY KEY,\n \"applied_at\" timestamptz NOT NULL DEFAULT now()\n)`;\n\nexport async function applyFactoryMigrations(db: FactoryDatabase): Promise<readonly string[]> {\n await db.execute(sql.raw(migrationsLedgerDdl));\n const applied: string[] = [];\n for (const migration of factoryMigrations) {\n const existing = await db\n .select({ tag: factoryMigrationsLedger.tag })\n .from(factoryMigrationsLedger)\n .where(eq(factoryMigrationsLedger.tag, migration.tag))\n .limit(1);\n if (existing.length > 0) {\n continue;\n }\n for (const statement of migration.statements) {\n await db.execute(sql.raw(statement));\n }\n await db\n .insert(factoryMigrationsLedger)\n .values({ tag: migration.tag })\n .onConflictDoNothing();\n applied.push(migration.tag);\n }\n return applied;\n}\n\nexport function createPostgresDriver(db: FactoryDatabase): StoreDriver {\n async function readRecord(\n collection: CollectionName,\n id: string,\n ): Promise<{ value: unknown; version: number } | null> {\n const rows = await db\n .select({ value: factoryRecords.value, version: factoryRecords.version })\n .from(factoryRecords)\n .where(and(eq(factoryRecords.collection, collection), eq(factoryRecords.id, id)))\n .limit(1);\n const row = rows[0];\n return row === undefined ? null : { value: row.value, version: row.version };\n }\n\n return {\n name: \"postgres\",\n\n get(collection, id) {\n return readRecord(collection, id);\n },\n\n async insert(collection, id, value) {\n const inserted = await db\n .insert(factoryRecords)\n .values({ collection, id, value, version: 1 })\n .onConflictDoNothing()\n .returning({ id: factoryRecords.id });\n if (inserted.length === 0) {\n throw new RecordExistsError(collection, id);\n }\n },\n\n async update(collection, id, value, expectedVersion) {\n const updated = await db\n .update(factoryRecords)\n .set({ value, version: expectedVersion + 1 })\n .where(\n and(\n eq(factoryRecords.collection, collection),\n eq(factoryRecords.id, id),\n eq(factoryRecords.version, expectedVersion),\n ),\n )\n .returning({ id: factoryRecords.id });\n if (updated.length === 0) {\n const existing = await readRecord(collection, id);\n if (existing === null) {\n throw new RecordNotFoundError(collection, id);\n }\n throw new VersionConflictError(collection, id, expectedVersion);\n }\n },\n\n async list(collection) {\n const rows = await db\n .select({\n id: factoryRecords.id,\n value: factoryRecords.value,\n version: factoryRecords.version,\n })\n .from(factoryRecords)\n .where(eq(factoryRecords.collection, collection));\n return rows.map((row) => ({\n id: row.id,\n record: { value: row.value, version: row.version },\n }));\n },\n };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vercel/factory",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Schema, state machines, and kernel primitives for Agent Factory.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
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
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./postgres": {
|
|
16
|
+
"types": "./dist/postgres/index.d.ts",
|
|
17
|
+
"import": "./dist/postgres/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./blob": {
|
|
20
|
+
"types": "./dist/blob/index.d.ts",
|
|
21
|
+
"import": "./dist/blob/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./eve": {
|
|
24
|
+
"types": "./dist/eve/index.d.ts",
|
|
25
|
+
"import": "./dist/eve/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./connectors/github": {
|
|
28
|
+
"types": "./dist/connectors/github.d.ts",
|
|
29
|
+
"import": "./dist/connectors/github.js"
|
|
30
|
+
},
|
|
31
|
+
"./next": {
|
|
32
|
+
"types": "./dist/next.d.ts",
|
|
33
|
+
"import": "./dist/next.js"
|
|
34
|
+
},
|
|
35
|
+
"./next/page": {
|
|
36
|
+
"types": "./dist/next-page.d.ts",
|
|
37
|
+
"import": "./dist/next-page.js"
|
|
38
|
+
},
|
|
39
|
+
"./package.json": "./package.json"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist"
|
|
43
|
+
],
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsup",
|
|
46
|
+
"clean": "rm -rf dist",
|
|
47
|
+
"test": "vitest run",
|
|
48
|
+
"typecheck": "tsc"
|
|
49
|
+
},
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=22"
|
|
52
|
+
},
|
|
53
|
+
"peerDependencies": {
|
|
54
|
+
"@vercel/blob": "^2.6.0",
|
|
55
|
+
"drizzle-orm": "^0.45.0",
|
|
56
|
+
"eve": "^0.46.0",
|
|
57
|
+
"react": "^19.2.0",
|
|
58
|
+
"zod": "^4.4.3"
|
|
59
|
+
},
|
|
60
|
+
"peerDependenciesMeta": {
|
|
61
|
+
"@vercel/blob": {
|
|
62
|
+
"optional": true
|
|
63
|
+
},
|
|
64
|
+
"drizzle-orm": {
|
|
65
|
+
"optional": true
|
|
66
|
+
},
|
|
67
|
+
"eve": {
|
|
68
|
+
"optional": true
|
|
69
|
+
},
|
|
70
|
+
"react": {
|
|
71
|
+
"optional": true
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"@electric-sql/pglite": "^0.5.7",
|
|
76
|
+
"@types/node": "24.x",
|
|
77
|
+
"@vercel/blob": "^2.8.0",
|
|
78
|
+
"drizzle-orm": "^0.45.2",
|
|
79
|
+
"eve": "^0.46.1",
|
|
80
|
+
"@types/react": "^19.2.15",
|
|
81
|
+
"react": "^19.2.8",
|
|
82
|
+
"tsup": "^8.5.0",
|
|
83
|
+
"typescript": "5.9.3",
|
|
84
|
+
"vitest": "4.1.9",
|
|
85
|
+
"zod": "4.4.3"
|
|
86
|
+
}
|
|
87
|
+
}
|