@feltdb/core 0.12.1 → 0.12.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 (112) hide show
  1. package/dist/build-identity.json +13 -4
  2. package/dist/cli/commands.js +88 -43
  3. package/dist/collection.d.ts +41 -4
  4. package/dist/collection.d.ts.map +1 -1
  5. package/dist/collection.js +116 -47
  6. package/dist/composition.d.ts.map +1 -1
  7. package/dist/composition.js +11 -1
  8. package/dist/create/build-identity.json +13 -4
  9. package/dist/create/cli.js +3 -3
  10. package/dist/create/create.js +17 -19
  11. package/dist/create/package-versions.js +1 -1
  12. package/dist/create/server-source/Cargo.lock +18 -3
  13. package/dist/create/server-source/Cargo.toml +4 -2
  14. package/dist/create/server-source/crates/feltdb/Cargo.toml +20 -0
  15. package/dist/create/server-source/crates/feltdb/LICENSE +21 -0
  16. package/dist/create/server-source/crates/feltdb/README.md +75 -0
  17. package/dist/create/server-source/crates/feltdb/src/agent_state.rs +320 -0
  18. package/dist/create/server-source/crates/feltdb/src/agent_transition_contract.rs +1545 -0
  19. package/dist/create/server-source/crates/feltdb/src/authority.rs +145 -15
  20. package/dist/create/server-source/crates/feltdb/src/lib.rs +227 -23
  21. package/dist/create/server-source/crates/feltdb/src/state_model.rs +1 -5
  22. package/dist/create/server-source/crates/feltdb/tests/agent_state_native.rs +1188 -0
  23. package/dist/create/server-source/crates/feltdb/tests/agent_transition_contract_conformance.rs +2884 -0
  24. package/dist/create/server-source/crates/feltdb/tests/authority_transaction_identity.rs +534 -0
  25. package/dist/create/server-source/crates/feltdb/tests/fixtures/agent_transition_corpus.json +23340 -0
  26. package/dist/create/server-source/crates/feltdb-client/Cargo.toml +29 -0
  27. package/dist/create/server-source/crates/feltdb-client/LICENSE +21 -0
  28. package/dist/create/server-source/crates/feltdb-client/README.md +70 -0
  29. package/dist/create/server-source/crates/feltdb-client/src/application.rs +527 -0
  30. package/dist/create/server-source/crates/feltdb-client/src/authority.rs +679 -0
  31. package/dist/create/server-source/crates/feltdb-client/src/control.rs +292 -0
  32. package/dist/create/server-source/crates/feltdb-client/src/error.rs +227 -0
  33. package/dist/create/server-source/crates/feltdb-client/src/events.rs +146 -0
  34. package/dist/create/server-source/crates/feltdb-client/src/lib.rs +466 -0
  35. package/dist/create/server-source/crates/feltdb-client/tests/fixtures/README.md +4 -0
  36. package/dist/create/server-source/crates/feltdb-client/tests/fixtures/private-ca.pem +20 -0
  37. package/dist/create/server-source/crates/feltdb-client/tests/fixtures/server-key.pem +28 -0
  38. package/dist/create/server-source/crates/feltdb-client/tests/fixtures/server.pem +20 -0
  39. package/dist/create/server-source/crates/feltdb-client/tests/private_ca.rs +95 -0
  40. package/dist/create/server-source/crates/feltdb-server/Cargo.toml +20 -1
  41. package/dist/create/server-source/crates/feltdb-server/LICENSE +21 -0
  42. package/dist/create/server-source/crates/feltdb-server/README.md +12 -1
  43. package/dist/create/server-source/crates/feltdb-server/src/backup.rs +6 -2
  44. package/dist/create/server-source/crates/feltdb-server/src/lib.rs +20 -0
  45. package/dist/create/server-source/crates/feltdb-server/src/main.rs +1 -3
  46. package/dist/create/server-source/crates/feltdb-server/tests/rust_client.rs +683 -0
  47. package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +3 -1
  48. package/dist/create/template/default-project/README.md +12 -7
  49. package/dist/create/template/default-project/src/pages/Dashboard.tsx +1 -1
  50. package/dist/create/template/dot-feltdb-README.md +3 -3
  51. package/dist/db.d.ts.map +1 -1
  52. package/dist/db.js +43 -17
  53. package/dist/development-runtime-bridge.d.ts.map +1 -1
  54. package/dist/development-runtime-bridge.js +22 -1
  55. package/dist/embedded-transaction.d.ts +75 -8
  56. package/dist/embedded-transaction.d.ts.map +1 -1
  57. package/dist/embedded-transaction.js +124 -18
  58. package/dist/error-codes.d.ts +2 -0
  59. package/dist/error-codes.d.ts.map +1 -1
  60. package/dist/error-codes.js +2 -0
  61. package/dist/feltdb.d.ts +1 -11
  62. package/dist/feltdb.d.ts.map +1 -1
  63. package/dist/file-db.d.ts +6 -0
  64. package/dist/file-db.d.ts.map +1 -1
  65. package/dist/file-db.js +43 -11
  66. package/dist/indexeddb-db.d.ts.map +1 -1
  67. package/dist/indexeddb-db.js +65 -41
  68. package/dist/memory-db.d.ts.map +1 -1
  69. package/dist/memory-db.js +29 -8
  70. package/dist/studio/{KeyManagementPanel-DZuSeWBK.js → KeyManagementPanel-D5FMvvU9.js} +1 -0
  71. package/dist/studio/app.d.ts.map +1 -1
  72. package/dist/studio/components/KeyManagementPanel.d.ts.map +1 -1
  73. package/dist/studio/components/KeyManagementPanel.js +1 -1
  74. package/dist/studio/components/RouteErrorBoundary.d.ts +5 -0
  75. package/dist/studio/components/RouteErrorBoundary.d.ts.map +1 -0
  76. package/dist/studio/components/index.js +2 -2
  77. package/dist/studio/{components-Bivm2lX6.js → components-B4eKIUN5.js} +1 -1
  78. package/dist/studio/control-plane/Agents.d.ts.map +1 -1
  79. package/dist/studio/control-plane/Data.d.ts.map +1 -1
  80. package/dist/studio/control-plane/Instance.d.ts.map +1 -1
  81. package/dist/studio/control-plane/Overview.d.ts.map +1 -1
  82. package/dist/studio/control-plane/Schema.d.ts.map +1 -1
  83. package/dist/studio/control-plane/context.d.ts +4 -1
  84. package/dist/studio/control-plane/context.d.ts.map +1 -1
  85. package/dist/studio/control-plane/index.js +2 -2
  86. package/dist/studio/control-plane/primitives.d.ts +8 -0
  87. package/dist/studio/control-plane/primitives.d.ts.map +1 -1
  88. package/dist/studio/{control-plane-CLm69XwX.js → control-plane-fxMcJn74.js} +1371 -1319
  89. package/dist/studio/index.js +146 -105
  90. package/dist/studio/utils/control-plane-api.d.ts.map +1 -1
  91. package/dist/studio/utils/control-plane-api.js +4 -3
  92. package/dist/studio/utils/service-api.d.ts.map +1 -1
  93. package/dist/studio/utils/service-api.js +5 -4
  94. package/dist/studio-app/assets/{feltdb_wasm-DACcD-zs.js → feltdb_wasm-BatwwogY.js} +1 -1
  95. package/dist/studio-app/assets/feltdb_wasm_bg-BX0newOr.wasm +0 -0
  96. package/dist/studio-app/assets/index-DoVvbIay.js +30 -0
  97. package/dist/studio-app/index.html +1 -1
  98. package/dist/telemetry.d.ts +1 -0
  99. package/dist/telemetry.d.ts.map +1 -1
  100. package/dist/telemetry.js +4 -3
  101. package/dist/transaction-identity.d.ts +62 -0
  102. package/dist/transaction-identity.d.ts.map +1 -0
  103. package/dist/transaction-identity.js +138 -0
  104. package/dist/transaction.d.ts +50 -5
  105. package/dist/transaction.d.ts.map +1 -1
  106. package/dist/transaction.js +28 -0
  107. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  108. package/dist/wasm/package.json +1 -1
  109. package/package.json +1 -1
  110. package/dist/create/server-source/crates/feltdb-wasm/test.db +0 -0
  111. package/dist/studio-app/assets/feltdb_wasm_bg-BejThWID.wasm +0 -0
  112. package/dist/studio-app/assets/index-CoZaxnlm.js +0 -30
