@kapeta/local-cluster-service 0.48.2 → 0.48.3

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [0.48.3](https://github.com/kapetacom/local-cluster-service/compare/v0.48.2...v0.48.3) (2024-06-03)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Added missing instance and block refs ([dc77a7c](https://github.com/kapetacom/local-cluster-service/commit/dc77a7c480d4ed70e1dc8dc5c1b13093d739e20c))
7
+
1
8
  ## [0.48.2](https://github.com/kapetacom/local-cluster-service/compare/v0.48.1...v0.48.2) (2024-06-03)
2
9
 
3
10
 
@@ -34,6 +34,7 @@ exports.StormCodegen = void 0;
34
34
  const codegen_1 = require("@kapeta/codegen");
35
35
  const codeGeneratorManager_1 = require("../codeGeneratorManager");
36
36
  const stormClient_1 = require("./stormClient");
37
+ const event_parser_1 = require("./event-parser");
37
38
  const stream_1 = require("./stream");
38
39
  const promises_1 = require("fs/promises");
39
40
  const path_1 = __importStar(require("path"));
@@ -70,6 +71,7 @@ class StormCodegen {
70
71
  handleUiOutput(blockUri, aiName, data) {
71
72
  switch (data.type) {
72
73
  case 'SCREEN':
74
+ const ref = blockUri.toNormalizedString();
73
75
  this.out.emit('data', {
74
76
  type: 'SCREEN',
75
77
  reason: data.reason,
@@ -77,6 +79,8 @@ class StormCodegen {
77
79
  payload: {
78
80
  ...data.payload,
79
81
  blockName: aiName,
82
+ blockRef: ref,
83
+ instanceId: event_parser_1.StormEventParser.toInstanceIdFromRef(ref),
80
84
  },
81
85
  });
82
86
  case 'FILE':
@@ -86,6 +90,7 @@ class StormCodegen {
86
90
  handleFileOutput(blockUri, aiName, data) {
87
91
  switch (data.type) {
88
92
  case 'FILE':
93
+ const ref = blockUri.toNormalizedString();
89
94
  this.emitFile(blockUri, aiName, data.payload.filename, data.payload.content, data.reason);
90
95
  return {
91
96
  type: 'FILE',
@@ -93,6 +98,8 @@ class StormCodegen {
93
98
  payload: {
94
99
  filename: data.payload.filename,
95
100
  content: data.payload.content,
101
+ blockRef: ref,
102
+ instanceId: event_parser_1.StormEventParser.toInstanceIdFromRef(ref),
96
103
  },
97
104
  };
98
105
  }
@@ -171,6 +178,7 @@ class StormCodegen {
171
178
  }
172
179
  emitFile(uri, blockName, filename, content, reason = 'File generated') {
173
180
  const basePath = this.getBasePath(uri.fullName);
181
+ const ref = uri.toNormalizedString();
174
182
  this.out.emit('data', {
175
183
  type: 'FILE',
176
184
  reason,
@@ -180,7 +188,8 @@ class StormCodegen {
180
188
  path: (0, path_1.join)(basePath, filename),
181
189
  content: content,
182
190
  blockName,
183
- blockRef: uri.toNormalizedString(),
191
+ blockRef: ref,
192
+ instanceId: event_parser_1.StormEventParser.toInstanceIdFromRef(ref),
184
193
  },
185
194
  });
186
195
  }
@@ -41,6 +41,10 @@ export interface StormOptions {
41
41
  }
42
42
  export declare function resolveOptions(): Promise<StormOptions>;
43
43
  export declare class StormEventParser {
44
+ static toInstanceId(handle: string, blockName: string): string;
45
+ static toInstanceIdFromRef(ref: string): string;
46
+ static toSafeName(name: string): string;
47
+ static toRef(handle: string, name: string): KapetaURI;
44
48
  private events;
45
49
  private planName;
46
50
  private planDescription;
@@ -58,11 +62,7 @@ export declare class StormEventParser {
58
62
  getEvents(): StormEvent[];
59
63
  isValid(): boolean;
60
64
  getError(): string;
61
- private toInstanceId;
62
- private toInstanceIdFromRef;
63
65
  toResult(handle: string): StormDefinitions;
64
- private toSafeName;
65
- private toRef;
66
66
  toBlockDefinitions(handle: string): {
67
67
  [key: string]: BlockDefinitionInfo;
68
68
  };
@@ -105,6 +105,19 @@ async function resolveOptions() {
105
105
  }
106
106
  exports.resolveOptions = resolveOptions;
107
107
  class StormEventParser {
108
+ static toInstanceId(handle, blockName) {
109
+ const ref = this.toRef(handle, blockName);
110
+ return this.toInstanceIdFromRef(ref.toNormalizedString());
111
+ }
112
+ static toInstanceIdFromRef(ref) {
113
+ return (0, uuid_1.v5)((0, nodejs_utils_1.normalizeKapetaUri)(ref), uuid_1.v5.URL);
114
+ }
115
+ static toSafeName(name) {
116
+ return name.toLowerCase().replace(/[^0-9a-z-]/gi, '');
117
+ }
118
+ static toRef(handle, name) {
119
+ return (0, nodejs_utils_1.parseKapetaUri)(handle + '/' + this.toSafeName(name) + ':local');
120
+ }
108
121
  events = [];
109
122
  planName = '';
110
123
  planDescription = '';
@@ -141,8 +154,8 @@ class StormEventParser {
141
154
  models: [],
142
155
  types: [],
143
156
  };
144
- evt.payload.blockRef = this.toRef(handle, evt.payload.name).toNormalizedString();
145
- evt.payload.instanceId = this.toInstanceIdFromRef(evt.payload.blockRef);
157
+ evt.payload.blockRef = StormEventParser.toRef(handle, evt.payload.name).toNormalizedString();
158
+ evt.payload.instanceId = StormEventParser.toInstanceIdFromRef(evt.payload.blockRef);
146
159
  break;
147
160
  case 'PLAN_RETRY':
148
161
  this.reset();
@@ -154,27 +167,27 @@ class StormEventParser {
154
167
  case 'CREATE_API':
155
168
  blockInfo = this.blocks[evt.payload.blockName];
156
169
  blockInfo.apis.push(prettifyKaplang(evt.payload.content));
157
- evt.payload.blockRef = this.toRef(handle, evt.payload.blockName).toNormalizedString();
158
- evt.payload.instanceId = this.toInstanceIdFromRef(evt.payload.blockRef);
170
+ evt.payload.blockRef = StormEventParser.toRef(handle, evt.payload.blockName).toNormalizedString();
171
+ evt.payload.instanceId = StormEventParser.toInstanceIdFromRef(evt.payload.blockRef);
159
172
  const api = blockInfo.resources.find((r) => r.type == 'API');
160
173
  evt.payload.resourceName = api?.name;
161
174
  break;
162
175
  case 'CREATE_MODEL':
163
176
  blockInfo = this.blocks[evt.payload.blockName];
164
177
  blockInfo.models.push(prettifyKaplang(evt.payload.content));
165
- evt.payload.blockRef = this.toRef(handle, evt.payload.blockName).toNormalizedString();
166
- evt.payload.instanceId = this.toInstanceIdFromRef(evt.payload.blockRef);
178
+ evt.payload.blockRef = StormEventParser.toRef(handle, evt.payload.blockName).toNormalizedString();
179
+ evt.payload.instanceId = StormEventParser.toInstanceIdFromRef(evt.payload.blockRef);
167
180
  const database = blockInfo.resources.find((r) => r.type == 'DATABASE');
168
181
  evt.payload.resourceName = database?.name;
169
182
  break;
170
183
  case 'CREATE_TYPE':
171
184
  this.blocks[evt.payload.blockName].types.push(prettifyKaplang(evt.payload.content));
172
- evt.payload.blockRef = this.toRef(handle, evt.payload.blockName).toNormalizedString();
173
- evt.payload.instanceId = this.toInstanceIdFromRef(evt.payload.blockRef);
185
+ evt.payload.blockRef = StormEventParser.toRef(handle, evt.payload.blockName).toNormalizedString();
186
+ evt.payload.instanceId = StormEventParser.toInstanceIdFromRef(evt.payload.blockRef);
174
187
  break;
175
188
  case 'CREATE_CONNECTION':
176
- evt.payload.fromBlockId = this.toInstanceId(handle, evt.payload.fromComponent);
177
- evt.payload.toBlockId = this.toInstanceId(handle, evt.payload.toComponent);
189
+ evt.payload.fromBlockId = StormEventParser.toInstanceId(handle, evt.payload.fromComponent);
190
+ evt.payload.toBlockId = StormEventParser.toInstanceId(handle, evt.payload.toComponent);
178
191
  this.connections.push(evt.payload);
179
192
  break;
180
193
  default:
@@ -196,20 +209,13 @@ class StormEventParser {
196
209
  getError() {
197
210
  return this.error;
198
211
  }
199
- toInstanceId(handle, blockName) {
200
- const ref = this.toRef(handle, blockName);
201
- return this.toInstanceIdFromRef(ref.toNormalizedString());
202
- }
203
- toInstanceIdFromRef(ref) {
204
- return (0, uuid_1.v5)((0, nodejs_utils_1.normalizeKapetaUri)(ref), uuid_1.v5.URL);
205
- }
206
212
  toResult(handle) {
207
- const planRef = this.toRef(handle, this.planName ?? 'undefined');
213
+ const planRef = StormEventParser.toRef(handle, this.planName ?? 'undefined');
208
214
  const blockDefinitions = this.toBlockDefinitions(handle);
209
215
  const refIdMap = {};
210
216
  const blocks = Object.entries(blockDefinitions).map(([ref, block]) => {
211
217
  // Create a deterministic uuid
212
- const id = this.toInstanceIdFromRef(ref);
218
+ const id = StormEventParser.toInstanceIdFromRef(ref);
213
219
  refIdMap[ref] = id;
214
220
  return {
215
221
  id,
@@ -229,8 +235,8 @@ class StormEventParser {
229
235
  this.connections
230
236
  .filter((connection) => connection.fromResourceType === 'API' && connection.toResourceType === 'CLIENT')
231
237
  .forEach((apiConnection) => {
232
- const apiProviderRef = this.toRef(handle, apiConnection.fromComponent);
233
- const clientConsumerRef = this.toRef(handle, apiConnection.toComponent);
238
+ const apiProviderRef = StormEventParser.toRef(handle, apiConnection.fromComponent);
239
+ const clientConsumerRef = StormEventParser.toRef(handle, apiConnection.toComponent);
234
240
  const apiProviderBlock = blockDefinitions[apiProviderRef.toNormalizedString()];
235
241
  if (!apiProviderBlock) {
236
242
  console.warn('API provider not found: %s', apiConnection.fromComponent, apiConnection);
@@ -283,8 +289,8 @@ class StormEventParser {
283
289
  clientResource.spec.source = apiResource.spec.source;
284
290
  });
285
291
  const connections = this.connections.map((connection) => {
286
- const fromRef = this.toRef(handle, connection.fromComponent);
287
- const toRef = this.toRef(handle, connection.toComponent);
292
+ const fromRef = StormEventParser.toRef(handle, connection.fromComponent);
293
+ const toRef = StormEventParser.toRef(handle, connection.toComponent);
288
294
  return {
289
295
  port: {
290
296
  type: this.toPortType(connection.fromResourceType),
@@ -317,16 +323,10 @@ class StormEventParser {
317
323
  blocks: Object.values(blockDefinitions),
318
324
  };
319
325
  }
320
- toSafeName(name) {
321
- return name.toLowerCase().replace(/[^0-9a-z-]/gi, '');
322
- }
323
- toRef(handle, name) {
324
- return (0, nodejs_utils_1.parseKapetaUri)(handle + '/' + this.toSafeName(name) + ':local');
325
- }
326
326
  toBlockDefinitions(handle) {
327
327
  const result = {};
328
328
  Object.entries(this.blocks).forEach(([, blockInfo]) => {
329
- const blockRef = this.toRef(handle, blockInfo.name);
329
+ const blockRef = StormEventParser.toRef(handle, blockInfo.name);
330
330
  const blockDefinitionInfo = {
331
331
  uri: blockRef,
332
332
  aiName: blockInfo.name,
@@ -530,7 +530,7 @@ class StormEventParser {
530
530
  if (connection.fromResourceType !== 'API') {
531
531
  return;
532
532
  }
533
- const fromRef = this.toRef(handle, connection.fromComponent);
533
+ const fromRef = StormEventParser.toRef(handle, connection.fromComponent);
534
534
  const apiProviderBlock = blockDefinitions[fromRef.toNormalizedString()];
535
535
  if (!apiProviderBlock) {
536
536
  console.warn('Provider block not found: %s', connection.fromComponent, connection);
@@ -585,8 +585,8 @@ class StormEventParser {
585
585
  }
586
586
  let options = {};
587
587
  if (kind.includes('java')) {
588
- const groupId = `ai.${this.toSafeName(handle)}`;
589
- const artifactId = this.toSafeName(this.planName);
588
+ const groupId = `ai.${StormEventParser.toSafeName(handle)}`;
589
+ const artifactId = StormEventParser.toSafeName(this.planName);
590
590
  options = {
591
591
  groupId,
592
592
  artifactId,
@@ -112,6 +112,8 @@ export interface StormEventScreen {
112
112
  created: number;
113
113
  payload: {
114
114
  blockName: string;
115
+ blockRef?: string;
116
+ instanceId?: string;
115
117
  name: string;
116
118
  template: string;
117
119
  description: string;
@@ -138,6 +140,7 @@ export interface StormEventFile {
138
140
  content: string;
139
141
  blockName: string;
140
142
  blockRef: string;
143
+ instanceId: string;
141
144
  };
142
145
  }
143
146
  export interface StormEventDone {
@@ -34,6 +34,7 @@ exports.StormCodegen = void 0;
34
34
  const codegen_1 = require("@kapeta/codegen");
35
35
  const codeGeneratorManager_1 = require("../codeGeneratorManager");
36
36
  const stormClient_1 = require("./stormClient");
37
+ const event_parser_1 = require("./event-parser");
37
38
  const stream_1 = require("./stream");
38
39
  const promises_1 = require("fs/promises");
39
40
  const path_1 = __importStar(require("path"));
@@ -70,6 +71,7 @@ class StormCodegen {
70
71
  handleUiOutput(blockUri, aiName, data) {
71
72
  switch (data.type) {
72
73
  case 'SCREEN':
74
+ const ref = blockUri.toNormalizedString();
73
75
  this.out.emit('data', {
74
76
  type: 'SCREEN',
75
77
  reason: data.reason,
@@ -77,6 +79,8 @@ class StormCodegen {
77
79
  payload: {
78
80
  ...data.payload,
79
81
  blockName: aiName,
82
+ blockRef: ref,
83
+ instanceId: event_parser_1.StormEventParser.toInstanceIdFromRef(ref),
80
84
  },
81
85
  });
82
86
  case 'FILE':
@@ -86,6 +90,7 @@ class StormCodegen {
86
90
  handleFileOutput(blockUri, aiName, data) {
87
91
  switch (data.type) {
88
92
  case 'FILE':
93
+ const ref = blockUri.toNormalizedString();
89
94
  this.emitFile(blockUri, aiName, data.payload.filename, data.payload.content, data.reason);
90
95
  return {
91
96
  type: 'FILE',
@@ -93,6 +98,8 @@ class StormCodegen {
93
98
  payload: {
94
99
  filename: data.payload.filename,
95
100
  content: data.payload.content,
101
+ blockRef: ref,
102
+ instanceId: event_parser_1.StormEventParser.toInstanceIdFromRef(ref),
96
103
  },
97
104
  };
98
105
  }
@@ -171,6 +178,7 @@ class StormCodegen {
171
178
  }
172
179
  emitFile(uri, blockName, filename, content, reason = 'File generated') {
173
180
  const basePath = this.getBasePath(uri.fullName);
181
+ const ref = uri.toNormalizedString();
174
182
  this.out.emit('data', {
175
183
  type: 'FILE',
176
184
  reason,
@@ -180,7 +188,8 @@ class StormCodegen {
180
188
  path: (0, path_1.join)(basePath, filename),
181
189
  content: content,
182
190
  blockName,
183
- blockRef: uri.toNormalizedString(),
191
+ blockRef: ref,
192
+ instanceId: event_parser_1.StormEventParser.toInstanceIdFromRef(ref),
184
193
  },
185
194
  });
186
195
  }
@@ -41,6 +41,10 @@ export interface StormOptions {
41
41
  }
42
42
  export declare function resolveOptions(): Promise<StormOptions>;
43
43
  export declare class StormEventParser {
44
+ static toInstanceId(handle: string, blockName: string): string;
45
+ static toInstanceIdFromRef(ref: string): string;
46
+ static toSafeName(name: string): string;
47
+ static toRef(handle: string, name: string): KapetaURI;
44
48
  private events;
45
49
  private planName;
46
50
  private planDescription;
@@ -58,11 +62,7 @@ export declare class StormEventParser {
58
62
  getEvents(): StormEvent[];
59
63
  isValid(): boolean;
60
64
  getError(): string;
61
- private toInstanceId;
62
- private toInstanceIdFromRef;
63
65
  toResult(handle: string): StormDefinitions;
64
- private toSafeName;
65
- private toRef;
66
66
  toBlockDefinitions(handle: string): {
67
67
  [key: string]: BlockDefinitionInfo;
68
68
  };
@@ -105,6 +105,19 @@ async function resolveOptions() {
105
105
  }
106
106
  exports.resolveOptions = resolveOptions;
107
107
  class StormEventParser {
108
+ static toInstanceId(handle, blockName) {
109
+ const ref = this.toRef(handle, blockName);
110
+ return this.toInstanceIdFromRef(ref.toNormalizedString());
111
+ }
112
+ static toInstanceIdFromRef(ref) {
113
+ return (0, uuid_1.v5)((0, nodejs_utils_1.normalizeKapetaUri)(ref), uuid_1.v5.URL);
114
+ }
115
+ static toSafeName(name) {
116
+ return name.toLowerCase().replace(/[^0-9a-z-]/gi, '');
117
+ }
118
+ static toRef(handle, name) {
119
+ return (0, nodejs_utils_1.parseKapetaUri)(handle + '/' + this.toSafeName(name) + ':local');
120
+ }
108
121
  events = [];
109
122
  planName = '';
110
123
  planDescription = '';
@@ -141,8 +154,8 @@ class StormEventParser {
141
154
  models: [],
142
155
  types: [],
143
156
  };
144
- evt.payload.blockRef = this.toRef(handle, evt.payload.name).toNormalizedString();
145
- evt.payload.instanceId = this.toInstanceIdFromRef(evt.payload.blockRef);
157
+ evt.payload.blockRef = StormEventParser.toRef(handle, evt.payload.name).toNormalizedString();
158
+ evt.payload.instanceId = StormEventParser.toInstanceIdFromRef(evt.payload.blockRef);
146
159
  break;
147
160
  case 'PLAN_RETRY':
148
161
  this.reset();
@@ -154,27 +167,27 @@ class StormEventParser {
154
167
  case 'CREATE_API':
155
168
  blockInfo = this.blocks[evt.payload.blockName];
156
169
  blockInfo.apis.push(prettifyKaplang(evt.payload.content));
157
- evt.payload.blockRef = this.toRef(handle, evt.payload.blockName).toNormalizedString();
158
- evt.payload.instanceId = this.toInstanceIdFromRef(evt.payload.blockRef);
170
+ evt.payload.blockRef = StormEventParser.toRef(handle, evt.payload.blockName).toNormalizedString();
171
+ evt.payload.instanceId = StormEventParser.toInstanceIdFromRef(evt.payload.blockRef);
159
172
  const api = blockInfo.resources.find((r) => r.type == 'API');
160
173
  evt.payload.resourceName = api?.name;
161
174
  break;
162
175
  case 'CREATE_MODEL':
163
176
  blockInfo = this.blocks[evt.payload.blockName];
164
177
  blockInfo.models.push(prettifyKaplang(evt.payload.content));
165
- evt.payload.blockRef = this.toRef(handle, evt.payload.blockName).toNormalizedString();
166
- evt.payload.instanceId = this.toInstanceIdFromRef(evt.payload.blockRef);
178
+ evt.payload.blockRef = StormEventParser.toRef(handle, evt.payload.blockName).toNormalizedString();
179
+ evt.payload.instanceId = StormEventParser.toInstanceIdFromRef(evt.payload.blockRef);
167
180
  const database = blockInfo.resources.find((r) => r.type == 'DATABASE');
168
181
  evt.payload.resourceName = database?.name;
169
182
  break;
170
183
  case 'CREATE_TYPE':
171
184
  this.blocks[evt.payload.blockName].types.push(prettifyKaplang(evt.payload.content));
172
- evt.payload.blockRef = this.toRef(handle, evt.payload.blockName).toNormalizedString();
173
- evt.payload.instanceId = this.toInstanceIdFromRef(evt.payload.blockRef);
185
+ evt.payload.blockRef = StormEventParser.toRef(handle, evt.payload.blockName).toNormalizedString();
186
+ evt.payload.instanceId = StormEventParser.toInstanceIdFromRef(evt.payload.blockRef);
174
187
  break;
175
188
  case 'CREATE_CONNECTION':
176
- evt.payload.fromBlockId = this.toInstanceId(handle, evt.payload.fromComponent);
177
- evt.payload.toBlockId = this.toInstanceId(handle, evt.payload.toComponent);
189
+ evt.payload.fromBlockId = StormEventParser.toInstanceId(handle, evt.payload.fromComponent);
190
+ evt.payload.toBlockId = StormEventParser.toInstanceId(handle, evt.payload.toComponent);
178
191
  this.connections.push(evt.payload);
179
192
  break;
180
193
  default:
@@ -196,20 +209,13 @@ class StormEventParser {
196
209
  getError() {
197
210
  return this.error;
198
211
  }
199
- toInstanceId(handle, blockName) {
200
- const ref = this.toRef(handle, blockName);
201
- return this.toInstanceIdFromRef(ref.toNormalizedString());
202
- }
203
- toInstanceIdFromRef(ref) {
204
- return (0, uuid_1.v5)((0, nodejs_utils_1.normalizeKapetaUri)(ref), uuid_1.v5.URL);
205
- }
206
212
  toResult(handle) {
207
- const planRef = this.toRef(handle, this.planName ?? 'undefined');
213
+ const planRef = StormEventParser.toRef(handle, this.planName ?? 'undefined');
208
214
  const blockDefinitions = this.toBlockDefinitions(handle);
209
215
  const refIdMap = {};
210
216
  const blocks = Object.entries(blockDefinitions).map(([ref, block]) => {
211
217
  // Create a deterministic uuid
212
- const id = this.toInstanceIdFromRef(ref);
218
+ const id = StormEventParser.toInstanceIdFromRef(ref);
213
219
  refIdMap[ref] = id;
214
220
  return {
215
221
  id,
@@ -229,8 +235,8 @@ class StormEventParser {
229
235
  this.connections
230
236
  .filter((connection) => connection.fromResourceType === 'API' && connection.toResourceType === 'CLIENT')
231
237
  .forEach((apiConnection) => {
232
- const apiProviderRef = this.toRef(handle, apiConnection.fromComponent);
233
- const clientConsumerRef = this.toRef(handle, apiConnection.toComponent);
238
+ const apiProviderRef = StormEventParser.toRef(handle, apiConnection.fromComponent);
239
+ const clientConsumerRef = StormEventParser.toRef(handle, apiConnection.toComponent);
234
240
  const apiProviderBlock = blockDefinitions[apiProviderRef.toNormalizedString()];
235
241
  if (!apiProviderBlock) {
236
242
  console.warn('API provider not found: %s', apiConnection.fromComponent, apiConnection);
@@ -283,8 +289,8 @@ class StormEventParser {
283
289
  clientResource.spec.source = apiResource.spec.source;
284
290
  });
285
291
  const connections = this.connections.map((connection) => {
286
- const fromRef = this.toRef(handle, connection.fromComponent);
287
- const toRef = this.toRef(handle, connection.toComponent);
292
+ const fromRef = StormEventParser.toRef(handle, connection.fromComponent);
293
+ const toRef = StormEventParser.toRef(handle, connection.toComponent);
288
294
  return {
289
295
  port: {
290
296
  type: this.toPortType(connection.fromResourceType),
@@ -317,16 +323,10 @@ class StormEventParser {
317
323
  blocks: Object.values(blockDefinitions),
318
324
  };
319
325
  }
320
- toSafeName(name) {
321
- return name.toLowerCase().replace(/[^0-9a-z-]/gi, '');
322
- }
323
- toRef(handle, name) {
324
- return (0, nodejs_utils_1.parseKapetaUri)(handle + '/' + this.toSafeName(name) + ':local');
325
- }
326
326
  toBlockDefinitions(handle) {
327
327
  const result = {};
328
328
  Object.entries(this.blocks).forEach(([, blockInfo]) => {
329
- const blockRef = this.toRef(handle, blockInfo.name);
329
+ const blockRef = StormEventParser.toRef(handle, blockInfo.name);
330
330
  const blockDefinitionInfo = {
331
331
  uri: blockRef,
332
332
  aiName: blockInfo.name,
@@ -530,7 +530,7 @@ class StormEventParser {
530
530
  if (connection.fromResourceType !== 'API') {
531
531
  return;
532
532
  }
533
- const fromRef = this.toRef(handle, connection.fromComponent);
533
+ const fromRef = StormEventParser.toRef(handle, connection.fromComponent);
534
534
  const apiProviderBlock = blockDefinitions[fromRef.toNormalizedString()];
535
535
  if (!apiProviderBlock) {
536
536
  console.warn('Provider block not found: %s', connection.fromComponent, connection);
@@ -585,8 +585,8 @@ class StormEventParser {
585
585
  }
586
586
  let options = {};
587
587
  if (kind.includes('java')) {
588
- const groupId = `ai.${this.toSafeName(handle)}`;
589
- const artifactId = this.toSafeName(this.planName);
588
+ const groupId = `ai.${StormEventParser.toSafeName(handle)}`;
589
+ const artifactId = StormEventParser.toSafeName(this.planName);
590
590
  options = {
591
591
  groupId,
592
592
  artifactId,
@@ -112,6 +112,8 @@ export interface StormEventScreen {
112
112
  created: number;
113
113
  payload: {
114
114
  blockName: string;
115
+ blockRef?: string;
116
+ instanceId?: string;
115
117
  name: string;
116
118
  template: string;
117
119
  description: string;
@@ -138,6 +140,7 @@ export interface StormEventFile {
138
140
  content: string;
139
141
  blockName: string;
140
142
  blockRef: string;
143
+ instanceId: string;
141
144
  };
142
145
  }
143
146
  export interface StormEventDone {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kapeta/local-cluster-service",
3
- "version": "0.48.2",
3
+ "version": "0.48.3",
4
4
  "description": "Manages configuration, ports and service discovery for locally running Kapeta systems",
5
5
  "type": "commonjs",
6
6
  "exports": {
@@ -9,7 +9,7 @@ import { BlockDefinition } from '@kapeta/schemas';
9
9
  import { codeGeneratorManager } from '../codeGeneratorManager';
10
10
  import { STORM_ID, stormClient } from './stormClient';
11
11
  import { StormEvent, StormEventFile } from './events';
12
- import { BlockDefinitionInfo } from './event-parser';
12
+ import { BlockDefinitionInfo, StormEventParser } from './event-parser';
13
13
  import { ConversationItem, StormFileImplementationPrompt, StormFileInfo, StormStream } from './stream';
14
14
  import { KapetaURI } from '@kapeta/nodejs-utils';
15
15
  import { writeFile } from 'fs/promises';
@@ -56,6 +56,7 @@ export class StormCodegen {
56
56
  private handleUiOutput(blockUri: KapetaURI, aiName: string, data: StormEvent) {
57
57
  switch (data.type) {
58
58
  case 'SCREEN':
59
+ const ref = blockUri.toNormalizedString();
59
60
  this.out.emit('data', {
60
61
  type: 'SCREEN',
61
62
  reason: data.reason,
@@ -63,6 +64,8 @@ export class StormCodegen {
63
64
  payload: {
64
65
  ...data.payload,
65
66
  blockName: aiName,
67
+ blockRef: ref,
68
+ instanceId: StormEventParser.toInstanceIdFromRef(ref),
66
69
  },
67
70
  });
68
71
  case 'FILE':
@@ -73,6 +76,7 @@ export class StormCodegen {
73
76
  private handleFileOutput(blockUri: KapetaURI, aiName: string, data: StormEvent) {
74
77
  switch (data.type) {
75
78
  case 'FILE':
79
+ const ref = blockUri.toNormalizedString();
76
80
  this.emitFile(blockUri, aiName, data.payload.filename, data.payload.content, data.reason);
77
81
  return {
78
82
  type: 'FILE',
@@ -80,6 +84,8 @@ export class StormCodegen {
80
84
  payload: {
81
85
  filename: data.payload.filename,
82
86
  content: data.payload.content,
87
+ blockRef: ref,
88
+ instanceId: StormEventParser.toInstanceIdFromRef(ref),
83
89
  },
84
90
  } as StormEventFile;
85
91
  }
@@ -192,7 +198,7 @@ export class StormCodegen {
192
198
  reason: string = 'File generated'
193
199
  ) {
194
200
  const basePath = this.getBasePath(uri.fullName);
195
-
201
+ const ref = uri.toNormalizedString();
196
202
  this.out.emit('data', {
197
203
  type: 'FILE',
198
204
  reason,
@@ -202,7 +208,8 @@ export class StormCodegen {
202
208
  path: join(basePath, filename),
203
209
  content: content,
204
210
  blockName,
205
- blockRef: uri.toNormalizedString(),
211
+ blockRef: ref,
212
+ instanceId: StormEventParser.toInstanceIdFromRef(ref),
206
213
  },
207
214
  } satisfies StormEventFile);
208
215
  }
@@ -201,6 +201,23 @@ export async function resolveOptions(): Promise<StormOptions> {
201
201
  }
202
202
 
203
203
  export class StormEventParser {
204
+ public static toInstanceId(handle: string, blockName: string) {
205
+ const ref = this.toRef(handle, blockName);
206
+ return this.toInstanceIdFromRef(ref.toNormalizedString());
207
+ }
208
+
209
+ public static toInstanceIdFromRef(ref: string) {
210
+ return uuid(normalizeKapetaUri(ref), uuid.URL);
211
+ }
212
+
213
+ public static toSafeName(name: string): string {
214
+ return name.toLowerCase().replace(/[^0-9a-z-]/gi, '');
215
+ }
216
+
217
+ public static toRef(handle: string, name: string) {
218
+ return parseKapetaUri(handle + '/' + this.toSafeName(name) + ':local');
219
+ }
220
+
204
221
  private events: StormEvent[] = [];
205
222
  private planName: string = '';
206
223
  private planDescription: string = '';
@@ -240,8 +257,8 @@ export class StormEventParser {
240
257
  models: [],
241
258
  types: [],
242
259
  };
243
- evt.payload.blockRef = this.toRef(handle, evt.payload.name).toNormalizedString();
244
- evt.payload.instanceId = this.toInstanceIdFromRef(evt.payload.blockRef);
260
+ evt.payload.blockRef = StormEventParser.toRef(handle, evt.payload.name).toNormalizedString();
261
+ evt.payload.instanceId = StormEventParser.toInstanceIdFromRef(evt.payload.blockRef);
245
262
  break;
246
263
  case 'PLAN_RETRY':
247
264
  this.reset();
@@ -253,8 +270,8 @@ export class StormEventParser {
253
270
  case 'CREATE_API':
254
271
  blockInfo = this.blocks[evt.payload.blockName];
255
272
  blockInfo.apis.push(prettifyKaplang(evt.payload.content));
256
- evt.payload.blockRef = this.toRef(handle, evt.payload.blockName).toNormalizedString();
257
- evt.payload.instanceId = this.toInstanceIdFromRef(evt.payload.blockRef);
273
+ evt.payload.blockRef = StormEventParser.toRef(handle, evt.payload.blockName).toNormalizedString();
274
+ evt.payload.instanceId = StormEventParser.toInstanceIdFromRef(evt.payload.blockRef);
258
275
 
259
276
  const api = blockInfo.resources.find((r) => r.type == 'API');
260
277
  evt.payload.resourceName = api?.name;
@@ -262,8 +279,8 @@ export class StormEventParser {
262
279
  case 'CREATE_MODEL':
263
280
  blockInfo = this.blocks[evt.payload.blockName];
264
281
  blockInfo.models.push(prettifyKaplang(evt.payload.content));
265
- evt.payload.blockRef = this.toRef(handle, evt.payload.blockName).toNormalizedString();
266
- evt.payload.instanceId = this.toInstanceIdFromRef(evt.payload.blockRef);
282
+ evt.payload.blockRef = StormEventParser.toRef(handle, evt.payload.blockName).toNormalizedString();
283
+ evt.payload.instanceId = StormEventParser.toInstanceIdFromRef(evt.payload.blockRef);
267
284
 
268
285
  const database = blockInfo.resources.find((r) => r.type == 'DATABASE');
269
286
  evt.payload.resourceName = database?.name;
@@ -271,12 +288,12 @@ export class StormEventParser {
271
288
 
272
289
  case 'CREATE_TYPE':
273
290
  this.blocks[evt.payload.blockName].types.push(prettifyKaplang(evt.payload.content));
274
- evt.payload.blockRef = this.toRef(handle, evt.payload.blockName).toNormalizedString();
275
- evt.payload.instanceId = this.toInstanceIdFromRef(evt.payload.blockRef);
291
+ evt.payload.blockRef = StormEventParser.toRef(handle, evt.payload.blockName).toNormalizedString();
292
+ evt.payload.instanceId = StormEventParser.toInstanceIdFromRef(evt.payload.blockRef);
276
293
  break;
277
294
  case 'CREATE_CONNECTION':
278
- evt.payload.fromBlockId = this.toInstanceId(handle, evt.payload.fromComponent);
279
- evt.payload.toBlockId = this.toInstanceId(handle, evt.payload.toComponent);
295
+ evt.payload.fromBlockId = StormEventParser.toInstanceId(handle, evt.payload.fromComponent);
296
+ evt.payload.toBlockId = StormEventParser.toInstanceId(handle, evt.payload.toComponent);
280
297
  this.connections.push(evt.payload);
281
298
  break;
282
299
 
@@ -304,22 +321,13 @@ export class StormEventParser {
304
321
  return this.error;
305
322
  }
306
323
 
307
- private toInstanceId(handle: string, blockName: string) {
308
- const ref = this.toRef(handle, blockName);
309
- return this.toInstanceIdFromRef(ref.toNormalizedString());
310
- }
311
-
312
- private toInstanceIdFromRef(ref: string) {
313
- return uuid(normalizeKapetaUri(ref), uuid.URL);
314
- }
315
-
316
324
  public toResult(handle: string): StormDefinitions {
317
- const planRef = this.toRef(handle, this.planName ?? 'undefined');
325
+ const planRef = StormEventParser.toRef(handle, this.planName ?? 'undefined');
318
326
  const blockDefinitions = this.toBlockDefinitions(handle);
319
327
  const refIdMap: { [key: string]: string } = {};
320
328
  const blocks = Object.entries(blockDefinitions).map(([ref, block]) => {
321
329
  // Create a deterministic uuid
322
- const id = this.toInstanceIdFromRef(ref);
330
+ const id = StormEventParser.toInstanceIdFromRef(ref);
323
331
  refIdMap[ref] = id;
324
332
  return {
325
333
  id,
@@ -340,8 +348,8 @@ export class StormEventParser {
340
348
  this.connections
341
349
  .filter((connection) => connection.fromResourceType === 'API' && connection.toResourceType === 'CLIENT')
342
350
  .forEach((apiConnection) => {
343
- const apiProviderRef = this.toRef(handle, apiConnection.fromComponent);
344
- const clientConsumerRef = this.toRef(handle, apiConnection.toComponent);
351
+ const apiProviderRef = StormEventParser.toRef(handle, apiConnection.fromComponent);
352
+ const clientConsumerRef = StormEventParser.toRef(handle, apiConnection.toComponent);
345
353
  const apiProviderBlock = blockDefinitions[apiProviderRef.toNormalizedString()];
346
354
  if (!apiProviderBlock) {
347
355
  console.warn('API provider not found: %s', apiConnection.fromComponent, apiConnection);
@@ -418,8 +426,8 @@ export class StormEventParser {
418
426
  });
419
427
 
420
428
  const connections: Connection[] = this.connections.map((connection) => {
421
- const fromRef = this.toRef(handle, connection.fromComponent);
422
- const toRef = this.toRef(handle, connection.toComponent);
429
+ const fromRef = StormEventParser.toRef(handle, connection.fromComponent);
430
+ const toRef = StormEventParser.toRef(handle, connection.toComponent);
423
431
 
424
432
  return {
425
433
  port: {
@@ -456,19 +464,11 @@ export class StormEventParser {
456
464
  };
457
465
  }
458
466
 
459
- private toSafeName(name: string): string {
460
- return name.toLowerCase().replace(/[^0-9a-z-]/gi, '');
461
- }
462
-
463
- private toRef(handle: string, name: string) {
464
- return parseKapetaUri(handle + '/' + this.toSafeName(name) + ':local');
465
- }
466
-
467
467
  public toBlockDefinitions(handle: string): { [key: string]: BlockDefinitionInfo } {
468
468
  const result: { [key: string]: BlockDefinitionInfo } = {};
469
469
 
470
470
  Object.entries(this.blocks).forEach(([, blockInfo]) => {
471
- const blockRef = this.toRef(handle, blockInfo.name);
471
+ const blockRef = StormEventParser.toRef(handle, blockInfo.name);
472
472
 
473
473
  const blockDefinitionInfo: BlockDefinitionInfo = {
474
474
  uri: blockRef,
@@ -690,7 +690,7 @@ export class StormEventParser {
690
690
  return;
691
691
  }
692
692
 
693
- const fromRef = this.toRef(handle, connection.fromComponent);
693
+ const fromRef = StormEventParser.toRef(handle, connection.fromComponent);
694
694
 
695
695
  const apiProviderBlock = blockDefinitions[fromRef.toNormalizedString()];
696
696
  if (!apiProviderBlock) {
@@ -771,8 +771,8 @@ export class StormEventParser {
771
771
  let options: { [key: string]: any } = {};
772
772
 
773
773
  if (kind.includes('java')) {
774
- const groupId = `ai.${this.toSafeName(handle)}`;
775
- const artifactId = this.toSafeName(this.planName);
774
+ const groupId = `ai.${StormEventParser.toSafeName(handle)}`;
775
+ const artifactId = StormEventParser.toSafeName(this.planName);
776
776
  options = {
777
777
  groupId,
778
778
  artifactId,
@@ -140,6 +140,8 @@ export interface StormEventScreen {
140
140
  created: number;
141
141
  payload: {
142
142
  blockName: string;
143
+ blockRef?: string;
144
+ instanceId?: string;
143
145
  name: string;
144
146
  template: string;
145
147
  description: string;
@@ -168,6 +170,7 @@ export interface StormEventFile {
168
170
  content: string;
169
171
  blockName: string;
170
172
  blockRef: string;
173
+ instanceId: string;
171
174
  };
172
175
  }
173
176