@loxtep/sdk 0.9.30 → 0.9.32
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/CHANGELOG.md +17 -0
- package/README.md +1 -0
- package/dist/cli/commands/bots-cmd.d.ts +18 -0
- package/dist/cli/commands/bots-cmd.d.ts.map +1 -0
- package/dist/cli/commands/bots-cmd.js +85 -0
- package/dist/cli/commands/bots-cmd.js.map +1 -0
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +89 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/client/custom-bots.d.ts +33 -0
- package/dist/client/custom-bots.d.ts.map +1 -0
- package/dist/client/custom-bots.js +43 -0
- package/dist/client/custom-bots.js.map +1 -0
- package/dist/client/instances-types.d.ts +0 -1
- package/dist/client/instances-types.d.ts.map +1 -1
- package/dist/client/loxtep-client.d.ts.map +1 -1
- package/dist/client/loxtep-client.js +3 -0
- package/dist/client/loxtep-client.js.map +1 -1
- package/dist/client/workspace.d.ts +3 -0
- package/dist/client/workspace.d.ts.map +1 -1
- package/dist/client/workspace.js +1 -0
- package/dist/client/workspace.js.map +1 -1
- package/dist/lib/entity-json-schemas/types.d.ts +9 -0
- package/dist/lib/entity-json-schemas/types.d.ts.map +1 -1
- package/dist/lib/entity-json-schemas/types.js +14 -0
- package/dist/lib/entity-json-schemas/types.js.map +1 -1
- package/dist/lib/workspace-lint.d.ts +7 -0
- package/dist/lib/workspace-lint.d.ts.map +1 -1
- package/dist/lib/workspace-lint.js +68 -25
- package/dist/lib/workspace-lint.js.map +1 -1
- package/package.json +2 -1
- package/schemas/entity-json-schemas/SCHEMA_SYNC.md +10 -11
- package/schemas/entity-json-schemas/SOURCE.json +24 -0
- package/schemas/entity-json-schemas/agent.json +97 -0
- package/schemas/entity-json-schemas/approval.json +92 -0
- package/schemas/entity-json-schemas/connection.json +92 -4
- package/schemas/entity-json-schemas/connector.json +2 -0
- package/schemas/entity-json-schemas/container.json +1 -1
- package/schemas/entity-json-schemas/contract.json +10 -0
- package/schemas/entity-json-schemas/data-product.json +18 -1
- package/schemas/entity-json-schemas/domain.json +15 -0
- package/schemas/entity-json-schemas/export.json +26 -0
- package/schemas/entity-json-schemas/odps-product.json +1 -1
- package/schemas/entity-json-schemas/projection.json +94 -0
- package/schemas/entity-json-schemas/quality-rule.json +10 -0
- package/schemas/entity-json-schemas/schema.json +10 -0
- package/schemas/entity-json-schemas/transformation.json +11 -3
- package/schemas/entity-json-schemas/validation.json +8 -2
- package/schemas/entity-json-schemas/workflow.json +58 -3
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://loxtep.io/schemas/entity/agent.json",
|
|
4
|
+
"title": "Agent Node Entity",
|
|
5
|
+
"description": "JSON Schema for Agent node entity (workflows/{workflow_id}/agents/{id}.json). AI model invocation node in the streaming pipeline. Bounds match graph-patch-apply validateAgentNodePayload. additionalProperties stays open because AgentNodeEntity ([key: string]: unknown) and graph patch node_config carry runtime-specific keys; known fields are typed and required fields are enforced.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"agent_node_id",
|
|
9
|
+
"workflow_id",
|
|
10
|
+
"name",
|
|
11
|
+
"model_id",
|
|
12
|
+
"prompt_template"
|
|
13
|
+
],
|
|
14
|
+
"properties": {
|
|
15
|
+
"agent_node_id": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"minLength": 1,
|
|
18
|
+
"description": "Unique identifier for the agent node"
|
|
19
|
+
},
|
|
20
|
+
"workflow_id": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"format": "uuid",
|
|
23
|
+
"description": "Workflow this agent node belongs to"
|
|
24
|
+
},
|
|
25
|
+
"name": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"minLength": 1,
|
|
28
|
+
"maxLength": 128,
|
|
29
|
+
"description": "Display name (1-128 characters)"
|
|
30
|
+
},
|
|
31
|
+
"model_id": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"minLength": 1,
|
|
34
|
+
"maxLength": 256,
|
|
35
|
+
"description": "Model identifier to invoke (1-256 characters)"
|
|
36
|
+
},
|
|
37
|
+
"prompt_template": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"minLength": 1,
|
|
40
|
+
"maxLength": 10000,
|
|
41
|
+
"description": "Prompt template rendered with the event payload (1-10000 characters)"
|
|
42
|
+
},
|
|
43
|
+
"timeout_seconds": {
|
|
44
|
+
"type": "number",
|
|
45
|
+
"minimum": 1,
|
|
46
|
+
"maximum": 300,
|
|
47
|
+
"description": "Invocation timeout in seconds (1-300)"
|
|
48
|
+
},
|
|
49
|
+
"output_schema": {
|
|
50
|
+
"type": ["object", "null"],
|
|
51
|
+
"description": "Optional JSON Schema for the model output (at most 50KB serialized)"
|
|
52
|
+
},
|
|
53
|
+
"error_queue_name": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"minLength": 1,
|
|
56
|
+
"description": "Queue that receives failed invocations"
|
|
57
|
+
},
|
|
58
|
+
"upstream_entity_id": {
|
|
59
|
+
"type": ["string", "null"],
|
|
60
|
+
"description": "Upstream node in the workflow graph"
|
|
61
|
+
},
|
|
62
|
+
"upstream_entity_type": {
|
|
63
|
+
"type": ["string", "null"],
|
|
64
|
+
"description": "Entity type of the upstream node"
|
|
65
|
+
},
|
|
66
|
+
"upstream_label": {
|
|
67
|
+
"type": "string",
|
|
68
|
+
"enum": ["approved", "rejected", "error"],
|
|
69
|
+
"description": "Labelled edge from the upstream node (approval branches)"
|
|
70
|
+
},
|
|
71
|
+
"description": {
|
|
72
|
+
"type": ["string", "null"],
|
|
73
|
+
"description": "Free-text description"
|
|
74
|
+
},
|
|
75
|
+
"organization_id": {
|
|
76
|
+
"type": "string",
|
|
77
|
+
"format": "uuid",
|
|
78
|
+
"description": "Organization that owns this node"
|
|
79
|
+
},
|
|
80
|
+
"project_id": {
|
|
81
|
+
"type": "string",
|
|
82
|
+
"format": "uuid",
|
|
83
|
+
"description": "Project that owns this node"
|
|
84
|
+
},
|
|
85
|
+
"created_at": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"format": "date-time",
|
|
88
|
+
"description": "ISO 8601 timestamp when the node was created"
|
|
89
|
+
},
|
|
90
|
+
"updated_at": {
|
|
91
|
+
"type": "string",
|
|
92
|
+
"format": "date-time",
|
|
93
|
+
"description": "ISO 8601 timestamp when the node was last updated"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"additionalProperties": true
|
|
97
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://loxtep.io/schemas/entity/approval.json",
|
|
4
|
+
"title": "Approval Node Entity",
|
|
5
|
+
"description": "JSON Schema for Approval node entity (workflows/{workflow_id}/approvals/{id}.json). Human-in-the-loop gate that pauses event flow pending a decision. Bounds match graph-patch-apply validateApprovalNodePayload. additionalProperties stays open because ApprovalNodeEntity ([key: string]: unknown) and graph patch node_config carry runtime-specific keys; known fields are typed and required fields are enforced.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"approval_node_id",
|
|
9
|
+
"workflow_id",
|
|
10
|
+
"name",
|
|
11
|
+
"approval_channel",
|
|
12
|
+
"timeout_hours"
|
|
13
|
+
],
|
|
14
|
+
"properties": {
|
|
15
|
+
"approval_node_id": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"minLength": 1,
|
|
18
|
+
"description": "Unique identifier for the approval node"
|
|
19
|
+
},
|
|
20
|
+
"workflow_id": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"format": "uuid",
|
|
23
|
+
"description": "Workflow this approval node belongs to"
|
|
24
|
+
},
|
|
25
|
+
"name": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"minLength": 1,
|
|
28
|
+
"maxLength": 128,
|
|
29
|
+
"description": "Display name (1-128 characters)"
|
|
30
|
+
},
|
|
31
|
+
"approval_channel": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"minLength": 1,
|
|
34
|
+
"maxLength": 256,
|
|
35
|
+
"description": "Channel where approval requests are sent (1-256 characters)"
|
|
36
|
+
},
|
|
37
|
+
"timeout_hours": {
|
|
38
|
+
"type": "number",
|
|
39
|
+
"minimum": 1,
|
|
40
|
+
"maximum": 168,
|
|
41
|
+
"description": "Hours before the approval request times out (1-168)"
|
|
42
|
+
},
|
|
43
|
+
"approved_queue_name": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"minLength": 1,
|
|
46
|
+
"description": "Queue that receives approved events"
|
|
47
|
+
},
|
|
48
|
+
"rejected_queue_name": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"minLength": 1,
|
|
51
|
+
"description": "Queue that receives rejected events"
|
|
52
|
+
},
|
|
53
|
+
"upstream_entity_id": {
|
|
54
|
+
"type": ["string", "null"],
|
|
55
|
+
"description": "Upstream node in the workflow graph"
|
|
56
|
+
},
|
|
57
|
+
"upstream_entity_type": {
|
|
58
|
+
"type": ["string", "null"],
|
|
59
|
+
"description": "Entity type of the upstream node"
|
|
60
|
+
},
|
|
61
|
+
"upstream_label": {
|
|
62
|
+
"type": "string",
|
|
63
|
+
"enum": ["approved", "rejected", "error"],
|
|
64
|
+
"description": "Labelled edge from the upstream node (approval branches)"
|
|
65
|
+
},
|
|
66
|
+
"description": {
|
|
67
|
+
"type": ["string", "null"],
|
|
68
|
+
"description": "Free-text description"
|
|
69
|
+
},
|
|
70
|
+
"organization_id": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"format": "uuid",
|
|
73
|
+
"description": "Organization that owns this node"
|
|
74
|
+
},
|
|
75
|
+
"project_id": {
|
|
76
|
+
"type": "string",
|
|
77
|
+
"format": "uuid",
|
|
78
|
+
"description": "Project that owns this node"
|
|
79
|
+
},
|
|
80
|
+
"created_at": {
|
|
81
|
+
"type": "string",
|
|
82
|
+
"format": "date-time",
|
|
83
|
+
"description": "ISO 8601 timestamp when the node was created"
|
|
84
|
+
},
|
|
85
|
+
"updated_at": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"format": "date-time",
|
|
88
|
+
"description": "ISO 8601 timestamp when the node was last updated"
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"additionalProperties": true
|
|
92
|
+
}
|
|
@@ -67,6 +67,11 @@
|
|
|
67
67
|
"minLength": 1,
|
|
68
68
|
"description": "Connection type: database, api, webhook, file, or connector type (e.g. spotify, shopify)"
|
|
69
69
|
},
|
|
70
|
+
"connector_type": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"minLength": 1,
|
|
73
|
+
"description": "Connector package type emitted on connection-created (for example data-product-trigger). Distinct from type when a template sets both."
|
|
74
|
+
},
|
|
70
75
|
"status": {
|
|
71
76
|
"type": "string",
|
|
72
77
|
"enum": ["active", "inactive", "error"],
|
|
@@ -186,6 +191,15 @@
|
|
|
186
191
|
"type": ["string", "null"],
|
|
187
192
|
"description": "Cron expression (LeoCron `time`) or platform-supported schedule string for this connection's registered bot. Distinct from `polling_interval_ms`, which is a millisecond gap for application-level throttling between requests—not the Leo schedule field."
|
|
188
193
|
},
|
|
194
|
+
"primary_key": {
|
|
195
|
+
"type": "array",
|
|
196
|
+
"minItems": 1,
|
|
197
|
+
"description": "Business-identity field names. A top-level primary_key is still read, and the next connection save moves it here.",
|
|
198
|
+
"items": {
|
|
199
|
+
"type": "string",
|
|
200
|
+
"minLength": 1
|
|
201
|
+
}
|
|
202
|
+
},
|
|
189
203
|
"runtime_memory_mb": {
|
|
190
204
|
"description": "Shared runtimes tier for trigger registration (256–2048). Defaults to 256 when unset. LeoCron `lambdaName`: `w-{org4}-{inst4}-bot-connectors-{mb}-rtime`; bot id: `w-{org4}-{inst4}-{workflow4}-bot-connectors-{mb}-{container_id}`. Instance `connection_details.runtimes_stack_identifier` may override the org/instance middle segment (CDK `microserviceIdentifier` = `w-{that middle}`).",
|
|
191
205
|
"oneOf": [
|
|
@@ -212,6 +226,80 @@
|
|
|
212
226
|
"timeout_ms": {
|
|
213
227
|
"type": ["integer", "null"],
|
|
214
228
|
"description": "Request/timeout in milliseconds"
|
|
229
|
+
},
|
|
230
|
+
"type": {
|
|
231
|
+
"type": ["string", "null"],
|
|
232
|
+
"description": "Ingestion mode. Use api_poll for REST pollers."
|
|
233
|
+
},
|
|
234
|
+
"url": {
|
|
235
|
+
"type": ["string", "null"],
|
|
236
|
+
"description": "Request URL or URL template. For entity_loop include {key} (e.g. https://api.example.com/V2/products?styleID={styleID}). The rest-api runtime refuses to fire if the required key would be missing (unfiltered child collection URLs)."
|
|
237
|
+
},
|
|
238
|
+
"pagination": {
|
|
239
|
+
"type": ["object", "null"],
|
|
240
|
+
"description": "Page-to-exhaustion settings for rest-api pollers. S&S uses type=page, page_param=page, page_size_param=perPage, page_size=100, start_page=1.",
|
|
241
|
+
"properties": {
|
|
242
|
+
"type": {
|
|
243
|
+
"type": "string",
|
|
244
|
+
"enum": ["page", "offset", "cursor", "none"]
|
|
245
|
+
},
|
|
246
|
+
"page_param": {
|
|
247
|
+
"type": "string",
|
|
248
|
+
"description": "Query param for page index. Default page."
|
|
249
|
+
},
|
|
250
|
+
"page_size_param": {
|
|
251
|
+
"type": "string",
|
|
252
|
+
"description": "Query param for page size (pageSize or perPage)."
|
|
253
|
+
},
|
|
254
|
+
"page_size": { "type": "integer" },
|
|
255
|
+
"start_page": {
|
|
256
|
+
"type": "integer",
|
|
257
|
+
"description": "First page index. Default 1."
|
|
258
|
+
},
|
|
259
|
+
"cursor_field": { "type": "string" },
|
|
260
|
+
"next_url_field": { "type": "string" },
|
|
261
|
+
"offset_param": { "type": "string" },
|
|
262
|
+
"limit_param": { "type": "string" }
|
|
263
|
+
},
|
|
264
|
+
"additionalProperties": true
|
|
265
|
+
},
|
|
266
|
+
"entity_loop": {
|
|
267
|
+
"type": ["object", "null"],
|
|
268
|
+
"description": "Generic rest-api fan-out: resolve entity keys from a parent data product or parent_poll, substitute {key} into the child URL, page each entity to exhaustion, skip per-entity 4xx, and checkpoint across scheduled runs. Not vendor-specific.",
|
|
269
|
+
"properties": {
|
|
270
|
+
"key": {
|
|
271
|
+
"type": "string",
|
|
272
|
+
"description": "Entity field / URL placeholder (e.g. styleID)."
|
|
273
|
+
},
|
|
274
|
+
"source": {
|
|
275
|
+
"type": "string",
|
|
276
|
+
"enum": ["data_product", "parent_poll"],
|
|
277
|
+
"description": "data_product uses data_product_id (optional parent_poll to enumerate keys). parent_poll pages parent_poll.url."
|
|
278
|
+
},
|
|
279
|
+
"data_product_id": {
|
|
280
|
+
"type": "string",
|
|
281
|
+
"format": "uuid",
|
|
282
|
+
"description": "Parent data product that holds the entity keys (graph bind / lineage)."
|
|
283
|
+
},
|
|
284
|
+
"source_queue": {
|
|
285
|
+
"type": "string",
|
|
286
|
+
"description": "Optional parent rstreams queue name."
|
|
287
|
+
},
|
|
288
|
+
"parent_poll": {
|
|
289
|
+
"type": "object",
|
|
290
|
+
"description": "HTTP parent catalog used to resolve keys (page to exhaustion).",
|
|
291
|
+
"properties": {
|
|
292
|
+
"url": { "type": "string" },
|
|
293
|
+
"base_url": { "type": "string" },
|
|
294
|
+
"pagination": { "type": "object" },
|
|
295
|
+
"data_path": { "type": "string" },
|
|
296
|
+
"query_params": { "type": "object" }
|
|
297
|
+
},
|
|
298
|
+
"additionalProperties": true
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
"required": ["key", "source"],
|
|
302
|
+
"additionalProperties": true
|
|
215
303
|
}
|
|
216
304
|
},
|
|
217
305
|
"additionalProperties": true
|
|
@@ -233,7 +321,7 @@
|
|
|
233
321
|
],
|
|
234
322
|
"description": "Authentication type for the connection (optional, backwards compat)."
|
|
235
323
|
},
|
|
236
|
-
"
|
|
324
|
+
"transfer_mechanism": {
|
|
237
325
|
"type": ["string", "null"],
|
|
238
326
|
"enum": [
|
|
239
327
|
"polling",
|
|
@@ -246,7 +334,7 @@
|
|
|
246
334
|
"other",
|
|
247
335
|
null
|
|
248
336
|
],
|
|
249
|
-
"description": "How data
|
|
337
|
+
"description": "How data moves for this connection (optional). Formerly ingestion_type; renamed because connector_mode now carries direction and this field only ever described mechanism."
|
|
250
338
|
},
|
|
251
339
|
"export_type": {
|
|
252
340
|
"type": ["string", "null"],
|
|
@@ -287,12 +375,12 @@
|
|
|
287
375
|
"connector_mode": {
|
|
288
376
|
"type": ["string", "null"],
|
|
289
377
|
"enum": ["inbound", "outbound", "bidirectional", null],
|
|
290
|
-
"description": "For enrichment workflows: mid-flow connection must be 'bidirectional'. For ingestion head use 'inbound'; for
|
|
378
|
+
"description": "For enrichment workflows: mid-flow connection must be 'bidirectional'. For ingestion head use 'inbound'; for delivery tail use 'outbound'. Must match connector supported_directions."
|
|
291
379
|
},
|
|
292
380
|
"upstream_entity_id": {
|
|
293
381
|
"type": ["string", "null"],
|
|
294
382
|
"format": "uuid",
|
|
295
|
-
"description": "Upstream entity in the flow graph (e.g. data-product in
|
|
383
|
+
"description": "Upstream entity in the flow graph (e.g. data-product in delivery flows). Null for source connections."
|
|
296
384
|
},
|
|
297
385
|
"upstream_entity_type": {
|
|
298
386
|
"type": ["string", "null"],
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
"category": {
|
|
49
49
|
"type": "string",
|
|
50
50
|
"enum": [
|
|
51
|
+
"basic",
|
|
51
52
|
"e_commerce",
|
|
52
53
|
"crm",
|
|
53
54
|
"marketing",
|
|
@@ -57,6 +58,7 @@
|
|
|
57
58
|
"analytics",
|
|
58
59
|
"communication",
|
|
59
60
|
"productivity",
|
|
61
|
+
"fulfillment",
|
|
60
62
|
"custom"
|
|
61
63
|
],
|
|
62
64
|
"description": "Connector category"
|
|
@@ -25,6 +25,16 @@
|
|
|
25
25
|
"format": "uuid",
|
|
26
26
|
"description": "Organization that owns this contract"
|
|
27
27
|
},
|
|
28
|
+
"project_id": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"format": "uuid",
|
|
31
|
+
"description": "Project that contains this contract"
|
|
32
|
+
},
|
|
33
|
+
"workflow_id": {
|
|
34
|
+
"type": ["string", "null"],
|
|
35
|
+
"format": "uuid",
|
|
36
|
+
"description": "Workflow this contract belongs to when saved in a workflow bundle"
|
|
37
|
+
},
|
|
28
38
|
"data_product_id": {
|
|
29
39
|
"type": "string",
|
|
30
40
|
"format": "uuid",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://loxtep.io/schemas/entity/data-product.json",
|
|
4
4
|
"title": "Data Product Entity",
|
|
5
|
-
"description": "JSON Schema for Data Product entity in customer workspace (Studio / S3 graph). Flow-graph fields (workflow_id, upstream_entity_id, etc.) describe placement in the workflow canvas. The canonical interoperable catalog and API representation is ODPS v4.1 (Open Data Products Standard): include `odps_document` aligned with https://opendataproducts.org/v4.1/schema/odps.json — see `odps-product.json`
|
|
5
|
+
"description": "JSON Schema for Data Product entity in customer workspace (Studio / S3 graph). Flow-graph fields (workflow_id, upstream_entity_id, etc.) describe placement in the workflow canvas. The canonical interoperable catalog and API representation is ODPS v4.1 (Open Data Products Standard): include `odps_document` aligned with https://opendataproducts.org/v4.1/schema/odps.json — see `odps-product.json` and .kiro/specs/odps-data-product-standard in the Loxtep repo.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": [
|
|
8
8
|
"data_product_id",
|
|
@@ -24,6 +24,16 @@
|
|
|
24
24
|
"format": "uuid",
|
|
25
25
|
"description": "Organization that owns this data product"
|
|
26
26
|
},
|
|
27
|
+
"project_id": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"format": "uuid",
|
|
30
|
+
"description": "Project that contains this data product"
|
|
31
|
+
},
|
|
32
|
+
"kind": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"enum": ["source", "consumer"],
|
|
35
|
+
"description": "Data product role in the flow (source or consumer)"
|
|
36
|
+
},
|
|
27
37
|
"workflow_id": {
|
|
28
38
|
"type": "string",
|
|
29
39
|
"format": "uuid",
|
|
@@ -152,6 +162,13 @@
|
|
|
152
162
|
"format": "date-time",
|
|
153
163
|
"description": "ISO 8601 timestamp when data product was deleted (soft delete)"
|
|
154
164
|
},
|
|
165
|
+
"schema": {
|
|
166
|
+
"description": "Product schema stored on the data product (object or JSON string). Read by medallion, metrics, and semantic bootstrap as dp.schema.",
|
|
167
|
+
"oneOf": [
|
|
168
|
+
{ "type": "object", "additionalProperties": true },
|
|
169
|
+
{ "type": "string", "minLength": 1 }
|
|
170
|
+
]
|
|
171
|
+
},
|
|
155
172
|
"odps_document": {
|
|
156
173
|
"description": "Canonical ODPS v4.1 document (`{ product: ... }`). Preferred for platform catalog, governance, and ecosystem interoperability. Validated in the dataproducts API; Loxtep-specific fields under product.custom.loxtep.",
|
|
157
174
|
"allOf": [
|
|
@@ -22,6 +22,11 @@
|
|
|
22
22
|
"format": "uuid",
|
|
23
23
|
"description": "Organization that owns this domain"
|
|
24
24
|
},
|
|
25
|
+
"project_id": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"format": "uuid",
|
|
28
|
+
"description": "Project that contains this domain (set when a bundle save writes the file)"
|
|
29
|
+
},
|
|
25
30
|
"name": {
|
|
26
31
|
"type": "string",
|
|
27
32
|
"minLength": 1,
|
|
@@ -64,6 +69,16 @@
|
|
|
64
69
|
"format": "date-time",
|
|
65
70
|
"description": "ISO 8601 timestamp when domain was last updated"
|
|
66
71
|
},
|
|
72
|
+
"created_by": {
|
|
73
|
+
"type": ["string", "null"],
|
|
74
|
+
"format": "uuid",
|
|
75
|
+
"description": "User ID who created the domain"
|
|
76
|
+
},
|
|
77
|
+
"updated_by": {
|
|
78
|
+
"type": ["string", "null"],
|
|
79
|
+
"format": "uuid",
|
|
80
|
+
"description": "User ID who last updated the domain"
|
|
81
|
+
},
|
|
67
82
|
"deleted_at": {
|
|
68
83
|
"type": ["string", "null"],
|
|
69
84
|
"format": "date-time",
|
|
@@ -26,11 +26,37 @@
|
|
|
26
26
|
"format": "uuid",
|
|
27
27
|
"description": "Organization that owns this export"
|
|
28
28
|
},
|
|
29
|
+
"project_id": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"format": "uuid",
|
|
32
|
+
"description": "Project that contains this export"
|
|
33
|
+
},
|
|
34
|
+
"workflow_id": {
|
|
35
|
+
"type": ["string", "null"],
|
|
36
|
+
"format": "uuid",
|
|
37
|
+
"description": "Workflow this export belongs to when saved in a workflow bundle"
|
|
38
|
+
},
|
|
29
39
|
"data_product_id": {
|
|
30
40
|
"type": "string",
|
|
31
41
|
"format": "uuid",
|
|
32
42
|
"description": "Reference to the data product this export applies to"
|
|
33
43
|
},
|
|
44
|
+
"upstream_entity_id": {
|
|
45
|
+
"type": ["string", "null"],
|
|
46
|
+
"format": "uuid",
|
|
47
|
+
"description": "Upstream canvas node this export is wired from"
|
|
48
|
+
},
|
|
49
|
+
"upstream_entity_type": {
|
|
50
|
+
"type": ["string", "null"],
|
|
51
|
+
"enum": [
|
|
52
|
+
"connections",
|
|
53
|
+
"transformations",
|
|
54
|
+
"validations",
|
|
55
|
+
"data-products",
|
|
56
|
+
null
|
|
57
|
+
],
|
|
58
|
+
"description": "Entity type of upstream_entity_id"
|
|
59
|
+
},
|
|
34
60
|
"name": {
|
|
35
61
|
"type": "string",
|
|
36
62
|
"minLength": 1,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"$id": "https://loxtep.io/schemas/entity/odps-product.json",
|
|
4
4
|
"title": "ODPS v4.1 Data Product Document",
|
|
5
5
|
"x-canonical-json-schema": "https://opendataproducts.org/v4.1/schema/odps.json",
|
|
6
|
-
"description": "Open Data Products Standard (ODPS) v4.1 root document (`product.*`). Authoritative JSON Schema: https://opendataproducts.org/v4.1/schema/odps.json . Platform-specific fields live under `product.custom.loxtep` (medallion, storage, ingestion, organization_id, domain_id, project_id, workflow_id, etc.). For strict full-schema validation in toolchains that resolve remote $ref, compose with allOf + $ref to x-canonical-json-schema (requires network or bundled copy).",
|
|
6
|
+
"description": "Open Data Products Standard (ODPS) v4.1 root document (`product.*`). Authoritative JSON Schema: https://opendataproducts.org/v4.1/schema/odps.json . Loxtep platform types and mapping: platform-backend/_core/src/types/odps/ and .kiro/specs/odps-data-product-standard. Platform-specific fields live under `product.custom.loxtep` (medallion, storage, ingestion, organization_id, domain_id, project_id, workflow_id, etc.). For strict full-schema validation in toolchains that resolve remote $ref, compose with allOf + $ref to x-canonical-json-schema (requires network or bundled copy).",
|
|
7
7
|
"type": "object",
|
|
8
8
|
"required": ["product"],
|
|
9
9
|
"additionalProperties": false,
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://loxtep.io/schemas/entity/projection.json",
|
|
4
|
+
"title": "Projection Entity",
|
|
5
|
+
"description": "JSON Schema for Projection entity in customer workspace. Projections are thin workflow nodes that delegate field mapping to TransformationEngine.transformBatch, connecting source Data_Product output ports to Entity_Store input ports.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"projection_id",
|
|
9
|
+
"organization_id",
|
|
10
|
+
"workflow_id",
|
|
11
|
+
"entity_definition_id",
|
|
12
|
+
"projection_spec_id",
|
|
13
|
+
"status",
|
|
14
|
+
"created_at",
|
|
15
|
+
"updated_at"
|
|
16
|
+
],
|
|
17
|
+
"properties": {
|
|
18
|
+
"projection_id": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"format": "uuid",
|
|
21
|
+
"description": "Unique identifier for the projection workflow node"
|
|
22
|
+
},
|
|
23
|
+
"organization_id": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"format": "uuid",
|
|
26
|
+
"description": "Organization that owns this projection"
|
|
27
|
+
},
|
|
28
|
+
"workflow_id": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"format": "uuid",
|
|
31
|
+
"description": "Workflow this projection node belongs to"
|
|
32
|
+
},
|
|
33
|
+
"entity_definition_id": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"format": "uuid",
|
|
36
|
+
"description": "Target Entity_Definition this projection materializes"
|
|
37
|
+
},
|
|
38
|
+
"projection_spec_id": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"format": "uuid",
|
|
41
|
+
"description": "Projection_Spec that defines the field mappings"
|
|
42
|
+
},
|
|
43
|
+
"name": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"minLength": 1,
|
|
46
|
+
"description": "Display name of the projection node (written by ProjectionWorkflowNode.activate)"
|
|
47
|
+
},
|
|
48
|
+
"source_data_product_ids": {
|
|
49
|
+
"type": "array",
|
|
50
|
+
"items": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"format": "uuid"
|
|
53
|
+
},
|
|
54
|
+
"minItems": 1,
|
|
55
|
+
"description": "Source Data_Product IDs whose output ports feed this projection"
|
|
56
|
+
},
|
|
57
|
+
"status": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"enum": ["active", "inactive", "draft"],
|
|
60
|
+
"description": "Current status of the projection node"
|
|
61
|
+
},
|
|
62
|
+
"upstream_entity_id": {
|
|
63
|
+
"type": ["string", "null"],
|
|
64
|
+
"format": "uuid",
|
|
65
|
+
"description": "Upstream node in the workflow graph (typically a Data_Product output port)"
|
|
66
|
+
},
|
|
67
|
+
"upstream_entity_type": {
|
|
68
|
+
"type": ["string", "null"],
|
|
69
|
+
"description": "Entity type of the upstream node"
|
|
70
|
+
},
|
|
71
|
+
"metadata": {
|
|
72
|
+
"type": "object",
|
|
73
|
+
"additionalProperties": true,
|
|
74
|
+
"default": {},
|
|
75
|
+
"description": "Additional metadata for the projection node"
|
|
76
|
+
},
|
|
77
|
+
"created_at": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"format": "date-time",
|
|
80
|
+
"description": "ISO 8601 timestamp when projection node was created"
|
|
81
|
+
},
|
|
82
|
+
"updated_at": {
|
|
83
|
+
"type": "string",
|
|
84
|
+
"format": "date-time",
|
|
85
|
+
"description": "ISO 8601 timestamp when projection node was last updated"
|
|
86
|
+
},
|
|
87
|
+
"deleted_at": {
|
|
88
|
+
"type": ["string", "null"],
|
|
89
|
+
"format": "date-time",
|
|
90
|
+
"description": "ISO 8601 timestamp when projection node was deleted (soft delete)"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"additionalProperties": false
|
|
94
|
+
}
|
|
@@ -26,6 +26,16 @@
|
|
|
26
26
|
"format": "uuid",
|
|
27
27
|
"description": "Organization that owns this quality rule"
|
|
28
28
|
},
|
|
29
|
+
"project_id": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"format": "uuid",
|
|
32
|
+
"description": "Project that contains this quality rule"
|
|
33
|
+
},
|
|
34
|
+
"workflow_id": {
|
|
35
|
+
"type": ["string", "null"],
|
|
36
|
+
"format": "uuid",
|
|
37
|
+
"description": "Workflow this quality rule belongs to when saved in a workflow bundle"
|
|
38
|
+
},
|
|
29
39
|
"data_product_id": {
|
|
30
40
|
"type": ["string", "null"],
|
|
31
41
|
"format": "uuid",
|
|
@@ -27,6 +27,16 @@
|
|
|
27
27
|
"format": "uuid",
|
|
28
28
|
"description": "Organization that owns this schema"
|
|
29
29
|
},
|
|
30
|
+
"project_id": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"format": "uuid",
|
|
33
|
+
"description": "Project that contains this schema"
|
|
34
|
+
},
|
|
35
|
+
"workflow_id": {
|
|
36
|
+
"type": ["string", "null"],
|
|
37
|
+
"format": "uuid",
|
|
38
|
+
"description": "Workflow this schema belongs to when saved in a workflow bundle"
|
|
39
|
+
},
|
|
30
40
|
"data_product_id": {
|
|
31
41
|
"type": "string",
|
|
32
42
|
"format": "uuid",
|