@dmrlzz/davecode 0.3.0 → 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 (104) hide show
  1. package/README.md +5 -4
  2. package/bin/davecode.js +0 -0
  3. package/dist/{ChatApp-FO5SABXB.js → ChatApp-BO7QMBWD.js} +289 -137
  4. package/dist/ChatApp-BO7QMBWD.js.map +1 -0
  5. package/dist/{RunnerView-DLVR7C22.js → RunnerView-A7JSPUW5.js} +5 -5
  6. package/dist/account-UGNLJPQ4.js +23 -0
  7. package/dist/accounts-NM7IWP53.js +37 -0
  8. package/dist/{budget-RBHCEDPP.js → budget-INAW6FXD.js} +6 -6
  9. package/dist/chat-U4QJQ7M6.js +359 -0
  10. package/dist/chat-U4QJQ7M6.js.map +1 -0
  11. package/dist/{chunk-C7FDRA3U.js → chunk-3Q2KCXLN.js} +660 -139
  12. package/dist/chunk-3Q2KCXLN.js.map +1 -0
  13. package/dist/{chunk-BOLFK3BH.js → chunk-5LKOJBUL.js} +2 -2
  14. package/dist/{accounts-MTMGYKEP.js → chunk-CWBVNS3L.js} +24 -17
  15. package/dist/chunk-CWBVNS3L.js.map +1 -0
  16. package/dist/{chunk-PIIJ3RSI.js → chunk-DZ2FDABF.js} +1269 -1265
  17. package/dist/chunk-DZ2FDABF.js.map +1 -0
  18. package/dist/{chunk-OYEYNDOO.js → chunk-GE22VBCY.js} +3 -3
  19. package/dist/chunk-GHDOUII5.js +144 -0
  20. package/dist/chunk-GHDOUII5.js.map +1 -0
  21. package/dist/{chunk-MSLLH5XP.js → chunk-GZJ6JSO7.js} +4 -4
  22. package/dist/{chunk-VVCXGQMY.js → chunk-MC7RIPL7.js} +17 -8
  23. package/dist/chunk-MC7RIPL7.js.map +1 -0
  24. package/dist/{chunk-23KTE7IK.js → chunk-MOK5D3XJ.js} +2 -2
  25. package/dist/{chunk-OXRMGR72.js → chunk-PGPXE6LF.js} +2 -2
  26. package/dist/chunk-QA3O6RA2.js +81 -0
  27. package/dist/chunk-QA3O6RA2.js.map +1 -0
  28. package/dist/chunk-ROIUTNQV.js +20 -0
  29. package/dist/chunk-ROIUTNQV.js.map +1 -0
  30. package/dist/{chunk-IVZHKUCD.js → chunk-Z6NQDJEN.js} +3 -3
  31. package/dist/{config-FRMY5OHG.js → config-YEAPBMBX.js} +5 -5
  32. package/dist/dashboard/assets/Accounts-CeVyX4a3.js +1 -0
  33. package/dist/dashboard/assets/Badge-CGY6DgGx.js +55 -0
  34. package/dist/dashboard/assets/{Callout-B9g_wPDi.js → Callout-DauCk_cW.js} +1 -1
  35. package/dist/dashboard/assets/{Field-BfabPEcY.js → Field-OXMnT9Tb.js} +1 -1
  36. package/dist/dashboard/assets/{Goals-BsV-6m94.js → Goals-DH-KDh8M.js} +1 -1
  37. package/dist/dashboard/assets/{Library-CEA9P1m-.js → Library-C15szLjZ.js} +1 -1
  38. package/dist/dashboard/assets/{Markdown-ClRsddnB.js → Markdown-Xhao3sgL.js} +7 -7
  39. package/dist/dashboard/assets/Panel-Du40pM7n.js +1 -0
  40. package/dist/dashboard/assets/{RoutesPage-Dh-BJ3ir.js → RoutesPage-Cj1OelGO.js} +1 -1
  41. package/dist/dashboard/assets/{Runner-C_e9l5l2.js → Runner-BK1-ZF7h.js} +1 -1
  42. package/dist/dashboard/assets/{Settings-C6Yc1Gjg.js → Settings-C1nzQQhe.js} +1 -1
  43. package/dist/dashboard/assets/{Switch-CUpOJjUT.js → Switch-bwtIJ00H.js} +1 -1
  44. package/dist/dashboard/assets/Tasks-x4s8IiPG.js +2 -0
  45. package/dist/dashboard/assets/{Traffic-CE6wZSMr.js → Traffic-CV7TaTid.js} +1 -1
  46. package/dist/dashboard/assets/{Workspace-CxFxvkA6.js → Workspace-DAL-MBc0.js} +1 -1
  47. package/dist/dashboard/assets/arrow-up-goM9r-I9.js +1 -0
  48. package/dist/dashboard/assets/{forms-D6UIYgC5.js → forms-DtpfI65-.js} +1 -1
  49. package/dist/dashboard/assets/index-BCi-Vuvh.js +104 -0
  50. package/dist/dashboard/assets/{index-1iH716Xy.css → index-CcJFhc98.css} +1 -1
  51. package/dist/dashboard/assets/{task-errors-CE4oEr8H.js → task-errors-B2pgjUGN.js} +1 -1
  52. package/dist/dashboard/assets/{trash-CWqeZ7eg.js → trash-BVojETtF.js} +1 -1
  53. package/dist/dashboard/favicon.svg +1 -7
  54. package/dist/dashboard/index.html +4 -4
  55. package/dist/{dist-ZPXEVBEC.js → dist-RRQGUBL3.js} +24 -2
  56. package/dist/dist-RRQGUBL3.js.map +1 -0
  57. package/dist/{doctor-7RUD4D3A.js → doctor-MQYK44S2.js} +5 -5
  58. package/dist/{goal-JFRNPBSD.js → goal-6NUX4AIT.js} +5 -5
  59. package/dist/index.js +48 -30
  60. package/dist/index.js.map +1 -1
  61. package/dist/{init-NFYNO3A3.js → init-AXYIWAB3.js} +6 -6
  62. package/dist/{prompts-L37J72YW.js → prompts-TZ7UC42M.js} +9 -5
  63. package/dist/prompts-TZ7UC42M.js.map +1 -0
  64. package/dist/{run-ARUPXFFB.js → run-QRTLHFB3.js} +10 -10
  65. package/dist/runtime.js +18 -0
  66. package/dist/runtime.js.map +1 -0
  67. package/dist/{start-CFPOVIAR.js → start-O5I5TSO2.js} +5 -5
  68. package/dist/{status-E4EACVE2.js → status-LEA3RVUX.js} +6 -6
  69. package/dist/status-LEA3RVUX.js.map +1 -0
  70. package/dist/{tasks-ZIK6BVEX.js → tasks-XOTVICVZ.js} +6 -6
  71. package/package.json +21 -15
  72. package/dist/ChatApp-FO5SABXB.js.map +0 -1
  73. package/dist/accounts-MTMGYKEP.js.map +0 -1
  74. package/dist/chat-ZDXX3N6X.js +0 -95
  75. package/dist/chat-ZDXX3N6X.js.map +0 -1
  76. package/dist/chunk-C7FDRA3U.js.map +0 -1
  77. package/dist/chunk-DYQ56FBT.js +0 -47
  78. package/dist/chunk-DYQ56FBT.js.map +0 -1
  79. package/dist/chunk-PIIJ3RSI.js.map +0 -1
  80. package/dist/chunk-VVCXGQMY.js.map +0 -1
  81. package/dist/dashboard/assets/Accounts-BR3ZfVk4.js +0 -1
  82. package/dist/dashboard/assets/Badge-B-qzNRrZ.js +0 -55
  83. package/dist/dashboard/assets/Panel-B9tSgX6l.js +0 -1
  84. package/dist/dashboard/assets/Tasks-CTku0rR3.js +0 -2
  85. package/dist/dashboard/assets/arrow-up-DL3CuFOO.js +0 -1
  86. package/dist/dashboard/assets/index-BMWr9EKo.js +0 -104
  87. package/dist/prompts-L37J72YW.js.map +0 -1
  88. /package/dist/{RunnerView-DLVR7C22.js.map → RunnerView-A7JSPUW5.js.map} +0 -0
  89. /package/dist/{dist-ZPXEVBEC.js.map → account-UGNLJPQ4.js.map} +0 -0
  90. /package/dist/{status-E4EACVE2.js.map → accounts-NM7IWP53.js.map} +0 -0
  91. /package/dist/{budget-RBHCEDPP.js.map → budget-INAW6FXD.js.map} +0 -0
  92. /package/dist/{chunk-BOLFK3BH.js.map → chunk-5LKOJBUL.js.map} +0 -0
  93. /package/dist/{chunk-OYEYNDOO.js.map → chunk-GE22VBCY.js.map} +0 -0
  94. /package/dist/{chunk-MSLLH5XP.js.map → chunk-GZJ6JSO7.js.map} +0 -0
  95. /package/dist/{chunk-23KTE7IK.js.map → chunk-MOK5D3XJ.js.map} +0 -0
  96. /package/dist/{chunk-OXRMGR72.js.map → chunk-PGPXE6LF.js.map} +0 -0
  97. /package/dist/{chunk-IVZHKUCD.js.map → chunk-Z6NQDJEN.js.map} +0 -0
  98. /package/dist/{config-FRMY5OHG.js.map → config-YEAPBMBX.js.map} +0 -0
  99. /package/dist/{doctor-7RUD4D3A.js.map → doctor-MQYK44S2.js.map} +0 -0
  100. /package/dist/{goal-JFRNPBSD.js.map → goal-6NUX4AIT.js.map} +0 -0
  101. /package/dist/{init-NFYNO3A3.js.map → init-AXYIWAB3.js.map} +0 -0
  102. /package/dist/{run-ARUPXFFB.js.map → run-QRTLHFB3.js.map} +0 -0
  103. /package/dist/{start-CFPOVIAR.js.map → start-O5I5TSO2.js.map} +0 -0
  104. /package/dist/{tasks-ZIK6BVEX.js.map → tasks-XOTVICVZ.js.map} +0 -0
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createContext
3
- } from "./chunk-DYQ56FBT.js";
4
- import "./chunk-VVCXGQMY.js";
3
+ } from "./chunk-QA3O6RA2.js";
5
4
  import {
6
5
  CliError,
7
6
  EXIT
8
7
  } from "./chunk-7XVXEO7U.js";
8
+ import "./chunk-MC7RIPL7.js";
9
9
 
10
10
  // src/program.ts
11
11
  import { Command, CommanderError, InvalidArgumentError, Option } from "commander";
