@mastra/factory 0.6.0 → 0.7.0-alpha.1

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.
Files changed (77) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/dist/factory.d.ts.map +1 -1
  3. package/dist/factory.js +8 -1
  4. package/dist/factory.js.map +1 -1
  5. package/dist/integrations/github/issue-triage.js +2 -2
  6. package/dist/integrations/github/issue-triage.js.map +1 -1
  7. package/dist/integrations/github/routes.d.ts.map +1 -1
  8. package/dist/integrations/github/routes.js +3 -3
  9. package/dist/integrations/github/routes.js.map +1 -1
  10. package/dist/integrations/github/rules.d.ts.map +1 -1
  11. package/dist/integrations/github/rules.js +2 -1
  12. package/dist/integrations/github/rules.js.map +1 -1
  13. package/dist/integrations/github/webhook.d.ts.map +1 -1
  14. package/dist/integrations/github/webhook.js +2 -2
  15. package/dist/integrations/github/webhook.js.map +1 -1
  16. package/dist/integrations/platform/github/event-worker.d.ts.map +1 -1
  17. package/dist/integrations/platform/github/event-worker.js +15 -4
  18. package/dist/integrations/platform/github/event-worker.js.map +1 -1
  19. package/dist/routes/projects.d.ts.map +1 -1
  20. package/dist/routes/projects.js +4 -0
  21. package/dist/routes/projects.js.map +1 -1
  22. package/dist/routes/skills.d.ts.map +1 -1
  23. package/dist/routes/skills.js +30 -9
  24. package/dist/routes/skills.js.map +1 -1
  25. package/dist/routes/surface.d.ts.map +1 -1
  26. package/dist/routes/surface.js +3 -1
  27. package/dist/routes/surface.js.map +1 -1
  28. package/dist/routes/work-items.d.ts +3 -0
  29. package/dist/routes/work-items.d.ts.map +1 -1
  30. package/dist/routes/work-items.js +63 -4
  31. package/dist/routes/work-items.js.map +1 -1
  32. package/dist/rules/defaults.d.ts.map +1 -1
  33. package/dist/rules/defaults.js +18 -3
  34. package/dist/rules/defaults.js.map +1 -1
  35. package/dist/rules/dispatcher.d.ts +5 -0
  36. package/dist/rules/dispatcher.d.ts.map +1 -1
  37. package/dist/rules/dispatcher.js +15 -0
  38. package/dist/rules/dispatcher.js.map +1 -1
  39. package/dist/rules/start-coordinator.d.ts.map +1 -1
  40. package/dist/rules/start-coordinator.js +1 -1
  41. package/dist/rules/start-coordinator.js.map +1 -1
  42. package/dist/rules/types.d.ts +1 -0
  43. package/dist/rules/types.d.ts.map +1 -1
  44. package/dist/rules/types.js.map +1 -1
  45. package/dist/rules/validation.d.ts.map +1 -1
  46. package/dist/rules/validation.js +5 -2
  47. package/dist/rules/validation.js.map +1 -1
  48. package/dist/session/checkpoint-capture.d.ts.map +1 -1
  49. package/dist/session/checkpoint-capture.js +1 -1
  50. package/dist/session/checkpoint-capture.js.map +1 -1
  51. package/dist/session/live-sessions.d.ts +33 -0
  52. package/dist/session/live-sessions.d.ts.map +1 -0
  53. package/dist/session/live-sessions.js +28 -0
  54. package/dist/session/live-sessions.js.map +1 -0
  55. package/dist/skills/catalog.d.ts +9 -0
  56. package/dist/skills/catalog.d.ts.map +1 -0
  57. package/dist/skills/catalog.js +45 -0
  58. package/dist/skills/catalog.js.map +1 -0
  59. package/dist/storage/domains/projects/base.d.ts +3 -0
  60. package/dist/storage/domains/projects/base.d.ts.map +1 -1
  61. package/dist/storage/domains/projects/base.js +7 -0
  62. package/dist/storage/domains/projects/base.js.map +1 -1
  63. package/dist/storage/domains/work-items/base.d.ts +19 -14
  64. package/dist/storage/domains/work-items/base.d.ts.map +1 -1
  65. package/dist/storage/domains/work-items/base.js +75 -21
  66. package/dist/storage/domains/work-items/base.js.map +1 -1
  67. package/dist/storage/domains/work-items/metrics.d.ts +27 -22
  68. package/dist/storage/domains/work-items/metrics.d.ts.map +1 -1
  69. package/dist/storage/domains/work-items/metrics.js +79 -49
  70. package/dist/storage/domains/work-items/metrics.js.map +1 -1
  71. package/dist/workspace.d.ts +2 -0
  72. package/dist/workspace.d.ts.map +1 -1
  73. package/dist/workspace.js +2 -1
  74. package/dist/workspace.js.map +1 -1
  75. package/factory-skills/factory-rereview/SKILL.md +166 -0
  76. package/factory-skills/factory-triage/SKILL.md +3 -3
  77. package/package.json +6 -6
@@ -19,28 +19,18 @@ function factoryDecisionHash(decision) {
19
19
  return createHash("sha256").update(stableJson(decision)).digest("hex");
20
20
  }
21
21
  /**
22
- * Sentinel actor ids that mark a stage transition as automation-driven (vs a
23
- * human's WorkOS user id): generic sentinels plus the system ids the Factory
24
- * rules engine stamps (see `actorId` in factory/rules/transition-service.ts).
25
- * Metrics treat any other actor — including a missing `exitedBy` on
26
- * pre-existing entries as human.
27
- */
28
- const AUTOMATION_ACTORS = /* @__PURE__ */ new Set([
29
- "factory",
30
- "system",
31
- "automation",
32
- "factory-rule-dispatcher",
33
- "factory-tool-result-rule"
34
- ]);
35
- /**
36
- * Whether an actor id marks a transition no human performed on the Factory
37
- * board: a sentinel automation id, an agent binding (`agent:*`), or an
38
- * external-webhook actor (`github:*` — a human may have acted on GitHub, but
39
- * the board move itself was automated).
22
+ * Whether an actor id marks a move an agent run performed: the binding id the
23
+ * transition tool stamps (`agent:*`), or the rule that fires off a bound run's
24
+ * tool result (see `factory/rules/processor.ts`).
25
+ *
26
+ * Deliberately narrower than "not a human": the poller stamps
27
+ * `factory-rule-dispatcher` / `github:*` on every card it syncs from the
28
+ * upstream repo, so counting those as machine work reports the repo's activity
29
+ * as the Factory's and pins any such ratio near 100%.
40
30
  */
41
- function isAutomationActor(by) {
31
+ function isAgentActor(by) {
42
32
  if (by === void 0) return false;
43
- return AUTOMATION_ACTORS.has(by) || by.startsWith("agent:") || by.startsWith("github:");
33
+ return by.startsWith("agent:") || by === "factory-tool-result-rule";
44
34
  }
45
35
  const WORK_ITEMS_SCHEMA = {
46
36
  name: "work_items",
@@ -307,6 +297,10 @@ const FACTORY_GOVERNANCE_SCHEMAS = [
307
297
  type: "text",
308
298
  nullable: true
309
299
  },
300
+ approved_at: {
301
+ type: "timestamp",
302
+ nullable: true
303
+ },
310
304
  completed_at: {
311
305
  type: "timestamp",
312
306
  nullable: true
@@ -456,6 +450,7 @@ function toDeferredDecision(row) {
456
450
  leaseOwner: row.lease_owner ?? null,
457
451
  leaseExpiresAt: row.lease_expires_at ?? null,
458
452
  lastError: row.last_error ?? null,
453
+ approvedAt: row.approved_at ?? null,
459
454
  completedAt: row.completed_at ?? null,
460
455
  createdAt: row.created_at,
461
456
  updatedAt: row.updated_at
@@ -918,6 +913,65 @@ var WorkItemsStorage = class extends FactoryStorageDomain {
918
913
  const row = await this.#failLease("factory_deferred_decisions", input);
919
914
  return row ? toDeferredDecision(row) : null;
920
915
  }
916
+ /** Park a claimed effect for human approval; the dispatcher never claims `proposed` rows. */
917
+ async proposeDeferredDecision(identity, now) {
918
+ let proposed = false;
919
+ const row = await this.#db.updateAtomic("factory_deferred_decisions", {
920
+ id: identity.id,
921
+ org_id: identity.orgId,
922
+ factory_project_id: identity.factoryProjectId
923
+ }, (current) => {
924
+ if (current.status !== "leased" || current.lease_owner !== identity.ownerId) return null;
925
+ proposed = true;
926
+ return {
927
+ status: "proposed",
928
+ attempts: 0,
929
+ lease_owner: null,
930
+ lease_expires_at: null,
931
+ updated_at: now
932
+ };
933
+ });
934
+ return proposed && row ? toDeferredDecision(row) : null;
935
+ }
936
+ /** Release an approved effect back to the dispatcher; only `proposed` rows are approvable. */
937
+ async approveDeferredDecision(orgId, factoryProjectId, decisionId, now) {
938
+ return this.#settleProposedDecision({
939
+ orgId,
940
+ factoryProjectId,
941
+ decisionId
942
+ }, {
943
+ status: "pending",
944
+ attempts: 0,
945
+ available_at: now,
946
+ approved_at: now,
947
+ updated_at: now
948
+ });
949
+ }
950
+ /** Retire a proposal nobody wants: `dismissed` is terminal, so the run never happens. */
951
+ async dismissDeferredDecision(orgId, factoryProjectId, decisionId, now) {
952
+ return this.#settleProposedDecision({
953
+ orgId,
954
+ factoryProjectId,
955
+ decisionId
956
+ }, {
957
+ status: "dismissed",
958
+ updated_at: now,
959
+ completed_at: now
960
+ });
961
+ }
962
+ async #settleProposedDecision({ orgId, factoryProjectId, decisionId }, patch) {
963
+ let settled = false;
964
+ const row = await this.#db.updateAtomic("factory_deferred_decisions", {
965
+ id: decisionId,
966
+ org_id: orgId,
967
+ factory_project_id: factoryProjectId
968
+ }, (current) => {
969
+ if (current.status !== "proposed") return null;
970
+ settled = true;
971
+ return patch;
972
+ });
973
+ return settled && row ? toDeferredDecision(row) : null;
974
+ }
921
975
  /** Requeue the same idempotent terminal effect; non-failed decisions are never rerun. */
922
976
  async retryDeferredDecision(orgId, factoryProjectId, decisionId, now) {
923
977
  let retried = false;
@@ -1332,6 +1386,6 @@ var WorkItemsStorage = class extends FactoryStorageDomain {
1332
1386
  }
1333
1387
  };
1334
1388
  //#endregion
1335
- export { AUTOMATION_ACTORS, WORK_ITEMS_SCHEMA, WorkItemRelationError, WorkItemsStorage, applyStageTransition, factoryDecisionHash, isAutomationActor, stampSessions, validateParentRelation };
1389
+ export { WORK_ITEMS_SCHEMA, WorkItemRelationError, WorkItemsStorage, applyStageTransition, factoryDecisionHash, isAgentActor, stampSessions, validateParentRelation };
1336
1390
 
