mcp-codex-subagent 1.0.0 → 2.0.4

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/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import chalk from 'chalk';
3
3
  import { CodexMcpServer } from './server.js';
4
+ import { closeAllOutputHandles } from './services/output-file.js';
4
5
  const SERVER_CONFIG = {
5
6
  name: 'codex-mcp-server',
6
7
  version: '0.0.6',
@@ -15,5 +16,17 @@ async function main() {
15
16
  process.exit(1);
16
17
  }
17
18
  }
19
+ // Graceful shutdown: close all output file handles
20
+ async function shutdown() {
21
+ try {
22
+ await closeAllOutputHandles();
23
+ }
24
+ catch {
25
+ // Best-effort cleanup
26
+ }
27
+ process.exit(0);
28
+ }
29
+ process.on('SIGINT', shutdown);
30
+ process.on('SIGTERM', shutdown);
18
31
  main();
19
32
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,OAAO;CACR,CAAC;AAEX,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,OAAO;CACR,CAAC;AAEX,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,mDAAmD;AACnD,KAAK,UAAU,QAAQ;IACrB,IAAI,CAAC;QACH,MAAM,qBAAqB,EAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEhC,IAAI,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,YAAY,EAKlB,MAAM,YAAY,CAAC;AAKpB,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,YAAY;IAiBhC,OAAO,CAAC,aAAa;IA4DrB,OAAO,CAAC,eAAe;IAIjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,KAAK,YAAY,EAKlB,MAAM,YAAY,CAAC;AAwBpB,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,YAAY;IA6BhC,OAAO,CAAC,aAAa;IAyOrB,OAAO,CAAC,eAAe;IAIjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
package/dist/server.js CHANGED
@@ -1,11 +1,25 @@
1
1
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
- import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
3
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
4
4
  import chalk from 'chalk';
5
5
  import { TOOLS, } from './types.js';
6
6
  import { handleError } from './errors.js';
7
7
  import { toolDefinitions } from './tools/definitions.js';
8
- import { toolHandlers } from './tools/handlers.js';
8
+ import { toolHandlers, setNotificationSender } from './tools/handlers.js';
9
+ import { getTask, getAllTasks, getTaskCounts, } from './services/task-manager.js';
10
+ /**
11
+ * Filter output lines to remove noise for resource display.
12
+ */
13
+ function filterOutputForResource(lines) {
14
+ return lines.filter(line => {
15
+ if (!line.trim())
16
+ return false;
17
+ // Keep meaningful lines, skip internal debug noise
18
+ if (line.startsWith('[stderr]') && line.length < 20)
19
+ return false;
20
+ return true;
21
+ });
22
+ }
9
23
  export class CodexMcpServer {
10
24
  server;
11
25
  config;
@@ -17,9 +31,21 @@ export class CodexMcpServer {
17
31
  }, {
18
32
  capabilities: {
19
33
  tools: {},
34
+ resources: {},
20
35
  },
21
36
  });
22
37
  this.setupHandlers();
38
+ // Wire notification sender so handlers can send resource-changed notifications
39
+ setNotificationSender({
40
+ sendNotification: async (notification) => {
41
+ try {
42
+ await this.server.sendResourceListChanged();
43
+ }
44
+ catch {
45
+ // Non-fatal
46
+ }
47
+ },
48
+ });
23
49
  }
24
50
  setupHandlers() {
25
51
  // List tools handler
@@ -30,7 +56,6 @@ export class CodexMcpServer {
30
56
  this.server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
31
57
  const { name, arguments: args } = request.params;
32
58
  const progressToken = request.params._meta?.progressToken;
33
- // Create progress sender that uses MCP notifications
34
59
  const createProgressContext = () => {
35
60
  let progressCount = 0;
36
61
  return {
@@ -51,7 +76,6 @@ export class CodexMcpServer {
51
76
  });
52
77
  }
53
78
  catch (err) {
54
- // Log but don't fail the operation if progress notification fails
55
79
  console.error(chalk.yellow('Failed to send progress notification:'), err);
56
80
  }
57
81
  },
@@ -77,6 +101,161 @@ export class CodexMcpServer {
77
101
  };
78
102
  }
79
103
  });
