@intx/db 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/README.md +2 -2
  2. package/dist/approval-store.d.ts +52 -0
  3. package/dist/approval-store.js +79 -0
  4. package/dist/asset-resolution.d.ts +2 -2
  5. package/dist/client.d.ts +10 -0
  6. package/dist/connection.js +11 -8
  7. package/dist/credential-resolution.d.ts +130 -18
  8. package/dist/credential-resolution.js +142 -3
  9. package/dist/grant-store.js +35 -13
  10. package/dist/index.d.ts +13 -4
  11. package/dist/index.js +11 -3
  12. package/dist/model-source-resolution.d.ts +52 -6
  13. package/dist/model-source-resolution.js +145 -19
  14. package/dist/parse-row.d.ts +212 -32
  15. package/dist/parse-row.js +109 -18
  16. package/dist/rekey-credential-secrets.d.ts +13 -0
  17. package/dist/rekey-credential-secrets.js +61 -0
  18. package/dist/schema/approvals.d.ts +245 -0
  19. package/dist/schema/approvals.js +52 -0
  20. package/dist/schema/catalog.d.ts +17 -0
  21. package/dist/schema/catalog.js +7 -1
  22. package/dist/schema/credentials.d.ts +1 -1
  23. package/dist/schema/git-tokens.js +1 -1
  24. package/dist/schema/grants.js +8 -2
  25. package/dist/schema/index.d.ts +8 -4
  26. package/dist/schema/index.js +8 -4
  27. package/dist/schema/messages.d.ts +5 -5
  28. package/dist/schema/messages.js +20 -9
  29. package/dist/schema/offerings.js +8 -2
  30. package/dist/schema/principals.d.ts +2 -2
  31. package/dist/schema/principals.js +7 -5
  32. package/dist/schema/providers.d.ts +17 -0
  33. package/dist/schema/providers.js +5 -0
  34. package/dist/schema/roles.js +6 -2
  35. package/dist/schema/session-assets.d.ts +1 -38
  36. package/dist/schema/session-assets.js +36 -19
  37. package/dist/schema/sessions.js +7 -2
  38. package/dist/schema/sidecar-allocation.d.ts +406 -0
  39. package/dist/schema/sidecar-allocation.js +57 -0
  40. package/dist/schema/sidecar.d.ts +19 -2
  41. package/dist/schema/sidecar.js +13 -3
  42. package/dist/schema/signal-correlations.d.ts +177 -0
  43. package/dist/schema/signal-correlations.js +31 -0
  44. package/dist/schema/wallets.d.ts +3 -3
  45. package/dist/schema/wallets.js +4 -2
  46. package/dist/schema/{agents.d.ts → workflow-definitions.d.ts} +79 -113
  47. package/dist/schema/workflow-definitions.js +97 -0
  48. package/dist/schema/workflow-run-dispatch.d.ts +328 -0
  49. package/dist/schema/workflow-run-dispatch.js +56 -0
  50. package/dist/schema/{workflow-deployments.d.ts → workflow-run-execution.d.ts} +43 -46
  51. package/dist/schema/workflow-run-execution.js +48 -0
  52. package/dist/schema/workflow-run-launch-spec.d.ts +200 -0
  53. package/dist/schema/workflow-run-launch-spec.js +26 -0
  54. package/dist/schema/{instances.d.ts → workflow-run.d.ts} +39 -71
  55. package/dist/schema/workflow-run.js +102 -0
  56. package/dist/sidecar-allocation-store.d.ts +171 -0
  57. package/dist/sidecar-allocation-store.js +512 -0
  58. package/dist/signal-correlation-store.d.ts +36 -0
  59. package/dist/signal-correlation-store.js +63 -0
  60. package/dist/tenant-hierarchy.d.ts +2 -1
  61. package/dist/tenant-hierarchy.js +10 -5
  62. package/dist/workflow-definition-store.d.ts +55 -0
  63. package/dist/workflow-definition-store.js +93 -0
  64. package/dist/workflow-run-dispatch-store.d.ts +80 -0
  65. package/dist/workflow-run-dispatch-store.js +298 -0
  66. package/dist/workflow-run-launch-spec-store.d.ts +13 -0
  67. package/dist/workflow-run-launch-spec-store.js +30 -0
  68. package/dist/workflow-run-store.d.ts +54 -0
  69. package/dist/workflow-run-store.js +85 -0
  70. package/migrations/0037_credential_use_backfill.sql +39 -0
  71. package/migrations/0038_chilly_blacklash.sql +37 -0
  72. package/migrations/0039_quick_carnage.sql +2 -0
  73. package/migrations/0040_reshape_approval_origin.sql +24 -0
  74. package/migrations/0041_make_approval_timeout_at_nullable.sql +1 -0
  75. package/migrations/0042_youthful_mantis.sql +2 -0
  76. package/migrations/0043_signal_correlation_deployment_fk.sql +1 -0
  77. package/migrations/0044_model_offering_quirks.sql +1 -0
  78. package/migrations/0045_create_workflow_run.sql +13 -0
  79. package/migrations/0046_approval_signal_correlation_run_fk.sql +2 -0
  80. package/migrations/0047_create_workflow_definition.sql +30 -0
  81. package/migrations/0048_workflow_definition_origin_agent_id.sql +2 -0
  82. package/migrations/0049_curly_omega_flight.sql +2 -0
  83. package/migrations/0050_late_crystal.sql +10 -0
  84. package/migrations/0051_funny_madelyne_pryor.sql +1 -0
  85. package/migrations/0052_drop_inference_turn_instance_fk.sql +1 -0
  86. package/migrations/0053_session_mail_session_id_index.sql +1 -0
  87. package/migrations/0054_rekey_instance_grants_to_workflow_run.sql +10 -0
  88. package/migrations/0055_backfill_anchor_workflow_runs.sql +69 -0
  89. package/migrations/0056_repoint_deployment_fks_to_anchor_run.sql +32 -0
  90. package/migrations/0057_drop_workflow_deployment_projection.sql +22 -0
  91. package/migrations/0058_repoint_offering_fk_to_definition.sql +41 -0
  92. package/migrations/0059_repoint_transaction_fk_to_run.sql +10 -0
  93. package/migrations/0060_drop_session_mail_instance_fk.sql +6 -0
  94. package/migrations/0061_drop_session_asset_instance_fk.sql +7 -0
  95. package/migrations/0062_drop_agent_asset_table.sql +11 -0
  96. package/migrations/0063_repoint_agent_role_fk_to_definition.sql +39 -0
  97. package/migrations/0064_repoint_agent_session_fk_to_definition.sql +47 -0
  98. package/migrations/0065_add_workflow_definition_model_requirements.sql +37 -0
  99. package/migrations/0066_rekey_agent_definition_principals_to_workflow.sql +27 -0
  100. package/migrations/0067_add_workflow_definition_kind.sql +10 -0
  101. package/migrations/0068_drop_agent_tables_and_origin_agent_id.sql +31 -0
  102. package/migrations/0069_drop_workflow_definition_kind.sql +10 -0
  103. package/migrations/0070_flashy_proteus.sql +13 -0
  104. package/migrations/0072_add_workflow_definition_credential_bindings.sql +1 -0
  105. package/migrations/0073_grant_target_exactly_one_check.sql +13 -0
  106. package/migrations/0074_add_provider_api_base_url.sql +1 -0
  107. package/migrations/0075_workflow_run_launch_spec.sql +17 -0
  108. package/migrations/0076_sidecar_allocation.sql +40 -0
  109. package/migrations/0077_workflow_run_dispatch.sql +29 -0
  110. package/migrations/0078_workflow_run_dispatch_kind.sql +2 -0
  111. package/migrations/0079_rename_workflow_run_deployment_id_to_anchor_run_id.sql +4 -0
  112. package/migrations/0080_rename_correlation_approval_deployment_id_to_anchor_run_id.sql +9 -0
  113. package/migrations/0081_workflow_definition_content_hash_and_approved_wire_hash.sql +4 -0
  114. package/migrations/0082_blue_black_queen.sql +1 -0
  115. package/migrations/0083_replace_launch_spec_snapshot_with_frozen_bundle.sql +3 -0
  116. package/migrations/0084_delete_orphaned_credential_grants.sql +22 -0
  117. package/migrations/meta/0037_snapshot.json +3237 -0
  118. package/migrations/meta/0038_snapshot.json +3470 -0
  119. package/migrations/meta/0039_snapshot.json +3470 -0
  120. package/migrations/meta/0040_snapshot.json +3489 -0
  121. package/migrations/meta/0041_snapshot.json +3489 -0
  122. package/migrations/meta/0042_snapshot.json +3489 -0
  123. package/migrations/meta/0043_snapshot.json +3498 -0
  124. package/migrations/meta/0044_snapshot.json +3504 -0
  125. package/migrations/meta/0045_snapshot.json +3589 -0
  126. package/migrations/meta/0046_snapshot.json +3607 -0
  127. package/migrations/meta/0047_snapshot.json +3832 -0
  128. package/migrations/meta/0048_snapshot.json +3853 -0
  129. package/migrations/meta/0049_snapshot.json +3854 -0
  130. package/migrations/meta/0050_snapshot.json +3924 -0
  131. package/migrations/meta/0051_snapshot.json +3940 -0
  132. package/migrations/meta/0052_snapshot.json +3931 -0
  133. package/migrations/meta/0053_snapshot.json +3952 -0
  134. package/migrations/meta/0054_snapshot.json +3952 -0
  135. package/migrations/meta/0055_snapshot.json +3952 -0
  136. package/migrations/meta/0056_snapshot.json +3952 -0
  137. package/migrations/meta/0057_snapshot.json +3839 -0
  138. package/migrations/meta/0058_snapshot.json +3839 -0
  139. package/migrations/meta/0059_snapshot.json +3839 -0
  140. package/migrations/meta/0060_snapshot.json +3830 -0
  141. package/migrations/meta/0061_snapshot.json +3821 -0
  142. package/migrations/meta/0062_snapshot.json +3723 -0
  143. package/migrations/meta/0063_snapshot.json +3723 -0
  144. package/migrations/meta/0064_snapshot.json +3723 -0
  145. package/migrations/meta/0065_snapshot.json +3729 -0
  146. package/migrations/meta/0066_snapshot.json +3729 -0
  147. package/migrations/meta/0067_snapshot.json +3736 -0
  148. package/migrations/meta/0068_snapshot.json +3347 -0
  149. package/migrations/meta/0069_snapshot.json +3340 -0
  150. package/migrations/meta/0070_snapshot.json +3444 -0
  151. package/migrations/meta/0072_snapshot.json +3450 -0
  152. package/migrations/meta/0073_snapshot.json +3455 -0
  153. package/migrations/meta/0074_snapshot.json +3461 -0
  154. package/migrations/meta/0075_snapshot.json +3567 -0
  155. package/migrations/meta/0076_snapshot.json +3851 -0
  156. package/migrations/meta/0077_snapshot.json +4067 -0
  157. package/migrations/meta/0078_snapshot.json +4078 -0
  158. package/migrations/meta/0079_snapshot.json +4078 -0
  159. package/migrations/meta/0080_snapshot.json +4078 -0
  160. package/migrations/meta/0081_snapshot.json +4096 -0
  161. package/migrations/meta/0082_snapshot.json +4102 -0
  162. package/migrations/meta/0083_snapshot.json +4096 -0
  163. package/migrations/meta/0084_snapshot.json +4096 -0
  164. package/migrations/meta/_journal.json +329 -0
  165. package/package.json +6 -3
  166. package/dist/schema/agent-assets.d.ts +0 -109
  167. package/dist/schema/agent-assets.js +0 -15
  168. package/dist/schema/agents.js +0 -57
  169. package/dist/schema/instances.js +0 -39
  170. package/dist/schema/workflow-deployments.js +0 -37