1337
1391
  //# sourceMappingURL=base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","names":["#db","#withProjectRelationTransaction","#claimLeases","#renewLease","#completeLease","#failLease","#listWithOps","#upsert"],"sources":["../../../../src/storage/domains/work-items/base.ts"],"sourcesContent":["/**\n * Factory work-items storage domain.\n *\n * Work items belong to a first-class Factory project. External intake items use\n * a provider-neutral source reference; manual work items have no source.\n * Stage history is server-owned, while session and metadata patches merge\n * atomically so concurrent actors do not overwrite each other. The authoritative\n * Factory transition path keeps one exclusive current stage per item.\n */\n\nimport { createHash } from 'node:crypto';\n\nimport { FactoryStorageDomain, UniqueViolationError } from '@mastra/core/storage';\nimport type { CollectionSchema, FactoryStorageOps } from '@mastra/core/storage';\n\nexport type WorkItemStage = string;\n\nfunction stableJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableJson).join(',')}]`;\n if (value && typeof value === 'object') {\n return `{${Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)\n .join(',')}}`;\n }\n return JSON.stringify(value) ?? 'null';\n}\n\nexport function factoryDecisionHash(decision: Record<string, unknown>): string {\n return createHash('sha256').update(stableJson(decision)).digest('hex');\n}\n\nexport interface ExternalWorkItemSource {\n integrationId: string;\n type: string;\n externalId: string;\n url?: string;\n}\n\nexport interface WorkItemStageEntry {\n stage: WorkItemStage;\n enteredAt: string;\n exitedAt?: string;\n by: string;\n /**\n * Actor that closed this entry; absent on entries written before exit\n * stamping existed — treat as human.\n */\n exitedBy?: string;\n}\n\n/**\n * Sentinel actor ids that mark a stage transition as automation-driven (vs a\n * human's WorkOS user id): generic sentinels plus the system ids the Factory\n * rules engine stamps (see `actorId` in factory/rules/transition-service.ts).\n * Metrics treat any other actor — including a missing `exitedBy` on\n * pre-existing entries — as human.\n */\nexport const AUTOMATION_ACTORS = new Set([\n 'factory',\n 'system',\n 'automation',\n 'factory-rule-dispatcher',\n 'factory-tool-result-rule',\n]);\n\n/**\n * Whether an actor id marks a transition no human performed on the Factory\n * board: a sentinel automation id, an agent binding (`agent:*`), or an\n * external-webhook actor (`github:*` — a human may have acted on GitHub, but\n * the board move itself was automated).\n */\nexport function isAutomationActor(by: string | undefined): boolean {\n if (by === undefined) return false;\n return AUTOMATION_ACTORS.has(by) || by.startsWith('agent:') || by.startsWith('github:');\n}\n\nexport interface WorkItemSessionRef {\n sessionId: string;\n branch: string;\n threadId: string;\n startedBy: string;\n}\n\nexport interface FactoryRuleIngressRecord {\n id: string;\n orgId: string;\n factoryProjectId: string;\n identity: string;\n triggerType: string;\n transitionId: string;\n result: Record<string, unknown>;\n createdAt: Date;\n}\n\nexport interface CommitFactoryRuleEvaluationInput {\n orgId: string;\n factoryProjectId: string;\n workItemId: string | null;\n ingress: { identity: string; triggerType: string };\n ruleSetVersion: string;\n expectedRevision: number | null;\n actor: Record<string, unknown> | null;\n outcome: { status: 'accepted' | 'rejected'; code?: string; reason?: string };\n decisions: Record<string, unknown>[];\n causalChain: Array<{ ingressId: string; decisionType: string }>;\n now: Date;\n}\n\nexport type CommitFactoryRuleEvaluationResult =\n | { status: 'committed'; result: Record<string, unknown> }\n | { status: 'replayed'; result: Record<string, unknown> }\n | { status: 'missing' };\n\nexport interface FactoryToolResultCursorRecord {\n bindingId: string;\n orgId: string;\n factoryProjectId: string;\n lastMessageId: string;\n lastMessageCreatedAt: Date;\n updatedAt: Date;\n}\n\nexport interface FactoryRuleEvaluationRecord {\n id: string;\n ingressId: string;\n workItemId: string | null;\n ruleSetVersion: string;\n expectedRevision: number | null;\n outcome: 'accepted' | 'rejected';\n code: string | null;\n reason: string | null;\n causalChain: Array<{ ingressId: string; decisionType: string }>;\n createdAt: Date;\n}\n\nexport type FactoryDispatchStatus = 'pending' | 'leased' | 'retry' | 'succeeded' | 'failed';\n\nexport interface FactoryDeferredDecisionPageInput {\n orgId: string;\n factoryProjectId: string;\n statuses?: FactoryDispatchStatus[];\n before?: { createdAt: Date; id: string };\n limit: number;\n}\n\nexport interface FactoryDeferredDecisionPage {\n decisions: FactoryDeferredDecisionRecord[];\n hasMore: boolean;\n}\n\nexport interface FactoryDeferredDecisionRecord {\n id: string;\n orgId: string;\n factoryProjectId: string;\n evaluationId: string;\n workItemId: string | null;\n idempotencyKey: string;\n effectOrdinal: number;\n effectHash: string;\n causalChain: Array<{ ingressId: string; decisionType: string }>;\n actor: Record<string, unknown> | null;\n decision: Record<string, unknown>;\n status: FactoryDispatchStatus;\n attempts: number;\n availableAt: Date;\n leaseOwner: string | null;\n leaseExpiresAt: Date | null;\n lastError: string | null;\n completedAt: Date | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface FactoryRunBindingSessionAddress {\n factoryProjectId: string;\n threadId: string;\n resourceId: string;\n sessionId: string;\n}\n\nexport interface FactoryRunBindingAddress extends FactoryRunBindingSessionAddress {\n orgId: string;\n}\n\nexport interface RevokeFactoryRunBindingInput {\n orgId: string;\n factoryProjectId: string;\n bindingId: string;\n revokedAt: Date;\n}\n\nexport interface FactoryRunBindingRecord {\n id: string;\n orgId: string;\n factoryProjectId: string;\n workItemId: string;\n role: string;\n threadId: string;\n resourceId: string;\n sessionId: string;\n branch: string;\n status: 'active' | 'revoked';\n createdAt: Date;\n revokedAt: Date | null;\n}\n\nexport interface FactoryPendingStartRecord {\n id: string;\n orgId: string;\n factoryProjectId: string;\n bindingId: string;\n kickoffKey: string;\n message: string | null;\n status: 'pending' | 'leased' | 'retry' | 'sent' | 'failed';\n attempts: number;\n availableAt: Date;\n leaseOwner: string | null;\n leaseExpiresAt: Date | null;\n lastError: string | null;\n completedAt: Date | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface FactoryLeaseClaimInput {\n ownerId: string;\n now: Date;\n leaseExpiresAt: Date;\n limit: number;\n}\n\nexport interface FactoryLeaseIdentity {\n id: string;\n orgId: string;\n factoryProjectId: string;\n ownerId: string;\n}\n\nexport interface FactoryDispatchFailureInput extends FactoryLeaseIdentity {\n now: Date;\n availableAt: Date;\n lastError: string;\n terminal: boolean;\n}\n\nexport interface CommitFactoryTransitionInput {\n orgId: string;\n factoryProjectId: string;\n workItemId: string;\n expectedRevision: number;\n destinationStage: string;\n actorId: string;\n ingress: { identity: string; triggerType: string; transitionId: string };\n ruleSetVersion: string;\n causalChain: Array<{ ingressId: string; decisionType: string }>;\n evaluation:\n | { outcome: 'accepted'; decisions: Record<string, unknown>[] }\n | { outcome: 'rejected'; code: string; reason: string };\n}\n\nexport type CommitFactoryTransitionResult =\n | { status: 'committed'; item: WorkItemRow | null; result: Record<string, unknown> }\n | { status: 'replayed'; item: WorkItemRow | null; result: Record<string, unknown> }\n | { status: 'missing' };\n\nexport interface PrepareFactoryRunStartInput {\n orgId: string;\n userId: string;\n factoryProjectId: string;\n workItem: { id?: string; input: CreateWorkItemInput };\n role: string;\n session: WorkItemSessionInput;\n resourceId: string;\n kickoffKey: string;\n kickoffMessage: string | null;\n}\n\nexport interface PrepareFactoryRunStartResult {\n item: WorkItemRow;\n binding: FactoryRunBindingRecord;\n pendingStart: FactoryPendingStartRecord;\n replayed: boolean;\n}\n\n/** Session ref as accepted from clients — `startedBy` is stamped server-side. */\nexport interface WorkItemSessionInput {\n sessionId: string;\n branch: string;\n threadId: string;\n}\n\nexport type WorkItemSessions = Record<string, WorkItemSessionRef>;\n\nexport interface WorkItemRow {\n id: string;\n orgId: string;\n factoryProjectId: string;\n externalSource: ExternalWorkItemSource | null;\n parentWorkItemId: string | null;\n title: string;\n stages: WorkItemStage[];\n stageHistory: WorkItemStageEntry[];\n sessions: WorkItemSessions;\n metadata: Record<string, unknown> | null;\n revision: number;\n createdBy: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface CreateWorkItemInput {\n externalSource?: ExternalWorkItemSource | null;\n parentWorkItemId?: string | null;\n title: string;\n stages?: WorkItemStage[];\n sessions?: Record<string, WorkItemSessionInput>;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface UpdateWorkItemInput {\n parentWorkItemId?: string | null;\n title?: string;\n stages?: WorkItemStage[];\n sessions?: Record<string, WorkItemSessionInput>;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface WorkItemPriorState {\n stages: WorkItemStage[];\n sessionRoles: string[];\n}\n\nexport interface UpsertWorkItemResult {\n item: WorkItemRow;\n created: boolean;\n previous: WorkItemPriorState;\n}\n\nexport const WORK_ITEMS_SCHEMA: CollectionSchema = {\n name: 'work_items',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n external_source: { type: 'json', nullable: true },\n source_key: { type: 'text', nullable: true },\n parent_work_item_id: { type: 'text', nullable: true },\n title: { type: 'text' },\n stages: { type: 'json' },\n stage_history: { type: 'json' },\n sessions: { type: 'json' },\n metadata: { type: 'json', nullable: true },\n revision: { type: 'integer', default: 1 },\n created_by: { type: 'text' },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'work_items_project_source_key_unique',\n columns: ['factory_project_id', 'source_key'],\n },\n ],\n indexes: [\n {\n name: 'work_items_org_project_updated_at_idx',\n columns: ['org_id', 'factory_project_id', 'updated_at'],\n },\n {\n name: 'work_items_project_parent_idx',\n columns: ['org_id', 'factory_project_id', 'parent_work_item_id'],\n },\n ],\n};\n\ninterface WorkItemDbRow extends Record<string, unknown> {\n id: string;\n org_id: string;\n factory_project_id: string;\n external_source: ExternalWorkItemSource | null;\n source_key: string | null;\n parent_work_item_id: string | null;\n title: string;\n stages: WorkItemStage[];\n stage_history: WorkItemStageEntry[];\n sessions: WorkItemSessions;\n metadata: Record<string, unknown> | null;\n revision: number;\n created_by: string;\n created_at: Date;\n updated_at: Date;\n}\n\nfunction sourceKey(source: ExternalWorkItemSource | null | undefined): string | null {\n return source ? `${source.integrationId}:${source.type}:${source.externalId}` : null;\n}\n\nfunction toWorkItem(row: WorkItemDbRow): WorkItemRow {\n return {\n id: row.id,\n orgId: row.org_id,\n factoryProjectId: String(row.factory_project_id),\n externalSource: row.external_source,\n parentWorkItemId: row.parent_work_item_id,\n title: row.title,\n stages: row.stages,\n stageHistory: row.stage_history,\n sessions: row.sessions,\n metadata: row.metadata,\n revision: row.revision,\n createdBy: row.created_by,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nconst toRow = toWorkItem;\n\nfunction patchColumns(changes: Partial<WorkItemRow>): Partial<WorkItemDbRow> {\n return {\n ...(changes.parentWorkItemId !== undefined ? { parent_work_item_id: changes.parentWorkItemId } : {}),\n ...(changes.title !== undefined ? { title: changes.title } : {}),\n ...(changes.stages !== undefined ? { stages: changes.stages } : {}),\n ...(changes.stageHistory !== undefined ? { stage_history: changes.stageHistory } : {}),\n ...(changes.sessions !== undefined ? { sessions: changes.sessions } : {}),\n ...(changes.metadata !== undefined ? { metadata: changes.metadata } : {}),\n ...(changes.revision !== undefined ? { revision: changes.revision } : {}),\n ...(changes.updatedAt !== undefined ? { updated_at: changes.updatedAt } : {}),\n };\n}\n\nfunction emptyPrior(): WorkItemPriorState {\n return { stages: [], sessionRoles: [] };\n}\n\nfunction priorState(row: WorkItemDbRow): WorkItemPriorState {\n return { stages: row.stages, sessionRoles: Object.keys(row.sessions) };\n}\n\nexport class WorkItemRelationError extends Error {\n readonly code = 'invalid_work_item_relation';\n}\n\nexport function validateParentRelation(\n projectItems: WorkItemRow[],\n itemId: string | undefined,\n parentWorkItemId: string | null,\n): void {\n if (parentWorkItemId === null) return;\n const byId = new Map(projectItems.map(item => [item.id, item]));\n const parent = byId.get(parentWorkItemId);\n if (!parent) throw new WorkItemRelationError('Related work item not found in this project.');\n if (itemId === parentWorkItemId) throw new WorkItemRelationError('A work item cannot relate to itself.');\n\n const visited = new Set<string>();\n let cursor: WorkItemRow | undefined = parent;\n while (cursor?.parentWorkItemId) {\n if (cursor.parentWorkItemId === itemId) {\n throw new WorkItemRelationError('This relationship would create a cycle.');\n }\n if (visited.has(cursor.id)) throw new WorkItemRelationError('The related work item chain contains a cycle.');\n visited.add(cursor.id);\n cursor = byId.get(cursor.parentWorkItemId);\n }\n}\n\n/**\n * Diff `oldStages` → `newStages` and return the updated history: exited stages\n * get `exitedAt` + `exitedBy` stamped on their open entry, entered stages get\n * a new entry.\n */\nexport function applyStageTransition(\n history: WorkItemStageEntry[],\n oldStages: WorkItemStage[],\n newStages: WorkItemStage[],\n by: string,\n now: Date,\n): WorkItemStageEntry[] {\n const timestamp = now.toISOString();\n const next = history.map(entry => ({ ...entry }));\n for (const stage of oldStages) {\n if (newStages.includes(stage)) continue;\n for (let i = next.length - 1; i >= 0; i--) {\n const entry = next[i]!;\n if (entry.stage === stage && entry.exitedAt === undefined) {\n entry.exitedAt = timestamp;\n entry.exitedBy = by;\n break;\n }\n }\n }\n for (const stage of newStages) {\n if (!oldStages.includes(stage)) next.push({ stage, enteredAt: timestamp, by });\n }\n return next;\n}\n\nexport function stampSessions(sessions: Record<string, WorkItemSessionInput>, by: string): WorkItemSessions {\n return Object.fromEntries(Object.entries(sessions).map(([role, session]) => [role, { ...session, startedBy: by }]));\n}\n\nfunction applyUpdate({\n current,\n userId,\n input,\n}: {\n current: WorkItemDbRow;\n userId: string;\n input: UpdateWorkItemInput;\n}): Partial<WorkItemDbRow> {\n const now = new Date();\n return {\n ...(input.parentWorkItemId !== undefined ? { parent_work_item_id: input.parentWorkItemId } : {}),\n ...(input.title !== undefined ? { title: input.title } : {}),\n ...(input.stages !== undefined\n ? {\n stages: input.stages,\n stage_history: applyStageTransition(current.stage_history, current.stages, input.stages, userId, now),\n }\n : {}),\n ...(input.sessions !== undefined\n ? { sessions: { ...current.sessions, ...stampSessions(input.sessions, userId) } }\n : {}),\n ...(input.metadata !== undefined\n ? { metadata: input.metadata === null ? null : { ...(current.metadata ?? {}), ...input.metadata } }\n : {}),\n revision: current.revision + 1,\n updated_at: now,\n };\n}\n\nconst projectRelationLocks = new Map<string, Promise<unknown>>();\n\nfunction withInProcessProjectLock<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const previous = projectRelationLocks.get(key) ?? Promise.resolve();\n const result = previous.then(fn, fn);\n const tail = result.then(\n () => undefined,\n () => undefined,\n );\n projectRelationLocks.set(key, tail);\n void tail.then(() => {\n if (projectRelationLocks.get(key) === tail) projectRelationLocks.delete(key);\n });\n return result;\n}\n\nconst FACTORY_GOVERNANCE_SCHEMAS: CollectionSchema[] = [\n {\n name: 'factory_rule_ingress',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n identity: { type: 'text' },\n trigger_type: { type: 'text' },\n transition_id: { type: 'text' },\n result: { type: 'json' },\n created_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n { name: 'factory_rule_ingress_tenant_identity_unique', columns: ['org_id', 'factory_project_id', 'identity'] },\n ],\n },\n {\n name: 'factory_rule_evaluations',\n columns: {\n id: { type: 'uuid-pk' },\n ingress_id: { type: 'text' },\n work_item_id: { type: 'text', nullable: true },\n rule_set_version: { type: 'text' },\n expected_revision: { type: 'integer', nullable: true },\n outcome: { type: 'text' },\n code: { type: 'text', nullable: true },\n reason: { type: 'text', nullable: true },\n causal_chain: { type: 'json' },\n created_at: { type: 'timestamp' },\n },\n },\n {\n name: 'factory_deferred_decisions',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n evaluation_id: { type: 'text' },\n work_item_id: { type: 'text', nullable: true },\n idempotency_key: { type: 'text' },\n effect_ordinal: { type: 'integer' },\n effect_hash: { type: 'text' },\n causal_chain: { type: 'json' },\n actor: { type: 'json', nullable: true },\n decision: { type: 'json' },\n status: { type: 'text' },\n attempts: { type: 'integer' },\n available_at: { type: 'timestamp' },\n lease_owner: { type: 'text', nullable: true },\n lease_expires_at: { type: 'timestamp', nullable: true },\n last_error: { type: 'text', nullable: true },\n completed_at: { type: 'timestamp', nullable: true },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'factory_deferred_decisions_tenant_key_unique',\n columns: ['org_id', 'factory_project_id', 'idempotency_key'],\n },\n ],\n indexes: [{ name: 'factory_deferred_decisions_claim_idx', columns: ['status', 'created_at'] }],\n },\n {\n name: 'factory_run_bindings',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n work_item_id: { type: 'text' },\n role: { type: 'text' },\n thread_id: { type: 'text' },\n resource_id: { type: 'text' },\n session_id: { type: 'text' },\n branch: { type: 'text' },\n status: { type: 'text' },\n created_at: { type: 'timestamp' },\n revoked_at: { type: 'timestamp', nullable: true },\n },\n indexes: [\n // Exact-address lookups run on every processor message; status filter is\n // applied on top of the address columns.\n {\n name: 'factory_run_bindings_session_idx',\n columns: ['factory_project_id', 'thread_id', 'resource_id', 'session_id'],\n },\n // Restart reconciler enumerates active bindings across all tenants.\n { name: 'factory_run_bindings_status_idx', columns: ['status'] },\n ],\n },\n {\n name: 'factory_tool_result_cursors',\n columns: {\n binding_id: { type: 'text', primaryKey: true },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n last_message_id: { type: 'text' },\n last_message_created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n },\n {\n name: 'factory_pending_starts',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n binding_id: { type: 'text' },\n kickoff_key: { type: 'text' },\n message: { type: 'text', nullable: true },\n status: { type: 'text' },\n attempts: { type: 'integer' },\n available_at: { type: 'timestamp' },\n lease_owner: { type: 'text', nullable: true },\n lease_expires_at: { type: 'timestamp', nullable: true },\n last_error: { type: 'text', nullable: true },\n completed_at: { type: 'timestamp', nullable: true },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'factory_pending_starts_tenant_kickoff_unique',\n columns: ['org_id', 'factory_project_id', 'kickoff_key'],\n },\n ],\n indexes: [{ name: 'factory_pending_starts_claim_idx', columns: ['status', 'created_at'] }],\n },\n];\n\ninterface GovernanceDbRow extends Record<string, unknown> {\n id: string;\n org_id: string;\n factory_project_id: string;\n created_at: Date;\n [key: string]: unknown;\n}\n\nfunction toBinding(row: GovernanceDbRow): FactoryRunBindingRecord {\n return {\n id: row.id,\n orgId: row.org_id,\n factoryProjectId: String(row.factory_project_id),\n workItemId: String(row.work_item_id),\n role: String(row.role),\n threadId: String(row.thread_id),\n resourceId: String(row.resource_id),\n sessionId: String(row.session_id),\n branch: String(row.branch),\n status: row.status as FactoryRunBindingRecord['status'],\n createdAt: row.created_at,\n revokedAt: (row.revoked_at as Date | null) ?? null,\n };\n}\nfunction toDeferredDecision(row: GovernanceDbRow): FactoryDeferredDecisionRecord {\n return {\n id: row.id,\n orgId: row.org_id,\n factoryProjectId: String(row.factory_project_id),\n evaluationId: String(row.evaluation_id),\n workItemId: row.work_item_id === null || row.work_item_id === undefined ? null : String(row.work_item_id),\n idempotencyKey: String(row.idempotency_key),\n effectOrdinal: Number(row.effect_ordinal),\n effectHash: String(row.effect_hash),\n causalChain: (row.causal_chain as FactoryDeferredDecisionRecord['causalChain']) ?? [],\n actor: (row.actor as Record<string, unknown> | null) ?? null,\n decision: row.decision as Record<string, unknown>,\n status: row.status as FactoryDispatchStatus,\n attempts: Number(row.attempts),\n availableAt: row.available_at as Date,\n leaseOwner: (row.lease_owner as string | null) ?? null,\n leaseExpiresAt: (row.lease_expires_at as Date | null) ?? null,\n lastError: (row.last_error as string | null) ?? null,\n completedAt: (row.completed_at as Date | null) ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at as Date,\n };\n}\nfunction toPendingStart(row: GovernanceDbRow): FactoryPendingStartRecord {\n return {\n id: row.id,\n orgId: row.org_id,\n factoryProjectId: String(row.factory_project_id),\n bindingId: String(row.binding_id),\n kickoffKey: String(row.kickoff_key),\n message: (row.message as string | null) ?? null,\n status: row.status as FactoryPendingStartRecord['status'],\n attempts: Number(row.attempts),\n availableAt: row.available_at as Date,\n leaseOwner: (row.lease_owner as string | null) ?? null,\n leaseExpiresAt: (row.lease_expires_at as Date | null) ?? null,\n lastError: (row.last_error as string | null) ?? null,\n completedAt: (row.completed_at as Date | null) ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at as Date,\n };\n}\n\nexport class WorkItemsStorage extends FactoryStorageDomain {\n constructor() {\n super('work-items');\n }\n\n async init(): Promise<void> {\n await this.ensureCollections([WORK_ITEMS_SCHEMA, ...FACTORY_GOVERNANCE_SCHEMAS]);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.ops.deleteMany('work_items', {});\n }\n\n get #db(): FactoryStorageOps {\n return this.ops;\n }\n\n async #withProjectRelationTransaction<T>(\n orgId: string,\n factoryProjectId: string,\n fn: (ops: FactoryStorageOps) => Promise<T>,\n ): Promise<T> {\n const key = `work-items:${orgId}:${factoryProjectId}`;\n return withInProcessProjectLock(key, () => this.storage.withTransaction(fn, { isolationLevel: 'serializable' }));\n }\n\n async #claimLeases<T>(\n table: 'factory_deferred_decisions' | 'factory_pending_starts',\n input: FactoryLeaseClaimInput,\n map: (row: GovernanceDbRow) => T,\n ): Promise<T[]> {\n const claim = () =>\n this.storage.withTransaction(async ops => {\n // Bounded candidate window: only rows in claimable/expirable statuses,\n // oldest first. Terminal rows (sent/succeeded/failed) accumulate over a\n // deployment's lifetime and must never be scanned per dispatch tick.\n const candidates = await ops.findMany<GovernanceDbRow>(\n table,\n { status: { in: ['pending', 'retry', 'leased'] } },\n { orderBy: [['created_at', 'asc']], limit: Math.max(input.limit * 5, 50) },\n );\n const claimed: T[] = [];\n for (const candidate of candidates) {\n if (claimed.length >= input.limit) break;\n const availableAt = new Date(candidate.available_at as Date | string).getTime();\n const leaseExpiresAt = candidate.lease_expires_at\n ? new Date(candidate.lease_expires_at as Date | string).getTime()\n : 0;\n const claimable =\n (candidate.status === 'pending' || candidate.status === 'retry') && availableAt <= input.now.getTime();\n const expired = candidate.status === 'leased' && leaseExpiresAt <= input.now.getTime();\n if (!claimable && !expired) continue;\n let didClaim = false;\n const row = await ops.updateAtomic<GovernanceDbRow>(table, { id: candidate.id }, current => {\n const currentAvailable = new Date(current.available_at as Date | string).getTime();\n const currentExpiry = current.lease_expires_at\n ? new Date(current.lease_expires_at as Date | string).getTime()\n : 0;\n const currentClaimable =\n (current.status === 'pending' || current.status === 'retry') && currentAvailable <= input.now.getTime();\n const currentExpired = current.status === 'leased' && currentExpiry <= input.now.getTime();\n if (!currentClaimable && !currentExpired) return null;\n didClaim = true;\n return {\n status: 'leased',\n attempts: Number(current.attempts) + 1,\n lease_owner: input.ownerId,\n lease_expires_at: input.leaseExpiresAt,\n updated_at: input.now,\n };\n });\n if (didClaim && row) claimed.push(map(row));\n }\n return claimed;\n });\n return claim();\n }\n\n async #renewLease(\n table: 'factory_deferred_decisions' | 'factory_pending_starts',\n identity: FactoryLeaseIdentity,\n leaseExpiresAt: Date,\n ): Promise<boolean> {\n let renewed = false;\n await this.#db.updateAtomic<GovernanceDbRow>(\n table,\n { id: identity.id, org_id: identity.orgId, factory_project_id: identity.factoryProjectId },\n current => {\n if (current.status !== 'leased' || current.lease_owner !== identity.ownerId) return null;\n renewed = true;\n return { lease_expires_at: leaseExpiresAt, updated_at: new Date() };\n },\n );\n return renewed;\n }\n\n async #completeLease(\n table: 'factory_deferred_decisions' | 'factory_pending_starts',\n identity: FactoryLeaseIdentity,\n now: Date,\n ): Promise<GovernanceDbRow | null> {\n let completed = false;\n const row = await this.#db.updateAtomic<GovernanceDbRow>(\n table,\n { id: identity.id, org_id: identity.orgId, factory_project_id: identity.factoryProjectId },\n current => {\n if (current.status !== 'leased' || current.lease_owner !== identity.ownerId) return null;\n completed = true;\n return {\n status: table === 'factory_pending_starts' ? 'sent' : 'succeeded',\n lease_owner: null,\n lease_expires_at: null,\n completed_at: now,\n updated_at: now,\n };\n },\n );\n return completed ? row : null;\n }\n\n async #failLease(\n table: 'factory_deferred_decisions' | 'factory_pending_starts',\n input: FactoryDispatchFailureInput,\n ): Promise<GovernanceDbRow | null> {\n let failed = false;\n const row = await this.#db.updateAtomic<GovernanceDbRow>(\n table,\n { id: input.id, org_id: input.orgId, factory_project_id: input.factoryProjectId },\n current => {\n if (current.status !== 'leased' || current.lease_owner !== input.ownerId) return null;\n failed = true;\n return {\n status: input.terminal ? 'failed' : 'retry',\n available_at: input.availableAt,\n lease_owner: null,\n lease_expires_at: null,\n last_error: input.lastError,\n completed_at: input.terminal ? input.now : null,\n updated_at: input.now,\n };\n },\n );\n return failed ? row : null;\n }\n\n async #listWithOps(ops: FactoryStorageOps, orgId: string, factoryProjectId: string): Promise<WorkItemRow[]> {\n const rows = await ops.findMany<WorkItemDbRow>(\n 'work_items',\n { org_id: orgId, factory_project_id: factoryProjectId },\n { orderBy: [['updated_at', 'desc']] },\n );\n return rows.map(toWorkItem);\n }\n\n /** List the org's work items for a project, newest first. */\n async list({ orgId, factoryProjectId }: { orgId: string; factoryProjectId: string }): Promise<WorkItemRow[]> {\n return this.#listWithOps(this.#db, orgId, factoryProjectId);\n }\n\n async get({ orgId, id }: { orgId: string; id: string }): Promise<WorkItemRow | null> {\n const row = await this.#db.findOne<WorkItemDbRow>('work_items', { org_id: orgId, id });\n return row ? toWorkItem(row) : null;\n }\n\n async getForProject(orgId: string, factoryProjectId: string, id: string): Promise<WorkItemRow | null> {\n const row = await this.#db.findOne<WorkItemDbRow>('work_items', {\n id,\n org_id: orgId,\n factory_project_id: factoryProjectId,\n });\n return row ? toRow(row) : null;\n }\n\n async getTransitionResultByIngress(\n orgId: string,\n factoryProjectId: string,\n identity: string,\n ): Promise<Record<string, unknown> | null> {\n const row = await this.#db.findOne<GovernanceDbRow>('factory_rule_ingress', {\n org_id: orgId,\n factory_project_id: factoryProjectId,\n identity,\n });\n return (row?.result as Record<string, unknown> | undefined) ?? null;\n }\n\n async commitTransition(input: CommitFactoryTransitionInput): Promise<CommitFactoryTransitionResult> {\n const commit = (): Promise<CommitFactoryTransitionResult> =>\n this.storage.withTransaction<CommitFactoryTransitionResult>(async ops => {\n const prior = await ops.findOne<GovernanceDbRow>('factory_rule_ingress', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n identity: input.ingress.identity,\n });\n if (prior)\n return {\n status: 'replayed',\n item: await this.getForProject(input.orgId, input.factoryProjectId, input.workItemId),\n result: prior.result as Record<string, unknown>,\n };\n\n const now = new Date();\n let item: WorkItemRow | null = null;\n let code: string | null = null;\n let reason: string | null = null;\n let result: Record<string, unknown>;\n const updated = await ops.updateAtomic<WorkItemDbRow>(\n 'work_items',\n {\n id: input.workItemId,\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n },\n row => {\n const existing = toRow(row);\n item = existing;\n if (existing.revision !== input.expectedRevision) {\n code = 'stale';\n reason = 'The work item changed before this transition committed.';\n return null;\n }\n if (input.evaluation.outcome === 'rejected') {\n code = input.evaluation.code;\n reason = input.evaluation.reason;\n return null;\n }\n if (existing.stages.length === 1 && existing.stages[0] === input.destinationStage) return null;\n return patchColumns({\n stages: [input.destinationStage],\n stageHistory: applyStageTransition(\n existing.stageHistory,\n existing.stages,\n [input.destinationStage],\n input.actorId,\n now,\n ),\n revision: existing.revision + 1,\n updatedAt: now,\n });\n },\n );\n if (updated) item = toRow(updated);\n if (!item) {\n code = input.evaluation.outcome === 'rejected' ? input.evaluation.code : 'invalid_transition';\n reason = input.evaluation.outcome === 'rejected' ? input.evaluation.reason : 'Work item not found.';\n }\n const outcome: 'accepted' | 'rejected' =\n item && code === null && input.evaluation.outcome === 'accepted' ? 'accepted' : 'rejected';\n result =\n outcome === 'accepted'\n ? {\n status: 'accepted',\n transitionId: input.ingress.transitionId,\n itemId: item!.id,\n revision: item!.revision,\n stage: input.destinationStage,\n decisions: input.evaluation.outcome === 'accepted' ? input.evaluation.decisions : [],\n }\n : { status: 'rejected', transitionId: input.ingress.transitionId, itemId: input.workItemId, code, reason };\n const ingress = await ops.insertOne<GovernanceDbRow>('factory_rule_ingress', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n identity: input.ingress.identity,\n trigger_type: input.ingress.triggerType,\n transition_id: input.ingress.transitionId,\n result,\n created_at: now,\n });\n if (item) {\n const evaluation = await ops.insertOne<GovernanceDbRow>('factory_rule_evaluations', {\n ingress_id: ingress.id,\n work_item_id: item.id,\n rule_set_version: input.ruleSetVersion,\n expected_revision: input.expectedRevision,\n outcome,\n code,\n reason,\n causal_chain: input.causalChain,\n created_at: now,\n });\n if (outcome === 'accepted' && input.evaluation.outcome === 'accepted') {\n for (const [index, decision] of input.evaluation.decisions.entries()) {\n await ops.insertOne<GovernanceDbRow>('factory_deferred_decisions', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n evaluation_id: evaluation.id,\n work_item_id: item.id,\n idempotency_key: String(decision.idempotencyKey),\n effect_ordinal: index,\n effect_hash: factoryDecisionHash(decision),\n causal_chain: input.causalChain,\n actor: null,\n decision,\n status: 'pending',\n attempts: 0,\n available_at: now,\n lease_owner: null,\n lease_expires_at: null,\n last_error: null,\n completed_at: null,\n created_at: new Date(now.getTime() + index),\n updated_at: now,\n });\n }\n }\n }\n return { status: 'committed', item, result };\n });\n try {\n return await commit();\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n return commit();\n }\n }\n\n async commitRuleEvaluation(input: CommitFactoryRuleEvaluationInput): Promise<CommitFactoryRuleEvaluationResult> {\n const commit = () =>\n this.storage.withTransaction<CommitFactoryRuleEvaluationResult>(async ops => {\n const prior = await ops.findOne<GovernanceDbRow>('factory_rule_ingress', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n identity: input.ingress.identity,\n });\n if (prior) {\n const result = prior.result as Record<string, unknown>;\n const decisions = Array.isArray(result.decisions) ? result.decisions : [];\n const evaluation = await ops.findOne<GovernanceDbRow>('factory_rule_evaluations', { ingress_id: prior.id });\n for (const decision of decisions) {\n if (\n !evaluation ||\n !decision ||\n typeof decision !== 'object' ||\n (decision as Record<string, unknown>).type !== 'upsertLinkedWorkItem' ||\n typeof (decision as Record<string, unknown>).sourceKey !== 'string' ||\n typeof (decision as Record<string, unknown>).idempotencyKey !== 'string'\n ) {\n continue;\n }\n const materialization = decision as Record<string, unknown> & { sourceKey: string; idempotencyKey: string };\n const item = await ops.findOne<WorkItemDbRow>('work_items', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n source_key: materialization.sourceKey,\n });\n if (item) continue;\n await ops.updateAtomic<GovernanceDbRow>(\n 'factory_deferred_decisions',\n {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n evaluation_id: evaluation.id,\n idempotency_key: materialization.idempotencyKey,\n },\n current =>\n current.status === 'succeeded'\n ? {\n status: 'retry',\n attempts: 0,\n available_at: input.now,\n lease_owner: null,\n lease_expires_at: null,\n last_error: null,\n completed_at: null,\n updated_at: input.now,\n }\n : null,\n );\n }\n return { status: 'replayed' as const, result };\n }\n const itemRow = input.workItemId\n ? await ops.findOne<WorkItemDbRow>('work_items', {\n id: input.workItemId,\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n })\n : null;\n if (input.workItemId !== null && !itemRow) return { status: 'missing' as const };\n const item = itemRow ? toRow(itemRow) : null;\n const stale = item !== null && item.revision !== input.expectedRevision;\n const outcome = stale ? 'rejected' : input.outcome.status;\n const code = stale ? 'stale' : (input.outcome.code ?? null);\n const reason = stale\n ? 'The work item changed before this rule evaluation committed.'\n : (input.outcome.reason ?? null);\n const decisions = outcome === 'accepted' ? input.decisions : [];\n const result = {\n status: outcome,\n itemId: item?.id ?? null,\n revision: item?.revision ?? null,\n code,\n reason,\n decisions,\n };\n const ingress = await ops.insertOne<GovernanceDbRow>('factory_rule_ingress', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n identity: input.ingress.identity,\n trigger_type: input.ingress.triggerType,\n transition_id: input.ingress.identity,\n result,\n created_at: input.now,\n });\n const evaluation = await ops.insertOne<GovernanceDbRow>('factory_rule_evaluations', {\n ingress_id: ingress.id,\n work_item_id: item?.id ?? null,\n rule_set_version: input.ruleSetVersion,\n expected_revision: input.expectedRevision,\n outcome,\n code,\n reason,\n causal_chain: input.causalChain,\n created_at: input.now,\n });\n for (const [effectOrdinal, decision] of decisions.entries()) {\n await ops.insertOne<GovernanceDbRow>('factory_deferred_decisions', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n evaluation_id: evaluation.id,\n work_item_id: item?.id ?? null,\n idempotency_key: String(decision.idempotencyKey),\n effect_ordinal: effectOrdinal,\n effect_hash: factoryDecisionHash(decision),\n causal_chain: input.causalChain,\n actor: input.actor,\n decision,\n status: 'pending',\n attempts: 0,\n available_at: input.now,\n lease_owner: null,\n lease_expires_at: null,\n last_error: null,\n completed_at: null,\n created_at: new Date(input.now.getTime() + effectOrdinal),\n updated_at: input.now,\n });\n }\n return { status: 'committed' as const, result };\n });\n try {\n return await commit();\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n return commit();\n }\n }\n\n async getToolResultCursor(\n orgId: string,\n factoryProjectId: string,\n bindingId: string,\n ): Promise<FactoryToolResultCursorRecord | null> {\n const row = await this.#db.findOne<GovernanceDbRow>('factory_tool_result_cursors', {\n org_id: orgId,\n factory_project_id: factoryProjectId,\n binding_id: bindingId,\n });\n return row\n ? {\n bindingId: String(row.binding_id),\n orgId: row.org_id,\n factoryProjectId: String(row.factory_project_id),\n lastMessageId: String(row.last_message_id),\n lastMessageCreatedAt: row.last_message_created_at as Date,\n updatedAt: row.updated_at as Date,\n }\n : null;\n }\n\n async advanceToolResultCursor(cursor: FactoryToolResultCursorRecord): Promise<void> {\n const current = await this.getToolResultCursor(cursor.orgId, cursor.factoryProjectId, cursor.bindingId);\n if (current && current.lastMessageCreatedAt > cursor.lastMessageCreatedAt) return;\n await this.#db.upsertOne<GovernanceDbRow>('factory_tool_result_cursors', ['binding_id'], {\n binding_id: cursor.bindingId,\n org_id: cursor.orgId,\n factory_project_id: cursor.factoryProjectId,\n last_message_id: cursor.lastMessageId,\n last_message_created_at: cursor.lastMessageCreatedAt,\n updated_at: cursor.updatedAt,\n });\n }\n\n async listDeferredDecisions(orgId: string, factoryProjectId: string): Promise<FactoryDeferredDecisionRecord[]> {\n return (\n await this.#db.findMany<GovernanceDbRow>(\n 'factory_deferred_decisions',\n { org_id: orgId, factory_project_id: factoryProjectId },\n { orderBy: [['created_at', 'asc']] },\n )\n ).map(toDeferredDecision);\n }\n\n /** Read a bounded newest-first status page without exposing another tenant. */\n async listDeferredDecisionPage(input: FactoryDeferredDecisionPageInput): Promise<FactoryDeferredDecisionPage> {\n const rows = await this.#db.findMany<GovernanceDbRow>(\n 'factory_deferred_decisions',\n {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n ...(input.statuses ? { status: { in: input.statuses } } : {}),\n },\n {\n orderBy: [\n ['created_at', 'desc'],\n ['id', 'desc'],\n ],\n limit: input.limit + 1,\n ...(input.before ? { cursor: { values: [input.before.createdAt, input.before.id] } } : {}),\n },\n );\n return { decisions: rows.slice(0, input.limit).map(toDeferredDecision), hasMore: rows.length > input.limit };\n }\n\n async claimDeferredDecisions(input: FactoryLeaseClaimInput): Promise<FactoryDeferredDecisionRecord[]> {\n return this.#claimLeases('factory_deferred_decisions', input, toDeferredDecision);\n }\n\n async renewDeferredDecisionLease(identity: FactoryLeaseIdentity, leaseExpiresAt: Date): Promise<boolean> {\n return this.#renewLease('factory_deferred_decisions', identity, leaseExpiresAt);\n }\n\n async completeDeferredDecision(\n identity: FactoryLeaseIdentity,\n now: Date,\n ): Promise<FactoryDeferredDecisionRecord | null> {\n const row = await this.#completeLease('factory_deferred_decisions', identity, now);\n return row ? toDeferredDecision(row) : null;\n }\n\n async failDeferredDecision(input: FactoryDispatchFailureInput): Promise<FactoryDeferredDecisionRecord | null> {\n const row = await this.#failLease('factory_deferred_decisions', input);\n return row ? toDeferredDecision(row) : null;\n }\n\n /** Requeue the same idempotent terminal effect; non-failed decisions are never rerun. */\n async retryDeferredDecision(\n orgId: string,\n factoryProjectId: string,\n decisionId: string,\n now: Date,\n ): Promise<FactoryDeferredDecisionRecord | null> {\n let retried = false;\n const row = await this.#db.updateAtomic<GovernanceDbRow>(\n 'factory_deferred_decisions',\n { id: decisionId, org_id: orgId, factory_project_id: factoryProjectId },\n current => {\n if (current.status !== 'failed') return null;\n retried = true;\n return {\n status: 'retry',\n attempts: 0,\n available_at: now,\n lease_owner: null,\n lease_expires_at: null,\n last_error: null,\n completed_at: null,\n updated_at: now,\n };\n },\n );\n return retried && row ? toDeferredDecision(row) : null;\n }\n\n /** Resolve exact active agent authority; partial session matches never authorize. */\n async findActiveRunBinding(address: FactoryRunBindingAddress): Promise<FactoryRunBindingRecord | null> {\n const row = await this.#db.findOne<GovernanceDbRow>('factory_run_bindings', {\n org_id: address.orgId,\n factory_project_id: address.factoryProjectId,\n thread_id: address.threadId,\n resource_id: address.resourceId,\n session_id: address.sessionId,\n status: 'active',\n });\n return row ? toBinding(row) : null;\n }\n\n /**\n * Recover the active binding for a thread when session state lost\n * `factoryProjectId` (e.g. crash-resume recreated the session empty).\n * Ambiguous matches across factory projects never authorize.\n */\n async findActiveRunBindingByThread(input: {\n orgId: string;\n threadId: string;\n resourceId: string;\n sessionId: string;\n }): Promise<FactoryRunBindingRecord | null> {\n const rows = await this.#db.findMany<GovernanceDbRow>('factory_run_bindings', {\n org_id: input.orgId,\n thread_id: input.threadId,\n resource_id: input.resourceId,\n session_id: input.sessionId,\n status: 'active',\n });\n if (new Set(rows.map(row => row.factory_project_id)).size !== 1) return null;\n const row = rows.sort((left, right) => right.created_at.getTime() - left.created_at.getTime())[0];\n return row ? toBinding(row) : null;\n }\n\n /** Resolve exact bound-session state for processor awareness; ambiguous cross-tenant matches return null. */\n async findRunBindingBySession(address: FactoryRunBindingSessionAddress): Promise<FactoryRunBindingRecord | null> {\n const rows = await this.#db.findMany<GovernanceDbRow>('factory_run_bindings', {\n factory_project_id: address.factoryProjectId,\n thread_id: address.threadId,\n resource_id: address.resourceId,\n session_id: address.sessionId,\n });\n if (new Set(rows.map(row => row.org_id)).size !== 1) return null;\n const row = rows.sort((left, right) => {\n if (left.status === 'active' && right.status !== 'active') return -1;\n if (right.status === 'active' && left.status !== 'active') return 1;\n return right.created_at.getTime() - left.created_at.getTime();\n })[0];\n return row ? toBinding(row) : null;\n }\n\n /** Revoke one exact tenant-scoped binding. */\n async revokeRunBinding(input: RevokeFactoryRunBindingInput): Promise<FactoryRunBindingRecord | null> {\n let revoked = false;\n const row = await this.#db.updateAtomic<GovernanceDbRow>(\n 'factory_run_bindings',\n { id: input.bindingId, org_id: input.orgId, factory_project_id: input.factoryProjectId },\n current => {\n if (current.status !== 'active') return null;\n revoked = true;\n return { status: 'revoked', revoked_at: input.revokedAt };\n },\n );\n return revoked && row ? toBinding(row) : null;\n }\n\n /** Enumerate active bindings for the server-owned restart reconciler. */\n async listActiveRunBindings(): Promise<FactoryRunBindingRecord[]> {\n return (await this.#db.findMany<GovernanceDbRow>('factory_run_bindings', { status: 'active' })).map(toBinding);\n }\n\n /** List binding history, optionally narrowed to one work item. */\n async listRunBindings(\n orgId: string,\n factoryProjectId: string,\n workItemId?: string,\n ): Promise<FactoryRunBindingRecord[]> {\n return (\n await this.#db.findMany<GovernanceDbRow>(\n 'factory_run_bindings',\n {\n org_id: orgId,\n factory_project_id: factoryProjectId,\n ...(workItemId ? { work_item_id: workItemId } : {}),\n },\n { orderBy: [['created_at', 'asc']] },\n )\n ).map(toBinding);\n }\n\n async listPendingStarts(orgId: string, factoryProjectId: string): Promise<FactoryPendingStartRecord[]> {\n return (\n await this.#db.findMany<GovernanceDbRow>(\n 'factory_pending_starts',\n { org_id: orgId, factory_project_id: factoryProjectId },\n { orderBy: [['created_at', 'asc']] },\n )\n ).map(toPendingStart);\n }\n\n async claimPendingStarts(input: FactoryLeaseClaimInput): Promise<FactoryPendingStartRecord[]> {\n return this.#claimLeases('factory_pending_starts', input, toPendingStart);\n }\n\n async renewPendingStartLease(identity: FactoryLeaseIdentity, leaseExpiresAt: Date): Promise<boolean> {\n return this.#renewLease('factory_pending_starts', identity, leaseExpiresAt);\n }\n\n async completePendingStart(identity: FactoryLeaseIdentity, now: Date): Promise<FactoryPendingStartRecord | null> {\n const row = await this.#completeLease('factory_pending_starts', identity, now);\n return row ? toPendingStart(row) : null;\n }\n\n async failPendingStart(input: FactoryDispatchFailureInput): Promise<FactoryPendingStartRecord | null> {\n const row = await this.#failLease('factory_pending_starts', input);\n return row ? toPendingStart(row) : null;\n }\n\n async prepareRunStart(input: PrepareFactoryRunStartInput): Promise<PrepareFactoryRunStartResult> {\n const prepare = () =>\n this.storage.withTransaction(async ops => {\n const prior = await ops.findOne<GovernanceDbRow>('factory_pending_starts', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n kickoff_key: input.kickoffKey,\n });\n if (prior) {\n const bindingRow = await ops.findOne<GovernanceDbRow>('factory_run_bindings', {\n id: String(prior.binding_id),\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n });\n const itemRow =\n bindingRow &&\n (await ops.findOne<WorkItemDbRow>('work_items', {\n id: String(bindingRow.work_item_id),\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n }));\n if (!bindingRow || !itemRow) throw new Error('Factory start replay references missing state.');\n return {\n item: toRow(itemRow),\n binding: toBinding(bindingRow),\n pendingStart: toPendingStart(prior),\n replayed: true,\n };\n }\n const now = new Date();\n const create = input.workItem.input;\n let row = input.workItem.id\n ? await ops.findOne<WorkItemDbRow>('work_items', {\n id: input.workItem.id,\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n })\n : sourceKey(create.externalSource)\n ? await ops.findOne<WorkItemDbRow>('work_items', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n source_key: sourceKey(create.externalSource),\n })\n : null;\n let item: WorkItemRow;\n if (row) {\n row = await ops.updateAtomic<WorkItemDbRow>('work_items', { id: row.id }, current => {\n const roles = new Set([...Object.keys(current.sessions), input.role]);\n const sessions = Object.fromEntries([...roles].map(role => [role, input.session]));\n return applyUpdate({ current, userId: input.userId, input: { sessions } });\n });\n item = toRow(row!);\n } else {\n if (create.parentWorkItemId)\n validateParentRelation(\n (\n await ops.findMany<WorkItemDbRow>('work_items', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n })\n ).map(toRow),\n undefined,\n create.parentWorkItemId,\n );\n row = await ops.insertOne<WorkItemDbRow>('work_items', {\n org_id: input.orgId,\n created_by: input.userId,\n factory_project_id: input.factoryProjectId,\n external_source: create.externalSource ?? null,\n source_key: sourceKey(create.externalSource),\n parent_work_item_id: create.parentWorkItemId ?? null,\n title: create.title,\n stages: create.stages ?? [],\n stage_history: applyStageTransition([], [], create.stages ?? [], input.userId, now),\n sessions: stampSessions({ [input.role]: input.session }, input.userId),\n metadata: create.metadata ?? null,\n revision: 1,\n created_at: now,\n updated_at: now,\n });\n item = toRow(row);\n }\n await ops.updateMany(\n 'factory_run_bindings',\n {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n thread_id: input.session.threadId,\n resource_id: input.resourceId,\n session_id: input.session.sessionId,\n status: 'active',\n },\n { status: 'revoked', revoked_at: now },\n );\n await ops.updateMany(\n 'factory_run_bindings',\n {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n work_item_id: item.id,\n role: input.role,\n status: 'active',\n },\n { status: 'revoked', revoked_at: now },\n );\n const bindingRow = await ops.insertOne<GovernanceDbRow>('factory_run_bindings', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n work_item_id: item.id,\n role: input.role,\n thread_id: input.session.threadId,\n resource_id: input.resourceId,\n session_id: input.session.sessionId,\n branch: input.session.branch,\n status: 'active',\n created_at: now,\n revoked_at: null,\n });\n const pendingRow = await ops.insertOne<GovernanceDbRow>('factory_pending_starts', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n binding_id: bindingRow.id,\n kickoff_key: input.kickoffKey,\n message: input.kickoffMessage,\n status: 'pending',\n attempts: 0,\n available_at: now,\n lease_owner: null,\n lease_expires_at: null,\n last_error: null,\n completed_at: null,\n created_at: now,\n updated_at: now,\n });\n return { item, binding: toBinding(bindingRow), pendingStart: toPendingStart(pendingRow), replayed: false };\n });\n // A losing preparer can hit two distinct unique violations back to back:\n // first on the work item's `source_key`, then on the pending start's\n // `kickoff_key` (when the winner commits its pending row between our\n // attempts). Each retry re-reads, so one extra attempt converges on replay.\n let lastError: unknown;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n return await prepare();\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n lastError = error;\n }\n }\n throw lastError;\n }\n\n async markPendingStart(\n bindingId: string,\n status: 'sent' | 'failed',\n lastError?: string,\n ): Promise<FactoryPendingStartRecord | null> {\n const row = await this.#db.updateAtomic<GovernanceDbRow>(\n 'factory_pending_starts',\n { binding_id: bindingId },\n () => ({ status, last_error: lastError ?? null, updated_at: new Date() }),\n );\n return row ? toPendingStart(row) : null;\n }\n\n /**\n * Create a work item, reusing the existing record when `sourceKey` already\n * has one for the project (acting twice on the same issue must not duplicate\n * the card). On reuse the provided stages replace the current ones (with the\n * transition recorded in history) and sessions/metadata are merged in. The\n * result discriminates insert from reuse so callers can audit the actual\n * outcome.\n */\n async upsert(params: {\n orgId: string;\n userId: string;\n factoryProjectId: string;\n input: CreateWorkItemInput;\n reuseMode?: 'update' | 'preserve' | 'non-stage';\n }): Promise<UpsertWorkItemResult> {\n const run = (ops: FactoryStorageOps) => this.#upsert(params, ops);\n const execute = () =>\n params.input.parentWorkItemId\n ? this.#withProjectRelationTransaction(params.orgId, params.factoryProjectId, run)\n : run(this.#db);\n try {\n return await execute();\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n return execute();\n }\n }\n\n async #upsert(\n {\n orgId,\n userId,\n factoryProjectId,\n input,\n reuseMode = 'update',\n }: {\n orgId: string;\n userId: string;\n factoryProjectId: string;\n input: CreateWorkItemInput;\n reuseMode?: 'update' | 'preserve' | 'non-stage';\n },\n ops: FactoryStorageOps,\n ): Promise<UpsertWorkItemResult> {\n const key = sourceKey(input.externalSource);\n const reuse = async (): Promise<UpsertWorkItemResult | null> => {\n if (!key) return null;\n const existing = await ops.findOne<WorkItemDbRow>('work_items', {\n org_id: orgId,\n factory_project_id: factoryProjectId,\n source_key: key,\n });\n if (!existing) return null;\n if (reuseMode === 'preserve') {\n const item = toWorkItem(existing);\n return { created: false, item, previous: priorState(existing) };\n }\n\n let previous = emptyPrior();\n const updated = await ops.updateAtomic<WorkItemDbRow>(\n 'work_items',\n { org_id: orgId, factory_project_id: factoryProjectId, source_key: key },\n async current => {\n previous = priorState(current);\n const fullPatch = input.parentWorkItemId === null ? { ...input, parentWorkItemId: undefined } : input;\n const patch: UpdateWorkItemInput =\n reuseMode === 'non-stage'\n ? {\n title: input.title,\n parentWorkItemId: input.parentWorkItemId ?? undefined,\n metadata: input.metadata,\n }\n : fullPatch;\n if (patch.parentWorkItemId !== undefined) {\n validateParentRelation(\n await this.#listWithOps(ops, orgId, factoryProjectId),\n current.id,\n patch.parentWorkItemId,\n );\n }\n return {\n external_source: input.externalSource ?? null,\n ...applyUpdate({ current, userId, input: patch }),\n };\n },\n );\n return updated ? { item: toWorkItem(updated), created: false, previous } : null;\n };\n\n const reused = await reuse();\n if (reused) return reused;\n\n const now = new Date();\n const stages = input.stages ?? ['intake'];\n validateParentRelation(\n await this.#listWithOps(ops, orgId, factoryProjectId),\n undefined,\n input.parentWorkItemId ?? null,\n );\n const row = await ops.insertOne<WorkItemDbRow>('work_items', {\n org_id: orgId,\n factory_project_id: factoryProjectId,\n external_source: input.externalSource ?? null,\n source_key: key,\n parent_work_item_id: input.parentWorkItemId ?? null,\n title: input.title,\n stages,\n stage_history: stages.map(stage => ({ stage, enteredAt: now.toISOString(), by: userId })),\n sessions: stampSessions(input.sessions ?? {}, userId),\n metadata: input.metadata ?? null,\n revision: 1,\n created_by: userId,\n created_at: now,\n updated_at: now,\n });\n return { item: toWorkItem(row), created: true, previous: emptyPrior() };\n }\n\n async update({\n orgId,\n id,\n userId,\n patch,\n }: {\n orgId: string;\n id: string;\n userId: string;\n patch: UpdateWorkItemInput;\n }): Promise<{ item: WorkItemRow; previous: WorkItemPriorState } | null> {\n const run = async (ops: FactoryStorageOps) => {\n let previous = emptyPrior();\n const row = await ops.updateAtomic<WorkItemDbRow>('work_items', { org_id: orgId, id }, async current => {\n previous = priorState(current);\n if (patch.parentWorkItemId !== undefined) {\n validateParentRelation(\n await this.#listWithOps(ops, orgId, current.factory_project_id),\n current.id,\n patch.parentWorkItemId,\n );\n }\n return applyUpdate({ current, userId, input: patch });\n });\n return row ? { item: toWorkItem(row), previous } : null;\n };\n\n if (patch.parentWorkItemId === undefined) return run(this.#db);\n const candidate = await this.#db.findOne<WorkItemDbRow>('work_items', { org_id: orgId, id });\n if (!candidate) return null;\n return this.#withProjectRelationTransaction(orgId, candidate.factory_project_id, run);\n }\n\n async delete({ orgId, id }: { orgId: string; id: string }): Promise<WorkItemRow | null> {\n const candidate = await this.#db.findOne<WorkItemDbRow>('work_items', { org_id: orgId, id });\n if (!candidate) return null;\n\n return this.#withProjectRelationTransaction(orgId, candidate.factory_project_id, async ops => {\n const existing = await ops.findOne<WorkItemDbRow>('work_items', { org_id: orgId, id });\n if (!existing) return null;\n const deleted = await ops.deleteMany('work_items', { org_id: orgId, id });\n if (deleted === 0) return null;\n await ops.updateMany(\n 'work_items',\n { org_id: orgId, parent_work_item_id: id },\n { parent_work_item_id: null, updated_at: new Date() },\n );\n return toWorkItem(existing);\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"base.js","names":["#db","#withProjectRelationTransaction","#claimLeases","#renewLease","#completeLease","#failLease","#listWithOps","#settleProposedDecision","#upsert"],"sources":["../../../../src/storage/domains/work-items/base.ts"],"sourcesContent":["/**\n * Factory work-items storage domain.\n *\n * Work items belong to a first-class Factory project. External intake items use\n * a provider-neutral source reference; manual work items have no source.\n * Stage history is server-owned, while session and metadata patches merge\n * atomically so concurrent actors do not overwrite each other. The authoritative\n * Factory transition path keeps one exclusive current stage per item.\n */\n\nimport { createHash } from 'node:crypto';\n\nimport { FactoryStorageDomain, UniqueViolationError } from '@mastra/core/storage';\nimport type { CollectionSchema, FactoryStorageOps } from '@mastra/core/storage';\n\nexport type WorkItemStage = string;\n\nfunction stableJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableJson).join(',')}]`;\n if (value && typeof value === 'object') {\n return `{${Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)\n .join(',')}}`;\n }\n return JSON.stringify(value) ?? 'null';\n}\n\nexport function factoryDecisionHash(decision: Record<string, unknown>): string {\n return createHash('sha256').update(stableJson(decision)).digest('hex');\n}\n\nexport interface ExternalWorkItemSource {\n integrationId: string;\n type: string;\n externalId: string;\n url?: string;\n}\n\nexport interface WorkItemStageEntry {\n stage: WorkItemStage;\n enteredAt: string;\n exitedAt?: string;\n by: string;\n /**\n * Actor that closed this entry; absent on entries written before exit\n * stamping existed — treat as human.\n */\n exitedBy?: string;\n}\n\n/**\n * Whether an actor id marks a move an agent run performed: the binding id the\n * transition tool stamps (`agent:*`), or the rule that fires off a bound run's\n * tool result (see `factory/rules/processor.ts`).\n *\n * Deliberately narrower than \"not a human\": the poller stamps\n * `factory-rule-dispatcher` / `github:*` on every card it syncs from the\n * upstream repo, so counting those as machine work reports the repo's activity\n * as the Factory's and pins any such ratio near 100%.\n */\nexport function isAgentActor(by: string | undefined): boolean {\n if (by === undefined) return false;\n return by.startsWith('agent:') || by === 'factory-tool-result-rule';\n}\n\nexport interface WorkItemSessionRef {\n sessionId: string;\n branch: string;\n threadId: string;\n startedBy: string;\n}\n\nexport interface FactoryRuleIngressRecord {\n id: string;\n orgId: string;\n factoryProjectId: string;\n identity: string;\n triggerType: string;\n transitionId: string;\n result: Record<string, unknown>;\n createdAt: Date;\n}\n\nexport interface CommitFactoryRuleEvaluationInput {\n orgId: string;\n factoryProjectId: string;\n workItemId: string | null;\n ingress: { identity: string; triggerType: string };\n ruleSetVersion: string;\n expectedRevision: number | null;\n actor: Record<string, unknown> | null;\n outcome: { status: 'accepted' | 'rejected'; code?: string; reason?: string };\n decisions: Record<string, unknown>[];\n causalChain: Array<{ ingressId: string; decisionType: string }>;\n now: Date;\n}\n\nexport type CommitFactoryRuleEvaluationResult =\n | { status: 'committed'; result: Record<string, unknown> }\n | { status: 'replayed'; result: Record<string, unknown> }\n | { status: 'missing' };\n\nexport interface FactoryToolResultCursorRecord {\n bindingId: string;\n orgId: string;\n factoryProjectId: string;\n lastMessageId: string;\n lastMessageCreatedAt: Date;\n updatedAt: Date;\n}\n\nexport interface FactoryRuleEvaluationRecord {\n id: string;\n ingressId: string;\n workItemId: string | null;\n ruleSetVersion: string;\n expectedRevision: number | null;\n outcome: 'accepted' | 'rejected';\n code: string | null;\n reason: string | null;\n causalChain: Array<{ ingressId: string; decisionType: string }>;\n createdAt: Date;\n}\n\n/** `proposed` is parked awaiting approval and never claimed; `dismissed` is a proposal turned down. */\nexport type FactoryDispatchStatus = 'pending' | 'proposed' | 'dismissed' | 'leased' | 'retry' | 'succeeded' | 'failed';\n\nexport interface FactoryDeferredDecisionPageInput {\n orgId: string;\n factoryProjectId: string;\n statuses?: FactoryDispatchStatus[];\n before?: { createdAt: Date; id: string };\n limit: number;\n}\n\nexport interface FactoryDeferredDecisionPage {\n decisions: FactoryDeferredDecisionRecord[];\n hasMore: boolean;\n}\n\nexport interface FactoryDeferredDecisionRecord {\n id: string;\n orgId: string;\n factoryProjectId: string;\n evaluationId: string;\n workItemId: string | null;\n idempotencyKey: string;\n effectOrdinal: number;\n effectHash: string;\n causalChain: Array<{ ingressId: string; decisionType: string }>;\n actor: Record<string, unknown> | null;\n decision: Record<string, unknown>;\n status: FactoryDispatchStatus;\n attempts: number;\n availableAt: Date;\n leaseOwner: string | null;\n leaseExpiresAt: Date | null;\n lastError: string | null;\n /** When a human released this run; set once, so the gate never parks it again. */\n approvedAt: Date | null;\n completedAt: Date | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface FactoryRunBindingSessionAddress {\n factoryProjectId: string;\n threadId: string;\n resourceId: string;\n sessionId: string;\n}\n\nexport interface FactoryRunBindingAddress extends FactoryRunBindingSessionAddress {\n orgId: string;\n}\n\nexport interface RevokeFactoryRunBindingInput {\n orgId: string;\n factoryProjectId: string;\n bindingId: string;\n revokedAt: Date;\n}\n\nexport interface FactoryRunBindingRecord {\n id: string;\n orgId: string;\n factoryProjectId: string;\n workItemId: string;\n role: string;\n threadId: string;\n resourceId: string;\n sessionId: string;\n branch: string;\n status: 'active' | 'revoked';\n createdAt: Date;\n revokedAt: Date | null;\n}\n\nexport interface FactoryPendingStartRecord {\n id: string;\n orgId: string;\n factoryProjectId: string;\n bindingId: string;\n kickoffKey: string;\n message: string | null;\n status: 'pending' | 'leased' | 'retry' | 'sent' | 'failed';\n attempts: number;\n availableAt: Date;\n leaseOwner: string | null;\n leaseExpiresAt: Date | null;\n lastError: string | null;\n completedAt: Date | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface FactoryLeaseClaimInput {\n ownerId: string;\n now: Date;\n leaseExpiresAt: Date;\n limit: number;\n}\n\nexport interface FactoryLeaseIdentity {\n id: string;\n orgId: string;\n factoryProjectId: string;\n ownerId: string;\n}\n\nexport interface FactoryDispatchFailureInput extends FactoryLeaseIdentity {\n now: Date;\n availableAt: Date;\n lastError: string;\n terminal: boolean;\n}\n\nexport interface CommitFactoryTransitionInput {\n orgId: string;\n factoryProjectId: string;\n workItemId: string;\n expectedRevision: number;\n destinationStage: string;\n actorId: string;\n ingress: { identity: string; triggerType: string; transitionId: string };\n ruleSetVersion: string;\n causalChain: Array<{ ingressId: string; decisionType: string }>;\n evaluation:\n | { outcome: 'accepted'; decisions: Record<string, unknown>[] }\n | { outcome: 'rejected'; code: string; reason: string };\n}\n\nexport type CommitFactoryTransitionResult =\n | { status: 'committed'; item: WorkItemRow | null; result: Record<string, unknown> }\n | { status: 'replayed'; item: WorkItemRow | null; result: Record<string, unknown> }\n | { status: 'missing' };\n\nexport interface PrepareFactoryRunStartInput {\n orgId: string;\n userId: string;\n factoryProjectId: string;\n workItem: { id?: string; input: CreateWorkItemInput };\n role: string;\n session: WorkItemSessionInput;\n resourceId: string;\n kickoffKey: string;\n kickoffMessage: string | null;\n}\n\nexport interface PrepareFactoryRunStartResult {\n item: WorkItemRow;\n binding: FactoryRunBindingRecord;\n pendingStart: FactoryPendingStartRecord;\n replayed: boolean;\n}\n\n/** Session ref as accepted from clients — `startedBy` is stamped server-side. */\nexport interface WorkItemSessionInput {\n sessionId: string;\n branch: string;\n threadId: string;\n}\n\nexport type WorkItemSessions = Record<string, WorkItemSessionRef>;\n\nexport interface WorkItemRow {\n id: string;\n orgId: string;\n factoryProjectId: string;\n externalSource: ExternalWorkItemSource | null;\n parentWorkItemId: string | null;\n title: string;\n stages: WorkItemStage[];\n stageHistory: WorkItemStageEntry[];\n sessions: WorkItemSessions;\n metadata: Record<string, unknown> | null;\n revision: number;\n createdBy: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface CreateWorkItemInput {\n externalSource?: ExternalWorkItemSource | null;\n parentWorkItemId?: string | null;\n title: string;\n stages?: WorkItemStage[];\n sessions?: Record<string, WorkItemSessionInput>;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface UpdateWorkItemInput {\n parentWorkItemId?: string | null;\n title?: string;\n stages?: WorkItemStage[];\n sessions?: Record<string, WorkItemSessionInput>;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface WorkItemPriorState {\n stages: WorkItemStage[];\n sessionRoles: string[];\n}\n\nexport interface UpsertWorkItemResult {\n item: WorkItemRow;\n created: boolean;\n previous: WorkItemPriorState;\n}\n\nexport const WORK_ITEMS_SCHEMA: CollectionSchema = {\n name: 'work_items',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n external_source: { type: 'json', nullable: true },\n source_key: { type: 'text', nullable: true },\n parent_work_item_id: { type: 'text', nullable: true },\n title: { type: 'text' },\n stages: { type: 'json' },\n stage_history: { type: 'json' },\n sessions: { type: 'json' },\n metadata: { type: 'json', nullable: true },\n revision: { type: 'integer', default: 1 },\n created_by: { type: 'text' },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'work_items_project_source_key_unique',\n columns: ['factory_project_id', 'source_key'],\n },\n ],\n indexes: [\n {\n name: 'work_items_org_project_updated_at_idx',\n columns: ['org_id', 'factory_project_id', 'updated_at'],\n },\n {\n name: 'work_items_project_parent_idx',\n columns: ['org_id', 'factory_project_id', 'parent_work_item_id'],\n },\n ],\n};\n\ninterface WorkItemDbRow extends Record<string, unknown> {\n id: string;\n org_id: string;\n factory_project_id: string;\n external_source: ExternalWorkItemSource | null;\n source_key: string | null;\n parent_work_item_id: string | null;\n title: string;\n stages: WorkItemStage[];\n stage_history: WorkItemStageEntry[];\n sessions: WorkItemSessions;\n metadata: Record<string, unknown> | null;\n revision: number;\n created_by: string;\n created_at: Date;\n updated_at: Date;\n}\n\nfunction sourceKey(source: ExternalWorkItemSource | null | undefined): string | null {\n return source ? `${source.integrationId}:${source.type}:${source.externalId}` : null;\n}\n\nfunction toWorkItem(row: WorkItemDbRow): WorkItemRow {\n return {\n id: row.id,\n orgId: row.org_id,\n factoryProjectId: String(row.factory_project_id),\n externalSource: row.external_source,\n parentWorkItemId: row.parent_work_item_id,\n title: row.title,\n stages: row.stages,\n stageHistory: row.stage_history,\n sessions: row.sessions,\n metadata: row.metadata,\n revision: row.revision,\n createdBy: row.created_by,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nconst toRow = toWorkItem;\n\nfunction patchColumns(changes: Partial<WorkItemRow>): Partial<WorkItemDbRow> {\n return {\n ...(changes.parentWorkItemId !== undefined ? { parent_work_item_id: changes.parentWorkItemId } : {}),\n ...(changes.title !== undefined ? { title: changes.title } : {}),\n ...(changes.stages !== undefined ? { stages: changes.stages } : {}),\n ...(changes.stageHistory !== undefined ? { stage_history: changes.stageHistory } : {}),\n ...(changes.sessions !== undefined ? { sessions: changes.sessions } : {}),\n ...(changes.metadata !== undefined ? { metadata: changes.metadata } : {}),\n ...(changes.revision !== undefined ? { revision: changes.revision } : {}),\n ...(changes.updatedAt !== undefined ? { updated_at: changes.updatedAt } : {}),\n };\n}\n\nfunction emptyPrior(): WorkItemPriorState {\n return { stages: [], sessionRoles: [] };\n}\n\nfunction priorState(row: WorkItemDbRow): WorkItemPriorState {\n return { stages: row.stages, sessionRoles: Object.keys(row.sessions) };\n}\n\nexport class WorkItemRelationError extends Error {\n readonly code = 'invalid_work_item_relation';\n}\n\nexport function validateParentRelation(\n projectItems: WorkItemRow[],\n itemId: string | undefined,\n parentWorkItemId: string | null,\n): void {\n if (parentWorkItemId === null) return;\n const byId = new Map(projectItems.map(item => [item.id, item]));\n const parent = byId.get(parentWorkItemId);\n if (!parent) throw new WorkItemRelationError('Related work item not found in this project.');\n if (itemId === parentWorkItemId) throw new WorkItemRelationError('A work item cannot relate to itself.');\n\n const visited = new Set<string>();\n let cursor: WorkItemRow | undefined = parent;\n while (cursor?.parentWorkItemId) {\n if (cursor.parentWorkItemId === itemId) {\n throw new WorkItemRelationError('This relationship would create a cycle.');\n }\n if (visited.has(cursor.id)) throw new WorkItemRelationError('The related work item chain contains a cycle.');\n visited.add(cursor.id);\n cursor = byId.get(cursor.parentWorkItemId);\n }\n}\n\n/**\n * Diff `oldStages` → `newStages` and return the updated history: exited stages\n * get `exitedAt` + `exitedBy` stamped on their open entry, entered stages get\n * a new entry.\n */\nexport function applyStageTransition(\n history: WorkItemStageEntry[],\n oldStages: WorkItemStage[],\n newStages: WorkItemStage[],\n by: string,\n now: Date,\n): WorkItemStageEntry[] {\n const timestamp = now.toISOString();\n const next = history.map(entry => ({ ...entry }));\n for (const stage of oldStages) {\n if (newStages.includes(stage)) continue;\n for (let i = next.length - 1; i >= 0; i--) {\n const entry = next[i]!;\n if (entry.stage === stage && entry.exitedAt === undefined) {\n entry.exitedAt = timestamp;\n entry.exitedBy = by;\n break;\n }\n }\n }\n for (const stage of newStages) {\n if (!oldStages.includes(stage)) next.push({ stage, enteredAt: timestamp, by });\n }\n return next;\n}\n\nexport function stampSessions(sessions: Record<string, WorkItemSessionInput>, by: string): WorkItemSessions {\n return Object.fromEntries(Object.entries(sessions).map(([role, session]) => [role, { ...session, startedBy: by }]));\n}\n\nfunction applyUpdate({\n current,\n userId,\n input,\n}: {\n current: WorkItemDbRow;\n userId: string;\n input: UpdateWorkItemInput;\n}): Partial<WorkItemDbRow> {\n const now = new Date();\n return {\n ...(input.parentWorkItemId !== undefined ? { parent_work_item_id: input.parentWorkItemId } : {}),\n ...(input.title !== undefined ? { title: input.title } : {}),\n ...(input.stages !== undefined\n ? {\n stages: input.stages,\n stage_history: applyStageTransition(current.stage_history, current.stages, input.stages, userId, now),\n }\n : {}),\n ...(input.sessions !== undefined\n ? { sessions: { ...current.sessions, ...stampSessions(input.sessions, userId) } }\n : {}),\n ...(input.metadata !== undefined\n ? { metadata: input.metadata === null ? null : { ...(current.metadata ?? {}), ...input.metadata } }\n : {}),\n revision: current.revision + 1,\n updated_at: now,\n };\n}\n\nconst projectRelationLocks = new Map<string, Promise<unknown>>();\n\nfunction withInProcessProjectLock<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const previous = projectRelationLocks.get(key) ?? Promise.resolve();\n const result = previous.then(fn, fn);\n const tail = result.then(\n () => undefined,\n () => undefined,\n );\n projectRelationLocks.set(key, tail);\n void tail.then(() => {\n if (projectRelationLocks.get(key) === tail) projectRelationLocks.delete(key);\n });\n return result;\n}\n\nconst FACTORY_GOVERNANCE_SCHEMAS: CollectionSchema[] = [\n {\n name: 'factory_rule_ingress',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n identity: { type: 'text' },\n trigger_type: { type: 'text' },\n transition_id: { type: 'text' },\n result: { type: 'json' },\n created_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n { name: 'factory_rule_ingress_tenant_identity_unique', columns: ['org_id', 'factory_project_id', 'identity'] },\n ],\n },\n {\n name: 'factory_rule_evaluations',\n columns: {\n id: { type: 'uuid-pk' },\n ingress_id: { type: 'text' },\n work_item_id: { type: 'text', nullable: true },\n rule_set_version: { type: 'text' },\n expected_revision: { type: 'integer', nullable: true },\n outcome: { type: 'text' },\n code: { type: 'text', nullable: true },\n reason: { type: 'text', nullable: true },\n causal_chain: { type: 'json' },\n created_at: { type: 'timestamp' },\n },\n },\n {\n name: 'factory_deferred_decisions',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n evaluation_id: { type: 'text' },\n work_item_id: { type: 'text', nullable: true },\n idempotency_key: { type: 'text' },\n effect_ordinal: { type: 'integer' },\n effect_hash: { type: 'text' },\n causal_chain: { type: 'json' },\n actor: { type: 'json', nullable: true },\n decision: { type: 'json' },\n status: { type: 'text' },\n attempts: { type: 'integer' },\n available_at: { type: 'timestamp' },\n lease_owner: { type: 'text', nullable: true },\n lease_expires_at: { type: 'timestamp', nullable: true },\n last_error: { type: 'text', nullable: true },\n approved_at: { type: 'timestamp', nullable: true },\n completed_at: { type: 'timestamp', nullable: true },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'factory_deferred_decisions_tenant_key_unique',\n columns: ['org_id', 'factory_project_id', 'idempotency_key'],\n },\n ],\n indexes: [{ name: 'factory_deferred_decisions_claim_idx', columns: ['status', 'created_at'] }],\n },\n {\n name: 'factory_run_bindings',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n work_item_id: { type: 'text' },\n role: { type: 'text' },\n thread_id: { type: 'text' },\n resource_id: { type: 'text' },\n session_id: { type: 'text' },\n branch: { type: 'text' },\n status: { type: 'text' },\n created_at: { type: 'timestamp' },\n revoked_at: { type: 'timestamp', nullable: true },\n },\n indexes: [\n // Exact-address lookups run on every processor message; status filter is\n // applied on top of the address columns.\n {\n name: 'factory_run_bindings_session_idx',\n columns: ['factory_project_id', 'thread_id', 'resource_id', 'session_id'],\n },\n // Restart reconciler enumerates active bindings across all tenants.\n { name: 'factory_run_bindings_status_idx', columns: ['status'] },\n ],\n },\n {\n name: 'factory_tool_result_cursors',\n columns: {\n binding_id: { type: 'text', primaryKey: true },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n last_message_id: { type: 'text' },\n last_message_created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n },\n {\n name: 'factory_pending_starts',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n binding_id: { type: 'text' },\n kickoff_key: { type: 'text' },\n message: { type: 'text', nullable: true },\n status: { type: 'text' },\n attempts: { type: 'integer' },\n available_at: { type: 'timestamp' },\n lease_owner: { type: 'text', nullable: true },\n lease_expires_at: { type: 'timestamp', nullable: true },\n last_error: { type: 'text', nullable: true },\n completed_at: { type: 'timestamp', nullable: true },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'factory_pending_starts_tenant_kickoff_unique',\n columns: ['org_id', 'factory_project_id', 'kickoff_key'],\n },\n ],\n indexes: [{ name: 'factory_pending_starts_claim_idx', columns: ['status', 'created_at'] }],\n },\n];\n\ninterface GovernanceDbRow extends Record<string, unknown> {\n id: string;\n org_id: string;\n factory_project_id: string;\n created_at: Date;\n [key: string]: unknown;\n}\n\nfunction toBinding(row: GovernanceDbRow): FactoryRunBindingRecord {\n return {\n id: row.id,\n orgId: row.org_id,\n factoryProjectId: String(row.factory_project_id),\n workItemId: String(row.work_item_id),\n role: String(row.role),\n threadId: String(row.thread_id),\n resourceId: String(row.resource_id),\n sessionId: String(row.session_id),\n branch: String(row.branch),\n status: row.status as FactoryRunBindingRecord['status'],\n createdAt: row.created_at,\n revokedAt: (row.revoked_at as Date | null) ?? null,\n };\n}\nfunction toDeferredDecision(row: GovernanceDbRow): FactoryDeferredDecisionRecord {\n return {\n id: row.id,\n orgId: row.org_id,\n factoryProjectId: String(row.factory_project_id),\n evaluationId: String(row.evaluation_id),\n workItemId: row.work_item_id === null || row.work_item_id === undefined ? null : String(row.work_item_id),\n idempotencyKey: String(row.idempotency_key),\n effectOrdinal: Number(row.effect_ordinal),\n effectHash: String(row.effect_hash),\n causalChain: (row.causal_chain as FactoryDeferredDecisionRecord['causalChain']) ?? [],\n actor: (row.actor as Record<string, unknown> | null) ?? null,\n decision: row.decision as Record<string, unknown>,\n status: row.status as FactoryDispatchStatus,\n attempts: Number(row.attempts),\n availableAt: row.available_at as Date,\n leaseOwner: (row.lease_owner as string | null) ?? null,\n leaseExpiresAt: (row.lease_expires_at as Date | null) ?? null,\n lastError: (row.last_error as string | null) ?? null,\n approvedAt: (row.approved_at as Date | null) ?? null,\n completedAt: (row.completed_at as Date | null) ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at as Date,\n };\n}\nfunction toPendingStart(row: GovernanceDbRow): FactoryPendingStartRecord {\n return {\n id: row.id,\n orgId: row.org_id,\n factoryProjectId: String(row.factory_project_id),\n bindingId: String(row.binding_id),\n kickoffKey: String(row.kickoff_key),\n message: (row.message as string | null) ?? null,\n status: row.status as FactoryPendingStartRecord['status'],\n attempts: Number(row.attempts),\n availableAt: row.available_at as Date,\n leaseOwner: (row.lease_owner as string | null) ?? null,\n leaseExpiresAt: (row.lease_expires_at as Date | null) ?? null,\n lastError: (row.last_error as string | null) ?? null,\n completedAt: (row.completed_at as Date | null) ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at as Date,\n };\n}\n\nexport class WorkItemsStorage extends FactoryStorageDomain {\n constructor() {\n super('work-items');\n }\n\n async init(): Promise<void> {\n await this.ensureCollections([WORK_ITEMS_SCHEMA, ...FACTORY_GOVERNANCE_SCHEMAS]);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.ops.deleteMany('work_items', {});\n }\n\n get #db(): FactoryStorageOps {\n return this.ops;\n }\n\n async #withProjectRelationTransaction<T>(\n orgId: string,\n factoryProjectId: string,\n fn: (ops: FactoryStorageOps) => Promise<T>,\n ): Promise<T> {\n const key = `work-items:${orgId}:${factoryProjectId}`;\n return withInProcessProjectLock(key, () => this.storage.withTransaction(fn, { isolationLevel: 'serializable' }));\n }\n\n async #claimLeases<T>(\n table: 'factory_deferred_decisions' | 'factory_pending_starts',\n input: FactoryLeaseClaimInput,\n map: (row: GovernanceDbRow) => T,\n ): Promise<T[]> {\n const claim = () =>\n this.storage.withTransaction(async ops => {\n // Bounded candidate window: only rows in claimable/expirable statuses,\n // oldest first. Terminal rows (sent/succeeded/failed) accumulate over a\n // deployment's lifetime and must never be scanned per dispatch tick.\n const candidates = await ops.findMany<GovernanceDbRow>(\n table,\n { status: { in: ['pending', 'retry', 'leased'] } },\n { orderBy: [['created_at', 'asc']], limit: Math.max(input.limit * 5, 50) },\n );\n const claimed: T[] = [];\n for (const candidate of candidates) {\n if (claimed.length >= input.limit) break;\n const availableAt = new Date(candidate.available_at as Date | string).getTime();\n const leaseExpiresAt = candidate.lease_expires_at\n ? new Date(candidate.lease_expires_at as Date | string).getTime()\n : 0;\n const claimable =\n (candidate.status === 'pending' || candidate.status === 'retry') && availableAt <= input.now.getTime();\n const expired = candidate.status === 'leased' && leaseExpiresAt <= input.now.getTime();\n if (!claimable && !expired) continue;\n let didClaim = false;\n const row = await ops.updateAtomic<GovernanceDbRow>(table, { id: candidate.id }, current => {\n const currentAvailable = new Date(current.available_at as Date | string).getTime();\n const currentExpiry = current.lease_expires_at\n ? new Date(current.lease_expires_at as Date | string).getTime()\n : 0;\n const currentClaimable =\n (current.status === 'pending' || current.status === 'retry') && currentAvailable <= input.now.getTime();\n const currentExpired = current.status === 'leased' && currentExpiry <= input.now.getTime();\n if (!currentClaimable && !currentExpired) return null;\n didClaim = true;\n return {\n status: 'leased',\n attempts: Number(current.attempts) + 1,\n lease_owner: input.ownerId,\n lease_expires_at: input.leaseExpiresAt,\n updated_at: input.now,\n };\n });\n if (didClaim && row) claimed.push(map(row));\n }\n return claimed;\n });\n return claim();\n }\n\n async #renewLease(\n table: 'factory_deferred_decisions' | 'factory_pending_starts',\n identity: FactoryLeaseIdentity,\n leaseExpiresAt: Date,\n ): Promise<boolean> {\n let renewed = false;\n await this.#db.updateAtomic<GovernanceDbRow>(\n table,\n { id: identity.id, org_id: identity.orgId, factory_project_id: identity.factoryProjectId },\n current => {\n if (current.status !== 'leased' || current.lease_owner !== identity.ownerId) return null;\n renewed = true;\n return { lease_expires_at: leaseExpiresAt, updated_at: new Date() };\n },\n );\n return renewed;\n }\n\n async #completeLease(\n table: 'factory_deferred_decisions' | 'factory_pending_starts',\n identity: FactoryLeaseIdentity,\n now: Date,\n ): Promise<GovernanceDbRow | null> {\n let completed = false;\n const row = await this.#db.updateAtomic<GovernanceDbRow>(\n table,\n { id: identity.id, org_id: identity.orgId, factory_project_id: identity.factoryProjectId },\n current => {\n if (current.status !== 'leased' || current.lease_owner !== identity.ownerId) return null;\n completed = true;\n return {\n status: table === 'factory_pending_starts' ? 'sent' : 'succeeded',\n lease_owner: null,\n lease_expires_at: null,\n completed_at: now,\n updated_at: now,\n };\n },\n );\n return completed ? row : null;\n }\n\n async #failLease(\n table: 'factory_deferred_decisions' | 'factory_pending_starts',\n input: FactoryDispatchFailureInput,\n ): Promise<GovernanceDbRow | null> {\n let failed = false;\n const row = await this.#db.updateAtomic<GovernanceDbRow>(\n table,\n { id: input.id, org_id: input.orgId, factory_project_id: input.factoryProjectId },\n current => {\n if (current.status !== 'leased' || current.lease_owner !== input.ownerId) return null;\n failed = true;\n return {\n status: input.terminal ? 'failed' : 'retry',\n available_at: input.availableAt,\n lease_owner: null,\n lease_expires_at: null,\n last_error: input.lastError,\n completed_at: input.terminal ? input.now : null,\n updated_at: input.now,\n };\n },\n );\n return failed ? row : null;\n }\n\n async #listWithOps(ops: FactoryStorageOps, orgId: string, factoryProjectId: string): Promise<WorkItemRow[]> {\n const rows = await ops.findMany<WorkItemDbRow>(\n 'work_items',\n { org_id: orgId, factory_project_id: factoryProjectId },\n { orderBy: [['updated_at', 'desc']] },\n );\n return rows.map(toWorkItem);\n }\n\n /** List the org's work items for a project, newest first. */\n async list({ orgId, factoryProjectId }: { orgId: string; factoryProjectId: string }): Promise<WorkItemRow[]> {\n return this.#listWithOps(this.#db, orgId, factoryProjectId);\n }\n\n async get({ orgId, id }: { orgId: string; id: string }): Promise<WorkItemRow | null> {\n const row = await this.#db.findOne<WorkItemDbRow>('work_items', { org_id: orgId, id });\n return row ? toWorkItem(row) : null;\n }\n\n async getForProject(orgId: string, factoryProjectId: string, id: string): Promise<WorkItemRow | null> {\n const row = await this.#db.findOne<WorkItemDbRow>('work_items', {\n id,\n org_id: orgId,\n factory_project_id: factoryProjectId,\n });\n return row ? toRow(row) : null;\n }\n\n async getTransitionResultByIngress(\n orgId: string,\n factoryProjectId: string,\n identity: string,\n ): Promise<Record<string, unknown> | null> {\n const row = await this.#db.findOne<GovernanceDbRow>('factory_rule_ingress', {\n org_id: orgId,\n factory_project_id: factoryProjectId,\n identity,\n });\n return (row?.result as Record<string, unknown> | undefined) ?? null;\n }\n\n async commitTransition(input: CommitFactoryTransitionInput): Promise<CommitFactoryTransitionResult> {\n const commit = (): Promise<CommitFactoryTransitionResult> =>\n this.storage.withTransaction<CommitFactoryTransitionResult>(async ops => {\n const prior = await ops.findOne<GovernanceDbRow>('factory_rule_ingress', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n identity: input.ingress.identity,\n });\n if (prior)\n return {\n status: 'replayed',\n item: await this.getForProject(input.orgId, input.factoryProjectId, input.workItemId),\n result: prior.result as Record<string, unknown>,\n };\n\n const now = new Date();\n let item: WorkItemRow | null = null;\n let code: string | null = null;\n let reason: string | null = null;\n let result: Record<string, unknown>;\n const updated = await ops.updateAtomic<WorkItemDbRow>(\n 'work_items',\n {\n id: input.workItemId,\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n },\n row => {\n const existing = toRow(row);\n item = existing;\n if (existing.revision !== input.expectedRevision) {\n code = 'stale';\n reason = 'The work item changed before this transition committed.';\n return null;\n }\n if (input.evaluation.outcome === 'rejected') {\n code = input.evaluation.code;\n reason = input.evaluation.reason;\n return null;\n }\n if (existing.stages.length === 1 && existing.stages[0] === input.destinationStage) return null;\n return patchColumns({\n stages: [input.destinationStage],\n stageHistory: applyStageTransition(\n existing.stageHistory,\n existing.stages,\n [input.destinationStage],\n input.actorId,\n now,\n ),\n revision: existing.revision + 1,\n updatedAt: now,\n });\n },\n );\n if (updated) item = toRow(updated);\n if (!item) {\n code = input.evaluation.outcome === 'rejected' ? input.evaluation.code : 'invalid_transition';\n reason = input.evaluation.outcome === 'rejected' ? input.evaluation.reason : 'Work item not found.';\n }\n const outcome: 'accepted' | 'rejected' =\n item && code === null && input.evaluation.outcome === 'accepted' ? 'accepted' : 'rejected';\n result =\n outcome === 'accepted'\n ? {\n status: 'accepted',\n transitionId: input.ingress.transitionId,\n itemId: item!.id,\n revision: item!.revision,\n stage: input.destinationStage,\n decisions: input.evaluation.outcome === 'accepted' ? input.evaluation.decisions : [],\n }\n : { status: 'rejected', transitionId: input.ingress.transitionId, itemId: input.workItemId, code, reason };\n const ingress = await ops.insertOne<GovernanceDbRow>('factory_rule_ingress', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n identity: input.ingress.identity,\n trigger_type: input.ingress.triggerType,\n transition_id: input.ingress.transitionId,\n result,\n created_at: now,\n });\n if (item) {\n const evaluation = await ops.insertOne<GovernanceDbRow>('factory_rule_evaluations', {\n ingress_id: ingress.id,\n work_item_id: item.id,\n rule_set_version: input.ruleSetVersion,\n expected_revision: input.expectedRevision,\n outcome,\n code,\n reason,\n causal_chain: input.causalChain,\n created_at: now,\n });\n if (outcome === 'accepted' && input.evaluation.outcome === 'accepted') {\n for (const [index, decision] of input.evaluation.decisions.entries()) {\n await ops.insertOne<GovernanceDbRow>('factory_deferred_decisions', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n evaluation_id: evaluation.id,\n work_item_id: item.id,\n idempotency_key: String(decision.idempotencyKey),\n effect_ordinal: index,\n effect_hash: factoryDecisionHash(decision),\n causal_chain: input.causalChain,\n actor: null,\n decision,\n status: 'pending',\n attempts: 0,\n available_at: now,\n lease_owner: null,\n lease_expires_at: null,\n last_error: null,\n completed_at: null,\n created_at: new Date(now.getTime() + index),\n updated_at: now,\n });\n }\n }\n }\n return { status: 'committed', item, result };\n });\n try {\n return await commit();\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n return commit();\n }\n }\n\n async commitRuleEvaluation(input: CommitFactoryRuleEvaluationInput): Promise<CommitFactoryRuleEvaluationResult> {\n const commit = () =>\n this.storage.withTransaction<CommitFactoryRuleEvaluationResult>(async ops => {\n const prior = await ops.findOne<GovernanceDbRow>('factory_rule_ingress', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n identity: input.ingress.identity,\n });\n if (prior) {\n const result = prior.result as Record<string, unknown>;\n const decisions = Array.isArray(result.decisions) ? result.decisions : [];\n const evaluation = await ops.findOne<GovernanceDbRow>('factory_rule_evaluations', { ingress_id: prior.id });\n for (const decision of decisions) {\n if (\n !evaluation ||\n !decision ||\n typeof decision !== 'object' ||\n (decision as Record<string, unknown>).type !== 'upsertLinkedWorkItem' ||\n typeof (decision as Record<string, unknown>).sourceKey !== 'string' ||\n typeof (decision as Record<string, unknown>).idempotencyKey !== 'string'\n ) {\n continue;\n }\n const materialization = decision as Record<string, unknown> & { sourceKey: string; idempotencyKey: string };\n const item = await ops.findOne<WorkItemDbRow>('work_items', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n source_key: materialization.sourceKey,\n });\n if (item) continue;\n await ops.updateAtomic<GovernanceDbRow>(\n 'factory_deferred_decisions',\n {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n evaluation_id: evaluation.id,\n idempotency_key: materialization.idempotencyKey,\n },\n current =>\n current.status === 'succeeded'\n ? {\n status: 'retry',\n attempts: 0,\n available_at: input.now,\n lease_owner: null,\n lease_expires_at: null,\n last_error: null,\n completed_at: null,\n updated_at: input.now,\n }\n : null,\n );\n }\n return { status: 'replayed' as const, result };\n }\n const itemRow = input.workItemId\n ? await ops.findOne<WorkItemDbRow>('work_items', {\n id: input.workItemId,\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n })\n : null;\n if (input.workItemId !== null && !itemRow) return { status: 'missing' as const };\n const item = itemRow ? toRow(itemRow) : null;\n const stale = item !== null && item.revision !== input.expectedRevision;\n const outcome = stale ? 'rejected' : input.outcome.status;\n const code = stale ? 'stale' : (input.outcome.code ?? null);\n const reason = stale\n ? 'The work item changed before this rule evaluation committed.'\n : (input.outcome.reason ?? null);\n const decisions = outcome === 'accepted' ? input.decisions : [];\n const result = {\n status: outcome,\n itemId: item?.id ?? null,\n revision: item?.revision ?? null,\n code,\n reason,\n decisions,\n };\n const ingress = await ops.insertOne<GovernanceDbRow>('factory_rule_ingress', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n identity: input.ingress.identity,\n trigger_type: input.ingress.triggerType,\n transition_id: input.ingress.identity,\n result,\n created_at: input.now,\n });\n const evaluation = await ops.insertOne<GovernanceDbRow>('factory_rule_evaluations', {\n ingress_id: ingress.id,\n work_item_id: item?.id ?? null,\n rule_set_version: input.ruleSetVersion,\n expected_revision: input.expectedRevision,\n outcome,\n code,\n reason,\n causal_chain: input.causalChain,\n created_at: input.now,\n });\n for (const [effectOrdinal, decision] of decisions.entries()) {\n await ops.insertOne<GovernanceDbRow>('factory_deferred_decisions', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n evaluation_id: evaluation.id,\n work_item_id: item?.id ?? null,\n idempotency_key: String(decision.idempotencyKey),\n effect_ordinal: effectOrdinal,\n effect_hash: factoryDecisionHash(decision),\n causal_chain: input.causalChain,\n actor: input.actor,\n decision,\n status: 'pending',\n attempts: 0,\n available_at: input.now,\n lease_owner: null,\n lease_expires_at: null,\n last_error: null,\n completed_at: null,\n created_at: new Date(input.now.getTime() + effectOrdinal),\n updated_at: input.now,\n });\n }\n return { status: 'committed' as const, result };\n });\n try {\n return await commit();\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n return commit();\n }\n }\n\n async getToolResultCursor(\n orgId: string,\n factoryProjectId: string,\n bindingId: string,\n ): Promise<FactoryToolResultCursorRecord | null> {\n const row = await this.#db.findOne<GovernanceDbRow>('factory_tool_result_cursors', {\n org_id: orgId,\n factory_project_id: factoryProjectId,\n binding_id: bindingId,\n });\n return row\n ? {\n bindingId: String(row.binding_id),\n orgId: row.org_id,\n factoryProjectId: String(row.factory_project_id),\n lastMessageId: String(row.last_message_id),\n lastMessageCreatedAt: row.last_message_created_at as Date,\n updatedAt: row.updated_at as Date,\n }\n : null;\n }\n\n async advanceToolResultCursor(cursor: FactoryToolResultCursorRecord): Promise<void> {\n const current = await this.getToolResultCursor(cursor.orgId, cursor.factoryProjectId, cursor.bindingId);\n if (current && current.lastMessageCreatedAt > cursor.lastMessageCreatedAt) return;\n await this.#db.upsertOne<GovernanceDbRow>('factory_tool_result_cursors', ['binding_id'], {\n binding_id: cursor.bindingId,\n org_id: cursor.orgId,\n factory_project_id: cursor.factoryProjectId,\n last_message_id: cursor.lastMessageId,\n last_message_created_at: cursor.lastMessageCreatedAt,\n updated_at: cursor.updatedAt,\n });\n }\n\n async listDeferredDecisions(orgId: string, factoryProjectId: string): Promise<FactoryDeferredDecisionRecord[]> {\n return (\n await this.#db.findMany<GovernanceDbRow>(\n 'factory_deferred_decisions',\n { org_id: orgId, factory_project_id: factoryProjectId },\n { orderBy: [['created_at', 'asc']] },\n )\n ).map(toDeferredDecision);\n }\n\n /** Read a bounded newest-first status page without exposing another tenant. */\n async listDeferredDecisionPage(input: FactoryDeferredDecisionPageInput): Promise<FactoryDeferredDecisionPage> {\n const rows = await this.#db.findMany<GovernanceDbRow>(\n 'factory_deferred_decisions',\n {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n ...(input.statuses ? { status: { in: input.statuses } } : {}),\n },\n {\n orderBy: [\n ['created_at', 'desc'],\n ['id', 'desc'],\n ],\n limit: input.limit + 1,\n ...(input.before ? { cursor: { values: [input.before.createdAt, input.before.id] } } : {}),\n },\n );\n return { decisions: rows.slice(0, input.limit).map(toDeferredDecision), hasMore: rows.length > input.limit };\n }\n\n async claimDeferredDecisions(input: FactoryLeaseClaimInput): Promise<FactoryDeferredDecisionRecord[]> {\n return this.#claimLeases('factory_deferred_decisions', input, toDeferredDecision);\n }\n\n async renewDeferredDecisionLease(identity: FactoryLeaseIdentity, leaseExpiresAt: Date): Promise<boolean> {\n return this.#renewLease('factory_deferred_decisions', identity, leaseExpiresAt);\n }\n\n async completeDeferredDecision(\n identity: FactoryLeaseIdentity,\n now: Date,\n ): Promise<FactoryDeferredDecisionRecord | null> {\n const row = await this.#completeLease('factory_deferred_decisions', identity, now);\n return row ? toDeferredDecision(row) : null;\n }\n\n async failDeferredDecision(input: FactoryDispatchFailureInput): Promise<FactoryDeferredDecisionRecord | null> {\n const row = await this.#failLease('factory_deferred_decisions', input);\n return row ? toDeferredDecision(row) : null;\n }\n\n /** Park a claimed effect for human approval; the dispatcher never claims `proposed` rows. */\n async proposeDeferredDecision(\n identity: FactoryLeaseIdentity,\n now: Date,\n ): Promise<FactoryDeferredDecisionRecord | null> {\n let proposed = false;\n const row = await this.#db.updateAtomic<GovernanceDbRow>(\n 'factory_deferred_decisions',\n { id: identity.id, org_id: identity.orgId, factory_project_id: identity.factoryProjectId },\n current => {\n if (current.status !== 'leased' || current.lease_owner !== identity.ownerId) return null;\n proposed = true;\n return {\n status: 'proposed',\n // The claim that parked it spent no effect, so it costs no attempt.\n attempts: 0,\n lease_owner: null,\n lease_expires_at: null,\n updated_at: now,\n };\n },\n );\n return proposed && row ? toDeferredDecision(row) : null;\n }\n\n /** Release an approved effect back to the dispatcher; only `proposed` rows are approvable. */\n async approveDeferredDecision(\n orgId: string,\n factoryProjectId: string,\n decisionId: string,\n now: Date,\n ): Promise<FactoryDeferredDecisionRecord | null> {\n return this.#settleProposedDecision(\n { orgId, factoryProjectId, decisionId },\n { status: 'pending', attempts: 0, available_at: now, approved_at: now, updated_at: now },\n );\n }\n\n /** Retire a proposal nobody wants: `dismissed` is terminal, so the run never happens. */\n async dismissDeferredDecision(\n orgId: string,\n factoryProjectId: string,\n decisionId: string,\n now: Date,\n ): Promise<FactoryDeferredDecisionRecord | null> {\n return this.#settleProposedDecision(\n { orgId, factoryProjectId, decisionId },\n { status: 'dismissed', updated_at: now, completed_at: now },\n );\n }\n\n async #settleProposedDecision(\n { orgId, factoryProjectId, decisionId }: { orgId: string; factoryProjectId: string; decisionId: string },\n patch: Partial<GovernanceDbRow>,\n ): Promise<FactoryDeferredDecisionRecord | null> {\n let settled = false;\n const row = await this.#db.updateAtomic<GovernanceDbRow>(\n 'factory_deferred_decisions',\n { id: decisionId, org_id: orgId, factory_project_id: factoryProjectId },\n current => {\n if (current.status !== 'proposed') return null;\n settled = true;\n return patch;\n },\n );\n return settled && row ? toDeferredDecision(row) : null;\n }\n\n /** Requeue the same idempotent terminal effect; non-failed decisions are never rerun. */\n async retryDeferredDecision(\n orgId: string,\n factoryProjectId: string,\n decisionId: string,\n now: Date,\n ): Promise<FactoryDeferredDecisionRecord | null> {\n let retried = false;\n const row = await this.#db.updateAtomic<GovernanceDbRow>(\n 'factory_deferred_decisions',\n { id: decisionId, org_id: orgId, factory_project_id: factoryProjectId },\n current => {\n if (current.status !== 'failed') return null;\n retried = true;\n return {\n status: 'retry',\n attempts: 0,\n available_at: now,\n lease_owner: null,\n lease_expires_at: null,\n last_error: null,\n completed_at: null,\n updated_at: now,\n };\n },\n );\n return retried && row ? toDeferredDecision(row) : null;\n }\n\n /** Resolve exact active agent authority; partial session matches never authorize. */\n async findActiveRunBinding(address: FactoryRunBindingAddress): Promise<FactoryRunBindingRecord | null> {\n const row = await this.#db.findOne<GovernanceDbRow>('factory_run_bindings', {\n org_id: address.orgId,\n factory_project_id: address.factoryProjectId,\n thread_id: address.threadId,\n resource_id: address.resourceId,\n session_id: address.sessionId,\n status: 'active',\n });\n return row ? toBinding(row) : null;\n }\n\n /**\n * Recover the active binding for a thread when session state lost\n * `factoryProjectId` (e.g. crash-resume recreated the session empty).\n * Ambiguous matches across factory projects never authorize.\n */\n async findActiveRunBindingByThread(input: {\n orgId: string;\n threadId: string;\n resourceId: string;\n sessionId: string;\n }): Promise<FactoryRunBindingRecord | null> {\n const rows = await this.#db.findMany<GovernanceDbRow>('factory_run_bindings', {\n org_id: input.orgId,\n thread_id: input.threadId,\n resource_id: input.resourceId,\n session_id: input.sessionId,\n status: 'active',\n });\n if (new Set(rows.map(row => row.factory_project_id)).size !== 1) return null;\n const row = rows.sort((left, right) => right.created_at.getTime() - left.created_at.getTime())[0];\n return row ? toBinding(row) : null;\n }\n\n /** Resolve exact bound-session state for processor awareness; ambiguous cross-tenant matches return null. */\n async findRunBindingBySession(address: FactoryRunBindingSessionAddress): Promise<FactoryRunBindingRecord | null> {\n const rows = await this.#db.findMany<GovernanceDbRow>('factory_run_bindings', {\n factory_project_id: address.factoryProjectId,\n thread_id: address.threadId,\n resource_id: address.resourceId,\n session_id: address.sessionId,\n });\n if (new Set(rows.map(row => row.org_id)).size !== 1) return null;\n const row = rows.sort((left, right) => {\n if (left.status === 'active' && right.status !== 'active') return -1;\n if (right.status === 'active' && left.status !== 'active') return 1;\n return right.created_at.getTime() - left.created_at.getTime();\n })[0];\n return row ? toBinding(row) : null;\n }\n\n /** Revoke one exact tenant-scoped binding. */\n async revokeRunBinding(input: RevokeFactoryRunBindingInput): Promise<FactoryRunBindingRecord | null> {\n let revoked = false;\n const row = await this.#db.updateAtomic<GovernanceDbRow>(\n 'factory_run_bindings',\n { id: input.bindingId, org_id: input.orgId, factory_project_id: input.factoryProjectId },\n current => {\n if (current.status !== 'active') return null;\n revoked = true;\n return { status: 'revoked', revoked_at: input.revokedAt };\n },\n );\n return revoked && row ? toBinding(row) : null;\n }\n\n /** Enumerate active bindings for the server-owned restart reconciler. */\n async listActiveRunBindings(): Promise<FactoryRunBindingRecord[]> {\n return (await this.#db.findMany<GovernanceDbRow>('factory_run_bindings', { status: 'active' })).map(toBinding);\n }\n\n /** List binding history, optionally narrowed to one work item. */\n async listRunBindings(\n orgId: string,\n factoryProjectId: string,\n workItemId?: string,\n ): Promise<FactoryRunBindingRecord[]> {\n return (\n await this.#db.findMany<GovernanceDbRow>(\n 'factory_run_bindings',\n {\n org_id: orgId,\n factory_project_id: factoryProjectId,\n ...(workItemId ? { work_item_id: workItemId } : {}),\n },\n { orderBy: [['created_at', 'asc']] },\n )\n ).map(toBinding);\n }\n\n async listPendingStarts(orgId: string, factoryProjectId: string): Promise<FactoryPendingStartRecord[]> {\n return (\n await this.#db.findMany<GovernanceDbRow>(\n 'factory_pending_starts',\n { org_id: orgId, factory_project_id: factoryProjectId },\n { orderBy: [['created_at', 'asc']] },\n )\n ).map(toPendingStart);\n }\n\n async claimPendingStarts(input: FactoryLeaseClaimInput): Promise<FactoryPendingStartRecord[]> {\n return this.#claimLeases('factory_pending_starts', input, toPendingStart);\n }\n\n async renewPendingStartLease(identity: FactoryLeaseIdentity, leaseExpiresAt: Date): Promise<boolean> {\n return this.#renewLease('factory_pending_starts', identity, leaseExpiresAt);\n }\n\n async completePendingStart(identity: FactoryLeaseIdentity, now: Date): Promise<FactoryPendingStartRecord | null> {\n const row = await this.#completeLease('factory_pending_starts', identity, now);\n return row ? toPendingStart(row) : null;\n }\n\n async failPendingStart(input: FactoryDispatchFailureInput): Promise<FactoryPendingStartRecord | null> {\n const row = await this.#failLease('factory_pending_starts', input);\n return row ? toPendingStart(row) : null;\n }\n\n async prepareRunStart(input: PrepareFactoryRunStartInput): Promise<PrepareFactoryRunStartResult> {\n const prepare = () =>\n this.storage.withTransaction(async ops => {\n const prior = await ops.findOne<GovernanceDbRow>('factory_pending_starts', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n kickoff_key: input.kickoffKey,\n });\n if (prior) {\n const bindingRow = await ops.findOne<GovernanceDbRow>('factory_run_bindings', {\n id: String(prior.binding_id),\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n });\n const itemRow =\n bindingRow &&\n (await ops.findOne<WorkItemDbRow>('work_items', {\n id: String(bindingRow.work_item_id),\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n }));\n if (!bindingRow || !itemRow) throw new Error('Factory start replay references missing state.');\n return {\n item: toRow(itemRow),\n binding: toBinding(bindingRow),\n pendingStart: toPendingStart(prior),\n replayed: true,\n };\n }\n const now = new Date();\n const create = input.workItem.input;\n let row = input.workItem.id\n ? await ops.findOne<WorkItemDbRow>('work_items', {\n id: input.workItem.id,\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n })\n : sourceKey(create.externalSource)\n ? await ops.findOne<WorkItemDbRow>('work_items', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n source_key: sourceKey(create.externalSource),\n })\n : null;\n let item: WorkItemRow;\n if (row) {\n row = await ops.updateAtomic<WorkItemDbRow>('work_items', { id: row.id }, current => {\n const roles = new Set([...Object.keys(current.sessions), input.role]);\n const sessions = Object.fromEntries([...roles].map(role => [role, input.session]));\n return applyUpdate({ current, userId: input.userId, input: { sessions } });\n });\n item = toRow(row!);\n } else {\n if (create.parentWorkItemId)\n validateParentRelation(\n (\n await ops.findMany<WorkItemDbRow>('work_items', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n })\n ).map(toRow),\n undefined,\n create.parentWorkItemId,\n );\n row = await ops.insertOne<WorkItemDbRow>('work_items', {\n org_id: input.orgId,\n created_by: input.userId,\n factory_project_id: input.factoryProjectId,\n external_source: create.externalSource ?? null,\n source_key: sourceKey(create.externalSource),\n parent_work_item_id: create.parentWorkItemId ?? null,\n title: create.title,\n stages: create.stages ?? [],\n stage_history: applyStageTransition([], [], create.stages ?? [], input.userId, now),\n sessions: stampSessions({ [input.role]: input.session }, input.userId),\n metadata: create.metadata ?? null,\n revision: 1,\n created_at: now,\n updated_at: now,\n });\n item = toRow(row);\n }\n await ops.updateMany(\n 'factory_run_bindings',\n {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n thread_id: input.session.threadId,\n resource_id: input.resourceId,\n session_id: input.session.sessionId,\n status: 'active',\n },\n { status: 'revoked', revoked_at: now },\n );\n await ops.updateMany(\n 'factory_run_bindings',\n {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n work_item_id: item.id,\n role: input.role,\n status: 'active',\n },\n { status: 'revoked', revoked_at: now },\n );\n const bindingRow = await ops.insertOne<GovernanceDbRow>('factory_run_bindings', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n work_item_id: item.id,\n role: input.role,\n thread_id: input.session.threadId,\n resource_id: input.resourceId,\n session_id: input.session.sessionId,\n branch: input.session.branch,\n status: 'active',\n created_at: now,\n revoked_at: null,\n });\n const pendingRow = await ops.insertOne<GovernanceDbRow>('factory_pending_starts', {\n org_id: input.orgId,\n factory_project_id: input.factoryProjectId,\n binding_id: bindingRow.id,\n kickoff_key: input.kickoffKey,\n message: input.kickoffMessage,\n status: 'pending',\n attempts: 0,\n available_at: now,\n lease_owner: null,\n lease_expires_at: null,\n last_error: null,\n completed_at: null,\n created_at: now,\n updated_at: now,\n });\n return { item, binding: toBinding(bindingRow), pendingStart: toPendingStart(pendingRow), replayed: false };\n });\n // A losing preparer can hit two distinct unique violations back to back:\n // first on the work item's `source_key`, then on the pending start's\n // `kickoff_key` (when the winner commits its pending row between our\n // attempts). Each retry re-reads, so one extra attempt converges on replay.\n let lastError: unknown;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n return await prepare();\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n lastError = error;\n }\n }\n throw lastError;\n }\n\n async markPendingStart(\n bindingId: string,\n status: 'sent' | 'failed',\n lastError?: string,\n ): Promise<FactoryPendingStartRecord | null> {\n const row = await this.#db.updateAtomic<GovernanceDbRow>(\n 'factory_pending_starts',\n { binding_id: bindingId },\n () => ({ status, last_error: lastError ?? null, updated_at: new Date() }),\n );\n return row ? toPendingStart(row) : null;\n }\n\n /**\n * Create a work item, reusing the existing record when `sourceKey` already\n * has one for the project (acting twice on the same issue must not duplicate\n * the card). On reuse the provided stages replace the current ones (with the\n * transition recorded in history) and sessions/metadata are merged in. The\n * result discriminates insert from reuse so callers can audit the actual\n * outcome.\n */\n async upsert(params: {\n orgId: string;\n userId: string;\n factoryProjectId: string;\n input: CreateWorkItemInput;\n reuseMode?: 'update' | 'preserve' | 'non-stage';\n }): Promise<UpsertWorkItemResult> {\n const run = (ops: FactoryStorageOps) => this.#upsert(params, ops);\n const execute = () =>\n params.input.parentWorkItemId\n ? this.#withProjectRelationTransaction(params.orgId, params.factoryProjectId, run)\n : run(this.#db);\n try {\n return await execute();\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n return execute();\n }\n }\n\n async #upsert(\n {\n orgId,\n userId,\n factoryProjectId,\n input,\n reuseMode = 'update',\n }: {\n orgId: string;\n userId: string;\n factoryProjectId: string;\n input: CreateWorkItemInput;\n reuseMode?: 'update' | 'preserve' | 'non-stage';\n },\n ops: FactoryStorageOps,\n ): Promise<UpsertWorkItemResult> {\n const key = sourceKey(input.externalSource);\n const reuse = async (): Promise<UpsertWorkItemResult | null> => {\n if (!key) return null;\n const existing = await ops.findOne<WorkItemDbRow>('work_items', {\n org_id: orgId,\n factory_project_id: factoryProjectId,\n source_key: key,\n });\n if (!existing) return null;\n if (reuseMode === 'preserve') {\n const item = toWorkItem(existing);\n return { created: false, item, previous: priorState(existing) };\n }\n\n let previous = emptyPrior();\n const updated = await ops.updateAtomic<WorkItemDbRow>(\n 'work_items',\n { org_id: orgId, factory_project_id: factoryProjectId, source_key: key },\n async current => {\n previous = priorState(current);\n const fullPatch = input.parentWorkItemId === null ? { ...input, parentWorkItemId: undefined } : input;\n const patch: UpdateWorkItemInput =\n reuseMode === 'non-stage'\n ? {\n title: input.title,\n parentWorkItemId: input.parentWorkItemId ?? undefined,\n metadata: input.metadata,\n }\n : fullPatch;\n if (patch.parentWorkItemId !== undefined) {\n validateParentRelation(\n await this.#listWithOps(ops, orgId, factoryProjectId),\n current.id,\n patch.parentWorkItemId,\n );\n }\n return {\n external_source: input.externalSource ?? null,\n ...applyUpdate({ current, userId, input: patch }),\n };\n },\n );\n return updated ? { item: toWorkItem(updated), created: false, previous } : null;\n };\n\n const reused = await reuse();\n if (reused) return reused;\n\n const now = new Date();\n const stages = input.stages ?? ['intake'];\n validateParentRelation(\n await this.#listWithOps(ops, orgId, factoryProjectId),\n undefined,\n input.parentWorkItemId ?? null,\n );\n const row = await ops.insertOne<WorkItemDbRow>('work_items', {\n org_id: orgId,\n factory_project_id: factoryProjectId,\n external_source: input.externalSource ?? null,\n source_key: key,\n parent_work_item_id: input.parentWorkItemId ?? null,\n title: input.title,\n stages,\n stage_history: stages.map(stage => ({ stage, enteredAt: now.toISOString(), by: userId })),\n sessions: stampSessions(input.sessions ?? {}, userId),\n metadata: input.metadata ?? null,\n revision: 1,\n created_by: userId,\n created_at: now,\n updated_at: now,\n });\n return { item: toWorkItem(row), created: true, previous: emptyPrior() };\n }\n\n async update({\n orgId,\n id,\n userId,\n patch,\n }: {\n orgId: string;\n id: string;\n userId: string;\n patch: UpdateWorkItemInput;\n }): Promise<{ item: WorkItemRow; previous: WorkItemPriorState } | null> {\n const run = async (ops: FactoryStorageOps) => {\n let previous = emptyPrior();\n const row = await ops.updateAtomic<WorkItemDbRow>('work_items', { org_id: orgId, id }, async current => {\n previous = priorState(current);\n if (patch.parentWorkItemId !== undefined) {\n validateParentRelation(\n await this.#listWithOps(ops, orgId, current.factory_project_id),\n current.id,\n patch.parentWorkItemId,\n );\n }\n return applyUpdate({ current, userId, input: patch });\n });\n return row ? { item: toWorkItem(row), previous } : null;\n };\n\n if (patch.parentWorkItemId === undefined) return run(this.#db);\n const candidate = await this.#db.findOne<WorkItemDbRow>('work_items', { org_id: orgId, id });\n if (!candidate) return null;\n return this.#withProjectRelationTransaction(orgId, candidate.factory_project_id, run);\n }\n\n async delete({ orgId, id }: { orgId: string; id: string }): Promise<WorkItemRow | null> {\n const candidate = await this.#db.findOne<WorkItemDbRow>('work_items', { org_id: orgId, id });\n if (!candidate) return null;\n\n return this.#withProjectRelationTransaction(orgId, candidate.factory_project_id, async ops => {\n const existing = await ops.findOne<WorkItemDbRow>('work_items', { org_id: orgId, id });\n if (!existing) return null;\n const deleted = await ops.deleteMany('work_items', { org_id: orgId, id });\n if (deleted === 0) return null;\n await ops.updateMany(\n 'work_items',\n { org_id: orgId, parent_work_item_id: id },\n { parent_work_item_id: null, updated_at: new Date() },\n );\n return toWorkItem(existing);\n });\n }\n}\n"],"mappings":"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"}