night-orch 0.3.2 → 0.4.0

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 (221) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -108
  3. package/dist/cli/commands/doctor.d.ts +1 -0
  4. package/dist/cli/commands/doctor.d.ts.map +1 -1
  5. package/dist/cli/commands/doctor.js +18 -0
  6. package/dist/cli/commands/doctor.js.map +1 -1
  7. package/dist/cli/commands/monitoring.d.ts.map +1 -1
  8. package/dist/cli/commands/monitoring.js +7 -3
  9. package/dist/cli/commands/monitoring.js.map +1 -1
  10. package/dist/cli/commands/settings.d.ts.map +1 -1
  11. package/dist/cli/commands/settings.js +40 -4
  12. package/dist/cli/commands/settings.js.map +1 -1
  13. package/dist/cli/commands/status.d.ts.map +1 -1
  14. package/dist/cli/commands/status.js +26 -3
  15. package/dist/cli/commands/status.js.map +1 -1
  16. package/dist/cli/index.js +3 -2
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/cli/tui/app.d.ts.map +1 -1
  19. package/dist/cli/tui/app.js +52 -3
  20. package/dist/cli/tui/app.js.map +1 -1
  21. package/dist/cli/tui/header.d.ts.map +1 -1
  22. package/dist/cli/tui/header.js +2 -1
  23. package/dist/cli/tui/header.js.map +1 -1
  24. package/dist/cli/tui/settings-view.d.ts.map +1 -1
  25. package/dist/cli/tui/settings-view.js +22 -5
  26. package/dist/cli/tui/settings-view.js.map +1 -1
  27. package/dist/cli/tui/stats-view.js +2 -2
  28. package/dist/cli/tui/stats-view.js.map +1 -1
  29. package/dist/config/loader.d.ts.map +1 -1
  30. package/dist/config/loader.js +141 -13
  31. package/dist/config/loader.js.map +1 -1
  32. package/dist/config/schema.d.ts +903 -21
  33. package/dist/config/schema.d.ts.map +1 -1
  34. package/dist/config/schema.js +77 -6
  35. package/dist/config/schema.js.map +1 -1
  36. package/dist/forge/types.d.ts +7 -0
  37. package/dist/forge/types.d.ts.map +1 -1
  38. package/dist/git/repo.d.ts +8 -0
  39. package/dist/git/repo.d.ts.map +1 -1
  40. package/dist/git/repo.js +19 -0
  41. package/dist/git/repo.js.map +1 -1
  42. package/dist/git/worktree.d.ts +3 -0
  43. package/dist/git/worktree.d.ts.map +1 -1
  44. package/dist/git/worktree.js +43 -21
  45. package/dist/git/worktree.js.map +1 -1
  46. package/dist/loop/cost.d.ts +33 -8
  47. package/dist/loop/cost.d.ts.map +1 -1
  48. package/dist/loop/cost.js +250 -46
  49. package/dist/loop/cost.js.map +1 -1
  50. package/dist/loop/decision.js +3 -3
  51. package/dist/loop/decision.js.map +1 -1
  52. package/dist/loop/engine.d.ts +1 -0
  53. package/dist/loop/engine.d.ts.map +1 -1
  54. package/dist/loop/engine.js +76 -13
  55. package/dist/loop/engine.js.map +1 -1
  56. package/dist/loop/parallel.d.ts.map +1 -1
  57. package/dist/loop/parallel.js +2 -0
  58. package/dist/loop/parallel.js.map +1 -1
  59. package/dist/loop/pricing.d.ts +11 -4
  60. package/dist/loop/pricing.d.ts.map +1 -1
  61. package/dist/loop/pricing.js +62 -20
  62. package/dist/loop/pricing.js.map +1 -1
  63. package/dist/loop/progress.d.ts +24 -0
  64. package/dist/loop/progress.d.ts.map +1 -0
  65. package/dist/loop/progress.js +52 -0
  66. package/dist/loop/progress.js.map +1 -0
  67. package/dist/loop/step-executor.d.ts +4 -5
  68. package/dist/loop/step-executor.d.ts.map +1 -1
  69. package/dist/loop/step-executor.js +1 -0
  70. package/dist/loop/step-executor.js.map +1 -1
  71. package/dist/loop/types.d.ts +17 -0
  72. package/dist/loop/types.d.ts.map +1 -1
  73. package/dist/mcp/tools/admin.d.ts +29 -0
  74. package/dist/mcp/tools/admin.d.ts.map +1 -0
  75. package/dist/mcp/tools/admin.js +89 -0
  76. package/dist/mcp/tools/admin.js.map +1 -0
  77. package/dist/mcp/tools/auth.d.ts +3 -0
  78. package/dist/mcp/tools/auth.d.ts.map +1 -0
  79. package/dist/mcp/tools/auth.js +19 -0
  80. package/dist/mcp/tools/auth.js.map +1 -0
  81. package/dist/mcp/tools/index.d.ts.map +1 -1
  82. package/dist/mcp/tools/index.js +5 -533
  83. package/dist/mcp/tools/index.js.map +1 -1
  84. package/dist/mcp/tools/operations.d.ts +32 -0
  85. package/dist/mcp/tools/operations.d.ts.map +1 -0
  86. package/dist/mcp/tools/operations.js +95 -0
  87. package/dist/mcp/tools/operations.js.map +1 -0
  88. package/dist/mcp/tools/settings.d.ts +12 -0
  89. package/dist/mcp/tools/settings.d.ts.map +1 -0
  90. package/dist/mcp/tools/settings.js +58 -0
  91. package/dist/mcp/tools/settings.js.map +1 -0
  92. package/dist/mcp/tools/status.d.ts +25 -0
  93. package/dist/mcp/tools/status.d.ts.map +1 -0
  94. package/dist/mcp/tools/status.js +307 -0
  95. package/dist/mcp/tools/status.js.map +1 -0
  96. package/dist/ops/continue.js +6 -1
  97. package/dist/ops/continue.js.map +1 -1
  98. package/dist/ops/project-check.d.ts +15 -0
  99. package/dist/ops/project-check.d.ts.map +1 -0
  100. package/dist/ops/project-check.js +136 -0
  101. package/dist/ops/project-check.js.map +1 -0
  102. package/dist/ops/rebase-and-check.d.ts +2 -1
  103. package/dist/ops/rebase-and-check.d.ts.map +1 -1
  104. package/dist/ops/rebase-and-check.js +2 -2
  105. package/dist/ops/rebase-and-check.js.map +1 -1
  106. package/dist/ops/rebase.d.ts +8 -5
  107. package/dist/ops/rebase.d.ts.map +1 -1
  108. package/dist/ops/rebase.js +43 -29
  109. package/dist/ops/rebase.js.map +1 -1
  110. package/dist/runner/comment-commands.d.ts +20 -0
  111. package/dist/runner/comment-commands.d.ts.map +1 -0
  112. package/dist/runner/comment-commands.js +221 -0
  113. package/dist/runner/comment-commands.js.map +1 -0
  114. package/dist/runner/helpers.d.ts +57 -0
  115. package/dist/runner/helpers.d.ts.map +1 -0
  116. package/dist/runner/helpers.js +259 -0
  117. package/dist/runner/helpers.js.map +1 -0
  118. package/dist/runner/poller.d.ts.map +1 -1
  119. package/dist/runner/poller.js +19 -781
  120. package/dist/runner/poller.js.map +1 -1
  121. package/dist/runner/reaction-scan.d.ts +17 -0
  122. package/dist/runner/reaction-scan.d.ts.map +1 -0
  123. package/dist/runner/reaction-scan.js +33 -0
  124. package/dist/runner/reaction-scan.js.map +1 -0
  125. package/dist/runner/run-finalizer.d.ts +30 -0
  126. package/dist/runner/run-finalizer.d.ts.map +1 -0
  127. package/dist/runner/run-finalizer.js +217 -0
  128. package/dist/runner/run-finalizer.js.map +1 -0
  129. package/dist/settings/definitions/github.d.ts +3 -0
  130. package/dist/settings/definitions/github.d.ts.map +1 -0
  131. package/dist/settings/definitions/github.js +267 -0
  132. package/dist/settings/definitions/github.js.map +1 -0
  133. package/dist/settings/definitions/loop.d.ts +3 -0
  134. package/dist/settings/definitions/loop.d.ts.map +1 -0
  135. package/dist/settings/definitions/loop.js +113 -0
  136. package/dist/settings/definitions/loop.js.map +1 -0
  137. package/dist/settings/definitions/observability.d.ts +3 -0
  138. package/dist/settings/definitions/observability.d.ts.map +1 -0
  139. package/dist/settings/definitions/observability.js +74 -0
  140. package/dist/settings/definitions/observability.js.map +1 -0
  141. package/dist/settings/definitions/security.d.ts +3 -0
  142. package/dist/settings/definitions/security.d.ts.map +1 -0
  143. package/dist/settings/definitions/security.js +121 -0
  144. package/dist/settings/definitions/security.js.map +1 -0
  145. package/dist/settings/registry.d.ts +82 -6
  146. package/dist/settings/registry.d.ts.map +1 -1
  147. package/dist/settings/registry.js +301 -194
  148. package/dist/settings/registry.js.map +1 -1
  149. package/dist/settings/runtime.d.ts +5 -1
  150. package/dist/settings/runtime.d.ts.map +1 -1
  151. package/dist/settings/runtime.js +46 -9
  152. package/dist/settings/runtime.js.map +1 -1
  153. package/dist/state/db.d.ts.map +1 -1
  154. package/dist/state/db.js +2 -0
  155. package/dist/state/db.js.map +1 -1
  156. package/dist/state/migrations/020-cost-ledger.d.ts +3 -0
  157. package/dist/state/migrations/020-cost-ledger.d.ts.map +1 -0
  158. package/dist/state/migrations/020-cost-ledger.js +37 -0
  159. package/dist/state/migrations/020-cost-ledger.js.map +1 -0
  160. package/dist/state/runs.d.ts +1 -0
  161. package/dist/state/runs.d.ts.map +1 -1
  162. package/dist/state/runs.js +3 -0
  163. package/dist/state/runs.js.map +1 -1
  164. package/dist/state/stats.d.ts +20 -0
  165. package/dist/state/stats.d.ts.map +1 -1
  166. package/dist/state/stats.js +68 -8
  167. package/dist/state/stats.js.map +1 -1
  168. package/dist/utils/logger.d.ts +9 -0
  169. package/dist/utils/logger.d.ts.map +1 -1
  170. package/dist/utils/logger.js +13 -0
  171. package/dist/utils/logger.js.map +1 -1
  172. package/dist/web/routes/api-events.d.ts +10 -0
  173. package/dist/web/routes/api-events.d.ts.map +1 -0
  174. package/dist/web/routes/api-events.js +251 -0
  175. package/dist/web/routes/api-events.js.map +1 -0
  176. package/dist/web/routes/api-operations.d.ts +3 -0
  177. package/dist/web/routes/api-operations.d.ts.map +1 -0
  178. package/dist/web/routes/api-operations.js +371 -0
  179. package/dist/web/routes/api-operations.js.map +1 -0
  180. package/dist/web/routes/api-runs.d.ts +3 -0
  181. package/dist/web/routes/api-runs.d.ts.map +1 -0
  182. package/dist/web/routes/api-runs.js +96 -0
  183. package/dist/web/routes/api-runs.js.map +1 -0
  184. package/dist/web/routes/api-settings.d.ts +3 -0
  185. package/dist/web/routes/api-settings.d.ts.map +1 -0
  186. package/dist/web/routes/api-settings.js +61 -0
  187. package/dist/web/routes/api-settings.js.map +1 -0
  188. package/dist/web/routes/context.d.ts +15 -0
  189. package/dist/web/routes/context.d.ts.map +1 -0
  190. package/dist/web/routes/context.js +2 -0
  191. package/dist/web/routes/context.js.map +1 -0
  192. package/dist/web/server.d.ts +58 -1
  193. package/dist/web/server.d.ts.map +1 -1
  194. package/dist/web/server.js +116 -847
  195. package/dist/web/server.js.map +1 -1
  196. package/dist/web/shell-session.d.ts +74 -0
  197. package/dist/web/shell-session.d.ts.map +1 -0
  198. package/dist/web/shell-session.js +279 -0
  199. package/dist/web/shell-session.js.map +1 -0
  200. package/dist/web/snapshots.d.ts +159 -0
  201. package/dist/web/snapshots.d.ts.map +1 -0
  202. package/dist/web/snapshots.js +231 -0
  203. package/dist/web/snapshots.js.map +1 -0
  204. package/dist/workers/acp.d.ts.map +1 -1
  205. package/dist/workers/acp.js +116 -0
  206. package/dist/workers/acp.js.map +1 -1
  207. package/dist/workers/claude.d.ts.map +1 -1
  208. package/dist/workers/claude.js +13 -3
  209. package/dist/workers/claude.js.map +1 -1
  210. package/dist/workers/codex.d.ts.map +1 -1
  211. package/dist/workers/codex.js +16 -4
  212. package/dist/workers/codex.js.map +1 -1
  213. package/dist/workers/types.d.ts +14 -4
  214. package/dist/workers/types.d.ts.map +1 -1
  215. package/examples/config.example.yaml +12 -3
  216. package/package.json +8 -2
  217. package/web/dist/assets/index-BIrXUwFe.css +1 -0
  218. package/web/dist/assets/index-COMzHPcP.js +26 -0
  219. package/web/dist/index.html +2 -2
  220. package/web/dist/assets/index-k6kgdnzy.js +0 -9
  221. package/web/dist/assets/index-xm9qPlYB.css +0 -1
