veryfront 0.1.1167 → 0.1.1168

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 (65) hide show
  1. package/esm/cli/commands/build/command.d.ts +1 -0
  2. package/esm/cli/commands/build/command.d.ts.map +1 -1
  3. package/esm/cli/commands/build/command.js +5 -2
  4. package/esm/cli/commands/demo/demo.d.ts.map +1 -1
  5. package/esm/cli/commands/demo/demo.js +2 -2
  6. package/esm/cli/commands/dev/command.d.ts +2 -0
  7. package/esm/cli/commands/dev/command.d.ts.map +1 -1
  8. package/esm/cli/commands/dev/command.js +48 -53
  9. package/esm/cli/commands/dev/project-selector.d.ts +20 -0
  10. package/esm/cli/commands/dev/project-selector.d.ts.map +1 -0
  11. package/esm/cli/commands/dev/project-selector.js +50 -0
  12. package/esm/cli/commands/init/config-generator.d.ts +1 -1
  13. package/esm/cli/commands/init/config-generator.d.ts.map +1 -1
  14. package/esm/cli/commands/init/config-generator.js +2 -12
  15. package/esm/cli/commands/init/init-command.d.ts.map +1 -1
  16. package/esm/cli/commands/init/init-command.js +58 -69
  17. package/esm/cli/commands/init/interactive-wizard.d.ts +7 -0
  18. package/esm/cli/commands/init/interactive-wizard.d.ts.map +1 -1
  19. package/esm/cli/commands/init/interactive-wizard.js +15 -7
  20. package/esm/cli/commands/push/command.js +3 -3
  21. package/esm/cli/commands/up/command.js +3 -3
  22. package/esm/cli/templates/manifest.js +2 -2
  23. package/esm/cli/ui/colors.d.ts +6 -0
  24. package/esm/cli/ui/colors.d.ts.map +1 -1
  25. package/esm/cli/ui/colors.js +7 -5
  26. package/esm/cli/ui/components/banner.js +2 -2
  27. package/esm/cli/ui/dot-matrix.d.ts.map +1 -1
  28. package/esm/cli/ui/dot-matrix.js +5 -4
  29. package/esm/cli/ui/progress.d.ts +1 -0
  30. package/esm/cli/ui/progress.d.ts.map +1 -1
  31. package/esm/cli/ui/progress.js +5 -0
  32. package/esm/cli/utils/terminal-select.d.ts +7 -0
  33. package/esm/cli/utils/terminal-select.d.ts.map +1 -1
  34. package/esm/cli/utils/terminal-select.js +26 -6
  35. package/esm/deno.js +1 -1
  36. package/esm/src/build/production-build/asset-generation.js +1 -1
  37. package/esm/src/build/production-build/build/build-cleanup.js +1 -1
  38. package/esm/src/build/production-build/build/build-executor.js +4 -4
  39. package/esm/src/build/production-build/build/build-orchestrator.js +1 -1
  40. package/esm/src/build/production-build/build/build-setup.js +3 -3
  41. package/esm/src/build/production-build/build/code-splitter-orchestrator.js +2 -2
  42. package/esm/src/build/production-build/build/output-generator.js +1 -1
  43. package/esm/src/build/production-build/build/route-collector.js +3 -3
  44. package/esm/src/build/production-build/static-generation.js +1 -1
  45. package/esm/src/modules/react-loader/ssr-module-loader/cache/memory.js +1 -1
  46. package/esm/src/platform/compat/http/deno-server.d.ts.map +1 -1
  47. package/esm/src/platform/compat/http/deno-server.js +8 -2
  48. package/esm/src/security/http/config.d.ts +2 -1
  49. package/esm/src/security/http/config.d.ts.map +1 -1
  50. package/esm/src/security/http/config.js +4 -2
  51. package/esm/src/server/context/cache-invalidation.d.ts.map +1 -1
  52. package/esm/src/server/context/cache-invalidation.js +8 -2
  53. package/esm/src/server/dev-server/file-watch-setup.d.ts.map +1 -1
  54. package/esm/src/server/dev-server/file-watch-setup.js +11 -17
  55. package/esm/src/server/dev-server/server.js +3 -3
  56. package/esm/src/server/handlers/dev/scripts/hmr-scripts.d.ts +2 -2
  57. package/esm/src/server/handlers/dev/scripts/hmr-scripts.d.ts.map +1 -1
  58. package/esm/src/server/handlers/dev/scripts/hmr-scripts.js +23 -35
  59. package/esm/src/server/reload-notifier.js +1 -1
  60. package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
  61. package/esm/src/server/runtime-handler/index.js +1 -1
  62. package/esm/src/utils/bundle-manifest.js +1 -1
  63. package/esm/src/utils/version-constant.d.ts +1 -1
  64. package/esm/src/utils/version-constant.js +1 -1
  65. package/package.json +5 -5
@@ -16,11 +16,19 @@ function canRunWizard() {
16
16
  return isCliInteractive() && !(isCiEnv() || isDenoTestingEnv()) && checkIsInteractive();
17
17
  }
18
18
  export function formatWizardIntro() {
19
- return "\nLet's set up your project.";
19
+ return `\n${SETUP_COPY.intro}`;
20
20
  }
21
+ export const SETUP_COPY = {
22
+ intro: "Let's set up your project.",
23
+ location: "Create project in:",
24
+ template: "Choose a starter template:",
25
+ runtime: "Select runtime:",
26
+ git: "Initialize Git?",
27
+ };
21
28
  const SETUP_PROMPT_DISPLAY = {
22
29
  showMarker: false,
23
30
  showInstructions: false,
31
+ showDescriptions: false,
24
32
  };
