@elevasis/core 0.37.0 → 0.39.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.
@@ -1,425 +1,443 @@
1
- /**
2
- * Resource Registry type definitions
3
- */
4
-
5
- import type { IntegrationType } from '../../execution/engine/tools/integration'
6
- import type { ResourceEntry, ResourceGovernanceStatus } from '../../organization-model/domains/resources'
7
- import type { SystemEntry } from '../../organization-model/domains/systems'
8
- import type { ResourceCategory, ResourceLink } from './resource-link'
9
-
10
- // ============================================================================
11
- // Core Resource Type Definitions
12
- // ============================================================================
13
-
14
- /**
15
- * Environment/deployment status for resources
16
- */
17
- export type ResourceStatus = 'dev' | 'prod'
18
-
19
- /**
20
- * All resource types in the platform
21
- * Used as the discriminator field in ResourceDefinition
22
- */
23
- export type ResourceType = 'agent' | 'workflow' | 'trigger' | 'integration' | 'external' | 'human'
24
-
25
- /**
26
- * Executable resource types (subset of ResourceType)
27
- * These resources can be directly executed by the execution engine
28
- */
29
- export type ExecutableResourceType = 'workflow' | 'agent'
30
-
31
- export type ResourceSystemSummary = Pick<SystemEntry, 'id' | 'title' | 'description' | 'kind' | 'lifecycle'>
32
-
33
- // ============================================================================
34
- // Base Resource Interface
35
- // ============================================================================
36
-
37
- /**
38
- * Base interface for ALL platform resources
39
- * Shared by both executable (agents, workflows) and non-executable (triggers, integrations, etc.) resources
40
- */
41
- export interface ResourceDefinition {
42
- /** Unique resource identifier */
43
- resourceId: string
44
-
45
- /** Display name */
46
- name: string
47
-
48
- /** Purpose and functionality description */
49
- description: string
50
-
51
- /** Version for change tracking and evolution */
52
- version: string
53
-
54
- /** Resource type discriminator */
55
- type: ResourceType
56
-
57
- /** Environment/deployment status */
58
- status: ResourceStatus
59
-
60
- /** Graph links to Organization Model nodes */
61
- links?: ResourceLink[]
62
-
63
- /** Infrastructure category for filtering */
64
- category?: ResourceCategory
65
-
66
- /** Whether the agent supports multi-turn sessions (agents only) */
67
- sessionCapable?: boolean
68
-
69
- /** Whether the resource is local (monorepo) or remote (externally deployed) */
70
- origin?: 'local' | 'remote'
71
-
72
- /** OM System membership — dot-separated system path (e.g. "sys.lead-gen"), when backed by a Resource descriptor */
73
- systemPath?: string
74
-
75
- /** Display metadata for the owning OM System */
76
- system?: ResourceSystemSummary
77
-
78
- /** Governance lifecycle status from the OM Resource descriptor */
79
- governanceStatus?: ResourceGovernanceStatus
80
-
81
- /** Whether this resource is archived and should be excluded from registration and deployment */
82
- archived?: boolean
83
- }
84
-
85
- export type RuntimeResourceDescriptor = Extract<ResourceEntry, { kind: 'workflow' | 'agent' | 'integration' }>
86
-
87
- export type DescriptorBackedResourceDefinition<
88
- TResource extends RuntimeResourceDescriptor = RuntimeResourceDescriptor
89
- > = Omit<ResourceDefinition, 'resourceId' | 'type'> & {
90
- /** OM descriptor that owns canonical identity and governance metadata. */
91
- resource: TResource
92
- resourceId?: never
93
- type?: never
94
- }
95
-
96
- export type BoundResourceDefinition<TResource extends RuntimeResourceDescriptor = RuntimeResourceDescriptor> = Omit<
97
- DescriptorBackedResourceDefinition<TResource>,
98
- 'resource'
99
- > &
100
- ResourceDefinition & {
101
- resource: TResource
102
- resourceId: TResource['id']
103
- type: TResource['kind']
104
- }
105
-
106
- export function bindResourceDescriptor<TResource extends RuntimeResourceDescriptor>(
107
- definition: DescriptorBackedResourceDefinition<TResource>
108
- ): BoundResourceDefinition<TResource> {
109
- const { resource, ...rest } = definition
110
-
111
- return {
112
- ...rest,
113
- resource,
114
- resourceId: resource.id,
115
- type: resource.kind
116
- } as BoundResourceDefinition<TResource>
117
- }
118
-
119
- /**
120
- * Resource list for organization
121
- * Returns ResourceDefinition metadata (not full definitions)
122
- */
123
- export interface ResourceList {
124
- workflows: ResourceDefinition[]
125
- agents: ResourceDefinition[]
126
- total: number
127
- organizationName: string
128
- environment?: 'dev' | 'prod'
129
- }
130
-
131
- // ============================================================================
132
- // Resource Manifest Types
133
- // ============================================================================
134
-
135
- // ============================================================================
136
- // Trigger Configuration Types
137
- // ============================================================================
138
-
139
- /** Webhook provider identifiers */
140
- export type WebhookProviderType = 'cal-com' | 'stripe' | 'signature-api' | 'instantly' | 'apify' | 'test'
141
-
142
- /** Webhook trigger configuration */
143
- export interface WebhookTriggerConfig {
144
- /** Provider identifier */
145
- provider: WebhookProviderType
146
- /** Event type for documentation (not used for matching - workflow handles routing) */
147
- event?: string
148
- /** Optional filtering (e.g., specific form ID for Fillout) */
149
- filter?: Record<string, string>
150
- /** References credential in credentials table for per-org webhook secrets */
151
- credentialName?: string
152
- }
153
-
154
- /** Schedule trigger configuration */
155
- export interface ScheduleTriggerConfig {
156
- /** Cron expression (e.g., '0 6 * * *') */
157
- cron: string
158
- /** Optional timezone (default: UTC) */
159
- timezone?: string
160
- }
161
-
162
- /** Event trigger configuration */
163
- export interface EventTriggerConfig {
164
- /** Internal event type */
165
- eventType: string
166
- /** Event source */
167
- source?: string
168
- }
169
-
170
- /** Union of all trigger configs */
171
- export type TriggerConfig = WebhookTriggerConfig | ScheduleTriggerConfig | EventTriggerConfig
172
-
173
- // ============================================================================
174
- // Trigger Definition
175
- // ============================================================================
176
-
177
- /**
178
- * Trigger metadata - entry points that initiate resource execution
179
- *
180
- * Triggers represent how executions start: webhooks from external services,
181
- * scheduled cron jobs, platform events, or manual user actions.
182
- *
183
- * BREAKING CHANGES (2025-11-30):
184
- * - Now extends ResourceDefinition (inherits: resourceId, name, description, version, type, status, links, category)
185
- * - Field renames: `id` -> `resourceId` (inherited), `type` -> `triggerType`
186
- * - Relationship rename: `invokes` -> `triggers` (unified vocabulary)
187
- * - New required fields: `version` (inherited), `type: 'trigger'` (inherited)
188
- * - triggers object now includes `externalResources` option
189
- *
190
- * @example
191
- * // TriggerDefinition - metadata only
192
- * {
193
- * resourceId: 'trigger-new-order',
194
- * type: 'trigger',
195
- * triggerType: 'webhook',
196
- * name: 'New Order',
197
- * description: 'Webhook from Shopify on new orders',
198
- * version: '1.0.0',
199
- * status: 'prod',
200
- * webhookPath: '/webhooks/shopify/orders'
201
- * }
202
- *
203
- * // Relationships declared in ResourceRelationships (not on TriggerDefinition):
204
- * // relationships: {
205
- * // 'trigger-new-order': { triggers: { workflows: ['order-fulfillment-workflow'] } }
206
- * // }
207
- */
208
- export interface TriggerDefinition extends ResourceDefinition {
209
- /** Resource type discriminator (narrowed from base union) */
210
- type: 'trigger'
211
-
212
- /** Trigger mechanism type (renamed from 'type' to avoid collision with base type discriminator) */
213
- triggerType: 'webhook' | 'schedule' | 'manual' | 'event'
214
-
215
- /** Type-specific configuration */
216
- config?: TriggerConfig
217
-
218
- // Legacy fields (deprecated, use config instead)
219
- /** For webhook triggers: path like '/webhooks/shopify/orders' */
220
- webhookPath?: string
221
- /** For schedule triggers: cron expression like '0 6 * * *' */
222
- schedule?: string
223
- /** For event triggers: event type like 'low-stock-alert' */
224
- eventType?: string
225
-
226
- // NOTE: What this trigger starts is declared in ResourceRelationships, not here
227
- // This prevents duplication - triggers are forward-declared in relationships
228
- }
229
-
230
- /**
231
- * Integration metadata - external service connections
232
- *
233
- * References credentials table for actual connection. No connection status
234
- * stored here (queried at runtime from credentials table).
235
- *
236
- * BREAKING CHANGES (2025-11-30):
237
- * - Now extends ResourceDefinition (inherits: resourceId, name, description, version, type, status, links, category)
238
- * - Field renames: `id` -> `resourceId` (inherited)
239
- * - New required field: `status` (inherited) - organizations must add status to all integrations
240
- * - New required field: `version` (inherited) - organizations must add version to all integrations
241
- * - New required field: `type: 'integration'` (inherited) - resource type discriminator
242
- *
243
- * @example
244
- * {
245
- * resourceId: 'integration-shopify-prod',
246
- * type: 'integration',
247
- * provider: 'shopify',
248
- * credentialName: 'shopify-prod',
249
- * name: 'Shopify Production',
250
- * description: 'E-commerce platform',
251
- * version: '1.0.0',
252
- * status: 'prod'
253
- * }
254
- */
255
- export interface IntegrationDefinition extends ResourceDefinition {
256
- /** Resource type discriminator (narrowed from base union) */
257
- type: 'integration'
258
-
259
- /** OM descriptor that owns canonical identity and governance metadata. */
260
- resource?: Extract<ResourceEntry, { kind: 'integration' }>
261
-
262
- /** Integration provider type */
263
- provider: IntegrationType
264
- /** References credentials table (e.g., 'shopify-prod', 'zendesk-api') */
265
- credentialName: string
266
- }
267
-
268
- /**
269
- * Explicit resource relationship declaration
270
- *
271
- * Single-direction only - Command View derives reverse relationships.
272
- * Agents/workflows declare what they trigger and use.
273
- *
274
- * @example
275
- * {
276
- * triggers: { workflows: ['order-fulfillment-workflow'] },
277
- * uses: { integrations: ['integration-shopify-prod', 'integration-postgres'] }
278
- * }
279
- */
280
- export interface RelationshipDeclaration {
281
- /** Resources this resource triggers */
282
- triggers?: {
283
- /** Agent resourceIds this resource triggers */
284
- agents?: string[]
285
- /** Workflow resourceIds this resource triggers */
286
- workflows?: string[]
287
- }
288
- /** Integrations this resource uses */
289
- uses?: {
290
- /** Integration IDs this resource uses */
291
- integrations?: string[]
292
- }
293
- }
294
-
295
- /**
296
- * Resource relationships map
297
- * Maps resourceId to its relationship declarations
298
- *
299
- * @example
300
- * {
301
- * 'order-processor-agent': {
302
- * triggers: { workflows: ['order-fulfillment-workflow'] },
303
- * uses: { integrations: ['integration-shopify-prod'] }
304
- * }
305
- * }
306
- */
307
- export type ResourceRelationships = Record<string, RelationshipDeclaration>
308
-
309
- // ============================================================================
310
- // External Resource Types
311
- // ============================================================================
312
-
313
- /**
314
- * External platform type
315
- * Supported third-party automation platforms
316
- */
317
- export type ExternalPlatform = 'n8n' | 'make' | 'zapier' | 'other'
318
-
319
- /**
320
- * External automation resource metadata
321
- *
322
- * Represents workflows/automations running on third-party platforms
323
- * (n8n, Make, Zapier, etc.) for visualization in Command View.
324
- *
325
- * NOTE: This is metadata ONLY for visualization. No execution logic,
326
- * no API integration with external platforms, no status syncing.
327
- *
328
- * BREAKING CHANGES (2025-11-30):
329
- * - Now extends ResourceDefinition (inherits: resourceId, name, description, version, type, status, links, category)
330
- * - Field renames: `id` -> `resourceId` (inherited)
331
- * - New required field: `version` (inherited) - organizations must add version to all external resources
332
- * - New required field: `type: 'external'` (inherited) - resource type discriminator
333
- * - REMOVED FIELD: `triggeredBy` - per relationship-consolidation design, all relationships are forward-only declarations
334
- *
335
- * @example
336
- * {
337
- * resourceId: 'external-n8n-order-sync',
338
- * type: 'external',
339
- * version: '1.0.0',
340
- * platform: 'n8n',
341
- * name: 'Shopify Order Sync',
342
- * description: 'Legacy n8n workflow for syncing Shopify orders',
343
- * status: 'prod',
344
- * platformUrl: 'https://n8n.client.com/workflow/123',
345
- * triggers: { workflows: ['order-fulfillment-workflow'] },
346
- * uses: { integrations: ['integration-shopify-prod'] }
347
- * }
348
- */
349
- export interface ExternalResourceDefinition extends ResourceDefinition {
350
- /** Resource type discriminator (narrowed from base union) */
351
- type: 'external'
352
-
353
- /** Platform type */
354
- platform: ExternalPlatform
355
-
356
- // Optional platform-specific metadata
357
- /** Link to external platform (e.g., n8n workflow editor URL) */
358
- platformUrl?: string
359
- /** Platform's internal ID/reference */
360
- externalId?: string
361
-
362
- /** What this external resource triggers (external -> internal) */
363
- triggers?: {
364
- /** Elevasis workflow resourceIds this external automation triggers */
365
- workflows?: string[]
366
- /** Elevasis agent resourceIds this external automation triggers */
367
- agents?: string[]
368
- }
369
-
370
- /** Integrations this external resource uses (shared credentials) */
371
- uses?: {
372
- /** Integration IDs this external automation uses */
373
- integrations?: string[]
374
- }
375
-
376
- // NOTE: triggeredBy field removed - per relationship-consolidation design,
377
- // all relationships are forward-only declarations. Graph edges are built
378
- // from forward declarations only.
379
- }
380
-
381
- /**
382
- * Human Checkpoint definition - human decision points in automation
383
- *
384
- * Represents where human judgment is deployed in the automation landscape.
385
- * Tasks with matching command_queue_group are routed to this checkpoint.
386
- *
387
- * BREAKING CHANGES (2025-11-30):
388
- * - Now extends ResourceDefinition (inherits: resourceId, name, description, version, type, status, links, category)
389
- * - Field renames: `id` -> `resourceId` (inherited)
390
- * - description is now REQUIRED (was optional) - organizations must add description to all human checkpoints
391
- * - New required field: `version` (inherited) - organizations must add version to all human checkpoints
392
- * - New required field: `type: 'human'` (inherited) - resource type discriminator
393
- *
394
- * @example
395
- * {
396
- * resourceId: 'sales-approval',
397
- * type: 'human',
398
- * name: 'Sales Approval Queue',
399
- * description: 'High-value order approvals for sales team',
400
- * version: '1.0.0',
401
- * status: 'prod',
402
- * requestedBy: { agents: ['order-processor-agent'] },
403
- * routesTo: { agents: ['order-fulfillment-agent'] }
404
- * }
405
- */
406
- export interface HumanCheckpointDefinition extends ResourceDefinition {
407
- /** Resource type discriminator (narrowed from base union) */
408
- type: 'human'
409
-
410
- /** Resources that create tasks for this checkpoint */
411
- requestedBy?: {
412
- /** Agent resourceIds that request approval here */
413
- agents?: string[]
414
- /** Workflow resourceIds that request approval here */
415
- workflows?: string[]
416
- }
417
-
418
- /** Resources that receive approved decisions */
419
- routesTo?: {
420
- /** Agent resourceIds that handle approved tasks */
421
- agents?: string[]
422
- /** Workflow resourceIds that handle approved tasks */
423
- workflows?: string[]
424
- }
425
- }
1
+ /**
2
+ * Resource Registry type definitions
3
+ */
4
+
5
+ import type { IntegrationType } from '../../execution/engine/tools/integration'
6
+ import type { ResourceEntry, ResourceGovernanceStatus } from '../../organization-model/domains/resources'
7
+ import type { SystemEntry } from '../../organization-model/domains/systems'
8
+ import type { ResourceCategory, ResourceLink } from './resource-link'
9
+
10
+ // ============================================================================
11
+ // Core Resource Type Definitions
12
+ // ============================================================================
13
+
14
+ /**
15
+ * Environment/deployment status for resources
16
+ */
17
+ export type ResourceStatus = 'dev' | 'prod'
18
+
19
+ /**
20
+ * All resource types in the platform
21
+ * Used as the discriminator field in ResourceDefinition
22
+ */
23
+ export type ResourceType = 'agent' | 'workflow' | 'trigger' | 'integration' | 'external' | 'human'
24
+
25
+ /**
26
+ * Executable resource types (subset of ResourceType)
27
+ * These resources can be directly executed by the execution engine
28
+ */
29
+ export type ExecutableResourceType = 'workflow' | 'agent'
30
+
31
+ export type ResourceSystemSummary = Pick<SystemEntry, 'id' | 'title' | 'description' | 'kind' | 'lifecycle'>
32
+
33
+ // ============================================================================
34
+ // Base Resource Interface
35
+ // ============================================================================
36
+
37
+ /**
38
+ * Base interface for ALL platform resources
39
+ * Shared by both executable (agents, workflows) and non-executable (triggers, integrations, etc.) resources
40
+ */
41
+ export interface ResourceDefinition {
42
+ /** Unique resource identifier */
43
+ resourceId: string
44
+
45
+ /** Display name */
46
+ name: string
47
+
48
+ /** Purpose and functionality description */
49
+ description: string
50
+
51
+ /** Version for change tracking and evolution */
52
+ version: string
53
+
54
+ /** Resource type discriminator */
55
+ type: ResourceType
56
+
57
+ /** Environment/deployment status */
58
+ status: ResourceStatus
59
+
60
+ /** Graph links to Organization Model nodes */
61
+ links?: ResourceLink[]
62
+
63
+ /** Infrastructure category for filtering */
64
+ category?: ResourceCategory
65
+
66
+ /** Whether the agent supports multi-turn sessions (agents only) */
67
+ sessionCapable?: boolean
68
+
69
+ /** Whether the resource is local (monorepo) or remote (externally deployed) */
70
+ origin?: 'local' | 'remote'
71
+
72
+ /** OM System membership — dot-separated system path (e.g. "sys.lead-gen"), when backed by a Resource descriptor */
73
+ systemPath?: string
74
+
75
+ /** Display metadata for the owning OM System */
76
+ system?: ResourceSystemSummary
77
+
78
+ /** Governance lifecycle status from the OM Resource descriptor */
79
+ governanceStatus?: ResourceGovernanceStatus
80
+
81
+ /** Whether this resource is archived and should be excluded from registration and deployment */
82
+ archived?: boolean
83
+ }
84
+
85
+ export type RuntimeResourceDescriptor = Extract<ResourceEntry, { kind: 'workflow' | 'agent' | 'integration' }>
86
+
87
+ export type DescriptorBackedResourceDefinition<
88
+ TResource extends RuntimeResourceDescriptor = RuntimeResourceDescriptor
89
+ > = Omit<ResourceDefinition, 'resourceId' | 'type'> & {
90
+ /** OM descriptor that owns canonical identity and governance metadata. */
91
+ resource: TResource
92
+ resourceId?: never
93
+ type?: never
94
+ }
95
+
96
+ export type BoundResourceDefinition<TResource extends RuntimeResourceDescriptor = RuntimeResourceDescriptor> = Omit<
97
+ DescriptorBackedResourceDefinition<TResource>,
98
+ 'resource'
99
+ > &
100
+ ResourceDefinition & {
101
+ resource: TResource
102
+ resourceId: TResource['id']
103
+ type: TResource['kind']
104
+ }
105
+
106
+ export function bindResourceDescriptor<TResource extends RuntimeResourceDescriptor>(
107
+ definition: DescriptorBackedResourceDefinition<TResource>
108
+ ): BoundResourceDefinition<TResource> {
109
+ const { resource, ...rest } = definition
110
+
111
+ return {
112
+ ...rest,
113
+ resource,
114
+ resourceId: resource.id,
115
+ type: resource.kind
116
+ } as BoundResourceDefinition<TResource>
117
+ }
118
+
119
+ /**
120
+ * Resource list for organization
121
+ * Returns ResourceDefinition metadata (not full definitions)
122
+ */
123
+ export interface ResourceList {
124
+ workflows: ResourceDefinition[]
125
+ agents: ResourceDefinition[]
126
+ total: number
127
+ organizationName: string
128
+ environment?: 'dev' | 'prod'
129
+ }
130
+
131
+ // ============================================================================
132
+ // Resource Manifest Types
133
+ // ============================================================================
134
+
135
+ // ============================================================================
136
+ // Trigger Configuration Types
137
+ // ============================================================================
138
+
139
+ /** Webhook provider identifiers */
140
+ export type WebhookProviderType = 'cal-com' | 'stripe' | 'signature-api' | 'instantly' | 'apify' | 'test'
141
+
142
+ /** Webhook trigger configuration */
143
+ export interface WebhookTriggerConfig {
144
+ /** Provider identifier */
145
+ provider: WebhookProviderType
146
+ /** Event type for documentation (not used for matching - workflow handles routing) */
147
+ event?: string
148
+ /** Optional filtering (e.g., specific form ID for Fillout) */
149
+ filter?: Record<string, string>
150
+ /** References credential in credentials table for per-org webhook secrets */
151
+ credentialName?: string
152
+ }
153
+
154
+ /** Schedule trigger configuration */
155
+ export interface ScheduleTriggerConfig {
156
+ /** Cron expression (e.g., '0 6 * * *') */
157
+ cron: string
158
+ /** Optional timezone (default: UTC) */
159
+ timezone?: string
160
+ }
161
+
162
+ /** Event trigger configuration */
163
+ export interface EventTriggerConfig {
164
+ /** Internal event type */
165
+ eventType: string
166
+ /** Event source */
167
+ source?: string
168
+ }
169
+
170
+ /** Union of all trigger configs */
171
+ export type TriggerConfig = WebhookTriggerConfig | ScheduleTriggerConfig | EventTriggerConfig
172
+
173
+ // ============================================================================
174
+ // Trigger Definition
175
+ // ============================================================================
176
+
177
+ /**
178
+ * Trigger metadata - entry points that initiate resource execution
179
+ *
180
+ * Triggers represent how executions start: webhooks from external services,
181
+ * scheduled cron jobs, platform events, or manual user actions.
182
+ *
183
+ * BREAKING CHANGES (2025-11-30):
184
+ * - Now extends ResourceDefinition (inherits: resourceId, name, description, version, type, status, links, category)
185
+ * - Field renames: `id` -> `resourceId` (inherited), `type` -> `triggerType`
186
+ * - Relationship rename: `invokes` -> `triggers` (unified vocabulary)
187
+ * - New required fields: `version` (inherited), `type: 'trigger'` (inherited)
188
+ * - triggers object now includes `externalResources` option
189
+ *
190
+ * @example
191
+ * // TriggerDefinition - metadata only
192
+ * {
193
+ * resourceId: 'trigger-new-order',
194
+ * type: 'trigger',
195
+ * triggerType: 'webhook',
196
+ * name: 'New Order',
197
+ * description: 'Webhook from Shopify on new orders',
198
+ * version: '1.0.0',
199
+ * status: 'prod',
200
+ * webhookPath: '/webhooks/shopify/orders'
201
+ * }
202
+ *
203
+ * // Relationships declared in ResourceRelationships (not on TriggerDefinition):
204
+ * // relationships: {
205
+ * // 'trigger-new-order': { triggers: { workflows: ['order-fulfillment-workflow'] } }
206
+ * // }
207
+ */
208
+ export interface TriggerDefinition extends ResourceDefinition {
209
+ /** Resource type discriminator (narrowed from base union) */
210
+ type: 'trigger'
211
+
212
+ /** Trigger mechanism type (renamed from 'type' to avoid collision with base type discriminator) */
213
+ triggerType: 'webhook' | 'schedule' | 'manual' | 'event'
214
+
215
+ /** Type-specific configuration */
216
+ config?: TriggerConfig
217
+
218
+ // Legacy fields (deprecated, use config instead)
219
+ /** For webhook triggers: path like '/webhooks/shopify/orders' */
220
+ webhookPath?: string
221
+ /** For schedule triggers: cron expression like '0 6 * * *' */
222
+ schedule?: string
223
+ /** For event triggers: event type like 'low-stock-alert' */
224
+ eventType?: string
225
+
226
+ // NOTE: What this trigger starts is declared in ResourceRelationships, not here
227
+ // This prevents duplication - triggers are forward-declared in relationships
228
+ }
229
+
230
+ /**
231
+ * Integration metadata - external service connections
232
+ *
233
+ * References credentials table for actual connection. No connection status
234
+ * stored here (queried at runtime from credentials table).
235
+ *
236
+ * BREAKING CHANGES (2025-11-30):
237
+ * - Now extends ResourceDefinition (inherits: resourceId, name, description, version, type, status, links, category)
238
+ * - Field renames: `id` -> `resourceId` (inherited)
239
+ * - New required field: `status` (inherited) - organizations must add status to all integrations
240
+ * - New required field: `version` (inherited) - organizations must add version to all integrations
241
+ * - New required field: `type: 'integration'` (inherited) - resource type discriminator
242
+ *
243
+ * @example
244
+ * {
245
+ * resourceId: 'integration-shopify-prod',
246
+ * type: 'integration',
247
+ * provider: 'shopify',
248
+ * credentialName: 'shopify-prod',
249
+ * name: 'Shopify Production',
250
+ * description: 'E-commerce platform',
251
+ * version: '1.0.0',
252
+ * status: 'prod'
253
+ * }
254
+ */
255
+ export interface IntegrationDefinition extends ResourceDefinition {
256
+ /** Resource type discriminator (narrowed from base union) */
257
+ type: 'integration'
258
+
259
+ /** OM descriptor that owns canonical identity and governance metadata. */
260
+ resource?: Extract<ResourceEntry, { kind: 'integration' }>
261
+
262
+ /** Integration provider type */
263
+ provider: IntegrationType
264
+ /** References credentials table (e.g., 'shopify-prod', 'zendesk-api') */
265
+ credentialName: string
266
+ }
267
+
268
+ /**
269
+ * Explicit resource relationship declaration
270
+ *
271
+ * Single-direction only - Command View derives reverse relationships.
272
+ * Agents/workflows declare what they trigger and use.
273
+ *
274
+ * @example
275
+ * {
276
+ * triggers: { workflows: ['order-fulfillment-workflow'] },
277
+ * uses: { integrations: ['integration-shopify-prod', 'integration-postgres'] }
278
+ * }
279
+ */
280
+ export interface RelationshipDeclaration {
281
+ /** Resources this resource triggers */
282
+ triggers?: {
283
+ /** Agent resourceIds this resource triggers */
284
+ agents?: string[]
285
+ /** Workflow resourceIds this resource triggers */
286
+ workflows?: string[]
287
+ }
288
+ /** Integrations this resource uses */
289
+ uses?: {
290
+ /** Integration IDs this resource uses */
291
+ integrations?: string[]
292
+ }
293
+ }
294
+
295
+ /**
296
+ * Resource relationships map
297
+ * Maps resourceId to its relationship declarations
298
+ *
299
+ * @example
300
+ * {
301
+ * 'order-processor-agent': {
302
+ * triggers: { workflows: ['order-fulfillment-workflow'] },
303
+ * uses: { integrations: ['integration-shopify-prod'] }
304
+ * }
305
+ * }
306
+ */
307
+ export type ResourceRelationships = Record<string, RelationshipDeclaration>
308
+
309
+ // ============================================================================
310
+ // External Resource Types
311
+ // ============================================================================
312
+
313
+ /**
314
+ * External platform type
315
+ * Supported third-party automation platforms
316
+ */
317
+ export type ExternalPlatform = 'n8n' | 'make' | 'zapier' | 'other'
318
+
319
+ /**
320
+ * External automation resource metadata
321
+ *
322
+ * Represents workflows/automations running on third-party platforms
323
+ * (n8n, Make, Zapier, etc.) for visualization in Command View.
324
+ *
325
+ * NOTE: This is metadata ONLY for visualization. No execution logic,
326
+ * no API integration with external platforms, no status syncing.
327
+ *
328
+ * BREAKING CHANGES (2025-11-30):
329
+ * - Now extends ResourceDefinition (inherits: resourceId, name, description, version, type, status, links, category)
330
+ * - Field renames: `id` -> `resourceId` (inherited)
331
+ * - New required field: `version` (inherited) - organizations must add version to all external resources
332
+ * - New required field: `type: 'external'` (inherited) - resource type discriminator
333
+ * - REMOVED FIELD: `triggeredBy` - per relationship-consolidation design, all relationships are forward-only declarations
334
+ *
335
+ * @example
336
+ * {
337
+ * resourceId: 'external-n8n-order-sync',
338
+ * type: 'external',
339
+ * version: '1.0.0',
340
+ * platform: 'n8n',
341
+ * name: 'Shopify Order Sync',
342
+ * description: 'Legacy n8n workflow for syncing Shopify orders',
343
+ * status: 'prod',
344
+ * platformUrl: 'https://n8n.client.com/workflow/123',
345
+ * triggers: { workflows: ['order-fulfillment-workflow'] },
346
+ * uses: { integrations: ['integration-shopify-prod'] }
347
+ * }
348
+ */
349
+ export interface ExternalResourceDefinition extends ResourceDefinition {
350
+ /** Resource type discriminator (narrowed from base union) */
351
+ type: 'external'
352
+
353
+ /** Platform type */
354
+ platform: ExternalPlatform
355
+
356
+ // Optional platform-specific metadata
357
+ /** Link to external platform (e.g., n8n workflow editor URL) */
358
+ platformUrl?: string
359
+ /** Platform's internal ID/reference */
360
+ externalId?: string
361
+
362
+ /** What this external resource triggers (external -> internal) */
363
+ triggers?: {
364
+ /** Elevasis workflow resourceIds this external automation triggers */
365
+ workflows?: string[]
366
+ /** Elevasis agent resourceIds this external automation triggers */
367
+ agents?: string[]
368
+ }
369
+
370
+ /** Integrations this external resource uses (shared credentials) */
371
+ uses?: {
372
+ /** Integration IDs this external automation uses */
373
+ integrations?: string[]
374
+ }
375
+
376
+ // NOTE: triggeredBy field removed - per relationship-consolidation design,
377
+ // all relationships are forward-only declarations. Graph edges are built
378
+ // from forward declarations only.
379
+ }
380
+
381
+ // ============================================================================
382
+ // Contract Conformance Gap Types
383
+ // ============================================================================
384
+
385
+ /**
386
+ * Describes a system that has API-backed resources but lacks an `apiInterface`
387
+ * declaration. Used by `detectMissingApiInterfaceDeclarations` as the return
388
+ * payload that drives both CLI warnings and scaffold fill-mode input.
389
+ */
390
+ export interface ApiInterfaceConformanceGap {
391
+ /** Dot-separated system path (e.g. "sales.lead-gen"). */
392
+ systemPath: string
393
+ /** Resource IDs in this system that have non-empty ontology bindings. */
394
+ resourceIds: string[]
395
+ /** Human-readable description of the gap. */
396
+ message: string
397
+ }
398
+
399
+ /**
400
+ * Human Checkpoint definition - human decision points in automation
401
+ *
402
+ * Represents where human judgment is deployed in the automation landscape.
403
+ * Tasks with matching command_queue_group are routed to this checkpoint.
404
+ *
405
+ * BREAKING CHANGES (2025-11-30):
406
+ * - Now extends ResourceDefinition (inherits: resourceId, name, description, version, type, status, links, category)
407
+ * - Field renames: `id` -> `resourceId` (inherited)
408
+ * - description is now REQUIRED (was optional) - organizations must add description to all human checkpoints
409
+ * - New required field: `version` (inherited) - organizations must add version to all human checkpoints
410
+ * - New required field: `type: 'human'` (inherited) - resource type discriminator
411
+ *
412
+ * @example
413
+ * {
414
+ * resourceId: 'sales-approval',
415
+ * type: 'human',
416
+ * name: 'Sales Approval Queue',
417
+ * description: 'High-value order approvals for sales team',
418
+ * version: '1.0.0',
419
+ * status: 'prod',
420
+ * requestedBy: { agents: ['order-processor-agent'] },
421
+ * routesTo: { agents: ['order-fulfillment-agent'] }
422
+ * }
423
+ */
424
+ export interface HumanCheckpointDefinition extends ResourceDefinition {
425
+ /** Resource type discriminator (narrowed from base union) */
426
+ type: 'human'
427
+
428
+ /** Resources that create tasks for this checkpoint */
429
+ requestedBy?: {
430
+ /** Agent resourceIds that request approval here */
431
+ agents?: string[]
432
+ /** Workflow resourceIds that request approval here */
433
+ workflows?: string[]
434
+ }
435
+
436
+ /** Resources that receive approved decisions */
437
+ routesTo?: {
438
+ /** Agent resourceIds that handle approved tasks */
439
+ agents?: string[]
440
+ /** Workflow resourceIds that handle approved tasks */
441
+ workflows?: string[]
442
+ }
443
+ }