@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,558 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent LLM d'un collaborateur IA — exécute une tâche du kanban dans SON
|
|
3
|
+
* workspace Electron (partition dédiée, fake-cursor visible via « Voir
|
|
4
|
+
* comme IA »), avec les ACL de SON persona (jamais celles de l'owner).
|
|
5
|
+
*
|
|
6
|
+
* Outils : navigation CRM, inspection/action UI (UiDriver), onglets web,
|
|
7
|
+
* délégation Hermes (sous-tâche), HITL, fin de tâche explicite (D4 :
|
|
8
|
+
* `done` seulement sur finish_task(success=true)).
|
|
9
|
+
*/
|
|
10
|
+
import { callOpenAiModel, runAgentLoop, } from "@creezio/assistant";
|
|
11
|
+
import { defaultModel } from "@creezio/assistant";
|
|
12
|
+
import { dispatchSupplierAction } from "@creezio/assistant";
|
|
13
|
+
import { requireTasksBrand, tasksEnv, tasksEnvNumber, } from "./brand/config.js";
|
|
14
|
+
import { createTask } from "./kanban-service.js";
|
|
15
|
+
function navigateAiWorkspace(opts) {
|
|
16
|
+
return requireTasksBrand().workspace.navigate(opts);
|
|
17
|
+
}
|
|
18
|
+
function openTabInAiWorkspace(opts) {
|
|
19
|
+
return requireTasksBrand().workspace.openTab(opts);
|
|
20
|
+
}
|
|
21
|
+
function listTabsInAiWorkspace(opts) {
|
|
22
|
+
return requireTasksBrand().workspace.listTabs(opts);
|
|
23
|
+
}
|
|
24
|
+
function webActionInAiWorkspace(opts) {
|
|
25
|
+
return requireTasksBrand().workspace.webAction(opts);
|
|
26
|
+
}
|
|
27
|
+
function hasPermission(permissions, required) {
|
|
28
|
+
return requireTasksBrand().navigation.hasPermission(permissions, required);
|
|
29
|
+
}
|
|
30
|
+
function permissionForPath(pathname) {
|
|
31
|
+
return requireTasksBrand().navigation.permissionForPath(pathname);
|
|
32
|
+
}
|
|
33
|
+
function resolveOpenTabRequest(input) {
|
|
34
|
+
return requireTasksBrand().externalTabs.resolve(input);
|
|
35
|
+
}
|
|
36
|
+
function toSupplierOpenTabParams(resolved) {
|
|
37
|
+
const { ok: _ok, ...rest } = resolved;
|
|
38
|
+
void _ok;
|
|
39
|
+
return requireTasksBrand().externalTabs.toWorkspaceParams(rest);
|
|
40
|
+
}
|
|
41
|
+
/** Stub LLM injectable par les tests (sinon OpenAI BYOK). */
|
|
42
|
+
let modelCallerOverride = null;
|
|
43
|
+
export function setAiTaskModelCaller(fn) {
|
|
44
|
+
modelCallerOverride = fn;
|
|
45
|
+
}
|
|
46
|
+
/** Un modèle est disponible (BYOK OpenAI ou stub de test). */
|
|
47
|
+
export function hasAiAgentModel() {
|
|
48
|
+
if (modelCallerOverride)
|
|
49
|
+
return true;
|
|
50
|
+
return Boolean((process.env.OPENAI_API_KEY || "").trim());
|
|
51
|
+
}
|
|
52
|
+
export function aiTaskModel() {
|
|
53
|
+
return tasksEnv("MODEL") || defaultModel();
|
|
54
|
+
}
|
|
55
|
+
export function aiTaskMaxSteps() {
|
|
56
|
+
const raw = tasksEnvNumber("MAX_STEPS", 20);
|
|
57
|
+
return Number.isFinite(raw) && raw > 0 ? Math.min(raw, 60) : 20;
|
|
58
|
+
}
|
|
59
|
+
export function aiTaskTimeoutMs() {
|
|
60
|
+
const raw = tasksEnvNumber("RUN_TIMEOUT_MS", 10 * 60 * 1000);
|
|
61
|
+
return Number.isFinite(raw) && raw > 10_000 ? raw : 10 * 60 * 1000;
|
|
62
|
+
}
|
|
63
|
+
export function aiTaskMaxTokens() {
|
|
64
|
+
const raw = tasksEnvNumber("MAX_TOKENS", 150_000);
|
|
65
|
+
return Number.isFinite(raw) && raw > 1000 ? raw : 150_000;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Allowlist optionnelle des hôtes web accessibles à l'agent
|
|
69
|
+
* (${requireTasksBrand().envPrefix}_WEB_ALLOWED_HOSTS, CSV, sous-domaines inclus). Vide = tout https.
|
|
70
|
+
*/
|
|
71
|
+
function aiWebAllowedHosts() {
|
|
72
|
+
const raw = tasksEnv("WEB_ALLOWED_HOSTS");
|
|
73
|
+
if (!raw)
|
|
74
|
+
return null;
|
|
75
|
+
const hosts = raw
|
|
76
|
+
.split(",")
|
|
77
|
+
.map((h) => h.trim().toLowerCase().replace(/^\*\./, ""))
|
|
78
|
+
.filter(Boolean);
|
|
79
|
+
return hosts.length ? hosts : null;
|
|
80
|
+
}
|
|
81
|
+
export function aiWebHostAllowed(url) {
|
|
82
|
+
const allowed = aiWebAllowedHosts();
|
|
83
|
+
if (!allowed)
|
|
84
|
+
return { ok: true };
|
|
85
|
+
let host = "";
|
|
86
|
+
try {
|
|
87
|
+
host = new URL(url).hostname.toLowerCase();
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return { ok: false, error: "URL invalide" };
|
|
91
|
+
}
|
|
92
|
+
const match = allowed.some((h) => host === h || host.endsWith(`.${h}`));
|
|
93
|
+
return match
|
|
94
|
+
? { ok: true }
|
|
95
|
+
: {
|
|
96
|
+
ok: false,
|
|
97
|
+
error: `Hôte « ${host} » hors de l'allowlist ${requireTasksBrand().envPrefix}_WEB_ALLOWED_HOSTS — demande à l'humain si nécessaire`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function buildSystemPrompt(ctx) {
|
|
101
|
+
const perms = ctx.assignee.permissions || [];
|
|
102
|
+
const brand = requireTasksBrand();
|
|
103
|
+
return `Tu es « ${ctx.assignee.username} », collaborateur IA de ${brand.productName} (${brand.productDomain}).
|
|
104
|
+
Tu travailles dans TON espace de travail dédié (l'utilisateur peut t'observer via « Voir comme IA »).
|
|
105
|
+
|
|
106
|
+
## Ta mission
|
|
107
|
+
Exécute la tâche du kanban qui t'est assignée, puis termine par \`finish_task\`.
|
|
108
|
+
|
|
109
|
+
## Règles
|
|
110
|
+
- Tu as les permissions d'un collaborateur : ${perms.length ? perms.join(", ") : "(aucune)"}. Les navigations hors permission sont refusées — n'insiste pas, note la limite.
|
|
111
|
+
- Travaille par petites étapes : \`navigate\` vers la page utile, \`list_targets\` pour voir la page, \`click\` / \`type_text\` pour agir, re-\`list_targets\` pour vérifier l'effet.
|
|
112
|
+
- SITES WEB EXTERNES (fournisseurs, banques, outils SaaS) : \`open_tab\` pour ouvrir l'URL, puis les outils \`web_*\` (web_list_targets, web_click, web_type, web_scroll, web_read, web_screenshot). Les outils sans préfixe web_ ne pilotent QUE les pages CRM.
|
|
113
|
+
- Les onglets web utilisent TA session à toi (partition isolée). Si une page te demande de te connecter, présente un captcha, une 2FA, ou si une action est risquée/irréversible (paiement, envoi, suppression) : \`ask_human\` — ne tente JAMAIS de contourner.
|
|
114
|
+
- \`web_screenshot\` est utile quand \`web_list_targets\`/\`web_read\` ne suffisent pas (mise en page complexe, vérification visuelle). Utilise-le avec parcimonie.
|
|
115
|
+
- Pour une mission longue, un scraping web lourd ou une automation backend : délègue à l'agent central via \`delegate_to_hermes\` (crée une sous-tâche liée) et mentionne-le dans ton résumé.
|
|
116
|
+
- Si tu as besoin d'une décision ou validation humaine : \`ask_human\` (le run est mis en pause).
|
|
117
|
+
- OBLIGATOIRE : termine TOUJOURS par \`finish_task(success, summary)\`. success=true seulement si la mission est réellement accomplie ; sinon success=false avec le motif précis. Jamais de succès de complaisance.
|
|
118
|
+
- Réponds en français.
|
|
119
|
+
|
|
120
|
+
## Contexte
|
|
121
|
+
- Kanban des tâches : ${brand.taskHref}
|
|
122
|
+
- Titre de ta tâche : ${ctx.task.title}`;
|
|
123
|
+
}
|
|
124
|
+
function buildUserPrompt(ctx) {
|
|
125
|
+
return [
|
|
126
|
+
`Tâche : ${ctx.task.title}`,
|
|
127
|
+
ctx.task.body?.trim() ? `\nBrief :\n${ctx.task.body.trim()}` : "",
|
|
128
|
+
`\nPriorité : ${ctx.task.priority}`,
|
|
129
|
+
]
|
|
130
|
+
.filter(Boolean)
|
|
131
|
+
.join("\n");
|
|
132
|
+
}
|
|
133
|
+
function uiAction(ctx, uiType, uiParams) {
|
|
134
|
+
return dispatchSupplierAction("ai_workspace_ui_action", {
|
|
135
|
+
ai_user_id: ctx.assignee.id,
|
|
136
|
+
ui_type: uiType,
|
|
137
|
+
ui_params: uiParams,
|
|
138
|
+
}, undefined, { targetUserId: ctx.hostUserId, requireTargetOnline: true });
|
|
139
|
+
}
|
|
140
|
+
function webAction(ctx, webType, params, tabId) {
|
|
141
|
+
return webActionInAiWorkspace({
|
|
142
|
+
aiUserId: ctx.assignee.id,
|
|
143
|
+
hostUserId: ctx.hostUserId,
|
|
144
|
+
webType,
|
|
145
|
+
tabId,
|
|
146
|
+
params,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
const optStr = (v) => v != null && String(v) ? String(v) : undefined;
|
|
150
|
+
export function buildAiTaskTools(ctx) {
|
|
151
|
+
const perms = ctx.assignee.permissions || [];
|
|
152
|
+
return [
|
|
153
|
+
{
|
|
154
|
+
definition: {
|
|
155
|
+
type: "function",
|
|
156
|
+
function: {
|
|
157
|
+
name: "navigate",
|
|
158
|
+
description: "Navigue vers une page CRM dans TON espace (fake-cursor visible). Chemins relatifs : /taches, /produits, /marketplaces, /panier…",
|
|
159
|
+
parameters: {
|
|
160
|
+
type: "object",
|
|
161
|
+
properties: {
|
|
162
|
+
path: { type: "string", description: "Chemin CRM (ex. /produits)" },
|
|
163
|
+
},
|
|
164
|
+
required: ["path"],
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
execute: async (args) => {
|
|
169
|
+
const path = String(args.path || "").trim();
|
|
170
|
+
if (!path.startsWith("/")) {
|
|
171
|
+
return { ok: false, error: "path CRM requis (ex. /produits)" };
|
|
172
|
+
}
|
|
173
|
+
const needed = permissionForPath(path);
|
|
174
|
+
if (!hasPermission(perms, needed)) {
|
|
175
|
+
return {
|
|
176
|
+
ok: false,
|
|
177
|
+
error: `Permission manquante pour ${path} (${needed}) — hors de ton périmètre`,
|
|
178
|
+
code: "acl_denied",
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return navigateAiWorkspace({
|
|
182
|
+
aiUserId: ctx.assignee.id,
|
|
183
|
+
hostUserId: ctx.hostUserId,
|
|
184
|
+
href: path,
|
|
185
|
+
});
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
definition: {
|
|
190
|
+
type: "function",
|
|
191
|
+
function: {
|
|
192
|
+
name: "list_targets",
|
|
193
|
+
description: "Inventaire des éléments actionnables de la page CRM courante de TON espace (refs t1, t2… pour click/type_text). À rappeler après chaque action pour voir l'état.",
|
|
194
|
+
parameters: {
|
|
195
|
+
type: "object",
|
|
196
|
+
properties: {
|
|
197
|
+
q: { type: "string", description: "Filtre optionnel sur les libellés" },
|
|
198
|
+
},
|
|
199
|
+
required: [],
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
execute: (args) => uiAction(ctx, "list_targets", {
|
|
204
|
+
q: args.q != null ? String(args.q) : undefined,
|
|
205
|
+
}),
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
definition: {
|
|
209
|
+
type: "function",
|
|
210
|
+
function: {
|
|
211
|
+
name: "click",
|
|
212
|
+
description: "Clique un élément via la souris virtuelle (ref de list_targets prioritaire, sinon libellé exact).",
|
|
213
|
+
parameters: {
|
|
214
|
+
type: "object",
|
|
215
|
+
properties: {
|
|
216
|
+
ref: { type: "string", description: "Ref (ex. t12)" },
|
|
217
|
+
label: { type: "string", description: "Libellé visible si ref inconnue" },
|
|
218
|
+
},
|
|
219
|
+
required: [],
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
execute: (args) => uiAction(ctx, "click", {
|
|
224
|
+
ref: args.ref != null ? String(args.ref) : undefined,
|
|
225
|
+
label: args.label != null ? String(args.label) : undefined,
|
|
226
|
+
}),
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
definition: {
|
|
230
|
+
type: "function",
|
|
231
|
+
function: {
|
|
232
|
+
name: "type_text",
|
|
233
|
+
description: "Tape du texte dans un champ visible (clic + frappe simulée).",
|
|
234
|
+
parameters: {
|
|
235
|
+
type: "object",
|
|
236
|
+
properties: {
|
|
237
|
+
ref: { type: "string" },
|
|
238
|
+
label: { type: "string" },
|
|
239
|
+
text: { type: "string" },
|
|
240
|
+
submit: { type: "boolean", description: "Entrée après la frappe" },
|
|
241
|
+
},
|
|
242
|
+
required: ["text"],
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
execute: (args) => uiAction(ctx, "type", {
|
|
247
|
+
ref: args.ref != null ? String(args.ref) : undefined,
|
|
248
|
+
label: args.label != null ? String(args.label) : undefined,
|
|
249
|
+
text: String(args.text || ""),
|
|
250
|
+
submit: args.submit === true,
|
|
251
|
+
}),
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
definition: {
|
|
255
|
+
type: "function",
|
|
256
|
+
function: {
|
|
257
|
+
name: "scroll",
|
|
258
|
+
description: "Fait défiler la page de TON espace (révéler des éléments).",
|
|
259
|
+
parameters: {
|
|
260
|
+
type: "object",
|
|
261
|
+
properties: {
|
|
262
|
+
direction: { type: "string", enum: ["up", "down"] },
|
|
263
|
+
},
|
|
264
|
+
required: ["direction"],
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
execute: (args) => uiAction(ctx, "scroll", {
|
|
269
|
+
direction: args.direction === "up" ? "up" : "down",
|
|
270
|
+
}),
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
definition: {
|
|
274
|
+
type: "function",
|
|
275
|
+
function: {
|
|
276
|
+
name: "open_tab",
|
|
277
|
+
description: "Ouvre une URL web (https) dans un onglet de TON espace (sites fournisseurs, docs).",
|
|
278
|
+
parameters: {
|
|
279
|
+
type: "object",
|
|
280
|
+
properties: {
|
|
281
|
+
url: { type: "string" },
|
|
282
|
+
title: { type: "string" },
|
|
283
|
+
},
|
|
284
|
+
required: ["url"],
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
execute: async (args) => {
|
|
289
|
+
const url = String(args.url || "");
|
|
290
|
+
const allowed = aiWebHostAllowed(url);
|
|
291
|
+
if (!allowed.ok) {
|
|
292
|
+
return { ok: false, error: allowed.error, code: "host_not_allowed" };
|
|
293
|
+
}
|
|
294
|
+
const resolved = resolveOpenTabRequest({
|
|
295
|
+
url,
|
|
296
|
+
title: args.title != null ? String(args.title) : undefined,
|
|
297
|
+
});
|
|
298
|
+
if (!resolved.ok) {
|
|
299
|
+
return { ok: false, error: resolved.error || "URL refusée" };
|
|
300
|
+
}
|
|
301
|
+
return openTabInAiWorkspace({
|
|
302
|
+
aiUserId: ctx.assignee.id,
|
|
303
|
+
hostUserId: ctx.hostUserId,
|
|
304
|
+
params: toSupplierOpenTabParams(resolved),
|
|
305
|
+
});
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
definition: {
|
|
310
|
+
type: "function",
|
|
311
|
+
function: {
|
|
312
|
+
name: "list_tabs",
|
|
313
|
+
description: "Liste les onglets ouverts dans TON espace.",
|
|
314
|
+
parameters: { type: "object", properties: {}, required: [] },
|
|
315
|
+
},
|
|
316
|
+
},
|
|
317
|
+
execute: () => listTabsInAiWorkspace({
|
|
318
|
+
aiUserId: ctx.assignee.id,
|
|
319
|
+
hostUserId: ctx.hostUserId,
|
|
320
|
+
}),
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
definition: {
|
|
324
|
+
type: "function",
|
|
325
|
+
function: {
|
|
326
|
+
name: "web_list_targets",
|
|
327
|
+
description: "Inventaire des éléments actionnables de l'onglet WEB actif de TON espace (refs s1-1, s1-2… pour web_click/web_type). À rappeler après chaque action web.",
|
|
328
|
+
parameters: {
|
|
329
|
+
type: "object",
|
|
330
|
+
properties: {
|
|
331
|
+
q: { type: "string", description: "Filtre optionnel sur les libellés" },
|
|
332
|
+
tab_id: { type: "string", description: "Onglet ciblé (défaut : actif)" },
|
|
333
|
+
},
|
|
334
|
+
required: [],
|
|
335
|
+
},
|
|
336
|
+
},
|
|
337
|
+
},
|
|
338
|
+
execute: (args) => webAction(ctx, "external_list_targets", { q: optStr(args.q) }, optStr(args.tab_id)),
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
definition: {
|
|
342
|
+
type: "function",
|
|
343
|
+
function: {
|
|
344
|
+
name: "web_click",
|
|
345
|
+
description: "Clique un élément de l'onglet web actif (clic trusted via CDP). ref de web_list_targets prioritaire, sinon libellé visible.",
|
|
346
|
+
parameters: {
|
|
347
|
+
type: "object",
|
|
348
|
+
properties: {
|
|
349
|
+
ref: { type: "string", description: "Ref (ex. s1-12)" },
|
|
350
|
+
label: { type: "string", description: "Libellé visible si ref inconnue" },
|
|
351
|
+
tab_id: { type: "string" },
|
|
352
|
+
},
|
|
353
|
+
required: [],
|
|
354
|
+
},
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
execute: (args) => webAction(ctx, "external_click", { ref: optStr(args.ref), label: optStr(args.label) }, optStr(args.tab_id)),
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
definition: {
|
|
361
|
+
type: "function",
|
|
362
|
+
function: {
|
|
363
|
+
name: "web_type",
|
|
364
|
+
description: "Tape du texte dans un champ de l'onglet web actif (clic + frappe trusted, champ vidé avant).",
|
|
365
|
+
parameters: {
|
|
366
|
+
type: "object",
|
|
367
|
+
properties: {
|
|
368
|
+
ref: { type: "string" },
|
|
369
|
+
label: { type: "string" },
|
|
370
|
+
text: { type: "string" },
|
|
371
|
+
submit: { type: "boolean", description: "Entrée après la frappe" },
|
|
372
|
+
tab_id: { type: "string" },
|
|
373
|
+
},
|
|
374
|
+
required: ["text"],
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
execute: (args) => webAction(ctx, "external_type", {
|
|
379
|
+
ref: optStr(args.ref),
|
|
380
|
+
label: optStr(args.label),
|
|
381
|
+
text: String(args.text || ""),
|
|
382
|
+
submit: args.submit === true,
|
|
383
|
+
}, optStr(args.tab_id)),
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
definition: {
|
|
387
|
+
type: "function",
|
|
388
|
+
function: {
|
|
389
|
+
name: "web_scroll",
|
|
390
|
+
description: "Fait défiler l'onglet web actif (révéler des éléments).",
|
|
391
|
+
parameters: {
|
|
392
|
+
type: "object",
|
|
393
|
+
properties: {
|
|
394
|
+
direction: { type: "string", enum: ["up", "down"] },
|
|
395
|
+
tab_id: { type: "string" },
|
|
396
|
+
},
|
|
397
|
+
required: ["direction"],
|
|
398
|
+
},
|
|
399
|
+
},
|
|
400
|
+
},
|
|
401
|
+
execute: (args) => webAction(ctx, "external_scroll", { direction: args.direction === "up" ? "up" : "down" }, optStr(args.tab_id)),
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
definition: {
|
|
405
|
+
type: "function",
|
|
406
|
+
function: {
|
|
407
|
+
name: "web_read",
|
|
408
|
+
description: "Lit le texte visible de l'onglet web actif (option q : blocs autour des lignes qui matchent).",
|
|
409
|
+
parameters: {
|
|
410
|
+
type: "object",
|
|
411
|
+
properties: {
|
|
412
|
+
q: { type: "string", description: "Filtre contextuel optionnel" },
|
|
413
|
+
max_chars: { type: "number", description: "Plafond de texte (défaut 6000)" },
|
|
414
|
+
tab_id: { type: "string" },
|
|
415
|
+
},
|
|
416
|
+
required: [],
|
|
417
|
+
},
|
|
418
|
+
},
|
|
419
|
+
},
|
|
420
|
+
execute: (args) => webAction(ctx, "external_read", {
|
|
421
|
+
q: optStr(args.q),
|
|
422
|
+
maxChars: typeof args.max_chars === "number" ? args.max_chars : undefined,
|
|
423
|
+
}, optStr(args.tab_id)),
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
definition: {
|
|
427
|
+
type: "function",
|
|
428
|
+
function: {
|
|
429
|
+
name: "web_screenshot",
|
|
430
|
+
description: "Capture d'écran de l'onglet web actif, jointe en image à la conversation (vision). À utiliser quand web_list_targets/web_read ne suffisent pas.",
|
|
431
|
+
parameters: {
|
|
432
|
+
type: "object",
|
|
433
|
+
properties: {
|
|
434
|
+
tab_id: { type: "string" },
|
|
435
|
+
},
|
|
436
|
+
required: [],
|
|
437
|
+
},
|
|
438
|
+
},
|
|
439
|
+
},
|
|
440
|
+
execute: (args) => webAction(ctx, "external_screenshot", {}, optStr(args.tab_id)),
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
definition: {
|
|
444
|
+
type: "function",
|
|
445
|
+
function: {
|
|
446
|
+
name: "delegate_to_hermes",
|
|
447
|
+
description: "Délègue une sous-mission à l'agent central Hermes (scraping lourd, batch, automation backend). Crée une sous-tâche liée sur /taches.",
|
|
448
|
+
parameters: {
|
|
449
|
+
type: "object",
|
|
450
|
+
properties: {
|
|
451
|
+
title: { type: "string", description: "Titre court de la sous-mission" },
|
|
452
|
+
body: { type: "string", description: "Consignes détaillées pour Hermes" },
|
|
453
|
+
},
|
|
454
|
+
required: ["title"],
|
|
455
|
+
},
|
|
456
|
+
},
|
|
457
|
+
},
|
|
458
|
+
execute: async (args) => {
|
|
459
|
+
const title = String(args.title || "").trim();
|
|
460
|
+
if (!title)
|
|
461
|
+
return { ok: false, error: "title requis" };
|
|
462
|
+
const { task, hermes, warning } = await createTask({
|
|
463
|
+
title,
|
|
464
|
+
body: args.body != null ? String(args.body) : "",
|
|
465
|
+
executorKind: "hermes",
|
|
466
|
+
parentTaskId: ctx.task.id,
|
|
467
|
+
createdBy: ctx.assignee.id,
|
|
468
|
+
source: "assistant",
|
|
469
|
+
idempotencyKey: `run:${ctx.runId}:${title.slice(0, 60)}`,
|
|
470
|
+
});
|
|
471
|
+
return {
|
|
472
|
+
ok: true,
|
|
473
|
+
subtask_id: task.id,
|
|
474
|
+
status: task.status,
|
|
475
|
+
hermes_task_id: hermes?.id || null,
|
|
476
|
+
warning: warning || null,
|
|
477
|
+
};
|
|
478
|
+
},
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
definition: {
|
|
482
|
+
type: "function",
|
|
483
|
+
function: {
|
|
484
|
+
name: "ask_human",
|
|
485
|
+
description: "Pose une question à l'humain et met le run en pause (HITL) jusqu'à sa réponse. À utiliser avant toute action risquée ou ambiguë.",
|
|
486
|
+
parameters: {
|
|
487
|
+
type: "object",
|
|
488
|
+
properties: {
|
|
489
|
+
question: { type: "string" },
|
|
490
|
+
},
|
|
491
|
+
required: ["question"],
|
|
492
|
+
},
|
|
493
|
+
},
|
|
494
|
+
},
|
|
495
|
+
execute: async (args) => {
|
|
496
|
+
const question = String(args.question || "").trim() || "Validation requise.";
|
|
497
|
+
const res = await ctx.askHuman(question);
|
|
498
|
+
if (res.outcome === "resumed") {
|
|
499
|
+
return { ok: true, response: res.response || "ok" };
|
|
500
|
+
}
|
|
501
|
+
return {
|
|
502
|
+
ok: false,
|
|
503
|
+
error: res.outcome === "timeout"
|
|
504
|
+
? "Pas de réponse humaine (timeout HITL)"
|
|
505
|
+
: "Run annulé pendant l'attente humaine",
|
|
506
|
+
code: `hitl_${res.outcome}`,
|
|
507
|
+
};
|
|
508
|
+
},
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
definition: {
|
|
512
|
+
type: "function",
|
|
513
|
+
function: {
|
|
514
|
+
name: "finish_task",
|
|
515
|
+
description: "Termine le run. success=true UNIQUEMENT si la mission est réellement accomplie ; sinon success=false + motif.",
|
|
516
|
+
parameters: {
|
|
517
|
+
type: "object",
|
|
518
|
+
properties: {
|
|
519
|
+
success: { type: "boolean" },
|
|
520
|
+
summary: { type: "string", description: "Résumé factuel du travail" },
|
|
521
|
+
},
|
|
522
|
+
required: ["success", "summary"],
|
|
523
|
+
},
|
|
524
|
+
},
|
|
525
|
+
},
|
|
526
|
+
terminal: true,
|
|
527
|
+
execute: async (args) => ({
|
|
528
|
+
ok: true,
|
|
529
|
+
success: args.success === true,
|
|
530
|
+
summary: String(args.summary || ""),
|
|
531
|
+
}),
|
|
532
|
+
},
|
|
533
|
+
];
|
|
534
|
+
}
|
|
535
|
+
/** Déroule la boucle LLM pour un run. Ne lève pas (statuts explicites). */
|
|
536
|
+
export async function runAiTaskAgent(ctx) {
|
|
537
|
+
const loop = await runAgentLoop({
|
|
538
|
+
model: aiTaskModel(),
|
|
539
|
+
systemPrompt: buildSystemPrompt(ctx),
|
|
540
|
+
userPrompt: buildUserPrompt(ctx),
|
|
541
|
+
tools: buildAiTaskTools(ctx),
|
|
542
|
+
maxSteps: aiTaskMaxSteps(),
|
|
543
|
+
timeoutMs: aiTaskTimeoutMs(),
|
|
544
|
+
maxTokens: aiTaskMaxTokens(),
|
|
545
|
+
signal: ctx.signal,
|
|
546
|
+
onStep: ctx.onStep,
|
|
547
|
+
callModel: modelCallerOverride || callOpenAiModel,
|
|
548
|
+
});
|
|
549
|
+
const success = loop.status === "finished" && loop.terminal?.success === true;
|
|
550
|
+
const summary = (loop.status === "finished" && typeof loop.terminal?.summary === "string"
|
|
551
|
+
? loop.terminal.summary
|
|
552
|
+
: "") ||
|
|
553
|
+
(loop.status === "finished"
|
|
554
|
+
? "Run terminé sans résumé"
|
|
555
|
+
: `Run interrompu (${loop.status}${loop.error ? ` — ${loop.error}` : ""})`);
|
|
556
|
+
return { loop, success, summary };
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=ai-task-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-task-agent.js","sourceRoot":"","sources":["../src/ai-task-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { type Task } from "./kanban-service.js";
|
|
2
|
+
import { type TaskRunRow } from "./task-runs.js";
|
|
3
|
+
/** Kill switch runner (`${envPrefix}_RUNNER_ENABLED=0` pour désactiver). */
|
|
4
|
+
export declare function aiRunnerEnabled(): boolean;
|
|
5
|
+
export declare function hostBridgeReady(): boolean;
|
|
6
|
+
export declare function resolveHostTargetUserId(): string | null;
|
|
7
|
+
/**
|
|
8
|
+
* Quotas journaliers (minuit UTC) : ${requireTasksBrand().envPrefix}_MAX_RUNS_PER_DAY (nombre de runs
|
|
9
|
+
* créés) et ${requireTasksBrand().envPrefix}_MAX_TOKENS_PER_DAY (tokens LLM consommés). Non configurés
|
|
10
|
+
* = illimité.
|
|
11
|
+
*/
|
|
12
|
+
export declare function checkAiRunQuotas(): {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
reason?: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Enfile un run si la tâche (executor ai) est assignée à une IA active.
|
|
18
|
+
* Retourne le run (existant ou nouveau) ou null si non applicable.
|
|
19
|
+
* Lève `quota_exceeded: …` si un quota journalier est atteint.
|
|
20
|
+
*/
|
|
21
|
+
export declare function enqueueAiRunForTask(taskId: string, opts?: {
|
|
22
|
+
retryOf?: string | null;
|
|
23
|
+
}): TaskRunRow | null;
|
|
24
|
+
/**
|
|
25
|
+
* Claim et lance jusqu'à `maxConcurrent` runs en parallèle.
|
|
26
|
+
* Les runs déjà en HITL restent « running » mais ne sont pas re-claimés.
|
|
27
|
+
*/
|
|
28
|
+
export declare function processAiTaskQueue(): Promise<{
|
|
29
|
+
processed: boolean;
|
|
30
|
+
runIds?: string[];
|
|
31
|
+
/** @deprecated compat P0 */
|
|
32
|
+
runId?: string;
|
|
33
|
+
error?: string;
|
|
34
|
+
maxConcurrent?: number;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Récupération après redémarrage : les runs `running` qui n'appartiennent à
|
|
38
|
+
* aucune boucle de CE process sont orphelins (app/serveur redémarré pendant
|
|
39
|
+
* l'exécution). D4 : ils passent `failed` (motif `app_restart`) — et si la
|
|
40
|
+
* tâche est toujours `in_progress`, un nouveau run est ré-enfilé.
|
|
41
|
+
*/
|
|
42
|
+
export declare function recoverInterruptedRuns(): {
|
|
43
|
+
recovered: number;
|
|
44
|
+
requeued: number;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Parseur minimal de `recurring_schedule` pour les tâches IA :
|
|
48
|
+
* - `every 15m` / `every 2h` / `every 1d` (aussi `min`, `j`) ;
|
|
49
|
+
* - `daily@HH:MM` (heure locale serveur).
|
|
50
|
+
* Retourne une fonction « prochaine occurrence après `from` », ou null si la
|
|
51
|
+
* syntaxe n'est pas reconnue (les crons Hermes restent gérés par Hermes).
|
|
52
|
+
*/
|
|
53
|
+
export declare function parseRecurringSchedule(raw: string | null | undefined): ((from: Date) => Date) | null;
|
|
54
|
+
/**
|
|
55
|
+
* Tick récurrence (1/min) : (ré)enfile les tâches IA récurrentes échues.
|
|
56
|
+
* Première passe : initialise next_run_at sans lancer (la création a déjà
|
|
57
|
+
* lancé un premier run le cas échéant).
|
|
58
|
+
*/
|
|
59
|
+
export declare function processRecurringAiTasks(now?: Date): {
|
|
60
|
+
launched: string[];
|
|
61
|
+
scheduled: number;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Arrête les boucles runner + récurrence (teardown). Sans cet arrêt, le
|
|
65
|
+
* setInterval process-global continue de tick après la fermeture de la
|
|
66
|
+
* surface plateforme : le tick suivant jette `requireTasksBrand()` en
|
|
67
|
+
* unhandledRejection (config brand désormais absente) — vécu gate PNM.2.
|
|
68
|
+
* Un prochain appel à `ensureAiRunnerLoop` (requête tasks) relance tout.
|
|
69
|
+
*/
|
|
70
|
+
export declare function stopAiRunnerLoop(): void;
|
|
71
|
+
/** Démarre un poll léger du runner (idempotent, process-local). */
|
|
72
|
+
export declare function ensureAiRunnerLoop(intervalMs?: number): void;
|
|
73
|
+
export declare function getAiActivityForUser(userId: string): {
|
|
74
|
+
run: TaskRunRow | null;
|
|
75
|
+
task: Task | null;
|
|
76
|
+
};
|
|
77
|
+
export declare function retryFailedRun(runId: string): TaskRunRow | null;
|
|
78
|
+
//# sourceMappingURL=ai-task-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-task-runner.d.ts","sourceRoot":"","sources":["../src/ai-task-runner.ts"],"names":[],"mappings":"AAaA,OAAO,EAKL,KAAK,IAAI,EACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAcL,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAmCxB,4EAA4E;AAC5E,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED,wBAAgB,eAAe,IAAI,OAAO,CAMzC;AAED,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAKvD;AAQD;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAsBnE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACjC,UAAU,GAAG,IAAI,CAenB;AAyVD;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAClD,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC,CA8BD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAyBhF;AAID;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7B,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,CA4B/B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,IAAiB,GAAG;IAC/D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CA4BA;AAYD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CASvC;AAED,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,UAAU,SAAO,GAAG,IAAI,CAiB1D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG;IACpD,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CACnB,CAIA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAU/D"}
|