@cat-factory/server 0.13.2 → 0.14.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/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAChC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AA2C3C;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAwD5E"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAChC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AA4C3C;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAyD5E"}
package/dist/app.js CHANGED
@@ -34,6 +34,7 @@ import { localModelEndpointController } from './modules/localModels/LocalModelEn
34
34
  import { openRouterCatalogController } from './modules/openrouter/OpenRouterCatalogController.js';
35
35
  import { userApiKeyController, workspaceApiKeyController, } from './modules/providers/ApiKeyController.js';
36
36
  import { serviceMountController } from './modules/services/ServiceMountController.js';
37
+ import { serviceSpecController } from './modules/serviceSpec/ServiceSpecController.js';
37
38
  import { taskSourceController } from './modules/tasks/TaskSourceController.js';
38
39
  import { workspaceController } from './modules/workspaces/WorkspaceController.js';
39
40
  /**
@@ -93,6 +94,7 @@ export function registerCoreControllers(app) {
93
94
  app.route('/workspaces/:workspaceId', recurringPipelineController());
94
95
  app.route('/workspaces/:workspaceId', trackerSettingsController());
95
96
  app.route('/workspaces/:workspaceId', serviceMountController());
97
+ app.route('/workspaces/:workspaceId', serviceSpecController());
96
98
  app.route('/workspaces/:workspaceId', fragmentLibraryController('workspace'));
97
99
  app.route('/workspaces/:workspaceId', githubController());
98
100
  app.route('/workspaces/:workspaceId', slackController());
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { AgentRunRepository, ConsensusSessionRepository } from '@cat-factory/kernel';
1
+ import type { AgentRunRepository, ConsensusSessionRepository, ResolveRunRepoContext } from '@cat-factory/kernel';
2
2
  import type { ApiKeyService, LocalModelEndpointService, OpenRouterCatalogService, PersonalSubscriptionService, ProviderSubscriptionService } from '@cat-factory/integrations';
3
3
  import type { Core } from '@cat-factory/orchestration';
4
4
  import type { SessionPayload } from '../auth/signing.js';
@@ -16,6 +16,15 @@ export interface ServerContainer extends Core {
16
16
  consensusSessionRepository?: ConsensusSessionRepository;
17
17
  /** Per-facade runtime seams (real-time delivery, …) the shared controllers use. */
18
18
  gateways: RuntimeGateways;
