nomoreide 0.1.44 → 0.1.46

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 (56) hide show
  1. package/dist/cli/git.js +4 -1
  2. package/dist/cli/git.js.map +1 -1
  3. package/dist/core/agent-runtime.d.ts +15 -0
  4. package/dist/core/agent-runtime.js +39 -3
  5. package/dist/core/agent-runtime.js.map +1 -1
  6. package/dist/core/config-store.d.ts +7 -0
  7. package/dist/core/config-store.js +45 -0
  8. package/dist/core/config-store.js.map +1 -1
  9. package/dist/core/git-actions.d.ts +30 -0
  10. package/dist/core/git-actions.js +58 -0
  11. package/dist/core/git-actions.js.map +1 -0
  12. package/dist/core/git-manager.d.ts +13 -0
  13. package/dist/core/git-manager.js +43 -1
  14. package/dist/core/git-manager.js.map +1 -1
  15. package/dist/core/github-manager.d.ts +149 -0
  16. package/dist/core/github-manager.js +181 -0
  17. package/dist/core/github-manager.js.map +1 -0
  18. package/dist/core/repo-onboard.d.ts +2 -2
  19. package/dist/core/types.d.ts +8 -0
  20. package/dist/core/workflows.d.ts +204 -0
  21. package/dist/core/workflows.js +146 -0
  22. package/dist/core/workflows.js.map +1 -0
  23. package/dist/mcp/tools/context.d.ts +3 -0
  24. package/dist/mcp/tools/context.js +5 -0
  25. package/dist/mcp/tools/context.js.map +1 -1
  26. package/dist/mcp/tools/git.d.ts +1 -1
  27. package/dist/mcp/tools/git.js +10 -1
  28. package/dist/mcp/tools/git.js.map +1 -1
  29. package/dist/mcp/tools/github.d.ts +4 -0
  30. package/dist/mcp/tools/github.js +206 -0
  31. package/dist/mcp/tools/github.js.map +1 -0
  32. package/dist/mcp/tools/index.d.ts +1 -1
  33. package/dist/mcp/tools/index.js +3 -0
  34. package/dist/mcp/tools/index.js.map +1 -1
  35. package/dist/web/client/assets/{code-editor-NLVWCtZl.js → code-editor-o1tS7fpw.js} +1 -1
  36. package/dist/web/client/assets/index-CFZyk7FD.js +201 -0
  37. package/dist/web/client/assets/index-Dcqu3Z0L.css +1 -0
  38. package/dist/web/client/index.html +2 -2
  39. package/dist/web/routes/agent-chat-routes.js +3 -0
  40. package/dist/web/routes/agent-chat-routes.js.map +1 -1
  41. package/dist/web/routes/git-routes.js +60 -0
  42. package/dist/web/routes/git-routes.js.map +1 -1
  43. package/dist/web/routes/github-context.d.ts +9 -0
  44. package/dist/web/routes/github-context.js +31 -0
  45. package/dist/web/routes/github-context.js.map +1 -0
  46. package/dist/web/routes/github-routes.d.ts +2 -0
  47. package/dist/web/routes/github-routes.js +342 -0
  48. package/dist/web/routes/github-routes.js.map +1 -0
  49. package/dist/web/routes/index.js +4 -0
  50. package/dist/web/routes/index.js.map +1 -1
  51. package/dist/web/routes/workflow-routes.d.ts +8 -0
  52. package/dist/web/routes/workflow-routes.js +45 -0
  53. package/dist/web/routes/workflow-routes.js.map +1 -0
  54. package/package.json +1 -1
  55. package/dist/web/client/assets/index-B-5D3C0G.js +0 -197
  56. package/dist/web/client/assets/index-g1k-tjDx.css +0 -1
