veryfront 0.1.1237 → 0.1.1238

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 (37) hide show
  1. package/esm/cli/commands/build/error-handler.d.ts.map +1 -1
  2. package/esm/cli/commands/build/error-handler.js +41 -3
  3. package/esm/cli/commands/build/handler.d.ts.map +1 -1
  4. package/esm/cli/commands/build/handler.js +1 -1
  5. package/esm/cli/commands/dev/command.d.ts.map +1 -1
  6. package/esm/cli/commands/dev/command.js +14 -1
  7. package/esm/cli/commands/dev/inference-status.d.ts +6 -0
  8. package/esm/cli/commands/dev/inference-status.d.ts.map +1 -1
  9. package/esm/cli/commands/dev/inference-status.js +14 -2
  10. package/esm/cli/commands/generate/command.d.ts.map +1 -1
  11. package/esm/cli/commands/generate/command.js +62 -0
  12. package/esm/cli/shared/args.d.ts +5 -1
  13. package/esm/cli/shared/args.d.ts.map +1 -1
  14. package/esm/cli/shared/args.js +41 -1
  15. package/esm/deno.js +1 -1
  16. package/esm/src/agent/conversation/run-chunk-mirror.d.ts.map +1 -1
  17. package/esm/src/agent/conversation/run-chunk-mirror.js +14 -2
  18. package/esm/src/config/loader.d.ts.map +1 -1
  19. package/esm/src/config/loader.js +37 -1
  20. package/esm/src/html/hydration-script-builder/hydration-runtime.generated.js +1 -1
  21. package/esm/src/observability/application-errors.d.ts.map +1 -1
  22. package/esm/src/observability/application-errors.js +9 -1
  23. package/esm/src/platform/compat/http/pinned-fetch.d.ts +1 -1
  24. package/esm/src/rendering/orchestrator/css-candidate-manifest.d.ts.map +1 -1
  25. package/esm/src/rendering/orchestrator/css-candidate-manifest.js +30 -1
  26. package/esm/src/security/sandbox/worker-pool.d.ts.map +1 -1
  27. package/esm/src/security/sandbox/worker-pool.js +6 -1
  28. package/esm/src/server/bootstrap.d.ts.map +1 -1
  29. package/esm/src/server/bootstrap.js +6 -0
  30. package/esm/src/server/project-env/fetcher.d.ts.map +1 -1
  31. package/esm/src/server/project-env/fetcher.js +11 -11
  32. package/esm/src/server/project-env/internal-authorization.d.ts +7 -0
  33. package/esm/src/server/project-env/internal-authorization.d.ts.map +1 -0
  34. package/esm/src/server/project-env/internal-authorization.js +32 -0
  35. package/esm/src/utils/version-constant.d.ts +1 -1
  36. package/esm/src/utils/version-constant.js +1 -1
  37. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/build/error-handler.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAgBtD"}
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/build/error-handler.ts"],"names":[],"mappings":"AAqCA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAyBtD"}
@@ -1,14 +1,52 @@
1
1
  import { brand, dim } from "../../ui/index.js";
2
2
  import { cliLogger, isVerbose, logError } from "../../utils/index.js";
3
+ import { sanitizeTerminalDiagnosticText } from "../../../src/errors/safe-diagnostics.js";
3
4
  import { exit, getStdout } from "../../../src/platform/index.js";
