@kapeta/local-cluster-service 0.70.0 → 0.70.2
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 +14 -0
- package/dist/cjs/src/storm/PageGenerator.d.ts +1 -0
- package/dist/cjs/src/storm/PageGenerator.js +16 -4
- package/dist/cjs/src/storm/PromiseQueue.d.ts +2 -0
- package/dist/cjs/src/storm/PromiseQueue.js +8 -1
- package/dist/cjs/src/storm/routes.js +3 -1
- package/dist/esm/src/storm/PageGenerator.d.ts +1 -0
- package/dist/esm/src/storm/PageGenerator.js +16 -4
- package/dist/esm/src/storm/PromiseQueue.d.ts +2 -0
- package/dist/esm/src/storm/PromiseQueue.js +8 -1
- package/dist/esm/src/storm/routes.js +3 -1
- package/package.json +1 -1
- package/src/storm/PageGenerator.ts +17 -4
- package/src/storm/PromiseQueue.ts +10 -1
- package/src/storm/routes.ts +3 -1
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
## [0.70.2](https://github.com/kapetacom/local-cluster-service/compare/v0.70.1...v0.70.2) (2024-09-09)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* Wait for last ([#237](https://github.com/kapetacom/local-cluster-service/issues/237)) ([071bf9e](https://github.com/kapetacom/local-cluster-service/commit/071bf9ea19cb5d5393d7f895c2131311b38325b6))
|
7
|
+
|
8
|
+
## [0.70.1](https://github.com/kapetacom/local-cluster-service/compare/v0.70.0...v0.70.1) (2024-09-09)
|
9
|
+
|
10
|
+
|
11
|
+
### Bug Fixes
|
12
|
+
|
13
|
+
* filenames and lazier generation for refs ([#235](https://github.com/kapetacom/local-cluster-service/issues/235)) ([02c5589](https://github.com/kapetacom/local-cluster-service/commit/02c55895c4ae3ed5632f4b53f33509ec18c87dcb))
|
14
|
+
|
1
15
|
# [0.70.0](https://github.com/kapetacom/local-cluster-service/compare/v0.69.0...v0.70.0) (2024-09-04)
|
2
16
|
|
3
17
|
|
@@ -103,6 +103,9 @@ class PageQueue extends node_events_1.EventEmitter {
|
|
103
103
|
generator.on('event', (event) => this.emit('event', event));
|
104
104
|
generator.on('page_refs', async ({ event, references }) => {
|
105
105
|
try {
|
106
|
+
const matchesExistingPages = (url) => {
|
107
|
+
return [...this.pages.keys()].some((path) => new RegExp(path.replaceAll('/*', '/[^/]+')).test(url));
|
108
|
+
};
|
106
109
|
const initialPrompts = [];
|
107
110
|
const resourcePromises = references.map(async (reference) => {
|
108
111
|
if (reference.url.startsWith('#') ||
|
@@ -124,6 +127,9 @@ class PageQueue extends node_events_1.EventEmitter {
|
|
124
127
|
break;
|
125
128
|
case 'html':
|
126
129
|
//console.log('Adding page generator for', reference);
|
130
|
+
if (matchesExistingPages(reference.url)) {
|
131
|
+
break;
|
132
|
+
}
|
127
133
|
this.pages.set(reference.url, reference.description);
|
128
134
|
initialPrompts.push({
|
129
135
|
name: reference.name,
|
@@ -134,7 +140,8 @@ class PageQueue extends node_events_1.EventEmitter {
|
|
134
140
|
prompt: `Implement a page for ${reference.name} at ${reference.url} with the following description: ${reference.description}.\n` +
|
135
141
|
`The page was referenced from this page: \n### PATH: ${event.payload.path}\n\`\`\`html\n${event.payload.content}\n\`\`\`\n`,
|
136
142
|
description: reference.description,
|
137
|
-
|
143
|
+
// Only used for matching
|
144
|
+
filename: reference.name + '.ref.html',
|
138
145
|
theme: this.theme,
|
139
146
|
});
|
140
147
|
break;
|
@@ -153,7 +160,7 @@ class PageQueue extends node_events_1.EventEmitter {
|
|
153
160
|
payload: {
|
154
161
|
name: prompt.name,
|
155
162
|
title: prompt.title,
|
156
|
-
filename:
|
163
|
+
filename: prompt.filename,
|
157
164
|
method: 'GET',
|
158
165
|
path: prompt.path,
|
159
166
|
prompt: prompt.description,
|
@@ -179,8 +186,13 @@ class PageQueue extends node_events_1.EventEmitter {
|
|
179
186
|
this.eventQueue.cancel();
|
180
187
|
}
|
181
188
|
async wait() {
|
182
|
-
|
183
|
-
|
189
|
+
while (!this.eventQueue.empty || !this.queue.empty) {
|
190
|
+
await this.eventQueue.wait();
|
191
|
+
await this.queue.wait();
|
192
|
+
}
|
193
|
+
}
|
194
|
+
get length() {
|
195
|
+
return this.queue.length + this.eventQueue.length;
|
184
196
|
}
|
185
197
|
async addImagePrompt(prompt) {
|
186
198
|
if (this.images.has(prompt.url)) {
|
@@ -83,8 +83,15 @@ class PromiseQueue {
|
|
83
83
|
}
|
84
84
|
async wait() {
|
85
85
|
while (this.queue.length > 0 || this.active.length > 0) {
|
86
|
-
await Promise.
|
86
|
+
await Promise.allSettled(this.active);
|
87
|
+
this.next();
|
87
88
|
}
|
88
89
|
}
|
90
|
+
get empty() {
|
91
|
+
return this.queue.length === 0 && this.active.length === 0;
|
92
|
+
}
|
93
|
+
get length() {
|
94
|
+
return this.queue.length + this.active.length;
|
95
|
+
}
|
89
96
|
}
|
90
97
|
exports.PromiseQueue = PromiseQueue;
|
@@ -420,7 +420,9 @@ router.post('/ui/edit', async (req, res) => {
|
|
420
420
|
const promises = [];
|
421
421
|
queue.on('page', (data) => {
|
422
422
|
if (systemId) {
|
423
|
-
|
423
|
+
const promise = sendPageEvent(systemId, data, res);
|
424
|
+
promises.push(promise);
|
425
|
+
return promise;
|
424
426
|
}
|
425
427
|
});
|
426
428
|
queue.on('event', (data) => {
|
@@ -103,6 +103,9 @@ class PageQueue extends node_events_1.EventEmitter {
|
|
103
103
|
generator.on('event', (event) => this.emit('event', event));
|
104
104
|
generator.on('page_refs', async ({ event, references }) => {
|
105
105
|
try {
|
106
|
+
const matchesExistingPages = (url) => {
|
107
|
+
return [...this.pages.keys()].some((path) => new RegExp(path.replaceAll('/*', '/[^/]+')).test(url));
|
108
|
+
};
|
106
109
|
const initialPrompts = [];
|
107
110
|
const resourcePromises = references.map(async (reference) => {
|
108
111
|
if (reference.url.startsWith('#') ||
|
@@ -124,6 +127,9 @@ class PageQueue extends node_events_1.EventEmitter {
|
|
124
127
|
break;
|
125
128
|
case 'html':
|
126
129
|
//console.log('Adding page generator for', reference);
|
130
|
+
if (matchesExistingPages(reference.url)) {
|
131
|
+
break;
|
132
|
+
}
|
127
133
|
this.pages.set(reference.url, reference.description);
|
128
134
|
initialPrompts.push({
|
129
135
|
name: reference.name,
|
@@ -134,7 +140,8 @@ class PageQueue extends node_events_1.EventEmitter {
|
|
134
140
|
prompt: `Implement a page for ${reference.name} at ${reference.url} with the following description: ${reference.description}.\n` +
|
135
141
|
`The page was referenced from this page: \n### PATH: ${event.payload.path}\n\`\`\`html\n${event.payload.content}\n\`\`\`\n`,
|
136
142
|
description: reference.description,
|
137
|
-
|
143
|
+
// Only used for matching
|
144
|
+
filename: reference.name + '.ref.html',
|
138
145
|
theme: this.theme,
|
139
146
|
});
|
140
147
|
break;
|
@@ -153,7 +160,7 @@ class PageQueue extends node_events_1.EventEmitter {
|
|
153
160
|
payload: {
|
154
161
|
name: prompt.name,
|
155
162
|
title: prompt.title,
|
156
|
-
filename:
|
163
|
+
filename: prompt.filename,
|
157
164
|
method: 'GET',
|
158
165
|
path: prompt.path,
|
159
166
|
prompt: prompt.description,
|
@@ -179,8 +186,13 @@ class PageQueue extends node_events_1.EventEmitter {
|
|
179
186
|
this.eventQueue.cancel();
|
180
187
|
}
|
181
188
|
async wait() {
|
182
|
-
|
183
|
-
|
189
|
+
while (!this.eventQueue.empty || !this.queue.empty) {
|
190
|
+
await this.eventQueue.wait();
|
191
|
+
await this.queue.wait();
|
192
|
+
}
|
193
|
+
}
|
194
|
+
get length() {
|
195
|
+
return this.queue.length + this.eventQueue.length;
|
184
196
|
}
|
185
197
|
async addImagePrompt(prompt) {
|
186
198
|
if (this.images.has(prompt.url)) {
|
@@ -83,8 +83,15 @@ class PromiseQueue {
|
|
83
83
|
}
|
84
84
|
async wait() {
|
85
85
|
while (this.queue.length > 0 || this.active.length > 0) {
|
86
|
-
await Promise.
|
86
|
+
await Promise.allSettled(this.active);
|
87
|
+
this.next();
|
87
88
|
}
|
88
89
|
}
|
90
|
+
get empty() {
|
91
|
+
return this.queue.length === 0 && this.active.length === 0;
|
92
|
+
}
|
93
|
+
get length() {
|
94
|
+
return this.queue.length + this.active.length;
|
95
|
+
}
|
89
96
|
}
|
90
97
|
exports.PromiseQueue = PromiseQueue;
|
@@ -420,7 +420,9 @@ router.post('/ui/edit', async (req, res) => {
|
|
420
420
|
const promises = [];
|
421
421
|
queue.on('page', (data) => {
|
422
422
|
if (systemId) {
|
423
|
-
|
423
|
+
const promise = sendPageEvent(systemId, data, res);
|
424
|
+
promises.push(promise);
|
425
|
+
return promise;
|
424
426
|
}
|
425
427
|
});
|
426
428
|
queue.on('event', (data) => {
|
package/package.json
CHANGED
@@ -136,6 +136,9 @@ export class PageQueue extends EventEmitter {
|
|
136
136
|
generator.on('event', (event: StormEvent) => this.emit('event', event));
|
137
137
|
generator.on('page_refs', async ({ event, references }) => {
|
138
138
|
try {
|
139
|
+
const matchesExistingPages = (url: string) => {
|
140
|
+
return [...this.pages.keys()].some((path) => new RegExp(path.replaceAll('/*', '/[^/]+')).test(url));
|
141
|
+
};
|
139
142
|
const initialPrompts: InitialPrompt[] = [];
|
140
143
|
const resourcePromises = references.map(async (reference) => {
|
141
144
|
if (
|
@@ -160,6 +163,9 @@ export class PageQueue extends EventEmitter {
|
|
160
163
|
break;
|
161
164
|
case 'html':
|
162
165
|
//console.log('Adding page generator for', reference);
|
166
|
+
if (matchesExistingPages(reference.url)) {
|
167
|
+
break;
|
168
|
+
}
|
163
169
|
this.pages.set(reference.url, reference.description);
|
164
170
|
|
165
171
|
initialPrompts.push({
|
@@ -172,7 +178,8 @@ export class PageQueue extends EventEmitter {
|
|
172
178
|
`Implement a page for ${reference.name} at ${reference.url} with the following description: ${reference.description}.\n` +
|
173
179
|
`The page was referenced from this page: \n### PATH: ${event.payload.path}\n\`\`\`html\n${event.payload.content}\n\`\`\`\n`,
|
174
180
|
description: reference.description,
|
175
|
-
|
181
|
+
// Only used for matching
|
182
|
+
filename: reference.name + '.ref.html',
|
176
183
|
theme: this.theme,
|
177
184
|
});
|
178
185
|
break;
|
@@ -193,7 +200,7 @@ export class PageQueue extends EventEmitter {
|
|
193
200
|
payload: {
|
194
201
|
name: prompt.name,
|
195
202
|
title: prompt.title,
|
196
|
-
filename:
|
203
|
+
filename: prompt.filename,
|
197
204
|
method: 'GET',
|
198
205
|
path: prompt.path,
|
199
206
|
prompt: prompt.description,
|
@@ -220,8 +227,14 @@ export class PageQueue extends EventEmitter {
|
|
220
227
|
}
|
221
228
|
|
222
229
|
public async wait() {
|
223
|
-
|
224
|
-
|
230
|
+
while (!this.eventQueue.empty || !this.queue.empty) {
|
231
|
+
await this.eventQueue.wait();
|
232
|
+
await this.queue.wait();
|
233
|
+
}
|
234
|
+
}
|
235
|
+
|
236
|
+
public get length() {
|
237
|
+
return this.queue.length + this.eventQueue.length;
|
225
238
|
}
|
226
239
|
|
227
240
|
private async addImagePrompt(prompt: ImagePrompt) {
|
@@ -114,7 +114,16 @@ export class PromiseQueue {
|
|
114
114
|
|
115
115
|
public async wait() {
|
116
116
|
while (this.queue.length > 0 || this.active.length > 0) {
|
117
|
-
await Promise.
|
117
|
+
await Promise.allSettled(this.active);
|
118
|
+
this.next();
|
118
119
|
}
|
119
120
|
}
|
121
|
+
|
122
|
+
public get empty() {
|
123
|
+
return this.queue.length === 0 && this.active.length === 0;
|
124
|
+
}
|
125
|
+
|
126
|
+
public get length() {
|
127
|
+
return this.queue.length + this.active.length;
|
128
|
+
}
|
120
129
|
}
|
package/src/storm/routes.ts
CHANGED
@@ -519,7 +519,9 @@ router.post('/ui/edit', async (req: KapetaBodyRequest, res: Response) => {
|
|
519
519
|
|
520
520
|
queue.on('page', (data) => {
|
521
521
|
if (systemId) {
|
522
|
-
|
522
|
+
const promise = sendPageEvent(systemId, data, res);
|
523
|
+
promises.push(promise);
|
524
|
+
return promise;
|
523
525
|
}
|
524
526
|
});
|
525
527
|
|