@cat-factory/server 0.279.1 → 0.281.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 +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +3 -2
- package/dist/app.js.map +1 -1
- package/dist/http/accountAccess.d.ts +29 -0
- package/dist/http/accountAccess.d.ts.map +1 -0
- package/dist/http/accountAccess.js +45 -0
- package/dist/http/accountAccess.js.map +1 -0
- package/dist/modules/board/BoardController.d.ts.map +1 -1
- package/dist/modules/board/BoardController.js +9 -6
- package/dist/modules/board/BoardController.js.map +1 -1
- package/dist/modules/foundationalServices/FoundationalServiceController.d.ts.map +1 -1
- package/dist/modules/foundationalServices/FoundationalServiceController.js +11 -19
- package/dist/modules/foundationalServices/FoundationalServiceController.js.map +1 -1
- package/dist/modules/fragmentLibrary/FragmentLibraryController.d.ts.map +1 -1
- package/dist/modules/fragmentLibrary/FragmentLibraryController.js +5 -17
- package/dist/modules/fragmentLibrary/FragmentLibraryController.js.map +1 -1
- package/dist/modules/merge/RiskPolicyController.d.ts +16 -4
- package/dist/modules/merge/RiskPolicyController.d.ts.map +1 -1
- package/dist/modules/merge/RiskPolicyController.js +90 -22
- package/dist/modules/merge/RiskPolicyController.js.map +1 -1
- package/dist/modules/publicApi/PublicBoardController.d.ts.map +1 -1
- package/dist/modules/publicApi/PublicBoardController.js +35 -5
- package/dist/modules/publicApi/PublicBoardController.js.map +1 -1
- package/dist/modules/publicApi/openapiDocument.generated.d.ts +1 -1
- package/dist/modules/publicApi/openapiDocument.generated.d.ts.map +1 -1
- package/dist/modules/publicApi/openapiDocument.generated.js +1 -1
- package/dist/modules/publicApi/openapiDocument.generated.js.map +1 -1
- package/dist/modules/skillLibrary/SkillLibraryController.d.ts.map +1 -1
- package/dist/modules/skillLibrary/SkillLibraryController.js +3 -11
- package/dist/modules/skillLibrary/SkillLibraryController.js.map +1 -1
- package/dist/persistence/rpc-allowlist.d.ts.map +1 -1
- package/dist/persistence/rpc-allowlist.js +28 -0
- package/dist/persistence/rpc-allowlist.js.map +1 -1
- package/package.json +8 -8
|
@@ -1,45 +1,113 @@
|
|
|
1
|
-
import { createRiskPolicyContract, deleteRiskPolicyContract, listRiskPoliciesContract, reseedRiskPolicyContract, updateRiskPolicyContract, } from '@cat-factory/contracts';
|
|
1
|
+
import { cloneRiskPolicyContract, createRiskPolicyContract, deleteRiskPolicyContract, listRiskPoliciesContract, listRiskPolicySuppressionsContract, reseedRiskPolicyContract, restoreRiskPolicyContract, suppressRiskPolicyContract, updateRiskPolicyContract, } from '@cat-factory/contracts';
|
|
2
2
|
import { buildHonoRoute } from '@toad-contracts/hono';
|
|
3
3
|
import { Hono } from 'hono';
|
|
4
|
+
import { mountAccountMembership } from '../../http/accountAccess.js';
|
|
4
5
|
import { mountWorkspacePermission } from '../../http/workspaceAccess.js';
|
|
5
6
|
import { param } from '../../http/params.js';
|
|
6
7
|
import { requireCapability } from '../../http/guards.js';
|
|
7
|
-
/**
|
|
8
|
+
/** Every TOP-LEVEL path this controller serves, gated at whichever tier owns the scope. */
|
|
9
|
+
const GUARDED_RESOURCES = ['/risk-policies', '/risk-policy-suppressions'];
|
|
10
|
+
/** Resolve the risk-policy module, or refuse with a 503 naming what isn't wired. */
|
|
8
11
|
function requireRiskPolicies(c) {
|
|
9
12
|
return requireCapability(c.get('container').riskPolicies, 'Risk policies are not configured');
|
|
10
13
|
}
|
|
11
14
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
+
* The ACCOUNT tier, a capability behind a capability: it is wired only where the facade has an
|
|
16
|
+
* account-tier store, so it gets its own accessor rather than a message borrowed from its parent,
|
|
17
|
+
* which would name a library the operator has already configured.
|
|
15
18
|
*/
|
|
16
|
-
|
|
19
|
+
function requireAccountRiskPolicies(c) {
|
|
20
|
+
return requireCapability(requireRiskPolicies(c).accountService, 'Account-wide risk policies are not configured');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Risk policy CRUD, mounted TWICE — once under `/accounts/:accountId` and once under
|
|
24
|
+
* `/workspaces/:workspaceId` — so each tier is managed at the scope that owns it (ADR 0055).
|
|
25
|
+
*
|
|
26
|
+
* A board's list is its own policies MERGED with the ones it inherits from its account, so the four
|
|
27
|
+
* inheritance routes live on the workspace mount alone: an account has no tier above it to clone
|
|
28
|
+
* from or hide. Reseed is workspace-only for the same reason in reverse — the built-in catalog is
|
|
29
|
+
* copied into boards, so only a board has a built-in to restore.
|
|
30
|
+
*
|
|
31
|
+
* Workspace routes are `settings.manage` (the library is board configuration); account routes guard
|
|
32
|
+
* on account membership, exactly as the fragment library's do. Both mounts name this controller's OWN
|
|
33
|
+
* paths from one list, so neither can gate a subset the other doesn't: each shared prefix carries
|
|
34
|
+
* sibling controllers, and a `use('*')` inside a sub-app lands on `<prefix>/*` and would authorize
|
|
35
|
+
* their routes too.
|
|
36
|
+
*/
|
|
37
|
+
export function riskPolicyController(scope) {
|
|
17
38
|
const app = new Hono();
|
|
18
|
-
|
|
39
|
+
if (scope === 'account') {
|
|
40
|
+
mountAccountMembership(app, GUARDED_RESOURCES, 'Sign in to manage risk policies');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
mountWorkspacePermission(app, 'settings.manage', GUARDED_RESOURCES);
|
|
44
|
+
}
|
|
45
|
+
// ---- the tier's own library ---------------------------------------------
|
|
19
46
|
buildHonoRoute(app, listRiskPoliciesContract, async (c) => {
|
|
20
|
-
|
|
21
|
-
|
|
47
|
+
if (scope === 'account') {
|
|
48
|
+
return c.json(await requireAccountRiskPolicies(c).list(param(c, 'accountId')), 200);
|
|
49
|
+
}
|
|
50
|
+
const policies = requireRiskPolicies(c);
|
|
51
|
+
return c.json(await policies.service.list(param(c, 'workspaceId')), 200);
|
|
22
52
|
});
|
|
23
53
|
buildHonoRoute(app, createRiskPolicyContract, async (c) => {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
54
|
+
const input = c.req.valid('json');
|
|
55
|
+
if (scope === 'account') {
|
|
56
|
+
const created = await requireAccountRiskPolicies(c).create(param(c, 'accountId'), input);
|
|
57
|
+
return c.json(created, 201);
|
|
58
|
+
}
|
|
59
|
+
const policies = requireRiskPolicies(c);
|
|
60
|
+
const created = await policies.service.create(param(c, 'workspaceId'), input);
|
|
61
|
+
return c.json(created, 201);
|
|
27
62
|
});
|
|
28
63
|
buildHonoRoute(app, updateRiskPolicyContract, async (c) => {
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
|
|
64
|
+
const { presetId } = c.req.valid('param');
|
|
65
|
+
const patch = c.req.valid('json');
|
|
66
|
+
if (scope === 'account') {
|
|
67
|
+
const updated = await requireAccountRiskPolicies(c).update(param(c, 'accountId'), presetId, patch);
|
|
68
|
+
return c.json(updated, 200);
|
|
69
|
+
}
|
|
70
|
+
const policies = requireRiskPolicies(c);
|
|
71
|
+
const updated = await policies.service.update(param(c, 'workspaceId'), presetId, patch);
|
|
72
|
+
return c.json(updated, 200);
|
|
32
73
|
});
|
|
33
74
|
buildHonoRoute(app, deleteRiskPolicyContract, async (c) => {
|
|
34
|
-
const
|
|
35
|
-
|
|
75
|
+
const { presetId } = c.req.valid('param');
|
|
76
|
+
if (scope === 'account') {
|
|
77
|
+
await requireAccountRiskPolicies(c).remove(param(c, 'accountId'), presetId);
|
|
78
|
+
return c.body(null, 204);
|
|
79
|
+
}
|
|
80
|
+
const policies = requireRiskPolicies(c);
|
|
81
|
+
await policies.service.remove(param(c, 'workspaceId'), presetId);
|
|
36
82
|
return c.body(null, 204);
|
|
37
83
|
});
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
84
|
+
// ---- inheritance (workspace mount only) ---------------------------------
|
|
85
|
+
if (scope === 'workspace') {
|
|
86
|
+
buildHonoRoute(app, reseedRiskPolicyContract, async (c) => {
|
|
87
|
+
const policies = requireRiskPolicies(c);
|
|
88
|
+
const preset = await policies.service.reseed(param(c, 'workspaceId'), c.req.valid('param').presetId);
|
|
89
|
+
return c.json(preset, 200);
|
|
90
|
+
});
|
|
91
|
+
buildHonoRoute(app, cloneRiskPolicyContract, async (c) => {
|
|
92
|
+
const policies = requireRiskPolicies(c);
|
|
93
|
+
const clone = await policies.service.clone(param(c, 'workspaceId'), c.req.valid('param').presetId, c.req.valid('json'));
|
|
94
|
+
return c.json(clone, 201);
|
|
95
|
+
});
|
|
96
|
+
buildHonoRoute(app, suppressRiskPolicyContract, async (c) => {
|
|
97
|
+
const policies = requireRiskPolicies(c);
|
|
98
|
+
await policies.service.suppress(param(c, 'workspaceId'), c.req.valid('param').presetId);
|
|
99
|
+
return c.body(null, 204);
|
|
100
|
+
});
|
|
101
|
+
buildHonoRoute(app, restoreRiskPolicyContract, async (c) => {
|
|
102
|
+
const policies = requireRiskPolicies(c);
|
|
103
|
+
await policies.service.restoreInherited(param(c, 'workspaceId'), c.req.valid('param').presetId);
|
|
104
|
+
return c.body(null, 204);
|
|
105
|
+
});
|
|
106
|
+
buildHonoRoute(app, listRiskPolicySuppressionsContract, async (c) => {
|
|
107
|
+
const policies = requireRiskPolicies(c);
|
|
108
|
+
return c.json(await policies.service.listSuppressions(param(c, 'workspaceId')), 200);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
43
111
|
return app;
|
|
44
112
|
}
|
|
45
113
|
//# sourceMappingURL=RiskPolicyController.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiskPolicyController.js","sourceRoot":"","sources":["../../../src/modules/merge/RiskPolicyController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"RiskPolicyController.js","sourceRoot":"","sources":["../../../src/modules/merge/RiskPolicyController.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PublicBoardController.d.ts","sourceRoot":"","sources":["../../../src/modules/publicApi/PublicBoardController.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PublicBoardController.d.ts","sourceRoot":"","sources":["../../../src/modules/publicApi/PublicBoardController.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAmB,MAAM,mBAAmB,CAAA;AA+DhE,wBAAgB,qBAAqB,IAAI,IAAI,CAAC,MAAM,CAAC,CAMpD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { addPublicTaskDependencyContract, attachPublicTaskDocumentContract, createPublicServiceContract, detachPublicTaskDocumentContract, listPublicReposContract, listPublicTaskDocumentsContract, removePublicTaskDependencyContract, } from '@cat-factory/contracts';
|
|
1
|
+
import { addPublicTaskDependencyContract, attachPublicTaskDocumentContract, createPublicServiceContract, deletePublicServiceContract, detachPublicTaskDocumentContract, listPublicReposContract, listPublicTaskDocumentsContract, removePublicTaskDependencyContract, } from '@cat-factory/contracts';
|
|
2
2
|
import { NotFoundError } from '@cat-factory/kernel';
|
|
3
3
|
import { buildHonoRoute } from '@toad-contracts/hono';
|
|
4
4
|
import { Hono } from 'hono';
|
|
@@ -6,8 +6,8 @@ import { requireCapability } from '../../http/guards.js';
|
|
|
6
6
|
import { toPublicRepo, toPublicService, toPublicTask } from './boardProjection.js';
|
|
7
7
|
import { resolveDocuments } from './documentAttachment.js';
|
|
8
8
|
import { authorizeOrThrow } from './publicApiAuth.js';
|
|
9
|
-
// Board PROVISIONING (`GET /api/v1/repos`, `POST /api/v1/services`) and the two task
|
|
10
|
-
// that outlive a create call: dependency edges and attached requirements documents.
|
|
9
|
+
// Board PROVISIONING (`GET /api/v1/repos`, `POST`/`DELETE /api/v1/services`) and the two task
|
|
10
|
+
// relationships that outlive a create call: dependency edges and attached requirements documents.
|
|
11
11
|
//
|
|
12
12
|
// Its own controller rather than more of `PublicApiController`, which already carries the whole
|
|
13
13
|
// job + task lifecycle and sits at its size budget. The split is also the honest one: everything
|
|
@@ -26,8 +26,9 @@ import { authorizeOrThrow } from './publicApiAuth.js';
|
|
|
26
26
|
// 3. **No board COORDINATES.** A service created here is laid out by the board itself. Positions,
|
|
27
27
|
// sizes and reparenting stay out of a surface that is frozen forever.
|
|
28
28
|
// 4. **Every read is scoped to the key's workspace and to a BOARD-VISIBLE block**
|
|
29
|
-
// (`getServiceTask
|
|
30
|
-
// internal anchor or another workspace's
|
|
29
|
+
// (`getServiceTask` for a task, `getService` for a frame, both excluding the headless job
|
|
30
|
+
// anchors), so a key can never reach a run's internal anchor or another workspace's block
|
|
31
|
+
// through these paths, and a delete cannot reach one either.
|
|
31
32
|
/** Project a stored document onto the small attached-document resource. */
|
|
32
33
|
function toPublicAttachedDocument(document) {
|
|
33
34
|
return {
|
|
@@ -81,6 +82,35 @@ function registerProvisioningRoutes(app) {
|
|
|
81
82
|
const block = await createService(c.get('container'), auth.workspaceId, body);
|
|
82
83
|
return c.json(toPublicService(block), 201);
|
|
83
84
|
});
|
|
85
|
+
// Delete a service, its subtree and the run history under it: the same refuse-tear-down-remove
|
|
86
|
+
// sequence the app's own delete runs (`BoardController` remove). The teardown kills every
|
|
87
|
+
// container and durable driver under the frame, so deleting a service whose task is mid-run
|
|
88
|
+
// never orphans a container that would idle until its watchdog.
|
|
89
|
+
//
|
|
90
|
+
// Resolved through `getService`, so a frame in another workspace, a task id, a headless run
|
|
91
|
+
// anchor and an ARCHIVED frame are all ABSENT rather than forbidden: the population this route
|
|
92
|
+
// addresses is exactly the one `GET /api/v1/services` reports, which is the rule every
|
|
93
|
+
// per-service endpoint here follows. An archived frame is therefore not deletable from this
|
|
94
|
+
// surface, which is honest rather than incidental (restoring one is an app act too), and it is
|
|
95
|
+
// the state a caller reaches by archiving instead of deleting.
|
|
96
|
+
//
|
|
97
|
+
// The unfinished-work refusal is not written here either: `assertRemovable` is `removeBlock`'s
|
|
98
|
+
// own guard, run FIRST because the teardown between them is irreversible, and it hands back the
|
|
99
|
+
// board list both later steps reuse. A 422 out of this route therefore means nothing happened.
|
|
100
|
+
buildHonoRoute(app, deletePublicServiceContract, async (c) => {
|
|
101
|
+
const auth = await authorizeOrThrow(c, deletePublicServiceContract.minScope);
|
|
102
|
+
const container = c.get('container');
|
|
103
|
+
const { serviceId } = c.req.valid('param');
|
|
104
|
+
const service = await container.boardService.getService(auth.workspaceId, serviceId);
|
|
105
|
+
if (!service)
|
|
106
|
+
throw new NotFoundError('Service', serviceId, { reason: 'service_not_found' });
|
|
107
|
+
const preloaded = await container.boardService.assertRemovable(auth.workspaceId, serviceId);
|
|
108
|
+
await container.executionService.teardownForBlockTree(auth.workspaceId, serviceId, {
|
|
109
|
+
preloaded,
|
|
110
|
+
});
|
|
111
|
+
await container.boardService.removeBlock(auth.workspaceId, serviceId, { preloaded });
|
|
112
|
+
return c.body(null, 204);
|
|
113
|
+
});
|
|
84
114
|
}
|
|
85
115
|
/**
|
|
86
116
|
* Create the service frame, with or without a repository behind it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PublicBoardController.js","sourceRoot":"","sources":["../../../src/modules/publicApi/PublicBoardController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,EAChC,2BAA2B,EAC3B,gCAAgC,EAChC,uBAAuB,EACvB,+BAA+B,EAG/B,kCAAkC,GACnC,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,
|
|
1
|
+
{"version":3,"file":"PublicBoardController.js","sourceRoot":"","sources":["../../../src/modules/publicApi/PublicBoardController.ts"],"names":[],"mappings":"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"}
|