@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.
- package/dist/deps.d.ts +164 -0
- package/dist/deps.d.ts.map +1 -0
- package/dist/deps.js +9 -0
- package/dist/deps.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +12 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/playbook-utils.d.ts +36 -0
- package/dist/playbook-utils.d.ts.map +1 -0
- package/dist/playbook-utils.js +80 -0
- package/dist/playbook-utils.js.map +1 -0
- package/dist/routes/approvals.d.ts +17 -0
- package/dist/routes/approvals.d.ts.map +1 -0
- package/dist/routes/approvals.js +201 -0
- package/dist/routes/approvals.js.map +1 -0
- package/dist/routes/chat.d.ts +9 -0
- package/dist/routes/chat.d.ts.map +1 -0
- package/dist/routes/chat.js +170 -0
- package/dist/routes/chat.js.map +1 -0
- package/dist/routes/health.d.ts +7 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +44 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/missions.d.ts +36 -0
- package/dist/routes/missions.d.ts.map +1 -0
- package/dist/routes/missions.js +636 -0
- package/dist/routes/missions.js.map +1 -0
- package/dist/routes/notifications.d.ts +8 -0
- package/dist/routes/notifications.d.ts.map +1 -0
- package/dist/routes/notifications.js +240 -0
- package/dist/routes/notifications.js.map +1 -0
- package/dist/routes/peers.d.ts +16 -0
- package/dist/routes/peers.d.ts.map +1 -0
- package/dist/routes/peers.js +183 -0
- package/dist/routes/peers.js.map +1 -0
- package/dist/routes/playbooks.d.ts +12 -0
- package/dist/routes/playbooks.d.ts.map +1 -0
- package/dist/routes/playbooks.js +223 -0
- package/dist/routes/playbooks.js.map +1 -0
- package/dist/routes/schedules.d.ts +7 -0
- package/dist/routes/schedules.d.ts.map +1 -0
- package/dist/routes/schedules.js +193 -0
- package/dist/routes/schedules.js.map +1 -0
- package/dist/routes/state.d.ts +16 -0
- package/dist/routes/state.d.ts.map +1 -0
- package/dist/routes/state.js +196 -0
- package/dist/routes/state.js.map +1 -0
- package/dist/routes/tasks.d.ts +17 -0
- package/dist/routes/tasks.d.ts.map +1 -0
- package/dist/routes/tasks.js +379 -0
- package/dist/routes/tasks.js.map +1 -0
- package/dist/routes/vault.d.ts +14 -0
- package/dist/routes/vault.d.ts.map +1 -0
- package/dist/routes/vault.js +237 -0
- package/dist/routes/vault.js.map +1 -0
- package/dist/routes/watchers.d.ts +6 -0
- package/dist/routes/watchers.d.ts.map +1 -0
- package/dist/routes/watchers.js +119 -0
- package/dist/routes/watchers.js.map +1 -0
- package/dist/schemas.d.ts +406 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +314 -0
- package/dist/schemas.js.map +1 -0
- package/dist/security.d.ts +33 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +66 -0
- package/dist/security.js.map +1 -0
- 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
|