@cat-factory/server 0.133.0 → 0.134.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;AAgF3C;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CA0H5E"}
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;AAiF3C;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CA8H5E"}
package/dist/app.js CHANGED
@@ -66,6 +66,7 @@ import { serviceMountController } from './modules/services/ServiceMountControlle
66
66
  import { serviceSpecController } from './modules/serviceSpec/ServiceSpecController.js';
67
67
  import { linearOAuthController, taskSourceController, } from './modules/tasks/TaskSourceController.js';
68
68
  import { workspaceController } from './modules/workspaces/WorkspaceController.js';
69
+ import { workspaceMemberController } from './modules/workspaces/WorkspaceMemberController.js';
69
70
  import { persistenceController } from './modules/persistence/PersistenceController.js';
70
71
  import { githubDelegationController } from './modules/persistence/GitHubDelegationController.js';
71
72
  import { publicApiController } from './modules/publicApi/PublicApiController.js';
@@ -136,6 +137,10 @@ export function registerCoreControllers(app) {
136
137
  app.route('/accounts/:accountId', fragmentLibraryController('account'));
137
138
  app.route('/accounts/:accountId', skillLibraryController());
138
139
  app.route('/', workspaceController());
140
+ // Workspace-membership roster + access-mode management (workspace-rbac). Absolute
141
+ // `/workspaces/:ws/members` + `/access-mode` paths (like the workspace root), so mounted at `/`;
142
+ // 503 until the facade wires the workspace-member repository. Writes require `members.manage`.
143
+ app.route('/', workspaceMemberController());
139
144
  // Real-time WebSocket event stream (self-authenticates via ?ticket=; the facade's
140
145
  // gate bypasses only its exact upgrade shape). The upgrade is delegated to the
141
146
  // facade's realtime gateway.
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,5 +1,6 @@
1
- import { type WorkspaceAccess } from '@cat-factory/kernel';
2
- import type { ServerContainer } from './env.js';
1
+ import { type WorkspaceAccess, type WorkspacePermission } from '@cat-factory/kernel';
2
+ import type { Context } from 'hono';
3
+ import type { AppEnv, ServerContainer } from './env.js';
3
4
  /**
4
5
  * Resolve a signed-in user's effective access to one board, THROUGH the `workspaceAccess` cache.
5
6
  * Returns `null` when the board doesn't exist (the gate then lets the handler 404 on its own,
@@ -8,4 +9,20 @@ import type { ServerContainer } from './env.js';
8
9
  * caching), so a repeat request from the same user on the same board issues no repository reads.
9
10
  */
10
11
  export declare function loadWorkspaceAccess(container: ServerContainer, workspaceId: string, userId: string): Promise<WorkspaceAccess | null>;
12
+ /**
13
+ * The admin-tier enforcement helper (workspace-rbac). The gate already ran the resolution + the
14
+ * method-shaped viewer write floor (any non-GET ⇒ ≥ member) before a controller executes; this
15
+ * adds the PERMISSION-shaped check for the admin route groups (`settings.manage` /
16
+ * `integrations.manage` / `secrets.manage` / `members.manage`). It CONSUMES the access the gate
17
+ * published — it never re-derives membership.
18
+ *
19
+ * Dev-open parity: with auth disabled there is no signed-in user AND no resolved access object, so
20
+ * the check allows everything (mirroring the gate's `if (!user) return next()` and the SPA's
21
+ * absent-access ⇒ allow-all). A signed-in user always has a resolved access object here (the gate
22
+ * set it, or already 404'd), so a missing object for a signed-in caller fails closed.
23
+ *
24
+ * Throws {@link ForbiddenError} (→ 403) on insufficiency — the caller already SEES the board, so
25
+ * only capability, not existence, is revealed (never the 404 the gate uses to hide a board).
26
+ */
27
+ export declare function requirePermission<E extends AppEnv>(c: Context<E>, permission: WorkspacePermission): void;
11
28
  //# sourceMappingURL=workspaceAccess.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspaceAccess.d.ts","sourceRoot":"","sources":["../../src/http/workspaceAccess.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAiB/C;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAKjC"}
1
+ {"version":3,"file":"workspaceAccess.d.ts","sourceRoot":"","sources":["../../src/http/workspaceAccess.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAiBvD;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAKjC;AA6BD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAChD,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EACb,UAAU,EAAE,mBAAmB,GAC9B,IAAI,CASN"}
@@ -1,4 +1,4 @@
1
- import { resolveWorkspaceAccess } from '@cat-factory/kernel';
1
+ import { ForbiddenError, resolveWorkspaceAccess, } from '@cat-factory/kernel';
2
2
  // ---------------------------------------------------------------------------
3
3
  // The single workspace-RBAC resolution point (workspace-rbac initiative). The auth gate
4
4
  // (`mountAuthGate`) calls this once per `/workspaces/:ws/*` request; controllers CONSUME
@@ -47,4 +47,30 @@ async function resolveWorkspaceAccessUncached(container, workspaceId, userId) {
47
47
  ]);
48
48
  return resolveWorkspaceAccess({ userId, workspace: accessRow, accountRoles, memberRole });
49
49
  }
