@polpo-ai/server 0.2.2

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.
Files changed (73) hide show
  1. package/dist/deps.d.ts +164 -0
  2. package/dist/deps.d.ts.map +1 -0
  3. package/dist/deps.js +9 -0
  4. package/dist/deps.js.map +1 -0
  5. package/dist/errors.d.ts +7 -0
  6. package/dist/errors.d.ts.map +1 -0
  7. package/dist/errors.js +12 -0
  8. package/dist/errors.js.map +1 -0
  9. package/dist/index.d.ts +25 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +25 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/playbook-utils.d.ts +36 -0
  14. package/dist/playbook-utils.d.ts.map +1 -0
  15. package/dist/playbook-utils.js +80 -0
  16. package/dist/playbook-utils.js.map +1 -0
  17. package/dist/routes/approvals.d.ts +17 -0
  18. package/dist/routes/approvals.d.ts.map +1 -0
  19. package/dist/routes/approvals.js +201 -0
  20. package/dist/routes/approvals.js.map +1 -0
  21. package/dist/routes/chat.d.ts +9 -0
  22. package/dist/routes/chat.d.ts.map +1 -0
  23. package/dist/routes/chat.js +170 -0
  24. package/dist/routes/chat.js.map +1 -0
  25. package/dist/routes/health.d.ts +7 -0
  26. package/dist/routes/health.d.ts.map +1 -0
  27. package/dist/routes/health.js +44 -0
  28. package/dist/routes/health.js.map +1 -0
  29. package/dist/routes/missions.d.ts +36 -0
  30. package/dist/routes/missions.d.ts.map +1 -0
  31. package/dist/routes/missions.js +636 -0
  32. package/dist/routes/missions.js.map +1 -0
  33. package/dist/routes/notifications.d.ts +8 -0
  34. package/dist/routes/notifications.d.ts.map +1 -0
  35. package/dist/routes/notifications.js +240 -0
  36. package/dist/routes/notifications.js.map +1 -0
  37. package/dist/routes/peers.d.ts +16 -0
  38. package/dist/routes/peers.d.ts.map +1 -0
  39. package/dist/routes/peers.js +183 -0
  40. package/dist/routes/peers.js.map +1 -0
  41. package/dist/routes/playbooks.d.ts +12 -0
  42. package/dist/routes/playbooks.d.ts.map +1 -0
  43. package/dist/routes/playbooks.js +223 -0
  44. package/dist/routes/playbooks.js.map +1 -0
  45. package/dist/routes/schedules.d.ts +7 -0
  46. package/dist/routes/schedules.d.ts.map +1 -0
  47. package/dist/routes/schedules.js +193 -0
  48. package/dist/routes/schedules.js.map +1 -0
  49. package/dist/routes/state.d.ts +16 -0
  50. package/dist/routes/state.d.ts.map +1 -0
  51. package/dist/routes/state.js +196 -0
  52. package/dist/routes/state.js.map +1 -0
  53. package/dist/routes/tasks.d.ts +17 -0
  54. package/dist/routes/tasks.d.ts.map +1 -0
  55. package/dist/routes/tasks.js +379 -0
  56. package/dist/routes/tasks.js.map +1 -0
  57. package/dist/routes/vault.d.ts +14 -0
  58. package/dist/routes/vault.d.ts.map +1 -0
  59. package/dist/routes/vault.js +237 -0
  60. package/dist/routes/vault.js.map +1 -0
  61. package/dist/routes/watchers.d.ts +6 -0
  62. package/dist/routes/watchers.d.ts.map +1 -0
  63. package/dist/routes/watchers.js +119 -0
  64. package/dist/routes/watchers.js.map +1 -0
  65. package/dist/schemas.d.ts +406 -0
  66. package/dist/schemas.d.ts.map +1 -0
  67. package/dist/schemas.js +314 -0
  68. package/dist/schemas.js.map +1 -0
  69. package/dist/security.d.ts +33 -0
  70. package/dist/security.d.ts.map +1 -0
  71. package/dist/security.js +66 -0
  72. package/dist/security.js.map +1 -0
  73. package/package.json +46 -0
