@kapeta/local-cluster-service 0.70.6 → 0.70.7

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,11 @@
1
+ ## [0.70.7](https://github.com/kapetacom/local-cluster-service/compare/v0.70.6...v0.70.7) (2024-09-12)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add missing error handlers to pagegen ([56a3ab5](https://github.com/kapetacom/local-cluster-service/commit/56a3ab576f011ed29ce8074c53e025b347fb4e8a))
7
+ * skip unknown mimetypes in image gen ([3076367](https://github.com/kapetacom/local-cluster-service/commit/307636771c46a99f555c4c3e944c61fcffa16adc))
8
+
1
9
  ## [0.70.6](https://github.com/kapetacom/local-cluster-service/compare/v0.70.5...v0.70.6) (2024-09-11)
2
10
 
3
11
 
@@ -3,6 +3,29 @@
3
3
  * Copyright 2023 Kapeta Inc.
4
4
  * SPDX-License-Identifier: BUSL-1.1
5
5
  */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || function (mod) {
23
+ if (mod && mod.__esModule) return mod;
24
+ var result = {};
25
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
26
+ __setModuleDefault(result, mod);
27
+ return result;
28
+ };
6
29
  var __importDefault = (this && this.__importDefault) || function (mod) {
7
30
  return (mod && mod.__esModule) ? mod : { "default": mod };
8
31
  };
@@ -13,6 +36,7 @@ const stormClient_1 = require("./stormClient");
13
36
  const node_events_1 = require("node:events");
14
37
  const p_queue_1 = __importDefault(require("p-queue"));
15
38
  const page_utils_1 = require("./page-utils");
39
+ const mimetypes = __importStar(require("mime-types"));
16
40
  class PageQueue extends node_events_1.EventEmitter {
17
41
  queue;
18
42
  eventQueue;
@@ -208,6 +232,14 @@ class PageQueue extends node_events_1.EventEmitter {
208
232
  //console.log('Ignoring duplicate image prompt', prompt);
209
233
  return;
210
234
  }
235
+ // Add safeguard to avoid generating images for nonsense URLs
236
+ // Sometimes we get entries for Base URLs that will then cause issues on the filesystem
237
+ // Example: https://www.kapeta.com/images/
238
+ const mimeType = mimetypes.lookup(prompt.url);
239
+ if (!mimeType || !mimeType.startsWith('image/')) {
240
+ console.warn('Skipping image reference of type %s for url %s', mimeType, prompt.url);
241
+ return;
242
+ }
211
243
  this.images.set(prompt.url, prompt.description);
212
244
  const prefix = this.getPrefix();
213
245
  const result = await stormClient_1.stormClient.createImage(prefix + `Create an image for the url "${prompt.url}" with this description: ${prompt.description}`.trim());
@@ -380,6 +380,10 @@ router.post('/:handle/ui', async (req, res) => {
380
380
  queue.on('event', (screenData) => {
381
381
  sendEvent(res, screenData);
382
382
  });
383
+ queue.on('error', (err) => {
384
+ console.error('Failed to process page', err);
385
+ sendError(err, res);
386
+ });
383
387
  for (const screen of Object.values(uniqueUserJourneyScreens)) {
384
388
  queue
385
389
  .addPrompt({
@@ -435,6 +439,10 @@ router.post('/ui/edit', async (req, res) => {
435
439
  sendEvent(res, data);
436
440
  }
437
441
  });
442
+ queue.on('error', (err) => {
443
+ console.error('Failed to process page', err);
444
+ sendError(err, res);
445
+ });
438
446
  const pages = aiRequest.prompt.pages.filter((page) => page.conversationId);
439
447
  if (pages.length === 0) {
440
448
  console.log('No pages to update', aiRequest.prompt.pages);
@@ -3,6 +3,29 @@
3
3
  * Copyright 2023 Kapeta Inc.
4
4
  * SPDX-License-Identifier: BUSL-1.1
5
5
  */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || function (mod) {
23
+ if (mod && mod.__esModule) return mod;
24
+ var result = {};
25
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
26
+ __setModuleDefault(result, mod);
27
+ return result;
28
+ };
6
29
  var __importDefault = (this && this.__importDefault) || function (mod) {
7
30
  return (mod && mod.__esModule) ? mod : { "default": mod };
8
31
  };
@@ -13,6 +36,7 @@ const stormClient_1 = require("./stormClient");
13
36
  const node_events_1 = require("node:events");
14
37
  const p_queue_1 = __importDefault(require("p-queue"));
15
38
  const page_utils_1 = require("./page-utils");
39
+ const mimetypes = __importStar(require("mime-types"));
16
40
  class PageQueue extends node_events_1.EventEmitter {
17
41
  queue;
18
42
  eventQueue;
@@ -208,6 +232,14 @@ class PageQueue extends node_events_1.EventEmitter {
208
232
  //console.log('Ignoring duplicate image prompt', prompt);
209
233
  return;
210
234
  }
235
+ // Add safeguard to avoid generating images for nonsense URLs
236
+ // Sometimes we get entries for Base URLs that will then cause issues on the filesystem
237
+ // Example: https://www.kapeta.com/images/
238
+ const mimeType = mimetypes.lookup(prompt.url);
239
+ if (!mimeType || !mimeType.startsWith('image/')) {
240
+ console.warn('Skipping image reference of type %s for url %s', mimeType, prompt.url);
241
+ return;
242
+ }
211
243
  this.images.set(prompt.url, prompt.description);
212
244
  const prefix = this.getPrefix();
213
245
  const result = await stormClient_1.stormClient.createImage(prefix + `Create an image for the url "${prompt.url}" with this description: ${prompt.description}`.trim());
@@ -380,6 +380,10 @@ router.post('/:handle/ui', async (req, res) => {
380
380
  queue.on('event', (screenData) => {
381
381
  sendEvent(res, screenData);
382
382
  });
383
+ queue.on('error', (err) => {
384
+ console.error('Failed to process page', err);
385
+ sendError(err, res);
386
+ });
383
387
  for (const screen of Object.values(uniqueUserJourneyScreens)) {
384
388
  queue
385
389
  .addPrompt({
@@ -435,6 +439,10 @@ router.post('/ui/edit', async (req, res) => {
435
439
  sendEvent(res, data);
436
440
  }
437
441
  });
442
+ queue.on('error', (err) => {
443
+ console.error('Failed to process page', err);
444
+ sendError(err, res);
445
+ });
438
446
  const pages = aiRequest.prompt.pages.filter((page) => page.conversationId);
439
447
  if (pages.length === 0) {
440
448
  console.log('No pages to update', aiRequest.prompt.pages);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kapeta/local-cluster-service",
3
- "version": "0.70.6",
3
+ "version": "0.70.7",
4
4
  "description": "Manages configuration, ports and service discovery for locally running Kapeta systems",
5
5
  "type": "commonjs",
6
6
  "exports": {
@@ -76,6 +76,7 @@
76
76
  "js-yaml": "^4.1.0",
77
77
  "lodash": "^4.17.15",
78
78
  "md5": "2.2.1",
79
+ "mime-types": "^2.1.35",
79
80
  "node-cache": "^5.1.2",
80
81
  "node-fetch": "^3.3.2",
81
82
  "node-uuid": "^1.4.8",
@@ -104,6 +105,7 @@
104
105
  "@types/js-yaml": "^4.0.9",
105
106
  "@types/lodash": "^4.14.195",
106
107
  "@types/md5": "^2.3.2",
108
+ "@types/mime-types": "^2.1.4",
107
109
  "@types/node": "^20.5.8",
108
110
  "@types/node-fetch": "^2.6.11",
109
111
  "@types/node-uuid": "^0.0.29",
@@ -10,6 +10,7 @@ import { EventEmitter } from 'node:events';
10
10
  import PQueue from 'p-queue';
11
11
 
12
12
  import { hasPageOnDisk, normalizePath } from './page-utils';
13
+ import * as mimetypes from 'mime-types';
13
14
 
14
15
  export interface ImagePrompt {
15
16
  name: string;
@@ -255,6 +256,15 @@ export class PageQueue extends EventEmitter {
255
256
  //console.log('Ignoring duplicate image prompt', prompt);
256
257
  return;
257
258
  }
259
+ // Add safeguard to avoid generating images for nonsense URLs
260
+ // Sometimes we get entries for Base URLs that will then cause issues on the filesystem
261
+ // Example: https://www.kapeta.com/images/
262
+ const mimeType = mimetypes.lookup(prompt.url) as string | false;
263
+ if (!mimeType || !mimeType.startsWith('image/')) {
264
+ console.warn('Skipping image reference of type %s for url %s', mimeType, prompt.url);
265
+ return;
266
+ }
267
+
258
268
  this.images.set(prompt.url, prompt.description);
259
269
  const prefix = this.getPrefix();
260
270
  const result = await stormClient.createImage(
@@ -474,6 +474,11 @@ router.post('/:handle/ui', async (req: KapetaBodyRequest, res: Response) => {
474
474
  sendEvent(res, screenData);
475
475
  });
476
476
 
477
+ queue.on('error', (err) => {
478
+ console.error('Failed to process page', err);
479
+ sendError(err as any, res);
480
+ });
481
+
477
482
  for (const screen of Object.values(uniqueUserJourneyScreens)) {
478
483
  queue
479
484
  .addPrompt({
@@ -538,6 +543,11 @@ router.post('/ui/edit', async (req: KapetaBodyRequest, res: Response) => {
538
543
  }
539
544
  });
540
545
 
546
+ queue.on('error', (err) => {
547
+ console.error('Failed to process page', err);
548
+ sendError(err as any, res);
549
+ });
550
+
541
551
  const pages = aiRequest.prompt.pages.filter((page) => page.conversationId);
542
552
  if (pages.length === 0) {
543
553
  console.log('No pages to update', aiRequest.prompt.pages);