veryfront 0.1.1225 → 0.1.1227

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 (121) hide show
  1. package/README.md +1 -1
  2. package/esm/cli/main.d.ts +1 -1
  3. package/esm/cli/main.js +1 -1
  4. package/esm/cli/shared/deployment/deploy-project.d.ts.map +1 -1
  5. package/esm/cli/shared/deployment/deploy-project.js +72 -10
  6. package/esm/cli/shared/update-check.d.ts +24 -9
  7. package/esm/cli/shared/update-check.d.ts.map +1 -1
  8. package/esm/cli/shared/update-check.js +74 -34
  9. package/esm/cli/templates/manifest.js +1 -1
  10. package/esm/deno.d.ts +6 -0
  11. package/esm/deno.js +12 -6
  12. package/esm/src/agent/hosted/hosted-chat-finalization.d.ts.map +1 -1
  13. package/esm/src/agent/hosted/hosted-chat-finalization.js +2 -2
  14. package/esm/src/agent/hosted/stream-terminal-error.d.ts.map +1 -1
  15. package/esm/src/agent/hosted/stream-terminal-error.js +2 -6
  16. package/esm/src/agent/streaming/stream-outcome.d.ts +2 -0
  17. package/esm/src/agent/streaming/stream-outcome.d.ts.map +1 -1
  18. package/esm/src/agent/streaming/stream-outcome.js +9 -1
  19. package/esm/src/build/compiler/mdx-compiler/frontmatter-parser.js +1 -1
  20. package/esm/src/build/compiler/mdx-to-js.js +1 -1
  21. package/esm/src/extensions/parser/index.d.ts +4 -1
  22. package/esm/src/extensions/parser/index.d.ts.map +1 -1
  23. package/esm/src/extensions/parser/index.js +4 -1
  24. package/esm/src/extensions/parser/yaml-defaults.d.ts +22 -0
  25. package/esm/src/extensions/parser/yaml-defaults.d.ts.map +1 -0
  26. package/esm/src/extensions/parser/yaml-defaults.js +57 -0
  27. package/esm/src/extensions/parser/yaml-parser.d.ts +59 -0
  28. package/esm/src/extensions/parser/yaml-parser.d.ts.map +1 -0
  29. package/esm/src/extensions/parser/yaml-parser.js +62 -0
  30. package/esm/src/extensions/recommendations.d.ts.map +1 -1
  31. package/esm/src/extensions/recommendations.js +4 -0
  32. package/esm/src/html/hydration-script-builder/hydration-runtime.generated.js +1 -1
  33. package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts +2 -0
  34. package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts.map +1 -1
  35. package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.js +4 -0
  36. package/esm/src/platform/adapters/fs/veryfront/read-operations.d.ts.map +1 -1
  37. package/esm/src/platform/adapters/fs/veryfront/read-operations.js +6 -1
  38. package/esm/src/platform/adapters/runtime/shared/node-filesystem-adapter.d.ts.map +1 -1
  39. package/esm/src/platform/adapters/runtime/shared/node-filesystem-adapter.js +15 -1
  40. package/esm/src/platform/compat/fs.d.ts.map +1 -1
  41. package/esm/src/platform/compat/fs.js +14 -1
  42. package/esm/src/platform/compat/http/pinned-fetch.d.ts +1 -1
  43. package/esm/src/platform/compat/std/front-matter-yaml.js +1 -1
  44. package/esm/src/platform/compat/std/yaml.d.ts +17 -0
  45. package/esm/src/platform/compat/std/yaml.d.ts.map +1 -0
  46. package/esm/src/platform/compat/std/yaml.js +39 -0
  47. package/esm/src/proxy/control-plane-signature.d.ts.map +1 -1
  48. package/esm/src/proxy/control-plane-signature.js +1 -1
  49. package/esm/src/react/compat/ssr-adapter/string-renderer.d.ts.map +1 -1
  50. package/esm/src/react/compat/ssr-adapter/string-renderer.js +6 -5
  51. package/esm/src/react/compat/ssr-adapter/timeout.d.ts +7 -0
  52. package/esm/src/react/compat/ssr-adapter/timeout.d.ts.map +1 -1
  53. package/esm/src/react/compat/ssr-adapter/timeout.js +13 -0
  54. package/esm/src/runtime/runtime-bridge.d.ts.map +1 -1
  55. package/esm/src/runtime/runtime-bridge.js +20 -8
  56. package/esm/src/utils/version-constant.d.ts +1 -1
  57. package/esm/src/utils/version-constant.js +1 -1
  58. package/package.json +8 -8
  59. package/esm/deps/jsr.io/@std/yaml/1.1.0/_chars.d.ts +0 -33
  60. package/esm/deps/jsr.io/@std/yaml/1.1.0/_chars.d.ts.map +0 -1
  61. package/esm/deps/jsr.io/@std/yaml/1.1.0/_chars.js +0 -48
  62. package/esm/deps/jsr.io/@std/yaml/1.1.0/_loader_state.d.ts +0 -64
  63. package/esm/deps/jsr.io/@std/yaml/1.1.0/_loader_state.d.ts.map +0 -1
  64. package/esm/deps/jsr.io/@std/yaml/1.1.0/_loader_state.js +0 -1371
  65. package/esm/deps/jsr.io/@std/yaml/1.1.0/_schema.d.ts +0 -44
  66. package/esm/deps/jsr.io/@std/yaml/1.1.0/_schema.d.ts.map +0 -1
  67. package/esm/deps/jsr.io/@std/yaml/1.1.0/_schema.js +0 -117
  68. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/binary.d.ts +0 -3
  69. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/binary.d.ts.map +0 -1
  70. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/binary.js +0 -103
  71. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/bool.d.ts +0 -3
  72. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/bool.d.ts.map +0 -1
  73. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/bool.js +0 -32
  74. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/float.d.ts +0 -3
  75. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/float.d.ts.map +0 -1
  76. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/float.js +0 -96
  77. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/int.d.ts +0 -3
  78. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/int.d.ts.map +0 -1
  79. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/int.js +0 -159
  80. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/map.d.ts +0 -3
  81. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/map.d.ts.map +0 -1
  82. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/map.js +0 -14
  83. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/merge.d.ts +0 -3
  84. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/merge.d.ts.map +0 -1
  85. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/merge.js +0 -10
  86. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/nil.d.ts +0 -3
  87. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/nil.d.ts.map +0 -1
  88. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/nil.js +0 -22
  89. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/omap.d.ts +0 -3
  90. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/omap.d.ts.map +0 -1
  91. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/omap.js +0 -29
  92. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/pairs.d.ts +0 -3
  93. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/pairs.d.ts.map +0 -1
  94. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/pairs.js +0 -19
  95. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/regexp.d.ts +0 -3
  96. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/regexp.d.ts.map +0 -1
  97. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/regexp.js +0 -30
  98. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/seq.d.ts +0 -3
  99. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/seq.d.ts.map +0 -1
  100. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/seq.js +0 -10
  101. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/set.d.ts +0 -3
  102. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/set.d.ts.map +0 -1
  103. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/set.js +0 -14
  104. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/str.d.ts +0 -3
  105. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/str.d.ts.map +0 -1
  106. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/str.js +0 -9
  107. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/timestamp.d.ts +0 -3
  108. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/timestamp.d.ts.map +0 -1
  109. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/timestamp.js +0 -81
  110. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/undefined.d.ts +0 -3
  111. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/undefined.d.ts.map +0 -1
  112. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type/undefined.js +0 -20
  113. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type.d.ts +0 -32
  114. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type.d.ts.map +0 -1
  115. package/esm/deps/jsr.io/@std/yaml/1.1.0/_type.js +0 -6
  116. package/esm/deps/jsr.io/@std/yaml/1.1.0/_utils.d.ts +0 -4
  117. package/esm/deps/jsr.io/@std/yaml/1.1.0/_utils.d.ts.map +0 -1
  118. package/esm/deps/jsr.io/@std/yaml/1.1.0/_utils.js +0 -13
  119. package/esm/deps/jsr.io/@std/yaml/1.1.0/parse.d.ts +0 -76
  120. package/esm/deps/jsr.io/@std/yaml/1.1.0/parse.d.ts.map +0 -1
  121. package/esm/deps/jsr.io/@std/yaml/1.1.0/parse.js +0 -91