@@ -36,12 +36,12 @@ Docs: https://github.com/DMRLZZ/DaveCode#readme`
36
36
  run(async (ctx) => {
37
37
  const globals = program.opts();
38
38
  if (globals.version) {
39
- const { VERSION } = await import("./dist-ZPXEVBEC.js");
39
+ const { VERSION } = await import("./dist-RRQGUBL3.js");
40
40
  ctx.out(`davecode ${VERSION}`);
41
41
  return EXIT.ok;
42
42
  }
43
43
  if (ctx.interactive) {
44
- const { chatCommand } = await import("./chat-ZDXX3N6X.js");
44
+ const { chatCommand } = await import("./chat-U4QJQ7M6.js");
45
45
  return chatCommand(ctx, {});
46
46
  }
47
47
  program.outputHelp();
@@ -74,39 +74,57 @@ function collect(value, previous = []) {
74
74
  function registerCommands(program, run) {
75
75
  program.command("app").description("start your local workspace in a Chrome or Edge app window").addOption(new Option("-p, --port <port>", "port to listen on").argParser(parsePort)).option("--project <dir>", "repository to open").action(
76
76
  run(async (ctx, opts) => {
77
- const { startCommand } = await import("./start-CFPOVIAR.js");
77
+ const { startCommand } = await import("./start-O5I5TSO2.js");
78
78
  return startCommand(ctx, { ...opts, host: "127.0.0.1", app: true });
79
79
  })
80
80
  );
81
81
  program.command("start").description("start the gateway (OpenAI-compatible /v1, dashboard API and web dashboard)").addOption(new Option("-p, --port <port>", "port to listen on").argParser(parsePort)).option("--host <host>", "interface to bind (default 127.0.0.1)").option("--no-dashboard", "do not serve the web dashboard").option("--project <dir>", "repository whose project brain to serve (default: detected)").option("--verbose", "print gateway request logs").option("-q, --quiet", "do not print the live activity log").action(
82
82
  run(async (ctx, opts) => {
83
- const { startCommand } = await import("./start-CFPOVIAR.js");
83
+ const { startCommand } = await import("./start-O5I5TSO2.js");
84
84
  return startCommand(ctx, opts);
85
85
  })
86
86
  );
87
87
  program.command("status").description("gateway health, accounts and 1m/5h/24h quota usage").action(
88
88
  run(async (ctx) => {
89
- const { statusCommand } = await import("./status-E4EACVE2.js");
89
+ const { statusCommand } = await import("./status-LEA3RVUX.js");
90
90
  return statusCommand(ctx);
91
91
  })
92
92
  );
93
93
  program.command("chat").description("chat TUI (also what bare `davecode` opens in a terminal)").option("-m, --model <id>", "model or route, e.g. davecode/auto or anthropic/claude-sonnet-5-5").option("--project <dir>", "repository whose brain an in-process gateway serves").action(
94
94
  run(async (ctx, opts) => {
95
- const { chatCommand } = await import("./chat-ZDXX3N6X.js");
95
+ const { chatCommand } = await import("./chat-U4QJQ7M6.js");
96
96
  return chatCommand(ctx, opts);
97
97
  })
98
98
  );
99
+ program.command("login").description("sign in to your DaveCode account in the browser").action(
100
+ run(async (ctx) => {
101
+ const { loginCommand } = await import("./account-UGNLJPQ4.js");
102
+ return loginCommand(ctx);
103
+ })
104
+ );
105
+ program.command("logout").description("sign out of your DaveCode account").action(
106
+ run(async (ctx) => {
107
+ const { logoutCommand } = await import("./account-UGNLJPQ4.js");
108
+ return logoutCommand(ctx);
109
+ })
110
+ );
111
+ program.command("account").description("show the signed-in DaveCode account").action(
112
+ run(async (ctx) => {
113
+ const { accountCommand } = await import("./account-UGNLJPQ4.js");
114
+ return accountCommand(ctx);
115
+ })
116
+ );
99
117
  registerAccounts(program, run);
100
118
  registerProject(program, run);
101
119
  program.command("budget").description("plans, renewals and remaining quota per account (what agents are told)").option("--context", "print only the summary injected into agent prompts").option("--local", "read the local database even if a gateway is running").action(
102
120
  run(async (ctx, opts) => {
103
- const { budgetCommand } = await import("./budget-RBHCEDPP.js");
121
+ const { budgetCommand } = await import("./budget-INAW6FXD.js");
104
122
  return budgetCommand(ctx, opts);
105
123
  })
106
124
  );
107
125
  program.command("doctor").description("check the environment and print fixes").action(
108
126
  run(async (ctx) => {
109
- const { doctorCommand } = await import("./doctor-7RUD4D3A.js");
127
+ const { doctorCommand } = await import("./doctor-MQYK44S2.js");
110
128
  return doctorCommand(ctx);
111
129
  })
112
130
  );
@@ -120,7 +138,7 @@ Exit codes with --once: 0 success or nothing to do, 1 failed or error, 130 stopp
120
138
  Ctrl+C stops safely: partial work stays on the task branch and the task goes back to PENDING.`
121
139
  ).action(
122
140
  run(async (ctx, opts) => {
123
- const { runCommand } = await import("./run-ARUPXFFB.js");
141
+ const { runCommand } = await import("./run-QRTLHFB3.js");
124
142
  return runCommand(ctx, opts);
125
143
  })
126
144
  );
@@ -148,26 +166,26 @@ Examples:
148
166
  davecode goal "Add a /health endpoint with tests" --max-rounds 2`
149
167
  ).action(
150
168
  run(async (ctx, words, opts) => {
151
- const { goalCommand } = await import("./goal-JFRNPBSD.js");
169
+ const { goalCommand } = await import("./goal-6NUX4AIT.js");
152
170
  return goalCommand(ctx, words, opts);
153
171
  })
154
172
  );
155
173
  const goals = program.command("goals").description("goals of this repository");
156
174
  goals.command("list", { isDefault: true }).alias("ls").description("goals, newest first").option("--project <dir>", "repository (default: detected)").action(
157
175
  run(async (ctx, opts) => {
158
- const { goalsList } = await import("./goal-JFRNPBSD.js");
176
+ const { goalsList } = await import("./goal-6NUX4AIT.js");
159
177
  return goalsList(ctx, opts);
160
178
  })
161
179
  );
162
180
  goals.command("show <id>").description("tasks, artifacts and summary of a goal").option("--project <dir>", "repository (default: detected)").action(
163
181
  run(async (ctx, id, opts) => {
164
- const { goalsShow } = await import("./goal-JFRNPBSD.js");
182
+ const { goalsShow } = await import("./goal-6NUX4AIT.js");
165
183
  return goalsShow(ctx, id, opts);
166
184
  })
167
185
  );
168
186
  goals.command("cancel <id>").description("cancel a running goal").option("--project <dir>", "repository (default: detected)").action(
169
187
  run(async (ctx, id, opts) => {
170
- const { goalsCancel } = await import("./goal-JFRNPBSD.js");
188
+ const { goalsCancel } = await import("./goal-6NUX4AIT.js");
171
189
  return goalsCancel(ctx, id, opts);
172
190
  })
173
191
  );
@@ -175,20 +193,20 @@ Examples:
175
193
  function registerProject(program, run) {
176
194
  program.command("init").description("scaffold the project brain (.davecode/) in this repository").option("--name <name>", "project name used in STATE.md and ARCHITECTURE.md").option("--config", "write a starter .davecode/config.json without asking").option("--no-config", "do not write .davecode/config.json").action(
177
195
  run(async (ctx, opts) => {
178
- const { initCommand } = await import("./init-NFYNO3A3.js");
196
+ const { initCommand } = await import("./init-AXYIWAB3.js");
179
197
  return initCommand(ctx, opts);
180
198
  })
181
199
  );
182
200
  const tasks = program.command("tasks").description("show and edit the task graph");
183
201
  tasks.command("list", { isDefault: true }).alias("ls").description("task tree with status and blocked reasons").action(
184
202
  run(async (ctx) => {
185
- const { tasksList } = await import("./tasks-ZIK6BVEX.js");
203
+ const { tasksList } = await import("./tasks-XOTVICVZ.js");
186
204
  return tasksList(ctx);
187
205
  })
188
206
  );
189
207
  tasks.command("next").description("the task the runner would pick next").action(
190
208
  run(async (ctx) => {
191
- const { tasksNext } = await import("./tasks-ZIK6BVEX.js");
209
+ const { tasksNext } = await import("./tasks-XOTVICVZ.js");
192
210
  return tasksNext(ctx);
193
211
  })
194
212
  );
@@ -199,33 +217,33 @@ function registerProject(program, run) {
199
217
  ).action(
200
218
  run(
201
219
  async (ctx, id, title, opts) => {
202
- const { tasksAdd } = await import("./tasks-ZIK6BVEX.js");
220
+ const { tasksAdd } = await import("./tasks-XOTVICVZ.js");
203
221
  return tasksAdd(ctx, id, title, opts);
204
222
  }
205
223
  )
206
224
  );
207
225
  tasks.command("status <id> <status>").description("move a task to PENDING | IN_PROGRESS | SUCCESS | FAILED").option("--notes <text>", "note stored on the task").action(
208
226
  run(async (ctx, id, status, opts) => {
209
- const { tasksStatus } = await import("./tasks-ZIK6BVEX.js");
227
+ const { tasksStatus } = await import("./tasks-XOTVICVZ.js");
210
228
  return tasksStatus(ctx, id, status, opts);
211
229
  })
212
230
  );
213
231
  const config = program.command("config").description("show the resolved configuration");
214
232
  config.command("show", { isDefault: true }).description("resolved config as JSON (secrets redacted)").action(
215
233
  run(async (ctx) => {
216
- const { configShow } = await import("./config-FRMY5OHG.js");
234
+ const { configShow } = await import("./config-YEAPBMBX.js");
217
235
  return configShow(ctx);
218
236
  })
219
237
  );
220
238
  config.command("path").description("where config, state and brains live").action(
221
239
  run(async (ctx) => {
222
- const { configPath } = await import("./config-FRMY5OHG.js");
240
+ const { configPath } = await import("./config-YEAPBMBX.js");
223
241
  return configPath(ctx);
224
242
  })
225
243
  );
226
244
  config.command("get <key>").description("one value by dotted key, e.g. server.port").action(
227
245
  run(async (ctx, key) => {
228
- const { configGet } = await import("./config-FRMY5OHG.js");
246
+ const { configGet } = await import("./config-YEAPBMBX.js");
229
247
  return configGet(ctx, key);
230
248
  })
231
249
  );
@@ -249,7 +267,7 @@ Examples:
249
267
  davecode accounts add --provider claude-cli --label "Claude Pro" --yes`
250
268
  ).action(
251
269
  run(async (ctx, opts) => {
252
- const { accountsAdd } = await import("./accounts-MTMGYKEP.js");
270
+ const { accountsAdd } = await import("./accounts-NM7IWP53.js");
253
271
  return accountsAdd(ctx, opts);
254
272
  })
255
273
  );
@@ -258,7 +276,7 @@ function registerAccounts(program, run) {
258
276
  const accounts = program.command("accounts").description("manage provider accounts");
259
277
  accounts.command("list", { isDefault: true }).alias("ls").description("list accounts").option("--local", "read the local database even if a gateway is running").action(
260
278
  run(async (ctx, opts) => {
261
- const { accountsList } = await import("./accounts-MTMGYKEP.js");
279
+ const { accountsList } = await import("./accounts-NM7IWP53.js");
262
280
  return accountsList(ctx, opts);
263
281
  })
264
282
  );
@@ -268,7 +286,7 @@ function registerAccounts(program, run) {
268
286
  );
269
287
  accounts.command("remove <id>").alias("rm").description("remove an account, its secret and its sandbox").option("-y, --yes", "do not ask for confirmation").option("--local", "write to the local database even if a gateway is running").action(
270
288
  run(async (ctx, id, opts) => {
271
- const { accountsRemove } = await import("./accounts-MTMGYKEP.js");
289
+ const { accountsRemove } = await import("./accounts-NM7IWP53.js");
272
290
  return accountsRemove(ctx, id, opts);
273
291
  })
274
292
  );
@@ -278,7 +296,7 @@ function registerAccounts(program, run) {
278
296
  ]) {
279
297
  accounts.command(`${name} <id>`).description(`${name} an account${enabled ? " (also clears error and cooldown state)" : ""}`).option("--local", "write to the local database even if a gateway is running").action(
280
298
  run(async (ctx, id, opts) => {
281
- const { accountsSetEnabled } = await import("./accounts-MTMGYKEP.js");
299
+ const { accountsSetEnabled } = await import("./accounts-NM7IWP53.js");
282
300
  return accountsSetEnabled(ctx, id, enabled, opts);
283
301
  })
284
302
  );
@@ -290,7 +308,7 @@ Entered by hand: DaveCode never reads billing pages. Example:
290
308
  davecode accounts plan acc_123 --plan "Claude Pro" --price 20 --renews 2026-11-01`
291
309
  ).action(
292
310
  run(async (ctx, id, opts) => {
293
- const { accountsPlan } = await import("./accounts-MTMGYKEP.js");
311
+ const { accountsPlan } = await import("./accounts-NM7IWP53.js");
294
312
  return accountsPlan(ctx, id, opts);
295
313
  })
296
314
  );
@@ -306,7 +324,7 @@ Extra arguments after -- replace the default ones (e.g. -- login --device-auth f
306
324
  ).action(
307
325
  run(
308
326
  async (ctx, id, args, opts) => {
309
- const { accountsLogin } = await import("./accounts-MTMGYKEP.js");
327
+ const { accountsLogin } = await import("./accounts-NM7IWP53.js");
310
328
  return accountsLogin(ctx, id, args, opts);
311
329
  }
312
330
  )
@@ -320,7 +338,7 @@ connected, start the vendor's own sign-in. Example:
320
338
  davecode accounts connect acc_123 --check`
321
339
  ).action(
322
340
  run(async (ctx, id, opts) => {
323
- const { accountsConnect } = await import("./accounts-MTMGYKEP.js");
341
+ const { accountsConnect } = await import("./accounts-NM7IWP53.js");
324
342
  return accountsConnect(ctx, id, opts);
325
343
  })
326
344
  );
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/program.ts","../src/index.ts"],"sourcesContent":["import { Command, CommanderError, InvalidArgumentError, Option } from 'commander';\nimport { type CliContext, type CliIO, createContext, type GlobalOptions } from './context';\nimport { CliError, EXIT } from './errors';\n\n/**\n * Command tree. Keep this module light: it only declares commands and options. Every action\n * lazy-loads its implementation, so `davecode --help` never pays for SQLite, Fastify or Ink.\n */\n\nexport interface RunOptions {\n io: CliIO;\n env: NodeJS.ProcessEnv;\n cwd: string;\n}\n\n/** Result of an action: an exit code, or nothing for success. */\nexport type ActionResult = number | undefined;\n\ninterface ProgramState {\n ctx?: CliContext;\n exitCode: number;\n}\n\nexport function buildProgram(options: RunOptions, state: ProgramState = { exitCode: 0 }): Command {\n const { io } = options;\n const program = new Command('davecode');\n\n const context = (): CliContext => {\n if (!state.ctx) throw new Error('CLI context is not initialised');\n return state.ctx;\n };\n\n /** Wrap a lazily loaded action: `(ctx, ...args) => exit code`. */\n const run =\n <A extends unknown[]>(action: (ctx: CliContext, ...args: A) => Promise<ActionResult>) =>\n async (...args: A) => {\n const code = await action(context(), ...args);\n if (typeof code === 'number') state.exitCode = code;\n };\n\n program\n .description('Local-first AI gateway and autonomous coding engine.')\n .usage('[command] [options]')\n .option('--home <dir>', 'DaveCode home directory (sets DAVECODE_HOME)')\n .option('--json', 'machine-readable JSON output where supported')\n .option('--no-color', 'disable colours (NO_COLOR is honoured too)')\n .option('-V, --version', 'print the version and exit')\n .showSuggestionAfterError(true)\n .configureOutput({\n writeOut: (text) => io.stdout.write(text),\n writeErr: (text) => io.stderr.write(text),\n outputError: (text, write) => write(text),\n })\n .exitOverride()\n .hook('preAction', (_root, action) => {\n state.ctx = createContext(action.optsWithGlobals<GlobalOptions>(), io, options);\n })\n .addHelpText(\n 'after',\n `\nRun \\`davecode\\` with no command in a terminal to open the chat TUI.\nDocs: https://github.com/DMRLZZ/DaveCode#readme`,\n );\n\n program.action(\n run(async (ctx) => {\n const globals = program.opts<GlobalOptions & { version?: boolean }>();\n if (globals.version) {\n const { VERSION } = await import('@davecode/core');\n ctx.out(`davecode ${VERSION}`);\n return EXIT.ok;\n }\n if (ctx.interactive) {\n const { chatCommand } = await import('./commands/chat');\n return chatCommand(ctx, {});\n }\n program.outputHelp();\n return EXIT.ok;\n }),\n );\n\n registerCommands(program, run);\n return program;\n}\n\ntype Runner = <A extends unknown[]>(\n action: (ctx: CliContext, ...args: A) => Promise<ActionResult>,\n) => (...args: A) => Promise<void>;\n\n/** Parse a TCP port (0 = pick a free one). */\nexport function parsePort(value: string): number {\n const n = Number(value);\n if (!/^\\d+$/.test(value.trim()) || !Number.isInteger(n) || n < 0 || n > 65535) {\n throw new InvalidArgumentError('expected a port number between 0 and 65535');\n }\n return n;\n}\n\n/** Parse a non-negative integer (priorities, weights, limits). */\nexport function parseInteger(value: string): number {\n const n = Number(value);\n if (!/^-?\\d+$/.test(value.trim()) || !Number.isSafeInteger(n) || n < 0) {\n throw new InvalidArgumentError('expected a non-negative integer');\n }\n return n;\n}\n\n/** Repeatable option collector (`--model a --model b`, also accepts `a,b`). */\nexport function collect(value: string, previous: string[] = []): string[] {\n return [\n ...previous,\n ...value\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean),\n ];\n}\n\n/** Subcommands. Each action dynamically imports its module. */\nfunction registerCommands(program: Command, run: Runner): void {\n program\n .command('app')\n .description('start your local workspace in a Chrome or Edge app window')\n .addOption(new Option('-p, --port <port>', 'port to listen on').argParser(parsePort))\n .option('--project <dir>', 'repository to open')\n .action(\n run(async (ctx, opts: import('./commands/start').StartOptions) => {\n const { startCommand } = await import('./commands/start');\n return startCommand(ctx, { ...opts, host: '127.0.0.1', app: true });\n }),\n );\n program\n .command('start')\n .description('start the gateway (OpenAI-compatible /v1, dashboard API and web dashboard)')\n .addOption(new Option('-p, --port <port>', 'port to listen on').argParser(parsePort))\n .option('--host <host>', 'interface to bind (default 127.0.0.1)')\n .option('--no-dashboard', 'do not serve the web dashboard')\n .option('--project <dir>', 'repository whose project brain to serve (default: detected)')\n .option('--verbose', 'print gateway request logs')\n .option('-q, --quiet', 'do not print the live activity log')\n .action(\n run(async (ctx, opts: import('./commands/start').StartOptions) => {\n const { startCommand } = await import('./commands/start');\n return startCommand(ctx, opts);\n }),\n );\n\n program\n .command('status')\n .description('gateway health, accounts and 1m/5h/24h quota usage')\n .action(\n run(async (ctx) => {\n const { statusCommand } = await import('./commands/status');\n return statusCommand(ctx);\n }),\n );\n\n program\n .command('chat')\n .description('chat TUI (also what bare `davecode` opens in a terminal)')\n .option('-m, --model <id>', 'model or route, e.g. davecode/auto or anthropic/claude-sonnet-5-5')\n .option('--project <dir>', 'repository whose brain an in-process gateway serves')\n .action(\n run(async (ctx, opts: { model?: string; project?: string }) => {\n const { chatCommand } = await import('./commands/chat');\n return chatCommand(ctx, opts);\n }),\n );\n\n registerAccounts(program, run);\n registerProject(program, run);\n\n program\n .command('budget')\n .description('plans, renewals and remaining quota per account (what agents are told)')\n .option('--context', 'print only the summary injected into agent prompts')\n .option('--local', 'read the local database even if a gateway is running')\n .action(\n run(async (ctx, opts: import('./commands/budget').BudgetFlags) => {\n const { budgetCommand } = await import('./commands/budget');\n return budgetCommand(ctx, opts);\n }),\n );\n\n program\n .command('doctor')\n .description('check the environment and print fixes')\n .action(\n run(async (ctx) => {\n const { doctorCommand } = await import('./commands/doctor');\n return doctorCommand(ctx);\n }),\n );\n\n program\n .command('run')\n .description('run the autonomous engine on the task graph (live view in a terminal)')\n .option('--once', 'implement at most one ready task, print the result and exit')\n .option(\n '--task <id>',\n \"run this task instead of the runner's pick (it must be PENDING and unblocked)\",\n )\n .option('--project <dir>', 'repository to work on (default: detected)')\n .addHelpText(\n 'after',\n `\nExit codes with --once: 0 success or nothing to do, 1 failed or error, 130 stopped.\nCtrl+C stops safely: partial work stays on the task branch and the task goes back to PENDING.`,\n )\n .action(\n run(async (ctx, opts: import('./commands/run').RunOptions) => {\n const { runCommand } = await import('./commands/run');\n return runCommand(ctx, opts);\n }),\n );\n\n registerGoals(program, run);\n}\n\nfunction registerGoals(program: Command, run: Runner): void {\n const limit = (flag: string, description: string) =>\n new Option(flag, description).argParser((value) => {\n const n = parseInteger(value);\n if (n < 1) throw new InvalidArgumentError('expected a positive integer');\n return n;\n });\n\n program\n .command('goal <objective...>')\n .description('pursue an objective with a team of agents (plan, execute, review, re-plan)')\n .addOption(\n limit('--max-rounds <n>', 'plan → execute → review rounds (capped by goal.maxRounds)'),\n )\n .addOption(limit('--max-tasks <n>', 'tasks across all rounds (capped by goal.maxTasks)'))\n .addOption(\n limit('--max-tokens <n>', 'token budget for the whole goal (capped by goal.maxTokens)'),\n )\n .option('--dry-run', 'plan only: print the task graph without executing it')\n .option('--project <dir>', 'repository to work in (default: detected)')\n .addHelpText(\n 'after',\n `\nAgents never send emails, post, pay or sign up for anything: such steps become drafts in\n.davecode/goals/<goal-id>/. Code tasks go through the autonomous runner (branch, checks, merge).\nCtrl+C cancels. Exit codes: 0 succeeded or planned, 1 failed or out of budget, 130 cancelled.\n\nExamples:\n davecode goal \"Write positioning and landing copy for this app\" --dry-run\n davecode goal \"Add a /health endpoint with tests\" --max-rounds 2`,\n )\n .action(\n run(async (ctx, words: string[], opts: import('./commands/goal').GoalOptions) => {\n const { goalCommand } = await import('./commands/goal');\n return goalCommand(ctx, words, opts);\n }),\n );\n\n const goals = program.command('goals').description('goals of this repository');\n goals\n .command('list', { isDefault: true })\n .alias('ls')\n .description('goals, newest first')\n .option('--project <dir>', 'repository (default: detected)')\n .action(\n run(async (ctx, opts: { project?: string }) => {\n const { goalsList } = await import('./commands/goal');\n return goalsList(ctx, opts);\n }),\n );\n goals\n .command('show <id>')\n .description('tasks, artifacts and summary of a goal')\n .option('--project <dir>', 'repository (default: detected)')\n .action(\n run(async (ctx, id: string, opts: { project?: string }) => {\n const { goalsShow } = await import('./commands/goal');\n return goalsShow(ctx, id, opts);\n }),\n );\n goals\n .command('cancel <id>')\n .description('cancel a running goal')\n .option('--project <dir>', 'repository (default: detected)')\n .action(\n run(async (ctx, id: string, opts: { project?: string }) => {\n const { goalsCancel } = await import('./commands/goal');\n return goalsCancel(ctx, id, opts);\n }),\n );\n}\n\nfunction registerProject(program: Command, run: Runner): void {\n program\n .command('init')\n .description('scaffold the project brain (.davecode/) in this repository')\n .option('--name <name>', 'project name used in STATE.md and ARCHITECTURE.md')\n .option('--config', 'write a starter .davecode/config.json without asking')\n .option('--no-config', 'do not write .davecode/config.json')\n .action(\n run(async (ctx, opts: { name?: string; config?: boolean }) => {\n const { initCommand } = await import('./commands/init');\n return initCommand(ctx, opts);\n }),\n );\n\n const tasks = program.command('tasks').description('show and edit the task graph');\n tasks\n .command('list', { isDefault: true })\n .alias('ls')\n .description('task tree with status and blocked reasons')\n .action(\n run(async (ctx) => {\n const { tasksList } = await import('./commands/tasks');\n return tasksList(ctx);\n }),\n );\n tasks\n .command('next')\n .description('the task the runner would pick next')\n .action(\n run(async (ctx) => {\n const { tasksNext } = await import('./commands/tasks');\n return tasksNext(ctx);\n }),\n );\n tasks\n .command('add <id> <title...>')\n .description('add a PENDING task')\n .option('-d, --depends <ids>', 'dependencies (repeatable or comma-separated)', collect)\n .addOption(new Option('-p, --priority <n>', 'higher runs first').argParser(parseInteger))\n .option('--description <text>', 'longer description')\n .option(\n '-a, --acceptance <criterion>',\n 'acceptance criterion (repeatable)',\n (v, prev: string[] = []) => [...prev, v],\n )\n .action(\n run(\n async (\n ctx,\n id: string,\n title: string[],\n opts: import('./commands/tasks').AddTaskOptions,\n ) => {\n const { tasksAdd } = await import('./commands/tasks');\n return tasksAdd(ctx, id, title, opts);\n },\n ),\n );\n tasks\n .command('status <id> <status>')\n .description('move a task to PENDING | IN_PROGRESS | SUCCESS | FAILED')\n .option('--notes <text>', 'note stored on the task')\n .action(\n run(async (ctx, id: string, status: string, opts: { notes?: string }) => {\n const { tasksStatus } = await import('./commands/tasks');\n return tasksStatus(ctx, id, status, opts);\n }),\n );\n\n const config = program.command('config').description('show the resolved configuration');\n config\n .command('show', { isDefault: true })\n .description('resolved config as JSON (secrets redacted)')\n .action(\n run(async (ctx) => {\n const { configShow } = await import('./commands/config');\n return configShow(ctx);\n }),\n );\n config\n .command('path')\n .description('where config, state and brains live')\n .action(\n run(async (ctx) => {\n const { configPath } = await import('./commands/config');\n return configPath(ctx);\n }),\n );\n config\n .command('get <key>')\n .description('one value by dotted key, e.g. server.port')\n .action(\n run(async (ctx, key: string) => {\n const { configGet } = await import('./commands/config');\n return configGet(ctx, key);\n }),\n );\n}\n\ntype AddOpts = import('./commands/accounts').AddCommandFlags;\n\nfunction addAccountOptions(command: Command, run: Runner): Command {\n return command\n .option(\n '--provider <kind>',\n 'anthropic | openai | gemini | openai-compatible | claude-cli | codex-cli | gemini-cli | gemini-web',\n )\n .option('--label <name>', 'human-friendly name')\n .addOption(\n new Option('--priority <n>', 'lower is tried first (default 100)').argParser(parseInteger),\n )\n .addOption(\n new Option('--weight <n>', 'traffic share among equal priorities').argParser(parseInteger),\n )\n .option('--secret-env <var>', 'read the API key from this environment variable')\n .option('--secret-stdin', 'read the API key from stdin')\n .option('--secret <value>', 'API key (discouraged: visible in shell history)')\n .option('--base-url <url>', 'endpoint for openai-compatible accounts')\n .option('--model <id>', 'advertised model (repeatable or comma-separated)', collect)\n .option('--default-model <id>', 'model used for davecode/auto without a route')\n .option('--binary-path <path>', 'CLI binary for claude-cli / codex-cli / gemini-cli')\n .option('--limit <key=value>', 'quota limit, e.g. tokens5h=500000 (repeatable)', collect)\n .option('--disabled', 'add the account disabled')\n .option('-y, --yes', 'never prompt: take everything from flags')\n .option('--no-login', 'do not offer to log in after adding a CLI account')\n .option('--local', 'write to the local database even if a gateway is running')\n .addHelpText(\n 'after',\n `\nExamples:\n davecode accounts add # interactive\n davecode accounts add --provider anthropic --label work --secret-env ANTHROPIC_API_KEY --yes\n echo \"$OPENROUTER_KEY\" | davecode accounts add --provider openai-compatible \\\\\n --base-url https://openrouter.ai/api/v1 --model openai/gpt-5.5 --secret-stdin\n davecode accounts add --provider claude-cli --label \"Claude Pro\" --yes`,\n )\n .action(\n run(async (ctx, opts: AddOpts) => {\n const { accountsAdd } = await import('./commands/accounts');\n return accountsAdd(ctx, opts);\n }),\n );\n}\n\nfunction registerAccounts(program: Command, run: Runner): void {\n const accounts = program.command('accounts').description('manage provider accounts');\n\n accounts\n .command('list', { isDefault: true })\n .alias('ls')\n .description('list accounts')\n .option('--local', 'read the local database even if a gateway is running')\n .action(\n run(async (ctx, opts: { local?: boolean }) => {\n const { accountsList } = await import('./commands/accounts');\n return accountsList(ctx, opts);\n }),\n );\n\n addAccountOptions(\n accounts.command('add').description('add an account (interactive in a terminal)'),\n run,\n );\n\n accounts\n .command('remove <id>')\n .alias('rm')\n .description('remove an account, its secret and its sandbox')\n .option('-y, --yes', 'do not ask for confirmation')\n .option('--local', 'write to the local database even if a gateway is running')\n .action(\n run(async (ctx, id: string, opts: { yes?: boolean; local?: boolean }) => {\n const { accountsRemove } = await import('./commands/accounts');\n return accountsRemove(ctx, id, opts);\n }),\n );\n\n for (const [name, enabled] of [\n ['enable', true],\n ['disable', false],\n ] as const) {\n accounts\n .command(`${name} <id>`)\n .description(`${name} an account${enabled ? ' (also clears error and cooldown state)' : ''}`)\n .option('--local', 'write to the local database even if a gateway is running')\n .action(\n run(async (ctx, id: string, opts: { local?: boolean }) => {\n const { accountsSetEnabled } = await import('./commands/accounts');\n return accountsSetEnabled(ctx, id, enabled, opts);\n }),\n );\n }\n\n accounts\n .command('plan <id>')\n .description('show or set what you pay for an account (plan, price, paid/renewal dates)')\n .option('--plan <name>', 'plan name, e.g. \"Claude Pro\" or \"API pay-as-you-go\"')\n .option('--price <amount>', 'price per period, e.g. 20')\n .option('--currency <code>', '3-letter currency code (default USD)')\n .option('--period <period>', 'month | year (default month)')\n .option('--paid <date>', 'last payment date (YYYY-MM-DD)')\n .option('--renews <date>', 'next renewal date (YYYY-MM-DD)')\n .option('--notes <text>', 'free-form note')\n .option('--clear', 'remove the recorded plan')\n .option('--local', 'write to the local database even if a gateway is running')\n .addHelpText(\n 'after',\n `\nEntered by hand: DaveCode never reads billing pages. Example:\n davecode accounts plan acc_123 --plan \"Claude Pro\" --price 20 --renews 2026-11-01`,\n )\n .action(\n run(async (ctx, id: string, opts: import('./commands/accounts').PlanFlags) => {\n const { accountsPlan } = await import('./commands/accounts');\n return accountsPlan(ctx, id, opts);\n }),\n );\n\n accounts\n .command('login <id> [args...]')\n .description(\n 'log a claude-cli / codex-cli / gemini-cli account in, inside its own isolated config dir',\n )\n .allowUnknownOption()\n .option('--local', 'read the local database even if a gateway is running')\n .option('--hold', 'wait for Enter before exiting (for windows opened by the dashboard)')\n .addHelpText(\n 'after',\n `\nRuns the vendor's official sign-in (claude auth login, codex login, Gemini CLI's\n\"Login with Google\") with CLAUDE_CONFIG_DIR / CODEX_HOME / GEMINI_CLI_HOME pointing at the\naccount's sandbox, so every account keeps a separate login. DaveCode never sees the password.\nExtra arguments after -- replace the default ones (e.g. -- login --device-auth for Codex).`,\n )\n .action(\n run(\n async (ctx, id: string, args: string[], opts: import('./commands/accounts').LoginFlags) => {\n const { accountsLogin } = await import('./commands/accounts');\n return accountsLogin(ctx, id, args, opts);\n },\n ),\n );\n\n accounts\n .command('connect <id>')\n .description('connect a subscription: check its login and run the official sign-in if needed')\n .option('--check', 'only report whether the account is connected')\n .option('--local', 'read the local database even if a gateway is running')\n .addHelpText(\n 'after',\n `\nAPI-key accounts are connected when a key is stored. CLI accounts (claude-cli, codex-cli,\ngemini-cli) ask the vendor CLI for its login status inside the account sandbox and, when not\nconnected, start the vendor's own sign-in. Example:\n davecode accounts connect acc_123 --check`,\n )\n .action(\n run(async (ctx, id: string, opts: import('./commands/accounts').ConnectFlags) => {\n const { accountsConnect } = await import('./commands/accounts');\n return accountsConnect(ctx, id, opts);\n }),\n );\n\n addAccountOptions(program.command('add-account').description('alias of `accounts add`'), run);\n}\n\n/** Render an error for humans: `error: …` plus an optional hint, without a stack trace. */\nexport function describeError(err: unknown): { message: string; hint?: string; exitCode: number } {\n if (err instanceof CliError) {\n return {\n message: err.message,\n exitCode: err.exitCode,\n ...(err.hint ? { hint: err.hint } : {}),\n };\n }\n if (err instanceof Error) {\n if (err.name === 'ConfigError') {\n return {\n message: err.message,\n hint: 'Fix the file above or run `davecode config path` to see where config is read from.',\n exitCode: EXIT.failure,\n };\n }\n return { message: err.message, exitCode: EXIT.failure };\n }\n return { message: String(err), exitCode: EXIT.failure };\n}\n\n/** Parse `argv` (user arguments only) and run the matching command. Resolves to an exit code. */\nexport async function runCli(argv: string[], options: RunOptions): Promise<number> {\n const state: ProgramState = { exitCode: 0 };\n const program = buildProgram(options, state);\n try {\n await program.parseAsync(argv, { from: 'user' });\n return state.exitCode;\n } catch (err) {\n if (err instanceof CommanderError) {\n // Help/version print and exit 0; usage errors were already written by commander.\n return err.exitCode;\n }\n const { message, hint, exitCode } = describeError(err);\n const theme = state.ctx?.errTheme;\n const label = theme ? theme.error('error') : 'error';\n options.io.stderr.write(`${label}: ${message}\\n`);\n if (hint) options.io.stderr.write(`${theme ? theme.dim(hint) : hint}\\n`);\n if (options.env.DAVECODE_DEBUG && err instanceof Error && err.stack) {\n options.io.stderr.write(`${err.stack}\\n`);\n }\n return exitCode;\n }\n}\n","import { runCli } from './program';\n\nconst code = await runCli(process.argv.slice(2), {\n io: { stdout: process.stdout, stderr: process.stderr, stdin: process.stdin },\n env: process.env,\n cwd: process.cwd(),\n});\nprocess.exitCode = code;\n"],"mappings":"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","names":["code"]}
1
+ {"version":3,"sources":["../src/program.ts","../src/index.ts"],"sourcesContent":["import { Command, CommanderError, InvalidArgumentError, Option } from 'commander';\nimport { type CliContext, type CliIO, createContext, type GlobalOptions } from './context';\nimport { CliError, EXIT } from './errors';\n\n/**\n * Command tree. Keep this module light: it only declares commands and options. Every action\n * lazy-loads its implementation, so `davecode --help` never pays for SQLite, Fastify or Ink.\n */\n\nexport interface RunOptions {\n io: CliIO;\n env: NodeJS.ProcessEnv;\n cwd: string;\n}\n\n/** Result of an action: an exit code, or nothing for success. */\nexport type ActionResult = number | undefined;\n\ninterface ProgramState {\n ctx?: CliContext;\n exitCode: number;\n}\n\nexport function buildProgram(options: RunOptions, state: ProgramState = { exitCode: 0 }): Command {\n const { io } = options;\n const program = new Command('davecode');\n\n const context = (): CliContext => {\n if (!state.ctx) throw new Error('CLI context is not initialised');\n return state.ctx;\n };\n\n /** Wrap a lazily loaded action: `(ctx, ...args) => exit code`. */\n const run =\n <A extends unknown[]>(action: (ctx: CliContext, ...args: A) => Promise<ActionResult>) =>\n async (...args: A) => {\n const code = await action(context(), ...args);\n if (typeof code === 'number') state.exitCode = code;\n };\n\n program\n .description('Local-first AI gateway and autonomous coding engine.')\n .usage('[command] [options]')\n .option('--home <dir>', 'DaveCode home directory (sets DAVECODE_HOME)')\n .option('--json', 'machine-readable JSON output where supported')\n .option('--no-color', 'disable colours (NO_COLOR is honoured too)')\n .option('-V, --version', 'print the version and exit')\n .showSuggestionAfterError(true)\n .configureOutput({\n writeOut: (text) => io.stdout.write(text),\n writeErr: (text) => io.stderr.write(text),\n outputError: (text, write) => write(text),\n })\n .exitOverride()\n .hook('preAction', (_root, action) => {\n state.ctx = createContext(action.optsWithGlobals<GlobalOptions>(), io, options);\n })\n .addHelpText(\n 'after',\n `\nRun \\`davecode\\` with no command in a terminal to open the chat TUI.\nDocs: https://github.com/DMRLZZ/DaveCode#readme`,\n );\n\n program.action(\n run(async (ctx) => {\n const globals = program.opts<GlobalOptions & { version?: boolean }>();\n if (globals.version) {\n const { VERSION } = await import('@davecode/core');\n ctx.out(`davecode ${VERSION}`);\n return EXIT.ok;\n }\n if (ctx.interactive) {\n const { chatCommand } = await import('./commands/chat');\n return chatCommand(ctx, {});\n }\n program.outputHelp();\n return EXIT.ok;\n }),\n );\n\n registerCommands(program, run);\n return program;\n}\n\ntype Runner = <A extends unknown[]>(\n action: (ctx: CliContext, ...args: A) => Promise<ActionResult>,\n) => (...args: A) => Promise<void>;\n\n/** Parse a TCP port (0 = pick a free one). */\nexport function parsePort(value: string): number {\n const n = Number(value);\n if (!/^\\d+$/.test(value.trim()) || !Number.isInteger(n) || n < 0 || n > 65535) {\n throw new InvalidArgumentError('expected a port number between 0 and 65535');\n }\n return n;\n}\n\n/** Parse a non-negative integer (priorities, weights, limits). */\nexport function parseInteger(value: string): number {\n const n = Number(value);\n if (!/^-?\\d+$/.test(value.trim()) || !Number.isSafeInteger(n) || n < 0) {\n throw new InvalidArgumentError('expected a non-negative integer');\n }\n return n;\n}\n\n/** Repeatable option collector (`--model a --model b`, also accepts `a,b`). */\nexport function collect(value: string, previous: string[] = []): string[] {\n return [\n ...previous,\n ...value\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean),\n ];\n}\n\n/** Subcommands. Each action dynamically imports its module. */\nfunction registerCommands(program: Command, run: Runner): void {\n program\n .command('app')\n .description('start your local workspace in a Chrome or Edge app window')\n .addOption(new Option('-p, --port <port>', 'port to listen on').argParser(parsePort))\n .option('--project <dir>', 'repository to open')\n .action(\n run(async (ctx, opts: import('./commands/start').StartOptions) => {\n const { startCommand } = await import('./commands/start');\n return startCommand(ctx, { ...opts, host: '127.0.0.1', app: true });\n }),\n );\n program\n .command('start')\n .description('start the gateway (OpenAI-compatible /v1, dashboard API and web dashboard)')\n .addOption(new Option('-p, --port <port>', 'port to listen on').argParser(parsePort))\n .option('--host <host>', 'interface to bind (default 127.0.0.1)')\n .option('--no-dashboard', 'do not serve the web dashboard')\n .option('--project <dir>', 'repository whose project brain to serve (default: detected)')\n .option('--verbose', 'print gateway request logs')\n .option('-q, --quiet', 'do not print the live activity log')\n .action(\n run(async (ctx, opts: import('./commands/start').StartOptions) => {\n const { startCommand } = await import('./commands/start');\n return startCommand(ctx, opts);\n }),\n );\n\n program\n .command('status')\n .description('gateway health, accounts and 1m/5h/24h quota usage')\n .action(\n run(async (ctx) => {\n const { statusCommand } = await import('./commands/status');\n return statusCommand(ctx);\n }),\n );\n\n program\n .command('chat')\n .description('chat TUI (also what bare `davecode` opens in a terminal)')\n .option('-m, --model <id>', 'model or route, e.g. davecode/auto or anthropic/claude-sonnet-5-5')\n .option('--project <dir>', 'repository whose brain an in-process gateway serves')\n .action(\n run(async (ctx, opts: { model?: string; project?: string }) => {\n const { chatCommand } = await import('./commands/chat');\n return chatCommand(ctx, opts);\n }),\n );\n\n program\n .command('login')\n .description('sign in to your DaveCode account in the browser')\n .action(\n run(async (ctx) => {\n const { loginCommand } = await import('./commands/account');\n return loginCommand(ctx);\n }),\n );\n program\n .command('logout')\n .description('sign out of your DaveCode account')\n .action(\n run(async (ctx) => {\n const { logoutCommand } = await import('./commands/account');\n return logoutCommand(ctx);\n }),\n );\n program\n .command('account')\n .description('show the signed-in DaveCode account')\n .action(\n run(async (ctx) => {\n const { accountCommand } = await import('./commands/account');\n return accountCommand(ctx);\n }),\n );\n\n registerAccounts(program, run);\n registerProject(program, run);\n\n program\n .command('budget')\n .description('plans, renewals and remaining quota per account (what agents are told)')\n .option('--context', 'print only the summary injected into agent prompts')\n .option('--local', 'read the local database even if a gateway is running')\n .action(\n run(async (ctx, opts: import('./commands/budget').BudgetFlags) => {\n const { budgetCommand } = await import('./commands/budget');\n return budgetCommand(ctx, opts);\n }),\n );\n\n program\n .command('doctor')\n .description('check the environment and print fixes')\n .action(\n run(async (ctx) => {\n const { doctorCommand } = await import('./commands/doctor');\n return doctorCommand(ctx);\n }),\n );\n\n program\n .command('run')\n .description('run the autonomous engine on the task graph (live view in a terminal)')\n .option('--once', 'implement at most one ready task, print the result and exit')\n .option(\n '--task <id>',\n \"run this task instead of the runner's pick (it must be PENDING and unblocked)\",\n )\n .option('--project <dir>', 'repository to work on (default: detected)')\n .addHelpText(\n 'after',\n `\nExit codes with --once: 0 success or nothing to do, 1 failed or error, 130 stopped.\nCtrl+C stops safely: partial work stays on the task branch and the task goes back to PENDING.`,\n )\n .action(\n run(async (ctx, opts: import('./commands/run').RunOptions) => {\n const { runCommand } = await import('./commands/run');\n return runCommand(ctx, opts);\n }),\n );\n\n registerGoals(program, run);\n}\n\nfunction registerGoals(program: Command, run: Runner): void {\n const limit = (flag: string, description: string) =>\n new Option(flag, description).argParser((value) => {\n const n = parseInteger(value);\n if (n < 1) throw new InvalidArgumentError('expected a positive integer');\n return n;\n });\n\n program\n .command('goal <objective...>')\n .description('pursue an objective with a team of agents (plan, execute, review, re-plan)')\n .addOption(\n limit('--max-rounds <n>', 'plan → execute → review rounds (capped by goal.maxRounds)'),\n )\n .addOption(limit('--max-tasks <n>', 'tasks across all rounds (capped by goal.maxTasks)'))\n .addOption(\n limit('--max-tokens <n>', 'token budget for the whole goal (capped by goal.maxTokens)'),\n )\n .option('--dry-run', 'plan only: print the task graph without executing it')\n .option('--project <dir>', 'repository to work in (default: detected)')\n .addHelpText(\n 'after',\n `\nAgents never send emails, post, pay or sign up for anything: such steps become drafts in\n.davecode/goals/<goal-id>/. Code tasks go through the autonomous runner (branch, checks, merge).\nCtrl+C cancels. Exit codes: 0 succeeded or planned, 1 failed or out of budget, 130 cancelled.\n\nExamples:\n davecode goal \"Write positioning and landing copy for this app\" --dry-run\n davecode goal \"Add a /health endpoint with tests\" --max-rounds 2`,\n )\n .action(\n run(async (ctx, words: string[], opts: import('./commands/goal').GoalOptions) => {\n const { goalCommand } = await import('./commands/goal');\n return goalCommand(ctx, words, opts);\n }),\n );\n\n const goals = program.command('goals').description('goals of this repository');\n goals\n .command('list', { isDefault: true })\n .alias('ls')\n .description('goals, newest first')\n .option('--project <dir>', 'repository (default: detected)')\n .action(\n run(async (ctx, opts: { project?: string }) => {\n const { goalsList } = await import('./commands/goal');\n return goalsList(ctx, opts);\n }),\n );\n goals\n .command('show <id>')\n .description('tasks, artifacts and summary of a goal')\n .option('--project <dir>', 'repository (default: detected)')\n .action(\n run(async (ctx, id: string, opts: { project?: string }) => {\n const { goalsShow } = await import('./commands/goal');\n return goalsShow(ctx, id, opts);\n }),\n );\n goals\n .command('cancel <id>')\n .description('cancel a running goal')\n .option('--project <dir>', 'repository (default: detected)')\n .action(\n run(async (ctx, id: string, opts: { project?: string }) => {\n const { goalsCancel } = await import('./commands/goal');\n return goalsCancel(ctx, id, opts);\n }),\n );\n}\n\nfunction registerProject(program: Command, run: Runner): void {\n program\n .command('init')\n .description('scaffold the project brain (.davecode/) in this repository')\n .option('--name <name>', 'project name used in STATE.md and ARCHITECTURE.md')\n .option('--config', 'write a starter .davecode/config.json without asking')\n .option('--no-config', 'do not write .davecode/config.json')\n .action(\n run(async (ctx, opts: { name?: string; config?: boolean }) => {\n const { initCommand } = await import('./commands/init');\n return initCommand(ctx, opts);\n }),\n );\n\n const tasks = program.command('tasks').description('show and edit the task graph');\n tasks\n .command('list', { isDefault: true })\n .alias('ls')\n .description('task tree with status and blocked reasons')\n .action(\n run(async (ctx) => {\n const { tasksList } = await import('./commands/tasks');\n return tasksList(ctx);\n }),\n );\n tasks\n .command('next')\n .description('the task the runner would pick next')\n .action(\n run(async (ctx) => {\n const { tasksNext } = await import('./commands/tasks');\n return tasksNext(ctx);\n }),\n );\n tasks\n .command('add <id> <title...>')\n .description('add a PENDING task')\n .option('-d, --depends <ids>', 'dependencies (repeatable or comma-separated)', collect)\n .addOption(new Option('-p, --priority <n>', 'higher runs first').argParser(parseInteger))\n .option('--description <text>', 'longer description')\n .option(\n '-a, --acceptance <criterion>',\n 'acceptance criterion (repeatable)',\n (v, prev: string[] = []) => [...prev, v],\n )\n .action(\n run(\n async (\n ctx,\n id: string,\n title: string[],\n opts: import('./commands/tasks').AddTaskOptions,\n ) => {\n const { tasksAdd } = await import('./commands/tasks');\n return tasksAdd(ctx, id, title, opts);\n },\n ),\n );\n tasks\n .command('status <id> <status>')\n .description('move a task to PENDING | IN_PROGRESS | SUCCESS | FAILED')\n .option('--notes <text>', 'note stored on the task')\n .action(\n run(async (ctx, id: string, status: string, opts: { notes?: string }) => {\n const { tasksStatus } = await import('./commands/tasks');\n return tasksStatus(ctx, id, status, opts);\n }),\n );\n\n const config = program.command('config').description('show the resolved configuration');\n config\n .command('show', { isDefault: true })\n .description('resolved config as JSON (secrets redacted)')\n .action(\n run(async (ctx) => {\n const { configShow } = await import('./commands/config');\n return configShow(ctx);\n }),\n );\n config\n .command('path')\n .description('where config, state and brains live')\n .action(\n run(async (ctx) => {\n const { configPath } = await import('./commands/config');\n return configPath(ctx);\n }),\n );\n config\n .command('get <key>')\n .description('one value by dotted key, e.g. server.port')\n .action(\n run(async (ctx, key: string) => {\n const { configGet } = await import('./commands/config');\n return configGet(ctx, key);\n }),\n );\n}\n\ntype AddOpts = import('./commands/accounts').AddCommandFlags;\n\nfunction addAccountOptions(command: Command, run: Runner): Command {\n return command\n .option(\n '--provider <kind>',\n 'anthropic | openai | gemini | openai-compatible | claude-cli | codex-cli | gemini-cli | gemini-web',\n )\n .option('--label <name>', 'human-friendly name')\n .addOption(\n new Option('--priority <n>', 'lower is tried first (default 100)').argParser(parseInteger),\n )\n .addOption(\n new Option('--weight <n>', 'traffic share among equal priorities').argParser(parseInteger),\n )\n .option('--secret-env <var>', 'read the API key from this environment variable')\n .option('--secret-stdin', 'read the API key from stdin')\n .option('--secret <value>', 'API key (discouraged: visible in shell history)')\n .option('--base-url <url>', 'endpoint for openai-compatible accounts')\n .option('--model <id>', 'advertised model (repeatable or comma-separated)', collect)\n .option('--default-model <id>', 'model used for davecode/auto without a route')\n .option('--binary-path <path>', 'CLI binary for claude-cli / codex-cli / gemini-cli')\n .option('--limit <key=value>', 'quota limit, e.g. tokens5h=500000 (repeatable)', collect)\n .option('--disabled', 'add the account disabled')\n .option('-y, --yes', 'never prompt: take everything from flags')\n .option('--no-login', 'do not offer to log in after adding a CLI account')\n .option('--local', 'write to the local database even if a gateway is running')\n .addHelpText(\n 'after',\n `\nExamples:\n davecode accounts add # interactive\n davecode accounts add --provider anthropic --label work --secret-env ANTHROPIC_API_KEY --yes\n echo \"$OPENROUTER_KEY\" | davecode accounts add --provider openai-compatible \\\\\n --base-url https://openrouter.ai/api/v1 --model openai/gpt-5.5 --secret-stdin\n davecode accounts add --provider claude-cli --label \"Claude Pro\" --yes`,\n )\n .action(\n run(async (ctx, opts: AddOpts) => {\n const { accountsAdd } = await import('./commands/accounts');\n return accountsAdd(ctx, opts);\n }),\n );\n}\n\nfunction registerAccounts(program: Command, run: Runner): void {\n const accounts = program.command('accounts').description('manage provider accounts');\n\n accounts\n .command('list', { isDefault: true })\n .alias('ls')\n .description('list accounts')\n .option('--local', 'read the local database even if a gateway is running')\n .action(\n run(async (ctx, opts: { local?: boolean }) => {\n const { accountsList } = await import('./commands/accounts');\n return accountsList(ctx, opts);\n }),\n );\n\n addAccountOptions(\n accounts.command('add').description('add an account (interactive in a terminal)'),\n run,\n );\n\n accounts\n .command('remove <id>')\n .alias('rm')\n .description('remove an account, its secret and its sandbox')\n .option('-y, --yes', 'do not ask for confirmation')\n .option('--local', 'write to the local database even if a gateway is running')\n .action(\n run(async (ctx, id: string, opts: { yes?: boolean; local?: boolean }) => {\n const { accountsRemove } = await import('./commands/accounts');\n return accountsRemove(ctx, id, opts);\n }),\n );\n\n for (const [name, enabled] of [\n ['enable', true],\n ['disable', false],\n ] as const) {\n accounts\n .command(`${name} <id>`)\n .description(`${name} an account${enabled ? ' (also clears error and cooldown state)' : ''}`)\n .option('--local', 'write to the local database even if a gateway is running')\n .action(\n run(async (ctx, id: string, opts: { local?: boolean }) => {\n const { accountsSetEnabled } = await import('./commands/accounts');\n return accountsSetEnabled(ctx, id, enabled, opts);\n }),\n );\n }\n\n accounts\n .command('plan <id>')\n .description('show or set what you pay for an account (plan, price, paid/renewal dates)')\n .option('--plan <name>', 'plan name, e.g. \"Claude Pro\" or \"API pay-as-you-go\"')\n .option('--price <amount>', 'price per period, e.g. 20')\n .option('--currency <code>', '3-letter currency code (default USD)')\n .option('--period <period>', 'month | year (default month)')\n .option('--paid <date>', 'last payment date (YYYY-MM-DD)')\n .option('--renews <date>', 'next renewal date (YYYY-MM-DD)')\n .option('--notes <text>', 'free-form note')\n .option('--clear', 'remove the recorded plan')\n .option('--local', 'write to the local database even if a gateway is running')\n .addHelpText(\n 'after',\n `\nEntered by hand: DaveCode never reads billing pages. Example:\n davecode accounts plan acc_123 --plan \"Claude Pro\" --price 20 --renews 2026-11-01`,\n )\n .action(\n run(async (ctx, id: string, opts: import('./commands/accounts').PlanFlags) => {\n const { accountsPlan } = await import('./commands/accounts');\n return accountsPlan(ctx, id, opts);\n }),\n );\n\n accounts\n .command('login <id> [args...]')\n .description(\n 'log a claude-cli / codex-cli / gemini-cli account in, inside its own isolated config dir',\n )\n .allowUnknownOption()\n .option('--local', 'read the local database even if a gateway is running')\n .option('--hold', 'wait for Enter before exiting (for windows opened by the dashboard)')\n .addHelpText(\n 'after',\n `\nRuns the vendor's official sign-in (claude auth login, codex login, Gemini CLI's\n\"Login with Google\") with CLAUDE_CONFIG_DIR / CODEX_HOME / GEMINI_CLI_HOME pointing at the\naccount's sandbox, so every account keeps a separate login. DaveCode never sees the password.\nExtra arguments after -- replace the default ones (e.g. -- login --device-auth for Codex).`,\n )\n .action(\n run(\n async (ctx, id: string, args: string[], opts: import('./commands/accounts').LoginFlags) => {\n const { accountsLogin } = await import('./commands/accounts');\n return accountsLogin(ctx, id, args, opts);\n },\n ),\n );\n\n accounts\n .command('connect <id>')\n .description('connect a subscription: check its login and run the official sign-in if needed')\n .option('--check', 'only report whether the account is connected')\n .option('--local', 'read the local database even if a gateway is running')\n .addHelpText(\n 'after',\n `\nAPI-key accounts are connected when a key is stored. CLI accounts (claude-cli, codex-cli,\ngemini-cli) ask the vendor CLI for its login status inside the account sandbox and, when not\nconnected, start the vendor's own sign-in. Example:\n davecode accounts connect acc_123 --check`,\n )\n .action(\n run(async (ctx, id: string, opts: import('./commands/accounts').ConnectFlags) => {\n const { accountsConnect } = await import('./commands/accounts');\n return accountsConnect(ctx, id, opts);\n }),\n );\n\n addAccountOptions(program.command('add-account').description('alias of `accounts add`'), run);\n}\n\n/** Render an error for humans: `error: …` plus an optional hint, without a stack trace. */\nexport function describeError(err: unknown): { message: string; hint?: string; exitCode: number } {\n if (err instanceof CliError) {\n return {\n message: err.message,\n exitCode: err.exitCode,\n ...(err.hint ? { hint: err.hint } : {}),\n };\n }\n if (err instanceof Error) {\n if (err.name === 'ConfigError') {\n return {\n message: err.message,\n hint: 'Fix the file above or run `davecode config path` to see where config is read from.',\n exitCode: EXIT.failure,\n };\n }\n return { message: err.message, exitCode: EXIT.failure };\n }\n return { message: String(err), exitCode: EXIT.failure };\n}\n\n/** Parse `argv` (user arguments only) and run the matching command. Resolves to an exit code. */\nexport async function runCli(argv: string[], options: RunOptions): Promise<number> {\n const state: ProgramState = { exitCode: 0 };\n const program = buildProgram(options, state);\n try {\n await program.parseAsync(argv, { from: 'user' });\n return state.exitCode;\n } catch (err) {\n if (err instanceof CommanderError) {\n // Help/version print and exit 0; usage errors were already written by commander.\n return err.exitCode;\n }\n const { message, hint, exitCode } = describeError(err);\n const theme = state.ctx?.errTheme;\n const label = theme ? theme.error('error') : 'error';\n options.io.stderr.write(`${label}: ${message}\\n`);\n if (hint) options.io.stderr.write(`${theme ? theme.dim(hint) : hint}\\n`);\n if (options.env.DAVECODE_DEBUG && err instanceof Error && err.stack) {\n options.io.stderr.write(`${err.stack}\\n`);\n }\n return exitCode;\n }\n}\n","import { runCli } from './program';\n\nconst code = await runCli(process.argv.slice(2), {\n io: { stdout: process.stdout, stderr: process.stderr, stdin: process.stdin },\n env: process.env,\n cwd: process.cwd(),\n});\nprocess.exitCode = code;\n"],"mappings":"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","names":["code"]}
@@ -3,11 +3,10 @@ import {
3
3
  } from "./chunk-IC3TDONV.js";
4
4
  import {
5
5
  printJson
6
- } from "./chunk-DYQ56FBT.js";
7
- import "./chunk-VVCXGQMY.js";
6
+ } from "./chunk-QA3O6RA2.js";
8
7
  import {
9
8
  detectProjectRoot
10
- } from "./chunk-PIIJ3RSI.js";
9
+ } from "./chunk-DZ2FDABF.js";
11
10
  import {
12
11
  CliError,
13
12
  EXIT
@@ -16,7 +15,8 @@ import {
16
15
  ProjectBrain,
17
16
  configSchema,
18
17
  projectPaths
19
- } from "./chunk-C7FDRA3U.js";
18
+ } from "./chunk-3Q2KCXLN.js";
19
+ import "./chunk-MC7RIPL7.js";
20
20
 
21
21
  // src/commands/init.ts
22
22
  import { existsSync as existsSync2, readFileSync as readFileSync2, writeFileSync } from "fs";
@@ -118,7 +118,7 @@ async function initCommand(ctx, opts, deps = {}) {
118
118
  } else {
119
119
  let write = opts.config === true;
120
120
  if (!write && ctx.interactive) {
121
- const prompter = deps.prompter ?? (await import("./prompts-L37J72YW.js")).createInkPrompter({
121
+ const prompter = deps.prompter ?? (await import("./prompts-TZ7UC42M.js")).createInkPrompter({
122
122
  stdout: ctx.io.stdout,
123
123
  stdin: ctx.io.stdin,
124
124
  theme: ctx.theme
@@ -191,4 +191,4 @@ export {
191
191
  ensureLockIgnored,
192
192
  initCommand
193
193
  };
194
- //# sourceMappingURL=init-NFYNO3A3.js.map
194
+ //# sourceMappingURL=init-AXYIWAB3.js.map
@@ -4,8 +4,8 @@ import {
4
4
  import {
5
5
  ThemeProvider,
6
6
  useTheme
7
- } from "./chunk-OXRMGR72.js";
8
- import "./chunk-VVCXGQMY.js";
7
+ } from "./chunk-PGPXE6LF.js";
8
+ import "./chunk-MC7RIPL7.js";
9
9
 
10
10
  // src/tui/prompts.tsx
11
11
  import { Box, render, Text, useInput } from "ink";
@@ -50,7 +50,10 @@ function SelectPrompt({
50
50
  setChosen(choice);
51
51
  done(choice.value);
52
52
  } else if (/^[1-9]$/.test(input) && Number(input) <= choices.length) {
53
+ const choice = choices[Number(input) - 1];
53
54
  setIndex(Number(input) - 1);
55
+ setChosen(choice);
56
+ done(choice.value);
54
57
  }
55
58
  });
56
59
  if (chosen) return /* @__PURE__ */ jsx(Question, { message, answer: chosen.label });
@@ -59,8 +62,9 @@ function SelectPrompt({
59
62
  choices.map((choice, i) => {
60
63
  const active = i === index;
61
64
  return /* @__PURE__ */ jsxs(Text, { children: [
62
- /* @__PURE__ */ jsxs(Text, { color: active ? theme.ink.accent : void 0, children: [
65
+ /* @__PURE__ */ jsxs(Text, { bold: active, dimColor: !active && theme.ink.dim, children: [
63
66
  active ? ` ${theme.glyph.prompt} ` : " ",
67
+ choices.length <= 9 ? `${i + 1}. ` : "",
64
68
  choice.label
65
69
  ] }),
66
70
  choice.hint ? /* @__PURE__ */ jsxs(Text, { dimColor: theme.ink.dim, children: [
@@ -69,7 +73,7 @@ function SelectPrompt({
69
73
  ] }) : null
70
74
  ] }, choice.value);
71
75
  }),
72
- /* @__PURE__ */ jsx(Text, { dimColor: theme.ink.dim, children: " \u2191/\u2193 to move, Enter to select, Esc to cancel" })
76
+ /* @__PURE__ */ jsx(Text, { dimColor: theme.ink.dim, children: choices.length <= 9 ? " \u2191/\u2193 or a number to choose, Enter to confirm, Esc to cancel" : " \u2191/\u2193 to move, Enter to select, Esc to cancel" })
73
77
  ] });
74
78
  }
75
79
  function TextPrompt({
@@ -212,4 +216,4 @@ export {
212
216
  createInkPrompter,
213
217
  sanitizeLine
214
218
  };
215
- //# sourceMappingURL=prompts-L37J72YW.js.map
219
+ //# sourceMappingURL=prompts-TZ7UC42M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tui/prompts.tsx"],"sourcesContent":["import { Box, render, Text, useInput } from 'ink';\nimport { type ReactElement, useState } from 'react';\nimport type { InStream, OutStream } from '../context';\nimport {\n type Choice,\n PromptCancelledError,\n type Prompter,\n type SecretOptions,\n type TextOptions,\n} from '../lib/prompter';\nimport type { Theme } from '../ui/theme';\nimport { ThemeProvider, useTheme } from './theme-context';\n\n/** Drop line breaks and control characters from typed or pasted single-line input. */\nexport function sanitizeLine(input: string): string {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: stripping control characters\n return input.replace(/[\\u0000-\\u001f\\u007f]/g, '');\n}\n\ninterface Settle<T> {\n done: (value: T) => void;\n cancel: () => void;\n}\n\nfunction Question({ message, answer }: { message: string; answer?: string }) {\n const theme = useTheme();\n return (\n <Text>\n <Text color={answer === undefined ? theme.ink.accent : theme.ink.ok}>\n {answer === undefined ? '?' : theme.glyph.ok}\n </Text>{' '}\n <Text bold>{message}</Text>\n {answer !== undefined ? <Text dimColor={theme.ink.dim}> {answer}</Text> : null}\n </Text>\n );\n}\n\nexport function SelectPrompt<T extends string>({\n message,\n choices,\n initial,\n done,\n cancel,\n}: { message: string; choices: Choice<T>[]; initial?: T } & Settle<T>) {\n const theme = useTheme();\n const start = Math.max(\n 0,\n choices.findIndex((c) => c.value === initial),\n );\n const [index, setIndex] = useState(start);\n const [chosen, setChosen] = useState<Choice<T> | undefined>();\n\n useInput((input, key) => {\n if (chosen) return;\n if (key.escape || (key.ctrl && input === 'c')) return cancel();\n if (key.upArrow || input === 'k') setIndex((i) => (i - 1 + choices.length) % choices.length);\n else if (key.downArrow || input === 'j') setIndex((i) => (i + 1) % choices.length);\n else if (key.return) {\n const choice = choices[index]!;\n setChosen(choice);\n done(choice.value);\n } else if (/^[1-9]$/.test(input) && Number(input) <= choices.length) {\n // A number picks its option straight away, as in Claude Code's menus.\n const choice = choices[Number(input) - 1]!;\n setIndex(Number(input) - 1);\n setChosen(choice);\n done(choice.value);\n }\n });\n\n if (chosen) return <Question message={message} answer={chosen.label} />;\n return (\n <Box flexDirection=\"column\">\n <Question message={message} />\n {choices.map((choice, i) => {\n const active = i === index;\n return (\n <Text key={choice.value}>\n <Text bold={active} dimColor={!active && theme.ink.dim}>\n {active ? ` ${theme.glyph.prompt} ` : ' '}\n {choices.length <= 9 ? `${i + 1}. ` : ''}\n {choice.label}\n </Text>\n {choice.hint ? <Text dimColor={theme.ink.dim}> {choice.hint}</Text> : null}\n </Text>\n );\n })}\n <Text dimColor={theme.ink.dim}>\n {choices.length <= 9\n ? ' ↑/↓ or a number to choose, Enter to confirm, Esc to cancel'\n : ' ↑/↓ to move, Enter to select, Esc to cancel'}\n </Text>\n </Box>\n );\n}\n\nexport function TextPrompt({\n message,\n initial = '',\n placeholder,\n validate,\n mask,\n optional,\n done,\n cancel,\n}: TextOptions & SecretOptions & { message: string; mask?: boolean } & Settle<string>) {\n const theme = useTheme();\n const [value, setValue] = useState(initial);\n const [error, setError] = useState<string | undefined>();\n const [submitted, setSubmitted] = useState(false);\n\n useInput((input, key) => {\n if (submitted) return;\n if (key.escape || (key.ctrl && input === 'c')) return cancel();\n if (key.return) {\n if (mask && !optional && value.trim() === '') {\n setError('a value is required');\n return;\n }\n const problem = validate?.(value);\n if (problem) {\n setError(problem);\n return;\n }\n setSubmitted(true);\n done(value);\n return;\n }\n if (key.backspace || key.delete) {\n setValue((v) => [...v].slice(0, -1).join(''));\n } else if (key.ctrl && input === 'u') {\n setValue('');\n } else if (!key.ctrl && !key.meta) {\n const text = sanitizeLine(input);\n if (text) setValue((v) => v + text);\n }\n setError(undefined);\n });\n\n const shown = mask ? '•'.repeat(Math.min([...value].length, 32)) : value;\n if (submitted) {\n const answer = mask ? (value ? 'set' : 'skipped') : value || '(empty)';\n return <Question message={message} answer={answer} />;\n }\n return (\n <Box flexDirection=\"column\">\n <Text>\n <Text color={theme.ink.accent}>?</Text> <Text bold>{message}</Text>{' '}\n {shown ? <Text>{shown}</Text> : <Text dimColor={theme.ink.dim}>{placeholder ?? ''}</Text>}\n <Text inverse> </Text>\n </Text>\n {error ? (\n <Text color={theme.ink.error}>\n {' '}\n {error}\n </Text>\n ) : null}\n </Box>\n );\n}\n\nexport function ConfirmPrompt({\n message,\n initial,\n done,\n cancel,\n}: { message: string; initial: boolean } & Settle<boolean>) {\n const theme = useTheme();\n const [answer, setAnswer] = useState<boolean | undefined>();\n useInput((input, key) => {\n if (answer !== undefined) return;\n if (key.escape || (key.ctrl && input === 'c')) return cancel();\n let value: boolean | undefined;\n if (key.return) value = initial;\n else if (/^y$/i.test(input)) value = true;\n else if (/^n$/i.test(input)) value = false;\n if (value === undefined) return;\n setAnswer(value);\n done(value);\n });\n if (answer !== undefined) return <Question message={message} answer={answer ? 'yes' : 'no'} />;\n return (\n <Text>\n <Text color={theme.ink.accent}>?</Text> <Text bold>{message}</Text>{' '}\n <Text dimColor={theme.ink.dim}>{initial ? '(Y/n)' : '(y/N)'}</Text>\n </Text>\n );\n}\n\nexport interface InkPrompterOptions {\n stdout: OutStream;\n stdin: InStream;\n theme: Theme;\n}\n\n/** Ink-backed prompter: each question is a short-lived Ink app that leaves its answer behind. */\nexport function createInkPrompter(options: InkPrompterOptions): Prompter {\n const ask = <T,>(element: (settle: Settle<T>) => ReactElement): Promise<T> =>\n new Promise<T>((resolve, reject) => {\n let result: { ok: true; value: T } | { ok: false } | undefined;\n const instance = render(\n <ThemeProvider theme={options.theme}>\n {element({\n done: (value) => {\n result = { ok: true, value };\n setImmediate(() => instance.unmount());\n },\n cancel: () => {\n result = { ok: false };\n setImmediate(() => instance.unmount());\n },\n })}\n </ThemeProvider>,\n {\n stdout: options.stdout as NodeJS.WriteStream,\n stdin: options.stdin as NodeJS.ReadStream,\n exitOnCtrlC: false,\n patchConsole: false,\n },\n );\n instance.waitUntilExit().then(\n () => {\n if (result?.ok) resolve(result.value);\n else reject(new PromptCancelledError());\n },\n (err: unknown) => reject(err),\n );\n });\n\n return {\n select: (message, choices, initial) =>\n ask((s) => (\n <SelectPrompt\n message={message}\n choices={choices}\n {...(initial !== undefined ? { initial } : {})}\n {...s}\n />\n )),\n text: (message, opts = {}) => ask((s) => <TextPrompt message={message} {...opts} {...s} />),\n secret: (message, opts = {}) =>\n ask((s) => <TextPrompt message={message} mask {...opts} {...s} />),\n confirm: (message, initial = false) =>\n ask((s) => <ConfirmPrompt message={message} initial={initial} {...s} />),\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,25 +1,24 @@
1
1
  import {
2
2
  logText
3
- } from "./chunk-OYEYNDOO.js";
3
+ } from "./chunk-GE22VBCY.js";
4
4
  import {
5
5
  initialRunnerState,
6
6
  isTerminal
7
7
  } from "./chunk-FRFSJMN4.js";
8
- import "./chunk-BOLFK3BH.js";
9
- import "./chunk-OXRMGR72.js";
8
+ import "./chunk-5LKOJBUL.js";
9
+ import "./chunk-PGPXE6LF.js";
10
10
  import {
11
11
  formatDuration
12
12
  } from "./chunk-SF5ZEAP4.js";
13
13
  import {
14
14
  printJson
15
- } from "./chunk-DYQ56FBT.js";
16
- import "./chunk-VVCXGQMY.js";
15
+ } from "./chunk-QA3O6RA2.js";
17
16
  import {
18
17
  GatewayError,
19
18
  detectProjectRoot,
20
19
  findGateway,
21
20
  wireProject
22
- } from "./chunk-PIIJ3RSI.js";
21
+ } from "./chunk-DZ2FDABF.js";
23
22
  import {
24
23
  CliError,
25
24
  EXIT
@@ -29,7 +28,8 @@ import {
29
28
  RunnerError,
30
29
  createEngine,
31
30
  loadConfig
32
- } from "./chunk-C7FDRA3U.js";
31
+ } from "./chunk-3Q2KCXLN.js";
32
+ import "./chunk-MC7RIPL7.js";
33
33
 
34
34
  // src/commands/run.ts
35
35
  import { existsSync } from "fs";
@@ -268,7 +268,7 @@ async function runContinuous(ctx, engine, runner, config, projectName, tasks, de
268
268
  const [{ render }, { createElement }, { RunnerApp }] = await Promise.all([
269
269
  import("ink"),
270
270
  import("react"),
271
- import("./RunnerView-DLVR7C22.js")
271
+ import("./RunnerView-A7JSPUW5.js")
272
272
  ]);
273
273
  let initial = initialRunnerState(runner.status(), tasks);
274
274
  const { runnerReducer } = await import("./runner-state-QFU3LJVJ.js");
@@ -334,7 +334,7 @@ async function driveGateway(ctx, client, config, root, taskId) {
334
334
  const [{ render }, { createElement }, { RunnerApp }, { tasks }] = await Promise.all([
335
335
  import("ink"),
336
336
  import("react"),
337
- import("./RunnerView-DLVR7C22.js"),
337
+ import("./RunnerView-A7JSPUW5.js"),
338
338
  client.get("/api/tasks").then((r) => ({ tasks: r.graph.tasks })).catch(() => ({ tasks: [] }))
339
339
  ]);
340
340
  const status = await client.get("/api/runner").then((r) => r.status).catch(() => latest);
@@ -373,4 +373,4 @@ export {
373
373
  explainRunnerError,
374
374
  runCommand
375
375
  };
376
- //# sourceMappingURL=run-ARUPXFFB.js.map
376
+ //# sourceMappingURL=run-QRTLHFB3.js.map