@@ -0,0 +1,636 @@
1
+ import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
2
+ import { CreateMissionSchema, UpdateMissionSchema, AddMissionTaskSchema, UpdateMissionTaskSchema, ReorderMissionTasksSchema, AddMissionCheckpointSchema, UpdateMissionCheckpointSchema, AddMissionDelaySchema, UpdateMissionDelaySchema, AddMissionQualityGateSchema, UpdateMissionQualityGateSchema, AddMissionTeamMemberSchema, UpdateMissionTeamMemberSchema, UpdateMissionNotificationsSchema, } from "../schemas.js";
3
+ // ── Route definitions ─────────────────────────────────────────────────
4
+ const listMissionsRoute = createRoute({
5
+ method: "get",
6
+ path: "/",
7
+ tags: ["Missions"],
8
+ summary: "List missions",
9
+ responses: {
10
+ 200: {
11
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.array(z.any()) }) } },
12
+ description: "List of missions",
13
+ },
14
+ },
15
+ });
16
+ const listResumableMissionsRoute = createRoute({
17
+ method: "get",
18
+ path: "/resumable",
19
+ tags: ["Missions"],
20
+ summary: "List resumable missions",
21
+ responses: {
22
+ 200: {
23
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.array(z.any()) }) } },
24
+ description: "List of resumable missions",
25
+ },
26
+ },
27
+ });
28
+ const getMissionRoute = createRoute({
29
+ method: "get",
30
+ path: "/{missionId}",
31
+ tags: ["Missions"],
32
+ summary: "Get mission",
33
+ request: {
34
+ params: z.object({ missionId: z.string() }),
35
+ },
36
+ responses: {
37
+ 200: {
38
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
39
+ description: "Mission details",
40
+ },
41
+ 404: {
42
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string(), code: z.string() }) } },
43
+ description: "Mission not found",
44
+ },
45
+ },
46
+ });
47
+ const createMissionRoute = createRoute({
48
+ method: "post",
49
+ path: "/",
50
+ tags: ["Missions"],
51
+ summary: "Create mission",
52
+ request: {
53
+ body: { content: { "application/json": { schema: CreateMissionSchema } } },
54
+ },
55
+ responses: {
56
+ 201: {
57
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
58
+ description: "Mission created",
59
+ },
60
+ },
61
+ });
62
+ const updateMissionRoute = createRoute({
63
+ method: "patch",
64
+ path: "/{missionId}",
65
+ tags: ["Missions"],
66
+ summary: "Update mission",
67
+ request: {
68
+ params: z.object({ missionId: z.string() }),
69
+ body: { content: { "application/json": { schema: UpdateMissionSchema } } },
70
+ },
71
+ responses: {
72
+ 200: {
73
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
74
+ description: "Mission updated",
75
+ },
76
+ },
77
+ });
78
+ const deleteMissionRoute = createRoute({
79
+ method: "delete",
80
+ path: "/{missionId}",
81
+ tags: ["Missions"],
82
+ summary: "Delete mission",
83
+ request: {
84
+ params: z.object({ missionId: z.string() }),
85
+ },
86
+ responses: {
87
+ 200: {
88
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.object({ deleted: z.boolean() }) }) } },
89
+ description: "Mission deleted",
90
+ },
91
+ 404: {
92
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string(), code: z.string() }) } },
93
+ description: "Mission not found",
94
+ },
95
+ },
96
+ });
97
+ const executeMissionRoute = createRoute({
98
+ method: "post",
99
+ path: "/{missionId}/execute",
100
+ tags: ["Missions"],
101
+ summary: "Execute mission",
102
+ request: {
103
+ params: z.object({ missionId: z.string() }),
104
+ },
105
+ responses: {
106
+ 200: {
107
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
108
+ description: "Mission execution result",
109
+ },
110
+ },
111
+ });
112
+ const resumeMissionRoute = createRoute({
113
+ method: "post",
114
+ path: "/{missionId}/resume",
115
+ tags: ["Missions"],
116
+ summary: "Resume mission",
117
+ request: {
118
+ params: z.object({ missionId: z.string() }),
119
+ body: {
120
+ content: {
121
+ "application/json": {
122
+ schema: z.object({ retryFailed: z.boolean().optional() }),
123
+ },
124
+ },
125
+ required: false,
126
+ },
127
+ },
128
+ responses: {
129
+ 200: {
130
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
131
+ description: "Mission resumed",
132
+ },
133
+ },
134
+ });
135
+ const listCheckpointsRoute = createRoute({
136
+ method: "get",
137
+ path: "/checkpoints",
138
+ tags: ["Missions"],
139
+ summary: "List checkpoints",
140
+ responses: {
141
+ 200: {
142
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.array(z.any()) }) } },
143
+ description: "List of active checkpoints",
144
+ },
145
+ },
146
+ });
147
+ const resumeCheckpointRoute = createRoute({
148
+ method: "post",
149
+ path: "/{missionId}/checkpoints/{checkpointName}/resume",
150
+ tags: ["Missions"],
151
+ summary: "Resume checkpoint",
152
+ request: {
153
+ params: z.object({ missionId: z.string(), checkpointName: z.string() }),
154
+ },
155
+ responses: {
156
+ 200: {
157
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.object({ resumed: z.boolean() }) }) } },
158
+ description: "Checkpoint resumed",
159
+ },
160
+ 404: {
161
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string(), code: z.string() }) } },
162
+ description: "Checkpoint not found or not active",
163
+ },
164
+ },
165
+ });
166
+ const abortMissionRoute = createRoute({
167
+ method: "post",
168
+ path: "/{missionId}/abort",
169
+ tags: ["Missions"],
170
+ summary: "Abort mission",
171
+ request: {
172
+ params: z.object({ missionId: z.string() }),
173
+ },
174
+ responses: {
175
+ 200: {
176
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.object({ aborted: z.number() }) }) } },
177
+ description: "Mission aborted",
178
+ },
179
+ 404: {
180
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string(), code: z.string() }) } },
181
+ description: "Mission not found",
182
+ },
183
+ },
184
+ });
185
+ // ── Atomic mission data route definitions ─────────────────────────────
186
+ const missionOkResponse = {
187
+ 200: {
188
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
189
+ description: "Updated mission",
190
+ },
191
+ 404: {
192
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string(), code: z.string() }) } },
193
+ description: "Mission or entity not found",
194
+ },
195
+ };
196
+ // Tasks
197
+ const addMissionTaskRoute = createRoute({
198
+ method: "post", path: "/{missionId}/tasks", tags: ["Missions"],
199
+ summary: "Add mission task",
200
+ request: { params: z.object({ missionId: z.string() }), body: { content: { "application/json": { schema: AddMissionTaskSchema } } } },
201
+ responses: { ...missionOkResponse, 201: missionOkResponse[200] },
202
+ });
203
+ const updateMissionTaskRoute = createRoute({
204
+ method: "patch", path: "/{missionId}/tasks/{taskTitle}", tags: ["Missions"],
205
+ summary: "Update mission task",
206
+ request: { params: z.object({ missionId: z.string(), taskTitle: z.string() }), body: { content: { "application/json": { schema: UpdateMissionTaskSchema } } } },
207
+ responses: missionOkResponse,
208
+ });
209
+ const removeMissionTaskRoute = createRoute({
210
+ method: "delete", path: "/{missionId}/tasks/{taskTitle}", tags: ["Missions"],
211
+ summary: "Remove mission task",
212
+ request: { params: z.object({ missionId: z.string(), taskTitle: z.string() }) },
213
+ responses: missionOkResponse,
214
+ });
215
+ const reorderMissionTasksRoute = createRoute({
216
+ method: "put", path: "/{missionId}/tasks/reorder", tags: ["Missions"],
217
+ summary: "Reorder mission tasks",
218
+ request: { params: z.object({ missionId: z.string() }), body: { content: { "application/json": { schema: ReorderMissionTasksSchema } } } },
219
+ responses: missionOkResponse,
220
+ });
221
+ // Checkpoints
222
+ const addMissionCheckpointRoute = createRoute({
223
+ method: "post", path: "/{missionId}/checkpoints", tags: ["Missions"],
224
+ summary: "Add mission checkpoint",
225
+ request: { params: z.object({ missionId: z.string() }), body: { content: { "application/json": { schema: AddMissionCheckpointSchema } } } },
226
+ responses: { ...missionOkResponse, 201: missionOkResponse[200] },
227
+ });
228
+ const updateMissionCheckpointRoute = createRoute({
229
+ method: "patch", path: "/{missionId}/checkpoints/{checkpointName}", tags: ["Missions"],
230
+ summary: "Update mission checkpoint",
231
+ request: { params: z.object({ missionId: z.string(), checkpointName: z.string() }), body: { content: { "application/json": { schema: UpdateMissionCheckpointSchema } } } },
232
+ responses: missionOkResponse,
233
+ });
234
+ const removeMissionCheckpointRoute2 = createRoute({
235
+ method: "delete", path: "/{missionId}/checkpoints/{checkpointName}", tags: ["Missions"],
236
+ summary: "Remove mission checkpoint",
237
+ request: { params: z.object({ missionId: z.string(), checkpointName: z.string() }) },
238
+ responses: missionOkResponse,
239
+ });
240
+ // Delays
241
+ const listDelaysRoute = createRoute({
242
+ method: "get", path: "/delays", tags: ["Missions"],
243
+ summary: "List delays",
244
+ responses: { 200: { content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.array(z.any()) }) } }, description: "List of active delays" } },
245
+ });
246
+ const addMissionDelayRoute = createRoute({
247
+ method: "post", path: "/{missionId}/delays", tags: ["Missions"],
248
+ summary: "Add mission delay",
249
+ request: { params: z.object({ missionId: z.string() }), body: { content: { "application/json": { schema: AddMissionDelaySchema } } } },
250
+ responses: { ...missionOkResponse, 201: missionOkResponse[200] },
251
+ });
252
+ const updateMissionDelayRoute = createRoute({
253
+ method: "patch", path: "/{missionId}/delays/{delayName}", tags: ["Missions"],
254
+ summary: "Update mission delay",
255
+ request: { params: z.object({ missionId: z.string(), delayName: z.string() }), body: { content: { "application/json": { schema: UpdateMissionDelaySchema } } } },
256
+ responses: missionOkResponse,
257
+ });
258
+ const removeMissionDelayRoute = createRoute({
259
+ method: "delete", path: "/{missionId}/delays/{delayName}", tags: ["Missions"],
260
+ summary: "Remove mission delay",
261
+ request: { params: z.object({ missionId: z.string(), delayName: z.string() }) },
262
+ responses: missionOkResponse,
263
+ });
264
+ // Quality gates
265
+ const addMissionQualityGateRoute = createRoute({
266
+ method: "post", path: "/{missionId}/quality-gates", tags: ["Missions"],
267
+ summary: "Add quality gate",
268
+ request: { params: z.object({ missionId: z.string() }), body: { content: { "application/json": { schema: AddMissionQualityGateSchema } } } },
269
+ responses: { ...missionOkResponse, 201: missionOkResponse[200] },
270
+ });
271
+ const updateMissionQualityGateRoute = createRoute({
272
+ method: "patch", path: "/{missionId}/quality-gates/{gateName}", tags: ["Missions"],
273
+ summary: "Update quality gate",
274
+ request: { params: z.object({ missionId: z.string(), gateName: z.string() }), body: { content: { "application/json": { schema: UpdateMissionQualityGateSchema } } } },
275
+ responses: missionOkResponse,
276
+ });
277
+ const removeMissionQualityGateRoute = createRoute({
278
+ method: "delete", path: "/{missionId}/quality-gates/{gateName}", tags: ["Missions"],
279
+ summary: "Remove quality gate",
280
+ request: { params: z.object({ missionId: z.string(), gateName: z.string() }) },
281
+ responses: missionOkResponse,
282
+ });
283
+ // Team members
284
+ const addMissionTeamMemberRoute = createRoute({
285
+ method: "post", path: "/{missionId}/team", tags: ["Missions"],
286
+ summary: "Add team member",
287
+ request: { params: z.object({ missionId: z.string() }), body: { content: { "application/json": { schema: AddMissionTeamMemberSchema } } } },
288
+ responses: { ...missionOkResponse, 201: missionOkResponse[200] },
289
+ });
290
+ const updateMissionTeamMemberRoute = createRoute({
291
+ method: "patch", path: "/{missionId}/team/{memberName}", tags: ["Missions"],
292
+ summary: "Update team member",
293
+ request: { params: z.object({ missionId: z.string(), memberName: z.string() }), body: { content: { "application/json": { schema: UpdateMissionTeamMemberSchema } } } },
294
+ responses: missionOkResponse,
295
+ });
296
+ const removeMissionTeamMemberRoute = createRoute({
297
+ method: "delete", path: "/{missionId}/team/{memberName}", tags: ["Missions"],
298
+ summary: "Remove team member",
299
+ request: { params: z.object({ missionId: z.string(), memberName: z.string() }) },
300
+ responses: missionOkResponse,
301
+ });
302
+ // Notifications
303
+ const updateMissionNotificationsRoute = createRoute({
304
+ method: "put", path: "/{missionId}/notifications", tags: ["Missions"],
305
+ summary: "Update mission notifications",
306
+ request: { params: z.object({ missionId: z.string() }), body: { content: { "application/json": { schema: UpdateMissionNotificationsSchema } } } },
307
+ responses: missionOkResponse,
308
+ });
309
+ // ── Route handlers ────────────────────────────────────────────────────
310
+ /**
311
+ * Mission CRUD + execute/resume/abort routes.
312
+ */
313
+ export function missionRoutes(getDeps) {
314
+ const app = new OpenAPIHono();
315
+ // GET /missions — list all missions
316
+ app.openapi(listMissionsRoute, async (c) => {
317
+ const deps = getDeps();
318
+ return c.json({ ok: true, data: await deps.getAllMissions() });
319
+ });
320
+ // GET /missions/resumable — list resumable missions
321
+ app.openapi(listResumableMissionsRoute, async (c) => {
322
+ const deps = getDeps();
323
+ return c.json({ ok: true, data: await deps.getResumableMissions() });
324
+ });
325
+ // GET /missions/:missionId — get mission by ID
326
+ app.openapi(getMissionRoute, async (c) => {
327
+ const deps = getDeps();
328
+ const { missionId } = c.req.valid("param");
329
+ const mission = await deps.getMission(missionId);
330
+ if (!mission) {
331
+ return c.json({ ok: false, error: "Mission not found", code: "NOT_FOUND" }, 404);
332
+ }
333
+ return c.json({ ok: true, data: mission }, 200);
334
+ });
335
+ // POST /missions — save mission
336
+ app.openapi(createMissionRoute, async (c) => {
337
+ const deps = getDeps();
338
+ const body = c.req.valid("json");
339
+ const mission = await deps.saveMission({
340
+ data: body.data,
341
+ prompt: body.prompt,
342
+ name: body.name,
343
+ status: body.status,
344
+ notifications: body.notifications,
345
+ });
346
+ return c.json({ ok: true, data: mission }, 201);
347
+ });
348
+ // PATCH /missions/:missionId — update mission
349
+ app.openapi(updateMissionRoute, async (c) => {
350
+ const deps = getDeps();
351
+ const { missionId } = c.req.valid("param");
352
+ const { endDate, ...rest } = c.req.valid("json");
353
+ // Convert null endDate (clear) to undefined for the Mission interface
354
+ const updates = {
355
+ ...rest,
356
+ ...(endDate !== undefined ? { endDate: endDate ?? undefined } : {}),
357
+ };
358
+ const mission = await deps.updateMission(missionId, updates);
359
+ return c.json({ ok: true, data: mission });
360
+ });
361
+ // DELETE /missions/:missionId — delete mission
362
+ app.openapi(deleteMissionRoute, async (c) => {
363
+ const deps = getDeps();
364
+ const { missionId } = c.req.valid("param");
365
+ const deleted = await deps.deleteMission(missionId);
366
+ if (!deleted) {
367
+ return c.json({ ok: false, error: "Mission not found", code: "NOT_FOUND" }, 404);
368
+ }
369
+ return c.json({ ok: true, data: { deleted: true } }, 200);
370
+ });
371
+ // POST /missions/:missionId/execute — execute mission
372
+ app.openapi(executeMissionRoute, async (c) => {
373
+ const deps = getDeps();
374
+ const { missionId } = c.req.valid("param");
375
+ const result = await deps.executeMission(missionId);
376
+ return c.json({ ok: true, data: result });
377
+ });
378
+ // POST /missions/:missionId/resume — resume mission
379
+ app.openapi(resumeMissionRoute, async (c) => {
380
+ const deps = getDeps();
381
+ const { missionId } = c.req.valid("param");
382
+ const body = c.req.valid("json");
383
+ const result = await deps.resumeMission(missionId, body);
384
+ return c.json({ ok: true, data: result });
385
+ });
386
+ // GET /missions/checkpoints — list all active checkpoints
387
+ app.openapi(listCheckpointsRoute, (c) => {
388
+ const deps = getDeps();
389
+ return c.json({ ok: true, data: deps.getActiveCheckpoints() });
390
+ });
391
+ // POST /missions/:missionId/checkpoints/:checkpointName/resume — resume a checkpoint
392
+ app.openapi(resumeCheckpointRoute, async (c) => {
393
+ const deps = getDeps();
394
+ const { missionId, checkpointName } = c.req.valid("param");
395
+ const resumed = await deps.resumeCheckpointByMissionId(missionId, checkpointName);
396
+ if (!resumed) {
397
+ return c.json({ ok: false, error: "Checkpoint not found or not active", code: "NOT_FOUND" }, 404);
398
+ }
399
+ return c.json({ ok: true, data: { resumed: true } }, 200);
400
+ });
401
+ // POST /missions/:missionId/abort — abort mission group
402
+ app.openapi(abortMissionRoute, async (c) => {
403
+ const deps = getDeps();
404
+ const { missionId } = c.req.valid("param");
405
+ const mission = await deps.getMission(missionId);
406
+ if (!mission) {
407
+ return c.json({ ok: false, error: "Mission not found", code: "NOT_FOUND" }, 404);
408
+ }
409
+ const count = await deps.abortGroup(mission.name);
410
+ return c.json({ ok: true, data: { aborted: count } }, 200);
411
+ });
412
+ // ── Atomic mission data handlers ──────────────────────────────────
413
+ // POST /missions/:missionId/tasks — add task
414
+ app.openapi(addMissionTaskRoute, async (c) => {
415
+ const deps = getDeps();
416
+ const { missionId } = c.req.valid("param");
417
+ const body = c.req.valid("json");
418
+ try {
419
+ const mission = await deps.addMissionTask(missionId, body);
420
+ return c.json({ ok: true, data: mission }, 201);
421
+ }
422
+ catch (e) {
423
+ return c.json({ ok: false, error: e.message, code: "BAD_REQUEST" }, 404);
424
+ }
425
+ });
426
+ // PATCH /missions/:missionId/tasks/:taskTitle — update task
427
+ app.openapi(updateMissionTaskRoute, async (c) => {
428
+ const deps = getDeps();
429
+ const { missionId, taskTitle } = c.req.valid("param");
430
+ const body = c.req.valid("json");
431
+ try {
432
+ const mission = await deps.updateMissionTask(missionId, decodeURIComponent(taskTitle), body);
433
+ return c.json({ ok: true, data: mission }, 200);
434
+ }
435
+ catch (e) {
436
+ return c.json({ ok: false, error: e.message, code: "NOT_FOUND" }, 404);
437
+ }
438
+ });
439
+ // DELETE /missions/:missionId/tasks/:taskTitle — remove task
440
+ app.openapi(removeMissionTaskRoute, async (c) => {
441
+ const deps = getDeps();
442
+ const { missionId, taskTitle } = c.req.valid("param");
443
+ try {
444
+ const mission = await deps.removeMissionTask(missionId, decodeURIComponent(taskTitle));
445
+ return c.json({ ok: true, data: mission }, 200);
446
+ }
447
+ catch (e) {
448
+ return c.json({ ok: false, error: e.message, code: "NOT_FOUND" }, 404);
449
+ }
450
+ });
451
+ // PUT /missions/:missionId/tasks/reorder — reorder tasks
452
+ app.openapi(reorderMissionTasksRoute, async (c) => {
453
+ const deps = getDeps();
454
+ const { missionId } = c.req.valid("param");
455
+ const { titles } = c.req.valid("json");
456
+ try {
457
+ const mission = await deps.reorderMissionTasks(missionId, titles);
458
+ return c.json({ ok: true, data: mission }, 200);
459
+ }
460
+ catch (e) {
461
+ return c.json({ ok: false, error: e.message, code: "BAD_REQUEST" }, 404);
462
+ }
463
+ });
464
+ // POST /missions/:missionId/checkpoints — add checkpoint (data-level)
465
+ app.openapi(addMissionCheckpointRoute, async (c) => {
466
+ const deps = getDeps();
467
+ const { missionId } = c.req.valid("param");
468
+ const body = c.req.valid("json");
469
+ try {
470
+ const mission = await deps.addMissionCheckpoint(missionId, body);
471
+ return c.json({ ok: true, data: mission }, 201);
472
+ }
473
+ catch (e) {
474
+ return c.json({ ok: false, error: e.message, code: "BAD_REQUEST" }, 404);
475
+ }
476
+ });
477
+ // PATCH /missions/:missionId/checkpoints/:checkpointName — update checkpoint (data-level)
478
+ app.openapi(updateMissionCheckpointRoute, async (c) => {
479
+ const deps = getDeps();
480
+ const { missionId, checkpointName } = c.req.valid("param");
481
+ const body = c.req.valid("json");
482
+ try {
483
+ const mission = await deps.updateMissionCheckpoint(missionId, decodeURIComponent(checkpointName), body);
484
+ return c.json({ ok: true, data: mission }, 200);
485
+ }
486
+ catch (e) {
487
+ return c.json({ ok: false, error: e.message, code: "NOT_FOUND" }, 404);
488
+ }
489
+ });
490
+ // DELETE /missions/:missionId/checkpoints/:checkpointName — remove checkpoint (data-level)
491
+ app.openapi(removeMissionCheckpointRoute2, async (c) => {
492
+ const deps = getDeps();
493
+ const { missionId, checkpointName } = c.req.valid("param");
494
+ try {
495
+ const mission = await deps.removeMissionCheckpoint(missionId, decodeURIComponent(checkpointName));
496
+ return c.json({ ok: true, data: mission }, 200);
497
+ }
498
+ catch (e) {
499
+ return c.json({ ok: false, error: e.message, code: "NOT_FOUND" }, 404);
500
+ }
501
+ });
502
+ // GET /missions/delays — list active delays
503
+ app.openapi(listDelaysRoute, (c) => {
504
+ const deps = getDeps();
505
+ return c.json({ ok: true, data: deps.getActiveDelays() });
506
+ });
507
+ // POST /missions/:missionId/delays — add delay (data-level)
508
+ app.openapi(addMissionDelayRoute, async (c) => {
509
+ const deps = getDeps();
510
+ const { missionId } = c.req.valid("param");
511
+ const body = c.req.valid("json");
512
+ try {
513
+ const mission = await deps.addMissionDelay(missionId, body);
514
+ return c.json({ ok: true, data: mission }, 201);
515
+ }
516
+ catch (e) {
517
+ return c.json({ ok: false, error: e.message, code: "BAD_REQUEST" }, 404);
518
+ }
519
+ });
520
+ // PATCH /missions/:missionId/delays/:delayName — update delay (data-level)
521
+ app.openapi(updateMissionDelayRoute, async (c) => {
522
+ const deps = getDeps();
523
+ const { missionId, delayName } = c.req.valid("param");
524
+ const body = c.req.valid("json");
525
+ try {
526
+ const mission = await deps.updateMissionDelay(missionId, decodeURIComponent(delayName), body);
527
+ return c.json({ ok: true, data: mission }, 200);
528
+ }
529
+ catch (e) {
530
+ return c.json({ ok: false, error: e.message, code: "NOT_FOUND" }, 404);
531
+ }
532
+ });
533
+ // DELETE /missions/:missionId/delays/:delayName — remove delay (data-level)
534
+ app.openapi(removeMissionDelayRoute, async (c) => {
535
+ const deps = getDeps();
536
+ const { missionId, delayName } = c.req.valid("param");
537
+ try {
538
+ const mission = await deps.removeMissionDelay(missionId, decodeURIComponent(delayName));
539
+ return c.json({ ok: true, data: mission }, 200);
540
+ }
541
+ catch (e) {
542
+ return c.json({ ok: false, error: e.message, code: "NOT_FOUND" }, 404);
543
+ }
544
+ });
545
+ // POST /missions/:missionId/quality-gates — add quality gate
546
+ app.openapi(addMissionQualityGateRoute, async (c) => {
547
+ const deps = getDeps();
548
+ const { missionId } = c.req.valid("param");
549
+ const body = c.req.valid("json");
550
+ try {
551
+ const mission = await deps.addMissionQualityGate(missionId, body);
552
+ return c.json({ ok: true, data: mission }, 201);
553
+ }
554
+ catch (e) {
555
+ return c.json({ ok: false, error: e.message, code: "BAD_REQUEST" }, 404);
556
+ }
557
+ });
558
+ // PATCH /missions/:missionId/quality-gates/:gateName — update quality gate
559
+ app.openapi(updateMissionQualityGateRoute, async (c) => {
560
+ const deps = getDeps();
561
+ const { missionId, gateName } = c.req.valid("param");
562
+ const body = c.req.valid("json");
563
+ try {
564
+ const mission = await deps.updateMissionQualityGate(missionId, decodeURIComponent(gateName), body);
565
+ return c.json({ ok: true, data: mission }, 200);
566
+ }
567
+ catch (e) {
568
+ return c.json({ ok: false, error: e.message, code: "NOT_FOUND" }, 404);
569
+ }
570
+ });
571
+ // DELETE /missions/:missionId/quality-gates/:gateName — remove quality gate
572
+ app.openapi(removeMissionQualityGateRoute, async (c) => {
573
+ const deps = getDeps();
574
+ const { missionId, gateName } = c.req.valid("param");
575
+ try {
576
+ const mission = await deps.removeMissionQualityGate(missionId, decodeURIComponent(gateName));
577
+ return c.json({ ok: true, data: mission }, 200);
578
+ }
579
+ catch (e) {
580
+ return c.json({ ok: false, error: e.message, code: "NOT_FOUND" }, 404);
581
+ }
582
+ });
583
+ // POST /missions/:missionId/team — add team member
584
+ app.openapi(addMissionTeamMemberRoute, async (c) => {
585
+ const deps = getDeps();
586
+ const { missionId } = c.req.valid("param");
587
+ const body = c.req.valid("json");
588
+ try {
589
+ const mission = await deps.addMissionTeamMember(missionId, body);
590
+ return c.json({ ok: true, data: mission }, 201);
591
+ }
592
+ catch (e) {
593
+ return c.json({ ok: false, error: e.message, code: "BAD_REQUEST" }, 404);
594
+ }
595
+ });
596
+ // PATCH /missions/:missionId/team/:memberName — update team member
597
+ app.openapi(updateMissionTeamMemberRoute, async (c) => {
598
+ const deps = getDeps();
599
+ const { missionId, memberName } = c.req.valid("param");
600
+ const body = c.req.valid("json");
601
+ try {
602
+ const mission = await deps.updateMissionTeamMember(missionId, decodeURIComponent(memberName), body);
603
+ return c.json({ ok: true, data: mission }, 200);
604
+ }
605
+ catch (e) {
606
+ return c.json({ ok: false, error: e.message, code: "NOT_FOUND" }, 404);
607
+ }
608
+ });
609
+ // DELETE /missions/:missionId/team/:memberName — remove team member
610
+ app.openapi(removeMissionTeamMemberRoute, async (c) => {
611
+ const deps = getDeps();
612
+ const { missionId, memberName } = c.req.valid("param");
613
+ try {
614
+ const mission = await deps.removeMissionTeamMember(missionId, decodeURIComponent(memberName));
615
+ return c.json({ ok: true, data: mission }, 200);
616
+ }
617
+ catch (e) {
618
+ return c.json({ ok: false, error: e.message, code: "NOT_FOUND" }, 404);
619
+ }
620
+ });
621
+ // PUT /missions/:missionId/notifications — update notifications
622
+ app.openapi(updateMissionNotificationsRoute, async (c) => {
623
+ const deps = getDeps();
624
+ const { missionId } = c.req.valid("param");
625
+ const { notifications } = c.req.valid("json");
626
+ try {
627
+ const mission = await deps.updateMissionNotifications(missionId, notifications);
628
+ return c.json({ ok: true, data: mission }, 200);
629
+ }
630
+ catch (e) {
631
+ return c.json({ ok: false, error: e.message, code: "NOT_FOUND" }, 404);
632
+ }
633
+ });
634
+ return app;
635
+ }
636
+ //# sourceMappingURL=missions.js.map