50
+ /**
51
+ * The admin-tier enforcement helper (workspace-rbac). The gate already ran the resolution + the
52
+ * method-shaped viewer write floor (any non-GET ⇒ ≥ member) before a controller executes; this
53
+ * adds the PERMISSION-shaped check for the admin route groups (`settings.manage` /
54
+ * `integrations.manage` / `secrets.manage` / `members.manage`). It CONSUMES the access the gate
55
+ * published — it never re-derives membership.
56
+ *
57
+ * Dev-open parity: with auth disabled there is no signed-in user AND no resolved access object, so
58
+ * the check allows everything (mirroring the gate's `if (!user) return next()` and the SPA's
59
+ * absent-access ⇒ allow-all). A signed-in user always has a resolved access object here (the gate
60
+ * set it, or already 404'd), so a missing object for a signed-in caller fails closed.
61
+ *
62
+ * Throws {@link ForbiddenError} (→ 403) on insufficiency — the caller already SEES the board, so
63
+ * only capability, not existence, is revealed (never the 404 the gate uses to hide a board).
64
+ */
65
+ export function requirePermission(c, permission) {
66
+ const access = c.get('workspaceAccess');
67
+ if (!access) {
68
+ if (!c.get('user'))
69
+ return; // dev-open: no user, no access object ⇒ allow all
70
+ throw new ForbiddenError(`This action requires the ${permission} permission`, { permission });
71
+ }
72
+ if (!access.permissions.has(permission)) {
73
+ throw new ForbiddenError(`This action requires the ${permission} permission`, { permission });
74
+ }
75
+ }
50
76
  //# sourceMappingURL=workspaceAccess.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspaceAccess.js","sourceRoot":"","sources":["../../src/http/workspaceAccess.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAwB,MAAM,qBAAqB,CAAA;AAGlF,8EAA8E;AAC9E,wFAAwF;AACxF,yFAAyF;AACzF,mFAAmF;AACnF,EAAE;AACF,yFAAyF;AACzF,sFAAsF;AACtF,wFAAwF;AACxF,2FAA2F;AAC3F,8FAA8F;AAC9F,4FAA4F;AAC5F,8FAA8F;AAC9F,uFAAuF;AACvF,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAA0B,EAC1B,WAAmB,EACnB,MAAc;IAEd,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9F,MAAM,EAAE,MAAM,8BAA8B,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC;KAC7E,CAAC,CAAC,CAAA;IACH,OAAO,MAAM,CAAA;AACf,CAAC;AAED,qGAAqG;AACrG,KAAK,UAAU,8BAA8B,CAC3C,SAA0B,EAC1B,WAAmB,EACnB,MAAc;IAEd,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;IAC3E,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA,CAAC,4DAA4D;IAExF,uFAAuF;IACvF,uDAAuD;IACvD,IAAI,SAAS,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,sBAAsB,CAAC;YAC5B,MAAM;YACN,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACnD,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;QAC9D,SAAS,CAAC,gBAAgB,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC;KAC7D,CAAC,CAAA;IACF,OAAO,sBAAsB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAA;AAC3F,CAAC"}
