@feltdb/core 0.13.0 → 0.16.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 (300) hide show
  1. package/dist/agent-runtime.d.ts +64 -2
  2. package/dist/agent-runtime.d.ts.map +1 -1
  3. package/dist/agent-runtime.js +121 -11
  4. package/dist/agent-state.d.ts +68 -0
  5. package/dist/agent-state.d.ts.map +1 -1
  6. package/dist/agent-state.js +210 -12
  7. package/dist/agent.d.ts +10 -1
  8. package/dist/agent.d.ts.map +1 -1
  9. package/dist/agent.js +10 -1
  10. package/dist/build-identity.json +12 -4
  11. package/dist/cli/commands.js +214 -10
  12. package/dist/cli/publish-engine.js +116 -16
  13. package/dist/collection.d.ts +3 -1
  14. package/dist/collection.d.ts.map +1 -1
  15. package/dist/collection.js +33 -8
  16. package/dist/create/build-identity.json +12 -4
  17. package/dist/create/cli.js +1 -1
  18. package/dist/create/create.js +4 -6
  19. package/dist/create/managed-account.js +93 -35
  20. package/dist/create/package-versions.js +1 -1
  21. package/dist/create/server-source/Cargo.lock +8 -511
  22. package/dist/create/server-source/Cargo.toml +2 -13
  23. package/dist/create/server-source/crates/feltdb-client/Cargo.toml +1 -1
  24. package/dist/create/server-source/crates/feltdb-server/Cargo.toml +1 -1
  25. package/dist/create/server-source/crates/feltdb-server/README.md +6 -1
  26. package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +9 -1
  27. package/dist/create/server-source/crates/feltdb-server/src/auth.rs +85 -25
  28. package/dist/create/server-source/crates/feltdb-server/src/backup.rs +4 -0
  29. package/dist/create/server-source/crates/feltdb-server/src/console_accounts.rs +1009 -0
  30. package/dist/create/server-source/crates/feltdb-server/src/control_authorization.rs +441 -0
  31. package/dist/create/server-source/crates/feltdb-server/src/identity.rs +68 -6
  32. package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +355 -23
  33. package/dist/create/server-source/crates/feltdb-server/src/lib.rs +3 -0
  34. package/dist/create/server-source/crates/feltdb-server/src/main.rs +1134 -96
  35. package/dist/create/server-source/crates/feltdb-server/src/redaction.rs +208 -0
  36. package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +198 -19
  37. package/dist/create/server-source/crates/feltdb-server/tests/transaction_precondition_contract.rs +403 -0
  38. package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +1 -1
  39. package/dist/db.d.ts +75 -10
  40. package/dist/db.d.ts.map +1 -1
  41. package/dist/db.js +168 -29
  42. package/dist/deployment.d.ts +19 -0
  43. package/dist/deployment.d.ts.map +1 -1
  44. package/dist/deployment.js +38 -2
  45. package/dist/embedded-query.d.ts.map +1 -1
  46. package/dist/embedded-query.js +5 -4
  47. package/dist/embedded-transaction.d.ts +8 -4
  48. package/dist/embedded-transaction.d.ts.map +1 -1
  49. package/dist/embedded-transaction.js +55 -19
  50. package/dist/error-codes.d.ts +36 -2
  51. package/dist/error-codes.d.ts.map +1 -1
  52. package/dist/error-codes.js +50 -3
  53. package/dist/feltdb.d.ts +7 -0
  54. package/dist/feltdb.d.ts.map +1 -1
  55. package/dist/file-db.d.ts +27 -0
  56. package/dist/file-db.d.ts.map +1 -1
  57. package/dist/file-db.js +145 -7
  58. package/dist/http-client.d.ts +11 -3
  59. package/dist/http-client.d.ts.map +1 -1
  60. package/dist/http-client.js +27 -14
  61. package/dist/http-db.d.ts +43 -1
  62. package/dist/http-db.d.ts.map +1 -1
  63. package/dist/http-db.js +287 -59
  64. package/dist/index.js +1 -1
  65. package/dist/local-state-lock.d.ts +34 -0
  66. package/dist/local-state-lock.d.ts.map +1 -0
  67. package/dist/local-state-lock.js +225 -0
  68. package/dist/managed-recovery.d.ts +6 -0
  69. package/dist/managed-recovery.d.ts.map +1 -1
  70. package/dist/managed-recovery.js +9 -0
  71. package/dist/reactive-graph.d.ts +0 -3
  72. package/dist/reactive-graph.d.ts.map +1 -1
  73. package/dist/reactive-graph.js +11 -1
  74. package/dist/runtime-registry.d.ts +7 -2
  75. package/dist/runtime-registry.d.ts.map +1 -1
  76. package/dist/runtime-registry.js +2 -2
  77. package/dist/studio/components/index.js +1 -1
  78. package/dist/studio/{components-BSGmHfif.js → components-CJmzntBi.js} +2 -1
  79. package/dist/studio/index.js +1 -1
  80. package/dist/studio-app/assets/{feltdb_wasm-3hDngl1h.js → feltdb_wasm-DtybUY0q.js} +1 -1
  81. package/dist/studio-app/assets/feltdb_wasm_bg-DsgIUwaB.wasm +0 -0
  82. package/dist/studio-app/assets/index-C4OffsZl.js +37 -0
  83. package/dist/studio-app/index.html +1 -1
  84. package/dist/transaction.d.ts +27 -11
  85. package/dist/transaction.d.ts.map +1 -1
  86. package/dist/transaction.js +20 -14
  87. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  88. package/dist/wasm/package.json +1 -1
  89. package/dist/workload.d.ts +86 -6
  90. package/dist/workload.d.ts.map +1 -1
  91. package/dist/workload.js +51 -3
  92. package/dist/workspace/workspace-connection.d.ts.map +1 -1
  93. package/dist/workspace/workspace-connection.js +14 -3
  94. package/package.json +1 -1
  95. package/dist/create/server-source/crates/feltdb/Cargo.lock +0 -175
  96. package/dist/create/server-source/crates/feltdb/Cargo.toml +0 -102
  97. package/dist/create/server-source/crates/feltdb/LICENSE +0 -21
  98. package/dist/create/server-source/crates/feltdb/README.md +0 -75
  99. package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +0 -370
  100. package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +0 -589
  101. package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +0 -247
  102. package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +0 -440
  103. package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +0 -275
  104. package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +0 -381
  105. package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +0 -467
  106. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +0 -489
  107. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +0 -281
  108. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +0 -606
  109. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +0 -531
  110. package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +0 -462
  111. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +0 -505
  112. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +0 -484
  113. package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +0 -758
  114. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +0 -421
  115. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +0 -329
  116. package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +0 -1705
  117. package/dist/create/server-source/crates/feltdb/src/acquisition.rs +0 -286
  118. package/dist/create/server-source/crates/feltdb/src/admission.rs +0 -185
  119. package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +0 -507
  120. package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +0 -539
  121. package/dist/create/server-source/crates/feltdb/src/agent_state.rs +0 -320
  122. package/dist/create/server-source/crates/feltdb/src/agent_transition_contract.rs +0 -1545
  123. package/dist/create/server-source/crates/feltdb/src/analytics.rs +0 -521
  124. package/dist/create/server-source/crates/feltdb/src/application.rs +0 -2674
  125. package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +0 -1070
  126. package/dist/create/server-source/crates/feltdb/src/authority.rs +0 -479
  127. package/dist/create/server-source/crates/feltdb/src/authority_failover.rs +0 -847
  128. package/dist/create/server-source/crates/feltdb/src/authorization.rs +0 -1030
  129. package/dist/create/server-source/crates/feltdb/src/authorization_security_tests.rs +0 -1122
  130. package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority-client.rs +0 -32
  131. package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority.rs +0 -19
  132. package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +0 -1474
  133. package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +0 -8
  134. package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +0 -418
  135. package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +0 -482
  136. package/dist/create/server-source/crates/feltdb/src/capability.rs +0 -903
  137. package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +0 -263
  138. package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +0 -77
  139. package/dist/create/server-source/crates/feltdb/src/causal_backlog_bound.rs +0 -496
  140. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +0 -2574
  141. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +0 -212
  142. package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +0 -422
  143. package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +0 -445
  144. package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +0 -465
  145. package/dist/create/server-source/crates/feltdb/src/convergence.rs +0 -634
  146. package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +0 -427
  147. package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +0 -376
  148. package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +0 -365
  149. package/dist/create/server-source/crates/feltdb/src/cron.rs +0 -294
  150. package/dist/create/server-source/crates/feltdb/src/dedup_bound_investigation.rs +0 -483
  151. package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +0 -477
  152. package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +0 -1003
  153. package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +0 -1334
  154. package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +0 -368
  155. package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +0 -231
  156. package/dist/create/server-source/crates/feltdb/src/durable_operation_identity.rs +0 -482
  157. package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +0 -203
  158. package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +0 -317
  159. package/dist/create/server-source/crates/feltdb/src/equality_index.rs +0 -595
  160. package/dist/create/server-source/crates/feltdb/src/execution.rs +0 -426
  161. package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +0 -214
  162. package/dist/create/server-source/crates/feltdb/src/indexing.rs +0 -776
  163. package/dist/create/server-source/crates/feltdb/src/lib.rs +0 -7274
  164. package/dist/create/server-source/crates/feltdb/src/managed_cas_tests.rs +0 -234
  165. package/dist/create/server-source/crates/feltdb/src/materialization.rs +0 -184
  166. package/dist/create/server-source/crates/feltdb/src/metrics.rs +0 -266
  167. package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +0 -310
  168. package/dist/create/server-source/crates/feltdb/src/multi_operation_transaction.rs +0 -736
  169. package/dist/create/server-source/crates/feltdb/src/observability.rs +0 -379
  170. package/dist/create/server-source/crates/feltdb/src/operation.rs +0 -290
  171. package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +0 -439
  172. package/dist/create/server-source/crates/feltdb/src/operation_log.rs +0 -349
  173. package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +0 -332
  174. package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +0 -718
  175. package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +0 -487
  176. package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +0 -166
  177. package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +0 -289
  178. package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +0 -566
  179. package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +0 -3391
  180. package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +0 -203
  181. package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +0 -261
  182. package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +0 -502
  183. package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +0 -216
  184. package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +0 -303
  185. package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +0 -323
  186. package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +0 -531
  187. package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +0 -406
  188. package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +0 -436
  189. package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +0 -387
  190. package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +0 -378
  191. package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +0 -359
  192. package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +0 -372
  193. package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +0 -404
  194. package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +0 -376
  195. package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +0 -461
  196. package/dist/create/server-source/crates/feltdb/src/policy_evaluation.rs +0 -2125
  197. package/dist/create/server-source/crates/feltdb/src/production_api.rs +0 -418
  198. package/dist/create/server-source/crates/feltdb/src/provenance.rs +0 -207
  199. package/dist/create/server-source/crates/feltdb/src/query_execution_diagnostics.rs +0 -126
  200. package/dist/create/server-source/crates/feltdb/src/query_performance.rs +0 -218
  201. package/dist/create/server-source/crates/feltdb/src/read_basis.rs +0 -257
  202. package/dist/create/server-source/crates/feltdb/src/references.rs +0 -404
  203. package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +0 -401
  204. package/dist/create/server-source/crates/feltdb/src/replica_acknowledgements.rs +0 -501
  205. package/dist/create/server-source/crates/feltdb/src/replica_membership.rs +0 -680
  206. package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +0 -163
  207. package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +0 -133
  208. package/dist/create/server-source/crates/feltdb/src/routing.rs +0 -409
  209. package/dist/create/server-source/crates/feltdb/src/semantic_decision.rs +0 -2029
  210. package/dist/create/server-source/crates/feltdb/src/semantic_query.rs +0 -599
  211. package/dist/create/server-source/crates/feltdb/src/sharding.rs +0 -549
  212. package/dist/create/server-source/crates/feltdb/src/state_conflict_contract.rs +0 -516
  213. package/dist/create/server-source/crates/feltdb/src/state_contract.rs +0 -5894
  214. package/dist/create/server-source/crates/feltdb/src/state_diff_contract.rs +0 -222
  215. package/dist/create/server-source/crates/feltdb/src/state_facade.rs +0 -320
  216. package/dist/create/server-source/crates/feltdb/src/state_hash.rs +0 -291
  217. package/dist/create/server-source/crates/feltdb/src/state_model.rs +0 -4158
  218. package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +0 -379
  219. package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +0 -673
  220. package/dist/create/server-source/crates/feltdb/src/storage.rs +0 -273
  221. package/dist/create/server-source/crates/feltdb/src/submission.rs +0 -471
  222. package/dist/create/server-source/crates/feltdb/src/sync.rs +0 -495
  223. package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +0 -822
  224. package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +0 -433
  225. package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +0 -462
  226. package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +0 -965
  227. package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +0 -1120
  228. package/dist/create/server-source/crates/feltdb/src/transactions.rs +0 -643
  229. package/dist/create/server-source/crates/feltdb/src/trigger.rs +0 -390
  230. package/dist/create/server-source/crates/feltdb/src/trigger_contract.rs +0 -749
  231. package/dist/create/server-source/crates/feltdb/src/versioned_object_substrate.rs +0 -708
  232. package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +0 -1133
  233. package/dist/create/server-source/crates/feltdb/src/workflow.rs +0 -713
  234. package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +0 -510
  235. package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +0 -354
  236. package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +0 -594
  237. package/dist/create/server-source/crates/feltdb/src/workload.rs +0 -2886
  238. package/dist/create/server-source/crates/feltdb/src/workload_diagnostics.rs +0 -456
  239. package/dist/create/server-source/crates/feltdb/tests/agent_state_native.rs +0 -1188
  240. package/dist/create/server-source/crates/feltdb/tests/agent_transition_contract_conformance.rs +0 -2884
  241. package/dist/create/server-source/crates/feltdb/tests/authority_process.rs +0 -297
  242. package/dist/create/server-source/crates/feltdb/tests/authority_transaction_identity.rs +0 -534
  243. package/dist/create/server-source/crates/feltdb/tests/bounded_read_contract.rs +0 -132
  244. package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +0 -299
  245. package/dist/create/server-source/crates/feltdb/tests/common/mod.rs +0 -96
  246. package/dist/create/server-source/crates/feltdb/tests/compaction_stall_contract.rs +0 -272
  247. package/dist/create/server-source/crates/feltdb/tests/crash_durability_contract.rs +0 -467
  248. package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +0 -309
  249. package/dist/create/server-source/crates/feltdb/tests/durable_backup_contract.rs +0 -445
  250. package/dist/create/server-source/crates/feltdb/tests/durable_corruption_contract.rs +0 -518
  251. package/dist/create/server-source/crates/feltdb/tests/durable_format_compatibility.rs +0 -392
  252. package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +0 -850
  253. package/dist/create/server-source/crates/feltdb/tests/fixtures/agent_transition_corpus.json +0 -23340
  254. package/dist/create/server-source/crates/feltdb/tests/fixtures/state_conflict_contract_corpus.json +0 -1916
  255. package/dist/create/server-source/crates/feltdb/tests/fixtures/state_diff_contract_corpus.json +0 -1878
  256. package/dist/create/server-source/crates/feltdb/tests/fixtures/trigger_contract_corpus.json +0 -1862
  257. package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_evidence.rs +0 -123
  258. package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_substrate_completion.rs +0 -299
  259. package/dist/create/server-source/crates/feltdb/tests/local_process_ownership.rs +0 -69
  260. package/dist/create/server-source/crates/feltdb/tests/managed_incident_regression.rs +0 -191
  261. package/dist/create/server-source/crates/feltdb/tests/operational_health_contract.rs +0 -278
  262. package/dist/create/server-source/crates/feltdb/tests/pr34_query_collection.rs +0 -234
  263. package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +0 -947
  264. package/dist/create/server-source/crates/feltdb/tests/pr7_self_authorization_proof.rs +0 -404
  265. package/dist/create/server-source/crates/feltdb/tests/pr8_vocabulary_assessment.rs +0 -916
  266. package/dist/create/server-source/crates/feltdb/tests/pr9_phase2_boundary_tests.rs +0 -1045
  267. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3a_path_a_tests.rs +0 -347
  268. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_authorized_mutations.rs +0 -361
  269. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs +0 -330
  270. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_simple_auth_delete.rs +0 -93
  271. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs +0 -622
  272. package/dist/create/server-source/crates/feltdb/tests/pr9_teams_role_based_access.rs +0 -517
  273. package/dist/create/server-source/crates/feltdb/tests/production_certification.rs +0 -1153
  274. package/dist/create/server-source/crates/feltdb/tests/production_contract.rs +0 -771
  275. package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +0 -1383
  276. package/dist/create/server-source/crates/feltdb/tests/reconciliation_application.rs +0 -868
  277. package/dist/create/server-source/crates/feltdb/tests/reconciliation_wire_format_evidence.rs +0 -221
  278. package/dist/create/server-source/crates/feltdb/tests/replicated_history_contract.rs +0 -417
  279. package/dist/create/server-source/crates/feltdb/tests/resource_scoped_revisions.rs +0 -338
  280. package/dist/create/server-source/crates/feltdb/tests/revision_identity_contract.rs +0 -1039
  281. package/dist/create/server-source/crates/feltdb/tests/revision_model_decision.rs +0 -739
  282. package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +0 -452
  283. package/dist/create/server-source/crates/feltdb/tests/saas_authorization_integration.rs +0 -81
  284. package/dist/create/server-source/crates/feltdb/tests/saas_invitation_lifecycle.rs +0 -438
  285. package/dist/create/server-source/crates/feltdb/tests/semantic_decision.rs +0 -1165
  286. package/dist/create/server-source/crates/feltdb/tests/semantic_query.rs +0 -767
  287. package/dist/create/server-source/crates/feltdb/tests/semantic_query_contract.rs +0 -363
  288. package/dist/create/server-source/crates/feltdb/tests/state_conflict_contract_conformance.rs +0 -1799
  289. package/dist/create/server-source/crates/feltdb/tests/state_diff_contract_conformance.rs +0 -1316
  290. package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +0 -358
  291. package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +0 -365
  292. package/dist/create/server-source/crates/feltdb/tests/state_ref_authority.rs +0 -918
  293. package/dist/create/server-source/crates/feltdb/tests/state_store_boundary_evidence.rs +0 -299
  294. package/dist/create/server-source/crates/feltdb/tests/storage_independent_versioned_object_substrate.rs +0 -328
  295. package/dist/create/server-source/crates/feltdb/tests/sync_divergence_evidence.rs +0 -255
  296. package/dist/create/server-source/crates/feltdb/tests/three_way_input_boundary_evidence.rs +0 -249
  297. package/dist/create/server-source/crates/feltdb/tests/trigger_contract_conformance.rs +0 -994
  298. package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +0 -484
  299. package/dist/studio-app/assets/feltdb_wasm_bg-CFQT4gCy.wasm +0 -0
  300. package/dist/studio-app/assets/index-Dql1hS5m.js +0 -30