package/README.md CHANGED
@@ -37,7 +37,7 @@ deno init --npm veryfront
37
37
  The default starter is `ai-agent`. Choose another template directly:
38
38
 
39
39
  ```bash
40
- npx veryfront init <PROJECT_NAME> --template <TEMPLATE>
40
+ npx veryfront@latest init <PROJECT_NAME> --template <TEMPLATE>
41
41
  ```
42
42
 
43
43
  Available starters: `ai-agent`, `minimal`, `agentic-workflow`.
package/esm/cli/main.d.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * @example
7
7
  * ```sh
8
- * npx veryfront dev
8
+ * npx veryfront@latest dev
9
9
  * ```
10
10
  */
11
11
  import "../_dnt.polyfills.js";
package/esm/cli/main.js CHANGED
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * @example
7
7
  * ```sh
8
- * npx veryfront dev
8
+ * npx veryfront@latest dev
9
9
  * ```
10
10
  */
11
11
  // Set the CLI logger preset before importing modules that may log during initialization.
@@ -1 +1 @@
1
- {"version":3,"file":"deploy-project.d.ts","sourceRoot":"","sources":["../../../../src/cli/shared/deployment/deploy-project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy-project.d.ts","sourceRoot":"","sources":["../../../../src/cli/shared/deployment/deploy-project.ts"],"names":[],"mappings":"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"}
@@ -456,10 +456,55 @@ function isMatchingVeryfrontHostedUrl(url, target) {
456
456
  parsed.slug === target.projectSlug.toLowerCase() &&
457
457
  parsed.environment === target.environmentName.toLowerCase();
458
458
  }
459
+ const MAX_JWT_SEGMENT_CODE_UNITS = 8 * 1024;
460
+ /** Decode one base64url JWT segment into a plain object, or null if it is not one. */
461
+ function decodeJwtSegment(segment) {
462
+ if (segment === undefined)
463
+ return null;
464
+ if (segment.length === 0 || segment.length > MAX_JWT_SEGMENT_CODE_UNITS)
465
+ return null;
466
+ try {
467
+ const base64 = segment.replaceAll("-", "+").replaceAll("_", "/");
468
+ const binary = atob(base64 + "=".repeat((4 - base64.length % 4) % 4));
469
+ const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));
470
+ const parsed = JSON.parse(new TextDecoder().decode(bytes));
471
+ return typeof parsed === "object" && parsed !== null ? parsed : null;
472
+ }
473
+ catch {
474
+ return null;
475
+ }
476
+ }
477
+ /**
478
+ * Whether a stored credential could satisfy the protected-environment gate.
479
+ *
480
+ * The gate reads `userId` from the verified JWT payload and has no API-key
481
+ * branch, so presenting an opaque key only leaks it. Reads what the gate
482
+ * reads, and withholds anything it cannot recognise.
483
+ */
484
+ function isSessionCredential(apiToken) {
485
+ const segments = apiToken.split(".");
486
+ if (segments.length !== 3)
487
+ return false;
488
+ const header = decodeJwtSegment(segments[0]);
489
+ if (header === null || typeof readUntrustedOwnDataProperty(header, "alg") !== "string") {
490
+ return false;
491
+ }
492
+ const payload = decodeJwtSegment(segments[1]);
493
+ if (payload === null)
494
+ return false;
495
+ const userId = readUntrustedOwnDataProperty(payload, "userId");
496
+ return typeof userId === "string" && userId.length > 0;
497
+ }
459
498
  function buildEnvironmentReadinessProbes(target) {
460
499
  const route = target.route === undefined ? "/" : target.route;
461
500
  if (route === null)
462
501
  return [];
502
+ // Without a session credential the probe cannot get past the gate. Its
503
+ // challenge still proves routing resolves and the proxy is serving this
504
+ // environment — the most this step can establish, and the deployment it
505
+ // would otherwise fail is already committed and verified. Same allowance the
506
+ // protected custom-domain probe below already makes.
507
+ const canAuthenticate = isSessionCredential(target.apiToken);
463
508
  const targetUrl = buildEnvironmentProbeUrl(target.url, route);
464
509
  if (target.protected && !isMatchingVeryfrontHostedUrl(new URL(targetUrl), target)) {
465
510
  return [
@@ -470,15 +515,15 @@ function buildEnvironmentReadinessProbes(target) {
470
515
  },
471
516
  {
472
517
  url: buildEnvironmentProbeUrl(buildCanonicalEnvironmentUrl(target.projectSlug, target.environmentName), route),
473
- authenticate: true,
474
- acceptAuthenticationChallenge: false,
518
+ authenticate: canAuthenticate,
519
+ acceptAuthenticationChallenge: !canAuthenticate,
475
520
  },
476
521
  ];
477
522
  }
478
523
  return [{
479
524
  url: target.protected ? secureEnvironmentProbeUrl(targetUrl) : targetUrl,
480
- authenticate: target.protected,
481
- acceptAuthenticationChallenge: false,
525
+ authenticate: target.protected && canAuthenticate,
526
+ acceptAuthenticationChallenge: target.protected && !canAuthenticate,
482
527
  }];
483
528
  }
484
529
  function isVeryfrontSignInUrl(url) {
@@ -499,6 +544,16 @@ function isSignInRedirect(response, requestUrl) {
499
544
  return false;
500
545
  }
501
546
  }
547
+ /** A challenge is a sign-in redirect, a 401, or a 403; say which one arrived. */
548
+ function describeAuthenticationChallenge(probe, status, signInRedirect) {
549
+ if (probe.authenticate) {
550
+ return `Could not authenticate the protected environment URL ${probe.url}. Run veryfront login and deploy again.`;
551
+ }
552
+ if (signInRedirect) {
553
+ return `Environment URL ${probe.url} redirected to sign-in. Check its protection settings and deploy again.`;
554
+ }
555
+ return `Environment URL ${probe.url} returned HTTP ${status}. Check its protection settings and deploy again.`;
556
+ }
502
557
  function isTransientEnvironmentStatus(status) {
503
558
  return status === 404 || status === 408 || status === 425 || status === 429 || status >= 500;
504
559
  }
@@ -551,18 +606,25 @@ export async function waitForEnvironmentReady(target, options = {}) {
551
606
  if (ready)
552
607
  break;
553
608
  if (authenticationChallenge) {
554
- const message = probe.authenticate
555
- ? `Could not authenticate the protected environment URL ${probe.url}. Run veryfront login and deploy again.`
556
- : `Environment URL ${probe.url} redirected to sign-in. Check its protection settings and deploy again.`;
557
- throw new Error(message);
609
+ // A bare Error here reaches the operator as `unknown-error`.
610
+ throw DEPLOYMENT_ERROR.create({
611
+ detail: describeAuthenticationChallenge(probe, response.status, signInRedirect),
612
+ context: { url: probe.url, status: response.status },
613
+ });
558
614
  }
559
615
  if (!isTransientEnvironmentStatus(response.status)) {
560
- throw new Error(`Environment URL ${probe.url} returned HTTP ${response.status}. Check the environment configuration and deploy again.`);
616
+ throw DEPLOYMENT_ERROR.create({
617
+ detail: `Environment URL ${probe.url} returned HTTP ${response.status}. Check the environment configuration and deploy again.`,
618
+ context: { url: probe.url, status: response.status },
619
+ });
561
620
  }
562
621
  }
563
622
  const remainingMs = deadline - Date.now();
564
623
  if (remainingMs <= 0) {
565
- throw new Error(`Environment URL ${probe.url} did not become ready within ${Math.ceil(timeoutMs / 1000)}s (last response: ${lastResponse}). Check the deployment and run deploy again.`);
624
+ throw DEPLOYMENT_ERROR.create({
625
+ detail: `Environment URL ${probe.url} did not become ready within ${Math.ceil(timeoutMs / 1000)}s (last response: ${lastResponse}). Check the deployment and run deploy again.`,
626
+ context: { url: probe.url, timeoutMs },
627
+ });
566
628
  }
567
629
  await wait(Math.min(pollIntervalMs, remainingMs));
568
630
  }
