@sortedyuan/maybecode 0.3.2 → 0.5.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 (295) hide show
  1. package/README.md +166 -55
  2. package/README.zh-CN.md +267 -0
  3. package/dist/application.d.ts +40 -34
  4. package/dist/application.d.ts.map +1 -1
  5. package/dist/application.js +290 -170
  6. package/dist/application.js.map +1 -1
  7. package/dist/args.d.ts +2 -2
  8. package/dist/args.d.ts.map +1 -1
  9. package/dist/args.js +50 -27
  10. package/dist/args.js.map +1 -1
  11. package/dist/bin.js +82 -71
  12. package/dist/bin.js.map +4 -4
  13. package/dist/cli/chunk-3IORPKBL.js +3572 -0
  14. package/dist/cli/chunk-3IORPKBL.js.map +7 -0
  15. package/dist/cli/{chunk-LVTRXPDS.js → chunk-4B2Z6KW7.js} +1547 -1536
  16. package/dist/cli/chunk-4B2Z6KW7.js.map +7 -0
  17. package/dist/cli/{chunk-JT6VBKOM.js → chunk-4WG6JIJJ.js} +127 -33
  18. package/dist/cli/{chunk-JT6VBKOM.js.map → chunk-4WG6JIJJ.js.map} +3 -3
  19. package/dist/cli/{chunk-K5JWPNSY.js → chunk-5SLWALZK.js} +3521 -16164
  20. package/dist/cli/chunk-5SLWALZK.js.map +7 -0
  21. package/dist/cli/chunk-MNBYXL5Y.js +132 -0
  22. package/dist/cli/chunk-MNBYXL5Y.js.map +7 -0
  23. package/dist/cli/{chunk-F4XRPLUM.js → chunk-SLWLUEHQ.js} +226 -86
  24. package/dist/cli/chunk-SLWLUEHQ.js.map +7 -0
  25. package/dist/cli/chunk-UQDZ55LQ.js +199 -0
  26. package/dist/cli/chunk-UQDZ55LQ.js.map +7 -0
  27. package/dist/cli/{chunk-7ISOHFS7.js → chunk-WMSG5ZTR.js} +717 -388
  28. package/dist/cli/chunk-WMSG5ZTR.js.map +7 -0
  29. package/dist/cli/chunk-WVIRS76R.js +4057 -0
  30. package/dist/cli/chunk-WVIRS76R.js.map +7 -0
  31. package/dist/cli/{chunk-HOU5ITUK.js → chunk-XTEMRAQW.js} +1 -1
  32. package/dist/cli/chunk-XTEMRAQW.js.map +7 -0
  33. package/dist/cli/chunk-Z3BOPBVU.js +91 -0
  34. package/dist/cli/chunk-Z3BOPBVU.js.map +7 -0
  35. package/dist/cli/{configured-WHY3GGAJ.js → configured-ACNM6TRQ.js} +10 -9
  36. package/dist/cli/{file-type-R2T7TBHI.js → file-type-HLHPV7WC.js} +817 -13
  37. package/dist/cli/file-type-HLHPV7WC.js.map +7 -0
  38. package/dist/cli/mcp-auth-XD5U7WCV.js +74 -0
  39. package/dist/cli/mcp-auth-XD5U7WCV.js.map +7 -0
  40. package/dist/cli/onboarding-WQWCPYEO.js +530 -0
  41. package/dist/cli/onboarding-WQWCPYEO.js.map +7 -0
  42. package/dist/cli/onboarding-check-HRRI5OJ7.js +32 -0
  43. package/dist/cli/onboarding-check-HRRI5OJ7.js.map +7 -0
  44. package/dist/cli/{retained-tui-VJ3VX4R3.js → retained-tui-QF5VMYLC.js} +788 -332
  45. package/dist/cli/retained-tui-QF5VMYLC.js.map +7 -0
  46. package/dist/cli/{sixel-LWTCM76G.js → sixel-ISZ4FZ3U.js} +37 -37
  47. package/dist/cli/{sixel-LWTCM76G.js.map → sixel-ISZ4FZ3U.js.map} +1 -1
  48. package/dist/cli/{team-T7G7PPNN.js → team-O2I5BXHM.js} +7 -6
  49. package/dist/cli/{team-v2-JGBBQ7FR.js → team-v2-YYO2G7DJ.js} +816 -390
  50. package/dist/cli/team-v2-YYO2G7DJ.js.map +7 -0
  51. package/dist/cli/{web-server-FOMNPY7Q.js → web-server-SXMH6FGA.js} +55 -19
  52. package/dist/cli/web-server-SXMH6FGA.js.map +7 -0
  53. package/dist/cli/{web-ui-COB6PKC5.js → web-ui-UWQUFE4W.js} +7 -6
  54. package/dist/config-schema.json +337 -0
  55. package/dist/configured.d.ts +18 -11
  56. package/dist/configured.d.ts.map +1 -1
  57. package/dist/configured.js +213 -390
  58. package/dist/configured.js.map +1 -1
  59. package/dist/controller.d.ts +19 -18
  60. package/dist/controller.d.ts.map +1 -1
  61. package/dist/delegation-commands.d.ts +1 -1
  62. package/dist/delegation-commands.d.ts.map +1 -1
  63. package/dist/delegation-commands.js +8 -8
  64. package/dist/delegation-commands.js.map +1 -1
  65. package/dist/errors.d.ts +2 -1
  66. package/dist/errors.d.ts.map +1 -1
  67. package/dist/errors.js +2 -1
  68. package/dist/errors.js.map +1 -1
  69. package/dist/events.d.ts +8 -6
  70. package/dist/events.d.ts.map +1 -1
  71. package/dist/fork-picker.d.ts.map +1 -1
  72. package/dist/fork-picker.js +19 -5
  73. package/dist/fork-picker.js.map +1 -1
  74. package/dist/git-request.d.ts +6 -6
  75. package/dist/git-request.d.ts.map +1 -1
  76. package/dist/git-request.js +28 -15
  77. package/dist/git-request.js.map +1 -1
  78. package/dist/goal-commands.d.ts +1 -1
  79. package/dist/goal-commands.d.ts.map +1 -1
  80. package/dist/goal-commands.js +12 -5
  81. package/dist/goal-commands.js.map +1 -1
  82. package/dist/index.d.ts +5 -37
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +3 -36
  85. package/dist/index.js.map +1 -1
  86. package/dist/instructions.d.ts +2 -7
  87. package/dist/instructions.d.ts.map +1 -1
  88. package/dist/instructions.js +7 -15
  89. package/dist/instructions.js.map +1 -1
  90. package/dist/keymap.d.ts +2 -2
  91. package/dist/keymap.d.ts.map +1 -1
  92. package/dist/keymap.js +2 -2
  93. package/dist/keymap.js.map +1 -1
  94. package/dist/maybecode-config.schema.json +1765 -0
  95. package/dist/mcp-auth.d.ts +1 -1
  96. package/dist/mcp-auth.d.ts.map +1 -1
  97. package/dist/mcp-auth.js +11 -8
  98. package/dist/mcp-auth.js.map +1 -1
  99. package/dist/mcp-commands.d.ts.map +1 -1
  100. package/dist/mcp-commands.js +18 -4
  101. package/dist/mcp-commands.js.map +1 -1
  102. package/dist/mcp-interaction-ui.d.ts.map +1 -1
  103. package/dist/mcp-interaction-ui.js +11 -4
  104. package/dist/mcp-interaction-ui.js.map +1 -1
  105. package/dist/media-history.d.ts +1 -1
  106. package/dist/media-history.d.ts.map +1 -1
  107. package/dist/media-history.js +8 -2
  108. package/dist/media-history.js.map +1 -1
  109. package/dist/model-picker.d.ts.map +1 -1
  110. package/dist/model-picker.js +10 -11
  111. package/dist/model-picker.js.map +1 -1
  112. package/dist/model-transition.d.ts +11 -0
  113. package/dist/model-transition.d.ts.map +1 -0
  114. package/dist/model-transition.js +48 -0
  115. package/dist/model-transition.js.map +1 -0
  116. package/dist/model.d.ts +2 -2
  117. package/dist/model.d.ts.map +1 -1
  118. package/dist/model.js +8 -4
  119. package/dist/model.js.map +1 -1
  120. package/dist/onboarding-check.d.ts +3 -0
  121. package/dist/onboarding-check.d.ts.map +1 -0
  122. package/dist/onboarding-check.js +22 -0
  123. package/dist/onboarding-check.js.map +1 -0
  124. package/dist/onboarding.d.ts +6 -0
  125. package/dist/onboarding.d.ts.map +1 -0
  126. package/dist/onboarding.js +463 -0
  127. package/dist/onboarding.js.map +1 -0
  128. package/dist/plugins/application.d.ts +6 -4
  129. package/dist/plugins/application.d.ts.map +1 -1
  130. package/dist/plugins/application.js +106 -52
  131. package/dist/plugins/application.js.map +1 -1
  132. package/dist/plugins/instructions.d.ts +1 -1
  133. package/dist/plugins/instructions.d.ts.map +1 -1
  134. package/dist/plugins/instructions.js +24 -11
  135. package/dist/plugins/instructions.js.map +1 -1
  136. package/dist/plugins/resources.d.ts +2 -2
  137. package/dist/plugins/resources.d.ts.map +1 -1
  138. package/dist/plugins/resources.js +22 -12
  139. package/dist/plugins/resources.js.map +1 -1
  140. package/dist/policy.d.ts +1 -1
  141. package/dist/policy.d.ts.map +1 -1
  142. package/dist/policy.js +59 -11
  143. package/dist/policy.js.map +1 -1
  144. package/dist/run.d.ts +2 -0
  145. package/dist/run.d.ts.map +1 -1
  146. package/dist/run.js +38 -33
  147. package/dist/run.js.map +1 -1
  148. package/dist/runtime-instructions.d.ts +1 -1
  149. package/dist/runtime-instructions.d.ts.map +1 -1
  150. package/dist/runtime-instructions.js +15 -7
  151. package/dist/runtime-instructions.js.map +1 -1
  152. package/dist/session-navigation.d.ts +6 -0
  153. package/dist/session-navigation.d.ts.map +1 -0
  154. package/dist/session-navigation.js +64 -0
  155. package/dist/session-navigation.js.map +1 -0
  156. package/dist/session-picker.d.ts +1 -1
  157. package/dist/session-picker.d.ts.map +1 -1
  158. package/dist/session-picker.js +23 -32
  159. package/dist/session-picker.js.map +1 -1
  160. package/dist/settings.d.ts +718 -0
  161. package/dist/settings.d.ts.map +1 -0
  162. package/dist/settings.js +14 -0
  163. package/dist/settings.js.map +1 -0
  164. package/dist/skills.d.ts +1 -1
  165. package/dist/skills.d.ts.map +1 -1
  166. package/dist/skills.js +10 -12
  167. package/dist/skills.js.map +1 -1
  168. package/dist/slash-commands.d.ts +2 -2
  169. package/dist/slash-commands.d.ts.map +1 -1
  170. package/dist/slash-commands.js +149 -67
  171. package/dist/slash-commands.js.map +1 -1
  172. package/dist/team-execution.d.ts +10 -0
  173. package/dist/team-execution.d.ts.map +1 -0
  174. package/dist/team-execution.js +29 -0
  175. package/dist/team-execution.js.map +1 -0
  176. package/dist/team-patches.d.ts.map +1 -1
  177. package/dist/team-patches.js +149 -52
  178. package/dist/team-patches.js.map +1 -1
  179. package/dist/team-plan.d.ts +2 -2
  180. package/dist/team-plan.d.ts.map +1 -1
  181. package/dist/team-plan.js +115 -34
  182. package/dist/team-plan.js.map +1 -1
  183. package/dist/team-recovery.d.ts +1 -1
  184. package/dist/team-recovery.d.ts.map +1 -1
  185. package/dist/team-recovery.js +40 -10
  186. package/dist/team-recovery.js.map +1 -1
  187. package/dist/team-v2.d.ts.map +1 -1
  188. package/dist/team-v2.js +335 -104
  189. package/dist/team-v2.js.map +1 -1
  190. package/dist/team-verification.d.ts +4 -2
  191. package/dist/team-verification.d.ts.map +1 -1
  192. package/dist/team-verification.js +300 -97
  193. package/dist/team-verification.js.map +1 -1
  194. package/dist/team.d.ts +2 -2
  195. package/dist/team.d.ts.map +1 -1
  196. package/dist/team.js +172 -62
  197. package/dist/team.js.map +1 -1
  198. package/dist/terminal-web.d.ts +1 -0
  199. package/dist/terminal-web.d.ts.map +1 -1
  200. package/dist/terminal-web.js +28 -10
  201. package/dist/terminal-web.js.map +1 -1
  202. package/dist/ui/actions.d.ts.map +1 -1
  203. package/dist/ui/actions.js.map +1 -1
  204. package/dist/ui/retained-tui.d.ts.map +1 -1
  205. package/dist/ui/retained-tui.js +231 -173
  206. package/dist/ui/retained-tui.js.map +1 -1
  207. package/dist/ui/{prototype-view.d.ts → terminal-view.d.ts} +7 -7
  208. package/dist/ui/terminal-view.d.ts.map +1 -0
  209. package/dist/ui/{prototype-view.js → terminal-view.js} +185 -98
  210. package/dist/ui/terminal-view.js.map +1 -0
  211. package/dist/web-commands.d.ts.map +1 -1
  212. package/dist/web-commands.js +160 -57
  213. package/dist/web-commands.js.map +1 -1
  214. package/dist/web-extension.d.ts.map +1 -1
  215. package/dist/web-extension.js +14 -4
  216. package/dist/web-extension.js.map +1 -1
  217. package/dist/web-server.d.ts.map +1 -1
  218. package/dist/web-server.js +2 -1
  219. package/dist/web-server.js.map +1 -1
  220. package/dist/web-ui.d.ts.map +1 -1
  221. package/dist/web-ui.js +167 -40
  222. package/dist/web-ui.js.map +1 -1
  223. package/dist/workspace-configuration.d.ts +7 -0
  224. package/dist/workspace-configuration.d.ts.map +1 -0
  225. package/dist/workspace-configuration.js +134 -0
  226. package/dist/workspace-configuration.js.map +1 -0
  227. package/dist/workspace-state.d.ts +20 -0
  228. package/dist/workspace-state.d.ts.map +1 -0
  229. package/dist/workspace-state.js +2 -0
  230. package/dist/workspace-state.js.map +1 -0
  231. package/dist/workspace.d.ts +26 -43
  232. package/dist/workspace.d.ts.map +1 -1
  233. package/dist/workspace.js +261 -323
  234. package/dist/workspace.js.map +1 -1
  235. package/package.json +21 -31
  236. package/dist/cli/chunk-7ISOHFS7.js.map +0 -7
  237. package/dist/cli/chunk-F4XRPLUM.js.map +0 -7
  238. package/dist/cli/chunk-H7SNBFO4.js +0 -5522
  239. package/dist/cli/chunk-H7SNBFO4.js.map +0 -7
  240. package/dist/cli/chunk-HOU5ITUK.js.map +0 -7
  241. package/dist/cli/chunk-K5JWPNSY.js.map +0 -7
  242. package/dist/cli/chunk-LVTRXPDS.js.map +0 -7
  243. package/dist/cli/chunk-VAZMCNBB.js +0 -686
  244. package/dist/cli/chunk-VAZMCNBB.js.map +0 -7
  245. package/dist/cli/chunk-WOFEI42C.js +0 -7820
  246. package/dist/cli/chunk-WOFEI42C.js.map +0 -7
  247. package/dist/cli/file-type-R2T7TBHI.js.map +0 -7
  248. package/dist/cli/mcp-auth-UNRHSIKJ.js +0 -63
  249. package/dist/cli/mcp-auth-UNRHSIKJ.js.map +0 -7
  250. package/dist/cli/retained-tui-VJ3VX4R3.js.map +0 -7
  251. package/dist/cli/team-v2-JGBBQ7FR.js.map +0 -7
  252. package/dist/cli/tui-SA74DKMA.js +0 -1705
  253. package/dist/cli/tui-SA74DKMA.js.map +0 -7
  254. package/dist/cli/web-server-FOMNPY7Q.js.map +0 -7
  255. package/dist/delegation.d.ts +0 -2
  256. package/dist/delegation.d.ts.map +0 -1
  257. package/dist/delegation.js +0 -2
  258. package/dist/delegation.js.map +0 -1
  259. package/dist/history-memory.d.ts +0 -2
  260. package/dist/history-memory.d.ts.map +0 -1
  261. package/dist/history-memory.js +0 -2
  262. package/dist/history-memory.js.map +0 -1
  263. package/dist/subagent-budget.d.ts +0 -2
  264. package/dist/subagent-budget.d.ts.map +0 -1
  265. package/dist/subagent-budget.js +0 -2
  266. package/dist/subagent-budget.js.map +0 -1
  267. package/dist/subagent-files.d.ts +0 -2
  268. package/dist/subagent-files.d.ts.map +0 -1
  269. package/dist/subagent-files.js +0 -2
  270. package/dist/subagent-files.js.map +0 -1
  271. package/dist/subagent-host.d.ts +0 -2
  272. package/dist/subagent-host.d.ts.map +0 -1
  273. package/dist/subagent-host.js +0 -2
  274. package/dist/subagent-host.js.map +0 -1
  275. package/dist/subagent-instructions.d.ts +0 -2
  276. package/dist/subagent-instructions.d.ts.map +0 -1
  277. package/dist/subagent-instructions.js +0 -2
  278. package/dist/subagent-instructions.js.map +0 -1
  279. package/dist/subagents.d.ts +0 -2
  280. package/dist/subagents.d.ts.map +0 -1
  281. package/dist/subagents.js +0 -2
  282. package/dist/subagents.js.map +0 -1
  283. package/dist/summarizer.d.ts +0 -2
  284. package/dist/summarizer.d.ts.map +0 -1
  285. package/dist/summarizer.js +0 -2
  286. package/dist/summarizer.js.map +0 -1
  287. package/dist/tui.d.ts +0 -7
  288. package/dist/tui.d.ts.map +0 -1
  289. package/dist/tui.js +0 -1109
  290. package/dist/tui.js.map +0 -1
  291. package/dist/ui/prototype-view.d.ts.map +0 -1
  292. package/dist/ui/prototype-view.js.map +0 -1
  293. /package/dist/cli/{configured-WHY3GGAJ.js.map → configured-ACNM6TRQ.js.map} +0 -0
  294. /package/dist/cli/{team-T7G7PPNN.js.map → team-O2I5BXHM.js.map} +0 -0
  295. /package/dist/cli/{web-ui-COB6PKC5.js.map → web-ui-UWQUFE4W.js.map} +0 -0
