@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,645 @@
1
+ /**
2
+ * Runner host — exécute les tâches assignées à un collaborateur IA via la
3
+ * boucle LLM (ai-task-agent). Persona ACL = user AI ; surface = workspace
4
+ * Electron dédié (pas l'espace owner). Desktop bridge = host owner.
5
+ *
6
+ * Honnêteté des statuts (D4) : un run sans bridge desktop, sans LLM ou sans
7
+ * `finish_task(success=true)` est `failed` — jamais de succès de complaisance.
8
+ */
9
+ import { hasAiAgentModel, runAiTaskAgent, } from "./ai-task-agent.js";
10
+ import { requireTasksBrand, tasksEnv } from "./brand/config.js";
11
+ import { getTask, listRecurringAiTasks, setTaskNextRun, updateTaskLocal, } from "./kanban-service.js";
12
+ import { appendAgentLog, claimNextQueuedRun, clearHitlResponse, countRunsCreatedToday, enqueueTaskRun, finishTaskRun, getActiveRunForAssignee, getTaskRun, isHitlPaused, listRunningRuns, maxConcurrentAiRuns, setHitlPrompt, sumUsageTokensToday, } from "./task-runs.js";
13
+ function ensureAiWorkspaceOnHost(opts) {
14
+ return requireTasksBrand().workspace.ensureOnHost(opts);
15
+ }
16
+ function isDesktopOnline(userId) {
17
+ return requireTasksBrand().presence.isDesktopOnline(userId);
18
+ }
19
+ function listOnlineBridges() {
20
+ return requireTasksBrand().presence.listOnlineBridges();
21
+ }
22
+ function getOwner() {
23
+ return requireTasksBrand().users.getOwner();
24
+ }
25
+ function getUserById(id) {
26
+ return requireTasksBrand().users.getById(id);
27
+ }
28
+ const g = globalThis;
29
+ function inflight() {
30
+ if (!g.__creezioTasksAiRunnerInflight)
31
+ g.__creezioTasksAiRunnerInflight = new Set();
32
+ return g.__creezioTasksAiRunnerInflight;
33
+ }
34
+ /** Kill switch runner (`${envPrefix}_RUNNER_ENABLED=0` pour désactiver). */
35
+ export function aiRunnerEnabled() {
36
+ const v = (tasksEnv("RUNNER_ENABLED", "1") || "1").toLowerCase();
37
+ return v !== "0" && v !== "false" && v !== "no";
38
+ }
39
+ export function hostBridgeReady() {
40
+ const bridges = listOnlineBridges().filter((b) => b.online && b.bridgeConnected);
41
+ if (bridges.length > 0)
42
+ return true;
43
+ const owner = getOwner();
44
+ if (owner && isDesktopOnline(owner.id))
45
+ return true;
46
+ return false;
47
+ }
48
+ export function resolveHostTargetUserId() {
49
+ const owner = getOwner();
50
+ if (owner && isDesktopOnline(owner.id))
51
+ return owner.id;
52
+ const bridges = listOnlineBridges().filter((b) => b.online && b.bridgeConnected);
53
+ return bridges[0]?.userId || owner?.id || null;
54
+ }
55
+ /** Quota env optionnel (null = illimité). */
56
+ function envQuota(suffix) {
57
+ const raw = Number(tasksEnv(suffix));
58
+ return Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : null;
59
+ }
60
+ /**
61
+ * Quotas journaliers (minuit UTC) : ${requireTasksBrand().envPrefix}_MAX_RUNS_PER_DAY (nombre de runs
62
+ * créés) et ${requireTasksBrand().envPrefix}_MAX_TOKENS_PER_DAY (tokens LLM consommés). Non configurés
63
+ * = illimité.
64
+ */
65
+ export function checkAiRunQuotas() {
66
+ const maxRuns = envQuota("MAX_RUNS_PER_DAY");
67
+ if (maxRuns !== null) {
68
+ const used = countRunsCreatedToday();
69
+ if (used >= maxRuns) {
70
+ return {
71
+ ok: false,
72
+ reason: `quota journalier de runs atteint (${used}/${maxRuns} — ${requireTasksBrand().envPrefix}_MAX_RUNS_PER_DAY)`,
73
+ };
74
+ }
75
+ }
76
+ const maxTokens = envQuota("MAX_TOKENS_PER_DAY");
77
+ if (maxTokens !== null) {
78
+ const used = sumUsageTokensToday();
79
+ if (used >= maxTokens) {
80
+ return {
81
+ ok: false,
82
+ reason: `quota journalier de tokens atteint (${used}/${maxTokens} — ${requireTasksBrand().envPrefix}_MAX_TOKENS_PER_DAY)`,
83
+ };
84
+ }
85
+ }
86
+ return { ok: true };
87
+ }
88
+ /**
89
+ * Enfile un run si la tâche (executor ai) est assignée à une IA active.
90
+ * Retourne le run (existant ou nouveau) ou null si non applicable.
91
+ * Lève `quota_exceeded: …` si un quota journalier est atteint.
92
+ */
93
+ export function enqueueAiRunForTask(taskId, opts) {
94
+ const task = getTask(taskId);
95
+ if (!task?.assignee_user_id)
96
+ return null;
97
+ if (task.executor_kind !== "ai")
98
+ return null;
99
+ const assignee = getUserById(task.assignee_user_id);
100
+ if (!assignee || assignee.kind !== "ai" || !assignee.active)
101
+ return null;
102
+ const quota = checkAiRunQuotas();
103
+ if (!quota.ok) {
104
+ throw new Error(`quota_exceeded: ${quota.reason}`);
105
+ }
106
+ return enqueueTaskRun({
107
+ taskId: task.id,
108
+ assigneeUserId: assignee.id,
109
+ retryOf: opts?.retryOf ?? null,
110
+ });
111
+ }
112
+ async function sleep(ms) {
113
+ await new Promise((r) => setTimeout(r, ms));
114
+ }
115
+ function hitlEnabled(task) {
116
+ const env = tasksEnv("HITL").toLowerCase();
117
+ if (env === "1" || env === "true")
118
+ return true;
119
+ const body = task.body || "";
120
+ return /\[\[confirm\]\]/i.test(body) || /\[\[hitl\]\]/i.test(body);
121
+ }
122
+ /** Pause HITL : prompt visible côté UI, reprise via /runs/:id/resume. */
123
+ async function waitForHitl(runId, prompt) {
124
+ setHitlPrompt(runId, prompt);
125
+ appendAgentLog({
126
+ runId,
127
+ level: "decision",
128
+ eventType: "await_human",
129
+ message: prompt,
130
+ payload: { hitl: true },
131
+ });
132
+ const deadline = Date.now() + 30 * 60 * 1000; // 30 min
133
+ while (Date.now() < deadline) {
134
+ await sleep(500);
135
+ const fresh = getTaskRun(runId);
136
+ if (!fresh || fresh.status !== "running")
137
+ return { outcome: "cancelled" };
138
+ if (!fresh.hitl_prompt && fresh.hitl_response) {
139
+ const response = fresh.hitl_response;
140
+ appendAgentLog({
141
+ runId,
142
+ level: "info",
143
+ eventType: "hitl_resume",
144
+ message: `Reprise humaine : ${response}`,
145
+ });
146
+ clearHitlResponse(runId);
147
+ return { outcome: "resumed", response };
148
+ }
149
+ if (!fresh.hitl_prompt) {
150
+ // resume cleared prompt without response edge-case
151
+ return { outcome: "resumed" };
152
+ }
153
+ }
154
+ appendAgentLog({
155
+ runId,
156
+ level: "error",
157
+ eventType: "hitl_timeout",
158
+ message: "Timeout human-in-the-loop (30 min)",
159
+ });
160
+ return { outcome: "timeout" };
161
+ }
162
+ async function runSteps(run, task) {
163
+ const assignee = getUserById(run.assignee_user_id);
164
+ const hostUserId = resolveHostTargetUserId();
165
+ const hostDevice = listOnlineBridges().find((b) => b.userId === hostUserId)?.deviceId || null;
166
+ const perms = assignee?.permissions || [];
167
+ appendAgentLog({
168
+ runId: run.id,
169
+ level: "info",
170
+ eventType: "run_start",
171
+ message: `Démarrage du run pour « ${task.title} »`,
172
+ payload: {
173
+ task_id: task.id,
174
+ assignee: assignee?.username || run.assignee_user_id,
175
+ assignee_kind: assignee?.kind || "ai",
176
+ permissions: perms,
177
+ host_user_id: hostUserId,
178
+ host_online: hostBridgeReady(),
179
+ max_concurrent: maxConcurrentAiRuns(),
180
+ retry_of: run.retry_of,
181
+ },
182
+ });
183
+ appendAgentLog({
184
+ runId: run.id,
185
+ level: "decision",
186
+ eventType: "acl_check",
187
+ message: "ACL collaborateur IA appliquées (pas de bypass owner)",
188
+ payload: {
189
+ role: assignee?.role,
190
+ permissions: perms,
191
+ },
192
+ });
193
+ // D4 : pas de bridge desktop = échec explicite, jamais un faux succès.
194
+ if (!hostBridgeReady() || !hostUserId || !assignee) {
195
+ appendAgentLog({
196
+ runId: run.id,
197
+ level: "error",
198
+ eventType: "desktop_offline",
199
+ message: "Bridge desktop hors ligne — l'IA ne peut pas travailler sans son workspace. Run en échec (relancer quand l'app desktop est ouverte).",
200
+ });
201
+ finishTaskRun(run.id, {
202
+ status: "failed",
203
+ lastError: "desktop_offline",
204
+ hostDeviceId: hostDevice,
205
+ });
206
+ return;
207
+ }
208
+ // D4 : pas de LLM (BYOK OpenAI absent) = échec explicite.
209
+ if (!hasAiAgentModel()) {
210
+ appendAgentLog({
211
+ runId: run.id,
212
+ level: "error",
213
+ eventType: "llm_missing",
214
+ message: "Aucune clé OpenAI (BYOK) — configurer Configuration → Clés IA avant de lancer un collaborateur IA.",
215
+ });
216
+ finishTaskRun(run.id, {
217
+ status: "failed",
218
+ lastError: "llm_missing",
219
+ hostDeviceId: hostDevice,
220
+ });
221
+ return;
222
+ }
223
+ if (task.body?.trim()) {
224
+ appendAgentLog({
225
+ runId: run.id,
226
+ level: "info",
227
+ eventType: "brief",
228
+ message: task.body.trim().slice(0, 500),
229
+ });
230
+ }
231
+ // Workspace Electron dédié de CETTE IA (partition + cookie persona).
232
+ appendAgentLog({
233
+ runId: run.id,
234
+ level: "tool",
235
+ eventType: "tool_call",
236
+ message: `ai_workspace_ensure → ${assignee.username}`,
237
+ payload: {
238
+ tool: "ai_workspace_ensure",
239
+ ai_user_id: assignee.id,
240
+ target_user_id: hostUserId,
241
+ },
242
+ });
243
+ try {
244
+ const ensured = await ensureAiWorkspaceOnHost({
245
+ aiUserId: assignee.id,
246
+ hostUserId,
247
+ show: true,
248
+ label: assignee.username,
249
+ });
250
+ appendAgentLog({
251
+ runId: run.id,
252
+ level: ensured.ok === false ? "warn" : "tool",
253
+ eventType: "tool_result",
254
+ message: ensured.ok === false
255
+ ? String(ensured.error || "Échec ensure workspace IA")
256
+ : "Espace workspace IA prêt (vue Electron)",
257
+ payload: {
258
+ ok: ensured.ok !== false,
259
+ code: ensured.code || null,
260
+ workspace: ensured.workspace || null,
261
+ },
262
+ });
263
+ if (ensured.ok === false) {
264
+ finishTaskRun(run.id, {
265
+ status: "failed",
266
+ lastError: String(ensured.error || "workspace_ensure_failed"),
267
+ hostDeviceId: hostDevice,
268
+ });
269
+ return;
270
+ }
271
+ }
272
+ catch (e) {
273
+ const msg = e instanceof Error ? e.message : String(e);
274
+ appendAgentLog({
275
+ runId: run.id,
276
+ level: "error",
277
+ eventType: "tool_result",
278
+ message: msg,
279
+ });
280
+ finishTaskRun(run.id, {
281
+ status: "failed",
282
+ lastError: msg,
283
+ hostDeviceId: hostDevice,
284
+ });
285
+ return;
286
+ }
287
+ // HITL pré-run ([[confirm]]/[[hitl]] dans le brief, ou HITL (envPrefix)=1).
288
+ if (hitlEnabled(task)) {
289
+ const gate = await waitForHitl(run.id, "Validation humaine requise avant de démarrer le run (HITL).");
290
+ if (gate.outcome !== "resumed") {
291
+ finishTaskRun(run.id, {
292
+ status: gate.outcome === "timeout" ? "failed" : "cancelled",
293
+ lastError: gate.outcome === "timeout" ? "hitl_timeout" : "hitl_cancelled",
294
+ hostDeviceId: hostDevice,
295
+ });
296
+ return;
297
+ }
298
+ }
299
+ appendAgentLog({
300
+ runId: run.id,
301
+ level: "decision",
302
+ eventType: "plan",
303
+ message: "Boucle LLM démarrée (navigate / UI / delegate_to_hermes / finish_task)",
304
+ });
305
+ // Boucle LLM — chaque étape journalisée pour l'AiActivityPanel.
306
+ const outcome = await runAiTaskAgent({
307
+ task,
308
+ assignee,
309
+ hostUserId,
310
+ runId: run.id,
311
+ askHuman: (question) => waitForHitl(run.id, question),
312
+ onStep: (ev) => {
313
+ if (ev.kind === "assistant") {
314
+ appendAgentLog({
315
+ runId: run.id,
316
+ level: "decision",
317
+ eventType: "assistant_message",
318
+ message: ev.content.slice(0, 1000),
319
+ });
320
+ }
321
+ else if (ev.kind === "tool_call") {
322
+ appendAgentLog({
323
+ runId: run.id,
324
+ level: "tool",
325
+ eventType: "tool_call",
326
+ message: ev.name,
327
+ payload: { tool: ev.name, args: ev.args },
328
+ });
329
+ }
330
+ else {
331
+ appendAgentLog({
332
+ runId: run.id,
333
+ level: ev.result.ok === false ? "warn" : "tool",
334
+ eventType: "tool_result",
335
+ message: ev.result.ok === false
336
+ ? String(ev.result.error || `${ev.name} en échec`)
337
+ : `${ev.name} ok`,
338
+ payload: { tool: ev.name, result: ev.result },
339
+ });
340
+ }
341
+ },
342
+ });
343
+ // Le run a pu être annulé pendant la boucle (HITL cancel, UI).
344
+ const still = getTaskRun(run.id);
345
+ if (!still || still.status !== "running")
346
+ return;
347
+ if (outcome.success) {
348
+ appendAgentLog({
349
+ runId: run.id,
350
+ level: "info",
351
+ eventType: "run_end",
352
+ message: outcome.summary || "Run terminé avec succès",
353
+ payload: { steps: outcome.loop.steps, tokens: outcome.loop.usageTokens },
354
+ });
355
+ finishTaskRun(run.id, {
356
+ status: "succeeded",
357
+ hostDeviceId: hostDevice,
358
+ usageTokens: outcome.loop.usageTokens,
359
+ });
360
+ const fresh = getTask(task.id);
361
+ if (fresh && fresh.status === "in_progress") {
362
+ updateTaskLocal(task.id, { status: "done", result: outcome.summary });
363
+ }
364
+ return;
365
+ }
366
+ appendAgentLog({
367
+ runId: run.id,
368
+ level: "error",
369
+ eventType: "run_end",
370
+ message: outcome.summary || `Run en échec (${outcome.loop.status})`,
371
+ payload: {
372
+ steps: outcome.loop.steps,
373
+ tokens: outcome.loop.usageTokens,
374
+ loop_status: outcome.loop.status,
375
+ },
376
+ });
377
+ finishTaskRun(run.id, {
378
+ status: "failed",
379
+ lastError: outcome.summary.slice(0, 500) || outcome.loop.status,
380
+ hostDeviceId: hostDevice,
381
+ usageTokens: outcome.loop.usageTokens,
382
+ });
383
+ updateTaskLocal(task.id, { result: outcome.summary });
384
+ }
385
+ async function executeClaimedRun(run) {
386
+ const active = inflight();
387
+ if (active.has(run.id)) {
388
+ return { processed: false, runId: run.id, error: "inflight" };
389
+ }
390
+ active.add(run.id);
391
+ try {
392
+ const task = getTask(run.task_id);
393
+ if (!task) {
394
+ finishTaskRun(run.id, {
395
+ status: "failed",
396
+ lastError: "Tâche introuvable",
397
+ });
398
+ return { processed: true, runId: run.id, error: "task_missing" };
399
+ }
400
+ const assignee = getUserById(run.assignee_user_id);
401
+ if (!assignee || assignee.kind !== "ai") {
402
+ finishTaskRun(run.id, {
403
+ status: "failed",
404
+ lastError: "Assigné non-IA",
405
+ });
406
+ return { processed: true, runId: run.id, error: "not_ai" };
407
+ }
408
+ try {
409
+ await runSteps(run, task);
410
+ return { processed: true, runId: run.id };
411
+ }
412
+ catch (e) {
413
+ const msg = e instanceof Error ? e.message : String(e);
414
+ appendAgentLog({
415
+ runId: run.id,
416
+ level: "error",
417
+ eventType: "run_end",
418
+ message: msg,
419
+ });
420
+ finishTaskRun(run.id, { status: "failed", lastError: msg });
421
+ return { processed: true, runId: run.id, error: msg };
422
+ }
423
+ }
424
+ finally {
425
+ active.delete(run.id);
426
+ }
427
+ }
428
+ /**
429
+ * Claim et lance jusqu'à `maxConcurrent` runs en parallèle.
430
+ * Les runs déjà en HITL restent « running » mais ne sont pas re-claimés.
431
+ */
432
+ export async function processAiTaskQueue() {
433
+ if (!aiRunnerEnabled()) {
434
+ return { processed: false, error: "runner_disabled" };
435
+ }
436
+ const max = maxConcurrentAiRuns();
437
+ const claimed = [];
438
+ for (let i = 0; i < max; i++) {
439
+ const run = claimNextQueuedRun(max);
440
+ if (!run)
441
+ break;
442
+ if (isHitlPaused(run))
443
+ continue;
444
+ if (inflight().has(run.id))
445
+ continue;
446
+ claimed.push(run);
447
+ }
448
+ if (claimed.length === 0) {
449
+ return { processed: false, maxConcurrent: max };
450
+ }
451
+ const results = await Promise.all(claimed.map((run) => executeClaimedRun(run)));
452
+ const runIds = results.map((r) => r.runId);
453
+ const err = results.find((r) => r.error)?.error;
454
+ return {
455
+ processed: true,
456
+ runIds,
457
+ runId: runIds[0],
458
+ error: err,
459
+ maxConcurrent: max,
460
+ };
461
+ }
462
+ /**
463
+ * Récupération après redémarrage : les runs `running` qui n'appartiennent à
464
+ * aucune boucle de CE process sont orphelins (app/serveur redémarré pendant
465
+ * l'exécution). D4 : ils passent `failed` (motif `app_restart`) — et si la
466
+ * tâche est toujours `in_progress`, un nouveau run est ré-enfilé.
467
+ */
468
+ export function recoverInterruptedRuns() {
469
+ let recovered = 0;
470
+ let requeued = 0;
471
+ for (const run of listRunningRuns()) {
472
+ if (inflight().has(run.id))
473
+ continue; // vraiment en cours ici
474
+ appendAgentLog({
475
+ runId: run.id,
476
+ level: "error",
477
+ eventType: "run_end",
478
+ message: "Run interrompu par un redémarrage de l'application — marqué failed (app_restart).",
479
+ payload: { recovered: true },
480
+ });
481
+ finishTaskRun(run.id, { status: "failed", lastError: "app_restart" });
482
+ recovered += 1;
483
+ const task = getTask(run.task_id);
484
+ if (task && task.executor_kind === "ai" && task.status === "in_progress") {
485
+ try {
486
+ if (enqueueAiRunForTask(task.id, { retryOf: run.id }))
487
+ requeued += 1;
488
+ }
489
+ catch {
490
+ /* quota atteint — la tâche reste in_progress, relançable à la main */
491
+ }
492
+ }
493
+ }
494
+ return { recovered, requeued };
495
+ }
496
+ /* ── Récurrence (tâches IA) ────────────────────────────────────────────── */
497
+ /**
498
+ * Parseur minimal de `recurring_schedule` pour les tâches IA :
499
+ * - `every 15m` / `every 2h` / `every 1d` (aussi `min`, `j`) ;
500
+ * - `daily@HH:MM` (heure locale serveur).
501
+ * Retourne une fonction « prochaine occurrence après `from` », ou null si la
502
+ * syntaxe n'est pas reconnue (les crons Hermes restent gérés par Hermes).
503
+ */
504
+ export function parseRecurringSchedule(raw) {
505
+ const s = String(raw || "").trim().toLowerCase();
506
+ if (!s)
507
+ return null;
508
+ const every = s.match(/^every\s+(\d+)\s*(m|min|mins|minutes?|h|heures?|hours?|d|j|jours?|days?)$/);
509
+ if (every) {
510
+ const n = Number(every[1]);
511
+ if (!Number.isFinite(n) || n <= 0)
512
+ return null;
513
+ const unit = (every[2] || "d")[0]; // m / h / d / j
514
+ const ms = unit === "m" ? n * 60_000 : unit === "h" ? n * 3_600_000 : n * 86_400_000;
515
+ if (ms < 60_000)
516
+ return null; // plancher 1 min
517
+ return (from) => new Date(from.getTime() + ms);
518
+ }
519
+ const daily = s.match(/^daily\s*@\s*(\d{1,2}):(\d{2})$/);
520
+ if (daily) {
521
+ const hh = Number(daily[1]);
522
+ const mm = Number(daily[2]);
523
+ if (hh > 23 || mm > 59)
524
+ return null;
525
+ return (from) => {
526
+ const next = new Date(from);
527
+ next.setHours(hh, mm, 0, 0);
528
+ if (next.getTime() <= from.getTime()) {
529
+ next.setDate(next.getDate() + 1);
530
+ }
531
+ return next;
532
+ };
533
+ }
534
+ return null;
535
+ }
536
+ /**
537
+ * Tick récurrence (1/min) : (ré)enfile les tâches IA récurrentes échues.
538
+ * Première passe : initialise next_run_at sans lancer (la création a déjà
539
+ * lancé un premier run le cas échéant).
540
+ */
541
+ export function processRecurringAiTasks(now = new Date()) {
542
+ if (!aiRunnerEnabled())
543
+ return { launched: [], scheduled: 0 };
544
+ const launched = [];
545
+ let scheduled = 0;
546
+ for (const task of listRecurringAiTasks()) {
547
+ const next = parseRecurringSchedule(task.recurring_schedule);
548
+ if (!next)
549
+ continue; // syntaxe non gérée (cron Hermes, etc.)
550
+ if (!task.next_run_at) {
551
+ setTaskNextRun(task.id, next(now).toISOString());
552
+ scheduled += 1;
553
+ continue;
554
+ }
555
+ if (new Date(task.next_run_at).getTime() > now.getTime())
556
+ continue;
557
+ // Occurrence échue : replanifier d'abord (pas de rafale si erreur).
558
+ setTaskNextRun(task.id, next(now).toISOString());
559
+ scheduled += 1;
560
+ try {
561
+ if (task.status !== "in_progress") {
562
+ updateTaskLocal(task.id, { status: "in_progress" });
563
+ }
564
+ const run = enqueueAiRunForTask(task.id);
565
+ if (run)
566
+ launched.push(run.id);
567
+ }
568
+ catch {
569
+ /* quota atteint — occurrence sautée, la suivante retentera */
570
+ }
571
+ }
572
+ if (launched.length > 0)
573
+ void processAiTaskQueue();
574
+ return { launched, scheduled };
575
+ }
576
+ function unrefTimer(timer) {
577
+ if (timer && typeof timer === "object" && "unref" in timer) {
578
+ try {
579
+ timer.unref();
580
+ }
581
+ catch {
582
+ /* ignore */
583
+ }
584
+ }
585
+ }
586
+ /**
587
+ * Arrête les boucles runner + récurrence (teardown). Sans cet arrêt, le
588
+ * setInterval process-global continue de tick après la fermeture de la
589
+ * surface plateforme : le tick suivant jette `requireTasksBrand()` en
590
+ * unhandledRejection (config brand désormais absente) — vécu gate PNM.2.
591
+ * Un prochain appel à `ensureAiRunnerLoop` (requête tasks) relance tout.
592
+ */
593
+ export function stopAiRunnerLoop() {
594
+ if (g.__creezioTasksAiRunnerTimer) {
595
+ clearInterval(g.__creezioTasksAiRunnerTimer);
596
+ g.__creezioTasksAiRunnerTimer = null;
597
+ }
598
+ if (g.__creezioTasksAiRecurrenceTimer) {
599
+ clearInterval(g.__creezioTasksAiRecurrenceTimer);
600
+ g.__creezioTasksAiRecurrenceTimer = null;
601
+ }
602
+ }
603
+ /** Démarre un poll léger du runner (idempotent, process-local). */
604
+ export function ensureAiRunnerLoop(intervalMs = 2000) {
605
+ if (!aiRunnerEnabled())
606
+ return;
607
+ if (!g.__creezioTasksAiRecurrenceTimer) {
608
+ g.__creezioTasksAiRecurrenceTimer = setInterval(() => {
609
+ try {
610
+ processRecurringAiTasks();
611
+ }
612
+ catch {
613
+ /* jamais bloquant */
614
+ }
615
+ }, 60_000);
616
+ unrefTimer(g.__creezioTasksAiRecurrenceTimer);
617
+ }
618
+ if (g.__creezioTasksAiRunnerTimer)
619
+ return;
620
+ g.__creezioTasksAiRunnerTimer = setInterval(() => {
621
+ void processAiTaskQueue();
622
+ }, intervalMs);
623
+ unrefTimer(g.__creezioTasksAiRunnerTimer);
624
+ }
625
+ export function getAiActivityForUser(userId) {
626
+ const active = getActiveRunForAssignee(userId);
627
+ if (!active)
628
+ return { run: null, task: null };
629
+ return { run: active, task: getTask(active.task_id) };
630
+ }
631
+ export function retryFailedRun(runId) {
632
+ const prev = getTaskRun(runId);
633
+ if (!prev)
634
+ return null;
635
+ if (prev.status !== "failed" && prev.status !== "cancelled")
636
+ return null;
637
+ const task = getTask(prev.task_id);
638
+ if (!task)
639
+ return null;
640
+ if (task.status === "done" || task.status === "cancelled") {
641
+ updateTaskLocal(task.id, { status: "in_progress" });
642
+ }
643
+ return enqueueAiRunForTask(task.id, { retryOf: prev.id });
644
+ }
645
+ //# sourceMappingURL=ai-task-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-task-runner.js","sourceRoot":"","sources":["../src/ai-task-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ApiMount } from "@creezio/api-kernel";
2
+ import type { PlatformTasksStore } from "./types.js";
3
+ export declare function createTasksApiMount(store: PlatformTasksStore): ApiMount;
4
+ //# sourceMappingURL=api-mount.d.ts.map