5
+ const STACK_FRAME_WITH_PARENS = /^(\s*at\s+.*\()(file:\/\/\/[^)\r\n]+|\/[^)\r\n]+|[A-Za-z]:[\\/][^)\r\n]+)(:\d+:\d+\).*)$/;
6
+ const STACK_FRAME_DIRECT = /^(\s*at\s+(?:async\s+)?)(file:\/\/\/[^\r\n]+|\/[^\r\n]+|[A-Za-z]:[\\/][^\r\n]+)(:\d+:\d+.*)$/;
7
+ function sanitizeStackFrame(line) {
8
+ const sanitized = sanitizeTerminalDiagnosticText(line);
9
+ const match = STACK_FRAME_WITH_PARENS.exec(sanitized) ??
10
+ STACK_FRAME_DIRECT.exec(sanitized);
11
+ if (!match)
12
+ return sanitized;
13
+ const sourceName = match[2]
14
+ .replace(/^file:\/\/\//, "")
15
+ .replaceAll("\\", "/")
16
+ .split("/")
17
+ .at(-1) || "source";
18
+ return `${match[1]}<REDACTED>/${sourceName}${match[3]}`;
19
+ }
20
+ function deepestErrorCause(error) {
21
+ const seen = new Set();
22
+ let current = error;
23
+ for (let depth = 0; depth < 8; depth++) {
24
+ if (seen.has(current))
25
+ break;
26
+ seen.add(current);
27
+ const cause = Object.getOwnPropertyDescriptor(current, "cause");
28
+ if (!cause || !("value" in cause) || !(cause.value instanceof Error))
29
+ break;
30
+ current = cause.value;
31
+ }
32
+ return current;
33
+ }
4
34
  export function handleBuildError(error) {
5
35
  getStdout()?.write?.(`\r${" ".repeat(80)}\r`);
6
36
  const message = error instanceof Error ? error.message : String(error);
7
37
  console.log();
8
38
  logError(message);
9
- if (isVerbose() && error instanceof Error && error.stack) {
10
- cliLogger.error(`\n${dim("Stack trace:")}`);
11
- cliLogger.error(dim(error.stack.split("\n").slice(1, 5).join("\n")));
39
+ const diagnosticError = error instanceof Error ? deepestErrorCause(error) : undefined;
40
+ if (isVerbose() && diagnosticError?.stack) {
41
+ const isUnderlyingCause = diagnosticError !== error;
42
+ cliLogger.error(`\n${dim(isUnderlyingCause ? "Underlying stack trace:" : "Stack trace:")}`);
43
+ const firstLine = isUnderlyingCause ? 0 : 1;
44
+ const stack = diagnosticError.stack.split("\n").slice(firstLine, 5)
45
+ .map(sanitizeStackFrame).join("\n");
46
+ cliLogger.error(dim(stack));
47
+ }
48
+ else if (diagnosticError && diagnosticError !== error) {
49
+ cliLogger.error(` Run ${brand("veryfront build --verbose")} to show the underlying stack trace.`);
12
50
  }
13
51
  cliLogger.error(` Run ${brand("veryfront build --help")} for usage.`);
14
52
  cliLogger.error("");
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/build/handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAQ3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;GAe9B,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;GAAiC,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;AAE9E;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;GAazB,CAAC;AAEH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BxE"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/build/handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAQ3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;GAe9B,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;GAAiC,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;AAE9E;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;GAaA,CAAC;AAE5B,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BxE"}
@@ -41,7 +41,7 @@ export const parseBuildArgs = createArgParser(BuildArgsSchema, {
41
41
  include: { keys: ["include"], type: "array" },
42
42
  exclude: { keys: ["exclude"], type: "array" },
43
43
  dryRun: CommonArgs.dryRun,
44
- });
44
+ }, { rejectUnknown: true });
45
45
  export async function handleBuildCommand(args) {
46
46
  showHeader();
47
47
  const opts = parseArgsOrThrow(parseBuildArgs, "build", args);
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dev/command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH,OAAO,EAAE,KAAK,YAAY,EAA2B,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EAAwC,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM1F,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAQD,wBAAsB,cAAc,CAClC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC,CAQvE;AAED,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,GACrB,WAAW,CAEb;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,wBAAwB,CAAC,CAAC,EAC9C,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBtC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,0BAA0B,CAC9C,aAAa,EAAE,MAAM,EACrB,KAAK,GAAE,MAAM,OAAO,CAAC,IAAI,CAAuB,EAChD,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAmB,GAC1D,OAAO,CAAC,OAAO,CAAC,CAIlB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6SzE"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dev/command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH,OAAO,EAAE,KAAK,YAAY,EAA2B,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EAAwC,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM1F,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAQD,wBAAsB,cAAc,CAClC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC,CAQvE;AAED,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,GACrB,WAAW,CAEb;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,wBAAwB,CAAC,CAAC,EAC9C,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBtC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,0BAA0B,CAC9C,aAAa,EAAE,MAAM,EACrB,KAAK,GAAE,MAAM,OAAO,CAAC,IAAI,CAAuB,EAChD,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAmB,GAC1D,OAAO,CAAC,OAAO,CAAC,CAIlB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6TzE"}
@@ -25,7 +25,7 @@ import { createStagedPushOptions, pushCommand } from "../push/index.js";
25
25
  import { createProjectSelector } from "./project-selector.js";
