pm-orchestrator-runner 1.0.7 → 1.0.8

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 (94) hide show
  1. package/README.md +20 -10
  2. package/dist/cli/index.js +36 -1
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/config/index.d.ts +9 -0
  5. package/dist/config/index.d.ts.map +1 -0
  6. package/dist/config/index.js +19 -0
  7. package/dist/config/index.js.map +1 -0
  8. package/dist/config/namespace.d.ts +86 -0
  9. package/dist/config/namespace.d.ts.map +1 -0
  10. package/dist/config/namespace.js +150 -0
  11. package/dist/config/namespace.js.map +1 -0
  12. package/dist/core/runner-core.d.ts +2 -0
  13. package/dist/core/runner-core.d.ts.map +1 -1
  14. package/dist/core/runner-core.js +27 -1
  15. package/dist/core/runner-core.js.map +1 -1
  16. package/dist/executor/claude-code-executor.d.ts +28 -0
  17. package/dist/executor/claude-code-executor.d.ts.map +1 -1
  18. package/dist/executor/claude-code-executor.js +184 -1
  19. package/dist/executor/claude-code-executor.js.map +1 -1
  20. package/dist/executor/deterministic-executor.d.ts +2 -1
  21. package/dist/executor/deterministic-executor.d.ts.map +1 -1
  22. package/dist/executor/deterministic-executor.js +7 -0
  23. package/dist/executor/deterministic-executor.js.map +1 -1
  24. package/dist/executor/recovery-executor.d.ts +2 -1
  25. package/dist/executor/recovery-executor.d.ts.map +1 -1
  26. package/dist/executor/recovery-executor.js +7 -0
  27. package/dist/executor/recovery-executor.js.map +1 -1
  28. package/dist/models/enums.d.ts +54 -0
  29. package/dist/models/enums.d.ts.map +1 -1
  30. package/dist/models/enums.js +59 -1
  31. package/dist/models/enums.js.map +1 -1
  32. package/dist/models/index.d.ts +4 -1
  33. package/dist/models/index.d.ts.map +1 -1
  34. package/dist/models/index.js +50 -2
  35. package/dist/models/index.js.map +1 -1
  36. package/dist/models/run.d.ts +82 -0
  37. package/dist/models/run.d.ts.map +1 -0
  38. package/dist/models/run.js +161 -0
  39. package/dist/models/run.js.map +1 -0
  40. package/dist/models/task-group.d.ts +164 -0
  41. package/dist/models/task-group.d.ts.map +1 -0
  42. package/dist/models/task-group.js +246 -0
  43. package/dist/models/task-group.js.map +1 -0
  44. package/dist/models/task.d.ts +7 -0
  45. package/dist/models/task.d.ts.map +1 -1
  46. package/dist/models/task.js.map +1 -1
  47. package/dist/models/thread.d.ts +53 -0
  48. package/dist/models/thread.d.ts.map +1 -0
  49. package/dist/models/thread.js +92 -0
  50. package/dist/models/thread.js.map +1 -0
  51. package/dist/pool/agent-pool.d.ts.map +1 -1
  52. package/dist/pool/agent-pool.js +2 -3
  53. package/dist/pool/agent-pool.js.map +1 -1
  54. package/dist/prompt/index.d.ts +8 -0
  55. package/dist/prompt/index.d.ts.map +1 -0
  56. package/dist/prompt/index.js +13 -0
  57. package/dist/prompt/index.js.map +1 -0
  58. package/dist/prompt/prompt-assembler.d.ts +145 -0
  59. package/dist/prompt/prompt-assembler.d.ts.map +1 -0
  60. package/dist/prompt/prompt-assembler.js +242 -0
  61. package/dist/prompt/prompt-assembler.js.map +1 -0
  62. package/dist/queue/index.d.ts +41 -0
  63. package/dist/queue/index.d.ts.map +1 -0
  64. package/dist/queue/index.js +42 -0
  65. package/dist/queue/index.js.map +1 -0
  66. package/dist/queue/queue-poller.d.ts +107 -0
  67. package/dist/queue/queue-poller.d.ts.map +1 -0
  68. package/dist/queue/queue-poller.js +181 -0
  69. package/dist/queue/queue-poller.js.map +1 -0
  70. package/dist/queue/queue-store.d.ts +163 -0
  71. package/dist/queue/queue-store.d.ts.map +1 -0
  72. package/dist/queue/queue-store.js +421 -0
  73. package/dist/queue/queue-store.js.map +1 -0
  74. package/dist/repl/index.d.ts +1 -0
  75. package/dist/repl/index.d.ts.map +1 -1
  76. package/dist/repl/index.js +3 -1
  77. package/dist/repl/index.js.map +1 -1
  78. package/dist/repl/repl-interface.d.ts +40 -5
  79. package/dist/repl/repl-interface.d.ts.map +1 -1
  80. package/dist/repl/repl-interface.js +95 -17
  81. package/dist/repl/repl-interface.js.map +1 -1
  82. package/dist/repl/two-pane-renderer.d.ts +148 -0
  83. package/dist/repl/two-pane-renderer.d.ts.map +1 -0
  84. package/dist/repl/two-pane-renderer.js +239 -0
  85. package/dist/repl/two-pane-renderer.js.map +1 -0
  86. package/dist/web/index.d.ts +45 -0
  87. package/dist/web/index.d.ts.map +1 -0
  88. package/dist/web/index.js +47 -0
  89. package/dist/web/index.js.map +1 -0
  90. package/dist/web/server.d.ts +71 -0
  91. package/dist/web/server.d.ts.map +1 -0
  92. package/dist/web/server.js +329 -0
  93. package/dist/web/server.js.map +1 -0
  94. package/package.json +11 -3
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+ /**
3
+ * Web Server - Express HTTP server
4
+ * Per spec/19_WEB_UI.md
5
+ *
6
+ * Provides:
7
+ * - REST API for queue operations (read/write to QueueStore)
8
+ * - Static file serving for frontend
9
+ * - Same process as Runner (integrated)
10
+ *
11
+ * IMPORTANT: Web UI does NOT directly command Runner.
12
+ * Submit = queue insert only.
13
+ */
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.WebServer = void 0;
19
+ exports.createApp = createApp;
20
+ const express_1 = __importDefault(require("express"));
21
+ const path_1 = __importDefault(require("path"));
22
+ /**
23
+ * Create configured Express app
24
+ */
25
+ function createApp(config) {
26
+ const app = (0, express_1.default)();
27
+ const { queueStore, sessionId } = config;
28
+ // Middleware
29
+ app.use(express_1.default.json());
30
+ app.use(express_1.default.urlencoded({ extended: true }));
31
+ // Static files
32
+ app.use(express_1.default.static(path_1.default.join(__dirname, 'public')));
33
+ // CORS headers for local development
34
+ app.use((_req, res, next) => {
35
+ res.header('Access-Control-Allow-Origin', '*');
36
+ res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
37
+ res.header('Access-Control-Allow-Headers', 'Content-Type');
38
+ next();
39
+ });
40
+ // ===================
41
+ // REST API Routes
42
+ // Per spec/19_WEB_UI.md
43
+ // ===================
44
+ /**
45
+ * GET /api/task-groups
46
+ * List all task groups with summary
47
+ */
48
+ app.get('/api/task-groups', async (_req, res) => {
49
+ try {
50
+ const groups = await queueStore.getAllTaskGroups();
51
+ res.json({ task_groups: groups });
52
+ }
53
+ catch (error) {
54
+ const message = error instanceof Error ? error.message : 'Unknown error';
55
+ res.status(500).json({ error: 'INTERNAL_ERROR', message });
56
+ }
57
+ });
58
+ /**
59
+ * POST /api/task-groups
60
+ * Create a new task group (enqueue first task)
61
+ * Body: { task_group_id: string, prompt: string }
62
+ */
63
+ app.post('/api/task-groups', async (req, res) => {
64
+ try {
65
+ const { task_group_id, prompt } = req.body;
66
+ // Fail-closed: validate input
67
+ if (!task_group_id || typeof task_group_id !== 'string' || task_group_id.trim() === '') {
68
+ res.status(400).json({
69
+ error: 'INVALID_INPUT',
70
+ message: 'task_group_id is required and must be a non-empty string',
71
+ });
72
+ return;
73
+ }
74
+ if (!prompt || typeof prompt !== 'string' || prompt.trim() === '') {
75
+ res.status(400).json({
76
+ error: 'INVALID_INPUT',
77
+ message: 'prompt is required and must be a non-empty string',
78
+ });
79
+ return;
80
+ }
81
+ // Enqueue the first task in this group
82
+ const item = await queueStore.enqueue(sessionId, task_group_id.trim(), prompt.trim());
83
+ res.status(201).json({
84
+ task_id: item.task_id,
85
+ task_group_id: item.task_group_id,
86
+ status: item.status,
87
+ created_at: item.created_at,
88
+ });
89
+ }
90
+ catch (error) {
91
+ const message = error instanceof Error ? error.message : 'Unknown error';
92
+ res.status(500).json({ error: 'INTERNAL_ERROR', message });
93
+ }
94
+ });
95
+ /**
96
+ * GET /api/task-groups/:task_group_id/tasks
97
+ * List tasks in a task group
98
+ */
99
+ app.get('/api/task-groups/:task_group_id/tasks', async (req, res) => {
100
+ try {
101
+ const task_group_id = req.params.task_group_id;
102
+ const tasks = await queueStore.getByTaskGroup(task_group_id);
103
+ res.json({
104
+ task_group_id,
105
+ tasks: tasks.map(t => ({
106
+ task_id: t.task_id,
107
+ status: t.status,
108
+ prompt: t.prompt,
109
+ created_at: t.created_at,
110
+ updated_at: t.updated_at,
111
+ error_message: t.error_message,
112
+ })),
113
+ });
114
+ }
115
+ catch (error) {
116
+ const message = error instanceof Error ? error.message : 'Unknown error';
117
+ res.status(500).json({ error: 'INTERNAL_ERROR', message });
118
+ }
119
+ });
120
+ /**
121
+ * GET /api/tasks/:task_id
122
+ * Get task detail
123
+ */
124
+ app.get('/api/tasks/:task_id', async (req, res) => {
125
+ try {
126
+ const task_id = req.params.task_id;
127
+ const task = await queueStore.getItem(task_id);
128
+ if (!task) {
129
+ res.status(404).json({
130
+ error: 'NOT_FOUND',
131
+ message: `Task not found: ${task_id}`,
132
+ });
133
+ return;
134
+ }
135
+ res.json({
136
+ task_id: task.task_id,
137
+ task_group_id: task.task_group_id,
138
+ session_id: task.session_id,
139
+ status: task.status,
140
+ prompt: task.prompt,
141
+ created_at: task.created_at,
142
+ updated_at: task.updated_at,
143
+ error_message: task.error_message,
144
+ // TODO: Add logs and changed_files when available
145
+ });
146
+ }
147
+ catch (error) {
148
+ const message = error instanceof Error ? error.message : 'Unknown error';
149
+ res.status(500).json({ error: 'INTERNAL_ERROR', message });
150
+ }
151
+ });
152
+ /**
153
+ * POST /api/tasks
154
+ * Enqueue a new task (does NOT run it directly)
155
+ * Body: { task_group_id: string, prompt: string }
156
+ *
157
+ * IMPORTANT: This only inserts into queue. Runner polls separately.
158
+ */
159
+ app.post('/api/tasks', async (req, res) => {
160
+ try {
161
+ const { task_group_id, prompt } = req.body;
162
+ // Fail-closed: validate input
163
+ if (!task_group_id || typeof task_group_id !== 'string' || task_group_id.trim() === '') {
164
+ res.status(400).json({
165
+ error: 'INVALID_INPUT',
166
+ message: 'task_group_id is required and must be a non-empty string',
167
+ });
168
+ return;
169
+ }
170
+ if (!prompt || typeof prompt !== 'string' || prompt.trim() === '') {
171
+ res.status(400).json({
172
+ error: 'INVALID_INPUT',
173
+ message: 'prompt is required and must be a non-empty string',
174
+ });
175
+ return;
176
+ }
177
+ // Enqueue only - does NOT run directly
178
+ const item = await queueStore.enqueue(sessionId, task_group_id.trim(), prompt.trim());
179
+ res.status(201).json({
180
+ task_id: item.task_id,
181
+ task_group_id: item.task_group_id,
182
+ status: item.status, // Always QUEUED
183
+ created_at: item.created_at,
184
+ });
185
+ }
186
+ catch (error) {
187
+ const message = error instanceof Error ? error.message : 'Unknown error';
188
+ res.status(500).json({ error: 'INTERNAL_ERROR', message });
189
+ }
190
+ });
191
+ // ===================
192
+ // Frontend Routes
193
+ // ===================
194
+ /**
195
+ * GET /
196
+ * Serve main page (task group list)
197
+ */
198
+ app.get('/', (_req, res) => {
199
+ res.sendFile(path_1.default.join(__dirname, 'public', 'index.html'));
200
+ });
201
+ /**
202
+ * GET /task-groups/:id
203
+ * Serve task list page
204
+ */
205
+ app.get('/task-groups/:id', (_req, res) => {
206
+ res.sendFile(path_1.default.join(__dirname, 'public', 'index.html'));
207
+ });
208
+ /**
209
+ * GET /tasks/:id
210
+ * Serve task detail page
211
+ */
212
+ app.get('/tasks/:id', (_req, res) => {
213
+ res.sendFile(path_1.default.join(__dirname, 'public', 'index.html'));
214
+ });
215
+ /**
216
+ * GET /new
217
+ * Serve new command form
218
+ */
219
+ app.get('/new', (_req, res) => {
220
+ res.sendFile(path_1.default.join(__dirname, 'public', 'index.html'));
221
+ });
222
+ // ===================
223
+ // Health Check
224
+ // ===================
225
+ /**
226
+ * GET /api/health
227
+ * Health check endpoint
228
+ */
229
+ app.get('/api/health', (_req, res) => {
230
+ res.json({ status: 'ok', timestamp: new Date().toISOString() });
231
+ });
232
+ // ===================
233
+ // Route List (for testing - verify no direct Runner command API)
234
+ // ===================
235
+ /**
236
+ * GET /api/routes
237
+ * List all registered routes (for testing)
238
+ */
239
+ app.get('/api/routes', (_req, res) => {
240
+ // Return a predefined list of routes for safety and testability
241
+ // This also serves as documentation of available endpoints
242
+ const routes = [
243
+ 'GET /api/task-groups',
244
+ 'POST /api/task-groups',
245
+ 'GET /api/task-groups/:task_group_id/tasks',
246
+ 'GET /api/tasks/:task_id',
247
+ 'POST /api/tasks',
248
+ 'GET /api/health',
249
+ 'GET /api/routes',
250
+ ];
251
+ res.json({ routes });
252
+ });
253
+ return app;
254
+ }
255
+ /**
256
+ * Web Server
257
+ * Manages Express server lifecycle
258
+ */
259
+ class WebServer {
260
+ app;
261
+ port;
262
+ host;
263
+ server = null;
264
+ constructor(config) {
265
+ this.port = config.port || 3000;
266
+ this.host = config.host || 'localhost';
267
+ this.app = createApp(config);
268
+ }
269
+ /**
270
+ * Start the server
271
+ */
272
+ async start() {
273
+ return new Promise((resolve, reject) => {
274
+ try {
275
+ this.server = this.app.listen(this.port, this.host, () => {
276
+ resolve();
277
+ });
278
+ this.server.on('error', reject);
279
+ }
280
+ catch (error) {
281
+ reject(error);
282
+ }
283
+ });
284
+ }
285
+ /**
286
+ * Stop the server
287
+ */
288
+ async stop() {
289
+ return new Promise((resolve, reject) => {
290
+ if (!this.server) {
291
+ resolve();
292
+ return;
293
+ }
294
+ this.server.close((err) => {
295
+ if (err) {
296
+ reject(err);
297
+ }
298
+ else {
299
+ this.server = null;
300
+ resolve();
301
+ }
302
+ });
303
+ });
304
+ }
305
+ /**
306
+ * Get server state
307
+ */
308
+ getState() {
309
+ return {
310
+ isRunning: this.server !== null,
311
+ port: this.port,
312
+ host: this.host,
313
+ };
314
+ }
315
+ /**
316
+ * Get Express app (for testing)
317
+ */
318
+ getApp() {
319
+ return this.app;
320
+ }
321
+ /**
322
+ * Get server URL
323
+ */
324
+ getUrl() {
325
+ return `http://${this.host}:${this.port}`;
326
+ }
327
+ }
328
+ exports.WebServer = WebServer;
329
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "pm-orchestrator-runner",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "CLI tool that enforces controlled execution of Claude Code through mandatory orchestration",
5
5
  "main": "dist/cli/index.js",
