@braidhq/server 0.0.1 → 0.1.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/README.md +136 -0
- package/dist/app.d.ts +19 -2
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +121 -3
- package/dist/app.js.map +1 -1
- package/dist/composeFs.d.ts +41 -6
- package/dist/composeFs.d.ts.map +1 -1
- package/dist/composeFs.js +234 -52
- package/dist/composeFs.js.map +1 -1
- package/dist/composition.d.ts +86 -2
- package/dist/composition.d.ts.map +1 -1
- package/dist/composition.js +71 -1
- package/dist/composition.js.map +1 -1
- package/dist/infrastructure/agent/SubprocessSkillRunner.d.ts +21 -0
- package/dist/infrastructure/agent/SubprocessSkillRunner.d.ts.map +1 -1
- package/dist/infrastructure/agent/SubprocessSkillRunner.js +35 -3
- package/dist/infrastructure/agent/SubprocessSkillRunner.js.map +1 -1
- package/dist/infrastructure/agent/mcpConfig.d.ts +25 -5
- package/dist/infrastructure/agent/mcpConfig.d.ts.map +1 -1
- package/dist/infrastructure/agent/mcpConfig.js +22 -14
- package/dist/infrastructure/agent/mcpConfig.js.map +1 -1
- package/dist/infrastructure/auth/AccessPolicy.d.ts +112 -0
- package/dist/infrastructure/auth/AccessPolicy.d.ts.map +1 -0
- package/dist/infrastructure/auth/AccessPolicy.js +184 -0
- package/dist/infrastructure/auth/AccessPolicy.js.map +1 -0
- package/dist/infrastructure/auth/SessionStore.d.ts +40 -0
- package/dist/infrastructure/auth/SessionStore.d.ts.map +1 -0
- package/dist/infrastructure/auth/SessionStore.js +107 -0
- package/dist/infrastructure/auth/SessionStore.js.map +1 -0
- package/dist/infrastructure/auth/ensureApprovedEmails.d.ts +16 -0
- package/dist/infrastructure/auth/ensureApprovedEmails.d.ts.map +1 -0
- package/dist/infrastructure/auth/ensureApprovedEmails.js +20 -0
- package/dist/infrastructure/auth/ensureApprovedEmails.js.map +1 -0
- package/dist/infrastructure/env.d.ts +11 -0
- package/dist/infrastructure/env.d.ts.map +1 -0
- package/dist/infrastructure/env.js +20 -0
- package/dist/infrastructure/env.js.map +1 -0
- package/dist/infrastructure/fs/FsBatchPlanRepository.d.ts +300 -0
- package/dist/infrastructure/fs/FsBatchPlanRepository.d.ts.map +1 -0
- package/dist/infrastructure/fs/FsBatchPlanRepository.js +42 -0
- package/dist/infrastructure/fs/FsBatchPlanRepository.js.map +1 -0
- package/dist/infrastructure/fs/FsClarifyTicketRepository.d.ts.map +1 -1
- package/dist/infrastructure/fs/FsClarifyTicketRepository.js +7 -1
- package/dist/infrastructure/fs/FsClarifyTicketRepository.js.map +1 -1
- package/dist/infrastructure/fs/FsGraphSerializer.d.ts +629 -0
- package/dist/infrastructure/fs/FsGraphSerializer.d.ts.map +1 -0
- package/dist/infrastructure/fs/FsGraphSerializer.js +60 -0
- package/dist/infrastructure/fs/FsGraphSerializer.js.map +1 -0
- package/dist/infrastructure/fs/FsProposalRepository.d.ts.map +1 -1
- package/dist/infrastructure/fs/FsProposalRepository.js +8 -0
- package/dist/infrastructure/fs/FsProposalRepository.js.map +1 -1
- package/dist/infrastructure/fs/FsRunRepository.d.ts +4 -1
- package/dist/infrastructure/fs/FsRunRepository.d.ts.map +1 -1
- package/dist/infrastructure/fs/FsRunRepository.js +75 -3
- package/dist/infrastructure/fs/FsRunRepository.js.map +1 -1
- package/dist/infrastructure/fs/FsSkillRegistry.d.ts.map +1 -1
- package/dist/infrastructure/fs/FsSkillRegistry.js +15 -3
- package/dist/infrastructure/fs/FsSkillRegistry.js.map +1 -1
- package/dist/infrastructure/fs/FsSourceUnitDigest.d.ts +19 -0
- package/dist/infrastructure/fs/FsSourceUnitDigest.d.ts.map +1 -0
- package/dist/infrastructure/fs/FsSourceUnitDigest.js +58 -0
- package/dist/infrastructure/fs/FsSourceUnitDigest.js.map +1 -0
- package/dist/infrastructure/fs/FsSourceUnitStateRepository.d.ts +30 -0
- package/dist/infrastructure/fs/FsSourceUnitStateRepository.d.ts.map +1 -0
- package/dist/infrastructure/fs/FsSourceUnitStateRepository.js +87 -0
- package/dist/infrastructure/fs/FsSourceUnitStateRepository.js.map +1 -0
- package/dist/infrastructure/fs/FsWorkspaceRepository.d.ts.map +1 -1
- package/dist/infrastructure/fs/FsWorkspaceRepository.js +12 -3
- package/dist/infrastructure/fs/FsWorkspaceRepository.js.map +1 -1
- package/dist/infrastructure/fs/WorkspaceDiscovery.d.ts +15 -0
- package/dist/infrastructure/fs/WorkspaceDiscovery.d.ts.map +1 -0
- package/dist/infrastructure/fs/WorkspaceDiscovery.js +46 -0
- package/dist/infrastructure/fs/WorkspaceDiscovery.js.map +1 -0
- package/dist/infrastructure/fs/WorkspaceRegistryFile.d.ts +26 -2
- package/dist/infrastructure/fs/WorkspaceRegistryFile.d.ts.map +1 -1
- package/dist/infrastructure/fs/WorkspaceRegistryFile.js +109 -5
- package/dist/infrastructure/fs/WorkspaceRegistryFile.js.map +1 -1
- package/dist/infrastructure/fs/intentScan.d.ts +9 -0
- package/dist/infrastructure/fs/intentScan.d.ts.map +1 -0
- package/dist/infrastructure/fs/intentScan.js +135 -0
- package/dist/infrastructure/fs/intentScan.js.map +1 -0
- package/dist/infrastructure/fs/paths.d.ts +14 -0
- package/dist/infrastructure/fs/paths.d.ts.map +1 -1
- package/dist/infrastructure/fs/paths.js +43 -0
- package/dist/infrastructure/fs/paths.js.map +1 -1
- package/dist/infrastructure/fs/productManifestWriter.d.ts +1 -1
- package/dist/infrastructure/fs/productManifestWriter.d.ts.map +1 -1
- package/dist/infrastructure/fs/productManifestWriter.js +1 -3
- package/dist/infrastructure/fs/productManifestWriter.js.map +1 -1
- package/dist/infrastructure/git/GitWorkspaceHistory.d.ts +18 -0
- package/dist/infrastructure/git/GitWorkspaceHistory.d.ts.map +1 -0
- package/dist/infrastructure/git/GitWorkspaceHistory.js +303 -0
- package/dist/infrastructure/git/GitWorkspaceHistory.js.map +1 -0
- package/dist/infrastructure/git/commitMessage.d.ts +4 -0
- package/dist/infrastructure/git/commitMessage.d.ts.map +1 -0
- package/dist/infrastructure/git/commitMessage.js +71 -0
- package/dist/infrastructure/git/commitMessage.js.map +1 -0
- package/dist/infrastructure/oauth/GoogleOAuth.d.ts +48 -1
- package/dist/infrastructure/oauth/GoogleOAuth.d.ts.map +1 -1
- package/dist/infrastructure/oauth/GoogleOAuth.js +68 -0
- package/dist/infrastructure/oauth/GoogleOAuth.js.map +1 -1
- package/dist/infrastructure/users/UserDirectoryFromRegistry.d.ts +14 -0
- package/dist/infrastructure/users/UserDirectoryFromRegistry.d.ts.map +1 -0
- package/dist/infrastructure/users/UserDirectoryFromRegistry.js +21 -0
- package/dist/infrastructure/users/UserDirectoryFromRegistry.js.map +1 -0
- package/dist/infrastructure/users/UserRegistryFile.d.ts +23 -0
- package/dist/infrastructure/users/UserRegistryFile.d.ts.map +1 -0
- package/dist/infrastructure/users/UserRegistryFile.js +91 -0
- package/dist/infrastructure/users/UserRegistryFile.js.map +1 -0
- package/dist/infrastructure/users/ensureLocalUser.d.ts +15 -0
- package/dist/infrastructure/users/ensureLocalUser.d.ts.map +1 -0
- package/dist/infrastructure/users/ensureLocalUser.js +38 -0
- package/dist/infrastructure/users/ensureLocalUser.js.map +1 -0
- package/dist/infrastructure/users/ensureWorkspaceOwners.d.ts +9 -0
- package/dist/infrastructure/users/ensureWorkspaceOwners.d.ts.map +1 -0
- package/dist/infrastructure/users/ensureWorkspaceOwners.js +22 -0
- package/dist/infrastructure/users/ensureWorkspaceOwners.js.map +1 -0
- package/dist/middleware/auth.d.ts +29 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +81 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/cors.js +1 -1
- package/dist/middleware/cors.js.map +1 -1
- package/dist/middleware/requireAdmin.d.ts +10 -0
- package/dist/middleware/requireAdmin.d.ts.map +1 -0
- package/dist/middleware/requireAdmin.js +24 -0
- package/dist/middleware/requireAdmin.js.map +1 -0
- package/dist/middleware/userId.d.ts +16 -0
- package/dist/middleware/userId.d.ts.map +1 -0
- package/dist/middleware/userId.js +27 -0
- package/dist/middleware/userId.js.map +1 -0
- package/dist/middleware/workspaceAccess.d.ts +47 -0
- package/dist/middleware/workspaceAccess.d.ts.map +1 -0
- package/dist/middleware/workspaceAccess.js +86 -0
- package/dist/middleware/workspaceAccess.js.map +1 -0
- package/dist/policy/Capability.d.ts +12 -0
- package/dist/policy/Capability.d.ts.map +1 -0
- package/dist/policy/Capability.js +31 -0
- package/dist/policy/Capability.js.map +1 -0
- package/dist/policy/CapabilityCheck.d.ts +14 -0
- package/dist/policy/CapabilityCheck.d.ts.map +1 -0
- package/dist/policy/CapabilityCheck.js +2 -0
- package/dist/policy/CapabilityCheck.js.map +1 -0
- package/dist/policy/PermissionRegistry.d.ts +23 -0
- package/dist/policy/PermissionRegistry.d.ts.map +1 -0
- package/dist/policy/PermissionRegistry.js +27 -0
- package/dist/policy/PermissionRegistry.js.map +1 -0
- package/dist/policy/ViewerContext.d.ts +27 -0
- package/dist/policy/ViewerContext.d.ts.map +1 -0
- package/dist/policy/ViewerContext.js +2 -0
- package/dist/policy/ViewerContext.js.map +1 -0
- package/dist/policy/checks.d.ts +15 -0
- package/dist/policy/checks.d.ts.map +1 -0
- package/dist/policy/checks.js +52 -0
- package/dist/policy/checks.js.map +1 -0
- package/dist/policy/defaultRegistry.d.ts +10 -0
- package/dist/policy/defaultRegistry.d.ts.map +1 -0
- package/dist/policy/defaultRegistry.js +16 -0
- package/dist/policy/defaultRegistry.js.map +1 -0
- package/dist/policy/index.d.ts +8 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +5 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/resolveViewer.d.ts +16 -0
- package/dist/policy/resolveViewer.d.ts.map +1 -0
- package/dist/policy/resolveViewer.js +37 -0
- package/dist/policy/resolveViewer.js.map +1 -0
- package/dist/routes/_shared.d.ts +198 -0
- package/dist/routes/_shared.d.ts.map +1 -0
- package/dist/routes/_shared.js +29 -0
- package/dist/routes/_shared.js.map +1 -0
- package/dist/routes/admin.d.ts +13 -0
- package/dist/routes/admin.d.ts.map +1 -0
- package/dist/routes/admin.js +227 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/auth.d.ts +33 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +170 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/batch.d.ts +7 -0
- package/dist/routes/batch.d.ts.map +1 -0
- package/dist/routes/batch.js +47 -0
- package/dist/routes/batch.js.map +1 -0
- package/dist/routes/clarify.d.ts +4 -3
- package/dist/routes/clarify.d.ts.map +1 -1
- package/dist/routes/clarify.js +247 -57
- package/dist/routes/clarify.js.map +1 -1
- package/dist/routes/decisions.d.ts +2 -2
- package/dist/routes/decisions.d.ts.map +1 -1
- package/dist/routes/decisions.js +50 -12
- package/dist/routes/decisions.js.map +1 -1
- package/dist/routes/edges.d.ts +2 -2
- package/dist/routes/edges.d.ts.map +1 -1
- package/dist/routes/edges.js +35 -13
- package/dist/routes/edges.js.map +1 -1
- package/dist/routes/health.d.ts +2 -2
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +21 -3
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/history.d.ts +7 -0
- package/dist/routes/history.d.ts.map +1 -0
- package/dist/routes/history.js +88 -0
- package/dist/routes/history.js.map +1 -0
- package/dist/routes/model.d.ts +2 -2
- package/dist/routes/model.d.ts.map +1 -1
- package/dist/routes/model.js +20 -4
- package/dist/routes/model.js.map +1 -1
- package/dist/routes/nodes.d.ts +2 -2
- package/dist/routes/nodes.d.ts.map +1 -1
- package/dist/routes/nodes.js +75 -19
- package/dist/routes/nodes.js.map +1 -1
- package/dist/routes/ontology.d.ts +2 -2
- package/dist/routes/ontology.d.ts.map +1 -1
- package/dist/routes/ontology.js +22 -5
- package/dist/routes/ontology.js.map +1 -1
- package/dist/routes/proposals.d.ts +4 -3
- package/dist/routes/proposals.d.ts.map +1 -1
- package/dist/routes/proposals.js +170 -41
- package/dist/routes/proposals.js.map +1 -1
- package/dist/routes/runs.d.ts.map +1 -1
- package/dist/routes/runs.js +52 -1
- package/dist/routes/runs.js.map +1 -1
- package/dist/routes/skillInputOptions.d.ts +10 -0
- package/dist/routes/skillInputOptions.d.ts.map +1 -0
- package/dist/routes/skillInputOptions.js +161 -0
- package/dist/routes/skillInputOptions.js.map +1 -0
- package/dist/routes/skills.d.ts +2 -2
- package/dist/routes/skills.d.ts.map +1 -1
- package/dist/routes/skills.js +89 -19
- package/dist/routes/skills.js.map +1 -1
- package/dist/routes/sourceLoaders.d.ts +7 -0
- package/dist/routes/sourceLoaders.d.ts.map +1 -0
- package/dist/routes/sourceLoaders.js +29 -0
- package/dist/routes/sourceLoaders.js.map +1 -0
- package/dist/routes/sourceUnitStates.d.ts +7 -0
- package/dist/routes/sourceUnitStates.d.ts.map +1 -0
- package/dist/routes/sourceUnitStates.js +45 -0
- package/dist/routes/sourceUnitStates.js.map +1 -0
- package/dist/routes/users.d.ts +9 -0
- package/dist/routes/users.d.ts.map +1 -0
- package/dist/routes/users.js +127 -0
- package/dist/routes/users.js.map +1 -0
- package/dist/routes/workspaceMembers.d.ts +11 -0
- package/dist/routes/workspaceMembers.d.ts.map +1 -0
- package/dist/routes/workspaceMembers.js +81 -0
- package/dist/routes/workspaceMembers.js.map +1 -0
- package/dist/routes/workspaces.d.ts +19 -1
- package/dist/routes/workspaces.d.ts.map +1 -1
- package/dist/routes/workspaces.js +161 -45
- package/dist/routes/workspaces.js.map +1 -1
- package/dist/server.js +69 -25
- package/dist/server.js.map +1 -1
- package/package.json +48 -31
- package/LICENSE +0 -21
- package/dist/infrastructure/agent/ClaudeCodeAgentBinding.d.ts +0 -8
- package/dist/infrastructure/agent/ClaudeCodeAgentBinding.d.ts.map +0 -1
- package/dist/infrastructure/agent/ClaudeCodeAgentBinding.js +0 -62
- package/dist/infrastructure/agent/ClaudeCodeAgentBinding.js.map +0 -1
package/dist/routes/proposals.js
CHANGED
|
@@ -1,79 +1,208 @@
|
|
|
1
|
-
import { ProposalDraft, ProposalId, ProposalStatus, UserId } from '@braidhq/schema';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { Decision, Proposal, ProposalDraft, ProposalId, ProposalStatus, UserId, ValidationResult } from '@braidhq/schema';
|
|
2
|
+
import { createRoute, OpenAPIHono, z } from '@hono/zod-openapi';
|
|
3
|
+
import { getUserId } from '../middleware/userId.js';
|
|
4
|
+
import { getViewerContext, requirePermission } from '../middleware/workspaceAccess.js';
|
|
5
5
|
import { getWorkspaceId } from '../middleware/workspaceId.js';
|
|
6
|
+
import { NotFoundResponse, ValidationFailureResponse, WorkspaceIdParam } from './_shared.js';
|
|
6
7
|
import { assertEntityInWorkspace } from './helpers.js';
|
|
7
|
-
const
|
|
8
|
-
status: z.union([ProposalStatus, z.array(ProposalStatus)]).optional(),
|
|
8
|
+
const ListQuery = z.object({
|
|
9
|
+
status: z.union([ProposalStatus, z.array(ProposalStatus)]).optional().openapi({ description: 'Filter by proposal status; pass one or many.' }),
|
|
9
10
|
limit: z.coerce.number().int().positive().optional(),
|
|
10
11
|
offset: z.coerce.number().int().nonnegative().optional(),
|
|
12
|
+
showAll: z.coerce.boolean().optional().openapi({ description: 'Owner-only: bypass the personal-pending filter so every member\'s drafts are visible.' }),
|
|
11
13
|
});
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
// Body `userId` is a back-compat shim for API consumers that haven't
|
|
15
|
+
// migrated to the `X-Braid-User` header / Bearer-token flow. When
|
|
16
|
+
// present it overrides the middleware-derived id; when omitted the
|
|
17
|
+
// handler falls back to `getUserId(c)`. Studio sends it via header
|
|
18
|
+
// only; the path will be removed once the deprecation window closes.
|
|
19
|
+
const ApplyBody = z.object({
|
|
20
|
+
userId: UserId.optional(),
|
|
21
|
+
}).openapi('ProposalApplyBody');
|
|
22
|
+
const RejectBody = z.object({
|
|
16
23
|
reason: z.string().min(1),
|
|
17
|
-
userId: UserId,
|
|
18
|
-
});
|
|
24
|
+
userId: UserId.optional(),
|
|
25
|
+
}).openapi('ProposalRejectBody');
|
|
19
26
|
// Skill-facing create. Body must carry `workspaceId` matching the route
|
|
20
27
|
// param; we let zod parse the rest of the ProposalDraft fields and let
|
|
21
28
|
// HITLService.submitProposal validate ops against the live graph.
|
|
22
|
-
const
|
|
29
|
+
const CreateBody = ProposalDraft.omit({ workspaceId: true }).openapi('ProposalCreateBody');
|
|
30
|
+
const ProposalIdParam = WorkspaceIdParam.extend({
|
|
31
|
+
proposalId: ProposalId.openapi({ param: { name: 'proposalId', in: 'path' } }),
|
|
32
|
+
});
|
|
33
|
+
const ProposalListResponse = z.object({
|
|
34
|
+
items: z.array(Proposal),
|
|
35
|
+
}).openapi('ProposalListResponse');
|
|
36
|
+
const createProposalRoute = createRoute({
|
|
37
|
+
method: 'post',
|
|
38
|
+
path: '/',
|
|
39
|
+
operationId: 'createProposal',
|
|
40
|
+
summary: 'Submit a proposal draft. Server validates operations against the live graph.',
|
|
41
|
+
description: 'Skills POST here to submit graph operations for HITL review. Returns 201 with the saved proposal on success, 400 with structured issues on validation failure.',
|
|
42
|
+
tags: ['proposals'],
|
|
43
|
+
request: {
|
|
44
|
+
params: WorkspaceIdParam,
|
|
45
|
+
body: { content: { 'application/json': { schema: CreateBody } } },
|
|
46
|
+
},
|
|
47
|
+
responses: {
|
|
48
|
+
201: {
|
|
49
|
+
description: 'The saved proposal.',
|
|
50
|
+
content: { 'application/json': { schema: Proposal } },
|
|
51
|
+
},
|
|
52
|
+
400: ValidationFailureResponse,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
const listProposalsRoute = createRoute({
|
|
56
|
+
method: 'get',
|
|
57
|
+
path: '/',
|
|
58
|
+
operationId: 'listProposals',
|
|
59
|
+
summary: 'List proposals for a workspace, optionally filtered by status.',
|
|
60
|
+
tags: ['proposals'],
|
|
61
|
+
request: {
|
|
62
|
+
params: WorkspaceIdParam,
|
|
63
|
+
query: ListQuery,
|
|
64
|
+
},
|
|
65
|
+
responses: {
|
|
66
|
+
200: {
|
|
67
|
+
description: 'A page of matching proposals.',
|
|
68
|
+
content: { 'application/json': { schema: ProposalListResponse } },
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
const getProposalRoute = createRoute({
|
|
73
|
+
method: 'get',
|
|
74
|
+
path: '/{proposalId}',
|
|
75
|
+
operationId: 'getProposal',
|
|
76
|
+
summary: 'Fetch a single proposal by id.',
|
|
77
|
+
tags: ['proposals'],
|
|
78
|
+
request: { params: ProposalIdParam },
|
|
79
|
+
responses: {
|
|
80
|
+
200: {
|
|
81
|
+
description: 'The requested proposal.',
|
|
82
|
+
content: { 'application/json': { schema: Proposal } },
|
|
83
|
+
},
|
|
84
|
+
404: NotFoundResponse,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
const validateProposalRoute = createRoute({
|
|
88
|
+
method: 'get',
|
|
89
|
+
path: '/{proposalId}/validate',
|
|
90
|
+
operationId: 'validateProposal',
|
|
91
|
+
summary: 'Pre-apply check; returns the validation issues a proposal would hit if applied now.',
|
|
92
|
+
tags: ['proposals'],
|
|
93
|
+
request: { params: ProposalIdParam },
|
|
94
|
+
responses: {
|
|
95
|
+
200: {
|
|
96
|
+
description: 'Validation result for the proposal against the current graph.',
|
|
97
|
+
content: { 'application/json': { schema: ValidationResult } },
|
|
98
|
+
},
|
|
99
|
+
404: NotFoundResponse,
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
const applyProposalRoute = createRoute({
|
|
103
|
+
method: 'post',
|
|
104
|
+
path: '/{proposalId}/apply',
|
|
105
|
+
operationId: 'applyProposal',
|
|
106
|
+
summary: 'Apply a proposal to the graph. Human-triggered in the UI.',
|
|
107
|
+
tags: ['proposals'],
|
|
108
|
+
request: {
|
|
109
|
+
params: ProposalIdParam,
|
|
110
|
+
body: { content: { 'application/json': { schema: ApplyBody } } },
|
|
111
|
+
},
|
|
112
|
+
responses: {
|
|
113
|
+
200: {
|
|
114
|
+
description: 'The recorded Decision.',
|
|
115
|
+
content: { 'application/json': { schema: Decision } },
|
|
116
|
+
},
|
|
117
|
+
404: NotFoundResponse,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
const rejectProposalRoute = createRoute({
|
|
121
|
+
method: 'post',
|
|
122
|
+
path: '/{proposalId}/reject',
|
|
123
|
+
operationId: 'rejectProposal',
|
|
124
|
+
summary: 'Reject a proposal with a rationale. Human-triggered in the UI.',
|
|
125
|
+
tags: ['proposals'],
|
|
126
|
+
request: {
|
|
127
|
+
params: ProposalIdParam,
|
|
128
|
+
body: { content: { 'application/json': { schema: RejectBody } } },
|
|
129
|
+
},
|
|
130
|
+
responses: {
|
|
131
|
+
200: {
|
|
132
|
+
description: 'The recorded Decision.',
|
|
133
|
+
content: { 'application/json': { schema: Decision } },
|
|
134
|
+
},
|
|
135
|
+
404: NotFoundResponse,
|
|
136
|
+
},
|
|
137
|
+
});
|
|
23
138
|
export function createProposalsRouter(deps) {
|
|
24
|
-
const router = new
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
router.
|
|
139
|
+
const router = new OpenAPIHono();
|
|
140
|
+
// Apply / reject are HITL decisions — Owner + Maintainer only. Guests
|
|
141
|
+
// never see the buttons (UI hides the tab) but defence-in-depth here
|
|
142
|
+
// means a direct curl from a Guest token still 403s.
|
|
143
|
+
router.use('/:proposalId/apply', requirePermission('proposal.write'));
|
|
144
|
+
router.use('/:proposalId/reject', requirePermission('proposal.write'));
|
|
145
|
+
router.openapi(createProposalRoute, async (context) => {
|
|
29
146
|
const workspaceId = getWorkspaceId(context);
|
|
30
147
|
const body = context.req.valid('json');
|
|
31
|
-
const
|
|
148
|
+
const submitterId = getUserId(context);
|
|
149
|
+
const proposal = await deps.hitlService.submitProposal({ workspaceId, ...body, submitterId });
|
|
32
150
|
return context.json(proposal.toData(), 201);
|
|
33
151
|
});
|
|
34
|
-
router.
|
|
152
|
+
router.openapi(listProposalsRoute, async (context) => {
|
|
35
153
|
const workspaceId = getWorkspaceId(context);
|
|
36
|
-
const { status, limit, offset } = context.req.valid('query');
|
|
154
|
+
const { status, limit, offset, showAll } = context.req.valid('query');
|
|
37
155
|
const statuses = status === undefined ? undefined : Array.isArray(status) ? status : [status];
|
|
38
|
-
|
|
39
|
-
|
|
156
|
+
// Show All bypass is gated to the workspace owner; everyone else
|
|
157
|
+
// is forced through the personal-pending filter regardless of
|
|
158
|
+
// what they send.
|
|
159
|
+
const viewer = getViewerContext(context);
|
|
160
|
+
const viewerId = (showAll && viewer?.effectiveRole === 'owner') ? undefined : getUserId(context);
|
|
161
|
+
const proposals = await deps.proposalRepository.list({
|
|
162
|
+
workspaceId,
|
|
163
|
+
statuses,
|
|
164
|
+
limit,
|
|
165
|
+
offset,
|
|
166
|
+
...(viewerId ? { viewerId } : {}),
|
|
167
|
+
});
|
|
168
|
+
return context.json({ items: proposals.map(proposal => proposal.toData()) }, 200);
|
|
40
169
|
});
|
|
41
|
-
router.
|
|
170
|
+
router.openapi(getProposalRoute, async (context) => {
|
|
42
171
|
const workspaceId = getWorkspaceId(context);
|
|
43
|
-
const proposalId =
|
|
172
|
+
const { proposalId } = context.req.valid('param');
|
|
44
173
|
const proposal = await deps.proposalRepository.load(proposalId);
|
|
45
174
|
assertEntityInWorkspace(workspaceId, proposal.workspaceId, 'Proposal', proposalId);
|
|
46
|
-
return context.json(proposal.toData());
|
|
175
|
+
return context.json(proposal.toData(), 200);
|
|
47
176
|
});
|
|
48
|
-
|
|
49
|
-
// tried to apply this proposal right now. Skills call this after writing
|
|
50
|
-
// their proposal so they can iterate on issues without the user in the loop.
|
|
51
|
-
router.get('/:proposalId/validate', async (context) => {
|
|
177
|
+
router.openapi(validateProposalRoute, async (context) => {
|
|
52
178
|
const workspaceId = getWorkspaceId(context);
|
|
53
|
-
const proposalId =
|
|
179
|
+
const { proposalId } = context.req.valid('param');
|
|
54
180
|
const proposal = await deps.proposalRepository.load(proposalId);
|
|
55
181
|
assertEntityInWorkspace(workspaceId, proposal.workspaceId, 'Proposal', proposalId);
|
|
182
|
+
const workspace = await deps.workspaceService.findById(workspaceId);
|
|
56
183
|
const snapshot = await deps.modelRepository.load(workspaceId);
|
|
57
|
-
const result = await deps.validationService.validateOperations(snapshot, proposal.operations);
|
|
58
|
-
return context.json(result);
|
|
184
|
+
const result = await deps.validationService.validateOperations(snapshot, proposal.operations, workspace);
|
|
185
|
+
return context.json(result, 200);
|
|
59
186
|
});
|
|
60
|
-
router.
|
|
187
|
+
router.openapi(applyProposalRoute, async (context) => {
|
|
61
188
|
const workspaceId = getWorkspaceId(context);
|
|
62
|
-
const proposalId =
|
|
63
|
-
const
|
|
189
|
+
const { proposalId } = context.req.valid('param');
|
|
190
|
+
const body = context.req.valid('json');
|
|
191
|
+
const userId = body.userId ?? getUserId(context);
|
|
64
192
|
const proposal = await deps.proposalRepository.load(proposalId);
|
|
65
193
|
assertEntityInWorkspace(workspaceId, proposal.workspaceId, 'Proposal', proposalId);
|
|
66
194
|
const decision = await deps.hitlService.applyProposal(proposalId, userId);
|
|
67
|
-
return context.json(decision);
|
|
195
|
+
return context.json(decision, 200);
|
|
68
196
|
});
|
|
69
|
-
router.
|
|
197
|
+
router.openapi(rejectProposalRoute, async (context) => {
|
|
70
198
|
const workspaceId = getWorkspaceId(context);
|
|
71
|
-
const proposalId =
|
|
72
|
-
const { reason, userId } = context.req.valid('json');
|
|
199
|
+
const { proposalId } = context.req.valid('param');
|
|
200
|
+
const { reason, userId: bodyUserId } = context.req.valid('json');
|
|
201
|
+
const userId = bodyUserId ?? getUserId(context);
|
|
73
202
|
const proposal = await deps.proposalRepository.load(proposalId);
|
|
74
203
|
assertEntityInWorkspace(workspaceId, proposal.workspaceId, 'Proposal', proposalId);
|
|
75
204
|
const decision = await deps.hitlService.rejectProposal(proposalId, reason, userId);
|
|
76
|
-
return context.json(decision);
|
|
205
|
+
return context.json(decision, 200);
|
|
77
206
|
});
|
|
78
207
|
return router;
|
|
79
208
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposals.js","sourceRoot":"","sources":["../../src/routes/proposals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"proposals.js","sourceRoot":"","sources":["../../src/routes/proposals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACzH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAEtD,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;IAC9I,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACpD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACxD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,uFAAuF,EAAE,CAAC;CACzJ,CAAC,CAAA;AAEF,qEAAqE;AACrE,kEAAkE;AAClE,mEAAmE;AACnE,mEAAmE;AACnE,qEAAqE;AACrE,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;CAC1B,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAE/B,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;CAC1B,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAEhC,wEAAwE;AACxE,uEAAuE;AACvE,kEAAkE;AAClE,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAE1F,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAC9C,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;CAC9E,CAAC,CAAA;AAEF,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;CACzB,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;AAUlC,MAAM,mBAAmB,GAAG,WAAW,CAAC;IACtC,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,GAAG;IACT,WAAW,EAAE,gBAAgB;IAC7B,OAAO,EAAE,8EAA8E;IACvF,WAAW,EAAE,gKAAgK;IAC7K,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,OAAO,EAAE;QACP,MAAM,EAAE,gBAAgB;QACxB,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE;KAClE;IACD,SAAS,EAAE;QACT,GAAG,EAAE;YACH,WAAW,EAAE,qBAAqB;YAClC,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;SACtD;QACD,GAAG,EAAE,yBAAyB;KAC/B;CACF,CAAC,CAAA;AAEF,MAAM,kBAAkB,GAAG,WAAW,CAAC;IACrC,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,GAAG;IACT,WAAW,EAAE,eAAe;IAC5B,OAAO,EAAE,gEAAgE;IACzE,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,OAAO,EAAE;QACP,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,SAAS;KACjB;IACD,SAAS,EAAE;QACT,GAAG,EAAE;YACH,WAAW,EAAE,+BAA+B;YAC5C,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE;SAClE;KACF;CACF,CAAC,CAAA;AAEF,MAAM,gBAAgB,GAAG,WAAW,CAAC;IACnC,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,gCAAgC;IACzC,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE;IACpC,SAAS,EAAE;QACT,GAAG,EAAE;YACH,WAAW,EAAE,yBAAyB;YACtC,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;SACtD;QACD,GAAG,EAAE,gBAAgB;KACtB;CACF,CAAC,CAAA;AAEF,MAAM,qBAAqB,GAAG,WAAW,CAAC;IACxC,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,qFAAqF;IAC9F,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE;IACpC,SAAS,EAAE;QACT,GAAG,EAAE;YACH,WAAW,EAAE,+DAA+D;YAC5E,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE;SAC9D;QACD,GAAG,EAAE,gBAAgB;KACtB;CACF,CAAC,CAAA;AAEF,MAAM,kBAAkB,GAAG,WAAW,CAAC;IACrC,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,eAAe;IAC5B,OAAO,EAAE,2DAA2D;IACpE,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,OAAO,EAAE;QACP,MAAM,EAAE,eAAe;QACvB,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE;KACjE;IACD,SAAS,EAAE;QACT,GAAG,EAAE;YACH,WAAW,EAAE,wBAAwB;YACrC,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;SACtD;QACD,GAAG,EAAE,gBAAgB;KACtB;CACF,CAAC,CAAA;AAEF,MAAM,mBAAmB,GAAG,WAAW,CAAC;IACtC,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,gBAAgB;IAC7B,OAAO,EAAE,gEAAgE;IACzE,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,OAAO,EAAE;QACP,MAAM,EAAE,eAAe;QACvB,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE;KAClE;IACD,SAAS,EAAE;QACT,GAAG,EAAE;YACH,WAAW,EAAE,wBAAwB;YACrC,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;SACtD;QACD,GAAG,EAAE,gBAAgB;KACtB;CACF,CAAC,CAAA;AAEF,MAAM,UAAU,qBAAqB,CAAC,IAAyB;IAC7D,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAA;IAChC,sEAAsE;IACtE,qEAAqE;IACrE,qDAAqD;IACrD,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAA;IACrE,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAEtE,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACtC,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;QAC7F,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACnD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACrE,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAC7F,iEAAiE;QACjE,8DAA8D;QAC9D,kBAAkB;QAClB,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAChG,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;YACnD,WAAW;YACX,QAAQ;YACR,KAAK;YACL,MAAM;YACN,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClC,CAAC,CAAA;QACF,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IACnF,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACjD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC/D,uBAAuB,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QAClF,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACtD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC/D,uBAAuB,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QAClF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;QACxG,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACnD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,CAAA;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC/D,uBAAuB,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QAClF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QACzE,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACjD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAChE,MAAM,MAAM,GAAG,UAAU,IAAI,SAAS,CAAC,OAAO,CAAC,CAAA;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC/D,uBAAuB,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QAClF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClF,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/routes/runs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,mBAAmB,EACpB,MAAM,eAAe,CAAA;AAItB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/routes/runs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,mBAAmB,EACpB,MAAM,eAAe,CAAA;AAItB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAO3B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,CAAA;CAClD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CA+H3D"}
|
package/dist/routes/runs.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { NotFoundError } from '@braidhq/core';
|
|
1
|
+
import { ConflictError, NotFoundError, ValidationError } from '@braidhq/core';
|
|
2
2
|
import { SkillRunId } from '@braidhq/schema';
|
|
3
3
|
import { Hono } from 'hono';
|
|
4
4
|
import { streamSSE } from 'hono/streaming';
|
|
5
|
+
import { z } from 'zod';
|
|
5
6
|
import { createAsyncQueue } from '../infrastructure/agent/asyncQueue.js';
|
|
6
7
|
import { getWorkspaceId } from '../middleware/workspaceId.js';
|
|
7
8
|
import { loadWorkspaceById } from './helpers.js';
|
|
@@ -66,8 +67,58 @@ export function createRunsRouter(deps) {
|
|
|
66
67
|
if (!sessionId)
|
|
67
68
|
throw new NotFoundError('sessionId is required');
|
|
68
69
|
await deps.skillRunner.forgetSession(sessionId);
|
|
70
|
+
// `?purge=true` also drops the persisted run records and event
|
|
71
|
+
// logs, matching the workspace-level `?purge=true` pattern. Used
|
|
72
|
+
// by the Studio's per-conversation Delete action; the default
|
|
73
|
+
// (no purge) is the lightweight `forgetSession` semantics that
|
|
74
|
+
// "New conversation" leans on.
|
|
75
|
+
if (context.req.query('purge') === 'true') {
|
|
76
|
+
const workspace = await loadWorkspaceById(getWorkspaceId(context), deps.workspaceRepository);
|
|
77
|
+
const all = await deps.runRepository.listRecords(workspace);
|
|
78
|
+
const targets = all.filter(r => r.sessionId === sessionId).map(r => r.runId);
|
|
79
|
+
const active = targets.find(id => deps.skillRunner.isActive(id));
|
|
80
|
+
if (active)
|
|
81
|
+
throw new ConflictError(`Cannot delete session "${sessionId}": run "${active}" is still active`);
|
|
82
|
+
await deps.runRepository.deleteRecords(workspace, targets);
|
|
83
|
+
}
|
|
69
84
|
return context.body(null, 204);
|
|
70
85
|
});
|
|
86
|
+
// Single-run delete, used by orphan rows in Conversations that have
|
|
87
|
+
// no sessionId to anchor against. Refuses to touch an in-flight run.
|
|
88
|
+
router.delete('/:runId', async (context) => {
|
|
89
|
+
const runId = SkillRunId.parse(context.req.param('runId'));
|
|
90
|
+
if (deps.skillRunner.isActive(runId))
|
|
91
|
+
throw new ConflictError(`Run "${runId}" is still active`);
|
|
92
|
+
const workspace = await loadWorkspaceById(getWorkspaceId(context), deps.workspaceRepository);
|
|
93
|
+
await deps.runRepository.deleteRecords(workspace, [runId]);
|
|
94
|
+
return context.body(null, 204);
|
|
95
|
+
});
|
|
96
|
+
const SessionPatchBody = z.object({
|
|
97
|
+
// `null` clears the custom title (UI falls back to the first prompt).
|
|
98
|
+
title: z.string().min(1).max(200).nullable(),
|
|
99
|
+
});
|
|
100
|
+
router.get('/sessions', async (context) => {
|
|
101
|
+
const workspace = await loadWorkspaceById(getWorkspaceId(context), deps.workspaceRepository);
|
|
102
|
+
const items = await deps.runRepository.listSessionMetadata(workspace);
|
|
103
|
+
return context.json({ items });
|
|
104
|
+
});
|
|
105
|
+
router.patch('/sessions/:sessionId', async (context) => {
|
|
106
|
+
const sessionId = context.req.param('sessionId');
|
|
107
|
+
if (!sessionId)
|
|
108
|
+
throw new NotFoundError('sessionId is required');
|
|
109
|
+
const body = await context.req.json().catch(() => null);
|
|
110
|
+
const parsed = SessionPatchBody.safeParse(body);
|
|
111
|
+
if (!parsed.success)
|
|
112
|
+
throw new ValidationError(parsed.error.issues.map(i => i.message).join('; '));
|
|
113
|
+
const workspace = await loadWorkspaceById(getWorkspaceId(context), deps.workspaceRepository);
|
|
114
|
+
const metadata = {
|
|
115
|
+
sessionId,
|
|
116
|
+
title: parsed.data.title,
|
|
117
|
+
updatedAt: new Date().toISOString(),
|
|
118
|
+
};
|
|
119
|
+
await deps.runRepository.saveSessionMetadata(workspace, metadata);
|
|
120
|
+
return context.json(metadata);
|
|
121
|
+
});
|
|
71
122
|
return router;
|
|
72
123
|
}
|
|
73
124
|
//# sourceMappingURL=runs.js.map
|
package/dist/routes/runs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/routes/runs.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/routes/runs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ClarifyTicketRepository, ModelRepository, PluginRegistry, WorkspaceRepository } from '@braidhq/core';
|
|
2
|
+
import { OpenAPIHono } from '@hono/zod-openapi';
|
|
3
|
+
export interface SkillInputOptionsRouterDeps {
|
|
4
|
+
readonly modelRepository: ModelRepository;
|
|
5
|
+
readonly clarifyRepository: ClarifyTicketRepository;
|
|
6
|
+
readonly workspaceRepository: WorkspaceRepository;
|
|
7
|
+
readonly pluginRegistry: PluginRegistry;
|
|
8
|
+
}
|
|
9
|
+
export declare function createSkillInputOptionsRouter(deps: SkillInputOptionsRouterDeps): OpenAPIHono;
|
|
10
|
+
//# sourceMappingURL=skillInputOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillInputOptions.d.ts","sourceRoot":"","sources":["../../src/routes/skillInputOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,cAAc,EAAa,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAG7H,OAAO,EAAe,WAAW,EAAK,MAAM,mBAAmB,CAAA;AAsD/D,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAA;IACzC,QAAQ,CAAC,iBAAiB,EAAE,uBAAuB,CAAA;IACnD,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,CAAA;IACjD,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;CACxC;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,2BAA2B,GAAG,WAAW,CAgB5F"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { SkillInputOptionsResponse } from '@braidhq/schema';
|
|
2
|
+
import { createRoute, OpenAPIHono, z } from '@hono/zod-openapi';
|
|
3
|
+
import { listIntentItems } from '../infrastructure/fs/intentScan.js';
|
|
4
|
+
import { getWorkspaceId } from '../middleware/workspaceId.js';
|
|
5
|
+
import { WorkspaceIdParam } from './_shared.js';
|
|
6
|
+
import { loadWorkspaceById } from './helpers.js';
|
|
7
|
+
/**
|
|
8
|
+
* Studio-facing endpoint that resolves a skill input provider type
|
|
9
|
+
* (declared in a SKILL.md frontmatter) to the current option list for
|
|
10
|
+
* a given workspace. Used by the typed Actions form to populate
|
|
11
|
+
* pickers backed by `graph-node` / `source-intent` / `clarify` /
|
|
12
|
+
* `proposal` rather than static options.
|
|
13
|
+
*
|
|
14
|
+
* The endpoint is intentionally read-only and lives alongside other
|
|
15
|
+
* Studio-metadata routes; it's mounted under
|
|
16
|
+
* `/workspaces/:workspaceId/skill-input-options`.
|
|
17
|
+
*/
|
|
18
|
+
const ProviderType = z.enum(['graph-node', 'source-intent', 'clarify', 'proposal']);
|
|
19
|
+
const QuerySchema = z.object({
|
|
20
|
+
type: ProviderType.openapi({ param: { name: 'type', in: 'query' } }),
|
|
21
|
+
/**
|
|
22
|
+
* JSON-encoded filter object. Shape depends on the provider:
|
|
23
|
+
* graph-node -> { types?: string[]; statuses?: string[]; renderHint?: { container?: boolean } }
|
|
24
|
+
* source-intent -> { loaderKind?: string }
|
|
25
|
+
* clarify -> { status?: 'pending' | 'answered' | 'applied' | 'skipped' }
|
|
26
|
+
* proposal -> { status?: 'pending' | 'applied' | 'rejected' }
|
|
27
|
+
*
|
|
28
|
+
* Query-string-encoded JSON keeps the schema simple while letting
|
|
29
|
+
* each provider have a different filter shape. Studio is the only
|
|
30
|
+
* intended caller; humans drafting URLs by hand will rarely need it.
|
|
31
|
+
*/
|
|
32
|
+
filter: z.string().optional().openapi({ param: { name: 'filter', in: 'query' } }),
|
|
33
|
+
});
|
|
34
|
+
const route = createRoute({
|
|
35
|
+
method: 'get',
|
|
36
|
+
path: '/',
|
|
37
|
+
operationId: 'listSkillInputOptions',
|
|
38
|
+
summary: 'Resolve a skill input provider to its current option list (Studio form helper).',
|
|
39
|
+
tags: ['skills'],
|
|
40
|
+
request: {
|
|
41
|
+
params: WorkspaceIdParam,
|
|
42
|
+
query: QuerySchema,
|
|
43
|
+
},
|
|
44
|
+
responses: {
|
|
45
|
+
200: {
|
|
46
|
+
description: 'Option list (possibly empty when the workspace has nothing matching the filter).',
|
|
47
|
+
content: { 'application/json': { schema: SkillInputOptionsResponse } },
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
export function createSkillInputOptionsRouter(deps) {
|
|
52
|
+
const router = new OpenAPIHono();
|
|
53
|
+
router.openapi(route, async (context) => {
|
|
54
|
+
const workspaceId = getWorkspaceId(context);
|
|
55
|
+
const workspace = await loadWorkspaceById(workspaceId, deps.workspaceRepository);
|
|
56
|
+
const { type, filter } = context.req.valid('query');
|
|
57
|
+
const parsedFilter = filter
|
|
58
|
+
? safeParseJson(filter)
|
|
59
|
+
: {};
|
|
60
|
+
const items = await resolveProvider(type, parsedFilter, workspace, deps);
|
|
61
|
+
return context.json({ items }, 200);
|
|
62
|
+
});
|
|
63
|
+
return router;
|
|
64
|
+
}
|
|
65
|
+
async function resolveProvider(type, filter, workspace, deps) {
|
|
66
|
+
switch (type) {
|
|
67
|
+
case 'graph-node':
|
|
68
|
+
return resolveGraphNode(filter, workspace, deps);
|
|
69
|
+
case 'source-intent':
|
|
70
|
+
return resolveSourceIntent(filter, workspace);
|
|
71
|
+
case 'clarify':
|
|
72
|
+
return resolveClarify(filter, workspace.id, deps.clarifyRepository);
|
|
73
|
+
case 'proposal':
|
|
74
|
+
// Phase 2 leaves the proposal provider as a stub; no SKILL.md
|
|
75
|
+
// wires it yet. Returning empty keeps the endpoint contract
|
|
76
|
+
// stable while signalling "implement when a skill actually
|
|
77
|
+
// declares it".
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function resolveGraphNode(filter, workspace, deps) {
|
|
82
|
+
const types = Array.isArray(filter.types) ? filter.types : undefined;
|
|
83
|
+
const statuses = Array.isArray(filter.statuses) ? filter.statuses : undefined;
|
|
84
|
+
const renderHint = isRecord(filter.renderHint) ? filter.renderHint : undefined;
|
|
85
|
+
const wantContainerOnly = renderHint?.container === true;
|
|
86
|
+
let typesToInclude = types;
|
|
87
|
+
if (wantContainerOnly) {
|
|
88
|
+
// Container-ness is an ontology concern: the ontology's node-type
|
|
89
|
+
// descriptors carry `renderHint.container`. Intersect with any
|
|
90
|
+
// explicit `types` filter so both axes compose.
|
|
91
|
+
const ontology = deps.pluginRegistry.requireOntology(workspace.productManifest.ontologyId);
|
|
92
|
+
const containerTypeIds = ontology.nodeTypes
|
|
93
|
+
.filter(descriptor => descriptor.renderHint?.container === true)
|
|
94
|
+
.map(descriptor => descriptor.id);
|
|
95
|
+
typesToInclude = typesToInclude
|
|
96
|
+
? typesToInclude.filter(t => containerTypeIds.includes(t))
|
|
97
|
+
: containerTypeIds;
|
|
98
|
+
}
|
|
99
|
+
const snapshot = await deps.modelRepository.load(workspace.id);
|
|
100
|
+
const matched = snapshot.nodes.filter((node) => {
|
|
101
|
+
if (typesToInclude && !typesToInclude.includes(node.type))
|
|
102
|
+
return false;
|
|
103
|
+
if (statuses && !statuses.includes(node.status))
|
|
104
|
+
return false;
|
|
105
|
+
return true;
|
|
106
|
+
});
|
|
107
|
+
return matched.map(node => ({
|
|
108
|
+
value: node.id,
|
|
109
|
+
label: node.name,
|
|
110
|
+
...(node.description ? { description: firstLine(node.description) } : {}),
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
async function resolveSourceIntent(filter, workspace) {
|
|
114
|
+
const loaderKindFilter = typeof filter.loaderKind === 'string' ? filter.loaderKind : undefined;
|
|
115
|
+
const items = await listIntentItems(workspace);
|
|
116
|
+
return items
|
|
117
|
+
.filter((item) => {
|
|
118
|
+
if (!loaderKindFilter)
|
|
119
|
+
return true;
|
|
120
|
+
const source = workspace.sources.find(s => s.id === item.sourceId);
|
|
121
|
+
return source?.kind === 'filesystem' && source.loader?.kind === loaderKindFilter;
|
|
122
|
+
})
|
|
123
|
+
.map(item => ({
|
|
124
|
+
value: item.value,
|
|
125
|
+
label: item.label,
|
|
126
|
+
description: item.sourceName,
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
async function resolveClarify(filter, workspaceId, clarifyRepository) {
|
|
130
|
+
const status = typeof filter.status === 'string' ? filter.status : undefined;
|
|
131
|
+
const tickets = await clarifyRepository.list({
|
|
132
|
+
workspaceId,
|
|
133
|
+
...(status ? { statuses: [status] } : {}),
|
|
134
|
+
});
|
|
135
|
+
return tickets.map(ticket => ({
|
|
136
|
+
value: ticket.id,
|
|
137
|
+
label: truncate(ticket.question, 80),
|
|
138
|
+
description: ticket.status,
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
function safeParseJson(value) {
|
|
142
|
+
try {
|
|
143
|
+
const parsed = JSON.parse(value);
|
|
144
|
+
return isRecord(parsed) ? parsed : {};
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return {};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function isRecord(value) {
|
|
151
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
152
|
+
}
|
|
153
|
+
function firstLine(text) {
|
|
154
|
+
const trimmed = text.trim();
|
|
155
|
+
const nl = trimmed.indexOf('\n');
|
|
156
|
+
return nl === -1 ? truncate(trimmed, 120) : truncate(trimmed.slice(0, nl), 120);
|
|
157
|
+
}
|
|
158
|
+
function truncate(text, max) {
|
|
159
|
+
return text.length <= max ? text : `${text.slice(0, max - 1)}…`;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=skillInputOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillInputOptions.js","sourceRoot":"","sources":["../../src/routes/skillInputOptions.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/skills.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { SkillRegistry, SkillRunner, WorkspaceRepository } from '@braidhq/core';
|
|
2
|
-
import {
|
|
2
|
+
import { OpenAPIHono } from '@hono/zod-openapi';
|
|
3
3
|
export interface SkillsRouterDeps {
|
|
4
4
|
readonly skillRegistry: SkillRegistry;
|
|
5
5
|
readonly skillRunner: SkillRunner;
|
|
6
6
|
readonly workspaceRepository: WorkspaceRepository;
|
|
7
7
|
}
|
|
8
|
-
export declare function createSkillsRouter(deps: SkillsRouterDeps):
|
|
8
|
+
export declare function createSkillsRouter(deps: SkillsRouterDeps): OpenAPIHono;
|
|
9
9
|
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/routes/skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,mBAAmB,EACpB,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/routes/skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,mBAAmB,EACpB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAe,WAAW,EAAK,MAAM,mBAAmB,CAAA;AAyB/D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,CAAA;CAClD;AAyDD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,WAAW,CA0CtE"}
|