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