@forgeax/engine-ddc 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +136 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/__tests__/concurrency.integration.test.d.ts +2 -0
  5. package/dist/__tests__/concurrency.integration.test.d.ts.map +1 -0
  6. package/dist/__tests__/consumer-path.integration.test.d.ts +2 -0
  7. package/dist/__tests__/consumer-path.integration.test.d.ts.map +1 -0
  8. package/dist/__tests__/crash-recovery.integration.test.d.ts +2 -0
  9. package/dist/__tests__/crash-recovery.integration.test.d.ts.map +1 -0
  10. package/dist/__tests__/entry-store.integration.test.d.ts +2 -0
  11. package/dist/__tests__/entry-store.integration.test.d.ts.map +1 -0
  12. package/dist/__tests__/errors.unit.test.d.ts +2 -0
  13. package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
  14. package/dist/__tests__/key.unit.test.d.ts +2 -0
  15. package/dist/__tests__/key.unit.test.d.ts.map +1 -0
  16. package/dist/__tests__/layout.unit.test.d.ts +2 -0
  17. package/dist/__tests__/layout.unit.test.d.ts.map +1 -0
  18. package/dist/__tests__/lifecycle.unit.test.d.ts +2 -0
  19. package/dist/__tests__/lifecycle.unit.test.d.ts.map +1 -0
  20. package/dist/__tests__/multiprocess-gc.integration.test.d.ts +2 -0
  21. package/dist/__tests__/multiprocess-gc.integration.test.d.ts.map +1 -0
  22. package/dist/__tests__/multiprocess-lifecycle.integration.test.d.ts +2 -0
  23. package/dist/__tests__/multiprocess-lifecycle.integration.test.d.ts.map +1 -0
  24. package/dist/__tests__/multiprocess-worker.d.ts +2 -0
  25. package/dist/__tests__/multiprocess-worker.d.ts.map +1 -0
  26. package/dist/__tests__/status-root-kind-owner.test-d.d.ts +2 -0
  27. package/dist/__tests__/status-root-kind-owner.test-d.d.ts.map +1 -0
  28. package/dist/__tests__/status.unit.test.d.ts +2 -0
  29. package/dist/__tests__/status.unit.test.d.ts.map +1 -0
  30. package/dist/entry-store.d.ts +52 -0
  31. package/dist/entry-store.d.ts.map +1 -0
  32. package/dist/entry-store.mjs +339 -0
  33. package/dist/entry-store.mjs.map +1 -0
  34. package/dist/errors.d.ts +58 -0
  35. package/dist/errors.d.ts.map +1 -0
  36. package/dist/errors.mjs +109 -0
  37. package/dist/errors.mjs.map +1 -0
  38. package/dist/gc.d.ts +13 -0
  39. package/dist/gc.d.ts.map +1 -0
  40. package/dist/index.d.ts +9 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.mjs +896 -0
  43. package/dist/index.mjs.map +1 -0
  44. package/dist/key.d.ts +13 -0
  45. package/dist/key.d.ts.map +1 -0
  46. package/dist/key.mjs +38 -0
  47. package/dist/key.mjs.map +1 -0
  48. package/dist/layout.d.ts +51 -0
  49. package/dist/layout.d.ts.map +1 -0
  50. package/dist/layout.mjs +68 -0
  51. package/dist/layout.mjs.map +1 -0
  52. package/dist/lifecycle.d.ts +55 -0
  53. package/dist/lifecycle.d.ts.map +1 -0
  54. package/dist/runtime-scope.d.ts +10 -0
  55. package/dist/runtime-scope.d.ts.map +1 -0
  56. package/dist/status.d.ts +39 -0
  57. package/dist/status.d.ts.map +1 -0
  58. package/dist/status.mjs +20 -0
  59. package/dist/status.mjs.map +1 -0
  60. package/package.json +98 -0
  61. package/src/__tests__/concurrency.integration.test.ts +53 -0
  62. package/src/__tests__/consumer-path.integration.test.ts +61 -0
  63. package/src/__tests__/crash-recovery.integration.test.ts +84 -0
  64. package/src/__tests__/entry-store.integration.test.ts +83 -0
  65. package/src/__tests__/errors.unit.test.ts +54 -0
  66. package/src/__tests__/key.unit.test.ts +49 -0
  67. package/src/__tests__/layout.unit.test.ts +50 -0
  68. package/src/__tests__/lifecycle.unit.test.ts +258 -0
  69. package/src/__tests__/multiprocess-gc.integration.test.ts +36 -0
  70. package/src/__tests__/multiprocess-lifecycle.integration.test.ts +109 -0
  71. package/src/__tests__/multiprocess-worker.ts +41 -0
  72. package/src/__tests__/status-root-kind-owner.test-d.ts +42 -0
  73. package/src/__tests__/status.unit.test.ts +56 -0
  74. package/src/entry-store.ts +307 -0
  75. package/src/errors.ts +164 -0
  76. package/src/gc.ts +34 -0
  77. package/src/index.ts +65 -0
  78. package/src/key.ts +46 -0
  79. package/src/layout.ts +132 -0
  80. package/src/lifecycle.ts +549 -0
  81. package/src/runtime-scope.ts +87 -0
  82. package/src/status.ts +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts"],"names":[],"mappings":"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","file":"errors.mjs","sourcesContent":["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"]}