104
+ // --- MCP Resources ---
105
+ // List resources
106
+ this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
107
+ const tasks = getAllTasks();
108
+ const counts = getTaskCounts();
109
+ const resources = [
110
+ {
111
+ uri: 'system:///status',
112
+ name: 'System Status',
113
+ description: `Server status — ${counts.total} tasks (${counts.running} running, ${counts.completed} completed, ${counts.failed} failed)`,
114
+ mimeType: 'application/json',
115
+ },
116
+ {
117
+ uri: 'task:///all',
118
+ name: 'All Tasks',
119
+ description: `${counts.total} tasks total`,
120
+ mimeType: 'application/json',
121
+ },
122
+ ];
123
+ // Add individual task resources
124
+ for (const task of tasks) {
125
+ resources.push({
126
+ uri: `task:///${task.id}`,
127
+ name: `Task: ${task.id}`,
128
+ description: `[${task.status}] ${task.prompt.slice(0, 80)}`,
129
+ mimeType: 'application/json',
130
+ });
131
+ }
132
+ return { resources };
133
+ });
134
+ // List resource templates
135
+ this.server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => {
136
+ return {
137
+ resourceTemplates: [
138
+ {
139
+ uriTemplate: 'task:///{task_id}',
140
+ name: 'Task Details',
141
+ description: 'Full task detail including output tail, metadata, and timing',
142
+ mimeType: 'application/json',
143
+ },
144
+ ],
145
+ };
146
+ });
147
+ // Read resource
148
+ this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
149
+ const { uri } = request.params;
150
+ // system:///status
151
+ if (uri === 'system:///status') {
152
+ const counts = getTaskCounts();
153
+ const status = {
154
+ server: {
155
+ name: this.config.name,
156
+ version: this.config.version,
157
+ model: 'gpt-5.3-codex',
158
+ uptime_seconds: Math.floor(process.uptime()),
159
+ },
160
+ tasks: counts,
161
+ };
162
+ return {
163
+ contents: [
164
+ {
165
+ uri,
166
+ mimeType: 'application/json',
167
+ text: JSON.stringify(status, null, 2),
168
+ },
169
+ ],
170
+ };
171
+ }
172
+ // task:///all
173
+ if (uri === 'task:///all') {
174
+ const tasks = getAllTasks();
175
+ const summary = {
176
+ count: tasks.length,
177
+ tasks: tasks.map(t => ({
178
+ id: t.id,
179
+ status: t.status,
180
+ role: t.role,
181
+ specialization: t.specialization,
182
+ model: t.model,
183
+ output_lines: t.outputLines,
184
+ started: t.startTime,
185
+ ended: t.endTime,
186
+ error: t.error,
187
+ cwd: t.cwd,
188
+ prompt: t.prompt,
189
+ })),
190
+ };
191
+ return {
192
+ contents: [
193
+ {
194
+ uri,
195
+ mimeType: 'application/json',
196
+ text: JSON.stringify(summary, null, 2),
197
+ },
198
+ ],
199
+ };
200
+ }
201
+ // task:///{id}
202
+ const taskIdMatch = uri.match(/^task:\/\/\/(.+)$/);
203
+ if (taskIdMatch) {
204
+ const taskId = taskIdMatch[1];
205
+ const task = getTask(taskId);
206
+ if (!task) {
207
+ return {
208
+ contents: [
209
+ {
210
+ uri,
211
+ mimeType: 'application/json',
212
+ text: JSON.stringify({ error: `Task "${taskId}" not found` }),
213
+ },
214
+ ],
215
+ };
216
+ }
217
+ const filteredOutput = filterOutputForResource(task.output);
218
+ const outputTail = filteredOutput.slice(-50);
219
+ const detail = {
220
+ id: task.id,
221
+ status: task.status,
222
+ role: task.role,
223
+ specialization: task.specialization,
224
+ model: task.model,
225
+ output_lines: task.outputLines,
226
+ output_tail: outputTail.join('\n'),
227
+ started: task.startTime,
228
+ ended: task.endTime,
229
+ cwd: task.cwd,
230
+ output_file: task.outputFilePath,
231
+ prompt: task.prompt,
232
+ error: task.error,
233
+ };
234
+ // Include last_message from metadata if available
235
+ if (task.metadata?.lastMessage) {
236
+ detail.last_message = task.metadata.lastMessage;
237
+ }
238
+ return {
239
+ contents: [
240
+ {
241
+ uri,
242
+ mimeType: 'application/json',
243
+ text: JSON.stringify(detail, null, 2),
244
+ },
245
+ ],
246
+ };
247
+ }
248
+ // Unknown URI
249
+ return {
250
+ contents: [
251
+ {
252
+ uri,
253
+ mimeType: 'text/plain',
254
+ text: `Unknown resource: ${uri}`,
255
+ },
256
+ ],
257
+ };
258
+ });
80
259
  }
