@kapeta/local-cluster-service 0.71.5 → 0.72.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ # [0.72.0](https://github.com/kapetacom/local-cluster-service/compare/v0.71.6...v0.72.0) (2024-09-24)
2
+
3
+
4
+ ### Features
5
+
6
+ * Add redirect endpoint for opening conversation ([#258](https://github.com/kapetacom/local-cluster-service/issues/258)) ([2b400ac](https://github.com/kapetacom/local-cluster-service/commit/2b400ac0066813a9e18c105628743650646c83c6))
7
+
8
+ ## [0.71.6](https://github.com/kapetacom/local-cluster-service/compare/v0.71.5...v0.71.6) (2024-09-19)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * Change to simple json response for now ([#256](https://github.com/kapetacom/local-cluster-service/issues/256)) ([7d8ae48](https://github.com/kapetacom/local-cluster-service/commit/7d8ae4813b78f478a0f719195ea33dc2890f1d2a))
14
+
1
15
  ## [0.71.5](https://github.com/kapetacom/local-cluster-service/compare/v0.71.4...v0.71.5) (2024-09-19)
2
16
 
3
17
 
@@ -25,6 +25,7 @@ const UIServer_1 = require("./UIServer");
25
25
  const crypto_1 = require("crypto");
26
26
  const PageGenerator_1 = require("./PageGenerator");
27
27
  const utils_1 = require("./utils");
28
+ const utils_2 = require("../utils/utils");
28
29
  const UI_SERVERS = {};
29
30
  const router = (0, express_promise_router_1.default)();
30
31
  router.use('/', cors_1.corsHandler);
@@ -106,17 +107,17 @@ router.post('/ui/create-system-simple/:handle/:systemId', async (req, res) => {
106
107
  const handle = req.params.handle;
107
108
  const systemId = req.params.systemId;
108
109
  const srcDir = (0, page_utils_1.getSystemBaseDir)(systemId);
109
- res.set('Content-Type', 'application/x-ndjson');
110
- res.set('Access-Control-Expose-Headers', stormClient_1.ConversationIdHeader);
111
- res.set(stormClient_1.ConversationIdHeader, systemId);
112
- sendEvent(res, (0, event_parser_1.createPhaseStartEvent)(events_1.StormEventPhaseType.IMPLEMENT_APIS));
110
+ //res.set('Content-Type', 'application/x-ndjson');
111
+ //res.set('Access-Control-Expose-Headers', ConversationIdHeader);
112
+ //res.set(ConversationIdHeader, systemId);
113
+ //sendEvent(res, createPhaseStartEvent(StormEventPhaseType.IMPLEMENT_APIS));
113
114
  try {
114
115
  const pagesFromDisk = (0, utils_1.readFilesAndContent)(srcDir);
115
116
  const pagesWithImplementation = await stormClient_1.stormClient.replaceMockWithAPICall({
116
117
  pages: pagesFromDisk,
117
118
  });
118
- sendEvent(res, (0, event_parser_1.createPhaseEndEvent)(events_1.StormEventPhaseType.IMPLEMENT_APIS));
119
- sendEvent(res, (0, event_parser_1.createPhaseStartEvent)(events_1.StormEventPhaseType.COMPOSE_SYSTEM));
119
+ //sendEvent(res, createPhaseEndEvent(StormEventPhaseType.IMPLEMENT_APIS));
120
+ //sendEvent(res, createPhaseStartEvent(StormEventPhaseType.COMPOSE_SYSTEM));
120
121
  const allFiles = (0, utils_1.readFilesAndContent)(srcDir, false).map((page) => {
121
122
  if (page.encoding == stream_1.HTMLPageEncoding.TEXT) {
122
123
  const matchingFile = pagesWithImplementation.find((pageWithImpl) => pageWithImpl.fileName === page.fileName);
@@ -127,12 +128,13 @@ router.post('/ui/create-system-simple/:handle/:systemId', async (req, res) => {
127
128
  return page;
128
129
  });
129
130
  const systemUrl = await stormClient_1.stormClient.createSimpleBackend(handle, systemId, { pages: allFiles });
130
- sendEvent(res, { type: 'SYSTEM_READY', created: Math.floor(Date.now() / 1000), reason: 'System Ready', payload: { systemUrl: systemUrl } });
131
- sendEvent(res, (0, event_parser_1.createPhaseEndEvent)(events_1.StormEventPhaseType.COMPOSE_SYSTEM));
132
- sendDone(res);
131
+ //sendEvent(res, {type: 'SYSTEM_READY', created: Math.floor(Date.now() / 1000), reason: 'System Ready', payload: { systemUrl: systemUrl }});
132
+ //sendEvent(res, createPhaseEndEvent(StormEventPhaseType.COMPOSE_SYSTEM));
133
+ //sendDone(res);
134
+ res.json({ url: systemUrl });
133
135
  }
134
136
  catch (err) {
135
- sendError(err, res);
137
+ res.status(500).json({ error: err.message });
136
138
  }
137
139
  finally {
138
140
  if (!res.closed) {
@@ -543,6 +545,12 @@ router.post('/ui/get-vote', async (req, res) => {
543
545
  router.post('/:handle/all', async (req, res) => {
544
546
  await handleAll(req, res);
545
547
  });
548
+ router.get('/conversations/:agentName/:systemId/redirect', async (req, res) => {
549
+ const aiService = (0, utils_2.getRemoteUrl)('ai-service', 'https://ai.kapeta.com');
550
+ const agentName = req.params.agentName;
551
+ const systemId = req.params.systemId;
552
+ res.redirect(aiService + `/v2/conversations/${encodeURIComponent(agentName)}/${encodeURIComponent(systemId)}`);
553
+ });
546
554
  async function handleAll(req, res) {
547
555
  const handle = req.params.handle;
548
556
  const systemId = req.query.systemId ?? undefined;
@@ -25,6 +25,7 @@ const UIServer_1 = require("./UIServer");
25
25
  const crypto_1 = require("crypto");
26
26
  const PageGenerator_1 = require("./PageGenerator");
27
27
  const utils_1 = require("./utils");
28
+ const utils_2 = require("../utils/utils");
28
29
  const UI_SERVERS = {};
29
30
  const router = (0, express_promise_router_1.default)();
30
31
  router.use('/', cors_1.corsHandler);
@@ -106,17 +107,17 @@ router.post('/ui/create-system-simple/:handle/:systemId', async (req, res) => {
106
107
  const handle = req.params.handle;
107
108
  const systemId = req.params.systemId;
108
109
  const srcDir = (0, page_utils_1.getSystemBaseDir)(systemId);
109
- res.set('Content-Type', 'application/x-ndjson');
110
- res.set('Access-Control-Expose-Headers', stormClient_1.ConversationIdHeader);
111
- res.set(stormClient_1.ConversationIdHeader, systemId);
112
- sendEvent(res, (0, event_parser_1.createPhaseStartEvent)(events_1.StormEventPhaseType.IMPLEMENT_APIS));
110
+ //res.set('Content-Type', 'application/x-ndjson');
111
+ //res.set('Access-Control-Expose-Headers', ConversationIdHeader);
112
+ //res.set(ConversationIdHeader, systemId);
113
+ //sendEvent(res, createPhaseStartEvent(StormEventPhaseType.IMPLEMENT_APIS));
113
114
  try {
114
115
  const pagesFromDisk = (0, utils_1.readFilesAndContent)(srcDir);
115
116
  const pagesWithImplementation = await stormClient_1.stormClient.replaceMockWithAPICall({
116
117
  pages: pagesFromDisk,
117
118
  });
118
- sendEvent(res, (0, event_parser_1.createPhaseEndEvent)(events_1.StormEventPhaseType.IMPLEMENT_APIS));
119
- sendEvent(res, (0, event_parser_1.createPhaseStartEvent)(events_1.StormEventPhaseType.COMPOSE_SYSTEM));
119
+ //sendEvent(res, createPhaseEndEvent(StormEventPhaseType.IMPLEMENT_APIS));
120
+ //sendEvent(res, createPhaseStartEvent(StormEventPhaseType.COMPOSE_SYSTEM));
120
121
  const allFiles = (0, utils_1.readFilesAndContent)(srcDir, false).map((page) => {
121
122
  if (page.encoding == stream_1.HTMLPageEncoding.TEXT) {
122
123
  const matchingFile = pagesWithImplementation.find((pageWithImpl) => pageWithImpl.fileName === page.fileName);
@@ -127,12 +128,13 @@ router.post('/ui/create-system-simple/:handle/:systemId', async (req, res) => {
127
128
  return page;
128
129
  });
129
130
  const systemUrl = await stormClient_1.stormClient.createSimpleBackend(handle, systemId, { pages: allFiles });
130
- sendEvent(res, { type: 'SYSTEM_READY', created: Math.floor(Date.now() / 1000), reason: 'System Ready', payload: { systemUrl: systemUrl } });
131
- sendEvent(res, (0, event_parser_1.createPhaseEndEvent)(events_1.StormEventPhaseType.COMPOSE_SYSTEM));
132
- sendDone(res);
131
+ //sendEvent(res, {type: 'SYSTEM_READY', created: Math.floor(Date.now() / 1000), reason: 'System Ready', payload: { systemUrl: systemUrl }});
132
+ //sendEvent(res, createPhaseEndEvent(StormEventPhaseType.COMPOSE_SYSTEM));
133
+ //sendDone(res);
134
+ res.json({ url: systemUrl });
133
135
  }
134
136
  catch (err) {
135
- sendError(err, res);
137
+ res.status(500).json({ error: err.message });
136
138
  }
137
139
  finally {
138
140
  if (!res.closed) {
@@ -543,6 +545,12 @@ router.post('/ui/get-vote', async (req, res) => {
543
545
  router.post('/:handle/all', async (req, res) => {
544
546
  await handleAll(req, res);
545
547
  });
548
+ router.get('/conversations/:agentName/:systemId/redirect', async (req, res) => {
549
+ const aiService = (0, utils_2.getRemoteUrl)('ai-service', 'https://ai.kapeta.com');
550
+ const agentName = req.params.agentName;
551
+ const systemId = req.params.systemId;
552
+ res.redirect(aiService + `/v2/conversations/${encodeURIComponent(agentName)}/${encodeURIComponent(systemId)}`);
553
+ });
546
554
  async function handleAll(req, res) {
547
555
  const handle = req.params.handle;
548
556
  const systemId = req.query.systemId ?? undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kapeta/local-cluster-service",
3
- "version": "0.71.5",
3
+ "version": "0.72.0",
4
4
  "description": "Manages configuration, ports and service discovery for locally running Kapeta systems",
5
5
  "type": "commonjs",
6
6
  "exports": {
@@ -11,7 +11,13 @@ import _ from 'lodash';
11
11
  import { corsHandler } from '../middleware/cors';
12
12
  import { stringBody } from '../middleware/stringBody';
13
13
  import { KapetaBodyRequest } from '../types';
14
- import {HTMLPageEncoding, StormCodegenRequest, StormContextRequest, StormCreateBlockRequest, StormStream} from './stream';
14
+ import {
15
+ HTMLPageEncoding,
16
+ StormCodegenRequest,
17
+ StormContextRequest,
18
+ StormCreateBlockRequest,
19
+ StormStream,
20
+ } from './stream';
15
21
 
16
22
  import {
17
23
  ConversationIdHeader,
@@ -45,6 +51,7 @@ import { UIServer } from './UIServer';
45
51
  import { randomUUID } from 'crypto';
46
52
  import { PageQueue } from './PageGenerator';
47
53
  import { copyDirectory, createFuture, readFilesAndContent } from './utils';
54
+ import { getRemoteUrl } from '../utils/utils';
48
55
 
49
56
  const UI_SERVERS: { [key: string]: UIServer } = {};
50
57
  const router = Router();
@@ -109,26 +116,24 @@ router.post('/ui/create-system/:handle/:systemId', async (req: KapetaBodyRequest
109
116
 
110
117
  sendEvent(res, createPhaseStartEvent(StormEventPhaseType.IMPLEMENT_APIS));
111
118
 
112
- const pagesFromDisk = readFilesAndContent(srcDir);
119
+ const pagesFromDisk = readFilesAndContent(srcDir);
113
120
  const pagesWithImplementation = await stormClient.replaceMockWithAPICall({
114
- pages: pagesFromDisk,
115
- },
116
- );
121
+ pages: pagesFromDisk,
122
+ });
117
123
  await copyDirectory(srcDir, destDir, (fileName, content) => {
118
124
  // find the page from result1 and write the content to the file
119
125
  const page = pagesWithImplementation.find((p) => p.fileName === fileName);
120
126
  return page ? page.content : content;
121
127
  });
122
128
 
123
-
124
129
  sendEvent(res, createPhaseEndEvent(StormEventPhaseType.IMPLEMENT_APIS));
125
130
 
126
131
  sendEvent(res, createPhaseStartEvent(StormEventPhaseType.COMPOSE_SYSTEM_PROMPT));
127
132
 
128
133
  // get the content of the pages
129
134
  const pageContents = pagesWithImplementation.map((page) => {
130
- return page.content
131
- })
135
+ return page.content;
136
+ });
132
137
 
133
138
  const prompt = await stormClient.generatePrompt(pageContents);
134
139
 
@@ -148,26 +153,27 @@ router.post('/ui/create-system-simple/:handle/:systemId', async (req: KapetaBody
148
153
  const systemId = req.params.systemId as string;
149
154
  const srcDir = getSystemBaseDir(systemId);
150
155
 
151
- res.set('Content-Type', 'application/x-ndjson');
152
- res.set('Access-Control-Expose-Headers', ConversationIdHeader);
153
- res.set(ConversationIdHeader, systemId);
156
+ //res.set('Content-Type', 'application/x-ndjson');
157
+ //res.set('Access-Control-Expose-Headers', ConversationIdHeader);
158
+ //res.set(ConversationIdHeader, systemId);
154
159
 
155
- sendEvent(res, createPhaseStartEvent(StormEventPhaseType.IMPLEMENT_APIS));
160
+ //sendEvent(res, createPhaseStartEvent(StormEventPhaseType.IMPLEMENT_APIS));
156
161
 
157
162
  try {
158
163
  const pagesFromDisk = readFilesAndContent(srcDir);
159
164
  const pagesWithImplementation = await stormClient.replaceMockWithAPICall({
160
- pages: pagesFromDisk,
161
- },
162
- );
165
+ pages: pagesFromDisk,
166
+ });
163
167
 
164
- sendEvent(res, createPhaseEndEvent(StormEventPhaseType.IMPLEMENT_APIS));
168
+ //sendEvent(res, createPhaseEndEvent(StormEventPhaseType.IMPLEMENT_APIS));
165
169
 
166
- sendEvent(res, createPhaseStartEvent(StormEventPhaseType.COMPOSE_SYSTEM));
170
+ //sendEvent(res, createPhaseStartEvent(StormEventPhaseType.COMPOSE_SYSTEM));
167
171
 
168
172
  const allFiles = readFilesAndContent(srcDir, false).map((page) => {
169
173
  if (page.encoding == HTMLPageEncoding.TEXT) {
170
- const matchingFile = pagesWithImplementation.find((pageWithImpl) => pageWithImpl.fileName === page.fileName);
174
+ const matchingFile = pagesWithImplementation.find(
175
+ (pageWithImpl) => pageWithImpl.fileName === page.fileName
176
+ );
171
177
  if (matchingFile) {
172
178
  return matchingFile;
173
179
  }
@@ -175,14 +181,15 @@ router.post('/ui/create-system-simple/:handle/:systemId', async (req: KapetaBody
175
181
  return page;
176
182
  });
177
183
 
178
- const systemUrl = await stormClient.createSimpleBackend(handle, systemId, {pages: allFiles});
179
- sendEvent(res, {type: 'SYSTEM_READY', created: Math.floor(Date.now() / 1000), reason: 'System Ready', payload: { systemUrl: systemUrl }});
184
+ const systemUrl = await stormClient.createSimpleBackend(handle, systemId, { pages: allFiles });
185
+ //sendEvent(res, {type: 'SYSTEM_READY', created: Math.floor(Date.now() / 1000), reason: 'System Ready', payload: { systemUrl: systemUrl }});
180
186
 
181
- sendEvent(res, createPhaseEndEvent(StormEventPhaseType.COMPOSE_SYSTEM));
187
+ //sendEvent(res, createPhaseEndEvent(StormEventPhaseType.COMPOSE_SYSTEM));
182
188
 
183
- sendDone(res);
189
+ //sendDone(res);
190
+ res.json({ url: systemUrl });
184
191
  } catch (err: any) {
185
- sendError(err, res);
192
+ res.status(500).json({ error: err.message });
186
193
  } finally {
187
194
  if (!res.closed) {
188
195
  res.end();
@@ -673,6 +680,14 @@ router.post('/:handle/all', async (req: KapetaBodyRequest, res: Response) => {
673
680
  await handleAll(req, res);
674
681
  });
675
682
 
683
+ router.get('/conversations/:agentName/:systemId/redirect', async (req: KapetaBodyRequest, res: Response) => {
684
+ const aiService = getRemoteUrl('ai-service', 'https://ai.kapeta.com');
685
+ const agentName = req.params.agentName as string;
686
+ const systemId = req.params.systemId as string;
687
+
688
+ res.redirect(aiService + `/v2/conversations/${encodeURIComponent(agentName)}/${encodeURIComponent(systemId)}`);
689
+ });
690
+
676
691
  async function handleAll(req: KapetaBodyRequest, res: Response) {
677
692
  const handle = req.params.handle as string;
678
693
  const systemId = (req.query.systemId as string) ?? undefined;