6
6
  "bin": {
7
- "pm": "dist/cli/index.js"
7
+ "pm-orchestrator": "dist/cli/index.js"
8
8
  },
9
9
  "files": [
10
10
  "dist",
@@ -17,6 +17,7 @@
17
17
  "test:unit": "mocha --require ts-node/register 'test/unit/**/*.test.ts'",
18
18
  "test:property": "mocha --require ts-node/register 'test/property/**/*.test.ts'",
19
19
  "test:integration": "mocha --require ts-node/register 'test/integration/**/*.test.ts'",
20
+ "test:acceptance": "mocha --require ts-node/register 'test/acceptance/**/*.test.ts'",
20
21
  "coverage": "nyc npm test",
21
22
  "lint": "eslint src/**/*.ts test/**/*.ts",
22
23
  "typecheck": "tsc --noEmit",
@@ -25,7 +26,8 @@
25
26
  "llm:test:verdict": "mocha --require ts-node/register 'test/unit/mediation/verdict-reporter.test.ts'",
26
27
  "e2e:smoke": "ts-node scripts/e2e-smoke.ts",
27
28
  "e2e:recovery": "ts-node scripts/e2e-recovery.ts",
28
- "proof:real": "ts-node scripts/e2e-real-world-proof.ts"
29
+ "proof:real": "ts-node scripts/e2e-real-world-proof.ts",
30
+ "dynamodb:local:init": "ts-node scripts/dynamodb-local-init.ts"
29
31
  },