1
+ {"version":3,"file":"workspaceAccess.js","sourceRoot":"","sources":["../../src/http/workspaceAccess.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,sBAAsB,GAGvB,MAAM,qBAAqB,CAAA;AAI5B,8EAA8E;AAC9E,wFAAwF;AACxF,yFAAyF;AACzF,mFAAmF;AACnF,EAAE;AACF,yFAAyF;AACzF,sFAAsF;AACtF,wFAAwF;AACxF,2FAA2F;AAC3F,8FAA8F;AAC9F,4FAA4F;AAC5F,8FAA8F;AAC9F,uFAAuF;AACvF,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAA0B,EAC1B,WAAmB,EACnB,MAAc;IAEd,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9F,MAAM,EAAE,MAAM,8BAA8B,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC;KAC7E,CAAC,CAAC,CAAA;IACH,OAAO,MAAM,CAAA;AACf,CAAC;AAED,qGAAqG;AACrG,KAAK,UAAU,8BAA8B,CAC3C,SAA0B,EAC1B,WAAmB,EACnB,MAAc;IAEd,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;IAC3E,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA,CAAC,4DAA4D;IAExF,uFAAuF;IACvF,uDAAuD;IACvD,IAAI,SAAS,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,sBAAsB,CAAC;YAC5B,MAAM;YACN,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACnD,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;QAC9D,SAAS,CAAC,gBAAgB,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC;KAC7D,CAAC,CAAA;IACF,OAAO,sBAAsB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAA;AAC3F,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAC/B,CAAa,EACb,UAA+B;IAE/B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAM,CAAC,kDAAkD;QAC7E,MAAM,IAAI,cAAc,CAAC,4BAA4B,UAAU,aAAa,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IAC/F,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,cAAc,CAAC,4BAA4B,UAAU,aAAa,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IAC/F,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ import type { AppEnv } from '../../http/env.js';
3
+ export declare function workspaceMemberController(): Hono<AppEnv>;
4
+ //# sourceMappingURL=WorkspaceMemberController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceMemberController.d.ts","sourceRoot":"","sources":["../../../src/modules/workspaces/WorkspaceMemberController.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAmB/C,wBAAgB,yBAAyB,IAAI,IAAI,CAAC,MAAM,CAAC,CAsDxD"}
@@ -0,0 +1,64 @@
1
+ import { addWorkspaceMemberContract, listWorkspaceMembersContract, removeWorkspaceMemberContract, setWorkspaceAccessModeContract, setWorkspaceMemberRoleContract, } from '@cat-factory/contracts';
2
+ import { buildHonoRoute } from '@toad-contracts/hono';
3
+ import { Hono } from 'hono';
4
+ import { param } from '../../http/params.js';
5
+ import { requirePermission } from '../../http/workspaceAccess.js';
6
+ // ---------------------------------------------------------------------------
7
+ // Workspace-membership management (workspace-rbac initiative, slice 5). All routes are
8
+ // mounted under `/workspaces/:workspaceId`, so the shared `mountAuthGate` has already
9
+ // resolved the caller's effective access and enforced the method-shaped viewer write
10
+ // floor. This controller adds ONLY the admin-tier permission check (`members.manage`)
11
+ // for the roster/access-mode WRITES; the roster GET is open to any resolved role
12
+ // (`workspace.read`, satisfied by the gate resolution itself).
13
+ //
14
+ // The service is present only when the facade wired the workspace-member repository (both
15
+ // do); absent ⇒ every route reports 503 rather than 500-ing on an undefined service.
16
+ // ---------------------------------------------------------------------------
17
+ const unavailable = (c) => c.json({ error: { code: 'unavailable', message: 'Workspace membership is not configured' } }, 503);
18
+ export function workspaceMemberController() {
19
+ const app = new Hono();
20
+ // Roster — any resolved role may read it (gate resolution already guaranteed ≥ viewer).
21
+ buildHonoRoute(app, listWorkspaceMembersContract, async (c) => {
22
+ const service = c.get('container').workspaceMemberService;
23
+ if (!service)
24
+ return unavailable(c);
25
+ return c.json(await service.list(param(c, 'workspaceId')), 200);
26
+ });
27
+ buildHonoRoute(app, addWorkspaceMemberContract, async (c) => {
28
+ const service = c.get('container').workspaceMemberService;
29
+ if (!service)
30
+ return unavailable(c);
31
+ requirePermission(c, 'members.manage');
32
+ const body = c.req.valid('json');
33
+ const member = await service.add(param(c, 'workspaceId'), body.userId, body.role, c.get('user')?.id ?? null);
34
+ return c.json(member, 201);
35
+ });
36
+ buildHonoRoute(app, setWorkspaceMemberRoleContract, async (c) => {
37
+ const service = c.get('container').workspaceMemberService;
38
+ if (!service)
39
+ return unavailable(c);
40
+ requirePermission(c, 'members.manage');
41
+ const { workspaceId, userId } = c.req.valid('param');
42
+ const member = await service.setRole(workspaceId, userId, c.req.valid('json').role);
43
+ return c.json(member, 200);
44
+ });
45
+ buildHonoRoute(app, removeWorkspaceMemberContract, async (c) => {
46
+ const service = c.get('container').workspaceMemberService;
47
+ if (!service)
48
+ return unavailable(c);
49
+ requirePermission(c, 'members.manage');
50
+ const { workspaceId, userId } = c.req.valid('param');
51
+ await service.remove(workspaceId, userId);
52
+ return c.body(null, 204);
53
+ });
54
+ buildHonoRoute(app, setWorkspaceAccessModeContract, async (c) => {
55
+ const service = c.get('container').workspaceMemberService;
56
+ if (!service)
57
+ return unavailable(c);
58
+ requirePermission(c, 'members.manage');
59
+ const workspace = await service.setAccessMode(param(c, 'workspaceId'), c.req.valid('json').accessMode);
60
+ return c.json(workspace, 200);
61
+ });
62
+ return app;
63
+ }
64
+ //# sourceMappingURL=WorkspaceMemberController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceMemberController.js","sourceRoot":"","sources":["../../../src/modules/workspaces/WorkspaceMemberController.ts"],"names":[],"mappings":"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"}
@@ -185,10 +185,10 @@ export type PersistenceMethodTable = Record<string, Record<string, MethodSpec>>;
185
185
  * slice adds a role dimension to the scope (or routes them through the service). Only the
186
186
  * account/membership READS a board load needs are remotely callable. Board-level mutations
187
187
  * (`workspaceRepository.rename`/`setDescription`, block/pipeline/execution CRUD) are
188
- * member-level in the service layer, so they remain. The one board mutation that stays OUT is
189
- * `workspaceRepository.setAccessMode` the workspace-RBAC access-mode flip is `members.manage`
190
- * (admin-tier), so like the account/membership admin mutations it must not be reachable over the
191
- * role-blind machine RPC.
188
+ * member-level in the service layer, so they remain. The board mutations that stay OUT are
189
+ * `workspaceRepository.setAccessMode` (the access-mode flip) and `linkAccount` (the legacy-board
190
+ * auto-heal that adopts a board into an account) both are `members.manage` (admin-tier), so like
191
+ * the account/membership admin mutations they must not be reachable over the role-blind machine RPC.
192
192
  */
193
193
  export declare const REMOTE_PERSISTENCE_METHODS: PersistenceMethodTable;
194
194
  /** A repository registry the mothership reflects over: repo name → repo instance. */
@@ -43,10 +43,10 @@ export function statusForPersistenceError(code) {
43
43
  * slice adds a role dimension to the scope (or routes them through the service). Only the
44
44
  * account/membership READS a board load needs are remotely callable. Board-level mutations
45
45
  * (`workspaceRepository.rename`/`setDescription`, block/pipeline/execution CRUD) are
46
- * member-level in the service layer, so they remain. The one board mutation that stays OUT is
47
- * `workspaceRepository.setAccessMode` the workspace-RBAC access-mode flip is `members.manage`
48
- * (admin-tier), so like the account/membership admin mutations it must not be reachable over the
49
- * role-blind machine RPC.
46
+ * member-level in the service layer, so they remain. The board mutations that stay OUT are
47
+ * `workspaceRepository.setAccessMode` (the access-mode flip) and `linkAccount` (the legacy-board
48
+ * auto-heal that adopts a board into an account) both are `members.manage` (admin-tier), so like
49
+ * the account/membership admin mutations they must not be reachable over the role-blind machine RPC.
50
50
  */
51
51
  export const REMOTE_PERSISTENCE_METHODS = {
52
52
  workspaceRepository: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/server",
3
- "version": "0.133.0",
3
+ "version": "0.134.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",
@@ -31,13 +31,13 @@
31
31
  "p-map": "^7.0.5",
32
32
  "pino": "^10.3.1",
33
33
  "valibot": "^1.4.2",
34
- "@cat-factory/agents": "0.62.5",
35
- "@cat-factory/contracts": "0.144.0",
36
- "@cat-factory/integrations": "0.85.2",
37
- "@cat-factory/kernel": "0.137.1",
38
- "@cat-factory/orchestration": "0.120.2",
39
- "@cat-factory/prompt-fragments": "0.13.33",
40
- "@cat-factory/spend": "0.12.46"
34
+ "@cat-factory/agents": "0.62.6",
35
+ "@cat-factory/contracts": "0.145.0",
36
+ "@cat-factory/integrations": "0.85.3",
37
+ "@cat-factory/kernel": "0.138.0",
38
+ "@cat-factory/orchestration": "0.121.0",
39
+ "@cat-factory/prompt-fragments": "0.13.34",
40
+ "@cat-factory/spend": "0.12.47"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/node": "^26.1.1",