@@ -0,0 +1,48 @@
1
+ import { index, pgTable, text, timestamp, uniqueIndex, } from "drizzle-orm/pg-core";
2
+ import { workflowRun } from "./workflow-run.js";
3
+ // workflow_run_execution is the per-TURN record of a run. A long-lived run
4
+ // (`workflow_run`, the run aggregate) resumes in place across many messages;
5
+ // each inbound message drives exactly one execution -- one turn. The
6
+ // single-shot running->terminal guard is per turn and belongs here, not on the
7
+ // run aggregate: a redelivered terminal re-settles the SAME execution rather
8
+ // than re-terminating the whole run, and a new message opens a NEW execution
9
+ // against the same run.
10
+ //
11
+ // `id` is the executionId, derived deterministically from the driving message
12
+ // (see `deriveExecutionId`), so a redelivery of the same bytes resolves to the
13
+ // same execution rather than a fresh one. The table is the hub-side projection
14
+ // of the run's turn-boundary events (`TurnStarted`/`TurnCompleted`/`TurnFailed`)
15
+ // that the read surface exposes so per-turn outcomes are visible.
16
+ export const workflowRunExecution = pgTable("workflow_run_execution", {
17
+ id: text("id").primaryKey(),
18
+ // The run this execution is a turn of. `cascade` matches `workflow_run`'s
19
+ // own deletes so a removed run takes its executions with it.
20
+ runId: text("run_id")
21
+ .notNull()
22
+ .references(() => workflowRun.id, { onDelete: "cascade" }),
23
+ // The inbound message that drove this turn; the executionId is derived from
24
+ // it, but the raw messageId is retained for correlation and read-surface
25
+ // display.
26
+ messageId: text("message_id").notNull(),
27
+ // A turn is born "running" and settles to "completed" or "failed" when its
28
+ // terminal turn event lands. Unlike the run aggregate, a turn is never
29
+ // "cancelled" on its own -- cancellation is a run-level disposition.
30
+ status: text("status", {
31
+ enum: ["running", "completed", "failed"],
32
+ })
33
+ .notNull()
34
+ .default("running"),
35
+ startedAt: timestamp("started_at").notNull().defaultNow(),
36
+ // Nullable: a turn has no end time until it reaches a terminal state.
37
+ endedAt: timestamp("ended_at"),
38
+ // Populated only on a `failed` turn (e.g. a malformed inbound mail that
39
+ // could not resume the run); null otherwise.
40
+ failureReason: text("failure_reason"),
41
+ }, (t) => [
42
+ // The read surface lists a run's executions in turn order; the leftmost
43
+ // `runId` column serves that lookup. Unique on `(runId, id)` as the
44
+ // race backstop the design mandates against a concurrent double-insert of
45
+ // the same turn.
46
+ uniqueIndex("workflow_run_execution_run_id_id_idx").on(t.runId, t.id),
47
+ index("workflow_run_execution_status_idx").on(t.status),
48
+ ]);
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Immutable inputs required to recreate an exclusively placed workflow on a
3
+ * replacement sidecar. Secrets are deliberately excluded: source offering
4
+ * ids are resolved against the current catalog and principal authority when a
5
+ * generation is launched.
6
+ */
7
+ export declare const workflowRunLaunchSpec: import("drizzle-orm/pg-core").PgTableWithColumns<{
8
+ name: "workflow_run_launch_spec";
9
+ schema: undefined;
10
+ columns: {
11
+ anchorRunId: import("drizzle-orm/pg-core").PgColumn<{
12
+ name: "anchor_run_id";
13
+ tableName: "workflow_run_launch_spec";
14
+ dataType: "string";
15
+ columnType: "PgText";
16
+ data: string;
17
+ driverParam: string;
18
+ notNull: true;
19
+ hasDefault: false;
20
+ isPrimaryKey: true;
21
+ isAutoincrement: false;
22
+ hasRuntimeDefault: false;
23
+ enumValues: [string, ...string[]];
24
+ baseColumn: never;
25
+ identity: undefined;
26
+ generated: undefined;
27
+ }, {}, {}>;
28
+ schemaVersion: import("drizzle-orm/pg-core").PgColumn<{
29
+ name: "schema_version";
30
+ tableName: "workflow_run_launch_spec";
31
+ dataType: "number";
32
+ columnType: "PgInteger";
33
+ data: number;
34
+ driverParam: string | number;
35
+ notNull: true;
36
+ hasDefault: true;
37
+ isPrimaryKey: false;
38
+ isAutoincrement: false;
39
+ hasRuntimeDefault: false;
40
+ enumValues: undefined;
41
+ baseColumn: never;
42
+ identity: undefined;
43
+ generated: undefined;
44
+ }, {}, {}>;
45
+ sessionId: import("drizzle-orm/pg-core").PgColumn<{
46
+ name: "session_id";
47
+ tableName: "workflow_run_launch_spec";
48
+ dataType: "string";
49
+ columnType: "PgText";
50
+ data: string;
51
+ driverParam: string;
52
+ notNull: true;
53
+ hasDefault: false;
54
+ isPrimaryKey: false;
55
+ isAutoincrement: false;
56
+ hasRuntimeDefault: false;
57
+ enumValues: [string, ...string[]];
58
+ baseColumn: never;
59
+ identity: undefined;
60
+ generated: undefined;
61
+ }, {}, {}>;
62
+ deploymentDomain: import("drizzle-orm/pg-core").PgColumn<{
63
+ name: "deployment_domain";
64
+ tableName: "workflow_run_launch_spec";
65
+ dataType: "string";
66
+ columnType: "PgText";
67
+ data: string;
68
+ driverParam: string;
69
+ notNull: true;
70
+ hasDefault: false;
71
+ isPrimaryKey: false;
72
+ isAutoincrement: false;
73
+ hasRuntimeDefault: false;
74
+ enumValues: [string, ...string[]];
75
+ baseColumn: never;
76
+ identity: undefined;
77
+ generated: undefined;
78
+ }, {}, {}>;
79
+ sourceAuthorityPrincipalId: import("drizzle-orm/pg-core").PgColumn<{
80
+ name: "source_authority_principal_id";
81
+ tableName: "workflow_run_launch_spec";
82
+ dataType: "string";
83
+ columnType: "PgText";
84
+ data: string;
85
+ driverParam: string;
86
+ notNull: true;
87
+ hasDefault: false;
88
+ isPrimaryKey: false;
89
+ isAutoincrement: false;
90
+ hasRuntimeDefault: false;
91
+ enumValues: [string, ...string[]];
92
+ baseColumn: never;
93
+ identity: undefined;
94
+ generated: undefined;
95
+ }, {}, {}>;
96
+ frozenApprovalBundle: import("drizzle-orm/pg-core").PgColumn<{
97
+ name: "frozen_approval_bundle";
98
+ tableName: "workflow_run_launch_spec";
99
+ dataType: "json";
100
+ columnType: "PgJsonb";
101
+ data: unknown;
102
+ driverParam: unknown;
103
+ notNull: true;
104
+ hasDefault: false;
105
+ isPrimaryKey: false;
106
+ isAutoincrement: false;
107
+ hasRuntimeDefault: false;
108
+ enumValues: undefined;
109
+ baseColumn: never;
110
+ identity: undefined;
111
+ generated: undefined;
112
+ }, {}, {}>;
113
+ sourceOfferingIds: import("drizzle-orm/pg-core").PgColumn<{
114
+ name: "source_offering_ids";
115
+ tableName: "workflow_run_launch_spec";
116
+ dataType: "json";
117
+ columnType: "PgJsonb";
118
+ data: unknown;
119
+ driverParam: unknown;
120
+ notNull: true;
121
+ hasDefault: false;
122
+ isPrimaryKey: false;
123
+ isAutoincrement: false;
124
+ hasRuntimeDefault: false;
125
+ enumValues: undefined;
126
+ baseColumn: never;
127
+ identity: undefined;
128
+ generated: undefined;
129
+ }, {}, {}>;
130
+ defaultSourceOfferingId: import("drizzle-orm/pg-core").PgColumn<{
131
+ name: "default_source_offering_id";
132
+ tableName: "workflow_run_launch_spec";
133
+ dataType: "string";
134
+ columnType: "PgText";
135
+ data: string;
136
+ driverParam: string;
137
+ notNull: true;
138
+ hasDefault: false;
139
+ isPrimaryKey: false;
140
+ isAutoincrement: false;
141
+ hasRuntimeDefault: false;
142
+ enumValues: [string, ...string[]];
143
+ baseColumn: never;
144
+ identity: undefined;
145
+ generated: undefined;
146
+ }, {}, {}>;
147
+ deployContent: import("drizzle-orm/pg-core").PgColumn<{
148
+ name: "deploy_content";
149
+ tableName: "workflow_run_launch_spec";
150
+ dataType: "json";
151
+ columnType: "PgJsonb";
152
+ data: unknown;
153
+ driverParam: unknown;
154
+ notNull: true;
155
+ hasDefault: false;
156
+ isPrimaryKey: false;
157
+ isAutoincrement: false;
158
+ hasRuntimeDefault: false;
159
+ enumValues: undefined;
160
+ baseColumn: never;
161
+ identity: undefined;
162
+ generated: undefined;
163
+ }, {}, {}>;
164
+ toolPackagePins: import("drizzle-orm/pg-core").PgColumn<{
165
+ name: "tool_package_pins";
166
+ tableName: "workflow_run_launch_spec";
167
+ dataType: "json";
168
+ columnType: "PgJsonb";
169
+ data: unknown;
170
+ driverParam: unknown;
171
+ notNull: false;
172
+ hasDefault: false;
173
+ isPrimaryKey: false;
174
+ isAutoincrement: false;
175
+ hasRuntimeDefault: false;
176
+ enumValues: undefined;
177
+ baseColumn: never;
178
+ identity: undefined;
179
+ generated: undefined;
180
+ }, {}, {}>;
181
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
182
+ name: "created_at";
183
+ tableName: "workflow_run_launch_spec";
184
+ dataType: "date";
185
+ columnType: "PgTimestamp";
186
+ data: Date;
187
+ driverParam: string;
188
+ notNull: true;
189
+ hasDefault: true;
190
+ isPrimaryKey: false;
191
+ isAutoincrement: false;
192
+ hasRuntimeDefault: false;
193
+ enumValues: undefined;
194
+ baseColumn: never;
195
+ identity: undefined;
196
+ generated: undefined;
197
+ }, {}, {}>;
198
+ };
199
+ dialect: "pg";
200
+ }>;
@@ -0,0 +1,26 @@
1
+ import { integer, jsonb, pgTable, text, timestamp } from "drizzle-orm/pg-core";
2
+ import { principal } from "./principals.js";
3
+ import { workflowRun } from "./workflow-run.js";
4
+ /**
5
+ * Immutable inputs required to recreate an exclusively placed workflow on a
6
+ * replacement sidecar. Secrets are deliberately excluded: source offering
7
+ * ids are resolved against the current catalog and principal authority when a
8
+ * generation is launched.
9
+ */
10
+ export const workflowRunLaunchSpec = pgTable("workflow_run_launch_spec", {
11
+ anchorRunId: text("anchor_run_id")
12
+ .primaryKey()
13
+ .references(() => workflowRun.id, { onDelete: "cascade" }),
14
+ schemaVersion: integer("schema_version").notNull().default(1),
15
+ sessionId: text("session_id").notNull(),
16
+ deploymentDomain: text("deployment_domain").notNull(),
17
+ sourceAuthorityPrincipalId: text("source_authority_principal_id")
18
+ .notNull()
19
+ .references(() => principal.id, { onDelete: "restrict" }),
20
+ frozenApprovalBundle: jsonb("frozen_approval_bundle").notNull(),
21
+ sourceOfferingIds: jsonb("source_offering_ids").notNull(),
22
+ defaultSourceOfferingId: text("default_source_offering_id").notNull(),
23
+ deployContent: jsonb("deploy_content").notNull(),
24
+ toolPackagePins: jsonb("tool_package_pins"),
25
+ createdAt: timestamp("created_at").notNull().defaultNow(),
26
+ });
@@ -1,10 +1,10 @@
1
- export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithColumns<{
2
- name: "agent_instance";
1
+ export declare const workflowRun: import("drizzle-orm/pg-core").PgTableWithColumns<{
2
+ name: "workflow_run";
3
3
  schema: undefined;
4
4
  columns: {
5
5
  id: import("drizzle-orm/pg-core").PgColumn<{
6
6
  name: "id";
7
- tableName: "agent_instance";
7
+ tableName: "workflow_run";
8
8
  dataType: "string";
9
9
  columnType: "PgText";
10
10
  data: string;
@@ -19,9 +19,9 @@ export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithCol
19
19
  identity: undefined;
20
20
  generated: undefined;
21
21
  }, {}, {}>;
22
- agentId: import("drizzle-orm/pg-core").PgColumn<{
23
- name: "agent_id";
24
- tableName: "agent_instance";
22
+ definitionId: import("drizzle-orm/pg-core").PgColumn<{
23
+ name: "definition_id";
24
+ tableName: "workflow_run";
25
25
  dataType: "string";
26
26
  columnType: "PgText";
27
27
  data: string;
@@ -36,14 +36,14 @@ export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithCol
36
36
  identity: undefined;
37
37
  generated: undefined;
38
38
  }, {}, {}>;
39
- tenantId: import("drizzle-orm/pg-core").PgColumn<{
40
- name: "tenant_id";
41
- tableName: "agent_instance";
39
+ anchorRunId: import("drizzle-orm/pg-core").PgColumn<{
40
+ name: "anchor_run_id";
41
+ tableName: "workflow_run";
42
42
  dataType: "string";
43
43
  columnType: "PgText";
44
44
  data: string;
45
45
  driverParam: string;
46
- notNull: true;
46
+ notNull: false;
47
47
  hasDefault: false;
48
48
  isPrimaryKey: false;
49
49
  isAutoincrement: false;
@@ -53,9 +53,9 @@ export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithCol
53
53
  identity: undefined;
54
54
  generated: undefined;
55
55
  }, {}, {}>;
56
- principalId: import("drizzle-orm/pg-core").PgColumn<{
57
- name: "principal_id";
58
- tableName: "agent_instance";
56
+ tenantId: import("drizzle-orm/pg-core").PgColumn<{
57
+ name: "tenant_id";
58
+ tableName: "workflow_run";
59
59
  dataType: "string";
60
60
  columnType: "PgText";
61
61
  data: string;
@@ -70,14 +70,14 @@ export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithCol
70
70
  identity: undefined;
71
71
  generated: undefined;
72
72
  }, {}, {}>;
73
- address: import("drizzle-orm/pg-core").PgColumn<{
74
- name: "address";
75
- tableName: "agent_instance";
73
+ principalId: import("drizzle-orm/pg-core").PgColumn<{
74
+ name: "principal_id";
75
+ tableName: "workflow_run";
76
76
  dataType: "string";
77
77
  columnType: "PgText";
78
78
  data: string;
79
79
  driverParam: string;
80
- notNull: true;
80
+ notNull: false;
81
81
  hasDefault: false;
82
82
  isPrimaryKey: false;
83
83
  isAutoincrement: false;
@@ -87,26 +87,26 @@ export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithCol
87
87
  identity: undefined;
88
88
  generated: undefined;
89
89
  }, {}, {}>;
90
- versionId: import("drizzle-orm/pg-core").PgColumn<{
91
- name: "version_id";
92
- tableName: "agent_instance";
90
+ status: import("drizzle-orm/pg-core").PgColumn<{
91
+ name: "status";
92
+ tableName: "workflow_run";
93
93
  dataType: "string";
94
94
  columnType: "PgText";
95
- data: string;
95
+ data: "deployed" | "failed" | "running" | "completed" | "cancelled";
96
96
  driverParam: string;
97
- notNull: false;
98
- hasDefault: false;
97
+ notNull: true;
98
+ hasDefault: true;
99
99
  isPrimaryKey: false;
100
100
  isAutoincrement: false;
101
101
  hasRuntimeDefault: false;
102
- enumValues: [string, ...string[]];
102
+ enumValues: ["deployed", "running", "completed", "failed", "cancelled"];
103
103
  baseColumn: never;
104
104
  identity: undefined;
105
105
  generated: undefined;
106
106
  }, {}, {}>;
107
- sessionId: import("drizzle-orm/pg-core").PgColumn<{
108
- name: "session_id";
109
- tableName: "agent_instance";
107
+ address: import("drizzle-orm/pg-core").PgColumn<{
108
+ name: "address";
109
+ tableName: "workflow_run";
110
110
  dataType: "string";
111
111
  columnType: "PgText";
112
112
  data: string;
@@ -121,26 +121,9 @@ export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithCol
121
121
  identity: undefined;
122
122
  generated: undefined;
123
123
  }, {}, {}>;
124
- status: import("drizzle-orm/pg-core").PgColumn<{
125
- name: "status";
126
- tableName: "agent_instance";
127
- dataType: "string";
128
- columnType: "PgText";
129
- data: "deployed" | "stopped" | "error" | "running" | "updating";
130
- driverParam: string;
131
- notNull: true;
132
- hasDefault: true;
133
- isPrimaryKey: false;
134
- isAutoincrement: false;
135
- hasRuntimeDefault: false;
136
- enumValues: ["deployed", "running", "updating", "error", "stopped"];
137
- baseColumn: never;
138
- identity: undefined;
139
- generated: undefined;
140
- }, {}, {}>;
141
- sidecarId: import("drizzle-orm/pg-core").PgColumn<{
142
- name: "sidecar_id";
143
- tableName: "agent_instance";
124
+ publicKey: import("drizzle-orm/pg-core").PgColumn<{
125
+ name: "public_key";
126
+ tableName: "workflow_run";
144
127
  dataType: "string";
145
128
  columnType: "PgText";
146
129
  data: string;
@@ -155,9 +138,9 @@ export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithCol
155
138
  identity: undefined;
156
139
  generated: undefined;
157
140
  }, {}, {}>;
158
- publicKey: import("drizzle-orm/pg-core").PgColumn<{
159
- name: "public_key";
160
- tableName: "agent_instance";
141
+ sidecarId: import("drizzle-orm/pg-core").PgColumn<{
142
+ name: "sidecar_id";
143
+ tableName: "workflow_run";
161
144
  dataType: "string";
162
145
  columnType: "PgText";
163
146
  data: string;
@@ -174,7 +157,7 @@ export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithCol
174
157
  }, {}, {}>;
175
158
  kernelId: import("drizzle-orm/pg-core").PgColumn<{
176
159
  name: "kernel_id";
177
- tableName: "agent_instance";
160
+ tableName: "workflow_run";
178
161
  dataType: "string";
179
162
  columnType: "PgText";
180
163
  data: string;
@@ -191,7 +174,7 @@ export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithCol
191
174
  }, {}, {}>;
192
175
  modelPreferences: import("drizzle-orm/pg-core").PgColumn<{
193
176
  name: "model_preferences";
194
- tableName: "agent_instance";
177
+ tableName: "workflow_run";
195
178
  dataType: "json";
196
179
  columnType: "PgJsonb";
197
180
  data: unknown;
@@ -208,24 +191,7 @@ export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithCol
208
191
  }, {}, {}>;
209
192
  createdAt: import("drizzle-orm/pg-core").PgColumn<{
210
193
  name: "created_at";
211
- tableName: "agent_instance";
212
- dataType: "date";
213
- columnType: "PgTimestamp";
214
- data: Date;
215
- driverParam: string;
216
- notNull: true;
217
- hasDefault: true;
218
- isPrimaryKey: false;
219
- isAutoincrement: false;
220
- hasRuntimeDefault: false;
221
- enumValues: undefined;
222
- baseColumn: never;
223
- identity: undefined;
224
- generated: undefined;
225
- }, {}, {}>;
226
- updatedAt: import("drizzle-orm/pg-core").PgColumn<{
227
- name: "updated_at";
228
- tableName: "agent_instance";
194
+ tableName: "workflow_run";
229
195
  dataType: "date";
230
196
  columnType: "PgTimestamp";
231
197
  data: Date;
@@ -242,7 +208,7 @@ export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithCol
242
208
  }, {}, {}>;
243
209
  endedAt: import("drizzle-orm/pg-core").PgColumn<{
244
210
  name: "ended_at";
245
- tableName: "agent_instance";
211
+ tableName: "workflow_run";
246
212
  dataType: "date";
247
213
  columnType: "PgTimestamp";
248
214
  data: Date;
@@ -260,3 +226,5 @@ export declare const agentInstance: import("drizzle-orm/pg-core").PgTableWithCol
260
226
  };
261
227
  dialect: "pg";
262
228
  }>;
229
+ export declare const liveWorkflowRunStatuses: readonly ["deployed", "running"];
230
+ export declare function isLiveWorkflowRunStatus(status: string): boolean;
@@ -0,0 +1,102 @@
1
+ import { sql } from "drizzle-orm";
2
+ import { index, jsonb, pgTable, text, timestamp, uniqueIndex, } from "drizzle-orm/pg-core";
3
+ import { principal } from "./principals.js";
4
+ import { sidecar } from "./sidecar.js";
5
+ import { tenant } from "./tenants.js";
6
+ import { workflowDefinition } from "./workflow-definitions.js";
7
+ // workflow_run is the per-run authorization subject: one row per run of a
8
+ // workflow deployment. It gives "this approval belongs to a real run of this
9
+ // deployment" a database referent, so approvals and signal correlations anchor
10
+ // to a run row rather than a bare run id string.
11
+ //
12
+ // The id is opaque and heterogeneous: a deployment's addressable top-level
13
+ // run uses its stable mail address, while internal body-child runs use freshly
14
+ // minted synthetic ids. Both are run identifiers, so no format is enforced on
15
+ // the column.
16
+ export const workflowRun = pgTable("workflow_run", {
17
+ id: text("id").primaryKey(),
18
+ // The definition a run belongs to, carried by every run: a folded
19
+ // agent-origin run sets it at launch, and a deployment's anchor run and its
20
+ // child runs carry the deployment's definition. It is the run's anchor to a
21
+ // first-class definition. `cascade` matches `anchorRunId`'s onDelete, so
22
+ // deleting the definition removes its runs.
23
+ definitionId: text("definition_id")
24
+ .notNull()
25
+ .references(() => workflowDefinition.id, { onDelete: "cascade" }),
26
+ // Nullable as of the fold: a folded agent-origin run carries a
27
+ // `definitionId` and no deployment, while a deployment's anchor run sets
28
+ // this to its own id and a child run sets it to its anchor's id. It
29
+ // references the anchor `workflow_run` -- the run whose id equals the
30
+ // deployment id -- so an anchor row is self-referential. The only runtime
31
+ // read of the column (`resolveWorkflowPrincipalNames`) degrades gracefully
32
+ // when it is null.
33
+ anchorRunId: text("anchor_run_id").references(() => workflowRun.id, { onDelete: "cascade" }),
34
+ tenantId: text("tenant_id")
35
+ .notNull()
36
+ .references(() => tenant.id, { onDelete: "cascade" }),
37
+ // Nullable by design: an internal, workflow-spawned run has no principal of
38
+ // its own -- it inherits the deployment's grants at read time -- so null is
39
+ // the honest signal for "this run has no own principal." `onDelete: "set
40
+ // null"` is deliberate (unlike agent_instance's principal, which uses the
41
+ // implicit default): deleting a run's principal nulls the column rather than
42
+ // wedging the run row.
43
+ principalId: text("principal_id").references(() => principal.id, {
44
+ onDelete: "set null",
45
+ }),
46
+ // A deployment's anchor run is born "deployed": the deploy->first-trigger
47
+ // window is live but not yet running. The first trigger reconciles the
48
+ // anchor and flips this column "deployed" -> "running" (see
49
+ // `anchorWithPrincipal`). A child run has no such window -- it exists only
50
+ // once execution spawns it -- so it is born "running". A run settles into a
51
+ // terminal status when its terminal event lands on the workflow-run ref:
52
+ // the hub's pack-receive path flips this column under a live-status guard so
53
+ // a redelivered terminal event does not re-terminate the run.
54
+ status: text("status", {
55
+ enum: ["deployed", "running", "completed", "failed", "cancelled"],
56
+ })
57
+ .notNull()
58
+ .default("running"),
59
+ // Runtime bindings a folded run carries, mirroring `agent_instance`: a
60
+ // folded run IS the launched instance, so it owns its routing endpoint.
61
+ // `address` is that endpoint -- nullable because an address-less child run
62
+ // routes via its deployment (a deployment's anchor run instead carries a
63
+ // workflow-derived address), but unique among the runs that set it (the
64
+ // partial unique index below). The folded launch writes `address` and
65
+ // `modelPreferences`; `publicKey` is persisted when the sidecar acks the
66
+ // deploy; no code populates `sidecarId`/`kernelId`.
67
+ address: text("address"),
68
+ publicKey: text("public_key"),
69
+ sidecarId: text("sidecar_id").references(() => sidecar.id, {
70
+ onDelete: "set null",
71
+ }),
72
+ kernelId: text("kernel_id"),
73
+ modelPreferences: jsonb("model_preferences"),
74
+ createdAt: timestamp("created_at").notNull().defaultNow(),
75
+ // Nullable: a run has no end time until it reaches a terminal state.
76
+ endedAt: timestamp("ended_at"),
77
+ }, (t) => [
78
+ // Supports lookups of a definition's runs, the read path folded runs use
79
+ // once `definitionId` is the anchor.
80
+ index("workflow_run_definition_idx").on(t.definitionId),
81
+ // A folded run owns a unique routing address, exactly like the agent
82
+ // instance it stands in for; a run that anchors on a deployment instead
83
+ // leaves `address` null and is not indexed. Partial so the many null-address
84
+ // rows never collide and are kept out of the index.
85
+ uniqueIndex("workflow_run_address_idx")
86
+ .on(t.address)
87
+ .where(sql `${t.address} is not null`),
88
+ ]);
89
+ // The statuses a run holds while live -- not yet settled into a terminal state.
90
+ // A deployment anchor is born "deployed" and flips to "running" on its first
91
+ // trigger; a child run is born "running". Every status gate that must treat a
92
+ // live run as live tests membership here, so "which statuses count as live" has
93
+ // a single definition rather than a `status !== "running"` scattered across the
94
+ // workflow-run domain. The `satisfies` bound makes a drift from the column enum
95
+ // a compile error.
96
+ export const liveWorkflowRunStatuses = [
97
+ "deployed",
98
+ "running",
99
+ ];
100
+ export function isLiveWorkflowRunStatus(status) {
101
+ return liveWorkflowRunStatuses.some((live) => live === status);
102
+ }