@creezio/tasks 0.22.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.
Files changed (106) hide show
  1. package/README.md +279 -0
  2. package/dist/.creezio-src-hash.json +4 -0
  3. package/dist/ai-task-agent.d.ts +47 -0
  4. package/dist/ai-task-agent.d.ts.map +1 -0
  5. package/dist/ai-task-agent.js +558 -0
  6. package/dist/ai-task-agent.js.map +1 -0
  7. package/dist/ai-task-runner.d.ts +78 -0
  8. package/dist/ai-task-runner.d.ts.map +1 -0
  9. package/dist/ai-task-runner.js +645 -0
  10. package/dist/ai-task-runner.js.map +1 -0
  11. package/dist/api-mount.d.ts +4 -0
  12. package/dist/api-mount.d.ts.map +1 -0
  13. package/dist/api-mount.js +91 -0
  14. package/dist/api-mount.js.map +1 -0
  15. package/dist/assistant-adapter.d.ts +7 -0
  16. package/dist/assistant-adapter.d.ts.map +1 -0
  17. package/dist/assistant-adapter.js +96 -0
  18. package/dist/assistant-adapter.js.map +1 -0
  19. package/dist/brand/config.d.ts +165 -0
  20. package/dist/brand/config.d.ts.map +1 -0
  21. package/dist/brand/config.js +39 -0
  22. package/dist/brand/config.js.map +1 -0
  23. package/dist/env-bridge.d.ts +12 -0
  24. package/dist/env-bridge.d.ts.map +1 -0
  25. package/dist/env-bridge.js +33 -0
  26. package/dist/env-bridge.js.map +1 -0
  27. package/dist/hono-routes.d.ts +8 -0
  28. package/dist/hono-routes.d.ts.map +1 -0
  29. package/dist/hono-routes.js +563 -0
  30. package/dist/hono-routes.js.map +1 -0
  31. package/dist/index.d.ts +29 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +21 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/kanban-service.d.ts +136 -0
  36. package/dist/kanban-service.d.ts.map +1 -0
  37. package/dist/kanban-service.js +580 -0
  38. package/dist/kanban-service.js.map +1 -0
  39. package/dist/mcp-host-tools.d.ts +59 -0
  40. package/dist/mcp-host-tools.d.ts.map +1 -0
  41. package/dist/mcp-host-tools.js +326 -0
  42. package/dist/mcp-host-tools.js.map +1 -0
  43. package/dist/mcp-workspace-tools.d.ts +15 -0
  44. package/dist/mcp-workspace-tools.d.ts.map +1 -0
  45. package/dist/mcp-workspace-tools.js +338 -0
  46. package/dist/mcp-workspace-tools.js.map +1 -0
  47. package/dist/memory-store.d.ts +3 -0
  48. package/dist/memory-store.d.ts.map +1 -0
  49. package/dist/memory-store.js +75 -0
  50. package/dist/memory-store.js.map +1 -0
  51. package/dist/sqlite-driver.d.ts +13 -0
  52. package/dist/sqlite-driver.d.ts.map +1 -0
  53. package/dist/sqlite-driver.js +13 -0
  54. package/dist/sqlite-driver.js.map +1 -0
  55. package/dist/sqlite-store.d.ts +15 -0
  56. package/dist/sqlite-store.d.ts.map +1 -0
  57. package/dist/sqlite-store.js +113 -0
  58. package/dist/sqlite-store.js.map +1 -0
  59. package/dist/task-runs.d.ts +108 -0
  60. package/dist/task-runs.d.ts.map +1 -0
  61. package/dist/task-runs.js +427 -0
  62. package/dist/task-runs.js.map +1 -0
  63. package/dist/types.d.ts +35 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +15 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist-cjs/ai-task-agent.js +569 -0
  68. package/dist-cjs/ai-task-agent.js.map +1 -0
  69. package/dist-cjs/ai-task-runner.js +660 -0
  70. package/dist-cjs/ai-task-runner.js.map +1 -0
  71. package/dist-cjs/api-mount.js +94 -0
  72. package/dist-cjs/api-mount.js.map +1 -0
  73. package/dist-cjs/assistant-adapter.js +99 -0
  74. package/dist-cjs/assistant-adapter.js.map +1 -0
  75. package/dist-cjs/brand/config.js +47 -0
  76. package/dist-cjs/brand/config.js.map +1 -0
  77. package/dist-cjs/env-bridge.js +36 -0
  78. package/dist-cjs/env-bridge.js.map +1 -0
  79. package/dist-cjs/hono-routes.js +566 -0
  80. package/dist-cjs/hono-routes.js.map +1 -0
  81. package/dist-cjs/index.js +117 -0
  82. package/dist-cjs/index.js.map +1 -0
  83. package/dist-cjs/kanban-service.js +601 -0
  84. package/dist-cjs/kanban-service.js.map +1 -0
  85. package/dist-cjs/mcp-host-tools.js +333 -0
  86. package/dist-cjs/mcp-host-tools.js.map +1 -0
  87. package/dist-cjs/mcp-workspace-tools.js +342 -0
  88. package/dist-cjs/mcp-workspace-tools.js.map +1 -0
  89. package/dist-cjs/memory-store.js +81 -0
  90. package/dist-cjs/memory-store.js.map +1 -0
  91. package/dist-cjs/package.json +3 -0
  92. package/dist-cjs/sqlite-driver.js +16 -0
  93. package/dist-cjs/sqlite-driver.js.map +1 -0
  94. package/dist-cjs/sqlite-store.js +119 -0
  95. package/dist-cjs/sqlite-store.js.map +1 -0
  96. package/dist-cjs/task-runs.js +457 -0
  97. package/dist-cjs/task-runs.js.map +1 -0
  98. package/dist-cjs/types.js +18 -0
  99. package/dist-cjs/types.js.map +1 -0
  100. package/package.json +79 -0
  101. package/scripts/port-from-tempoflow.mjs +405 -0
  102. package/ui/ai-activity-panel.tsx +559 -0
  103. package/ui/index.ts +7 -0
  104. package/ui/task-detail-sheet.tsx +668 -0
  105. package/ui/tasks-kanban-client.tsx +647 -0
  106. package/ui/tasks-types.ts +120 -0
