@forgeax/engine-ddc 0.1.23 → 0.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -96,6 +96,9 @@ Each `begin` persists a strictly increasing generation and an expected head revi
96
96
 
97
97
  `DdcGenerationSession` heartbeats active candidate leases while a multi-asset generation is still producing, so atomic publication may outlive one lease interval without weakening the final commit fence. Closing, discarding, or committing a candidate stops its heartbeat.
98
98
 
99
+ > [!NOTE]
100
+ > `DdcLifecycle.readCurrentEntry()` is a recovery read for a Pack producer to rehydrate its process-local transport cache after a restart. It accepts only a `current` head with a complete, integrity-checked entry; it never promotes LKG/stale content, mutates the head, or turns DDC into an authoring/runtime transport authority. Catalog and producer state remain the consumer-facing authority.
101
+
99
102
  | Rollback surface | Contract | Result |
100
103
  |---|---|---|
101
104
  | `DdcLifecycle.beginWithSnapshot` | Captures the accepted head and allocates the lease while holding the same per-asset lock | No begin/snapshot TOCTOU window |
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ export { DDC_ERROR_CODES, type DdcBrowserError, type DdcContractErrorCode, type
4
4
  export { collectDdcGarbage, type DdcGcInput, type DdcGcResult } from './gc.js';
5
5
  export { semanticDdcKey } from './key.js';
6
6
  export { DDC_LAYOUT_VERSION, type DdcBuildLayout, type DdcBuildLayoutResult, type DdcBuildOptions, type DdcLayout, type DdcLayoutError, type DdcLayoutFailure, type DdcLayoutResult, type DdcProjectLayout, type DdcServeOptions, isDdcLayout, resolveBuildDdcLayout, resolveDdcLayout, } from './layout.js';
7
- export { type DdcBeginResult, type DdcCommitResult, type DdcHead, type DdcLease, DdcLifecycle, type DdcLifecycleState, type DdcRestoreFence, type DdcRestoreResult, type DdcRollbackSnapshot, } from './lifecycle.js';
7
+ export { type DdcBeginResult, type DdcCommitResult, type DdcCurrentEntry, type DdcHead, type DdcLease, DdcLifecycle, type DdcLifecycleState, type DdcRestoreFence, type DdcRestoreResult, type DdcRollbackSnapshot, } from './lifecycle.js';
8
8
  export { type AcceptedPublicationCandidate, type AcceptedPublicationStore, createAcceptedPublication, createAcceptedPublicationStore, type ScriptablePackPublicationBuildInput, type ScriptablePackPublicationError, type ScriptablePackPublicationSnapshot, scriptablePackOutputSetDigest, scriptablePackPublicationGeneration, } from './publication.js';
9
9
  export { assertRuntimeScope, createRuntimeScope, type DdcRuntimeScope, runtimeScopeHash, } from './runtime-scope.js';
10
10
  export { type DdcGenerationCandidate, type DdcGenerationEntryCandidate, DdcGenerationSession, type DdcSessionMetrics, type DdcSessionOptions, } from './session.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,cAAc,EACd,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,aAAa,EACb,KAAK,UAAU,EACf,aAAa,EACb,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,IAAI,sBAAsB,EAChD,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,WAAW,EACX,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,EAC7B,yBAAyB,EACzB,8BAA8B,EAC9B,KAAK,mCAAmC,EACxC,KAAK,8BAA8B,EACnC,KAAK,iCAAiC,EACtC,6BAA6B,EAC7B,mCAAmC,GACpC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,eAAe,EACpB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,cAAc,EACd,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,aAAa,EACb,KAAK,UAAU,EACf,aAAa,EACb,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,IAAI,sBAAsB,EAChD,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,WAAW,EACX,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,EAC7B,yBAAyB,EACzB,8BAA8B,EAC9B,KAAK,mCAAmC,EACxC,KAAK,8BAA8B,EACnC,KAAK,iCAAiC,EACtC,6BAA6B,EAC7B,mCAAmC,GACpC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,eAAe,EACpB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,aAAa,CAAC"}
package/dist/index.mjs CHANGED
@@ -547,6 +547,13 @@ var DdcLifecycle = class {
547
547
  const record = await this.read(guid);
548
548
  return this.projectHead(guid, desiredKey, record);
549
549
  }
550
+ /** Read the accepted entry for a GUID without making callers reconstruct head paths. */
551
+ async readCurrentEntry(guid) {
552
+ const record = await this.read(guid);
553
+ const head = await this.projectHead(guid, record?.desiredKey ?? "", record);
554
+ const entry = head.currentKey === void 0 || head.state !== "current" ? null : await this.entries.read(head.currentKey);
555
+ return { head, entry };
556
+ }
550
557
  /** Begin a lease and capture the accepted rollback snapshot under one head lock. */
551
558
  async beginWithSnapshot(guid, desiredKey) {
552
559
  return withDdcLock(this.root, `head-${guid}`, async () => {
@@ -1436,7 +1443,15 @@ var DdcGenerationSession = class {
1436
1443
  async commitEntry(candidate, validatedKey) {
1437
1444
  const registered = this.assertCandidate(candidate);
1438
1445
  try {
1439
- await this.entries.publish(candidate.staged);
1446
+ const published = await this.entries.publish(candidate.staged);
1447
+ if (published.result === "conflict") {
1448
+ throw new DdcStoreError({
1449
+ code: "ddc-entry-conflict",
1450
+ detail: `immutable DDC entry ${published.key} conflicts with the staged candidate`,
1451
+ expected: "the existing DDC entry to have the same validated output",
1452
+ actual: { key: published.key }
1453
+ });
1454
+ }
1440
1455
  const result = await this.lifecycle.commit(registered.lease, validatedKey);
1441
1456
  if (result.restoreFence !== void 0)
1442
1457
  this.restoreFences.set(registered, result.restoreFence);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/key.ts","../src/build-cache.ts","../src/errors.ts","../src/entry-store.ts","../src/lifecycle.ts","../src/gc.ts","../src/layout.ts","../src/publication.ts","../src/runtime-scope.ts","../src/session.ts","../src/status.ts"],"names":["digest","createHash","join","mkdir","writeFile","rm","readFile","randomUUID","nextRevision","failure","rename","readdir","delay"],"mappings":"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","file":"index.mjs","sourcesContent":["import { createHash } from 'node:crypto';\n\nexport interface SemanticDdcInput {\n readonly schemaVersion: string;\n readonly importer: string;\n readonly codec: string;\n readonly settings: unknown;\n readonly sourceBytes: readonly Uint8Array[];\n readonly declaredGuids: readonly string[];\n readonly targetProfile: string;\n readonly producer: string;\n}\n\nexport function canonicalDdcJson(value: unknown): string {\n const sorted = sortValue(value);\n return JSON.stringify(sorted) ?? 'null';\n}\n\nfunction sortValue(value: unknown): unknown {\n if (value instanceof Uint8Array) {\n return { encoding: 'base64', bytes: Buffer.from(value).toString('base64') };\n }\n if (Array.isArray(value)) return value.map(sortValue);\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n result[key] = sortValue((value as Record<string, unknown>)[key]);\n }\n return result;\n }\n return value;\n}\n\nexport function semanticDdcKey(input: SemanticDdcInput): string {\n const semantic = {\n schemaVersion: input.schemaVersion,\n importer: input.importer,\n codec: input.codec,\n settings: input.settings,\n sourceBytes: input.sourceBytes,\n declaredGuids: [...input.declaredGuids].sort(),\n targetProfile: input.targetProfile,\n producer: input.producer,\n };\n return createHash('sha256').update(canonicalDdcJson(semantic)).digest('hex');\n}\n","import { existsSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { semanticDdcKey as ownerSemanticDdcKey } from './key.js';\n\nexport interface BuildDdcInput {\n readonly schemaVersion: string;\n readonly importerVersion: string;\n readonly codecVersion: string;\n readonly sourceDependencies: readonly (\n | string\n | { readonly path: string; readonly digest: string }\n )[];\n readonly settings: unknown;\n readonly declaredGuids: readonly string[];\n readonly cookProfile: string;\n readonly sourceOverrides?: unknown;\n readonly publish?: unknown;\n}\n\nexport function resolveDdcRoot(cwd: string): string {\n let current = resolve(cwd);\n while (true) {\n if (existsSync(join(current, 'pnpm-workspace.yaml'))) {\n return join(current, 'node_modules/.cache/forgeax-ddc');\n }\n const parent = dirname(current);\n if (parent === current) return join(resolve(cwd), 'node_modules/.cache/forgeax-ddc');\n current = parent;\n }\n}\n\n/** Derive the build key while keeping publish URLs out of the semantic identity. */\nexport function semanticBuildKey(input: BuildDdcInput): string {\n const hasSourceOverrides =\n input.sourceOverrides !== undefined &&\n typeof input.sourceOverrides === 'object' &&\n input.sourceOverrides !== null &&\n !Array.isArray(input.sourceOverrides) &&\n Object.keys(input.sourceOverrides).length > 0;\n const settings = hasSourceOverrides\n ? { settings: input.settings, sourceOverrides: input.sourceOverrides }\n : input.settings;\n return ownerSemanticDdcKey({\n schemaVersion: input.schemaVersion,\n importer: input.importerVersion,\n codec: input.codecVersion,\n settings,\n sourceBytes: input.sourceDependencies\n .map((dependency) =>\n typeof dependency === 'string'\n ? dependency.replaceAll('\\\\', '/').replace(/^.*\\/(assets\\/)/, '$1')\n : dependency.digest,\n )\n .sort()\n .map((digest) => new TextEncoder().encode(digest)),\n declaredGuids: input.declaredGuids,\n targetProfile: input.cookProfile,\n producer: input.importerVersion,\n });\n}\n","export const DDC_ERROR_CODES = [\n 'ddc-project-root-required',\n 'ddc-object-conflict',\n 'ddc-head-conflict',\n 'ddc-generation-conflict',\n 'ddc-scope-mismatch',\n 'ddc-lease-expired',\n] as const;\n\nexport type DdcContractErrorCode = (typeof DDC_ERROR_CODES)[number];\nexport type DdcEntryErrorCode = 'ddc-entry-incomplete' | 'ddc-entry-invalid' | 'ddc-entry-conflict';\nexport type DdcErrorCode = DdcContractErrorCode | DdcEntryErrorCode;\n\nexport type DdcErrorRootKind = 'build-cache' | 'project-ddc' | 'runtime';\n\nexport interface DdcRecoveryAction {\n readonly kind:\n | 'inspect'\n | 'allocate-generation'\n | 'retry'\n | 'cold-rebuild'\n | 'prune'\n | 'release-lease';\n readonly executable: boolean;\n readonly exactTarget?: string;\n readonly reason?: string;\n}\n\nexport interface DdcStoreErrorInit {\n readonly code: DdcErrorCode;\n readonly detail: string;\n readonly hint?: string;\n readonly expected?: unknown;\n readonly actual?: unknown;\n readonly owner?: string;\n readonly rootKind?: DdcErrorRootKind;\n readonly scope?: string;\n readonly generation?: number;\n readonly lease?: string;\n readonly revision?: number;\n readonly recoveryActions?: readonly DdcRecoveryAction[];\n readonly hostPath?: string;\n}\n\nexport interface DdcBrowserError {\n readonly code: DdcErrorCode;\n readonly hint: string;\n readonly expected: unknown;\n readonly actual?: unknown;\n readonly owner?: string;\n readonly rootKind?: DdcErrorRootKind;\n readonly scope?: string;\n readonly generation?: number;\n readonly lease?: string;\n readonly revision?: number;\n readonly recoveryActions: readonly Omit<DdcRecoveryAction, 'exactTarget'>[];\n}\n\nconst defaultHints: Record<DdcErrorCode, string> = {\n 'ddc-project-root-required': 'inject the canonical projectDdcRoot before serving or publishing',\n 'ddc-object-conflict': 'keep the verified object and reject the competing publication',\n 'ddc-head-conflict': 'inspect the current head and retry with a fresh revision',\n 'ddc-generation-conflict': 'allocate a new persistent generation; do not edit the counter',\n 'ddc-scope-mismatch': 'reinspect the canonical root and allocate a new scope',\n 'ddc-lease-expired': 'discard the stale commit and acquire a new lease',\n 'ddc-entry-incomplete': 'discard the partial entry and cold-cook from author authority',\n 'ddc-entry-invalid': 'preserve last-known-good, inspect the entry, then cold-cook',\n 'ddc-entry-conflict': 'keep the verified entry and reject the competing publication',\n};\n\nfunction defaultExpected(code: DdcErrorCode): unknown {\n if (code === 'ddc-project-root-required') return 'projectDdcRoot';\n if (code === 'ddc-entry-incomplete' || code === 'ddc-entry-invalid') {\n return 'a complete DDC entry whose receipt and integrity digests validate';\n }\n return 'a valid DDC owner, scope, generation, revision, and lease';\n}\n\nfunction defaultActions(code: DdcErrorCode): readonly DdcRecoveryAction[] {\n switch (code) {\n case 'ddc-project-root-required':\n case 'ddc-scope-mismatch':\n return [\n { kind: 'inspect', executable: true },\n { kind: 'retry', executable: true },\n ];\n case 'ddc-generation-conflict':\n return [{ kind: 'allocate-generation', executable: true }];\n case 'ddc-lease-expired':\n return [\n { kind: 'release-lease', executable: true },\n { kind: 'retry', executable: true },\n ];\n case 'ddc-object-conflict':\n case 'ddc-head-conflict':\n return [\n { kind: 'inspect', executable: true },\n { kind: 'retry', executable: true },\n ];\n case 'ddc-entry-incomplete':\n case 'ddc-entry-invalid':\n return [{ kind: 'cold-rebuild', executable: true }];\n case 'ddc-entry-conflict':\n return [{ kind: 'inspect', executable: true }];\n }\n}\n\nexport class DdcStoreError extends Error {\n public readonly code: DdcErrorCode;\n public readonly detail: string;\n public readonly hint: string;\n public readonly expected: unknown;\n public readonly actual: unknown;\n public readonly owner: string | undefined;\n public readonly rootKind: DdcErrorRootKind | undefined;\n public readonly scope: string | undefined;\n public readonly generation: number | undefined;\n public readonly lease: string | undefined;\n public readonly revision: number | undefined;\n public readonly recoveryActions: readonly DdcRecoveryAction[];\n public readonly hostPath: string | undefined;\n\n public constructor(code: DdcErrorCode, detail: string);\n public constructor(input: DdcStoreErrorInit);\n public constructor(inputOrCode: DdcStoreErrorInit | DdcErrorCode, legacyDetail?: string) {\n const input: DdcStoreErrorInit =\n typeof inputOrCode === 'string'\n ? { code: inputOrCode, detail: legacyDetail ?? inputOrCode }\n : inputOrCode;\n super(input.detail);\n this.name = 'DdcStoreError';\n this.code = input.code;\n this.detail = input.detail;\n this.hint = input.hint ?? defaultHints[input.code];\n this.expected = input.expected ?? defaultExpected(input.code);\n this.actual = input.actual;\n this.owner = input.owner;\n this.rootKind = input.rootKind;\n this.scope = input.scope;\n this.generation = input.generation;\n this.lease = input.lease;\n this.revision = input.revision;\n this.recoveryActions = input.recoveryActions ?? defaultActions(input.code);\n this.hostPath = input.hostPath;\n }\n\n public toBrowserProjection(): DdcBrowserError {\n return {\n code: this.code,\n hint: this.hint,\n expected: this.expected,\n ...(this.actual === undefined ? {} : { actual: this.actual }),\n ...(this.owner === undefined ? {} : { owner: this.owner }),\n ...(this.rootKind === undefined ? {} : { rootKind: this.rootKind }),\n ...(this.scope === undefined ? {} : { scope: this.scope }),\n ...(this.generation === undefined ? {} : { generation: this.generation }),\n ...(this.lease === undefined ? {} : { lease: this.lease }),\n ...(this.revision === undefined ? {} : { revision: this.revision }),\n recoveryActions: this.recoveryActions.map(\n ({ exactTarget: _exactTarget, ...action }) => action,\n ),\n };\n }\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport { mkdir, readdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { DdcStoreError } from './errors.js';\nimport { canonicalDdcJson } from './key.js';\n\nexport { DdcStoreError } from './errors.js';\n\nexport interface DdcArtifact {\n readonly mediaType: string;\n readonly bytes: Uint8Array;\n}\n\nexport interface DdcReceipt {\n readonly guid: string;\n readonly key: string;\n readonly producer: string;\n readonly inputFingerprint: string;\n readonly outputDigest: string;\n}\n\nexport interface DdcEntry {\n readonly key: string;\n readonly guid: string;\n readonly payload: unknown;\n readonly refs: readonly string[];\n readonly artifacts: Readonly<Record<string, DdcArtifact>>;\n readonly receipt: DdcReceipt;\n}\n\nexport interface StagedDdcEntry {\n readonly key: string;\n readonly path: string;\n}\n\nexport interface PublishDdcEntryResult {\n readonly result: 'published' | 'existing' | 'conflict';\n readonly key: string;\n}\n\ninterface ArtifactIntegrity {\n readonly mediaType: string;\n readonly byteLength: number;\n readonly digest: string;\n}\n\ninterface EntryIntegrity {\n readonly payload: string;\n readonly refs: string;\n readonly receipt: string;\n readonly artifacts: Readonly<Record<string, ArtifactIntegrity>>;\n readonly entry: string;\n}\n\nfunction digest(value: string | Uint8Array): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction artifactFile(key: string): string {\n if (/^[A-Za-z0-9._-]+$/.test(key)) return key;\n return Buffer.from(key, 'utf8').toString('base64url');\n}\n\nfunction validateKey(key: string): void {\n if (!/^[a-f0-9]{64}$/.test(key)) {\n throw new DdcStoreError('ddc-entry-invalid', `invalid semantic key: ${key}`);\n }\n}\n\nfunction errorCode(error: unknown): string | undefined {\n if (error !== null && typeof error === 'object' && 'code' in error) {\n const code = (error as { readonly code?: unknown }).code;\n return typeof code === 'string' ? code : undefined;\n }\n return undefined;\n}\n\nfunction sortedArtifacts(entry: DdcEntry): readonly [string, DdcArtifact][] {\n return Object.entries(entry.artifacts).sort(([left], [right]) => left.localeCompare(right));\n}\n\n/** The one output identity shared by receipt validation and DDC publication. */\nexport function ddcOutputDigest(\n entry: Pick<DdcEntry, 'guid' | 'payload' | 'refs' | 'artifacts'>,\n): string {\n return `sha256:${digest(\n canonicalDdcJson({\n guid: entry.guid,\n payload: entry.payload,\n refs: entry.refs,\n artifacts: Object.fromEntries(\n sortedArtifacts(entry as DdcEntry).map(([key, artifact]) => [\n key,\n {\n mediaType: artifact.mediaType,\n bytes: artifact.bytes,\n },\n ]),\n ),\n }),\n )}`;\n}\n\nfunction existingResult(\n existing: DdcEntry,\n candidate: DdcEntry,\n key: string,\n): PublishDdcEntryResult {\n return canonicalDdcJson(existing) === canonicalDdcJson(candidate)\n ? { result: 'existing', key }\n : { result: 'conflict', key };\n}\n\nfunction entryShape(entry: DdcEntry): Record<string, unknown> {\n return {\n key: entry.key,\n guid: entry.guid,\n payload: entry.payload,\n refs: entry.refs,\n receipt: entry.receipt,\n artifacts: Object.fromEntries(\n sortedArtifacts(entry).map(([key, artifact]) => [\n key,\n { mediaType: artifact.mediaType, byteLength: artifact.bytes.byteLength },\n ]),\n ),\n };\n}\n\nfunction integrityFor(entry: DdcEntry): EntryIntegrity {\n const artifacts = Object.fromEntries(\n sortedArtifacts(entry).map(([key, artifact]) => [\n key,\n {\n mediaType: artifact.mediaType,\n byteLength: artifact.bytes.byteLength,\n digest: digest(artifact.bytes),\n },\n ]),\n );\n return {\n payload: digest(canonicalDdcJson(entry.payload)),\n refs: digest(canonicalDdcJson(entry.refs)),\n receipt: digest(canonicalDdcJson(entry.receipt)),\n artifacts,\n entry: digest(canonicalDdcJson(entryShape(entry))),\n };\n}\n\nasync function readJson<T>(path: string): Promise<T> {\n return JSON.parse(await readFile(path, 'utf8')) as T;\n}\n\nexport class DdcEntryStore {\n private readonly entries: string;\n private readonly staging: string;\n\n public constructor(root: string) {\n this.entries = join(root, 'entries');\n this.staging = join(root, 'staging');\n }\n\n public async stage(entry: DdcEntry): Promise<StagedDdcEntry> {\n validateKey(entry.key);\n if (entry.receipt.key !== entry.key || entry.receipt.guid !== entry.guid) {\n throw new DdcStoreError('ddc-entry-invalid', 'receipt identity does not match entry');\n }\n if (entry.receipt.outputDigest !== ddcOutputDigest(entry)) {\n throw new DdcStoreError('ddc-entry-invalid', 'receipt output digest does not match entry');\n }\n const path = join(this.staging, `${entry.key}-${randomUUID()}`);\n try {\n await mkdir(join(path, 'artifacts'), { recursive: true });\n await writeFile(join(path, 'payload.json'), canonicalDdcJson(entry.payload));\n await writeFile(join(path, 'refs.json'), canonicalDdcJson(entry.refs));\n await writeFile(join(path, 'receipt.json'), canonicalDdcJson(entry.receipt));\n const artifacts: Record<string, { mediaType: string; file: string }> = {};\n for (const [key, artifact] of sortedArtifacts(entry)) {\n const file = artifactFile(key);\n artifacts[key] = { mediaType: artifact.mediaType, file };\n await writeFile(join(path, 'artifacts', `${file}.bin`), artifact.bytes);\n }\n await writeFile(join(path, 'artifacts.json'), canonicalDdcJson(artifacts));\n await writeFile(join(path, 'integrity.json'), canonicalDdcJson(integrityFor(entry)));\n return { key: entry.key, path };\n } catch (error) {\n await rm(path, { recursive: true, force: true }).catch(() => {});\n throw error;\n }\n }\n\n public async publish(staged: StagedDdcEntry): Promise<PublishDdcEntryResult> {\n validateKey(staged.key);\n const candidate = await this.readDirectory(staged.path, true);\n const target = join(this.entries, staged.key);\n await mkdir(this.entries, { recursive: true });\n const useExisting = async (): Promise<PublishDdcEntryResult> => {\n const existing = await this.readDirectory(target, false);\n await rm(staged.path, { recursive: true, force: true });\n return existingResult(existing, candidate, staged.key);\n };\n try {\n await stat(target);\n return useExisting();\n } catch (error) {\n if (error instanceof DdcStoreError) throw error;\n if (errorCode(error) !== 'ENOENT') throw error;\n }\n try {\n await rename(staged.path, target);\n return { result: 'published', key: staged.key };\n } catch (error) {\n if (!['EEXIST', 'ENOTEMPTY', 'EISDIR'].includes(errorCode(error) ?? '')) throw error;\n return useExisting();\n }\n }\n\n public async discard(staged: StagedDdcEntry): Promise<void> {\n await rm(staged.path, { recursive: true, force: true });\n }\n\n public async write(entry: DdcEntry): Promise<PublishDdcEntryResult> {\n const staged = await this.stage(entry);\n return this.publish(staged);\n }\n\n public async read(key: string): Promise<DdcEntry | null> {\n try {\n validateKey(key);\n return await this.readDirectory(join(this.entries, key), false);\n } catch {\n return null;\n }\n }\n\n public async listKeys(): Promise<readonly string[]> {\n const entries = await readdir(this.entries, { withFileTypes: true }).catch(() => []);\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort();\n }\n\n public async remove(key: string): Promise<void> {\n validateKey(key);\n await rm(join(this.entries, key), { recursive: true, force: false });\n }\n\n /** Read with a machine-readable corruption result for recovery tooling. */\n public async readChecked(\n key: string,\n ): Promise<\n | { readonly ok: true; readonly value: DdcEntry | null }\n | { readonly ok: false; readonly error: DdcStoreError }\n > {\n try {\n validateKey(key);\n try {\n await stat(join(this.entries, key));\n } catch (error) {\n if (errorCode(error) === 'ENOENT') return { ok: true, value: null };\n throw error;\n }\n try {\n return { ok: true, value: await this.readDirectory(join(this.entries, key), false) };\n } catch (error) {\n if (error instanceof DdcStoreError && error.code === 'ddc-entry-incomplete') {\n return { ok: true, value: null };\n }\n throw error;\n }\n } catch (error) {\n const normalized =\n error instanceof DdcStoreError\n ? error\n : new DdcStoreError('ddc-entry-invalid', 'entry is unreadable');\n return { ok: false, error: normalized };\n }\n }\n\n private async readDirectory(path: string, incompleteIsError: boolean): Promise<DdcEntry> {\n try {\n const payload = await readJson<unknown>(join(path, 'payload.json'));\n const refs = await readJson<readonly string[]>(join(path, 'refs.json'));\n const receipt = await readJson<DdcReceipt>(join(path, 'receipt.json'));\n const manifest = await readJson<\n Readonly<Record<string, { mediaType: string; file: string }>>\n >(join(path, 'artifacts.json'));\n const integrity = await readJson<EntryIntegrity>(join(path, 'integrity.json'));\n const artifacts: Record<string, DdcArtifact> = {};\n for (const [key, descriptor] of Object.entries(manifest).sort(([left], [right]) =>\n left.localeCompare(right),\n )) {\n const bytes = new Uint8Array(\n await readFile(join(path, 'artifacts', `${descriptor.file}.bin`)),\n );\n artifacts[key] = { mediaType: descriptor.mediaType, bytes };\n }\n const entry = { key: receipt.key, guid: receipt.guid, payload, refs, artifacts, receipt };\n if (entry.receipt.outputDigest !== ddcOutputDigest(entry)) {\n throw new DdcStoreError('ddc-entry-invalid', 'receipt output digest does not match entry');\n }\n const actual = integrityFor(entry);\n if (canonicalDdcJson(actual) !== canonicalDdcJson(integrity)) {\n throw new DdcStoreError('ddc-entry-invalid', 'entry integrity mismatch');\n }\n return entry;\n } catch (error) {\n if (incompleteIsError) {\n if (error instanceof DdcStoreError) throw error;\n throw new DdcStoreError('ddc-entry-incomplete', 'staged entry is incomplete');\n }\n if (error instanceof DdcStoreError) throw error;\n throw new DdcStoreError('ddc-entry-invalid', 'entry is unreadable');\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { DdcEntryStore } from './entry-store.js';\nimport { DdcStoreError } from './errors.js';\n\nexport type DdcLifecycleState = 'missing' | 'cooking' | 'current' | 'stale' | 'failed';\n\nexport interface DdcLease {\n readonly guid: string;\n readonly desiredKey: string;\n readonly attempt: string;\n readonly generation: number;\n readonly expectedRevision: number;\n readonly instanceId: string;\n readonly expiresAt: number;\n}\n\nexport interface DdcHead {\n readonly guid: string;\n readonly desiredKey: string;\n readonly state: DdcLifecycleState;\n readonly currentKey: string | undefined;\n readonly lastKnownGoodKey: string | undefined;\n readonly revision?: number;\n readonly generation?: number;\n readonly activeLease?: DdcLease;\n readonly failure?: { readonly code: string; readonly detail: string };\n}\n\nexport interface DdcCommitResult {\n readonly result: 'current' | 'stale' | 'lease-lost' | 'invalid';\n readonly key: string;\n readonly revision?: number;\n /** Internal CAS evidence retained for a later generation rollback. */\n readonly restoreFence?: DdcRestoreFence;\n}\n\nexport interface DdcRestoreFence {\n readonly attempt: string;\n readonly generation: number;\n readonly revision: number;\n readonly desiredKey: string;\n readonly outcome: 'current' | 'invalid' | 'failed';\n readonly key?: string;\n readonly currentKey?: string;\n readonly lastKnownGoodKey?: string;\n readonly failure?: { readonly code: string; readonly detail: string };\n}\n\nexport interface DdcRestoreResult {\n readonly result: 'restored' | 'not-owner';\n readonly revision: number;\n readonly generation?: number;\n}\n\nexport type DdcRollbackSnapshot = Omit<DdcHead, 'activeLease'>;\n\nexport interface DdcBeginResult {\n readonly lease: DdcLease;\n readonly previousHead: DdcRollbackSnapshot;\n}\n\ninterface HeadRecord {\n readonly guid: string;\n readonly desiredKey: string;\n readonly revision: number;\n readonly currentKey?: string;\n readonly lastKnownGoodKey?: string;\n readonly generation?: number;\n readonly active?: DdcLease;\n readonly supersededAttempts?: readonly string[];\n readonly stale?: boolean;\n readonly empty?: boolean;\n readonly failure?: {\n readonly desiredKey: string;\n readonly code: string;\n readonly detail: string;\n };\n}\n\ninterface GenerationRecord {\n readonly schemaVersion: 'forgeax-ddc-generation/v2';\n readonly next: number;\n}\n\nconst LOCK_WAIT_MS = 10;\nconst LOCK_TIMEOUT_MS = 5000;\nconst LEASE_TTL_MS = 30_000;\n\nfunction headFile(heads: string, guid: string): string {\n return join(heads, `${encodeURIComponent(guid)}.json`);\n}\n\nfunction lockFile(root: string, name: string): string {\n return join(root, 'locks', `${encodeURIComponent(name)}.lock`);\n}\n\nfunction withRevision(\n result: Omit<DdcCommitResult, 'revision'>,\n revision: number,\n restoreFence?: DdcRestoreFence,\n): DdcCommitResult {\n const value = { ...result } as DdcCommitResult;\n Object.defineProperty(value, 'revision', { value: revision, enumerable: false });\n if (restoreFence !== undefined) {\n Object.defineProperty(value, 'restoreFence', { value: restoreFence, enumerable: false });\n }\n return value;\n}\n\nasync function delay(ms: number): Promise<void> {\n await new Promise((resolveDelay) => setTimeout(resolveDelay, ms));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nfunction isNonNegativeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0;\n}\n\nfunction isLeaseRecord(value: unknown): value is DdcLease {\n if (!isRecord(value)) return false;\n return (\n isString(value.guid) &&\n isString(value.desiredKey) &&\n isString(value.attempt) &&\n isNonNegativeInteger(value.generation) &&\n isNonNegativeInteger(value.expectedRevision) &&\n isString(value.instanceId) &&\n typeof value.expiresAt === 'number' &&\n Number.isFinite(value.expiresAt)\n );\n}\n\nfunction isHeadRecord(value: unknown): value is HeadRecord {\n if (!isRecord(value)) return false;\n if (\n !isString(value.guid) ||\n !isString(value.desiredKey) ||\n !isNonNegativeInteger(value.revision)\n ) {\n return false;\n }\n if (value.currentKey !== undefined && !isString(value.currentKey)) return false;\n if (value.lastKnownGoodKey !== undefined && !isString(value.lastKnownGoodKey)) return false;\n if (\n value.generation !== undefined &&\n (!isNonNegativeInteger(value.generation) || value.generation === 0)\n ) {\n return false;\n }\n if (value.active !== undefined && !isLeaseRecord(value.active)) return false;\n if (\n value.supersededAttempts !== undefined &&\n (!Array.isArray(value.supersededAttempts) || !value.supersededAttempts.every(isString))\n ) {\n return false;\n }\n if (value.stale !== undefined && typeof value.stale !== 'boolean') return false;\n if (value.empty !== undefined && typeof value.empty !== 'boolean') return false;\n if (value.failure !== undefined) {\n if (!isRecord(value.failure)) return false;\n if (\n !isString(value.failure.desiredKey) ||\n !isString(value.failure.code) ||\n !isString(value.failure.detail)\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction malformedHeadError(\n actual: 'syntax-invalid' | 'schema-invalid' | 'unreadable',\n): DdcStoreError {\n const detail =\n actual === 'syntax-invalid'\n ? 'DDC head JSON is syntactically invalid'\n : actual === 'schema-invalid'\n ? 'DDC head record does not match the lifecycle schema'\n : 'DDC head file is not readable';\n return new DdcStoreError({\n code: 'ddc-head-conflict',\n detail,\n expected: 'a valid DDC head record',\n actual,\n hint: 'inspect the current head and retry with a fresh revision',\n owner: 'engine-ddc',\n rootKind: 'project-ddc',\n recoveryActions: [\n { kind: 'inspect', executable: true },\n { kind: 'retry', executable: true },\n ],\n });\n}\n\n/** Cross-process mkdir lock; a lock owned by a dead PID is reclaimable. */\nexport async function withDdcLock<T>(\n root: string,\n name: string,\n operation: () => Promise<T>,\n): Promise<T> {\n const path = lockFile(root, name);\n await mkdir(join(root, 'locks'), { recursive: true });\n const deadline = Date.now() + LOCK_TIMEOUT_MS;\n while (true) {\n try {\n await mkdir(path);\n await writeFile(\n join(path, 'owner.json'),\n JSON.stringify({ pid: process.pid, acquiredAt: Date.now() }),\n );\n try {\n return await operation();\n } finally {\n await rm(path, { recursive: true, force: true });\n }\n } catch (error) {\n if ((error as { code?: string }).code !== 'EEXIST') throw error;\n let ownerPid: number | undefined;\n try {\n ownerPid = (\n JSON.parse(await readFile(join(path, 'owner.json'), 'utf8')) as { pid?: number }\n ).pid;\n } catch {\n ownerPid = undefined;\n }\n // mkdir() publishes the lock directory before the owner record can be\n // written. Treat that short publication window as an in-flight lock,\n // not as a dead owner: reclaiming it here lets two processes enter the\n // same critical section and loses the superseded-attempt fence.\n if (ownerPid === undefined) {\n if (Date.now() >= deadline) {\n throw new DdcStoreError({\n code: 'ddc-lease-expired',\n detail: `DDC lock ${name} did not publish an owner record`,\n hint: 'inspect the lock owner and retry after the incomplete instance exits',\n expected: 'a lock owner record',\n actual: { path },\n rootKind: 'project-ddc',\n });\n }\n await delay(LOCK_WAIT_MS);\n continue;\n }\n let alive = false;\n try {\n process.kill(ownerPid, 0);\n alive = true;\n } catch {\n alive = false;\n }\n if (!alive) {\n await rm(path, { recursive: true, force: true });\n continue;\n }\n if (Date.now() >= deadline) {\n throw new DdcStoreError({\n code: 'ddc-lease-expired',\n detail: `DDC lock ${name} remained owned by process ${ownerPid}`,\n hint: 'inspect the owner and retry after the stale instance exits',\n expected: 'an available project lock',\n actual: { ownerPid },\n rootKind: 'project-ddc',\n lease: String(ownerPid),\n });\n }\n await delay(LOCK_WAIT_MS);\n }\n }\n}\n\nexport class DdcLifecycle {\n private readonly heads: string;\n private readonly entries: DdcEntryStore;\n private readonly root: string;\n private readonly leaseTtlMs: number;\n\n public constructor(root: string, options?: { readonly leaseTtlMs?: number }) {\n this.root = root;\n this.heads = join(root, 'heads');\n this.entries = new DdcEntryStore(root);\n this.leaseTtlMs = options?.leaseTtlMs ?? LEASE_TTL_MS;\n }\n\n public async inspect(guid: string, desiredKey: string): Promise<DdcHead> {\n const record = await this.read(guid);\n return this.projectHead(guid, desiredKey, record);\n }\n\n /** Begin a lease and capture the accepted rollback snapshot under one head lock. */\n public async beginWithSnapshot(guid: string, desiredKey: string): Promise<DdcBeginResult> {\n return withDdcLock(this.root, `head-${guid}`, async () => {\n const previous = await this.read(guid);\n const previousHead = await this.projectHead(guid, desiredKey, previous, false);\n const generation = await this.allocateGeneration(previous?.generation ?? 0);\n const lease: DdcLease = {\n guid,\n desiredKey,\n attempt: randomUUID(),\n generation,\n expectedRevision: previous?.revision ?? 0,\n instanceId: `${process.pid}:${randomUUID()}`,\n expiresAt: Date.now() + this.leaseTtlMs,\n };\n const lastKnownGoodKey =\n previous?.currentKey !== undefined && previous.currentKey !== desiredKey\n ? previous.currentKey\n : previous?.lastKnownGoodKey;\n const supersededAttempts = [\n ...(previous?.supersededAttempts ?? []),\n ...(previous?.active === undefined ? [] : [previous.active.attempt]),\n ];\n await this.write({\n guid,\n desiredKey,\n revision: previous?.revision ?? 0,\n generation,\n active: lease,\n ...(previous?.currentKey === undefined ? {} : { currentKey: previous.currentKey }),\n ...(supersededAttempts.length === 0 ? {} : { supersededAttempts }),\n ...(lastKnownGoodKey === undefined ? {} : { lastKnownGoodKey }),\n });\n return { lease, previousHead };\n });\n }\n\n public async begin(guid: string, desiredKey: string): Promise<DdcLease> {\n return (await this.beginWithSnapshot(guid, desiredKey)).lease;\n }\n\n public async commit(lease: DdcLease, validatedKey: string): Promise<DdcCommitResult> {\n return withDdcLock(this.root, `head-${lease.guid}`, async () => {\n const current = await this.read(lease.guid);\n const active = current?.active;\n if (current === null || active === undefined || active.attempt !== lease.attempt) {\n if (current?.supersededAttempts?.includes(lease.attempt)) {\n await this.write({ ...current, stale: true });\n return withRevision({ result: 'stale', key: validatedKey }, current.revision);\n }\n return withRevision({ result: 'lease-lost', key: validatedKey }, current?.revision ?? 0);\n }\n // The persisted active lease is the authority. The caller may still hold\n // an older token while a session heartbeat has already refreshed the\n // same attempt in the head.\n if (Date.now() > active.expiresAt) {\n throw new DdcStoreError({\n code: 'ddc-lease-expired',\n detail: 'cook lease expired before commit fencing',\n expected: { attempt: lease.attempt, revision: lease.expectedRevision },\n actual: { revision: current.revision },\n owner: 'engine-ddc',\n rootKind: 'project-ddc',\n generation: lease.generation,\n lease: lease.attempt,\n revision: current.revision,\n });\n }\n if (\n current.revision !== lease.expectedRevision ||\n current.desiredKey !== lease.desiredKey ||\n validatedKey !== lease.desiredKey\n ) {\n await this.write({ ...current, stale: true });\n return withRevision({ result: 'stale', key: validatedKey }, current.revision);\n }\n const entry = await this.entries.read(validatedKey);\n if (entry === null || entry.guid !== lease.guid || entry.receipt.key !== validatedKey) {\n const nextRevision = current.revision + 1;\n const failure = {\n desiredKey: lease.desiredKey,\n code: 'entry-invalid',\n detail: 'validated DDC key has no readable entry for this asset',\n };\n await this.write({\n guid: lease.guid,\n desiredKey: lease.desiredKey,\n revision: nextRevision,\n generation: lease.generation,\n ...(current.lastKnownGoodKey === undefined\n ? {}\n : { lastKnownGoodKey: current.lastKnownGoodKey }),\n ...(current.supersededAttempts === undefined\n ? {}\n : { supersededAttempts: current.supersededAttempts }),\n failure,\n });\n return withRevision({ result: 'invalid', key: validatedKey }, nextRevision, {\n attempt: lease.attempt,\n generation: lease.generation,\n revision: nextRevision,\n desiredKey: lease.desiredKey,\n outcome: 'invalid',\n ...(current.lastKnownGoodKey === undefined\n ? {}\n : { lastKnownGoodKey: current.lastKnownGoodKey }),\n failure: { code: failure.code, detail: failure.detail },\n });\n }\n const lastKnownGoodKey =\n current.currentKey !== undefined && current.currentKey !== validatedKey\n ? current.currentKey\n : current.lastKnownGoodKey;\n const nextRevision = current.revision + 1;\n await this.write({\n guid: lease.guid,\n desiredKey: lease.desiredKey,\n revision: nextRevision,\n generation: lease.generation,\n currentKey: validatedKey,\n stale: false,\n ...(current.supersededAttempts === undefined\n ? {}\n : { supersededAttempts: current.supersededAttempts }),\n ...(lastKnownGoodKey === undefined ? {} : { lastKnownGoodKey }),\n });\n return withRevision({ result: 'current', key: validatedKey }, nextRevision, {\n attempt: lease.attempt,\n generation: lease.generation,\n revision: nextRevision,\n desiredKey: lease.desiredKey,\n outcome: 'current',\n key: validatedKey,\n currentKey: validatedKey,\n ...(lastKnownGoodKey === undefined ? {} : { lastKnownGoodKey }),\n });\n });\n }\n\n public async fail(\n lease: DdcLease,\n failure: { readonly code: string; readonly detail: string },\n ): Promise<DdcRestoreFence | undefined> {\n return withDdcLock(this.root, `head-${lease.guid}`, async () => {\n const current = await this.read(lease.guid);\n if (current?.active?.attempt !== lease.attempt) return;\n const nextRevision = current.revision + 1;\n await this.write({\n guid: lease.guid,\n desiredKey: lease.desiredKey,\n revision: nextRevision,\n generation: lease.generation,\n ...(current.currentKey === undefined ? {} : { currentKey: current.currentKey }),\n ...(current.lastKnownGoodKey === undefined\n ? {}\n : { lastKnownGoodKey: current.lastKnownGoodKey }),\n ...(current.supersededAttempts === undefined\n ? {}\n : { supersededAttempts: current.supersededAttempts }),\n failure: { desiredKey: lease.desiredKey, ...failure },\n });\n return {\n attempt: lease.attempt,\n generation: lease.generation,\n revision: nextRevision,\n desiredKey: lease.desiredKey,\n outcome: 'failed' as const,\n ...(current.currentKey === undefined ? {} : { currentKey: current.currentKey }),\n ...(current.lastKnownGoodKey === undefined\n ? {}\n : { lastKnownGoodKey: current.lastKnownGoodKey }),\n failure,\n };\n });\n }\n\n public async heartbeat(lease: DdcLease): Promise<DdcLease> {\n return withDdcLock(this.root, `head-${lease.guid}`, async () => {\n const current = await this.read(lease.guid);\n if (current?.active?.attempt !== lease.attempt) {\n throw new DdcStoreError({\n code: 'ddc-lease-expired',\n detail: 'heartbeat belongs to a stale lease',\n expected: lease.attempt,\n actual: current?.active?.attempt,\n lease: lease.attempt,\n generation: lease.generation,\n rootKind: 'project-ddc',\n });\n }\n const refreshed = { ...lease, expiresAt: Date.now() + this.leaseTtlMs };\n await this.write({ ...current, active: refreshed });\n return refreshed;\n });\n }\n\n public async close(lease: DdcLease): Promise<void> {\n await withDdcLock(this.root, `head-${lease.guid}`, async () => {\n const current = await this.read(lease.guid);\n if (current?.active?.instanceId !== lease.instanceId) return;\n const { active: _active, ...withoutActive } = current;\n await this.write({\n ...withoutActive,\n revision: current.revision + 1,\n stale: current.currentKey === undefined,\n });\n });\n }\n\n public async discard(lease: DdcLease): Promise<void> {\n await withDdcLock(this.root, `head-${lease.guid}`, async () => {\n const current = await this.read(lease.guid);\n if (current?.active?.attempt !== lease.attempt) return;\n const { active: _active, ...withoutActive } = current;\n await this.write({\n ...withoutActive,\n revision: current.revision + 1,\n generation: lease.generation,\n stale: current.currentKey === undefined,\n });\n });\n }\n\n /**\n * Restore accepted content only when this lease still owns the mutable head.\n * A newer active or terminal mutation makes rollback a deliberate no-op.\n */\n public async restore(\n head: DdcHead | DdcRollbackSnapshot,\n lease?: DdcLease,\n fence?: DdcRestoreFence,\n ): Promise<DdcRestoreResult> {\n const inferredLease =\n lease ??\n ('activeLease' in head && head.activeLease !== undefined ? head.activeLease : undefined);\n if (inferredLease === undefined) {\n return {\n result: 'not-owner',\n revision: head.revision ?? 0,\n ...(head.generation === undefined ? {} : { generation: head.generation }),\n };\n }\n const snapshot = this.rollbackSnapshot(head);\n return this.restoreIfCurrent(snapshot, inferredLease, fence);\n }\n\n public async restoreIfCurrent(\n snapshot: DdcRollbackSnapshot,\n lease: DdcLease,\n fence?: DdcRestoreFence,\n ): Promise<DdcRestoreResult> {\n return withDdcLock(this.root, `head-${lease.guid}`, async () => {\n const current = await this.read(lease.guid);\n if (current === null || current.guid !== snapshot.guid) {\n return {\n result: 'not-owner',\n revision: current?.revision ?? 0,\n ...(current?.generation === undefined ? {} : { generation: current.generation }),\n };\n }\n const ownsActive =\n current.active?.attempt === lease.attempt &&\n current.active.generation === lease.generation &&\n current.active.desiredKey === lease.desiredKey;\n const ownsTerminal = fence !== undefined && this.matchesRestoreFence(current, lease, fence);\n if (!ownsActive && !ownsTerminal) {\n return {\n result: 'not-owner',\n revision: current.revision,\n ...(current.generation === undefined ? {} : { generation: current.generation }),\n };\n }\n\n const nextRevision = current.revision + 1;\n const generation = Math.max(\n current.generation ?? 0,\n lease.generation,\n snapshot.generation ?? 0,\n );\n const supersededAttempts = current.supersededAttempts;\n const restored: HeadRecord = {\n guid: snapshot.guid,\n desiredKey: snapshot.desiredKey,\n revision: nextRevision,\n generation,\n ...(snapshot.currentKey === undefined ? {} : { currentKey: snapshot.currentKey }),\n ...(snapshot.lastKnownGoodKey === undefined\n ? {}\n : { lastKnownGoodKey: snapshot.lastKnownGoodKey }),\n ...(supersededAttempts === undefined ? {} : { supersededAttempts }),\n ...(snapshot.state === 'missing' ? { empty: true } : {}),\n ...(snapshot.state === 'stale' ? { stale: true } : {}),\n ...(snapshot.failure === undefined\n ? {}\n : { failure: { desiredKey: snapshot.desiredKey, ...snapshot.failure } }),\n };\n await this.write(restored);\n return { result: 'restored', revision: nextRevision, generation };\n });\n }\n\n public async revoke(lease: DdcLease): Promise<void> {\n await this.fail(lease, {\n code: 'lease-lost',\n detail: 'cook lease was revoked before validation',\n });\n }\n\n public async recover(guid: string, desiredKey: string): Promise<DdcHead> {\n return withDdcLock(this.root, `head-${guid}`, async () => {\n const current = await this.read(guid);\n if (current?.active?.desiredKey === desiredKey) {\n await this.write({\n guid,\n desiredKey,\n revision: current.revision + 1,\n ...(current.generation === undefined ? {} : { generation: current.generation }),\n ...(current.supersededAttempts === undefined\n ? {}\n : { supersededAttempts: current.supersededAttempts }),\n ...(current.lastKnownGoodKey === undefined\n ? {}\n : { lastKnownGoodKey: current.lastKnownGoodKey }),\n failure: {\n desiredKey,\n code: 'writer-crashed',\n detail: 'active cook attempt was recovered after process interruption',\n },\n });\n }\n return this.inspect(guid, desiredKey);\n });\n }\n\n private rollbackSnapshot(head: DdcHead | DdcRollbackSnapshot): DdcRollbackSnapshot {\n const { activeLease: _activeLease, ...snapshot } = head as DdcHead;\n if (snapshot.state !== 'cooking') return snapshot;\n return {\n ...snapshot,\n state: snapshot.currentKey === undefined ? 'missing' : 'stale',\n };\n }\n\n private matchesRestoreFence(\n current: HeadRecord,\n lease: DdcLease,\n fence: DdcRestoreFence,\n ): boolean {\n if (\n fence.attempt !== lease.attempt ||\n fence.generation !== lease.generation ||\n current.active !== undefined ||\n current.revision !== fence.revision ||\n current.generation !== fence.generation ||\n current.desiredKey !== fence.desiredKey ||\n current.currentKey !== fence.currentKey ||\n current.lastKnownGoodKey !== fence.lastKnownGoodKey\n ) {\n return false;\n }\n if (fence.outcome === 'current') {\n return (\n fence.key !== undefined &&\n current.currentKey === fence.key &&\n current.failure === undefined &&\n current.stale !== true\n );\n }\n if (\n fence.failure === undefined ||\n current.failure === undefined ||\n current.failure.desiredKey !== fence.desiredKey ||\n current.failure.code !== fence.failure.code ||\n current.failure.detail !== fence.failure.detail\n ) {\n return false;\n }\n return fence.outcome === 'invalid' ? fence.currentKey === undefined : true;\n }\n\n private async projectHead(\n guid: string,\n desiredKey: string,\n record: HeadRecord | null,\n includeActive = true,\n ): Promise<DdcHead> {\n if (record === null) {\n return {\n guid,\n desiredKey,\n state: 'missing',\n currentKey: undefined,\n lastKnownGoodKey: undefined,\n revision: 0,\n };\n }\n const recordedFailure =\n record.failure?.desiredKey === desiredKey\n ? { code: record.failure.code, detail: record.failure.detail }\n : undefined;\n const currentEntry =\n record.currentKey === undefined ? null : await this.entries.readChecked(record.currentKey);\n const entryFailure =\n currentEntry !== null && !currentEntry.ok\n ? { code: currentEntry.error.code, detail: currentEntry.error.detail }\n : undefined;\n const failure = recordedFailure ?? entryFailure;\n const currentValue = currentEntry?.ok === true ? currentEntry.value : null;\n const state: DdcLifecycleState =\n failure !== undefined\n ? 'failed'\n : record.currentKey === desiredKey && currentValue?.guid === guid\n ? 'current'\n : record.stale === true\n ? 'stale'\n : includeActive && record.active?.desiredKey === desiredKey\n ? 'cooking'\n : record.empty === true\n ? 'missing'\n : 'stale';\n return {\n guid,\n desiredKey,\n state,\n currentKey: record.currentKey,\n lastKnownGoodKey: record.lastKnownGoodKey,\n revision: record.revision,\n ...(record.generation === undefined ? {} : { generation: record.generation }),\n ...(includeActive && record.active === undefined\n ? {}\n : includeActive && record.active !== undefined\n ? { activeLease: record.active }\n : {}),\n ...(failure === undefined ? {} : { failure }),\n };\n }\n\n private async allocateGeneration(minimumExclusive = 0): Promise<number> {\n return withDdcLock(this.root, 'generation-counter', async () => {\n const path = join(this.root, 'generations', 'counter.json');\n await mkdir(join(this.root, 'generations'), { recursive: true });\n let next = 1;\n try {\n const record = JSON.parse(await readFile(path, 'utf8')) as GenerationRecord;\n if (\n record.schemaVersion === 'forgeax-ddc-generation/v2' &&\n Number.isSafeInteger(record.next) &&\n record.next >= 1\n )\n next = Math.max(1, record.next);\n } catch {\n // A missing counter is the first allocation, not an implicit legacy fallback.\n }\n const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`;\n next = Math.max(next, minimumExclusive + 1);\n await writeFile(\n temporary,\n JSON.stringify({ schemaVersion: 'forgeax-ddc-generation/v2', next: next + 1 }),\n );\n await rename(temporary, path);\n return next;\n });\n }\n\n private async read(guid: string): Promise<HeadRecord | null> {\n const path = headFile(this.heads, guid);\n let source: string;\n try {\n source = await readFile(path, 'utf8');\n } catch (error) {\n if (\n error !== null &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { readonly code?: unknown }).code === 'ENOENT'\n ) {\n return null;\n }\n throw malformedHeadError('unreadable');\n }\n let value: unknown;\n try {\n value = JSON.parse(source);\n } catch {\n throw malformedHeadError('syntax-invalid');\n }\n if (!isHeadRecord(value) || value.guid !== guid) throw malformedHeadError('schema-invalid');\n return value;\n }\n\n private async write(record: HeadRecord): Promise<void> {\n await mkdir(this.heads, { recursive: true });\n const path = headFile(this.heads, record.guid);\n const temporary = `${path}.${randomUUID()}.tmp`;\n await writeFile(temporary, JSON.stringify(record));\n await rename(temporary, path);\n }\n}\n","import { readdir, rm } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { withDdcLock } from './lifecycle.js';\n\nexport interface DdcGcInput {\n readonly currentKeys: readonly string[];\n readonly lastKnownGoodKeys: readonly string[];\n readonly activeLeaseKeys: readonly string[];\n readonly scopeIds?: readonly string[];\n}\n\nexport interface DdcGcResult {\n readonly deleted: readonly string[];\n readonly protected: readonly string[];\n}\n\n/** Mark current/LKG/lease roots, then sweep only the same project root. */\nexport async function collectDdcGarbage(root: string, input: DdcGcInput): Promise<DdcGcResult> {\n return withDdcLock(root, 'gc', async () => {\n const protectedKeys = new Set([\n ...input.currentKeys,\n ...input.lastKnownGoodKeys,\n ...input.activeLeaseKeys,\n ]);\n const entries = await readdir(join(root, 'entries'), { withFileTypes: true }).catch(() => []);\n const deleted: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory() || protectedKeys.has(entry.name)) continue;\n await rm(join(root, 'entries', entry.name), { recursive: true, force: false });\n deleted.push(entry.name);\n }\n return { deleted, protected: [...protectedKeys].sort() };\n });\n}\n","import { isAbsolute, normalize } from 'node:path';\n\nexport const DDC_LAYOUT_VERSION = 'v2' as const;\n\nexport interface DdcBuildOptions {\n readonly buildCacheRoot: string;\n}\n\nexport interface DdcServeOptions extends DdcBuildOptions {\n readonly projectDdcRoot?: string;\n}\n\nexport interface DdcBuildLayout {\n readonly objects: string;\n readonly staging: string;\n}\n\nexport interface DdcProjectLayout {\n readonly root: string;\n readonly scope: string;\n readonly heads: string;\n readonly generations: string;\n readonly leases: string;\n readonly staging: string;\n}\n\nexport interface DdcLayout {\n readonly version: typeof DDC_LAYOUT_VERSION;\n readonly buildCacheRoot: string;\n readonly projectDdcRoot: string;\n readonly build: DdcBuildLayout;\n readonly project: DdcProjectLayout;\n}\n\nexport interface DdcBuildLayoutResult {\n readonly ok: true;\n readonly value: DdcBuildLayout;\n}\n\nexport interface DdcLayoutError {\n readonly code: 'ddc-project-root-required' | 'ddc-root-absolute-required';\n readonly detail: string;\n readonly hint: string;\n readonly expected: string;\n readonly actual?: string;\n}\n\nexport interface DdcLayoutResult {\n readonly ok: true;\n readonly value: DdcLayout;\n}\n\nexport interface DdcLayoutFailure {\n readonly ok: false;\n readonly error: DdcLayoutError;\n}\n\ntype ClosedLayoutResult = DdcLayoutResult | DdcLayoutFailure;\n\nfunction rootOrError(root: string, name: string): string | DdcLayoutError {\n if (!isAbsolute(root)) {\n return {\n code: 'ddc-root-absolute-required',\n detail: `${name} must be an absolute injected path`,\n hint: `inject the canonical ${name} from the host root policy`,\n expected: 'an absolute filesystem path',\n actual: root,\n };\n }\n const normalized = normalize(root);\n return normalized.replace(/[\\\\/]+$/, '') || normalized;\n}\n\nfunction buildLayout(root: string): DdcBuildLayout {\n return { objects: `${root}/objects`, staging: `${root}/staging` };\n}\n\nfunction projectLayout(root: string): DdcProjectLayout {\n return {\n root,\n scope: `${root}/scope.json`,\n heads: `${root}/heads`,\n generations: `${root}/generations`,\n leases: `${root}/leases`,\n staging: `${root}/staging`,\n };\n}\n\nexport function resolveBuildDdcLayout(\n options: DdcBuildOptions,\n): DdcBuildLayoutResult | DdcLayoutFailure {\n const root = rootOrError(options.buildCacheRoot, 'buildCacheRoot');\n return typeof root === 'string'\n ? { ok: true, value: buildLayout(root) }\n : { ok: false, error: root };\n}\n\nexport function resolveDdcLayout(options: DdcServeOptions): ClosedLayoutResult {\n const buildRoot = rootOrError(options.buildCacheRoot, 'buildCacheRoot');\n if (typeof buildRoot !== 'string') return { ok: false, error: buildRoot };\n if (options.projectDdcRoot === undefined || options.projectDdcRoot.trim().length === 0) {\n return {\n ok: false,\n error: {\n code: 'ddc-project-root-required',\n detail: 'serve and publication require an explicitly injected projectDdcRoot',\n hint: 'canonicalize the game directory in the host and inject its .forgeax/ddc/v2 root',\n expected: 'projectDdcRoot',\n },\n };\n }\n const projectRoot = rootOrError(options.projectDdcRoot, 'projectDdcRoot');\n if (typeof projectRoot !== 'string') return { ok: false, error: projectRoot };\n return {\n ok: true,\n value: {\n version: DDC_LAYOUT_VERSION,\n buildCacheRoot: buildRoot,\n projectDdcRoot: projectRoot,\n build: buildLayout(buildRoot),\n project: projectLayout(projectRoot),\n },\n };\n}\n\nexport function isDdcLayout(value: unknown): value is DdcLayout {\n return (\n value !== null &&\n typeof value === 'object' &&\n (value as { readonly version?: unknown }).version === DDC_LAYOUT_VERSION\n );\n}\n","import { createHash } from 'node:crypto';\nimport type {\n AssetPublicationEnvelope,\n AssetPublicationExternalEvidence,\n AssetPublicationFailure,\n AssetPublicationLocator,\n AssetPublicationOutput,\n AssetPublicationRecovery,\n Result,\n} from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\n\nexport interface ScriptablePackPublicationSnapshot {\n readonly current?: AssetPublicationEnvelope;\n readonly lastKnownGood?: AssetPublicationEnvelope;\n readonly failure?: AssetPublicationFailure;\n}\n\nexport interface ScriptablePackPublicationError extends AssetPublicationFailure {\n readonly recovery: AssetPublicationRecovery;\n readonly current?: AssetPublicationLocator;\n readonly lastKnownGood?: AssetPublicationLocator;\n}\n\nexport interface AcceptedPublicationCandidate {\n readonly envelope: AssetPublicationEnvelope;\n readonly cancelled?: boolean;\n}\n\nexport interface ScriptablePackPublicationBuildInput {\n readonly sourcePath: string;\n readonly sourceRevision: string;\n /** Optional caller generation; the DDC owner derives one when omitted. */\n readonly generation?: number;\n readonly digest: string;\n readonly packageUrl: string;\n readonly inputFingerprint: string;\n readonly outputs: readonly AssetPublicationOutput[];\n readonly externalEvidence: readonly AssetPublicationExternalEvidence[];\n}\n\n/**\n * DDC-owned publication authority for source keyed producers. Transport\n * adapters may stage bytes, but they do not retain current/LKG or generation\n * state themselves.\n */\nexport interface AcceptedPublicationStore {\n observe(sourcePath: string): ScriptablePackPublicationSnapshot;\n stage(\n sourcePath: string,\n candidate: AcceptedPublicationCandidate,\n ): Result<void, ScriptablePackPublicationError>;\n commit(\n sourcePath: string,\n candidate: AcceptedPublicationCandidate,\n commitRoute: () => Promise<void> | void,\n ): Promise<Result<ScriptablePackPublicationSnapshot, ScriptablePackPublicationError>>;\n discard(sourcePath: string, candidate: AssetPublicationEnvelope): void;\n restore(sourcePath: string, snapshot: ScriptablePackPublicationSnapshot): void;\n}\n\nfunction stable(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stable).join(',')}]`;\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n return `{${Object.keys(record)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stable(record[key])}`)\n .join(',')}}`;\n }\n return JSON.stringify(value) ?? 'null';\n}\n\nfunction digest(value: unknown): string {\n return `sha256:${createHash('sha256').update(stable(value)).digest('hex')}`;\n}\n\nexport function scriptablePackOutputSetDigest(outputs: readonly AssetPublicationOutput[]): string {\n return digest(\n outputs.map((output) => ({\n guid: output.guid.toLowerCase(),\n sourceKey: output.sourceKey,\n kind: output.kind,\n digest: output.digest,\n refs: [...output.refs].map((guid) => guid.toLowerCase()),\n })),\n );\n}\n\n/** Derive a stable positive generation from the accepted publication tuple. */\nexport function scriptablePackPublicationGeneration(input: {\n readonly sourceRevision: string;\n readonly digest: string;\n readonly outputSetDigest: string;\n}): number {\n const hash = createHash('sha256')\n .update(input.sourceRevision)\n .update('\\n')\n .update(input.digest)\n .update('\\n')\n .update(input.outputSetDigest)\n .digest('hex');\n const generation = Number.parseInt(hash.slice(0, 8), 16);\n return generation > 0 ? generation : 1;\n}\n\n/** Build the complete producer-owned tuple after the package route is finalized. */\nexport function createAcceptedPublication(\n input: ScriptablePackPublicationBuildInput,\n): AssetPublicationEnvelope {\n const outputSetDigest = scriptablePackOutputSetDigest(input.outputs);\n const publicationGeneration =\n input.generation ??\n scriptablePackPublicationGeneration({\n sourceRevision: input.sourceRevision,\n digest: input.digest,\n outputSetDigest,\n });\n return {\n schemaVersion: 'asset-publication/1',\n sourcePath: input.sourcePath,\n sourceRevision: input.sourceRevision,\n generation: publicationGeneration,\n digest: input.digest,\n outputSetDigest,\n outputs: input.outputs,\n receipt: {\n schemaVersion: 'asset-publication-receipt/1',\n sourcePath: input.sourcePath,\n sourceRevision: input.sourceRevision,\n inputFingerprint: input.inputFingerprint,\n outputDigest: input.digest,\n outputSetDigest,\n externalEvidence: input.externalEvidence,\n },\n externalEvidence: input.externalEvidence,\n current: {\n generation: publicationGeneration,\n digest: input.digest,\n outputSetDigest,\n packageUrl: input.packageUrl,\n receiptKey: input.inputFingerprint,\n },\n };\n}\n\nfunction locatorFor(envelope: AssetPublicationEnvelope): AssetPublicationLocator {\n return {\n generation: envelope.generation,\n digest: envelope.digest,\n outputSetDigest: envelope.outputSetDigest,\n packageUrl: envelope.current?.packageUrl ?? '',\n receiptKey: envelope.receipt.inputFingerprint,\n };\n}\n\nfunction recoveryFor(retryable: boolean, useLastKnownGood: boolean): AssetPublicationRecovery {\n return {\n retryable,\n preserveCurrent: true,\n useLastKnownGood,\n actions: retryable\n ? ['inspect-publication-failure', 'retry-rebuild', 'continue-last-known-good']\n : ['inspect-publication-failure', 'edit-source', 'continue-last-known-good'],\n };\n}\n\nfunction failure(\n envelope: AssetPublicationEnvelope,\n code: string,\n stage: AssetPublicationFailure['stage'],\n reason: string,\n retryable: boolean,\n current: AssetPublicationEnvelope | undefined,\n lastKnownGood: AssetPublicationEnvelope | undefined,\n): ScriptablePackPublicationError {\n return {\n code,\n stage,\n sourcePath: envelope.sourcePath,\n sourceRevision: envelope.sourceRevision,\n generation: envelope.generation,\n reason,\n recovery: recoveryFor(retryable, lastKnownGood !== undefined),\n ...(current === undefined ? {} : { current: locatorFor(current) }),\n ...(lastKnownGood === undefined ? {} : { lastKnownGood: locatorFor(lastKnownGood) }),\n };\n}\n\nfunction validateOutputs(\n envelope: AssetPublicationEnvelope,\n current: AssetPublicationEnvelope | undefined,\n lastKnownGood: AssetPublicationEnvelope | undefined,\n): ScriptablePackPublicationError | undefined {\n const guids = new Set<string>();\n const sourceKeys = new Set<string>();\n for (const output of envelope.outputs) {\n const guid = output.guid.toLowerCase();\n if (guids.has(guid) || sourceKeys.has(output.sourceKey)) {\n return failure(\n envelope,\n 'asset-publication-output-duplicate',\n 'output',\n 'publication output GUIDs and sourceKeys must be unique',\n false,\n current,\n lastKnownGood,\n );\n }\n guids.add(guid);\n sourceKeys.add(output.sourceKey);\n }\n if (\n envelope.outputs.length === 0 ||\n scriptablePackOutputSetDigest(envelope.outputs) !== envelope.outputSetDigest\n ) {\n return failure(\n envelope,\n 'asset-publication-output-set-mismatch',\n 'receipt',\n 'receipt outputSetDigest does not match the complete output tuple',\n false,\n current,\n lastKnownGood,\n );\n }\n return undefined;\n}\n\nfunction validateReceipt(\n envelope: AssetPublicationEnvelope,\n current: AssetPublicationEnvelope | undefined,\n lastKnownGood: AssetPublicationEnvelope | undefined,\n): ScriptablePackPublicationError | undefined {\n const receipt = envelope.receipt;\n if (\n receipt.schemaVersion !== 'asset-publication-receipt/1' ||\n receipt.sourcePath !== envelope.sourcePath ||\n receipt.sourceRevision !== envelope.sourceRevision ||\n receipt.outputSetDigest !== envelope.outputSetDigest ||\n receipt.outputDigest !== envelope.digest ||\n stable(receipt.externalEvidence) !== stable(envelope.externalEvidence)\n ) {\n return failure(\n envelope,\n 'asset-publication-receipt-mismatch',\n 'receipt',\n 'publication receipt does not match the candidate output tuple',\n false,\n current,\n lastKnownGood,\n );\n }\n return undefined;\n}\n\nfunction validateEnvelope(\n envelope: AssetPublicationEnvelope,\n current: AssetPublicationEnvelope | undefined,\n lastKnownGood: AssetPublicationEnvelope | undefined,\n): ScriptablePackPublicationError | undefined {\n if (envelope.schemaVersion !== 'asset-publication/1') {\n return failure(\n envelope,\n 'asset-publication-schema-invalid',\n 'receipt',\n 'publication envelope schemaVersion is not supported',\n false,\n current,\n lastKnownGood,\n );\n }\n if (!Number.isSafeInteger(envelope.generation) || envelope.generation < 1) {\n return failure(\n envelope,\n 'asset-publication-generation-invalid',\n 'receipt',\n 'publication generation must be a positive integer',\n false,\n current,\n lastKnownGood,\n );\n }\n const outputError = validateOutputs(envelope, current, lastKnownGood);\n if (outputError !== undefined) return outputError;\n const receiptError = validateReceipt(envelope, current, lastKnownGood);\n if (receiptError !== undefined) return receiptError;\n // Re-running a deterministic producer (for example a cold cook after a\n // rebuild) can yield the exact same publication tuple. That is an\n // idempotent request, not a late result: rejecting it here makes the\n // editor's retry/cold-cook operation fail even though the published asset is\n // already the requested content. A same-generation tuple with any changed\n // source/digest/output-set fact remains stale and is rejected below.\n const sameTuple =\n current !== undefined &&\n envelope.generation === current.generation &&\n envelope.sourcePath === current.sourcePath &&\n envelope.sourceRevision === current.sourceRevision &&\n envelope.digest === current.digest &&\n envelope.outputSetDigest === current.outputSetDigest;\n if (sameTuple) return undefined;\n if (current !== undefined && envelope.generation <= current.generation) {\n return failure(\n envelope,\n 'asset-publication-stale',\n 'cancelled',\n `candidate generation ${envelope.generation} is not newer than current ${current.generation}`,\n true,\n current,\n lastKnownGood,\n );\n }\n return undefined;\n}\n\ninterface PublicationState {\n snapshot: ScriptablePackPublicationSnapshot;\n /**\n * Staged candidates are owned by their envelope object, not by the\n * publication tuple. Two overlapping generations can legitimately produce\n * the same deterministic tuple; a stale owner's discard must not remove the\n * current owner's candidate before commit.\n */\n readonly staged: Set<AssetPublicationEnvelope>;\n}\n\nfunction validateCandidate(\n state: PublicationState,\n candidate: AcceptedPublicationCandidate,\n cancelledReason: string,\n): ScriptablePackPublicationError | undefined {\n const current = state.snapshot.current;\n const lastKnownGood = state.snapshot.lastKnownGood ?? current;\n if (candidate.cancelled === true) {\n return failure(\n candidate.envelope,\n 'asset-publication-cancelled',\n 'cancelled',\n cancelledReason,\n true,\n current,\n lastKnownGood,\n );\n }\n return validateEnvelope(candidate.envelope, current, lastKnownGood);\n}\n\nasync function publishCandidate(\n state: PublicationState,\n candidate: AcceptedPublicationCandidate,\n commitRoute: () => Promise<void> | void,\n): Promise<Result<ScriptablePackPublicationSnapshot, ScriptablePackPublicationError>> {\n const current = state.snapshot.current;\n const lastKnownGood = state.snapshot.lastKnownGood ?? current;\n const invalid = validateCandidate(\n state,\n candidate,\n 'publication request was cancelled before route commit',\n );\n if (invalid !== undefined) {\n state.snapshot = { ...state.snapshot, failure: invalid };\n return err(invalid);\n }\n try {\n await commitRoute();\n } catch (error) {\n const failed = failure(\n candidate.envelope,\n 'asset-publication-route-failed',\n 'route',\n error instanceof Error ? error.message : String(error),\n true,\n current,\n lastKnownGood,\n );\n state.snapshot = { ...state.snapshot, failure: failed };\n return err(failed);\n }\n const published = {\n ...candidate.envelope,\n current: locatorFor(candidate.envelope),\n ...(current === undefined ? {} : { lastKnownGood: locatorFor(current) }),\n recovery: recoveryFor(false, current !== undefined),\n };\n state.snapshot = {\n current: published,\n ...(current === undefined ? {} : { lastKnownGood: current }),\n };\n return ok(state.snapshot);\n}\n\n/** Create the one DDC publication authority shared by dev attempts. */\nexport function createAcceptedPublicationStore(): AcceptedPublicationStore {\n const states = new Map<string, PublicationState>();\n function stateFor(sourcePath: string): PublicationState {\n const existing = states.get(sourcePath);\n if (existing !== undefined) return existing;\n const created: PublicationState = { snapshot: {}, staged: new Set() };\n states.set(sourcePath, created);\n return created;\n }\n return {\n observe(sourcePath) {\n return stateFor(sourcePath).snapshot;\n },\n stage(sourcePath, candidate) {\n const invalid = validateCandidate(\n stateFor(sourcePath),\n candidate,\n 'publication request was cancelled before DDC commit',\n );\n if (invalid !== undefined) return err(invalid);\n stateFor(sourcePath).staged.add(candidate.envelope);\n return ok(undefined);\n },\n async commit(sourcePath, candidate, commitRoute) {\n const state = stateFor(sourcePath);\n if (!state.staged.has(candidate.envelope)) {\n const current = state.snapshot.current;\n const lastKnownGood = state.snapshot.lastKnownGood ?? current;\n return err(\n failure(\n candidate.envelope,\n 'asset-publication-cancelled',\n 'cancelled',\n 'publication candidate was discarded before DDC commit',\n true,\n current,\n lastKnownGood,\n ),\n );\n }\n const result = await publishCandidate(state, candidate, commitRoute);\n state.staged.delete(candidate.envelope);\n return result;\n },\n discard(sourcePath, candidate) {\n stateFor(sourcePath).staged.delete(candidate);\n },\n restore(sourcePath, snapshot) {\n const state = stateFor(sourcePath);\n state.staged.clear();\n state.snapshot = snapshot;\n },\n };\n}\n","import { createHash } from 'node:crypto';\nimport { mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { DdcStoreError } from './errors.js';\n\nexport interface DdcRuntimeScope {\n readonly scopeId: string;\n readonly scopeHash: string;\n readonly root: string;\n readonly metadataPath: string;\n}\n\ninterface ScopeMetadata {\n readonly schemaVersion: 'forgeax-ddc-scope/v2';\n readonly scopeId: string;\n readonly scopeHash: string;\n}\n\nfunction scopeHash(scopeId: string): string {\n return createHash('sha256').update(scopeId, 'utf8').digest('hex');\n}\n\nexport function runtimeScopeHash(scopeId: string): string {\n return scopeHash(scopeId);\n}\n\nexport async function createRuntimeScope(root: string, scopeId: string): Promise<DdcRuntimeScope> {\n if (scopeId.length === 0) {\n throw new DdcStoreError({\n code: 'ddc-scope-mismatch',\n detail: 'runtime scope id must not be empty',\n expected: 'a non-empty original scope id',\n actual: scopeId,\n rootKind: 'project-ddc',\n });\n }\n const hash = scopeHash(scopeId);\n const scopeRoot = join(root, 'scopes', hash);\n const metadataPath = join(scopeRoot, 'scope.json');\n await mkdir(scopeRoot, { recursive: true });\n const expected: ScopeMetadata = {\n schemaVersion: 'forgeax-ddc-scope/v2',\n scopeId,\n scopeHash: hash,\n };\n try {\n const actual = JSON.parse(await readFile(metadataPath, 'utf8')) as Partial<ScopeMetadata>;\n if (\n actual.schemaVersion !== expected.schemaVersion ||\n actual.scopeId !== expected.scopeId ||\n actual.scopeHash !== expected.scopeHash\n ) {\n throw new DdcStoreError({\n code: 'ddc-scope-mismatch',\n detail: 'runtime scope metadata does not match the requested scope',\n expected,\n actual,\n rootKind: 'project-ddc',\n scope: scopeId,\n });\n }\n } catch (error) {\n if (error instanceof DdcStoreError) throw error;\n const temporary = `${metadataPath}.${process.pid}.tmp`;\n await writeFile(temporary, JSON.stringify(expected));\n await rename(temporary, metadataPath);\n }\n return { scopeId, scopeHash: hash, root: scopeRoot, metadataPath };\n}\n\nexport async function assertRuntimeScope(\n root: string,\n scope: Pick<DdcRuntimeScope, 'scopeId' | 'scopeHash'>,\n): Promise<DdcRuntimeScope> {\n const expectedHash = scopeHash(scope.scopeId);\n if (scope.scopeHash !== expectedHash) {\n throw new DdcStoreError({\n code: 'ddc-scope-mismatch',\n detail: 'runtime scope hash does not match the original scope id',\n expected: expectedHash,\n actual: scope.scopeHash,\n rootKind: 'project-ddc',\n scope: scope.scopeId,\n });\n }\n return createRuntimeScope(root, scope.scopeId);\n}\n","import type { DdcEntry, StagedDdcEntry } from './entry-store.js';\nimport { DdcEntryStore } from './entry-store.js';\nimport type {\n DdcCommitResult,\n DdcHead,\n DdcLease,\n DdcRestoreFence,\n DdcRestoreResult,\n DdcRollbackSnapshot,\n} from './lifecycle.js';\nimport { DdcLifecycle } from './lifecycle.js';\n\nexport interface DdcSessionOptions {\n readonly generation: number;\n readonly leaseTtlMs?: number;\n}\n\nexport interface DdcGenerationCandidate {\n readonly generation: number;\n readonly lease: DdcLease;\n readonly previousHead: DdcRollbackSnapshot;\n}\n\nexport interface DdcGenerationEntryCandidate extends DdcGenerationCandidate {\n readonly staged: StagedDdcEntry;\n}\n\nexport interface DdcSessionMetrics {\n readonly hitCount: number;\n readonly missCount: number;\n readonly corruptCount: number;\n readonly writeFailureCount: number;\n}\n\ntype MutableDdcGenerationCandidate = Omit<DdcGenerationCandidate, 'lease'> & {\n lease: DdcLease;\n};\n\ntype MutableDdcGenerationEntryCandidate = Omit<DdcGenerationEntryCandidate, 'lease'> & {\n lease: DdcLease;\n};\n\ntype HeartbeatTimer = ReturnType<typeof setTimeout>;\n\ninterface MutableMetrics {\n hitCount: number;\n missCount: number;\n corruptCount: number;\n writeFailureCount: number;\n}\n\nexport class DdcGenerationSession {\n public readonly generation: number;\n private readonly lifecycle: DdcLifecycle;\n private readonly entries: DdcEntryStore;\n private readonly candidates = new Map<string, MutableDdcGenerationCandidate>();\n private readonly restoreFences = new WeakMap<DdcGenerationCandidate, DdcRestoreFence>();\n private readonly heartbeatTimers = new Map<string, HeartbeatTimer>();\n private readonly counters: MutableMetrics = {\n hitCount: 0,\n missCount: 0,\n corruptCount: 0,\n writeFailureCount: 0,\n };\n private accepting = true;\n\n public constructor(root: string, options: DdcSessionOptions) {\n if (!Number.isSafeInteger(options.generation) || options.generation < 1) {\n throw new TypeError('DDC generation must be a positive safe integer');\n }\n this.generation = options.generation;\n this.lifecycle = new DdcLifecycle(\n root,\n options.leaseTtlMs === undefined ? undefined : { leaseTtlMs: options.leaseTtlMs },\n );\n this.entries = new DdcEntryStore(root);\n }\n\n public async beginCandidate(guid: string, desiredKey: string): Promise<DdcGenerationCandidate> {\n this.assertOpen();\n const { lease, previousHead } = await this.lifecycle.beginWithSnapshot(guid, desiredKey);\n if (previousHead.state === 'current') this.counters.hitCount += 1;\n else this.counters.missCount += 1;\n const candidate: MutableDdcGenerationCandidate = {\n generation: this.generation,\n lease,\n previousHead,\n };\n this.candidates.set(lease.attempt, candidate);\n this.scheduleHeartbeat(candidate);\n return candidate;\n }\n\n public async stageEntry(entry: DdcEntry): Promise<DdcGenerationEntryCandidate> {\n this.assertOpen();\n const candidate = (await this.beginCandidate(\n entry.guid,\n entry.key,\n )) as MutableDdcGenerationCandidate;\n try {\n const staged = await this.entries.stage(entry);\n const entryCandidate: MutableDdcGenerationEntryCandidate = Object.assign(candidate, {\n staged,\n });\n this.candidates.set(candidate.lease.attempt, entryCandidate);\n return entryCandidate;\n } catch (error) {\n const fence = await this.lifecycle.fail(candidate.lease, {\n code: 'ddc-entry-stage-failed',\n detail: error instanceof Error ? error.message : String(error),\n });\n if (fence !== undefined) this.restoreFences.set(candidate, fence);\n this.stopHeartbeat(candidate);\n this.candidates.delete(candidate.lease.attempt);\n this.counters.writeFailureCount += 1;\n throw error;\n }\n }\n\n public async inspect(guid: string, desiredKey: string): Promise<DdcHead> {\n this.assertOpen();\n const head = await this.lifecycle.inspect(guid, desiredKey);\n if (head.state === 'current') this.counters.hitCount += 1;\n else this.counters.missCount += 1;\n return head;\n }\n\n public async commitCandidate(\n candidate: DdcGenerationCandidate,\n validatedKey: string,\n ): Promise<DdcCommitResult> {\n const registered = this.assertCandidate(candidate);\n try {\n const result = await this.lifecycle.commit(registered.lease, validatedKey);\n if (result.restoreFence !== undefined)\n this.restoreFences.set(registered, result.restoreFence);\n if (result.result === 'invalid') this.counters.corruptCount += 1;\n this.stopHeartbeat(registered);\n this.candidates.delete(registered.lease.attempt);\n return result;\n } catch (error) {\n this.stopHeartbeat(registered);\n this.counters.writeFailureCount += 1;\n throw error;\n }\n }\n\n public async commitEntry(\n candidate: DdcGenerationEntryCandidate,\n validatedKey: string,\n ): Promise<DdcCommitResult> {\n const registered = this.assertCandidate(candidate);\n try {\n await this.entries.publish(candidate.staged);\n const result = await this.lifecycle.commit(registered.lease, validatedKey);\n if (result.restoreFence !== undefined)\n this.restoreFences.set(registered, result.restoreFence);\n this.stopHeartbeat(registered);\n this.candidates.delete(registered.lease.attempt);\n return result;\n } catch (error) {\n this.stopHeartbeat(registered);\n const fence = await this.lifecycle.fail(registered.lease, {\n code: 'ddc-entry-publish-failed',\n detail: error instanceof Error ? error.message : String(error),\n });\n if (fence !== undefined) this.restoreFences.set(registered, fence);\n await this.entries.discard(candidate.staged).catch(() => {});\n this.candidates.delete(registered.lease.attempt);\n this.counters.writeFailureCount += 1;\n throw error;\n }\n }\n\n public async discardCandidate(candidate: DdcGenerationCandidate): Promise<void> {\n const registered = this.candidates.get(candidate.lease.attempt);\n if (registered === undefined) return;\n try {\n this.stopHeartbeat(registered);\n await this.lifecycle.discard(registered.lease);\n this.candidates.delete(registered.lease.attempt);\n } catch (error) {\n this.counters.writeFailureCount += 1;\n throw error;\n }\n }\n\n public async discardEntry(candidate: DdcGenerationEntryCandidate): Promise<void> {\n await Promise.all([this.discardCandidate(candidate), this.entries.discard(candidate.staged)]);\n }\n\n public async restoreEntry(candidate: DdcGenerationEntryCandidate): Promise<DdcRestoreResult> {\n const registered = this.candidates.get(candidate.lease.attempt);\n const ownerLease = registered?.lease ?? candidate.lease;\n const fence = this.restoreFences.get(candidate);\n this.stopHeartbeat(ownerLease);\n let result: DdcRestoreResult = {\n result: 'not-owner',\n revision: candidate.previousHead.revision ?? 0,\n ...(candidate.previousHead.generation === undefined\n ? {}\n : { generation: candidate.previousHead.generation }),\n };\n let restoreError: unknown;\n try {\n result = await this.lifecycle.restoreIfCurrent(candidate.previousHead, ownerLease, fence);\n } catch (error) {\n restoreError = error;\n } finally {\n await this.entries.discard(candidate.staged).catch(() => {});\n if (registered !== undefined) {\n this.candidates.delete(registered.lease.attempt);\n }\n }\n if (restoreError !== undefined) throw restoreError;\n return result;\n }\n\n public metrics(): DdcSessionMetrics {\n return { ...this.counters };\n }\n\n public async close(): Promise<void> {\n if (!this.accepting) return;\n this.accepting = false;\n for (const timer of this.heartbeatTimers.values()) clearTimeout(timer);\n this.heartbeatTimers.clear();\n const pending = [...this.candidates.values()];\n for (const candidate of pending) {\n try {\n await this.lifecycle.discard(candidate.lease);\n } catch {\n this.counters.writeFailureCount += 1;\n }\n }\n this.candidates.clear();\n }\n\n private assertOpen(): void {\n if (!this.accepting) throw new Error('DDC generation session is closed');\n }\n\n private assertCandidate(candidate: DdcGenerationCandidate): MutableDdcGenerationCandidate {\n this.assertOpen();\n const registered = this.candidates.get(candidate.lease.attempt);\n if (candidate.generation !== this.generation || registered === undefined) {\n throw new Error('DDC candidate belongs to another generation session');\n }\n return registered;\n }\n\n private scheduleHeartbeat(candidate: MutableDdcGenerationCandidate): void {\n const attempt = candidate.lease.attempt;\n this.stopHeartbeat(candidate);\n const delay = Math.max(1, Math.floor((candidate.lease.expiresAt - Date.now()) / 2));\n const timer = setTimeout(() => {\n this.heartbeatTimers.delete(attempt);\n if (!this.accepting || this.candidates.get(attempt) !== candidate) return;\n void this.lifecycle\n .heartbeat(candidate.lease)\n .then((lease) => {\n if (!this.accepting || this.candidates.get(attempt) !== candidate) return;\n candidate.lease = lease;\n this.scheduleHeartbeat(candidate);\n })\n .catch(() => {\n this.stopHeartbeat(candidate);\n });\n }, delay);\n timer.unref?.();\n this.heartbeatTimers.set(attempt, timer);\n }\n\n private stopHeartbeat(candidate: DdcGenerationCandidate | DdcLease): void {\n const attempt = 'lease' in candidate ? candidate.lease.attempt : candidate.attempt;\n const timer = this.heartbeatTimers.get(attempt);\n if (timer === undefined) return;\n clearTimeout(timer);\n this.heartbeatTimers.delete(attempt);\n }\n}\n","import type { DdcErrorRootKind } from './errors.js';\n\nexport const DDC_STATUS_SCHEMA = 'forgeax-ddc-status/v2' as const;\n\nexport type DdcStatusHealth = 'ready' | 'blocked' | 'missing' | 'stale' | 'failed';\nexport type DdcStatusLayerKind = 'build' | 'project' | 'runtime';\nexport type DdcStatusRootKind = DdcErrorRootKind;\n\nexport interface DdcRecoveryAction {\n readonly kind: 'inspect' | 'allocate-generation' | 'retry' | 'cold-rebuild' | 'prune';\n readonly executable: boolean;\n readonly exactTarget?: string;\n readonly reason?: string;\n}\n\nexport interface DdcStatusLayer {\n readonly kind: DdcStatusLayerKind;\n readonly owner: 'engine-ddc' | 'engine-pack' | 'plugin' | 'runtime';\n readonly rootKind: DdcStatusRootKind;\n readonly scopeId?: string;\n readonly current?: number | string;\n readonly lastKnownGood?: number | string;\n readonly protection: readonly string[];\n readonly actions: readonly DdcRecoveryAction[];\n}\n\nexport interface DdcStatus {\n readonly schemaVersion: typeof DDC_STATUS_SCHEMA;\n readonly health: DdcStatusHealth;\n readonly layers: readonly DdcStatusLayer[];\n readonly gameDir?: string;\n readonly projectDdcRoot?: string;\n}\n\nexport type BrowserDdcRecoveryAction = Omit<DdcRecoveryAction, 'exactTarget'>;\nexport type BrowserDdcStatusLayer = Omit<DdcStatusLayer, 'actions'> & {\n readonly actions: readonly BrowserDdcRecoveryAction[];\n};\nexport type BrowserDdcStatus = Omit<DdcStatus, 'gameDir' | 'projectDdcRoot' | 'layers'> & {\n readonly layers: readonly BrowserDdcStatusLayer[];\n};\n\nexport function serializeDdcStatus(status: DdcStatus): string {\n return JSON.stringify(status);\n}\n\nexport function projectDdcStatusForBrowser(status: DdcStatus): BrowserDdcStatus {\n return {\n schemaVersion: DDC_STATUS_SCHEMA,\n health: status.health,\n layers: status.layers.map((layer) => ({\n ...layer,\n actions: layer.actions.map(({ exactTarget: _exactTarget, ...action }) => action),\n })),\n };\n}\n\nexport const toBrowserDdcStatus = projectDdcStatusForBrowser;\n"]}
1
+ {"version":3,"sources":["../src/key.ts","../src/build-cache.ts","../src/errors.ts","../src/entry-store.ts","../src/lifecycle.ts","../src/gc.ts","../src/layout.ts","../src/publication.ts","../src/runtime-scope.ts","../src/session.ts","../src/status.ts"],"names":["digest","createHash","join","mkdir","writeFile","rm","readFile","randomUUID","nextRevision","failure","rename","readdir","delay"],"mappings":"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","file":"index.mjs","sourcesContent":["import { createHash } from 'node:crypto';\n\nexport interface SemanticDdcInput {\n readonly schemaVersion: string;\n readonly importer: string;\n readonly codec: string;\n readonly settings: unknown;\n readonly sourceBytes: readonly Uint8Array[];\n readonly declaredGuids: readonly string[];\n readonly targetProfile: string;\n readonly producer: string;\n}\n\nexport function canonicalDdcJson(value: unknown): string {\n const sorted = sortValue(value);\n return JSON.stringify(sorted) ?? 'null';\n}\n\nfunction sortValue(value: unknown): unknown {\n if (value instanceof Uint8Array) {\n return { encoding: 'base64', bytes: Buffer.from(value).toString('base64') };\n }\n if (Array.isArray(value)) return value.map(sortValue);\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n result[key] = sortValue((value as Record<string, unknown>)[key]);\n }\n return result;\n }\n return value;\n}\n\nexport function semanticDdcKey(input: SemanticDdcInput): string {\n const semantic = {\n schemaVersion: input.schemaVersion,\n importer: input.importer,\n codec: input.codec,\n settings: input.settings,\n sourceBytes: input.sourceBytes,\n declaredGuids: [...input.declaredGuids].sort(),\n targetProfile: input.targetProfile,\n producer: input.producer,\n };\n return createHash('sha256').update(canonicalDdcJson(semantic)).digest('hex');\n}\n","import { existsSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { semanticDdcKey as ownerSemanticDdcKey } from './key.js';\n\nexport interface BuildDdcInput {\n readonly schemaVersion: string;\n readonly importerVersion: string;\n readonly codecVersion: string;\n readonly sourceDependencies: readonly (\n | string\n | { readonly path: string; readonly digest: string }\n )[];\n readonly settings: unknown;\n readonly declaredGuids: readonly string[];\n readonly cookProfile: string;\n readonly sourceOverrides?: unknown;\n readonly publish?: unknown;\n}\n\nexport function resolveDdcRoot(cwd: string): string {\n let current = resolve(cwd);\n while (true) {\n if (existsSync(join(current, 'pnpm-workspace.yaml'))) {\n return join(current, 'node_modules/.cache/forgeax-ddc');\n }\n const parent = dirname(current);\n if (parent === current) return join(resolve(cwd), 'node_modules/.cache/forgeax-ddc');\n current = parent;\n }\n}\n\n/** Derive the build key while keeping publish URLs out of the semantic identity. */\nexport function semanticBuildKey(input: BuildDdcInput): string {\n const hasSourceOverrides =\n input.sourceOverrides !== undefined &&\n typeof input.sourceOverrides === 'object' &&\n input.sourceOverrides !== null &&\n !Array.isArray(input.sourceOverrides) &&\n Object.keys(input.sourceOverrides).length > 0;\n const settings = hasSourceOverrides\n ? { settings: input.settings, sourceOverrides: input.sourceOverrides }\n : input.settings;\n return ownerSemanticDdcKey({\n schemaVersion: input.schemaVersion,\n importer: input.importerVersion,\n codec: input.codecVersion,\n settings,\n sourceBytes: input.sourceDependencies\n .map((dependency) =>\n typeof dependency === 'string'\n ? dependency.replaceAll('\\\\', '/').replace(/^.*\\/(assets\\/)/, '$1')\n : dependency.digest,\n )\n .sort()\n .map((digest) => new TextEncoder().encode(digest)),\n declaredGuids: input.declaredGuids,\n targetProfile: input.cookProfile,\n producer: input.importerVersion,\n });\n}\n","export const DDC_ERROR_CODES = [\n 'ddc-project-root-required',\n 'ddc-object-conflict',\n 'ddc-head-conflict',\n 'ddc-generation-conflict',\n 'ddc-scope-mismatch',\n 'ddc-lease-expired',\n] as const;\n\nexport type DdcContractErrorCode = (typeof DDC_ERROR_CODES)[number];\nexport type DdcEntryErrorCode = 'ddc-entry-incomplete' | 'ddc-entry-invalid' | 'ddc-entry-conflict';\nexport type DdcErrorCode = DdcContractErrorCode | DdcEntryErrorCode;\n\nexport type DdcErrorRootKind = 'build-cache' | 'project-ddc' | 'runtime';\n\nexport interface DdcRecoveryAction {\n readonly kind:\n | 'inspect'\n | 'allocate-generation'\n | 'retry'\n | 'cold-rebuild'\n | 'prune'\n | 'release-lease';\n readonly executable: boolean;\n readonly exactTarget?: string;\n readonly reason?: string;\n}\n\nexport interface DdcStoreErrorInit {\n readonly code: DdcErrorCode;\n readonly detail: string;\n readonly hint?: string;\n readonly expected?: unknown;\n readonly actual?: unknown;\n readonly owner?: string;\n readonly rootKind?: DdcErrorRootKind;\n readonly scope?: string;\n readonly generation?: number;\n readonly lease?: string;\n readonly revision?: number;\n readonly recoveryActions?: readonly DdcRecoveryAction[];\n readonly hostPath?: string;\n}\n\nexport interface DdcBrowserError {\n readonly code: DdcErrorCode;\n readonly hint: string;\n readonly expected: unknown;\n readonly actual?: unknown;\n readonly owner?: string;\n readonly rootKind?: DdcErrorRootKind;\n readonly scope?: string;\n readonly generation?: number;\n readonly lease?: string;\n readonly revision?: number;\n readonly recoveryActions: readonly Omit<DdcRecoveryAction, 'exactTarget'>[];\n}\n\nconst defaultHints: Record<DdcErrorCode, string> = {\n 'ddc-project-root-required': 'inject the canonical projectDdcRoot before serving or publishing',\n 'ddc-object-conflict': 'keep the verified object and reject the competing publication',\n 'ddc-head-conflict': 'inspect the current head and retry with a fresh revision',\n 'ddc-generation-conflict': 'allocate a new persistent generation; do not edit the counter',\n 'ddc-scope-mismatch': 'reinspect the canonical root and allocate a new scope',\n 'ddc-lease-expired': 'discard the stale commit and acquire a new lease',\n 'ddc-entry-incomplete': 'discard the partial entry and cold-cook from author authority',\n 'ddc-entry-invalid': 'preserve last-known-good, inspect the entry, then cold-cook',\n 'ddc-entry-conflict': 'keep the verified entry and reject the competing publication',\n};\n\nfunction defaultExpected(code: DdcErrorCode): unknown {\n if (code === 'ddc-project-root-required') return 'projectDdcRoot';\n if (code === 'ddc-entry-incomplete' || code === 'ddc-entry-invalid') {\n return 'a complete DDC entry whose receipt and integrity digests validate';\n }\n return 'a valid DDC owner, scope, generation, revision, and lease';\n}\n\nfunction defaultActions(code: DdcErrorCode): readonly DdcRecoveryAction[] {\n switch (code) {\n case 'ddc-project-root-required':\n case 'ddc-scope-mismatch':\n return [\n { kind: 'inspect', executable: true },\n { kind: 'retry', executable: true },\n ];\n case 'ddc-generation-conflict':\n return [{ kind: 'allocate-generation', executable: true }];\n case 'ddc-lease-expired':\n return [\n { kind: 'release-lease', executable: true },\n { kind: 'retry', executable: true },\n ];\n case 'ddc-object-conflict':\n case 'ddc-head-conflict':\n return [\n { kind: 'inspect', executable: true },\n { kind: 'retry', executable: true },\n ];\n case 'ddc-entry-incomplete':\n case 'ddc-entry-invalid':\n return [{ kind: 'cold-rebuild', executable: true }];\n case 'ddc-entry-conflict':\n return [{ kind: 'inspect', executable: true }];\n }\n}\n\nexport class DdcStoreError extends Error {\n public readonly code: DdcErrorCode;\n public readonly detail: string;\n public readonly hint: string;\n public readonly expected: unknown;\n public readonly actual: unknown;\n public readonly owner: string | undefined;\n public readonly rootKind: DdcErrorRootKind | undefined;\n public readonly scope: string | undefined;\n public readonly generation: number | undefined;\n public readonly lease: string | undefined;\n public readonly revision: number | undefined;\n public readonly recoveryActions: readonly DdcRecoveryAction[];\n public readonly hostPath: string | undefined;\n\n public constructor(code: DdcErrorCode, detail: string);\n public constructor(input: DdcStoreErrorInit);\n public constructor(inputOrCode: DdcStoreErrorInit | DdcErrorCode, legacyDetail?: string) {\n const input: DdcStoreErrorInit =\n typeof inputOrCode === 'string'\n ? { code: inputOrCode, detail: legacyDetail ?? inputOrCode }\n : inputOrCode;\n super(input.detail);\n this.name = 'DdcStoreError';\n this.code = input.code;\n this.detail = input.detail;\n this.hint = input.hint ?? defaultHints[input.code];\n this.expected = input.expected ?? defaultExpected(input.code);\n this.actual = input.actual;\n this.owner = input.owner;\n this.rootKind = input.rootKind;\n this.scope = input.scope;\n this.generation = input.generation;\n this.lease = input.lease;\n this.revision = input.revision;\n this.recoveryActions = input.recoveryActions ?? defaultActions(input.code);\n this.hostPath = input.hostPath;\n }\n\n public toBrowserProjection(): DdcBrowserError {\n return {\n code: this.code,\n hint: this.hint,\n expected: this.expected,\n ...(this.actual === undefined ? {} : { actual: this.actual }),\n ...(this.owner === undefined ? {} : { owner: this.owner }),\n ...(this.rootKind === undefined ? {} : { rootKind: this.rootKind }),\n ...(this.scope === undefined ? {} : { scope: this.scope }),\n ...(this.generation === undefined ? {} : { generation: this.generation }),\n ...(this.lease === undefined ? {} : { lease: this.lease }),\n ...(this.revision === undefined ? {} : { revision: this.revision }),\n recoveryActions: this.recoveryActions.map(\n ({ exactTarget: _exactTarget, ...action }) => action,\n ),\n };\n }\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport { mkdir, readdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { DdcStoreError } from './errors.js';\nimport { canonicalDdcJson } from './key.js';\n\nexport { DdcStoreError } from './errors.js';\n\nexport interface DdcArtifact {\n readonly mediaType: string;\n readonly bytes: Uint8Array;\n}\n\nexport interface DdcReceipt {\n readonly guid: string;\n readonly key: string;\n readonly producer: string;\n readonly inputFingerprint: string;\n readonly outputDigest: string;\n}\n\nexport interface DdcEntry {\n readonly key: string;\n readonly guid: string;\n readonly payload: unknown;\n readonly refs: readonly string[];\n readonly artifacts: Readonly<Record<string, DdcArtifact>>;\n readonly receipt: DdcReceipt;\n}\n\nexport interface StagedDdcEntry {\n readonly key: string;\n readonly path: string;\n}\n\nexport interface PublishDdcEntryResult {\n readonly result: 'published' | 'existing' | 'conflict';\n readonly key: string;\n}\n\ninterface ArtifactIntegrity {\n readonly mediaType: string;\n readonly byteLength: number;\n readonly digest: string;\n}\n\ninterface EntryIntegrity {\n readonly payload: string;\n readonly refs: string;\n readonly receipt: string;\n readonly artifacts: Readonly<Record<string, ArtifactIntegrity>>;\n readonly entry: string;\n}\n\nfunction digest(value: string | Uint8Array): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction artifactFile(key: string): string {\n if (/^[A-Za-z0-9._-]+$/.test(key)) return key;\n return Buffer.from(key, 'utf8').toString('base64url');\n}\n\nfunction validateKey(key: string): void {\n if (!/^[a-f0-9]{64}$/.test(key)) {\n throw new DdcStoreError('ddc-entry-invalid', `invalid semantic key: ${key}`);\n }\n}\n\nfunction errorCode(error: unknown): string | undefined {\n if (error !== null && typeof error === 'object' && 'code' in error) {\n const code = (error as { readonly code?: unknown }).code;\n return typeof code === 'string' ? code : undefined;\n }\n return undefined;\n}\n\nfunction sortedArtifacts(entry: DdcEntry): readonly [string, DdcArtifact][] {\n return Object.entries(entry.artifacts).sort(([left], [right]) => left.localeCompare(right));\n}\n\n/** The one output identity shared by receipt validation and DDC publication. */\nexport function ddcOutputDigest(\n entry: Pick<DdcEntry, 'guid' | 'payload' | 'refs' | 'artifacts'>,\n): string {\n return `sha256:${digest(\n canonicalDdcJson({\n guid: entry.guid,\n payload: entry.payload,\n refs: entry.refs,\n artifacts: Object.fromEntries(\n sortedArtifacts(entry as DdcEntry).map(([key, artifact]) => [\n key,\n {\n mediaType: artifact.mediaType,\n bytes: artifact.bytes,\n },\n ]),\n ),\n }),\n )}`;\n}\n\nfunction existingResult(\n existing: DdcEntry,\n candidate: DdcEntry,\n key: string,\n): PublishDdcEntryResult {\n return canonicalDdcJson(existing) === canonicalDdcJson(candidate)\n ? { result: 'existing', key }\n : { result: 'conflict', key };\n}\n\nfunction entryShape(entry: DdcEntry): Record<string, unknown> {\n return {\n key: entry.key,\n guid: entry.guid,\n payload: entry.payload,\n refs: entry.refs,\n receipt: entry.receipt,\n artifacts: Object.fromEntries(\n sortedArtifacts(entry).map(([key, artifact]) => [\n key,\n { mediaType: artifact.mediaType, byteLength: artifact.bytes.byteLength },\n ]),\n ),\n };\n}\n\nfunction integrityFor(entry: DdcEntry): EntryIntegrity {\n const artifacts = Object.fromEntries(\n sortedArtifacts(entry).map(([key, artifact]) => [\n key,\n {\n mediaType: artifact.mediaType,\n byteLength: artifact.bytes.byteLength,\n digest: digest(artifact.bytes),\n },\n ]),\n );\n return {\n payload: digest(canonicalDdcJson(entry.payload)),\n refs: digest(canonicalDdcJson(entry.refs)),\n receipt: digest(canonicalDdcJson(entry.receipt)),\n artifacts,\n entry: digest(canonicalDdcJson(entryShape(entry))),\n };\n}\n\nasync function readJson<T>(path: string): Promise<T> {\n return JSON.parse(await readFile(path, 'utf8')) as T;\n}\n\nexport class DdcEntryStore {\n private readonly entries: string;\n private readonly staging: string;\n\n public constructor(root: string) {\n this.entries = join(root, 'entries');\n this.staging = join(root, 'staging');\n }\n\n public async stage(entry: DdcEntry): Promise<StagedDdcEntry> {\n validateKey(entry.key);\n if (entry.receipt.key !== entry.key || entry.receipt.guid !== entry.guid) {\n throw new DdcStoreError('ddc-entry-invalid', 'receipt identity does not match entry');\n }\n if (entry.receipt.outputDigest !== ddcOutputDigest(entry)) {\n throw new DdcStoreError('ddc-entry-invalid', 'receipt output digest does not match entry');\n }\n const path = join(this.staging, `${entry.key}-${randomUUID()}`);\n try {\n await mkdir(join(path, 'artifacts'), { recursive: true });\n await writeFile(join(path, 'payload.json'), canonicalDdcJson(entry.payload));\n await writeFile(join(path, 'refs.json'), canonicalDdcJson(entry.refs));\n await writeFile(join(path, 'receipt.json'), canonicalDdcJson(entry.receipt));\n const artifacts: Record<string, { mediaType: string; file: string }> = {};\n for (const [key, artifact] of sortedArtifacts(entry)) {\n const file = artifactFile(key);\n artifacts[key] = { mediaType: artifact.mediaType, file };\n await writeFile(join(path, 'artifacts', `${file}.bin`), artifact.bytes);\n }\n await writeFile(join(path, 'artifacts.json'), canonicalDdcJson(artifacts));\n await writeFile(join(path, 'integrity.json'), canonicalDdcJson(integrityFor(entry)));\n return { key: entry.key, path };\n } catch (error) {\n await rm(path, { recursive: true, force: true }).catch(() => {});\n throw error;\n }\n }\n\n public async publish(staged: StagedDdcEntry): Promise<PublishDdcEntryResult> {\n validateKey(staged.key);\n const candidate = await this.readDirectory(staged.path, true);\n const target = join(this.entries, staged.key);\n await mkdir(this.entries, { recursive: true });\n const useExisting = async (): Promise<PublishDdcEntryResult> => {\n const existing = await this.readDirectory(target, false);\n await rm(staged.path, { recursive: true, force: true });\n return existingResult(existing, candidate, staged.key);\n };\n try {\n await stat(target);\n return useExisting();\n } catch (error) {\n if (error instanceof DdcStoreError) throw error;\n if (errorCode(error) !== 'ENOENT') throw error;\n }\n try {\n await rename(staged.path, target);\n return { result: 'published', key: staged.key };\n } catch (error) {\n if (!['EEXIST', 'ENOTEMPTY', 'EISDIR'].includes(errorCode(error) ?? '')) throw error;\n return useExisting();\n }\n }\n\n public async discard(staged: StagedDdcEntry): Promise<void> {\n await rm(staged.path, { recursive: true, force: true });\n }\n\n public async write(entry: DdcEntry): Promise<PublishDdcEntryResult> {\n const staged = await this.stage(entry);\n return this.publish(staged);\n }\n\n public async read(key: string): Promise<DdcEntry | null> {\n try {\n validateKey(key);\n return await this.readDirectory(join(this.entries, key), false);\n } catch {\n return null;\n }\n }\n\n public async listKeys(): Promise<readonly string[]> {\n const entries = await readdir(this.entries, { withFileTypes: true }).catch(() => []);\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort();\n }\n\n public async remove(key: string): Promise<void> {\n validateKey(key);\n await rm(join(this.entries, key), { recursive: true, force: false });\n }\n\n /** Read with a machine-readable corruption result for recovery tooling. */\n public async readChecked(\n key: string,\n ): Promise<\n | { readonly ok: true; readonly value: DdcEntry | null }\n | { readonly ok: false; readonly error: DdcStoreError }\n > {\n try {\n validateKey(key);\n try {\n await stat(join(this.entries, key));\n } catch (error) {\n if (errorCode(error) === 'ENOENT') return { ok: true, value: null };\n throw error;\n }\n try {\n return { ok: true, value: await this.readDirectory(join(this.entries, key), false) };\n } catch (error) {\n if (error instanceof DdcStoreError && error.code === 'ddc-entry-incomplete') {\n return { ok: true, value: null };\n }\n throw error;\n }\n } catch (error) {\n const normalized =\n error instanceof DdcStoreError\n ? error\n : new DdcStoreError('ddc-entry-invalid', 'entry is unreadable');\n return { ok: false, error: normalized };\n }\n }\n\n private async readDirectory(path: string, incompleteIsError: boolean): Promise<DdcEntry> {\n try {\n const payload = await readJson<unknown>(join(path, 'payload.json'));\n const refs = await readJson<readonly string[]>(join(path, 'refs.json'));\n const receipt = await readJson<DdcReceipt>(join(path, 'receipt.json'));\n const manifest = await readJson<\n Readonly<Record<string, { mediaType: string; file: string }>>\n >(join(path, 'artifacts.json'));\n const integrity = await readJson<EntryIntegrity>(join(path, 'integrity.json'));\n const artifacts: Record<string, DdcArtifact> = {};\n for (const [key, descriptor] of Object.entries(manifest).sort(([left], [right]) =>\n left.localeCompare(right),\n )) {\n const bytes = new Uint8Array(\n await readFile(join(path, 'artifacts', `${descriptor.file}.bin`)),\n );\n artifacts[key] = { mediaType: descriptor.mediaType, bytes };\n }\n const entry = { key: receipt.key, guid: receipt.guid, payload, refs, artifacts, receipt };\n if (entry.receipt.outputDigest !== ddcOutputDigest(entry)) {\n throw new DdcStoreError('ddc-entry-invalid', 'receipt output digest does not match entry');\n }\n const actual = integrityFor(entry);\n if (canonicalDdcJson(actual) !== canonicalDdcJson(integrity)) {\n throw new DdcStoreError('ddc-entry-invalid', 'entry integrity mismatch');\n }\n return entry;\n } catch (error) {\n if (incompleteIsError) {\n if (error instanceof DdcStoreError) throw error;\n throw new DdcStoreError('ddc-entry-incomplete', 'staged entry is incomplete');\n }\n if (error instanceof DdcStoreError) throw error;\n throw new DdcStoreError('ddc-entry-invalid', 'entry is unreadable');\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { type DdcEntry, DdcEntryStore } from './entry-store.js';\nimport { DdcStoreError } from './errors.js';\n\nexport type DdcLifecycleState = 'missing' | 'cooking' | 'current' | 'stale' | 'failed';\n\nexport interface DdcLease {\n readonly guid: string;\n readonly desiredKey: string;\n readonly attempt: string;\n readonly generation: number;\n readonly expectedRevision: number;\n readonly instanceId: string;\n readonly expiresAt: number;\n}\n\nexport interface DdcHead {\n readonly guid: string;\n readonly desiredKey: string;\n readonly state: DdcLifecycleState;\n readonly currentKey: string | undefined;\n readonly lastKnownGoodKey: string | undefined;\n readonly revision?: number;\n readonly generation?: number;\n readonly activeLease?: DdcLease;\n readonly failure?: { readonly code: string; readonly detail: string };\n}\n\nexport interface DdcCurrentEntry {\n readonly head: DdcHead;\n readonly entry: DdcEntry | null;\n}\n\nexport interface DdcCommitResult {\n readonly result: 'current' | 'stale' | 'lease-lost' | 'invalid';\n readonly key: string;\n readonly revision?: number;\n /** Internal CAS evidence retained for a later generation rollback. */\n readonly restoreFence?: DdcRestoreFence;\n}\n\nexport interface DdcRestoreFence {\n readonly attempt: string;\n readonly generation: number;\n readonly revision: number;\n readonly desiredKey: string;\n readonly outcome: 'current' | 'invalid' | 'failed';\n readonly key?: string;\n readonly currentKey?: string;\n readonly lastKnownGoodKey?: string;\n readonly failure?: { readonly code: string; readonly detail: string };\n}\n\nexport interface DdcRestoreResult {\n readonly result: 'restored' | 'not-owner';\n readonly revision: number;\n readonly generation?: number;\n}\n\nexport type DdcRollbackSnapshot = Omit<DdcHead, 'activeLease'>;\n\nexport interface DdcBeginResult {\n readonly lease: DdcLease;\n readonly previousHead: DdcRollbackSnapshot;\n}\n\ninterface HeadRecord {\n readonly guid: string;\n readonly desiredKey: string;\n readonly revision: number;\n readonly currentKey?: string;\n readonly lastKnownGoodKey?: string;\n readonly generation?: number;\n readonly active?: DdcLease;\n readonly supersededAttempts?: readonly string[];\n readonly stale?: boolean;\n readonly empty?: boolean;\n readonly failure?: {\n readonly desiredKey: string;\n readonly code: string;\n readonly detail: string;\n };\n}\n\ninterface GenerationRecord {\n readonly schemaVersion: 'forgeax-ddc-generation/v2';\n readonly next: number;\n}\n\nconst LOCK_WAIT_MS = 10;\nconst LOCK_TIMEOUT_MS = 5000;\nconst LEASE_TTL_MS = 30_000;\n\nfunction headFile(heads: string, guid: string): string {\n return join(heads, `${encodeURIComponent(guid)}.json`);\n}\n\nfunction lockFile(root: string, name: string): string {\n return join(root, 'locks', `${encodeURIComponent(name)}.lock`);\n}\n\nfunction withRevision(\n result: Omit<DdcCommitResult, 'revision'>,\n revision: number,\n restoreFence?: DdcRestoreFence,\n): DdcCommitResult {\n const value = { ...result } as DdcCommitResult;\n Object.defineProperty(value, 'revision', { value: revision, enumerable: false });\n if (restoreFence !== undefined) {\n Object.defineProperty(value, 'restoreFence', { value: restoreFence, enumerable: false });\n }\n return value;\n}\n\nasync function delay(ms: number): Promise<void> {\n await new Promise((resolveDelay) => setTimeout(resolveDelay, ms));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nfunction isNonNegativeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0;\n}\n\nfunction isLeaseRecord(value: unknown): value is DdcLease {\n if (!isRecord(value)) return false;\n return (\n isString(value.guid) &&\n isString(value.desiredKey) &&\n isString(value.attempt) &&\n isNonNegativeInteger(value.generation) &&\n isNonNegativeInteger(value.expectedRevision) &&\n isString(value.instanceId) &&\n typeof value.expiresAt === 'number' &&\n Number.isFinite(value.expiresAt)\n );\n}\n\nfunction isHeadRecord(value: unknown): value is HeadRecord {\n if (!isRecord(value)) return false;\n if (\n !isString(value.guid) ||\n !isString(value.desiredKey) ||\n !isNonNegativeInteger(value.revision)\n ) {\n return false;\n }\n if (value.currentKey !== undefined && !isString(value.currentKey)) return false;\n if (value.lastKnownGoodKey !== undefined && !isString(value.lastKnownGoodKey)) return false;\n if (\n value.generation !== undefined &&\n (!isNonNegativeInteger(value.generation) || value.generation === 0)\n ) {\n return false;\n }\n if (value.active !== undefined && !isLeaseRecord(value.active)) return false;\n if (\n value.supersededAttempts !== undefined &&\n (!Array.isArray(value.supersededAttempts) || !value.supersededAttempts.every(isString))\n ) {\n return false;\n }\n if (value.stale !== undefined && typeof value.stale !== 'boolean') return false;\n if (value.empty !== undefined && typeof value.empty !== 'boolean') return false;\n if (value.failure !== undefined) {\n if (!isRecord(value.failure)) return false;\n if (\n !isString(value.failure.desiredKey) ||\n !isString(value.failure.code) ||\n !isString(value.failure.detail)\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction malformedHeadError(\n actual: 'syntax-invalid' | 'schema-invalid' | 'unreadable',\n): DdcStoreError {\n const detail =\n actual === 'syntax-invalid'\n ? 'DDC head JSON is syntactically invalid'\n : actual === 'schema-invalid'\n ? 'DDC head record does not match the lifecycle schema'\n : 'DDC head file is not readable';\n return new DdcStoreError({\n code: 'ddc-head-conflict',\n detail,\n expected: 'a valid DDC head record',\n actual,\n hint: 'inspect the current head and retry with a fresh revision',\n owner: 'engine-ddc',\n rootKind: 'project-ddc',\n recoveryActions: [\n { kind: 'inspect', executable: true },\n { kind: 'retry', executable: true },\n ],\n });\n}\n\n/** Cross-process mkdir lock; a lock owned by a dead PID is reclaimable. */\nexport async function withDdcLock<T>(\n root: string,\n name: string,\n operation: () => Promise<T>,\n): Promise<T> {\n const path = lockFile(root, name);\n await mkdir(join(root, 'locks'), { recursive: true });\n const deadline = Date.now() + LOCK_TIMEOUT_MS;\n while (true) {\n try {\n await mkdir(path);\n await writeFile(\n join(path, 'owner.json'),\n JSON.stringify({ pid: process.pid, acquiredAt: Date.now() }),\n );\n try {\n return await operation();\n } finally {\n await rm(path, { recursive: true, force: true });\n }\n } catch (error) {\n if ((error as { code?: string }).code !== 'EEXIST') throw error;\n let ownerPid: number | undefined;\n try {\n ownerPid = (\n JSON.parse(await readFile(join(path, 'owner.json'), 'utf8')) as { pid?: number }\n ).pid;\n } catch {\n ownerPid = undefined;\n }\n // mkdir() publishes the lock directory before the owner record can be\n // written. Treat that short publication window as an in-flight lock,\n // not as a dead owner: reclaiming it here lets two processes enter the\n // same critical section and loses the superseded-attempt fence.\n if (ownerPid === undefined) {\n if (Date.now() >= deadline) {\n throw new DdcStoreError({\n code: 'ddc-lease-expired',\n detail: `DDC lock ${name} did not publish an owner record`,\n hint: 'inspect the lock owner and retry after the incomplete instance exits',\n expected: 'a lock owner record',\n actual: { path },\n rootKind: 'project-ddc',\n });\n }\n await delay(LOCK_WAIT_MS);\n continue;\n }\n let alive = false;\n try {\n process.kill(ownerPid, 0);\n alive = true;\n } catch {\n alive = false;\n }\n if (!alive) {\n await rm(path, { recursive: true, force: true });\n continue;\n }\n if (Date.now() >= deadline) {\n throw new DdcStoreError({\n code: 'ddc-lease-expired',\n detail: `DDC lock ${name} remained owned by process ${ownerPid}`,\n hint: 'inspect the owner and retry after the stale instance exits',\n expected: 'an available project lock',\n actual: { ownerPid },\n rootKind: 'project-ddc',\n lease: String(ownerPid),\n });\n }\n await delay(LOCK_WAIT_MS);\n }\n }\n}\n\nexport class DdcLifecycle {\n private readonly heads: string;\n private readonly entries: DdcEntryStore;\n private readonly root: string;\n private readonly leaseTtlMs: number;\n\n public constructor(root: string, options?: { readonly leaseTtlMs?: number }) {\n this.root = root;\n this.heads = join(root, 'heads');\n this.entries = new DdcEntryStore(root);\n this.leaseTtlMs = options?.leaseTtlMs ?? LEASE_TTL_MS;\n }\n\n public async inspect(guid: string, desiredKey: string): Promise<DdcHead> {\n const record = await this.read(guid);\n return this.projectHead(guid, desiredKey, record);\n }\n\n /** Read the accepted entry for a GUID without making callers reconstruct head paths. */\n public async readCurrentEntry(guid: string): Promise<DdcCurrentEntry> {\n const record = await this.read(guid);\n const head = await this.projectHead(guid, record?.desiredKey ?? '', record);\n const entry =\n head.currentKey === undefined || head.state !== 'current'\n ? null\n : await this.entries.read(head.currentKey);\n return { head, entry };\n }\n\n /** Begin a lease and capture the accepted rollback snapshot under one head lock. */\n public async beginWithSnapshot(guid: string, desiredKey: string): Promise<DdcBeginResult> {\n return withDdcLock(this.root, `head-${guid}`, async () => {\n const previous = await this.read(guid);\n const previousHead = await this.projectHead(guid, desiredKey, previous, false);\n const generation = await this.allocateGeneration(previous?.generation ?? 0);\n const lease: DdcLease = {\n guid,\n desiredKey,\n attempt: randomUUID(),\n generation,\n expectedRevision: previous?.revision ?? 0,\n instanceId: `${process.pid}:${randomUUID()}`,\n expiresAt: Date.now() + this.leaseTtlMs,\n };\n const lastKnownGoodKey =\n previous?.currentKey !== undefined && previous.currentKey !== desiredKey\n ? previous.currentKey\n : previous?.lastKnownGoodKey;\n const supersededAttempts = [\n ...(previous?.supersededAttempts ?? []),\n ...(previous?.active === undefined ? [] : [previous.active.attempt]),\n ];\n await this.write({\n guid,\n desiredKey,\n revision: previous?.revision ?? 0,\n generation,\n active: lease,\n ...(previous?.currentKey === undefined ? {} : { currentKey: previous.currentKey }),\n ...(supersededAttempts.length === 0 ? {} : { supersededAttempts }),\n ...(lastKnownGoodKey === undefined ? {} : { lastKnownGoodKey }),\n });\n return { lease, previousHead };\n });\n }\n\n public async begin(guid: string, desiredKey: string): Promise<DdcLease> {\n return (await this.beginWithSnapshot(guid, desiredKey)).lease;\n }\n\n public async commit(lease: DdcLease, validatedKey: string): Promise<DdcCommitResult> {\n return withDdcLock(this.root, `head-${lease.guid}`, async () => {\n const current = await this.read(lease.guid);\n const active = current?.active;\n if (current === null || active === undefined || active.attempt !== lease.attempt) {\n if (current?.supersededAttempts?.includes(lease.attempt)) {\n await this.write({ ...current, stale: true });\n return withRevision({ result: 'stale', key: validatedKey }, current.revision);\n }\n return withRevision({ result: 'lease-lost', key: validatedKey }, current?.revision ?? 0);\n }\n // The persisted active lease is the authority. The caller may still hold\n // an older token while a session heartbeat has already refreshed the\n // same attempt in the head.\n if (Date.now() > active.expiresAt) {\n throw new DdcStoreError({\n code: 'ddc-lease-expired',\n detail: 'cook lease expired before commit fencing',\n expected: { attempt: lease.attempt, revision: lease.expectedRevision },\n actual: { revision: current.revision },\n owner: 'engine-ddc',\n rootKind: 'project-ddc',\n generation: lease.generation,\n lease: lease.attempt,\n revision: current.revision,\n });\n }\n if (\n current.revision !== lease.expectedRevision ||\n current.desiredKey !== lease.desiredKey ||\n validatedKey !== lease.desiredKey\n ) {\n await this.write({ ...current, stale: true });\n return withRevision({ result: 'stale', key: validatedKey }, current.revision);\n }\n const entry = await this.entries.read(validatedKey);\n if (entry === null || entry.guid !== lease.guid || entry.receipt.key !== validatedKey) {\n const nextRevision = current.revision + 1;\n const failure = {\n desiredKey: lease.desiredKey,\n code: 'entry-invalid',\n detail: 'validated DDC key has no readable entry for this asset',\n };\n await this.write({\n guid: lease.guid,\n desiredKey: lease.desiredKey,\n revision: nextRevision,\n generation: lease.generation,\n ...(current.lastKnownGoodKey === undefined\n ? {}\n : { lastKnownGoodKey: current.lastKnownGoodKey }),\n ...(current.supersededAttempts === undefined\n ? {}\n : { supersededAttempts: current.supersededAttempts }),\n failure,\n });\n return withRevision({ result: 'invalid', key: validatedKey }, nextRevision, {\n attempt: lease.attempt,\n generation: lease.generation,\n revision: nextRevision,\n desiredKey: lease.desiredKey,\n outcome: 'invalid',\n ...(current.lastKnownGoodKey === undefined\n ? {}\n : { lastKnownGoodKey: current.lastKnownGoodKey }),\n failure: { code: failure.code, detail: failure.detail },\n });\n }\n const lastKnownGoodKey =\n current.currentKey !== undefined && current.currentKey !== validatedKey\n ? current.currentKey\n : current.lastKnownGoodKey;\n const nextRevision = current.revision + 1;\n await this.write({\n guid: lease.guid,\n desiredKey: lease.desiredKey,\n revision: nextRevision,\n generation: lease.generation,\n currentKey: validatedKey,\n stale: false,\n ...(current.supersededAttempts === undefined\n ? {}\n : { supersededAttempts: current.supersededAttempts }),\n ...(lastKnownGoodKey === undefined ? {} : { lastKnownGoodKey }),\n });\n return withRevision({ result: 'current', key: validatedKey }, nextRevision, {\n attempt: lease.attempt,\n generation: lease.generation,\n revision: nextRevision,\n desiredKey: lease.desiredKey,\n outcome: 'current',\n key: validatedKey,\n currentKey: validatedKey,\n ...(lastKnownGoodKey === undefined ? {} : { lastKnownGoodKey }),\n });\n });\n }\n\n public async fail(\n lease: DdcLease,\n failure: { readonly code: string; readonly detail: string },\n ): Promise<DdcRestoreFence | undefined> {\n return withDdcLock(this.root, `head-${lease.guid}`, async () => {\n const current = await this.read(lease.guid);\n if (current?.active?.attempt !== lease.attempt) return;\n const nextRevision = current.revision + 1;\n await this.write({\n guid: lease.guid,\n desiredKey: lease.desiredKey,\n revision: nextRevision,\n generation: lease.generation,\n ...(current.currentKey === undefined ? {} : { currentKey: current.currentKey }),\n ...(current.lastKnownGoodKey === undefined\n ? {}\n : { lastKnownGoodKey: current.lastKnownGoodKey }),\n ...(current.supersededAttempts === undefined\n ? {}\n : { supersededAttempts: current.supersededAttempts }),\n failure: { desiredKey: lease.desiredKey, ...failure },\n });\n return {\n attempt: lease.attempt,\n generation: lease.generation,\n revision: nextRevision,\n desiredKey: lease.desiredKey,\n outcome: 'failed' as const,\n ...(current.currentKey === undefined ? {} : { currentKey: current.currentKey }),\n ...(current.lastKnownGoodKey === undefined\n ? {}\n : { lastKnownGoodKey: current.lastKnownGoodKey }),\n failure,\n };\n });\n }\n\n public async heartbeat(lease: DdcLease): Promise<DdcLease> {\n return withDdcLock(this.root, `head-${lease.guid}`, async () => {\n const current = await this.read(lease.guid);\n if (current?.active?.attempt !== lease.attempt) {\n throw new DdcStoreError({\n code: 'ddc-lease-expired',\n detail: 'heartbeat belongs to a stale lease',\n expected: lease.attempt,\n actual: current?.active?.attempt,\n lease: lease.attempt,\n generation: lease.generation,\n rootKind: 'project-ddc',\n });\n }\n const refreshed = { ...lease, expiresAt: Date.now() + this.leaseTtlMs };\n await this.write({ ...current, active: refreshed });\n return refreshed;\n });\n }\n\n public async close(lease: DdcLease): Promise<void> {\n await withDdcLock(this.root, `head-${lease.guid}`, async () => {\n const current = await this.read(lease.guid);\n if (current?.active?.instanceId !== lease.instanceId) return;\n const { active: _active, ...withoutActive } = current;\n await this.write({\n ...withoutActive,\n revision: current.revision + 1,\n stale: current.currentKey === undefined,\n });\n });\n }\n\n public async discard(lease: DdcLease): Promise<void> {\n await withDdcLock(this.root, `head-${lease.guid}`, async () => {\n const current = await this.read(lease.guid);\n if (current?.active?.attempt !== lease.attempt) return;\n const { active: _active, ...withoutActive } = current;\n await this.write({\n ...withoutActive,\n revision: current.revision + 1,\n generation: lease.generation,\n stale: current.currentKey === undefined,\n });\n });\n }\n\n /**\n * Restore accepted content only when this lease still owns the mutable head.\n * A newer active or terminal mutation makes rollback a deliberate no-op.\n */\n public async restore(\n head: DdcHead | DdcRollbackSnapshot,\n lease?: DdcLease,\n fence?: DdcRestoreFence,\n ): Promise<DdcRestoreResult> {\n const inferredLease =\n lease ??\n ('activeLease' in head && head.activeLease !== undefined ? head.activeLease : undefined);\n if (inferredLease === undefined) {\n return {\n result: 'not-owner',\n revision: head.revision ?? 0,\n ...(head.generation === undefined ? {} : { generation: head.generation }),\n };\n }\n const snapshot = this.rollbackSnapshot(head);\n return this.restoreIfCurrent(snapshot, inferredLease, fence);\n }\n\n public async restoreIfCurrent(\n snapshot: DdcRollbackSnapshot,\n lease: DdcLease,\n fence?: DdcRestoreFence,\n ): Promise<DdcRestoreResult> {\n return withDdcLock(this.root, `head-${lease.guid}`, async () => {\n const current = await this.read(lease.guid);\n if (current === null || current.guid !== snapshot.guid) {\n return {\n result: 'not-owner',\n revision: current?.revision ?? 0,\n ...(current?.generation === undefined ? {} : { generation: current.generation }),\n };\n }\n const ownsActive =\n current.active?.attempt === lease.attempt &&\n current.active.generation === lease.generation &&\n current.active.desiredKey === lease.desiredKey;\n const ownsTerminal = fence !== undefined && this.matchesRestoreFence(current, lease, fence);\n if (!ownsActive && !ownsTerminal) {\n return {\n result: 'not-owner',\n revision: current.revision,\n ...(current.generation === undefined ? {} : { generation: current.generation }),\n };\n }\n\n const nextRevision = current.revision + 1;\n const generation = Math.max(\n current.generation ?? 0,\n lease.generation,\n snapshot.generation ?? 0,\n );\n const supersededAttempts = current.supersededAttempts;\n const restored: HeadRecord = {\n guid: snapshot.guid,\n desiredKey: snapshot.desiredKey,\n revision: nextRevision,\n generation,\n ...(snapshot.currentKey === undefined ? {} : { currentKey: snapshot.currentKey }),\n ...(snapshot.lastKnownGoodKey === undefined\n ? {}\n : { lastKnownGoodKey: snapshot.lastKnownGoodKey }),\n ...(supersededAttempts === undefined ? {} : { supersededAttempts }),\n ...(snapshot.state === 'missing' ? { empty: true } : {}),\n ...(snapshot.state === 'stale' ? { stale: true } : {}),\n ...(snapshot.failure === undefined\n ? {}\n : { failure: { desiredKey: snapshot.desiredKey, ...snapshot.failure } }),\n };\n await this.write(restored);\n return { result: 'restored', revision: nextRevision, generation };\n });\n }\n\n public async revoke(lease: DdcLease): Promise<void> {\n await this.fail(lease, {\n code: 'lease-lost',\n detail: 'cook lease was revoked before validation',\n });\n }\n\n public async recover(guid: string, desiredKey: string): Promise<DdcHead> {\n return withDdcLock(this.root, `head-${guid}`, async () => {\n const current = await this.read(guid);\n if (current?.active?.desiredKey === desiredKey) {\n await this.write({\n guid,\n desiredKey,\n revision: current.revision + 1,\n ...(current.generation === undefined ? {} : { generation: current.generation }),\n ...(current.supersededAttempts === undefined\n ? {}\n : { supersededAttempts: current.supersededAttempts }),\n ...(current.lastKnownGoodKey === undefined\n ? {}\n : { lastKnownGoodKey: current.lastKnownGoodKey }),\n failure: {\n desiredKey,\n code: 'writer-crashed',\n detail: 'active cook attempt was recovered after process interruption',\n },\n });\n }\n return this.inspect(guid, desiredKey);\n });\n }\n\n private rollbackSnapshot(head: DdcHead | DdcRollbackSnapshot): DdcRollbackSnapshot {\n const { activeLease: _activeLease, ...snapshot } = head as DdcHead;\n if (snapshot.state !== 'cooking') return snapshot;\n return {\n ...snapshot,\n state: snapshot.currentKey === undefined ? 'missing' : 'stale',\n };\n }\n\n private matchesRestoreFence(\n current: HeadRecord,\n lease: DdcLease,\n fence: DdcRestoreFence,\n ): boolean {\n if (\n fence.attempt !== lease.attempt ||\n fence.generation !== lease.generation ||\n current.active !== undefined ||\n current.revision !== fence.revision ||\n current.generation !== fence.generation ||\n current.desiredKey !== fence.desiredKey ||\n current.currentKey !== fence.currentKey ||\n current.lastKnownGoodKey !== fence.lastKnownGoodKey\n ) {\n return false;\n }\n if (fence.outcome === 'current') {\n return (\n fence.key !== undefined &&\n current.currentKey === fence.key &&\n current.failure === undefined &&\n current.stale !== true\n );\n }\n if (\n fence.failure === undefined ||\n current.failure === undefined ||\n current.failure.desiredKey !== fence.desiredKey ||\n current.failure.code !== fence.failure.code ||\n current.failure.detail !== fence.failure.detail\n ) {\n return false;\n }\n return fence.outcome === 'invalid' ? fence.currentKey === undefined : true;\n }\n\n private async projectHead(\n guid: string,\n desiredKey: string,\n record: HeadRecord | null,\n includeActive = true,\n ): Promise<DdcHead> {\n if (record === null) {\n return {\n guid,\n desiredKey,\n state: 'missing',\n currentKey: undefined,\n lastKnownGoodKey: undefined,\n revision: 0,\n };\n }\n const recordedFailure =\n record.failure?.desiredKey === desiredKey\n ? { code: record.failure.code, detail: record.failure.detail }\n : undefined;\n const currentEntry =\n record.currentKey === undefined ? null : await this.entries.readChecked(record.currentKey);\n const entryFailure =\n currentEntry !== null && !currentEntry.ok\n ? { code: currentEntry.error.code, detail: currentEntry.error.detail }\n : undefined;\n const failure = recordedFailure ?? entryFailure;\n const currentValue = currentEntry?.ok === true ? currentEntry.value : null;\n const state: DdcLifecycleState =\n failure !== undefined\n ? 'failed'\n : record.currentKey === desiredKey && currentValue?.guid === guid\n ? 'current'\n : record.stale === true\n ? 'stale'\n : includeActive && record.active?.desiredKey === desiredKey\n ? 'cooking'\n : record.empty === true\n ? 'missing'\n : 'stale';\n return {\n guid,\n desiredKey,\n state,\n currentKey: record.currentKey,\n lastKnownGoodKey: record.lastKnownGoodKey,\n revision: record.revision,\n ...(record.generation === undefined ? {} : { generation: record.generation }),\n ...(includeActive && record.active === undefined\n ? {}\n : includeActive && record.active !== undefined\n ? { activeLease: record.active }\n : {}),\n ...(failure === undefined ? {} : { failure }),\n };\n }\n\n private async allocateGeneration(minimumExclusive = 0): Promise<number> {\n return withDdcLock(this.root, 'generation-counter', async () => {\n const path = join(this.root, 'generations', 'counter.json');\n await mkdir(join(this.root, 'generations'), { recursive: true });\n let next = 1;\n try {\n const record = JSON.parse(await readFile(path, 'utf8')) as GenerationRecord;\n if (\n record.schemaVersion === 'forgeax-ddc-generation/v2' &&\n Number.isSafeInteger(record.next) &&\n record.next >= 1\n )\n next = Math.max(1, record.next);\n } catch {\n // A missing counter is the first allocation, not an implicit legacy fallback.\n }\n const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`;\n next = Math.max(next, minimumExclusive + 1);\n await writeFile(\n temporary,\n JSON.stringify({ schemaVersion: 'forgeax-ddc-generation/v2', next: next + 1 }),\n );\n await rename(temporary, path);\n return next;\n });\n }\n\n private async read(guid: string): Promise<HeadRecord | null> {\n const path = headFile(this.heads, guid);\n let source: string;\n try {\n source = await readFile(path, 'utf8');\n } catch (error) {\n if (\n error !== null &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { readonly code?: unknown }).code === 'ENOENT'\n ) {\n return null;\n }\n throw malformedHeadError('unreadable');\n }\n let value: unknown;\n try {\n value = JSON.parse(source);\n } catch {\n throw malformedHeadError('syntax-invalid');\n }\n if (!isHeadRecord(value) || value.guid !== guid) throw malformedHeadError('schema-invalid');\n return value;\n }\n\n private async write(record: HeadRecord): Promise<void> {\n await mkdir(this.heads, { recursive: true });\n const path = headFile(this.heads, record.guid);\n const temporary = `${path}.${randomUUID()}.tmp`;\n await writeFile(temporary, JSON.stringify(record));\n await rename(temporary, path);\n }\n}\n","import { readdir, rm } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { withDdcLock } from './lifecycle.js';\n\nexport interface DdcGcInput {\n readonly currentKeys: readonly string[];\n readonly lastKnownGoodKeys: readonly string[];\n readonly activeLeaseKeys: readonly string[];\n readonly scopeIds?: readonly string[];\n}\n\nexport interface DdcGcResult {\n readonly deleted: readonly string[];\n readonly protected: readonly string[];\n}\n\n/** Mark current/LKG/lease roots, then sweep only the same project root. */\nexport async function collectDdcGarbage(root: string, input: DdcGcInput): Promise<DdcGcResult> {\n return withDdcLock(root, 'gc', async () => {\n const protectedKeys = new Set([\n ...input.currentKeys,\n ...input.lastKnownGoodKeys,\n ...input.activeLeaseKeys,\n ]);\n const entries = await readdir(join(root, 'entries'), { withFileTypes: true }).catch(() => []);\n const deleted: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory() || protectedKeys.has(entry.name)) continue;\n await rm(join(root, 'entries', entry.name), { recursive: true, force: false });\n deleted.push(entry.name);\n }\n return { deleted, protected: [...protectedKeys].sort() };\n });\n}\n","import { isAbsolute, normalize } from 'node:path';\n\nexport const DDC_LAYOUT_VERSION = 'v2' as const;\n\nexport interface DdcBuildOptions {\n readonly buildCacheRoot: string;\n}\n\nexport interface DdcServeOptions extends DdcBuildOptions {\n readonly projectDdcRoot?: string;\n}\n\nexport interface DdcBuildLayout {\n readonly objects: string;\n readonly staging: string;\n}\n\nexport interface DdcProjectLayout {\n readonly root: string;\n readonly scope: string;\n readonly heads: string;\n readonly generations: string;\n readonly leases: string;\n readonly staging: string;\n}\n\nexport interface DdcLayout {\n readonly version: typeof DDC_LAYOUT_VERSION;\n readonly buildCacheRoot: string;\n readonly projectDdcRoot: string;\n readonly build: DdcBuildLayout;\n readonly project: DdcProjectLayout;\n}\n\nexport interface DdcBuildLayoutResult {\n readonly ok: true;\n readonly value: DdcBuildLayout;\n}\n\nexport interface DdcLayoutError {\n readonly code: 'ddc-project-root-required' | 'ddc-root-absolute-required';\n readonly detail: string;\n readonly hint: string;\n readonly expected: string;\n readonly actual?: string;\n}\n\nexport interface DdcLayoutResult {\n readonly ok: true;\n readonly value: DdcLayout;\n}\n\nexport interface DdcLayoutFailure {\n readonly ok: false;\n readonly error: DdcLayoutError;\n}\n\ntype ClosedLayoutResult = DdcLayoutResult | DdcLayoutFailure;\n\nfunction rootOrError(root: string, name: string): string | DdcLayoutError {\n if (!isAbsolute(root)) {\n return {\n code: 'ddc-root-absolute-required',\n detail: `${name} must be an absolute injected path`,\n hint: `inject the canonical ${name} from the host root policy`,\n expected: 'an absolute filesystem path',\n actual: root,\n };\n }\n const normalized = normalize(root);\n return normalized.replace(/[\\\\/]+$/, '') || normalized;\n}\n\nfunction buildLayout(root: string): DdcBuildLayout {\n return { objects: `${root}/objects`, staging: `${root}/staging` };\n}\n\nfunction projectLayout(root: string): DdcProjectLayout {\n return {\n root,\n scope: `${root}/scope.json`,\n heads: `${root}/heads`,\n generations: `${root}/generations`,\n leases: `${root}/leases`,\n staging: `${root}/staging`,\n };\n}\n\nexport function resolveBuildDdcLayout(\n options: DdcBuildOptions,\n): DdcBuildLayoutResult | DdcLayoutFailure {\n const root = rootOrError(options.buildCacheRoot, 'buildCacheRoot');\n return typeof root === 'string'\n ? { ok: true, value: buildLayout(root) }\n : { ok: false, error: root };\n}\n\nexport function resolveDdcLayout(options: DdcServeOptions): ClosedLayoutResult {\n const buildRoot = rootOrError(options.buildCacheRoot, 'buildCacheRoot');\n if (typeof buildRoot !== 'string') return { ok: false, error: buildRoot };\n if (options.projectDdcRoot === undefined || options.projectDdcRoot.trim().length === 0) {\n return {\n ok: false,\n error: {\n code: 'ddc-project-root-required',\n detail: 'serve and publication require an explicitly injected projectDdcRoot',\n hint: 'canonicalize the game directory in the host and inject its .forgeax/ddc/v2 root',\n expected: 'projectDdcRoot',\n },\n };\n }\n const projectRoot = rootOrError(options.projectDdcRoot, 'projectDdcRoot');\n if (typeof projectRoot !== 'string') return { ok: false, error: projectRoot };\n return {\n ok: true,\n value: {\n version: DDC_LAYOUT_VERSION,\n buildCacheRoot: buildRoot,\n projectDdcRoot: projectRoot,\n build: buildLayout(buildRoot),\n project: projectLayout(projectRoot),\n },\n };\n}\n\nexport function isDdcLayout(value: unknown): value is DdcLayout {\n return (\n value !== null &&\n typeof value === 'object' &&\n (value as { readonly version?: unknown }).version === DDC_LAYOUT_VERSION\n );\n}\n","import { createHash } from 'node:crypto';\nimport type {\n AssetPublicationEnvelope,\n AssetPublicationExternalEvidence,\n AssetPublicationFailure,\n AssetPublicationLocator,\n AssetPublicationOutput,\n AssetPublicationRecovery,\n Result,\n} from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\n\nexport interface ScriptablePackPublicationSnapshot {\n readonly current?: AssetPublicationEnvelope;\n readonly lastKnownGood?: AssetPublicationEnvelope;\n readonly failure?: AssetPublicationFailure;\n}\n\nexport interface ScriptablePackPublicationError extends AssetPublicationFailure {\n readonly recovery: AssetPublicationRecovery;\n readonly current?: AssetPublicationLocator;\n readonly lastKnownGood?: AssetPublicationLocator;\n}\n\nexport interface AcceptedPublicationCandidate {\n readonly envelope: AssetPublicationEnvelope;\n readonly cancelled?: boolean;\n}\n\nexport interface ScriptablePackPublicationBuildInput {\n readonly sourcePath: string;\n readonly sourceRevision: string;\n /** Optional caller generation; the DDC owner derives one when omitted. */\n readonly generation?: number;\n readonly digest: string;\n readonly packageUrl: string;\n readonly inputFingerprint: string;\n readonly outputs: readonly AssetPublicationOutput[];\n readonly externalEvidence: readonly AssetPublicationExternalEvidence[];\n}\n\n/**\n * DDC-owned publication authority for source keyed producers. Transport\n * adapters may stage bytes, but they do not retain current/LKG or generation\n * state themselves.\n */\nexport interface AcceptedPublicationStore {\n observe(sourcePath: string): ScriptablePackPublicationSnapshot;\n stage(\n sourcePath: string,\n candidate: AcceptedPublicationCandidate,\n ): Result<void, ScriptablePackPublicationError>;\n commit(\n sourcePath: string,\n candidate: AcceptedPublicationCandidate,\n commitRoute: () => Promise<void> | void,\n ): Promise<Result<ScriptablePackPublicationSnapshot, ScriptablePackPublicationError>>;\n discard(sourcePath: string, candidate: AssetPublicationEnvelope): void;\n restore(sourcePath: string, snapshot: ScriptablePackPublicationSnapshot): void;\n}\n\nfunction stable(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stable).join(',')}]`;\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n return `{${Object.keys(record)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stable(record[key])}`)\n .join(',')}}`;\n }\n return JSON.stringify(value) ?? 'null';\n}\n\nfunction digest(value: unknown): string {\n return `sha256:${createHash('sha256').update(stable(value)).digest('hex')}`;\n}\n\nexport function scriptablePackOutputSetDigest(outputs: readonly AssetPublicationOutput[]): string {\n return digest(\n outputs.map((output) => ({\n guid: output.guid.toLowerCase(),\n sourceKey: output.sourceKey,\n kind: output.kind,\n digest: output.digest,\n refs: [...output.refs].map((guid) => guid.toLowerCase()),\n })),\n );\n}\n\n/** Derive a stable positive generation from the accepted publication tuple. */\nexport function scriptablePackPublicationGeneration(input: {\n readonly sourceRevision: string;\n readonly digest: string;\n readonly outputSetDigest: string;\n}): number {\n const hash = createHash('sha256')\n .update(input.sourceRevision)\n .update('\\n')\n .update(input.digest)\n .update('\\n')\n .update(input.outputSetDigest)\n .digest('hex');\n const generation = Number.parseInt(hash.slice(0, 8), 16);\n return generation > 0 ? generation : 1;\n}\n\n/** Build the complete producer-owned tuple after the package route is finalized. */\nexport function createAcceptedPublication(\n input: ScriptablePackPublicationBuildInput,\n): AssetPublicationEnvelope {\n const outputSetDigest = scriptablePackOutputSetDigest(input.outputs);\n const publicationGeneration =\n input.generation ??\n scriptablePackPublicationGeneration({\n sourceRevision: input.sourceRevision,\n digest: input.digest,\n outputSetDigest,\n });\n return {\n schemaVersion: 'asset-publication/1',\n sourcePath: input.sourcePath,\n sourceRevision: input.sourceRevision,\n generation: publicationGeneration,\n digest: input.digest,\n outputSetDigest,\n outputs: input.outputs,\n receipt: {\n schemaVersion: 'asset-publication-receipt/1',\n sourcePath: input.sourcePath,\n sourceRevision: input.sourceRevision,\n inputFingerprint: input.inputFingerprint,\n outputDigest: input.digest,\n outputSetDigest,\n externalEvidence: input.externalEvidence,\n },\n externalEvidence: input.externalEvidence,\n current: {\n generation: publicationGeneration,\n digest: input.digest,\n outputSetDigest,\n packageUrl: input.packageUrl,\n receiptKey: input.inputFingerprint,\n },\n };\n}\n\nfunction locatorFor(envelope: AssetPublicationEnvelope): AssetPublicationLocator {\n return {\n generation: envelope.generation,\n digest: envelope.digest,\n outputSetDigest: envelope.outputSetDigest,\n packageUrl: envelope.current?.packageUrl ?? '',\n receiptKey: envelope.receipt.inputFingerprint,\n };\n}\n\nfunction recoveryFor(retryable: boolean, useLastKnownGood: boolean): AssetPublicationRecovery {\n return {\n retryable,\n preserveCurrent: true,\n useLastKnownGood,\n actions: retryable\n ? ['inspect-publication-failure', 'retry-rebuild', 'continue-last-known-good']\n : ['inspect-publication-failure', 'edit-source', 'continue-last-known-good'],\n };\n}\n\nfunction failure(\n envelope: AssetPublicationEnvelope,\n code: string,\n stage: AssetPublicationFailure['stage'],\n reason: string,\n retryable: boolean,\n current: AssetPublicationEnvelope | undefined,\n lastKnownGood: AssetPublicationEnvelope | undefined,\n): ScriptablePackPublicationError {\n return {\n code,\n stage,\n sourcePath: envelope.sourcePath,\n sourceRevision: envelope.sourceRevision,\n generation: envelope.generation,\n reason,\n recovery: recoveryFor(retryable, lastKnownGood !== undefined),\n ...(current === undefined ? {} : { current: locatorFor(current) }),\n ...(lastKnownGood === undefined ? {} : { lastKnownGood: locatorFor(lastKnownGood) }),\n };\n}\n\nfunction validateOutputs(\n envelope: AssetPublicationEnvelope,\n current: AssetPublicationEnvelope | undefined,\n lastKnownGood: AssetPublicationEnvelope | undefined,\n): ScriptablePackPublicationError | undefined {\n const guids = new Set<string>();\n const sourceKeys = new Set<string>();\n for (const output of envelope.outputs) {\n const guid = output.guid.toLowerCase();\n if (guids.has(guid) || sourceKeys.has(output.sourceKey)) {\n return failure(\n envelope,\n 'asset-publication-output-duplicate',\n 'output',\n 'publication output GUIDs and sourceKeys must be unique',\n false,\n current,\n lastKnownGood,\n );\n }\n guids.add(guid);\n sourceKeys.add(output.sourceKey);\n }\n if (\n envelope.outputs.length === 0 ||\n scriptablePackOutputSetDigest(envelope.outputs) !== envelope.outputSetDigest\n ) {\n return failure(\n envelope,\n 'asset-publication-output-set-mismatch',\n 'receipt',\n 'receipt outputSetDigest does not match the complete output tuple',\n false,\n current,\n lastKnownGood,\n );\n }\n return undefined;\n}\n\nfunction validateReceipt(\n envelope: AssetPublicationEnvelope,\n current: AssetPublicationEnvelope | undefined,\n lastKnownGood: AssetPublicationEnvelope | undefined,\n): ScriptablePackPublicationError | undefined {\n const receipt = envelope.receipt;\n if (\n receipt.schemaVersion !== 'asset-publication-receipt/1' ||\n receipt.sourcePath !== envelope.sourcePath ||\n receipt.sourceRevision !== envelope.sourceRevision ||\n receipt.outputSetDigest !== envelope.outputSetDigest ||\n receipt.outputDigest !== envelope.digest ||\n stable(receipt.externalEvidence) !== stable(envelope.externalEvidence)\n ) {\n return failure(\n envelope,\n 'asset-publication-receipt-mismatch',\n 'receipt',\n 'publication receipt does not match the candidate output tuple',\n false,\n current,\n lastKnownGood,\n );\n }\n return undefined;\n}\n\nfunction validateEnvelope(\n envelope: AssetPublicationEnvelope,\n current: AssetPublicationEnvelope | undefined,\n lastKnownGood: AssetPublicationEnvelope | undefined,\n): ScriptablePackPublicationError | undefined {\n if (envelope.schemaVersion !== 'asset-publication/1') {\n return failure(\n envelope,\n 'asset-publication-schema-invalid',\n 'receipt',\n 'publication envelope schemaVersion is not supported',\n false,\n current,\n lastKnownGood,\n );\n }\n if (!Number.isSafeInteger(envelope.generation) || envelope.generation < 1) {\n return failure(\n envelope,\n 'asset-publication-generation-invalid',\n 'receipt',\n 'publication generation must be a positive integer',\n false,\n current,\n lastKnownGood,\n );\n }\n const outputError = validateOutputs(envelope, current, lastKnownGood);\n if (outputError !== undefined) return outputError;\n const receiptError = validateReceipt(envelope, current, lastKnownGood);\n if (receiptError !== undefined) return receiptError;\n // Re-running a deterministic producer (for example a cold cook after a\n // rebuild) can yield the exact same publication tuple. That is an\n // idempotent request, not a late result: rejecting it here makes the\n // editor's retry/cold-cook operation fail even though the published asset is\n // already the requested content. A same-generation tuple with any changed\n // source/digest/output-set fact remains stale and is rejected below.\n const sameTuple =\n current !== undefined &&\n envelope.generation === current.generation &&\n envelope.sourcePath === current.sourcePath &&\n envelope.sourceRevision === current.sourceRevision &&\n envelope.digest === current.digest &&\n envelope.outputSetDigest === current.outputSetDigest;\n if (sameTuple) return undefined;\n if (current !== undefined && envelope.generation <= current.generation) {\n return failure(\n envelope,\n 'asset-publication-stale',\n 'cancelled',\n `candidate generation ${envelope.generation} is not newer than current ${current.generation}`,\n true,\n current,\n lastKnownGood,\n );\n }\n return undefined;\n}\n\ninterface PublicationState {\n snapshot: ScriptablePackPublicationSnapshot;\n /**\n * Staged candidates are owned by their envelope object, not by the\n * publication tuple. Two overlapping generations can legitimately produce\n * the same deterministic tuple; a stale owner's discard must not remove the\n * current owner's candidate before commit.\n */\n readonly staged: Set<AssetPublicationEnvelope>;\n}\n\nfunction validateCandidate(\n state: PublicationState,\n candidate: AcceptedPublicationCandidate,\n cancelledReason: string,\n): ScriptablePackPublicationError | undefined {\n const current = state.snapshot.current;\n const lastKnownGood = state.snapshot.lastKnownGood ?? current;\n if (candidate.cancelled === true) {\n return failure(\n candidate.envelope,\n 'asset-publication-cancelled',\n 'cancelled',\n cancelledReason,\n true,\n current,\n lastKnownGood,\n );\n }\n return validateEnvelope(candidate.envelope, current, lastKnownGood);\n}\n\nasync function publishCandidate(\n state: PublicationState,\n candidate: AcceptedPublicationCandidate,\n commitRoute: () => Promise<void> | void,\n): Promise<Result<ScriptablePackPublicationSnapshot, ScriptablePackPublicationError>> {\n const current = state.snapshot.current;\n const lastKnownGood = state.snapshot.lastKnownGood ?? current;\n const invalid = validateCandidate(\n state,\n candidate,\n 'publication request was cancelled before route commit',\n );\n if (invalid !== undefined) {\n state.snapshot = { ...state.snapshot, failure: invalid };\n return err(invalid);\n }\n try {\n await commitRoute();\n } catch (error) {\n const failed = failure(\n candidate.envelope,\n 'asset-publication-route-failed',\n 'route',\n error instanceof Error ? error.message : String(error),\n true,\n current,\n lastKnownGood,\n );\n state.snapshot = { ...state.snapshot, failure: failed };\n return err(failed);\n }\n const published = {\n ...candidate.envelope,\n current: locatorFor(candidate.envelope),\n ...(current === undefined ? {} : { lastKnownGood: locatorFor(current) }),\n recovery: recoveryFor(false, current !== undefined),\n };\n state.snapshot = {\n current: published,\n ...(current === undefined ? {} : { lastKnownGood: current }),\n };\n return ok(state.snapshot);\n}\n\n/** Create the one DDC publication authority shared by dev attempts. */\nexport function createAcceptedPublicationStore(): AcceptedPublicationStore {\n const states = new Map<string, PublicationState>();\n function stateFor(sourcePath: string): PublicationState {\n const existing = states.get(sourcePath);\n if (existing !== undefined) return existing;\n const created: PublicationState = { snapshot: {}, staged: new Set() };\n states.set(sourcePath, created);\n return created;\n }\n return {\n observe(sourcePath) {\n return stateFor(sourcePath).snapshot;\n },\n stage(sourcePath, candidate) {\n const invalid = validateCandidate(\n stateFor(sourcePath),\n candidate,\n 'publication request was cancelled before DDC commit',\n );\n if (invalid !== undefined) return err(invalid);\n stateFor(sourcePath).staged.add(candidate.envelope);\n return ok(undefined);\n },\n async commit(sourcePath, candidate, commitRoute) {\n const state = stateFor(sourcePath);\n if (!state.staged.has(candidate.envelope)) {\n const current = state.snapshot.current;\n const lastKnownGood = state.snapshot.lastKnownGood ?? current;\n return err(\n failure(\n candidate.envelope,\n 'asset-publication-cancelled',\n 'cancelled',\n 'publication candidate was discarded before DDC commit',\n true,\n current,\n lastKnownGood,\n ),\n );\n }\n const result = await publishCandidate(state, candidate, commitRoute);\n state.staged.delete(candidate.envelope);\n return result;\n },\n discard(sourcePath, candidate) {\n stateFor(sourcePath).staged.delete(candidate);\n },\n restore(sourcePath, snapshot) {\n const state = stateFor(sourcePath);\n state.staged.clear();\n state.snapshot = snapshot;\n },\n };\n}\n","import { createHash } from 'node:crypto';\nimport { mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { DdcStoreError } from './errors.js';\n\nexport interface DdcRuntimeScope {\n readonly scopeId: string;\n readonly scopeHash: string;\n readonly root: string;\n readonly metadataPath: string;\n}\n\ninterface ScopeMetadata {\n readonly schemaVersion: 'forgeax-ddc-scope/v2';\n readonly scopeId: string;\n readonly scopeHash: string;\n}\n\nfunction scopeHash(scopeId: string): string {\n return createHash('sha256').update(scopeId, 'utf8').digest('hex');\n}\n\nexport function runtimeScopeHash(scopeId: string): string {\n return scopeHash(scopeId);\n}\n\nexport async function createRuntimeScope(root: string, scopeId: string): Promise<DdcRuntimeScope> {\n if (scopeId.length === 0) {\n throw new DdcStoreError({\n code: 'ddc-scope-mismatch',\n detail: 'runtime scope id must not be empty',\n expected: 'a non-empty original scope id',\n actual: scopeId,\n rootKind: 'project-ddc',\n });\n }\n const hash = scopeHash(scopeId);\n const scopeRoot = join(root, 'scopes', hash);\n const metadataPath = join(scopeRoot, 'scope.json');\n await mkdir(scopeRoot, { recursive: true });\n const expected: ScopeMetadata = {\n schemaVersion: 'forgeax-ddc-scope/v2',\n scopeId,\n scopeHash: hash,\n };\n try {\n const actual = JSON.parse(await readFile(metadataPath, 'utf8')) as Partial<ScopeMetadata>;\n if (\n actual.schemaVersion !== expected.schemaVersion ||\n actual.scopeId !== expected.scopeId ||\n actual.scopeHash !== expected.scopeHash\n ) {\n throw new DdcStoreError({\n code: 'ddc-scope-mismatch',\n detail: 'runtime scope metadata does not match the requested scope',\n expected,\n actual,\n rootKind: 'project-ddc',\n scope: scopeId,\n });\n }\n } catch (error) {\n if (error instanceof DdcStoreError) throw error;\n const temporary = `${metadataPath}.${process.pid}.tmp`;\n await writeFile(temporary, JSON.stringify(expected));\n await rename(temporary, metadataPath);\n }\n return { scopeId, scopeHash: hash, root: scopeRoot, metadataPath };\n}\n\nexport async function assertRuntimeScope(\n root: string,\n scope: Pick<DdcRuntimeScope, 'scopeId' | 'scopeHash'>,\n): Promise<DdcRuntimeScope> {\n const expectedHash = scopeHash(scope.scopeId);\n if (scope.scopeHash !== expectedHash) {\n throw new DdcStoreError({\n code: 'ddc-scope-mismatch',\n detail: 'runtime scope hash does not match the original scope id',\n expected: expectedHash,\n actual: scope.scopeHash,\n rootKind: 'project-ddc',\n scope: scope.scopeId,\n });\n }\n return createRuntimeScope(root, scope.scopeId);\n}\n","import { type DdcEntry, DdcEntryStore, DdcStoreError, type StagedDdcEntry } from './entry-store.js';\nimport type {\n DdcCommitResult,\n DdcHead,\n DdcLease,\n DdcRestoreFence,\n DdcRestoreResult,\n DdcRollbackSnapshot,\n} from './lifecycle.js';\nimport { DdcLifecycle } from './lifecycle.js';\n\nexport interface DdcSessionOptions {\n readonly generation: number;\n readonly leaseTtlMs?: number;\n}\n\nexport interface DdcGenerationCandidate {\n readonly generation: number;\n readonly lease: DdcLease;\n readonly previousHead: DdcRollbackSnapshot;\n}\n\nexport interface DdcGenerationEntryCandidate extends DdcGenerationCandidate {\n readonly staged: StagedDdcEntry;\n}\n\nexport interface DdcSessionMetrics {\n readonly hitCount: number;\n readonly missCount: number;\n readonly corruptCount: number;\n readonly writeFailureCount: number;\n}\n\ntype MutableDdcGenerationCandidate = Omit<DdcGenerationCandidate, 'lease'> & {\n lease: DdcLease;\n};\n\ntype MutableDdcGenerationEntryCandidate = Omit<DdcGenerationEntryCandidate, 'lease'> & {\n lease: DdcLease;\n};\n\ntype HeartbeatTimer = ReturnType<typeof setTimeout>;\n\ninterface MutableMetrics {\n hitCount: number;\n missCount: number;\n corruptCount: number;\n writeFailureCount: number;\n}\n\nexport class DdcGenerationSession {\n public readonly generation: number;\n private readonly lifecycle: DdcLifecycle;\n private readonly entries: DdcEntryStore;\n private readonly candidates = new Map<string, MutableDdcGenerationCandidate>();\n private readonly restoreFences = new WeakMap<DdcGenerationCandidate, DdcRestoreFence>();\n private readonly heartbeatTimers = new Map<string, HeartbeatTimer>();\n private readonly counters: MutableMetrics = {\n hitCount: 0,\n missCount: 0,\n corruptCount: 0,\n writeFailureCount: 0,\n };\n private accepting = true;\n\n public constructor(root: string, options: DdcSessionOptions) {\n if (!Number.isSafeInteger(options.generation) || options.generation < 1) {\n throw new TypeError('DDC generation must be a positive safe integer');\n }\n this.generation = options.generation;\n this.lifecycle = new DdcLifecycle(\n root,\n options.leaseTtlMs === undefined ? undefined : { leaseTtlMs: options.leaseTtlMs },\n );\n this.entries = new DdcEntryStore(root);\n }\n\n public async beginCandidate(guid: string, desiredKey: string): Promise<DdcGenerationCandidate> {\n this.assertOpen();\n const { lease, previousHead } = await this.lifecycle.beginWithSnapshot(guid, desiredKey);\n if (previousHead.state === 'current') this.counters.hitCount += 1;\n else this.counters.missCount += 1;\n const candidate: MutableDdcGenerationCandidate = {\n generation: this.generation,\n lease,\n previousHead,\n };\n this.candidates.set(lease.attempt, candidate);\n this.scheduleHeartbeat(candidate);\n return candidate;\n }\n\n public async stageEntry(entry: DdcEntry): Promise<DdcGenerationEntryCandidate> {\n this.assertOpen();\n const candidate = (await this.beginCandidate(\n entry.guid,\n entry.key,\n )) as MutableDdcGenerationCandidate;\n try {\n const staged = await this.entries.stage(entry);\n const entryCandidate: MutableDdcGenerationEntryCandidate = Object.assign(candidate, {\n staged,\n });\n this.candidates.set(candidate.lease.attempt, entryCandidate);\n return entryCandidate;\n } catch (error) {\n const fence = await this.lifecycle.fail(candidate.lease, {\n code: 'ddc-entry-stage-failed',\n detail: error instanceof Error ? error.message : String(error),\n });\n if (fence !== undefined) this.restoreFences.set(candidate, fence);\n this.stopHeartbeat(candidate);\n this.candidates.delete(candidate.lease.attempt);\n this.counters.writeFailureCount += 1;\n throw error;\n }\n }\n\n public async inspect(guid: string, desiredKey: string): Promise<DdcHead> {\n this.assertOpen();\n const head = await this.lifecycle.inspect(guid, desiredKey);\n if (head.state === 'current') this.counters.hitCount += 1;\n else this.counters.missCount += 1;\n return head;\n }\n\n public async commitCandidate(\n candidate: DdcGenerationCandidate,\n validatedKey: string,\n ): Promise<DdcCommitResult> {\n const registered = this.assertCandidate(candidate);\n try {\n const result = await this.lifecycle.commit(registered.lease, validatedKey);\n if (result.restoreFence !== undefined)\n this.restoreFences.set(registered, result.restoreFence);\n if (result.result === 'invalid') this.counters.corruptCount += 1;\n this.stopHeartbeat(registered);\n this.candidates.delete(registered.lease.attempt);\n return result;\n } catch (error) {\n this.stopHeartbeat(registered);\n this.counters.writeFailureCount += 1;\n throw error;\n }\n }\n\n public async commitEntry(\n candidate: DdcGenerationEntryCandidate,\n validatedKey: string,\n ): Promise<DdcCommitResult> {\n const registered = this.assertCandidate(candidate);\n try {\n const published = await this.entries.publish(candidate.staged);\n if (published.result === 'conflict') {\n throw new DdcStoreError({\n code: 'ddc-entry-conflict',\n detail: `immutable DDC entry ${published.key} conflicts with the staged candidate`,\n expected: 'the existing DDC entry to have the same validated output',\n actual: { key: published.key },\n });\n }\n const result = await this.lifecycle.commit(registered.lease, validatedKey);\n if (result.restoreFence !== undefined)\n this.restoreFences.set(registered, result.restoreFence);\n this.stopHeartbeat(registered);\n this.candidates.delete(registered.lease.attempt);\n return result;\n } catch (error) {\n this.stopHeartbeat(registered);\n const fence = await this.lifecycle.fail(registered.lease, {\n code: 'ddc-entry-publish-failed',\n detail: error instanceof Error ? error.message : String(error),\n });\n if (fence !== undefined) this.restoreFences.set(registered, fence);\n await this.entries.discard(candidate.staged).catch(() => {});\n this.candidates.delete(registered.lease.attempt);\n this.counters.writeFailureCount += 1;\n throw error;\n }\n }\n\n public async discardCandidate(candidate: DdcGenerationCandidate): Promise<void> {\n const registered = this.candidates.get(candidate.lease.attempt);\n if (registered === undefined) return;\n try {\n this.stopHeartbeat(registered);\n await this.lifecycle.discard(registered.lease);\n this.candidates.delete(registered.lease.attempt);\n } catch (error) {\n this.counters.writeFailureCount += 1;\n throw error;\n }\n }\n\n public async discardEntry(candidate: DdcGenerationEntryCandidate): Promise<void> {\n await Promise.all([this.discardCandidate(candidate), this.entries.discard(candidate.staged)]);\n }\n\n public async restoreEntry(candidate: DdcGenerationEntryCandidate): Promise<DdcRestoreResult> {\n const registered = this.candidates.get(candidate.lease.attempt);\n const ownerLease = registered?.lease ?? candidate.lease;\n const fence = this.restoreFences.get(candidate);\n this.stopHeartbeat(ownerLease);\n let result: DdcRestoreResult = {\n result: 'not-owner',\n revision: candidate.previousHead.revision ?? 0,\n ...(candidate.previousHead.generation === undefined\n ? {}\n : { generation: candidate.previousHead.generation }),\n };\n let restoreError: unknown;\n try {\n result = await this.lifecycle.restoreIfCurrent(candidate.previousHead, ownerLease, fence);\n } catch (error) {\n restoreError = error;\n } finally {\n await this.entries.discard(candidate.staged).catch(() => {});\n if (registered !== undefined) {\n this.candidates.delete(registered.lease.attempt);\n }\n }\n if (restoreError !== undefined) throw restoreError;\n return result;\n }\n\n public metrics(): DdcSessionMetrics {\n return { ...this.counters };\n }\n\n public async close(): Promise<void> {\n if (!this.accepting) return;\n this.accepting = false;\n for (const timer of this.heartbeatTimers.values()) clearTimeout(timer);\n this.heartbeatTimers.clear();\n const pending = [...this.candidates.values()];\n for (const candidate of pending) {\n try {\n await this.lifecycle.discard(candidate.lease);\n } catch {\n this.counters.writeFailureCount += 1;\n }\n }\n this.candidates.clear();\n }\n\n private assertOpen(): void {\n if (!this.accepting) throw new Error('DDC generation session is closed');\n }\n\n private assertCandidate(candidate: DdcGenerationCandidate): MutableDdcGenerationCandidate {\n this.assertOpen();\n const registered = this.candidates.get(candidate.lease.attempt);\n if (candidate.generation !== this.generation || registered === undefined) {\n throw new Error('DDC candidate belongs to another generation session');\n }\n return registered;\n }\n\n private scheduleHeartbeat(candidate: MutableDdcGenerationCandidate): void {\n const attempt = candidate.lease.attempt;\n this.stopHeartbeat(candidate);\n const delay = Math.max(1, Math.floor((candidate.lease.expiresAt - Date.now()) / 2));\n const timer = setTimeout(() => {\n this.heartbeatTimers.delete(attempt);\n if (!this.accepting || this.candidates.get(attempt) !== candidate) return;\n void this.lifecycle\n .heartbeat(candidate.lease)\n .then((lease) => {\n if (!this.accepting || this.candidates.get(attempt) !== candidate) return;\n candidate.lease = lease;\n this.scheduleHeartbeat(candidate);\n })\n .catch(() => {\n this.stopHeartbeat(candidate);\n });\n }, delay);\n timer.unref?.();\n this.heartbeatTimers.set(attempt, timer);\n }\n\n private stopHeartbeat(candidate: DdcGenerationCandidate | DdcLease): void {\n const attempt = 'lease' in candidate ? candidate.lease.attempt : candidate.attempt;\n const timer = this.heartbeatTimers.get(attempt);\n if (timer === undefined) return;\n clearTimeout(timer);\n this.heartbeatTimers.delete(attempt);\n }\n}\n","import type { DdcErrorRootKind } from './errors.js';\n\nexport const DDC_STATUS_SCHEMA = 'forgeax-ddc-status/v2' as const;\n\nexport type DdcStatusHealth = 'ready' | 'blocked' | 'missing' | 'stale' | 'failed';\nexport type DdcStatusLayerKind = 'build' | 'project' | 'runtime';\nexport type DdcStatusRootKind = DdcErrorRootKind;\n\nexport interface DdcRecoveryAction {\n readonly kind: 'inspect' | 'allocate-generation' | 'retry' | 'cold-rebuild' | 'prune';\n readonly executable: boolean;\n readonly exactTarget?: string;\n readonly reason?: string;\n}\n\nexport interface DdcStatusLayer {\n readonly kind: DdcStatusLayerKind;\n readonly owner: 'engine-ddc' | 'engine-pack' | 'plugin' | 'runtime';\n readonly rootKind: DdcStatusRootKind;\n readonly scopeId?: string;\n readonly current?: number | string;\n readonly lastKnownGood?: number | string;\n readonly protection: readonly string[];\n readonly actions: readonly DdcRecoveryAction[];\n}\n\nexport interface DdcStatus {\n readonly schemaVersion: typeof DDC_STATUS_SCHEMA;\n readonly health: DdcStatusHealth;\n readonly layers: readonly DdcStatusLayer[];\n readonly gameDir?: string;\n readonly projectDdcRoot?: string;\n}\n\nexport type BrowserDdcRecoveryAction = Omit<DdcRecoveryAction, 'exactTarget'>;\nexport type BrowserDdcStatusLayer = Omit<DdcStatusLayer, 'actions'> & {\n readonly actions: readonly BrowserDdcRecoveryAction[];\n};\nexport type BrowserDdcStatus = Omit<DdcStatus, 'gameDir' | 'projectDdcRoot' | 'layers'> & {\n readonly layers: readonly BrowserDdcStatusLayer[];\n};\n\nexport function serializeDdcStatus(status: DdcStatus): string {\n return JSON.stringify(status);\n}\n\nexport function projectDdcStatusForBrowser(status: DdcStatus): BrowserDdcStatus {\n return {\n schemaVersion: DDC_STATUS_SCHEMA,\n health: status.health,\n layers: status.layers.map((layer) => ({\n ...layer,\n actions: layer.actions.map(({ exactTarget: _exactTarget, ...action }) => action),\n })),\n };\n}\n\nexport const toBrowserDdcStatus = projectDdcStatusForBrowser;\n"]}
@@ -1,3 +1,4 @@
1
+ import { type DdcEntry } from './entry-store.js';
1
2
  export type DdcLifecycleState = 'missing' | 'cooking' | 'current' | 'stale' | 'failed';
2
3
  export interface DdcLease {
3
4
  readonly guid: string;
@@ -22,6 +23,10 @@ export interface DdcHead {
22
23
  readonly detail: string;
23
24
  };
24
25
  }
26
+ export interface DdcCurrentEntry {
27
+ readonly head: DdcHead;
28
+ readonly entry: DdcEntry | null;
29
+ }
25
30
  export interface DdcCommitResult {
26
31
  readonly result: 'current' | 'stale' | 'lease-lost' | 'invalid';
27
32
  readonly key: string;
@@ -64,6 +69,8 @@ export declare class DdcLifecycle {
64
69
  readonly leaseTtlMs?: number;
65
70
  });
66
71
  inspect(guid: string, desiredKey: string): Promise<DdcHead>;
72
+ /** Read the accepted entry for a GUID without making callers reconstruct head paths. */
73
+ readCurrentEntry(guid: string): Promise<DdcCurrentEntry>;
67
74
  /** Begin a lease and capture the accepted rollback snapshot under one head lock. */
68
75
  beginWithSnapshot(guid: string, desiredKey: string): Promise<DdcBeginResult>;
69
76
  begin(guid: string, desiredKey: string): Promise<DdcLease>;
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
package/dist/session.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { DdcEntry, StagedDdcEntry } from './entry-store.js';
1
+ import { type DdcEntry, type StagedDdcEntry } from './entry-store.js';
2
2
  import type { DdcCommitResult, DdcHead, DdcLease, DdcRestoreResult, DdcRollbackSnapshot } from './lifecycle.js';
3
3
  export interface DdcSessionOptions {
4
4
  readonly generation: number;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,QAAQ,EAER,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;CAC5C;AAED,MAAM,WAAW,2BAA4B,SAAQ,sBAAsB;IACzE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAmBD,qBAAa,oBAAoB;IAC/B,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoD;IAC/E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0D;IACxF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAKvB;IACF,OAAO,CAAC,SAAS,CAAQ;gBAEN,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB;IAY9C,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAejF,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,2BAA2B,CAAC;IA0BjE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ3D,eAAe,CAC1B,SAAS,EAAE,sBAAsB,EACjC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,CAAC;IAiBd,WAAW,CACtB,SAAS,EAAE,2BAA2B,EACtC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,CAAC;IAwBd,gBAAgB,CAAC,SAAS,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAalE,YAAY,CAAC,SAAS,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE,YAAY,CAAC,SAAS,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2BrF,OAAO,IAAI,iBAAiB;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBnC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,aAAa;CAOtB"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAgC,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,QAAQ,EAER,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;CAC5C;AAED,MAAM,WAAW,2BAA4B,SAAQ,sBAAsB;IACzE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAmBD,qBAAa,oBAAoB;IAC/B,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoD;IAC/E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0D;IACxF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAKvB;IACF,OAAO,CAAC,SAAS,CAAQ;gBAEN,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB;IAY9C,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAejF,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,2BAA2B,CAAC;IA0BjE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ3D,eAAe,CAC1B,SAAS,EAAE,sBAAsB,EACjC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,CAAC;IAiBd,WAAW,CACtB,SAAS,EAAE,2BAA2B,EACtC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,CAAC;IAgCd,gBAAgB,CAAC,SAAS,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAalE,YAAY,CAAC,SAAS,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE,YAAY,CAAC,SAAS,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2BrF,OAAO,IAAI,iBAAiB;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBnC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,aAAa;CAOtB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgeax/engine-ddc",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -85,7 +85,7 @@
85
85
  }
86
86
  },
87
87
  "dependencies": {
88
- "@forgeax/engine-types": "0.1.23"
88
+ "@forgeax/engine-types": "0.1.24"
89
89
  },
90
90
  "devDependencies": {
91
91
  "@types/node": "^20.14.0",
@@ -75,6 +75,37 @@ describe('DDC generation session integration', () => {
75
75
  }
76
76
  });
77
77
 
78
+ it('rejects a conflicting immutable entry before advancing the lifecycle head', async () => {
79
+ const root = await mkdtemp(join(tmpdir(), 'forgeax-ddc-session-'));
80
+ roots.push(root);
81
+ const store = new DdcEntryStore(root);
82
+ await store.write(entry());
83
+ const lifecycle = new DdcLifecycle(root);
84
+ const accepted = await lifecycle.begin(GUID, KEY);
85
+ await lifecycle.commit(accepted, KEY);
86
+ const session = new DdcGenerationSession(root, { generation: 1 });
87
+ const candidate = await session.stageEntry({
88
+ ...entry(),
89
+ payload: { kind: 'fixture', key: 'conflicting' },
90
+ receipt: {
91
+ ...entry().receipt,
92
+ outputDigest: ddcOutputDigest({
93
+ ...entry(),
94
+ payload: { kind: 'fixture', key: 'conflicting' },
95
+ }),
96
+ },
97
+ });
98
+
99
+ await expect(session.commitEntry(candidate, KEY)).rejects.toMatchObject({
100
+ code: 'ddc-entry-conflict',
101
+ });
102
+ await expect(session.inspect(GUID, KEY)).resolves.toMatchObject({
103
+ state: 'failed',
104
+ currentKey: KEY,
105
+ });
106
+ await session.close();
107
+ });
108
+
78
109
  it('does not let a stale rollback restore over a newer active lease', async () => {
79
110
  const root = await mkdtemp(join(tmpdir(), 'forgeax-ddc-session-'));
80
111
  roots.push(root);
@@ -104,6 +104,20 @@ describe('DDC lifecycle head', () => {
104
104
  });
105
105
  });
106
106
 
107
+ it('reads the accepted entry together with its projected current head', async () => {
108
+ const root = await mkdtemp(join(tmpdir(), 'forgeax-ddc-lifecycle-'));
109
+ roots.push(root);
110
+ const lifecycle = new DdcLifecycle(root);
111
+ const lease = await lifecycle.begin(GUID, KEY_A);
112
+ await writeEntry(root, KEY_A);
113
+ await lifecycle.commit(lease, KEY_A);
114
+
115
+ await expect(lifecycle.readCurrentEntry(GUID)).resolves.toMatchObject({
116
+ head: { state: 'current', desiredKey: KEY_A, currentKey: KEY_A },
117
+ entry: { key: KEY_A, guid: GUID, payload: { key: KEY_A } },
118
+ });
119
+ });
120
+
107
121
  it('retains last-known-good when recook fails', async () => {
108
122
  const root = await mkdtemp(join(tmpdir(), 'forgeax-ddc-lifecycle-'));
109
123
  roots.push(root);
package/src/index.ts CHANGED
@@ -43,6 +43,7 @@ export {
43
43
  export {
44
44
  type DdcBeginResult,
45
45
  type DdcCommitResult,
46
+ type DdcCurrentEntry,
46
47
  type DdcHead,
47
48
  type DdcLease,
48
49
  DdcLifecycle,
package/src/lifecycle.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
- import { DdcEntryStore } from './entry-store.js';
4
+ import { type DdcEntry, DdcEntryStore } from './entry-store.js';
5
5
  import { DdcStoreError } from './errors.js';
6
6
 
7
7
  export type DdcLifecycleState = 'missing' | 'cooking' | 'current' | 'stale' | 'failed';
@@ -28,6 +28,11 @@ export interface DdcHead {
28
28
  readonly failure?: { readonly code: string; readonly detail: string };
29
29
  }
30
30
 
31
+ export interface DdcCurrentEntry {
32
+ readonly head: DdcHead;
33
+ readonly entry: DdcEntry | null;
34
+ }
35
+
31
36
  export interface DdcCommitResult {
32
37
  readonly result: 'current' | 'stale' | 'lease-lost' | 'invalid';
33
38
  readonly key: string;
@@ -296,6 +301,17 @@ export class DdcLifecycle {
296
301
  return this.projectHead(guid, desiredKey, record);
297
302
  }
298
303
 
304
+ /** Read the accepted entry for a GUID without making callers reconstruct head paths. */
305
+ public async readCurrentEntry(guid: string): Promise<DdcCurrentEntry> {
306
+ const record = await this.read(guid);
307
+ const head = await this.projectHead(guid, record?.desiredKey ?? '', record);
308
+ const entry =
309
+ head.currentKey === undefined || head.state !== 'current'
310
+ ? null
311
+ : await this.entries.read(head.currentKey);
312
+ return { head, entry };
313
+ }
314
+
299
315
  /** Begin a lease and capture the accepted rollback snapshot under one head lock. */
300
316
  public async beginWithSnapshot(guid: string, desiredKey: string): Promise<DdcBeginResult> {
301
317
  return withDdcLock(this.root, `head-${guid}`, async () => {
package/src/session.ts CHANGED
@@ -1,5 +1,4 @@
1
- import type { DdcEntry, StagedDdcEntry } from './entry-store.js';
2
- import { DdcEntryStore } from './entry-store.js';
1
+ import { type DdcEntry, DdcEntryStore, DdcStoreError, type StagedDdcEntry } from './entry-store.js';
3
2
  import type {
4
3
  DdcCommitResult,
5
4
  DdcHead,
@@ -151,7 +150,15 @@ export class DdcGenerationSession {
151
150
  ): Promise<DdcCommitResult> {
152
151
  const registered = this.assertCandidate(candidate);
153
152
  try {
154
- await this.entries.publish(candidate.staged);
153
+ const published = await this.entries.publish(candidate.staged);
154
+ if (published.result === 'conflict') {
155
+ throw new DdcStoreError({
156
+ code: 'ddc-entry-conflict',
157
+ detail: `immutable DDC entry ${published.key} conflicts with the staged candidate`,
158
+ expected: 'the existing DDC entry to have the same validated output',
159
+ actual: { key: published.key },
160
+ });
161
+ }
155
162
  const result = await this.lifecycle.commit(registered.lease, validatedKey);
156
163
  if (result.restoreFence !== undefined)
157
164
  this.restoreFences.set(registered, result.restoreFence);