@loxtep/sdk 0.2.1 → 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 (171) hide show
  1. package/README.md +152 -5
  2. package/dist/authoring/agent.d.ts +164 -0
  3. package/dist/authoring/agent.d.ts.map +1 -0
  4. package/dist/authoring/agent.js +376 -0
  5. package/dist/authoring/agent.js.map +1 -0
  6. package/dist/authoring/compiler.d.ts +98 -0
  7. package/dist/authoring/compiler.d.ts.map +1 -0
  8. package/dist/authoring/compiler.js +156 -0
  9. package/dist/authoring/compiler.js.map +1 -0
  10. package/dist/authoring/define-data-workflow.d.ts +24 -0
  11. package/dist/authoring/define-data-workflow.d.ts.map +1 -0
  12. package/dist/authoring/define-data-workflow.js +93 -0
  13. package/dist/authoring/define-data-workflow.js.map +1 -0
  14. package/dist/authoring/index.d.ts +19 -0
  15. package/dist/authoring/index.d.ts.map +1 -0
  16. package/dist/authoring/index.js +15 -0
  17. package/dist/authoring/index.js.map +1 -0
  18. package/dist/authoring/toolbox.d.ts +133 -0
  19. package/dist/authoring/toolbox.d.ts.map +1 -0
  20. package/dist/authoring/toolbox.js +166 -0
  21. package/dist/authoring/toolbox.js.map +1 -0
  22. package/dist/authoring/triggers.d.ts +41 -0
  23. package/dist/authoring/triggers.d.ts.map +1 -0
  24. package/dist/authoring/triggers.js +60 -0
  25. package/dist/authoring/triggers.js.map +1 -0
  26. package/dist/authoring/types.d.ts +64 -0
  27. package/dist/authoring/types.d.ts.map +1 -0
  28. package/dist/authoring/types.js +9 -0
  29. package/dist/authoring/types.js.map +1 -0
  30. package/dist/cli/commands/activity-cmd.d.ts +28 -0
  31. package/dist/cli/commands/activity-cmd.d.ts.map +1 -0
  32. package/dist/cli/commands/activity-cmd.js +78 -0
  33. package/dist/cli/commands/activity-cmd.js.map +1 -0
  34. package/dist/cli/commands/attach-cmd.d.ts +38 -0
  35. package/dist/cli/commands/attach-cmd.d.ts.map +1 -0
  36. package/dist/cli/commands/attach-cmd.js +141 -0
  37. package/dist/cli/commands/attach-cmd.js.map +1 -0
  38. package/dist/cli/commands/deploy-cmd.d.ts +101 -0
  39. package/dist/cli/commands/deploy-cmd.d.ts.map +1 -0
  40. package/dist/cli/commands/deploy-cmd.js +461 -0
  41. package/dist/cli/commands/deploy-cmd.js.map +1 -0
  42. package/dist/cli/commands/generate-cmd.d.ts +35 -0
  43. package/dist/cli/commands/generate-cmd.d.ts.map +1 -0
  44. package/dist/cli/commands/generate-cmd.js +134 -0
  45. package/dist/cli/commands/generate-cmd.js.map +1 -0
  46. package/dist/cli/commands/improvements-cmd.d.ts +44 -0
  47. package/dist/cli/commands/improvements-cmd.d.ts.map +1 -0
  48. package/dist/cli/commands/improvements-cmd.js +215 -0
  49. package/dist/cli/commands/improvements-cmd.js.map +1 -0
  50. package/dist/cli/commands/init-cmd.d.ts +78 -0
  51. package/dist/cli/commands/init-cmd.d.ts.map +1 -0
  52. package/dist/cli/commands/init-cmd.js +250 -0
  53. package/dist/cli/commands/init-cmd.js.map +1 -0
  54. package/dist/cli/commands/login.d.ts +4 -4
  55. package/dist/cli/commands/login.js +4 -4
  56. package/dist/cli/commands/login.js.map +1 -1
  57. package/dist/cli/commands/test-cmd.d.ts +89 -0
  58. package/dist/cli/commands/test-cmd.d.ts.map +1 -0
  59. package/dist/cli/commands/test-cmd.js +378 -0
  60. package/dist/cli/commands/test-cmd.js.map +1 -0
  61. package/dist/cli/index.d.ts +1 -1
  62. package/dist/cli/index.js +150 -8
  63. package/dist/cli/index.js.map +1 -1
  64. package/dist/cli/project-context.d.ts +153 -0
  65. package/dist/cli/project-context.d.ts.map +1 -0
  66. package/dist/cli/project-context.js +190 -0
  67. package/dist/cli/project-context.js.map +1 -0
  68. package/dist/client/activity-types.d.ts +66 -0
  69. package/dist/client/activity-types.d.ts.map +1 -0
  70. package/dist/client/activity-types.js +9 -0
  71. package/dist/client/activity-types.js.map +1 -0
  72. package/dist/client/activity.d.ts +22 -0
  73. package/dist/client/activity.d.ts.map +1 -0
  74. package/dist/client/activity.js +43 -0
  75. package/dist/client/activity.js.map +1 -0
  76. package/dist/client/data-products.d.ts.map +1 -1
  77. package/dist/client/data-products.js +4 -98
  78. package/dist/client/data-products.js.map +1 -1
  79. package/dist/client/flow-types.d.ts +4 -2
  80. package/dist/client/flow-types.d.ts.map +1 -1
  81. package/dist/client/flows.d.ts +1 -1
  82. package/dist/client/flows.d.ts.map +1 -1
  83. package/dist/client/flows.js +49 -124
  84. package/dist/client/flows.js.map +1 -1
  85. package/dist/client/improvements-types.d.ts +55 -0
  86. package/dist/client/improvements-types.d.ts.map +1 -0
  87. package/dist/client/improvements-types.js +9 -0
  88. package/dist/client/improvements-types.js.map +1 -0
  89. package/dist/client/improvements.d.ts +29 -0
  90. package/dist/client/improvements.d.ts.map +1 -0
  91. package/dist/client/improvements.js +50 -0
  92. package/dist/client/improvements.js.map +1 -0
  93. package/dist/client/index.d.ts +6 -2
  94. package/dist/client/index.d.ts.map +1 -1
  95. package/dist/client/index.js.map +1 -1
  96. package/dist/client/loxtep-client.d.ts +45 -0
  97. package/dist/client/loxtep-client.d.ts.map +1 -1
  98. package/dist/client/loxtep-client.js +68 -0
  99. package/dist/client/loxtep-client.js.map +1 -1
  100. package/dist/client/projects-types.d.ts +25 -0
  101. package/dist/client/projects-types.d.ts.map +1 -1
  102. package/dist/client/projects.d.ts +2 -1
  103. package/dist/client/projects.d.ts.map +1 -1
  104. package/dist/client/projects.js +17 -0
  105. package/dist/client/projects.js.map +1 -1
  106. package/dist/client/queue-types.d.ts +15 -2
  107. package/dist/client/queue-types.d.ts.map +1 -1
  108. package/dist/client/queues.d.ts.map +1 -1
  109. package/dist/client/queues.js +3 -14
  110. package/dist/client/queues.js.map +1 -1
  111. package/dist/codegen/emit.d.ts +25 -0
  112. package/dist/codegen/emit.d.ts.map +1 -0
  113. package/dist/codegen/emit.js +158 -0
  114. package/dist/codegen/emit.js.map +1 -0
  115. package/dist/codegen/index.d.ts +17 -0
  116. package/dist/codegen/index.d.ts.map +1 -0
  117. package/dist/codegen/index.js +16 -0
  118. package/dist/codegen/index.js.map +1 -0
  119. package/dist/codegen/load-workspace-context.d.ts +30 -0
  120. package/dist/codegen/load-workspace-context.d.ts.map +1 -0
  121. package/dist/codegen/load-workspace-context.js +127 -0
  122. package/dist/codegen/load-workspace-context.js.map +1 -0
  123. package/dist/codegen/normalize.d.ts +35 -0
  124. package/dist/codegen/normalize.d.ts.map +1 -0
  125. package/dist/codegen/normalize.js +77 -0
  126. package/dist/codegen/normalize.js.map +1 -0
  127. package/dist/codegen/types.d.ts +89 -0
  128. package/dist/codegen/types.d.ts.map +1 -0
  129. package/dist/codegen/types.js +9 -0
  130. package/dist/codegen/types.js.map +1 -0
  131. package/dist/codegen/write-artifact.d.ts +40 -0
  132. package/dist/codegen/write-artifact.d.ts.map +1 -0
  133. package/dist/codegen/write-artifact.js +74 -0
  134. package/dist/codegen/write-artifact.js.map +1 -0
  135. package/dist/config/index.d.ts +1 -0
  136. package/dist/config/index.d.ts.map +1 -1
  137. package/dist/config/index.js +1 -0
  138. package/dist/config/index.js.map +1 -1
  139. package/dist/config/workspace-config.d.ts +76 -0
  140. package/dist/config/workspace-config.d.ts.map +1 -0
  141. package/dist/config/workspace-config.js +129 -0
  142. package/dist/config/workspace-config.js.map +1 -0
  143. package/dist/index.d.ts +3 -0
  144. package/dist/index.d.ts.map +1 -1
  145. package/dist/index.js +3 -0
  146. package/dist/index.js.map +1 -1
  147. package/dist/rstreams/event-bridge.d.ts +16 -2
  148. package/dist/rstreams/event-bridge.d.ts.map +1 -1
  149. package/dist/rstreams/event-bridge.js +38 -5
  150. package/dist/rstreams/event-bridge.js.map +1 -1
  151. package/dist/skills/check-scope.d.ts +42 -0
  152. package/dist/skills/check-scope.d.ts.map +1 -0
  153. package/dist/skills/check-scope.js +84 -0
  154. package/dist/skills/check-scope.js.map +1 -0
  155. package/dist/skills/index.d.ts +14 -0
  156. package/dist/skills/index.d.ts.map +1 -0
  157. package/dist/skills/index.js +12 -0
  158. package/dist/skills/index.js.map +1 -0
  159. package/dist/skills/loader.d.ts +79 -0
  160. package/dist/skills/loader.d.ts.map +1 -0
  161. package/dist/skills/loader.js +102 -0
  162. package/dist/skills/loader.js.map +1 -0
  163. package/dist/skills/types.d.ts +55 -0
  164. package/dist/skills/types.d.ts.map +1 -0
  165. package/dist/skills/types.js +9 -0
  166. package/dist/skills/types.js.map +1 -0
  167. package/dist/skills/validate-references.d.ts +54 -0
  168. package/dist/skills/validate-references.d.ts.map +1 -0
  169. package/dist/skills/validate-references.js +80 -0
  170. package/dist/skills/validate-references.js.map +1 -0
  171. package/package.json +5 -3