package/dist/gc.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ export interface DdcGcInput {
2
+ readonly currentKeys: readonly string[];
3
+ readonly lastKnownGoodKeys: readonly string[];
4
+ readonly activeLeaseKeys: readonly string[];
5
+ readonly scopeIds?: readonly string[];
6
+ }
7
+ export interface DdcGcResult {
8
+ readonly deleted: readonly string[];
9
+ readonly protected: readonly string[];
10
+ }
11
+ /** Mark current/LKG/lease roots, then sweep only the same project root. */
12
+ export declare function collectDdcGarbage(root: string, input: DdcGcInput): Promise<DdcGcResult>;
13
+ //# sourceMappingURL=gc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gc.d.ts","sourceRoot":"","sources":["../src/gc.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,2EAA2E;AAC3E,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAgB7F"}
@@ -0,0 +1,9 @@
1
+ export { type DdcArtifact, type DdcEntry, DdcEntryStore, type DdcReceipt, ddcOutputDigest, type PublishDdcEntryResult, type StagedDdcEntry, } from './entry-store.js';
2
+ export { DDC_ERROR_CODES, type DdcBrowserError, type DdcContractErrorCode, type DdcEntryErrorCode, type DdcErrorCode, type DdcErrorRootKind, type DdcRecoveryAction as DdcErrorRecoveryAction, DdcStoreError, type DdcStoreErrorInit, } from './errors.js';
3
+ export { collectDdcGarbage, type DdcGcInput, type DdcGcResult } from './gc.js';
4
+ export { semanticDdcKey } from './key.js';
5
+ 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';
6
+ export { type DdcCommitResult, type DdcHead, type DdcLease, DdcLifecycle, type DdcLifecycleState, } from './lifecycle.js';
7
+ export { assertRuntimeScope, createRuntimeScope, type DdcRuntimeScope, runtimeScopeHash, } from './runtime-scope.js';
8
+ export { type BrowserDdcRecoveryAction, type BrowserDdcStatus, type BrowserDdcStatusLayer, DDC_STATUS_SCHEMA, type DdcRecoveryAction, type DdcStatus, type DdcStatusHealth, type DdcStatusLayer, type DdcStatusLayerKind, type DdcStatusRootKind, projectDdcStatusForBrowser, serializeDdcStatus, toBrowserDdcStatus, } from './status.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,aAAa,EACb,KAAK,UAAU,EACf,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,aAAa,EACb,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,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,eAAe,EACpB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,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"}