@opengeni/api-router 0.20.0 → 0.21.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/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opengeni/api-router",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"description": "OpenGeni HTTP surface: the Hono adapter/router (createApp), routes, MCP HTTP transport, and HTTP access adapters over @opengeni/core. An engine-distribution surface — its runtime closure includes engine-internal packages.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -44,17 +44,17 @@
|
|
|
44
44
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
45
45
|
"@opengeni/agent-proto": "^0.3.0",
|
|
46
46
|
"@opengeni/codex": "^0.2.10",
|
|
47
|
-
"@opengeni/config": "^0.10.
|
|
48
|
-
"@opengeni/contracts": "^0.
|
|
49
|
-
"@opengeni/core": "^0.20.
|
|
50
|
-
"@opengeni/db": "^0.
|
|
51
|
-
"@opengeni/documents": "^0.3.
|
|
52
|
-
"@opengeni/events": "^0.3.
|
|
53
|
-
"@opengeni/github": "^0.4.
|
|
47
|
+
"@opengeni/config": "^0.10.7",
|
|
48
|
+
"@opengeni/contracts": "^0.36.0",
|
|
49
|
+
"@opengeni/core": "^0.20.3",
|
|
50
|
+
"@opengeni/db": "^0.27.0",
|
|
51
|
+
"@opengeni/documents": "^0.3.3",
|
|
52
|
+
"@opengeni/events": "^0.3.66",
|
|
53
|
+
"@opengeni/github": "^0.4.23",
|
|
54
54
|
"@opengeni/network": "^0.1.1",
|
|
55
|
-
"@opengeni/observability": "^0.4.
|
|
56
|
-
"@opengeni/runtime": "^0.18.
|
|
57
|
-
"@opengeni/storage": "^0.2.
|
|
55
|
+
"@opengeni/observability": "^0.4.10",
|
|
56
|
+
"@opengeni/runtime": "^0.18.4",
|
|
57
|
+
"@opengeni/storage": "^0.2.60",
|
|
58
58
|
"@temporalio/client": "^1.17.0",
|
|
59
59
|
"better-auth": "^1.6.14",
|
|
60
60
|
"hono": "^4.12.18",
|
|
@@ -2,6 +2,7 @@ import { randomUUID } from "node:crypto";
|
|
|
2
2
|
import {
|
|
3
3
|
ActivateWorkspaceInstructionPolicyRequest,
|
|
4
4
|
CreateWorkspaceInstructionPolicyDraftRequest,
|
|
5
|
+
CreateWorkspaceInstructionPolicyOnboardingProposalRequest,
|
|
5
6
|
ImportLegacyWorkspaceInstructionPolicyDraftRequest,
|
|
6
7
|
RollbackWorkspaceInstructionPolicyRequest,
|
|
7
8
|
WorkspaceInstructionPolicyActivationResponse,
|
|
@@ -10,22 +11,34 @@ import {
|
|
|
10
11
|
WorkspaceInstructionPolicyDiffResponse,
|
|
11
12
|
WorkspaceInstructionPolicyListQuery,
|
|
12
13
|
WorkspaceInstructionPolicyListResponse,
|
|
14
|
+
WorkspaceInstructionPolicyOnboardingProposal,
|
|
15
|
+
WorkspaceInstructionPolicyOnboardingProposalConflictResponse,
|
|
16
|
+
WorkspaceInstructionPolicyOnboardingProposalContentErrorResponse,
|
|
17
|
+
WorkspaceInstructionPolicyOnboardingProposalListQuery,
|
|
18
|
+
WorkspaceInstructionPolicyOnboardingProposalListResponse,
|
|
19
|
+
WorkspaceInstructionPolicyOnboardingProposalStaleResponse,
|
|
13
20
|
WorkspaceInstructionPolicyOperationReuseResponse,
|
|
14
21
|
WorkspaceInstructionPolicyRevision,
|
|
22
|
+
WORKSPACE_INSTRUCTION_POLICY_CONTENT_MAX_CHARS,
|
|
15
23
|
} from "@opengeni/contracts";
|
|
16
24
|
import { requireAccessGrant, type ApiRouteDeps } from "@opengeni/core";
|
|
17
25
|
import {
|
|
18
26
|
activateWorkspaceInstructionPolicyRevision,
|
|
19
27
|
createWorkspaceInstructionPolicyDraft,
|
|
28
|
+
createWorkspaceInstructionPolicyOnboardingProposal,
|
|
20
29
|
diffWorkspaceInstructionPolicyRevisions,
|
|
21
30
|
getWorkspaceInstructionPolicyRevision,
|
|
22
31
|
importLegacyWorkspaceInstructionPolicyDraft,
|
|
23
32
|
listWorkspaceInstructionPolicyRevisions,
|
|
33
|
+
listWorkspaceInstructionPolicyOnboardingProposals,
|
|
24
34
|
rollbackWorkspaceInstructionPolicyRevision,
|
|
25
35
|
WorkspaceInstructionPolicyConflictError,
|
|
26
36
|
WorkspaceInstructionPolicyInvalidOperationError,
|
|
27
37
|
WorkspaceInstructionPolicyLegacyUnavailableError,
|
|
28
38
|
WorkspaceInstructionPolicyNotFoundError,
|
|
39
|
+
WorkspaceInstructionPolicyOnboardingProposalConflictError,
|
|
40
|
+
WorkspaceInstructionPolicyOnboardingProposalContentError,
|
|
41
|
+
WorkspaceInstructionPolicyOnboardingProposalStaleError,
|
|
29
42
|
WorkspaceInstructionPolicyOperationReuseError,
|
|
30
43
|
} from "@opengeni/db";
|
|
31
44
|
import type { Context, Hono } from "hono";
|
|
@@ -62,6 +75,37 @@ function policyErrorResponse(context: Context, error: unknown): Response {
|
|
|
62
75
|
409,
|
|
63
76
|
);
|
|
64
77
|
}
|
|
78
|
+
if (error instanceof WorkspaceInstructionPolicyOnboardingProposalContentError) {
|
|
79
|
+
return context.json(
|
|
80
|
+
WorkspaceInstructionPolicyOnboardingProposalContentErrorResponse.parse({
|
|
81
|
+
code: error.code,
|
|
82
|
+
message: error.message,
|
|
83
|
+
maxChars: WORKSPACE_INSTRUCTION_POLICY_CONTENT_MAX_CHARS,
|
|
84
|
+
}),
|
|
85
|
+
422,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
if (error instanceof WorkspaceInstructionPolicyOnboardingProposalStaleError) {
|
|
89
|
+
return context.json(
|
|
90
|
+
WorkspaceInstructionPolicyOnboardingProposalStaleResponse.parse({
|
|
91
|
+
code: error.code,
|
|
92
|
+
message: error.message,
|
|
93
|
+
currentHead: error.currentHead,
|
|
94
|
+
}),
|
|
95
|
+
409,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
if (error instanceof WorkspaceInstructionPolicyOnboardingProposalConflictError) {
|
|
99
|
+
return context.json(
|
|
100
|
+
WorkspaceInstructionPolicyOnboardingProposalConflictResponse.parse({
|
|
101
|
+
code: error.code,
|
|
102
|
+
message: error.message,
|
|
103
|
+
existingProposalId: error.existingProposalId,
|
|
104
|
+
existingDraftRevisionId: error.existingDraftRevisionId,
|
|
105
|
+
}),
|
|
106
|
+
409,
|
|
107
|
+
);
|
|
108
|
+
}
|
|
65
109
|
if (error instanceof WorkspaceInstructionPolicyNotFoundError) {
|
|
66
110
|
return context.json(
|
|
67
111
|
{ code: "WORKSPACE_INSTRUCTION_POLICY_NOT_FOUND", message: error.message },
|
|
@@ -172,6 +216,58 @@ export function registerWorkspaceInstructionPolicyRoutes(app: Hono, deps: ApiRou
|
|
|
172
216
|
}
|
|
173
217
|
});
|
|
174
218
|
|
|
219
|
+
app.get(`${base}/onboarding-proposals`, async (context) => {
|
|
220
|
+
const workspaceId = context.req.param("workspaceId");
|
|
221
|
+
await requireAccessGrant(context, deps, workspaceId, "workspace:read");
|
|
222
|
+
const parsed = WorkspaceInstructionPolicyOnboardingProposalListQuery.safeParse({
|
|
223
|
+
limit: context.req.query("limit"),
|
|
224
|
+
});
|
|
225
|
+
if (!parsed.success) {
|
|
226
|
+
throw new HTTPException(422, {
|
|
227
|
+
message: "Invalid workspace instruction-policy onboarding-proposal query",
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
return context.json(
|
|
231
|
+
WorkspaceInstructionPolicyOnboardingProposalListResponse.parse(
|
|
232
|
+
await listWorkspaceInstructionPolicyOnboardingProposals(deps.db, workspaceId, parsed.data),
|
|
233
|
+
),
|
|
234
|
+
);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
app.post(`${base}/onboarding-proposals`, async (context) => {
|
|
238
|
+
const workspaceId = context.req.param("workspaceId");
|
|
239
|
+
const grant = await requireAccessGrant(context, deps, workspaceId, "workspace:admin");
|
|
240
|
+
assertBoundedActor(grant.subjectId);
|
|
241
|
+
const request = await parseBody(
|
|
242
|
+
context,
|
|
243
|
+
CreateWorkspaceInstructionPolicyOnboardingProposalRequest,
|
|
244
|
+
);
|
|
245
|
+
try {
|
|
246
|
+
return context.json(
|
|
247
|
+
WorkspaceInstructionPolicyOnboardingProposal.parse(
|
|
248
|
+
await createWorkspaceInstructionPolicyOnboardingProposal(deps.db, {
|
|
249
|
+
operationId: request.operationId ?? randomUUID(),
|
|
250
|
+
accountId: grant.accountId,
|
|
251
|
+
workspaceId,
|
|
252
|
+
createdBySubjectId: grant.subjectId,
|
|
253
|
+
kind: request.kind,
|
|
254
|
+
scope: request.scope,
|
|
255
|
+
roleKey: request.roleKey,
|
|
256
|
+
content: request.content,
|
|
257
|
+
sourceId: request.sourceId,
|
|
258
|
+
sourceVersion: request.sourceVersion,
|
|
259
|
+
confidenceBps: request.confidenceBps,
|
|
260
|
+
expectedCurrentRevisionId: request.expectedCurrentRevisionId,
|
|
261
|
+
expectedActivationVersion: request.expectedActivationVersion,
|
|
262
|
+
}),
|
|
263
|
+
),
|
|
264
|
+
201,
|
|
265
|
+
);
|
|
266
|
+
} catch (error) {
|
|
267
|
+
return policyErrorResponse(context, error);
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
|
|
175
271
|
app.get(`${base}/diff`, async (context) => {
|
|
176
272
|
const workspaceId = context.req.param("workspaceId");
|
|
177
273
|
await requireAccessGrant(context, deps, workspaceId, "workspace:read");
|