@feltdb/core 0.4.12 → 0.4.14
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/cli/commands.js +42 -25
- package/dist/cli/index.js +1 -1
- package/dist/create/cli.js +39 -4
- package/dist/create/create.js +30 -18
- package/dist/create/docker-compose-generator.js +68 -11
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +2238 -0
- package/dist/create/server-source/Cargo.toml +7 -0
- package/dist/create/server-source/crates/feltdb/Cargo.lock +175 -0
- package/dist/create/server-source/crates/feltdb/Cargo.toml +79 -0
- package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +370 -0
- package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +589 -0
- package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +259 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +446 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +272 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +378 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +414 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +486 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +273 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +587 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +513 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +395 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +469 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +409 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +627 -0
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +383 -0
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +298 -0
- package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +1698 -0
- package/dist/create/server-source/crates/feltdb/src/acquisition.rs +286 -0
- package/dist/create/server-source/crates/feltdb/src/admission.rs +192 -0
- package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +477 -0
- package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +566 -0
- package/dist/create/server-source/crates/feltdb/src/analytics.rs +475 -0
- package/dist/create/server-source/crates/feltdb/src/application.rs +2244 -0
- package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +1070 -0
- package/dist/create/server-source/crates/feltdb/src/authorization.rs +1030 -0
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +266 -0
- package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +8 -0
- package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +418 -0
- package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +482 -0
- package/dist/create/server-source/crates/feltdb/src/capability.rs +903 -0
- package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +261 -0
- package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +78 -0
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +2214 -0
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +194 -0
- package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +427 -0
- package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +453 -0
- package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +465 -0
- package/dist/create/server-source/crates/feltdb/src/convergence.rs +618 -0
- package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +418 -0
- package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +380 -0
- package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +362 -0
- package/dist/create/server-source/crates/feltdb/src/cron.rs +294 -0
- package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +474 -0
- package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +1003 -0
- package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +536 -0
- package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +364 -0
- package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +235 -0
- package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +207 -0
- package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +316 -0
- package/dist/create/server-source/crates/feltdb/src/execution.rs +426 -0
- package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +219 -0
- package/dist/create/server-source/crates/feltdb/src/indexing.rs +779 -0
- package/dist/create/server-source/crates/feltdb/src/lib.rs +2838 -0
- package/dist/create/server-source/crates/feltdb/src/materialization.rs +184 -0
- package/dist/create/server-source/crates/feltdb/src/metrics.rs +267 -0
- package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +311 -0
- package/dist/create/server-source/crates/feltdb/src/observability.rs +366 -0
- package/dist/create/server-source/crates/feltdb/src/operation.rs +251 -0
- package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +438 -0
- package/dist/create/server-source/crates/feltdb/src/operation_log.rs +344 -0
- package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +477 -0
- package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +166 -0
- package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +261 -0
- package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +560 -0
- package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +3226 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +201 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +263 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +484 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +216 -0
- package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +281 -0
- package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +323 -0
- package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +573 -0
- package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +404 -0
- package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +418 -0
- package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +381 -0
- package/dist/create/server-source/crates/feltdb/src/phase_1c_three_node.rs +523 -0
- package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +334 -0
- package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +306 -0
- package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +355 -0
- package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +395 -0
- package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +346 -0
- package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +430 -0
- package/dist/create/server-source/crates/feltdb/src/production_api.rs +400 -0
- package/dist/create/server-source/crates/feltdb/src/provenance.rs +207 -0
- package/dist/create/server-source/crates/feltdb/src/query_performance.rs +217 -0
- package/dist/create/server-source/crates/feltdb/src/references.rs +404 -0
- package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +401 -0
- package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +160 -0
- package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +132 -0
- package/dist/create/server-source/crates/feltdb/src/routing.rs +409 -0
- package/dist/create/server-source/crates/feltdb/src/sharding.rs +523 -0
- package/dist/create/server-source/crates/feltdb/src/state_contract.rs +3118 -0
- package/dist/create/server-source/crates/feltdb/src/state_hash.rs +291 -0
- package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +376 -0
- package/dist/create/server-source/crates/feltdb/src/storage.rs +267 -0
- package/dist/create/server-source/crates/feltdb/src/submission.rs +477 -0
- package/dist/create/server-source/crates/feltdb/src/sync.rs +483 -0
- package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +822 -0
- package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +366 -0
- package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +473 -0
- package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +949 -0
- package/dist/create/server-source/crates/feltdb/src/transactions.rs +646 -0
- package/dist/create/server-source/crates/feltdb/src/trigger.rs +390 -0
- package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +928 -0
- package/dist/create/server-source/crates/feltdb/src/workflow.rs +713 -0
- package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +510 -0
- package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +354 -0
- package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +594 -0
- package/dist/create/server-source/crates/feltdb/src/workload.rs +1310 -0
- package/dist/create/server-source/crates/feltdb-server/Cargo.toml +23 -0
- package/dist/create/server-source/crates/feltdb-server/README.md +79 -0
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +73 -0
- package/dist/create/server-source/crates/feltdb-server/src/application_contract.rs +425 -0
- package/dist/create/server-source/crates/feltdb-server/src/artifacts.rs +449 -0
- package/dist/create/server-source/crates/feltdb-server/src/audit.rs +59 -0
- package/dist/create/server-source/crates/feltdb-server/src/auth.rs +308 -0
- package/dist/create/server-source/crates/feltdb-server/src/authorization.rs +228 -0
- package/dist/create/server-source/crates/feltdb-server/src/backup.rs +416 -0
- package/dist/create/server-source/crates/feltdb-server/src/causal.rs +218 -0
- package/dist/create/server-source/crates/feltdb-server/src/certification.rs +223 -0
- package/dist/create/server-source/crates/feltdb-server/src/clock.rs +132 -0
- package/dist/create/server-source/crates/feltdb-server/src/cluster.rs +165 -0
- package/dist/create/server-source/crates/feltdb-server/src/connections.rs +1044 -0
- package/dist/create/server-source/crates/feltdb-server/src/content.rs +111 -0
- package/dist/create/server-source/crates/feltdb-server/src/identity.rs +250 -0
- package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +78 -0
- package/dist/create/server-source/crates/feltdb-server/src/key_provider.rs +247 -0
- package/dist/create/server-source/crates/feltdb-server/src/leases.rs +123 -0
- package/dist/create/server-source/crates/feltdb-server/src/lib.rs +25 -0
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +8715 -0
- package/dist/create/server-source/crates/feltdb-server/src/metrics.rs +97 -0
- package/dist/create/server-source/crates/feltdb-server/src/portable_bundle.rs +350 -0
- package/dist/create/server-source/crates/feltdb-server/src/principals.rs +510 -0
- package/dist/create/server-source/crates/feltdb-server/src/providers.rs +269 -0
- package/dist/create/server-source/crates/feltdb-server/src/releases.rs +2563 -0
- package/dist/create/server-source/crates/feltdb-server/src/sessions.rs +156 -0
- package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +1097 -0
- package/dist/create/server-source/crates/feltdb-server/src/versions.rs +264 -0
- package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +31 -0
- package/dist/create/server-source/crates/feltdb-wasm/src/lib.rs +1086 -0
- package/dist/create/server-source/crates/feltdb-wasm/test.db +0 -0
- package/dist/flowspec.d.ts +2 -0
- package/dist/flowspec.d.ts.map +1 -1
- package/dist/flowspec.js +28 -4
- package/dist/state-contract.d.ts +7 -1
- package/dist/state-contract.d.ts.map +1 -1
- package/dist/studio/components/ApplicationDesigner.d.ts.map +1 -1
- package/dist/studio/components/ConflictExplorer.d.ts.map +1 -1
- package/dist/studio/components/index.js +1 -1
- package/dist/studio/{components-Q0Nx6gLE.js → components-9kDSWiGL.js} +163 -47
- package/dist/studio/index.js +31 -28
- package/dist/studio-app/assets/{index-BHOmLZF-.js → index-DVdvmf69.js} +9 -9
- package/dist/studio-app/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/// Workflow Integration module - connects workflows with FeltDB systems
|
|
2
|
+
///
|
|
3
|
+
/// Integrates workflows with:
|
|
4
|
+
/// - Triggers (event-triggered workflows)
|
|
5
|
+
/// - Cron (time-triggered workflows)
|
|
6
|
+
/// - Provenance (workflow lineage tracking)
|
|
7
|
+
/// - Operations (durable workflow state)
|
|
8
|
+
use crate::{CronSchedule, FlowRef, Operation, TriggerFilter, WorkflowOperation, WorkflowRef};
|
|
9
|
+
use serde::{Deserialize, Serialize};
|
|
10
|
+
use std::collections::HashMap;
|
|
11
|
+
|
|
12
|
+
/// Workflow trigger - creates workflow instances from events
|
|
13
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
14
|
+
pub struct WorkflowTrigger {
|
|
15
|
+
/// The workflow to create when triggered
|
|
16
|
+
pub workflow_ref: WorkflowRef,
|
|
17
|
+
/// Optional trigger filter (which events match)
|
|
18
|
+
pub trigger_filter: Option<TriggerFilter>,
|
|
19
|
+
/// Input mapping - how to extract workflow inputs from trigger event
|
|
20
|
+
pub input_mapping: HashMap<String, String>,
|
|
21
|
+
/// Metadata
|
|
22
|
+
pub metadata: HashMap<String, serde_json::Value>,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
impl WorkflowTrigger {
|
|
26
|
+
/// Create a new workflow trigger
|
|
27
|
+
pub fn new(workflow_ref: WorkflowRef) -> Self {
|
|
28
|
+
Self {
|
|
29
|
+
workflow_ref,
|
|
30
|
+
trigger_filter: None,
|
|
31
|
+
input_mapping: HashMap::new(),
|
|
32
|
+
metadata: HashMap::new(),
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/// Set the trigger filter
|
|
37
|
+
pub fn with_filter(mut self, filter: TriggerFilter) -> Self {
|
|
38
|
+
self.trigger_filter = Some(filter);
|
|
39
|
+
self
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/// Add input mapping
|
|
43
|
+
pub fn with_input_mapping(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
|
|
44
|
+
self.input_mapping.insert(key.into(), value.into());
|
|
45
|
+
self
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/// Workflow cron trigger - creates workflow instances from cron schedule
|
|
50
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
51
|
+
pub struct WorkflowCronTrigger {
|
|
52
|
+
/// The workflow to create on schedule
|
|
53
|
+
pub workflow_ref: WorkflowRef,
|
|
54
|
+
/// Cron schedule
|
|
55
|
+
pub schedule: CronSchedule,
|
|
56
|
+
/// Initial inputs for the workflow
|
|
57
|
+
pub inputs: Vec<FlowRef>,
|
|
58
|
+
/// Metadata
|
|
59
|
+
pub metadata: HashMap<String, serde_json::Value>,
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
impl WorkflowCronTrigger {
|
|
63
|
+
/// Create a new workflow cron trigger
|
|
64
|
+
pub fn new(workflow_ref: WorkflowRef, schedule: CronSchedule) -> Self {
|
|
65
|
+
Self {
|
|
66
|
+
workflow_ref,
|
|
67
|
+
schedule,
|
|
68
|
+
inputs: Vec::new(),
|
|
69
|
+
metadata: HashMap::new(),
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/// Add input
|
|
74
|
+
pub fn with_input(mut self, input: FlowRef) -> Self {
|
|
75
|
+
self.inputs.push(input);
|
|
76
|
+
self
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// Workflow provenance - tracks why an object exists through workflow execution
|
|
81
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
82
|
+
pub struct WorkflowProvenance {
|
|
83
|
+
/// The output reference that was created
|
|
84
|
+
pub output_ref: FlowRef,
|
|
85
|
+
/// Which workflow created it
|
|
86
|
+
pub workflow_ref: WorkflowRef,
|
|
87
|
+
/// Which workflow instance
|
|
88
|
+
pub instance_id: String,
|
|
89
|
+
/// Which step created it
|
|
90
|
+
pub step_id: String,
|
|
91
|
+
/// What capability executed the step
|
|
92
|
+
pub capability: String,
|
|
93
|
+
/// Input references that led to this output
|
|
94
|
+
pub input_refs: Vec<FlowRef>,
|
|
95
|
+
/// When it was created
|
|
96
|
+
pub created_ms: u128,
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
impl WorkflowProvenance {
|
|
100
|
+
/// Create workflow provenance record
|
|
101
|
+
pub fn new(
|
|
102
|
+
output_ref: FlowRef,
|
|
103
|
+
workflow_ref: WorkflowRef,
|
|
104
|
+
instance_id: impl Into<String>,
|
|
105
|
+
step_id: impl Into<String>,
|
|
106
|
+
capability: impl Into<String>,
|
|
107
|
+
) -> Self {
|
|
108
|
+
Self {
|
|
109
|
+
output_ref,
|
|
110
|
+
workflow_ref,
|
|
111
|
+
instance_id: instance_id.into(),
|
|
112
|
+
step_id: step_id.into(),
|
|
113
|
+
capability: capability.into(),
|
|
114
|
+
input_refs: Vec::new(),
|
|
115
|
+
created_ms: crate::now_ms(),
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/// Add an input reference
|
|
120
|
+
pub fn with_input(mut self, input_ref: FlowRef) -> Self {
|
|
121
|
+
self.input_refs.push(input_ref);
|
|
122
|
+
self
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/// Workflow operations as durable operations for the operation log
|
|
127
|
+
impl WorkflowOperation {
|
|
128
|
+
/// Convert to a durable operation
|
|
129
|
+
pub fn to_operation(&self, workflow_ref: &WorkflowRef) -> Operation {
|
|
130
|
+
let serialized = serde_json::to_value(self).unwrap_or(serde_json::json!({}));
|
|
131
|
+
|
|
132
|
+
Operation::insert(
|
|
133
|
+
0, // op_id will be assigned by storage
|
|
134
|
+
"workflow-runtime".to_string(),
|
|
135
|
+
0, // sequence will be assigned by storage
|
|
136
|
+
format!("workflow:{}", workflow_ref.canonical()),
|
|
137
|
+
serialized,
|
|
138
|
+
"WorkflowOperation".to_string(),
|
|
139
|
+
"workflow".to_string(),
|
|
140
|
+
)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/// Workflow integration manager
|
|
145
|
+
#[derive(Debug, Clone)]
|
|
146
|
+
pub struct WorkflowIntegration {
|
|
147
|
+
/// Triggers that create workflows
|
|
148
|
+
pub triggers: HashMap<String, WorkflowTrigger>,
|
|
149
|
+
/// Cron triggers that create workflows
|
|
150
|
+
pub cron_triggers: HashMap<String, WorkflowCronTrigger>,
|
|
151
|
+
/// Provenance records
|
|
152
|
+
pub provenance: HashMap<String, Vec<WorkflowProvenance>>,
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
impl WorkflowIntegration {
|
|
156
|
+
/// Create a new workflow integration manager
|
|
157
|
+
pub fn new() -> Self {
|
|
158
|
+
Self {
|
|
159
|
+
triggers: HashMap::new(),
|
|
160
|
+
cron_triggers: HashMap::new(),
|
|
161
|
+
provenance: HashMap::new(),
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/// Register a workflow trigger
|
|
166
|
+
pub fn register_trigger(&mut self, trigger_id: impl Into<String>, trigger: WorkflowTrigger) {
|
|
167
|
+
self.triggers.insert(trigger_id.into(), trigger);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/// Register a cron trigger
|
|
171
|
+
pub fn register_cron_trigger(
|
|
172
|
+
&mut self,
|
|
173
|
+
trigger_id: impl Into<String>,
|
|
174
|
+
trigger: WorkflowCronTrigger,
|
|
175
|
+
) {
|
|
176
|
+
self.cron_triggers.insert(trigger_id.into(), trigger);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/// Record workflow provenance
|
|
180
|
+
pub fn record_provenance(&mut self, provenance: WorkflowProvenance) {
|
|
181
|
+
let key = provenance.output_ref.canonical();
|
|
182
|
+
self.provenance
|
|
183
|
+
.entry(key)
|
|
184
|
+
.or_insert_with(Vec::new)
|
|
185
|
+
.push(provenance);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/// Get provenance for an output reference
|
|
189
|
+
pub fn get_provenance(&self, output_ref: &FlowRef) -> Option<Vec<WorkflowProvenance>> {
|
|
190
|
+
self.provenance.get(&output_ref.canonical()).cloned()
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/// Build complete provenance lineage (all upstream objects)
|
|
194
|
+
pub fn build_lineage(&self, output_ref: &FlowRef) -> Vec<(FlowRef, String)> {
|
|
195
|
+
let mut lineage = Vec::new();
|
|
196
|
+
let mut to_process = vec![output_ref.clone()];
|
|
197
|
+
let mut processed = std::collections::HashSet::new();
|
|
198
|
+
|
|
199
|
+
while let Some(ref_to_process) = to_process.pop() {
|
|
200
|
+
if processed.contains(&ref_to_process.canonical()) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
processed.insert(ref_to_process.canonical());
|
|
204
|
+
|
|
205
|
+
if let Some(provenances) = self.get_provenance(&ref_to_process) {
|
|
206
|
+
for prov in provenances {
|
|
207
|
+
lineage.push((
|
|
208
|
+
ref_to_process.clone(),
|
|
209
|
+
format!("{}/{}", prov.workflow_ref, prov.step_id),
|
|
210
|
+
));
|
|
211
|
+
for input_ref in &prov.input_refs {
|
|
212
|
+
to_process.push(input_ref.clone());
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
lineage
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
impl Default for WorkflowIntegration {
|
|
223
|
+
fn default() -> Self {
|
|
224
|
+
Self::new()
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
#[cfg(test)]
|
|
229
|
+
mod tests {
|
|
230
|
+
use super::*;
|
|
231
|
+
|
|
232
|
+
#[test]
|
|
233
|
+
fn test_workflow_trigger_creation() {
|
|
234
|
+
let workflow_ref = WorkflowRef::new("workflow", "test", 1);
|
|
235
|
+
let trigger = WorkflowTrigger::new(workflow_ref);
|
|
236
|
+
assert_eq!(trigger.workflow_ref.workflow_id, "test");
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
#[test]
|
|
240
|
+
fn test_workflow_trigger_with_mapping() {
|
|
241
|
+
let workflow_ref = WorkflowRef::new("workflow", "test", 1);
|
|
242
|
+
let trigger = WorkflowTrigger::new(workflow_ref)
|
|
243
|
+
.with_input_mapping("document", "event.payload.document");
|
|
244
|
+
|
|
245
|
+
assert_eq!(
|
|
246
|
+
trigger.input_mapping.get("document"),
|
|
247
|
+
Some(&"event.payload.document".to_string())
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
#[test]
|
|
252
|
+
fn test_workflow_cron_trigger() {
|
|
253
|
+
let workflow_ref = WorkflowRef::new("workflow", "scheduled", 1);
|
|
254
|
+
let schedule = CronSchedule::new(
|
|
255
|
+
"cron-1".to_string(),
|
|
256
|
+
"Daily trigger".to_string(),
|
|
257
|
+
"0 0 * * *".to_string(),
|
|
258
|
+
"schedule-capability".to_string(),
|
|
259
|
+
);
|
|
260
|
+
let trigger = WorkflowCronTrigger::new(workflow_ref, schedule);
|
|
261
|
+
|
|
262
|
+
assert_eq!(trigger.workflow_ref.workflow_id, "scheduled");
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
#[test]
|
|
266
|
+
fn test_workflow_provenance_creation() {
|
|
267
|
+
let output_ref = FlowRef::new("results", "result-1");
|
|
268
|
+
let workflow_ref = WorkflowRef::new("workflow", "test", 1);
|
|
269
|
+
|
|
270
|
+
let prov = WorkflowProvenance::new(
|
|
271
|
+
output_ref,
|
|
272
|
+
workflow_ref,
|
|
273
|
+
"instance-1",
|
|
274
|
+
"step-1",
|
|
275
|
+
"extract-capability",
|
|
276
|
+
);
|
|
277
|
+
|
|
278
|
+
assert_eq!(prov.step_id, "step-1");
|
|
279
|
+
assert_eq!(prov.capability, "extract-capability");
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
#[test]
|
|
283
|
+
fn test_workflow_provenance_with_inputs() {
|
|
284
|
+
let output_ref = FlowRef::new("results", "result-1");
|
|
285
|
+
let input_ref = FlowRef::new("documents", "doc-1");
|
|
286
|
+
let workflow_ref = WorkflowRef::new("workflow", "test", 1);
|
|
287
|
+
|
|
288
|
+
let prov = WorkflowProvenance::new(
|
|
289
|
+
output_ref,
|
|
290
|
+
workflow_ref,
|
|
291
|
+
"instance-1",
|
|
292
|
+
"step-1",
|
|
293
|
+
"extract-capability",
|
|
294
|
+
)
|
|
295
|
+
.with_input(input_ref.clone());
|
|
296
|
+
|
|
297
|
+
assert_eq!(prov.input_refs.len(), 1);
|
|
298
|
+
assert_eq!(prov.input_refs[0], input_ref);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
#[test]
|
|
302
|
+
fn test_workflow_integration_manager() {
|
|
303
|
+
let mut integration = WorkflowIntegration::new();
|
|
304
|
+
let workflow_ref = WorkflowRef::new("workflow", "test", 1);
|
|
305
|
+
|
|
306
|
+
let trigger = WorkflowTrigger::new(workflow_ref);
|
|
307
|
+
integration.register_trigger("trigger-1", trigger);
|
|
308
|
+
|
|
309
|
+
assert!(integration.triggers.contains_key("trigger-1"));
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
#[test]
|
|
313
|
+
fn test_workflow_provenance_tracking() {
|
|
314
|
+
let mut integration = WorkflowIntegration::new();
|
|
315
|
+
|
|
316
|
+
let doc_ref = FlowRef::new("documents", "doc-1");
|
|
317
|
+
let text_ref = FlowRef::new("texts", "text-1");
|
|
318
|
+
let embed_ref = FlowRef::new("embeddings", "embed-1");
|
|
319
|
+
|
|
320
|
+
let workflow_ref = WorkflowRef::new("workflow", "processing", 1);
|
|
321
|
+
|
|
322
|
+
// Extract step: document → text
|
|
323
|
+
let prov1 = WorkflowProvenance::new(
|
|
324
|
+
text_ref.clone(),
|
|
325
|
+
workflow_ref.clone(),
|
|
326
|
+
"instance-1",
|
|
327
|
+
"extract",
|
|
328
|
+
"extract-text",
|
|
329
|
+
)
|
|
330
|
+
.with_input(doc_ref.clone());
|
|
331
|
+
|
|
332
|
+
// Embed step: text → embedding
|
|
333
|
+
let prov2 = WorkflowProvenance::new(
|
|
334
|
+
embed_ref.clone(),
|
|
335
|
+
workflow_ref.clone(),
|
|
336
|
+
"instance-1",
|
|
337
|
+
"embed",
|
|
338
|
+
"embedding",
|
|
339
|
+
)
|
|
340
|
+
.with_input(text_ref.clone());
|
|
341
|
+
|
|
342
|
+
integration.record_provenance(prov1);
|
|
343
|
+
integration.record_provenance(prov2);
|
|
344
|
+
|
|
345
|
+
// Check direct provenance
|
|
346
|
+
let text_prov = integration.get_provenance(&text_ref);
|
|
347
|
+
assert!(text_prov.is_some());
|
|
348
|
+
assert_eq!(text_prov.unwrap()[0].input_refs[0], doc_ref);
|
|
349
|
+
|
|
350
|
+
// Build lineage
|
|
351
|
+
let lineage = integration.build_lineage(&embed_ref);
|
|
352
|
+
assert!(!lineage.is_empty());
|
|
353
|
+
}
|
|
354
|
+
}
|