@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,338 @@
1
+ /**
2
+ * H4 « Hermes cerveau unique » — verbes navigateur exposés directement à
3
+ * Hermes via MCP : wrappers FINS de l'espace IA (mêmes payloads que
4
+ * `buildAiTaskTools`, même bridge `dispatchSupplierAction` derrière les
5
+ * adapters `workspace.*` de la marque).
6
+ *
7
+ * Sécurité :
8
+ * - `ai_user_id` OBLIGATOIRE — l'action s'exécute dans le workspace du
9
+ * collaborateur IA (partition/screencast/ACL existants), jamais « nu » ;
10
+ * - gate acteur owner/service (même décision que mcp-host-tools : la clé
11
+ * service Hermes est mappée owner par la façade) ;
12
+ * - allowlist `*_WEB_ALLOWED_HOSTS` : garde runner ici (message clair) + H0
13
+ * au niveau host (défense en profondeur, `web_host_not_allowed`).
14
+ *
15
+ * HITL asynchrone : `platform.ask_human` crée une tâche kanban + un run HITL
16
+ * détaché (`openDetachedHitlRun`, infra `task_runs.hitl_prompt` réutilisée —
17
+ * voir justification dans task-runs.ts) ; `platform.get_human_answer` poll
18
+ * par id et clôt le run à la lecture de la réponse. Le canal de réponse
19
+ * humain reste l'UI existante (kanban / answer_ai_question).
20
+ */
21
+ import { z } from "zod";
22
+ import { requireTasksBrand } from "./brand/config.js";
23
+ import { aiWebHostAllowed } from "./ai-task-agent.js";
24
+ import { resolveHostTargetUserId } from "./ai-task-runner.js";
25
+ import { createTask, getTask, updateTask } from "./kanban-service.js";
26
+ import { finishTaskRun, getTaskRun, openDetachedHitlRun, } from "./task-runs.js";
27
+ import { actorIsOwner, } from "./mcp-host-tools.js";
28
+ export const CREEZIO_AI_WORKSPACE_MCP_TOOL_NAMES = [
29
+ "workspace.open_tab",
30
+ "workspace.list_tabs",
31
+ "workspace.web_list_targets",
32
+ "workspace.web_click",
33
+ "workspace.web_type",
34
+ "workspace.web_scroll",
35
+ "workspace.web_read",
36
+ "workspace.web_screenshot",
37
+ "platform.ask_human",
38
+ "platform.get_human_answer",
39
+ ];
40
+ function jsonResult(data) {
41
+ return {
42
+ content: [{ type: "text", text: JSON.stringify(data, null, 1) }],
43
+ };
44
+ }
45
+ function errorResult(message, code) {
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: JSON.stringify(code ? { error: message, code } : { error: message }),
51
+ },
52
+ ],
53
+ isError: true,
54
+ };
55
+ }
56
+ /** Gate commun : acteur owner/service + collaborateur IA actif + hôte cible. */
57
+ function gateWorkspaceCall(getActorUserId, input) {
58
+ const actorId = getActorUserId();
59
+ if (!actorIsOwner(actorId)) {
60
+ return {
61
+ ok: false,
62
+ error: errorResult("Réservé au compte principal (owner ou clé service)"),
63
+ };
64
+ }
65
+ const aiUserId = typeof input.ai_user_id === "string" ? input.ai_user_id.trim() : "";
66
+ if (!aiUserId) {
67
+ return { ok: false, error: errorResult("ai_user_id requis") };
68
+ }
69
+ const { users } = requireTasksBrand();
70
+ const ai = users.getById(aiUserId);
71
+ if (!ai || ai.kind !== "ai" || !ai.active) {
72
+ return {
73
+ ok: false,
74
+ error: errorResult(`Collaborateur IA « ${aiUserId} » introuvable ou inactif (voir list_ai_collaborators)`),
75
+ };
76
+ }
77
+ const hostUserId = resolveHostTargetUserId();
78
+ if (!hostUserId) {
79
+ return {
80
+ ok: false,
81
+ error: errorResult("Aucun hôte workspace disponible (desktop hors ligne ?)"),
82
+ };
83
+ }
84
+ return { ok: true, actorId: String(actorId), aiUserId, hostUserId };
85
+ }
86
+ const AI_USER_SCHEMA = z
87
+ .string()
88
+ .min(1)
89
+ .describe("Collaborateur IA cible (id — voir list_ai_collaborators)");
90
+ async function webAction(opts) {
91
+ const { workspace } = requireTasksBrand();
92
+ return workspace.webAction({
93
+ aiUserId: opts.aiUserId,
94
+ hostUserId: opts.hostUserId,
95
+ webType: opts.webType,
96
+ params: opts.params || {},
97
+ ...(opts.tabId ? { tabId: opts.tabId } : {}),
98
+ });
99
+ }
100
+ const optStr = (v) => v != null && String(v) ? String(v) : undefined;
101
+ /**
102
+ * Enregistre les tools MCP workspace + HITL async (SoT kit).
103
+ * Retourne les noms enregistrés.
104
+ */
105
+ export function createAiWorkspaceMcpTools(options) {
106
+ const { registerTool, getActorUserId } = options;
107
+ const registered = [];
108
+ const register = (name, config, handler) => {
109
+ registerTool(name, config, handler);
110
+ registered.push(name);
111
+ };
112
+ register("workspace.open_tab", {
113
+ title: "Ouvrir un onglet web dans l'espace d'un collaborateur IA",
114
+ description: "Ouvre une URL http(s) dans un onglet du workspace du collaborateur IA (allowlist *_WEB_ALLOWED_HOSTS appliquée). Retourne tabId.",
115
+ inputSchema: {
116
+ ai_user_id: AI_USER_SCHEMA,
117
+ url: z.string().min(1).describe("URL http(s) à ouvrir"),
118
+ title: z.string().max(200).optional(),
119
+ },
120
+ }, async (input) => {
121
+ const gate = gateWorkspaceCall(getActorUserId, input);
122
+ if (!gate.ok)
123
+ return gate.error;
124
+ const url = String(input.url || "");
125
+ const allowed = aiWebHostAllowed(url);
126
+ if (!allowed.ok) {
127
+ return errorResult(allowed.error || "hôte refusé", "host_not_allowed");
128
+ }
129
+ const brand = requireTasksBrand();
130
+ const resolved = brand.externalTabs.resolve({
131
+ url,
132
+ ...(input.title ? { title: String(input.title) } : {}),
133
+ });
134
+ if (!resolved.ok) {
135
+ return errorResult(String(resolved.error || "URL refusée"));
136
+ }
137
+ const { ok: _ok, ...rest } = resolved;
138
+ void _ok;
139
+ // Workspace ensure paresseux : l'ouverture d'onglet est le point
140
+ // d'entrée naturel d'une session directe Hermes.
141
+ await brand.workspace
142
+ .ensureOnHost({ aiUserId: gate.aiUserId, hostUserId: gate.hostUserId })
143
+ .catch(() => ({}));
144
+ const res = await brand.workspace.openTab({
145
+ aiUserId: gate.aiUserId,
146
+ hostUserId: gate.hostUserId,
147
+ params: brand.externalTabs.toWorkspaceParams(rest),
148
+ });
149
+ return res && res.ok === false
150
+ ? errorResult(String(res.error || "open_tab refusé"), optStr(res.code) || "open_tab_failed")
151
+ : jsonResult(res);
152
+ });
153
+ register("workspace.list_tabs", {
154
+ title: "Lister les onglets du workspace IA",
155
+ description: "Liste les onglets web ouverts dans l'espace du collaborateur IA.",
156
+ inputSchema: { ai_user_id: AI_USER_SCHEMA },
157
+ }, async (input) => {
158
+ const gate = gateWorkspaceCall(getActorUserId, input);
159
+ if (!gate.ok)
160
+ return gate.error;
161
+ const res = await requireTasksBrand().workspace.listTabs({
162
+ aiUserId: gate.aiUserId,
163
+ hostUserId: gate.hostUserId,
164
+ });
165
+ return jsonResult(res);
166
+ });
167
+ const webVerb = (name, webType, config) => {
168
+ register(name, {
169
+ title: config.title,
170
+ description: config.description,
171
+ inputSchema: {
172
+ ai_user_id: AI_USER_SCHEMA,
173
+ ...(config.extraSchema || {}),
174
+ tab_id: z.string().optional().describe("Onglet ciblé (défaut : actif)"),
175
+ },
176
+ }, async (input) => {
177
+ const gate = gateWorkspaceCall(getActorUserId, input);
178
+ if (!gate.ok)
179
+ return gate.error;
180
+ const res = await webAction({
181
+ aiUserId: gate.aiUserId,
182
+ hostUserId: gate.hostUserId,
183
+ webType,
184
+ params: config.toParams(input),
185
+ tabId: optStr(input.tab_id),
186
+ });
187
+ return res && res.ok === false
188
+ ? errorResult(String(res.error || `${webType} refusé`), optStr(res.code) || undefined)
189
+ : jsonResult(res);
190
+ });
191
+ };
192
+ webVerb("workspace.web_list_targets", "external_list_targets", {
193
+ title: "Inventaire des éléments actionnables (onglet web)",
194
+ description: "Inventaire des éléments actionnables de l'onglet web (refs s1-1, s1-2… pour web_click/web_type). À rappeler après chaque action.",
195
+ extraSchema: {
196
+ q: z.string().optional().describe("Filtre optionnel sur les libellés"),
197
+ },
198
+ toParams: (input) => ({ q: optStr(input.q) }),
199
+ });
200
+ webVerb("workspace.web_click", "external_click", {
201
+ title: "Cliquer un élément (onglet web)",
202
+ description: "Clique un élément de l'onglet web (clic trusted CDP). ref de web_list_targets prioritaire, sinon libellé visible.",
203
+ extraSchema: {
204
+ ref: z.string().optional().describe("Ref (ex. s1-12)"),
205
+ label: z.string().optional().describe("Libellé visible si ref inconnue"),
206
+ },
207
+ toParams: (input) => ({ ref: optStr(input.ref), label: optStr(input.label) }),
208
+ });
209
+ webVerb("workspace.web_type", "external_type", {
210
+ title: "Taper du texte (onglet web)",
211
+ description: "Tape du texte dans un champ de l'onglet web (clic + frappe trusted, champ vidé avant).",
212
+ extraSchema: {
213
+ ref: z.string().optional(),
214
+ label: z.string().optional(),
215
+ text: z.string().min(1),
216
+ submit: z.boolean().optional().describe("Entrée après la frappe"),
217
+ },
218
+ toParams: (input) => ({
219
+ ref: optStr(input.ref),
220
+ label: optStr(input.label),
221
+ text: String(input.text || ""),
222
+ submit: input.submit === true,
223
+ }),
224
+ });
225
+ webVerb("workspace.web_scroll", "external_scroll", {
226
+ title: "Faire défiler (onglet web)",
227
+ description: "Fait défiler l'onglet web actif (révéler des éléments).",
228
+ extraSchema: { direction: z.enum(["up", "down"]) },
229
+ toParams: (input) => ({
230
+ direction: input.direction === "up" ? "up" : "down",
231
+ }),
232
+ });
233
+ webVerb("workspace.web_read", "external_read", {
234
+ title: "Lire le texte visible (onglet web)",
235
+ description: "Lit le texte visible de l'onglet web (option q : blocs autour des lignes qui matchent).",
236
+ extraSchema: {
237
+ q: z.string().optional().describe("Filtre contextuel optionnel"),
238
+ max_chars: z.coerce.number().int().min(200).max(20000).optional(),
239
+ },
240
+ toParams: (input) => ({
241
+ q: optStr(input.q),
242
+ maxChars: typeof input.max_chars === "number" ? input.max_chars : undefined,
243
+ }),
244
+ });
245
+ webVerb("workspace.web_screenshot", "external_screenshot", {
246
+ title: "Capture d'écran (onglet web)",
247
+ description: "Capture d'écran de l'onglet web actif (image base64 — vision). Quand web_list_targets/web_read ne suffisent pas.",
248
+ toParams: () => ({}),
249
+ });
250
+ register("platform.ask_human", {
251
+ title: "Poser une question à l'humain (asynchrone)",
252
+ description: "Crée une question human-in-the-loop visible sur le kanban /taches (« en attente humain »). Retourne run_id — poll platform.get_human_answer(run_id). L'humain répond via l'UI existante (answer_ai_question / kanban).",
253
+ inputSchema: {
254
+ ai_user_id: AI_USER_SCHEMA,
255
+ question: z.string().min(1).max(2000),
256
+ title: z.string().max(200).optional(),
257
+ },
258
+ }, async (input) => {
259
+ const gate = gateWorkspaceCall(getActorUserId, input);
260
+ if (!gate.ok)
261
+ return gate.error;
262
+ const question = String(input.question || "").trim();
263
+ if (!question)
264
+ return errorResult("question requise");
265
+ try {
266
+ const { task } = await createTask({
267
+ title: optStr(input.title) || `Question : ${question.slice(0, 80)}`,
268
+ body: question,
269
+ executorKind: "ai",
270
+ assigneeUserId: gate.aiUserId,
271
+ createdBy: gate.actorId,
272
+ source: "assistant",
273
+ });
274
+ await updateTask(task.id, { status: "in_progress" });
275
+ const run = openDetachedHitlRun({
276
+ taskId: task.id,
277
+ assigneeUserId: gate.aiUserId,
278
+ prompt: question,
279
+ });
280
+ if (!run) {
281
+ return errorResult("schéma task_runs HITL requis (migrations plateforme)");
282
+ }
283
+ return jsonResult({
284
+ ok: true,
285
+ run_id: run.id,
286
+ task_id: task.id,
287
+ hint: "Poll platform.get_human_answer(run_id) toutes les 30-60 s.",
288
+ });
289
+ }
290
+ catch (error) {
291
+ return errorResult(error instanceof Error ? error.message : String(error));
292
+ }
293
+ });
294
+ register("platform.get_human_answer", {
295
+ title: "Relever la réponse humaine (asynchrone)",
296
+ description: "Poll la réponse d'une question platform.ask_human par run_id. answered=true clôt la question (run succeeded, tâche done).",
297
+ inputSchema: { run_id: z.string().min(1) },
298
+ }, async (input) => {
299
+ const actorId = getActorUserId();
300
+ if (!actorIsOwner(actorId)) {
301
+ return errorResult("Réservé au compte principal (owner ou clé service)");
302
+ }
303
+ const run = getTaskRun(String(input.run_id || ""));
304
+ if (!run)
305
+ return errorResult(`run ${input.run_id} introuvable`);
306
+ if (run.status === "running" && run.hitl_response) {
307
+ const response = run.hitl_response;
308
+ finishTaskRun(run.id, { status: "succeeded" });
309
+ try {
310
+ const task = getTask(run.task_id);
311
+ if (task && task.status !== "done") {
312
+ await updateTask(task.id, { status: "done", result: response });
313
+ }
314
+ }
315
+ catch {
316
+ /* clôture tâche best-effort — la réponse est déjà relevée */
317
+ }
318
+ return jsonResult({ answered: true, response, run_id: run.id });
319
+ }
320
+ if (run.status === "running" && run.hitl_prompt) {
321
+ return jsonResult({
322
+ answered: false,
323
+ pending: true,
324
+ run_id: run.id,
325
+ question: run.hitl_prompt,
326
+ });
327
+ }
328
+ return jsonResult({
329
+ answered: false,
330
+ pending: false,
331
+ run_id: run.id,
332
+ status: run.status,
333
+ hint: "Question close sans réponse relevable (run terminé/annulé).",
334
+ });
335
+ });
336
+ return registered;
337
+ }
338
+ //# sourceMappingURL=mcp-workspace-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-workspace-tools.js","sourceRoot":"","sources":["../src/mcp-workspace-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PlatformTasksStore } from "./types.js";
2
+ export declare function createMemoryTasksStore(): PlatformTasksStore;
3
+ //# sourceMappingURL=memory-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMnE,wBAAgB,sBAAsB,IAAI,kBAAkB,CAkE3D"}
@@ -0,0 +1,75 @@
1
+ import crypto from "node:crypto";
2
+ function now() {
3
+ return new Date().toISOString();
4
+ }
5
+ export function createMemoryTasksStore() {
6
+ const tasks = new Map();
7
+ const store = {
8
+ create(input) {
9
+ return store.upsertWithId({
10
+ id: crypto.randomUUID(),
11
+ userId: input.userId,
12
+ title: input.title,
13
+ body: input.body,
14
+ status: "open",
15
+ });
16
+ },
17
+ upsertWithId(input) {
18
+ const ts = now();
19
+ const existing = tasks.get(input.id);
20
+ const t = {
21
+ id: input.id,
22
+ userId: input.userId,
23
+ title: input.title.trim(),
24
+ body: input.body || "",
25
+ status: input.status || existing?.status || "open",
26
+ createdAt: existing?.createdAt || ts,
27
+ updatedAt: ts,
28
+ };
29
+ if (!t.title)
30
+ throw new Error("title_required");
31
+ tasks.set(t.id, t);
32
+ return t;
33
+ },
34
+ list(userId) {
35
+ return [...tasks.values()]
36
+ .filter((t) => t.userId === userId)
37
+ .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
38
+ },
39
+ get(id) {
40
+ return tasks.get(id);
41
+ },
42
+ update(id, patch, actorUserId) {
43
+ const t = tasks.get(id);
44
+ if (!t)
45
+ throw new Error("not_found");
46
+ if (t.userId !== actorUserId)
47
+ throw new Error("forbidden");
48
+ const updated = {
49
+ ...t,
50
+ ...("title" in patch && patch.title !== undefined
51
+ ? { title: patch.title }
52
+ : {}),
53
+ ...("body" in patch && patch.body !== undefined
54
+ ? { body: patch.body }
55
+ : {}),
56
+ ...("status" in patch && patch.status !== undefined
57
+ ? { status: patch.status }
58
+ : {}),
59
+ updatedAt: now(),
60
+ };
61
+ tasks.set(id, updated);
62
+ return updated;
63
+ },
64
+ remove(id, actorUserId) {
65
+ const t = tasks.get(id);
66
+ if (!t)
67
+ return false;
68
+ if (t.userId !== actorUserId)
69
+ throw new Error("forbidden");
70
+ return tasks.delete(id);
71
+ },
72
+ };
73
+ return store;
74
+ }
75
+ //# sourceMappingURL=memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type SqliteStatement = {
2
+ run(...params: unknown[]): unknown;
3
+ get(...params: unknown[]): unknown;
4
+ all(...params: unknown[]): unknown[];
5
+ };
6
+ export type SqliteDatabase = {
7
+ exec(sql: string): unknown;
8
+ prepare(sql: string): SqliteStatement;
9
+ close?: () => void;
10
+ };
11
+ export type OpenSqliteDatabase = (path: string) => SqliteDatabase;
12
+ export declare function openNodeSqliteDatabase(dbPath: string): SqliteDatabase;
13
+ //# sourceMappingURL=sqlite-driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-driver.d.ts","sourceRoot":"","sources":["../src/sqlite-driver.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACnC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACnC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,cAAc,CAAC;AAElE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAmBrE"}
@@ -0,0 +1,13 @@
1
+ /** Driver SQLite minimal — @creezio/tasks (I3). */
2
+ import { createAppRequire } from "@creezio/platform-core";
3
+ export function openNodeSqliteDatabase(dbPath) {
4
+ const require = createAppRequire();
5
+ const mod = require("node:sqlite");
6
+ const db = new mod.DatabaseSync(dbPath);
7
+ return {
8
+ exec: (sql) => db.exec(sql),
9
+ prepare: (sql) => db.prepare(sql),
10
+ close: () => db.close(),
11
+ };
12
+ }
13
+ //# sourceMappingURL=sqlite-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-driver.js","sourceRoot":"","sources":["../src/sqlite-driver.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAgB1D,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAUhC,CAAC;IACF,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO;QACL,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;QACjC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Store tasks plateforme — sqlite **core** (Phase I3).
3
+ */
4
+ import { type PlatformTasksStore } from "./types.js";
5
+ import { type OpenSqliteDatabase } from "./sqlite-driver.js";
6
+ export type SqliteTasksStore = PlatformTasksStore & {
7
+ close(): void;
8
+ readonly dbPath: string;
9
+ };
10
+ export type CreateSqliteTasksStoreOptions = {
11
+ coreDbPath: string;
12
+ openDatabase?: OpenSqliteDatabase;
13
+ };
14
+ export declare function createSqliteTasksStore(opts: CreateSqliteTasksStoreOptions): SqliteTasksStore;
15
+ //# sourceMappingURL=sqlite-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../src/sqlite-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAA8C,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACjG,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AA4B5B,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG;IAClD,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,6BAA6B,GAClC,gBAAgB,CA4GlB"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Store tasks plateforme — sqlite **core** (Phase I3).
3
+ */
4
+ import crypto from "node:crypto";
5
+ import { PLATFORM_TASKS_CORE_SQL } from "./types.js";
6
+ import { openNodeSqliteDatabase, } from "./sqlite-driver.js";
7
+ function now() {
8
+ return new Date().toISOString();
9
+ }
10
+ function fromRow(r) {
11
+ return {
12
+ id: r.id,
13
+ userId: r.user_id,
14
+ title: r.title,
15
+ body: r.body,
16
+ status: r.status,
17
+ createdAt: r.created_at,
18
+ updatedAt: r.updated_at,
19
+ };
20
+ }
21
+ export function createSqliteTasksStore(opts) {
22
+ const open = opts.openDatabase || openNodeSqliteDatabase;
23
+ const db = open(opts.coreDbPath);
24
+ db.exec(PLATFORM_TASKS_CORE_SQL);
25
+ const store = {
26
+ dbPath: opts.coreDbPath,
27
+ close() {
28
+ db.close?.();
29
+ },
30
+ create(input) {
31
+ return store.upsertWithId({
32
+ id: crypto.randomUUID(),
33
+ userId: input.userId,
34
+ title: input.title,
35
+ body: input.body,
36
+ status: "open",
37
+ });
38
+ },
39
+ upsertWithId(input) {
40
+ const ts = now();
41
+ const existing = store.get(input.id);
42
+ const t = {
43
+ id: input.id,
44
+ userId: input.userId,
45
+ title: input.title.trim(),
46
+ body: input.body || "",
47
+ status: input.status || existing?.status || "open",
48
+ createdAt: existing?.createdAt || ts,
49
+ updatedAt: ts,
50
+ };
51
+ if (!t.title)
52
+ throw new Error("title_required");
53
+ db.prepare(`INSERT INTO creezio_platform_tasks
54
+ (id, user_id, title, body, status, created_at, updated_at)
55
+ VALUES (?, ?, ?, ?, ?, ?, ?)
56
+ ON CONFLICT(id) DO UPDATE SET
57
+ user_id = excluded.user_id,
58
+ title = excluded.title,
59
+ body = excluded.body,
60
+ status = excluded.status,
61
+ updated_at = excluded.updated_at`).run(t.id, t.userId, t.title, t.body, t.status, t.createdAt, t.updatedAt);
62
+ return t;
63
+ },
64
+ list(userId) {
65
+ const rows = db
66
+ .prepare(`SELECT * FROM creezio_platform_tasks WHERE user_id = ?
67
+ ORDER BY updated_at DESC`)
68
+ .all(userId);
69
+ return rows.map(fromRow);
70
+ },
71
+ get(id) {
72
+ const row = db
73
+ .prepare(`SELECT * FROM creezio_platform_tasks WHERE id = ?`)
74
+ .get(id);
75
+ return row ? fromRow(row) : undefined;
76
+ },
77
+ update(id, patch, actorUserId) {
78
+ const t = store.get(id);
79
+ if (!t)
80
+ throw new Error("not_found");
81
+ if (t.userId !== actorUserId)
82
+ throw new Error("forbidden");
83
+ const updated = {
84
+ ...t,
85
+ ...("title" in patch && patch.title !== undefined
86
+ ? { title: patch.title }
87
+ : {}),
88
+ ...("body" in patch && patch.body !== undefined
89
+ ? { body: patch.body }
90
+ : {}),
91
+ ...("status" in patch && patch.status !== undefined
92
+ ? { status: patch.status }
93
+ : {}),
94
+ updatedAt: now(),
95
+ };
96
+ db.prepare(`UPDATE creezio_platform_tasks
97
+ SET title = ?, body = ?, status = ?, updated_at = ?
98
+ WHERE id = ?`).run(updated.title, updated.body, updated.status, updated.updatedAt, id);
99
+ return updated;
100
+ },
101
+ remove(id, actorUserId) {
102
+ const t = store.get(id);
103
+ if (!t)
104
+ return false;
105
+ if (t.userId !== actorUserId)
106
+ throw new Error("forbidden");
107
+ db.prepare(`DELETE FROM creezio_platform_tasks WHERE id = ?`).run(id);
108
+ return true;
109
+ },
110
+ };
111
+ return store;
112
+ }
113
+ //# sourceMappingURL=sqlite-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.js","sourceRoot":"","sources":["../src/sqlite-store.ts"],"names":[],"mappings":"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"}