@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,601 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listSubtasks = exports.getTaskByIdempotency = exports.getTaskByHermesId = exports.getTask = exports.tasksByColumn = exports.tasksReady = exports.KANBAN_COLUMNS = exports.EXECUTOR_KINDS = exports.TASK_STATUSES = void 0;
4
+ exports.hermesToTaskStatus = hermesToTaskStatus;
5
+ exports.taskToHermesStatus = taskToHermesStatus;
6
+ exports.listTasks = listTasks;
7
+ exports.createTask = createTask;
8
+ exports.updateTask = updateTask;
9
+ exports.updateTaskLocal = updateTaskLocal;
10
+ exports.tasksRecurrenceReady = tasksRecurrenceReady;
11
+ exports.listRecurringAiTasks = listRecurringAiTasks;
12
+ exports.setTaskNextRun = setTaskNextRun;
13
+ exports.deleteTask = deleteTask;
14
+ exports.syncHermesTasks = syncHermesTasks;
15
+ exports.getTaskDetail = getTaskDetail;
16
+ /**
17
+ * Kanban unifié « Tâches » (schéma tasks plateforme) — une tâche a un exécutant :
18
+ * - `human` : collaborateur humain (kanban simple)
19
+ * - `ai` : collaborateur IA (runs `task_runs` + workspace Electron dédié)
20
+ * - `hermes` : agent central Hermes (carte kanban WebUI, sync bidirectionnelle)
21
+ *
22
+ * Remplace `cabinet-tasks.ts` et `todo-queries.ts`.
23
+ */
24
+ const node_crypto_1 = require("node:crypto");
25
+ const assistant_1 = require("@creezio/assistant");
26
+ const config_js_1 = require("./brand/config.js");
27
+ const env_bridge_js_1 = require("./env-bridge.js");
28
+ function getWriteDb() {
29
+ return (0, config_js_1.requireTasksBrand)().db.getWriteDb();
30
+ }
31
+ function queryAll(sql, params = []) {
32
+ return (0, config_js_1.requireTasksBrand)().db.queryAll(sql, params);
33
+ }
34
+ function queryOne(sql, params = []) {
35
+ return (0, config_js_1.requireTasksBrand)().db.queryOne(sql, params);
36
+ }
37
+ function tableExists(name) {
38
+ return (0, config_js_1.requireTasksBrand)().db.tableExists(name);
39
+ }
40
+ function getUserById(id) {
41
+ return (0, config_js_1.requireTasksBrand)().users.getById(id);
42
+ }
43
+ exports.TASK_STATUSES = [
44
+ "backlog",
45
+ "in_progress",
46
+ "blocked",
47
+ "done",
48
+ "cancelled",
49
+ ];
50
+ exports.EXECUTOR_KINDS = ["human", "ai", "hermes"];
51
+ exports.KANBAN_COLUMNS = [
52
+ { id: "backlog", label: "Backlog" },
53
+ { id: "in_progress", label: "En cours" },
54
+ { id: "blocked", label: "Bloqué" },
55
+ { id: "done", label: "Terminé" },
56
+ ];
57
+ /** Statut Hermes (9 états) → statut kanban unifié (5 états). */
58
+ function hermesToTaskStatus(status) {
59
+ switch (status) {
60
+ case "ready":
61
+ case "running":
62
+ return "in_progress";
63
+ case "blocked":
64
+ case "review":
65
+ return "blocked";
66
+ case "done":
67
+ return "done";
68
+ case "archived":
69
+ return "cancelled";
70
+ default:
71
+ // triage / todo / scheduled / inconnu
72
+ return "backlog";
73
+ }
74
+ }
75
+ /** Statut kanban unifié → statut Hermes (pour pousser un drag & drop). */
76
+ function taskToHermesStatus(status) {
77
+ switch (status) {
78
+ case "backlog":
79
+ return "todo";
80
+ case "in_progress":
81
+ return "ready";
82
+ case "blocked":
83
+ return "blocked";
84
+ case "done":
85
+ return "done";
86
+ case "cancelled":
87
+ return "archived";
88
+ }
89
+ }
90
+ const enrich = (r) => ({
91
+ ...r,
92
+ assignee: r.assignee_user_id ? getUserById(r.assignee_user_id) : null,
93
+ });
94
+ const tasksReady = () => tableExists("tasks");
95
+ exports.tasksReady = tasksReady;
96
+ function nowIso() {
97
+ return new Date().toISOString();
98
+ }
99
+ function nextPosition(status) {
100
+ return ((queryOne("SELECT MAX(position) m FROM tasks WHERE status=?", [status])?.m || 0) + 1);
101
+ }
102
+ function listTasks(opts) {
103
+ if (!(0, exports.tasksReady)())
104
+ return [];
105
+ const where = [];
106
+ const args = [];
107
+ if (opts?.status) {
108
+ where.push("status=?");
109
+ args.push(opts.status);
110
+ }
111
+ else if (!opts?.includeCancelled) {
112
+ where.push("status != 'cancelled'");
113
+ }
114
+ if (opts?.assigneeUserId) {
115
+ where.push("assignee_user_id=?");
116
+ args.push(opts.assigneeUserId);
117
+ }
118
+ if (opts?.executor) {
119
+ where.push("executor_kind=?");
120
+ args.push(opts.executor);
121
+ }
122
+ if (opts?.parentTaskId) {
123
+ where.push("parent_task_id=?");
124
+ args.push(opts.parentTaskId);
125
+ }
126
+ const sql = `SELECT * FROM tasks ${where.length ? `WHERE ${where.join(" AND ")}` : ""}
127
+ ORDER BY status, position, updated_at DESC`;
128
+ return queryAll(sql, args).map(enrich);
129
+ }
130
+ const tasksByColumn = (tasks) => ({
131
+ backlog: tasks.filter((t) => t.status === "backlog"),
132
+ in_progress: tasks.filter((t) => t.status === "in_progress"),
133
+ blocked: tasks.filter((t) => t.status === "blocked"),
134
+ done: tasks.filter((t) => t.status === "done"),
135
+ });
136
+ exports.tasksByColumn = tasksByColumn;
137
+ const getTask = (id) => {
138
+ const r = (0, exports.tasksReady)()
139
+ ? queryOne("SELECT * FROM tasks WHERE id=?", [id])
140
+ : null;
141
+ return r ? enrich(r) : null;
142
+ };
143
+ exports.getTask = getTask;
144
+ const getTaskByHermesId = (hermesId) => {
145
+ const r = (0, exports.tasksReady)()
146
+ ? queryOne("SELECT * FROM tasks WHERE hermes_task_id=?", [hermesId])
147
+ : null;
148
+ return r ? enrich(r) : null;
149
+ };
150
+ exports.getTaskByHermesId = getTaskByHermesId;
151
+ const getTaskByIdempotency = (key) => {
152
+ const r = (0, exports.tasksReady)()
153
+ ? queryOne("SELECT * FROM tasks WHERE idempotency_key=?", [key])
154
+ : null;
155
+ return r ? enrich(r) : null;
156
+ };
157
+ exports.getTaskByIdempotency = getTaskByIdempotency;
158
+ const listSubtasks = (parentTaskId) => listTasks({ parentTaskId, includeCancelled: true });
159
+ exports.listSubtasks = listSubtasks;
160
+ /** Invariants exécutant / assigné (levés en Error → 400 côté API). */
161
+ function assertExecutorInvariants(executor, assigneeUserId) {
162
+ if (executor === "hermes") {
163
+ if (assigneeUserId) {
164
+ throw new Error("Une tâche Hermes n'a pas d'assigné (exécutant central)");
165
+ }
166
+ return;
167
+ }
168
+ if (!assigneeUserId) {
169
+ if (executor === "ai") {
170
+ throw new Error("Une tâche IA doit être assignée à un collaborateur IA");
171
+ }
172
+ return;
173
+ }
174
+ const user = getUserById(assigneeUserId);
175
+ if (!user)
176
+ throw new Error("Assigné introuvable");
177
+ if (executor === "ai" && user.kind !== "ai") {
178
+ throw new Error("L'assigné d'une tâche IA doit être un collaborateur IA");
179
+ }
180
+ if (executor === "human" && user.kind !== "human") {
181
+ throw new Error("L'assigné d'une tâche humaine doit être un humain");
182
+ }
183
+ }
184
+ function insertLocal(row) {
185
+ // C1 — SoT kit d’abord (même UUID), puis extension brand kanban/AI
186
+ (0, env_bridge_js_1.upsertKitPlatformTask)({
187
+ id: row.id,
188
+ userId: row.assignee_user_id || row.created_by || "system",
189
+ title: row.title,
190
+ body: row.body || "",
191
+ status: row.status === "done" || row.status === "cancelled"
192
+ ? row.status
193
+ : "open",
194
+ });
195
+ getWriteDb()
196
+ .prepare(`INSERT INTO tasks (
197
+ id, title, body, status, position, executor_kind, assignee_user_id,
198
+ parent_task_id, created_by, priority, hermes_task_id, hermes_cron_id,
199
+ hermes_status, recurring_schedule, source, conversation_id,
200
+ idempotency_key, result, last_synced_at, created_at, updated_at
201
+ ) VALUES (
202
+ @id, @title, @body, @status, @position, @executor_kind, @assignee_user_id,
203
+ @parent_task_id, @created_by, @priority, @hermes_task_id, @hermes_cron_id,
204
+ @hermes_status, @recurring_schedule, @source, @conversation_id,
205
+ @idempotency_key, @result, @last_synced_at, @created_at, @updated_at
206
+ )`)
207
+ .run(row);
208
+ }
209
+ function updateLocal(id, patch) {
210
+ const old = (0, exports.getTask)(id);
211
+ if (!old)
212
+ return null;
213
+ // Les clés `undefined` du patch ne doivent pas écraser les valeurs.
214
+ const defined = Object.fromEntries(Object.entries(patch).filter(([, v]) => v !== undefined));
215
+ const next = { ...old, ...defined, updated_at: nowIso() };
216
+ // Changement de colonne → fin de colonne cible.
217
+ if (patch.status && patch.status !== old.status && patch.position == null) {
218
+ next.position = nextPosition(patch.status);
219
+ }
220
+ (0, env_bridge_js_1.upsertKitPlatformTask)({
221
+ id: next.id,
222
+ userId: next.assignee_user_id || next.created_by || "system",
223
+ title: next.title,
224
+ body: next.body || "",
225
+ status: next.status === "done" || next.status === "cancelled"
226
+ ? next.status
227
+ : "open",
228
+ });
229
+ getWriteDb()
230
+ .prepare(`UPDATE tasks SET
231
+ title=@title, body=@body, status=@status, position=@position,
232
+ executor_kind=@executor_kind, assignee_user_id=@assignee_user_id,
233
+ priority=@priority, hermes_task_id=@hermes_task_id,
234
+ hermes_cron_id=@hermes_cron_id, hermes_status=@hermes_status,
235
+ recurring_schedule=@recurring_schedule, result=@result,
236
+ last_synced_at=@last_synced_at, updated_at=@updated_at
237
+ WHERE id=@id`)
238
+ .run(next);
239
+ return (0, exports.getTask)(id);
240
+ }
241
+ /**
242
+ * Pousse une tâche executor=hermes vers le kanban Hermes WebUI.
243
+ * Retourne la carte, ou une erreur (tâche laissée `blocked` par l'appelant).
244
+ */
245
+ async function pushTaskToHermes(task, opts) {
246
+ if (!(0, assistant_1.hermesKanbanConfigured)()) {
247
+ return { error: "Hermes non configuré (gateway/WebUI hors ligne)" };
248
+ }
249
+ try {
250
+ const hermes = await (0, assistant_1.hermesKanbanCreateTask)({
251
+ title: task.title,
252
+ body: [
253
+ task.body,
254
+ "",
255
+ "—",
256
+ `Source: ${(0, config_js_1.requireTasksBrand)().hermesSourceLabel}`,
257
+ task.conversation_id ? `Conversation: ${task.conversation_id}` : null,
258
+ `CRM task: ${task.id}`,
259
+ task.recurring_schedule ? `Récurrence: ${task.recurring_schedule}` : null,
260
+ ]
261
+ .filter(Boolean)
262
+ .join("\n"),
263
+ status: "ready",
264
+ priority: task.priority,
265
+ idempotencyKey: task.idempotency_key || `${(0, config_js_1.requireTasksBrand)().idempotencyPrefix}:${task.id}`,
266
+ });
267
+ let cronId = null;
268
+ let error;
269
+ if (task.recurring_schedule?.trim()) {
270
+ try {
271
+ const cron = await (0, assistant_1.hermesCronCreate)({
272
+ schedule: task.recurring_schedule.trim(),
273
+ name: task.title.slice(0, 80),
274
+ prompt: [
275
+ `Tâche récurrente ${(0, config_js_1.requireTasksBrand)().hermesSourceLabel} « ${task.title} ».`,
276
+ task.body || "Exécute la mission et mets à jour le kanban.",
277
+ `Charge le skill ${(0, config_js_1.requireTasksBrand)().hermesSkill}.`,
278
+ `CRM task id: ${task.id}`,
279
+ ].join("\n"),
280
+ });
281
+ cronId = cron.id || null;
282
+ }
283
+ catch (e) {
284
+ error = `cron: ${e instanceof Error ? e.message : String(e)}`;
285
+ }
286
+ }
287
+ if (opts?.dispatch !== false && hermes.status === "ready") {
288
+ try {
289
+ await (0, assistant_1.hermesKanbanDispatch)();
290
+ }
291
+ catch {
292
+ /* dispatch best-effort */
293
+ }
294
+ }
295
+ return { hermes, cronId, error };
296
+ }
297
+ catch (e) {
298
+ return { error: e instanceof Error ? e.message : String(e) };
299
+ }
300
+ }
301
+ /**
302
+ * Crée une tâche. Pour executor=hermes : pousse la carte Hermes ; si Hermes
303
+ * est indisponible la tâche reste `blocked` et sera re-poussée à la synchro.
304
+ */
305
+ async function createTask(input) {
306
+ if (!(0, exports.tasksReady)())
307
+ throw new Error("Table tasks absente (schéma tasks plateforme requis)");
308
+ const title = input.title.trim();
309
+ if (!title)
310
+ throw new Error("title requis");
311
+ const executor = input.executorKind || "human";
312
+ assertExecutorInvariants(executor, input.assigneeUserId);
313
+ if (input.parentTaskId && !(0, exports.getTask)(input.parentTaskId)) {
314
+ throw new Error("Tâche parente introuvable");
315
+ }
316
+ if (input.idempotencyKey) {
317
+ const existing = (0, exports.getTaskByIdempotency)(input.idempotencyKey);
318
+ if (existing)
319
+ return { task: existing };
320
+ }
321
+ const ts = nowIso();
322
+ const id = (0, node_crypto_1.randomUUID)();
323
+ const status = input.status || "backlog";
324
+ const row = {
325
+ id,
326
+ title,
327
+ body: (input.body || "").trim(),
328
+ status,
329
+ position: nextPosition(status),
330
+ executor_kind: executor,
331
+ assignee_user_id: input.assigneeUserId || null,
332
+ parent_task_id: input.parentTaskId || null,
333
+ created_by: input.createdBy || null,
334
+ priority: input.priority || 0,
335
+ hermes_task_id: null,
336
+ hermes_cron_id: null,
337
+ hermes_status: null,
338
+ recurring_schedule: input.recurringSchedule?.trim() || null,
339
+ source: input.source || "ui",
340
+ conversation_id: input.conversationId || null,
341
+ idempotency_key: input.idempotencyKey?.trim() || `${(0, config_js_1.requireTasksBrand)().idempotencyPrefix}:${id}`,
342
+ result: null,
343
+ last_synced_at: null,
344
+ created_at: ts,
345
+ updated_at: ts,
346
+ };
347
+ insertLocal(row);
348
+ if (executor !== "hermes") {
349
+ return { task: (0, exports.getTask)(id) };
350
+ }
351
+ const pushed = await pushTaskToHermes((0, exports.getTask)(id), {
352
+ dispatch: input.dispatch,
353
+ });
354
+ if (pushed.hermes) {
355
+ updateLocal(id, {
356
+ hermes_task_id: pushed.hermes.id,
357
+ hermes_cron_id: pushed.cronId ?? null,
358
+ hermes_status: String(pushed.hermes.status || "ready"),
359
+ status: hermesToTaskStatus(String(pushed.hermes.status || "ready")),
360
+ last_synced_at: nowIso(),
361
+ });
362
+ return { task: (0, exports.getTask)(id), hermes: pushed.hermes, warning: pushed.error };
363
+ }
364
+ // Hermes indisponible : la tâche attend, re-push à la prochaine synchro.
365
+ updateLocal(id, {
366
+ status: "blocked",
367
+ result: `En attente d'Hermes — ${pushed.error || "indisponible"}`,
368
+ });
369
+ return { task: (0, exports.getTask)(id), warning: pushed.error };
370
+ }
371
+ /**
372
+ * Met à jour une tâche ; si elle est liée à une carte Hermes, propage le
373
+ * changement (statut traduit) avant l'écriture locale.
374
+ */
375
+ async function updateTask(id, patch) {
376
+ const old = (0, exports.getTask)(id);
377
+ if (!old)
378
+ throw new Error("Tâche introuvable");
379
+ if (patch.assigneeUserId !== undefined && old.executor_kind !== "hermes") {
380
+ assertExecutorInvariants(old.executor_kind, patch.assigneeUserId);
381
+ }
382
+ if (patch.assigneeUserId && old.executor_kind === "hermes") {
383
+ throw new Error("Une tâche Hermes n'a pas d'assigné");
384
+ }
385
+ let hermesStatus;
386
+ if (old.hermes_task_id && (0, assistant_1.hermesKanbanConfigured)()) {
387
+ try {
388
+ const ht = await (0, assistant_1.hermesKanbanPatchTask)(old.hermes_task_id, {
389
+ title: patch.title,
390
+ body: patch.body,
391
+ status: patch.status ? taskToHermesStatus(patch.status) : undefined,
392
+ priority: patch.priority,
393
+ result: patch.result,
394
+ });
395
+ hermesStatus = String(ht.status || "");
396
+ }
397
+ catch {
398
+ /* Hermes injoignable — mise à jour locale quand même, resync plus tard */
399
+ }
400
+ }
401
+ return updateLocal(id, {
402
+ title: patch.title,
403
+ body: patch.body,
404
+ status: patch.status,
405
+ assignee_user_id: patch.assigneeUserId === undefined ? old.assignee_user_id : patch.assigneeUserId,
406
+ priority: patch.priority,
407
+ result: patch.result,
408
+ ...(hermesStatus ? { hermes_status: hermesStatus, last_synced_at: nowIso() } : {}),
409
+ });
410
+ }
411
+ /** Mise à jour locale directe (runner / interne — pas de propagation Hermes). */
412
+ function updateTaskLocal(id, patch) {
413
+ return updateLocal(id, patch);
414
+ }
415
+ /** Colonne next_run_at présente (migration 031 — récurrence IA). */
416
+ function tasksRecurrenceReady() {
417
+ if (!(0, exports.tasksReady)())
418
+ return false;
419
+ try {
420
+ const cols = queryAll(`PRAGMA table_info(tasks)`);
421
+ return cols.some((c) => c.name === "next_run_at");
422
+ }
423
+ catch {
424
+ return false;
425
+ }
426
+ }
427
+ /** Tâches IA récurrentes actives (pilotées par le tick du runner). */
428
+ function listRecurringAiTasks() {
429
+ if (!tasksRecurrenceReady())
430
+ return [];
431
+ return queryAll(`SELECT * FROM tasks
432
+ WHERE executor_kind = 'ai'
433
+ AND recurring_schedule IS NOT NULL AND recurring_schedule != ''
434
+ AND status != 'cancelled'
435
+ ORDER BY created_at ASC`).map(enrich);
436
+ }
437
+ function setTaskNextRun(id, nextRunAt) {
438
+ if (!tasksRecurrenceReady())
439
+ return;
440
+ getWriteDb()
441
+ .prepare(`UPDATE tasks SET next_run_at = ?, updated_at = ? WHERE id = ?`)
442
+ .run(nextRunAt, nowIso(), id);
443
+ }
444
+ async function deleteTask(id) {
445
+ const task = (0, exports.getTask)(id);
446
+ if (!task)
447
+ return false;
448
+ if (task.hermes_task_id && (0, assistant_1.hermesKanbanConfigured)()) {
449
+ try {
450
+ await (0, assistant_1.hermesKanbanPatchTask)(task.hermes_task_id, { status: "archived" });
451
+ }
452
+ catch {
453
+ /* best-effort */
454
+ }
455
+ }
456
+ return getWriteDb().prepare("DELETE FROM tasks WHERE id=?").run(id).changes > 0;
457
+ }
458
+ /**
459
+ * Synchronisation Hermes ↔ tasks :
460
+ * 1. tire le board WebUI → met à jour les tâches liées (statut mappé, résultat) ;
461
+ * 2. importe les cartes inconnues (source `hermes`) ;
462
+ * 3. re-pousse les tâches executor=hermes jamais liées (création hors ligne).
463
+ */
464
+ async function syncHermesTasks() {
465
+ const errors = [];
466
+ if (!(0, exports.tasksReady)()) {
467
+ return { updated: 0, created: 0, pushed: 0, errors: ["table tasks absente"] };
468
+ }
469
+ if (!(0, assistant_1.hermesKanbanConfigured)()) {
470
+ return { updated: 0, created: 0, pushed: 0, errors: ["Hermes non configuré"] };
471
+ }
472
+ let remote = [];
473
+ try {
474
+ remote = await (0, assistant_1.hermesKanbanListTasks)();
475
+ }
476
+ catch (e) {
477
+ return {
478
+ updated: 0,
479
+ created: 0,
480
+ pushed: 0,
481
+ errors: [e instanceof Error ? e.message : String(e)],
482
+ };
483
+ }
484
+ let updated = 0;
485
+ let created = 0;
486
+ let pushed = 0;
487
+ const ts = nowIso();
488
+ for (const ht of remote) {
489
+ try {
490
+ const local = (0, exports.getTaskByHermesId)(ht.id);
491
+ if (local) {
492
+ const mapped = hermesToTaskStatus(String(ht.status));
493
+ const changed = local.hermes_status !== String(ht.status) ||
494
+ local.title !== ht.title ||
495
+ (ht.result && local.result !== ht.result);
496
+ updateLocal(local.id, {
497
+ title: ht.title,
498
+ body: ht.body || local.body,
499
+ status: mapped,
500
+ hermes_status: String(ht.status),
501
+ priority: ht.priority ?? local.priority,
502
+ result: ht.result ?? local.result,
503
+ last_synced_at: ts,
504
+ });
505
+ if (changed)
506
+ updated += 1;
507
+ }
508
+ else {
509
+ const id = (0, node_crypto_1.randomUUID)();
510
+ insertLocal({
511
+ id,
512
+ title: ht.title,
513
+ body: ht.body || "",
514
+ status: hermesToTaskStatus(String(ht.status)),
515
+ position: nextPosition(hermesToTaskStatus(String(ht.status))),
516
+ executor_kind: "hermes",
517
+ assignee_user_id: null,
518
+ parent_task_id: null,
519
+ created_by: null,
520
+ priority: ht.priority ?? 0,
521
+ hermes_task_id: ht.id,
522
+ hermes_cron_id: null,
523
+ hermes_status: String(ht.status),
524
+ recurring_schedule: null,
525
+ source: "hermes",
526
+ conversation_id: null,
527
+ idempotency_key: ht.idempotency_key || `hermes:${ht.id}`,
528
+ result: ht.result || null,
529
+ last_synced_at: ts,
530
+ created_at: ts,
531
+ updated_at: ts,
532
+ });
533
+ created += 1;
534
+ }
535
+ }
536
+ catch (e) {
537
+ errors.push(e instanceof Error ? e.message : String(e));
538
+ }
539
+ }
540
+ // Re-push des tâches Hermes créées hors ligne (jamais liées).
541
+ const pending = queryAll(`SELECT * FROM tasks
542
+ WHERE executor_kind='hermes' AND hermes_task_id IS NULL
543
+ AND status NOT IN ('done','cancelled')`);
544
+ for (const row of pending) {
545
+ try {
546
+ const result = await pushTaskToHermes(enrich(row));
547
+ if (result.hermes) {
548
+ updateLocal(row.id, {
549
+ hermes_task_id: result.hermes.id,
550
+ hermes_cron_id: result.cronId ?? null,
551
+ hermes_status: String(result.hermes.status || "ready"),
552
+ status: hermesToTaskStatus(String(result.hermes.status || "ready")),
553
+ result: null,
554
+ last_synced_at: ts,
555
+ });
556
+ pushed += 1;
557
+ }
558
+ else if (result.error) {
559
+ errors.push(result.error);
560
+ }
561
+ }
562
+ catch (e) {
563
+ errors.push(e instanceof Error ? e.message : String(e));
564
+ }
565
+ }
566
+ return { updated, created, pushed, errors };
567
+ }
568
+ /** Détail tâche + rafraîchissement Hermes si liée. */
569
+ async function getTaskDetail(id) {
570
+ const task = (0, exports.getTask)(id);
571
+ if (!task)
572
+ return null;
573
+ if (task.hermes_task_id && (0, assistant_1.hermesKanbanConfigured)()) {
574
+ try {
575
+ const hermes = await (0, assistant_1.hermesKanbanGetTask)(task.hermes_task_id);
576
+ const ht = hermes.task;
577
+ if (String(ht.status) !== task.hermes_status ||
578
+ (ht.result && ht.result !== task.result) ||
579
+ ht.title !== task.title) {
580
+ updateLocal(task.id, {
581
+ title: ht.title,
582
+ body: ht.body || task.body,
583
+ status: hermesToTaskStatus(String(ht.status)),
584
+ hermes_status: String(ht.status),
585
+ result: ht.result ?? task.result,
586
+ last_synced_at: nowIso(),
587
+ });
588
+ }
589
+ return { task: (0, exports.getTask)(id), hermes, hermesError: null };
590
+ }
591
+ catch (e) {
592
+ return {
593
+ task,
594
+ hermes: null,
595
+ hermesError: e instanceof Error ? e.message : String(e),
596
+ };
597
+ }
598
+ }
599
+ return { task, hermes: null, hermesError: null };
600
+ }
601
+ //# sourceMappingURL=kanban-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kanban-service.js","sourceRoot":"","sources":["../src/kanban-service.ts"],"names":[],"mappings":"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"}