26
26
  import { createDevLogController } from "./log-controller.js";
27
27
  import { findAvailablePort, isPortAvailable, isPortInUseError } from "./port-fallback.js";
28
- import { listInferenceOptions } from "./inference-status.js";
28
+ import { advertisesCloudGateway, listInferenceOptions } from "./inference-status.js";
29
29
  function authStatus(identity) {
30
30
  return isApiKeyIdentity(identity)
31
31
  ? "Authenticated with an API key"
@@ -272,6 +272,19 @@ export function devCommand(options) {
272
272
  if (inferenceOptions.length > 0) {
273
273
  console.log(` ${dim("Inference")} ${brand(inferenceOptions.join(", "))}`);
274
274
  }
275
+ // The banner reports configured paths, and it must not block Ready on a
276
+ // network round-trip (see `void authReady` above). But an expired stored
277
+ // session still has a nonempty token, so the gateway would be advertised
278
+ // and then fail on first request. The validation is already in flight —
279
+ // let it correct the record rather than delay the banner.
280
+ if (advertisesCloudGateway(inferenceOptions)) {
281
+ void authReady.then(() => {
282
+ if (identity)
283
+ return;
284
+ console.log(` ${warning("!")} Veryfront Cloud session is not valid; gateway inference will fail. ` +
285
+ `Run ${brand("veryfront login")} to renew it.`);
286
+ });
287
+ }
275
288
  if (mcpServer && isVerbose()) {
276
289
  console.log(` ${dim("MCP")} ${brand(`http://localhost:${mcpPort}/mcp`)}`);
277
290
  }
@@ -7,6 +7,12 @@ export interface InferenceEnvironment {
7
7
  googleApiKey?: string;
8
8
  mistralApiKey?: string;
9
9
  }
10
+ /**
11
+ * Whether a rendered option list claims the Cloud gateway. Callers use this to
12
+ * decide if a stored session still needs validating — the gateway is the only
13
+ * option whose credential the CLI can check itself.
14
+ */
15
+ export declare function advertisesCloudGateway(options: readonly string[]): boolean;
10
16
  /** Return the inference paths the current dev process can use without exposing credentials. */
11
17
  export declare function listInferenceOptions(environment: InferenceEnvironment): string[];
12
18
  //# sourceMappingURL=inference-status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"inference-status.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dev/inference-status.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD,+FAA+F;AAC/F,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAgBhF"}
1
+ {"version":3,"file":"inference-status.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dev/inference-status.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAQD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE1E;AAED,+FAA+F;AAC/F,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAmBhF"}
@@ -1,11 +1,23 @@
1
+ const CLOUD_GATEWAY_LABEL = "Veryfront Cloud AI Gateway";
1
2
  function isSet(value) {
2
3
  return Boolean(value?.trim());
3
4
  }
5
+ /**
6
+ * Whether a rendered option list claims the Cloud gateway. Callers use this to
7
+ * decide if a stored session still needs validating — the gateway is the only
8
+ * option whose credential the CLI can check itself.
9
+ */
10
+ export function advertisesCloudGateway(options) {
11
+ return options.includes(CLOUD_GATEWAY_LABEL);
12
+ }
4
13
  /** Return the inference paths the current dev process can use without exposing credentials. */
5
14
  export function listInferenceOptions(environment) {
6
15
  const options = [];
7
- if (isSet(environment.apiToken) && isSet(environment.projectSlug)) {
8
- options.push("Veryfront Cloud AI Gateway");
16
+ // The gateway authenticates on the token alone. A freshly scaffolded project
17
+ // has no linked slug yet and its chat route still answers, so gating this on
18
+ // `projectSlug` hid the one inference path `veryfront login` sets up.
19
+ if (isSet(environment.apiToken)) {
20
+ options.push(CLOUD_GATEWAY_LABEL);
9
21
  }
10
22
  if (isSet(environment.openaiApiKey)) {
11
23
  options.push(isSet(environment.openaiBaseUrl) ? "OpenAI-compatible service" : "OpenAI direct");
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/generate/command.ts"],"names":[],"mappings":"AAsBA,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAkCf"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/generate/command.ts"],"names":[],"mappings":"AA6FA,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -3,6 +3,67 @@ import { cliLogger } from "../../utils/index.js";
3
3
  import { createError, toError } from "../../../src/errors/index.js";
4
4
  import { generateIntegration } from "./integration-generator.js";
5
5
  import { isScaffoldType, scaffoldProjectFile } from "../../scaffold/engine.js";
6
+ import { exists, readTextFile } from "../../../src/platform/compat/fs.js";
7
+ import { join } from "../../../src/platform/compat/path/index.js";
8
+ import { parseExtensionManifest } from "../../../src/extensions/manifest-reader.js";
9
+ const PROJECT_MARKERS = [
10
+ "veryfront.config.ts",
11
+ "veryfront.config.js",
12
+ "veryfront.config.mjs",
13
+ // Legacy, but still read and merged by the CLI config loader, so a project
14
+ // identified only by this file is a real project. `veryfront.config.json` is
15
+ // deliberately absent — the loader does not recognise that name.
16
+ "veryfront.json",
17
+ ];
18
+ // Deno accepts JSONC grammar for `deno.json` as well as `deno.jsonc`, matching
19
+ // `src/extensions/discovery.ts`. Parsing those with strict JSON makes a
20
+ // commented manifest look like no evidence at all and fires a false warning.
21
+ const PROJECT_MANIFESTS = [
22
+ { name: "package.json", syntax: "json" },
23
+ { name: "deno.json", syntax: "jsonc" },
24
+ { name: "deno.jsonc", syntax: "jsonc" },
25
+ ];
26
+ /**
27
+ * `generate` writes into whatever directory it is invoked from, so running it
28
+ * one level above the project (or in the wrong terminal tab) silently produces
29
+ * a stray `app/` tree. `dev` already warns in this situation; match it rather
30
+ * than failing, so scaffolding into a not-yet-configured directory still works.
31
+ */
32
+ async function looksLikeVeryfrontProject(projectDir) {
33
+ for (const marker of PROJECT_MARKERS) {
34
+ if (await exists(join(projectDir, marker)))
35
+ return true;
36
+ }
37
+ for (const manifest of PROJECT_MANIFESTS) {
38
+ const path = join(projectDir, manifest.name);
39
+ if (!(await exists(path)))
40
+ continue;
41
+ try {
42
+ const parsed = parseExtensionManifest(await readTextFile(path), manifest.syntax, manifest.name);
43
+ const specifiers = [
44
+ ...Object.keys(parsed.dependencies ?? {}),
45
+ ...Object.keys(parsed.devDependencies ?? {}),
46
+ ...Object.keys(parsed.imports ?? {}),
47
+ ];
48
+ if (specifiers.some((s) => s === "veryfront" || s.startsWith("veryfront/"))) {
49
+ return true;
50
+ }
51
+ }
52
+ catch {
53
+ // An unparseable manifest is not evidence either way; keep looking.
54
+ }
55
+ }
56
+ return false;
57
+ }
58
+ async function warnIfOutsideProject(projectDir) {
59
+ if (await looksLikeVeryfrontProject(projectDir))
60
+ return;
61
+ // Deliberately no path: `projectDir` is an absolute machine path, which
62
+ // AGENTS.md forbids in user-facing output. The directory is where the user
63
+ // already is, so naming it adds nothing they cannot see.
64
+ cliLogger.warn(`The current directory does not look like a Veryfront project; scaffolding here anyway. ` +
65
+ `Run this from your project root, or create one with "npm create veryfront".`);
66
+ }
6
67
  async function getPreferredRouter(projectDir) {
7
68
  try {
8
69
  const { runtime } = await import("../../../src/platform/index.js");
@@ -20,6 +81,7 @@ async function getPreferredRouter(projectDir) {
20
81
  return "app-router";
21
82
  }
22
83
  export async function generateCommand(projectDir, type, name) {
84
+ await warnIfOutsideProject(projectDir);
23
85
  const preferred = await getPreferredRouter(projectDir);
24
86
  if (type === "integration") {
25
87
  await generateIntegration(projectDir, { name: name || undefined });
@@ -36,6 +36,10 @@ export interface ArgSpec {
36
36
  export type ArgMap<T> = {
37
37
  [K in keyof T]?: ArgSpec;
38
38
  };
39
+ export interface ArgParserOptions {
40
+ /** Reject option keys that the command parser does not consume. */
41
+ rejectUnknown?: boolean;
42
+ }
39
43
  /**
40
44
  * Extract a single argument value from parsed args
41
45
  */
@@ -68,7 +72,7 @@ export declare function extractArgs<T>(args: ParsedArgs, argMap: ArgMap<T>): Rec
68
72
  * }
69
73
  * ```
70
74
  */
71
- export declare function createArgParser<T>(schema: Schema<T>, argMap: ArgMap<T>): (args: ParsedArgs) => SafeParseResult<T>;
75
+ export declare function createArgParser<T>(schema: Schema<T>, argMap: ArgMap<T>, options?: ArgParserOptions): (args: ParsedArgs) => SafeParseResult<T>;
72
76
  /**
73
77
  * Parse args with a parser function and throw on failure.
74
78
  * Eliminates the repeated parse-validate-throw boilerplate in handlers.
@@ -1 +1 @@
1
- {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/cli/shared/args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,gFAAgF;AAChF,MAAM,MAAM,eAAe,CAAC,CAAC,IACzB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GACzC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG;QAAE,MAAM,EAAE,OAAO,EAAE,CAAA;KAAE,CAAA;CAAE,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,oEAAoE;IACpE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,2EAA2E;IAC3E,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IAChD,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;KACrB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO;CACzB,CAAC;AAmBF;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,OAAO,GACZ,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAclD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAChB,CAAC,IAAI,EAAE,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,CAU1C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,MAAM,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,EAChD,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,UAAU,GACf,CAAC,CAQH;AAED;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAaY,CAAC;AA6MpC,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAcvD"}
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/cli/shared/args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAGnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,gFAAgF;AAChF,MAAM,MAAM,eAAe,CAAC,CAAC,IACzB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GACzC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG;QAAE,MAAM,EAAE,OAAO,EAAE,CAAA;KAAE,CAAA;CAAE,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,oEAAoE;IACpE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,2EAA2E;IAC3E,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IAChD,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;KACrB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO;CACzB,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAoED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,OAAO,GACZ,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAclD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,OAAO,GAAE,gBAAqB,GAC7B,CAAC,IAAI,EAAE,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,CAe1C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,MAAM,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,EAChD,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,UAAU,GACf,CAAC,CAQH;AAED;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAaY,CAAC;AA6MpC,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAcvD"}
@@ -6,6 +6,41 @@
6
6
  * @module cli/shared/args
7
7
  */
8
8
  import { COMMANDS } from "../help/command-definitions.js";
9
+ import { suggestCommand } from "./suggest.js";
10
+ const ROUTER_ARG_KEYS = new Set([
11
+ "color",
12
+ "h",
13
+ "help",
14
+ "j",
15
+ "json",
16
+ "no-animation",
17
+ "no-color",
18
+ "no-input",
19
+ "o",
20
+ "output",
21
+ "q",
22
+ "quiet",
23
+ "v",
24
+ "verbose",
25
+ "version",
26
+ "y",
27
+ "yes",
28
+ ]);
29
+ function optionName(key) {
30
+ return `${key.length === 1 ? "-" : "--"}${key}`;
31
+ }
32
+ function validateKnownOptions(args, argMap) {
33
+ const commandKeys = Object.values(argMap)
34
+ .flatMap((spec) => spec?.keys ?? []);
35
+ const allowedKeys = new Set([...commandKeys, ...ROUTER_ARG_KEYS]);
36
+ const unknownKey = Object.keys(args).find((key) => key !== "_" && key !== "__explicit" && !allowedKeys.has(key));
37
+ if (!unknownKey)
38
+ return { success: true, data: undefined };
39
+ const suggestion = suggestCommand(unknownKey, commandKeys.filter((key) => key.length > 1), Math.min(4, Math.max(2, Math.ceil(unknownKey.length * 0.35))))[0];
40
+ const hint = suggestion ? ` Did you mean ${optionName(suggestion)}?` : "";
41
+ const error = Object.assign(new Error(`Unknown option ${optionName(unknownKey)}.${hint}`), { issues: [] });
42
+ return { success: false, error };
43
+ }
9
44
  function coerceValue(value, type) {
10
45
  if (type === "boolean")
11
46
  return parseBooleanValue(value) ?? String(value);
@@ -78,8 +113,13 @@ export function extractArgs(args, argMap) {
78
113
  * }
79
114
  * ```
80
115
  */
81
- export function createArgParser(schema, argMap) {
116
+ export function createArgParser(schema, argMap, options = {}) {
82
117
  return function parseArgs(args) {
118
+ if (options.rejectUnknown) {
119
+ const knownOptions = validateKnownOptions(args, argMap);
120
+ if (!knownOptions.success)
121
+ return knownOptions;
122
+ }
83
123
  const result = schema.safeParse(extractArgs(args, argMap));
84
124
  if (result.success) {
85
125
  return { success: true, data: result.data };
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.1237",
3
+ "version": "0.1.1238",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "minimumDependencyAge": {
@@ -1 +1 @@
1
- {"version":3,"file":"run-chunk-mirror.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/conversation/run-chunk-mirror.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-chunk-mirror.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/conversation/run-chunk-mirror.ts"],"names":[],"mappings":"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"}
@@ -103,15 +103,27 @@ async function runHostedChunkMirrorTrace(instrumentation, operationName, operati
103
103
  }
104
104
  return await operation();
105
105
  }
106
+ // Retries are self-healing and back off to only a few seconds, so logging
107
+ // every attempt at error level turns one degraded append window into a Sentry
108
+ // error every few seconds per active run (VERYFRONT-AGENT-3). Escalate only
109
+ // once the failure streak suggests the outage is persistent; terminal
110
+ // stop/disable paths report at error level separately.
111
+ const HOSTED_CHUNK_MIRROR_RETRY_ERROR_THRESHOLD = 5;
106
112
  function recordHostedChunkMirrorRetryScheduled(input) {
107
- input.instrumentation?.error?.("Durable run mirror flush failed; queued for retry", createHostedChunkMirrorRetryMetadata({
113
+ const metadata = createHostedChunkMirrorRetryMetadata({
108
114
  conversationId: input.conversationId,
109
115
  runId: input.runId,
110
116
  errorMessage: input.flushAttempt.errorMessage ?? "Conversation run append failed",
111
117
  retryDelayMs: input.flushAttempt.retryDelayMs,
112
118
  pendingEventCount: input.flushAttempt.pendingEventCount,
113
119
  consecutiveFailures: input.flushAttempt.consecutiveFailures,
114
- }));
120
+ });
121
+ const message = "Durable run mirror flush failed; queued for retry";
122
+ if (input.flushAttempt.consecutiveFailures >= HOSTED_CHUNK_MIRROR_RETRY_ERROR_THRESHOLD) {
123
+ input.instrumentation?.error?.(message, metadata);
124
+ return;
125
+ }
126
+ input.instrumentation?.warn?.(message, metadata);
115
127
  }
116
128
  function recordHostedChunkMirrorHighBacklog(input) {
117
129
  input.instrumentation?.warn?.("Durable run mirror backlog is high", {
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/src/config/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/src/config/loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAWnE,OAAO,EAAuB,KAAK,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAuBxF,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,gCAAgC,EAGtC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEL,yCAAyC,EAC1C,MAAM,0CAA0C,CAAC;AA2WlD,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AA2I1D,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,yBAAyB,CAAA;CAAE,CAAC,GACjE,QAAQ,CAAC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AAEnC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;CAC3C;AAgCD,KAAK,qBAAqB,GAAG,OAAO,yCAAyC,CAAC;AAqyB9E,sGAAsG;AACtG,wBAAgB,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAuElF;AAkMD;;;;;;;;GAQG;AACH,wBAAsB,iCAAiC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcvF;AAED,gBAAgB;AAChB,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAUjB;AAoKD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,aAAa,CAAC,EAAE,0BAA0B,CAAC;CAC5C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC;IACnD,QAAQ,CAAC,eAAe,EAAE,gCAAgC,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC5C,mBAAmB,EACnB,eAAe,GAAG,iBAAiB,CACpC,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,yBAAyB,CAAC;CACrC,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,WAAW,iCAAiC;IAChD,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAybD,wBAAgB,SAAS,CACvB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAK1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAE3B;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAY1B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,eAAe,CAAC,CAgC1B;AAED,4FAA4F;AAC5F,wBAAgB,kCAAkC,CAChD,SAAS,CAAC,EAAE,qBAAqB,GAChC,IAAI,CAMN;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE3E;AAED;;;GAGG;AACH,wBAAgB,wCAAwC,IAAI,QAAQ,CAAC;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAaD;AAED,yFAAyF;AACzF,wBAAgB,oCAAoC,IAAI,QAAQ,CAAC;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CASD;AAED,8EAA8E;AAC9E,wBAAgB,qCAAqC,IAAI,QAAQ,CAAC;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAKD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAI9E"}
@@ -416,6 +416,17 @@ function createFreshDefaults() {
416
416
  const configCacheByProject = new LRUCache({
417
417
  maxEntries: DEFAULT_CONFIG_CACHE_MAX_ENTRIES,
418
418
  });
419
+ /**
420
+ * Negative cache for deterministic hosted config rejections.
421
+ *
422
+ * The hosted cache key already folds in the exact source digest, policy
423
+ * version and environment fingerprint, so a rejected source stays rejected
424
+ * until the tenant ships different content; re-sending it to the evaluator
425
+ * worker on every request only repeats the same failure.
426
+ */
427
+ const hostedConfigFailureCacheByProject = new LRUCache({
428
+ maxEntries: DEFAULT_CONFIG_CACHE_MAX_ENTRIES,
429
+ });
419
430
  const MAX_ACTIVE_HOSTED_CONFIG_SOURCE_READS = DECLARATIVE_CONFIG_WORKER_ADMISSION_LIMITS.maxActive;
420
431
  const MAX_QUEUED_HOSTED_CONFIG_SOURCE_READS = DECLARATIVE_CONFIG_WORKER_ADMISSION_LIMITS.maxQueued;
421
432
  const hostedConfigSourceReadFlights = new IntrinsicMap();
@@ -433,8 +444,9 @@ const MAX_TRUSTED_CONFIG_FLIGHTS = 64;
433
444
  const trustedConfigFlights = new IntrinsicMap();
434
445
  const trustedVirtualFilesystemIds = new IntrinsicWeakMap();
435
446
  let nextTrustedVirtualFilesystemId = 1;
436
- // Register cache for monitoring
447
+ // Register caches for monitoring
437
448
  registerLRUCache("config-cache", configCacheByProject);
449
+ registerLRUCache("config-failure-cache", hostedConfigFailureCacheByProject);
438
450
  let cacheRevision = 0;
439
451
  function configFileProvenance(configFile) {
440
452
  return freezeObject({ kind: "file", configFile });
@@ -777,6 +789,16 @@ async function buildHostedConfigCacheKey(baseCacheKey, configPath, source, paylo
777
789
  function buildHostedConfigFlightKey(hostedCacheKey, revision) {
778
790
  return `${revision}:${hostedCacheKey}`;
779
791
  }
792
+ /**
793
+ * Whether a hosted evaluation failure is guaranteed to repeat for the same
794
+ * cache key. Worker-phase and retryable failures are infrastructure
795
+ * conditions that can succeed on retry, so they must never be cached.
796
+ */
797
+ function isDeterministicHostedConfigRejection(error) {
798
+ return error instanceof DeclarativeConfigEvaluationError &&
799
+ !error.retryable &&
800
+ error.phase !== "worker";
801
+ }
780
802
  function createHostedConfigFlight(flightKey, hostedCacheKey, payload, usePersistentCache, revisionAtStart) {
781
803
  const controller = createHostedAbortController();
782
804
  const controllerSignal = getAbortControllerSignal(controller);
@@ -815,6 +837,13 @@ function createHostedConfigFlight(flightKey, hostedCacheKey, payload, usePersist
815
837
  result.resolve(config);
816
838
  }, (error) => {
817
839
  finish();
840
+ if (usePersistentCache && cacheRevision === revisionAtStart &&
841
+ isDeterministicHostedConfigRejection(error)) {
842
+ hostedConfigFailureCacheByProject.set(hostedCacheKey, {
843
+ revision: revisionAtStart,
844
+ error,
845
+ });
846
+ }
818
847
  result.reject(error);
819
848
  });
820
849
  mapSet(hostedConfigFlights, flightKey, flight);
@@ -1304,6 +1333,12 @@ function loadHostedConfigFromSource(configPath, configFile, baseCacheKey, conten
1304
1333
  if (cached?.revision === revisionAtStart) {
1305
1334
  return cached.config;
1306
1335
  }
1336
+ const cachedFailure = usePersistentCache
1337
+ ? hostedConfigFailureCacheByProject.get(hostedCacheKey)
1338
+ : undefined;
1339
+ if (cachedFailure?.revision === revisionAtStart) {
1340
+ throw cachedFailure.error;
1341
+ }
1307
1342
  const flight = getOrCreateHostedConfigFlight(hostedCacheKey, payload, usePersistentCache, revisionAtStart);
1308
1343
  return await waitForHostedConfigFlight(flight, signal);
1309
1344
  }, {
@@ -1797,6 +1832,7 @@ export function __getTrustedConfigFlightStateForTests() {
1797
1832
  }
1798
1833
  export function clearConfigCache() {
1799
1834
  configCacheByProject.clear();
1835
+ hostedConfigFailureCacheByProject.clear();
1800
1836
  cacheRevision++;
1801
1837
  }
1802
1838
  /**