@@ -0,0 +1,342 @@
1
+ import { selectedGitCwd } from "../dashboard.js";
2
+ import { readForm, readJson, requiredFormValue, sendJson, sendText } from "../http-utils.js";
3
+ import { errorMessage, patternRoute, route } from "./context.js";
4
+ import { requireGitHubContext, optionalGitHubContext } from "./github-context.js";
5
+ const GITHUB_DEVICE_CODE_URL = "https://github.com/login/device/code";
6
+ const GITHUB_ACCESS_TOKEN_URL = "https://github.com/login/oauth/access_token";
7
+ const GITHUB_SCOPES = "repo workflow read:org";
8
+ const DEFAULT_GITHUB_CLIENT_ID = "Ov23litfv3LE0LevxlT2";
9
+ function getClientId() {
10
+ return process.env.NOMOREIDE_GITHUB_CLIENT_ID?.trim() || DEFAULT_GITHUB_CLIENT_ID;
11
+ }
12
+ export const githubRoutes = [
13
+ // --- Token management ---
14
+ route("GET", "/api/github/token", async ({ response, configStore }) => {
15
+ const config = await configStore.load();
16
+ const token = configStore.getGithubToken(config);
17
+ sendJson(response, {
18
+ ok: true,
19
+ configured: !!token,
20
+ deviceFlowAvailable: !!getClientId(),
21
+ });
22
+ }),
23
+ route("POST", "/api/github/token", async ({ request, response, configStore }) => {
24
+ try {
25
+ const form = await readForm(request);
26
+ const host = form.get("host")?.trim() || "github.com";
27
+ const token = requiredFormValue(form, "token");
28
+ await configStore.setGithubToken(host, token);
29
+ sendJson(response, { ok: true });
30
+ }
31
+ catch (error) {
32
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
33
+ }
34
+ }),
35
+ patternRoute(/^\/api\/github\/token\/([^/]+)$/, ["host"], async ({ request, response, configStore, params }) => {
36
+ if (request.method !== "DELETE") {
37
+ sendJson(response, { ok: false, error: "Method not allowed" }, 405);
38
+ return;
39
+ }
40
+ await configStore.removeGithubToken(decodeURIComponent(params.host));
41
+ sendJson(response, { ok: true });
42
+ }),
43
+ // --- OAuth Device Flow ---
44
+ route("POST", "/api/github/oauth/start", async ({ response }) => {
45
+ const clientId = getClientId();
46
+ if (!clientId) {
47
+ sendJson(response, { ok: false, error: "NOMOREIDE_GITHUB_CLIENT_ID is not set." }, 400);
48
+ return;
49
+ }
50
+ try {
51
+ const res = await fetch(GITHUB_DEVICE_CODE_URL, {
52
+ method: "POST",
53
+ headers: { Accept: "application/json", "Content-Type": "application/json" },
54
+ body: JSON.stringify({ client_id: clientId, scope: GITHUB_SCOPES }),
55
+ });
56
+ const data = await res.json();
57
+ if (data.error) {
58
+ sendJson(response, { ok: false, error: data.error_description ?? data.error }, 400);
59
+ return;
60
+ }
61
+ sendJson(response, {
62
+ ok: true,
63
+ device_code: data.device_code,
64
+ user_code: data.user_code,
65
+ verification_uri: data.verification_uri,
66
+ verification_uri_complete: data.verification_uri_complete ?? data.verification_uri,
67
+ expires_in: data.expires_in ?? 900,
68
+ interval: data.interval ?? 5,
69
+ });
70
+ }
71
+ catch (error) {
72
+ sendJson(response, { ok: false, error: errorMessage(error) }, 500);
73
+ }
74
+ }),
75
+ route("POST", "/api/github/oauth/poll", async ({ request, response, configStore }) => {
76
+ const clientId = getClientId();
77
+ if (!clientId) {
78
+ sendJson(response, { ok: false, error: "NOMOREIDE_GITHUB_CLIENT_ID is not set." }, 400);
79
+ return;
80
+ }
81
+ try {
82
+ const body = await readJson(request);
83
+ const deviceCode = typeof body.device_code === "string" ? body.device_code : "";
84
+ if (!deviceCode) {
85
+ sendJson(response, { ok: false, error: "device_code is required" }, 400);
86
+ return;
87
+ }
88
+ const res = await fetch(GITHUB_ACCESS_TOKEN_URL, {
89
+ method: "POST",
90
+ headers: { Accept: "application/json", "Content-Type": "application/json" },
91
+ body: JSON.stringify({
92
+ client_id: clientId,
93
+ device_code: deviceCode,
94
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
95
+ }),
96
+ });
97
+ const data = await res.json();
98
+ if (data.access_token) {
99
+ await configStore.setGithubToken("github.com", data.access_token);
100
+ sendJson(response, { ok: true, done: true });
101
+ return;
102
+ }
103
+ // authorization_pending and slow_down are expected — not errors
104
+ const pending = data.error === "authorization_pending" || data.error === "slow_down";
105
+ if (pending) {
106
+ sendJson(response, { ok: true, done: false, slowDown: data.error === "slow_down" });
107
+ return;
108
+ }
109
+ sendJson(response, {
110
+ ok: false,
111
+ error: data.error_description ?? data.error ?? "Authorization failed",
112
+ }, 400);
113
+ }
114
+ catch (error) {
115
+ sendJson(response, { ok: false, error: errorMessage(error) }, 500);
116
+ }
117
+ }),
118
+ // --- Pull Requests ---
119
+ route("GET", "/api/github/prs", async ({ response, url, configStore, cwd }) => {
120
+ try {
121
+ const gitCwd = await selectedGitCwd(configStore, cwd);
122
+ const { manager } = await requireGitHubContext(configStore, gitCwd);
123
+ const state = (url.searchParams.get("state") || "open");
124
+ const page = Number(url.searchParams.get("page")) || 1;
125
+ const prs = await manager.listPRs(state, page);
126
+ sendJson(response, { ok: true, prs });
127
+ }
128
+ catch (error) {
129
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
130
+ }
131
+ }),
132
+ route("POST", "/api/github/prs", async ({ request, response, configStore, cwd }) => {
133
+ try {
134
+ const gitCwd = await selectedGitCwd(configStore, cwd);
135
+ const { manager } = await requireGitHubContext(configStore, gitCwd);
136
+ const body = await readJson(request);
137
+ const title = typeof body.title === "string" ? body.title.trim() : "";
138
+ const head = typeof body.head === "string" ? body.head.trim() : "";
139
+ const base = typeof body.base === "string" ? body.base.trim() : "";
140
+ if (!title || !head || !base) {
141
+ sendJson(response, { ok: false, error: "title, head, and base are required" }, 400);
142
+ return;
143
+ }
144
+ const pr = await manager.createPR({
145
+ title,
146
+ body: typeof body.body === "string" ? body.body : undefined,
147
+ head,
148
+ base,
149
+ draft: body.draft === true,
150
+ });
151
+ sendJson(response, { ok: true, pr });
152
+ }
153
+ catch (error) {
154
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
155
+ }
156
+ }),
157
+ patternRoute(/^\/api\/github\/prs\/(\d+)$/, ["number"], async ({ request, response, configStore, cwd, params }) => {
158
+ if (request.method !== "GET") {
159
+ sendJson(response, { ok: false, error: "Method not allowed" }, 405);
160
+ return;
161
+ }
162
+ try {
163
+ const gitCwd = await selectedGitCwd(configStore, cwd);
164
+ const { manager } = await requireGitHubContext(configStore, gitCwd);
165
+ const pr = await manager.getPR(Number(params.number));
166
+ sendJson(response, { ok: true, pr });
167
+ }
168
+ catch (error) {
169
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
170
+ }
171
+ }),
172
+ patternRoute(/^\/api\/github\/prs\/(\d+)\/merge$/, ["number"], async ({ request, response, configStore, cwd, params }) => {
173
+ if (request.method !== "POST") {
174
+ sendJson(response, { ok: false, error: "Method not allowed" }, 405);
175
+ return;
176
+ }
177
+ try {
178
+ const gitCwd = await selectedGitCwd(configStore, cwd);
179
+ const { manager } = await requireGitHubContext(configStore, gitCwd);
180
+ const body = await readJson(request).catch(() => ({}));
181
+ const requested = typeof body.method === "string" ? body.method : "squash";
182
+ const method = (["merge", "squash", "rebase"].includes(requested)
183
+ ? requested
184
+ : "squash");
185
+ const result = await manager.mergePR(Number(params.number), {
186
+ method,
187
+ commitTitle: typeof body.commitTitle === "string" ? body.commitTitle : undefined,
188
+ commitMessage: typeof body.commitMessage === "string" ? body.commitMessage : undefined,
189
+ });
190
+ sendJson(response, { ok: true, ...result });
191
+ }
192
+ catch (error) {
193
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
194
+ }
195
+ }),
196
+ patternRoute(/^\/api\/github\/prs\/(\d+)\/diff$/, ["number"], async ({ request, response, configStore, cwd, params }) => {
197
+ if (request.method !== "GET") {
198
+ sendJson(response, { ok: false, error: "Method not allowed" }, 405);
199
+ return;
200
+ }
201
+ try {
202
+ const gitCwd = await selectedGitCwd(configStore, cwd);
203
+ const { manager } = await requireGitHubContext(configStore, gitCwd);
204
+ const diff = await manager.getPRDiff(Number(params.number));
205
+ sendText(response, diff);
206
+ }
207
+ catch (error) {
208
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
209
+ }
210
+ }),
211
+ // --- Issues ---
212
+ route("GET", "/api/github/issues", async ({ response, url, configStore, cwd }) => {
213
+ try {
214
+ const gitCwd = await selectedGitCwd(configStore, cwd);
215
+ const { manager } = await requireGitHubContext(configStore, gitCwd);
216
+ const state = (url.searchParams.get("state") || "open");
217
+ const page = Number(url.searchParams.get("page")) || 1;
218
+ const issues = await manager.listIssues(state, page);
219
+ sendJson(response, { ok: true, issues });
220
+ }
221
+ catch (error) {
222
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
223
+ }
224
+ }),
225
+ route("POST", "/api/github/issues", async ({ request, response, configStore, cwd }) => {
226
+ try {
227
+ const gitCwd = await selectedGitCwd(configStore, cwd);
228
+ const { manager } = await requireGitHubContext(configStore, gitCwd);
229
+ const body = await readJson(request);
230
+ const title = typeof body.title === "string" ? body.title.trim() : "";
231
+ if (!title) {
232
+ sendJson(response, { ok: false, error: "title is required" }, 400);
233
+ return;
234
+ }
235
+ const issue = await manager.createIssue({
236
+ title,
237
+ body: typeof body.body === "string" ? body.body : undefined,
238
+ });
239
+ sendJson(response, { ok: true, issue });
240
+ }
241
+ catch (error) {
242
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
243
+ }
244
+ }),
245
+ patternRoute(/^\/api\/github\/issues\/(\d+)$/, ["number"], async ({ request, response, configStore, cwd, params }) => {
246
+ if (request.method !== "GET") {
247
+ sendJson(response, { ok: false, error: "Method not allowed" }, 405);
248
+ return;
249
+ }
250
+ try {
251
+ const gitCwd = await selectedGitCwd(configStore, cwd);
252
+ const { manager } = await requireGitHubContext(configStore, gitCwd);
253
+ const issue = await manager.getIssue(Number(params.number));
254
+ sendJson(response, { ok: true, issue });
255
+ }
256
+ catch (error) {
257
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
258
+ }
259
+ }),
260
+ patternRoute(/^\/api\/github\/issues\/(\d+)\/comments$/, ["number"], async ({ request, response, configStore, cwd, params }) => {
261
+ const gitCwd = await selectedGitCwd(configStore, cwd);
262
+ const number = Number(params.number);
263
+ if (request.method === "GET") {
264
+ try {
265
+ const { manager } = await requireGitHubContext(configStore, gitCwd);
266
+ const comments = await manager.listIssueComments(number);
267
+ sendJson(response, { ok: true, comments });
268
+ }
269
+ catch (error) {
270
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
271
+ }
272
+ return;
273
+ }
274
+ if (request.method === "POST") {
275
+ try {
276
+ const { manager } = await requireGitHubContext(configStore, gitCwd);
277
+ const body = await readJson(request);
278
+ const text = typeof body.body === "string" ? body.body.trim() : "";
279
+ if (!text) {
280
+ sendJson(response, { ok: false, error: "body is required" }, 400);
281
+ return;
282
+ }
283
+ const comment = await manager.addIssueComment(number, text);
284
+ sendJson(response, { ok: true, comment });
285
+ }
286
+ catch (error) {
287
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
288
+ }
289
+ return;
290
+ }
291
+ sendJson(response, { ok: false, error: "Method not allowed" }, 405);
292
+ }),
293
+ // --- CI / Actions ---
294
+ patternRoute(/^\/api\/github\/ci\/([0-9a-f]{4,64})$/, ["sha"], async ({ request, response, configStore, cwd, params }) => {
295
+ if (request.method !== "GET") {
296
+ sendJson(response, { ok: false, error: "Method not allowed" }, 405);
297
+ return;
298
+ }
299
+ try {
300
+ const gitCwd = await selectedGitCwd(configStore, cwd);
301
+ const ctx = await optionalGitHubContext(configStore, gitCwd);
302
+ if (!ctx) {
303
+ sendJson(response, { ok: true, status: { sha: params.sha, state: "unknown", totalCount: 0, runs: [] } });
304
+ return;
305
+ }
306
+ const status = await ctx.manager.getCommitChecks(params.sha);
307
+ sendJson(response, { ok: true, status });
308
+ }
309
+ catch (error) {
310
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
311
+ }
312
+ }),
313
+ route("GET", "/api/github/runs", async ({ response, url, configStore, cwd }) => {
314
+ try {
315
+ const gitCwd = await selectedGitCwd(configStore, cwd);
316
+ const { manager } = await requireGitHubContext(configStore, gitCwd);
317
+ const branch = url.searchParams.get("branch") || undefined;
318
+ const page = Number(url.searchParams.get("page")) || 1;
319
+ const runs = await manager.listWorkflowRuns(branch, page);
320
+ sendJson(response, { ok: true, runs });
321
+ }
322
+ catch (error) {
323
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
324
+ }
325
+ }),
326
+ patternRoute(/^\/api\/github\/runs\/(\d+)\/jobs$/, ["runId"], async ({ request, response, configStore, cwd, params }) => {
327
+ if (request.method !== "GET") {
328
+ sendJson(response, { ok: false, error: "Method not allowed" }, 405);
329
+ return;
330
+ }
331
+ try {
332
+ const gitCwd = await selectedGitCwd(configStore, cwd);
333
+ const { manager } = await requireGitHubContext(configStore, gitCwd);
334
+ const jobs = await manager.listWorkflowRunJobs(Number(params.runId));
335
+ sendJson(response, { ok: true, jobs });
336
+ }
337
+ catch (error) {
338
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
339
+ }
340
+ }),
341
+ ];
342
+ //# sourceMappingURL=github-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-routes.js","sourceRoot":"","sources":["../../../src/web/routes/github-routes.ts"],"names":[],"mappings":"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"}
@@ -4,12 +4,14 @@ import { agentChatRoutes } from "./agent-chat-routes.js";
4
4
  import { databaseRoutes } from "./database-routes.js";
