@grackle-ai/core 0.82.2 → 0.83.1

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 (103) hide show
  1. package/dist/codespace-handlers.d.ts +6 -0
  2. package/dist/codespace-handlers.d.ts.map +1 -0
  3. package/dist/codespace-handlers.js +66 -0
  4. package/dist/codespace-handlers.js.map +1 -0
  5. package/dist/cron-phase.d.ts +1 -1
  6. package/dist/cron-phase.d.ts.map +1 -1
  7. package/dist/cron-phase.js +1 -1
  8. package/dist/cron-phase.js.map +1 -1
  9. package/dist/environment-handlers.d.ts +16 -0
  10. package/dist/environment-handlers.d.ts.map +1 -0
  11. package/dist/environment-handlers.js +237 -0
  12. package/dist/environment-handlers.js.map +1 -0
  13. package/dist/event-bus.d.ts +1 -1
  14. package/dist/event-bus.d.ts.map +1 -1
  15. package/dist/event-bus.js.map +1 -1
  16. package/dist/event-hub.d.ts +29 -0
  17. package/dist/event-hub.d.ts.map +1 -0
  18. package/dist/event-hub.js +89 -0
  19. package/dist/event-hub.js.map +1 -0
  20. package/dist/finding-handlers.d.ts +6 -0
  21. package/dist/finding-handlers.d.ts.map +1 -0
  22. package/dist/finding-handlers.js +27 -0
  23. package/dist/finding-handlers.js.map +1 -0
  24. package/dist/grpc-mcp-config.d.ts +11 -0
  25. package/dist/grpc-mcp-config.d.ts.map +1 -0
  26. package/dist/grpc-mcp-config.js +29 -0
  27. package/dist/grpc-mcp-config.js.map +1 -0
  28. package/dist/grpc-proto-converters.d.ts +25 -0
  29. package/dist/grpc-proto-converters.d.ts.map +1 -0
  30. package/dist/grpc-proto-converters.js +193 -0
  31. package/dist/grpc-proto-converters.js.map +1 -0
  32. package/dist/grpc-service.d.ts +3 -19
  33. package/dist/grpc-service.d.ts.map +1 -1
  34. package/dist/grpc-service.js +28 -1989
  35. package/dist/grpc-service.js.map +1 -1
  36. package/dist/grpc-shared.d.ts +25 -0
  37. package/dist/grpc-shared.d.ts.map +1 -0
  38. package/dist/grpc-shared.js +110 -0
  39. package/dist/grpc-shared.js.map +1 -0
  40. package/dist/index.d.ts +4 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +4 -3
  43. package/dist/index.js.map +1 -1
  44. package/dist/knowledge-handlers.d.ts +12 -0
  45. package/dist/knowledge-handlers.d.ts.map +1 -0
  46. package/dist/knowledge-handlers.js +85 -0
  47. package/dist/knowledge-handlers.js.map +1 -0
  48. package/dist/orphan-phase.d.ts +27 -0
  49. package/dist/orphan-phase.d.ts.map +1 -0
  50. package/dist/orphan-phase.js +69 -0
  51. package/dist/orphan-phase.js.map +1 -0
  52. package/dist/persona-handlers.d.ts +12 -0
  53. package/dist/persona-handlers.d.ts.map +1 -0
  54. package/dist/persona-handlers.js +148 -0
  55. package/dist/persona-handlers.js.map +1 -0
  56. package/dist/schedule-handlers.d.ts +12 -0
  57. package/dist/schedule-handlers.d.ts.map +1 -0
  58. package/dist/schedule-handlers.js +122 -0
  59. package/dist/schedule-handlers.js.map +1 -0
  60. package/dist/session-handlers.d.ts +34 -0
  61. package/dist/session-handlers.d.ts.map +1 -0
  62. package/dist/session-handlers.js +488 -0
  63. package/dist/session-handlers.js.map +1 -0
  64. package/dist/settings-handlers.d.ts +10 -0
  65. package/dist/settings-handlers.d.ts.map +1 -0
  66. package/dist/settings-handlers.js +68 -0
  67. package/dist/settings-handlers.js.map +1 -0
  68. package/dist/signals/orphan-reparent.d.ts +30 -0
  69. package/dist/signals/orphan-reparent.d.ts.map +1 -0
  70. package/dist/signals/orphan-reparent.js +179 -0
  71. package/dist/signals/orphan-reparent.js.map +1 -0
  72. package/dist/signals/sigchld.d.ts.map +1 -1
  73. package/dist/signals/sigchld.js +4 -8
  74. package/dist/signals/sigchld.js.map +1 -1
  75. package/dist/task-handlers.d.ts +22 -0
  76. package/dist/task-handlers.d.ts.map +1 -0
  77. package/dist/task-handlers.js +463 -0
  78. package/dist/task-handlers.js.map +1 -0
  79. package/dist/task-session.d.ts +26 -0
  80. package/dist/task-session.d.ts.map +1 -0
  81. package/dist/task-session.js +132 -0
  82. package/dist/task-session.js.map +1 -0
  83. package/dist/test-utils/mock-database.d.ts +2 -0
  84. package/dist/test-utils/mock-database.d.ts.map +1 -1
  85. package/dist/test-utils/mock-database.js +2 -0
  86. package/dist/test-utils/mock-database.js.map +1 -1
  87. package/dist/token-handlers.d.ts +12 -0
  88. package/dist/token-handlers.d.ts.map +1 -0
  89. package/dist/token-handlers.js +85 -0
  90. package/dist/token-handlers.js.map +1 -0
  91. package/dist/workspace-handlers.d.ts +12 -0
  92. package/dist/workspace-handlers.d.ts.map +1 -0
  93. package/dist/workspace-handlers.js +86 -0
  94. package/dist/workspace-handlers.js.map +1 -0
  95. package/package.json +7 -9
  96. package/dist/ws-bridge.d.ts +0 -30
  97. package/dist/ws-bridge.d.ts.map +0 -1
  98. package/dist/ws-bridge.js +0 -372
  99. package/dist/ws-bridge.js.map +0 -1
  100. package/dist/ws-broadcast.d.ts +0 -19
  101. package/dist/ws-broadcast.d.ts.map +0 -1
  102. package/dist/ws-broadcast.js +0 -60
  103. package/dist/ws-broadcast.js.map +0 -1
