@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.
- package/README.md +279 -0
- package/dist/.creezio-src-hash.json +4 -0
- package/dist/ai-task-agent.d.ts +47 -0
- package/dist/ai-task-agent.d.ts.map +1 -0
- package/dist/ai-task-agent.js +558 -0
- package/dist/ai-task-agent.js.map +1 -0
- package/dist/ai-task-runner.d.ts +78 -0
- package/dist/ai-task-runner.d.ts.map +1 -0
- package/dist/ai-task-runner.js +645 -0
- package/dist/ai-task-runner.js.map +1 -0
- package/dist/api-mount.d.ts +4 -0
- package/dist/api-mount.d.ts.map +1 -0
- package/dist/api-mount.js +91 -0
- package/dist/api-mount.js.map +1 -0
- package/dist/assistant-adapter.d.ts +7 -0
- package/dist/assistant-adapter.d.ts.map +1 -0
- package/dist/assistant-adapter.js +96 -0
- package/dist/assistant-adapter.js.map +1 -0
- package/dist/brand/config.d.ts +165 -0
- package/dist/brand/config.d.ts.map +1 -0
- package/dist/brand/config.js +39 -0
- package/dist/brand/config.js.map +1 -0
- package/dist/env-bridge.d.ts +12 -0
- package/dist/env-bridge.d.ts.map +1 -0
- package/dist/env-bridge.js +33 -0
- package/dist/env-bridge.js.map +1 -0
- package/dist/hono-routes.d.ts +8 -0
- package/dist/hono-routes.d.ts.map +1 -0
- package/dist/hono-routes.js +563 -0
- package/dist/hono-routes.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/kanban-service.d.ts +136 -0
- package/dist/kanban-service.d.ts.map +1 -0
- package/dist/kanban-service.js +580 -0
- package/dist/kanban-service.js.map +1 -0
- package/dist/mcp-host-tools.d.ts +59 -0
- package/dist/mcp-host-tools.d.ts.map +1 -0
- package/dist/mcp-host-tools.js +326 -0
- package/dist/mcp-host-tools.js.map +1 -0
- package/dist/mcp-workspace-tools.d.ts +15 -0
- package/dist/mcp-workspace-tools.d.ts.map +1 -0
- package/dist/mcp-workspace-tools.js +338 -0
- package/dist/mcp-workspace-tools.js.map +1 -0
- package/dist/memory-store.d.ts +3 -0
- package/dist/memory-store.d.ts.map +1 -0
- package/dist/memory-store.js +75 -0
- package/dist/memory-store.js.map +1 -0
- package/dist/sqlite-driver.d.ts +13 -0
- package/dist/sqlite-driver.d.ts.map +1 -0
- package/dist/sqlite-driver.js +13 -0
- package/dist/sqlite-driver.js.map +1 -0
- package/dist/sqlite-store.d.ts +15 -0
- package/dist/sqlite-store.d.ts.map +1 -0
- package/dist/sqlite-store.js +113 -0
- package/dist/sqlite-store.js.map +1 -0
- package/dist/task-runs.d.ts +108 -0
- package/dist/task-runs.d.ts.map +1 -0
- package/dist/task-runs.js +427 -0
- package/dist/task-runs.js.map +1 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/dist-cjs/ai-task-agent.js +569 -0
- package/dist-cjs/ai-task-agent.js.map +1 -0
- package/dist-cjs/ai-task-runner.js +660 -0
- package/dist-cjs/ai-task-runner.js.map +1 -0
- package/dist-cjs/api-mount.js +94 -0
- package/dist-cjs/api-mount.js.map +1 -0
- package/dist-cjs/assistant-adapter.js +99 -0
- package/dist-cjs/assistant-adapter.js.map +1 -0
- package/dist-cjs/brand/config.js +47 -0
- package/dist-cjs/brand/config.js.map +1 -0
- package/dist-cjs/env-bridge.js +36 -0
- package/dist-cjs/env-bridge.js.map +1 -0
- package/dist-cjs/hono-routes.js +566 -0
- package/dist-cjs/hono-routes.js.map +1 -0
- package/dist-cjs/index.js +117 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/kanban-service.js +601 -0
- package/dist-cjs/kanban-service.js.map +1 -0
- package/dist-cjs/mcp-host-tools.js +333 -0
- package/dist-cjs/mcp-host-tools.js.map +1 -0
- package/dist-cjs/mcp-workspace-tools.js +342 -0
- package/dist-cjs/mcp-workspace-tools.js.map +1 -0
- package/dist-cjs/memory-store.js +81 -0
- package/dist-cjs/memory-store.js.map +1 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/sqlite-driver.js +16 -0
- package/dist-cjs/sqlite-driver.js.map +1 -0
- package/dist-cjs/sqlite-store.js +119 -0
- package/dist-cjs/sqlite-store.js.map +1 -0
- package/dist-cjs/task-runs.js +457 -0
- package/dist-cjs/task-runs.js.map +1 -0
- package/dist-cjs/types.js +18 -0
- package/dist-cjs/types.js.map +1 -0
- package/package.json +79 -0
- package/scripts/port-from-tempoflow.mjs +405 -0
- package/ui/ai-activity-panel.tsx +559 -0
- package/ui/index.ts +7 -0
- package/ui/task-detail-sheet.tsx +668 -0
- package/ui/tasks-kanban-client.tsx +647 -0
- 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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"}
|