mcp-codex-subagent 2.0.10 → 2.0.11

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
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-codex-subagent",
3
- "version": "2.0.10",
3
+ "version": "2.0.11",
4
4
  "description": "MCP server for OpenAI Codex CLI with role-based templates, specialization overlays, and context file injection",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -12,19 +12,6 @@
12
12
  "directories": {
13
13
  "doc": "docs"
14
14
  },
15
- "scripts": {
16
- "build": "tsc && mkdir -p dist/templates/overlays && cp src/templates/*.mdx dist/templates/ && cp src/templates/overlays/*.mdx dist/templates/overlays/",
17
- "start": "node dist/index.js",
18
- "dev": "tsx src/index.ts",
19
- "test": "jest",
20
- "test:watch": "jest --watch",
21
- "test:coverage": "jest --coverage",
22
- "lint": "eslint src/**/*.ts",
23
- "lint:fix": "eslint src/**/*.ts --fix",
24
- "format": "prettier --write src/**/*.ts",
25
- "format:check": "prettier --check src/**/*.ts",
26
- "clean": "rm -rf dist"
27
- },
28
15
  "repository": {
29
16
  "type": "git",
30
17
  "url": "git+https://github.com/yigitkonur/mcp-codex-subagent.git"
@@ -66,5 +53,18 @@
66
53
  "ts-jest": "^29.4.1",
67
54
  "tsx": "^4.20.4",
68
55
  "typescript": "^5.9.2"
56
+ },
57
+ "scripts": {
58
+ "build": "tsc && mkdir -p dist/templates/overlays && cp src/templates/*.mdx dist/templates/ && cp src/templates/overlays/*.mdx dist/templates/overlays/",
59
+ "start": "node dist/index.js",
60
+ "dev": "tsx src/index.ts",
61
+ "test": "jest",
62
+ "test:watch": "jest --watch",
63
+ "test:coverage": "jest --coverage",
64
+ "lint": "eslint src/**/*.ts",
65
+ "lint:fix": "eslint src/**/*.ts --fix",
66
+ "format": "prettier --write src/**/*.ts",
67
+ "format:check": "prettier --check src/**/*.ts",
68
+ "clean": "rm -rf dist"
69
69
  }