81
260
  isValidToolName(name) {
82
261
  return Object.values(TOOLS).includes(name);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Manages task output file persistence with streaming.
3
+ * Ported from mcp-supersubagents/src/services/output-file.ts
4
+ * Uses .codex-agents/ directory (distinct from .super-agents/).
5
+ */
6
+ /**
7
+ * Get the output directory path for a given cwd.
8
+ * Returns: {cwd}/.codex-agents/
9
+ */
10
+ export declare function getOutputDir(cwd: string): string;
11
+ /**
12
+ * Get the output file path for a task.
13
+ * Returns: {cwd}/.codex-agents/{taskId}.output
14
+ */
15
+ export declare function getOutputPath(cwd: string, taskId: string): string;
16
+ /**
17
+ * Get the last-message file path for a task.
18
+ * Returns: {cwd}/.codex-agents/{taskId}.last-message.txt
19
+ */
20
+ export declare function getLastMessagePath(cwd: string, taskId: string): string;
21
+ /**
22
+ * Create an empty output file for a task.
23
+ * Returns the absolute path to the output file, or null on failure.
24
+ */
25
+ export declare function createOutputFile(cwd: string, taskId: string): Promise<string | null>;
26
+ /**
27
+ * Append a line to the task's output file (async, uses persistent handle).
28
+ */
29
+ export declare function appendToOutputFile(cwd: string, taskId: string, line: string): Promise<boolean>;
30
+ /**
31
+ * Append completion footer to output file and close handle.
32
+ */
33
+ export declare function finalizeOutputFile(cwd: string, taskId: string, status: string, error?: string): Promise<boolean>;
34
+ /**
35
+ * Close all open file handles (called during shutdown).
36
+ */
37
+ export declare function closeAllOutputHandles(): Promise<void>;
38
+ //# sourceMappingURL=output-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-file.d.ts","sourceRoot":"","sources":["../../src/services/output-file.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtE;AAkBD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmB1F;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBpG;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBtH;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAS3D"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Manages task output file persistence with streaming.
3
+ * Ported from mcp-supersubagents/src/services/output-file.ts
4
+ * Uses .codex-agents/ directory (distinct from .super-agents/).
5
+ */
6
+ import { open, mkdir } from 'fs/promises';
7
+ import { join } from 'path';
8
+ const OUTPUT_DIR_NAME = '.codex-agents';
9
+ // Cache of directories known to exist — avoids stat syscall on every append
10
+ const knownDirs = new Set();
11
+ // Persistent file handles — one per task, closed on finalize
12
+ const openHandles = new Map();
13
+ /**
14
+ * Get the output directory path for a given cwd.
15
+ * Returns: {cwd}/.codex-agents/
16
+ */
17
+ export function getOutputDir(cwd) {
18
+ return join(cwd, OUTPUT_DIR_NAME);
19
+ }
20
+ /**
21
+ * Get the output file path for a task.
22
+ * Returns: {cwd}/.codex-agents/{taskId}.output
23
+ */
24
+ export function getOutputPath(cwd, taskId) {
25
+ return join(getOutputDir(cwd), `${taskId}.output`);
26
+ }
27
+ /**
28
+ * Get the last-message file path for a task.
29
+ * Returns: {cwd}/.codex-agents/{taskId}.last-message.txt
30
+ */
31
+ export function getLastMessagePath(cwd, taskId) {
32
+ return join(getOutputDir(cwd), `${taskId}.last-message.txt`);
33
+ }
34
+ /**
35
+ * Ensure output directory exists (async, cached).
36
+ */
37
+ async function ensureOutputDir(cwd) {
38
+ const dir = getOutputDir(cwd);
39
+ if (knownDirs.has(dir))
40
+ return true;
41
+ try {
42
+ await mkdir(dir, { recursive: true });
43
+ knownDirs.add(dir);
44
+ return true;
45
+ }
46
+ catch (error) {
47
+ console.error(`[output-file] Failed to create output directory: ${error}`);
48
+ return false;
49
+ }
50
+ }
51
+ /**
52
+ * Create an empty output file for a task.
53
+ * Returns the absolute path to the output file, or null on failure.
54
+ */
55
+ export async function createOutputFile(cwd, taskId) {
56
+ if (!(await ensureOutputDir(cwd))) {
57
+ return null;
58
+ }
59
+ const outputPath = getOutputPath(cwd, taskId);
60
+ try {
61
+ const header = `# Task: ${taskId}\n# Started: ${new Date().toISOString()}\n# Working directory: ${cwd}\n${'─'.repeat(60)}\n\n`;
62
+ // Write header and close immediately — appendToOutputFile will open
63
+ // its own persistent handle on first call.
64
+ const handle = await open(outputPath, 'w');
65
+ await handle.write(header);
66
+ await handle.close();
67
+ return outputPath;
68
+ }
69
+ catch (error) {
70
+ console.error(`[output-file] Failed to create output file: ${error}`);
71
+ return null;
72
+ }
73
+ }
74
+ /**
75
+ * Append a line to the task's output file (async, uses persistent handle).
76
+ */
77
+ export async function appendToOutputFile(cwd, taskId, line) {
78
+ const key = `${cwd}:${taskId}`;
79
+ try {
80
+ let handle = openHandles.get(key);
81
+ if (!handle) {
82
+ await ensureOutputDir(cwd);
83
+ handle = await open(getOutputPath(cwd, taskId), 'a');
84
+ openHandles.set(key, handle);
85
+ }
86
+ await handle.write(line + '\n');
87
+ return true;
88
+ }
89
+ catch {
90
+ // Silent failure — don't break task execution for file I/O issues
91
+ openHandles.delete(key);
92
+ return false;
93
+ }
94
+ }
95
+ /**
96
+ * Append completion footer to output file and close handle.
97
+ */
98
+ export async function finalizeOutputFile(cwd, taskId, status, error) {
99
+ const key = `${cwd}:${taskId}`;
100
+ try {
101
+ const footer = [
102
+ '',
103
+ '─'.repeat(60),
104
+ `# Completed: ${new Date().toISOString()}`,
105
+ `# Status: ${status}`,
106
+ error ? `# Error: ${error}` : null,
107
+ ].filter(Boolean).join('\n') + '\n';
108
+ let handle = openHandles.get(key);
109
+ if (!handle) {
110
+ handle = await open(getOutputPath(cwd, taskId), 'a');
111
+ }
112
+ await handle.write(footer);
113
+ await handle.close();
114
+ openHandles.delete(key);
115
+ return true;
116
+ }
117
+ catch {
118
+ openHandles.delete(key);
119
+ return false;
120
+ }
121
+ }
122
+ /**
123
+ * Close all open file handles (called during shutdown).
124
+ */
125
+ export async function closeAllOutputHandles() {
126
+ for (const [key, handle] of openHandles) {
127
+ try {
128
+ await handle.close();
129
+ }
130
+ catch {
131
+ // Ignore close errors during shutdown
132
+ }
133
+ openHandles.delete(key);
134
+ }
135
+ }
136
+ //# sourceMappingURL=output-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-file.js","sourceRoot":"","sources":["../../src/services/output-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * In-memory task state manager for async codex execution.
3
+ * Tracks background codex processes and their output.
4
+ */
5
+ import type { ChildProcess } from 'child_process';
6
+ export type TaskStatus = 'pending' | 'running' | 'completed' | 'failed';
7
+ export interface CodexTask {
8
+ id: string;
9
+ status: TaskStatus;
10
+ prompt: string;
11
+ role?: string;
12
+ specialization?: string;
13
+ model: string;
14
+ cwd: string;
15
+ startTime: string;
16
+ endTime?: string;
17
+ outputFilePath?: string;
18
+ outputLines: number;
19
+ output: string[];
20
+ error?: string;
21
+ metadata?: Record<string, unknown>;
22
+ }
23
+ /**
24
+ * Create a new task and return it.
25
+ */
26
+ export declare function createTask(opts: {
27
+ prompt: string;
28
+ role?: string;
29
+ specialization?: string;
30
+ model: string;
31
+ cwd: string;
32
+ }): Promise<CodexTask>;
33
+ /**
34
+ * Get a task by ID.
35
+ */
36
+ export declare function getTask(id: string): CodexTask | undefined;
37
+ /**
38
+ * Get all tasks.
39
+ */
40
+ export declare function getAllTasks(): CodexTask[];
41
+ /**
42
+ * Update a task with partial data.
43
+ */
44
+ export declare function updateTask(id: string, partial: Partial<CodexTask>): CodexTask | undefined;
45
+ /**
46
+ * Append an output line to a task and stream to output file.
47
+ */
48
+ export declare function appendOutput(id: string, line: string): Promise<void>;
49
+ /**
50
+ * Mark task as completed with optional metadata.
51
+ */
52
+ export declare function completeTask(id: string, metadata?: Record<string, unknown>): Promise<void>;
53
+ /**
54
+ * Mark task as failed with error.
55
+ */
56
+ export declare function failTask(id: string, error: string): Promise<void>;
57
+ /**
58
+ * Store a background process reference for a task.
59
+ */
60
+ export declare function setProcess(id: string, proc: ChildProcess): void;
61
+ /**
62
+ * Get the background process for a task.
63
+ */
64
+ export declare function getProcess(id: string): ChildProcess | undefined;
65
+ /**
66
+ * Get task counts by status.
67
+ */
68
+ export declare function getTaskCounts(): Record<TaskStatus | 'total', number>;
69
+ //# sourceMappingURL=task-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-manager.d.ts","sourceRoot":"","sources":["../../src/services/task-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAUlD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAkDD;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC,SAAS,CAAC,CAsBrB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEzD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,SAAS,EAAE,CAEzC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,SAAS,CAMzF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB1E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhG;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWvE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAE/D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE/D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAAC,UAAU,GAAG,OAAO,EAAE,MAAM,CAAC,CAepE"}