@cat-factory/server 0.113.6 → 0.113.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/dist/events/FanOutEventPublisher.d.ts +4 -0
- package/dist/events/FanOutEventPublisher.d.ts.map +1 -1
- package/dist/events/FanOutEventPublisher.js +24 -30
- package/dist/events/FanOutEventPublisher.js.map +1 -1
- package/dist/modules/serviceSpec/readServiceSpec.d.ts.map +1 -1
- package/dist/modules/serviceSpec/readServiceSpec.js +8 -23
- package/dist/modules/serviceSpec/readServiceSpec.js.map +1 -1
- package/package.json +4 -3
|
@@ -13,6 +13,10 @@ export interface FanOutEventPublisherDependencies {
|
|
|
13
13
|
* client reconciles any miss by re-fetching its snapshot. When a block can't be resolved to
|
|
14
14
|
* a service (e.g. a legacy workspace-local block, or a coarse `boardChanged` with no block)
|
|
15
15
|
* it falls back to delivering to the originating workspace only.
|
|
16
|
+
*
|
|
17
|
+
* The per-target forwards are independent (one DO round-trip per mounting workspace on the
|
|
18
|
+
* Worker), so they run concurrently via `Promise.all` — a shared service mounted on N boards
|
|
19
|
+
* pays one round-trip's latency, not N serial ones — rather than awaiting each in turn.
|
|
16
20
|
*/
|
|
17
21
|
export declare class FanOutEventPublisher implements ExecutionEventPublisher {
|
|
18
22
|
private readonly inner;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FanOutEventPublisher.d.ts","sourceRoot":"","sources":["../../src/events/FanOutEventPublisher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,qBAAqB,CAAA;AAE5B,MAAM,WAAW,gCAAgC;IAC/C,wBAAwB,EAAE,IAAI,CAAC,wBAAwB,EAAE,+BAA+B,CAAC,CAAA;CAC1F;AAED
|
|
1
|
+
{"version":3,"file":"FanOutEventPublisher.d.ts","sourceRoot":"","sources":["../../src/events/FanOutEventPublisher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,qBAAqB,CAAA;AAE5B,MAAM,WAAW,gCAAgC;IAC/C,wBAAwB,EAAE,IAAI,CAAC,wBAAwB,EAAE,+BAA+B,CAAC,CAAA;CAC1F;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,oBAAqB,YAAW,uBAAuB;IAEhE,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFvB,YACmB,KAAK,EAAE,uBAAuB,EAC9B,IAAI,EAAE,gCAAgC,EACrD;IAEJ,0FAA0F;YAC5E,OAAO;IAWf,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,GACnB,OAAO,CAAC,IAAI,CAAC,CAGf;IAEK,YAAY,CAChB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,EACvB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,GACjC,OAAO,CAAC,IAAI,CAAC,CASf;IAEK,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,YAAY,EACjB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,GACnB,OAAO,CAAC,IAAI,CAAC,CAGf;IAIK,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAExF;IAGK,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhF;IAEK,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxF;IAEK,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnF;IAEK,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5F;IAEK,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3F;IAEK,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpF;IAEK,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7F;IAEK,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlF;IAEK,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1F;CACF"}
|
|
@@ -9,6 +9,10 @@
|
|
|
9
9
|
* client reconciles any miss by re-fetching its snapshot. When a block can't be resolved to
|
|
10
10
|
* a service (e.g. a legacy workspace-local block, or a coarse `boardChanged` with no block)
|
|
11
11
|
* it falls back to delivering to the originating workspace only.
|
|
12
|
+
*
|
|
13
|
+
* The per-target forwards are independent (one DO round-trip per mounting workspace on the
|
|
14
|
+
* Worker), so they run concurrently via `Promise.all` — a shared service mounted on N boards
|
|
15
|
+
* pays one round-trip's latency, not N serial ones — rather than awaiting each in turn.
|
|
12
16
|
*/
|
|
13
17
|
export class FanOutEventPublisher {
|
|
14
18
|
inner;
|
|
@@ -27,23 +31,20 @@ export class FanOutEventPublisher {
|
|
|
27
31
|
return [...new Set([originWorkspaceId, ...mounting])];
|
|
28
32
|
}
|
|
29
33
|
async executionChanged(workspaceId, instance, block) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
34
|
+
const targets = await this.targets(workspaceId, block?.id ?? instance.blockId);
|
|
35
|
+
await Promise.all(targets.map((ws) => this.inner.executionChanged(ws, instance, block)));
|
|
33
36
|
}
|
|
34
37
|
async boardChanged(workspaceId, reason, blockId, originConnectionId) {
|
|
35
38
|
// A structural change to a shared service (a module materialised, a run cancelled, a
|
|
36
39
|
// bootstrap finished) must prompt a refresh on EVERY board that mounts it. When the caller
|
|
37
40
|
// names a block of the affected service we resolve it to that set; a genuinely block-less
|
|
38
41
|
// signal falls back to the originating workspace only.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
+
const targets = await this.targets(workspaceId, blockId);
|
|
43
|
+
await Promise.all(targets.map((ws) => this.inner.boardChanged(ws, reason, blockId, originConnectionId)));
|
|
42
44
|
}
|
|
43
45
|
async bootstrapChanged(workspaceId, job, block) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
46
|
+
const targets = await this.targets(workspaceId, block?.id ?? job.blockId);
|
|
47
|
+
await Promise.all(targets.map((ws) => this.inner.bootstrapChanged?.(ws, job, block)));
|
|
47
48
|
}
|
|
48
49
|
// A repair run has no board block, so there's no shared-service fan-out — it is purely
|
|
49
50
|
// workspace-scoped. Forward straight to the inner publisher for this workspace.
|
|
@@ -55,9 +56,8 @@ export class FanOutEventPublisher {
|
|
|
55
56
|
await this.inner.envTestChanged?.(workspaceId, run);
|
|
56
57
|
}
|
|
57
58
|
async notificationChanged(workspaceId, notification) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
59
|
+
const targets = await this.targets(workspaceId, notification.blockId);
|
|
60
|
+
await Promise.all(targets.map((ws) => this.inner.notificationChanged?.(ws, notification)));
|
|
61
61
|
}
|
|
62
62
|
async llmCallObserved(workspaceId, activity) {
|
|
63
63
|
// The compact activity carries no block id, so there is nothing to resolve a shared
|
|
@@ -67,34 +67,28 @@ export class FanOutEventPublisher {
|
|
|
67
67
|
await this.inner.llmCallObserved?.(workspaceId, activity);
|
|
68
68
|
}
|
|
69
69
|
async requirementReviewChanged(workspaceId, review) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
70
|
+
const targets = await this.targets(workspaceId, review.blockId);
|
|
71
|
+
await Promise.all(targets.map((ws) => this.inner.requirementReviewChanged?.(ws, review)));
|
|
73
72
|
}
|
|
74
73
|
async consensusSessionChanged(workspaceId, session) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
74
|
+
const targets = await this.targets(workspaceId, session.blockId);
|
|
75
|
+
await Promise.all(targets.map((ws) => this.inner.consensusSessionChanged?.(ws, session)));
|
|
78
76
|
}
|
|
79
77
|
async clarityReviewChanged(workspaceId, review) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
78
|
+
const targets = await this.targets(workspaceId, review.blockId);
|
|
79
|
+
await Promise.all(targets.map((ws) => this.inner.clarityReviewChanged?.(ws, review)));
|
|
83
80
|
}
|
|
84
81
|
async brainstormSessionChanged(workspaceId, session) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
82
|
+
const targets = await this.targets(workspaceId, session.blockId);
|
|
83
|
+
await Promise.all(targets.map((ws) => this.inner.brainstormSessionChanged?.(ws, session)));
|
|
88
84
|
}
|
|
89
85
|
async initiativeChanged(workspaceId, initiative) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
86
|
+
const targets = await this.targets(workspaceId, initiative.blockId);
|
|
87
|
+
await Promise.all(targets.map((ws) => this.inner.initiativeChanged?.(ws, initiative)));
|
|
93
88
|
}
|
|
94
89
|
async docInterviewChanged(workspaceId, session) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
90
|
+
const targets = await this.targets(workspaceId, session.blockId);
|
|
91
|
+
await Promise.all(targets.map((ws) => this.inner.docInterviewChanged?.(ws, session)));
|
|
98
92
|
}
|
|
99
93
|
}
|
|
100
94
|
//# sourceMappingURL=FanOutEventPublisher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FanOutEventPublisher.js","sourceRoot":"","sources":["../../src/events/FanOutEventPublisher.ts"],"names":[],"mappings":"AAsBA
|
|
1
|
+
{"version":3,"file":"FanOutEventPublisher.js","sourceRoot":"","sources":["../../src/events/FanOutEventPublisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readServiceSpec.d.ts","sourceRoot":"","sources":["../../../src/modules/serviceSpec/readServiceSpec.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,eAAe,EAIrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAoB,SAAS,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"readServiceSpec.d.ts","sourceRoot":"","sources":["../../../src/modules/serviceSpec/readServiceSpec.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,eAAe,EAIrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAoB,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAmFtE,mFAAmF;AACnF,wBAAsB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAyF5F"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EMPTY_SERVICE_SPEC_VIEW, SPEC_FEATURES_DIR, SPEC_MODULES_DIR, SPEC_SERVICE_PATH, safeParseDomainRule, safeParseRequirementGroup, safeParseRequirementItem, safeParseSpecModule, } from '@cat-factory/contracts';
|
|
2
|
+
import pMap from 'p-map';
|
|
2
3
|
// Reassemble the SHARDED `spec/` artifact into a single {@link ServiceSpecView} for the
|
|
3
4
|
// SPA, reading it checkout-free from the repo's default branch (main) via {@link RepoFiles}.
|
|
4
5
|
// The spec-writer harness writes the tree across many files (one canonical JSON shard per
|
|
@@ -76,19 +77,6 @@ async function safeList(repo, path, ref) {
|
|
|
76
77
|
return [];
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
|
-
/** Map `items` through `fn` with at most `limit` in flight; results preserve input order. */
|
|
80
|
-
async function mapLimit(items, limit, fn) {
|
|
81
|
-
const results = Array.from({ length: items.length });
|
|
82
|
-
let next = 0;
|
|
83
|
-
const worker = async () => {
|
|
84
|
-
while (next < items.length) {
|
|
85
|
-
const i = next++;
|
|
86
|
-
results[i] = await fn(items[i], i);
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));
|
|
90
|
-
return results;
|
|
91
|
-
}
|
|
92
80
|
/** Read + reassemble the spec on `ref` (the repo default branch). Never throws. */
|
|
93
81
|
export async function readServiceSpec(repo, ref) {
|
|
94
82
|
// The presence anchor: no readable object `spec/service.json` ⇒ no spec on this branch.
|
|
@@ -107,7 +95,7 @@ export async function readServiceSpec(repo, ref) {
|
|
|
107
95
|
const moduleSlugToName = new Map();
|
|
108
96
|
const groupSlugToName = new Map();
|
|
109
97
|
// Phase A: per module, read its `_module.json` (for the display name) and list its shards.
|
|
110
|
-
const moduleInfos = await
|
|
98
|
+
const moduleInfos = await pMap(moduleDirs, async (dir) => {
|
|
111
99
|
const slug = dir.name;
|
|
112
100
|
const [meta, entries] = await Promise.all([
|
|
113
101
|
safeGetFile(repo, `${dir.path}/_module.json`, ref),
|
|
@@ -122,7 +110,7 @@ export async function readServiceSpec(repo, ref) {
|
|
|
122
110
|
// Every `*.json` except `_module.json` is one canonical group shard.
|
|
123
111
|
const shards = entries.filter((e) => e.type === 'file' && e.name.endsWith('.json') && e.name !== '_module.json');
|
|
124
112
|
return { slug, moduleName, summary: metaObj?.summary ?? '', shards };
|
|
125
|
-
});
|
|
113
|
+
}, { concurrency: READ_CONCURRENCY });
|
|
126
114
|
// Phase B: read every group shard across all modules through one bounded queue (this is the
|
|
127
115
|
// largest fan-out), then validate PER SHARD so a malformed group is dropped, not the tree.
|
|
128
116
|
const shardRefs = moduleInfos.flatMap((m) => m.shards.map((entry) => ({
|
|
@@ -130,10 +118,7 @@ export async function readServiceSpec(repo, ref) {
|
|
|
130
118
|
groupSlug: entry.name.replace(/\.json$/, ''),
|
|
131
119
|
entry,
|
|
132
120
|
})));
|
|
133
|
-
const shardContents = await
|
|
134
|
-
ref: s,
|
|
135
|
-
file: await safeGetFile(repo, s.entry.path, ref),
|
|
136
|
-
}));
|
|
121
|
+
const shardContents = await pMap(shardRefs, async (s) => ({ ref: s, file: await safeGetFile(repo, s.entry.path, ref) }), { concurrency: READ_CONCURRENCY });
|
|
137
122
|
const groupsByModule = new Map();
|
|
138
123
|
for (const { ref: s, file } of shardContents) {
|
|
139
124
|
const group = file ? coerceGroupShard(parseJson(file.content)) : undefined;
|
|
@@ -165,14 +150,14 @@ export async function readServiceSpec(repo, ref) {
|
|
|
165
150
|
/** Read the seeded Gherkin `.feature` files under `spec/features/<module>/<group>.feature`. */
|
|
166
151
|
async function readFeatureFiles(repo, ref, moduleSlugToName, groupSlugToName) {
|
|
167
152
|
const moduleDirs = (await safeList(repo, SPEC_FEATURES_DIR, ref)).filter((e) => e.type === 'dir');
|
|
168
|
-
const perModule = await
|
|
153
|
+
const perModule = await pMap(moduleDirs, async (dir) => {
|
|
169
154
|
const entries = await safeList(repo, dir.path, ref);
|
|
170
155
|
return entries
|
|
171
156
|
.filter((e) => e.type === 'file' && e.name.endsWith('.feature'))
|
|
172
157
|
.map((entry) => ({ slug: dir.name, entry }));
|
|
173
|
-
});
|
|
158
|
+
}, { concurrency: READ_CONCURRENCY });
|
|
174
159
|
const featureRefs = perModule.flat();
|
|
175
|
-
const read = await
|
|
160
|
+
const read = await pMap(featureRefs, async (fr) => {
|
|
176
161
|
const file = await safeGetFile(repo, fr.entry.path, ref);
|
|
177
162
|
if (!file)
|
|
178
163
|
return null;
|
|
@@ -183,7 +168,7 @@ async function readFeatureFiles(repo, ref, moduleSlugToName, groupSlugToName) {
|
|
|
183
168
|
path: fr.entry.path,
|
|
184
169
|
content: file.content,
|
|
185
170
|
};
|
|
186
|
-
});
|
|
171
|
+
}, { concurrency: READ_CONCURRENCY });
|
|
187
172
|
return read.filter((x) => x !== null);
|
|
188
173
|
}
|
|
189
174
|
//# sourceMappingURL=readServiceSpec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readServiceSpec.js","sourceRoot":"","sources":["../../../src/modules/serviceSpec/readServiceSpec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,mBAAmB,GAMpB,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"readServiceSpec.js","sourceRoot":"","sources":["../../../src/modules/serviceSpec/readServiceSpec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/server",
|
|
3
|
-
"version": "0.113.
|
|
3
|
+
"version": "0.113.7",
|
|
4
4
|
"description": "Runtime-neutral HTTP layer for the Agent Architecture Board: the Hono controllers, middleware (auth/authz/CORS/error), request helpers and the gateway seams shared by every deployment facade (Cloudflare Worker, Node service).",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -28,13 +28,14 @@
|
|
|
28
28
|
"@toad-contracts/hono": "0.3.2",
|
|
29
29
|
"@toad-contracts/valibot": "0.5.0",
|
|
30
30
|
"hono": "^4.12.29",
|
|
31
|
+
"p-map": "^7.0.5",
|
|
31
32
|
"pino": "^10.3.1",
|
|
32
33
|
"valibot": "^1.4.2",
|
|
33
34
|
"@cat-factory/agents": "0.54.10",
|
|
34
35
|
"@cat-factory/contracts": "0.128.1",
|
|
35
|
-
"@cat-factory/integrations": "0.81.
|
|
36
|
+
"@cat-factory/integrations": "0.81.19",
|
|
36
37
|
"@cat-factory/kernel": "0.123.2",
|
|
37
|
-
"@cat-factory/orchestration": "0.107.
|
|
38
|
+
"@cat-factory/orchestration": "0.107.5",
|
|
38
39
|
"@cat-factory/prompt-fragments": "0.13.16",
|
|
39
40
|
"@cat-factory/spend": "0.12.26"
|
|
40
41
|
},
|