19
+ /**
20
+ * Resolve a block's run repo (installation + repo + default branch) bound to a
21
+ * checkout-free {@link RepoFiles}. The engine uses it to run a registered kind's
22
+ * pre/post-ops; the shared service-spec read controller reuses it to read the sharded
23
+ * `spec/` artifact off the default branch. Present only when GitHub is wired (the same
24
+ * composition both facades already build via `makeResolveRunRepoContext`); absent → the
25
+ * spec endpoint returns an empty view.
26
+ */
27
+ resolveRunRepoContext?: ResolveRunRepoContext;
19
28
  /**
20
29
  * The workspace subscription-token pool (Claude Code / Codex credentials).
21
30
  * Present only when the facade wired the provider-subscription repository.
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/http/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AACzF,OAAO,KAAK,EACV,aAAa,EACb,yBAAyB,EACzB,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAQ7D,MAAM,WAAW,eAAgB,SAAQ,IAAI;IAC3C,MAAM,EAAE,SAAS,CAAA;IACjB,8EAA8E;IAC9E,kBAAkB,EAAE,kBAAkB,CAAA;IACtC;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,0BAA0B,CAAA;IACvD,mFAAmF;IACnF,QAAQ,EAAE,eAAe,CAAA;IACzB;;;OAGG;IACH,aAAa,CAAC,EAAE,2BAA2B,CAAA;IAC3C;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,2BAA2B,CAAA;IACnD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC5D;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,yBAAyB,CAAA;IAC/C;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,wBAAwB,CAAA;CAC7C;AAED,4FAA4F;AAC5F,MAAM,MAAM,MAAM,GAAG;IACnB,SAAS,EAAE;QACT,SAAS,EAAE,eAAe,CAAA;QAC1B,yEAAyE;QACzE,IAAI,CAAC,EAAE,cAAc,CAAA;KACtB,CAAA;CACF,CAAA"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/http/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,0BAA0B,EAC1B,qBAAqB,EACtB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EACV,aAAa,EACb,yBAAyB,EACzB,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAQ7D,MAAM,WAAW,eAAgB,SAAQ,IAAI;IAC3C,MAAM,EAAE,SAAS,CAAA;IACjB,8EAA8E;IAC9E,kBAAkB,EAAE,kBAAkB,CAAA;IACtC;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,0BAA0B,CAAA;IACvD,mFAAmF;IACnF,QAAQ,EAAE,eAAe,CAAA;IACzB;;;;;;;OAOG;IACH,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAC7C;;;OAGG;IACH,aAAa,CAAC,EAAE,2BAA2B,CAAA;IAC3C;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,2BAA2B,CAAA;IACnD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC5D;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,yBAAyB,CAAA;IAC/C;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,wBAAwB,CAAA;CAC7C;AAED,4FAA4F;AAC5F,MAAM,MAAM,MAAM,GAAG;IACnB,SAAS,EAAE;QACT,SAAS,EAAE,eAAe,CAAA;QAC1B,yEAAyE;QACzE,IAAI,CAAC,EAAE,cAAc,CAAA;KACtB,CAAA;CACF,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { Hono } from 'hono';
2
+ import type { AppEnv } from '../../http/env.js';
3
+ /**
4
+ * Workspace-scoped service-spec read endpoint. The prescriptive spec lives sharded in the
5
+ * service repo under `spec/`; the SPA cannot read a repo, so this reassembles the tree from
6
+ * the repo's DEFAULT branch (main) and serves it for the inspector's "View Requirements"
7
+ * window. Read-only: it never writes the repo.
8
+ *
9
+ * It resolves the block's repo through the same `resolveRunRepoContext` seam the engine uses
10
+ * to bind a run's pre/post-ops (installation + repo + default branch), so it is
11
+ * runtime-symmetric — both facades wire the resolver. When GitHub isn't connected (no
12
+ * resolver, no linked repo) or no spec exists yet, it returns `{ present: false }` so the
13
+ * window shows an empty state instead of erroring. Mounted under `/workspaces/:workspaceId`.
14
+ */
15
+ export declare function serviceSpecController(): Hono<AppEnv>;
16
+ //# sourceMappingURL=ServiceSpecController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceSpecController.d.ts","sourceRoot":"","sources":["../../../src/modules/serviceSpec/ServiceSpecController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAM/C;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAAC,MAAM,CAAC,CA0BpD"}
@@ -0,0 +1,47 @@
1
+ import { EMPTY_SERVICE_SPEC_VIEW } from '@cat-factory/contracts';
2
+ import { Hono } from 'hono';
3
+ import { param } from '../../http/params.js';
4
+ import { readServiceSpec } from './readServiceSpec.js';
5
+ const EMPTY = EMPTY_SERVICE_SPEC_VIEW;
6
+ /**
7
+ * Workspace-scoped service-spec read endpoint. The prescriptive spec lives sharded in the
8
+ * service repo under `spec/`; the SPA cannot read a repo, so this reassembles the tree from
9
+ * the repo's DEFAULT branch (main) and serves it for the inspector's "View Requirements"
10
+ * window. Read-only: it never writes the repo.
11
+ *
12
+ * It resolves the block's repo through the same `resolveRunRepoContext` seam the engine uses
13
+ * to bind a run's pre/post-ops (installation + repo + default branch), so it is
14
+ * runtime-symmetric — both facades wire the resolver. When GitHub isn't connected (no
15
+ * resolver, no linked repo) or no spec exists yet, it returns `{ present: false }` so the
16
+ * window shows an empty state instead of erroring. Mounted under `/workspaces/:workspaceId`.
17
+ */
18
+ export function serviceSpecController() {
19
+ const app = new Hono();
20
+ app.get('/blocks/:blockId/spec', async (c) => {
21
+ const container = c.get('container');
22
+ const resolve = container.resolveRunRepoContext;
23
+ if (!resolve)
24
+ return c.json(EMPTY);
25
+ let ctx;
26
+ try {
27
+ ctx = await resolve(param(c, 'workspaceId'), param(c, 'blockId'));
28
+ }
29
+ catch {
30
+ // A block under no linked service throws in the resolver; treat as "no spec" for the
31
+ // read path rather than surfacing the misconfiguration to the inspector.
32
+ return c.json(EMPTY);
33
+ }
34
+ if (!ctx)
35
+ return c.json(EMPTY);
36
+ // `readServiceSpec` is total (every repo read is guarded), but keep a defensive fallback
37
+ // so a transient GitHub failure can never 500 the inspector — it shows an empty state.
38
+ try {
39
+ return c.json(await readServiceSpec(ctx.repo, ctx.baseBranch));
40
+ }
41
+ catch {
42
+ return c.json(EMPTY);
43
+ }
44
+ });
45
+ return app;
46
+ }
47
+ //# sourceMappingURL=ServiceSpecController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceSpecController.js","sourceRoot":"","sources":["../../../src/modules/serviceSpec/ServiceSpecController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,MAAM,KAAK,GAAG,uBAAuB,CAAA;AAErC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3C,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,MAAM,OAAO,GAAG,SAAS,CAAC,qBAAqB,CAAA;QAC/C,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,IAAI,GAAG,CAAA;QACP,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,qFAAqF;YACrF,yEAAyE;YACzE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC;QACD,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9B,yFAAyF;QACzF,uFAAuF;QACvF,IAAI,CAAC;YACH,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAA;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type ServiceSpecView } from '@cat-factory/contracts';
2
+ import type { RepoFiles } from '@cat-factory/kernel';
3
+ /** Read + reassemble the spec on `ref` (the repo default branch). Never throws. */
4
+ export declare function readServiceSpec(repo: RepoFiles, ref: string): Promise<ServiceSpecView>;
5
+ //# sourceMappingURL=readServiceSpec.d.ts.map
@@ -0,0 +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;AAoGtE,mFAAmF;AACnF,wBAAsB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAoF5F"}
@@ -0,0 +1,189 @@
1
+ import { EMPTY_SERVICE_SPEC_VIEW, SPEC_FEATURES_DIR, SPEC_MODULES_DIR, SPEC_SERVICE_PATH, safeParseDomainRule, safeParseRequirementGroup, safeParseRequirementItem, safeParseSpecModule, } from '@cat-factory/contracts';
2
+ // Reassemble the SHARDED `spec/` artifact into a single {@link ServiceSpecView} for the
3
+ // SPA, reading it checkout-free from the repo's default branch (main) via {@link RepoFiles}.
4
+ // The spec-writer harness writes the tree across many files (one canonical JSON shard per
5
+ // feature group, plus seeded Gherkin `.feature` files) so concurrent task branches merge
6
+ // cleanly; the slugs are filesystem-only (collision-suffixed, name-sorted), so the only way
7
+ // to recover the tree is to walk the directories — names live inside the shards, not the
8
+ // paths. This is the read-side mirror of the harness's `readExistingSpec`, over HTTP.
9
+ //
10
+ // Two resilience properties this reader guarantees, so the inspector never sees a 500 or a
11
+ // misleading "no spec" state:
12
+ // 1. Every repo read is total — a non-404 GitHub error (rate limit, 5xx, network) is
13
+ // treated as "missing" rather than thrown, so a flaky read degrades to a partial view
14
+ // instead of erroring the controller.
15
+ // 2. The tree is validated PER NODE, down to the individual requirement/rule — a malformed
16
+ // module shard is dropped without the rest of the tree, and a group shard is salvaged one
17
+ // requirement/rule at a time (so ONE field past a schema cap the lenient writer never
18
+ // enforced drops only that requirement, not the whole group with its valid siblings).
19
+ const EMPTY = EMPTY_SERVICE_SPEC_VIEW;
20
+ // Cap concurrent GitHub reads so a large spec doesn't fire a burst of dozens of parallel
21
+ // requests at once (GitHub flags high concurrency as secondary-rate-limit abuse). The reads
22
+ // are still parallel, just bounded.
23
+ const READ_CONCURRENCY = 12;
24
+ function parseJson(content) {
25
+ try {
26
+ return JSON.parse(content);
27
+ }
28
+ catch {
29
+ return undefined;
30
+ }
31
+ }
32
+ /** A trimmed non-empty string, else undefined — so a blank value falls back like a missing one. */
33
+ function nonEmptyString(value) {
34
+ return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;
35
+ }
36
+ /**
37
+ * Parse one group shard, salvaging it PER REQUIREMENT/RULE. A strict whole-shard parse is
38
+ * tried first (the happy path). On failure — typically ONE field past a schema cap the
39
+ * lenient writer never enforces (e.g. a >120-char requirement title) — the group is rebuilt
40
+ * from its individually-validated requirements/rules, so one bad item drops only itself, not
41
+ * the whole group with its valid siblings. Returns undefined only when even the group's own
42
+ * identity (its name) is unrecoverable.
43
+ */
44
+ function coerceGroupShard(value) {
45
+ const strict = safeParseRequirementGroup(value);
46
+ if (strict)
47
+ return strict;
48
+ if (!value || typeof value !== 'object' || Array.isArray(value))
49
+ return undefined;
50
+ const raw = value;
51
+ const requirements = (Array.isArray(raw.requirements) ? raw.requirements : [])
52
+ .map(safeParseRequirementItem)
53
+ .filter((r) => r !== undefined);
54
+ const rules = (Array.isArray(raw.rules) ? raw.rules : [])
55
+ .map(safeParseDomainRule)
56
+ .filter((r) => r !== undefined);
57
+ // Re-validate the rebuilt group: this enforces the group-level fields (name/summary) while
58
+ // the requirements/rules are already valid. A bad group name is unrecoverable ⇒ undefined.
59
+ return safeParseRequirementGroup({ ...raw, requirements, rules });
60
+ }
61
+ /** Read a file, treating ANY error (incl. non-404) as "missing" so the reader never throws. */
62
+ async function safeGetFile(repo, path, ref) {
63
+ try {
64
+ return await repo.getFile(path, ref);
65
+ }
66
+ catch {
67
+ return null;
68
+ }
69
+ }
70
+ /** List a directory, treating ANY error as "empty" so the reader never throws. */
71
+ async function safeList(repo, path, ref) {
72
+ try {
73
+ return await repo.listDirectory(path, ref);
74
+ }
75
+ catch {
76
+ return [];
77
+ }
78
+ }
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 = new Array(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
+ /** Read + reassemble the spec on `ref` (the repo default branch). Never throws. */
93
+ export async function readServiceSpec(repo, ref) {
94
+ // The presence anchor: no readable object `spec/service.json` ⇒ no spec on this branch.
95
+ const serviceFile = await safeGetFile(repo, SPEC_SERVICE_PATH, ref);
96
+ if (!serviceFile)
97
+ return EMPTY;
98
+ const parsedService = parseJson(serviceFile.content);
99
+ // A non-object anchor (null / array / scalar) is a half-written or corrupt file — treat as
100
+ // "no spec" rather than reading garbage downstream.
101
+ if (!parsedService || typeof parsedService !== 'object' || Array.isArray(parsedService)) {
102
+ return EMPTY;
103
+ }
104
+ const service = parsedService;
105
+ // Walk `spec/modules/<moduleSlug>/` — each dir is one module, name-sorted by the writer.
106
+ const moduleDirs = (await safeList(repo, SPEC_MODULES_DIR, ref)).filter((e) => e.type === 'dir');
107
+ const moduleSlugToName = new Map();
108
+ const groupSlugToName = new Map();
109
+ // Phase A: per module, read its `_module.json` (for the display name) and list its shards.
110
+ const moduleInfos = await mapLimit(moduleDirs, READ_CONCURRENCY, async (dir) => {
111
+ const slug = dir.name;
112
+ const [meta, entries] = await Promise.all([
113
+ safeGetFile(repo, `${dir.path}/_module.json`, ref),
114
+ safeList(repo, dir.path, ref),
115
+ ]);
116
+ const metaObj = (meta ? parseJson(meta.content) : undefined);
117
+ // Fall back to the slug for a blank name too (not only a missing one): `??` keeps `""`,
118
+ // which then fails the module schema and would silently drop the whole module + its
119
+ // valid groups. A corrupt/half-written `_module.json` should degrade to the slug instead.
120
+ const moduleName = nonEmptyString(metaObj?.name) ?? slug;
121
+ moduleSlugToName.set(slug, moduleName);
122
+ // Every `*.json` except `_module.json` is one canonical group shard.
123
+ const shards = entries.filter((e) => e.type === 'file' && e.name.endsWith('.json') && e.name !== '_module.json');
124
+ return { slug, moduleName, summary: metaObj?.summary ?? '', shards };
125
+ });
126
+ // Phase B: read every group shard across all modules through one bounded queue (this is the
127
+ // largest fan-out), then validate PER SHARD so a malformed group is dropped, not the tree.
128
+ const shardRefs = moduleInfos.flatMap((m) => m.shards.map((entry) => ({
129
+ moduleSlug: m.slug,
130
+ groupSlug: entry.name.replace(/\.json$/, ''),
131
+ entry,
132
+ })));
133
+ const shardContents = await mapLimit(shardRefs, READ_CONCURRENCY, async (s) => ({
134
+ ref: s,
135
+ file: await safeGetFile(repo, s.entry.path, ref),
136
+ }));
137
+ const groupsByModule = new Map();
138
+ for (const { ref: s, file } of shardContents) {
139
+ const group = file ? coerceGroupShard(parseJson(file.content)) : undefined;
140
+ if (!group)
141
+ continue;
142
+ groupSlugToName.set(`${s.moduleSlug}/${s.groupSlug}`, group.name);
143
+ const list = groupsByModule.get(s.moduleSlug) ?? [];
144
+ list.push(group);
145
+ groupsByModule.set(s.moduleSlug, list);
146
+ }
147
+ const modules = moduleInfos
148
+ .map((m) => safeParseSpecModule({
149
+ name: m.moduleName,
150
+ summary: m.summary,
151
+ groups: groupsByModule.get(m.slug) ?? [],
152
+ }))
153
+ .filter((m) => m !== undefined);
154
+ // Build the doc from the per-node-validated pieces directly, so a missing/empty service
155
+ // name (the SPA falls back to the block title) degrades to showing the modules rather than
156
+ // blanking the whole view.
157
+ const spec = {
158
+ service: typeof service.service === 'string' ? service.service : '',
159
+ summary: typeof service.summary === 'string' ? service.summary : '',
160
+ modules,
161
+ };
162
+ const features = await readFeatureFiles(repo, ref, moduleSlugToName, groupSlugToName);
163
+ return { present: true, spec, features };
164
+ }
165
+ /** Read the seeded Gherkin `.feature` files under `spec/features/<module>/<group>.feature`. */
166
+ async function readFeatureFiles(repo, ref, moduleSlugToName, groupSlugToName) {
167
+ const moduleDirs = (await safeList(repo, SPEC_FEATURES_DIR, ref)).filter((e) => e.type === 'dir');
168
+ const perModule = await mapLimit(moduleDirs, READ_CONCURRENCY, async (dir) => {
169
+ const entries = await safeList(repo, dir.path, ref);
170
+ return entries
171
+ .filter((e) => e.type === 'file' && e.name.endsWith('.feature'))
172
+ .map((entry) => ({ slug: dir.name, entry }));
173
+ });
174
+ const featureRefs = perModule.flat();
175
+ const read = await mapLimit(featureRefs, READ_CONCURRENCY, async (fr) => {
176
+ const file = await safeGetFile(repo, fr.entry.path, ref);
177
+ if (!file)
178
+ return null;
179
+ const groupSlug = fr.entry.name.replace(/\.feature$/, '');
180
+ return {
181
+ module: moduleSlugToName.get(fr.slug) ?? fr.slug,
182
+ group: groupSlugToName.get(`${fr.slug}/${groupSlug}`) ?? groupSlug,
183
+ path: fr.entry.path,
184
+ content: file.content,
185
+ };
186
+ });
187
+ return read.filter((x) => x !== null);
188
+ }
189
+ //# sourceMappingURL=readServiceSpec.js.map
@@ -0,0 +1 @@
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.13.2",
3
+ "version": "0.14.0",
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,13 @@
28
28
  "hono": "^4.12.27",
29
29
  "pino": "^10.3.1",
30
30
  "valibot": "^1.4.1",
31
- "@cat-factory/agents": "0.11.4",
32
- "@cat-factory/contracts": "0.13.1",
33
- "@cat-factory/integrations": "0.10.2",
34
- "@cat-factory/kernel": "0.13.2",
35
- "@cat-factory/orchestration": "0.10.2",
36
- "@cat-factory/prompt-fragments": "0.7.9",
37
- "@cat-factory/spend": "0.8.7"
31
+ "@cat-factory/agents": "0.11.5",
32
+ "@cat-factory/contracts": "0.14.0",
33
+ "@cat-factory/integrations": "0.10.3",
34
+ "@cat-factory/kernel": "0.13.3",
35
+ "@cat-factory/orchestration": "0.10.3",
36
+ "@cat-factory/prompt-fragments": "0.7.10",
37
+ "@cat-factory/spend": "0.8.8"
38
38
  },
39
39
  "devDependencies": {
40
40
  "typescript": "7.0.1-rc",