@feltdb/core 0.15.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 (247) hide show
  1. package/dist/agent-state.d.ts +20 -0
  2. package/dist/agent-state.d.ts.map +1 -1
  3. package/dist/agent-state.js +36 -0
  4. package/dist/build-identity.json +12 -4
  5. package/dist/cli/commands.js +187 -4
  6. package/dist/cli/publish-engine.js +116 -16
  7. package/dist/collection.d.ts.map +1 -1
  8. package/dist/collection.js +3 -0
  9. package/dist/create/build-identity.json +12 -4
  10. package/dist/create/managed-account.js +93 -35
  11. package/dist/create/package-versions.js +1 -1
  12. package/dist/create/server-source/Cargo.lock +6 -509
  13. package/dist/create/server-source/Cargo.toml +2 -13
  14. package/dist/create/server-source/crates/feltdb-client/Cargo.toml +1 -1
  15. package/dist/create/server-source/crates/feltdb-server/Cargo.toml +1 -1
  16. package/dist/create/server-source/crates/feltdb-server/src/main.rs +255 -12
  17. package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +1 -1
  18. package/dist/db.d.ts +11 -1
  19. package/dist/db.d.ts.map +1 -1
  20. package/dist/db.js +15 -2
  21. package/dist/error-codes.d.ts +5 -0
  22. package/dist/error-codes.d.ts.map +1 -1
  23. package/dist/error-codes.js +9 -1
  24. package/dist/http-db.d.ts +16 -0
  25. package/dist/http-db.d.ts.map +1 -1
  26. package/dist/http-db.js +36 -6
  27. package/dist/managed-recovery.d.ts +6 -0
  28. package/dist/managed-recovery.d.ts.map +1 -1
  29. package/dist/managed-recovery.js +9 -0
  30. package/dist/studio-app/assets/{feltdb_wasm-BjM1ylL3.js → feltdb_wasm-DtybUY0q.js} +1 -1
  31. package/dist/studio-app/assets/feltdb_wasm_bg-DsgIUwaB.wasm +0 -0
  32. package/dist/studio-app/assets/index-C4OffsZl.js +37 -0
  33. package/dist/studio-app/index.html +1 -1
  34. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  35. package/dist/wasm/package.json +1 -1
  36. package/dist/workload.d.ts +55 -3
  37. package/dist/workload.d.ts.map +1 -1
  38. package/dist/workload.js +23 -0
  39. package/dist/workspace/workspace-connection.d.ts.map +1 -1
  40. package/dist/workspace/workspace-connection.js +14 -3
  41. package/package.json +1 -1
  42. package/dist/create/server-source/crates/feltdb/Cargo.lock +0 -175
  43. package/dist/create/server-source/crates/feltdb/Cargo.toml +0 -102
  44. package/dist/create/server-source/crates/feltdb/LICENSE +0 -21
  45. package/dist/create/server-source/crates/feltdb/README.md +0 -75
  46. package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +0 -370
  47. package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +0 -589
  48. package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +0 -247
  49. package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +0 -440
  50. package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +0 -275
  51. package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +0 -381
  52. package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +0 -467
  53. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +0 -489
  54. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +0 -281
  55. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +0 -606
  56. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +0 -531
  57. package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +0 -462
  58. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +0 -505
  59. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +0 -484
  60. package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +0 -758
  61. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +0 -421
  62. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +0 -329
  63. package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +0 -1705
  64. package/dist/create/server-source/crates/feltdb/src/acquisition.rs +0 -286
  65. package/dist/create/server-source/crates/feltdb/src/admission.rs +0 -185
  66. package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +0 -507
  67. package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +0 -539
  68. package/dist/create/server-source/crates/feltdb/src/agent_state.rs +0 -320
  69. package/dist/create/server-source/crates/feltdb/src/agent_transition_contract.rs +0 -1545
  70. package/dist/create/server-source/crates/feltdb/src/analytics.rs +0 -521
  71. package/dist/create/server-source/crates/feltdb/src/application.rs +0 -2674
  72. package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +0 -1070
  73. package/dist/create/server-source/crates/feltdb/src/authority.rs +0 -479
  74. package/dist/create/server-source/crates/feltdb/src/authority_failover.rs +0 -847
  75. package/dist/create/server-source/crates/feltdb/src/authorization.rs +0 -1030
  76. package/dist/create/server-source/crates/feltdb/src/authorization_security_tests.rs +0 -1122
  77. package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority-client.rs +0 -32
  78. package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority.rs +0 -19
  79. package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +0 -1474
  80. package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +0 -8
  81. package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +0 -418
  82. package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +0 -482
  83. package/dist/create/server-source/crates/feltdb/src/capability.rs +0 -903
  84. package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +0 -263
  85. package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +0 -77
  86. package/dist/create/server-source/crates/feltdb/src/causal_backlog_bound.rs +0 -496
  87. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +0 -2574
  88. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +0 -212
  89. package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +0 -422
  90. package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +0 -445
  91. package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +0 -465
  92. package/dist/create/server-source/crates/feltdb/src/convergence.rs +0 -634
  93. package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +0 -427
  94. package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +0 -376
  95. package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +0 -365
  96. package/dist/create/server-source/crates/feltdb/src/cron.rs +0 -294
  97. package/dist/create/server-source/crates/feltdb/src/dedup_bound_investigation.rs +0 -483
  98. package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +0 -477
  99. package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +0 -1003
  100. package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +0 -1334
  101. package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +0 -368
  102. package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +0 -231
  103. package/dist/create/server-source/crates/feltdb/src/durable_operation_identity.rs +0 -482
  104. package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +0 -203
  105. package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +0 -317
  106. package/dist/create/server-source/crates/feltdb/src/equality_index.rs +0 -595
  107. package/dist/create/server-source/crates/feltdb/src/execution.rs +0 -426
  108. package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +0 -214
  109. package/dist/create/server-source/crates/feltdb/src/indexing.rs +0 -776
  110. package/dist/create/server-source/crates/feltdb/src/lib.rs +0 -7365
  111. package/dist/create/server-source/crates/feltdb/src/managed_cas_tests.rs +0 -234
  112. package/dist/create/server-source/crates/feltdb/src/materialization.rs +0 -184
  113. package/dist/create/server-source/crates/feltdb/src/metrics.rs +0 -266
  114. package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +0 -310
  115. package/dist/create/server-source/crates/feltdb/src/multi_operation_transaction.rs +0 -736
  116. package/dist/create/server-source/crates/feltdb/src/observability.rs +0 -379
  117. package/dist/create/server-source/crates/feltdb/src/operation.rs +0 -290
  118. package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +0 -439
  119. package/dist/create/server-source/crates/feltdb/src/operation_log.rs +0 -349
  120. package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +0 -332
  121. package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +0 -718
  122. package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +0 -487
  123. package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +0 -166
  124. package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +0 -289
  125. package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +0 -566
  126. package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +0 -3391
  127. package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +0 -203
  128. package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +0 -261
  129. package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +0 -502
  130. package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +0 -216
  131. package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +0 -303
  132. package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +0 -323
  133. package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +0 -531
  134. package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +0 -406
  135. package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +0 -436
  136. package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +0 -387
  137. package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +0 -378
  138. package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +0 -359
  139. package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +0 -372
  140. package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +0 -404
  141. package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +0 -376
  142. package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +0 -461
  143. package/dist/create/server-source/crates/feltdb/src/policy_evaluation.rs +0 -2125
  144. package/dist/create/server-source/crates/feltdb/src/production_api.rs +0 -418
  145. package/dist/create/server-source/crates/feltdb/src/provenance.rs +0 -207
  146. package/dist/create/server-source/crates/feltdb/src/query_execution_diagnostics.rs +0 -126
  147. package/dist/create/server-source/crates/feltdb/src/query_performance.rs +0 -218
  148. package/dist/create/server-source/crates/feltdb/src/read_basis.rs +0 -257
  149. package/dist/create/server-source/crates/feltdb/src/references.rs +0 -404
  150. package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +0 -401
  151. package/dist/create/server-source/crates/feltdb/src/replica_acknowledgements.rs +0 -501
  152. package/dist/create/server-source/crates/feltdb/src/replica_membership.rs +0 -680
  153. package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +0 -163
  154. package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +0 -133
  155. package/dist/create/server-source/crates/feltdb/src/routing.rs +0 -409
  156. package/dist/create/server-source/crates/feltdb/src/semantic_decision.rs +0 -2029
  157. package/dist/create/server-source/crates/feltdb/src/semantic_query.rs +0 -599
  158. package/dist/create/server-source/crates/feltdb/src/sharding.rs +0 -549
  159. package/dist/create/server-source/crates/feltdb/src/state_conflict_contract.rs +0 -516
  160. package/dist/create/server-source/crates/feltdb/src/state_contract.rs +0 -6003
  161. package/dist/create/server-source/crates/feltdb/src/state_diff_contract.rs +0 -222
  162. package/dist/create/server-source/crates/feltdb/src/state_facade.rs +0 -320
  163. package/dist/create/server-source/crates/feltdb/src/state_hash.rs +0 -291
  164. package/dist/create/server-source/crates/feltdb/src/state_model.rs +0 -4158
  165. package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +0 -379
  166. package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +0 -673
  167. package/dist/create/server-source/crates/feltdb/src/storage.rs +0 -273
  168. package/dist/create/server-source/crates/feltdb/src/submission.rs +0 -471
  169. package/dist/create/server-source/crates/feltdb/src/sync.rs +0 -495
  170. package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +0 -822
  171. package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +0 -433
  172. package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +0 -462
  173. package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +0 -965
  174. package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +0 -1120
  175. package/dist/create/server-source/crates/feltdb/src/transactions.rs +0 -643
  176. package/dist/create/server-source/crates/feltdb/src/trigger.rs +0 -390
  177. package/dist/create/server-source/crates/feltdb/src/trigger_contract.rs +0 -749
  178. package/dist/create/server-source/crates/feltdb/src/versioned_object_substrate.rs +0 -708
  179. package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +0 -1269
  180. package/dist/create/server-source/crates/feltdb/src/workflow.rs +0 -713
  181. package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +0 -510
  182. package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +0 -354
  183. package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +0 -594
  184. package/dist/create/server-source/crates/feltdb/src/workload.rs +0 -4222
  185. package/dist/create/server-source/crates/feltdb/src/workload_diagnostics.rs +0 -456
  186. package/dist/create/server-source/crates/feltdb/tests/agent_state_native.rs +0 -1188
  187. package/dist/create/server-source/crates/feltdb/tests/agent_transition_contract_conformance.rs +0 -2884
  188. package/dist/create/server-source/crates/feltdb/tests/authority_process.rs +0 -297
  189. package/dist/create/server-source/crates/feltdb/tests/authority_transaction_identity.rs +0 -534
  190. package/dist/create/server-source/crates/feltdb/tests/bounded_read_contract.rs +0 -132
  191. package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +0 -299
  192. package/dist/create/server-source/crates/feltdb/tests/common/mod.rs +0 -96
  193. package/dist/create/server-source/crates/feltdb/tests/compaction_stall_contract.rs +0 -272
  194. package/dist/create/server-source/crates/feltdb/tests/crash_durability_contract.rs +0 -467
  195. package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +0 -309
  196. package/dist/create/server-source/crates/feltdb/tests/durable_backup_contract.rs +0 -445
  197. package/dist/create/server-source/crates/feltdb/tests/durable_corruption_contract.rs +0 -518
  198. package/dist/create/server-source/crates/feltdb/tests/durable_format_compatibility.rs +0 -392
  199. package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +0 -850
  200. package/dist/create/server-source/crates/feltdb/tests/fixtures/agent_transition_corpus.json +0 -23340
  201. package/dist/create/server-source/crates/feltdb/tests/fixtures/state_conflict_contract_corpus.json +0 -1916
  202. package/dist/create/server-source/crates/feltdb/tests/fixtures/state_diff_contract_corpus.json +0 -1878
  203. package/dist/create/server-source/crates/feltdb/tests/fixtures/trigger_contract_corpus.json +0 -1862
  204. package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_evidence.rs +0 -123
  205. package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_substrate_completion.rs +0 -299
  206. package/dist/create/server-source/crates/feltdb/tests/local_process_ownership.rs +0 -69
  207. package/dist/create/server-source/crates/feltdb/tests/managed_incident_regression.rs +0 -191
  208. package/dist/create/server-source/crates/feltdb/tests/operational_health_contract.rs +0 -278
  209. package/dist/create/server-source/crates/feltdb/tests/pr34_query_collection.rs +0 -234
  210. package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +0 -947
  211. package/dist/create/server-source/crates/feltdb/tests/pr7_self_authorization_proof.rs +0 -404
  212. package/dist/create/server-source/crates/feltdb/tests/pr8_vocabulary_assessment.rs +0 -916
  213. package/dist/create/server-source/crates/feltdb/tests/pr9_phase2_boundary_tests.rs +0 -1045
  214. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3a_path_a_tests.rs +0 -347
  215. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_authorized_mutations.rs +0 -361
  216. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs +0 -330
  217. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_simple_auth_delete.rs +0 -93
  218. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs +0 -622
  219. package/dist/create/server-source/crates/feltdb/tests/pr9_teams_role_based_access.rs +0 -517
  220. package/dist/create/server-source/crates/feltdb/tests/production_certification.rs +0 -1153
  221. package/dist/create/server-source/crates/feltdb/tests/production_contract.rs +0 -771
  222. package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +0 -1383
  223. package/dist/create/server-source/crates/feltdb/tests/reconciliation_application.rs +0 -868
  224. package/dist/create/server-source/crates/feltdb/tests/reconciliation_wire_format_evidence.rs +0 -221
  225. package/dist/create/server-source/crates/feltdb/tests/replicated_history_contract.rs +0 -417
  226. package/dist/create/server-source/crates/feltdb/tests/resource_scoped_revisions.rs +0 -338
  227. package/dist/create/server-source/crates/feltdb/tests/revision_identity_contract.rs +0 -1039
  228. package/dist/create/server-source/crates/feltdb/tests/revision_model_decision.rs +0 -739
  229. package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +0 -452
  230. package/dist/create/server-source/crates/feltdb/tests/saas_authorization_integration.rs +0 -81
  231. package/dist/create/server-source/crates/feltdb/tests/saas_invitation_lifecycle.rs +0 -438
  232. package/dist/create/server-source/crates/feltdb/tests/semantic_decision.rs +0 -1165
  233. package/dist/create/server-source/crates/feltdb/tests/semantic_query.rs +0 -767
  234. package/dist/create/server-source/crates/feltdb/tests/semantic_query_contract.rs +0 -363
  235. package/dist/create/server-source/crates/feltdb/tests/state_conflict_contract_conformance.rs +0 -1799
  236. package/dist/create/server-source/crates/feltdb/tests/state_diff_contract_conformance.rs +0 -1316
  237. package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +0 -358
  238. package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +0 -365
  239. package/dist/create/server-source/crates/feltdb/tests/state_ref_authority.rs +0 -918
  240. package/dist/create/server-source/crates/feltdb/tests/state_store_boundary_evidence.rs +0 -299
  241. package/dist/create/server-source/crates/feltdb/tests/storage_independent_versioned_object_substrate.rs +0 -328
  242. package/dist/create/server-source/crates/feltdb/tests/sync_divergence_evidence.rs +0 -255
  243. package/dist/create/server-source/crates/feltdb/tests/three_way_input_boundary_evidence.rs +0 -249
  244. package/dist/create/server-source/crates/feltdb/tests/trigger_contract_conformance.rs +0 -994
  245. package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +0 -484
  246. package/dist/studio-app/assets/feltdb_wasm_bg-TseJn2Ax.wasm +0 -0
  247. package/dist/studio-app/assets/index-1wd0uKua.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
- }