deepline 0.3.90 → 0.3.91

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 (87) hide show
  1. package/dist/bundling-sources/sdk/src/client.ts +101 -6
  2. package/dist/bundling-sources/sdk/src/monitor-fleet-contract.ts +2 -556
  3. package/dist/bundling-sources/sdk/src/monitor-fleets.ts +2 -2
  4. package/dist/bundling-sources/sdk/src/release.ts +7 -12
  5. package/dist/bundling-sources/sdk/src/types.ts +6 -1
  6. package/dist/bundling-sources/shared_libs/integration-contracts/monitor-fleet-contract.ts +549 -0
  7. package/dist/bundling-sources/shared_libs/monitors/fleets/errors.ts +96 -0
  8. package/dist/bundling-sources/shared_libs/monitors/fleets/limits.ts +8 -0
  9. package/dist/bundling-sources/shared_libs/monitors/fleets/plan.ts +320 -0
  10. package/dist/bundling-sources/shared_libs/monitors/fleets/verdict.ts +106 -0
  11. package/dist/bundling-sources/shared_libs/monitors/http-error-response.ts +5 -1
  12. package/dist/bundling-sources/shared_libs/monitors/monitor-fleet-limits.ts +2 -12
  13. package/dist/bundling-sources/shared_libs/monitors/package.json +107 -5
  14. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-batch-operation.ts +12 -7
  15. package/dist/bundling-sources/shared_libs/observability/scheduled-jobs.json +36 -0
  16. package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +1 -1
  17. package/dist/bundling-sources/shared_libs/play-runtime/db-session-lease-store.ts +578 -0
  18. package/dist/bundling-sources/shared_libs/play-runtime/deployment/commands/roll-execution-relay.ts +521 -0
  19. package/dist/bundling-sources/shared_libs/play-runtime/deployment/commands/roll-receipt-gateway.ts +1378 -0
  20. package/dist/bundling-sources/shared_libs/play-runtime/deployment/commands/runtime-topology.ts +1024 -0
  21. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-gateway-route-probe.ts +193 -0
  22. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-machine-lifecycle.ts +104 -0
  23. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-machines.ts +1844 -0
  24. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-registry.ts +21 -0
  25. package/dist/bundling-sources/shared_libs/play-runtime/deployment/process-tree.ts +40 -0
  26. package/dist/bundling-sources/shared_libs/play-runtime/deployment/runtime-gateway-drain.ts +262 -0
  27. package/dist/bundling-sources/shared_libs/play-runtime/deployment/runtime-surface.ts +98 -0
  28. package/dist/bundling-sources/shared_libs/play-runtime/deployment/runtime-topology.ts +303 -0
  29. package/dist/bundling-sources/shared_libs/play-runtime/deployment/runtime-tuple-publication-guardian.ts +70 -0
  30. package/dist/bundling-sources/shared_libs/play-runtime/deployment/runtime-tuple-recovery.ts +519 -0
  31. package/dist/bundling-sources/shared_libs/play-runtime/deployment/vercel-fly-rollback-alignment.ts +280 -0
  32. package/dist/bundling-sources/shared_libs/play-runtime/deployment/vercel-production-gate.ts +159 -0
  33. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/memory-store.ts +114 -0
  34. package/dist/bundling-sources/shared_libs/play-runtime/run-ledger.ts +44 -5
  35. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/child-play-resolver.ts +26 -0
  36. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/index.ts +3662 -0
  37. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/progress-sidecar.ts +47 -0
  38. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-deadline.ts +84 -0
  39. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-gateway-transport.ts +91 -0
  40. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-heartbeat.ts +424 -0
  41. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-progress-push.ts +321 -0
  42. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-sheet-persistence-retry.ts +110 -0
  43. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-terminal-push.ts +625 -0
  44. package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +46 -3
  45. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/receipt-gateway.ts +1 -1
  46. package/dist/bundling-sources/shared_libs/play-runtime/webhook-receipt-retry.ts +50 -0
  47. package/dist/bundling-sources/shared_libs/plays/bundling/repository-adapter.ts +24 -0
  48. package/dist/bundling-sources/shared_libs/plays/child-run-projection.ts +174 -0
  49. package/dist/bundling-sources/shared_libs/plays/deploy/api-client.ts +267 -0
  50. package/dist/bundling-sources/shared_libs/plays/deploy/control-plane-types.ts +73 -0
  51. package/dist/bundling-sources/shared_libs/plays/deploy/manifest.ts +162 -0
  52. package/dist/bundling-sources/shared_libs/plays/deploy/project-serializer.ts +87 -0
  53. package/dist/bundling-sources/shared_libs/plays/deploy/source-file-path.ts +26 -0
  54. package/dist/bundling-sources/shared_libs/plays/deploy/target-paths.ts +36 -0
  55. package/dist/bundling-sources/shared_libs/plays/launch/input-contract.ts +400 -0
  56. package/dist/bundling-sources/shared_libs/plays/launch/prepare.ts +96 -0
  57. package/dist/bundling-sources/shared_libs/plays/local-file-discovery.ts +385 -0
  58. package/dist/bundling-sources/shared_libs/plays/play-grep-search.ts +79 -6
  59. package/dist/bundling-sources/shared_libs/plays/play-reference.ts +117 -0
  60. package/dist/bundling-sources/shared_libs/plays/run-input-summary.ts +260 -0
  61. package/dist/bundling-sources/shared_libs/plays/run-summary-types.ts +49 -0
  62. package/dist/bundling-sources/shared_libs/plays/secrets/errors.ts +19 -0
  63. package/dist/bundling-sources/shared_libs/plays/sheet-filter.ts +347 -0
  64. package/dist/bundling-sources/shared_libs/plays/standard-webhooks.ts +117 -0
  65. package/dist/bundling-sources/shared_libs/plays/status-result.ts +388 -0
  66. package/dist/bundling-sources/shared_libs/plays/transform-factor-structure.ts +377 -0
  67. package/dist/bundling-sources/shared_libs/plays/webhook-payload.ts +113 -0
  68. package/dist/cli/index.js +369 -162
  69. package/dist/cli/index.mjs +369 -162
  70. package/dist/{compiler-manifest-BaJfE-5H.d.mts → compiler-manifest-x14KL83E.d.mts} +1 -1
  71. package/dist/{compiler-manifest-BaJfE-5H.d.ts → compiler-manifest-x14KL83E.d.ts} +1 -1
  72. package/dist/index.d.mts +45 -8
  73. package/dist/index.d.ts +45 -8
  74. package/dist/index.js +61 -14
  75. package/dist/index.mjs +61 -14
  76. package/dist/install-integrity.json +54 -2
  77. package/dist/monitor-fleet-contract.d.mts +3 -10
  78. package/dist/monitor-fleet-contract.d.ts +3 -10
  79. package/dist/monitor-fleet-contract.js +2 -0
  80. package/dist/monitor-fleet-contract.mjs +1 -1
  81. package/dist/plays/bundle-play-file.d.mts +2 -2
  82. package/dist/plays/bundle-play-file.d.ts +2 -2
  83. package/dist/release.d.mts +3 -3
  84. package/dist/release.d.ts +3 -3
  85. package/dist/release.js +7 -12
  86. package/dist/release.mjs +7 -12
  87. package/package.json +2 -2
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Declarative Fly runtime topology.
3
+ *
4
+ * This is the only place that defines the durable platform (app identities,
5
+ * ingress, Machine shapes, and release ownership). Release code selects an
6
+ * immutable image and replaces only the declared release unit; it does not
7
+ * invent an app, IP, queue, or controller relationship.
8
+ */
9
+ export type RuntimeGatewayRole = 'receipt' | 'execution';
10
+ export type RuntimeGatewayTopologyProfile = 'production' | 'preview';
11
+
12
+ export type RuntimeGatewayMachineConfig = {
13
+ env: Record<string, string>;
14
+ guest: {
15
+ cpu_kind: 'shared' | 'performance';
16
+ cpus: number;
17
+ memory_mb: number;
18
+ };
19
+ restart: { policy: 'always' };
20
+ stop_config: { signal: 'SIGTERM'; timeout: string };
21
+ metrics: { port: number; path: '/metrics' };
22
+ services: Array<Record<string, unknown>>;
23
+ };
24
+
25
+ type GatewayTopology = {
26
+ app?: string;
27
+ region: 'iad';
28
+ minimumMachines: number;
29
+ processGroup: 'app';
30
+ machine: RuntimeGatewayMachineConfig;
31
+ };
32
+
33
+ type ProductionGatewayTopology = GatewayTopology & {
34
+ app: string;
35
+ machine: RuntimeGatewayMachineConfig & {
36
+ guest: { cpu_kind: 'performance'; cpus: number; memory_mb: number };
37
+ };
38
+ };
39
+
40
+ const httpService = (minimumMachines: number): Record<string, unknown> => ({
41
+ protocol: 'tcp',
42
+ internal_port: 8788,
43
+ autostop: false,
44
+ autostart: true,
45
+ min_machines_running: minimumMachines,
46
+ ports: [
47
+ { port: 80, handlers: ['http'], force_https: true },
48
+ { port: 443, handlers: ['http', 'tls'] },
49
+ ],
50
+ checks: [
51
+ {
52
+ type: 'http',
53
+ interval: '15s',
54
+ timeout: '5s',
55
+ grace_period: '15s',
56
+ // Fly owns liveness only. Version/schema compatibility is a deliberate
57
+ // cordoned-candidate proof, never a service-check side effect.
58
+ path: '/healthz',
59
+ },
60
+ ],
61
+ concurrency: { type: 'requests', soft_limit: 1, hard_limit: 64 },
62
+ });
63
+
64
+ function gatewayMachine(
65
+ profile: RuntimeGatewayTopologyProfile,
66
+ role: RuntimeGatewayRole,
67
+ minimumMachines: number,
68
+ ): RuntimeGatewayMachineConfig {
69
+ const production = profile === 'production';
70
+ return {
71
+ env: {
72
+ PORT: '8788',
73
+ GATEWAY_METRICS_PORT: '8789',
74
+ DEEPLINE_RUNTIME_GATEWAY_ROLE: role,
75
+ FLY_PROCESS_GROUP: 'app',
76
+ ...(production
77
+ ? { DEEPLINE_RUNTIME_JWKS_ORIGIN: 'https://code.deepline.com' }
78
+ : {
79
+ DEEPLINE_ENV: 'dev',
80
+ DEEPLINE_TEST_RUNTIME_SEAMS: '1',
81
+ DEEPLINE_RUNTIME_SCHEDULER_SCHEMA:
82
+ 'runtime_scheduler_absurd_preview',
83
+ }),
84
+ },
85
+ guest: production
86
+ ? { cpu_kind: 'performance', cpus: 2, memory_mb: 4096 }
87
+ : { cpu_kind: 'shared', cpus: 1, memory_mb: 1024 },
88
+ restart: { policy: 'always' },
89
+ stop_config: {
90
+ signal: 'SIGTERM',
91
+ timeout: production ? '5m0s' : '30s',
92
+ },
93
+ metrics: { port: 8789, path: '/metrics' },
94
+ services: [httpService(minimumMachines)],
95
+ };
96
+ }
97
+
98
+ function productionGatewayMachine(
99
+ role: RuntimeGatewayRole,
100
+ minimumMachines: number,
101
+ ): ProductionGatewayTopology['machine'] {
102
+ return gatewayMachine(
103
+ 'production',
104
+ role,
105
+ minimumMachines,
106
+ ) as ProductionGatewayTopology['machine'];
107
+ }
108
+
109
+ const productionGateways: Record<
110
+ RuntimeGatewayRole,
111
+ ProductionGatewayTopology
112
+ > = {
113
+ receipt: {
114
+ app: 'deepline-runtime-receipt-gateway',
115
+ region: 'iad',
116
+ minimumMachines: 2,
117
+ processGroup: 'app',
118
+ machine: productionGatewayMachine('receipt', 2),
119
+ },
120
+ execution: {
121
+ app: 'deepline-runtime-execution-relay',
122
+ region: 'iad',
123
+ minimumMachines: 2,
124
+ processGroup: 'app',
125
+ machine: productionGatewayMachine('execution', 2),
126
+ },
127
+ };
128
+
129
+ const previewGateways: Record<RuntimeGatewayRole, GatewayTopology> = {
130
+ receipt: {
131
+ region: 'iad',
132
+ minimumMachines: 2,
133
+ processGroup: 'app',
134
+ machine: gatewayMachine('preview', 'receipt', 2),
135
+ },
136
+ execution: {
137
+ region: 'iad',
138
+ minimumMachines: 2,
139
+ processGroup: 'app',
140
+ machine: gatewayMachine('preview', 'execution', 2),
141
+ },
142
+ };
143
+
144
+ export const RUNTIME_TOPOLOGY = {
145
+ production: {
146
+ components: {
147
+ receiptGateway: {
148
+ ...productionGateways.receipt,
149
+ release: 'machine-set',
150
+ publicIngress: true,
151
+ image: {
152
+ kind: 'gateway',
153
+ config: 'deploy/fly/runtime-worker/receipt-gateway.toml',
154
+ dockerfile: 'deploy/fly/runtime-worker/receipt-gateway.Dockerfile',
155
+ },
156
+ },
157
+ executionRelay: {
158
+ ...productionGateways.execution,
159
+ release: 'machine-set',
160
+ publicIngress: true,
161
+ image: {
162
+ kind: 'gateway',
163
+ config: 'deploy/fly/runtime-worker/execution-relay.toml',
164
+ dockerfile: 'deploy/fly/runtime-worker/receipt-gateway.Dockerfile',
165
+ },
166
+ },
167
+ worker: {
168
+ app: 'deepline-absurd-worker-prod',
169
+ release: 'immutable-lane',
170
+ publicIngress: false,
171
+ image: {
172
+ kind: 'worker',
173
+ config: 'deploy/fly/runtime-worker/absurd-worker.toml',
174
+ dockerfile: 'deploy/fly/runtime-worker/Dockerfile.absurd',
175
+ },
176
+ },
177
+ scaler: {
178
+ app: 'deepline-absurd-worker-prod-scaler',
179
+ release: 'lease-holder',
180
+ publicIngress: false,
181
+ image: {
182
+ kind: 'scaler',
183
+ config: 'deploy/fly/runtime-worker/absurd-scaler.toml',
184
+ dockerfile: 'deploy/fly/runtime-worker/Dockerfile.absurd-scaler',
185
+ },
186
+ processGroups: {
187
+ app: { desiredStarted: 1, healthCheck: 'scaler_ready' },
188
+ projector: { desiredStarted: 2, healthCheck: 'projector_ready' },
189
+ },
190
+ },
191
+ workerLogShipper: {
192
+ app: 'deepline-runtime-log-shipper',
193
+ release: 'singleton',
194
+ publicIngress: false,
195
+ config: 'deploy/fly/runtime-log-shipper/fly.toml',
196
+ },
197
+ receiptGatewayLogShipper: {
198
+ app: 'deepline-runtime-receipt-gateway-log-shipper',
199
+ release: 'singleton',
200
+ publicIngress: false,
201
+ config: 'deploy/fly/runtime-log-shipper/receipt-gateway.fly.toml',
202
+ },
203
+ executionRelayLogShipper: {
204
+ app: 'deepline-runtime-execution-relay-log-shipper',
205
+ release: 'singleton',
206
+ publicIngress: false,
207
+ config: 'deploy/fly/runtime-log-shipper/execution-relay.fly.toml',
208
+ },
209
+ },
210
+ },
211
+ preview: { gateways: previewGateways },
212
+ } as const;
213
+
214
+ export type RuntimeComponent =
215
+ keyof typeof RUNTIME_TOPOLOGY.production.components;
216
+
217
+ type ProductionComponent =
218
+ (typeof RUNTIME_TOPOLOGY.production.components)[RuntimeComponent];
219
+
220
+ type SingletonComponent = ProductionComponent & {
221
+ release: 'singleton';
222
+ config: string;
223
+ };
224
+
225
+ export function productionRuntimeAppNames(): string[] {
226
+ return Object.values(RUNTIME_TOPOLOGY.production.components).map(
227
+ (component) => component.app,
228
+ );
229
+ }
230
+
231
+ /**
232
+ * Singleton components are the only fixed services that can be deployed as a
233
+ * group. Adding another declared singleton automatically adds its app shell
234
+ * and its no-public-IP deployment to topology reconciliation.
235
+ */
236
+ export function productionSingletonComponents(): SingletonComponent[] {
237
+ return Object.values(RUNTIME_TOPOLOGY.production.components).filter(
238
+ (component): component is SingletonComponent =>
239
+ component.release === 'singleton' &&
240
+ 'config' in component &&
241
+ typeof component.config === 'string',
242
+ );
243
+ }
244
+
245
+ export function assertRuntimeTopologyInvariants(): void {
246
+ const components = Object.values(
247
+ RUNTIME_TOPOLOGY.production.components,
248
+ ) as Array<{ app: string; release: string; publicIngress: boolean }>;
249
+ const apps = components.map((component) => component.app);
250
+ if (new Set(apps).size !== apps.length) {
251
+ throw new Error(
252
+ 'Every production runtime component requires a unique app.',
253
+ );
254
+ }
255
+ for (const component of components) {
256
+ if (component.release === 'machine-set' && !component.publicIngress) {
257
+ throw new Error(
258
+ `Machine-set component ${component.app} must declare public ingress.`,
259
+ );
260
+ }
261
+ if (component.release === 'immutable-lane' && component.publicIngress) {
262
+ throw new Error(
263
+ `Immutable-lane component ${component.app} cannot declare public ingress.`,
264
+ );
265
+ }
266
+ }
267
+ }
268
+
269
+ assertRuntimeTopologyInvariants();
270
+
271
+ export function runtimeGatewayTopology(
272
+ profile: RuntimeGatewayTopologyProfile,
273
+ role: RuntimeGatewayRole,
274
+ ): GatewayTopology {
275
+ if (profile === 'production') return productionGateways[role];
276
+ return previewGateways[role];
277
+ }
278
+
279
+ export function productionGatewayTopology(
280
+ role: RuntimeGatewayRole,
281
+ ): ProductionGatewayTopology {
282
+ return productionGateways[role];
283
+ }
284
+
285
+ export function gatewayMachineConfig(input: {
286
+ profile: RuntimeGatewayTopologyProfile;
287
+ role: RuntimeGatewayRole;
288
+ image: string;
289
+ metadata: Record<string, string>;
290
+ env?: Record<string, string>;
291
+ }): Record<string, unknown> {
292
+ const machine = runtimeGatewayTopology(input.profile, input.role).machine;
293
+ return {
294
+ image: input.image,
295
+ env: { ...machine.env, ...input.env },
296
+ guest: machine.guest,
297
+ restart: machine.restart,
298
+ stop_config: machine.stop_config,
299
+ metrics: machine.metrics,
300
+ services: machine.services,
301
+ metadata: input.metadata,
302
+ };
303
+ }
@@ -0,0 +1,70 @@
1
+ import { spawn } from 'node:child_process';
2
+ import {
3
+ createRuntimeTuplePanicRecovery,
4
+ type RuntimeTupleRecoveryCommand,
5
+ } from './runtime-tuple-recovery';
6
+
7
+ function required(name: string): string {
8
+ const value = process.env[name]?.trim();
9
+ if (!value) {
10
+ throw new Error(`${name} is required for runtime tuple recovery.`);
11
+ }
12
+ return value;
13
+ }
14
+
15
+ function command(
16
+ input: Parameters<RuntimeTupleRecoveryCommand>[0],
17
+ ): Promise<void> {
18
+ return new Promise((resolve, reject) => {
19
+ const child = spawn(input.executable, [...input.args], {
20
+ env: { ...process.env, ...input.environment },
21
+ stdio: 'inherit',
22
+ });
23
+ child.once('error', reject);
24
+ child.once('close', (code, signal) => {
25
+ if (code === 0) {
26
+ resolve();
27
+ return;
28
+ }
29
+ reject(
30
+ new Error(
31
+ signal
32
+ ? `${input.description} was terminated by ${signal}.`
33
+ : `${input.description} failed with exit code ${code ?? '<unknown>'}.`,
34
+ ),
35
+ );
36
+ });
37
+ });
38
+ }
39
+
40
+ function recovery() {
41
+ return createRuntimeTuplePanicRecovery({
42
+ controlUrl: required('RUNTIME_TUPLE_CONTROL_URL'),
43
+ internalToken: required('DEEPLINE_INTERNAL_TOKEN'),
44
+ vercelProtectionBypassToken: process.env.VERCEL_PROTECTION_BYPASS_TOKEN,
45
+ vercel: {
46
+ token: required('VERCEL_TOKEN'),
47
+ teamId: required('VERCEL_TEAM_ID'),
48
+ projectId: required('VERCEL_PROJECT_ID'),
49
+ },
50
+ gatewayFlyToken: required('RUNTIME_GATEWAY_FAS_API_TOKEN'),
51
+ command,
52
+ log: (event, fields) =>
53
+ console.info(`[runtime-tuple-guardian] ${event}`, fields),
54
+ });
55
+ }
56
+
57
+ export async function activeRuntimeTuplePublication() {
58
+ return await recovery().activePublication();
59
+ }
60
+
61
+ /**
62
+ * One idempotent convergence pass. The scaler invokes this on every tick; a
63
+ * provider outage leaves the durable operation in panic and the next tick
64
+ * resumes from the same baseline rather than declaring recovery failed.
65
+ */
66
+ export async function reconcileRuntimeTuplePublicationPanic(input: {
67
+ owner: string;
68
+ }): Promise<boolean> {
69
+ return await recovery().reconcile(input);
70
+ }