@@ -0,0 +1,563 @@
1
+ /**
2
+ * API Kanban unifié « Tâches » — exécutants human / ai / hermes,
3
+ * runs IA (poll + SSE) et synchronisation Hermes.
4
+ * Factory : les marques montent `createTasksHonoRoutes()` sous /api/v1/tasks.
5
+ */
6
+ import { Hono } from "hono";
7
+ import { z } from "zod";
8
+ import { hermesKanbanConfigured } from "@creezio/assistant";
9
+ import { requireTasksBrand } from "./brand/config.js";
10
+ import { ensureAiRunnerLoop, enqueueAiRunForTask, getAiActivityForUser, hostBridgeReady, processAiTaskQueue, retryFailedRun, } from "./ai-task-runner.js";
11
+ import { createTask, deleteTask, EXECUTOR_KINDS, getTask, getTaskDetail, KANBAN_COLUMNS, listTasks, syncHermesTasks, TASK_STATUSES, tasksByColumn, tasksReady, updateTask, } from "./kanban-service.js";
12
+ import { cancelTaskRun, getTaskRun, listAgentLogs, listTaskRunsForTask, maxConcurrentAiRuns, purgeAgentLogsOlderThan, resumeHitlRun, subscribeAgentLogs, subscribeTaskRuns, taskRunsReady, } from "./task-runs.js";
13
+ function queryOne(sql, params = []) {
14
+ return requireTasksBrand().db.queryOne(sql, params);
15
+ }
16
+ function getUserById(id) {
17
+ return requireTasksBrand().users.getById(id);
18
+ }
19
+ function listUsers() {
20
+ return requireTasksBrand().users.list();
21
+ }
22
+ function usersReady() {
23
+ return requireTasksBrand().users.ready();
24
+ }
25
+ function getSessionFromContext(c) {
26
+ return requireTasksBrand().auth.getSessionFromContext(c);
27
+ }
28
+ function sessionActorIsOwner(session) {
29
+ return requireTasksBrand().auth.sessionActorIsOwner(session);
30
+ }
31
+ function sessionIsImpersonating(session) {
32
+ return requireTasksBrand().auth.sessionIsImpersonating(session);
33
+ }
34
+ function screencastViewerCount(aiUserId) {
35
+ return requireTasksBrand().screencast.viewerCount(aiUserId);
36
+ }
37
+ function subscribeScreencast(aiUserId, listener) {
38
+ return requireTasksBrand().screencast.subscribe(aiUserId, listener);
39
+ }
40
+ function startScreencastOnHost(aiUserId) {
41
+ return requireTasksBrand().workspace.startScreencast(aiUserId);
42
+ }
43
+ function stopScreencastOnHost(aiUserId) {
44
+ return requireTasksBrand().workspace.stopScreencast(aiUserId);
45
+ }
46
+ export function createTasksHonoRoutes() {
47
+ const tasksRoutes = new Hono();
48
+ async function getTaskActor(c) {
49
+ const session = await getSessionFromContext(c);
50
+ if (session) {
51
+ return { userId: session.sub, role: session.role, via: "session" };
52
+ }
53
+ const key = c.get("apiKey");
54
+ if (key?.user_id) {
55
+ const u = getUserById(key.user_id);
56
+ if (u)
57
+ return { userId: u.id, role: u.role, via: "api_key" };
58
+ }
59
+ return null;
60
+ }
61
+ tasksRoutes.use("*", async (_c, next) => {
62
+ ensureAiRunnerLoop();
63
+ await next();
64
+ });
65
+ function sseResponse(c, setup) {
66
+ const encoder = new TextEncoder();
67
+ let cleanup = null;
68
+ let heartbeat = null;
69
+ const stream = new ReadableStream({
70
+ start(controller) {
71
+ const send = (event, data) => {
72
+ try {
73
+ controller.enqueue(encoder.encode(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`));
74
+ }
75
+ catch {
76
+ /* fermé */
77
+ }
78
+ };
79
+ send("ready", { ok: true, ts: Date.now() });
80
+ cleanup = setup(send);
81
+ heartbeat = setInterval(() => send("ping", { ts: Date.now() }), 20_000);
82
+ c.req.raw.signal.addEventListener("abort", () => {
83
+ if (heartbeat)
84
+ clearInterval(heartbeat);
85
+ cleanup?.();
86
+ try {
87
+ controller.close();
88
+ }
89
+ catch {
90
+ /* ignore */
91
+ }
92
+ });
93
+ },
94
+ cancel() {
95
+ if (heartbeat)
96
+ clearInterval(heartbeat);
97
+ cleanup?.();
98
+ },
99
+ });
100
+ return new Response(stream, {
101
+ headers: {
102
+ "Content-Type": "text/event-stream",
103
+ "Cache-Control": "no-cache, no-transform",
104
+ Connection: "keep-alive",
105
+ },
106
+ });
107
+ }
108
+ tasksRoutes.get("/meta", async (c) => {
109
+ const session = await getSessionFromContext(c);
110
+ if (!session)
111
+ return c.json({ error: "Non authentifié" }, 401);
112
+ const assignable = usersReady()
113
+ ? listUsers().filter((u) => u.role === "collaborator" && u.active)
114
+ : [];
115
+ return c.json({
116
+ ready: tasksReady() && taskRunsReady(),
117
+ columns: KANBAN_COLUMNS,
118
+ executors: EXECUTOR_KINDS,
119
+ host_bridge_ready: hostBridgeReady(),
120
+ hermes_configured: hermesKanbanConfigured(),
121
+ max_concurrent: maxConcurrentAiRuns(),
122
+ assignable_users: assignable.map((u) => ({
123
+ id: u.id,
124
+ username: u.username,
125
+ kind: u.kind,
126
+ })),
127
+ });
128
+ });
129
+ tasksRoutes.get("/", async (c) => {
130
+ const session = await getSessionFromContext(c);
131
+ if (!session)
132
+ return c.json({ error: "Non authentifié" }, 401);
133
+ if (!tasksReady()) {
134
+ return c.json({ error: "schéma tasks plateforme requis", tasks: [], columns: {} }, 503);
135
+ }
136
+ // Rafraîchit les tâches Hermes à chaque board (comme l'ancien /todos),
137
+ // sauf sync=0 explicite.
138
+ let syncMeta = null;
139
+ if (c.req.query("sync") !== "0" && hermesKanbanConfigured()) {
140
+ syncMeta = await syncHermesTasks();
141
+ }
142
+ const tasks = listTasks({
143
+ status: c.req.query("status") || undefined,
144
+ assigneeUserId: c.req.query("assignee") || undefined,
145
+ executor: c.req.query("executor") || undefined,
146
+ });
147
+ return c.json({
148
+ tasks,
149
+ columns: tasksByColumn(tasks),
150
+ host_bridge_ready: hostBridgeReady(),
151
+ hermes_configured: hermesKanbanConfigured(),
152
+ max_concurrent: maxConcurrentAiRuns(),
153
+ sync: syncMeta,
154
+ });
155
+ });
156
+ tasksRoutes.post("/sync", async (c) => {
157
+ const session = await getSessionFromContext(c);
158
+ if (!session)
159
+ return c.json({ error: "Non authentifié" }, 401);
160
+ if (!tasksReady())
161
+ return c.json({ error: "schéma tasks plateforme requis" }, 503);
162
+ const sync = await syncHermesTasks();
163
+ const tasks = listTasks();
164
+ return c.json({ ok: true, sync, tasks, columns: tasksByColumn(tasks) });
165
+ });
166
+ tasksRoutes.get("/runs/:runId/stream", async (c) => {
167
+ const session = await getSessionFromContext(c);
168
+ if (!session)
169
+ return c.json({ error: "Non authentifié" }, 401);
170
+ const runId = c.req.param("runId");
171
+ const run = getTaskRun(runId);
172
+ if (!run)
173
+ return c.json({ error: "Run introuvable" }, 404);
174
+ return sseResponse(c, (send) => {
175
+ send("run", { run: getTaskRun(runId) });
176
+ const after = Number(c.req.query("after") || "0") || 0;
177
+ for (const log of listAgentLogs(runId, after)) {
178
+ send("log", { log, run: getTaskRun(runId) });
179
+ }
180
+ const offLog = subscribeAgentLogs(runId, (ev) => {
181
+ send("log", { log: ev.log, run: ev.run });
182
+ });
183
+ const offRun = subscribeTaskRuns(runId, (r) => {
184
+ send("run", { run: r });
185
+ });
186
+ return () => {
187
+ offLog();
188
+ offRun();
189
+ };
190
+ });
191
+ });
192
+ tasksRoutes.get("/runs/:runId/logs", async (c) => {
193
+ const actor = await getTaskActor(c);
194
+ if (!actor)
195
+ return c.json({ error: "Non authentifié" }, 401);
196
+ const run = getTaskRun(c.req.param("runId"));
197
+ if (!run)
198
+ return c.json({ error: "Run introuvable" }, 404);
199
+ const after = Number(c.req.query("after") || "0") || 0;
200
+ const logs = listAgentLogs(run.id, after);
201
+ return c.json({ run, logs, host_bridge_ready: hostBridgeReady() });
202
+ });
203
+ tasksRoutes.get("/runs/:runId", async (c) => {
204
+ const actor = await getTaskActor(c);
205
+ if (!actor)
206
+ return c.json({ error: "Non authentifié" }, 401);
207
+ const run = getTaskRun(c.req.param("runId"));
208
+ if (!run)
209
+ return c.json({ error: "Run introuvable" }, 404);
210
+ return c.json({ task: getTask(run.task_id), run });
211
+ });
212
+ tasksRoutes.post("/runs/:runId/retry", async (c) => {
213
+ const session = await getSessionFromContext(c);
214
+ if (!session)
215
+ return c.json({ error: "Non authentifié" }, 401);
216
+ let run;
217
+ try {
218
+ run = retryFailedRun(c.req.param("runId"));
219
+ }
220
+ catch (e) {
221
+ const msg = e instanceof Error ? e.message : String(e);
222
+ if (msg.startsWith("quota_exceeded")) {
223
+ return c.json({ error: msg, code: "quota_exceeded" }, 429);
224
+ }
225
+ return c.json({ error: msg }, 400);
226
+ }
227
+ if (!run) {
228
+ return c.json({ error: "Retry impossible (run non failed/cancelled ou tâche absente)" }, 400);
229
+ }
230
+ void processAiTaskQueue();
231
+ return c.json({
232
+ ok: true,
233
+ run,
234
+ task: getTask(run.task_id),
235
+ host_bridge_ready: hostBridgeReady(),
236
+ });
237
+ });
238
+ tasksRoutes.post("/runs/:runId/resume", async (c) => {
239
+ const actor = await getTaskActor(c);
240
+ if (!actor)
241
+ return c.json({ error: "Non authentifié" }, 401);
242
+ const body = await c.req.json().catch(() => ({}));
243
+ const response = typeof body.response === "string"
244
+ ? body.response
245
+ : "ok";
246
+ const run = resumeHitlRun(c.req.param("runId"), response);
247
+ if (!run) {
248
+ return c.json({ error: "Aucune pause HITL active sur ce run" }, 400);
249
+ }
250
+ return c.json({ ok: true, run });
251
+ });
252
+ tasksRoutes.post("/runs/:runId/cancel", async (c) => {
253
+ const session = await getSessionFromContext(c);
254
+ if (!session)
255
+ return c.json({ error: "Non authentifié" }, 401);
256
+ const run = cancelTaskRun(c.req.param("runId"));
257
+ if (!run)
258
+ return c.json({ error: "Run introuvable" }, 404);
259
+ return c.json({ ok: true, run });
260
+ });
261
+ tasksRoutes.get("/activity/:userId/stream", async (c) => {
262
+ const session = await getSessionFromContext(c);
263
+ if (!session)
264
+ return c.json({ error: "Non authentifié" }, 401);
265
+ const userId = c.req.param("userId");
266
+ return sseResponse(c, (send) => {
267
+ const { run, task } = getAiActivityForUser(userId);
268
+ let currentRunId = run?.id || null;
269
+ if (!run) {
270
+ const last = queryOne(`SELECT id FROM task_runs WHERE assignee_user_id = ?
271
+ ORDER BY created_at DESC LIMIT 1`, [userId]);
272
+ if (last) {
273
+ const lastRun = getTaskRun(last.id);
274
+ currentRunId = lastRun?.id || null;
275
+ send("snapshot", {
276
+ run: lastRun,
277
+ task: lastRun ? getTask(lastRun.task_id) : null,
278
+ logs: lastRun ? listAgentLogs(lastRun.id, 0) : [],
279
+ });
280
+ }
281
+ else {
282
+ send("snapshot", { run: null, task: null, logs: [] });
283
+ }
284
+ }
285
+ else {
286
+ send("snapshot", {
287
+ run,
288
+ task,
289
+ logs: listAgentLogs(run.id, 0),
290
+ });
291
+ }
292
+ const offLog = subscribeAgentLogs(userId, (ev) => {
293
+ currentRunId = ev.run.id;
294
+ send("log", { log: ev.log, run: ev.run });
295
+ });
296
+ const offRun = subscribeTaskRuns(userId, (r) => {
297
+ currentRunId = r.id;
298
+ send("run", { run: r, task: getTask(r.task_id) });
299
+ });
300
+ return () => {
301
+ offLog();
302
+ offRun();
303
+ void currentRunId;
304
+ };
305
+ });
306
+ });
307
+ /**
308
+ * Vue live (lecture seule) d'un espace IA : frames JPEG en SSE.
309
+ * Le screencast desktop est démarré au 1er spectateur et arrêté au dernier
310
+ * (l'app desktop a en plus son auto-stop si les frames ne servent à personne).
311
+ */
312
+ tasksRoutes.get("/screencast/:aiUserId/stream", async (c) => {
313
+ const session = await getSessionFromContext(c);
314
+ if (!session)
315
+ return c.json({ error: "Non authentifié" }, 401);
316
+ const aiUserId = c.req.param("aiUserId");
317
+ const ai = getUserById(aiUserId);
318
+ if (!ai || ai.kind !== "ai") {
319
+ return c.json({ error: "Collaborateur IA introuvable" }, 404);
320
+ }
321
+ return sseResponse(c, (send) => {
322
+ const firstViewer = screencastViewerCount(aiUserId) === 0;
323
+ const off = subscribeScreencast(aiUserId, (frame) => {
324
+ send("frame", { seq: frame.seq, ts: frame.ts, data: frame.data });
325
+ });
326
+ if (firstViewer) {
327
+ void startScreencastOnHost(aiUserId).then((r) => {
328
+ if (r && r.ok !== true) {
329
+ send("status", {
330
+ ok: false,
331
+ error: r.error || "Screencast indisponible",
332
+ code: r.code || null,
333
+ });
334
+ }
335
+ else {
336
+ send("status", { ok: true });
337
+ }
338
+ });
339
+ }
340
+ else {
341
+ send("status", { ok: true });
342
+ }
343
+ return () => {
344
+ off();
345
+ if (screencastViewerCount(aiUserId) === 0) {
346
+ void stopScreencastOnHost(aiUserId);
347
+ }
348
+ };
349
+ });
350
+ });
351
+ tasksRoutes.get("/activity/:userId", async (c) => {
352
+ const session = await getSessionFromContext(c);
353
+ if (!session)
354
+ return c.json({ error: "Non authentifié" }, 401);
355
+ const { run, task } = getAiActivityForUser(c.req.param("userId"));
356
+ const after = Number(c.req.query("after") || "0") || 0;
357
+ const logs = run ? listAgentLogs(run.id, after) : [];
358
+ if (!run && taskRunsReady()) {
359
+ const last = queryOne(`SELECT id FROM task_runs WHERE assignee_user_id = ?
360
+ ORDER BY created_at DESC LIMIT 1`, [c.req.param("userId")]);
361
+ if (last) {
362
+ const lastRun = getTaskRun(last.id);
363
+ const lastLogs = lastRun ? listAgentLogs(lastRun.id, after) : [];
364
+ return c.json({
365
+ run: lastRun,
366
+ task: lastRun ? getTask(lastRun.task_id) : null,
367
+ logs: lastLogs,
368
+ host_bridge_ready: hostBridgeReady(),
369
+ });
370
+ }
371
+ }
372
+ return c.json({
373
+ run,
374
+ task,
375
+ logs,
376
+ host_bridge_ready: hostBridgeReady(),
377
+ });
378
+ });
379
+ tasksRoutes.post("/runner/tick", async (c) => {
380
+ const session = await getSessionFromContext(c);
381
+ if (!session)
382
+ return c.json({ error: "Non authentifié" }, 401);
383
+ const result = await processAiTaskQueue();
384
+ return c.json({
385
+ ok: true,
386
+ ...result,
387
+ host_bridge_ready: hostBridgeReady(),
388
+ max_concurrent: maxConcurrentAiRuns(),
389
+ });
390
+ });
391
+ tasksRoutes.post("/logs/purge", async (c) => {
392
+ const session = await getSessionFromContext(c);
393
+ if (!session)
394
+ return c.json({ error: "Non authentifié" }, 401);
395
+ if (sessionIsImpersonating(session)) {
396
+ return c.json({ error: "Revenez à votre compte pour cette action" }, 403);
397
+ }
398
+ if (!sessionActorIsOwner(session)) {
399
+ return c.json({ error: "Réservé au compte principal" }, 403);
400
+ }
401
+ const body = await c.req.json().catch(() => ({}));
402
+ const days = Number(body.days ?? 30) || 30;
403
+ const result = purgeAgentLogsOlderThan(days);
404
+ return c.json({ ok: true, days, ...result });
405
+ });
406
+ tasksRoutes.get("/:id", async (c) => {
407
+ const actor = await getTaskActor(c);
408
+ if (!actor)
409
+ return c.json({ error: "Non authentifié" }, 401);
410
+ const detail = await getTaskDetail(c.req.param("id"));
411
+ if (!detail)
412
+ return c.json({ error: "Tâche introuvable" }, 404);
413
+ const runs = taskRunsReady() ? listTaskRunsForTask(detail.task.id) : [];
414
+ const subtasks = listTasks({
415
+ parentTaskId: detail.task.id,
416
+ includeCancelled: true,
417
+ });
418
+ return c.json({ ...detail, runs, subtasks });
419
+ });
420
+ const createSchema = z.object({
421
+ title: z.string().min(1).max(300),
422
+ body: z.string().max(8000).optional(),
423
+ status: z.enum(TASK_STATUSES).optional(),
424
+ executor_kind: z.enum(EXECUTOR_KINDS).optional(),
425
+ assignee_user_id: z.string().min(1).nullable().optional(),
426
+ parent_task_id: z.string().min(1).nullable().optional(),
427
+ priority: z.number().int().optional(),
428
+ recurring_schedule: z.string().max(120).nullable().optional(),
429
+ dispatch: z.boolean().optional(),
430
+ launch: z.boolean().optional(),
431
+ });
432
+ tasksRoutes.post("/", async (c) => {
433
+ const actor = await getTaskActor(c);
434
+ if (!actor)
435
+ return c.json({ error: "Non authentifié" }, 401);
436
+ const body = await c.req.json().catch(() => ({}));
437
+ const parsed = createSchema.safeParse(body);
438
+ if (!parsed.success) {
439
+ return c.json({ error: "Payload invalide", details: parsed.error.issues }, 400);
440
+ }
441
+ try {
442
+ const { task, hermes, warning } = await createTask({
443
+ title: parsed.data.title,
444
+ body: parsed.data.body,
445
+ status: parsed.data.status,
446
+ executorKind: parsed.data.executor_kind,
447
+ assigneeUserId: parsed.data.assignee_user_id,
448
+ parentTaskId: parsed.data.parent_task_id,
449
+ createdBy: actor.userId,
450
+ priority: parsed.data.priority,
451
+ recurringSchedule: parsed.data.recurring_schedule,
452
+ dispatch: parsed.data.dispatch,
453
+ source: "ui",
454
+ });
455
+ let run = null;
456
+ const shouldLaunch = parsed.data.launch || parsed.data.status === "in_progress";
457
+ if (shouldLaunch && task.executor_kind === "ai") {
458
+ if (task.status === "backlog") {
459
+ await updateTask(task.id, { status: "in_progress" });
460
+ }
461
+ run = enqueueAiRunForTask(task.id);
462
+ void processAiTaskQueue();
463
+ }
464
+ return c.json({
465
+ ok: true,
466
+ task: getTask(task.id),
467
+ run,
468
+ hermes_task_id: hermes?.id || null,
469
+ warning: warning || null,
470
+ }, 201);
471
+ }
472
+ catch (e) {
473
+ return c.json({ error: e instanceof Error ? e.message : String(e) }, 400);
474
+ }
475
+ });
476
+ tasksRoutes.patch("/:id", async (c) => {
477
+ const session = await getSessionFromContext(c);
478
+ if (!session)
479
+ return c.json({ error: "Non authentifié" }, 401);
480
+ const body = await c.req.json().catch(() => ({}));
481
+ const parsed = z
482
+ .object({
483
+ title: z.string().min(1).max(300).optional(),
484
+ body: z.string().max(8000).optional(),
485
+ status: z.enum(TASK_STATUSES).optional(),
486
+ assignee_user_id: z.string().min(1).nullable().optional(),
487
+ priority: z.number().int().optional(),
488
+ result: z.string().max(8000).optional(),
489
+ launch: z.boolean().optional(),
490
+ })
491
+ .safeParse(body);
492
+ if (!parsed.success) {
493
+ return c.json({ error: "Payload invalide", details: parsed.error.issues }, 400);
494
+ }
495
+ try {
496
+ const before = getTask(c.req.param("id"));
497
+ if (!before)
498
+ return c.json({ error: "Tâche introuvable" }, 404);
499
+ const task = await updateTask(c.req.param("id"), {
500
+ title: parsed.data.title,
501
+ body: parsed.data.body,
502
+ status: parsed.data.status,
503
+ assigneeUserId: parsed.data.assignee_user_id,
504
+ priority: parsed.data.priority,
505
+ result: parsed.data.result,
506
+ });
507
+ let run = null;
508
+ const movedToProgress = parsed.data.status === "in_progress" && before.status !== "in_progress";
509
+ if ((parsed.data.launch || movedToProgress) &&
510
+ task.executor_kind === "ai") {
511
+ run = enqueueAiRunForTask(task.id);
512
+ void processAiTaskQueue();
513
+ }
514
+ return c.json({ ok: true, task, run });
515
+ }
516
+ catch (e) {
517
+ return c.json({ error: e instanceof Error ? e.message : String(e) }, 400);
518
+ }
519
+ });
520
+ tasksRoutes.delete("/:id", async (c) => {
521
+ const session = await getSessionFromContext(c);
522
+ if (!session)
523
+ return c.json({ error: "Non authentifié" }, 401);
524
+ const ok = await deleteTask(c.req.param("id"));
525
+ if (!ok)
526
+ return c.json({ error: "Tâche introuvable" }, 404);
527
+ return c.json({ ok: true });
528
+ });
529
+ tasksRoutes.post("/:id/launch", async (c) => {
530
+ const actor = await getTaskActor(c);
531
+ if (!actor)
532
+ return c.json({ error: "Non authentifié" }, 401);
533
+ const task = getTask(c.req.param("id"));
534
+ if (!task)
535
+ return c.json({ error: "Tâche introuvable" }, 404);
536
+ if (task.executor_kind !== "ai" || !task.assignee || task.assignee.kind !== "ai") {
537
+ return c.json({ error: "La tâche doit être assignée à un collaborateur IA" }, 400);
538
+ }
539
+ if (task.status === "backlog" || task.status === "done") {
540
+ await updateTask(task.id, { status: "in_progress" });
541
+ }
542
+ let run;
543
+ try {
544
+ run = enqueueAiRunForTask(task.id);
545
+ }
546
+ catch (e) {
547
+ const msg = e instanceof Error ? e.message : String(e);
548
+ if (msg.startsWith("quota_exceeded")) {
549
+ return c.json({ error: msg, code: "quota_exceeded" }, 429);
550
+ }
551
+ return c.json({ error: msg }, 400);
552
+ }
553
+ void processAiTaskQueue();
554
+ return c.json({
555
+ ok: true,
556
+ task: getTask(task.id),
557
+ run,
558
+ host_bridge_ready: hostBridgeReady(),
559
+ });
560
+ });
561
+ return tasksRoutes;
562
+ }
563
+ //# sourceMappingURL=hono-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono-routes.js","sourceRoot":"","sources":["../src/hono-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @creezio/tasks — tâches plateforme (kanban human/ai/hermes + runs + AI).
3
+ * Distinct de PluginTaskRecord (@creezio/product-hub).
4
+ */
5
+ export type { PlatformTask, PlatformTaskStatus, PlatformTasksStore, } from "./types.js";
6
+ export { PLATFORM_TASKS_CORE_SQL } from "./types.js";
7
+ export { createMemoryTasksStore } from "./memory-store.js";
8
+ export type { CreateSqliteTasksStoreOptions, SqliteTasksStore, } from "./sqlite-store.js";
9
+ export { createSqliteTasksStore } from "./sqlite-store.js";
10
+ export type { OpenSqliteDatabase } from "./sqlite-driver.js";
11
+ export { openNodeSqliteDatabase } from "./sqlite-driver.js";
12
+ export { createTasksApiMount } from "./api-mount.js";
13
+ export { upsertKitPlatformTask } from "./env-bridge.js";
14
+ export type { ResolvedExternalTab, ScreencastFrame, TasksAuthAdapter, TasksBrandConfig, TasksDbAdapter, TasksExternalTabsAdapter, TasksNavAdapter, TasksPresenceAdapter, TasksScreencastAdapter, TasksSession, TasksSqliteDb, TasksUser, TasksUserKind, TasksUsersAdapter, TasksWorkspaceAdapter, } from "./brand/config.js";
15
+ export { configureTasksBrand, getTasksBrandConfig, requireTasksBrand, resetTasksBrandForTests, tasksEnv, tasksEnvNumber, } from "./brand/config.js";
16
+ export type { CreateTaskInput, ExecutorKind, Task, TaskRow, TaskSource, TaskStatus, UpdateTaskInput, } from "./kanban-service.js";
17
+ export { createTask, deleteTask, EXECUTOR_KINDS, getTask, getTaskByHermesId, getTaskByIdempotency, getTaskDetail, hermesToTaskStatus, KANBAN_COLUMNS, listRecurringAiTasks, listSubtasks, listTasks, setTaskNextRun, syncHermesTasks, TASK_STATUSES, tasksByColumn, tasksReady, tasksRecurrenceReady, taskToHermesStatus, updateTask, updateTaskLocal, } from "./kanban-service.js";
18
+ export type { AgentLogEvent, AgentLogLevel, AgentSessionLog, RunStatus, TaskRunRow, } from "./task-runs.js";
19
+ export { appendAgentLog, bumpRunStepCount, cancelTaskRun, claimNextQueuedRun, clearHitlResponse, countRunningRuns, countRunsCreatedToday, enqueueTaskRun, finishTaskRun, getActiveRunForAssignee, getRunningRun, getTaskRun, isHitlPaused, listAgentLogs, listRunningRuns, listTaskRunsForTask, maxConcurrentAiRuns, openDetachedHitlRun, purgeAgentLogsOlderThan, resumeHitlRun, RUN_STATUSES, setHitlPrompt, subscribeAgentLogs, subscribeTaskRuns, sumUsageTokensToday, taskRunsHitlReady, taskRunsReady, taskRunsTokensReady, } from "./task-runs.js";
20
+ export type { AiTaskAgentContext, AiTaskAgentOutcome, AskHumanFn, } from "./ai-task-agent.js";
21
+ export { aiTaskMaxSteps, aiTaskMaxTokens, aiTaskModel, aiTaskTimeoutMs, aiWebHostAllowed, buildAiTaskTools, hasAiAgentModel, runAiTaskAgent, setAiTaskModelCaller, } from "./ai-task-agent.js";
22
+ export { aiRunnerEnabled, checkAiRunQuotas, ensureAiRunnerLoop, enqueueAiRunForTask, getAiActivityForUser, hostBridgeReady, parseRecurringSchedule, processAiTaskQueue, processRecurringAiTasks, recoverInterruptedRuns, resolveHostTargetUserId, retryFailedRun, stopAiRunnerLoop, } from "./ai-task-runner.js";
23
+ export { createTasksHonoRoutes } from "./hono-routes.js";
24
+ export { createAssistantTasksAdapter } from "./assistant-adapter.js";
25
+ export type { AiTaskHostMcpRegisterFn, AiTaskHostMcpToolConfig, AiTaskToolParseResult, CreateAiTaskHostMcpToolsOptions, CreezioAiTaskHostMcpToolName, } from "./mcp-host-tools.js";
26
+ export { CREEZIO_AI_TASK_HOST_MCP_TOOL_NAMES, CREEZIO_LIST_TASKS_MCP_TOOL_NAME, aiTaskToolJsonSchema, createAiTaskHostMcpTools, parseAiTaskToolInput, } from "./mcp-host-tools.js";
27
+ export type { CreateAiWorkspaceMcpToolsOptions, CreezioAiWorkspaceMcpToolName, } from "./mcp-workspace-tools.js";
28
+ export { CREEZIO_AI_WORKSPACE_MCP_TOOL_NAMES, createAiWorkspaceMcpTools, } from "./mcp-workspace-tools.js";
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}