@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
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createAppComposition,
3
3
  startSlackInteractionPump
4
- } from "./chunk-AEVD7E2F.js";
4
+ } from "./chunk-5EEC7Q6C.js";
5
5
 
6
6
  // src/index.ts
7
7
  import {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeni/api-router",
3
- "version": "0.20.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.6",
48
- "@opengeni/contracts": "^0.35.0",
49
- "@opengeni/core": "^0.20.2",
50
- "@opengeni/db": "^0.26.0",
51
- "@opengeni/documents": "^0.3.2",
52
- "@opengeni/events": "^0.3.65",
53
- "@opengeni/github": "^0.4.22",
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.9",
56
- "@opengeni/runtime": "^0.18.3",
57
- "@opengeni/storage": "^0.2.59",
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");