@feltdb/core 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/authority-scope.d.ts +2 -0
  2. package/dist/authority-scope.d.ts.map +1 -1
  3. package/dist/authority-scope.js +7 -2
  4. package/dist/cli/commands.js +19 -21
  5. package/dist/cli/development-session.js +16 -0
  6. package/dist/cli/studio-artifact.js +33 -0
  7. package/dist/create/package-versions.js +1 -1
  8. package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +8 -1
  9. package/dist/create/server-source/crates/feltdb/src/application.rs +16 -0
  10. package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +21 -22
  11. package/dist/create/server-source/crates/feltdb/src/lib.rs +451 -33
  12. package/dist/create/server-source/crates/feltdb/src/state_contract.rs +48 -3
  13. package/dist/create/server-source/crates/feltdb/src/state_model.rs +569 -4
  14. package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +1 -0
  15. package/dist/create/server-source/crates/feltdb/src/versioned_object_substrate.rs +708 -0
  16. package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +1 -0
  17. package/dist/create/server-source/crates/feltdb/src/workload.rs +480 -44
  18. package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_evidence.rs +123 -0
  19. package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_substrate_completion.rs +281 -0
  20. package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +15 -3
  21. package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +28 -18
  22. package/dist/create/server-source/crates/feltdb/tests/storage_independent_versioned_object_substrate.rs +328 -0
  23. package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +20 -3
  24. package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +14 -4
  25. package/dist/create/server-source/crates/feltdb-server/src/backup.rs +0 -4
  26. package/dist/create/server-source/crates/feltdb-server/src/canonical_principals.rs +1093 -0
  27. package/dist/create/server-source/crates/feltdb-server/src/causal.rs +905 -144
  28. package/dist/create/server-source/crates/feltdb-server/src/connections.rs +9 -6
  29. package/dist/create/server-source/crates/feltdb-server/src/control_plane.rs +90 -0
  30. package/dist/create/server-source/crates/feltdb-server/src/lib.rs +1 -0
  31. package/dist/create/server-source/crates/feltdb-server/src/main.rs +443 -77
  32. package/dist/create/server-source/crates/feltdb-server/src/principals.rs +9 -501
  33. package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +22 -0
  34. package/dist/create/server-source/crates/feltdb-server/tests/principal_tenant_migration.rs +247 -0
  35. package/dist/db.d.ts +14 -7
  36. package/dist/db.d.ts.map +1 -1
  37. package/dist/db.js +50 -26
  38. package/dist/deployment.d.ts +2 -0
  39. package/dist/deployment.d.ts.map +1 -1
  40. package/dist/deployment.js +4 -2
  41. package/dist/embedded-transaction.d.ts.map +1 -1
  42. package/dist/embedded-transaction.js +4 -0
  43. package/dist/error-codes.d.ts +12 -0
  44. package/dist/error-codes.d.ts.map +1 -1
  45. package/dist/error-codes.js +20 -2
  46. package/dist/feltdb.d.ts +4 -0
  47. package/dist/feltdb.d.ts.map +1 -1
  48. package/dist/file-db.d.ts +10 -0
  49. package/dist/file-db.d.ts.map +1 -1
  50. package/dist/file-db.js +18 -0
  51. package/dist/http-db.d.ts +7 -0
  52. package/dist/http-db.d.ts.map +1 -1
  53. package/dist/http-db.js +83 -15
  54. package/dist/index-core.d.ts +1 -0
  55. package/dist/index-core.d.ts.map +1 -1
  56. package/dist/index-core.js +1 -0
  57. package/dist/operation-admission.d.ts +2 -0
  58. package/dist/operation-admission.d.ts.map +1 -1
  59. package/dist/public-contract.d.ts +112 -0
  60. package/dist/public-contract.d.ts.map +1 -0
  61. package/dist/public-contract.js +125 -0
  62. package/dist/studio/app.d.ts +23 -0
  63. package/dist/studio/app.d.ts.map +1 -1
  64. package/dist/studio/components/ContractInspector.d.ts +5 -0
  65. package/dist/studio/components/ContractInspector.d.ts.map +1 -1
  66. package/dist/studio/components/SettingsPanel.d.ts +4 -1
  67. package/dist/studio/components/SettingsPanel.d.ts.map +1 -1
  68. package/dist/studio/components/index.js +4 -4
  69. package/dist/studio/{components-CehkcX_k.js → components-CJFgdKG6.js} +322 -303
  70. package/dist/studio/control-plane/Data.d.ts.map +1 -1
  71. package/dist/studio/control-plane/Instance.d.ts +10 -0
  72. package/dist/studio/control-plane/Instance.d.ts.map +1 -1
  73. package/dist/studio/control-plane/Operations.d.ts +3 -0
  74. package/dist/studio/control-plane/Operations.d.ts.map +1 -1
  75. package/dist/studio/control-plane/State.d.ts.map +1 -1
  76. package/dist/studio/control-plane/index.d.ts +4 -2
  77. package/dist/studio/control-plane/index.d.ts.map +1 -1
  78. package/dist/studio/control-plane/index.js +2 -2
  79. package/dist/studio/control-plane-DP8ljTDO.js +3207 -0
  80. package/dist/studio/index.js +96 -75
  81. package/dist/studio/utils/api.d.ts +1 -1
  82. package/dist/studio/utils/api.d.ts.map +1 -1
  83. package/dist/studio/utils/control-plane-api.d.ts +12 -1
  84. package/dist/studio/utils/control-plane-api.d.ts.map +1 -1
  85. package/dist/studio/utils/control-plane-api.js +1 -1
  86. package/dist/studio/utils/index.js +16 -16
  87. package/dist/studio/utils/service-api.d.ts +8 -0
  88. package/dist/studio/utils/service-api.d.ts.map +1 -1
  89. package/dist/studio/utils/service-api.js +15 -12
  90. package/dist/studio-app/assets/{feltdb_wasm-DksXDnLa.js → feltdb_wasm-CfNb3IoF.js} +1 -1
  91. package/dist/studio-app/assets/feltdb_wasm_bg-D9d3gY-E.wasm +0 -0
  92. package/dist/studio-app/assets/index-SDXdROi1.js +30 -0
  93. package/dist/studio-app/feltdb-studio.json +6 -0
  94. package/dist/studio-app/index.html +1 -1
  95. package/dist/transaction.d.ts +9 -1
  96. package/dist/transaction.d.ts.map +1 -1
  97. package/dist/transaction.js +6 -2
  98. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  99. package/dist/workspace/local-development-authority.d.ts +8 -0
  100. package/dist/workspace/local-development-authority.d.ts.map +1 -1
  101. package/dist/workspace/local-development-authority.js +136 -1
  102. package/package.json +2 -2
  103. package/dist/studio/control-plane-D6TT2fCQ.js +0 -3064
  104. package/dist/studio-app/assets/feltdb_wasm_bg-Yy4QRHJT.wasm +0 -0
  105. package/dist/studio-app/assets/index-CjELc-ul.js +0 -30
