@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.
- package/dist/codespace-handlers.d.ts +6 -0
- package/dist/codespace-handlers.d.ts.map +1 -0
- package/dist/codespace-handlers.js +66 -0
- package/dist/codespace-handlers.js.map +1 -0
- package/dist/cron-phase.d.ts +1 -1
- package/dist/cron-phase.d.ts.map +1 -1
- package/dist/cron-phase.js +1 -1
- package/dist/cron-phase.js.map +1 -1
- package/dist/environment-handlers.d.ts +16 -0
- package/dist/environment-handlers.d.ts.map +1 -0
- package/dist/environment-handlers.js +237 -0
- package/dist/environment-handlers.js.map +1 -0
- package/dist/event-bus.d.ts +1 -1
- package/dist/event-bus.d.ts.map +1 -1
- package/dist/event-bus.js.map +1 -1
- package/dist/event-hub.d.ts +29 -0
- package/dist/event-hub.d.ts.map +1 -0
- package/dist/event-hub.js +89 -0
- package/dist/event-hub.js.map +1 -0
- package/dist/finding-handlers.d.ts +6 -0
- package/dist/finding-handlers.d.ts.map +1 -0
- package/dist/finding-handlers.js +27 -0
- package/dist/finding-handlers.js.map +1 -0
- package/dist/grpc-mcp-config.d.ts +11 -0
- package/dist/grpc-mcp-config.d.ts.map +1 -0
- package/dist/grpc-mcp-config.js +29 -0
- package/dist/grpc-mcp-config.js.map +1 -0
- package/dist/grpc-proto-converters.d.ts +25 -0
- package/dist/grpc-proto-converters.d.ts.map +1 -0
- package/dist/grpc-proto-converters.js +193 -0
- package/dist/grpc-proto-converters.js.map +1 -0
- package/dist/grpc-service.d.ts +3 -19
- package/dist/grpc-service.d.ts.map +1 -1
- package/dist/grpc-service.js +28 -1989
- package/dist/grpc-service.js.map +1 -1
- package/dist/grpc-shared.d.ts +25 -0
- package/dist/grpc-shared.d.ts.map +1 -0
- package/dist/grpc-shared.js +110 -0
- package/dist/grpc-shared.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/knowledge-handlers.d.ts +12 -0
- package/dist/knowledge-handlers.d.ts.map +1 -0
- package/dist/knowledge-handlers.js +85 -0
- package/dist/knowledge-handlers.js.map +1 -0
- package/dist/orphan-phase.d.ts +27 -0
- package/dist/orphan-phase.d.ts.map +1 -0
- package/dist/orphan-phase.js +69 -0
- package/dist/orphan-phase.js.map +1 -0
- package/dist/persona-handlers.d.ts +12 -0
- package/dist/persona-handlers.d.ts.map +1 -0
- package/dist/persona-handlers.js +148 -0
- package/dist/persona-handlers.js.map +1 -0
- package/dist/schedule-handlers.d.ts +12 -0
- package/dist/schedule-handlers.d.ts.map +1 -0
- package/dist/schedule-handlers.js +122 -0
- package/dist/schedule-handlers.js.map +1 -0
- package/dist/session-handlers.d.ts +34 -0
- package/dist/session-handlers.d.ts.map +1 -0
- package/dist/session-handlers.js +488 -0
- package/dist/session-handlers.js.map +1 -0
- package/dist/settings-handlers.d.ts +10 -0
- package/dist/settings-handlers.d.ts.map +1 -0
- package/dist/settings-handlers.js +68 -0
- package/dist/settings-handlers.js.map +1 -0
- package/dist/signals/orphan-reparent.d.ts +30 -0
- package/dist/signals/orphan-reparent.d.ts.map +1 -0
- package/dist/signals/orphan-reparent.js +179 -0
- package/dist/signals/orphan-reparent.js.map +1 -0
- package/dist/signals/sigchld.d.ts.map +1 -1
- package/dist/signals/sigchld.js +4 -8
- package/dist/signals/sigchld.js.map +1 -1
- package/dist/task-handlers.d.ts +22 -0
- package/dist/task-handlers.d.ts.map +1 -0
- package/dist/task-handlers.js +463 -0
- package/dist/task-handlers.js.map +1 -0
- package/dist/task-session.d.ts +26 -0
- package/dist/task-session.d.ts.map +1 -0
- package/dist/task-session.js +132 -0
- package/dist/task-session.js.map +1 -0
- package/dist/test-utils/mock-database.d.ts +2 -0
- package/dist/test-utils/mock-database.d.ts.map +1 -1
- package/dist/test-utils/mock-database.js +2 -0
- package/dist/test-utils/mock-database.js.map +1 -1
- package/dist/token-handlers.d.ts +12 -0
- package/dist/token-handlers.d.ts.map +1 -0
- package/dist/token-handlers.js +85 -0
- package/dist/token-handlers.js.map +1 -0
- package/dist/workspace-handlers.d.ts +12 -0
- package/dist/workspace-handlers.d.ts.map +1 -0
- package/dist/workspace-handlers.js +86 -0
- package/dist/workspace-handlers.js.map +1 -0
- package/package.json +7 -9
- package/dist/ws-bridge.d.ts +0 -30
- package/dist/ws-bridge.d.ts.map +0 -1
- package/dist/ws-bridge.js +0 -372
- package/dist/ws-bridge.js.map +0 -1
- package/dist/ws-broadcast.d.ts +0 -19
- package/dist/ws-broadcast.d.ts.map +0 -1
- package/dist/ws-broadcast.js +0 -60
- 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"}
|