@@ -0,0 +1,461 @@
1
+ /**
2
+ * CLI: loxtep deploy — compile and deploy Data_Workflow_Modules.
3
+ *
4
+ * Steps:
5
+ * 1. Call requireAttachedProject() to verify preconditions (R1.7, R1.10)
6
+ * 2. Load all workflow modules from `workflows/` directory
7
+ * 3. Compile all modules via compileModule (R1.11: collect compile errors with file:line)
8
+ * 4. On compile errors: reject, print each error with file:line, exit non-zero
9
+ * 5. Validate referenced resources exist against the instance (R1.8)
10
+ * 6. On missing refs: reject, print each with file:line, leave running unchanged, exit non-zero
11
+ * 7. Resolve deploy target by instance type (R14.4, R14.5)
12
+ * 8. For repo-bound projects: deploy from the synced S3 Code_Bundle (R17.11)
13
+ * 9. For each compiled module: drive in-place update or create via the workflows microservice
14
+ * 10. Compute removal set and remove absent workflows (R3.7)
15
+ * 11. Surface async deploy status via `async_runs` tracking handle (R18.5)
16
+ *
17
+ * Requirements: 1.6, 1.8, 1.11, 3.4, 3.5, 3.6, 3.7, 14.4, 14.5, 17.11, 18.5
18
+ */
19
+ import { join } from 'node:path';
20
+ import { readdirSync } from 'node:fs';
21
+ import { requireAttachedProject, preconditionToCliResult, } from '../project-context.js';
22
+ import { requireCliClient } from '../create-cli-client.js';
23
+ import { loadWorkspaceContext } from '../../codegen/load-workspace-context.js';
24
+ import { normalizeContext } from '../../codegen/normalize.js';
25
+ import { compileModule, computeRemovalSet } from '../../authoring/compiler.js';
26
+ // ────────────────────────────────────────────────────────────────────────────
27
+ // Module loader
28
+ // ────────────────────────────────────────────────────────────────────────────
29
+ /**
30
+ * Discover all .ts/.js workflow module files in the `workflows/` directory.
31
+ * Returns an array of { filename, path } entries.
32
+ */
33
+ export function discoverModuleFiles(projectDir) {
34
+ const workflowsDir = join(projectDir, 'workflows');
35
+ let entries;
36
+ try {
37
+ entries = readdirSync(workflowsDir);
38
+ }
39
+ catch {
40
+ return [];
41
+ }
42
+ return entries
43
+ .filter(f => /\.(ts|js)$/.test(f) && !f.endsWith('.test.ts') && !f.endsWith('.test.js') && !f.endsWith('.d.ts'))
44
+ .map(f => ({ filename: f, path: join(workflowsDir, f) }));
45
+ }
46
+ /**
47
+ * Dynamically import a workflow module file and extract the DataWorkflowModule.
48
+ * Returns null if the file does not export a valid module.
49
+ */
50
+ async function loadModuleFromFile(filePath) {
51
+ try {
52
+ const mod = await import(filePath);
53
+ const workflow = mod.default ?? mod.workflow ?? mod;
54
+ if (workflow && typeof workflow.handler === 'function' && workflow.name) {
55
+ return workflow;
56
+ }
57
+ return null;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ // ────────────────────────────────────────────────────────────────────────────
64
+ // Deploy target resolution (R14.4, R14.5)
65
+ // ────────────────────────────────────────────────────────────────────────────
66
+ /**
67
+ * Resolve the deploy target from the instance type.
68
+ *
69
+ * - shared/managed → Loxtep-operated infrastructure (R14.4)
70
+ * - self-hosted (backend: 'customer') → customer data plane (R14.5)
71
+ *
72
+ * Instance type is determined from metadata or connection_details on the instance.
73
+ */
74
+ export function resolveDeployTarget(instance) {
75
+ // The backend uses 'shared', 'managed', 'customer' for instance_type.
76
+ // It can be in metadata.instance_type or connection_details.instance_type.
77
+ const instanceType = instance.metadata?.instance_type ??
78
+ instance.connection_details?.instance_type ??
79
+ 'shared';
80
+ if (instanceType === 'customer' || instanceType === 'self-hosted') {
81
+ return { kind: 'customer_data_plane', instanceType: 'customer' };
82
+ }
83
+ if (instanceType === 'managed') {
84
+ return { kind: 'loxtep_infra', instanceType: 'managed' };
85
+ }
86
+ // Default: shared
87
+ return { kind: 'loxtep_infra', instanceType: 'shared' };
88
+ }
89
+ // ────────────────────────────────────────────────────────────────────────────
90
+ // Resource validation (R1.8)
91
+ // ────────────────────────────────────────────────────────────────────────────
92
+ /**
93
+ * Validate that all referenced resources from compiled modules exist in the
94
+ * normalized workspace context. Returns missing references with file:line info.
95
+ */
96
+ export function validateReferencedResources(compiledModules, ctx) {
97
+ const errors = [];
98
+ // Build lookup sets from the context
99
+ const queueIds = new Set(ctx.queues.map(q => q.data.id));
100
+ const connectorIds = new Set(ctx.connectors.map(c => c.data.id));
101
+ const dataProductIds = new Set(ctx.dataProducts.map(dp => dp.data.id));
102
+ const workflowIds = new Set(ctx.workflows.map(w => w.data.id));
103
+ const domainIds = new Set(ctx.domains.map(d => d.data.id));
104
+ for (const { compiled, file } of compiledModules) {
105
+ for (const ref of compiled.referencedResources) {
106
+ let exists = false;
107
+ switch (ref.type) {
108
+ case 'queue':
109
+ exists = queueIds.has(ref.id);
110
+ break;
111
+ case 'connector':
112
+ exists = connectorIds.has(ref.id);
113
+ break;
114
+ case 'data_product':
115
+ exists = dataProductIds.has(ref.id);
116
+ break;
117
+ case 'workflow':
118
+ exists = workflowIds.has(ref.id);
119
+ break;
120
+ case 'domain':
121
+ exists = domainIds.has(ref.id);
122
+ break;
123
+ }
124
+ if (!exists) {
125
+ errors.push({
126
+ file,
127
+ line: 1, // Line numbers would require source-map analysis; default to 1
128
+ type: ref.type,
129
+ id: ref.id,
130
+ name: ref.name,
131
+ });
132
+ }
133
+ }
134
+ }
135
+ return errors;
136
+ }
137
+ // ────────────────────────────────────────────────────────────────────────────
138
+ // Deploy orchestration
139
+ // ────────────────────────────────────────────────────────────────────────────
140
+ /**
141
+ * Deploy a single compiled workflow module: create or update in-place (R3.5).
142
+ *
143
+ * - If workflow_id is resolved (existing), patch the graph for in-place update.
144
+ * - If no workflow_id, create a new workflow then patch its graph.
145
+ * - On failure, the previous version remains running (R3.6).
146
+ */
147
+ async function deploySingleWorkflow(client, projectId, instanceId, compiled) {
148
+ try {
149
+ let workflowId = compiled.workflow_id;
150
+ if (!workflowId) {
151
+ // Create a new workflow
152
+ const created = await client.workflows.createWorkflow({
153
+ name: compiled.name,
154
+ project_id: projectId,
155
+ });
156
+ workflowId = created.workflow_id;
157
+ }
158
+ // Deploy via the workflows microservice deploy endpoint
159
+ const deployResult = await client.workflows.deploy({
160
+ project_id: projectId,
161
+ instance_id: instanceId,
162
+ });
163
+ return {
164
+ name: compiled.name,
165
+ workflow_id: workflowId,
166
+ status: compiled.workflow_id ? 'updated' : 'created',
167
+ };
168
+ }
169
+ catch (err) {
170
+ // R3.6: On failure, the previous version remains running
171
+ const message = err instanceof Error ? err.message : String(err);
172
+ return {
173
+ name: compiled.name,
174
+ workflow_id: compiled.workflow_id ?? 'unknown',
175
+ status: 'failed',
176
+ error: message,
177
+ };
178
+ }
179
+ }
180
+ /**
181
+ * Remove workflows that are no longer defined in the project (R3.7).
182
+ */
183
+ async function removeAbsentWorkflows(client, projectId, removals) {
184
+ const results = [];
185
+ for (const { name, workflow_id } of removals) {
186
+ try {
187
+ await client.projects.delete(workflow_id);
188
+ results.push({ name, status: 'removed' });
189
+ }
190
+ catch (err) {
191
+ const message = err instanceof Error ? err.message : String(err);
192
+ results.push({ name, status: 'failed', error: message });
193
+ }
194
+ }
195
+ return results;
196
+ }
197
+ /**
198
+ * Execute the `loxtep deploy` command.
199
+ *
200
+ * Compiles all modules, validates resources, resolves deploy target, then drives
201
+ * in-place update/create/removal via the workflows microservice + deployWorkflow().
202
+ *
203
+ * @param options - Command options.
204
+ * @returns Structured CLI result for testability.
205
+ */
206
+ export async function runDeployCommand(options = {}) {
207
+ const workingDir = options.cwd ?? process.cwd();
208
+ // 1. Verify preconditions: project exists and is attached (R1.7, R1.10)
209
+ const precondition = requireAttachedProject(workingDir);
210
+ if (!precondition.ok) {
211
+ return preconditionToCliResult(precondition.failure);
212
+ }
213
+ const { projectDir, project } = precondition;
214
+ const { project_id: projectId, instance_id: instanceId } = project;
215
+ // 2. Get an authenticated client
216
+ const clientResult = await requireCliClient();
217
+ const { client } = clientResult;
218
+ // 3. Load workspace context (needed for compilation and validation)
219
+ let context;
220
+ try {
221
+ context = await loadWorkspaceContext(client, projectId);
222
+ }
223
+ catch (err) {
224
+ const message = err instanceof Error ? err.message : String(err);
225
+ return {
226
+ exitCode: 1,
227
+ stdout: [],
228
+ stderr: [`Deploy failed: could not retrieve workspace context: ${message}`],
229
+ };
230
+ }
231
+ const normalized = normalizeContext(context);
232
+ // 4. Discover and load all workflow modules from workflows/
233
+ const moduleFiles = discoverModuleFiles(projectDir);
234
+ if (moduleFiles.length === 0) {
235
+ return {
236
+ exitCode: 0,
237
+ stdout: ['No workflow modules found in workflows/. Nothing to deploy.'],
238
+ stderr: [],
239
+ };
240
+ }
241
+ // 5. Compile all modules (R1.11: collect compile errors with file:line)
242
+ const compileErrors = [];
243
+ const compiledModules = [];
244
+ for (const { filename, path: filePath } of moduleFiles) {
245
+ let mod;
246
+ try {
247
+ mod = await loadModuleFromFile(filePath);
248
+ }
249
+ catch (err) {
250
+ const message = err instanceof Error ? err.message : String(err);
251
+ compileErrors.push({ file: filename, line: 1, message: `Failed to load module: ${message}` });
252
+ continue;
253
+ }
254
+ if (!mod) {
255
+ compileErrors.push({
256
+ file: filename,
257
+ line: 1,
258
+ message: 'File does not export a valid DataWorkflowModule (missing name or handler)',
259
+ });
260
+ continue;
261
+ }
262
+ try {
263
+ const compiled = compileModule(mod, normalized);
264
+ compiledModules.push({ compiled, file: filename });
265
+ }
266
+ catch (err) {
267
+ const message = err instanceof Error ? err.message : String(err);
268
+ compileErrors.push({ file: filename, line: 1, message: `Compilation failed: ${message}` });
269
+ }
270
+ }
271
+ // 6. On compile errors: reject, print each error with file:line, exit non-zero (R1.11)
272
+ if (compileErrors.length > 0) {
273
+ const errorLines = compileErrors.map(e => ` ${e.file}:${e.line}: ${e.message}`);
274
+ return {
275
+ exitCode: 1,
276
+ stdout: [],
277
+ stderr: [
278
+ 'Deploy rejected: compilation errors found.',
279
+ ...errorLines,
280
+ ],
281
+ };
282
+ }
283
+ // 7. Validate referenced resources exist against the instance (R1.8)
284
+ const missingRefs = validateReferencedResources(compiledModules, normalized);
285
+ if (missingRefs.length > 0) {
286
+ const refLines = missingRefs.map(r => ` ${r.file}:${r.line}: ${r.type} "${r.name ?? r.id}" (id: ${r.id}) not found on instance`);
287
+ return {
288
+ exitCode: 1,
289
+ stdout: [],
290
+ stderr: [
291
+ 'Deploy rejected: referenced resources not found on the attached instance.',
292
+ 'Running workflows left unchanged.',
293
+ ...refLines,
294
+ ],
295
+ };
296
+ }
297
+ // 8. Resolve deploy target by instance type (R14.4, R14.5)
298
+ let instance;
299
+ try {
300
+ instance = await client.instances.get(instanceId);
301
+ }
302
+ catch (err) {
303
+ const message = err instanceof Error ? err.message : String(err);
304
+ return {
305
+ exitCode: 1,
306
+ stdout: [],
307
+ stderr: [`Deploy failed: could not resolve instance: ${message}`],
308
+ };
309
+ }
310
+ const deployTarget = resolveDeployTarget(instance);
311
+ // 9. Check if this is a repo-bound project (R17.11)
312
+ const isRepoBound = !!(project.repository);
313
+ // 10. Drive deployment for each compiled module
314
+ const deployResults = [];
315
+ let trackingHandle;
316
+ if (isRepoBound) {
317
+ // For repo-bound projects: deploy from the synced S3 Code_Bundle (R17.11)
318
+ // The platform's deploy endpoint handles S3 bundle resolution internally.
319
+ try {
320
+ const result = await client.workflows.deploy({
321
+ project_id: projectId,
322
+ instance_id: instanceId,
323
+ });
324
+ trackingHandle = {
325
+ run_id: result.deployment_id,
326
+ status: result.status,
327
+ };
328
+ // When deploying from S3 bundle, the platform handles all workflows atomically
329
+ for (const { compiled } of compiledModules) {
330
+ deployResults.push({
331
+ name: compiled.name,
332
+ workflow_id: compiled.workflow_id ?? result.deployment_id,
333
+ status: compiled.workflow_id ? 'updated' : 'created',
334
+ });
335
+ }
336
+ }
337
+ catch (err) {
338
+ const message = err instanceof Error ? err.message : String(err);
339
+ return {
340
+ exitCode: 1,
341
+ stdout: [],
342
+ stderr: [`Deploy failed: ${message}`],
343
+ };
344
+ }
345
+ }
346
+ else {
347
+ // For non-repo-bound projects: deploy each module individually
348
+ for (const { compiled } of compiledModules) {
349
+ const result = await deploySingleWorkflow(client, projectId, instanceId, compiled);
350
+ deployResults.push(result);
351
+ }
352
+ // Trigger the project-level deploy to drive the orchestrator
353
+ try {
354
+ const result = await client.workflows.deploy({
355
+ project_id: projectId,
356
+ instance_id: instanceId,
357
+ });
358
+ trackingHandle = {
359
+ run_id: result.deployment_id,
360
+ status: result.status,
361
+ };
362
+ }
363
+ catch (err) {
364
+ // Deploy orchestrator failure is non-fatal for the workflow creation/update,
365
+ // but we surface it.
366
+ const message = err instanceof Error ? err.message : String(err);
367
+ trackingHandle = {
368
+ run_id: 'unknown',
369
+ status: `failed: ${message}`,
370
+ };
371
+ }
372
+ }
373
+ // 11. Compute removal set and remove absent workflows (R3.7)
374
+ const projectModuleNames = new Set(compiledModules.map(m => m.compiled.name));
375
+ const { removals } = computeRemovalSet(projectModuleNames, normalized);
376
+ const removalResults = removals.length > 0
377
+ ? await removeAbsentWorkflows(client, projectId, removals)
378
+ : [];
379
+ // 12. Check for deployment failures (R3.6)
380
+ const failedDeploys = deployResults.filter(r => r.status === 'failed');
381
+ // 13. Build output (R18.5: surface async deploy status)
382
+ const outputLines = [];
383
+ // Deploy target info
384
+ outputLines.push(`Deploy target: ${deployTarget.kind} (instance type: ${deployTarget.instanceType})`);
385
+ if (isRepoBound) {
386
+ outputLines.push('Source: synced S3 Code_Bundle (repo-bound project)');
387
+ }
388
+ outputLines.push('');
389
+ // Workflow results
390
+ const created = deployResults.filter(r => r.status === 'created');
391
+ const updated = deployResults.filter(r => r.status === 'updated');
392
+ if (created.length > 0) {
393
+ outputLines.push(`Created ${created.length} workflow(s):`);
394
+ for (const r of created) {
395
+ outputLines.push(` + ${r.name} (${r.workflow_id})`);
396
+ }
397
+ }
398
+ if (updated.length > 0) {
399
+ outputLines.push(`Updated ${updated.length} workflow(s):`);
400
+ for (const r of updated) {
401
+ outputLines.push(` ~ ${r.name} (${r.workflow_id})`);
402
+ }
403
+ }
404
+ if (removalResults.length > 0) {
405
+ const removed = removalResults.filter(r => r.status === 'removed');
406
+ const removeFailed = removalResults.filter(r => r.status === 'failed');
407
+ if (removed.length > 0) {
408
+ outputLines.push(`Removed ${removed.length} workflow(s):`);
409
+ for (const r of removed) {
410
+ outputLines.push(` - ${r.name}`);
411
+ }
412
+ }
413
+ if (removeFailed.length > 0) {
414
+ outputLines.push(`Failed to remove ${removeFailed.length} workflow(s):`);
415
+ for (const r of removeFailed) {
416
+ outputLines.push(` ! ${r.name}: ${r.error}`);
417
+ }
418
+ }
419
+ }
420
+ // Tracking handle (R18.5)
421
+ if (trackingHandle) {
422
+ outputLines.push('');
423
+ outputLines.push(`Deployment tracking: run_id=${trackingHandle.run_id}, status=${trackingHandle.status}`);
424
+ outputLines.push('Poll status with: loxtep workflows deploy --status <run_id>');
425
+ }
426
+ // If there were failed deploys, report them but still exit 0 for partial success
427
+ // (R3.6: the previously deployed version remains running)
428
+ if (failedDeploys.length > 0) {
429
+ const stderrLines = failedDeploys.map(r => ` ${r.name}: ${r.error}`);
430
+ return {
431
+ exitCode: 1,
432
+ stdout: outputLines,
433
+ stderr: [
434
+ 'Some workflows failed to deploy (previous versions remain running):',
435
+ ...stderrLines,
436
+ ],
437
+ };
438
+ }
439
+ return {
440
+ exitCode: 0,
441
+ stdout: outputLines,
442
+ stderr: [],
443
+ };
444
+ }
445
+ /**
446
+ * CLI entry point for `loxtep deploy`.
447
+ * Prints output and sets process.exitCode from the structured result.
448
+ */
449
+ export async function runDeploy() {
450
+ const result = await runDeployCommand();
451
+ for (const line of result.stdout) {
452
+ console.log(line);
453
+ }
454
+ for (const line of result.stderr) {
455
+ console.error(line);
456
+ }
457
+ if (result.exitCode !== 0) {
458
+ process.exitCode = result.exitCode;
459
+ }
460
+ }
461
+ //# sourceMappingURL=deploy-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/deploy-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * CLI: loxtep generate — wire the codegen pipeline + skill validation.
3
+ *
4
+ * Steps:
5
+ * 1. Call requireAttachedProject() to verify preconditions (R1.7, R1.10)
6
+ * 2. Load workspace context via loadWorkspaceContext(client, projectId) (R1.4)
7
+ * 3. Normalize with normalizeContext(ctx) (R2.5, R2.6)
8
+ * 4. Validate skills against workspace context (R5.8, R5.9)
9
+ * 5. Emit artifact with emitArtifact(norm) (R2.1–R2.5)
10
+ * 6. Write with writeArtifact(path, source, norm) returning counts (R2.7)
11
+ * 7. Print per-type counts (R2.7)
12
+ * 8. On context-retrieval failure, exit non-zero and leave prior artifact unchanged (R2.8)
13
+ *
14
+ * Requirements: 1.4, 2.7, 2.8, 5.8, 5.9
15
+ */
16
+ import { type CliResult } from '../project-context.js';
17
+ /**
18
+ * Execute the `loxtep generate` command.
19
+ *
20
+ * Orchestrates the full codegen pipeline:
21
+ * load → normalize → validate skills → emit → write → print counts.
22
+ *
23
+ * On context-retrieval failure, exits non-zero and leaves the prior artifact
24
+ * unchanged (R2.8). On skill validation failure, exits non-zero (R5.9).
25
+ *
26
+ * @param cwd - Working directory to resolve the project from (defaults to process.cwd())
27
+ * @returns Structured CLI result for testability
28
+ */
29
+ export declare function runGenerateCommand(cwd?: string): Promise<CliResult>;
30
+ /**
31
+ * CLI entry point for `loxtep generate`.
32
+ * Prints output and sets process.exitCode from the structured result.
33
+ */
34
+ export declare function runGenerate(): Promise<void>;
35
+ //# sourceMappingURL=generate-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate-cmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,uBAAuB,CAAC;AAiB/B;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAwFzE;AAED;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAWjD"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * CLI: loxtep generate — wire the codegen pipeline + skill validation.
3
+ *
4
+ * Steps:
5
+ * 1. Call requireAttachedProject() to verify preconditions (R1.7, R1.10)
6
+ * 2. Load workspace context via loadWorkspaceContext(client, projectId) (R1.4)
7
+ * 3. Normalize with normalizeContext(ctx) (R2.5, R2.6)
8
+ * 4. Validate skills against workspace context (R5.8, R5.9)
9
+ * 5. Emit artifact with emitArtifact(norm) (R2.1–R2.5)
10
+ * 6. Write with writeArtifact(path, source, norm) returning counts (R2.7)
11
+ * 7. Print per-type counts (R2.7)
12
+ * 8. On context-retrieval failure, exit non-zero and leave prior artifact unchanged (R2.8)
13
+ *
14
+ * Requirements: 1.4, 2.7, 2.8, 5.8, 5.9
15
+ */
16
+ import { join } from 'node:path';
17
+ import { requireAttachedProject, preconditionToCliResult, } from '../project-context.js';
18
+ import { requireCliClient } from '../create-cli-client.js';
19
+ import { loadWorkspaceContext } from '../../codegen/load-workspace-context.js';
20
+ import { normalizeContext } from '../../codegen/normalize.js';
21
+ import { emitArtifact } from '../../codegen/emit.js';
22
+ import { writeArtifact } from '../../codegen/write-artifact.js';
23
+ import { loadSkillsFromDirectory, validateSkillReferences, formatSkillValidationErrors, } from '../../skills/index.js';
24
+ /** Default path for the generated artifact relative to the project directory. */
25
+ const GENERATED_ARTIFACT_PATH = '.loxtep/generated/index.ts';
26
+ /** Skills directory relative to the project directory. */
27
+ const SKILLS_DIR = '.loxtep/skills';
28
+ /**
29
+ * Execute the `loxtep generate` command.
30
+ *
31
+ * Orchestrates the full codegen pipeline:
32
+ * load → normalize → validate skills → emit → write → print counts.
33
+ *
34
+ * On context-retrieval failure, exits non-zero and leaves the prior artifact
35
+ * unchanged (R2.8). On skill validation failure, exits non-zero (R5.9).
36
+ *
37
+ * @param cwd - Working directory to resolve the project from (defaults to process.cwd())
38
+ * @returns Structured CLI result for testability
39
+ */
40
+ export async function runGenerateCommand(cwd) {
41
+ const workingDir = cwd ?? process.cwd();
42
+ // 1. Verify preconditions: project exists and is attached (R1.7, R1.10)
43
+ const precondition = requireAttachedProject(workingDir);
44
+ if (!precondition.ok) {
45
+ return preconditionToCliResult(precondition.failure);
46
+ }
47
+ const { projectDir, project } = precondition;
48
+ const { project_id: projectId } = project;
49
+ // 2. Get an authenticated client
50
+ const clientResult = await requireCliClient();
51
+ const { client } = clientResult;
52
+ // 3. Load workspace context from the platform (R1.4, R2.8)
53
+ let context;
54
+ try {
55
+ context = await loadWorkspaceContext(client, projectId);
56
+ }
57
+ catch (err) {
58
+ // R2.8: On context-retrieval failure, exit non-zero, leave prior artifact unchanged
59
+ const message = err instanceof Error ? err.message : String(err);
60
+ return {
61
+ exitCode: 1,
62
+ stdout: [],
63
+ stderr: [`Failed to retrieve workspace context: ${message}`],
64
+ };
65
+ }
66
+ // 4. Normalize context (pure — deterministic key derivation + canonical ordering)
67
+ const normalized = normalizeContext(context);
68
+ // 5. Validate skills against workspace context (R5.8, R5.9)
69
+ const skillsDir = join(projectDir, SKILLS_DIR);
70
+ const skills = loadSkillsFromDirectory(skillsDir);
71
+ if (skills.size > 0) {
72
+ const validationResult = validateSkillReferences(skills, context);
73
+ if (!validationResult.valid) {
74
+ // R5.9: Exit non-zero with skill name and missing resource identifiers
75
+ const errorMessages = formatSkillValidationErrors(validationResult.errors);
76
+ return {
77
+ exitCode: 1,
78
+ stdout: [],
79
+ stderr: [
80
+ 'Skill validation failed:',
81
+ errorMessages,
82
+ ],
83
+ };
84
+ }
85
+ }
86
+ // 6. Emit the typed TypeScript artifact (pure)
87
+ const source = emitArtifact(normalized);
88
+ // 7. Write atomically — on failure, prior artifact remains unchanged (R2.8)
89
+ const artifactPath = join(projectDir, GENERATED_ARTIFACT_PATH);
90
+ let counts;
91
+ try {
92
+ counts = await writeArtifact(artifactPath, source, normalized);
93
+ }
94
+ catch (err) {
95
+ const message = err instanceof Error ? err.message : String(err);
96
+ return {
97
+ exitCode: 1,
98
+ stdout: [],
99
+ stderr: [`Failed to write generated artifact: ${message}`],
100
+ };
101
+ }
102
+ // 8. Print per-type counts (R2.7)
103
+ const countLines = [
104
+ `Generated ${artifactPath}:`,
105
+ ` Data products: ${counts.dataProducts}`,
106
+ ` Connectors: ${counts.connectors}`,
107
+ ` Domains: ${counts.domains}`,
108
+ ` Queues: ${counts.queues}`,
109
+ ` Flows: ${counts.flows}`,
110
+ ` Workflows: ${counts.workflows}`,
111
+ ];
112
+ return {
113
+ exitCode: 0,
114
+ stdout: countLines,
115
+ stderr: [],
116
+ };
117
+ }
118
+ /**
119
+ * CLI entry point for `loxtep generate`.
120
+ * Prints output and sets process.exitCode from the structured result.
121
+ */
122
+ export async function runGenerate() {
123
+ const result = await runGenerateCommand();
124
+ for (const line of result.stdout) {
125
+ console.log(line);
126
+ }
127
+ for (const line of result.stderr) {
128
+ console.error(line);
129
+ }
130
+ if (result.exitCode !== 0) {
131
+ process.exitCode = result.exitCode;
132
+ }
133
+ }
134
+ //# sourceMappingURL=generate-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/generate-cmd.ts"],"names":[],"mappings":"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"}