@@ -2191,7 +2191,7 @@ fn execute_transaction_with_policies(
2191
2191
  != Some(payload_hash.as_str())
2192
2192
  {
2193
2193
  return Err(StateFailure::new(
2194
- "CONFLICT",
2194
+ "IDEMPOTENCY_CONFLICT",
2195
2195
  "transaction ID was already committed with a different canonical payload",
2196
2196
  ));
2197
2197
  }
@@ -2227,12 +2227,14 @@ fn execute_transaction_with_policies(
2227
2227
  audit,
2228
2228
  });
2229
2229
  }
2230
- let snapshot = db.state_rows().map_err(StateFailure::storage)?;
2231
2230
  let namespace = request
2232
2231
  .state_namespace
2233
2232
  .as_deref()
2234
2233
  .unwrap_or(&request.application_id)
2235
2234
  .to_string();
2235
+ let snapshot = db
2236
+ .state_rows_for_namespace(&namespace)
2237
+ .map_err(StateFailure::storage)?;
2236
2238
  // Record preconditions are collected here and evaluated by the store,
2237
2239
  // inside the same lock as the writes. Evaluating them against `snapshot`
2238
2240
  // alongside the counters below would reintroduce exactly the gap they
@@ -2592,6 +2594,16 @@ fn execute_transaction_with_policies(
2592
2594
  }
