@loxtep/sdk 0.2.3 → 0.4.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 (239) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +255 -4
  3. package/dist/authoring/agent.d.ts +164 -0
  4. package/dist/authoring/agent.d.ts.map +1 -0
  5. package/dist/authoring/agent.js +376 -0
  6. package/dist/authoring/agent.js.map +1 -0
  7. package/dist/authoring/compiler.d.ts +103 -0
  8. package/dist/authoring/compiler.d.ts.map +1 -0
  9. package/dist/authoring/compiler.js +305 -0
  10. package/dist/authoring/compiler.js.map +1 -0
  11. package/dist/authoring/define-data-workflow.d.ts +24 -0
  12. package/dist/authoring/define-data-workflow.d.ts.map +1 -0
  13. package/dist/authoring/define-data-workflow.js +93 -0
  14. package/dist/authoring/define-data-workflow.js.map +1 -0
  15. package/dist/authoring/index.d.ts +19 -0
  16. package/dist/authoring/index.d.ts.map +1 -0
  17. package/dist/authoring/index.js +15 -0
  18. package/dist/authoring/index.js.map +1 -0
  19. package/dist/authoring/toolbox.d.ts +133 -0
  20. package/dist/authoring/toolbox.d.ts.map +1 -0
  21. package/dist/authoring/toolbox.js +166 -0
  22. package/dist/authoring/toolbox.js.map +1 -0
  23. package/dist/authoring/triggers.d.ts +41 -0
  24. package/dist/authoring/triggers.d.ts.map +1 -0
  25. package/dist/authoring/triggers.js +60 -0
  26. package/dist/authoring/triggers.js.map +1 -0
  27. package/dist/authoring/types.d.ts +111 -0
  28. package/dist/authoring/types.d.ts.map +1 -0
  29. package/dist/authoring/types.js +9 -0
  30. package/dist/authoring/types.js.map +1 -0
  31. package/dist/cli/commands/activity-cmd.d.ts +28 -0
  32. package/dist/cli/commands/activity-cmd.d.ts.map +1 -0
  33. package/dist/cli/commands/activity-cmd.js +78 -0
  34. package/dist/cli/commands/activity-cmd.js.map +1 -0
  35. package/dist/cli/commands/attach-cmd.d.ts +38 -0
  36. package/dist/cli/commands/attach-cmd.d.ts.map +1 -0
  37. package/dist/cli/commands/attach-cmd.js +141 -0
  38. package/dist/cli/commands/attach-cmd.js.map +1 -0
  39. package/dist/cli/commands/data-contracts-cmd.d.ts +8 -0
  40. package/dist/cli/commands/data-contracts-cmd.d.ts.map +1 -1
  41. package/dist/cli/commands/data-contracts-cmd.js +11 -0
  42. package/dist/cli/commands/data-contracts-cmd.js.map +1 -1
  43. package/dist/cli/commands/data-products-cmd.d.ts +2 -0
  44. package/dist/cli/commands/data-products-cmd.d.ts.map +1 -1
  45. package/dist/cli/commands/data-products-cmd.js +35 -0
  46. package/dist/cli/commands/data-products-cmd.js.map +1 -1
  47. package/dist/cli/commands/deploy-cmd.d.ts +101 -0
  48. package/dist/cli/commands/deploy-cmd.d.ts.map +1 -0
  49. package/dist/cli/commands/deploy-cmd.js +461 -0
  50. package/dist/cli/commands/deploy-cmd.js.map +1 -0
  51. package/dist/cli/commands/generate-cmd.d.ts +35 -0
  52. package/dist/cli/commands/generate-cmd.d.ts.map +1 -0
  53. package/dist/cli/commands/generate-cmd.js +134 -0
  54. package/dist/cli/commands/generate-cmd.js.map +1 -0
  55. package/dist/cli/commands/improvements-cmd.d.ts +44 -0
  56. package/dist/cli/commands/improvements-cmd.d.ts.map +1 -0
  57. package/dist/cli/commands/improvements-cmd.js +215 -0
  58. package/dist/cli/commands/improvements-cmd.js.map +1 -0
  59. package/dist/cli/commands/init-cmd.d.ts +78 -0
  60. package/dist/cli/commands/init-cmd.d.ts.map +1 -0
  61. package/dist/cli/commands/init-cmd.js +250 -0
  62. package/dist/cli/commands/init-cmd.js.map +1 -0
  63. package/dist/cli/commands/instances-cmd.d.ts +37 -0
  64. package/dist/cli/commands/instances-cmd.d.ts.map +1 -0
  65. package/dist/cli/commands/instances-cmd.js +150 -0
  66. package/dist/cli/commands/instances-cmd.js.map +1 -0
  67. package/dist/cli/commands/test-cmd.d.ts +89 -0
  68. package/dist/cli/commands/test-cmd.d.ts.map +1 -0
  69. package/dist/cli/commands/test-cmd.js +378 -0
  70. package/dist/cli/commands/test-cmd.js.map +1 -0
  71. package/dist/cli/index.d.ts +5 -2
  72. package/dist/cli/index.d.ts.map +1 -1
  73. package/dist/cli/index.js +240 -8
  74. package/dist/cli/index.js.map +1 -1
  75. package/dist/cli/project-context.d.ts +153 -0
  76. package/dist/cli/project-context.d.ts.map +1 -0
  77. package/dist/cli/project-context.js +190 -0
  78. package/dist/cli/project-context.js.map +1 -0
  79. package/dist/client/activity-types.d.ts +66 -0
  80. package/dist/client/activity-types.d.ts.map +1 -0
  81. package/dist/client/activity-types.js +9 -0
  82. package/dist/client/activity-types.js.map +1 -0
  83. package/dist/client/activity.d.ts +22 -0
  84. package/dist/client/activity.d.ts.map +1 -0
  85. package/dist/client/activity.js +43 -0
  86. package/dist/client/activity.js.map +1 -0
  87. package/dist/client/data-products-types.d.ts +23 -0
  88. package/dist/client/data-products-types.d.ts.map +1 -1
  89. package/dist/client/data-products.d.ts +3 -1
  90. package/dist/client/data-products.d.ts.map +1 -1
  91. package/dist/client/data-products.js +20 -98
  92. package/dist/client/data-products.js.map +1 -1
  93. package/dist/client/{consumptions-types.d.ts → delivery-types.d.ts} +25 -8
  94. package/dist/client/delivery-types.d.ts.map +1 -0
  95. package/dist/client/delivery-types.js +10 -0
  96. package/dist/client/delivery-types.js.map +1 -0
  97. package/dist/client/delivery.d.ts +23 -0
  98. package/dist/client/delivery.d.ts.map +1 -0
  99. package/dist/client/delivery.js +105 -0
  100. package/dist/client/delivery.js.map +1 -0
  101. package/dist/client/flow-types.d.ts +4 -2
  102. package/dist/client/flow-types.d.ts.map +1 -1
  103. package/dist/client/flows.d.ts +1 -1
  104. package/dist/client/flows.d.ts.map +1 -1
  105. package/dist/client/flows.js +49 -124
  106. package/dist/client/flows.js.map +1 -1
  107. package/dist/client/improvements-types.d.ts +55 -0
  108. package/dist/client/improvements-types.d.ts.map +1 -0
  109. package/dist/client/improvements-types.js +9 -0
  110. package/dist/client/improvements-types.js.map +1 -0
  111. package/dist/client/improvements.d.ts +29 -0
  112. package/dist/client/improvements.d.ts.map +1 -0
  113. package/dist/client/improvements.js +50 -0
  114. package/dist/client/improvements.js.map +1 -0
  115. package/dist/client/index.d.ts +8 -3
  116. package/dist/client/index.d.ts.map +1 -1
  117. package/dist/client/index.js.map +1 -1
  118. package/dist/client/instances-types.d.ts +92 -0
  119. package/dist/client/instances-types.d.ts.map +1 -1
  120. package/dist/client/instances.d.ts +26 -4
  121. package/dist/client/instances.d.ts.map +1 -1
  122. package/dist/client/instances.js +94 -3
  123. package/dist/client/instances.js.map +1 -1
  124. package/dist/client/loxtep-client.d.ts +48 -3
  125. package/dist/client/loxtep-client.d.ts.map +1 -1
  126. package/dist/client/loxtep-client.js +73 -5
  127. package/dist/client/loxtep-client.js.map +1 -1
  128. package/dist/client/projects-types.d.ts +25 -0
  129. package/dist/client/projects-types.d.ts.map +1 -1
  130. package/dist/client/projects.d.ts +2 -1
  131. package/dist/client/projects.d.ts.map +1 -1
  132. package/dist/client/projects.js +17 -0
  133. package/dist/client/projects.js.map +1 -1
  134. package/dist/client/promises.d.ts +11 -0
  135. package/dist/client/promises.d.ts.map +1 -1
  136. package/dist/client/promises.js +11 -0
  137. package/dist/client/promises.js.map +1 -1
  138. package/dist/client/queue-types.d.ts +15 -2
  139. package/dist/client/queue-types.d.ts.map +1 -1
  140. package/dist/client/queues.d.ts.map +1 -1
  141. package/dist/client/queues.js +3 -14
  142. package/dist/client/queues.js.map +1 -1
  143. package/dist/client/schemas.d.ts +1 -0
  144. package/dist/client/schemas.d.ts.map +1 -1
  145. package/dist/client/schemas.js +4 -0
  146. package/dist/client/schemas.js.map +1 -1
  147. package/dist/client/thesaurus.d.ts +5 -0
  148. package/dist/client/thesaurus.d.ts.map +1 -1
  149. package/dist/client/thesaurus.js +12 -0
  150. package/dist/client/thesaurus.js.map +1 -1
  151. package/dist/codegen/emit.d.ts +25 -0
  152. package/dist/codegen/emit.d.ts.map +1 -0
  153. package/dist/codegen/emit.js +158 -0
  154. package/dist/codegen/emit.js.map +1 -0
  155. package/dist/codegen/index.d.ts +17 -0
  156. package/dist/codegen/index.d.ts.map +1 -0
  157. package/dist/codegen/index.js +16 -0
  158. package/dist/codegen/index.js.map +1 -0
  159. package/dist/codegen/load-workspace-context.d.ts +30 -0
  160. package/dist/codegen/load-workspace-context.d.ts.map +1 -0
  161. package/dist/codegen/load-workspace-context.js +127 -0
  162. package/dist/codegen/load-workspace-context.js.map +1 -0
  163. package/dist/codegen/normalize.d.ts +35 -0
  164. package/dist/codegen/normalize.d.ts.map +1 -0
  165. package/dist/codegen/normalize.js +77 -0
  166. package/dist/codegen/normalize.js.map +1 -0
  167. package/dist/codegen/types.d.ts +89 -0
  168. package/dist/codegen/types.d.ts.map +1 -0
  169. package/dist/codegen/types.js +9 -0
  170. package/dist/codegen/types.js.map +1 -0
  171. package/dist/codegen/write-artifact.d.ts +40 -0
  172. package/dist/codegen/write-artifact.d.ts.map +1 -0
  173. package/dist/codegen/write-artifact.js +74 -0
  174. package/dist/codegen/write-artifact.js.map +1 -0
  175. package/dist/config/index.d.ts +1 -0
  176. package/dist/config/index.d.ts.map +1 -1
  177. package/dist/config/index.js +1 -0
  178. package/dist/config/index.js.map +1 -1
  179. package/dist/config/workspace-config.d.ts +76 -0
  180. package/dist/config/workspace-config.d.ts.map +1 -0
  181. package/dist/config/workspace-config.js +129 -0
  182. package/dist/config/workspace-config.js.map +1 -0
  183. package/dist/index.d.ts +3 -0
  184. package/dist/index.d.ts.map +1 -1
  185. package/dist/index.js +3 -0
  186. package/dist/index.js.map +1 -1
  187. package/dist/rstreams/event-bridge.d.ts +16 -2
  188. package/dist/rstreams/event-bridge.d.ts.map +1 -1
  189. package/dist/rstreams/event-bridge.js +38 -5
  190. package/dist/rstreams/event-bridge.js.map +1 -1
  191. package/dist/skills/check-scope.d.ts +42 -0
  192. package/dist/skills/check-scope.d.ts.map +1 -0
  193. package/dist/skills/check-scope.js +84 -0
  194. package/dist/skills/check-scope.js.map +1 -0
  195. package/dist/skills/index.d.ts +14 -0
  196. package/dist/skills/index.d.ts.map +1 -0
  197. package/dist/skills/index.js +12 -0
  198. package/dist/skills/index.js.map +1 -0
  199. package/dist/skills/loader.d.ts +79 -0
  200. package/dist/skills/loader.d.ts.map +1 -0
  201. package/dist/skills/loader.js +102 -0
  202. package/dist/skills/loader.js.map +1 -0
  203. package/dist/skills/types.d.ts +55 -0
  204. package/dist/skills/types.d.ts.map +1 -0
  205. package/dist/skills/types.js +9 -0
  206. package/dist/skills/types.js.map +1 -0
  207. package/dist/skills/validate-references.d.ts +54 -0
  208. package/dist/skills/validate-references.d.ts.map +1 -0
  209. package/dist/skills/validate-references.js +80 -0
  210. package/dist/skills/validate-references.js.map +1 -0
  211. package/docs/getting-started.md +7 -0
  212. package/package.json +7 -5
  213. package/dist/cli/commands/data-assets-cmd.d.ts +0 -12
  214. package/dist/cli/commands/data-assets-cmd.d.ts.map +0 -1
  215. package/dist/cli/commands/data-assets-cmd.js +0 -75
  216. package/dist/cli/commands/data-assets-cmd.js.map +0 -1
  217. package/dist/cli/commands/pipelines-cmd.d.ts +0 -17
  218. package/dist/cli/commands/pipelines-cmd.d.ts.map +0 -1
  219. package/dist/cli/commands/pipelines-cmd.js +0 -52
  220. package/dist/cli/commands/pipelines-cmd.js.map +0 -1
  221. package/dist/cli/commands/promises-cmd.d.ts +0 -11
  222. package/dist/cli/commands/promises-cmd.d.ts.map +0 -1
  223. package/dist/cli/commands/promises-cmd.js +0 -53
  224. package/dist/cli/commands/promises-cmd.js.map +0 -1
  225. package/dist/client/consumptions-types.d.ts.map +0 -1
  226. package/dist/client/consumptions-types.js +0 -5
  227. package/dist/client/consumptions-types.js.map +0 -1
  228. package/dist/client/consumptions.d.ts +0 -14
  229. package/dist/client/consumptions.d.ts.map +0 -1
  230. package/dist/client/consumptions.js +0 -47
  231. package/dist/client/consumptions.js.map +0 -1
  232. package/dist/client/data-assets-types.d.ts +0 -150
  233. package/dist/client/data-assets-types.d.ts.map +0 -1
  234. package/dist/client/data-assets-types.js +0 -5
  235. package/dist/client/data-assets-types.js.map +0 -1
  236. package/dist/client/data-assets.d.ts +0 -31
  237. package/dist/client/data-assets.d.ts.map +0 -1
  238. package/dist/client/data-assets.js +0 -182
  239. package/dist/client/data-assets.js.map +0 -1
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Skill YAML schema validation and loader.
3
+ *
4
+ * Parses `.loxtep/skills/<name>.yaml` files into validated `SkillDefinition`
5
+ * objects using zod for schema enforcement. Invalid YAML or schema violations
6
+ * produce descriptive errors.
7
+ */
8
+ import { z } from 'zod/v4';
9
+ import type { SkillDefinition } from './types.js';
10
+ declare const SkillDefinitionSchema: z.ZodObject<{
11
+ name: z.ZodString;
12
+ description: z.ZodOptional<z.ZodString>;
13
+ scope: z.ZodObject<{
14
+ data_products: z.ZodOptional<z.ZodArray<z.ZodString>>;
15
+ connectors: z.ZodOptional<z.ZodArray<z.ZodString>>;
16
+ workflows: z.ZodOptional<z.ZodArray<z.ZodString>>;
17
+ domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
18
+ queues: z.ZodOptional<z.ZodArray<z.ZodString>>;
19
+ }, z.core.$strip>;
20
+ permissions: z.ZodObject<{
21
+ data_products: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodEnum<{
22
+ write: "write";
23
+ read: "read";
24
+ create: "create";
25
+ delete: "delete";
26
+ }>>>>;
27
+ connectors: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodEnum<{
28
+ write: "write";
29
+ read: "read";
30
+ create: "create";
31
+ delete: "delete";
32
+ }>>>>;
33
+ workflows: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodEnum<{
34
+ write: "write";
35
+ read: "read";
36
+ create: "create";
37
+ delete: "delete";
38
+ }>>>>;
39
+ domains: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodEnum<{
40
+ write: "write";
41
+ read: "read";
42
+ create: "create";
43
+ delete: "delete";
44
+ }>>>>;
45
+ queues: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodEnum<{
46
+ write: "write";
47
+ read: "read";
48
+ create: "create";
49
+ delete: "delete";
50
+ }>>>>;
51
+ }, z.core.$strip>;
52
+ }, z.core.$strip>;
53
+ export { SkillDefinitionSchema };
54
+ /**
55
+ * Parse a YAML string into a validated SkillDefinition.
56
+ *
57
+ * @param content - Raw YAML content
58
+ * @param filename - Source filename (for error messages)
59
+ * @returns Validated SkillDefinition
60
+ * @throws Error with descriptive message on invalid YAML or schema violations
61
+ */
62
+ export declare function parseSkillYaml(content: string, filename?: string): SkillDefinition;
63
+ /**
64
+ * Load a single skill definition from a YAML file path.
65
+ *
66
+ * @param filePath - Absolute or relative path to the `.yaml` file
67
+ * @returns Validated SkillDefinition
68
+ * @throws Error if file cannot be read or fails validation
69
+ */
70
+ export declare function loadSkillFromFile(filePath: string): SkillDefinition;
71
+ /**
72
+ * Load all skill definitions from a `.loxtep/skills/` directory.
73
+ *
74
+ * @param skillsDir - Path to the skills directory (e.g. `.loxtep/skills/`)
75
+ * @returns Map of skill name → SkillDefinition
76
+ * @throws Error if any file fails to parse or validate
77
+ */
78
+ export declare function loadSkillsFromDirectory(skillsDir: string): Map<string, SkillDefinition>;
79
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAI3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAgBlD,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAWzB,CAAC;AAEH,OAAO,EAAE,qBAAqB,EAAE,CAAC;AAEjC;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,eAAe,CAqBlF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAGnE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAwBvF"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Skill YAML schema validation and loader.
3
+ *
4
+ * Parses `.loxtep/skills/<name>.yaml` files into validated `SkillDefinition`
5
+ * objects using zod for schema enforcement. Invalid YAML or schema violations
6
+ * produce descriptive errors.
7
+ */
8
+ import { z } from 'zod/v4';
9
+ import * as yaml from 'js-yaml';
10
+ import * as fs from 'node:fs';
11
+ import * as path from 'node:path';
12
+ /**
13
+ * Zod schema for a skill definition YAML file.
14
+ * Validates the structure and constraints of skill scope and permissions.
15
+ */
16
+ const OperationSchema = z.enum(['read', 'write', 'create', 'delete']);
17
+ const SkillScopeSchema = z.object({
18
+ data_products: z.array(z.string()).optional(),
19
+ connectors: z.array(z.string()).optional(),
20
+ workflows: z.array(z.string()).optional(),
21
+ domains: z.array(z.string()).optional(),
22
+ queues: z.array(z.string()).optional(),
23
+ });
24
+ const SkillDefinitionSchema = z.object({
25
+ name: z.string().min(1),
26
+ description: z.string().optional(),
27
+ scope: SkillScopeSchema,
28
+ permissions: z.object({
29
+ data_products: z.array(OperationSchema).optional(),
30
+ connectors: z.array(OperationSchema).optional(),
31
+ workflows: z.array(OperationSchema).optional(),
32
+ domains: z.array(OperationSchema).optional(),
33
+ queues: z.array(OperationSchema).optional(),
34
+ }).partial(),
35
+ });
36
+ export { SkillDefinitionSchema };
37
+ /**
38
+ * Parse a YAML string into a validated SkillDefinition.
39
+ *
40
+ * @param content - Raw YAML content
41
+ * @param filename - Source filename (for error messages)
42
+ * @returns Validated SkillDefinition
43
+ * @throws Error with descriptive message on invalid YAML or schema violations
44
+ */
45
+ export function parseSkillYaml(content, filename) {
46
+ let parsed;
47
+ try {
48
+ parsed = yaml.load(content);
49
+ }
50
+ catch (err) {
51
+ const prefix = filename ? `${filename}: ` : '';
52
+ throw new Error(`${prefix}Invalid YAML: ${err instanceof Error ? err.message : String(err)}`);
53
+ }
54
+ const result = SkillDefinitionSchema.safeParse(parsed);
55
+ if (!result.success) {
56
+ const prefix = filename ? `${filename}: ` : '';
57
+ const issues = result.error.issues
58
+ .map((i) => ` - ${i.path.join('.')}: ${i.message}`)
59
+ .join('\n');
60
+ throw new Error(`${prefix}Skill schema validation failed:\n${issues}`);
61
+ }
62
+ return result.data;
63
+ }
64
+ /**
65
+ * Load a single skill definition from a YAML file path.
66
+ *
67
+ * @param filePath - Absolute or relative path to the `.yaml` file
68
+ * @returns Validated SkillDefinition
69
+ * @throws Error if file cannot be read or fails validation
70
+ */
71
+ export function loadSkillFromFile(filePath) {
72
+ const content = fs.readFileSync(filePath, 'utf-8');
73
+ return parseSkillYaml(content, path.basename(filePath));
74
+ }
75
+ /**
76
+ * Load all skill definitions from a `.loxtep/skills/` directory.
77
+ *
78
+ * @param skillsDir - Path to the skills directory (e.g. `.loxtep/skills/`)
79
+ * @returns Map of skill name → SkillDefinition
80
+ * @throws Error if any file fails to parse or validate
81
+ */
82
+ export function loadSkillsFromDirectory(skillsDir) {
83
+ const skills = new Map();
84
+ if (!fs.existsSync(skillsDir)) {
85
+ return skills;
86
+ }
87
+ const entries = fs.readdirSync(skillsDir);
88
+ for (const entry of entries) {
89
+ if (!entry.endsWith('.yaml') && !entry.endsWith('.yml')) {
90
+ continue;
91
+ }
92
+ const filePath = path.join(skillsDir, entry);
93
+ const stat = fs.statSync(filePath);
94
+ if (!stat.isFile()) {
95
+ continue;
96
+ }
97
+ const skill = loadSkillFromFile(filePath);
98
+ skills.set(skill.name, skill);
99
+ }
100
+ return skills;
101
+ }
102
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Skill types for the scoped access model.
3
+ *
4
+ * A skill defines which platform resources and operations an AI agent may
5
+ * reach within a workspace. The scope is fail-closed: any check that cannot
6
+ * complete blocks the operation.
7
+ */
8
+ /**
9
+ * The set of resource types a skill can scope access to.
10
+ * Each key maps to a list of permitted resource identifiers (IDs or names).
11
+ */
12
+ export interface SkillScope {
13
+ data_products?: string[];
14
+ connectors?: string[];
15
+ workflows?: string[];
16
+ domains?: string[];
17
+ queues?: string[];
18
+ }
19
+ /**
20
+ * The set of operations that can be permitted on a resource type.
21
+ */
22
+ export type Operation = 'read' | 'write' | 'create' | 'delete';
23
+ /**
24
+ * A parsed skill definition from `.loxtep/skills/<name>.yaml`.
25
+ */
26
+ export interface SkillDefinition {
27
+ name: string;
28
+ description?: string;
29
+ scope: SkillScope;
30
+ permissions: Partial<Record<keyof SkillScope, Operation[]>>;
31
+ }
32
+ /**
33
+ * The result of a scope check decision.
34
+ * Only `{ allowed: true }` permits execution. All other variants deny.
35
+ */
36
+ export type ScopeDecision = {
37
+ allowed: true;
38
+ } | {
39
+ allowed: false;
40
+ code: 'SCOPE_VIOLATION';
41
+ deniedResource: string;
42
+ } | {
43
+ allowed: false;
44
+ code: 'OPERATION_DENIED';
45
+ deniedOperation: Operation;
46
+ resource: string;
47
+ } | {
48
+ allowed: false;
49
+ code: 'UNKNOWN_SKILL';
50
+ skillName: string;
51
+ } | {
52
+ allowed: false;
53
+ code: 'SCOPE_VALIDATION_FAILED';
54
+ };
55
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;CAC7D;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GACjB;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,eAAe,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC1F;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,yBAAyB,CAAA;CAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Skill types for the scoped access model.
3
+ *
4
+ * A skill defines which platform resources and operations an AI agent may
5
+ * reach within a workspace. The scope is fail-closed: any check that cannot
6
+ * complete blocks the operation.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Generate-time skill validation against the Workspace_Context.
3
+ *
4
+ * During `loxtep generate`, every skill definition file at `.loxtep/skills/*.yaml`
5
+ * is validated against the loaded Workspace_Context. If a skill references a
6
+ * resource that does not exist in the context, `generate` exits non-zero with
7
+ * the skill name and each missing resource identifier.
8
+ *
9
+ * Requirements: 5.8, 5.9
10
+ */
11
+ import type { SkillDefinition, SkillScope } from './types.js';
12
+ import type { WorkspaceContext } from '../codegen/types.js';
13
+ /**
14
+ * A single invalid resource reference found during validation.
15
+ */
16
+ export interface SkillReferenceError {
17
+ /** Name of the skill that contains the invalid reference */
18
+ skillName: string;
19
+ /** Resource type (e.g. 'data_products', 'connectors') */
20
+ resourceType: keyof SkillScope;
21
+ /** The identifier that does not exist in the Workspace_Context */
22
+ missingIdentifier: string;
23
+ }
24
+ /**
25
+ * Result of validating skill references against the workspace context.
26
+ */
27
+ export type SkillValidationResult = {
28
+ valid: true;
29
+ } | {
30
+ valid: false;
31
+ errors: SkillReferenceError[];
32
+ };
33
+ /**
34
+ * Validate all skill resource references against the loaded Workspace_Context.
35
+ *
36
+ * For each skill, every identifier listed in the skill's `scope` is checked
37
+ * against the corresponding resource collection in the context. Resource
38
+ * identifiers in skill scope files are matched by `name` against the workspace
39
+ * context collections.
40
+ *
41
+ * @param skills - Map of skill name → SkillDefinition (loaded from `.loxtep/skills/`)
42
+ * @param context - The Workspace_Context loaded from the platform
43
+ * @returns Validation result: either `{ valid: true }` or `{ valid: false, errors: [...] }`
44
+ */
45
+ export declare function validateSkillReferences(skills: Map<string, SkillDefinition>, context: WorkspaceContext): SkillValidationResult;
46
+ /**
47
+ * Format skill validation errors into human-readable error messages.
48
+ * Each message identifies the skill name, resource type, and missing identifier.
49
+ *
50
+ * @param errors - Array of SkillReferenceError from validation
51
+ * @returns Formatted error messages, one per line
52
+ */
53
+ export declare function formatSkillValidationErrors(errors: SkillReferenceError[]): string;
54
+ //# sourceMappingURL=validate-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-references.d.ts","sourceRoot":"","sources":["../../src/skills/validate-references.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,YAAY,EAAE,MAAM,UAAU,CAAC;IAC/B,kEAAkE;IAClE,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,mBAAmB,EAAE,CAAA;CAAE,CAAC;AA2BpD;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EACpC,OAAO,EAAE,gBAAgB,GACxB,qBAAqB,CA+BvB;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAMjF"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Generate-time skill validation against the Workspace_Context.
3
+ *
4
+ * During `loxtep generate`, every skill definition file at `.loxtep/skills/*.yaml`
5
+ * is validated against the loaded Workspace_Context. If a skill references a
6
+ * resource that does not exist in the context, `generate` exits non-zero with
7
+ * the skill name and each missing resource identifier.
8
+ *
9
+ * Requirements: 5.8, 5.9
10
+ */
11
+ /**
12
+ * Mapping from skill scope resource type keys to the corresponding
13
+ * WorkspaceContext collection keys.
14
+ */
15
+ const RESOURCE_TYPE_TO_CONTEXT_KEY = {
16
+ data_products: 'dataProducts',
17
+ connectors: 'connectors',
18
+ workflows: 'workflows',
19
+ domains: 'domains',
20
+ queues: 'queues',
21
+ };
22
+ /**
23
+ * Extract the set of resource names available in the workspace context
24
+ * for a given resource type.
25
+ */
26
+ function getAvailableNames(context, resourceType) {
27
+ const contextKey = RESOURCE_TYPE_TO_CONTEXT_KEY[resourceType];
28
+ const collection = context[contextKey];
29
+ return new Set(collection.map((r) => r.name));
30
+ }
31
+ /**
32
+ * Validate all skill resource references against the loaded Workspace_Context.
33
+ *
34
+ * For each skill, every identifier listed in the skill's `scope` is checked
35
+ * against the corresponding resource collection in the context. Resource
36
+ * identifiers in skill scope files are matched by `name` against the workspace
37
+ * context collections.
38
+ *
39
+ * @param skills - Map of skill name → SkillDefinition (loaded from `.loxtep/skills/`)
40
+ * @param context - The Workspace_Context loaded from the platform
41
+ * @returns Validation result: either `{ valid: true }` or `{ valid: false, errors: [...] }`
42
+ */
43
+ export function validateSkillReferences(skills, context) {
44
+ const errors = [];
45
+ for (const [, skill] of skills) {
46
+ const resourceTypes = Object.keys(skill.scope);
47
+ for (const resourceType of resourceTypes) {
48
+ const identifiers = skill.scope[resourceType];
49
+ if (!identifiers || identifiers.length === 0) {
50
+ continue;
51
+ }
52
+ const availableNames = getAvailableNames(context, resourceType);
53
+ for (const identifier of identifiers) {
54
+ if (!availableNames.has(identifier)) {
55
+ errors.push({
56
+ skillName: skill.name,
57
+ resourceType,
58
+ missingIdentifier: identifier,
59
+ });
60
+ }
61
+ }
62
+ }
63
+ }
64
+ if (errors.length === 0) {
65
+ return { valid: true };
66
+ }
67
+ return { valid: false, errors };
68
+ }
69
+ /**
70
+ * Format skill validation errors into human-readable error messages.
71
+ * Each message identifies the skill name, resource type, and missing identifier.
72
+ *
73
+ * @param errors - Array of SkillReferenceError from validation
74
+ * @returns Formatted error messages, one per line
75
+ */
76
+ export function formatSkillValidationErrors(errors) {
77
+ const lines = errors.map((e) => `Skill "${e.skillName}": references ${e.resourceType} "${e.missingIdentifier}" which does not exist in the workspace context`);
78
+ return lines.join('\n');
79
+ }
80
+ //# sourceMappingURL=validate-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-references.js","sourceRoot":"","sources":["../../src/skills/validate-references.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAwBH;;;GAGG;AACH,MAAM,4BAA4B,GAAqD;IACrF,aAAa,EAAE,cAAc;IAC7B,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF;;;GAGG;AACH,SAAS,iBAAiB,CACxB,OAAyB,EACzB,YAA8B;IAE9B,MAAM,UAAU,GAAG,4BAA4B,CAAC,YAAY,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAuB,CAAC;IAC7D,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAoC,EACpC,OAAyB;IAEzB,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAyB,CAAC;QAEvE,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEhE,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBACpC,MAAM,CAAC,IAAI,CAAC;wBACV,SAAS,EAAE,KAAK,CAAC,IAAI;wBACrB,YAAY;wBACZ,iBAAiB,EAAE,UAAU;qBAC9B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAA6B;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CACtB,CAAC,CAAC,EAAE,EAAE,CACJ,UAAU,CAAC,CAAC,SAAS,iBAAiB,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,iBAAiB,iDAAiD,CAChI,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -4,6 +4,13 @@ Get from zero to your first event in under 5 minutes. This guide walks you
4
4
  through installing the Loxtep SDK, authenticating, and writing your first event