@@ -1,8 +1,13 @@
1
1
  {
2
- "schema": "feltdb.core-build-identity.v1",
2
+ "schema": "feltdb.build-identity.v2",
3
3
  "package": "@feltdb/core",
4
- "version": "0.12.1",
5
- "source_digest": "sha256:95a6ebf48be2a6be56fad60c24a10b62d93878857e728448913d9bc243e8ce3a",
4
+ "version": "0.12.2",
5
+ "git": {
6
+ "sha1": "7a632f5b3e79d800ff27359f7f1a7c081dc7cb69",
7
+ "dirty": false
8
+ },
9
+ "path_in_vcs": "packages/core",
10
+ "source_digest": "sha256:9db516ed9702dde647cd8d9723e1d997be999a39ddebfcb337dc0c1d721c8110",
6
11
  "inputs": [
7
12
  "Cargo.lock",
8
13
  "Cargo.toml",
@@ -15,5 +20,9 @@
15
20
  "tools/cli",
16
21
  "tools/create-feltdb"
17
22
  ],
18
- "files": 731
23
+ "files": 770,
24
+ "build": {
25
+ "command": "npm run build",
26
+ "node": "v24.9.0"
27
+ }
19
28
  }
@@ -13,7 +13,7 @@ import { createFeltDB, diffFlowSpec, emptyFlowSpec, formatFlowSpec, Investigatio
13
13
  import { collectApplicationUnderstanding } from '@feltdb/core';
14
14
  import { collectRepositoryEvidence } from './repository-evidence.js';
15
15
  import { discoverWorkspace, ensureWorkspaceGitIgnored, generatePairingToken, persistPairingToken, displayWorkspaceStatus, initializeWorkspace, startPairingDiscoveryServer } from './workspace-integration.js';
16
- import { applicationUrlCandidate, detectApplication, discoverApplicationUrl } from './application.js';
16
+ import { applicationIsRunning, applicationUrlCandidate, detectApplication, discoverApplicationUrl } from './application.js';
17
17
  import { resolveApplicationLifecycle, startManagedApplication, waitForManagedApplication } from './application-lifecycle.js';
18
18
  import { createDevelopmentSession, developmentSessionEnvironment, developmentSessionSummary, developmentStudioArguments, transitionDevelopmentSession } from './development-session.js';
19
19
  import { openApplication, openStudio } from './browser-opening.js';
@@ -1066,11 +1066,13 @@ async function handleStatus() {
1066
1066
  const connFile = path.join(configDir, 'connection.json');
1067
1067
  if (!fs.existsSync(connFile)) {
1068
1068
  console.log('Local Mode (No server connection)\n');
1069
- console.log('Runtime: Local');
1070
- console.log('Storage: OPFS');
1071
- console.log('Fabric: Enabled');
1072
- console.log('Authentication: Development');
1073
- console.log('Health: ✓\n');
1069
+ // Report what the project is configured as. Fixed strings here used to claim OPFS storage
1070
+ // and a passing health check for every project, whatever feltdb.config.json said.
1071
+ const configPath = path.join(process.cwd(), 'feltdb.config.json');
1072
+ const configured = fs.existsSync(configPath) ? JSON.parse(fs.readFileSync(configPath, 'utf8')) : {};
1073
+ console.log(`Runtime: ${configured.runtime ?? 'not configured'}`);
1074
+ console.log(`Storage: ${configured.storage ?? 'not configured'}`);
1075
+ console.log('Health: not checked (run `feltdb workspace status` to see whether `feltdb dev` is running)\n');
1074
1076
  await displayContractStatus();
1075
1077
  return;
1076
1078
  }
@@ -1410,6 +1412,13 @@ async function handleDev(args) {
1410
1412
  const applicationTimeoutMs = timeoutArgument === undefined ? 15000 : Number(timeoutArgument);
1411
1413
  if (!Number.isFinite(applicationTimeoutMs) || applicationTimeoutMs <= 0)
1412
1414
  throw new Error('--application-timeout must be a positive number of milliseconds');
1415
+ // A managed session owns its application. Something already answering at the
1416
+ // expected URL is another process, and it would satisfy the readiness probe while
1417
+ // the child we are about to start falls back to a different port — reporting
1418
+ // "ready" for an application this session does not run.
1419
+ if (await applicationIsRunning(appUrl)) {
1420
+ throw new Error(`Managed application cannot start: ${appUrl} is already answering, so another process owns that address (workspace: ${workspace.workspaceId}; project: ${projectDir}). Stop that process, choose a different port with --app-url, or set application.lifecycle to "attached" in feltdb.config.json to use the running application.`);
1421
+ }
1413
1422
  managedApplication = startManagedApplication({
1414
1423
  projectDir,
1415
1424
  project: detectedApplication,
@@ -1654,7 +1663,8 @@ function inspectCapabilities(config) {
1654
1663
  }
1655
1664
  else {
1656
1665
  for (const [capName, capInfo] of Object.entries(capabilities)) {
1657
- const enabled = capInfo.enabled !== false ? '✓' : '✗';
1666
+ // Config toggles are booleans (`"search": false`); a declared capability is an object (`enabled: false`).
1667
+ const enabled = capInfo === false || capInfo?.enabled === false ? '✗' : '✓';
1658
1668
  console.log(` ${enabled} ${capName}`);
1659
1669
  }
1660
1670
  console.log('');
@@ -1720,47 +1730,82 @@ function inspectProvenance(config, flowRef) {
1720
1730
  }
1721
1731
  async function handleDoctor() {
1722
1732
  console.log('🏥 FeltDB Doctor\n');
1733
+ const findings = [];
1734
+ const record = (area, label, status, detail) => { findings.push({ area, label, status, detail }); };
1723
1735
  const configPath = path.join(process.cwd(), 'feltdb.config.json');
1724
- let config = {
1725
- runtime: 'browser',
1726
- storage: 'OPFS',
1727
- distributed: true,
1728
- capabilities: {},
1729
- peers: {},
1730
- };
1731
- if (fs.existsSync(configPath)) {
1732
- config = { ...config, ...JSON.parse(fs.readFileSync(configPath, 'utf-8')) };
1736
+ let config;
1737
+ if (!fs.existsSync(configPath)) {
1738
+ record('Project', 'feltdb.config.json', 'fail', 'not found in this directory; run doctor from the project root');
1733
1739
  }
1734
- console.log('Runtime');
1735
- console.log(' ✓ WASM runtime');
1736
- console.log(' ✓ Rust core');
1737
- console.log(' ✓ Reactive graph');
1738
- console.log('');
1739
- console.log('Storage');
1740
- console.log(` ✓ ${config.storage || 'OPFS'}`);
1741
- console.log(' ✓ Durable log');
1742
- console.log(' ✓ Recovery');
1743
- console.log('');
1744
- console.log('Fabric');
1745
- console.log(' ✓ References');
1746
- console.log(' ✓ Peer registry');
1747
- console.log(' ✓ Acquisition');
1748
- console.log(' ✓ Convergence');
1749
- console.log('');
1750
- console.log('Execution');
1751
- console.log(' ✓ Capability router');
1752
- console.log(' ✓ Execution ownership');
1753
- console.log(' ✓ Workflow runtime');
1754
- console.log('');
1755
- console.log('Issues');
1756
- const peers = Object.keys(config.peers || {});
1757
- if (peers.length === 0) {
1758
- console.log(' ℹ No connected peers');
1740
+ else {
1741
+ try {
1742
+ config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
1743
+ record('Project', 'feltdb.config.json', 'ok', `namespace ${config.namespace ?? '(unset)'}`);
1744
+ }
1745
+ catch (error) {
1746
+ record('Project', 'feltdb.config.json', 'fail', `not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
1747
+ }
1748
+ }
1749
+ const workspacePath = path.join(process.cwd(), '.feltdb', 'workspace.json');
1750
+ try {
1751
+ const workspace = JSON.parse(fs.readFileSync(workspacePath, 'utf-8'));
1752
+ if (typeof workspace.workspaceId === 'string' && workspace.workspaceId)
1753
+ record('Project', 'workspace identity', 'ok', workspace.workspaceId);
1754
+ else
1755
+ record('Project', 'workspace identity', 'fail', '.feltdb/workspace.json has no workspaceId');
1756
+ }
1757
+ catch {
1758
+ record('Project', 'workspace identity', 'fail', '.feltdb/workspace.json is missing or unreadable; run `feltdb dev` once to create it');
1759
+ }
1760
+ const flowPath = path.join(process.cwd(), 'feltdb.flow');
1761
+ if (!fs.existsSync(flowPath)) {
1762
+ record('Contract', 'feltdb.flow', 'fail', 'not found');
1759
1763
  }
1760
1764
  else {
1761
- console.log(` ✓ ${peers.length} peer(s) connected`);
1765
+ try {
1766
+ const spec = parseFlowSpec(fs.readFileSync(flowPath, 'utf-8'));
1767
+ const count = (value) => Array.isArray(value) ? value.length : value && typeof value === 'object' ? Object.keys(value).length : 0;
1768
+ record('Contract', 'feltdb.flow', 'ok', `${count(spec.collections)} collections, ${count(spec.workflows)} workflows, ${count(spec.agents)} agents`);
1769
+ }
1770
+ catch (error) {
1771
+ record('Contract', 'feltdb.flow', 'fail', `does not parse: ${error instanceof Error ? error.message : String(error)}`);
1772
+ }
1773
+ }
1774
+ try {
1775
+ const resolved = createRequire(path.join(process.cwd(), 'package.json')).resolve('@feltdb/core/package.json');
1776
+ record('Runtime', '@feltdb/core', 'ok', `${JSON.parse(fs.readFileSync(resolved, 'utf-8')).version} at ${path.dirname(resolved)}`);
1777
+ }
1778
+ catch {
1779
+ record('Runtime', '@feltdb/core', 'fail', 'cannot be resolved from this project; run npm install');
1780
+ }
1781
+ if (config) {
1782
+ const expectedStorage = { browser: ['indexeddb'], node: ['durable', 'file'], managed: ['managed'] };
1783
+ const allowed = expectedStorage[config.runtime];
1784
+ if (!config.runtime)
1785
+ record('Runtime', 'runtime', 'fail', 'feltdb.config.json sets no runtime');
1786
+ else if (allowed && config.storage && !allowed.includes(config.storage))
1787
+ record('Runtime', `runtime ${config.runtime}`, 'fail', `storage "${config.storage}" does not match (expected ${allowed.join(' or ')})`);
1788
+ else
1789
+ record('Runtime', `runtime ${config.runtime}`, 'ok', `storage ${config.storage ?? '(default)'}`);
1790
+ }
1791
+ record('Session', 'feltdb dev', 'info', 'not probed; run `feltdb workspace status` to see whether the development session is running');
1792
+ let area = '';
1793
+ for (const finding of findings) {
1794
+ if (finding.area !== area) {
1795
+ area = finding.area;
1796
+ console.log(`${area}`);
1797
+ }
1798
+ const mark = finding.status === 'ok' ? '✓' : finding.status === 'fail' ? '✗' : 'ℹ';
1799
+ console.log(` ${mark} ${finding.label}${finding.detail ? ` — ${finding.detail}` : ''}`);
1800
+ }
1801
+ console.log('');
1802
+ const failures = findings.filter(finding => finding.status === 'fail').length;
1803
+ if (failures > 0) {
1804
+ console.log(`${failures} check${failures === 1 ? '' : 's'} failed\n`);
1805
+ process.exitCode = 1;
1806
+ return;
1762
1807
  }
1763
- console.log('\n✅ System healthy\n');
1808
+ console.log('All checks passed\n');
1764
1809
  }
1765
1810
  async function handleStudio(args, onReady) {
1766
1811
  loadProjectEnvironment();
@@ -10,6 +10,16 @@
10
10
  import type { JsDb } from './feltdb.js';
11
11
  import { type FreshnessCapability, type Revision } from './freshness.js';
12
12
  import type { IndexConfig, CollectionQueryPlan } from './index-types.js';
13
+ /** Options for {@link Collection.insert}. */
14
+ export interface InsertOptions {
15
+ /**
16
+ * Create the record only if `id` is not already in use. Without it, inserting
17
+ * over an existing `id` replaces that record and advances its `__version`.
18
+ * With it, an existing record is never touched and the call fails with
19
+ * `PRECONDITION_FAILED`. Requires an explicit `id`.
20
+ */
21
+ requireAbsent?: boolean;
22
+ }
13
23
  export type Predicate<T> = (item: T) => boolean;
14
24
  export type Subscriber<T> = (items: T[]) => void;
15
25
  export interface CollectionFindOptions {
@@ -181,16 +191,43 @@ export declare class Collection<T> {
181
191
  */
182
192
  where(predicate: Predicate<T>): Collection<T>;
183
193
  /**
184
- * Insert a new record into this collection.
185
- * Automatically initializes __version to 1 for durable atomic transitions.
194
+ * Insert a record into this collection.
195
+ *
196
+ * Without an `id` a unique one is generated and the record is created.
197
+ * With an `id`:
198
+ * - `{ requireAbsent: true }` creates the record or fails with
199
+ * `PRECONDITION_FAILED` if the `id` is taken (the existing record is left
200
+ * untouched). This is the same predicate a transaction's `insert` accepts.
201
+ * - Otherwise a record already stored under `id` is replaced, and its
202
+ * `__version` advances; versions never move backwards, so a writer holding
203
+ * an older version cannot pass a later `updateIfVersion`.
204
+ *
205
+ * A new record starts at `__version: 1`.
206
+ *
207
+ * @throws FeltDBServiceError `INVALID_REQUEST` when `data` is not an object or `id` is empty
186
208
  */
187
- insert(data: Partial<T>, id?: string | number): Promise<string>;
209
+ insert(data: Partial<T>, id?: string | number, options?: InsertOptions): Promise<string>;
188
210
  /** Put a record through the canonical application collection API. */
189
211
  put(data: Partial<T>, id?: string | number): Promise<string>;
190
212
  /**
191
- * Update a record in this collection.
213
+ * Merge `changes` into an existing record.
214
+ *
215
+ * Fields not named in `changes` keep their values; the record's `__version`
216
+ * advances by one. The read and the write are fenced on the version that was
217
+ * read, so concurrent `update` calls on one record each take effect instead
218
+ * of the last writer silently discarding the others. Use `updateIfVersion`
219
+ * when the decision to write depends on what was read.
220
+ *
221
+ * @throws FeltDBServiceError `NOT_FOUND` if the record does not exist;
222
+ * `VERSION_CONFLICT` if it kept changing for every attempt
192
223
  */
193
224
  update(id: string | number, changes: Partial<T>): Promise<void>;
225
+ /** Create `data` under `id` if it is free; otherwise report what holds it. */
226
+ private createIfAbsent;
227
+ /** Replace a whole record if it is still at `expectedVersion`; the runtime assigns the next version. */
228
+ private replaceIfVersion;
229
+ /** Keep the index and the reactive graph in step with a committed write. */
230
+ private publish;
194
231
  /**
195
232
  * Atomically update a record only if its version matches the expected version.
196
233
  *
@@ -1 +1 @@
1
- {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EAAE,WAAW,EAAc,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAErF,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;AAChD,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;AAEjD,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAiBD;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,gGAAgG;IAChG,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC,4EAA4E;IAC5E,eAAe,EAAE,OAAO,CAAC;IACzB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,iEAAiE;IACjE,IAAI,CAAC,EAAE,CAAC,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,qBAAa,UAAU,CAAC,CAAC;IACvB,OAAO,CAAC,EAAE,CAAO;IACjB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,oBAAoB,CAA8B;IAC1D,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,YAAY,CAAoC;IACxD,iGAAiG;IACjG,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,mFAAmF;IACnF,OAAO,CAAC,eAAe,CAAK;IAC5B,gFAAgF;IAChF,OAAO,CAAC,iBAAiB,CAAM;IAC/B,OAAO,CAAC,QAAQ,CAAoC;IACpD,oEAAoE;IACpE,OAAO,CAAC,WAAW,CAA+B;IAClD,kFAAkF;IAClF,OAAO,CAAC,eAAe,CAAuB;IAC9C;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc,CAAyB;IAC/C,yEAAyE;IACzE,OAAO,CAAC,aAAa,CAA+B;gBAExC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,UAAO;IAoBxG;;OAEG;YACW,oBAAoB;IAelC;;;OAGG;IACG,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;IAKzB,qEAAqE;IAC/D,IAAI,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;IAI1B;;;;;;;;;;;;;OAaG;IACG,IAAI,CAAC,KAAK,GAAE,OAAO,CAAC,CAAC,CAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAuFjF,6EAA6E;IACvE,KAAK,CAAC,KAAK,GAAE,OAAO,CAAC,CAAC,CAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAIjD;;;;;OAKG;IACH,aAAa,IAAI,mBAAmB,GAAG,IAAI;IAI3C,wEAAwE;IACxE,OAAO,CAAC,QAAQ;IAWhB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAiBvB;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IA0BhC;;;;;OAKG;IACH,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAatC;;OAEG;IACH,WAAW,IAAI,WAAW,EAAE;IAI5B;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAazC;;OAEG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAYjD;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAO7C;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BrE,qEAAqE;IAC/D,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlE;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACG,eAAe,CACnB,EAAE,EAAE,MAAM,GAAG,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,aAAa,CAAC,EAAE,MAAM,EACtB,eAAe,CAAC,EAAE,MAAM,EACxB,gBAAgB,CAAC,EAAE,OAAO,EAC1B,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IA6EpC;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAK9B;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKnD;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;IAKjB;;;;;;;;OAQG;YACW,6BAA6B;IAkC3C;;;;;OAKG;YACW,iCAAiC;IAyE/C;;;;;;;;;;;;;OAaG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC;IAsClG;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI;IA6CxE,mEAAmE;IACnE,KAAK,IAAI,IAAI;IASb;;;;;;;;;;;OAWG;IACH,SAAS,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIzC;;;;;;OAMG;IACH,kBAAkB,IAAI,cAAc,GAAG,IAAI;IAI3C;;;;;;;;;OASG;YACW,eAAe;IAQ7B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CA2E/B;AAED;;GAEG;AACH,qBAAa,YAAY,CAAC,MAAM,EAAE,KAAK;IACrC,OAAO,CAAC,QAAQ,CAAO;IACvB,OAAO,CAAC,OAAO,CAAO;IACtB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,UAAU,CAAoC;gBAGpD,QAAQ,EAAE,IAAI,EACd,OAAO,EAAE,IAAI,EACb,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,GAAG,MAAM;IAQ/C;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;CAoBxD"}
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"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"}
@@ -10,8 +10,11 @@
10
10
  import { describeFreshness, isCacheCurrent, readRevision, } from './freshness.js';
11
11
  import { getReactiveDependencyGraph } from './reactive-graph.js';
12
12
  import { conditionalRefusal } from './transaction.js';
13
+ import { FeltDBErrorCode, FeltDBServiceError } from './error-codes.js';
13
14
  import { IndexBackend } from './index-backend.js';
14
15
  import { IndexStore } from './index-store.js';
16
+ /** Attempts a read-modify-write helper makes before reporting a version conflict. */
17
+ const MAX_FENCED_ATTEMPTS = 16;
15
18
  /**
16
19
  * A durable identity for one conditional write attempt.
17
20
  *
@@ -26,6 +29,18 @@ function conditionalTransactionId(purpose) {
26
29
  : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
27
30
  return `${purpose}-${unique}`;
28
31
  }
32
+ function assertRecordId(collection, operation, id) {
33
+ const ok = (typeof id === 'string' && id.trim() !== '') || (typeof id === 'number' && Number.isFinite(id));
34
+ if (!ok) {
35
+ throw new FeltDBServiceError(`${operation} on ${collection}: id must be a non-empty string or a finite number, received ${JSON.stringify(id)}`, FeltDBErrorCode.INVALID_REQUEST);
36
+ }
37
+ }
38
+ function assertRecordValue(collection, operation, value) {
39
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
40
+ throw new FeltDBServiceError(`${operation} on ${collection}: a record must be an object; received ${Array.isArray(value) ? 'an array' : value === null ? 'null' : typeof value}. `
41
+ + `The id goes second: insert(record, id).`, FeltDBErrorCode.INVALID_REQUEST);
42
+ }
43
+ }
29
44
  /**
30
45
  * A live collection that automatically updates when underlying data changes.
31
46
  * Represents application state, not a one-time query result.
@@ -378,64 +393,115 @@ export class Collection {
378
393
  }, this.parent || this);
379
394
  }
380
395
  /**
381
- * Insert a new record into this collection.
382
- * Automatically initializes __version to 1 for durable atomic transitions.
396
+ * Insert a record into this collection.
397
+ *
398
+ * Without an `id` a unique one is generated and the record is created.
399
+ * With an `id`:
400
+ * - `{ requireAbsent: true }` creates the record or fails with
401
+ * `PRECONDITION_FAILED` if the `id` is taken (the existing record is left
402
+ * untouched). This is the same predicate a transaction's `insert` accepts.
403
+ * - Otherwise a record already stored under `id` is replaced, and its
404
+ * `__version` advances; versions never move backwards, so a writer holding
405
+ * an older version cannot pass a later `updateIfVersion`.
406
+ *
407
+ * A new record starts at `__version: 1`.
408
+ *
409
+ * @throws FeltDBServiceError `INVALID_REQUEST` when `data` is not an object or `id` is empty
383
410
  */
384
- async insert(data, id) {
411
+ async insert(data, id, options = {}) {
412
+ assertRecordValue(this.name, 'insert', data);
413
+ if (id !== undefined)
414
+ assertRecordId(this.name, 'insert', id);
415
+ if (options.requireAbsent && id === undefined) {
416
+ throw new FeltDBServiceError(`insert into ${this.name}: requireAbsent needs an explicit id; a generated id is always new`, FeltDBErrorCode.INVALID_REQUEST);
417
+ }
385
418
  const recordId = id ?? `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
386
419
  const key = `${this.name}:${recordId}`;
387
- const stored = typeof data === 'object' && data !== null
388
- ? { ...data, id: recordId, __version: 1 }
389
- : data;
390
- const result = await this.db.insert(key, JSON.stringify(stored));
391
- if (!result.success) {
392
- throw new Error(`Insert failed: ${result.error}`);
420
+ if (id === undefined) {
421
+ const stored = { ...data, id: recordId, __version: 1 };
422
+ const result = await this.db.insert(key, JSON.stringify(stored));
423
+ if (!result.success) {
424
+ throw new Error(`Insert failed: ${result.error}`);
425
+ }
426
+ await this.publish('insert', key, String(recordId), null, stored);
427
+ return String(recordId);
393
428
  }
394
- // Update indexes
395
- this.indexBackend.updateRecord(String(recordId), null, stored);
396
- // Emit change through reactive dependency graph
397
- const change = {
398
- type: 'insert',
399
- key,
400
- value: stored,
401
- timestamp: Date.now(),
402
- };
403
- const graph = getReactiveDependencyGraph();
404
- await graph.emitChange(this.name, change);
405
- return String(recordId);
429
+ for (let attempt = 0; attempt < MAX_FENCED_ATTEMPTS; attempt += 1) {
430
+ const created = await this.createIfAbsent(key, recordId, data);
431
+ if (created.inserted) {
432
+ await this.publish('insert', key, String(recordId), null, created.stored);
433
+ return String(recordId);
434
+ }
435
+ if (options.requireAbsent) {
436
+ throw new FeltDBServiceError(`Record ${recordId} already exists in ${this.name}`, FeltDBErrorCode.PRECONDITION_FAILED);
437
+ }
438
+ const existing = created.existing;
439
+ const replacement = { ...data, id: recordId };
440
+ const outcome = await this.replaceIfVersion(key, existing.__version ?? 1, replacement);
441
+ if (outcome.updated) {
442
+ const item = (outcome.item ?? { ...replacement, __version: outcome.currentVersion });
443
+ await this.publish('update', key, String(recordId), existing, item);
444
+ return String(recordId);
445
+ }
446
+ // Another writer changed or removed the record between the read and the
447
+ // write; decide again against what is there now.
448
+ }
449
+ throw new FeltDBServiceError(`insert into ${this.name}: record ${recordId} kept changing; gave up after ${MAX_FENCED_ATTEMPTS} attempts`, FeltDBErrorCode.VERSION_CONFLICT);
406
450
  }
407
451
  /** Put a record through the canonical application collection API. */
408
452
  async put(data, id) {
409
453
  return this.insert(data, id);
410
454
  }
411
455
  /**
412
- * Update a record in this collection.
456
+ * Merge `changes` into an existing record.
457
+ *
458
+ * Fields not named in `changes` keep their values; the record's `__version`
459
+ * advances by one. The read and the write are fenced on the version that was
460
+ * read, so concurrent `update` calls on one record each take effect instead
461
+ * of the last writer silently discarding the others. Use `updateIfVersion`
462
+ * when the decision to write depends on what was read.
463
+ *
464
+ * @throws FeltDBServiceError `NOT_FOUND` if the record does not exist;
465
+ * `VERSION_CONFLICT` if it kept changing for every attempt
413
466
  */
414
467
  async update(id, changes) {
415
- const current = await this.get(id);
416
- if (!current) {
417
- throw new Error(`Record ${id} not found`);
418
- }
419
- const nextVersion = (current.__version || 1) + 1;
420
- const updated = { ...current, ...changes, __version: nextVersion };
421
- const key = `${this.name}:${id}`;
422
- const result = await (this.db.update
423
- ? this.db.update(key, JSON.stringify(updated))
424
- : this.db.insert(key, JSON.stringify(updated)));
425
- if (!result.success) {
426
- throw new Error(`Update failed: ${result.error}`);
468
+ assertRecordId(this.name, 'update', id);
469
+ assertRecordValue(this.name, 'update', changes);
470
+ for (let attempt = 0; attempt < MAX_FENCED_ATTEMPTS; attempt += 1) {
471
+ const current = await this.get(id);
472
+ if (!current) {
473
+ throw new FeltDBServiceError(`Record ${id} not found`, FeltDBErrorCode.NOT_FOUND);
474
+ }
475
+ const result = await this.updateIfVersion(id, current.__version ?? 1, changes, undefined, undefined, undefined, current);
476
+ if (result.updated)
477
+ return;
478
+ if (result.conflictCode === 'RECORD_MISSING') {
479
+ throw new FeltDBServiceError(`Record ${id} not found`, FeltDBErrorCode.NOT_FOUND);
480
+ }
427
481
  }
428
- // Update indexes
429
- this.indexBackend.updateRecord(String(id), current, updated);
430
- // Emit change through reactive dependency graph
431
- const change = {
432
- type: 'update',
433
- key,
434
- value: updated,
435
- timestamp: Date.now(),
436
- };
437
- const graph = getReactiveDependencyGraph();
438
- await graph.emitChange(this.name, change);
482
+ throw new FeltDBServiceError(`update of ${this.name}:${id} kept conflicting with other writers; gave up after ${MAX_FENCED_ATTEMPTS} attempts`, FeltDBErrorCode.VERSION_CONFLICT);
483
+ }
484
+ /** Create `data` under `id` if it is free; otherwise report what holds it. */
485
+ async createIfAbsent(key, id, data) {
486
+ const stored = { ...data, id, __version: 1 };
487
+ const result = this.db.putIfAbsent
488
+ ? await this.db.putIfAbsent(key, JSON.stringify(stored))
489
+ : await this.putIfAbsentThroughTransaction(key, stored);
490
+ return result.inserted
491
+ ? { inserted: true, stored }
492
+ : { inserted: false, existing: JSON.parse(result.value) };
493
+ }
494
+ /** Replace a whole record if it is still at `expectedVersion`; the runtime assigns the next version. */
495
+ replaceIfVersion(key, expectedVersion, value) {
496
+ return this.db.cas
497
+ ? this.db.cas({ key, expectedVersion, value: JSON.stringify(value) })
498
+ : this.updateIfVersionThroughTransaction(key, { expectedVersion, value });
499
+ }
500
+ /** Keep the index and the reactive graph in step with a committed write. */
501
+ async publish(type, key, id, previous, next) {
502
+ this.indexBackend.updateRecord(id, previous, next);
503
+ const change = { type, key, value: next, timestamp: Date.now() };
504
+ await getReactiveDependencyGraph().emitChange(this.name, change);
439
505
  }
440
506
  /**
441
507
  * Atomically update a record only if its version matches the expected version.
@@ -473,7 +539,7 @@ export class Collection {
473
539
  async updateIfVersion(id, expectedVersion, updates, expectedEpoch, expectedLeaseId, rejectIfDiverged, knownCurrent) {
474
540
  const current = knownCurrent ?? await this.get(id);
475
541
  if (!current) {
476
- throw new Error(`Record ${id} not found`);
542
+ throw new FeltDBServiceError(`Record ${id} not found`, FeltDBErrorCode.NOT_FOUND);
477
543
  }
478
544
  // Prepare updated record (no version increment - backend will handle it)
479
545
  // User updates should not include __version
@@ -547,7 +613,10 @@ export class Collection {
547
613
  }
548
614
  const result = await this.db.delete(key);
549
615
  if (!result.success) {
550
- throw new Error(`Delete failed: ${result.error}`);
616
+ const message = `Delete failed: ${result.error}`;
617
+ throw /not found/i.test(String(result.error))
618
+ ? new FeltDBServiceError(message, FeltDBErrorCode.NOT_FOUND)
619
+ : new Error(message);
551
620
  }
552
621
  // Update indexes - find and remove the deleted record
553
622
  const deleted = await this.get(id);
@@ -1 +1 @@
1
- {"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { FeltDBErrorCode, FeltDBServiceError } from './error-codes.js';
2
- import { AtomicTransactionError, conditionalRefusal } from './transaction.js';
2
+ import { AtomicTransactionError, TransactionIdConflictError, conditionalRefusal } from './transaction.js';
3
3
  import { FELTDB_INTENT_COLLECTION, FELTDB_INTENT_EVENT_COLLECTION } from './intent.js';
4
4
  import { FELTDB_PROPOSAL_EVENT_COLLECTION, PROPOSAL_TRANSITIONS } from './proposal.js';
5
5
  import { FELTDB_COMPOSITION_COLLECTION, FELTDB_COMPOSITION_CONTRACT_COLLECTION, FELTDB_COMPOSITION_TOPOLOGY_COLLECTION, FELTDB_COMPOSITION_VERSION_COLLECTION, FELTDB_STATE_ATTRIBUTION_COLLECTION, FELTDB_STATE_CHANGE_COLLECTION, FELTDB_STATE_DEPENDENCY_COLLECTION, FELTDB_STATE_IMPACT_COLLECTION, FELTDB_STATE_OBSERVATION_COLLECTION, FELTDB_STATE_OWNERSHIP_COLLECTION, FELTDB_STATE_PROPOSAL_COLLECTION, canonicalDigest, changedFields, computeImpactSurface, consumerUri, emptyImpactReads, impactReadSet, impactSurfaceDigest, parseStateUri, recordValue, recordVersion, redactImpactSurface, stateUri, } from './state-impact.js';
@@ -1181,6 +1181,16 @@ export class CompositionConsumer {
1181
1181
  });
1182
1182
  }
1183
1183
  catch (error) {
1184
+ // `apply_<proposal id>` names the application of one proposal. If the
1185
+ // authority already holds that id with different contents, another
1186
+ // attempt applied this proposal first and its recorded facts -- when it
1187
+ // was applied, under which decisions -- are its own. This call applied
1188
+ // nothing, and is not a stale read of state, so no refusal is recorded
1189
+ // against the proposal.
1190
+ if (error instanceof TransactionIdConflictError) {
1191
+ throw fail(`State proposal ${proposalId} was already applied by another attempt (transaction ${transactionId} is committed with different contents). `
1192
+ + 'Nothing was applied by this call.', FeltDBErrorCode.CONFLICT);
1193
+ }
1184
1194
  const refusal = conditionalRefusal(error);
1185
1195
  const lostRace = refusal.conflict
1186
1196
  || (error instanceof AtomicTransactionError && /conflict|PRECONDITION_FAILED/i.test(`${error.name} ${error.code ?? ''}`))
@@ -1,8 +1,13 @@
1
1
  {
2
- "schema": "feltdb.core-build-identity.v1",
2
+ "schema": "feltdb.build-identity.v2",
3
3
  "package": "create-feltdb",
4
- "version": "0.12.1",
5
- "source_digest": "sha256:95a6ebf48be2a6be56fad60c24a10b62d93878857e728448913d9bc243e8ce3a",
4
+ "version": "0.12.2",
5
+ "git": {
6
+ "sha1": "7a632f5b3e79d800ff27359f7f1a7c081dc7cb69",
7
+ "dirty": false
8
+ },
9
+ "path_in_vcs": "tools/create-feltdb",
10
+ "source_digest": "sha256:9db516ed9702dde647cd8d9723e1d997be999a39ddebfcb337dc0c1d721c8110",
6
11
  "inputs": [
7
12
  "Cargo.lock",
8
13
  "Cargo.toml",
@@ -15,5 +20,9 @@
15
20
  "tools/cli",
16
21
  "tools/create-feltdb"
17
22
  ],
18
- "files": 731
23
+ "files": 770,
24
+ "build": {
25
+ "command": "npm run build",
26
+ "node": "v24.9.0"
27
+ }
19
28
  }