@@ -1,12 +1,27 @@
1
- /**
2
- * Non-blocking update check
3
- *
4
- * Checks for newer CLI versions after command execution.
5
- * Cached for 24 hours. Never blocks command output.
6
- *
7
- * @module cli/shared/update-check
8
- */
1
+ import { type FileSystem } from "../../src/platform/index.js";
2
+ export declare const UPDATE_REGISTRY_URL = "https://registry.npmjs.org/veryfront/latest";
3
+ export declare const UPDATE_INSTALL_COMMAND = "npm install -g veryfront@latest";
4
+ interface UpdateCacheLocation {
5
+ directory: string;
6
+ file: string;
7
+ }
8
+ type UpdateCheckFileSystem = Pick<FileSystem, "readTextFile" | "mkdir" | "writeTextFile">;
9
+ type UpdateCheckFetcher = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
10
+ export interface UpdateCheckOptions {
11
+ shouldSkip?: () => boolean;
12
+ cacheLocation?: UpdateCacheLocation | null;
13
+ fileSystem?: UpdateCheckFileSystem;
14
+ fetcher?: UpdateCheckFetcher;
15
+ now?: () => number;
16
+ printNotice?: (current: string, latest: string) => void;
17
+ debug?: (message: string) => void;
18
+ }
9
19
  export declare function compareVersions(current: string, latest: string): boolean;
10
20
  export declare function shouldSkip(): boolean;
11
- export declare function checkForUpdates(currentVersion: string): Promise<void>;
21
+ export declare function getUpdateInstallCommand(context?: {
22
+ standalone: boolean;
23
+ executablePath: string;
24
+ }): string;
25
+ export declare function checkForUpdates(currentVersion: string, options?: UpdateCheckOptions): Promise<void>;
26
+ export {};
12
27
  //# sourceMappingURL=update-check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../../src/cli/shared/update-check.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA2BH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQxE;AAED,wBAAgB,UAAU,IAAI,OAAO,CAMpC;AASD,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAiDf"}