@@ -0,0 +1,74 @@
1
+ import { createRequire as __createRequire } from "node:module"; const require = __createRequire(import.meta.url);
2
+ import {
3
+ getDefaultMaybeCodeDataDirectory,
4
+ resolveMaybeCodeMcp
5
+ } from "./chunk-3IORPKBL.js";
6
+ import "./chunk-MNBYXL5Y.js";
7
+ import "./chunk-WVIRS76R.js";
8
+ import {
9
+ KeyringMcpCredentialStore,
10
+ MaybeCodeConfigError,
11
+ McpOAuthManager
12
+ } from "./chunk-5SLWALZK.js";
13
+ import "./chunk-UQDZ55LQ.js";
14
+ import "./chunk-BSBNNF34.js";
15
+ import {
16
+ __name
17
+ } from "./chunk-E732GDOI.js";
18
+
19
+ // apps/maybecode/src/mcp-auth.ts
20
+ import { resolve, join } from "node:path";
21
+ import { loadMayConfig } from "@sortedyuan/may/config";
22
+ import { omitUndefined } from "@sortedyuan/may/core";
23
+ async function runMaybeCodeMcpCommand(command, dependencies) {
24
+ const config = await (dependencies.loadConfig?.(command.configPath) ?? loadMayConfig(omitUndefined({ path: command.configPath })));
25
+ const mcp = resolveMaybeCodeMcp(config, resolve(command.workspace ?? process.cwd()));
26
+ const server = mcp === false ? void 0 : mcp.servers.find((entry) => entry.id === command.serverId);
27
+ if (server?.transport !== "streamable-http" || server.auth === void 0) {
28
+ throw new MaybeCodeConfigError(
29
+ `MCP server "${command.serverId}" is missing, disabled, or not configured for OAuth`
30
+ );
31
+ }
32
+ const oauth = dependencies.oauth ?? new McpOAuthManager(new KeyringMcpCredentialStore(join(getDefaultMaybeCodeDataDirectory(), "mcp-credentials")));
33
+ switch (command.action) {
34
+ case "login":
35
+ await oauth.login(
36
+ {
37
+ ...server,
38
+ auth: { ...server.auth, scopes: [...server.auth.scopes ?? [], ...command.scopes ?? []] }
39
+ },
40
+ {
41
+ onAuthorizationUrl: dependencies.onAuthorizationUrl ?? ((url) => {
42
+ dependencies.write(
43
+ `Open this URL in your browser to authorize MCP server ${server.id}:
44
+ ${url.href}
45
+ Waiting for authorization (Ctrl+C to cancel)...
46
+ `
47
+ );
48
+ }),
49
+ ...omitUndefined({ signal: dependencies.signal })
50
+ }
51
+ );
52
+ dependencies.write(
53
+ `MCP server ${server.id}: login complete. Restart an already-running workspace to reconnect.
54
+ `
55
+ );
56
+ return;
57
+ case "logout": {
58
+ const result = await oauth.logout(server, dependencies.signal);
59
+ dependencies.write(
60
+ `MCP server ${server.id}: local credentials removed${result.revoked ? "; revocation completed where applicable" : "; remote revocation unavailable or failed \u2014 revoke access at the provider if needed"}.
61
+ `
62
+ );
63
+ return;
64
+ }
65
+ case "status":
66
+ dependencies.write(`MCP server ${server.id}: ${JSON.stringify(await oauth.status(server))}
67
+ `);
68
+ }
69
+ }
70
+ __name(runMaybeCodeMcpCommand, "runMaybeCodeMcpCommand");
71
+ export {
72
+ runMaybeCodeMcpCommand
73
+ };
74
+ //# sourceMappingURL=mcp-auth-XD5U7WCV.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/mcp-auth.ts"],
4
+ "sourcesContent": ["import { resolve, join } from \"node:path\";\nimport { loadMayConfig, type MayConfig } from \"@sortedyuan/may/config\";\nimport { omitUndefined } from \"@sortedyuan/may/core\";\nimport { KeyringMcpCredentialStore, McpOAuthManager } from \"@sortedyuan/mcp\";\nimport type { MaybeCodeMcpCommand } from \"./args.js\";\nimport { getDefaultMaybeCodeDataDirectory, resolveMaybeCodeMcp } from \"./configured.js\";\nimport { MaybeCodeConfigError } from \"./errors.js\";\n\nexport interface MaybeCodeMcpAuthDependencies {\n readonly write: (text: string) => void;\n readonly oauth?: McpOAuthManager;\n readonly loadConfig?: (path?: string) => Promise<MayConfig>;\n readonly onAuthorizationUrl?: (url: URL) => void | Promise<void>;\n readonly signal?: AbortSignal;\n}\n\n/** Authentication is available before agent/model startup, even for required endpoints. */\nexport async function runMaybeCodeMcpCommand(\n command: MaybeCodeMcpCommand,\n dependencies: MaybeCodeMcpAuthDependencies,\n): Promise<void> {\n const config = await (dependencies.loadConfig?.(command.configPath) ??\n loadMayConfig(omitUndefined({ path: command.configPath })));\n const mcp = resolveMaybeCodeMcp(config, resolve(command.workspace ?? process.cwd()));\n const server = mcp === false ? undefined : mcp.servers.find((entry) => entry.id === command.serverId);\n if (server?.transport !== \"streamable-http\" || server.auth === undefined) {\n throw new MaybeCodeConfigError(\n `MCP server \"${command.serverId}\" is missing, disabled, or not configured for OAuth`,\n );\n }\n const oauth =\n dependencies.oauth ??\n new McpOAuthManager(new KeyringMcpCredentialStore(join(getDefaultMaybeCodeDataDirectory(), \"mcp-credentials\")));\n switch (command.action) {\n case \"login\":\n await oauth.login(\n {\n ...server,\n auth: { ...server.auth, scopes: [...(server.auth.scopes ?? []), ...(command.scopes ?? [])] },\n },\n {\n onAuthorizationUrl:\n dependencies.onAuthorizationUrl ??\n ((url) => {\n dependencies.write(\n `Open this URL in your browser to authorize MCP server ${server.id}:\\n${url.href}\\nWaiting for authorization (Ctrl+C to cancel)...\\n`,\n );\n }),\n ...omitUndefined({ signal: dependencies.signal }),\n },\n );\n dependencies.write(\n `MCP server ${server.id}: login complete. Restart an already-running workspace to reconnect.\\n`,\n );\n return;\n case \"logout\": {\n const result = await oauth.logout(server, dependencies.signal);\n dependencies.write(\n `MCP server ${server.id}: local credentials removed${result.revoked ? \"; revocation completed where applicable\" : \"; remote revocation unavailable or failed \u2014 revoke access at the provider if needed\"}.\\n`,\n );\n return;\n }\n case \"status\":\n dependencies.write(`MCP server ${server.id}: ${JSON.stringify(await oauth.status(server))}\\n`);\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqC;AAC9C,SAAS,qBAAqB;AAe9B,eAAsB,uBACpB,SACA,cACe;AACf,QAAM,SAAS,OAAO,aAAa,aAAa,QAAQ,UAAU,KAChE,cAAc,cAAc,EAAE,MAAM,QAAQ,WAAW,CAAC,CAAC;AAC3D,QAAM,MAAM,oBAAoB,QAAQ,QAAQ,QAAQ,aAAa,QAAQ,IAAI,CAAC,CAAC;AACnF,QAAM,SAAS,QAAQ,QAAQ,SAAY,IAAI,QAAQ,KAAK,CAAC,UAAU,MAAM,OAAO,QAAQ,QAAQ;AACpG,MAAI,QAAQ,cAAc,qBAAqB,OAAO,SAAS,QAAW;AACxE,UAAM,IAAI;AAAA,MACR,eAAe,QAAQ,QAAQ;AAAA,IACjC;AAAA,EACF;AACA,QAAM,QACJ,aAAa,SACb,IAAI,gBAAgB,IAAI,0BAA0B,KAAK,iCAAiC,GAAG,iBAAiB,CAAC,CAAC;AAChH,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACH,YAAM,MAAM;AAAA,QACV;AAAA,UACE,GAAG;AAAA,UACH,MAAM,EAAE,GAAG,OAAO,MAAM,QAAQ,CAAC,GAAI,OAAO,KAAK,UAAU,CAAC,GAAI,GAAI,QAAQ,UAAU,CAAC,CAAE,EAAE;AAAA,QAC7F;AAAA,QACA;AAAA,UACE,oBACE,aAAa,uBACZ,CAAC,QAAQ;AACR,yBAAa;AAAA,cACX,yDAAyD,OAAO,EAAE;AAAA,EAAM,IAAI,IAAI;AAAA;AAAA;AAAA,YAClF;AAAA,UACF;AAAA,UACF,GAAG,cAAc,EAAE,QAAQ,aAAa,OAAO,CAAC;AAAA,QAClD;AAAA,MACF;AACA,mBAAa;AAAA,QACX,cAAc,OAAO,EAAE;AAAA;AAAA,MACzB;AACA;AAAA,IACF,KAAK,UAAU;AACb,YAAM,SAAS,MAAM,MAAM,OAAO,QAAQ,aAAa,MAAM;AAC7D,mBAAa;AAAA,QACX,cAAc,OAAO,EAAE,8BAA8B,OAAO,UAAU,4CAA4C,0FAAqF;AAAA;AAAA,MACzM;AACA;AAAA,IACF;AAAA,IACA,KAAK;AACH,mBAAa,MAAM,cAAc,OAAO,EAAE,KAAK,KAAK,UAAU,MAAM,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EACjG;AACF;AAhDsB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,530 @@
1
+ import { createRequire as __createRequire } from "node:module"; const require = __createRequire(import.meta.url);
2
+ import {
3
+ SelectList
4
+ } from "./chunk-4B2Z6KW7.js";
5
+ import "./chunk-Z3BOPBVU.js";
6
+ import {
7
+ createNodeTerminal
8
+ } from "./chunk-4WG6JIJJ.js";
9
+ import {
10
+ createBuiltinProviderModel,
11
+ selectProviderModel
12
+ } from "./chunk-WVIRS76R.js";
13
+ import "./chunk-UQDZ55LQ.js";
14
+ import {
15
+ __name
16
+ } from "./chunk-E732GDOI.js";
17
+
18
+ // apps/maybecode/src/onboarding.ts
19
+ import { setImmediate } from "node:timers/promises";
20
+ import { createMayConfig, parseMayConfig } from "@sortedyuan/may/config";
21
+ var providers = [
22
+ {
23
+ name: "OpenAI (Responses)",
24
+ adapter: "openai-responses",
25
+ url: "https://api.openai.com/v1",
26
+ env: "OPENAI_API_KEY",
27
+ suffix: "/responses",
28
+ options: [
29
+ "maxOutputTokens",
30
+ "reasoningEffort",
31
+ "reasoningSummary",
32
+ "serverCompactThreshold",
33
+ "store",
34
+ "responseFormat"
35
+ ]
36
+ },
37
+ {
38
+ name: "OpenAI (Chat Completions)",
39
+ adapter: "openai-chat-completions",
40
+ url: "https://api.openai.com/v1",
41
+ env: "OPENAI_API_KEY",
42
+ suffix: "/chat/completions",
43
+ options: ["maxOutputTokens", "reasoningEffort", "store", "responseFormat"]
44
+ },
45
+ {
46
+ name: "Anthropic",
47
+ adapter: "anthropic-messages",
48
+ url: "https://api.anthropic.com",
49
+ env: "ANTHROPIC_API_KEY",
50
+ suffix: "/v1/messages",
51
+ options: ["thinking", "reasoningEffort", "maxTokens", "apiVersion"]
52
+ },
53
+ {
54
+ name: "Google Gemini",
55
+ adapter: "google-gemini",
56
+ url: "https://generativelanguage.googleapis.com/v1beta",
57
+ env: "GEMINI_API_KEY",
58
+ suffix: "/models/{model}:streamGenerateContent",
59
+ options: ["maxOutputTokens", "reasoningEffort", "thinkingBudget", "includeThoughts", "responseFormat"]
60
+ },
61
+ {
62
+ name: "DeepSeek",
63
+ adapter: "deepseek-chat",
64
+ url: "https://api.deepseek.com",
65
+ env: "DEEPSEEK_API_KEY",
66
+ suffix: "/chat/completions",
67
+ options: ["thinking", "reasoningEffort", "maxTokens"]
68
+ },
69
+ {
70
+ name: "Zhipu",
71
+ adapter: "zhipu-chat",
72
+ url: "https://open.bigmodel.cn/api/paas/v4",
73
+ env: "ZHIPU_API_KEY",
74
+ suffix: "/chat/completions",
75
+ options: ["thinking", "clearThinking", "reasoningEffort", "maxTokens"]
76
+ },
77
+ {
78
+ name: "Kimi",
79
+ adapter: "kimi-chat",
80
+ url: "https://api.moonshot.ai/v1",
81
+ env: "MOONSHOT_API_KEY",
82
+ suffix: "/chat/completions",
83
+ options: ["thinking", "reasoningEffort", "maxTokens"]
84
+ }
85
+ ];
86
+ var Back = class extends Error {
87
+ static {
88
+ __name(this, "Back");
89
+ }
90
+ };
91
+ var Cancel = class extends Error {
92
+ static {
93
+ __name(this, "Cancel");
94
+ }
95
+ };
96
+ var back = { name: "Back", value: "back" };
97
+ var cancel = { name: "Cancel setup", value: "cancel" };
98
+ function configuration(draft, path) {
99
+ return parseMayConfig(
100
+ {
101
+ providers: {
102
+ primary: {
103
+ adapter: providers[draft.provider].adapter,
104
+ baseURL: draft.baseURL,
105
+ ...draft.credential === "env" ? { apiKeyEnv: draft.apiKeyEnv } : { apiKey: draft.apiKey }
106
+ }
107
+ },
108
+ models: {
109
+ [draft.profile]: {
110
+ provider: "primary",
111
+ model: draft.model,
112
+ ...draft.contextWindowTokens === "" ? {} : { contextWindowTokens: Number(draft.contextWindowTokens) },
113
+ ...draft.maxOutputTokens === "" ? {} : { maxOutputTokens: Number(draft.maxOutputTokens) },
114
+ ...draft.options === "" ? {} : { options: JSON.parse(draft.options) }
115
+ }
116
+ },
117
+ defaultModel: draft.profile
118
+ },
119
+ path
120
+ );
121
+ }
122
+ __name(configuration, "configuration");
123
+ async function checkOnboardingConnection(config, signal, timeoutMs = 3e4) {
124
+ const timeout = AbortSignal.timeout(timeoutMs);
125
+ const combined = AbortSignal.any([signal, timeout]);
126
+ const model = createBuiltinProviderModel(selectProviderModel(config));
127
+ let completed = false;
128
+ for await (const event of model.stream(
129
+ {
130
+ messages: [{ role: "user", content: [{ type: "text", text: "Reply with OK." }] }],
131
+ tools: []
132
+ },
133
+ { signal: combined }
134
+ )) {
135
+ combined.throwIfAborted();
136
+ if (event.type === "response.completed") {
137
+ completed = event.message.content.some((part) => part.type === "text" && part.text.trim() !== "");
138
+ }
139
+ }
140
+ combined.throwIfAborted();
141
+ if (!completed) throw new Error("No completed text response");
142
+ }
143
+ __name(checkOnboardingConnection, "checkOnboardingConnection");
144
+ function connectionProblem(error) {
145
+ if (error instanceof Error && (error.name === "TimeoutError" || error.name === "AbortError"))
146
+ return "The request timed out. Check the address and network, then retry.";
147
+ if (error instanceof Error && "status" in error && typeof error.status === "number") {
148
+ const hint = error.status === 401 || error.status === 403 ? "Check your credentials and account access." : error.status === 404 ? "Check the base URL, protocol, and model ID." : error.status === 429 ? "Check your account quota or retry later." : "Check your provider settings and service status.";
149
+ return `HTTP ${error.status}. ${hint}`;
150
+ }
151
+ return "A completed text response was not received. Check the address, protocol, model ID, options, and network, then retry.";
152
+ }
153
+ __name(connectionProblem, "connectionProblem");
154
+ async function runMaybeCodeOnboarding(path, command) {
155
+ const controller = new AbortController();
156
+ const context = { signal: controller.signal };
157
+ const terminal = createNodeTerminal();
158
+ const interrupt = /* @__PURE__ */ __name(() => controller.abort(new Cancel()), "interrupt");
159
+ const removeInterrupt = terminal.onInterrupt(interrupt);
160
+ process.once("SIGINT", interrupt);
161
+ process.stdin.once("end", interrupt);
162
+ const draft = {
163
+ provider: 0,
164
+ custom: false,
165
+ baseURL: providers[0].url,
166
+ credential: "env",
167
+ apiKey: "",
168
+ apiKeyEnv: providers[0].env,
169
+ profile: command.model ?? "default",
170
+ model: "",
171
+ contextWindowTokens: "",
172
+ maxOutputTokens: "",
173
+ options: ""
174
+ };
175
+ let saved = false;
176
+ let verified = false;
177
+ let completion;
178
+ let screen = "";
179
+ const write = /* @__PURE__ */ __name((message) => {
180
+ screen += `${message}
181
+ `;
182
+ terminal.write(`${message}
183
+ `);
184
+ }, "write");
185
+ const text = /* @__PURE__ */ __name(async (message, value, validate = required, clearable = false, password = false) => {
186
+ write(`Enter: continue | Esc: back | Ctrl+C: cancel${clearable ? " | :clear: remove this setting" : ""}`);
187
+ while (true) {
188
+ const question = new AbortController();
189
+ let answer;
190
+ try {
191
+ answer = (await terminal.question(`${message}${value && !password ? ` [${value}]` : ""}: `, {
192
+ signal: AbortSignal.any([controller.signal, question.signal]),
193
+ history: false,
194
+ password,
195
+ onEscape: /* @__PURE__ */ __name(() => question.abort(new Back()), "onEscape")
196
+ })).trim();
197
+ } catch (error) {
198
+ controller.signal.throwIfAborted();
199
+ if (question.signal.aborted) throw question.signal.reason;
200
+ throw error;
201
+ }
202
+ if (clearable && answer === ":clear") return "";
203
+ const result = answer || value;
204
+ const valid = validate(result);
205
+ if (valid === true) return result;
206
+ write(typeof valid === "string" ? valid : "Enter a valid value.");
207
+ }
208
+ }, "text");
209
+ const choose = /* @__PURE__ */ __name(async (message, choices, value, escapeValue = "back") => {
210
+ let result;
211
+ const list = new SelectList(
212
+ choices.map((choice) => ({ label: choice.name, value: choice.value })),
213
+ {
214
+ selectedIndex: Math.max(
215
+ 0,
216
+ choices.findIndex((choice) => choice.value === value)
217
+ ),
218
+ onSelect: /* @__PURE__ */ __name((item) => {
219
+ result = item.value;
220
+ }, "onSelect"),
221
+ onCancel: /* @__PURE__ */ __name(() => {
222
+ result = escapeValue;
223
+ }, "onCancel"),
224
+ keybindings: [{ context: "select", keys: "escape", action: "list.cancel" }]
225
+ }
226
+ );
227
+ list.setFocused(true);
228
+ while (result === void 0) {
229
+ const lines = list.render({
230
+ width: Math.max(1, (process.stdout.columns || 80) - 1),
231
+ height: Math.max(1, Math.min(12, (process.stdout.rows || 24) - 4))
232
+ }).lines;
233
+ terminal.write(
234
+ `\x1B[2J\x1B[H${screen}${message}
235
+
236
+ ${lines.join("\n")}
237
+
238
+ Up/Down: select | Enter: confirm | Esc: ${escapeValue === "cancel" ? "cancel" : "back"} | Ctrl+C: cancel`
239
+ );
240
+ const key = await terminal.readKey(context);
241
+ if (key.ctrl && key.key === "c") throw new Cancel();
242
+ list.handleKey(key);
243
+ }
244
+ terminal.write(`\x1B[2J\x1B[H${screen}`);
245
+ if (result === "back") throw new Back();
246
+ if (result === "cancel") throw new Cancel();
247
+ write(`${message}: ${choices.find((choice) => choice.value === result).name}`);
248
+ return result;
249
+ }, "choose");
250
+ try {
251
+ terminal.write("\x1B[?1049h");
252
+ let step = 0;
253
+ const previous = [];
254
+ const advance = /* @__PURE__ */ __name((next) => {
255
+ previous.push(step);
256
+ step = next;
257
+ }, "advance");
258
+ const selectProvider = /* @__PURE__ */ __name((selected) => {
259
+ if (Number(selected) === draft.provider) return;
260
+ draft.provider = Number(selected);
261
+ draft.baseURL = providers[draft.provider].url;
262
+ draft.apiKeyEnv = providers[draft.provider].env;
263
+ draft.options = "";
264
+ }, "selectProvider");
265
+ while (true) {
266
+ screen = `Welcome to MaybeCode
267
+ Configuration: ${path}
268
+
269
+ `;
270
+ terminal.write(`\x1B[2J\x1B[H${screen}`);
271
+ try {
272
+ if (step === 0) {
273
+ await choose(
274
+ command.configPath === void 0 ? "Start configuration?" : "Create a new configuration at this path?",
275
+ [{ name: "Start configuration", value: "start" }, cancel],
276
+ void 0,
277
+ "cancel"
278
+ );
279
+ advance(1);
280
+ } else if (step === 1) {
281
+ verified = false;
282
+ const choice = await choose(
283
+ "Provider",
284
+ [
285
+ ...providers.map((provider, index) => ({ name: provider.name, value: String(index) })),
286
+ { name: "Custom compatible service", value: "custom" },
287
+ back,
288
+ cancel
289
+ ],
290
+ draft.custom ? "custom" : String(draft.provider)
291
+ );
292
+ draft.custom = choice === "custom";
293
+ if (!draft.custom) selectProvider(choice);
294
+ advance(draft.custom ? 2 : 3);
295
+ } else if (step === 2) {
296
+ selectProvider(
297
+ await choose(
298
+ "API protocol",
299
+ [...providers.map((provider, index) => ({ name: provider.adapter, value: String(index) })), back, cancel],
300
+ String(draft.provider)
301
+ )
302
+ );
303
+ advance(3);
304
+ } else if (step === 3) {
305
+ write(
306
+ `The adapter appends ${providers[draft.provider].suffix} to the base URL. Include any API version prefix required by your service.`
307
+ );
308
+ draft.baseURL = await text("Base URL", draft.baseURL, validURL);
309
+ advance(4);
310
+ } else if (step === 4) {
311
+ verified = false;
312
+ draft.credential = await choose(
313
+ "Credentials",
314
+ [
315
+ { name: "Use an environment variable", value: "env" },
316
+ { name: "Enter an API key (saved as plain text in the config file)", value: "key" },
317
+ back,
318
+ cancel
319
+ ],
320
+ draft.credential
321
+ );
322
+ advance(5);
323
+ } else if (step === 5) {
324
+ if (draft.credential === "env") {
325
+ draft.apiKeyEnv = await text("Environment variable name", draft.apiKeyEnv, (value) => {
326
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(value)) return "Enter a valid environment variable name.";
327
+ return process.env[value]?.trim() ? true : "This variable is empty or unavailable in this process. Press Esc to choose another credential method.";
328
+ });
329
+ } else {
330
+ draft.apiKey = await text(
331
+ draft.apiKey ? "API key (input hidden; leave empty to keep the current key)" : "API key (input hidden)",
332
+ draft.apiKey,
333
+ required,
334
+ false,
335
+ true
336
+ );
337
+ }
338
+ advance(6);
339
+ } else if (step === 6) {
340
+ verified = false;
341
+ draft.model = await text("Model ID", draft.model);
342
+ advance(7);
343
+ } else if (step === 7) {
344
+ draft.profile = await text(
345
+ "Model profile name",
346
+ draft.profile,
347
+ (value) => command.model !== void 0 && value !== command.model ? `This launch uses --model ${command.model}. Use that profile name to continue.` : required(value)
348
+ );
349
+ advance(8);
350
+ } else if (step === 8) {
351
+ const advanced = await choose("Model settings", [
352
+ { name: "Continue", value: "continue" },
353
+ { name: "Edit advanced settings", value: "advanced" },
354
+ back,
355
+ cancel
356
+ ]);
357
+ advance(advanced === "advanced" ? 9 : 12);
358
+ } else if (step === 9) {
359
+ write(
360
+ "Enter keeps the displayed value. Type :clear to remove an advanced setting and use existing defaults."
361
+ );
362
+ draft.contextWindowTokens = await text(
363
+ "Context window tokens (optional)",
364
+ draft.contextWindowTokens,
365
+ optionalInteger,
366
+ true
367
+ );
368
+ advance(10);
369
+ } else if (step === 10) {
370
+ draft.maxOutputTokens = await text(
371
+ "Maximum output tokens (optional)",
372
+ draft.maxOutputTokens,
373
+ optionalInteger,
374
+ true
375
+ );
376
+ advance(11);
377
+ } else if (step === 11) {
378
+ const keys = [...providers[draft.provider].options, "unknownCapabilityPolicy"];
379
+ write(`Adapter options: ${keys.join(", ")}`);
380
+ draft.options = await text(
381
+ "Adapter options as a JSON object (optional)",
382
+ draft.options,
383
+ (value) => {
384
+ if (!value) return true;
385
+ let options;
386
+ try {
387
+ options = JSON.parse(value);
388
+ } catch {
389
+ return "Enter a valid JSON object.";
390
+ }
391
+ if (options === null || typeof options !== "object" || Array.isArray(options))
392
+ return "Enter a JSON object.";
393
+ return Object.keys(options).every((key) => keys.includes(key)) || "Use only the listed adapter option names.";
394
+ },
395
+ true
396
+ );
397
+ advance(12);
398
+ } else if (step === 12) {
399
+ let config;
400
+ try {
401
+ config = configuration(draft, path);
402
+ createBuiltinProviderModel(selectProviderModel(config));
403
+ } catch (error) {
404
+ if (!(error instanceof Error)) throw error;
405
+ const secret = draft.credential === "key" ? draft.apiKey : process.env[draft.apiKeyEnv];
406
+ const message = secret ? error.message.replaceAll(secret, "[hidden]") : error.message;
407
+ write(`Configuration needs attention: ${message.replace(/[\x00-\x1f\x7f]/gu, " ")}`);
408
+ const target = await choose("Edit configuration", [
409
+ { name: "Provider", value: "1" },
410
+ { name: "Credentials", value: "4" },
411
+ { name: "Model and advanced settings", value: "6" },
412
+ back,
413
+ cancel
414
+ ]);
415
+ advance(Number(target));
416
+ continue;
417
+ }
418
+ write("Local configuration checks passed.");
419
+ const action = await choose("Connection check", [
420
+ { name: "Test connection (sends a short request; API charges may apply)", value: "test" },
421
+ { name: "Skip connection check", value: "skip" },
422
+ back,
423
+ cancel
424
+ ]);
425
+ verified = false;
426
+ if (action === "test") {
427
+ write("Checking connection (30-second timeout). Press Ctrl+C to cancel setup.");
428
+ try {
429
+ await checkOnboardingConnection(config, controller.signal);
430
+ verified = true;
431
+ } catch (error) {
432
+ controller.signal.throwIfAborted();
433
+ write(`Connection check failed. ${connectionProblem(error)}`);
434
+ const next = await choose(
435
+ "Next action",
436
+ [
437
+ { name: "Retry", value: "retry" },
438
+ { name: "Edit provider", value: "1" },
439
+ { name: "Edit credentials", value: "4" },
440
+ { name: "Edit model and advanced settings", value: "6" },
441
+ { name: "Skip connection check", value: "skip" },
442
+ { name: "Back", value: "retry" },
443
+ cancel
444
+ ],
445
+ void 0,
446
+ "retry"
447
+ );
448
+ if (next !== "skip") {
449
+ if (next !== "retry") advance(Number(next));
450
+ continue;
451
+ }
452
+ }
453
+ }
454
+ advance(13);
455
+ } else {
456
+ write(
457
+ `
458
+ Review configuration
459
+ Path: ${path}
460
+ Provider: ${draft.custom ? "Custom compatible service" : providers[draft.provider].name}
461
+ Protocol: ${providers[draft.provider].adapter}
462
+ Base URL: ${draft.baseURL}
463
+ Model: ${draft.model}
464
+ Default profile: ${draft.profile}
465
+ Credentials: ${draft.credential === "env" ? `Environment variable ${draft.apiKeyEnv}` : "API key stored as plain text (hidden)"}
466
+ Context window tokens: ${draft.contextWindowTokens || "Default"}
467
+ Maximum output tokens: ${draft.maxOutputTokens || "Default"}
468
+ Advanced options: ${draft.options || "Default"}
469
+ Connection: ${verified ? "Verified" : "Not verified"}`
470
+ );
471
+ await choose("Save configuration?", [{ name: "Save and start", value: "save" }, back, cancel]);
472
+ const config = configuration(draft, path);
473
+ createBuiltinProviderModel(selectProviderModel(config));
474
+ await createMayConfig(
475
+ path,
476
+ { providers: config.providers, models: config.models, defaultModel: config.defaultModel },
477
+ context
478
+ );
479
+ saved = true;
480
+ completion = `Configuration saved to ${path}. Starting MaybeCode.`;
481
+ return true;
482
+ }
483
+ } catch (error) {
484
+ if (!(error instanceof Back)) throw error;
485
+ step = previous.pop() ?? 0;
486
+ verified = false;
487
+ }
488
+ }
489
+ } catch (error) {
490
+ if (error instanceof Cancel || controller.signal.aborted) {
491
+ completion = saved ? `Setup cancelled. Configuration is saved at ${path}.` : "Setup cancelled. Configuration was not saved.";
492
+ return false;
493
+ }
494
+ throw error;
495
+ } finally {
496
+ process.stdin.pause();
497
+ await setImmediate();
498
+ removeInterrupt();
499
+ await terminal.close();
500
+ process.stdout.write("\x1B[?1049l");
501
+ if (completion !== void 0) process.stdout.write(`${completion}
502
+ `);
503
+ process.removeListener("SIGINT", interrupt);
504
+ process.stdin.removeListener("end", interrupt);
505
+ }
506
+ }
507
+ __name(runMaybeCodeOnboarding, "runMaybeCodeOnboarding");
508
+ function required(value) {
509
+ return value.length > 0 && !/[\x00-\x1f\x7f]/u.test(value) || "Enter a nonempty value without control characters.";
510
+ }
511
+ __name(required, "required");
512
+ function optionalInteger(value) {
513
+ return value === "" || Number.isSafeInteger(Number(value)) && Number(value) > 0 || "Enter a positive integer, or leave empty.";
514
+ }
515
+ __name(optionalInteger, "optionalInteger");
516
+ function validURL(value) {
517
+ let url;
518
+ try {
519
+ url = new URL(value);
520
+ } catch {
521
+ return "Enter a complete HTTP or HTTPS URL.";
522
+ }
523
+ return ["https:", "http:"].includes(url.protocol) && !url.username && !url.password && !url.search && !url.hash && !/[\x00-\x20\x7f]/u.test(value) || "Use HTTP or HTTPS without credentials, query parameters, fragments, or whitespace.";
524
+ }
525
+ __name(validURL, "validURL");
526
+ export {
527
+ checkOnboardingConnection,
528
+ runMaybeCodeOnboarding
529
+ };
530
+ //# sourceMappingURL=onboarding-WQWCPYEO.js.map