5
5
  to a data product — all with a single method call.
6
6
 
7
+ > **Other paths:** This guide covers the **programmatic SDK** path. Loxtep also
8
+ > supports an [Agent-first (MCP)](https://github.com/LoxtepInc/loxtep-plugins-skills)
9
+ > path for conversational operation, a **Code-first CLI** path
10
+ > (`loxtep init → attach → generate → test → deploy`) for workflow authoring,
11
+ > and a **Web UI** for visual management. See the
12
+ > [Loxtep Quickstart](https://docs.loxtep.io/quickstart) for all paths.
13
+
7
14
  ## Table of Contents
8
15
 
9
16
  - [Prerequisites](#prerequisites)
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@loxtep/sdk",
3
- "version": "0.2.3",
4
- "description": "Loxtep SDK for Node.js - data products, flows, projects, queues",
3
+ "version": "0.4.0",
4
+ "description": "Loxtep SDK for Node.js the Enterprise Context Layer: data products, flows, projects, queues, and machine-usable context for AI",
5
5
  "author": "Loxtep <engineering@loxtep.io>",
6
6
  "homepage": "https://loxtep.io",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "https://github.com/loxtepinc/loxtep-sdk.git",
9
+ "url": "https://github.com/LoxtepInc/loxtep-sdk.git",
10
10
  "directory": "nodejs"
11
11
  },
12
12
  "bugs": {
@@ -78,17 +78,19 @@
78
78
  "@smithy/protocol-http": "^5.4.3",
79
79
  "@smithy/signature-v4": "^5.4.3",
80
80
  "@smithy/types": "^4.14.2",
81
- "leo-sdk": "7.1.12"
81
+ "js-yaml": "4.1.0",
82
+ "leo-sdk": "7.1.12",
83
+ "zod": "^4.4.3"
82
84
  },
83
85
  "devDependencies": {
84
86
  "@types/jest": "^30.0.0",
87
+ "@types/js-yaml": "4.0.9",
85
88
  "fast-check": "^4.8.0",
86
89
  "jest": "^30.4.2",
87
90
  "ts-jest": "^29.4.9",
88
91
  "tsx": "^4.22.0",
89
92
  "typedoc": "^0.28.19",
90
93
  "typescript": "^6.0.3",
91
- "zod": "^4.4.3",
92
94
  "zod-to-ts": "^2.0.0"
93
95
  }
94
96
  }
@@ -1,12 +0,0 @@
1
- /**
2
- * CLI: loxtep data-assets list | data-assets get <id>
3
- */
4
- export interface DataAssetsCmdOptions {
5
- configFilePath?: string;
6
- credentialsPath?: string;
7
- }
8
- export declare function runDataAssetsList(options?: DataAssetsCmdOptions): Promise<void>;
9
- export declare function runDataAssetsGet(dataAssetId: string, options?: DataAssetsCmdOptions): Promise<void>;
10
- export declare function runDataAssetsQuery(dataAssetId: string, sql: string, options?: DataAssetsCmdOptions): Promise<void>;
11
- export declare function runDataAssetsTables(dataAssetId: string, options?: DataAssetsCmdOptions): Promise<void>;
12
- //# sourceMappingURL=data-assets-cmd.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-assets-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/data-assets-cmd.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBzF;AAED,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -1,75 +0,0 @@
1
- /**
2
- * CLI: loxtep data-assets list | data-assets get <id>
3
- */
4
- import { loadConfig } from '../../config/load.js';
5
- import { readCredentials } from '../credentials.js';
6
- import { LoxtepClient } from '../../client/loxtep-client.js';
7
- export async function runDataAssetsList(options = {}) {
8
- const config = await loadConfig(options.configFilePath);
9
- const creds = await readCredentials(options.credentialsPath);
10
- if (!config.api_url || !creds?.access_token) {
11
- console.error('Missing api_url or not logged in. Run: loxtep config set api_url <url> ; loxtep login');
12
- process.exitCode = 1;
13
- return;
14
- }
15
- const client = new LoxtepClient({
16
- api_url: config.api_url,
17
- auth: { type: 'jwt', token: creds.access_token ?? '' },
18
- get_token: async () => creds.access_token ?? null,
19
- credentials: { accessKeyId: 'cli', secretAccessKey: 'cli' },
20
- });
21
- const result = await client.data_assets.list({ page_size: 20 });
22
- console.log(JSON.stringify(result, null, 2));
23
- }
24
- export async function runDataAssetsGet(dataAssetId, options = {}) {
25
- const config = await loadConfig(options.configFilePath);
26
- const creds = await readCredentials(options.credentialsPath);
27
- if (!config.api_url || !creds?.access_token) {
28
- console.error('Missing api_url or not logged in. Run: loxtep config set api_url <url> ; loxtep login');
29
- process.exitCode = 1;
30
- return;
31
- }
32
- const client = new LoxtepClient({
33
- api_url: config.api_url,
34
- auth: { type: 'jwt', token: creds.access_token ?? '' },
35
- get_token: async () => creds.access_token ?? null,
36
- credentials: { accessKeyId: 'cli', secretAccessKey: 'cli' },
37
- });
38
- const asset = await client.data_assets.get(dataAssetId);
39
- console.log(JSON.stringify(asset, null, 2));
40
- }
41
- export async function runDataAssetsQuery(dataAssetId, sql, options = {}) {
42
- const config = await loadConfig(options.configFilePath);
43
- const creds = await readCredentials(options.credentialsPath);
44
- if (!config.api_url || !creds?.access_token) {
45
- console.error('Missing api_url or not logged in. Run: loxtep config set api_url <url> ; loxtep login');
46
- process.exitCode = 1;
47
- return;
48
- }
49
- const client = new LoxtepClient({
50
- api_url: config.api_url,
51
- auth: { type: 'jwt', token: creds.access_token ?? '' },
52
- get_token: async () => creds.access_token ?? null,
53
- credentials: { accessKeyId: 'cli', secretAccessKey: 'cli' },
54
- });
55
- const result = await client.data_assets.query(dataAssetId, sql);
56
- console.log(JSON.stringify(result, null, 2));
57
- }
58
- export async function runDataAssetsTables(dataAssetId, options = {}) {
59
- const config = await loadConfig(options.configFilePath);
60
- const creds = await readCredentials(options.credentialsPath);
61
- if (!config.api_url || !creds?.access_token) {
62
- console.error('Missing api_url or not logged in. Run: loxtep config set api_url <url> ; loxtep login');
63
- process.exitCode = 1;
64
- return;
65
- }
66
- const client = new LoxtepClient({
67
- api_url: config.api_url,
68
- auth: { type: 'jwt', token: creds.access_token ?? '' },
69
- get_token: async () => creds.access_token ?? null,
70
- credentials: { accessKeyId: 'cli', secretAccessKey: 'cli' },
71
- });
72
- const result = await client.data_assets.list_tables(dataAssetId);
73
- console.log(JSON.stringify(result, null, 2));
74
- }
75
- //# sourceMappingURL=data-assets-cmd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-assets-cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/data-assets-cmd.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * CLI: loxtep pipelines list [--project-id <id>] | pipelines deploy --project-id <id> --instance-id <id> [--version-id <id>] [--force]
3
- */
4
- export interface PipelinesCmdOptions {
5
- configFilePath?: string;
6
- credentialsPath?: string;
7
- }
8
- export declare function runPipelinesList(options?: PipelinesCmdOptions & {
9
- project_id?: string;
10
- }): Promise<void>;
11
- export declare function runPipelinesDeploy(params: {
12
- project_id: string;
13
- instance_id: string;
14
- version_id?: string;
15
- force_redeploy?: boolean;
16
- }, options?: PipelinesCmdOptions): Promise<void>;
17
- //# sourceMappingURL=pipelines-cmd.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pipelines-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/pipelines-cmd.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAgBD,wBAAsB,gBAAgB,CACpC,OAAO,GAAE,mBAAmB,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1D,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE;IACN,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,EACD,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -1,52 +0,0 @@
1
- /**
2
- * CLI: loxtep pipelines list [--project-id <id>] | pipelines deploy --project-id <id> --instance-id <id> [--version-id <id>] [--force]
3
- */
4
- import { loadConfig } from '../../config/load.js';
5
- import { readCredentials } from '../credentials.js';
6
- import { LoxtepClient } from '../../client/loxtep-client.js';
7
- function createClient(config, creds) {
8
- return new LoxtepClient({
9
- api_url: config.api_url,
10
- auth: { type: 'jwt', token: creds.access_token ?? '' },
11
- get_token: async () => creds.access_token ?? null,
12
- credentials: { accessKeyId: 'cli', secretAccessKey: 'cli' },
13
- organization_id: config.organization_id,
14
- project_id: config.project_id,
15
- });
16
- }
17
- export async function runPipelinesList(options = {}) {
18
- const config = await loadConfig(options.configFilePath);
19
- const creds = await readCredentials(options.credentialsPath);
20
- if (!config.api_url || !creds?.access_token) {
21
- console.error('Missing api_url or not logged in. Run: loxtep config set api_url <url> ; loxtep login');
22
- process.exitCode = 1;
23
- return;
24
- }
25
- const projectId = options.project_id ?? config.project_id;
26
- if (!projectId) {
27
- console.error('Missing project_id. Use: loxtep pipelines list --project-id <id> or loxtep config set project_id <id>');
28
- process.exitCode = 1;
29
- return;
30
- }
31
- const client = createClient(config, creds);
32
- const result = await client.pipelines.listPipelines({ project_id: projectId, page_size: 50 });
33
- console.log(JSON.stringify(result, null, 2));
34
- }
35
- export async function runPipelinesDeploy(params, options = {}) {
36
- const config = await loadConfig(options.configFilePath);
37
- const creds = await readCredentials(options.credentialsPath);
38
- if (!config.api_url || !creds?.access_token) {
39
- console.error('Missing api_url or not logged in. Run: loxtep config set api_url <url> ; loxtep login');
40
- process.exitCode = 1;
41
- return;
42
- }
43
- const client = createClient(config, creds);
44
- const result = await client.pipelines.deploy({
45
- project_id: params.project_id,
46
- instance_id: params.instance_id,
47
- version_id: params.version_id,
48
- force_redeploy: params.force_redeploy ?? false,
49
- });
50
- console.log(JSON.stringify(result, null, 2));
51
- }
52
- //# sourceMappingURL=pipelines-cmd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pipelines-cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/pipelines-cmd.ts"],"names":[],"mappings":"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"}