30
32
  "keywords": [
31
33
  "pm-orchestrator",
@@ -36,9 +38,11 @@
36
38
  "license": "MIT",
37
39
  "devDependencies": {
38
40
  "@types/chai": "^5.2.3",
41
+ "@types/express": "^5.0.6",
39
42
  "@types/minimatch": "^5.1.2",
40
43
  "@types/mocha": "^10.0.6",
41
44
  "@types/node": "^20.10.0",
45
+ "@types/supertest": "^6.0.3",
42
46
  "@types/uuid": "^10.0.0",
43
47
  "@typescript-eslint/eslint-plugin": "^8.52.0",
44
48
  "@typescript-eslint/parser": "^8.52.0",
@@ -47,11 +51,15 @@
47
51
  "fast-check": "^3.15.0",
48
52
  "mocha": "^10.2.0",
49
53
  "nyc": "^15.1.0",
54
+ "supertest": "^7.2.2",
50
55
  "ts-node": "^10.9.2",
51
56
  "typescript": "^5.3.2"
52
57
  },
53
58
  "dependencies": {
59
+ "@aws-sdk/client-dynamodb": "^3.971.0",
60
+ "@aws-sdk/lib-dynamodb": "^3.971.0",
54
61
  "commander": "^12.0.0",
62
+ "express": "^5.2.1",
55
63
  "minimatch": "^9.0.0",
56
64
  "uuid": "^10.0.0",
57
65
  "yaml": "^2.8.2"