@@ -1,1003 +0,0 @@
1
- /// Distributed references and content fabric tests
2
- #[cfg(test)]
3
- mod distributed_fabric_tests {
4
- use crate::*;
5
- use serde::{Deserialize, Serialize};
6
-
7
- #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
8
- struct Document {
9
- id: String,
10
- title: String,
11
- content: String,
12
- }
13
-
14
- #[test]
15
- fn test_flow_ref_creation_and_canonical_form() {
16
- // Test A - Stable reference
17
- let flow_ref = FlowRef::new("docs", "123");
18
- assert_eq!(flow_ref.canonical(), "flow://docs#123");
19
- assert_eq!(flow_ref.namespace, "docs");
20
- assert_eq!(flow_ref.object_id, "123");
21
-
22
- // With version
23
- let flow_ref_v = FlowRef::with_version("docs", "123", 42);
24
- assert_eq!(flow_ref_v.canonical(), "flow://docs#123@42");
25
- assert_eq!(flow_ref_v.version, Some(42));
26
- }
27
-
28
- #[test]
29
- fn test_flow_ref_parse_canonical() {
30
- let canonical = "flow://docs#123";
31
- let flow_ref = FlowRef::from_canonical(canonical).unwrap();
32
- assert_eq!(flow_ref.namespace, "docs");
33
- assert_eq!(flow_ref.object_id, "123");
34
- assert_eq!(flow_ref.version, None);
35
-
36
- let canonical_v = "flow://docs#123@42";
37
- let flow_ref_v = FlowRef::from_canonical(canonical_v).unwrap();
38
- assert_eq!(flow_ref_v.version, Some(42));
39
- }
40
-
41
- #[test]
42
- fn test_operation_content_hash() {
43
- let op = Operation::insert(
44
- 1,
45
- "inst1".to_string(),
46
- 1,
47
- "docs:123".to_string(),
48
- serde_json::json!({"title": "Test"}),
49
- "Document".to_string(),
50
- "docs".to_string(),
51
- );
52
-
53
- // Content hash should be computed
54
- assert!(!op.content_hash.is_empty());
55
- // Same operation should have same hash
56
- let op2 = Operation::insert(
57
- 2, // Different op_id
58
- "inst1".to_string(),
59
- 2, // Different sequence
60
- "docs:123".to_string(),
61
- serde_json::json!({"title": "Test"}),
62
- "Document".to_string(),
63
- "docs".to_string(),
64
- );
65
-
66
- // Same content should produce same hash
67
- assert_eq!(op.content_hash, op2.content_hash);
68
- }
69
-
70
- #[test]
71
- fn test_content_identity_from_bytes() {
72
- let data1 = b"hello world";
73
- let content1 = ContentIdentity::from_bytes(data1);
74
-
75
- let data2 = b"hello world";
76
- let content2 = ContentIdentity::from_bytes(data2);
77
-
78
- // Same data should produce same content identity
79
- assert_eq!(content1, content2);
80
-
81
- let data3 = b"different";
82
- let content3 = ContentIdentity::from_bytes(data3);
83
-
84
- // Different data should produce different identity
85
- assert_ne!(content1, content3);
86
- }
87
-
88
- #[test]
89
- fn test_peer_registry_basic_operations() {
90
- let registry = PeerRegistry::new();
91
-
92
- // Create peer advertisements
93
- let peer_a = PeerId::new("peer-a");
94
- let ad_a = PeerAdvertisement::new(peer_a.clone())
95
- .with_namespace("docs")
96
- .with_namespace("orders");
97
-
98
- // Register peer
99
- registry.register(ad_a).unwrap();
100
- assert_eq!(registry.peer_count().unwrap(), 1);
101
-
102
- // Get peer
103
- let retrieved = registry.get(&peer_a).unwrap();
104
- assert!(retrieved.is_some());
105
- assert!(retrieved.unwrap().provides_namespace("docs"));
106
- }
107
-
108
- #[test]
109
- fn test_peer_registry_namespace_discovery() {
110
- let registry = PeerRegistry::new();
111
-
112
- // Register multiple peers with different namespaces
113
- let peer_a = PeerId::new("peer-a");
114
- registry
115
- .register(PeerAdvertisement::new(peer_a).with_namespace("docs"))
116
- .unwrap();
117
-
118
- let peer_b = PeerId::new("peer-b");
119
- registry
120
- .register(
121
- PeerAdvertisement::new(peer_b)
122
- .with_namespace("orders")
123
- .with_namespace("docs"),
124
- )
125
- .unwrap();
126
-
127
- let peer_c = PeerId::new("peer-c");
128
- registry
129
- .register(PeerAdvertisement::new(peer_c).with_namespace("embeddings"))
130
- .unwrap();
131
-
132
- // Query for peers by namespace
133
- let docs_peers = registry.peers_for_namespace("docs").unwrap();
134
- assert_eq!(docs_peers.len(), 2); // peer-a and peer-b
135
-
136
- let orders_peers = registry.peers_for_namespace("orders").unwrap();
137
- assert_eq!(orders_peers.len(), 1); // peer-b
138
-
139
- let embeddings_peers = registry.peers_for_namespace("embeddings").unwrap();
140
- assert_eq!(embeddings_peers.len(), 1); // peer-c
141
- }
142
-
143
- #[test]
144
- fn test_peer_registry_capability_discovery() {
145
- let registry = PeerRegistry::new();
146
-
147
- // Register peers with capabilities
148
- let peer_a = PeerId::new("peer-a");
149
- registry
150
- .register(PeerAdvertisement::new(peer_a).with_capability("search:docs"))
151
- .unwrap();
152
-
153
- let peer_b = PeerId::new("peer-b");
154
- registry
155
- .register(
156
- PeerAdvertisement::new(peer_b)
157
- .with_capability("vector:embeddings")
158
- .with_capability("search:docs"),
159
- )
160
- .unwrap();
161
-
162
- // Query for peers by capability
163
- let search_peers = registry.peers_for_capability("search:docs").unwrap();
164
- assert_eq!(search_peers.len(), 2); // Both have search:docs
165
-
166
- let vector_peers = registry.peers_for_capability("vector:embeddings").unwrap();
167
- assert_eq!(vector_peers.len(), 1); // Only peer-b has this
168
- }
169
-
170
- #[test]
171
- fn test_distributed_fabric_references() {
172
- // Test basic reference creation and manipulation
173
- let flow_ref = FlowRef::new("orders", "847");
174
-
175
- // Test Display trait
176
- let display = format!("{}", flow_ref);
177
- assert_eq!(display, "flow://orders#847");
178
-
179
- // Test Hash trait (used in HashMap/HashSet)
180
- use std::collections::HashMap;
181
- let mut refs = HashMap::new();
182
- refs.insert(flow_ref.clone(), "order_data");
183
-
184
- let same_ref = FlowRef::new("orders", "847");
185
- assert_eq!(refs.get(&same_ref), Some(&"order_data"));
186
- }
187
-
188
- #[test]
189
- fn test_peer_advertisement_builders() {
190
- let peer = PeerId::new("peer-service");
191
-
192
- let ad = PeerAdvertisement::new(peer)
193
- .with_namespaces(vec!["docs".to_string(), "orders".to_string()])
194
- .with_capabilities(vec![
195
- "search:docs".to_string(),
196
- "vector:embeddings".to_string(),
197
- ]);
198
-
199
- assert!(ad.provides_namespace("docs"));
200
- assert!(ad.provides_namespace("orders"));
201
- assert!(ad.provides_capability("search:docs"));
202
- assert!(ad.provides_capability("vector:embeddings"));
203
- }
204
-
205
- #[test]
206
- fn test_content_range() {
207
- let range = ContentRange::new("a", "z", 26);
208
-
209
- assert!(range.contains("a"));
210
- assert!(range.contains("m"));
211
- assert!(range.contains("z"));
212
- assert!(!range.contains("0"));
213
- assert!(!range.contains("{"));
214
- }
215
-
216
- #[test]
217
- fn test_feltdb_with_peer_management() -> Result<()> {
218
- let db = open("target/test_distributed_fabric.db")?;
219
-
220
- // Create peer advertisements
221
- let peer_a = PeerId::new("node-search");
222
- let ad_a = PeerAdvertisement::new(peer_a.clone())
223
- .with_namespace("docs")
224
- .with_capability("search:docs");
225
-
226
- let peer_b = PeerId::new("node-vector");
227
- let ad_b = PeerAdvertisement::new(peer_b.clone())
228
- .with_namespace("docs")
229
- .with_capability("vector:docs");
230
-
231
- // Register peers
232
- db.register_peer(ad_a)?;
233
- db.register_peer(ad_b)?;
234
-
235
- // Query peers
236
- assert_eq!(db.all_peers()?.len(), 2);
237
-
238
- let search_peers = db.peers_for_capability("search:docs")?;
239
- assert_eq!(search_peers.len(), 1);
240
- assert_eq!(search_peers[0].peer_id.id, "node-search");
241
-
242
- let vector_peers = db.peers_for_capability("vector:docs")?;
243
- assert_eq!(vector_peers.len(), 1);
244
- assert_eq!(vector_peers[0].peer_id.id, "node-vector");
245
-
246
- Ok(())
247
- }
248
-
249
- #[test]
250
- fn test_feltdb_resolve_ref() -> Result<()> {
251
- let db = open("target/test_resolve_ref.db")?;
252
-
253
- // Get the capability and insert through it
254
- let docs_cap = db.capability("docs");
255
-
256
- // Insert a document
257
- let doc = Document {
258
- id: "123".to_string(),
259
- title: "Test Document".to_string(),
260
- content: "This is a test".to_string(),
261
- };
262
-
263
- docs_cap.insert_with_key("123", doc.clone())?;
264
-
265
- // Create a reference and resolve it
266
- let flow_ref = FlowRef::new("docs", "123");
267
- let resolved = db.resolve_ref::<Document>(&flow_ref)?;
268
-
269
- assert!(resolved.is_some());
270
- assert_eq!(resolved.unwrap(), doc);
271
-
272
- // Try resolving non-existent reference
273
- let missing_ref = FlowRef::new("docs", "999");
274
- let missing = db.resolve_ref::<Document>(&missing_ref)?;
275
- assert!(missing.is_none());
276
-
277
- Ok(())
278
- }
279
-
280
- #[test]
281
- fn test_distributed_scenario_b_object_migration() -> Result<()> {
282
- // Test B - Move (object migration across peers)
283
-
284
- // Node A initially has a document
285
- let db_a = open("target/test_scenario_b_node_a.db")?;
286
-
287
- let doc = Document {
288
- id: "doc1".to_string(),
289
- title: "Distributed Document".to_string(),
290
- content: "Content that will migrate".to_string(),
291
- };
292
-
293
- db_a.capability("docs")
294
- .insert_with_key("doc1", doc.clone())?;
295
-
296
- // Create reference
297
- let flow_ref = FlowRef::new("docs", "doc1");
298
-
299
- // Verify it can be resolved on Node A
300
- let resolved = db_a.resolve_ref::<Document>(&flow_ref)?;
301
- assert!(resolved.is_some());
302
- assert_eq!(resolved.unwrap(), doc);
303
-
304
- // Simulate migration: register peer B as having this namespace
305
- let peer_b = PeerId::new("node-b");
306
- let ad_b = PeerAdvertisement::new(peer_b).with_namespace("docs");
307
-
308
- db_a.register_peer(ad_b)?;
309
-
310
- // The reference should still be valid after migration registration
311
- // (In a full implementation, content would actually migrate)
312
- let peer_list = db_a.peers_for_namespace("docs")?;
313
- assert_eq!(peer_list.len(), 1);
314
- assert_eq!(peer_list[0].peer_id.id, "node-b");
315
-
316
- Ok(())
317
- }
318
-
319
- #[test]
320
- fn test_distributed_scenario_d_deduplication() -> Result<()> {
321
- // Test D - Deduplication (same content from multiple sources)
322
-
323
- let store = ContentAddressableStore::new();
324
-
325
- // Same content arrives from multiple peers
326
- let content = b"identical document content".to_vec();
327
- let hash = ContentIdentity::from_bytes(&content).as_str().to_string();
328
-
329
- // Store once
330
- store.store(content.clone(), hash.clone())?;
331
-
332
- // Record that multiple peers have it
333
- let peer_a = PeerId::new("peer-a");
334
- let peer_b = PeerId::new("peer-b");
335
- let peer_c = PeerId::new("peer-c");
336
-
337
- store.record_location(hash.clone(), peer_a)?;
338
- store.record_location(hash.clone(), peer_b)?;
339
- store.record_location(hash.clone(), peer_c)?;
340
-
341
- // Retrieve - only one copy in memory
342
- let retrieved = store.get(&hash)?;
343
- assert!(retrieved.is_some());
344
- assert_eq!(retrieved.unwrap().len(), content.len());
345
-
346
- // But we know it's on 3 peers
347
- let peers = store.find_peers_for_content(&hash)?;
348
- assert_eq!(peers.len(), 3);
349
-
350
- Ok(())
351
- }
352
-
353
- #[test]
354
- fn test_distributed_scenario_e_capability_discovery() -> Result<()> {
355
- // Test E - Capability discovery (find peer providing capability)
356
-
357
- let registry = CapabilityLocationRegistry::new();
358
-
359
- // Multiple peers provide different capabilities
360
- let peer_search = PeerId::new("search-node");
361
- registry.register_capability("search:docs".to_string(), peer_search.clone())?;
362
-
363
- let peer_vector = PeerId::new("vector-node");
364
- registry.register_capability("vector:embeddings".to_string(), peer_vector.clone())?;
365
-
366
- let peer_execute = PeerId::new("executor-node");
367
- registry.register_capability("execute:payments".to_string(), peer_execute.clone())?;
368
-
369
- // Some peers provide multiple capabilities
370
- registry.register_capability("search:docs".to_string(), peer_vector.clone())?;
371
-
372
- // Discover peers
373
- let search_peers = registry.peers_for_capability("search:docs")?;
374
- assert_eq!(search_peers.len(), 2);
375
-
376
- let vector_peers = registry.peers_for_capability("vector:embeddings")?;
377
- assert_eq!(vector_peers.len(), 1);
378
-
379
- // Check what each peer provides
380
- let search_caps = registry.capabilities_for_peer(&peer_search)?;
381
- assert_eq!(search_caps.len(), 1);
382
-
383
- let vector_caps = registry.capabilities_for_peer(&peer_vector)?;
384
- assert_eq!(vector_caps.len(), 2); // search:docs and vector:embeddings
385
-
386
- Ok(())
387
- }
388
-
389
- #[test]
390
- fn test_distributed_scenario_h_reference_graph() -> Result<()> {
391
- // Test H - Reference graph (resolve entire reference graph)
392
-
393
- #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
394
- struct Order {
395
- id: String,
396
- customer_id: String,
397
- items: Vec<String>,
398
- }
399
-
400
- let db = open("target/test_scenario_h_graph.db")?;
401
- let orders_cap = db.capability("orders");
402
-
403
- // Create interconnected objects
404
- let order = Order {
405
- id: "order-1".to_string(),
406
- customer_id: "customer-1".to_string(),
407
- items: vec!["item-1".to_string(), "item-2".to_string()],
408
- };
409
-
410
- orders_cap.insert_with_key("order-1", order.clone())?;
411
-
412
- // Create reference
413
- let order_ref = FlowRef::new("orders", "order-1");
414
- let resolved = db.resolve_ref::<Order>(&order_ref)?;
415
- assert!(resolved.is_some());
416
- let resolved_order = resolved.unwrap();
417
-
418
- // The graph is interconnected
419
- assert_eq!(resolved_order.customer_id, "customer-1");
420
- assert_eq!(resolved_order.items.len(), 2);
421
-
422
- Ok(())
423
- }
424
-
425
- #[test]
426
- fn test_distributed_scenario_node_capabilities() -> Result<()> {
427
- // Test related to node capabilities and peer discovery
428
-
429
- let db = open("target/test_node_capabilities.db")?;
430
-
431
- // Register multiple specialized nodes
432
- let canonical_node = PeerId::new("canonical-node");
433
- let canonical_ad = PeerAdvertisement::new(canonical_node)
434
- .with_namespace("orders")
435
- .with_namespace("docs")
436
- .with_namespace("customers");
437
-
438
- db.register_peer(canonical_ad)?;
439
-
440
- let search_node = PeerId::new("search-node");
441
- let search_ad = PeerAdvertisement::new(search_node)
442
- .with_namespace("docs")
443
- .with_capability("search:docs");
444
-
445
- db.register_peer(search_ad)?;
446
-
447
- let vector_node = PeerId::new("vector-node");
448
- let vector_ad = PeerAdvertisement::new(vector_node)
449
- .with_namespace("docs")
450
- .with_capability("vector:embeddings");
451
-
452
- db.register_peer(vector_ad)?;
453
-
454
- // Query discovery
455
- let docs_peers = db.peers_for_namespace("docs")?;
456
- assert_eq!(docs_peers.len(), 3); // All three have docs
457
-
458
- let orders_peers = db.peers_for_namespace("orders")?;
459
- assert_eq!(orders_peers.len(), 1); // Only canonical node
460
-
461
- let search_capable = db.peers_for_capability("search:docs")?;
462
- assert_eq!(search_capable.len(), 1);
463
- assert_eq!(search_capable[0].peer_id.id, "search-node");
464
-
465
- let all_peers = db.all_peers()?;
466
- assert_eq!(all_peers.len(), 3);
467
-
468
- Ok(())
469
- }
470
-
471
- #[test]
472
- fn test_distributed_scenario_offline_and_return() -> Result<()> {
473
- // Test G - Offline acquisition (reference resolution after peer return)
474
-
475
- // Initially, no peers available
476
- let db = open("target/test_offline_scenario.db")?;
477
- let peers = db.all_peers()?;
478
- assert_eq!(peers.len(), 0);
479
-
480
- // Try to resolve - will fail
481
- let flow_ref = FlowRef::new("docs", "123");
482
- let resolved = db.resolve_ref::<Document>(&flow_ref)?;
483
- assert!(resolved.is_none());
484
-
485
- // Peer comes online and registers
486
- let peer = PeerId::new("returning-peer");
487
- let ad = PeerAdvertisement::new(peer).with_namespace("docs");
488
-
489
- db.register_peer(ad)?;
490
-
491
- // Now we know the peer exists
492
- let peers = db.all_peers()?;
493
- assert_eq!(peers.len(), 1);
494
-
495
- // In a full implementation, we'd now be able to acquire from that peer
496
- let doc_peers = db.peers_for_namespace("docs")?;
497
- assert_eq!(doc_peers.len(), 1);
498
-
499
- Ok(())
500
- }
501
-
502
- #[test]
503
- fn test_complete_content_acquisition_workflow() {
504
- // End-to-end test: acquire → verify → materialize
505
-
506
- let store = ContentAddressableStore::new();
507
- let manager = ContentAcquisitionManager::new(store);
508
- let materializer = MaterializationHandler::new();
509
-
510
- // Step 1: Acquire content from peer
511
- let flow_ref = FlowRef::new("documents", "doc-workflow");
512
- let content = serde_json::json!({
513
- "id": "doc-workflow",
514
- "title": "Acquired Document",
515
- "content": "This document was acquired from a remote peer"
516
- });
517
- let content_bytes = serde_json::to_vec(&content).unwrap();
518
- let content_id = ContentIdentity::from_bytes(&content_bytes);
519
-
520
- // Step 2: Verify content identity
521
- let verify_result = ContentAcquisitionManager::verify_content(&content_bytes, &content_id);
522
- assert!(verify_result.is_ok());
523
-
524
- // Step 3: Materialize into local store
525
- let peer = PeerId::new("remote-peer");
526
- let metadata = AcquisitionMetadata::new(peer.clone(), true);
527
-
528
- manager
529
- .materialize(&flow_ref, content_bytes.clone(), &content_id)
530
- .unwrap();
531
- assert!(manager.has_local(&flow_ref).unwrap());
532
-
533
- // Step 4: Materialize as reactive operation
534
- let op = materializer
535
- .materialize_as_operation(&flow_ref, content_bytes, &metadata)
536
- .unwrap();
537
-
538
- // Verify operation has correct structure
539
- assert_eq!(op.key, "documents:doc-workflow");
540
- assert_eq!(op.capability, "documents");
541
- assert!(op.value.is_some());
542
-
543
- // Step 5: Verify materialization tracking
544
- assert!(materializer.is_materialized(&flow_ref).unwrap());
545
-
546
- println!("✓ Complete content acquisition workflow: acquire → verify → materialize → track");
547
- }
548
-
549
- #[test]
550
- fn test_acquisition_with_different_policies() {
551
- let store = ContentAddressableStore::new();
552
- let manager = ContentAcquisitionManager::new(store);
553
-
554
- let flow_ref = FlowRef::new("data", "item-policy");
555
-
556
- // Test LocalOnly - should not find non-existent content
557
- let result = manager
558
- .resolve(&flow_ref, AcquisitionPolicy::LocalOnly)
559
- .unwrap();
560
- assert!(result.is_none());
561
-
562
- // Test PreferLocal - tries local, then remote
563
- let result = manager
564
- .resolve(&flow_ref, AcquisitionPolicy::PreferLocal)
565
- .unwrap();
566
- assert!(result.is_none());
567
-
568
- // Test RemoteAllowed - allows automatic acquisition
569
- let result = manager
570
- .resolve(&flow_ref, AcquisitionPolicy::RemoteAllowed)
571
- .unwrap();
572
- assert!(result.is_none());
573
-
574
- // Test Required - enforces acquisition
575
- let result = manager
576
- .resolve(&flow_ref, AcquisitionPolicy::Required)
577
- .unwrap();
578
- assert!(result.is_none());
579
-
580
- println!("✓ Acquisition policies are enforced correctly");
581
- }
582
-
583
- #[test]
584
- fn test_materialization_creates_valid_operations() {
585
- // Verify that materialization produces operations that integrate with FeltDB
586
-
587
- let materializer = MaterializationHandler::new();
588
-
589
- // Test materializing structured JSON
590
- let flow_ref = FlowRef::new("users", "user-123");
591
- let json_content = serde_json::json!({
592
- "id": "user-123",
593
- "name": "Alice",
594
- "email": "alice@example.com"
595
- });
596
- let content_bytes = serde_json::to_vec(&json_content).unwrap();
597
- let peer = PeerId::new("authority-server");
598
- let metadata = AcquisitionMetadata::new(peer, false); // Not cached
599
-
600
- let op = materializer
601
- .materialize_as_operation(&flow_ref, content_bytes, &metadata)
602
- .unwrap();
603
-
604
- // Verify operation structure
605
- assert_eq!(op.capability, "users");
606
- assert_eq!(op.op_type, OperationType::Update);
607
- assert!(op.value.is_some());
608
-
609
- // Verify operation can be applied to reactive state
610
- let value = op.value.unwrap();
611
- assert_eq!(value["name"], "Alice");
612
-
613
- println!("✓ Materialization produces valid reactive operations");
614
- }
615
-
616
- #[test]
617
- fn test_resolution_metadata_tracking() {
618
- // Verify that resolution metadata is properly tracked
619
-
620
- let local_meta = ResolutionMetadata::local();
621
- assert!(local_meta.is_local);
622
- assert!(local_meta.source_peer.is_none());
623
-
624
- let peer = PeerId::new("source-peer");
625
- let remote_meta = ResolutionMetadata::remote(peer.clone());
626
- assert!(!remote_meta.is_local);
627
- assert_eq!(remote_meta.source_peer, Some(peer));
628
-
629
- // Verify results include metadata
630
- let content = b"resolution test".to_vec();
631
- let local_result = ResolutionResult::local(content.clone());
632
- assert_eq!(local_result.content, content);
633
- assert!(local_result.metadata.is_local);
634
-
635
- let remote_peer = PeerId::new("remote-source");
636
- let remote_result = ResolutionResult::remote(content.clone(), remote_peer.clone());
637
- assert_eq!(remote_result.content, content);
638
- assert!(!remote_result.metadata.is_local);
639
- assert_eq!(remote_result.metadata.source_peer, Some(remote_peer));
640
-
641
- println!("✓ Resolution metadata tracks source and locality");
642
- }
643
-
644
- #[test]
645
- fn test_acquisition_idempotency() {
646
- // Multiple concurrent acquisitions of same content
647
- // Should not result in duplicate materializations
648
-
649
- let store = ContentAddressableStore::new();
650
- let manager = ContentAcquisitionManager::new(store);
651
-
652
- let flow_ref = FlowRef::new("docs", "shared-doc");
653
- let content = b"shared document content".to_vec();
654
- let content_id = ContentIdentity::from_bytes(&content);
655
-
656
- // First materialization
657
- manager
658
- .materialize(&flow_ref, content.clone(), &content_id)
659
- .unwrap();
660
- assert!(manager.has_local(&flow_ref).unwrap());
661
-
662
- // Simulate 10 concurrent requests all getting the same content
663
- for _ in 0..10 {
664
- let retrieved = manager.get_local(&flow_ref).unwrap();
665
- assert_eq!(retrieved, Some(content.clone()));
666
-
667
- // All would read the same materialized content
668
- // No redundant acquisitions needed
669
- }
670
-
671
- println!("✓ Acquisition is idempotent - one materialization serves many requests");
672
- }
673
-
674
- #[test]
675
- fn test_a_local_capability_execution() {
676
- // Test A - Local capability available → execute locally
677
-
678
- let cap_ref = CapabilityRef::new("docs".to_string(), "vector-search".to_string(), 1);
679
- let ad = DistributedCapabilityAdvertisement::new(cap_ref.clone(), "local".to_string());
680
-
681
- let mut router = CapabilityRouter::new();
682
- router.register_local(ad);
683
- router.update_peer_state("local".to_string(), "docs".to_string(), 851);
684
-
685
- let decision = router.route(&cap_ref, 851, "local");
686
- assert_eq!(decision, RouteDecision::Local);
687
- println!("✓ Test A passed: Local capability executes locally");
688
- }
689
-
690
- #[test]
691
- fn test_b_remote_capability_discovery() {
692
- // Test B - Capability absent locally → discover peer → execute remotely
693
-
694
- let cap_ref = CapabilityRef::new("docs".to_string(), "vector-search".to_string(), 1);
695
- let ad = DistributedCapabilityAdvertisement::new(cap_ref.clone(), "peer-b".to_string());
696
-
697
- let mut router = CapabilityRouter::new();
698
- router.register_remote(ad);
699
- router.update_peer_state("peer-b".to_string(), "docs".to_string(), 851);
700
-
701
- let decision = router.route(&cap_ref, 851, "peer-a");
702
- assert_eq!(decision, RouteDecision::Remote("peer-b".to_string()));
703
- println!("✓ Test B passed: Remote capability discovered and routed");
704
- }
705
-
706
- #[test]
707
- fn test_c_reference_based_input() {
708
- // Test C - Remote capability receives FlowRefs and resolves them locally
709
-
710
- let cap_ref = CapabilityRef::new("docs".to_string(), "vector-search".to_string(), 1);
711
- let exec_ctx = CapabilityExecutionContext::new(
712
- "exec-123".to_string(),
713
- cap_ref.clone(),
714
- "peer-a".to_string(),
715
- )
716
- .with_input_ref("flow://docs#123".to_string())
717
- .with_input_ref("flow://docs#456".to_string());
718
-
719
- assert_eq!(exec_ctx.input_refs.len(), 2);
720
- assert_eq!(exec_ctx.input_refs[0], "flow://docs#123");
721
- assert_eq!(exec_ctx.input_refs[1], "flow://docs#456");
722
- println!("✓ Test C passed: Reference-based inputs track document references");
723
- }
724
-
725
- #[test]
726
- fn test_d_state_aware_routing() {
727
- // Test D - Provider lacks required state → acquires it before execution
728
-
729
- let cap_ref = CapabilityRef::new("docs".to_string(), "vector-search".to_string(), 1);
730
- let ad = DistributedCapabilityAdvertisement::new(cap_ref.clone(), "peer-b".to_string());
731
-
732
- let mut router = CapabilityRouter::new();
733
- router.register_remote(ad);
734
-
735
- // B only has version 847
736
- router.update_peer_state("peer-b".to_string(), "docs".to_string(), 847);
737
-
738
- // But we need 851
739
- assert!(router.requires_state_acquisition("peer-b", &cap_ref, 851));
740
-
741
- let plan = router.plan_state_acquisition("peer-b", &cap_ref, 851);
742
- assert_eq!(plan.len(), 1);
743
- assert_eq!(plan[0], "docs");
744
-
745
- println!("✓ Test D passed: State-aware routing detects need for acquisition");
746
- }
747
-
748
- #[test]
749
- fn test_e_execution_ownership() {
750
- // Test E - Two peers receive same request → exactly one execution
751
-
752
- let mut claimer = ExecutionClaimer::new();
753
-
754
- // Peer A attempts to claim
755
- let claim_a = claimer.try_claim("exec-123".to_string(), "peer-a".to_string());
756
- assert!(claim_a.is_some());
757
-
758
- // Peer B attempts to claim same execution
759
- let claim_b = claimer.try_claim("exec-123".to_string(), "peer-b".to_string());
760
- assert!(claim_b.is_none());
761
-
762
- // Verify A owns it
763
- assert!(claimer.is_claimed_by("exec-123", "peer-a"));
764
- assert!(!claimer.is_claimed_by("exec-123", "peer-b"));
765
-
766
- println!("✓ Test E passed: Execution ownership prevents duplicates");
767
- }
768
-
769
- #[test]
770
- fn test_f_retry_idempotency() {
771
- // Test F - Network retry → exactly one logical execution
772
-
773
- let mut publisher = ExecutionResultPublisher::new();
774
-
775
- let cap_ref = CapabilityRef::new("docs".to_string(), "vector-search".to_string(), 1);
776
- let exec_ref = ExecutionRef::new("exec-123".to_string(), cap_ref, "peer-b".to_string());
777
- let result = serde_json::json!({"results": [1, 2, 3]});
778
- let exec_result = CapabilityExecutionResult::success(exec_ref, result);
779
-
780
- publisher.publish(exec_result.clone());
781
-
782
- // Retry - should get same result
783
- let retrieved = publisher.get_result("exec-123");
784
- assert!(retrieved.is_some());
785
-
786
- // Verify same execution ID returned
787
- assert_eq!(retrieved.unwrap().execution_ref.execution_id, "exec-123");
788
-
789
- println!("✓ Test F passed: Retries return idempotent results");
790
- }
791
-
792
- #[test]
793
- fn test_g_result_convergence() {
794
- // Test G - Remote result becomes operation and synchronizes to requester
795
-
796
- let cap_ref = CapabilityRef::new("docs".to_string(), "vector-search".to_string(), 1);
797
- let exec_ref = ExecutionRef::new("exec-123".to_string(), cap_ref, "peer-b".to_string());
798
-
799
- let result = serde_json::json!({"results": [1, 2, 3]});
800
- let exec_result = CapabilityExecutionResult::success(exec_ref.clone(), result.clone());
801
-
802
- // Result tracks the execution that produced it
803
- assert_eq!(exec_result.execution_ref.execution_id, "exec-123");
804
- assert_eq!(exec_result.result, result);
805
- assert!(exec_result.error.is_none());
806
-
807
- println!("✓ Test G passed: Results track execution provenance");
808
- }
809
-
810
- #[test]
811
- fn test_h_reactive_execution() {
812
- // Test H - Remote execution result → canonical state → reactive subscriber fires
813
-
814
- let cap_ref = CapabilityRef::new("docs".to_string(), "vector-search".to_string(), 1);
815
- let exec_ref = ExecutionRef::new(
816
- "exec-123".to_string(),
817
- cap_ref.clone(),
818
- "peer-b".to_string(),
819
- );
820
-
821
- // Result can track what inputs were used
822
- let mut tracked_ref = exec_ref;
823
- tracked_ref.input_refs.push("flow://docs#123".to_string());
824
- tracked_ref.input_refs.push("flow://docs#456".to_string());
825
-
826
- // And what state version was in use
827
- tracked_ref.input_state_version = 851;
828
-
829
- // With this complete context, results flow through reactive system
830
- assert_eq!(tracked_ref.input_refs.len(), 2);
831
- assert_eq!(tracked_ref.input_state_version, 851);
832
-
833
- println!("✓ Test H passed: Execution results have full reactive context");
834
- }
835
-
836
- #[test]
837
- fn test_i_provider_failover() {
838
- // Test I - Provider A disappears → request routes to provider B
839
-
840
- let cap_ref = CapabilityRef::new("docs".to_string(), "vector-search".to_string(), 1);
841
-
842
- let mut router = CapabilityRouter::new();
843
-
844
- // Register both providers
845
- let ad_a = DistributedCapabilityAdvertisement::new(cap_ref.clone(), "peer-a".to_string());
846
- let ad_b = DistributedCapabilityAdvertisement::new(cap_ref.clone(), "peer-b".to_string());
847
-
848
- router.register_remote(ad_a);
849
- router.register_remote(ad_b);
850
-
851
- router.update_peer_state("peer-a".to_string(), "docs".to_string(), 851);
852
- router.update_peer_state("peer-b".to_string(), "docs".to_string(), 851);
853
-
854
- // Find compatible providers (should get both)
855
- let providers = router.find_compatible_providers(&cap_ref, 851);
856
- assert!(providers.len() >= 1); // At least one available
857
-
858
- // If A goes down, B still available
859
- // (In real scenario, would remove A's advertisement)
860
- let providers_after = router.find_compatible_providers(&cap_ref, 851);
861
- assert!(providers_after.len() >= 1);
862
-
863
- println!("✓ Test I passed: Multiple providers enable failover");
864
- }
865
-
866
- #[test]
867
- fn test_j_no_provider_durable() {
868
- // Test J - Request becomes durable pending execution
869
-
870
- let cap_ref = CapabilityRef::new("docs".to_string(), "vector-search".to_string(), 1);
871
-
872
- let router = CapabilityRouter::new(); // Empty router - no providers
873
-
874
- let decision = router.route(&cap_ref, 851, "peer-a");
875
- assert_eq!(decision, RouteDecision::Unavailable);
876
-
877
- // In real implementation, this would create a pending execution
878
- // that waits for a provider to appear
879
-
880
- println!("✓ Test J passed: Unavailable capabilities detected");
881
- }
882
-
883
- #[test]
884
- fn test_k_provider_recovery() {
885
- // Test K - Provider appears → pending execution resumes
886
-
887
- let cap_ref = CapabilityRef::new("docs".to_string(), "vector-search".to_string(), 1);
888
-
889
- let mut router = CapabilityRouter::new();
890
-
891
- // Initially unavailable
892
- let decision1 = router.route(&cap_ref, 851, "peer-a");
893
- assert_eq!(decision1, RouteDecision::Unavailable);
894
-
895
- // Provider appears
896
- let ad = DistributedCapabilityAdvertisement::new(cap_ref.clone(), "peer-b".to_string());
897
- router.register_remote(ad);
898
- router.update_peer_state("peer-b".to_string(), "docs".to_string(), 851);
899
-
900
- // Now available
901
- let decision2 = router.route(&cap_ref, 851, "peer-a");
902
- assert_eq!(decision2, RouteDecision::Remote("peer-b".to_string()));
903
-
904
- println!("✓ Test K passed: Provider recovery enables execution");
905
- }
906
-
907
- #[test]
908
- fn test_l_capability_authorization() {
909
- // Test L - Unauthorized peer/request cannot execute capability
910
-
911
- let access_model = CapabilityAccessModel::new(
912
- vec!["docs".to_string()],
913
- vec!["search-results".to_string()],
914
- vec![],
915
- );
916
-
917
- // Capability can read docs
918
- assert!(access_model.can_read("docs"));
919
-
920
- // But cannot write to other collections
921
- assert!(!access_model.can_write("users"));
922
-
923
- // Cannot execute external systems it doesn't have permission for
924
- assert!(!access_model.can_execute("payment-service"));
925
-
926
- println!("✓ Test L passed: Capability access control enforced");
927
- }
928
-
929
- #[test]
930
- fn test_m_result_provenance() {
931
- // Test M - Result exposes: who executed it, what capability, what inputs, state version
932
-
933
- let cap_ref = CapabilityRef::new("docs".to_string(), "vector-search".to_string(), 1);
934
- let mut exec_ref = ExecutionRef::new(
935
- "exec-123".to_string(),
936
- cap_ref.clone(),
937
- "peer-b".to_string(),
938
- );
939
-
940
- // Add input references
941
- exec_ref.input_refs.push("flow://docs#123".to_string());
942
- exec_ref.input_refs.push("flow://docs#456".to_string());
943
-
944
- // Record state version at execution time
945
- exec_ref.input_state_version = 851;
946
-
947
- // Verify full provenance
948
- assert_eq!(exec_ref.execution_id, "exec-123");
949
- assert_eq!(exec_ref.capability_ref, cap_ref);
950
- assert_eq!(exec_ref.provider_peer, "peer-b");
951
- assert_eq!(exec_ref.input_refs.len(), 2);
952
- assert_eq!(exec_ref.input_state_version, 851);
953
-
954
- println!("✓ Test M passed: Complete execution provenance tracked");
955
- }
956
-
957
- #[test]
958
- fn test_n_multi_peer_consistency() {
959
- // Test N - Three peers, two providers, random routing → identical final state
960
-
961
- let cap_ref = CapabilityRef::new("docs".to_string(), "vector-search".to_string(), 1);
962
-
963
- let mut router = CapabilityRouter::new();
964
-
965
- // Register capability at two providers
966
- let ad_b = DistributedCapabilityAdvertisement::new(cap_ref.clone(), "peer-b".to_string());
967
- let ad_c = DistributedCapabilityAdvertisement::new(cap_ref.clone(), "peer-c".to_string());
968
-
969
- router.register_remote(ad_b);
970
- router.register_remote(ad_c);
971
-
972
- // Both have same state version
973
- router.update_peer_state("peer-b".to_string(), "docs".to_string(), 851);
974
- router.update_peer_state("peer-c".to_string(), "docs".to_string(), 851);
975
-
976
- // Three peers making requests
977
- let decision_a = router.route(&cap_ref, 851, "peer-a");
978
- let _decision_b = router.route(&cap_ref, 851, "peer-b");
979
- let _decision_c = router.route(&cap_ref, 851, "peer-c");
980
-
981
- // All should route to available providers
982
- assert_ne!(decision_a, RouteDecision::Unavailable);
983
- // B and C can use local if available, otherwise find remote
984
-
985
- // Using same input state version, all produce consistent routing
986
- match decision_a {
987
- RouteDecision::Remote(_peer_id) => {
988
- // A routed to a remote peer
989
- assert!(true);
990
- }
991
- RouteDecision::Local => {
992
- // A has local capability
993
- assert!(true);
994
- }
995
- RouteDecision::Unavailable => {
996
- // Should not happen with providers registered
997
- assert!(false, "Expected capability to be available");
998
- }
999
- }
1000
-
1001
- println!("✓ Test N passed: Multi-peer consistency with provider discovery");
1002
- }
1003
- }