@grackle-ai/plugin-core 0.96.3

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 (122) 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 +46 -0
  6. package/dist/cron-phase.d.ts.map +1 -0
  7. package/dist/cron-phase.js +88 -0
  8. package/dist/cron-phase.js.map +1 -0
  9. package/dist/dispatch-phase.d.ts +46 -0
  10. package/dist/dispatch-phase.d.ts.map +1 -0
  11. package/dist/dispatch-phase.js +99 -0
  12. package/dist/dispatch-phase.js.map +1 -0
  13. package/dist/environment-handlers.d.ts +16 -0
  14. package/dist/environment-handlers.d.ts.map +1 -0
  15. package/dist/environment-handlers.js +255 -0
  16. package/dist/environment-handlers.js.map +1 -0
  17. package/dist/environment-reconciliation.d.ts +35 -0
  18. package/dist/environment-reconciliation.d.ts.map +1 -0
  19. package/dist/environment-reconciliation.js +74 -0
  20. package/dist/environment-reconciliation.js.map +1 -0
  21. package/dist/escalation-handlers.d.ts +8 -0
  22. package/dist/escalation-handlers.d.ts.map +1 -0
  23. package/dist/escalation-handlers.js +60 -0
  24. package/dist/escalation-handlers.js.map +1 -0
  25. package/dist/finding-handlers.d.ts +8 -0
  26. package/dist/finding-handlers.d.ts.map +1 -0
  27. package/dist/finding-handlers.js +38 -0
  28. package/dist/finding-handlers.js.map +1 -0
  29. package/dist/grpc-proto-converters.d.ts +31 -0
  30. package/dist/grpc-proto-converters.d.ts.map +1 -0
  31. package/dist/grpc-proto-converters.js +222 -0
  32. package/dist/grpc-proto-converters.js.map +1 -0
  33. package/dist/grpc-service.d.ts +21 -0
  34. package/dist/grpc-service.d.ts.map +1 -0
  35. package/dist/grpc-service.js +50 -0
  36. package/dist/grpc-service.js.map +1 -0
  37. package/dist/grpc-shared.d.ts +22 -0
  38. package/dist/grpc-shared.d.ts.map +1 -0
  39. package/dist/grpc-shared.js +68 -0
  40. package/dist/grpc-shared.js.map +1 -0
  41. package/dist/index.d.ts +20 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +20 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/knowledge-handlers.d.ts +12 -0
  46. package/dist/knowledge-handlers.d.ts.map +1 -0
  47. package/dist/knowledge-handlers.js +149 -0
  48. package/dist/knowledge-handlers.js.map +1 -0
  49. package/dist/lifecycle-cleanup.d.ts +13 -0
  50. package/dist/lifecycle-cleanup.d.ts.map +1 -0
  51. package/dist/lifecycle-cleanup.js +35 -0
  52. package/dist/lifecycle-cleanup.js.map +1 -0
  53. package/dist/lifecycle.d.ts +28 -0
  54. package/dist/lifecycle.d.ts.map +1 -0
  55. package/dist/lifecycle.js +132 -0
  56. package/dist/lifecycle.js.map +1 -0
  57. package/dist/orphan-phase.d.ts +27 -0
  58. package/dist/orphan-phase.d.ts.map +1 -0
  59. package/dist/orphan-phase.js +69 -0
  60. package/dist/orphan-phase.js.map +1 -0
  61. package/dist/persona-handlers.d.ts +12 -0
  62. package/dist/persona-handlers.d.ts.map +1 -0
  63. package/dist/persona-handlers.js +156 -0
  64. package/dist/persona-handlers.js.map +1 -0
  65. package/dist/root-task-boot.d.ts +67 -0
  66. package/dist/root-task-boot.d.ts.map +1 -0
  67. package/dist/root-task-boot.js +234 -0
  68. package/dist/root-task-boot.js.map +1 -0
  69. package/dist/schedule-expression.d.ts +43 -0
  70. package/dist/schedule-expression.d.ts.map +1 -0
  71. package/dist/schedule-expression.js +105 -0
  72. package/dist/schedule-expression.js.map +1 -0
  73. package/dist/schedule-handlers.d.ts +12 -0
  74. package/dist/schedule-handlers.d.ts.map +1 -0
  75. package/dist/schedule-handlers.js +122 -0
  76. package/dist/schedule-handlers.js.map +1 -0
  77. package/dist/session-handlers.d.ts +40 -0
  78. package/dist/session-handlers.d.ts.map +1 -0
  79. package/dist/session-handlers.js +610 -0
  80. package/dist/session-handlers.js.map +1 -0
  81. package/dist/settings-handlers.d.ts +10 -0
  82. package/dist/settings-handlers.d.ts.map +1 -0
  83. package/dist/settings-handlers.js +80 -0
  84. package/dist/settings-handlers.js.map +1 -0
  85. package/dist/signals/escalation-auto.d.ts +20 -0
  86. package/dist/signals/escalation-auto.d.ts.map +1 -0
  87. package/dist/signals/escalation-auto.js +126 -0
  88. package/dist/signals/escalation-auto.js.map +1 -0
  89. package/dist/signals/orphan-reparent.d.ts +31 -0
  90. package/dist/signals/orphan-reparent.d.ts.map +1 -0
  91. package/dist/signals/orphan-reparent.js +175 -0
  92. package/dist/signals/orphan-reparent.js.map +1 -0
  93. package/dist/signals/sigchld.d.ts +12 -0
  94. package/dist/signals/sigchld.d.ts.map +1 -0
  95. package/dist/signals/sigchld.js +177 -0
  96. package/dist/signals/sigchld.js.map +1 -0
  97. package/dist/task-handlers.d.ts +22 -0
  98. package/dist/task-handlers.d.ts.map +1 -0
  99. package/dist/task-handlers.js +517 -0
  100. package/dist/task-handlers.js.map +1 -0
  101. package/dist/test-utils/integration-setup.d.ts +11 -0
  102. package/dist/test-utils/integration-setup.d.ts.map +1 -0
  103. package/dist/test-utils/integration-setup.js +26 -0
  104. package/dist/test-utils/integration-setup.js.map +1 -0
  105. package/dist/test-utils/mock-database.d.ts +152 -0
  106. package/dist/test-utils/mock-database.d.ts.map +1 -0
  107. package/dist/test-utils/mock-database.js +169 -0
  108. package/dist/test-utils/mock-database.js.map +1 -0
  109. package/dist/token-handlers.d.ts +12 -0
  110. package/dist/token-handlers.d.ts.map +1 -0
  111. package/dist/token-handlers.js +85 -0
  112. package/dist/token-handlers.js.map +1 -0
  113. package/dist/tsdoc-metadata.json +11 -0
  114. package/dist/utils/format-gh-error.d.ts +6 -0
  115. package/dist/utils/format-gh-error.d.ts.map +1 -0
  116. package/dist/utils/format-gh-error.js +30 -0
  117. package/dist/utils/format-gh-error.js.map +1 -0
  118. package/dist/workspace-handlers.d.ts +16 -0
  119. package/dist/workspace-handlers.d.ts.map +1 -0
  120. package/dist/workspace-handlers.js +146 -0
  121. package/dist/workspace-handlers.js.map +1 -0
  122. package/package.json +60 -0
