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.
- package/esm/cli/commands/build/error-handler.d.ts.map +1 -1
- package/esm/cli/commands/build/error-handler.js +41 -3
- package/esm/cli/commands/build/handler.d.ts.map +1 -1
- package/esm/cli/commands/build/handler.js +1 -1
- package/esm/cli/commands/dev/command.d.ts.map +1 -1
- package/esm/cli/commands/dev/command.js +14 -1
- package/esm/cli/commands/dev/inference-status.d.ts +6 -0
- package/esm/cli/commands/dev/inference-status.d.ts.map +1 -1
- package/esm/cli/commands/dev/inference-status.js +14 -2
- package/esm/cli/commands/generate/command.d.ts.map +1 -1
- package/esm/cli/commands/generate/command.js +62 -0
- package/esm/cli/shared/args.d.ts +5 -1
- package/esm/cli/shared/args.d.ts.map +1 -1
- package/esm/cli/shared/args.js +41 -1
- package/esm/deno.js +1 -1
- package/esm/src/agent/conversation/run-chunk-mirror.d.ts.map +1 -1
- package/esm/src/agent/conversation/run-chunk-mirror.js +14 -2
- package/esm/src/config/loader.d.ts.map +1 -1
- package/esm/src/config/loader.js +37 -1
- package/esm/src/html/hydration-script-builder/hydration-runtime.generated.js +1 -1
- package/esm/src/observability/application-errors.d.ts.map +1 -1
- package/esm/src/observability/application-errors.js +9 -1
- package/esm/src/platform/compat/http/pinned-fetch.d.ts +1 -1
- package/esm/src/rendering/orchestrator/css-candidate-manifest.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/css-candidate-manifest.js +30 -1
- package/esm/src/security/sandbox/worker-pool.d.ts.map +1 -1
- package/esm/src/security/sandbox/worker-pool.js +6 -1
- package/esm/src/server/bootstrap.d.ts.map +1 -1
- package/esm/src/server/bootstrap.js +6 -0
- package/esm/src/server/project-env/fetcher.d.ts.map +1 -1
- package/esm/src/server/project-env/fetcher.js +11 -11
- package/esm/src/server/project-env/internal-authorization.d.ts +7 -0
- package/esm/src/server/project-env/internal-authorization.d.ts.map +1 -0
- package/esm/src/server/project-env/internal-authorization.js +32 -0
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- 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":"
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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;;;;;;;;;;;;;
|
|
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,
|
|
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;
|
|
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
|
-
|
|
8
|
-
|
|
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":"
|
|
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 });
|
package/esm/cli/shared/args.d.ts
CHANGED
|
@@ -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
|
|
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;
|
|
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"}
|
package/esm/cli/shared/args.js
CHANGED
|
@@ -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 +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
|
-
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/src/config/loader.ts"],"names":[],"mappings":"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"}
|
package/esm/src/config/loader.js
CHANGED
|
@@ -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
|
|
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
|
/**
|