1
+ {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../../src/cli/shared/update-check.ts"],"names":[],"mappings":"AAYA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAShF,eAAO,MAAM,mBAAmB,gDAAgD,CAAC;AACjF,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AAUxE,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,KAAK,qBAAqB,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,GAAG,eAAe,CAAC,CAAC;AAC1F,KAAK,kBAAkB,GAAG,CACxB,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAC7B,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC3C,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAWD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQxE;AAED,wBAAgB,UAAU,IAAI,OAAO,CAMpC;AAED,wBAAgB,uBAAuB,CACrC,OAAO,GAAE;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAGrD,GACA,MAAM,CAkBR;AA+BD,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAmDf"}
@@ -6,23 +6,29 @@
6
6
  *
7
7
  * @module cli/shared/update-check
8
8
  */
9
+ import * as dntShim from "../../_dnt.shims.js";
9
10
  import { getEnv } from "../../src/platform/index.js";
10
11
  import { createFileSystem } from "../../src/platform/index.js";
11
12
  import { join } from "../../src/platform/compat/path/index.js";
12
13
  import { getEnvironmentConfig } from "../../src/config/index.js";
13
14
  import { isJsonMode } from "./json-output.js";
14
15
  import { brand, dim, warning as warningColor } from "../ui/colors.js";
15
- import { isQuiet } from "../utils/index.js";
16
+ import { cliLogger, isQuiet } from "../utils/index.js";
16
17
  import { detectCI } from "./interactive.js";
17
18
  const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
18
- const REGISTRY_URL = "https://jsr.io/@veryfront/veryfront/meta.json";
19
- const INSTALL_CMD = "deno install -gArf jsr:@veryfront/veryfront";
20
- function getCacheFile() {
19
+ export const UPDATE_REGISTRY_URL = "https://registry.npmjs.org/veryfront/latest";
20
+ export const UPDATE_INSTALL_COMMAND = "npm install -g veryfront@latest";
21
+ const HOMEBREW_UPDATE_COMMAND = "brew upgrade veryfront/tap/veryfront";
22
+ const INSTALL_SCRIPT_COMMAND = "curl -fsSL https://veryfront.com/install.sh | sh";
23
+ const STABLE_SEMVER_PATTERN = /^\d+\.\d+\.\d+$/;
24
+ class UpdateCheckFailure extends Error {
25
+ }
26
+ function getCacheLocation() {
21
27
  const env = getEnvironmentConfig();
22
28
  if (!env.homeDir)
23
29
  return null;
24
- const cacheDir = join(env.homeDir, ".cache", "veryfront");
25
- return join(cacheDir, "update-check.json");
30
+ const directory = join(env.homeDir, ".cache", "veryfront");
31
+ return { directory, file: join(directory, "update-check.json") };
26
32
  }
27
33
  export function compareVersions(current, latest) {
28
34
  const c = current.split(".").map(Number);
@@ -46,54 +52,88 @@ export function shouldSkip() {
46
52
  return true;
47
53
  return false;
48
54
  }
55
+ export function getUpdateInstallCommand(context = {
56
+ standalone: dntShim.Deno.build.standalone ?? false,
57
+ executablePath: dntShim.Deno.execPath(),
58
+ }) {
59
+ if (!context.standalone)
60
+ return UPDATE_INSTALL_COMMAND;
61
+ const executablePath = context.executablePath.replaceAll("\\", "/").toLowerCase();
62
+ if (executablePath.includes("/node_modules/veryfront/bin/")) {
63
+ return UPDATE_INSTALL_COMMAND;
64
+ }
65
+ if (executablePath.includes("/cellar/") ||
66
+ executablePath.includes("/homebrew/") ||
67
+ executablePath.includes("/linuxbrew/")) {
68
+ return HOMEBREW_UPDATE_COMMAND;
69
+ }
70
+ if (!executablePath.endsWith(".exe"))
71
+ return INSTALL_SCRIPT_COMMAND;
72
+ return UPDATE_INSTALL_COMMAND;
73
+ }
49
74
  function printUpdateNotice(current, latest) {
50
75
  console.error();
51
76
  console.error(` ${warningColor("!")} Update available: ${current} → ${latest}`);
52
- console.error(` ${dim("Run:")} ${brand(INSTALL_CMD)}`);
77
+ console.error(` ${dim("Run:")} ${brand(getUpdateInstallCommand())}`);
53
78
  console.error();
54
79
  }
55
- export async function checkForUpdates(currentVersion) {
56
- if (shouldSkip())
80
+ async function fetchLatestVersion(fetcher) {
81
+ const response = await fetcher(UPDATE_REGISTRY_URL);
82
+ if (!response.ok) {
83
+ await response.body?.cancel();
84
+ throw new UpdateCheckFailure(`Veryfront could not check for updates: npm registry returned ${response.status}.`);
85
+ }
86
+ const data = await response.json();
87
+ const latestVersion = data && typeof data === "object" && "version" in data
88
+ ? data.version
89
+ : undefined;
90
+ if (typeof latestVersion !== "string" || !STABLE_SEMVER_PATTERN.test(latestVersion)) {
91
+ throw new UpdateCheckFailure("Veryfront could not check for updates: npm registry returned an invalid version.");
92
+ }
93
+ return latestVersion;
94
+ }
95
+ export async function checkForUpdates(currentVersion, options = {}) {
96
+ if ((options.shouldSkip ?? shouldSkip)())
57
97
  return;
58
- const cacheFile = getCacheFile();
59
- if (!cacheFile)
98
+ const cacheLocation = options.cacheLocation === undefined
99
+ ? getCacheLocation()
100
+ : options.cacheLocation;
101
+ if (!cacheLocation)
60
102
  return;
61
- const fs = createFileSystem();
103
+ const fs = options.fileSystem ?? createFileSystem();
104
+ const now = options.now ?? Date.now;
105
+ const notice = options.printNotice ?? printUpdateNotice;
106
+ const debug = options.debug ?? ((message) => cliLogger.debug(message));
62
107
  try {
63
- const raw = await fs.readTextFile(cacheFile);
108
+ const raw = await fs.readTextFile(cacheLocation.file);
64
109
  const cache = JSON.parse(raw);
65
- if (Date.now() - cache.lastCheck < CHECK_INTERVAL_MS) {
110
+ if (now() - cache.lastCheck < CHECK_INTERVAL_MS) {
66
111
  if (cache.latestVersion &&
67
112
  compareVersions(currentVersion, cache.latestVersion)) {
68
- printUpdateNotice(currentVersion, cache.latestVersion);
113
+ notice(currentVersion, cache.latestVersion);
69
114
  }
70
115
  return;
71
116
  }
72
117
  }
73
118
  catch {
74
- // No cache proceed
119
+ // No cache. Continue with the registry check.
75
120
  }
76
121
  try {
77
- const resp = await fetch(REGISTRY_URL);
78
- if (!resp.ok) {
79
- await resp.body?.cancel();
80
- return;
81
- }
82
- const data = await resp.json();
83
- const latestVersion = data.latest;
84
- if (!latestVersion)
85
- return;
86
- const env = getEnvironmentConfig();
87
- if (!env.homeDir)
88
- return;
89
- const cacheDir = join(env.homeDir, ".cache", "veryfront");
90
- await fs.mkdir(cacheDir, { recursive: true });
91
- await fs.writeTextFile(cacheFile, JSON.stringify({ lastCheck: Date.now(), latestVersion }));
122
+ const latestVersion = await fetchLatestVersion(options.fetcher ?? fetch);
92
123
  if (compareVersions(currentVersion, latestVersion)) {
93
- printUpdateNotice(currentVersion, latestVersion);
124
+ notice(currentVersion, latestVersion);
125
+ }
126
+ try {
127
+ await fs.mkdir(cacheLocation.directory, { recursive: true });
128
+ await fs.writeTextFile(cacheLocation.file, JSON.stringify({ lastCheck: now(), latestVersion }));
129
+ }
130
+ catch {
131
+ debug("Veryfront could not cache the update check.");
94
132
  }
95
133
  }
96
- catch {
97
- // Network error silently ignore
134
+ catch (error) {
135
+ debug(error instanceof UpdateCheckFailure
136
+ ? error.message
137
+ : "Veryfront could not complete the update check.");
98
138
  }
99
139
  }
@@ -66,7 +66,7 @@ export default {
66
66
  "globals.css": "@import \"tailwindcss\";\n",
67
67
  "globals.d.ts": "declare module \"*.css\";\n",
68
68
  "public/favicon.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\">\n <rect width=\"64\" height=\"64\" fill=\"#fff\"/>\n <circle cx=\"32\" cy=\"32\" r=\"20\" fill=\"#000\"/>\n</svg>\n",
69
- "README.md": "# Docs Agent\n\nA chatbot that answers questions from your own documents using Retrieval-Augmented Generation (RAG).\n\n## What's included\n\n- Q&A agent with source citation\n- Embedding-based semantic search with convention-based model selection\n- Document upload supporting PDF, DOCX, XLSX, PPTX, CSV, HTML, RTF, EPUB, TXT, and Markdown\n- `ragStore()` with local JSON storage by default, and Veryfront Cloud RAG when bootstrap is present\n- Veryfront Cloud AI Gateway routing for generation and embeddings when bootstrap is present\n- Original uploaded files stored in Veryfront Cloud project uploads when cloud bootstrap is present\n- Sample content in `/content` indexed through a dedicated ingestion route\n\n## Getting started\n\n1. Set your Veryfront Cloud bootstrap vars:\n\n ```bash\n export VERYFRONT_API_TOKEN=vf_...\n export VERYFRONT_PROJECT_SLUG=my-project\n ```\n\n2. Start the dev server:\n\n ```bash\n npx veryfront dev\n ```\n\n3. Index the sample docs in `content/`:\n\n ```bash\n curl -X POST http://localhost:3000/api/ingest\n ```\n\n4. Open the app and upload a document or ask a question.\n\nIf you are using a self-hosted Veryfront API, also set `VERYFRONT_API_URL`.\n\n## Cloud mode\n\nWith `VERYFRONT_API_TOKEN` and `VERYFRONT_PROJECT_SLUG` set, the template uses\nVeryfront Cloud automatically:\n\n- Agent generation routes through Veryfront Cloud model routing.\n- Query and document embeddings route through Veryfront Cloud embedding routing.\n- `veryfront-cloud/openai/...` and `veryfront-cloud/google/...` models use AI Gateway.\n- RAG documents, chunks, and embeddings are stored in the target project.\n\nThe default cloud embedding model is\n`veryfront-cloud/openai/text-embedding-3-small`. Set\n`VERYFRONT_DEFAULT_EMBEDDING_MODEL` only when you need a different embedding\nmodel.\n\n## Architecture\n\nRAG grounds LLM responses in your documents through three pipelines: **Ingestion**, **Query**, and **RAG**. These pipelines are orchestrated around a shared vector store.\n\n```mermaid\nflowchart LR\n ChatUI_L[\"Chat UI\"]\n\n subgraph IngestionFlow[\"Ingestion Pipeline\"]\n D[\"Documents\"] --> EXT[\"Extraction\"] --> DC[\"Chunking\"] --> DE[\"Document\\nEmbedding\"] --> ING[\"Storage\"]\n end\n\n subgraph QueryFlow[\"Query Pipeline\"]\n Q[\"Query\"] --> QE[\"Query\\nEmbedding\"] --> SS[\"Similarity\\nSearch\"]\n end\n\n subgraph RAGFlow[\"RAG Pipeline\"]\n BF[\"beforeStream\\nHook\"] --> RET[\"Retrieval\"] --> AUG[\"Augmentation\"] --> AG[\"Agent\"] --> GEN[\"Generation\"]\n end\n\n EMB((\"Embedding\\nModel\"))\n GEN_LLM((\"Generative\\nModel\"))\n VS[(\"Vector\\nStore\")]\n ChatUI_R[\"Chat UI\"]\n\n ChatUI_L --> D\n ChatUI_L --> Q\n\n QE -.- EMB\n DE -.- EMB\n\n SS --> VS\n ING --> VS\n\n Q --> BF\n VS --> RET\n AG -.- GEN_LLM\n GEN -.- GEN_LLM\n GEN --> ChatUI_R\n```\n\n### Pipelines\n\n**Ingestion**: Documents are parsed into plain text via the built-in kreuzberg extraction engine (supporting PDF, DOCX, XLSX, PPTX, HTML, RTF, EPUB, and 76+ formats), split into overlapping chunks (~1000 chars, 200 char overlap), and stored in the default `ragStore()`. In local mode that means `data/index.json`; with Veryfront Cloud bootstrap it upgrades to the cloud RAG backend automatically. The original uploaded binary is also stored in the project's Veryfront Cloud uploads store so remote projects retain the source file, not just the extracted text. Uploaded files are ingested by the upload route. Bundled files in `content/` are ingested by the `/api/ingest` route.\n\n**Query**: The user's query is embedded into the same vector space as the documents, then compared against all stored chunks using cosine similarity to find the top-*k* most relevant results.\n\n**RAG**: The `beforeStream` hook in the AG-UI route intercepts each message before it reaches the agent. It searches the document store for relevant chunks, assembles them into context, and prepends them as retrieved reference data. The agent then generates a cited response streamed back to the user.\n\n## Structure\n\n```\nstore.ts RAG store config\nagents/rag.ts Q&A agent with citation instructions\ncontent/\n getting-started.md Sample document\n architecture.md Sample document\napp/\n api/ag-ui/route.ts AG-UI endpoint\n api/ingest/route.ts Bundled content ingestion\n api/uploads/route.ts Upload, list, and delete uploads\n uploads/page.tsx Upload management panel\n page.tsx Chat UI\n layout.tsx Chat shell with sidebar and tabs\n```\n\n## Framework usage\n\n| What | Framework | Template code |\n|------|-----------|---------------|\n| Chat UI + streaming | app-mode `Chat` | `page.tsx` |\n| Upload management | `AttachmentsPanel`, `useUploadsRegistry` | `uploads/page.tsx` |\n| Source display | Built into the `Chat` preset | `page.tsx` |\n| Upload API route | `createUploadHandler` | 1 line in `route.ts` |\n| AG-UI route | `createAgUiHandler` | 1 line in `route.ts` |\n| Agent definition | `agent()` | Config object in `agents/rag.ts` |\n| RAG retrieval | `beforeStream` hook | Context injection in `api/ag-ui/route.ts` |\n| Vector store | `ragStore()` | Config in `store.ts` |\n\n## Adding documents\n\n- Drop files into `content/`, then run `curl -X POST http://localhost:3000/api/ingest`\n- Or use the upload panel in the UI for PDF, DOCX, XLSX, PPTX, CSV, HTML, RTF, EPUB, TXT, and MD files\n\n## Production notes\n\nThis is a starter template, not a production-ready setup. For production, consider:\n\n- **Vector store**: Replace the default store with pgvector, Pinecone, or Qdrant for datasets beyond ~10k chunks\n- **Reranking**: Add a cross-encoder reranker (e.g. Cohere Rerank) after retrieval to improve precision\n- **Hybrid search**: Combine dense vectors with BM25 keyword matching for better recall\n",
69
+ "README.md": "# Docs Agent\n\nA chatbot that answers questions from your own documents using Retrieval-Augmented Generation (RAG).\n\n## What's included\n\n- Q&A agent with source citation\n- Embedding-based semantic search with convention-based model selection\n- Document upload supporting PDF, DOCX, XLSX, PPTX, CSV, HTML, RTF, EPUB, TXT, and Markdown\n- `ragStore()` with local JSON storage by default, and Veryfront Cloud RAG when bootstrap is present\n- Veryfront Cloud AI Gateway routing for generation and embeddings when bootstrap is present\n- Original uploaded files stored in Veryfront Cloud project uploads when cloud bootstrap is present\n- Sample content in `/content` indexed through a dedicated ingestion route\n\n## Getting started\n\n1. Set your Veryfront Cloud bootstrap vars:\n\n ```bash\n export VERYFRONT_API_TOKEN=vf_...\n export VERYFRONT_PROJECT_SLUG=my-project\n ```\n\n2. Start the dev server:\n\n ```bash\n npx veryfront@latest dev\n ```\n\n3. Index the sample docs in `content/`:\n\n ```bash\n curl -X POST http://localhost:3000/api/ingest\n ```\n\n4. Open the app and upload a document or ask a question.\n\nIf you are using a self-hosted Veryfront API, also set `VERYFRONT_API_URL`.\n\n## Cloud mode\n\nWith `VERYFRONT_API_TOKEN` and `VERYFRONT_PROJECT_SLUG` set, the template uses\nVeryfront Cloud automatically:\n\n- Agent generation routes through Veryfront Cloud model routing.\n- Query and document embeddings route through Veryfront Cloud embedding routing.\n- `veryfront-cloud/openai/...` and `veryfront-cloud/google/...` models use AI Gateway.\n- RAG documents, chunks, and embeddings are stored in the target project.\n\nThe default cloud embedding model is\n`veryfront-cloud/openai/text-embedding-3-small`. Set\n`VERYFRONT_DEFAULT_EMBEDDING_MODEL` only when you need a different embedding\nmodel.\n\n## Architecture\n\nRAG grounds LLM responses in your documents through three pipelines: **Ingestion**, **Query**, and **RAG**. These pipelines are orchestrated around a shared vector store.\n\n```mermaid\nflowchart LR\n ChatUI_L[\"Chat UI\"]\n\n subgraph IngestionFlow[\"Ingestion Pipeline\"]\n D[\"Documents\"] --> EXT[\"Extraction\"] --> DC[\"Chunking\"] --> DE[\"Document\\nEmbedding\"] --> ING[\"Storage\"]\n end\n\n subgraph QueryFlow[\"Query Pipeline\"]\n Q[\"Query\"] --> QE[\"Query\\nEmbedding\"] --> SS[\"Similarity\\nSearch\"]\n end\n\n subgraph RAGFlow[\"RAG Pipeline\"]\n BF[\"beforeStream\\nHook\"] --> RET[\"Retrieval\"] --> AUG[\"Augmentation\"] --> AG[\"Agent\"] --> GEN[\"Generation\"]\n end\n\n EMB((\"Embedding\\nModel\"))\n GEN_LLM((\"Generative\\nModel\"))\n VS[(\"Vector\\nStore\")]\n ChatUI_R[\"Chat UI\"]\n\n ChatUI_L --> D\n ChatUI_L --> Q\n\n QE -.- EMB\n DE -.- EMB\n\n SS --> VS\n ING --> VS\n\n Q --> BF\n VS --> RET\n AG -.- GEN_LLM\n GEN -.- GEN_LLM\n GEN --> ChatUI_R\n```\n\n### Pipelines\n\n**Ingestion**: Documents are parsed into plain text via the built-in kreuzberg extraction engine (supporting PDF, DOCX, XLSX, PPTX, HTML, RTF, EPUB, and 76+ formats), split into overlapping chunks (~1000 chars, 200 char overlap), and stored in the default `ragStore()`. In local mode that means `data/index.json`; with Veryfront Cloud bootstrap it upgrades to the cloud RAG backend automatically. The original uploaded binary is also stored in the project's Veryfront Cloud uploads store so remote projects retain the source file, not just the extracted text. Uploaded files are ingested by the upload route. Bundled files in `content/` are ingested by the `/api/ingest` route.\n\n**Query**: The user's query is embedded into the same vector space as the documents, then compared against all stored chunks using cosine similarity to find the top-*k* most relevant results.\n\n**RAG**: The `beforeStream` hook in the AG-UI route intercepts each message before it reaches the agent. It searches the document store for relevant chunks, assembles them into context, and prepends them as retrieved reference data. The agent then generates a cited response streamed back to the user.\n\n## Structure\n\n```\nstore.ts RAG store config\nagents/rag.ts Q&A agent with citation instructions\ncontent/\n getting-started.md Sample document\n architecture.md Sample document\napp/\n api/ag-ui/route.ts AG-UI endpoint\n api/ingest/route.ts Bundled content ingestion\n api/uploads/route.ts Upload, list, and delete uploads\n uploads/page.tsx Upload management panel\n page.tsx Chat UI\n layout.tsx Chat shell with sidebar and tabs\n```\n\n## Framework usage\n\n| What | Framework | Template code |\n|------|-----------|---------------|\n| Chat UI + streaming | app-mode `Chat` | `page.tsx` |\n| Upload management | `AttachmentsPanel`, `useUploadsRegistry` | `uploads/page.tsx` |\n| Source display | Built into the `Chat` preset | `page.tsx` |\n| Upload API route | `createUploadHandler` | 1 line in `route.ts` |\n| AG-UI route | `createAgUiHandler` | 1 line in `route.ts` |\n| Agent definition | `agent()` | Config object in `agents/rag.ts` |\n| RAG retrieval | `beforeStream` hook | Context injection in `api/ag-ui/route.ts` |\n| Vector store | `ragStore()` | Config in `store.ts` |\n\n## Adding documents\n\n- Drop files into `content/`, then run `curl -X POST http://localhost:3000/api/ingest`\n- Or use the upload panel in the UI for PDF, DOCX, XLSX, PPTX, CSV, HTML, RTF, EPUB, TXT, and MD files\n\n## Production notes\n\nThis is a starter template, not a production-ready setup. For production, consider:\n\n- **Vector store**: Replace the default store with pgvector, Pinecone, or Qdrant for datasets beyond ~10k chunks\n- **Reranking**: Add a cross-encoder reranker (e.g. Cohere Rerank) after retrieval to improve precision\n- **Hybrid search**: Combine dense vectors with BM25 keyword matching for better recall\n",
70
70
  "store.ts": "import { ragStore } from \"veryfront/embedding\";\n\nexport const store = ragStore({\n storagePath: \"data/index.json\",\n contentDir: \"content\",\n});\n",
71
71
  "tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"jsx\": \"react-jsx\",\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"noEmit\": true,\n \"allowImportingTsExtensions\": true,\n \"paths\": {\n \"@/*\": [\"./*\"],\n \"react-markdown@*\": [\"./node_modules/react-markdown\"],\n \"remark-gfm@*\": [\"./node_modules/remark-gfm\"]\n }\n },\n \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n \"exclude\": [\"node_modules\"]\n}\n"
72
72
  }
package/esm/deno.d.ts CHANGED
@@ -343,6 +343,10 @@ declare namespace _default {
343
343
  "#std/async.ts": string;
344
344
  "#std/front-matter/yaml": string;
345
345
  "#std/front-matter/yaml.ts": string;
346
+ "#std/yaml": string;
347
+ "#std/yaml.ts": string;
348
+ "#std/yaml/parse": string;
349
+ "#std/yaml/parse.ts": string;
346
350
  "@std/path": string;
347
351
  "@std/assert": string;
348
352
  "@std/dotenv": string;
@@ -387,6 +391,7 @@ declare namespace _default {
387
391
  build: string;
388
392
  "build:proxy-lock": string;
389
393
  "build:npm": string;
394
+ "verify:dist": string;
390
395
  release: string;
391
396
  test: string;
392
397
  "test:unit": string;
@@ -429,6 +434,7 @@ declare namespace _default {
429
434
  "docs:check-links": string;
430
435
  "lint:ban-zod": string;
431
436
  "lint:core-deps": string;
437
+ "lint:cross-runtime-jsr": string;
432
438
  "lint:dependency-boundaries": string;
433
439
  "lint:module-boundaries": string;
434
440
  "lint:extension-contracts": string;
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.1225",
3
+ "version": "0.1.1227",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "minimumDependencyAge": {
@@ -413,6 +413,10 @@ export default {
413
413
  "#std/async.ts": "jsr:@std/async@1.2.0",
414
414
  "#std/front-matter/yaml": "./src/platform/compat/std/front-matter-yaml.ts",
415
415
  "#std/front-matter/yaml.ts": "./src/platform/compat/std/front-matter-yaml.ts",
416
+ "#std/yaml": "./src/platform/compat/std/yaml.ts",
417
+ "#std/yaml.ts": "./src/platform/compat/std/yaml.ts",
418
+ "#std/yaml/parse": "./src/platform/compat/std/yaml.ts",
419
+ "#std/yaml/parse.ts": "./src/platform/compat/std/yaml.ts",
416
420
  "@std/path": "jsr:@std/path@1.1.4",
417
421
  "@std/assert": "jsr:@std/assert@1.0.19",
418
422
  "@std/dotenv": "jsr:@std/dotenv@0.225.6",
@@ -420,7 +424,7 @@ export default {
420
424
  "@std/fmt/colors": "jsr:@std/fmt@1.0.9/colors",
421
425
  "@std/testing": "jsr:@std/testing@1.0.17",
422
426
  "@std/testing/bdd": "jsr:@std/testing@1.0.17/bdd",
423
- "@std/yaml/parse": "jsr:@std/yaml@1.1.0/parse",
427
+ "@std/yaml/parse": "./src/platform/compat/std/yaml.ts",
424
428
  "@std/expect": "jsr:@std/expect@1.0.18",
425
429
  "@std/fs": "jsr:@std/fs@1.0.23",
426
430
  "@std/async": "jsr:@std/async@1.2.0",
@@ -463,6 +467,7 @@ export default {
463
467
  "build": "deno task build:prepare && deno run -A scripts/build/compile-binary.ts --output ./bin/veryfront",
464
468
  "build:proxy-lock": "deno cache --node-modules-dir=none --lock scripts/build/proxy-deno.lock cli/proxy-main.ts",
465
469
  "build:npm": "deno run -A scripts/build/generate-integrations-module.ts && deno task generate && deno run --config=scripts/test.deno.json --frozen -A scripts/build/build-npm-dnt.ts",
470
+ "verify:dist": "deno task build && deno task build:npm",
466
471
  "release": "deno run -A scripts/release.ts",
467
472
  "test": "deno task generate && DENO_TESTING=1 VF_DISABLE_LRU_INTERVAL=1 SSR_TRANSFORM_PER_PROJECT_LIMIT=0 REVALIDATION_PER_PROJECT_LIMIT=0 NODE_ENV=production LOG_FORMAT=text deno test --preload=src/testing/preload.ts --no-check --parallel --allow-all '--ignore=tests/e2e,tests/integration/compiled-binary-e2e.test.ts,scripts' --unstable-worker-options --unstable-net",
468
473
  "test:unit": "deno task generate && DENO_TESTING=1 VF_DISABLE_LRU_INTERVAL=1 SSR_TRANSFORM_PER_PROJECT_LIMIT=0 REVALIDATION_PER_PROJECT_LIMIT=0 NODE_ENV=production LOG_FORMAT=text deno test --preload=src/testing/preload.ts --no-check --parallel --allow-all --v8-flags=--max-old-space-size=8192 '--ignore=tests,src/workflow/__tests__' --unstable-worker-options --unstable-net $(find src cli -name '*.test.ts*' ! -name '*.integration.test.ts*')",
@@ -484,12 +489,12 @@ export default {
484
489
  "build:storybook": "npm --prefix storybook run build-storybook",
485
490
  "storybook:check": "deno test --no-lock --config=scripts/test.deno.json --no-check --allow-read scripts/storybook/storybook-workbench.test.ts",
486
491
  "lint": "DENO_NO_PACKAGE_JSON=1 deno lint && deno lint --config=scripts/test.deno.json scripts/test/ scripts/build/dnt-polyfill.ts scripts/build/dnt-polyfill.test.ts scripts/build/npm-package-metadata.test.ts scripts/build/prepare-framework-sources.test.ts && deno lint --config=scripts/codemods/deno.json scripts/codemods/",
487
- "lint:ci": "deno task lint && deno task lint:core-deps && deno task lint:dependency-boundaries && deno task lint:module-boundaries && deno task lint:extension-contracts && deno task lint:extension-capabilities && deno task lint:ban-test-only && deno task lint:sanitizer-baseline && deno task lint:skipped-tests && deno task lint:chat-ratchets && deno task lint:esm-sh-codemod && deno task lint:test-typecheck && deno task storybook:check && deno task docs:api-reference:check && deno test --frozen --config=scripts/test.deno.json --no-check --allow-read --allow-write scripts/ci/setup-deno-workflow.test.ts scripts/build/generated-artifact-checks.test.ts",
492
+ "lint:ci": "deno task lint && deno task lint:core-deps && deno task lint:cross-runtime-jsr && deno task lint:dependency-boundaries && deno task lint:module-boundaries && deno task lint:extension-contracts && deno task lint:extension-capabilities && deno task lint:ban-test-only && deno task lint:sanitizer-baseline && deno task lint:skipped-tests && deno task lint:chat-ratchets && deno task lint:esm-sh-codemod && deno task lint:test-typecheck && deno task storybook:check && deno task docs:api-reference:check && deno test --frozen --config=scripts/test.deno.json --no-check --allow-read --allow-write scripts/ci/setup-deno-workflow.test.ts scripts/build/generated-artifact-checks.test.ts",
488
493
  "fmt": "deno fmt src/ cli/ react/ && deno fmt --config=scripts/test.deno.json scripts/test/ scripts/build/dnt-polyfill.ts scripts/build/dnt-polyfill.test.ts scripts/build/prepare-framework-sources.test.ts && deno fmt --config=scripts/codemods/deno.json scripts/codemods/",
489
494
  "fmt:check": "deno fmt --check src/ cli/ react/ && deno fmt --check --config=scripts/test.deno.json scripts/test/ scripts/build/dnt-polyfill.ts scripts/build/dnt-polyfill.test.ts scripts/build/prepare-framework-sources.test.ts && deno fmt --check --config=scripts/codemods/deno.json scripts/codemods/",
490
495
  "typecheck": "deno task generate:manifests:check && deno check src/index.ts cli/main.ts src/server/index.ts src/routing/api/index.ts src/rendering/index.ts src/platform/index.ts src/platform/adapters/index.ts src/build/index.ts src/build/production-build/index.ts src/transforms/index.ts src/config/index.ts src/utils/index.ts src/data/index.ts src/security/index.ts src/middleware/index.ts src/server/handlers/dev/index.ts src/server/handlers/request/api/index.ts src/rendering/cache/index.ts src/rendering/cache/stores/index.ts src/rendering/rsc/actions/index.ts src/html/index.ts src/html/hydration-script-builder/runtime/main.ts src/modules/index.ts src/proxy/main.ts src/react/components/ui/index.ts src/chat/index.ts src/markdown/index.ts src/mdx/index.ts src/fs/index.ts src/oauth/index.ts src/agent/index.ts src/agent/service/route-export.check.ts src/eval/index.ts src/tool/index.ts src/workflow/index.ts src/prompt/index.ts src/resource/index.ts src/runs/index.ts src/mcp/index.ts src/provider/index.ts",
491
- "verify": "deno task generate:manifests:check && deno task fmt:check && deno task lint && deno task lint:style && deno task lint:chat-composability && deno task lint:chat-ratchets && deno task lint:esm-sh-codemod && deno task lint:cli-boundary && deno task lint:wildcard-exports && deno task lint:barrel-jsdoc && deno task lint:ban-test-only && deno task lint:sanitizer-baseline && deno task lint:skipped-tests && deno task lint:ban-zod && deno task lint:core-deps && deno task lint:dependency-boundaries && deno task lint:module-boundaries && deno task lint:extension-contracts && deno task lint:extension-capabilities && deno task docs:api-reference:check && deno task docs:validate && deno task typecheck && deno task typecheck:consumer && deno task test && deno task test:scripts && deno task test:e2e:binary",
492
- "verify:quick": "deno task generate:manifests:check && deno task fmt:check && deno task lint && deno task lint:style && deno task lint:chat-composability && deno task lint:chat-ratchets && deno task lint:esm-sh-codemod && deno task lint:cli-boundary && deno task lint:wildcard-exports && deno task lint:barrel-jsdoc && deno task lint:ban-test-only && deno task lint:sanitizer-baseline && deno task lint:skipped-tests && deno task lint:ban-zod && deno task lint:core-deps && deno task lint:dependency-boundaries && deno task lint:module-boundaries && deno task lint:extension-contracts && deno task lint:extension-capabilities && deno task docs:api-reference:check && deno task docs:validate && deno task typecheck",
496
+ "verify": "deno task generate:manifests:check && deno task fmt:check && deno task lint && deno task lint:style && deno task lint:chat-composability && deno task lint:chat-ratchets && deno task lint:esm-sh-codemod && deno task lint:cli-boundary && deno task lint:wildcard-exports && deno task lint:barrel-jsdoc && deno task lint:ban-test-only && deno task lint:sanitizer-baseline && deno task lint:skipped-tests && deno task lint:ban-zod && deno task lint:core-deps && deno task lint:cross-runtime-jsr && deno task lint:dependency-boundaries && deno task lint:module-boundaries && deno task lint:extension-contracts && deno task lint:extension-capabilities && deno task docs:api-reference:check && deno task docs:validate && deno task typecheck && deno task typecheck:consumer && deno task test && deno task test:scripts && deno task test:e2e:binary",
497
+ "verify:quick": "deno task generate:manifests:check && deno task fmt:check && deno task lint && deno task lint:style && deno task lint:chat-composability && deno task lint:chat-ratchets && deno task lint:esm-sh-codemod && deno task lint:cli-boundary && deno task lint:wildcard-exports && deno task lint:barrel-jsdoc && deno task lint:ban-test-only && deno task lint:sanitizer-baseline && deno task lint:skipped-tests && deno task lint:ban-zod && deno task lint:core-deps && deno task lint:cross-runtime-jsr && deno task lint:dependency-boundaries && deno task lint:module-boundaries && deno task lint:extension-contracts && deno task lint:extension-capabilities && deno task docs:api-reference:check && deno task docs:validate && deno task typecheck",
493
498
  "typecheck:consumer": "deno run --allow-read --allow-run --allow-env --allow-write scripts/typecheck/run-consumer-typecheck.ts",
494
499
  "codemod:chat": "deno run --frozen --config=scripts/codemods/deno.json --allow-read --allow-write --allow-env=BABEL_TYPES_8_BREAKING scripts/codemods/migrate-chat-composition.ts",
495
500
  "codemod:esm-sh": "deno run --frozen --config=scripts/codemods/deno.json --allow-read --allow-write --allow-env=BABEL_TYPES_8_BREAKING scripts/codemods/migrate-esm-sh-imports.ts",
@@ -505,6 +510,7 @@ export default {
505
510
  "docs:check-links": "deno run -A scripts/lint/check-doc-links.ts",
506
511
  "lint:ban-zod": "deno run --allow-read scripts/lint/ban-zod-imports.ts",
507
512
  "lint:core-deps": "deno run --allow-read scripts/lint/audit-core-deps.ts",
513
+ "lint:cross-runtime-jsr": "deno run --allow-read scripts/lint/audit-cross-runtime-jsr.ts",
508
514
  "lint:dependency-boundaries": "deno run --allow-read scripts/lint/audit-dependency-boundaries.ts",
509
515
  "lint:module-boundaries": "DENO_NO_PACKAGE_JSON=1 deno run --frozen --allow-read scripts/lint/check-module-boundaries.ts",
510
516
  "lint:extension-contracts": "deno run --config=scripts/test.deno.json --frozen --allow-read scripts/lint/audit-extension-contracts.ts",
@@ -526,7 +532,7 @@ export default {
526
532
  "lint:ban-test-only": "deno run --allow-read scripts/lint/ban-test-only.ts",
527
533
  "lint:sanitizer-baseline": "deno run --allow-read scripts/lint/check-sanitizer-baseline.ts",
528
534
  "lint:skipped-tests": "deno run --allow-read scripts/lint/check-skipped-tests-baseline.ts",
529
- "test:scripts": "deno test --config=scripts/test.deno.json --no-check --allow-read --allow-write --allow-run scripts/ci/publish-npm-packages.test.ts scripts/ci/setup-deno-workflow.test.ts scripts/build/compile-binary.test.ts scripts/build/dnt-polyfill.test.ts scripts/build/generate-sbom.test.ts scripts/build/generated-artifact-checks.test.ts scripts/build/npm-dependency-sources.test.ts scripts/build/npm-extension-package-metadata.test.ts scripts/build/npm-package-metadata.test.ts scripts/build/npm-react-shims.test.ts scripts/build/npm-runtime-helper-contract.test.ts scripts/build/prepare-framework-sources.test.ts scripts/docs/docs-coverage.test.ts scripts/docs/generate-api-reference.test.ts scripts/docs/guide-validation.test.ts scripts/lint/audit-core-deps.test.ts scripts/lint/audit-dependency-boundaries.test.ts scripts/lint/audit-extension-capabilities.test.ts scripts/lint/audit-extension-contracts.test.ts scripts/lint/audit-deps.test.ts scripts/lint/check-module-boundaries.test.ts scripts/lint/lint-config.test.ts scripts/lint/ban-test-only.test.ts scripts/lint/check-sanitizer-baseline.test.ts scripts/lint/check-skipped-tests-baseline.test.ts scripts/lint/check-test-typecheck-baseline.test.ts scripts/lint/check-coverage.test.ts scripts/security/audit-npm.test.ts scripts/security/submit-dependency-snapshot.test.ts && deno task test:tool-search-live",
535
+ "test:scripts": "deno test --config=scripts/test.deno.json --no-check --allow-read --allow-write --allow-run scripts/ci/publish-npm-packages.test.ts scripts/ci/setup-deno-workflow.test.ts scripts/build/compile-binary.test.ts scripts/build/dnt-polyfill.test.ts scripts/build/generate-sbom.test.ts scripts/build/generated-artifact-checks.test.ts scripts/build/npm-dependency-sources.test.ts scripts/build/npm-extension-package-metadata.test.ts scripts/build/npm-package-metadata.test.ts scripts/build/npm-react-shims.test.ts scripts/build/npm-runtime-helper-contract.test.ts scripts/build/prepare-framework-sources.test.ts scripts/docs/docs-coverage.test.ts scripts/docs/generate-api-reference.test.ts scripts/docs/guide-validation.test.ts scripts/lint/audit-core-deps.test.ts scripts/lint/audit-cross-runtime-jsr.test.ts scripts/lint/audit-dependency-boundaries.test.ts scripts/lint/audit-extension-capabilities.test.ts scripts/lint/audit-extension-contracts.test.ts scripts/lint/audit-deps.test.ts scripts/lint/check-module-boundaries.test.ts scripts/lint/lint-config.test.ts scripts/lint/ban-test-only.test.ts scripts/lint/check-sanitizer-baseline.test.ts scripts/lint/check-skipped-tests-baseline.test.ts scripts/lint/check-test-typecheck-baseline.test.ts scripts/lint/check-coverage.test.ts scripts/security/audit-npm.test.ts scripts/security/submit-dependency-snapshot.test.ts && deno task test:tool-search-live",
530
536
  "test:sentry-runtime-packages": "deno test --config=scripts/test.deno.json --no-check --no-lock --allow-read --allow-write --allow-run --allow-env=DENO_DIR,HOME,XDG_CACHE_HOME,LOCALAPPDATA,USERPROFILE scripts/build/sentry-runtime-packages.test.ts",
531
537
  "test:tool-search-live": "VF_DISABLE_LRU_INTERVAL=1 deno test --no-check -A tests/agent/verify-tool-search-live.test.ts",
532
538
  "test:cross-runtime": "deno run --allow-all src/platform/compat/cross-runtime.test.ts",
@@ -1 +1 @@
1
- {"version":3,"file":"hosted-chat-finalization.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/hosted-chat-finalization.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAuC,MAAM,qBAAqB,CAAC;AAO9F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAKxF,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAe/F,KAAK,4BAA4B,GAAG;IAClC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACtE,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,YAAY,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC,SAAS,OAAO,EAAE,CAAC,CAAA;KAAE,CAAC;IACzD,gBAAgB,EAAE,mCAAmC,CAAC;IACtD,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gCAAgC,EAAE,MAAM,CAAC;IACzC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,4BAA4B,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAClC,4BAA4B,GAC5B,CACE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,eAAe,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,qBAAqB,EAAE,OAAO,CAAA;CAAE,CAC3E,CAAC;AA4QJ,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,IAAI,CAAC,CA8Ef"}
1
+ {"version":3,"file":"hosted-chat-finalization.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/hosted-chat-finalization.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAuC,MAAM,qBAAqB,CAAC;AAO9F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAExF,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAe/F,KAAK,4BAA4B,GAAG;IAClC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACtE,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,YAAY,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC,SAAS,OAAO,EAAE,CAAC,CAAA;KAAE,CAAC;IACzD,gBAAgB,EAAE,mCAAmC,CAAC;IACtD,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gCAAgC,EAAE,MAAM,CAAC;IACzC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,4BAA4B,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAClC,4BAA4B,GAC5B,CACE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,eAAe,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,qBAAqB,EAAE,OAAO,CAAA;CAAE,CAC3E,CAAC;AA4QJ,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,IAAI,CAAC,CA8Ef"}
@@ -2,7 +2,7 @@ import { extractChatMessageMetadata } from "../../chat/chat-ui-message-helpers.j
2
2
  import { isToolUiPart } from "../../chat/conversation.js";
3
3
  import { getLastStreamStep } from "../../chat/final-step-fallback.js";
4
4
  import { dispatchConversationHostedTerminalState, resolveConversationHostedTerminalState, toConversationHostedTerminalState, } from "../conversation/hosted-terminal.js";
5
- import { hasCompletedStepSignal, isLateProviderBodyReadError, } from "../streaming/stream-outcome.js";
5
+ import { hasCompletedStepSignal, isStreamTimeoutError } from "../streaming/stream-outcome.js";
6
6
  import { buildDetachedFallbackChunks, buildDetachedFallbackMessageState, buildFinalizedMessageFallbackChunks, buildFinalizedMessageState, } from "./finalized-message.js";
7
7
  import { getEmptyHostedFinalizedMessageTerminalError, shouldFailEmptyHostedFinalizedMessage, } from "./stream-terminal-error.js";
8
8
  const FINALIZATION_TERMINAL_STATE_FALLBACK_MODEL_ID = "";
@@ -140,7 +140,7 @@ function shouldFailStreamError(input) {
140
140
  }
141
141
  if (input.hasOutput &&
142
142
  hasFinalStepCompletionSignal(input.finalStep) &&
143
- isLateProviderBodyReadError(input.streamError)) {
143
+ !isStreamTimeoutError(input.streamError)) {
144
144
  return false;
145
145
  }
146
146
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"stream-terminal-error.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/stream-terminal-error.ts"],"names":[],"mappings":"AAyDA,8CAA8C;AAC9C,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAkDF,uCAAuC;AACvC,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,CAErE;AAED,mEAAmE;AACnE,wBAAgB,2CAA2C,CAAC,KAAK,EAAE;IACjE,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B,GAAG,yBAAyB,CAQ5B;AAED,4DAA4D;AAC5D,wBAAgB,qCAAqC,CAAC,KAAK,EAAE;IAC3D,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE;QAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;CAC5C,GAAG,OAAO,CAEV"}
1
+ {"version":3,"file":"stream-terminal-error.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/stream-terminal-error.ts"],"names":[],"mappings":"AAoDA,8CAA8C;AAC9C,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAkDF,uCAAuC;AACvC,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,CAErE;AAED,mEAAmE;AACnE,wBAAgB,2CAA2C,CAAC,KAAK,EAAE;IACjE,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B,GAAG,yBAAyB,CAQ5B;AAED,4DAA4D;AAC5D,wBAAgB,qCAAqC,CAAC,KAAK,EAAE;IAC3D,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE;QAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;CAC5C,GAAG,OAAO,CAEV"}
@@ -1,6 +1,7 @@
1
1
  import { isRecord } from "../../chat/conversation.js";
2
2
  import { extractFinalStepTerminalError } from "../../chat/final-step-fallback.js";
3
3
  import { parseProviderError } from "../../chat/provider-errors.js";
4
+ import { isStreamTimeoutError } from "../streaming/stream-outcome.js";
4
5
  const EMPTY_RESPONSE_TERMINAL_ERROR_CODE = "EMPTY_RESPONSE";
5
6
  const EMPTY_RESPONSE_TERMINAL_ERROR_MESSAGE = "Assistant completed without producing a response";
6
7
  const EXTERNAL_SERVICE_ERROR_CODE = "EXTERNAL_SERVICE_ERROR";
@@ -31,12 +32,7 @@ function formatTimeoutDuration(input) {
31
32
  }
32
33
  function getHostedStreamTimeoutTerminalError(error) {
33
34
  const message = getUnknownErrorMessage(error).trim();
34
- const normalized = message.toLowerCase();
35
- const isTimeout = normalized.includes("stream timed out") ||
36
- normalized.includes("chat stream idle timeout") ||
37
- normalized.includes("chat stream bootstrap timeout") ||
38
- normalized.includes("stream timeout");
39
- if (!isTimeout) {
35
+ if (!isStreamTimeoutError(error)) {
40
36
  return null;
41
37
  }
42
38
  const duration = formatTimeoutDuration(message);
@@ -16,6 +16,8 @@ export declare function getStreamErrorMessage(error: unknown): string;
16
16
  * when output and a completion signal are present.
17
17
  */
18
18
  export declare function isLateProviderBodyReadError(error: unknown): boolean;
19
+ /** True when a thrown stream error represents a lifecycle or watchdog timeout. */
20
+ export declare function isStreamTimeoutError(error: unknown): boolean;
19
21
  /** True when the provider finish reason marks a completed step. */
20
22
  export declare function hasCompletedStepSignal(finishReason: string | null): boolean;
21
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"stream-outcome.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/streaming/stream-outcome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAiB5D;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEnE;AAED,mEAAmE;AACnE,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAW3E;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,IAAI,CAaP;AAED,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAE9B,wDAAwD;AACxD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,wBAAwB,CAAC;IACxC,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,yBAAyB,GAC/B,aAAa,CAqDf;AAED,qEAAqE;AACrE,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,GACjC,uBAAuB,EAAE,CAa3B"}
1
+ {"version":3,"file":"stream-outcome.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/streaming/stream-outcome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAiB5D;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEnE;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM5D;AAED,mEAAmE;AACnE,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAW3E;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,IAAI,CAaP;AAED,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAE9B,wDAAwD;AACxD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,wBAAwB,CAAC;IACxC,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,yBAAyB,GAC/B,aAAa,CAqDf;AAED,qEAAqE;AACrE,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,GACjC,uBAAuB,EAAE,CAa3B"}