@@ -0,0 +1,463 @@
1
+ import { ConnectError, Code } from "@connectrpc/connect";
2
+ import { create } from "@bufbuild/protobuf";
3
+ import { grackle, powerline } from "@grackle-ai/common";
4
+ import { DEFAULT_MCP_PORT, SESSION_STATUS, TERMINAL_SESSION_STATUSES, END_REASON, TASK_STATUS, ROOT_TASK_ID, ROOT_TASK_INITIAL_PROMPT, MAX_TASK_DEPTH, LOGS_DIR, taskStatusToString, } from "@grackle-ai/common";
5
+ import { envRegistry, sessionStore, taskStore, workspaceStore, grackleHome, slugify, safeParseJsonArray } from "@grackle-ai/database";
6
+ import { v4 as uuid } from "uuid";
7
+ import { join } from "node:path";
8
+ import * as adapterManager from "./adapter-manager.js";
9
+ import * as streamHub from "./stream-hub.js";
10
+ import * as streamRegistry from "./stream-registry.js";
11
+ import * as tokenPush from "./token-push.js";
12
+ import { emit } from "./event-bus.js";
13
+ import { processEventStream } from "./event-processor.js";
14
+ import * as processorRegistry from "./processor-registry.js";
15
+ import { logger } from "./logger.js";
16
+ import { resolvePersona, fetchOrchestratorContext, SystemPromptBuilder, buildTaskPrompt } from "@grackle-ai/prompt";
17
+ import { createScopedToken, loadOrCreateApiKey } from "@grackle-ai/auth";
18
+ import { cleanupLifecycleStream, ensureLifecycleStream } from "./lifecycle.js";
19
+ import { ensureAsyncDeliveryListener } from "./pipe-delivery.js";
20
+ import { transferAllPipeSubscriptions } from "./signals/orphan-reparent.js";
21
+ import { computeTaskStatus } from "./compute-task-status.js";
22
+ import { taskRowToProto, sessionRowToProto } from "./grpc-proto-converters.js";
23
+ import { validatePipeInputs, toDialableHost, resolveAncestorEnvironmentId } from "./grpc-shared.js";
24
+ import { personaMcpServersToJson } from "./grpc-mcp-config.js";
25
+ /** List tasks, optionally filtered by workspace, search query, or status. */
26
+ export async function listTasks(req) {
27
+ const rows = taskStore.listTasks(req.workspaceId || undefined, {
28
+ search: req.search || undefined,
29
+ status: req.status || undefined,
30
+ });
31
+ const childIdsMap = taskStore.buildChildIdsMap(rows);
32
+ // Batch-fetch sessions for all tasks and group by taskId
33
+ const taskIds = rows.map((r) => r.id);
34
+ const allSessions = sessionStore.listSessionsByTaskIds(taskIds);
35
+ const sessionsByTask = new Map();
36
+ for (const s of allSessions) {
37
+ const arr = sessionsByTask.get(s.taskId) ?? [];
38
+ arr.push(s);
39
+ sessionsByTask.set(s.taskId, arr);
40
+ }
41
+ return create(grackle.TaskListSchema, {
42
+ tasks: rows.map((r) => {
43
+ const taskSessions = sessionsByTask.get(r.id) ?? [];
44
+ const { status, latestSessionId } = computeTaskStatus(r.status, taskSessions);
45
+ return taskRowToProto(r, childIdsMap.get(r.id) ?? [], status, latestSessionId);
46
+ }),
47
+ });
48
+ }
49
+ /** Create a new task. */
50
+ export async function createTask(req) {
51
+ if (!req.title) {
52
+ throw new ConnectError("title is required", Code.InvalidArgument);
53
+ }
54
+ const workspaceId = req.workspaceId || undefined;
55
+ let workspace;
56
+ if (workspaceId) {
57
+ workspace = workspaceStore.getWorkspace(workspaceId);
58
+ if (!workspace) {
59
+ throw new ConnectError(`Workspace not found: ${workspaceId}`, Code.NotFound);
60
+ }
61
+ }
62
+ // Validate parent task if specified
63
+ if (req.parentTaskId) {
64
+ const parent = taskStore.getTask(req.parentTaskId);
65
+ if (!parent) {
66
+ throw new ConnectError(`Parent task not found: ${req.parentTaskId}`, Code.NotFound);
67
+ }
68
+ if (!parent.canDecompose) {
69
+ throw new ConnectError(`Parent task "${parent.title}" (${req.parentTaskId}) does not have decomposition rights`, Code.FailedPrecondition);
70
+ }
71
+ if (parent.depth + 1 > MAX_TASK_DEPTH) {
72
+ throw new ConnectError(`Task depth would exceed maximum of ${MAX_TASK_DEPTH}`, Code.FailedPrecondition);
73
+ }
74
+ }
75
+ const id = uuid().slice(0, 8);
76
+ taskStore.createTask(id, workspaceId, req.title, req.description, [...req.dependsOn], workspace ? slugify(workspace.name) : "", req.parentTaskId,
77
+ // Default to false (no decomposition rights) unless explicitly granted.
78
+ // Orchestrator/root processes that need fork() must opt in.
79
+ req.canDecompose ?? false, req.defaultPersonaId ?? "");
80
+ const row = taskStore.getTask(id);
81
+ emit("task.created", { taskId: id, workspaceId: req.workspaceId });
82
+ return taskRowToProto(row);
83
+ }
84
+ /** Get a task by ID with computed status. */
85
+ export async function getTask(req) {
86
+ const row = taskStore.getTask(req.id);
87
+ if (!row) {
88
+ throw new ConnectError(`Task not found: ${req.id}`, Code.NotFound);
89
+ }
90
+ const taskSessions = sessionStore.listSessionsForTask(req.id);
91
+ const { status, latestSessionId } = computeTaskStatus(row.status, taskSessions);
92
+ return taskRowToProto(row, undefined, status, latestSessionId);
93
+ }
94
+ /** Update task fields or late-bind a session to a task. */
95
+ export async function updateTask(req) {
96
+ const existing = taskStore.getTask(req.id);
97
+ if (!existing) {
98
+ throw new ConnectError(`Task not found: ${req.id}`, Code.NotFound);
99
+ }
100
+ let reqStatus = existing.status;
101
+ if (req.status !== grackle.TaskStatus.UNSPECIFIED) {
102
+ if (req.id === ROOT_TASK_ID) {
103
+ throw new ConnectError("Cannot change the status of the system task", Code.PermissionDenied);
104
+ }
105
+ const converted = taskStatusToString(req.status);
106
+ if (!converted) {
107
+ throw new ConnectError(`Unknown task status enum value: ${req.status}`, Code.InvalidArgument);
108
+ }
109
+ reqStatus = converted;
110
+ }
111
+ taskStore.updateTask(req.id, req.title !== "" ? req.title : existing.title, req.description !== "" ? req.description : existing.description, reqStatus, req.dependsOn.length > 0
112
+ ? [...req.dependsOn]
113
+ : safeParseJsonArray(existing.dependsOn), req.defaultPersonaId);
114
+ // Late-bind: associate an existing session with this task
115
+ if (req.sessionId !== "") {
116
+ const session = sessionStore.getSession(req.sessionId);
117
+ if (!session) {
118
+ throw new ConnectError(`Session not found: ${req.sessionId}`, Code.NotFound);
119
+ }
120
+ if (TERMINAL_SESSION_STATUSES.has(session.status)) {
121
+ throw new ConnectError(`Cannot bind terminal session ${req.sessionId} (status: ${session.status})`, Code.FailedPrecondition);
122
+ }
123
+ // Verify the processor exists before mutating DB state to avoid partial updates
124
+ if (!processorRegistry.get(req.sessionId)) {
125
+ throw new ConnectError(`No active event processor for session ${req.sessionId}`, Code.FailedPrecondition);
126
+ }
127
+ sessionStore.setSessionTask(req.sessionId, req.id);
128
+ processorRegistry.lateBind(req.sessionId, req.id, existing.workspaceId || undefined);
129
+ emit("task.started", { taskId: req.id, sessionId: req.sessionId, workspaceId: existing.workspaceId || "" });
130
+ }
131
+ emit("task.updated", { taskId: req.id, workspaceId: existing.workspaceId || "" });
132
+ const row = taskStore.getTask(req.id);
133
+ const taskSessions = sessionStore.listSessionsForTask(req.id);
134
+ const { status, latestSessionId } = computeTaskStatus(row.status, taskSessions);
135
+ return taskRowToProto(row, undefined, status, latestSessionId);
136
+ }
137
+ /** Start a task by spawning a new agent session. */
138
+ export async function startTask(req) {
139
+ const task = taskStore.getTask(req.taskId);
140
+ if (!task) {
141
+ throw new ConnectError(`Task not found: ${req.taskId}`, Code.NotFound);
142
+ }
143
+ {
144
+ const taskSessions = sessionStore.listSessionsForTask(req.taskId);
145
+ const { status: effectiveStatus } = computeTaskStatus(task.status, taskSessions);
146
+ if (req.taskId === ROOT_TASK_ID) {
147
+ // Root task is always re-startable unless actively working
148
+ if (effectiveStatus === TASK_STATUS.WORKING) {
149
+ throw new ConnectError("System is already running", Code.FailedPrecondition);
150
+ }
151
+ }
152
+ else if (![TASK_STATUS.NOT_STARTED, TASK_STATUS.FAILED].includes(effectiveStatus)) {
153
+ throw new ConnectError(`Task ${req.taskId} cannot be started (status: ${effectiveStatus})`, Code.FailedPrecondition);
154
+ }
155
+ }
156
+ if (!taskStore.areDependenciesMet(req.taskId)) {
157
+ throw new ConnectError(`Task ${req.taskId} has unmet dependencies`, Code.FailedPrecondition);
158
+ }
159
+ const workspace = task.workspaceId ? workspaceStore.getWorkspace(task.workspaceId) : undefined;
160
+ if (task.workspaceId && !workspace) {
161
+ throw new ConnectError(`Workspace not found: ${task.workspaceId}`, Code.NotFound);
162
+ }
163
+ const environmentId = req.environmentId
164
+ || resolveAncestorEnvironmentId(task.parentTaskId)
165
+ || workspace?.environmentId
166
+ || "";
167
+ if (!environmentId) {
168
+ throw new ConnectError("No environment specified for task, ancestor, or workspace", Code.FailedPrecondition);
169
+ }
170
+ const conn = adapterManager.getConnection(environmentId);
171
+ if (!conn) {
172
+ throw new ConnectError(`Environment ${environmentId} not connected`, Code.FailedPrecondition);
173
+ }
174
+ // Resolve persona via cascade (request → task → workspace → app default)
175
+ let resolved;
176
+ try {
177
+ resolved = resolvePersona(req.personaId, task.defaultPersonaId, workspace?.defaultPersonaId || "");
178
+ }
179
+ catch (err) {
180
+ throw new ConnectError(err.message, Code.FailedPrecondition);
181
+ }
182
+ // Validate pipe inputs before creating the session
183
+ validatePipeInputs(req.pipe, req.parentSessionId);
184
+ const taskPipeMode = req.pipe;
185
+ const env = envRegistry.getEnvironment(environmentId);
186
+ const sessionId = uuid();
187
+ const { runtime, model, maxTurns, systemPrompt, persona } = resolved;
188
+ const logPath = join(grackleHome, LOGS_DIR, sessionId);
189
+ // Root task always starts with the hardcoded greeting prompt; user messages
190
+ // are sent as follow-ups via sendInput. Other tasks use buildTaskPrompt.
191
+ const taskPrompt = task.id === ROOT_TASK_ID
192
+ ? ROOT_TASK_INITIAL_PROMPT
193
+ : buildTaskPrompt(task.title, task.description, req.notes);
194
+ const isOrchestrator = task.canDecompose && task.depth <= 1;
195
+ const orchestratorCtx = isOrchestrator
196
+ ? fetchOrchestratorContext(task.workspaceId || "")
197
+ : undefined;
198
+ const systemContext = new SystemPromptBuilder({
199
+ task: { title: task.title, description: task.description, notes: task.id === ROOT_TASK_ID ? "" : (req.notes || "") },
200
+ taskId: task.id,
201
+ canDecompose: task.canDecompose,
202
+ personaPrompt: systemPrompt,
203
+ taskDepth: task.depth,
204
+ workpad: task.workpad || undefined,
205
+ ...orchestratorCtx,
206
+ ...(orchestratorCtx && { triggerMode: "fresh" }),
207
+ }).build();
208
+ sessionStore.createSession(sessionId, environmentId, runtime, task.title, model, logPath, task.id, resolved.personaId, req.parentSessionId || "", // parentSessionId
209
+ taskPipeMode || "");
210
+ emit("task.started", { taskId: task.id, sessionId, workspaceId: task.workspaceId || "" });
211
+ // Re-push stored tokens + provider credentials (scoped to runtime) so they're fresh for this session.
212
+ // For local envs, skip file tokens — the PowerLine is on the same machine.
213
+ await tokenPush.refreshTokensForTask(environmentId, runtime, env?.adapterType === "local" ? { excludeFileTokens: true } : undefined);
214
+ const mcpServersJson = personaMcpServersToJson(persona);
215
+ const useWorktrees = workspace?.useWorktrees ?? false;
216
+ if (!useWorktrees) {
217
+ logger.warn({ taskId: task.id, workspaceId: task.workspaceId, branch: task.branch }, "Worktrees disabled for workspace — agent will work in main checkout. Concurrent tasks on the same environment may conflict.");
218
+ }
219
+ const taskMcpPort = parseInt(process.env.GRACKLE_MCP_PORT || String(DEFAULT_MCP_PORT), 10);
220
+ const taskMcpDialHost = toDialableHost(process.env.GRACKLE_HOST || "127.0.0.1");
221
+ const taskMcpUrl = `http://${taskMcpDialHost}:${taskMcpPort}/mcp`;
222
+ const taskMcpToken = createScopedToken({ sub: task.id, pid: task.workspaceId || "", per: resolved.personaId, sid: sessionId }, loadOrCreateApiKey(grackleHome));
223
+ const powerlineReq = create(powerline.SpawnRequestSchema, {
224
+ sessionId,
225
+ runtime,
226
+ prompt: taskPrompt,
227
+ model,
228
+ maxTurns,
229
+ branch: task.branch,
230
+ workingDirectory: task.branch
231
+ ? (workspace?.workingDirectory || process.env.GRACKLE_WORKTREE_BASE || "/workspace")
232
+ : "",
233
+ useWorktrees,
234
+ systemContext,
235
+ workspaceId: task.workspaceId ?? undefined,
236
+ taskId: task.id,
237
+ mcpServersJson,
238
+ mcpUrl: taskMcpUrl,
239
+ mcpToken: taskMcpToken,
240
+ scriptContent: resolved.type === "script" ? resolved.script : "",
241
+ pipe: req.pipe,
242
+ });
243
+ // Create lifecycle stream for the task session
244
+ const taskLifecycleStream = streamRegistry.createStream(`lifecycle:${sessionId}`);
245
+ const taskSpawnerId = req.parentSessionId || "__server__";
246
+ streamRegistry.subscribe(taskLifecycleStream.id, taskSpawnerId, "rw", "detach", true);
247
+ streamRegistry.subscribe(taskLifecycleStream.id, sessionId, "rw", "detach", false);
248
+ // Set up IPC pipe stream (optional)
249
+ let taskPipeFd = 0;
250
+ if (taskPipeMode && taskPipeMode !== "detach" && req.parentSessionId) {
251
+ const ipcStream = streamRegistry.createStream(`pipe:${sessionId}`);
252
+ const parentSub = streamRegistry.subscribe(ipcStream.id, req.parentSessionId, "rw", taskPipeMode === "sync" ? "sync" : "async", true);
253
+ streamRegistry.subscribe(ipcStream.id, sessionId, "rw", "async", false);
254
+ taskPipeFd = parentSub.fd;
255
+ if (taskPipeMode === "async") {
256
+ ensureAsyncDeliveryListener(req.parentSessionId); // parent receives child messages
257
+ ensureAsyncDeliveryListener(sessionId); // child receives parent messages
258
+ }
259
+ }
260
+ processEventStream(conn.client.spawn(powerlineReq), {
261
+ sessionId,
262
+ logPath,
263
+ workspaceId: task.workspaceId ?? undefined,
264
+ taskId: task.id,
265
+ systemContext,
266
+ prompt: taskPrompt,
267
+ });
268
+ const row = sessionStore.getSession(sessionId);
269
+ const taskProto = sessionRowToProto(row);
270
+ taskProto.pipeFd = taskPipeFd;
271
+ return taskProto;
272
+ }
273
+ /** Mark a task as complete and clean up active sessions. */
274
+ export async function completeTask(req) {
275
+ if (req.id === ROOT_TASK_ID) {
276
+ throw new ConnectError("Cannot complete the system task", Code.PermissionDenied);
277
+ }
278
+ const task = taskStore.getTask(req.id);
279
+ if (!task) {
280
+ throw new ConnectError(`Task not found: ${req.id}`, Code.NotFound);
281
+ }
282
+ taskStore.markTaskComplete(task.id, TASK_STATUS.COMPLETE);
283
+ // Transfer ALL pipe fds from this task's sessions to the grandparent BEFORE
284
+ // closing sessions — once sessions are cleaned up, their subscriptions are gone.
285
+ // Always transfer regardless of orphaned tasks: ipc_spawn creates child sessions
286
+ // (not tasks), so pipe subs exist even when getOrphanedTasks returns empty.
287
+ const grandparentId = task.parentTaskId || ROOT_TASK_ID;
288
+ transferAllPipeSubscriptions(task.id, grandparentId);
289
+ // Close lifecycle FDs for any active sessions — cascades to STOPPED via orphan callback
290
+ const activeSessions = sessionStore.getActiveSessionsForTask(req.id);
291
+ for (const activeSession of activeSessions) {
292
+ cleanupLifecycleStream(activeSession.id);
293
+ const subs = streamRegistry.getSubscriptionsForSession(activeSession.id);
294
+ for (const sub of subs) {
295
+ streamRegistry.unsubscribe(sub.id);
296
+ }
297
+ }
298
+ // Check for newly unblocked tasks
299
+ if (task.workspaceId) {
300
+ const unblocked = taskStore.checkAndUnblock(task.workspaceId);
301
+ for (const t of unblocked) {
302
+ streamHub.publish(create(grackle.SessionEventSchema, {
303
+ sessionId: "",
304
+ type: grackle.EventType.SYSTEM,
305
+ timestamp: new Date().toISOString(),
306
+ content: JSON.stringify({
307
+ type: "task_unblocked",
308
+ taskId: t.id,
309
+ title: t.title,
310
+ }),
311
+ raw: "",
312
+ }));
313
+ }
314
+ }
315
+ emit("task.completed", { taskId: task.id, workspaceId: task.workspaceId || "" });
316
+ const row = taskStore.getTask(task.id);
317
+ const taskSessions = sessionStore.listSessionsForTask(task.id);
318
+ const { status, latestSessionId } = computeTaskStatus(row.status, taskSessions);
319
+ return taskRowToProto(row, undefined, status, latestSessionId);
320
+ }
321
+ /** Set the workpad JSON for a task. */
322
+ export async function setWorkpad(req) {
323
+ const task = taskStore.getTask(req.taskId);
324
+ if (!task) {
325
+ throw new ConnectError(`Task not found: ${req.taskId}`, Code.NotFound);
326
+ }
327
+ // Validate workpad is a valid JSON object
328
+ try {
329
+ const parsed = JSON.parse(req.workpad);
330
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
331
+ throw new ConnectError("Workpad must be a JSON object", Code.InvalidArgument);
332
+ }
333
+ }
334
+ catch (err) {
335
+ if (err instanceof ConnectError) {
336
+ throw err;
337
+ }
338
+ throw new ConnectError("Workpad must be valid JSON", Code.InvalidArgument);
339
+ }
340
+ const MAX_WORKPAD_BYTES = 64 * 1024; // 64 KB
341
+ const workpadBytes = Buffer.byteLength(req.workpad, "utf8");
342
+ if (workpadBytes > MAX_WORKPAD_BYTES) {
343
+ throw new ConnectError(`Workpad exceeds maximum size of ${MAX_WORKPAD_BYTES} bytes`, Code.InvalidArgument);
344
+ }
345
+ taskStore.setWorkpad(req.taskId, req.workpad);
346
+ const row = taskStore.getTask(req.taskId);
347
+ const taskSessions = sessionStore.listSessionsForTask(req.taskId);
348
+ const { status, latestSessionId } = computeTaskStatus(row.status, taskSessions);
349
+ return taskRowToProto(row, undefined, status, latestSessionId);
350
+ }
351
+ /** Resume the latest session for a task. */
352
+ export async function resumeTask(req) {
353
+ const task = taskStore.getTask(req.id);
354
+ if (!task) {
355
+ throw new ConnectError(`Task not found: ${req.id}`, Code.NotFound);
356
+ }
357
+ const latestSession = sessionStore.getLatestSessionForTask(req.id);
358
+ if (!latestSession) {
359
+ throw new ConnectError(`Task ${req.id} has no sessions to resume`, Code.FailedPrecondition);
360
+ }
361
+ if (![SESSION_STATUS.STOPPED, SESSION_STATUS.SUSPENDED].includes(latestSession.status)) {
362
+ throw new ConnectError(`Latest session ${latestSession.id} is not resumable (status: ${latestSession.status})`, Code.FailedPrecondition);
363
+ }
364
+ if (!latestSession.runtimeSessionId) {
365
+ throw new ConnectError(`Latest session ${latestSession.id} has no runtime session ID — cannot resume`, Code.FailedPrecondition);
366
+ }
367
+ const conn = adapterManager.getConnection(latestSession.environmentId);
368
+ if (!conn) {
369
+ throw new ConnectError(`Environment ${latestSession.environmentId} not connected`, Code.FailedPrecondition);
370
+ }
371
+ const powerlineReq = create(powerline.ResumeRequestSchema, {
372
+ sessionId: latestSession.id,
373
+ runtimeSessionId: latestSession.runtimeSessionId,
374
+ runtime: latestSession.runtime,
375
+ });
376
+ const logPath = latestSession.logPath || join(grackleHome, LOGS_DIR, latestSession.id);
377
+ // Initiate the stream before mutating the DB. If resume() throws
378
+ // synchronously the DB is never touched, so no rollback is needed.
379
+ const resumeStream = conn.client.resume(powerlineReq);
380
+ // Reset session DB row to RUNNING (clears endedAt, error, etc.)
381
+ sessionStore.reanimateSession(latestSession.id);
382
+ // Re-create lifecycle stream if it was deleted during kill/stop
383
+ const resumeSpawnerId = latestSession.parentSessionId || "__server__";
384
+ ensureLifecycleStream(latestSession.id, resumeSpawnerId);
385
+ processEventStream(resumeStream, {
386
+ sessionId: latestSession.id,
387
+ logPath,
388
+ workspaceId: task.workspaceId ?? undefined,
389
+ taskId: task.id,
390
+ });
391
+ emit("task.started", { taskId: task.id, sessionId: latestSession.id, workspaceId: task.workspaceId || "" });
392
+ const row = sessionStore.getSession(latestSession.id);
393
+ return sessionRowToProto(row);
394
+ }
395
+ /** Stop a task by terminating all its active sessions. */
396
+ export async function stopTask(req) {
397
+ const task = taskStore.getTask(req.id);
398
+ if (!task) {
399
+ throw new ConnectError(`Task not found: ${req.id}`, Code.NotFound);
400
+ }
401
+ // Terminate all active sessions for this task using the fd-closure pattern
402
+ const activeSessions = sessionStore.getActiveSessionsForTask(req.id);
403
+ for (const activeSession of activeSessions) {
404
+ cleanupLifecycleStream(activeSession.id);
405
+ const subs = streamRegistry.getSubscriptionsForSession(activeSession.id);
406
+ for (const sub of subs) {
407
+ streamRegistry.unsubscribe(sub.id);
408
+ }
409
+ const current = sessionStore.getSession(activeSession.id);
410
+ if (current && !TERMINAL_SESSION_STATUSES.has(current.status)) {
411
+ sessionStore.updateSession(activeSession.id, SESSION_STATUS.STOPPED, undefined, undefined, END_REASON.INTERRUPTED);
412
+ streamHub.publish(create(grackle.SessionEventSchema, {
413
+ sessionId: activeSession.id,
414
+ type: grackle.EventType.STATUS,
415
+ timestamp: new Date().toISOString(),
416
+ content: END_REASON.INTERRUPTED,
417
+ raw: "",
418
+ }));
419
+ }
420
+ }
421
+ // Mark task complete
422
+ taskStore.markTaskComplete(req.id, TASK_STATUS.COMPLETE);
423
+ // Check for newly unblocked tasks
424
+ if (task.workspaceId) {
425
+ taskStore.checkAndUnblock(task.workspaceId);
426
+ }
427
+ emit("task.completed", { taskId: task.id, workspaceId: task.workspaceId || "" });
428
+ const updated = taskStore.getTask(req.id);
429
+ const taskSessions = sessionStore.listSessionsForTask(req.id);
430
+ const { status, latestSessionId } = computeTaskStatus(updated.status, taskSessions);
431
+ return taskRowToProto(updated, undefined, status, latestSessionId);
432
+ }
433
+ /** Delete a task and all its sessions. */
434
+ export async function deleteTask(req) {
435
+ if (req.id === ROOT_TASK_ID) {
436
+ throw new ConnectError("Cannot delete the system task", Code.PermissionDenied);
437
+ }
438
+ const task = taskStore.getTask(req.id);
439
+ if (!task) {
440
+ throw new ConnectError(`Task not found: ${req.id}`, Code.NotFound);
441
+ }
442
+ const children = taskStore.getChildren(req.id);
443
+ if (children.length > 0) {
444
+ throw new ConnectError("Cannot delete task with children. Delete children first.", Code.FailedPrecondition);
445
+ }
446
+ // Terminate all active sessions via lifecycle cleanup before deleting the task
447
+ const activeSessions = sessionStore.getActiveSessionsForTask(req.id);
448
+ for (const activeSession of activeSessions) {
449
+ cleanupLifecycleStream(activeSession.id);
450
+ const subs = streamRegistry.getSubscriptionsForSession(activeSession.id);
451
+ for (const sub of subs) {
452
+ streamRegistry.unsubscribe(sub.id);
453
+ }
454
+ }
455
+ const changes = taskStore.deleteTask(req.id);
456
+ if (changes === 0) {
457
+ logger.error({ taskId: req.id }, "deleteTask returned 0 changes despite task existing");
458
+ throw new ConnectError(`Failed to delete task ${req.id}: no rows affected`, Code.Internal);
459
+ }
460
+ emit("task.deleted", { taskId: req.id, workspaceId: task.workspaceId || "" });
461
+ return create(grackle.EmptySchema, {});
462
+ }
463
+ //# sourceMappingURL=task-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-handlers.js","sourceRoot":"","sources":["../src/task-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Starts a new agent session for a task.
3
+ *
4
+ * Extracted from the former WebSocket bridge module. This is the non-gRPC
5
+ * entry point used by the root-task auto-start flow and the cron scheduler.
6
+ * The gRPC `StartTask` handler in `grpc-service.ts` has its own inline
7
+ * implementation with additional validation and pipe support.
8
+ *
9
+ * @module
10
+ */
11
+ import { taskStore } from "@grackle-ai/database";
12
+ /**
13
+ * Start a new agent session for a task.
14
+ *
15
+ * Resolves the persona, creates a session record, pushes tokens, and spawns
16
+ * the runtime on the environment's PowerLine connection. The environment must
17
+ * already be connected — this function does not auto-provision.
18
+ *
19
+ * @returns An error message string on failure, `undefined` on success.
20
+ */
21
+ export declare function startTaskSession(task: taskStore.TaskRow, options?: {
22
+ personaId?: string;
23
+ environmentId?: string;
24
+ notes?: string;
25
+ }): Promise<string | undefined>;
26
+ //# sourceMappingURL=task-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-session.d.ts","sourceRoot":"","sources":["../src/task-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAA6C,SAAS,EAAe,MAAM,sBAAsB,CAAC;AAiBzG;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,SAAS,CAAC,OAAO,EACvB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsI7B"}