@@ -0,0 +1,371 @@
1
+ import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { resolve } from 'node:path';
4
+ import { handleToolCall } from '../../mcp/tools/index.js';
5
+ import { resolveConfigWithRuntimeSettings } from '../../settings/runtime.js';
6
+ import { nowUtcIso } from '../../utils/time.js';
7
+ import { writeJson, readJsonBody, toBoundedInt, toNonEmptyString, toFiniteNumber, withMcpMutationAuth, } from '../server.js';
8
+ export const handleOperationRoutes = async (req, res, method, pathname, _searchParams, ctx) => {
9
+ const { deps, security, agentSessionManager, shellSessionManager } = ctx;
10
+ const runtimeDeps = resolveRuntimeDeps(deps);
11
+ if (method === 'GET' && pathname === '/api/agent/sessions') {
12
+ writeJson(res, 200, agentSessionManager.listSessions());
13
+ return true;
14
+ }
15
+ if (method === 'GET' && pathname === '/api/shell/sessions') {
16
+ writeJson(res, 200, shellSessionManager.listSessions());
17
+ return true;
18
+ }
19
+ if (method === 'GET') {
20
+ const agentSessionEventsMatch = pathname.match(/^\/api\/agent\/sessions\/([^/]+)\/events$/);
21
+ if (agentSessionEventsMatch) {
22
+ const sessionId = decodeURIComponent(agentSessionEventsMatch[1] ?? '');
23
+ const since = toBoundedInt(_searchParams.get('since'), 0, 0, Number.MAX_SAFE_INTEGER);
24
+ const limit = toBoundedInt(_searchParams.get('limit'), 100, 1, 400);
25
+ try {
26
+ writeJson(res, 200, agentSessionManager.getEvents(sessionId, since, limit));
27
+ }
28
+ catch (err) {
29
+ const message = err.message;
30
+ const statusCode = message.startsWith('Session not found:') ? 404 : 400;
31
+ writeJson(res, statusCode, { error: message });
32
+ }
33
+ return true;
34
+ }
35
+ const agentSessionDetailMatch = pathname.match(/^\/api\/agent\/sessions\/([^/]+)$/);
36
+ if (agentSessionDetailMatch) {
37
+ const sessionId = decodeURIComponent(agentSessionDetailMatch[1] ?? '');
38
+ const session = agentSessionManager.getSession(sessionId);
39
+ if (!session) {
40
+ writeJson(res, 404, { error: `Session not found: ${sessionId}` });
41
+ return true;
42
+ }
43
+ writeJson(res, 200, { session });
44
+ return true;
45
+ }
46
+ const shellSessionEventsMatch = pathname.match(/^\/api\/shell\/sessions\/([^/]+)\/events$/);
47
+ if (shellSessionEventsMatch) {
48
+ const sessionId = decodeURIComponent(shellSessionEventsMatch[1] ?? '');
49
+ const since = toBoundedInt(_searchParams.get('since'), 0, 0, Number.MAX_SAFE_INTEGER);
50
+ const limit = toBoundedInt(_searchParams.get('limit'), 200, 1, 1_000);
51
+ try {
52
+ writeJson(res, 200, shellSessionManager.getEvents(sessionId, since, limit));
53
+ }
54
+ catch (err) {
55
+ const message = err.message;
56
+ const statusCode = message.startsWith('Session not found:') ? 404 : 400;
57
+ writeJson(res, statusCode, { error: message });
58
+ }
59
+ return true;
60
+ }
61
+ const shellSessionDetailMatch = pathname.match(/^\/api\/shell\/sessions\/([^/]+)$/);
62
+ if (shellSessionDetailMatch) {
63
+ const sessionId = decodeURIComponent(shellSessionDetailMatch[1] ?? '');
64
+ const session = shellSessionManager.getSession(sessionId);
65
+ if (!session) {
66
+ writeJson(res, 404, { error: `Session not found: ${sessionId}` });
67
+ return true;
68
+ }
69
+ writeJson(res, 200, { session });
70
+ return true;
71
+ }
72
+ }
73
+ if (method === 'GET' && pathname === '/api/update-status') {
74
+ const statusPath = resolve(homedir(), '.config', 'night-orch', 'update-status.json');
75
+ try {
76
+ const parsed = JSON.parse(readFileSync(statusPath, 'utf-8'));
77
+ const status = {
78
+ state: typeof parsed['state'] === 'string' ? parsed['state'] : 'idle',
79
+ ...(typeof parsed['error'] === 'string' ? { error: parsed['error'] } : {}),
80
+ };
81
+ writeJson(res, 200, status);
82
+ }
83
+ catch {
84
+ writeJson(res, 200, { state: 'idle' });
85
+ }
86
+ return true;
87
+ }
88
+ if (method === 'POST' && pathname === '/api/operations/poll') {
89
+ const body = await readJsonBody(req);
90
+ const result = await handleToolCall('night-orch-poll', withMcpMutationAuth({ dryRun: Boolean(body['dryRun']) }, security), runtimeDeps);
91
+ writeJson(res, 200, result);
92
+ return true;
93
+ }
94
+ if (method === 'POST' && pathname === '/api/operations/sync') {
95
+ const body = await readJsonBody(req);
96
+ const result = await handleToolCall('night-orch-sync', withMcpMutationAuth({ dryRun: Boolean(body['dryRun']) }, security), runtimeDeps);
97
+ writeJson(res, 200, result);
98
+ return true;
99
+ }
100
+ if (method === 'POST' && pathname === '/api/operations/cleanup') {
101
+ const body = await readJsonBody(req);
102
+ const result = await handleToolCall('night-orch-cleanup', withMcpMutationAuth({ dryRun: Boolean(body['dryRun']) }, security), runtimeDeps);
103
+ writeJson(res, 200, result);
104
+ return true;
105
+ }
106
+ if (method === 'POST' && pathname === '/api/operations/labels-init') {
107
+ const body = await readJsonBody(req);
108
+ const repo = toNonEmptyString(body['repo']);
109
+ if (!repo) {
110
+ writeJson(res, 400, { error: 'repo is required' });
111
+ return true;
112
+ }
113
+ const result = await handleToolCall('night-orch-labels-init', withMcpMutationAuth({
114
+ repo,
115
+ dryRun: Boolean(body['dryRun']),
116
+ }, security), runtimeDeps);
117
+ writeJson(res, 200, result);
118
+ return true;
119
+ }
120
+ if (method === 'POST' && pathname === '/api/operations/retry') {
121
+ const body = await readJsonBody(req);
122
+ const repo = toNonEmptyString(body['repo']);
123
+ const issueNumber = toBoundedInt(body['issueNumber'], NaN, 1, Number.MAX_SAFE_INTEGER);
124
+ if (!repo || Number.isNaN(issueNumber)) {
125
+ writeJson(res, 400, { error: 'repo and issueNumber are required' });
126
+ return true;
127
+ }
128
+ const result = await handleToolCall('night-orch-retry', withMcpMutationAuth({
129
+ repo,
130
+ issueNumber,
131
+ resetPlan: Boolean(body['resetPlan']),
132
+ fresh: Boolean(body['fresh']),
133
+ }, security), runtimeDeps);
134
+ writeJson(res, 200, result);
135
+ return true;
136
+ }
137
+ if (method === 'POST' && pathname === '/api/operations/rebase') {
138
+ const body = await readJsonBody(req);
139
+ const repo = toNonEmptyString(body['repo']);
140
+ const issueNumber = toBoundedInt(body['issueNumber'], NaN, 1, Number.MAX_SAFE_INTEGER);
141
+ if (!repo || Number.isNaN(issueNumber)) {
142
+ writeJson(res, 400, { error: 'repo and issueNumber are required' });
143
+ return true;
144
+ }
145
+ const result = await handleToolCall('night-orch-rebase', withMcpMutationAuth({
146
+ repo,
147
+ issueNumber,
148
+ check: body['check'] === undefined ? true : Boolean(body['check']),
149
+ }, security), runtimeDeps);
150
+ writeJson(res, 200, result);
151
+ return true;
152
+ }
153
+ if (method === 'POST' && pathname === '/api/operations/continue') {
154
+ const body = await readJsonBody(req);
155
+ const repo = toNonEmptyString(body['repo']);
156
+ const issueNumber = toBoundedInt(body['issueNumber'], NaN, 1, Number.MAX_SAFE_INTEGER);
157
+ if (!repo || Number.isNaN(issueNumber)) {
158
+ writeJson(res, 400, { error: 'repo and issueNumber are required' });
159
+ return true;
160
+ }
161
+ const result = await handleToolCall('night-orch-continue', withMcpMutationAuth({
162
+ repo,
163
+ issueNumber,
164
+ }, security), runtimeDeps);
165
+ writeJson(res, 200, result);
166
+ return true;
167
+ }
168
+ if (method === 'POST' && pathname === '/api/operations/delete-entry') {
169
+ const body = await readJsonBody(req);
170
+ const repo = toNonEmptyString(body['repo']);
171
+ const issueNumber = toBoundedInt(body['issueNumber'], NaN, 1, Number.MAX_SAFE_INTEGER);
172
+ if (!repo || Number.isNaN(issueNumber)) {
173
+ writeJson(res, 400, { error: 'repo and issueNumber are required' });
174
+ return true;
175
+ }
176
+ const result = await handleToolCall('night-orch-delete-entry', withMcpMutationAuth({
177
+ repo,
178
+ issueNumber,
179
+ force: Boolean(body['force']),
180
+ dryRun: Boolean(body['dryRun']),
181
+ }, security), runtimeDeps);
182
+ writeJson(res, 200, result);
183
+ return true;
184
+ }
185
+ if (method === 'POST' && pathname === '/api/operations/daily-cost-override/set') {
186
+ const body = await readJsonBody(req);
187
+ const amountUsd = toFiniteNumber(body['amountUsd']);
188
+ if (amountUsd === null || amountUsd <= 0) {
189
+ writeJson(res, 400, { error: 'amountUsd must be a positive finite number' });
190
+ return true;
191
+ }
192
+ try {
193
+ const result = await handleToolCall('night-orch-daily-cost-override', withMcpMutationAuth({ amountUsd }, security), runtimeDeps);
194
+ writeJson(res, 200, result);
195
+ }
196
+ catch (err) {
197
+ writeJson(res, 400, { error: err.message });
198
+ }
199
+ return true;
200
+ }
201
+ if (method === 'POST' && pathname === '/api/operations/daily-cost-override/clear') {
202
+ try {
203
+ const result = await handleToolCall('night-orch-daily-cost-override', withMcpMutationAuth({ clear: true }, security), runtimeDeps);
204
+ writeJson(res, 200, result);
205
+ }
206
+ catch (err) {
207
+ writeJson(res, 400, { error: err.message });
208
+ }
209
+ return true;
210
+ }
211
+ if (method === 'POST' && pathname === '/api/operations/cost-override/set') {
212
+ const body = await readJsonBody(req);
213
+ const repo = toNonEmptyString(body['repo']);
214
+ const issueNumber = toBoundedInt(body['issueNumber'], NaN, 1, Number.MAX_SAFE_INTEGER);
215
+ const amountUsd = toFiniteNumber(body['amountUsd']);
216
+ if (!repo || Number.isNaN(issueNumber)) {
217
+ writeJson(res, 400, { error: 'repo and issueNumber are required' });
218
+ return true;
219
+ }
220
+ if (amountUsd === null || amountUsd <= 0) {
221
+ writeJson(res, 400, { error: 'amountUsd must be a positive finite number' });
222
+ return true;
223
+ }
224
+ try {
225
+ const result = await handleToolCall('night-orch-cost-override', withMcpMutationAuth({ repo, issueNumber, amountUsd }, security), runtimeDeps);
226
+ writeJson(res, 200, result);
227
+ }
228
+ catch (err) {
229
+ writeJson(res, 400, { error: err.message });
230
+ }
231
+ return true;
232
+ }
233
+ if (method === 'POST' && pathname === '/api/operations/cost-override/clear') {
234
+ const body = await readJsonBody(req);
235
+ const repo = toNonEmptyString(body['repo']);
236
+ const issueNumber = toBoundedInt(body['issueNumber'], NaN, 1, Number.MAX_SAFE_INTEGER);
237
+ if (!repo || Number.isNaN(issueNumber)) {
238
+ writeJson(res, 400, { error: 'repo and issueNumber are required' });
239
+ return true;
240
+ }
241
+ try {
242
+ const result = await handleToolCall('night-orch-cost-override', withMcpMutationAuth({ repo, issueNumber, clear: true }, security), runtimeDeps);
243
+ writeJson(res, 200, result);
244
+ }
245
+ catch (err) {
246
+ writeJson(res, 400, { error: err.message });
247
+ }
248
+ return true;
249
+ }
250
+ if (method === 'POST' && pathname === '/api/operations/update') {
251
+ if (typeof process.send === 'function') {
252
+ process.send({ type: 'update-requested' });
253
+ writeJson(res, 200, { accepted: true, method: 'ipc' });
254
+ return true;
255
+ }
256
+ const dataDir = resolve(homedir(), '.config', 'night-orch');
257
+ const triggerPath = resolve(dataDir, 'update-requested');
258
+ mkdirSync(dataDir, { recursive: true });
259
+ writeFileSync(triggerPath, nowUtcIso());
260
+ writeJson(res, 200, { accepted: true, method: 'trigger-file' });
261
+ return true;
262
+ }
263
+ if (method === 'POST' && pathname === '/api/agent/sessions') {
264
+ const body = await readJsonBody(req);
265
+ const agentRaw = toNonEmptyString(body['agent']);
266
+ const profileName = toNonEmptyString(body['profileName']);
267
+ const cwd = toNonEmptyString(body['cwd']);
268
+ if (agentRaw !== 'claude' && agentRaw !== 'codex') {
269
+ writeJson(res, 400, { error: 'agent must be "claude" or "codex"' });
270
+ return true;
271
+ }
272
+ try {
273
+ const session = agentSessionManager.createSession({
274
+ agent: agentRaw,
275
+ profileName,
276
+ cwd,
277
+ });
278
+ writeJson(res, 200, { session });
279
+ }
280
+ catch (err) {
281
+ writeJson(res, 400, { error: err.message });
282
+ }
283
+ return true;
284
+ }
285
+ const agentSessionMessageMatch = pathname.match(/^\/api\/agent\/sessions\/([^/]+)\/messages$/);
286
+ if (method === 'POST' && agentSessionMessageMatch) {
287
+ const sessionId = decodeURIComponent(agentSessionMessageMatch[1] ?? '');
288
+ const body = await readJsonBody(req);
289
+ const prompt = toNonEmptyString(body['prompt']);
290
+ if (!prompt) {
291
+ writeJson(res, 400, { error: 'prompt is required' });
292
+ return true;
293
+ }
294
+ try {
295
+ const result = agentSessionManager.sendPrompt(sessionId, prompt);
296
+ writeJson(res, 200, result);
297
+ }
298
+ catch (err) {
299
+ const message = err.message;
300
+ const statusCode = message.startsWith('Session not found:')
301
+ ? 404
302
+ : message.includes('running') || message.includes('closed')
303
+ ? 409
304
+ : 400;
305
+ writeJson(res, statusCode, { error: message });
306
+ }
307
+ return true;
308
+ }
309
+ const agentSessionCloseMatch = pathname.match(/^\/api\/agent\/sessions\/([^/]+)$/);
310
+ if (method === 'DELETE' && agentSessionCloseMatch) {
311
+ const sessionId = decodeURIComponent(agentSessionCloseMatch[1] ?? '');
312
+ try {
313
+ const session = agentSessionManager.closeSession(sessionId);
314
+ writeJson(res, 200, { session });
315
+ }
316
+ catch (err) {
317
+ const message = err.message;
318
+ const statusCode = message.startsWith('Session not found:')
319
+ ? 404
320
+ : message.includes('running')
321
+ ? 409
322
+ : 400;
323
+ writeJson(res, statusCode, { error: message });
324
+ }
325
+ return true;
326
+ }
327
+ if (method === 'POST' && pathname === '/api/shell/sessions') {
328
+ const body = await readJsonBody(req);
329
+ const cwd = toNonEmptyString(body['cwd']);
330
+ const cols = toBoundedInt(body['cols'], NaN, 40, 400);
331
+ const rows = toBoundedInt(body['rows'], NaN, 10, 240);
332
+ try {
333
+ const session = shellSessionManager.createSession({
334
+ cwd,
335
+ cols: Number.isNaN(cols) ? undefined : cols,
336
+ rows: Number.isNaN(rows) ? undefined : rows,
337
+ });
338
+ writeJson(res, 200, { session });
339
+ }
340
+ catch (err) {
341
+ writeJson(res, 400, { error: err.message });
342
+ }
343
+ return true;
344
+ }
345
+ const shellSessionCloseMatch = pathname.match(/^\/api\/shell\/sessions\/([^/]+)$/);
346
+ if (method === 'DELETE' && shellSessionCloseMatch) {
347
+ const sessionId = decodeURIComponent(shellSessionCloseMatch[1] ?? '');
348
+ try {
349
+ const session = shellSessionManager.closeSession(sessionId);
350
+ writeJson(res, 200, { session });
351
+ }
352
+ catch (err) {
353
+ const message = err.message;
354
+ const statusCode = message.startsWith('Session not found:')
355
+ ? 404
356
+ : message.includes('running')
357
+ ? 409
358
+ : 400;
359
+ writeJson(res, statusCode, { error: message });
360
+ }
361
+ return true;
362
+ }
363
+ return false;
364
+ };
365
+ function resolveRuntimeDeps(deps) {
366
+ return {
367
+ ...deps,
368
+ config: resolveConfigWithRuntimeSettings(deps.config, deps.db),
369
+ };
370
+ }
371
+ //# sourceMappingURL=api-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-operations.js","sourceRoot":"","sources":["../../../src/web/routes/api-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RouteHandler } from './context.js';
2
+ export declare const handleRunRoutes: RouteHandler;
3
+ //# sourceMappingURL=api-runs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-runs.d.ts","sourceRoot":"","sources":["../../../src/web/routes/api-runs.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAIhD,eAAO,MAAM,eAAe,EAAE,YA8F7B,CAAA"}
@@ -0,0 +1,96 @@
1
+ import { handleToolCall } from '../../mcp/tools/index.js';
2
+ import { handleResourceRead } from '../../mcp/resources/index.js';
3
+ import { loadTuiStats } from '../../state/stats.js';
4
+ import { resolveConfigWithRuntimeSettings } from '../../settings/runtime.js';
5
+ import { nowUtcIso } from '../../utils/time.js';
6
+ import { writeJson, toBoundedInt } from '../server.js';
7
+ import { buildDashboardSnapshot, buildProjectsSnapshot } from '../snapshots.js';
8
+ export const handleRunRoutes = async (_req, res, method, pathname, searchParams, ctx) => {
9
+ const { deps, security } = ctx;
10
+ const runtimeDeps = resolveRuntimeDeps(deps);
11
+ if (method === 'GET' && pathname === '/api/health') {
12
+ writeJson(res, 200, { status: 'ok', now: nowUtcIso() });
13
+ return true;
14
+ }
15
+ if (method === 'GET' && pathname === '/api/dashboard') {
16
+ const snapshot = await buildDashboardSnapshot(runtimeDeps);
17
+ writeJson(res, 200, snapshot);
18
+ return true;
19
+ }
20
+ if (method === 'GET' && pathname === '/api/projects') {
21
+ const snapshot = buildProjectsSnapshot(runtimeDeps);
22
+ writeJson(res, 200, snapshot);
23
+ return true;
24
+ }
25
+ if (method === 'GET' && pathname === '/api/session') {
26
+ writeJson(res, 200, {
27
+ mutationToken: security.operatorAuthMode ? null : security.webMutationToken,
28
+ operationsEnabled: ctx.operationsEnabled,
29
+ requiresExternalAuth: security.operatorAuthMode,
30
+ });
31
+ return true;
32
+ }
33
+ if (method === 'GET' && pathname === '/api/status') {
34
+ const repo = searchParams.get('repo') ?? undefined;
35
+ const result = await handleToolCall('night-orch-status', { repo }, runtimeDeps);
36
+ writeJson(res, 200, result);
37
+ return true;
38
+ }
39
+ if (method === 'GET' && pathname === '/api/runs') {
40
+ const repo = searchParams.get('repo') ?? undefined;
41
+ const status = searchParams.get('status') ?? undefined;
42
+ const limit = toBoundedInt(searchParams.get('limit'), 50, 1, 500);
43
+ const result = await handleToolCall('night-orch-list-runs', { repo, status, limit }, runtimeDeps);
44
+ writeJson(res, 200, result);
45
+ return true;
46
+ }
47
+ if (method === 'GET' && pathname === '/api/cost') {
48
+ const days = toBoundedInt(searchParams.get('days'), 7, 1, 30);
49
+ const result = await handleToolCall('night-orch-cost-report', { days }, runtimeDeps);
50
+ writeJson(res, 200, result);
51
+ return true;
52
+ }
53
+ if (method === 'GET' && pathname === '/api/stats') {
54
+ writeJson(res, 200, loadTuiStats(runtimeDeps.db, { costModel: runtimeDeps.config.cost.model }));
55
+ return true;
56
+ }
57
+ if (method === 'GET' && pathname === '/api/config') {
58
+ const result = await handleResourceRead('night-orch://config', runtimeDeps);
59
+ writeJson(res, 200, result);
60
+ return true;
61
+ }
62
+ if (method === 'GET') {
63
+ const runDetailMatch = pathname.match(/^\/api\/runs\/([^/]+)$/);
64
+ if (runDetailMatch) {
65
+ const runId = decodeURIComponent(runDetailMatch[1] ?? '');
66
+ const result = await handleToolCall('night-orch-run-detail', { runId }, runtimeDeps);
67
+ writeJson(res, 200, result);
68
+ return true;
69
+ }
70
+ const runEventsMatch = pathname.match(/^\/api\/runs\/([^/]+)\/events$/);
71
+ if (runEventsMatch) {
72
+ const runId = decodeURIComponent(runEventsMatch[1] ?? '');
73
+ const since = toBoundedInt(searchParams.get('since'), 0, 0, Number.MAX_SAFE_INTEGER);
74
+ const limit = toBoundedInt(searchParams.get('limit'), 100, 1, 200);
75
+ const result = await handleToolCall('night-orch-stream-events', { runId, since, limit }, runtimeDeps);
76
+ writeJson(res, 200, result);
77
+ return true;
78
+ }
79
+ const repoIssuesMatch = pathname.match(/^\/api\/repos\/([^/]+)\/issues$/);
80
+ if (repoIssuesMatch) {
81
+ const repo = decodeURIComponent(repoIssuesMatch[1] ?? '');
82
+ const filter = searchParams.get('filter') ?? 'all';
83
+ const result = await handleToolCall('night-orch-list-issues', { repo, filter }, runtimeDeps);
84
+ writeJson(res, 200, result);
85
+ return true;
86
+ }
87
+ }
88
+ return false;
89
+ };
90
+ function resolveRuntimeDeps(deps) {
91
+ return {
92
+ ...deps,
93
+ config: resolveConfigWithRuntimeSettings(deps.config, deps.db),
94
+ };
95
+ }
96
+ //# sourceMappingURL=api-runs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-runs.js","sourceRoot":"","sources":["../../../src/web/routes/api-runs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RouteHandler } from './context.js';
2
+ export declare const handleSettingsRoutes: RouteHandler;
3
+ //# sourceMappingURL=api-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-settings.d.ts","sourceRoot":"","sources":["../../../src/web/routes/api-settings.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAShD,eAAO,MAAM,oBAAoB,EAAE,YA+DlC,CAAA"}
@@ -0,0 +1,61 @@
1
+ import { handleToolCall } from '../../mcp/tools/index.js';
2
+ import { RuntimeSettingInputError, } from '../../settings/runtime.js';
3
+ import { writeJson, readJsonBody, toNonEmptyString, withMcpMutationAuth, } from '../server.js';
4
+ import { buildSettingsSnapshot } from '../snapshots.js';
5
+ export const handleSettingsRoutes = async (req, res, method, pathname, _searchParams, ctx) => {
6
+ const { deps, security, rawConfig } = ctx;
7
+ if (method === 'GET' && pathname === '/api/settings') {
8
+ const snapshot = buildSettingsSnapshot(deps, rawConfig);
9
+ writeJson(res, 200, snapshot);
10
+ return true;
11
+ }
12
+ if (method === 'POST' && pathname === '/api/operations/settings/set') {
13
+ const body = await readJsonBody(req);
14
+ const key = toNonEmptyString(body['key']);
15
+ const value = body['value'];
16
+ if (!key || value === undefined) {
17
+ writeJson(res, 400, { error: 'key and value are required' });
18
+ return true;
19
+ }
20
+ try {
21
+ const result = await handleToolCall('night-orch-set-setting', withMcpMutationAuth({ key, value }, security), deps);
22
+ writeJson(res, 200, result);
23
+ }
24
+ catch (err) {
25
+ if (isRuntimeSettingInputError(err)) {
26
+ writeJson(res, 400, { error: err.message });
27
+ return true;
28
+ }
29
+ throw err;
30
+ }
31
+ return true;
32
+ }
33
+ if (method === 'POST' && pathname === '/api/operations/settings/clear') {
34
+ const body = await readJsonBody(req);
35
+ const key = toNonEmptyString(body['key']);
36
+ if (!key) {
37
+ writeJson(res, 400, { error: 'key is required' });
38
+ return true;
39
+ }
40
+ try {
41
+ const result = await handleToolCall('night-orch-clear-setting', withMcpMutationAuth({ key }, security), deps);
42
+ writeJson(res, 200, result);
43
+ }
44
+ catch (err) {
45
+ if (isRuntimeSettingInputError(err)) {
46
+ writeJson(res, 400, { error: err.message });
47
+ return true;
48
+ }
49
+ throw err;
50
+ }
51
+ return true;
52
+ }
53
+ return false;
54
+ };
55
+ function isRuntimeSettingInputError(err) {
56
+ if (err instanceof RuntimeSettingInputError) {
57
+ return true;
58
+ }
59
+ return err instanceof Error && err.name === 'RuntimeSettingInputError';
60
+ }
61
+ //# sourceMappingURL=api-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-settings.js","sourceRoot":"","sources":["../../../src/web/routes/api-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { MCPDependencies } from '../../mcp/server.js';
3
+ import type { InteractiveAgentSessionManager } from '../agent-session.js';
4
+ import type { ShellSessionManager } from '../shell-session.js';
5
+ import type { WebSecurityContext } from '../server.js';
6
+ export interface RouteContext {
7
+ deps: MCPDependencies;
8
+ security: WebSecurityContext;
9
+ operationsEnabled: boolean;
10
+ rawConfig: unknown;
11
+ agentSessionManager: InteractiveAgentSessionManager;
12
+ shellSessionManager: ShellSessionManager;
13
+ }
14
+ export type RouteHandler = (req: IncomingMessage, res: ServerResponse, method: string, pathname: string, searchParams: URLSearchParams, ctx: RouteContext) => Promise<boolean>;
15
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/web/routes/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,eAAe,CAAA;IACrB,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,iBAAiB,EAAE,OAAO,CAAA;IAC1B,SAAS,EAAE,OAAO,CAAA;IAClB,mBAAmB,EAAE,8BAA8B,CAAA;IACnD,mBAAmB,EAAE,mBAAmB,CAAA;CACzC;AAED,MAAM,MAAM,YAAY,GAAG,CACzB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,eAAe,EAC7B,GAAG,EAAE,YAAY,KACd,OAAO,CAAC,OAAO,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/web/routes/context.ts"],"names":[],"mappings":""}