5
5
  import { errorRoutes } from "./errors-routes.js";
6
6
  import { gitRoutes } from "./git-routes.js";
7
+ import { githubRoutes } from "./github-routes.js";
7
8
  import { logSourceRoutes } from "./log-sources-routes.js";
8
9
  import { metricsRoutes } from "./metrics-routes.js";
9
10
  import { onboardRoutes } from "./onboard-routes.js";
10
11
  import { serviceRoutes } from "./service-routes.js";
11
12
  import { shellRoutes } from "./shell-routes.js";
12
13
  import { terminalRoutes } from "./terminal-routes.js";
14
+ import { workflowRoutes } from "./workflow-routes.js";
13
15
  /**
14
16
  * All routes in dispatch order. `/api/*` route groups come first; the shell /
15
17
  * static catch-alls are last so they only run when no API route matched.
@@ -23,9 +25,11 @@ export const routes = [
23
25
  ...agentChatRoutes,
24
26
  ...databaseRoutes,
25
27
  ...errorRoutes,
28
+ ...githubRoutes,
26
29
  ...gitRoutes,
27
30
  ...logSourceRoutes,
28
31
  ...metricsRoutes,
32
+ ...workflowRoutes,
29
33
  ...onboardRoutes,
30
34
  ...serviceRoutes,
31
35
  ...terminalRoutes,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,MAAM,GAAY;IAC7B,GAAG,eAAe;IAClB,GAAG,WAAW;IACd,GAAG,eAAe;IAClB,GAAG,cAAc;IACjB,GAAG,WAAW;IACd,GAAG,SAAS;IACZ,GAAG,eAAe;IAClB,GAAG,aAAa;IAChB,GAAG,aAAa;IAChB,GAAG,aAAa;IAChB,GAAG,cAAc;IACjB,GAAG,WAAW;CACf,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,MAAM,GAAY;IAC7B,GAAG,eAAe;IAClB,GAAG,WAAW;IACd,GAAG,eAAe;IAClB,GAAG,cAAc;IACjB,GAAG,WAAW;IACd,GAAG,YAAY;IACf,GAAG,SAAS;IACZ,GAAG,eAAe;IAClB,GAAG,aAAa;IAChB,GAAG,cAAc;IACjB,GAAG,aAAa;IAChB,GAAG,aAAa;IAChB,GAAG,cAAc;IACjB,GAAG,WAAW;CACf,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type Route } from "./context.js";
2
+ /**
3
+ * User-owned git/GitHub workflows. `GET` returns the built-in templates merged
4
+ * with the user's saved/forked workflows; `POST`/`DELETE` persist edits through
5
+ * ConfigStore. The runner that executes a workflow lives client-side (agent
6
+ * steps run through the dock conversation), so there's no "run" endpoint here.
7
+ */
8
+ export declare const workflowRoutes: Route[];
@@ -0,0 +1,45 @@
1
+ import { listWorkflows, workflowSchema } from "../../core/workflows.js";
2
+ import { readJson, sendJson } from "../http-utils.js";
3
+ import { errorMessage, patternRoute, route } from "./context.js";
4
+ /**
5
+ * User-owned git/GitHub workflows. `GET` returns the built-in templates merged
6
+ * with the user's saved/forked workflows; `POST`/`DELETE` persist edits through
7
+ * ConfigStore. The runner that executes a workflow lives client-side (agent
8
+ * steps run through the dock conversation), so there's no "run" endpoint here.
9
+ */
10
+ export const workflowRoutes = [
11
+ route("GET", "/api/workflows", async ({ response, configStore }) => {
12
+ try {
13
+ const config = await configStore.load();
14
+ sendJson(response, { ok: true, workflows: listWorkflows(config.workflows) });
15
+ }
16
+ catch (error) {
17
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
18
+ }
19
+ }),
20
+ route("POST", "/api/workflows", async ({ request, response, configStore }) => {
21
+ try {
22
+ const body = await readJson(request);
23
+ const workflow = workflowSchema.parse({ ...body, builtin: false });
24
+ const config = await configStore.saveWorkflow(workflow);
25
+ sendJson(response, { ok: true, workflows: listWorkflows(config.workflows) });
26
+ }
27
+ catch (error) {
28
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
29
+ }
30
+ }),
31
+ patternRoute(/^\/api\/workflows\/([^/]+)$/, ["id"], async ({ request, response, configStore, params }) => {
32
+ if (request.method !== "DELETE") {
33
+ sendJson(response, { ok: false, error: "Method not allowed" }, 405);
34
+ return;
35
+ }
36
+ try {
37
+ const config = await configStore.removeWorkflow(decodeURIComponent(params.id));
38
+ sendJson(response, { ok: true, workflows: listWorkflows(config.workflows) });
39
+ }
40
+ catch (error) {
41
+ sendJson(response, { ok: false, error: errorMessage(error) }, 400);
42
+ }
43
+ }),
44
+ ];
45
+ //# sourceMappingURL=workflow-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-routes.js","sourceRoot":"","sources":["../../../src/web/routes/workflow-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAc,MAAM,cAAc,CAAC;AAE7E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,KAAK,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE;QACjE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;YACxC,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE;QAC3E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACxD,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,CAAC;IAEF,YAAY,CACV,6BAA6B,EAC7B,CAAC,IAAI,CAAC,EACN,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QACnD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChC,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,GAAG,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,CACF;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nomoreide",
3
- "version": "0.1.44",
3
+ "version": "0.1.46",
4
4
  "description": "An AI-native terminal workbench for services, Git review, logs, and MCP workflows.",
5
5
  "repository": {
6
6
  "type": "git",