@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.
- package/dist/agent-runtime.d.ts +64 -2
- package/dist/agent-runtime.d.ts.map +1 -1
- package/dist/agent-runtime.js +121 -11
- package/dist/agent-state.d.ts +68 -0
- package/dist/agent-state.d.ts.map +1 -1
- package/dist/agent-state.js +210 -12
- package/dist/agent.d.ts +10 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +10 -1
- package/dist/build-identity.json +12 -4
- package/dist/cli/commands.js +214 -10
- package/dist/cli/publish-engine.js +116 -16
- package/dist/collection.d.ts +3 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +33 -8
- package/dist/create/build-identity.json +12 -4
- package/dist/create/cli.js +1 -1
- package/dist/create/create.js +4 -6
- package/dist/create/managed-account.js +93 -35
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +8 -511
- package/dist/create/server-source/Cargo.toml +2 -13
- package/dist/create/server-source/crates/feltdb-client/Cargo.toml +1 -1
- package/dist/create/server-source/crates/feltdb-server/Cargo.toml +1 -1
- package/dist/create/server-source/crates/feltdb-server/README.md +6 -1
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +9 -1
- package/dist/create/server-source/crates/feltdb-server/src/auth.rs +85 -25
- package/dist/create/server-source/crates/feltdb-server/src/backup.rs +4 -0
- package/dist/create/server-source/crates/feltdb-server/src/console_accounts.rs +1009 -0
- package/dist/create/server-source/crates/feltdb-server/src/control_authorization.rs +441 -0
- package/dist/create/server-source/crates/feltdb-server/src/identity.rs +68 -6
- package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +355 -23
- package/dist/create/server-source/crates/feltdb-server/src/lib.rs +3 -0
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +1134 -96
- package/dist/create/server-source/crates/feltdb-server/src/redaction.rs +208 -0
- package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +198 -19
- package/dist/create/server-source/crates/feltdb-server/tests/transaction_precondition_contract.rs +403 -0
- package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +1 -1
- package/dist/db.d.ts +75 -10
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +168 -29
- package/dist/deployment.d.ts +19 -0
- package/dist/deployment.d.ts.map +1 -1
- package/dist/deployment.js +38 -2
- package/dist/embedded-query.d.ts.map +1 -1
- package/dist/embedded-query.js +5 -4
- package/dist/embedded-transaction.d.ts +8 -4
- package/dist/embedded-transaction.d.ts.map +1 -1
- package/dist/embedded-transaction.js +55 -19
- package/dist/error-codes.d.ts +36 -2
- package/dist/error-codes.d.ts.map +1 -1
- package/dist/error-codes.js +50 -3
- package/dist/feltdb.d.ts +7 -0
- package/dist/feltdb.d.ts.map +1 -1
- package/dist/file-db.d.ts +27 -0
- package/dist/file-db.d.ts.map +1 -1
- package/dist/file-db.js +145 -7
- package/dist/http-client.d.ts +11 -3
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +27 -14
- package/dist/http-db.d.ts +43 -1
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +287 -59
- package/dist/index.js +1 -1
- package/dist/local-state-lock.d.ts +34 -0
- package/dist/local-state-lock.d.ts.map +1 -0
- package/dist/local-state-lock.js +225 -0
- package/dist/managed-recovery.d.ts +6 -0
- package/dist/managed-recovery.d.ts.map +1 -1
- package/dist/managed-recovery.js +9 -0
- package/dist/reactive-graph.d.ts +0 -3
- package/dist/reactive-graph.d.ts.map +1 -1
- package/dist/reactive-graph.js +11 -1
- package/dist/runtime-registry.d.ts +7 -2
- package/dist/runtime-registry.d.ts.map +1 -1
- package/dist/runtime-registry.js +2 -2
- package/dist/studio/components/index.js +1 -1
- package/dist/studio/{components-BSGmHfif.js → components-CJmzntBi.js} +2 -1
- package/dist/studio/index.js +1 -1
- package/dist/studio-app/assets/{feltdb_wasm-3hDngl1h.js → feltdb_wasm-DtybUY0q.js} +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-DsgIUwaB.wasm +0 -0
- package/dist/studio-app/assets/index-C4OffsZl.js +37 -0
- package/dist/studio-app/index.html +1 -1
- package/dist/transaction.d.ts +27 -11
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +20 -14
- package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/wasm/package.json +1 -1
- package/dist/workload.d.ts +86 -6
- package/dist/workload.d.ts.map +1 -1
- package/dist/workload.js +51 -3
- package/dist/workspace/workspace-connection.d.ts.map +1 -1
- package/dist/workspace/workspace-connection.js +14 -3
- package/package.json +1 -1
- package/dist/create/server-source/crates/feltdb/Cargo.lock +0 -175
- package/dist/create/server-source/crates/feltdb/Cargo.toml +0 -102
- package/dist/create/server-source/crates/feltdb/LICENSE +0 -21
- package/dist/create/server-source/crates/feltdb/README.md +0 -75
- package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +0 -370
- package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +0 -589
- package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +0 -247
- package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +0 -440
- package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +0 -275
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +0 -381
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +0 -467
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +0 -489
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +0 -281
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +0 -606
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +0 -531
- package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +0 -462
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +0 -505
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +0 -484
- package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +0 -758
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +0 -421
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +0 -329
- package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +0 -1705
- package/dist/create/server-source/crates/feltdb/src/acquisition.rs +0 -286
- package/dist/create/server-source/crates/feltdb/src/admission.rs +0 -185
- package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +0 -507
- package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +0 -539
- package/dist/create/server-source/crates/feltdb/src/agent_state.rs +0 -320
- package/dist/create/server-source/crates/feltdb/src/agent_transition_contract.rs +0 -1545
- package/dist/create/server-source/crates/feltdb/src/analytics.rs +0 -521
- package/dist/create/server-source/crates/feltdb/src/application.rs +0 -2674
- package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +0 -1070
- package/dist/create/server-source/crates/feltdb/src/authority.rs +0 -479
- package/dist/create/server-source/crates/feltdb/src/authority_failover.rs +0 -847
- package/dist/create/server-source/crates/feltdb/src/authorization.rs +0 -1030
- package/dist/create/server-source/crates/feltdb/src/authorization_security_tests.rs +0 -1122
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority-client.rs +0 -32
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority.rs +0 -19
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +0 -1474
- package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +0 -8
- package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +0 -418
- package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +0 -482
- package/dist/create/server-source/crates/feltdb/src/capability.rs +0 -903
- package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +0 -263
- package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +0 -77
- package/dist/create/server-source/crates/feltdb/src/causal_backlog_bound.rs +0 -496
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +0 -2574
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +0 -212
- package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +0 -422
- package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +0 -445
- package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +0 -465
- package/dist/create/server-source/crates/feltdb/src/convergence.rs +0 -634
- package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +0 -427
- package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +0 -376
- package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +0 -365
- package/dist/create/server-source/crates/feltdb/src/cron.rs +0 -294
- package/dist/create/server-source/crates/feltdb/src/dedup_bound_investigation.rs +0 -483
- package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +0 -477
- package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +0 -1003
- package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +0 -1334
- package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +0 -368
- package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +0 -231
- package/dist/create/server-source/crates/feltdb/src/durable_operation_identity.rs +0 -482
- package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +0 -203
- package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +0 -317
- package/dist/create/server-source/crates/feltdb/src/equality_index.rs +0 -595
- package/dist/create/server-source/crates/feltdb/src/execution.rs +0 -426
- package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +0 -214
- package/dist/create/server-source/crates/feltdb/src/indexing.rs +0 -776
- package/dist/create/server-source/crates/feltdb/src/lib.rs +0 -7274
- package/dist/create/server-source/crates/feltdb/src/managed_cas_tests.rs +0 -234
- package/dist/create/server-source/crates/feltdb/src/materialization.rs +0 -184
- package/dist/create/server-source/crates/feltdb/src/metrics.rs +0 -266
- package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +0 -310
- package/dist/create/server-source/crates/feltdb/src/multi_operation_transaction.rs +0 -736
- package/dist/create/server-source/crates/feltdb/src/observability.rs +0 -379
- package/dist/create/server-source/crates/feltdb/src/operation.rs +0 -290
- package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +0 -439
- package/dist/create/server-source/crates/feltdb/src/operation_log.rs +0 -349
- package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +0 -332
- package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +0 -718
- package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +0 -487
- package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +0 -166
- package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +0 -289
- package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +0 -566
- package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +0 -3391
- package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +0 -203
- package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +0 -261
- package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +0 -502
- package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +0 -216
- package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +0 -303
- package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +0 -323
- package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +0 -531
- package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +0 -406
- package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +0 -436
- package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +0 -387
- package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +0 -378
- package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +0 -359
- package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +0 -372
- package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +0 -404
- package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +0 -376
- package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +0 -461
- package/dist/create/server-source/crates/feltdb/src/policy_evaluation.rs +0 -2125
- package/dist/create/server-source/crates/feltdb/src/production_api.rs +0 -418
- package/dist/create/server-source/crates/feltdb/src/provenance.rs +0 -207
- package/dist/create/server-source/crates/feltdb/src/query_execution_diagnostics.rs +0 -126
- package/dist/create/server-source/crates/feltdb/src/query_performance.rs +0 -218
- package/dist/create/server-source/crates/feltdb/src/read_basis.rs +0 -257
- package/dist/create/server-source/crates/feltdb/src/references.rs +0 -404
- package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +0 -401
- package/dist/create/server-source/crates/feltdb/src/replica_acknowledgements.rs +0 -501
- package/dist/create/server-source/crates/feltdb/src/replica_membership.rs +0 -680
- package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +0 -163
- package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +0 -133
- package/dist/create/server-source/crates/feltdb/src/routing.rs +0 -409
- package/dist/create/server-source/crates/feltdb/src/semantic_decision.rs +0 -2029
- package/dist/create/server-source/crates/feltdb/src/semantic_query.rs +0 -599
- package/dist/create/server-source/crates/feltdb/src/sharding.rs +0 -549
- package/dist/create/server-source/crates/feltdb/src/state_conflict_contract.rs +0 -516
- package/dist/create/server-source/crates/feltdb/src/state_contract.rs +0 -5894
- package/dist/create/server-source/crates/feltdb/src/state_diff_contract.rs +0 -222
- package/dist/create/server-source/crates/feltdb/src/state_facade.rs +0 -320
- package/dist/create/server-source/crates/feltdb/src/state_hash.rs +0 -291
- package/dist/create/server-source/crates/feltdb/src/state_model.rs +0 -4158
- package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +0 -379
- package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +0 -673
- package/dist/create/server-source/crates/feltdb/src/storage.rs +0 -273
- package/dist/create/server-source/crates/feltdb/src/submission.rs +0 -471
- package/dist/create/server-source/crates/feltdb/src/sync.rs +0 -495
- package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +0 -822
- package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +0 -433
- package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +0 -462
- package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +0 -965
- package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +0 -1120
- package/dist/create/server-source/crates/feltdb/src/transactions.rs +0 -643
- package/dist/create/server-source/crates/feltdb/src/trigger.rs +0 -390
- package/dist/create/server-source/crates/feltdb/src/trigger_contract.rs +0 -749
- package/dist/create/server-source/crates/feltdb/src/versioned_object_substrate.rs +0 -708
- package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +0 -1133
- package/dist/create/server-source/crates/feltdb/src/workflow.rs +0 -713
- package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +0 -510
- package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +0 -354
- package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +0 -594
- package/dist/create/server-source/crates/feltdb/src/workload.rs +0 -2886
- package/dist/create/server-source/crates/feltdb/src/workload_diagnostics.rs +0 -456
- package/dist/create/server-source/crates/feltdb/tests/agent_state_native.rs +0 -1188
- package/dist/create/server-source/crates/feltdb/tests/agent_transition_contract_conformance.rs +0 -2884
- package/dist/create/server-source/crates/feltdb/tests/authority_process.rs +0 -297
- package/dist/create/server-source/crates/feltdb/tests/authority_transaction_identity.rs +0 -534
- package/dist/create/server-source/crates/feltdb/tests/bounded_read_contract.rs +0 -132
- package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +0 -299
- package/dist/create/server-source/crates/feltdb/tests/common/mod.rs +0 -96
- package/dist/create/server-source/crates/feltdb/tests/compaction_stall_contract.rs +0 -272
- package/dist/create/server-source/crates/feltdb/tests/crash_durability_contract.rs +0 -467
- package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +0 -309
- package/dist/create/server-source/crates/feltdb/tests/durable_backup_contract.rs +0 -445
- package/dist/create/server-source/crates/feltdb/tests/durable_corruption_contract.rs +0 -518
- package/dist/create/server-source/crates/feltdb/tests/durable_format_compatibility.rs +0 -392
- package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +0 -850
- package/dist/create/server-source/crates/feltdb/tests/fixtures/agent_transition_corpus.json +0 -23340
- package/dist/create/server-source/crates/feltdb/tests/fixtures/state_conflict_contract_corpus.json +0 -1916
- package/dist/create/server-source/crates/feltdb/tests/fixtures/state_diff_contract_corpus.json +0 -1878
- package/dist/create/server-source/crates/feltdb/tests/fixtures/trigger_contract_corpus.json +0 -1862
- package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_evidence.rs +0 -123
- package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_substrate_completion.rs +0 -299
- package/dist/create/server-source/crates/feltdb/tests/local_process_ownership.rs +0 -69
- package/dist/create/server-source/crates/feltdb/tests/managed_incident_regression.rs +0 -191
- package/dist/create/server-source/crates/feltdb/tests/operational_health_contract.rs +0 -278
- package/dist/create/server-source/crates/feltdb/tests/pr34_query_collection.rs +0 -234
- package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +0 -947
- package/dist/create/server-source/crates/feltdb/tests/pr7_self_authorization_proof.rs +0 -404
- package/dist/create/server-source/crates/feltdb/tests/pr8_vocabulary_assessment.rs +0 -916
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase2_boundary_tests.rs +0 -1045
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3a_path_a_tests.rs +0 -347
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_authorized_mutations.rs +0 -361
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs +0 -330
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_simple_auth_delete.rs +0 -93
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs +0 -622
- package/dist/create/server-source/crates/feltdb/tests/pr9_teams_role_based_access.rs +0 -517
- package/dist/create/server-source/crates/feltdb/tests/production_certification.rs +0 -1153
- package/dist/create/server-source/crates/feltdb/tests/production_contract.rs +0 -771
- package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +0 -1383
- package/dist/create/server-source/crates/feltdb/tests/reconciliation_application.rs +0 -868
- package/dist/create/server-source/crates/feltdb/tests/reconciliation_wire_format_evidence.rs +0 -221
- package/dist/create/server-source/crates/feltdb/tests/replicated_history_contract.rs +0 -417
- package/dist/create/server-source/crates/feltdb/tests/resource_scoped_revisions.rs +0 -338
- package/dist/create/server-source/crates/feltdb/tests/revision_identity_contract.rs +0 -1039
- package/dist/create/server-source/crates/feltdb/tests/revision_model_decision.rs +0 -739
- package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +0 -452
- package/dist/create/server-source/crates/feltdb/tests/saas_authorization_integration.rs +0 -81
- package/dist/create/server-source/crates/feltdb/tests/saas_invitation_lifecycle.rs +0 -438
- package/dist/create/server-source/crates/feltdb/tests/semantic_decision.rs +0 -1165
- package/dist/create/server-source/crates/feltdb/tests/semantic_query.rs +0 -767
- package/dist/create/server-source/crates/feltdb/tests/semantic_query_contract.rs +0 -363
- package/dist/create/server-source/crates/feltdb/tests/state_conflict_contract_conformance.rs +0 -1799
- package/dist/create/server-source/crates/feltdb/tests/state_diff_contract_conformance.rs +0 -1316
- package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +0 -358
- package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +0 -365
- package/dist/create/server-source/crates/feltdb/tests/state_ref_authority.rs +0 -918
- package/dist/create/server-source/crates/feltdb/tests/state_store_boundary_evidence.rs +0 -299
- package/dist/create/server-source/crates/feltdb/tests/storage_independent_versioned_object_substrate.rs +0 -328
- package/dist/create/server-source/crates/feltdb/tests/sync_divergence_evidence.rs +0 -255
- package/dist/create/server-source/crates/feltdb/tests/three_way_input_boundary_evidence.rs +0 -249
- package/dist/create/server-source/crates/feltdb/tests/trigger_contract_conformance.rs +0 -994
- package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +0 -484
- package/dist/studio-app/assets/feltdb_wasm_bg-CFQT4gCy.wasm +0 -0
- package/dist/studio-app/assets/index-Dql1hS5m.js +0 -30
package/dist/cli/commands.js
CHANGED
|
@@ -17,14 +17,14 @@ import { applicationIsRunning, applicationUrlCandidate, detectApplication, disco
|
|
|
17
17
|
import { resolveApplicationLifecycle, startManagedApplication, waitForManagedApplication } from './application-lifecycle.js';
|
|
18
18
|
import { createDevelopmentSession, developmentSessionEnvironment, developmentSessionSummary, developmentStudioArguments, transitionDevelopmentSession } from './development-session.js';
|
|
19
19
|
import { openApplication, openStudio } from './browser-opening.js';
|
|
20
|
-
import { publishApplication } from './publish-engine.js';
|
|
20
|
+
import { publishApplication, readApplicationContract } from './publish-engine.js';
|
|
21
21
|
import { applyFlowProposalAtomic, assertProposalSourcePlan, describeProposal, loadLocalDevelopmentContract, repositoryContext, reviewFlowProposal, syncGeneratedSource } from './source-sync.js';
|
|
22
22
|
import { configureAiModel, generateConfiguredFlowProposal, publicAiModelConfiguration } from './ai-model-config.js';
|
|
23
23
|
import { proposalService } from './proposal-client.js';
|
|
24
24
|
import { resolveManagedAuthorityEnvironment } from './managed-environment.js';
|
|
25
25
|
import { readManagedProjectState } from './managed-project.js';
|
|
26
26
|
import { resolveCanonicalStudioArtifact } from './studio-artifact.js';
|
|
27
|
-
import { configureManagedAccount, finalizeManagedProvisioning } from '../create/index.js';
|
|
27
|
+
import { configureManagedAccount, createManagedKey, finalizeManagedProvisioning, listManagedKeys, resolveManagedScopes, revokeManagedKey, setEnvironmentValue, signInManagedAccount } from '../create/index.js';
|
|
28
28
|
function loadProjectEnvironment(file = path.resolve('.env.local')) {
|
|
29
29
|
if (!fs.existsSync(file))
|
|
30
30
|
return;
|
|
@@ -40,6 +40,27 @@ function loadProjectEnvironment(file = path.resolve('.env.local')) {
|
|
|
40
40
|
if (!(key in process.env))
|
|
41
41
|
process.env[key] = value;
|
|
42
42
|
}
|
|
43
|
+
warnBrowserExposedCredentials();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Credentials under a `VITE_` name are inlined into the application's browser
|
|
47
|
+
* bundle by Vite, so they are no longer read as credentials anywhere. Say so,
|
|
48
|
+
* rather than silently dropping authentication a project used to have.
|
|
49
|
+
*/
|
|
50
|
+
function warnBrowserExposedCredentials() {
|
|
51
|
+
for (const name of Object.keys(process.env)) {
|
|
52
|
+
if (/^VITE_[A-Z0-9_]*(?:TOKEN|API_KEY|SECRET)$/.test(name) && process.env[name]) {
|
|
53
|
+
console.warn(`⚠ ${name} is ignored: VITE_* variables are inlined into browser bundles. Move the credential to FELTDB_TOKEN (server-side only).`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The local `feltdb dev` Studio is an operator console on localhost. It
|
|
59
|
+
* receives the developer's server-side key at runtime (no-store), never from a
|
|
60
|
+
* bundled VITE_* value.
|
|
61
|
+
*/
|
|
62
|
+
function studioOperatorToken() {
|
|
63
|
+
return process.env.FELTDB_TOKEN || '';
|
|
43
64
|
}
|
|
44
65
|
async function availablePort(preferred, host = '127.0.0.1') {
|
|
45
66
|
for (let port = preferred; port < preferred + 100; port += 1) {
|
|
@@ -64,6 +85,8 @@ export async function handleCommand(command, args) {
|
|
|
64
85
|
return handleKeys(args);
|
|
65
86
|
case 'init-managed':
|
|
66
87
|
return handleInitManaged(args);
|
|
88
|
+
case 'managed':
|
|
89
|
+
return handleManaged(args);
|
|
67
90
|
case 'connect':
|
|
68
91
|
return handleConnect(args);
|
|
69
92
|
case 'status':
|
|
@@ -620,6 +643,7 @@ async function handleManagedPublish(args) {
|
|
|
620
643
|
yes: args.includes('--yes'),
|
|
621
644
|
approveDestructive: args.includes('--approve-destructive-changes') || args.includes('--allow-destructive'),
|
|
622
645
|
noBuild: args.includes('--no-build'),
|
|
646
|
+
contract: valueAfter('--contract'),
|
|
623
647
|
confirm,
|
|
624
648
|
});
|
|
625
649
|
}
|
|
@@ -831,8 +855,8 @@ async function handleConnect(args) {
|
|
|
831
855
|
let health;
|
|
832
856
|
try {
|
|
833
857
|
const response = await fetch(`${url}/health`, {
|
|
834
|
-
headers: process.env.FELTDB_TOKEN
|
|
835
|
-
? { Authorization: `Bearer ${process.env.FELTDB_TOKEN
|
|
858
|
+
headers: process.env.FELTDB_TOKEN
|
|
859
|
+
? { Authorization: `Bearer ${process.env.FELTDB_TOKEN}` }
|
|
836
860
|
: {},
|
|
837
861
|
signal: controller.signal,
|
|
838
862
|
});
|
|
@@ -855,14 +879,14 @@ async function handleConnect(args) {
|
|
|
855
879
|
fs.writeFileSync(connFile, JSON.stringify({
|
|
856
880
|
url,
|
|
857
881
|
connected: new Date().toISOString(),
|
|
858
|
-
authenticated: Boolean(process.env.FELTDB_TOKEN
|
|
882
|
+
authenticated: Boolean(process.env.FELTDB_TOKEN),
|
|
859
883
|
namespace: managed.namespace || project.namespace || 'default',
|
|
860
884
|
runtime: project.runtime || 'self-hosted',
|
|
861
885
|
}, null, 2));
|
|
862
886
|
console.log('✅ Connected to FeltDB\n');
|
|
863
887
|
console.log('Endpoint: ' + url);
|
|
864
888
|
console.log(`Namespace: ${managed.namespace || project.namespace || 'default'}`);
|
|
865
|
-
console.log(`Authenticated: ${process.env.FELTDB_TOKEN
|
|
889
|
+
console.log(`Authenticated: ${process.env.FELTDB_TOKEN ? 'yes' : 'no'}`);
|
|
866
890
|
console.log(`Runtime: ${project.runtime || 'self-hosted'}`);
|
|
867
891
|
console.log(`Health: ${health.status || 'healthy'}\n`);
|
|
868
892
|
console.log('Use: feltdb status (to check connection)\n');
|
|
@@ -926,6 +950,9 @@ export function ensureManagedProjectContract(projectDir) {
|
|
|
926
950
|
return { ...created, configPath, flowPath };
|
|
927
951
|
}
|
|
928
952
|
async function handleInitManaged(args) {
|
|
953
|
+
const contract = flagValue(args, '--contract');
|
|
954
|
+
if (contract)
|
|
955
|
+
return initManagedWithContract(args, contract);
|
|
929
956
|
loadProjectEnvironment();
|
|
930
957
|
const projectDir = process.cwd();
|
|
931
958
|
const initialized = ensureManagedProjectContract(projectDir);
|
|
@@ -978,10 +1005,11 @@ async function handleInitManaged(args) {
|
|
|
978
1005
|
// Prompt for credentials
|
|
979
1006
|
console.log('☁️ Setting up managed FeltDB for this project\n');
|
|
980
1007
|
const prompt = await import('node:readline/promises').then(m => m.createInterface({ input: process.stdin, output: process.stdout }));
|
|
981
|
-
const
|
|
1008
|
+
const [emailArgument, passwordArgument] = positionalArguments(args);
|
|
1009
|
+
const email = emailArgument || await prompt.question('Email: ');
|
|
982
1010
|
if (!email)
|
|
983
1011
|
throw new Error('Email is required');
|
|
984
|
-
const password =
|
|
1012
|
+
const password = passwordArgument || await promptSecret('Password (8+ characters): ');
|
|
985
1013
|
if (password.length < 8)
|
|
986
1014
|
throw new Error('Password must be at least 8 characters');
|
|
987
1015
|
prompt.close();
|
|
@@ -1041,6 +1069,169 @@ async function handleInitManaged(args) {
|
|
|
1041
1069
|
throw error;
|
|
1042
1070
|
}
|
|
1043
1071
|
}
|
|
1072
|
+
/** The value after `--flag`, if the flag is given. */
|
|
1073
|
+
function flagValue(args, flag) {
|
|
1074
|
+
const index = args.indexOf(flag);
|
|
1075
|
+
if (index < 0)
|
|
1076
|
+
return undefined;
|
|
1077
|
+
const value = args[index + 1];
|
|
1078
|
+
if (!value || value.startsWith('--'))
|
|
1079
|
+
throw new Error(`${flag} needs a value`);
|
|
1080
|
+
return value;
|
|
1081
|
+
}
|
|
1082
|
+
const VALUE_FLAGS = new Set(['--contract', '--runtime-scopes', '--name', '--scopes', '--application', '--env-var', '--save-to', '--environment', '--message']);
|
|
1083
|
+
/** Arguments that are neither flags nor flag values. */
|
|
1084
|
+
function positionalArguments(args) {
|
|
1085
|
+
return args.filter((value, index) => !value.startsWith('--') && !VALUE_FLAGS.has(args[index - 1] ?? ''));
|
|
1086
|
+
}
|
|
1087
|
+
/**
|
|
1088
|
+
* The managed account's e-mail and password: positional arguments, else
|
|
1089
|
+
* FELTDB_MANAGED_EMAIL and FELTDB_MANAGED_PASSWORD (non-interactive), else a prompt
|
|
1090
|
+
* (the password is never echoed).
|
|
1091
|
+
*/
|
|
1092
|
+
async function managedAccountCredentials(args) {
|
|
1093
|
+
const [emailArgument, passwordArgument] = positionalArguments(args);
|
|
1094
|
+
let email = emailArgument || process.env.FELTDB_MANAGED_EMAIL || '';
|
|
1095
|
+
if (!email && process.stdin.isTTY) {
|
|
1096
|
+
const prompt = (await import('node:readline/promises')).createInterface({ input: process.stdin, output: process.stdout });
|
|
1097
|
+
try {
|
|
1098
|
+
email = await prompt.question('Email: ');
|
|
1099
|
+
}
|
|
1100
|
+
finally {
|
|
1101
|
+
prompt.close();
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
const password = passwordArgument || process.env.FELTDB_MANAGED_PASSWORD || await promptSecret('Password (8+ characters): ');
|
|
1105
|
+
if (!email || password.length < 8) {
|
|
1106
|
+
throw new Error('Managed sign-in needs your FeltDB account e-mail and an 8+ character password. Non-interactively, set FELTDB_MANAGED_EMAIL and FELTDB_MANAGED_PASSWORD.');
|
|
1107
|
+
}
|
|
1108
|
+
return { email, password };
|
|
1109
|
+
}
|
|
1110
|
+
/**
|
|
1111
|
+
* `feltdb init-managed --contract <file>`: a project whose state contract is a JSON file
|
|
1112
|
+
* (generated by FeltKit, for one) rather than feltdb.flow. Creates or reuses the managed
|
|
1113
|
+
* application named after the project, mints its control key and a runtime key with the
|
|
1114
|
+
* scopes asked for (`minimal` unless `--runtime-scopes` says otherwise), writes `.env.local`
|
|
1115
|
+
* (mode 600) and `.feltdb/managed.json`, then publishes and promotes the contract and checks
|
|
1116
|
+
* that the runtime key resolves it. Re-running it on a configured project publishes again.
|
|
1117
|
+
*/
|
|
1118
|
+
async function initManagedWithContract(args, contractFile) {
|
|
1119
|
+
const projectDir = process.cwd();
|
|
1120
|
+
const contractPath = path.resolve(projectDir, contractFile);
|
|
1121
|
+
readApplicationContract(contractPath);
|
|
1122
|
+
const runtimeScopes = resolveManagedScopes(flagValue(args, '--runtime-scopes') ?? 'minimal');
|
|
1123
|
+
const existing = readManagedProjectState(projectDir);
|
|
1124
|
+
if (existing.applicationId) {
|
|
1125
|
+
console.log(`✓ Already configured for managed FeltDB: application ${existing.applicationId}, ${existing.url}`);
|
|
1126
|
+
console.log(' Its keys are unchanged. Publishing the contract again.\n');
|
|
1127
|
+
}
|
|
1128
|
+
else {
|
|
1129
|
+
if (fs.existsSync(path.join(projectDir, '.env.local'))) {
|
|
1130
|
+
throw new Error('.env.local exists. Managed setup writes the project\'s FeltDB settings and keys there; move it aside first, so nothing in it is replaced.');
|
|
1131
|
+
}
|
|
1132
|
+
const packageFile = path.join(projectDir, 'package.json');
|
|
1133
|
+
const packageName = fs.existsSync(packageFile) ? String(JSON.parse(fs.readFileSync(packageFile, 'utf8')).name ?? '') : '';
|
|
1134
|
+
const applicationName = flagValue(args, '--name') || packageName.replace(/^@[^/]+\//, '') || path.basename(projectDir);
|
|
1135
|
+
if (!/^[a-z0-9][a-z0-9-]*$/.test(applicationName))
|
|
1136
|
+
throw new Error(`"${applicationName}" is not an application name (lowercase letters, digits, dashes); pass --name`);
|
|
1137
|
+
const { email, password } = await managedAccountCredentials(args);
|
|
1138
|
+
console.log('\nProvisioning managed application...\n');
|
|
1139
|
+
const managed = await configureManagedAccount({ projectDir, applicationName, namespace: applicationName, email, password, runtimeScopes });
|
|
1140
|
+
console.log(`✓ Managed application: ${managed.application.name} (${managed.application.id})`);
|
|
1141
|
+
console.log(`✓ Runtime key scopes: ${runtimeScopes.join(', ')}`);
|
|
1142
|
+
console.log('✓ Settings and keys written to .env.local (mode 600) and .feltdb/managed.json. Never commit either.\n');
|
|
1143
|
+
}
|
|
1144
|
+
const result = await publishApplication({
|
|
1145
|
+
cwd: projectDir,
|
|
1146
|
+
contract: contractFile,
|
|
1147
|
+
yes: args.includes('--yes') || !process.stdin.isTTY,
|
|
1148
|
+
// A new application has no active contract to break: its first contract (policies
|
|
1149
|
+
// included) is approved as `feltdb init-managed` approves a first feltdb.flow. A
|
|
1150
|
+
// configured application's changes still need --approve-destructive-changes.
|
|
1151
|
+
approveDestructive: args.includes('--approve-destructive-changes') || !existing.applicationId,
|
|
1152
|
+
confirm: async (question) => {
|
|
1153
|
+
const prompt = (await import('node:readline/promises')).createInterface({ input: process.stdin, output: process.stdout });
|
|
1154
|
+
try {
|
|
1155
|
+
return !/^(n|no)$/i.test((await prompt.question(`${question} [Y/n] `)).trim());
|
|
1156
|
+
}
|
|
1157
|
+
finally {
|
|
1158
|
+
prompt.close();
|
|
1159
|
+
}
|
|
1160
|
+
},
|
|
1161
|
+
});
|
|
1162
|
+
if (result.status === 'published') {
|
|
1163
|
+
const finalized = await finalizeManagedProvisioning({ projectDir });
|
|
1164
|
+
console.log(`✓ Managed runtime verified at revision ${finalized.revisionId}\n`);
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
/** `feltdb managed keys create|list|revoke`: keys of a managed application (not local `feltdb keys`). */
|
|
1168
|
+
async function handleManaged(args) {
|
|
1169
|
+
const [group, action, ...rest] = args;
|
|
1170
|
+
if (group !== 'keys' || !['create', 'list', 'revoke'].includes(action ?? '')) {
|
|
1171
|
+
console.log(`Managed FeltDB keys (an application on the managed service; local keys are \`feltdb keys\`):
|
|
1172
|
+
|
|
1173
|
+
feltdb managed keys create --name <key-id> [--scopes minimal|default|control|<scope,scope>]
|
|
1174
|
+
[--application <app_id>] [--env-var FELTDB_TOKEN] [--save-to .env.local | --stdout]
|
|
1175
|
+
feltdb managed keys list [--application <app_id>]
|
|
1176
|
+
feltdb managed keys revoke <key-id>
|
|
1177
|
+
|
|
1178
|
+
Sign-in: your FeltDB account (prompted; or FELTDB_MANAGED_EMAIL / FELTDB_MANAGED_PASSWORD).
|
|
1179
|
+
The application defaults to the one in .feltdb/managed.json (or FELTDB_APPLICATION_ID).
|
|
1180
|
+
A new key's secret is written to the env file (mode 600), or with --stdout printed as
|
|
1181
|
+
NAME=secret for a pipe into a secret manager. It is never printed to a terminal.`);
|
|
1182
|
+
if (group)
|
|
1183
|
+
process.exitCode = 1;
|
|
1184
|
+
return;
|
|
1185
|
+
}
|
|
1186
|
+
loadProjectEnvironment();
|
|
1187
|
+
const state = readManagedProjectState();
|
|
1188
|
+
const applicationId = flagValue(rest, '--application') || state.applicationId || process.env.FELTDB_APPLICATION_ID;
|
|
1189
|
+
if (!applicationId && action !== 'revoke')
|
|
1190
|
+
throw new Error('Which application? Pass --application <app_id>, or run this in a project set up with `feltdb init-managed`.');
|
|
1191
|
+
// Key ids are the positional arguments here, so credentials come from the environment or a prompt.
|
|
1192
|
+
const session = await signInManagedAccount(await managedAccountCredentials([]));
|
|
1193
|
+
if (action === 'list') {
|
|
1194
|
+
console.log('id\tname\tstate\tscopes');
|
|
1195
|
+
for (const key of await listManagedKeys(session, applicationId)) {
|
|
1196
|
+
const scopes = Array.isArray(key.scopes) ? key.scopes.join(',') : '';
|
|
1197
|
+
console.log(`${String(key.id)}\t${String(key.name ?? '')}\t${key.revoked ? 'revoked' : 'active'}\t${scopes}`);
|
|
1198
|
+
}
|
|
1199
|
+
return;
|
|
1200
|
+
}
|
|
1201
|
+
if (action === 'revoke') {
|
|
1202
|
+
const target = positionalArguments(rest)[0];
|
|
1203
|
+
if (!target)
|
|
1204
|
+
throw new Error('Usage: feltdb managed keys revoke <key-id|key-name>');
|
|
1205
|
+
// The control plane assigns key ids; the name is what `create --name` gave it.
|
|
1206
|
+
const keys = applicationId ? await listManagedKeys(session, applicationId) : [];
|
|
1207
|
+
const byName = keys.filter(key => key.name === target && !key.revoked);
|
|
1208
|
+
if (byName.length > 1)
|
|
1209
|
+
throw new Error(`${byName.length} active keys are named ${target}; revoke one by id (feltdb managed keys list)`);
|
|
1210
|
+
const keyId = keys.some(key => key.id === target) ? target : byName[0] ? String(byName[0].id) : target;
|
|
1211
|
+
await revokeManagedKey(session, keyId);
|
|
1212
|
+
console.log(`✓ Revoked ${target}${keyId !== target ? ` (${keyId})` : ''}. Requests carrying it are now refused with AUTHENTICATION_REQUIRED.`);
|
|
1213
|
+
return;
|
|
1214
|
+
}
|
|
1215
|
+
const id = flagValue(rest, '--name');
|
|
1216
|
+
if (!id)
|
|
1217
|
+
throw new Error('Name the key: --name <key-id> (for example myapp-runtime-2026-10)');
|
|
1218
|
+
const scopes = resolveManagedScopes(flagValue(rest, '--scopes') ?? 'minimal');
|
|
1219
|
+
const envVar = flagValue(rest, '--env-var') ?? (scopes.includes('application:revision:promote') ? 'FELTDB_MANAGED_CONTROL_API_KEY' : 'FELTDB_TOKEN');
|
|
1220
|
+
const toStdout = rest.includes('--stdout');
|
|
1221
|
+
if (toStdout && process.stdout.isTTY)
|
|
1222
|
+
throw new Error('--stdout would show the secret on this terminal. Pipe it into your secret manager instead, or write it to an env file (the default).');
|
|
1223
|
+
const namespace = state.namespace || process.env.FELTDB_NAMESPACE || applicationId;
|
|
1224
|
+
const key = await createManagedKey(session, { id, namespace, applicationId: applicationId, scopes });
|
|
1225
|
+
if (toStdout) {
|
|
1226
|
+
process.stdout.write(`${envVar}=${key.secret}\n`);
|
|
1227
|
+
console.error(`✓ Created ${id} (key id ${key.id}) for ${applicationId}: ${key.scopes.join(', ')}; written to stdout as ${envVar}.`);
|
|
1228
|
+
return;
|
|
1229
|
+
}
|
|
1230
|
+
const envFile = path.resolve(flagValue(rest, '--save-to') ?? '.env.local');
|
|
1231
|
+
setEnvironmentValue(envFile, envVar, key.secret);
|
|
1232
|
+
console.log(`✓ Created ${id} (key id ${key.id}) for ${applicationId}: ${key.scopes.join(', ')}`);
|
|
1233
|
+
console.log(`✓ ${envVar} written to ${path.relative(process.cwd(), envFile) || envFile} (mode 600). Never commit it.`);
|
|
1234
|
+
}
|
|
1044
1235
|
async function handleExplain(args) {
|
|
1045
1236
|
const flowRef = args[0];
|
|
1046
1237
|
if (!flowRef || !flowRef.startsWith('flow://')) {
|
|
@@ -1894,7 +2085,7 @@ async function handleStudio(args, onReady) {
|
|
|
1894
2085
|
environment: managedProject.environment || 'production',
|
|
1895
2086
|
publishEndpoint: '/_feltdb/publish',
|
|
1896
2087
|
} : undefined;
|
|
1897
|
-
response.end(JSON.stringify({ token: connectUrl ?
|
|
2088
|
+
response.end(JSON.stringify({ token: connectUrl ? studioOperatorToken() : '', managedPublish, session, studioQuery, sourceSync: { enabled: true, webllmEnabled, previewOnly, token: studioMutationToken, aiModel: publicAiModelConfiguration() } }));
|
|
1898
2089
|
return;
|
|
1899
2090
|
}
|
|
1900
2091
|
if (pathname === '/_feltdb/contract') {
|
|
@@ -1913,7 +2104,7 @@ async function handleStudio(args, onReady) {
|
|
|
1913
2104
|
endpoint.searchParams.set('application_id', applicationId);
|
|
1914
2105
|
endpoint.searchParams.set('environment', managedProject.environment || lastPublished?.environment || 'production');
|
|
1915
2106
|
const headers = {};
|
|
1916
|
-
const credential = process.env.FELTDB_MANAGED_CONTROL_API_KEY || process.env.
|
|
2107
|
+
const credential = process.env.FELTDB_MANAGED_CONTROL_API_KEY || process.env.FELTDB_TOKEN;
|
|
1917
2108
|
if (credential)
|
|
1918
2109
|
headers.authorization = `Bearer ${credential}`;
|
|
1919
2110
|
const discovered = await fetch(endpoint, { headers });
|
|
@@ -2245,7 +2436,9 @@ Commands:
|
|
|
2245
2436
|
diff [file] Diff FlowSpec against the last deployed model
|
|
2246
2437
|
deploy [file] Validate, version, and deploy FlowSpec
|
|
2247
2438
|
publish [file] Build and publish/update a managed application
|
|
2439
|
+
publish --contract <f> Publish and promote a JSON state contract (no feltdb.flow)
|
|
2248
2440
|
init-managed Set up managed FeltDB for an existing project
|
|
2441
|
+
managed keys Create, list, or revoke a managed application's keys
|
|
2249
2442
|
ai Open the canonical interactive local-AI workflow
|
|
2250
2443
|
ai --dry-run Open an ephemeral preview-only AI session
|
|
2251
2444
|
ai model show Show the selected local or user-provided model
|
|
@@ -2302,6 +2495,16 @@ Managed FeltDB Setup (Existing Projects):
|
|
|
2302
2495
|
Prompts for email and password, provisions resources,
|
|
2303
2496
|
and optionally publishes the initial revision
|
|
2304
2497
|
feltdb init-managed <email> <password> Non-interactive setup with provided credentials
|
|
2498
|
+
feltdb init-managed --contract feltdb.contract.json [--runtime-scopes minimal] [--name <app>] [--yes]
|
|
2499
|
+
A project whose state contract is a JSON file
|
|
2500
|
+
(e.g. generated by FeltKit): provision, mint a control
|
|
2501
|
+
key and a least-privilege runtime key, publish, verify
|
|
2502
|
+
|
|
2503
|
+
Managed Keys (not the local keys above):
|
|
2504
|
+
feltdb managed keys create --name <id> [--scopes minimal|default|control|<list>]
|
|
2505
|
+
[--env-var FELTDB_TOKEN] [--save-to .env.local | --stdout]
|
|
2506
|
+
feltdb managed keys list
|
|
2507
|
+
feltdb managed keys revoke <id>
|
|
2305
2508
|
|
|
2306
2509
|
Development:
|
|
2307
2510
|
dev Start development server
|
|
@@ -2313,6 +2516,7 @@ Development:
|
|
|
2313
2516
|
|
|
2314
2517
|
Publish:
|
|
2315
2518
|
feltdb publish --dry-run Validate and preview without activation
|
|
2519
|
+
feltdb publish --contract feltdb.contract.json --yes Publish a JSON state contract
|
|
2316
2520
|
feltdb publish --yes Publish to the configured environment
|
|
2317
2521
|
feltdb publish --status Compare local and active cloud versions
|
|
2318
2522
|
feltdb publish --environment staging Override the configured environment
|
|
@@ -19,25 +19,34 @@ function loadEnv(file) {
|
|
|
19
19
|
}
|
|
20
20
|
return values;
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Where to publish, from the project's managed setup (`.env.local`, `.feltdb/managed.json`,
|
|
24
|
+
* written by `feltdb init-managed`) or the process environment (CI). A `feltdb.flow` project
|
|
25
|
+
* needs `feltdb.config.json`; a contract (`contract`) does not, and its tenant is the
|
|
26
|
+
* application's own, read from the draft.
|
|
27
|
+
*/
|
|
28
|
+
export function discoverPublishConfiguration(cwd = process.cwd(), environmentOverride, options = {}) {
|
|
23
29
|
const configFile = path.join(cwd, 'feltdb.config.json');
|
|
24
|
-
if (!fs.existsSync(configFile))
|
|
30
|
+
if (!options.contract && !fs.existsSync(configFile))
|
|
25
31
|
throw new Error('feltdb.config.json is required for publish');
|
|
26
|
-
const project = JSON.parse(fs.readFileSync(configFile, 'utf8'));
|
|
32
|
+
const project = fs.existsSync(configFile) ? JSON.parse(fs.readFileSync(configFile, 'utf8')) : {};
|
|
27
33
|
const file = loadEnv(path.join(cwd, '.env.local'));
|
|
28
34
|
const managedFile = path.join(cwd, '.feltdb', 'managed.json');
|
|
29
35
|
const managed = fs.existsSync(managedFile) ? JSON.parse(fs.readFileSync(managedFile, 'utf8')) : {};
|
|
30
36
|
const value = (name) => process.env[name] || file[name];
|
|
31
37
|
const configuration = {
|
|
32
|
-
url: value('VITE_FELTDB_MANAGED_URL') || managed.url, token: value('FELTDB_MANAGED_CONTROL_API_KEY'),
|
|
33
|
-
tenantId: managed.tenantId || value('VITE_FELTDB_MANAGED_TENANT_ID')
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
url: value('VITE_FELTDB_MANAGED_URL') || managed.url || value('FELTDB_URL'), token: value('FELTDB_MANAGED_CONTROL_API_KEY'),
|
|
39
|
+
tenantId: managed.tenantId || value('VITE_FELTDB_MANAGED_TENANT_ID') || '',
|
|
40
|
+
applicationId: value('VITE_FELTDB_MANAGED_APPLICATION_ID') || managed.applicationId || value('FELTDB_APPLICATION_ID'),
|
|
41
|
+
namespace: managed.namespace || value('VITE_FELTDB_MANAGED_NAMESPACE') || project.namespace || value('FELTDB_NAMESPACE') || (options.contract ? path.basename(cwd) : undefined),
|
|
42
|
+
environment: environmentOverride || managed.environment || value('VITE_FELTDB_MANAGED_ENVIRONMENT') || value('FELTDB_ENVIRONMENT') || 'production',
|
|
36
43
|
};
|
|
37
|
-
const missing = Object.entries(configuration).filter(([, value]) => !value).map(([name]) => name);
|
|
38
|
-
if (missing.length)
|
|
39
|
-
throw new Error(`Managed publish configuration is incomplete
|
|
40
|
-
|
|
44
|
+
const missing = Object.entries(configuration).filter(([name, value]) => !value && !(options.contract && name === 'tenantId')).map(([name]) => name);
|
|
45
|
+
if (missing.length) {
|
|
46
|
+
throw new Error(`Managed publish configuration is incomplete: ${missing.join(', ')}. Run \`feltdb init-managed\` in this project, or set FELTDB_URL, FELTDB_APPLICATION_ID and FELTDB_MANAGED_CONTROL_API_KEY.`);
|
|
47
|
+
}
|
|
48
|
+
const runtimeToken = value('FELTDB_TOKEN');
|
|
49
|
+
return { ...configuration, ...(runtimeToken ? { runtimeToken } : {}) };
|
|
41
50
|
}
|
|
42
51
|
function filesBelow(root, directory) {
|
|
43
52
|
const target = path.join(root, directory);
|
|
@@ -88,6 +97,86 @@ export function buildPublishBundle(cwd, configuration) {
|
|
|
88
97
|
manifest.metadata.labels['feltdb.source_revision'] = sourceRevision;
|
|
89
98
|
return { manifest, artifacts, artifactHash, sourceRevision };
|
|
90
99
|
}
|
|
100
|
+
const CONTRACT_KEYS = ['collections', 'indexes', 'references', 'policies'];
|
|
101
|
+
export function readApplicationContract(file) {
|
|
102
|
+
if (!fs.existsSync(file))
|
|
103
|
+
throw new Error(`Contract file not found: ${file}`);
|
|
104
|
+
let contract;
|
|
105
|
+
try {
|
|
106
|
+
contract = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
throw new Error(`Contract file ${file} is not JSON: ${error.message}`);
|
|
110
|
+
}
|
|
111
|
+
if (!contract || typeof contract !== 'object' || Array.isArray(contract))
|
|
112
|
+
throw new Error(`Contract file ${file} must hold an object with collections and policies`);
|
|
113
|
+
const unknown = Object.keys(contract).filter(key => !CONTRACT_KEYS.includes(key));
|
|
114
|
+
if (unknown.length)
|
|
115
|
+
throw new Error(`Contract file ${file} has keys a contract cannot carry: ${unknown.join(', ')} (allowed: ${CONTRACT_KEYS.join(', ')})`);
|
|
116
|
+
if (!Array.isArray(contract.collections) || !contract.collections.length)
|
|
117
|
+
throw new Error(`Contract file ${file} declares no collections`);
|
|
118
|
+
for (const collection of contract.collections) {
|
|
119
|
+
if (!collection || typeof collection.name !== 'string' || !Array.isArray(collection.fields))
|
|
120
|
+
throw new Error(`Contract file ${file}: every collection needs a name and a fields array`);
|
|
121
|
+
}
|
|
122
|
+
if (!Array.isArray(contract.policies))
|
|
123
|
+
throw new Error(`Contract file ${file} declares no policies; without one per collection the authority refuses every read and write`);
|
|
124
|
+
for (const key of ['indexes', 'references'])
|
|
125
|
+
if (contract[key] !== undefined && !Array.isArray(contract[key]))
|
|
126
|
+
throw new Error(`Contract file ${file}: ${key} must be an array`);
|
|
127
|
+
return contract;
|
|
128
|
+
}
|
|
129
|
+
export function buildContractBundle(cwd, configuration, contractFile) {
|
|
130
|
+
const absolute = path.resolve(cwd, contractFile);
|
|
131
|
+
const contract = readApplicationContract(absolute);
|
|
132
|
+
const relative = path.relative(cwd, absolute).split(path.sep).join('/');
|
|
133
|
+
if (relative.startsWith('../'))
|
|
134
|
+
throw new Error(`The contract file must be inside the project: ${contractFile}`);
|
|
135
|
+
const content = Buffer.from(fs.readFileSync(absolute));
|
|
136
|
+
const artifact = { path: relative, hash: `sha256:${sha256(content)}`, bytes: content.byteLength, mediaType: 'application/json', content: content.toString('base64') };
|
|
137
|
+
const artifactHash = `sha256:${sha256(`${artifact.path}\0${artifact.hash}`)}`;
|
|
138
|
+
// The manifest defaults (environments, runtime bounds, UI) are the ones every published
|
|
139
|
+
// application carries; only the state contract comes from the file.
|
|
140
|
+
const manifest = flowSpecToManifest({ version: 1, app: configuration.namespace, collections: [], capabilities: [], agents: [], workflows: [], triggers: [], policies: [], schedules: [], modules: [] }, configuration.tenantId, configuration.applicationId);
|
|
141
|
+
manifest.collections = contract.collections;
|
|
142
|
+
manifest.indexes = contract.indexes ?? [];
|
|
143
|
+
manifest.references = contract.references ?? [];
|
|
144
|
+
manifest.policies = contract.policies;
|
|
145
|
+
const contractHash = (value) => `sha256:${sha256(Buffer.from(canonicalApplicationBytes(value)))}`;
|
|
146
|
+
manifest.metadata.labels = {
|
|
147
|
+
'feltdb.model_hash': contractHash({ collections: manifest.collections, indexes: manifest.indexes, references: manifest.references }),
|
|
148
|
+
'feltdb.authorization_hash': contractHash(manifest.policies),
|
|
149
|
+
'feltdb.contract_hash': contractHash({ contract }),
|
|
150
|
+
'feltdb.contract_file': relative,
|
|
151
|
+
'feltdb.artifact_hash': artifactHash,
|
|
152
|
+
'feltdb.namespace': configuration.namespace,
|
|
153
|
+
};
|
|
154
|
+
manifest.artifacts = [{ name: relative, uri: `artifact://${artifact.hash}`, media_type: artifact.mediaType, content: artifact.content }];
|
|
155
|
+
const git = spawnSync('git', ['rev-parse', 'HEAD'], { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });
|
|
156
|
+
const sourceRevision = git.status === 0 ? git.stdout.trim() : undefined;
|
|
157
|
+
if (sourceRevision)
|
|
158
|
+
manifest.metadata.labels['feltdb.source_revision'] = sourceRevision;
|
|
159
|
+
return { manifest, artifacts: [artifact], artifactHash, sourceRevision };
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* The runtime (data) key resolves the revision just promoted: URL, key, application and
|
|
163
|
+
* environment agree. Without the key here (CI holding only the control key) it is not checked.
|
|
164
|
+
*/
|
|
165
|
+
async function verifyRuntimeKey(configuration, revisionId, log) {
|
|
166
|
+
if (!configuration.runtimeToken) {
|
|
167
|
+
log('• Runtime key (FELTDB_TOKEN) not available here; the application\'s own check is its health endpoint.');
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
const url = `${configuration.url.replace(/\/$/, '')}/v1/application?application_id=${encodeURIComponent(configuration.applicationId)}&environment=${encodeURIComponent(configuration.environment)}`;
|
|
171
|
+
const response = await fetch(url, { headers: { authorization: `Bearer ${configuration.runtimeToken}`, accept: 'application/json' } });
|
|
172
|
+
const body = await response.json().catch(() => ({}));
|
|
173
|
+
if (!response.ok)
|
|
174
|
+
throw new Error(`The runtime key (FELTDB_TOKEN) is refused for application ${configuration.applicationId} in ${configuration.environment}: HTTP ${response.status} ${String(body.code ?? '')} ${String(body.message ?? '')}`.trim());
|
|
175
|
+
if (body.revision_id !== revisionId)
|
|
176
|
+
throw new Error(`The runtime key resolves revision ${String(body.revision_id)}, not the promoted ${revisionId}`);
|
|
177
|
+
log('✓ The runtime key (FELTDB_TOKEN) resolves the promoted revision');
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
91
180
|
function sameDefinition(left, right) {
|
|
92
181
|
return left.metadata.labels?.['feltdb.artifact_hash'] === right.metadata.labels?.['feltdb.artifact_hash'];
|
|
93
182
|
}
|
|
@@ -105,8 +194,8 @@ function describeChanges(current, bundle) {
|
|
|
105
194
|
export async function publishApplication(options = {}) {
|
|
106
195
|
const cwd = options.cwd || process.cwd();
|
|
107
196
|
const log = options.log || console.log;
|
|
108
|
-
const configuration = discoverPublishConfiguration(cwd, options.environment);
|
|
109
|
-
const bundle = buildPublishBundle(cwd, configuration);
|
|
197
|
+
const configuration = discoverPublishConfiguration(cwd, options.environment, { contract: Boolean(options.contract) });
|
|
198
|
+
const bundle = options.contract ? buildContractBundle(cwd, configuration, options.contract) : buildPublishBundle(cwd, configuration);
|
|
110
199
|
const client = new ApplicationManifestClient(configuration.url.replace(/\/$/, ''), configuration.token);
|
|
111
200
|
const cloud = await client.revisions(configuration.applicationId);
|
|
112
201
|
const current = activeRevision(cloud.revisions, cloud.environment_pointers, configuration.environment);
|
|
@@ -128,7 +217,8 @@ export async function publishApplication(options = {}) {
|
|
|
128
217
|
}
|
|
129
218
|
log('Changes:');
|
|
130
219
|
changes.forEach(value => log(` ${value}`));
|
|
131
|
-
|
|
220
|
+
// A contract is the artifact itself; the application is built and deployed on its own.
|
|
221
|
+
if (!options.noBuild && !options.contract) {
|
|
132
222
|
const packageFile = path.join(cwd, 'package.json');
|
|
133
223
|
const packageManifest = JSON.parse(fs.readFileSync(packageFile, 'utf8'));
|
|
134
224
|
if (!packageManifest.scripts?.build)
|
|
@@ -140,6 +230,15 @@ export async function publishApplication(options = {}) {
|
|
|
140
230
|
throw new Error(`Application build failed with exit code ${result.status}`);
|
|
141
231
|
}
|
|
142
232
|
const draft = await client.createDraft(configuration.applicationId, current?.revision_id);
|
|
233
|
+
if (options.contract) {
|
|
234
|
+
// The authority requires state_schema_version to increase whenever the state schema
|
|
235
|
+
// changes; an unchanged schema keeps the active one.
|
|
236
|
+
const model = (manifest) => canonicalApplicationBytes({ collections: manifest.collections, indexes: manifest.indexes ?? [], references: manifest.references ?? [] }).toString();
|
|
237
|
+
const previous = current?.manifest.state_schema_version ?? 0;
|
|
238
|
+
bundle.manifest.state_schema_version = current && model(current.manifest) === model(bundle.manifest) ? previous : previous + 1;
|
|
239
|
+
bundle.manifest.tenant_id = draft.tenant_id;
|
|
240
|
+
bundle.manifest.metadata.name = draft.manifest?.metadata?.name || bundle.manifest.metadata.name;
|
|
241
|
+
}
|
|
143
242
|
const updated = await client.updateDraft(configuration.applicationId, draft, bundle.manifest);
|
|
144
243
|
const validation = await client.validateDraft(configuration.applicationId, updated.draft_id);
|
|
145
244
|
if (!validation.valid)
|
|
@@ -158,8 +257,9 @@ export async function publishApplication(options = {}) {
|
|
|
158
257
|
}
|
|
159
258
|
const promoted = await client.promoteEnvironment(configuration.applicationId, configuration.environment, revision.revision_id, current?.revision_id, options.message || 'Published from feltdb CLI', Boolean(options.approveDestructive));
|
|
160
259
|
fs.mkdirSync(path.join(cwd, '.feltdb'), { recursive: true });
|
|
161
|
-
fs.writeFileSync(path.join(cwd, '.feltdb', 'last-published.json'), `${JSON.stringify({ applicationId: configuration.applicationId, tenantId: configuration.tenantId, namespace: configuration.namespace, environment: configuration.environment, version: revision.revision_number, revisionId: revision.revision_id, contractHash: bundle.manifest.metadata.labels?.['feltdb.contract_hash'], artifactHash: bundle.artifactHash, sourceRevision: bundle.sourceRevision, publishedAt: new Date().toISOString() }, null, 2)}\n`, { mode: 0o600 });
|
|
260
|
+
fs.writeFileSync(path.join(cwd, '.feltdb', 'last-published.json'), `${JSON.stringify({ applicationId: configuration.applicationId, tenantId: bundle.manifest.tenant_id || configuration.tenantId, namespace: configuration.namespace, environment: configuration.environment, version: revision.revision_number, revisionId: revision.revision_id, contractHash: bundle.manifest.metadata.labels?.['feltdb.contract_hash'], artifactHash: bundle.artifactHash, sourceRevision: bundle.sourceRevision, publishedAt: new Date().toISOString() }, null, 2)}\n`, { mode: 0o600 });
|
|
162
261
|
log(`✓ Published immutable version ${revision.revision_number}`);
|
|
163
262
|
log(`✓ Activated in ${configuration.environment}`);
|
|
164
|
-
|
|
263
|
+
const verified = options.contract ? await verifyRuntimeKey(configuration, revision.revision_id, log) : undefined;
|
|
264
|
+
return { status: 'published', current, bundle, revision, diff, promoted, verified };
|
|
165
265
|
}
|
package/dist/collection.d.ts
CHANGED
|
@@ -359,7 +359,9 @@ export declare class Collection<T> {
|
|
|
359
359
|
/**
|
|
360
360
|
* Refresh data from the database and notify subscribers.
|
|
361
361
|
*/
|
|
362
|
-
refresh(
|
|
362
|
+
refresh(options?: {
|
|
363
|
+
strict?: boolean;
|
|
364
|
+
}): Promise<void>;
|
|
363
365
|
}
|
|
364
366
|
/**
|
|
365
367
|
* Relationship helper for loading related data.
|
package/dist/collection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"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"}
|