25
33
  export async function runInteractiveWizard(existingName, presetRuntime) {
26
34
  if (!canRunWizard()) {
@@ -37,15 +45,15 @@ export async function runInteractiveWizard(existingName, presetRuntime) {
37
45
  let projectName = existingName ?? null;
38
46
  // Location prompt (skip when name was provided via CLI)
39
47
  if (!existingName) {
40
- const locationChoice = await select("Where should we create your project?", [
48
+ const locationChoice = await select(SETUP_COPY.location, [
41
49
  {
42
50
  value: "current",
43
- label: "Current folder",
51
+ label: "Current directory",
44
52
  description: "Use this directory",
45
53
  },
46
54
  {
47
55
  value: "new",
48
- label: "New folder",
56
+ label: "New directory",
49
57
  description: "Create a new directory",
50
58
  },
51
59
  ], 0, SETUP_PROMPT_DISPLAY);
@@ -90,7 +98,7 @@ export async function runInteractiveWizard(existingName, presetRuntime) {
90
98
  }
91
99
  }
92
100
  // Template selection
93
- const templateChoice = await select("What would you like to build?", getTemplateSelectOptions(), 0, SETUP_PROMPT_DISPLAY);
101
+ const templateChoice = await select(SETUP_COPY.template, getTemplateSelectOptions(), 0, SETUP_PROMPT_DISPLAY);
94
102
  if (templateChoice === null) {
95
103
  console.log(muted("\n Cancelled.\n"));
96
104
  return {
@@ -106,7 +114,7 @@ export async function runInteractiveWizard(existingName, presetRuntime) {
106
114
  // Runtime selection (skipped when CLI passed --runtime explicitly)
107
115
  let runtime = presetRuntime ?? "node";
108
116
  if (presetRuntime === undefined) {
109
- const runtimeChoice = await select("What runtime should this project use?", [
117
+ const runtimeChoice = await select(SETUP_COPY.runtime, [
110
118
  { value: "node", label: "Node.js", description: "Default" },
111
119
  { value: "bun", label: "Bun", description: "Fast JS runtime" },
112
120
  { value: "deno", label: "Deno", description: "Secure-by-default" },
@@ -125,7 +133,7 @@ export async function runInteractiveWizard(existingName, presetRuntime) {
125
133
  runtime = runtimeChoice;
126
134
  }
127
135
  // Git init prompt
128
- const gitChoice = await select("Initialize a git repository?", [
136
+ const gitChoice = await select(SETUP_COPY.git, [
129
137
  { value: "yes", label: "Yes", description: "Initialize git and create first commit" },
130
138
  { value: "no", label: "No", description: "Skip git initialization" },
131
139
  ], 0, SETUP_PROMPT_DISPLAY);
@@ -15,7 +15,7 @@ import { createApiClient, resolveConfigWithAuthDetails, } from "../../shared/con
15
15
  import { writeProjectLink } from "../../shared/project-link.js";
16
16
  import { ProjectSlugConflictError, reserveProjectSlug } from "../../shared/reserve-slug.js";
17
17
  import { isVerbose, logInfo, logSuccess } from "../../utils/index.js";
18
- import { brand, createNoopSpinner, createSpinner, dim } from "../../ui/index.js";
18
+ import { brand, createNoopSpinner, createSpinner } from "../../ui/index.js";
19
19
  import { withSpan } from "../../../src/observability/tracing/otlp-setup.js";
20
20
  import { createIgnoreChecker, loadIgnorePatterns } from "../../sync/ignore.js";
21
21
  import { listAllFiles } from "../pull/index.js";
@@ -217,8 +217,8 @@ function outputPushResult(projectSlug, branchName, uploaded, deleted) {
217
217
  ? `Pushed to ${target}: ${changes.join(", ")}.`
218
218
  : `${target === "main" ? "Main" : `Branch "${branchName}"`} is up to date.`);
219
219
  console.log();
220
- console.log(` ${dim("Studio:")} ${brand(urls.studio)}`);
221
- console.log(` ${dim("Preview:")} ${brand(urls.preview)}`);
220
+ console.log(` Studio: ${brand(urls.studio)}`);
221
+ console.log(` Preview: ${brand(urls.preview)}`);
222
222
  console.log();
223
223
  }
224
224
  function outputPushDryRunResult(projectSlug, branchName, projectExists, wouldUpload, wouldDelete) {
@@ -222,9 +222,9 @@ export async function upCommand(options = {}, env = getEnvironmentConfig()) {
222
222
  }
223
223
  logSuccess(`${projectSlug} is ready`);
224
224
  console.log();
225
- console.log(` ${dim("Studio:")} ${brand(urls.studio)}`);
226
- console.log(` ${dim("Preview:")} ${brand(urls.preview)}`);
225
+ console.log(` Studio: ${brand(urls.studio)}`);
226
+ console.log(` Preview: ${brand(urls.preview)}`);
227
227
  console.log();
228
- console.log(` ${dim("Deploy:")} ${brand("veryfront deploy")}`);
228
+ console.log(` Deploy: ${brand("veryfront deploy")}`);
229
229
  console.log();
230
230
  }
@@ -22,9 +22,9 @@ export default {
22
22
  },
23
23
  "ai-agent": {
24
24
  "files": {
25
- "agents/assistant.ts": "import { agent } from \"veryfront/agent\";\n\nexport default agent({\n id: \"assistant\",\n name: \"AI Agent\",\n description: \"Ask questions and use tools.\",\n system: \"You are a helpful assistant. Answer questions clearly and concisely.\",\n tools: true,\n maxSteps: 10,\n suggestions: {\n suggestions: [\n {\n type: \"prompt\",\n title: \"Plan a project\",\n prompt: \"Create a concise plan for building and launching a small web application.\",\n },\n {\n type: \"prompt\",\n title: \"Split a bill\",\n prompt:\n \"Calculate an 18% tip on $84.50, then split the total evenly among three people.\",\n },\n ],\n },\n});\n",
25
+ "agents/assistant.ts": "import { agent } from \"veryfront/agent\";\n\nexport default agent({\n id: \"assistant\",\n name: \"Assistant\",\n description: \"Turn a rough idea into a clear next move.\",\n system:\n \"Be direct and practical. Structure complex answers clearly, use tools when they improve accuracy, and state assumptions that affect the result.\",\n tools: true,\n maxSteps: 10,\n suggestions: {\n suggestions: [\n {\n type: \"prompt\",\n title: \"Shape an idea\",\n prompt: \"Turn this rough idea into a focused plan with the first three steps: \",\n },\n {\n type: \"prompt\",\n title: \"Run the numbers\",\n prompt:\n \"Calculate an 18% tip on $84.50, split the total among three people, and explain the result briefly.\",\n },\n ],\n },\n});\n",
26
26
  "app/api/ag-ui/route.ts": "import { createAgUiHandler } from \"veryfront/agent\";\n\nexport const POST = createAgUiHandler(\"assistant\");\n",
27
- "app/layout.tsx": "import \"../globals.css\";\nimport { Head } from \"veryfront/head\";\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode;\n}): React.ReactNode {\n return (\n <>\n <Head>\n <title>AI Chat</title>\n <link rel=\"icon\" href=\"/favicon.svg\" type=\"image/svg+xml\" />\n </Head>\n {children}\n </>\n );\n}\n",
27
+ "app/layout.tsx": "import \"../globals.css\";\nimport { Head } from \"veryfront/head\";\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode;\n}): React.ReactNode {\n return (\n <>\n <Head>\n <title>Assistant</title>\n <link rel=\"icon\" href=\"/favicon.svg\" type=\"image/svg+xml\" />\n </Head>\n {children}\n </>\n );\n}\n",
28
28
  "app/page.tsx": "\"use client\";\n\nimport { Chat } from \"veryfront/chat\";\n\nexport default function ChatPage(): React.JSX.Element {\n return <Chat agentId=\"assistant\" className=\"h-screen\" />;\n}\n",
29
29
  "evals/assistant.eval.ts": "import { datasets, evalAgent, metrics } from \"veryfront/eval\";\n\nexport default evalAgent({\n name: \"Assistant smoke test\",\n target: \"agent:assistant\",\n dataset: datasets.inline([\n {\n id: \"calculator\",\n input: \"Use the calculator tool to multiply 24 by 7.\",\n reference: \"168\",\n },\n ]),\n metrics: [\n metrics.answer.contains({ text: \"168\" }).gate(),\n metrics.agent.calledTool(\"calculator\").gate(),\n metrics.agent.noFailedTools().gate(),\n ],\n});\n",
30
30
  "globals.css": "@import \"tailwindcss\";\n",
@@ -16,6 +16,12 @@ export declare function setColorOverride(enabled: boolean | undefined): void;
16
16
  export declare function setTestColorLevel(level: ColorLevel | null): void;
17
17
  export declare function color(text: string, hex: string): string;
18
18
  export declare function bgColor(text: string, hex: string): string;
19
+ export declare const BRAND_RGB: {
20
+ readonly r: 238;
21
+ readonly g: 178;
22
+ readonly b: 146;
23
+ };
24
+ export declare const BRAND_TRUECOLOR: string;
19
25
  export declare const brand: (text: string) => string;
20
26
  export declare const brandBg: (text: string) => string;
21
27
  export declare const success: (text: string) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/colors.ts"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;AAqC7D,wBAAgB,aAAa,IAAI,UAAU,CAG1C;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAuCD,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAEhE;AA4DD,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGzD;AAUD,eAAO,MAAM,KAAK,SARoC,MAAM,KAAK,MAQ3B,CAAC;AACvC,eAAO,MAAM,OAAO,SALoC,MAAM,KAAK,MAKzB,CAAC;AAE3C,eAAO,MAAM,OAAO,SAXkC,MAAM,KAAK,MAW1B,CAAC;AACxC,eAAO,MAAM,KAAK,SAZoC,MAAM,KAAK,MAY5B,CAAC;AACtC,eAAO,MAAM,OAAO,SAbkC,MAAM,KAAK,MAa1B,CAAC;AACxC,eAAO,MAAM,KAAK,SAdoC,MAAM,KAAK,MAc1B,CAAC;AACxC,eAAO,MAAM,IAAI,SAfqC,MAAM,KAAK,MAe5B,CAAC;AACtC,eAAO,MAAM,KAAK,SAhBoC,MAAM,KAAK,MAgBrC,CAAC;AAC7B,eAAO,MAAM,MAAM,SAjBmC,MAAM,KAAK,MAiBpC,CAAC;AAC9B,eAAO,MAAM,GAAG,SAlBsC,MAAM,KAAK,MAkBzC,CAAC;AAOzB,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,WAAwB,CAAC;AAC1D,eAAO,MAAM,GAAG,GAAI,MAAM,MAAM,WAAwB,CAAC;AACzD,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,WAAwB,CAAC;AAC5D,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,WAAwB,CAAC;AAE/D,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,WAAsB,CAAC;AAC7D,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,WAAwB,CAAC;AACjE,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,WAAsB,CAAC;AAE7D,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,CAAC;AAE1B;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,SAAI,GAAG,MAAM,CAuB1E"}
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/colors.ts"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;AAqC7D,wBAAgB,aAAa,IAAI,UAAU,CAG1C;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAuCD,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAEhE;AA4DD,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGzD;AAUD,eAAO,MAAM,SAAS;;;;CAAsC,CAAC;AAC7D,eAAO,MAAM,eAAe,QAA8D,CAAC;AAE3F,eAAO,MAAM,KAAK,SAXoC,MAAM,KAAK,MAWF,CAAC;AAChE,eAAO,MAAM,OAAO,SARoC,MAAM,KAAK,MAQA,CAAC;AAEpE,eAAO,MAAM,OAAO,SAdkC,MAAM,KAAK,MAc1B,CAAC;AACxC,eAAO,MAAM,KAAK,SAfoC,MAAM,KAAK,MAe5B,CAAC;AACtC,eAAO,MAAM,OAAO,SAhBkC,MAAM,KAAK,MAgB1B,CAAC;AACxC,eAAO,MAAM,KAAK,SAjBoC,MAAM,KAAK,MAiB1B,CAAC;AACxC,eAAO,MAAM,IAAI,SAlBqC,MAAM,KAAK,MAkB5B,CAAC;AACtC,eAAO,MAAM,KAAK,SAnBoC,MAAM,KAAK,MAmBrC,CAAC;AAC7B,eAAO,MAAM,MAAM,SApBmC,MAAM,KAAK,MAoBpC,CAAC;AAC9B,eAAO,MAAM,GAAG,SArBsC,MAAM,KAAK,MAqBzC,CAAC;AAOzB,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,WAAwB,CAAC;AAC1D,eAAO,MAAM,GAAG,GAAI,MAAM,MAAM,WAAwB,CAAC;AACzD,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,WAAwB,CAAC;AAC5D,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,WAAwB,CAAC;AAE/D,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,WAAsB,CAAC;AAC7D,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,WAAwB,CAAC;AACjE,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,WAAsB,CAAC;AAE7D,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,CAAC;AAE1B;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,SAAI,GAAG,MAAM,CAuB1E"}
@@ -161,8 +161,10 @@ function rgb(r, g, b) {
161
161
  function bgRgb(r, g, b) {
162
162
  return (text) => applyColor(text, r, g, b, true);
163
163
  }
164
- export const brand = rgb(252, 143, 93);
165
- export const brandBg = bgRgb(252, 143, 93);
164
+ export const BRAND_RGB = { r: 238, g: 178, b: 146 };
165
+ export const BRAND_TRUECOLOR = `${ESC}[38;2;${BRAND_RGB.r};${BRAND_RGB.g};${BRAND_RGB.b}m`;
166
+ export const brand = rgb(BRAND_RGB.r, BRAND_RGB.g, BRAND_RGB.b);
167
+ export const brandBg = bgRgb(BRAND_RGB.r, BRAND_RGB.g, BRAND_RGB.b);
166
168
  export const success = rgb(34, 197, 94);
167
169
  export const error = rgb(239, 68, 68);
168
170
  export const warning = rgb(234, 179, 8);
@@ -192,9 +194,9 @@ export { RESET as reset };
192
194
  * @returns Text with shimmer effect applied
193
195
  */
194
196
  export function shimmer(text, frame, waveWidth = 3) {
195
- const bright = (char) => applyColor(char, 255, 180, 140, false);
196
- const normal = (char) => applyColor(char, 252, 143, 93, false);
197
- const dimmed = (char) => applyColor(char, 180, 100, 65, false);
197
+ const bright = (char) => applyColor(char, 255, 211, 188, false);
198
+ const normal = (char) => applyColor(char, BRAND_RGB.r, BRAND_RGB.g, BRAND_RGB.b, false);
199
+ const dimmed = (char) => applyColor(char, 180, 120, 90, false);
198
200
  const len = text.length;
199
201
  const wavePos = frame % (len + waveWidth * 2);
200
202
  let result = "";
@@ -1,6 +1,6 @@
1
1
  import { RESET } from "../ansi.js";
2
2
  import { box } from "../box.js";
3
- import { brand, dim, shouldUseColor } from "../colors.js";
3
+ import { brand, BRAND_TRUECOLOR, dim, shouldUseColor } from "../colors.js";
4
4
  import { AGENT_FACE } from "../dot-matrix.js";
5
5
  import { maxLineWidth, pad, repeat } from "../layout.js";
6
6
  function formatInfoLines(info, styleValue = true) {
@@ -16,7 +16,7 @@ function formatInfoLines(info, styleValue = true) {
16
16
  }
17
17
  function renderLogo() {
18
18
  const useColor = shouldUseColor();
19
- const litColor = useColor ? "\x1b[38;2;252;143;93m" : "";
19
+ const litColor = useColor ? BRAND_TRUECOLOR : "";
20
20
  const offColor = useColor ? "\x1b[38;5;240m" : "";
21
21
  return AGENT_FACE.map((row) => row.map((dot) => (dot === 1 ? `${litColor}●${RESET}` : `${offColor}○${RESET}`)).join(" "));
22
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dot-matrix.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/dot-matrix.ts"],"names":[],"mappings":"AAAA;;;;;oBAKoB;AAIpB,eAAO,MAAM,UAAU,EAAE,MAAM,EAAE,EAQhC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAiB9C,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAoGD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAE3F;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,MAAM,EAAE,EAAE,CAWnF;AAED,wBAAgB,qBAAqB,CAAC,UAAU,SAAI,GAAG,MAAM,EAAE,EAAE,EAAE,CAElE;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAEnE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAEhG;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAER;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAe;gBAExB,OAAO,GAAE,gBAAqB;IAM1C,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,MAAM,IAAI,MAAM;IAIhB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM;IAI3C,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,aAAa;IAIrB,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,UAAU,SAAK,GAAG,IAAI;IAerE,oBAAoB,CAClB,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAChC,UAAU,SAAK,GACd,IAAI;IAeP,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,UAAU,SAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B5F,kBAAkB,CAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAChC,UAAU,SAAK,GACd,OAAO,CAAC,IAAI,CAAC;IA2BhB,WAAW,IAAI,IAAI;IAInB,IAAI,IAAI,IAAI;IAMZ,KAAK,IAAI,IAAI;IAIb,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI;CAGtC;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAEjF;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
1
+ {"version":3,"file":"dot-matrix.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/dot-matrix.ts"],"names":[],"mappings":"AAAA;;;;;oBAKoB;AAKpB,eAAO,MAAM,UAAU,EAAE,MAAM,EAAE,EAQhC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAiB9C,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAoGD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAE3F;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,MAAM,EAAE,EAAE,CAWnF;AAED,wBAAgB,qBAAqB,CAAC,UAAU,SAAI,GAAG,MAAM,EAAE,EAAE,EAAE,CAElE;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAEnE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAEhG;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAER;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAe;gBAExB,OAAO,GAAE,gBAAqB;IAM1C,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,MAAM,IAAI,MAAM;IAIhB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM;IAI3C,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,aAAa;IAIrB,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,UAAU,SAAK,GAAG,IAAI;IAerE,oBAAoB,CAClB,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAChC,UAAU,SAAK,GACd,IAAI;IAeP,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,UAAU,SAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B5F,kBAAkB,CAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAChC,UAAU,SAAK,GACd,OAAO,CAAC,IAAI,CAAC;IA2BhB,WAAW,IAAI,IAAI;IAInB,IAAI,IAAI,IAAI;IAMZ,KAAK,IAAI,IAAI;IAIb,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI;CAGtC;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAEjF;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -5,6 +5,7 @@
5
5
  * Used for the Veryfront logo in CLI experiences.
6
6
  ******************/
7
7
  import { RESET } from "./ansi.js";
8
+ import { BRAND_TRUECOLOR } from "./colors.js";
8
9
  export const AGENT_FACE = [
9
10
  [0, 0, 0, 0, 0, 0, 0],
10
11
  [0, 1, 1, 1, 0, 0, 0],
@@ -47,10 +48,10 @@ const COMPACT_OPTIONS = {
47
48
  spacing: " ",
48
49
  };
49
50
  const SPIN_COLORS = {
50
- bright: "\x1b[38;2;255;165;120m",
51
- orange: "\x1b[38;2;252;143;93m",
52
- mid: "\x1b[38;2;200;110;70m",
53
- dim: "\x1b[38;2;140;80;50m",
51
+ bright: "\x1b[38;2;255;211;188m",
52
+ orange: BRAND_TRUECOLOR,
53
+ mid: "\x1b[38;2;196;133;100m",
54
+ dim: "\x1b[38;2;140;91;68m",
54
55
  };
55
56
  function resolveOptions(options) {
56
57
  if (options.compact)
@@ -27,6 +27,7 @@ export interface SpinnerController {
27
27
  stop: () => void;
28
28
  }
29
29
  export declare function createNoopSpinner(): SpinnerController;
30
+ export declare function createTransientSpinner(text: string): SpinnerController;
30
31
  export declare function createSpinner(text: string): SpinnerController;
31
32
  export declare function inlineSpinner(text: string, frame?: number): string;
32
33
  export declare class TaskList {
@@ -1 +1 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/progress.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,SAAI,GAAG,MAAM,CAkB/D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,YAAY,SAAI,GAAG,MAAM,CAEnE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAYjD;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CAClB,GACL,MAAM,CA0BR;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAK3E;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAgB,iBAAiB,IAAI,iBAAiB,CAOrD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAuD7D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,CAE7D;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAA+C;IAE/D,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAM1B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ7B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOzB,MAAM,IAAI,MAAM;IAIhB,cAAc,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAYvD,aAAa,IAAI,IAAI;CAKtB"}
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/progress.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,SAAI,GAAG,MAAM,CAkB/D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,YAAY,SAAI,GAAG,MAAM,CAEnE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAYjD;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CAClB,GACL,MAAM,CA0BR;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAK3E;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAgB,iBAAiB,IAAI,iBAAiB,CAOrD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAGtE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAuD7D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,CAE7D;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAA+C;IAE/D,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAM1B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ7B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOzB,MAAM,IAAI,MAAM;IAIhB,cAAc,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAYvD,aAAa,IAAI,IAAI;CAKtB"}
@@ -83,6 +83,11 @@ export function createNoopSpinner() {
83
83
  stop() { },
84
84
  };
85
85
  }
86
+ export function createTransientSpinner(text) {
87
+ if (!isTTY() || isAnimationDisabled())
88
+ return createNoopSpinner();
89
+ return createSpinner(text);
90
+ }
86
91
  export function createSpinner(text) {
87
92
  if (!isTTY() || isAnimationDisabled()) {
88
93
  const print = (prefix, msg) => {
@@ -10,8 +10,15 @@ export interface SelectOption {
10
10
  export interface PromptDisplayOptions {
11
11
  showMarker?: boolean;
12
12
  showInstructions?: boolean;
13
+ showDescriptions?: boolean;
14
+ clearOnCancel?: boolean;
15
+ interruptOnCtrlC?: boolean;
16
+ }
17
+ export declare class PromptInterruptedError extends Error {
18
+ name: string;
13
19
  }
14
20
  export declare function formatPrompt(question: string, showMarker?: boolean, instructions?: string): [string, string];
21
+ export declare function formatSelectOption(option: SelectOption, selected: boolean, showDescription?: boolean): string;
15
22
  /**
16
23
  * Single-select with arrow key navigation
17
24
  */
@@ -1 +1 @@
1
- {"version":3,"file":"terminal-select.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/terminal-select.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAcD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,UAAU,UAAQ,EAClB,YAAY,SAAgD,GAC3D,CAAC,MAAM,EAAE,MAAM,CAAC,CAMlB;AAED;;GAEG;AACH,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,EAAE,EACvB,YAAY,SAAI,EAChB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyDxB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,EAAE,EACvB,WAAW,GAAE,MAAM,EAAO,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC,CAwEnB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,YAAY,SAAK,EACjB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuFxB"}
1
+ {"version":3,"file":"terminal-select.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/terminal-select.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IACtC,IAAI,SAA4B;CAC1C;AAeD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,UAAU,UAAQ,EAClB,YAAY,SAAgD,GAC3D,CAAC,MAAM,EAAE,MAAM,CAAC,CAMlB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,OAAO,EACjB,eAAe,UAAO,GACrB,MAAM,CAMR;AAED;;GAEG;AACH,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,EAAE,EACvB,YAAY,SAAI,EAChB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyExB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,EAAE,EACvB,WAAW,GAAE,MAAM,EAAO,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC,CAwEnB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,YAAY,SAAK,EACjB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuFxB"}
@@ -6,11 +6,15 @@ import { brand, muted } from "../ui/index.js";
6
6
  import { writeStdout } from "../../src/platform/index.js";
7
7
  import { isDeno } from "../../src/platform/index.js";
8
8
  import { getStdinReader, setRawMode } from "../../src/platform/index.js";
9
+ export class PromptInterruptedError extends Error {
10
+ name = "PromptInterruptedError";
11
+ }
9
12
  // ANSI escape codes
10
13
  const CLEAR_LINE = "\x1b[2K";
11
14
  const MOVE_UP = "\x1b[1A";
12
15
  const HIDE_CURSOR = "\x1b[?25l";
13
16
  const SHOW_CURSOR = "\x1b[?25h";
17
+ const PROMPT_INTERRUPTED = Symbol("prompt-interrupted");
14
18
  function clearOptions(count) {
15
19
  for (let i = 0; i < count; i++) {
16
20
  writeStdout(MOVE_UP + CLEAR_LINE);
@@ -23,6 +27,13 @@ export function formatPrompt(question, showMarker = false, instructions = "Use a
23
27
  muted(` ${instructions}`),
24
28
  ];
25
29
  }
30
+ export function formatSelectOption(option, selected, showDescription = true) {
31
+ const marker = selected ? brand("●") : " ";
32
+ const description = showDescription && option.description
33
+ ? muted(` - ${option.description}`)
34
+ : "";
35
+ return ` ${marker} ${option.label}${description}`;
36
+ }
26
37
  /**
27
38
  * Single-select with arrow key navigation
28
39
  */
@@ -39,11 +50,7 @@ export async function select(question, options, defaultIndex = 0, display = {})
39
50
  const opt = options[i];
40
51
  if (!opt)
41
52
  continue;
42
- const isSelected = i === selectedIndex;
43
- const prefix = isSelected ? brand("❯") : " ";
44
- const label = isSelected ? brand(opt.label) : opt.label;
45
- const desc = opt.description ? muted(` - ${opt.description}`) : "";
46
- console.log(` ${prefix} ${label}${desc}`);
53
+ console.log(formatSelectOption(opt, i === selectedIndex, display.showDescriptions ?? true));
47
54
  }
48
55
  }
49
56
  writeStdout(HIDE_CURSOR);
@@ -70,12 +77,25 @@ export async function select(question, options, defaultIndex = 0, display = {})
70
77
  return options[selectedIndex]?.value ?? null;
71
78
  if (key === "escape")
72
79
  return null;
80
+ if (key === "ctrl-c") {
81
+ return display.interruptOnCtrlC ? PROMPT_INTERRUPTED : null;
82
+ }
73
83
  return undefined;
74
84
  });
75
85
  clearOptions(options.length);
86
+ if (result === PROMPT_INTERRUPTED) {
87
+ if (display.clearOnCancel) {
88
+ clearOptions((display.showInstructions ?? true) ? 4 : 3);
89
+ }
90
+ throw new PromptInterruptedError();
91
+ }
76
92
  const selected = options[selectedIndex];
77
- if (selected)
93
+ if (result === null && display.clearOnCancel) {
94
+ clearOptions((display.showInstructions ?? true) ? 4 : 3);
95
+ }
96
+ else if (selected) {
78
97
  console.log(` ✓ ${selected.label}`);
98
+ }
79
99
  return result;
80
100
  }
81
101
  finally {
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.1167",
3
+ "version": "0.1.1168",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "minimumDependencyAge": {
@@ -126,7 +126,7 @@ export async function copyStaticAssets(adapter, projectDir, outputDir, dryRun =
126
126
  throw error;
127
127
  }
128
128
  }
129
- logger.info(`Copied ${stats.assets} static assets`);
129
+ logger.debug(`Copied ${stats.assets} static assets`);
130
130
  return stats;
131
131
  }
132
132
  /**
@@ -21,7 +21,7 @@ export async function performCleanup(renderer) {
21
21
  await cleanupCaches();
22
22
  }
23
23
  export function logBuildCompletion(stats) {
24
- logger.info("Build complete!", {
24
+ logger.debug("Build complete!", {
25
25
  pages: stats.pages,
26
26
  chunks: stats.chunks,
27
27
  assets: stats.assets,
@@ -2,12 +2,12 @@ import { serverLogger } from "../../../utils/index.js";
2
2
  import { buildAppRoutes, buildPagesRoutes } from "../static-generation.js";
3
3
  const logger = serverLogger.component("build");
4
4
  export async function executeBuild(pagesRoutes, appRoutes, options) {
5
- logger.info(`[BUILD] executeBuild: ${pagesRoutes.length} pages routes, ${appRoutes.length} app routes`);
6
- logger.info("Building pages...");
5
+ logger.debug(`[BUILD] executeBuild: ${pagesRoutes.length} pages routes, ${appRoutes.length} app routes`);
6
+ logger.debug("Building pages...");
7
7
  const pagesStats = await buildPagesRoutes(pagesRoutes, options);
8
- logger.info(`pagesStats: ${pagesStats.pages} pages built`);
8
+ logger.debug(`pagesStats: ${pagesStats.pages} pages built`);
9
9
  const appStats = await buildAppRoutes(appRoutes, options);
10
- logger.info(`appStats: ${appStats.pages} pages built`);
10
+ logger.debug(`appStats: ${appStats.pages} pages built`);
11
11
  return {
12
12
  pages: pagesStats.pages + appStats.pages,
13
13
  totalSize: pagesStats.totalSize + appStats.totalSize,
@@ -27,7 +27,7 @@ export function buildProduction(options) {
27
27
  message: `Invalid project directory: ${normalizedOptions.projectDir} does not exist`,
28
28
  }));
29
29
  }
30
- logger.info("Starting production build", options);
30
+ logger.debug("Starting production build", options);
31
31
  const context = await withSpan("build.initializeContext", () => initializeBuildContext(options), {});
32
32
  try {
33
33
  const outputDir = normalizedOptions.outputDir ?? "";
@@ -3,10 +3,10 @@ import { join } from "../../../platform/compat/path/index.js";
3
3
  import { handleErrorWithFallback } from "../../../errors/index.js";
4
4
  import { createFileSystem } from "../../../platform/compat/fs.js";
5
5
  export async function setupBuildDirectories(adapter, outputDir, dryRun) {
6
- logger.info("Setting up build directories...");
6
+ logger.debug("Setting up build directories...");
7
7
  await handleErrorWithFallback(() => adapter.fs.remove(outputDir, { recursive: true }), undefined, logger);
8
8
  if (dryRun) {
9
- logger.info("Build directories ready");
9
+ logger.debug("Build directories ready");
10
10
  return;
11
11
  }
12
12
  const fs = createFileSystem();
@@ -29,5 +29,5 @@ export async function setupBuildDirectories(adapter, outputDir, dryRun) {
29
29
  throw error;
30
30
  }
31
31
  }
32
- logger.info("Build directories ready");
32
+ logger.debug("Build directories ready");
33
33
  }
@@ -5,7 +5,7 @@ export async function runCodeSplitting(projectDir, outputDir, routes, enableSpli
5
5
  if (!enableSplitting || dryRun || routes.length === 0) {
6
6
  return { manifest: null, chunks: 0 };
7
7
  }
8
- logger.info("Running code splitter...");
8
+ logger.debug("Running code splitter...");
9
9
  const splitter = createCodeSplitter({
10
10
  projectDir,
11
11
  outDir: join(outputDir, "_veryfront/chunks"),
@@ -20,6 +20,6 @@ export async function runCodeSplitting(projectDir, outputDir, routes, enableSpli
20
20
  });
21
21
  const { entries, shared, manifest } = await splitter.split();
22
22
  const chunks = entries.size + shared.size;
23
- logger.info(`Created ${chunks} chunks`);
23
+ logger.debug(`Created ${chunks} chunks`);
24
24
  return { manifest, chunks };
25
25
  }
@@ -20,7 +20,7 @@ import { generateManifest, generateRedirects } from "../manifest.js";
20
20
  * Generate client runtime scripts
21
21
  */
22
22
  export async function generateClientScripts(adapter, outputDir, dryRun) {
23
- logger.info("Copying client scripts...");
23
+ logger.debug("Copying client scripts...");
24
24
  if (dryRun)
25
25
  return;
26
26
  await writeOutputFile(adapter, join(outputDir, "_veryfront/app.js"), generateAppModule());
@@ -11,16 +11,16 @@ import { collectAppRoutes, collectPagesRoutes } from "../../../server/build-rout
11
11
  const logger = serverLogger.component("build");
12
12
  export async function collectAllRoutes(adapter, projectDir, ssg, include, exclude, config) {
13
13
  if (!ssg) {
14
- logger.info("SSG disabled, skipping route collection");
14
+ logger.debug("SSG disabled, skipping route collection");
15
15
  return { pages: [], app: [] };
16
16
  }
17
17
  const [pages, app] = await Promise.all([
18
18
  collectPagesRoutes(adapter, projectDir, include, exclude, config?.directories?.pages ?? "pages"),
19
19
  collectAppRoutes(adapter, projectDir, include, exclude, config?.directories?.app ?? "app"),
20
20
  ]);
21
- logger.info(`Collected routes: ${pages.length} pages, ${app.length} app`);
21
+ logger.debug(`Collected routes: ${pages.length} pages, ${app.length} app`);
22
22
  if (app.length > 0) {
23
- logger.info(`App routes: ${app.map((r) => r.path).join(", ")}`);
23
+ logger.debug(`App routes: ${app.map((r) => r.path).join(", ")}`);
24
24
  }
25
25
  return { pages, app };
26
26
  }
@@ -223,7 +223,7 @@ export async function buildAppRoutes(appRoutes, options) {
223
223
  const stats = { pages: 0, totalSize: 0, ssgPaths: [] };
224
224
  if (appRoutes.length === 0)
225
225
  return stats;
226
- logger.info("Building App Router static pages...");
226
+ logger.debug("Building App Router static pages...");
227
227
  const stylesheetHref = await traceStep("app:styles", () => prepareAppRouteStylesheet(options));
228
228
  for (const route of appRoutes) {
229
229
  try {
@@ -242,7 +242,7 @@ export function clearSSRModuleCache() {
242
242
  // changes (e.g. in tests) take effect.
243
243
  _transformSemaphore = undefined;
244
244
  resetCachedTransformLimits();
245
- logger.info("Global cache cleared", {
245
+ logger.debug("Global cache cleared", {
246
246
  modulesCleared: moduleCount,
247
247
  failedComponentsCleared: failedCount,
248
248
  transformSlotsCleared: transformSlotsCount,
@@ -1 +1 @@
1
- {"version":3,"file":"deno-server.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/compat/http/deno-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAIpE,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,eAAe,CAAC,CAAkB;IAEpC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAIvB"}
1
+ {"version":3,"file":"deno-server.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/compat/http/deno-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAIpE,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,eAAe,CAAC,CAAkB;IAEpC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAIvB"}
@@ -6,7 +6,6 @@ export class DenoHttpServer {
6
6
  const { port = 8000, hostname = LOCALHOST.IPV4, signal, onListen } = options;
7
7
  this.abortController = new AbortController();
8
8
  const serveSignal = signal ?? this.abortController.signal;
9
- onListen?.({ hostname, port });
10
9
  // Access native Deno.serve via `self` to bypass dnt shim transform.
11
10
  const nativeDeno = getNativeDeno();
12
11
  // Access native Response via `self` to bypass dnt shim transform.
@@ -17,7 +16,14 @@ export class DenoHttpServer {
17
16
  const response = await handler(req);
18
17
  return toNativeResponse(response, NativeResponse);
19
18
  };
20
- const httpServer = nativeDeno.serve({ port, hostname, signal: serveSignal }, wrappedHandler);
19
+ const httpServer = nativeDeno.serve({
20
+ port,
21
+ hostname,
22
+ signal: serveSignal,
23
+ onListen: ({ hostname: boundHostname, port: boundPort }) => {
24
+ onListen?.({ hostname: boundHostname, port: boundPort });
25
+ },
26
+ }, wrappedHandler);
21
27
  // Block until the server stops (e.g. via signal abort).
22
28
  // Deno.serve() returns synchronously; without awaiting .finished
23
29
  // the event loop drains and the process exits in compiled binaries.
@@ -5,11 +5,12 @@ export declare class SecurityConfigLoader {
5
5
  private projectDir;
6
6
  private adapter;
7
7
  private configOverride?;
8
+ private productionRuntime;
8
9
  private securityConfig;
9
10
  private cspUserHeader;
10
11
  private isLoaded;
11
12
  private loadPromise;
12
- constructor(projectDir: string, adapter: RuntimeAdapter, configOverride?: VeryfrontConfig | undefined);
13
+ constructor(projectDir: string, adapter: RuntimeAdapter, configOverride?: VeryfrontConfig | undefined, productionRuntime?: boolean);
13
14
  ensureLoaded(): Promise<void>;
14
15
  private load;
15
16
  private applyConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/src/security/http/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQ7D,qBAAa,oBAAoB;IAO7B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc,CAAC;IARzB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAA8B;gBAGvC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,eAAe,YAAA;IAGpC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAkBrB,IAAI;IAKlB,OAAO,CAAC,WAAW;IAwBnB,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAI1C,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC,aAAa,IAAI,cAAc,CAAC,MAAM,CAAC;IAIvC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,GAAE,MAAwB,GAAG,MAAM;IAIjE,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IASnE,KAAK,IAAI,IAAI;CAMd"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/src/security/http/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQ7D,qBAAa,oBAAoB;IAO7B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,iBAAiB;IAT3B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAA8B;gBAGvC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,eAAe,YAAA,EAChC,iBAAiB,UAAQ;IAG7B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAkBrB,IAAI;IAKlB,OAAO,CAAC,WAAW;IAwBnB,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAI1C,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC,aAAa,IAAI,cAAc,CAAC,MAAM,CAAC;IAIvC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,GAAE,MAAwB,GAAG,MAAM;IAIjE,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IASnE,KAAK,IAAI,IAAI;CAMd"}
@@ -7,14 +7,16 @@ export class SecurityConfigLoader {
7
7
  projectDir;
8
8
  adapter;
9
9
  configOverride;
10
+ productionRuntime;
10
11
  securityConfig = null;
11
12
  cspUserHeader = null;
12
13
  isLoaded = false;
13
14
  loadPromise = null;
14
- constructor(projectDir, adapter, configOverride) {
15
+ constructor(projectDir, adapter, configOverride, productionRuntime = false) {
15
16
  this.projectDir = projectDir;
16
17
  this.adapter = adapter;
17
18
  this.configOverride = configOverride;
19
+ this.productionRuntime = productionRuntime;
18
20
  }
19
21
  async ensureLoaded() {
20
22
  if (this.isLoaded)
@@ -41,7 +43,7 @@ export class SecurityConfigLoader {
41
43
  }
42
44
  applyConfig(cfg) {
43
45
  const security = cfg?.security ? { ...cfg.security } : {};
44
- const production = isProduction();
46
+ const production = this.productionRuntime || isProduction();
45
47
  if (security.headers)
46
48
  security.headers = { ...security.headers };
47
49
  security.cors ??= false;
@@ -1 +1 @@
1
- {"version":3,"file":"cache-invalidation.d.ts","sourceRoot":"","sources":["../../../../src/src/server/context/cache-invalidation.ts"],"names":[],"mappings":"AAuBA,UAAU,mBAAmB;IAC3B,qEAAqE;IACrE,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC,CA0Hf"}
1
+ {"version":3,"file":"cache-invalidation.d.ts","sourceRoot":"","sources":["../../../../src/src/server/context/cache-invalidation.ts"],"names":[],"mappings":"AAwBA,UAAU,mBAAmB;IAC3B,qEAAqE;IACrE,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC,CA2Hf"}
@@ -1,4 +1,5 @@
1
1
  import { serverLogger } from "../../utils/index.js";
2
+ import { isProduction } from "../../platform/environment.js";
2
3
  import { clearModulePathCache, invalidateModulePaths, } from "../../transforms/mdx/esm-module-loader/index.js";
3
4
  import { clearModuleCacheForProject } from "../../cache/module-cache.js";
4
5
  import { clearSSRModuleCache, clearSSRModuleCacheForProject, } from "../../modules/react-loader/ssr-module-loader/index.js";
@@ -65,11 +66,16 @@ export async function invalidateProjectCaches(projectSlug, changedPaths, options
65
66
  clearRouterDetectionCache();
66
67
  }
67
68
  if (!hasRealProjectSlug) {
68
- logger.error("[CacheInvalidation] Skipping cache invalidation — no project identity available", {
69
+ const message = "[CacheInvalidation] Skipping cache invalidation — no project identity available";
70
+ const context = {
69
71
  projectSlug,
70
72
  reason: "projectSlug is 'preview' and no projectId provided",
71
73
  action: "skipped_global_wipe",
72
- });
74
+ };
75
+ if (isProduction())
76
+ logger.error(message, context);
77
+ else
78
+ logger.debug(message, context);
73
79
  // Previously called clearRendererCaches() which wiped ALL projects' caches on this pod.
74
80
  // This was a multi-tenant blast radius risk: one preview deployment could nuke every tenant's cache.
75
81
  // Now we skip the invalidation entirely. The stale cache will be naturally evicted by TTL