@@ -0,0 +1,610 @@
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, LOGS_DIR, eventTypeToEnum, } from "@grackle-ai/common";
5
+ import { envRegistry, sessionStore, taskStore, personaStore, settingsStore, grackleHome } from "@grackle-ai/database";
6
+ import { v4 as uuid } from "uuid";
7
+ import { join } from "node:path";
8
+ import { reconnectOrProvision } from "@grackle-ai/adapter-sdk";
9
+ import { adapterManager } from "@grackle-ai/core";
10
+ import { streamHub } from "@grackle-ai/core";
11
+ import { tokenPush } from "@grackle-ai/core";
12
+ import { parseAdapterConfig } from "@grackle-ai/core";
13
+ import { emit } from "@grackle-ai/core";
14
+ import { processEventStream } from "@grackle-ai/core";
15
+ import { recoverSuspendedSessions } from "@grackle-ai/core";
16
+ import { logger } from "@grackle-ai/core";
17
+ import { reanimateAgent } from "@grackle-ai/core";
18
+ import { streamRegistry } from "@grackle-ai/core";
19
+ import { pipeDelivery } from "@grackle-ai/core";
20
+ import { logWriter } from "@grackle-ai/core";
21
+ import { createScopedToken, loadOrCreateApiKey } from "@grackle-ai/auth";
22
+ import { resolvePersona, SystemPromptBuilder } from "@grackle-ai/prompt";
23
+ import { toPersonaResolveInput } from "@grackle-ai/core";
24
+ import { sendInputToSession } from "@grackle-ai/core";
25
+ import { deliverPendingEscalations } from "@grackle-ai/core";
26
+ import { createEventStream } from "@grackle-ai/core";
27
+ import { sessionRowToProto } from "./grpc-proto-converters.js";
28
+ import { validatePipeInputs, toDialableHost, killSessionAndCleanup } from "./grpc-shared.js";
29
+ import { personaMcpServersToJson } from "@grackle-ai/core";
30
+ import { getTraceId } from "@grackle-ai/core";
31
+ import { resolveBootstrapRuntime } from "@grackle-ai/core";
32
+ import { ensureStdinStream, publishToStdin } from "@grackle-ai/core";
33
+ /** Spawn a new agent session in the given environment. */
34
+ export async function spawnAgent(req) {
35
+ if (!req.environmentId) {
36
+ throw new ConnectError("environment_id is required", Code.InvalidArgument);
37
+ }
38
+ const env = envRegistry.getEnvironment(req.environmentId);
39
+ if (!env) {
40
+ throw new ConnectError(`Environment not found: ${req.environmentId}`, Code.NotFound);
41
+ }
42
+ let conn = adapterManager.getConnection(req.environmentId);
43
+ if (!conn) {
44
+ // Auto-provision: attempt to reconnect/provision a disconnected environment
45
+ const adapter = adapterManager.getAdapter(env.adapterType);
46
+ if (!adapter) {
47
+ throw new ConnectError(`No adapter for type: ${env.adapterType}`, Code.FailedPrecondition);
48
+ }
49
+ logger.info({ environmentId: req.environmentId }, "Auto-provisioning environment for SpawnAgent");
50
+ envRegistry.updateEnvironmentStatus(req.environmentId, "connecting");
51
+ emit("environment.changed", {});
52
+ const config = parseAdapterConfig(env.adapterConfig);
53
+ config.defaultRuntime = resolveBootstrapRuntime(env);
54
+ const powerlineToken = env.powerlineToken;
55
+ try {
56
+ for await (const provEvent of reconnectOrProvision(req.environmentId, adapter, config, powerlineToken, !!env.bootstrapped)) {
57
+ logger.info({ environmentId: req.environmentId, stage: provEvent.stage }, "Auto-provision progress (SpawnAgent)");
58
+ emit("environment.provision_progress", {
59
+ environmentId: req.environmentId,
60
+ stage: provEvent.stage,
61
+ message: provEvent.message,
62
+ progress: provEvent.progress,
63
+ });
64
+ }
65
+ conn = await adapter.connect(req.environmentId, config, powerlineToken);
66
+ adapterManager.setConnection(req.environmentId, conn);
67
+ await tokenPush.pushToEnv(req.environmentId);
68
+ envRegistry.updateEnvironmentStatus(req.environmentId, "connected");
69
+ envRegistry.markBootstrapped(req.environmentId);
70
+ emit("environment.changed", {});
71
+ // Auto-recover suspended sessions (fire-and-forget)
72
+ recoverSuspendedSessions(req.environmentId, conn).catch((err) => {
73
+ logger.error({ environmentId: req.environmentId, err }, "Session recovery failed");
74
+ });
75
+ logger.info({ environmentId: req.environmentId }, "Auto-provision complete (SpawnAgent)");
76
+ emit("environment.provision_progress", {
77
+ environmentId: req.environmentId,
78
+ stage: "ready",
79
+ message: "Environment connected",
80
+ progress: 1,
81
+ });
82
+ }
83
+ catch (err) {
84
+ logger.error({ environmentId: req.environmentId, err }, "Auto-provision failed (SpawnAgent)");
85
+ envRegistry.updateEnvironmentStatus(req.environmentId, "error");
86
+ emit("environment.changed", {});
87
+ throw new ConnectError(`Failed to auto-connect environment ${req.environmentId}: ${err instanceof Error ? err.message : String(err)}`, Code.FailedPrecondition);
88
+ }
89
+ }
90
+ // Resolve persona via cascade (request → app default)
91
+ let resolved;
92
+ try {
93
+ resolved = resolvePersona(req.personaId, undefined, undefined, settingsStore.getSetting("default_persona_id") || undefined, (id) => toPersonaResolveInput(personaStore.getPersona(id)));
94
+ }
95
+ catch (err) {
96
+ throw new ConnectError(err.message, Code.FailedPrecondition);
97
+ }
98
+ const sessionId = uuid();
99
+ const { runtime, model, systemPrompt } = resolved;
100
+ const maxTurns = req.maxTurns || resolved.maxTurns;
101
+ const logPath = join(grackleHome, LOGS_DIR, sessionId);
102
+ const builderPrompt = new SystemPromptBuilder({
103
+ personaPrompt: systemPrompt,
104
+ }).build();
105
+ const systemContext = req.systemContext
106
+ ? builderPrompt + "\n\n" + req.systemContext
107
+ : builderPrompt;
108
+ // Validate pipe inputs before creating the session or spawning the child
109
+ validatePipeInputs(req.pipe, req.parentSessionId);
110
+ const pipeMode = req.pipe;
111
+ sessionStore.createSession(sessionId, req.environmentId, runtime, req.prompt, model, logPath, "", // taskId
112
+ resolved.personaId, // personaId
113
+ req.parentSessionId || "", // parentSessionId
114
+ pipeMode || "");
115
+ const mcpServersJson = personaMcpServersToJson(resolved.mcpServers, resolved.personaId);
116
+ const mcpPort = parseInt(process.env.GRACKLE_MCP_PORT || String(DEFAULT_MCP_PORT), 10);
117
+ const mcpDialHost = toDialableHost(process.env.GRACKLE_HOST || "127.0.0.1");
118
+ const mcpUrl = `http://${mcpDialHost}:${mcpPort}/mcp`;
119
+ const mcpToken = createScopedToken({ sub: sessionId, pid: "", per: resolved.personaId, sid: sessionId }, loadOrCreateApiKey(grackleHome));
120
+ const powerlineReq = create(powerline.SpawnRequestSchema, {
121
+ sessionId,
122
+ runtime,
123
+ prompt: req.prompt,
124
+ model,
125
+ maxTurns,
126
+ branch: req.branch,
127
+ workingDirectory: req.branch
128
+ ? (req.workingDirectory.trim() || process.env.GRACKLE_WORKING_DIRECTORY || process.env.GRACKLE_WORKTREE_BASE || "/workspace")
129
+ : "",
130
+ systemContext,
131
+ mcpServersJson,
132
+ mcpUrl,
133
+ mcpToken,
134
+ scriptContent: resolved.type === "script" ? resolved.script : "",
135
+ pipe: req.pipe,
136
+ });
137
+ // Create lifecycle stream — every session gets one. The spawner holds
138
+ // a lifecycle fd; when it's closed, the session auto-stops.
139
+ const lifecycleStream = streamRegistry.createStream(`lifecycle:${sessionId}`);
140
+ const spawnerId = req.parentSessionId || "__server__";
141
+ streamRegistry.subscribe(lifecycleStream.id, spawnerId, "rw", "detach", true);
142
+ streamRegistry.subscribe(lifecycleStream.id, sessionId, "rw", "detach", false);
143
+ // Create stdin stream — routes human input through the stream-registry
144
+ ensureStdinStream(sessionId);
145
+ // Set up IPC pipe stream (optional, on top of lifecycle stream)
146
+ let pipeFd = 0;
147
+ if (pipeMode && pipeMode !== "detach" && req.parentSessionId) {
148
+ const ipcStream = streamRegistry.createStream(`pipe:${sessionId}`);
149
+ const parentSub = streamRegistry.subscribe(ipcStream.id, req.parentSessionId, "rw", pipeMode === "sync" ? "sync" : "async", true);
150
+ streamRegistry.subscribe(ipcStream.id, sessionId, "rw", "async", false);
151
+ pipeFd = parentSub.fd;
152
+ if (pipeMode === "async") {
153
+ pipeDelivery.ensureAsyncDeliveryListener(req.parentSessionId); // parent receives child messages
154
+ pipeDelivery.ensureAsyncDeliveryListener(sessionId); // child receives parent messages
155
+ }
156
+ }
157
+ // Push fresh credentials before spawning (best-effort).
158
+ // For local envs, skip file tokens — the PowerLine is on the same machine.
159
+ await tokenPush.refreshTokensForTask(req.environmentId, runtime, env.adapterType === "local" ? { excludeFileTokens: true } : undefined);
160
+ processEventStream(conn.client.spawn(powerlineReq), {
161
+ sessionId,
162
+ logPath,
163
+ systemContext,
164
+ prompt: req.prompt,
165
+ traceId: getTraceId(),
166
+ });
167
+ logger.info({ sessionId, environmentId: req.environmentId }, "Session spawned");
168
+ const row = sessionStore.getSession(sessionId);
169
+ const proto = sessionRowToProto(row);
170
+ proto.pipeFd = pipeFd;
171
+ return proto;
172
+ }
173
+ /** Resume a previously suspended agent session. */
174
+ export async function resumeAgent(req) {
175
+ const row = reanimateAgent(req.sessionId);
176
+ logger.info({ sessionId: req.sessionId }, "Session resumed");
177
+ return sessionRowToProto(row);
178
+ }
179
+ /** Send text input to a running session. */
180
+ export async function sendInput(req) {
181
+ const session = sessionStore.getSession(req.sessionId);
182
+ if (!session) {
183
+ throw new ConnectError(`Session not found: ${req.sessionId}`, Code.NotFound);
184
+ }
185
+ if (TERMINAL_SESSION_STATUSES.has(session.status)) {
186
+ throw new ConnectError(`Session ${req.sessionId} has ended (status: ${session.status})`, Code.FailedPrecondition);
187
+ }
188
+ const conn = adapterManager.getConnection(session.environmentId);
189
+ if (!conn) {
190
+ throw new ConnectError(`Environment ${session.environmentId} not connected`, Code.FailedPrecondition);
191
+ }
192
+ // Persist and publish user input event so subscribers see the text in the event stream
193
+ const userInputEvent = create(grackle.SessionEventSchema, {
194
+ sessionId: req.sessionId,
195
+ type: grackle.EventType.USER_INPUT,
196
+ timestamp: new Date().toISOString(),
197
+ content: req.text,
198
+ raw: "",
199
+ });
200
+ if (session.logPath) {
201
+ await logWriter.writeEvent(session.logPath, userInputEvent);
202
+ }
203
+ streamHub.publish(userInputEvent);
204
+ logger.debug({ sessionId: req.sessionId }, "User input received");
205
+ // Route through stdin stream — the async listener delivers to PowerLine
206
+ publishToStdin(req.sessionId, req.text);
207
+ return create(grackle.EmptySchema, {});
208
+ }
209
+ /** Kill (or gracefully stop) an agent session. */
210
+ export async function killAgent(req) {
211
+ const session = sessionStore.getSession(req.id);
212
+ if (!session) {
213
+ throw new ConnectError(`Session not found: ${req.id}`, Code.NotFound);
214
+ }
215
+ if (req.graceful) {
216
+ // ── SIGTERM: deliver signal message, return immediately ──
217
+ if (!TERMINAL_SESSION_STATUSES.has(session.status)) {
218
+ const message = "[SIGTERM] You have been asked to stop gracefully. " +
219
+ "Finish your current operation, save your work, close any open IPC fds " +
220
+ "(ipc_close for each owned fd), then call task_complete (if applicable) and stop.";
221
+ // Set sigtermSentAt BEFORE delivering so that if the session
222
+ // completes instantly (race), the event-processor sees the flag.
223
+ sessionStore.setSigtermSentAt(session.id);
224
+ const delivered = await sendInputToSession(session.id, session.environmentId, message, "sigterm");
225
+ if (delivered) {
226
+ return create(grackle.EmptySchema, {});
227
+ }
228
+ // Delivery failed — clear the flag since SIGTERM wasn't actually sent
229
+ sessionStore.clearSigtermSentAt(session.id);
230
+ // If delivery failed (env disconnected), fall through to hard kill
231
+ logger.warn({ sessionId: session.id }, "SIGTERM delivery failed, falling back to hard kill");
232
+ }
233
+ }
234
+ // ── SIGKILL: terminate immediately ──
235
+ // Set STOPPED + killed BEFORE closing the lifecycle FD so the orphan
236
+ // callback sees the session is already terminal and skips. Without this,
237
+ // the orphan callback would see IDLE → reason="completed", which is wrong
238
+ // for an explicit kill.
239
+ killSessionAndCleanup(session);
240
+ logger.info({ sessionId: req.id }, "Session killed");
241
+ return create(grackle.EmptySchema, {});
242
+ }
243
+ /** Get aggregated usage stats for a session, task, task tree, workspace, or environment. */
244
+ export async function getUsage(req) {
245
+ if (!req.id) {
246
+ throw new ConnectError("id is required", Code.InvalidArgument);
247
+ }
248
+ switch (req.scope) {
249
+ case "session": {
250
+ const session = sessionStore.getSession(req.id);
251
+ if (!session) {
252
+ throw new ConnectError(`Session not found: ${req.id}`, Code.NotFound);
253
+ }
254
+ return create(grackle.UsageStatsSchema, {
255
+ inputTokens: session.inputTokens,
256
+ outputTokens: session.outputTokens,
257
+ costUsd: session.costUsd,
258
+ sessionCount: 1,
259
+ });
260
+ }
261
+ case "task": {
262
+ const usage = sessionStore.aggregateUsage({ taskId: req.id });
263
+ return create(grackle.UsageStatsSchema, usage);
264
+ }
265
+ case "task_tree": {
266
+ const descendants = taskStore.getDescendants(req.id);
267
+ const taskIds = [req.id, ...descendants.map((d) => d.id)];
268
+ const usage = sessionStore.aggregateUsage({ taskIds });
269
+ return create(grackle.UsageStatsSchema, usage);
270
+ }
271
+ case "workspace": {
272
+ const tasks = taskStore.listTasks(req.id);
273
+ const taskIds = tasks.map((t) => t.id);
274
+ const usage = taskIds.length > 0
275
+ ? sessionStore.aggregateUsage({ taskIds })
276
+ : { inputTokens: 0, outputTokens: 0, costUsd: 0, sessionCount: 0 };
277
+ return create(grackle.UsageStatsSchema, usage);
278
+ }
279
+ case "environment": {
280
+ const usage = sessionStore.aggregateUsage({ environmentId: req.id });
281
+ return create(grackle.UsageStatsSchema, usage);
282
+ }
283
+ default:
284
+ throw new ConnectError(`Invalid usage scope: ${req.scope}`, Code.InvalidArgument);
285
+ }
286
+ }
287
+ /** Wait for a message on a synchronous pipe subscription. */
288
+ export async function waitForPipe(req) {
289
+ const sub = streamRegistry.getSubscription(req.sessionId, req.fd);
290
+ if (!sub) {
291
+ throw new ConnectError(`No subscription found for session ${req.sessionId} fd ${req.fd}`, Code.NotFound);
292
+ }
293
+ if (sub.deliveryMode !== "sync") {
294
+ throw new ConnectError(`Subscription fd ${req.fd} is not a sync subscription (mode: ${sub.deliveryMode})`, Code.FailedPrecondition);
295
+ }
296
+ // Capture child session ID before blocking — the pipe stream may be
297
+ // removed by a concurrent fd close while consumeSync is awaiting.
298
+ const pipeStream = streamRegistry.getStream(sub.streamId);
299
+ const childSessionId = pipeStream?.name.startsWith("pipe:")
300
+ ? pipeStream.name.slice("pipe:".length)
301
+ : undefined;
302
+ // Use try/finally so the pipe stream (and lifecycle stream) are cleaned up
303
+ // even if consumeSync rejects (e.g., the request is cancelled or times out)
304
+ // to prevent unbounded memory growth. Lifecycle cleanup also orphans the child,
305
+ // triggering auto-stop so it doesn't linger in waiting_input (#824).
306
+ let msg;
307
+ try {
308
+ msg = await streamRegistry.consumeSync(sub.id);
309
+ }
310
+ finally {
311
+ pipeDelivery.cleanupSyncPipeAndLifecycle(sub.streamId, childSessionId);
312
+ }
313
+ return create(grackle.WaitForPipeResponseSchema, {
314
+ content: msg.content,
315
+ senderSessionId: msg.senderId,
316
+ });
317
+ }
318
+ /** Write a message to a pipe fd. */
319
+ export async function writeToFd(req) {
320
+ const sub = streamRegistry.getSubscription(req.sessionId, req.fd);
321
+ if (!sub) {
322
+ throw new ConnectError(`No subscription found for session ${req.sessionId} fd ${req.fd}`, Code.NotFound);
323
+ }
324
+ if (sub.permission !== "w" && sub.permission !== "rw") {
325
+ throw new ConnectError(`Subscription fd ${req.fd} does not have write permission (permission: ${sub.permission})`, Code.FailedPrecondition);
326
+ }
327
+ const stream = streamRegistry.getStream(sub.streamId);
328
+ if (!stream) {
329
+ throw new ConnectError("Stream no longer exists", Code.FailedPrecondition);
330
+ }
331
+ // Publish to stream — delivery is handled by async listeners registered
332
+ // at spawn time via ensureAsyncDeliveryListener. This is the same path
333
+ // used by publishChildCompletion for child→parent delivery.
334
+ const msg = streamRegistry.publish(sub.streamId, req.sessionId, req.message);
335
+ // Verify delivery to async subscribers — check if the published message
336
+ // was marked as delivered for each async target. Sync and detach subscribers
337
+ // are excluded (sync waits for consumeSync, detach buffers silently).
338
+ for (const targetSub of stream.subscriptions.values()) {
339
+ if (targetSub.sessionId === req.sessionId) {
340
+ continue;
341
+ }
342
+ if (targetSub.deliveryMode === "async" && !msg.deliveredTo.has(targetSub.id)) {
343
+ throw new ConnectError("Message delivery failed — target environment may be disconnected", Code.FailedPrecondition);
344
+ }
345
+ }
346
+ return create(grackle.EmptySchema, {});
347
+ }
348
+ /** Close a pipe file descriptor, optionally stopping child sessions. */
349
+ export async function closeFd(req) {
350
+ const sub = streamRegistry.getSubscription(req.sessionId, req.fd);
351
+ if (!sub) {
352
+ throw new ConnectError(`No subscription found for session ${req.sessionId} fd ${req.fd}`, Code.NotFound);
353
+ }
354
+ if (streamRegistry.hasUndeliveredMessages(sub.id)) {
355
+ throw new ConnectError(`Cannot close fd ${req.fd}: undelivered messages pending. Process or consume them first.`, Code.FailedPrecondition);
356
+ }
357
+ const streamId = sub.streamId;
358
+ const stream = streamRegistry.getStream(streamId);
359
+ // Only unsubscribe other participants for internal streams (pipe/lifecycle).
360
+ // Global streams (user-created) only unsubscribe the caller — closing your
361
+ // fd should not disconnect other participants from the shared stream.
362
+ const isInternalStream = stream
363
+ ? (stream.name.startsWith("pipe:") || stream.name.startsWith("lifecycle:") || stream.name.startsWith("stdin:"))
364
+ : false;
365
+ const childSubs = [];
366
+ if (isInternalStream && stream) {
367
+ for (const s of stream.subscriptions.values()) {
368
+ if (s.sessionId !== req.sessionId) {
369
+ childSubs.push({ sessionId: s.sessionId, subId: s.id });
370
+ }
371
+ }
372
+ }
373
+ // Unsubscribe the caller
374
+ streamRegistry.unsubscribe(sub.id);
375
+ // Also unsubscribe children on internal streams — when their last
376
+ // subscription is removed, the lifecycle manager's orphan callback auto-stops them.
377
+ let stopped = false;
378
+ for (const child of childSubs) {
379
+ streamRegistry.unsubscribe(child.subId);
380
+ // Check if the child was orphaned (auto-stopped)
381
+ const childSession = sessionStore.getSession(child.sessionId);
382
+ if (childSession?.status === SESSION_STATUS.STOPPED) {
383
+ stopped = true;
384
+ }
385
+ }
386
+ // Clean up async listeners for caller and any unsubscribed children
387
+ pipeDelivery.cleanupAsyncListenerIfEmpty(req.sessionId);
388
+ for (const child of childSubs) {
389
+ pipeDelivery.cleanupAsyncListenerIfEmpty(child.sessionId);
390
+ }
391
+ return create(grackle.CloseFdResponseSchema, { stopped });
392
+ }
393
+ /** Get all open file descriptors for a session. */
394
+ export function getSessionFds(req) {
395
+ const subs = streamRegistry.getSubscriptionsForSession(req.id);
396
+ const fds = subs.map((sub) => {
397
+ const stream = streamRegistry.getStream(sub.streamId);
398
+ let targetSessionId = "";
399
+ if (stream) {
400
+ for (const s of stream.subscriptions.values()) {
401
+ if (s.sessionId !== req.id) {
402
+ targetSessionId = s.sessionId;
403
+ break;
404
+ }
405
+ }
406
+ }
407
+ return create(grackle.FdInfoSchema, {
408
+ fd: sub.fd,
409
+ streamName: stream?.name || "",
410
+ permission: sub.permission,
411
+ deliveryMode: sub.deliveryMode,
412
+ owned: sub.createdBySpawn,
413
+ targetSessionId,
414
+ });
415
+ });
416
+ return create(grackle.SessionFdsSchema, { fds });
417
+ }
418
+ // ─── Global Stream Helpers ─────────────────────────────────────────────────────
419
+ /** Valid permission values for stream subscriptions. */
420
+ const VALID_PERMISSIONS = new Set(["r", "w", "rw"]);
421
+ /** Valid delivery mode values for stream subscriptions. */
422
+ const VALID_DELIVERY_MODES = new Set(["sync", "async", "detach"]);
423
+ /** Reserved stream name prefixes used by internal subsystems. */
424
+ const RESERVED_PREFIXES = ["lifecycle:", "pipe:", "stdin:"];
425
+ /** Check if a requested permission is a subset of the caller's permission. */
426
+ function isPermissionSubset(requested, callerHas) {
427
+ if (callerHas === "rw") {
428
+ return true;
429
+ }
430
+ return requested === callerHas;
431
+ }
432
+ /** Validate permission and deliveryMode, enforcing the w-only → detach rule. */
433
+ function validateSubscriptionParams(permission, deliveryMode) {
434
+ if (!VALID_PERMISSIONS.has(permission)) {
435
+ throw new ConnectError(`Invalid permission "${permission}" — must be "r", "w", or "rw"`, Code.InvalidArgument);
436
+ }
437
+ if (!VALID_DELIVERY_MODES.has(deliveryMode)) {
438
+ throw new ConnectError(`Invalid delivery_mode "${deliveryMode}" — must be "sync", "async", or "detach"`, Code.InvalidArgument);
439
+ }
440
+ if (permission === "w" && deliveryMode !== "detach") {
441
+ throw new ConnectError(`Write-only permission requires delivery_mode "detach" (got "${deliveryMode}")`, Code.InvalidArgument);
442
+ }
443
+ }
444
+ // ─── Global Stream Handlers ────────────────────────────────────────────────────
445
+ /** Create a new named stream. Creator gets an rw/async subscription. */
446
+ export async function createStream(req) {
447
+ if (!req.sessionId) {
448
+ throw new ConnectError("session_id is required", Code.InvalidArgument);
449
+ }
450
+ if (!req.name) {
451
+ throw new ConnectError("name is required", Code.InvalidArgument);
452
+ }
453
+ if (RESERVED_PREFIXES.some((prefix) => req.name.startsWith(prefix))) {
454
+ throw new ConnectError(`Stream name "${req.name}" uses a reserved prefix`, Code.InvalidArgument);
455
+ }
456
+ let stream;
457
+ try {
458
+ stream = streamRegistry.createStream(req.name);
459
+ }
460
+ catch {
461
+ throw new ConnectError(`Stream name "${req.name}" already exists`, Code.AlreadyExists);
462
+ }
463
+ const sub = streamRegistry.subscribe(stream.id, req.sessionId, "rw", "async", false);
464
+ pipeDelivery.ensureAsyncDeliveryListener(req.sessionId);
465
+ return create(grackle.CreateStreamResponseSchema, {
466
+ streamId: stream.id,
467
+ fd: sub.fd,
468
+ });
469
+ }
470
+ /** Attach another session to a stream the caller holds an fd on. */
471
+ export async function attachStream(req) {
472
+ if (!req.sessionId) {
473
+ throw new ConnectError("session_id is required", Code.InvalidArgument);
474
+ }
475
+ if (!req.targetSessionId) {
476
+ throw new ConnectError("target_session_id is required", Code.InvalidArgument);
477
+ }
478
+ const callerSub = streamRegistry.getSubscription(req.sessionId, req.fd);
479
+ if (!callerSub) {
480
+ throw new ConnectError(`No subscription found for session ${req.sessionId} fd ${String(req.fd)}`, Code.NotFound);
481
+ }
482
+ const permission = req.permission || "rw";
483
+ const deliveryMode = req.deliveryMode || "async";
484
+ validateSubscriptionParams(permission, deliveryMode);
485
+ if (!isPermissionSubset(permission, callerSub.permission)) {
486
+ throw new ConnectError(`Cannot grant "${permission}" — caller only has "${callerSub.permission}"`, Code.PermissionDenied);
487
+ }
488
+ const targetSub = streamRegistry.subscribe(callerSub.streamId, req.targetSessionId, permission, deliveryMode, false);
489
+ if (deliveryMode === "async") {
490
+ pipeDelivery.ensureAsyncDeliveryListener(req.targetSessionId);
491
+ }
492
+ return create(grackle.AttachStreamResponseSchema, {
493
+ fd: targetSub.fd,
494
+ });
495
+ }
496
+ /** List all active IPC streams with subscriber details and message buffer depth. */
497
+ export async function listStreams() {
498
+ const allStreams = streamRegistry.listStreams();
499
+ return create(grackle.ListStreamsResponseSchema, {
500
+ streams: allStreams.map((stream) => {
501
+ const subscribers = Array.from(stream.subscriptions.values()).map((sub) => create(grackle.StreamSubscriberInfoSchema, {
502
+ subscriptionId: sub.id,
503
+ sessionId: sub.sessionId,
504
+ fd: sub.fd,
505
+ permission: sub.permission,
506
+ deliveryMode: sub.deliveryMode,
507
+ createdBySpawn: sub.createdBySpawn,
508
+ }));
509
+ return create(grackle.StreamInfoSchema, {
510
+ id: stream.id,
511
+ name: stream.name,
512
+ subscriberCount: stream.subscriptions.size,
513
+ messageBufferDepth: stream.messages.length,
514
+ subscribers,
515
+ });
516
+ }),
517
+ });
518
+ }
519
+ /** List sessions with optional filters. */
520
+ export async function listSessions(req) {
521
+ const rows = sessionStore.listSessions(req.environmentId, req.status);
522
+ return create(grackle.SessionListSchema, {
523
+ sessions: rows.map(sessionRowToProto),
524
+ });
525
+ }
526
+ /** Get a session by ID. */
527
+ export async function getSession(req) {
528
+ const row = sessionStore.getSession(req.id);
529
+ if (!row) {
530
+ throw new ConnectError(`Session not found: ${req.id}`, Code.NotFound);
531
+ }
532
+ return sessionRowToProto(row);
533
+ }
534
+ /** Get all events recorded for a session. */
535
+ export async function getSessionEvents(req) {
536
+ const session = sessionStore.getSession(req.id);
537
+ if (!session) {
538
+ throw new ConnectError(`Session not found: ${req.id}`, Code.NotFound);
539
+ }
540
+ if (!session.logPath) {
541
+ return create(grackle.SessionEventListSchema, {
542
+ sessionId: req.id,
543
+ events: [],
544
+ });
545
+ }
546
+ const entries = logWriter.readLog(session.logPath);
547
+ return create(grackle.SessionEventListSchema, {
548
+ sessionId: req.id,
549
+ events: entries.map((e) => create(grackle.SessionEventSchema, {
550
+ sessionId: e.session_id,
551
+ type: eventTypeToEnum(e.type),
552
+ timestamp: e.timestamp,
553
+ content: e.content,
554
+ raw: e.raw || "",
555
+ })),
556
+ });
557
+ }
558
+ /** Get all sessions for a task. */
559
+ export async function getTaskSessions(req) {
560
+ if (!req.id) {
561
+ throw new ConnectError("task id is required", Code.InvalidArgument);
562
+ }
563
+ const rows = sessionStore.listSessionsForTask(req.id);
564
+ return create(grackle.SessionListSchema, {
565
+ sessions: rows.map(sessionRowToProto),
566
+ });
567
+ }
568
+ /** Stream session events as they occur. */
569
+ export async function* streamSession(req) {
570
+ const stream = streamHub.createStream(req.id);
571
+ try {
572
+ for await (const event of stream) {
573
+ yield event;
574
+ }
575
+ }
576
+ finally {
577
+ stream.cancel();
578
+ }
579
+ }
580
+ /** Stream all session events across all sessions. */
581
+ export async function* streamAll() {
582
+ const stream = streamHub.createGlobalStream();
583
+ try {
584
+ for await (const event of stream) {
585
+ yield event;
586
+ }
587
+ }
588
+ finally {
589
+ stream.cancel();
590
+ }
591
+ }
592
+ /** Stream domain events (replaces WebSocket event broadcasting). */
593
+ export async function* streamEvents() {
594
+ // Create the event stream FIRST so the domain-event subscription is registered
595
+ // before draining pending escalations (otherwise drained events would be missed).
596
+ const stream = createEventStream();
597
+ // Drain pending escalations — emits domain events that flow through the stream.
598
+ deliverPendingEscalations().catch((err) => {
599
+ logger.error({ err }, "Failed to drain pending escalations on stream connect");
600
+ });
601
+ try {
602
+ for await (const event of stream) {
603
+ yield event;
604
+ }
605
+ }
606
+ finally {
607
+ stream.cancel();
608
+ }
609
+ }
610
+ //# sourceMappingURL=session-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-handlers.js","sourceRoot":"","sources":["../src/session-handlers.ts"],"names":[],"mappings":"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"}