70
- }
70
+ }
@@ -1,75 +0,0 @@
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
- pid?: number;
23
- }
24
- /**
25
- * Create a new task and return it.
26
- */
27
- export declare function createTask(opts: {
28
- prompt: string;
29
- role?: string;
30
- specialization?: string;
31
- model: string;
32
- cwd: string;
33
- }): Promise<CodexTask>;
34
- /**
35
- * Get a task by ID.
36
- */
37
- export declare function getTask(id: string): CodexTask | undefined;
38
- /**
39
- * Get all tasks.
40
- */
41
- export declare function getAllTasks(): CodexTask[];
42
- /**
43
- * Update a task with partial data.
44
- */
45
- export declare function updateTask(id: string, partial: Partial<CodexTask>): CodexTask | undefined;
46
- /**
47
- * Append an output line to a task and stream to output file.
48
- */
49
- export declare function appendOutput(id: string, line: string): Promise<void>;
50
- /**
51
- * Mark task as completed with optional metadata.
52
- */
53
- export declare function completeTask(id: string, metadata?: Record<string, unknown>): Promise<void>;
54
- /**
55
- * Mark task as failed with error.
56
- */
57
- export declare function failTask(id: string, error: string): Promise<void>;
58
- /**
59
- * Store a background process reference for a task.
60
- * Also stores PID on the task for visibility.
61
- */
62
- export declare function setProcess(id: string, proc: ChildProcess): void;
63
- /**
64
- * Get the background process for a task.
65
- */
66
- export declare function getProcess(id: string): ChildProcess | undefined;
67
- /**
68
- * Get a stall warning message if a running task has exceeded the threshold.
69
- */
70
- export declare function getStallWarning(task: CodexTask): string | null;
71
- /**
72
- * Get task counts by status.
73
- */
74
- export declare function getTaskCounts(): Record<TaskStatus | 'total', number>;
75
- //# sourceMappingURL=task-manager.d.ts.map
@@ -1 +0,0 @@
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;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;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,CAyBrB;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,CACxB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAC1B,SAAS,GAAG,SAAS,CAMvB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB1E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,EACV,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWvE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAO/D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE/D;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAS9D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAAC,UAAU,GAAG,OAAO,EAAE,MAAM,CAAC,CAepE"}
@@ -1,196 +0,0 @@
1
- /**
2
- * In-memory task state manager for async codex execution.
3
- * Tracks background codex processes and their output.
4
- */
5
- import { generateTaskId, normalizeTaskId } from '../utils/task-id-generator.js';
6
- import { createOutputFile, appendToOutputFile, finalizeOutputFile, } from './output-file.js';
7
- // --- Constants ---
8
- const MAX_TASKS = 100;
9
- const MAX_OUTPUT_LINES = 2000;
10
- // --- Task Manager ---
11
- // In-memory task store
12
- const tasks = new Map();
13
- // Background process references (not serialized)
14
- const processes = new Map();
15
- /**
16
- * Generate a collision-free task ID.
17
- */
18
- function generateUniqueTaskId() {
19
- let id = generateTaskId();
20
- let attempts = 0;
21
- while (tasks.has(normalizeTaskId(id)) && attempts < 20) {
22
- id = generateTaskId();
23
- attempts++;
24
- }
25
- // Fallback to timestamp-based ID if collisions persist
26
- if (tasks.has(normalizeTaskId(id))) {
27
- id = `task-${Date.now()}-${Math.floor(Math.random() * 1000)}`;
28
- }
29
- return id;
30
- }
31
- /**
32
- * Evict oldest completed/failed tasks if at capacity.
33
- */
34
- function evictIfNeeded() {
35
- if (tasks.size < MAX_TASKS)
36
- return;
37
- // Find terminal tasks sorted by startTime (oldest first)
38
- const terminal = [...tasks.values()]
39
- .filter((t) => t.status === 'completed' || t.status === 'failed')
40
- .sort((a, b) => a.startTime.localeCompare(b.startTime));
41
- for (const task of terminal) {
42
- if (tasks.size < MAX_TASKS)
43
- break;
44
- tasks.delete(normalizeTaskId(task.id));
45
- processes.delete(normalizeTaskId(task.id));
46
- }
47
- }
48
- /**
49
- * Create a new task and return it.
50
- */
51
- export async function createTask(opts) {
52
- evictIfNeeded();
53
- const id = generateUniqueTaskId();
54
- const outputFilePath = await createOutputFile(opts.cwd, id);
55
- const task = {
56
- id,
57
- status: 'running',
58
- prompt: opts.prompt.length > 200
59
- ? opts.prompt.slice(0, 200) + '...'
60
- : opts.prompt,
61
- role: opts.role,
62
- specialization: opts.specialization,
63
- model: opts.model,
64
- cwd: opts.cwd,
65
- startTime: new Date().toISOString(),
66
- outputFilePath: outputFilePath ?? undefined,
67
- outputLines: 0,
68
- output: [],
69
- };
70
- tasks.set(normalizeTaskId(id), task);
71
- return task;
72
- }
73
- /**
74
- * Get a task by ID.
75
- */
76
- export function getTask(id) {
77
- return tasks.get(normalizeTaskId(id));
78
- }
79
- /**
80
- * Get all tasks.
81
- */
82
- export function getAllTasks() {
83
- return [...tasks.values()];
84
- }
85
- /**
86
- * Update a task with partial data.
87
- */
88
- export function updateTask(id, partial) {
89
- const key = normalizeTaskId(id);
90
- const task = tasks.get(key);
91
- if (!task)
92
- return undefined;
93
- Object.assign(task, partial);
94
- return task;
95
- }
96
- /**
97
- * Append an output line to a task and stream to output file.
98
- */
99
- export async function appendOutput(id, line) {
100
- const key = normalizeTaskId(id);
101
- const task = tasks.get(key);
102
- if (!task)
103
- return;
104
- task.output.push(line);
105
- task.outputLines++;
106
- // Trim oldest lines if over limit
107
- if (task.output.length > MAX_OUTPUT_LINES) {
108
- task.output = task.output.slice(task.output.length - MAX_OUTPUT_LINES);
109
- }
110
- // Stream to output file
111
- if (task.outputFilePath) {
112
- await appendToOutputFile(task.cwd, task.id, line);
113
- }
114
- }
115
- /**
116
- * Mark task as completed with optional metadata.
117
- */
118
- export async function completeTask(id, metadata) {
119
- const key = normalizeTaskId(id);
120
- const task = tasks.get(key);
121
- if (!task)
122
- return;
123
- task.status = 'completed';
124
- task.endTime = new Date().toISOString();
125
- if (metadata)
126
- task.metadata = { ...task.metadata, ...metadata };
127
- await finalizeOutputFile(task.cwd, task.id, 'completed');
128
- processes.delete(key);
129
- }
130
- /**
131
- * Mark task as failed with error.
132
- */
133
- export async function failTask(id, error) {
134
- const key = normalizeTaskId(id);
135
- const task = tasks.get(key);
136
- if (!task)
137
- return;
138
- task.status = 'failed';
139
- task.endTime = new Date().toISOString();
140
- task.error = error;
141
- await finalizeOutputFile(task.cwd, task.id, 'failed', error);
142
- processes.delete(key);
143
- }
144
- /**
145
- * Store a background process reference for a task.
146
- * Also stores PID on the task for visibility.
147
- */
148
- export function setProcess(id, proc) {
149
- const key = normalizeTaskId(id);
150
- processes.set(key, proc);
151
- const task = tasks.get(key);
152
- if (task && proc.pid) {
153
- task.pid = proc.pid;
154
- }
155
- }
156
- /**
157
- * Get the background process for a task.
158
- */
159
- export function getProcess(id) {
160
- return processes.get(normalizeTaskId(id));
161
- }
162
- // --- Stall Detection ---
163
- const STALL_THRESHOLD_MS = 10 * 60 * 1000; // 10 minutes
164
- /**
165
- * Get a stall warning message if a running task has exceeded the threshold.
166
- */
167
- export function getStallWarning(task) {
168
- if (task.status !== 'running')
169
- return null;
170
- const elapsed = Date.now() - new Date(task.startTime).getTime();
171
- if (elapsed < STALL_THRESHOLD_MS)
172
- return null;
173
- const minutes = Math.floor(elapsed / 60000);
174
- if (task.pid) {
175
- return `Task running for >${minutes} min. If stalled, kill it: \`kill -9 ${task.pid}\``;
176
- }
177
- return `Task running for >${minutes} min and may be stalled.`;
178
- }
179
- /**
180
- * Get task counts by status.
181
- */
182
- export function getTaskCounts() {
183
- const counts = {
184
- pending: 0,
185
- running: 0,
186
- completed: 0,
187
- failed: 0,
188
- total: 0,
189
- };
190
- for (const task of tasks.values()) {
191
- counts[task.status]++;
192
- counts.total++;
193
- }
194
- return counts;
195
- }
196
- //# sourceMappingURL=task-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-manager.js","sourceRoot":"","sources":["../../src/services/task-manager.ts"],"names":[],"mappings":"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"}