2593
2595
  return failure;
2594
2596
  }
2597
+ if let FlowError::RevisionConflict { expected, actual } = &error {
2598
+ let mut failure =
2599
+ StateFailure::new("PRECONDITION_FAILED", &error.to_string());
2600
+ failure.transaction = Some(transaction_id.clone());
2601
+ failure.causal_position = db.sequence().ok();
2602
+ failure.resource = Some("authority_revision".into());
2603
+ failure.expected = Some(Value::from(*expected));
2604
+ failure.actual = Some(Value::from(*actual));
2605
+ return failure;
2606
+ }
2595
2607
  let text = error.to_string();
2596
2608
  if text.contains("PRECONDITION_FAILED") {
2597
2609
  let mut failure = StateFailure::new("PRECONDITION_FAILED", &text);
@@ -3270,6 +3282,39 @@ mod tests {
3270
3282
  assert_eq!(failure.actual, Some(Value::from(1)));
3271
3283
  }
3272
3284
  #[test]
3285
+ fn stale_authority_revision_is_a_structured_precondition_failure() {
3286
+ let db = db("authority-revision-precondition");
3287
+ let schema = schema();
3288
+ let mut request = TransactionRequest {
3289
+ transaction_id: Some("initial".into()),
3290
+ tenant_id: "tenant".into(),
3291
+ application_id: "app".into(),
3292
+ revision_id: "rev".into(),
3293
+ schema_version: 1,
3294
+ state_namespace: None,
3295
+ causal_parent: None,
3296
+ authorization: auth(),
3297
+ preconditions: vec![],
3298
+ operations: vec![TransactionOperation {
3299
+ kind: TransactionOperationKind::Insert,
3300
+ collection: "incidents".into(),
3301
+ id: "one".into(),
3302
+ value: serde_json::json!({"title":"First"}),
3303
+ if_version: None,
3304
+ }],
3305
+ };
3306
+ execute_transaction(&db, &schema, &request, None).unwrap();
3307
+ request.transaction_id = Some("stale-parent".into());
3308
+ request.causal_parent = Some(0);
3309
+ request.operations[0].id = "two".into();
3310
+
3311
+ let failure = execute_transaction(&db, &schema, &request, None).unwrap_err();
3312
+ assert_eq!(failure.code, "PRECONDITION_FAILED");
3313
+ assert_eq!(failure.resource.as_deref(), Some("authority_revision"));
3314
+ assert_eq!(failure.expected, Some(Value::from(0)));
3315
+ assert_eq!(failure.actual, Some(Value::from(1)));
3316
+ }
3317
+ #[test]
3273
3318
  fn explicit_transaction_id_is_bound_to_canonical_payload_across_restart() {
3274
3319
  let path = std::env::temp_dir().join(format!(
3275
3320
  "feltdb-content-id-{}-{}.log",
@@ -3317,7 +3362,7 @@ mod tests {
3317
3362
  let mut changed = request.clone();
3318
3363
  changed.operations[0].value = serde_json::json!({"title":"Changed"});
3319
3364
  let failure = execute_transaction(&reopened, &schema, &changed, None).unwrap_err();
3320
- assert_eq!(failure.code, "CONFLICT");
3365
+ assert_eq!(failure.code, "IDEMPOTENCY_CONFLICT");
3321
3366
  assert!(failure.message.contains("different canonical payload"));
3322
3367
  std::fs::remove_file(path).ok();
3323
3368
  }