veryfront 0.1.1046 → 0.1.1047

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 (140) hide show
  1. package/esm/cli/app/handlers/view-handlers.js +2 -2
  2. package/esm/cli/auth/index.d.ts +1 -1
  3. package/esm/cli/auth/index.d.ts.map +1 -1
  4. package/esm/cli/auth/index.js +1 -1
  5. package/esm/cli/auth/login.d.ts +11 -3
  6. package/esm/cli/auth/login.d.ts.map +1 -1
  7. package/esm/cli/auth/login.js +76 -32
  8. package/esm/cli/commands/dev/command.d.ts +6 -0
  9. package/esm/cli/commands/dev/command.d.ts.map +1 -1
  10. package/esm/cli/commands/dev/command.js +27 -19
  11. package/esm/cli/commands/whoami/command-help.js +2 -2
  12. package/esm/cli/sync/project-discovery.d.ts +2 -1
  13. package/esm/cli/sync/project-discovery.d.ts.map +1 -1
  14. package/esm/cli/sync/project-discovery.js +16 -7
  15. package/esm/deno.js +1 -1
  16. package/esm/src/agent/child-run/execution-cleanup.d.ts.map +1 -1
  17. package/esm/src/agent/child-run/execution-cleanup.js +11 -1
  18. package/esm/src/agent/hosted/child-fork-tool-sources.d.ts.map +1 -1
  19. package/esm/src/agent/hosted/child-fork-tool-sources.js +9 -1
  20. package/esm/src/agent/hosted/child-requested-tools.d.ts.map +1 -1
  21. package/esm/src/agent/hosted/child-requested-tools.js +3 -2
  22. package/esm/src/agent/memory/memory.d.ts.map +1 -1
  23. package/esm/src/agent/memory/memory.js +4 -1
  24. package/esm/src/agent/memory/redis.d.ts.map +1 -1
  25. package/esm/src/agent/memory/redis.js +14 -3
  26. package/esm/src/agent/streaming/data-stream.d.ts.map +1 -1
  27. package/esm/src/agent/streaming/data-stream.js +7 -2
  28. package/esm/src/agent/streaming/fork-runtime-stream.d.ts.map +1 -1
  29. package/esm/src/agent/streaming/fork-runtime-stream.js +22 -10
  30. package/esm/src/agent/streaming/tool-input.d.ts.map +1 -1
  31. package/esm/src/agent/streaming/tool-input.js +11 -1
  32. package/esm/src/cache/cache-key-builder.d.ts.map +1 -1
  33. package/esm/src/cache/cache-key-builder.js +11 -5
  34. package/esm/src/cache/dependency-graph.d.ts.map +1 -1
  35. package/esm/src/cache/dependency-graph.js +21 -4
  36. package/esm/src/cache/hash.d.ts.map +1 -1
  37. package/esm/src/cache/hash.js +13 -1
  38. package/esm/src/eval/agent-service/durable-run-canaries/runner.d.ts.map +1 -1
  39. package/esm/src/eval/agent-service/durable-run-canaries/runner.js +4 -3
  40. package/esm/src/integrations/remote-tools.d.ts.map +1 -1
  41. package/esm/src/integrations/remote-tools.js +8 -0
  42. package/esm/src/knowledge/index.js +1 -1
  43. package/esm/src/mcp/http-transport.d.ts.map +1 -1
  44. package/esm/src/mcp/http-transport.js +13 -6
  45. package/esm/src/mcp/server.d.ts +9 -0
  46. package/esm/src/mcp/server.d.ts.map +1 -1
  47. package/esm/src/mcp/server.js +48 -5
  48. package/esm/src/mcp/task-store.d.ts.map +1 -1
  49. package/esm/src/mcp/task-store.js +17 -13
  50. package/esm/src/oauth/handlers/callback-handler.d.ts.map +1 -1
  51. package/esm/src/oauth/handlers/callback-handler.js +9 -1
  52. package/esm/src/oauth/handlers/init-handler.d.ts.map +1 -1
  53. package/esm/src/oauth/handlers/init-handler.js +9 -1
  54. package/esm/src/oauth/providers/base.d.ts.map +1 -1
  55. package/esm/src/oauth/providers/base.js +4 -0
  56. package/esm/src/platform/adapters/base.d.ts +16 -0
  57. package/esm/src/platform/adapters/base.d.ts.map +1 -1
  58. package/esm/src/platform/adapters/runtime/deno/adapter.d.ts +2 -0
  59. package/esm/src/platform/adapters/runtime/deno/adapter.d.ts.map +1 -1
  60. package/esm/src/platform/adapters/runtime/deno/adapter.js +15 -0
  61. package/esm/src/platform/adapters/runtime/node/filesystem-adapter.d.ts +2 -0
  62. package/esm/src/platform/adapters/runtime/node/filesystem-adapter.d.ts.map +1 -1
  63. package/esm/src/platform/adapters/runtime/node/filesystem-adapter.js +15 -0
  64. package/esm/src/prompt/factory.js +10 -1
  65. package/esm/src/provider/runtime-loader/provider-http.d.ts.map +1 -1
  66. package/esm/src/provider/runtime-loader/provider-http.js +21 -1
  67. package/esm/src/provider/runtime-loader/provider-sse.d.ts.map +1 -1
  68. package/esm/src/provider/runtime-loader/provider-sse.js +6 -1
  69. package/esm/src/proxy/main.js +7 -1
  70. package/esm/src/routing/api/api-route-matcher.d.ts.map +1 -1
  71. package/esm/src/routing/api/api-route-matcher.js +4 -0
  72. package/esm/src/routing/matchers/pattern-route-matcher.d.ts +1 -0
  73. package/esm/src/routing/matchers/pattern-route-matcher.d.ts.map +1 -1
  74. package/esm/src/routing/matchers/pattern-route-matcher.js +32 -1
  75. package/esm/src/runtime/runtime-bridge.d.ts.map +1 -1
  76. package/esm/src/runtime/runtime-bridge.js +29 -5
  77. package/esm/src/sandbox/config.d.ts.map +1 -1
  78. package/esm/src/sandbox/config.js +6 -7
  79. package/esm/src/sandbox/lazy-sandbox.d.ts.map +1 -1
  80. package/esm/src/sandbox/lazy-sandbox.js +7 -7
  81. package/esm/src/sandbox/sandbox.d.ts.map +1 -1
  82. package/esm/src/sandbox/sandbox.js +7 -7
  83. package/esm/src/security/deno-permissions.d.ts +9 -0
  84. package/esm/src/security/deno-permissions.d.ts.map +1 -1
  85. package/esm/src/security/deno-permissions.js +9 -0
  86. package/esm/src/security/path-validation/canonical.d.ts +10 -1
  87. package/esm/src/security/path-validation/canonical.d.ts.map +1 -1
  88. package/esm/src/security/path-validation/canonical.js +56 -8
  89. package/esm/src/security/path-validation/index.d.ts +1 -1
  90. package/esm/src/security/path-validation/index.d.ts.map +1 -1
  91. package/esm/src/security/path-validation/index.js +7 -3
  92. package/esm/src/security/sandbox/worker-egress-guard.d.ts.map +1 -1
  93. package/esm/src/security/sandbox/worker-egress-guard.js +4 -0
  94. package/esm/src/server/build-routes.d.ts.map +1 -1
  95. package/esm/src/server/build-routes.js +12 -2
  96. package/esm/src/server/dev-server/route-discovery.d.ts.map +1 -1
  97. package/esm/src/server/dev-server/route-discovery.js +8 -0
  98. package/esm/src/server/handlers/request/channel-dispatch-request.d.ts.map +1 -1
  99. package/esm/src/server/handlers/request/channel-dispatch-request.js +16 -1
  100. package/esm/src/server/handlers/request/ssr/error-page-fallback.d.ts.map +1 -1
  101. package/esm/src/server/handlers/request/ssr/error-page-fallback.js +5 -1
  102. package/esm/src/server/project-env/cache.d.ts.map +1 -1
  103. package/esm/src/server/project-env/cache.js +12 -1
  104. package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.d.ts.map +1 -1
  105. package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.js +1 -1
  106. package/esm/src/server/services/static/static-file.service.d.ts.map +1 -1
  107. package/esm/src/server/services/static/static-file.service.js +20 -2
  108. package/esm/src/tool/host-tools.d.ts.map +1 -1
  109. package/esm/src/tool/host-tools.js +3 -1
  110. package/esm/src/tool/remote-mcp.d.ts.map +1 -1
  111. package/esm/src/tool/remote-mcp.js +83 -20
  112. package/esm/src/utils/cache-file-ops.d.ts.map +1 -1
  113. package/esm/src/utils/cache-file-ops.js +5 -1
  114. package/esm/src/utils/import-map.d.ts.map +1 -1
  115. package/esm/src/utils/import-map.js +8 -1
  116. package/esm/src/utils/version-constant.d.ts +1 -1
  117. package/esm/src/utils/version-constant.js +1 -1
  118. package/esm/src/workflow/backends/memory.d.ts +2 -2
  119. package/esm/src/workflow/backends/memory.d.ts.map +1 -1
  120. package/esm/src/workflow/backends/memory.js +11 -4
  121. package/esm/src/workflow/backends/redis/index.d.ts +2 -2
  122. package/esm/src/workflow/backends/redis/index.d.ts.map +1 -1
  123. package/esm/src/workflow/backends/redis/index.js +5 -3
  124. package/esm/src/workflow/backends/types.d.ts +4 -2
  125. package/esm/src/workflow/backends/types.d.ts.map +1 -1
  126. package/esm/src/workflow/blob/local-storage.d.ts.map +1 -1
  127. package/esm/src/workflow/blob/local-storage.js +19 -6
  128. package/esm/src/workflow/executor/dag/index.d.ts.map +1 -1
  129. package/esm/src/workflow/executor/dag/index.js +13 -1
  130. package/esm/src/workflow/executor/dag/loop-node-strategy.d.ts.map +1 -1
  131. package/esm/src/workflow/executor/dag/loop-node-strategy.js +6 -1
  132. package/esm/src/workflow/executor/workflow-executor.d.ts +4 -0
  133. package/esm/src/workflow/executor/workflow-executor.d.ts.map +1 -1
  134. package/esm/src/workflow/executor/workflow-executor.js +58 -4
  135. package/esm/src/workflow/worker/executors/process.d.ts.map +1 -1
  136. package/esm/src/workflow/worker/executors/process.js +49 -2
  137. package/esm/src/workflow/worker/run-manager.d.ts +2 -0
  138. package/esm/src/workflow/worker/run-manager.d.ts.map +1 -1
  139. package/esm/src/workflow/worker/run-manager.js +25 -5
  140. package/package.json +4 -4
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { navigateTo } from "../state.js";
8
8
  import { moveDown, moveUp } from "../components/list-select.js";
9
- import { login } from "../../auth/login.js";
9
+ import { isApiKeyIdentity, login } from "../../auth/login.js";
10
10
  import { fetchRemoteProjects } from "../../sync/index.js";
11
11
  import { addLog, updateRemote } from "../state.js";
12
12
  const KEY_UP = "\x1b[A";
@@ -112,7 +112,7 @@ export function handleAuthKey(key, ctx) {
112
112
  update(navigateTo("dashboard"));
113
113
  void (async () => {
114
114
  const user = await login(provider);
115
- if (user) {
115
+ if (user && !isApiKeyIdentity(user)) {
116
116
  const result = await fetchRemoteProjects();
117
117
  update(updateRemote({
118
118
  user,
@@ -1,4 +1,4 @@
1
- export { type AuthMethod, createOAuthAuthorizationUrl, createOAuthState, deleteToken, ensureAuthenticated, hasToken, login, logout, readToken, saveToken, type UserInfo, validateToken, whoami, } from "./login.js";
1
+ export { type ApiKeyIdentity, type AuthIdentity, type AuthMethod, createOAuthAuthorizationUrl, createOAuthState, deleteToken, ensureAuthenticated, hasToken, isApiKeyIdentity, login, logout, readToken, saveToken, type UserInfo, validateCredential, validateToken, whoami, } from "./login.js";
2
2
  export { type CallbackServer, getCallbackUrl, startCallbackServer } from "./callback-server.js";
3
3
  export { getTokenLocation } from "./token-store.js";
4
4
  export { canOpenBrowser, openBrowser } from "./browser.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EACf,2BAA2B,EAC3B,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,KAAK,EACL,MAAM,EACN,SAAS,EACT,SAAS,EACT,KAAK,QAAQ,EACb,aAAa,EACb,MAAM,GACP,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,2BAA2B,EAC3B,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,gBAAgB,EAChB,KAAK,EACL,MAAM,EACN,SAAS,EACT,SAAS,EACT,KAAK,QAAQ,EACb,kBAAkB,EAClB,aAAa,EACb,MAAM,GACP,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -1,4 +1,4 @@
1
- export { createOAuthAuthorizationUrl, createOAuthState, deleteToken, ensureAuthenticated, hasToken, login, logout, readToken, saveToken, validateToken, whoami, } from "./login.js";
1
+ export { createOAuthAuthorizationUrl, createOAuthState, deleteToken, ensureAuthenticated, hasToken, isApiKeyIdentity, login, logout, readToken, saveToken, validateCredential, validateToken, whoami, } from "./login.js";
2
2
  export { getCallbackUrl, startCallbackServer } from "./callback-server.js";
3
3
  export { getTokenLocation } from "./token-store.js";
4
4
  export { canOpenBrowser, openBrowser } from "./browser.js";
@@ -6,12 +6,20 @@ export interface UserInfo {
6
6
  email: string;
7
7
  name?: string;
8
8
  }
9
+ export interface ApiKeyIdentity {
10
+ authenticated: true;
11
+ type: "apiKey";
12
+ }
13
+ export type AuthIdentity = UserInfo | ApiKeyIdentity;
9
14
  export declare function createOAuthState(): string;
10
15
  export declare function createOAuthAuthorizationUrl(provider: "google" | "github" | "microsoft", callbackUrl: string, state: string): string;
11
16
  export declare function validateToken(token: string): Promise<UserInfo | null>;
12
- export declare function login(method?: AuthMethod): Promise<UserInfo | null>;
13
- export declare function ensureAuthenticated(env?: EnvironmentConfig): Promise<UserInfo | null>;
17
+ export declare function isApiKeyToken(token: string): boolean;
18
+ export declare function isApiKeyIdentity(identity: AuthIdentity): identity is ApiKeyIdentity;
19
+ export declare function validateCredential(token: string): Promise<AuthIdentity | null>;
20
+ export declare function login(method?: AuthMethod): Promise<AuthIdentity | null>;
21
+ export declare function ensureAuthenticated(env?: EnvironmentConfig): Promise<AuthIdentity | null>;
14
22
  export declare function logout(): Promise<void>;
15
- export declare function whoami(env?: EnvironmentConfig): Promise<UserInfo | null>;
23
+ export declare function whoami(env?: EnvironmentConfig): Promise<AuthIdentity | null>;
16
24
  export { deleteToken, hasToken, readToken, saveToken };
17
25
  //# sourceMappingURL=login.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/login.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,iBAAiB,EAAwB,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,WAAW,EAAoB,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQjG,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AASD,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,EAC3C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,MAAM,CAQR;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAgB3E;AA6ID,wBAAsB,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA8BzE;AAED,wBAAsB,mBAAmB,CACvC,GAAG,GAAE,iBAA0C,GAC9C,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAqB1B;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAI5C;AAED,wBAAsB,MAAM,CAC1B,GAAG,GAAE,iBAA0C,GAC9C,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAmD1B;AAED,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/login.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,iBAAiB,EAAwB,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,WAAW,EAAoB,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQjG,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,IAAI,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,cAAc,CAAC;AASrD,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,EAC3C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,MAAM,CAQR;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAgB3E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,QAAQ,IAAI,cAAc,CAEnF;AAkBD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAQpF;AA6ID,wBAAsB,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAkC7E;AAED,wBAAsB,mBAAmB,CACvC,GAAG,GAAE,iBAA0C,GAC9C,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAqB9B;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAI5C;AAwCD,wBAAsB,MAAM,CAC1B,GAAG,GAAE,iBAA0C,GAC9C,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAiC9B;AAED,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC"}
@@ -44,6 +44,36 @@ export async function validateToken(token) {
44
44
  return null;
45
45
  }
46
46
  }
47
+ export function isApiKeyToken(token) {
48
+ return token.startsWith("vf_");
49
+ }
50
+ export function isApiKeyIdentity(identity) {
51
+ return "type" in identity && identity.type === "apiKey";
52
+ }
53
+ async function validateApiKey(token) {
54
+ if (!isApiKeyToken(token))
55
+ return false;
56
+ try {
57
+ const url = new URL(`${getApiUrl()}/projects`);
58
+ url.searchParams.set("limit", "1");
59
+ const response = await fetch(url, {
60
+ headers: { Authorization: `Bearer ${token}`, Accept: "application/json" },
61
+ });
62
+ await response.body?.cancel();
63
+ return response.ok;
64
+ }
65
+ catch {
66
+ return false;
67
+ }
68
+ }
69
+ export async function validateCredential(token) {
70
+ if (!token)
71
+ return null;
72
+ if (isApiKeyToken(token)) {
73
+ return (await validateApiKey(token)) ? { authenticated: true, type: "apiKey" } : null;
74
+ }
75
+ return validateToken(token);
76
+ }
47
77
  async function promptAuthMethod() {
48
78
  console.log();
49
79
  console.log(" " + dim("Choose authentication method:"));
@@ -178,29 +208,31 @@ export async function login(method) {
178
208
  if (!token)
179
209
  return null;
180
210
  console.log(" " + dim("Validating token..."));
181
- const userInfo = await validateToken(token);
182
- if (!userInfo) {
211
+ const identity = await validateCredential(token);
212
+ if (!identity) {
183
213
  console.log();
184
214
  console.log(" " + error("✗") + " Invalid token");
185
215
  return null;
186
216
  }
187
217
  await saveToken(token);
188
218
  console.log();
189
- console.log(" " + success("✓") + " Logged in as " + brand(userInfo.email));
190
- return userInfo;
219
+ console.log(isApiKeyIdentity(identity)
220
+ ? " " + success("✓") + " Authenticated with an API key"
221
+ : " " + success("✓") + " Logged in as " + brand(identity.email));
222
+ return identity;
191
223
  }
192
224
  export async function ensureAuthenticated(env = getEnvironmentConfig()) {
193
225
  if (env.apiToken) {
194
- const userInfo = await validateToken(env.apiToken);
195
- if (userInfo)
196
- return userInfo;
226
+ const credential = await validateCredential(env.apiToken);
227
+ if (credential)
228
+ return credential;
197
229
  console.log(" " + warning("Warning: VERYFRONT_API_TOKEN is invalid"));
198
230
  }
199
231
  const storedToken = await readToken(env);
200
232
  if (storedToken) {
201
- const userInfo = await validateToken(storedToken);
202
- if (userInfo)
203
- return userInfo;
233
+ const credential = await validateCredential(storedToken);
234
+ if (credential)
235
+ return credential;
204
236
  await deleteToken(env);
205
237
  console.log(" " + warning("Session expired. Please log in again."));
206
238
  }
@@ -215,33 +247,45 @@ export async function logout() {
215
247
  console.log();
216
248
  console.log(" " + success("✓") + " Logged out");
217
249
  }
218
- export async function whoami(env = getEnvironmentConfig()) {
219
- if (env.apiToken) {
220
- const userInfo = await validateToken(env.apiToken);
221
- if (userInfo) {
222
- if (isJsonMode()) {
223
- await outputJson(createSuccessEnvelope("whoami", { ...userInfo, source: "env" }));
224
- return userInfo;
225
- }
226
- console.log();
227
- console.log(" " + success("✓") + " Logged in as " + brand(userInfo.email));
228
- console.log(" " + dim("(via VERYFRONT_API_TOKEN)"));
250
+ async function reportCredential(token, source) {
251
+ const credential = await validateCredential(token);
252
+ if (!credential)
253
+ return null;
254
+ if (!isApiKeyIdentity(credential)) {
255
+ const userInfo = credential;
256
+ if (isJsonMode()) {
257
+ await outputJson(createSuccessEnvelope("whoami", { ...userInfo, source }));
229
258
  return userInfo;
230
259
  }
260
+ console.log();
261
+ console.log(" " + success("✓") + " Logged in as " + brand(userInfo.email));
262
+ }
263
+ else {
264
+ if (isJsonMode()) {
265
+ await outputJson(createSuccessEnvelope("whoami", {
266
+ authenticated: true,
267
+ credential_type: "api_key",
268
+ source,
269
+ }));
270
+ return { authenticated: true, type: "apiKey" };
271
+ }
272
+ console.log();
273
+ console.log(" " + success("✓") + " Authenticated with an API key");
274
+ }
275
+ console.log(" " + dim(source === "env" ? "(via VERYFRONT_API_TOKEN)" : `Token stored at: ${getTokenLocation()}`));
276
+ return credential;
277
+ }
278
+ export async function whoami(env = getEnvironmentConfig()) {
279
+ if (env.apiToken) {
280
+ const result = await reportCredential(env.apiToken, "env");
281
+ if (result)
282
+ return result;
231
283
  }
232
284
  const storedToken = await readToken();
233
285
  if (storedToken) {
234
- const userInfo = await validateToken(storedToken);
235
- if (userInfo) {
236
- if (isJsonMode()) {
237
- await outputJson(createSuccessEnvelope("whoami", { ...userInfo, source: "token-store" }));
238
- return userInfo;
239
- }
240
- console.log();
241
- console.log(" " + success("✓") + " Logged in as " + brand(userInfo.email));
242
- console.log(" " + dim(`Token stored at: ${getTokenLocation()}`));
243
- return userInfo;
244
- }
286
+ const result = await reportCredential(storedToken, "token-store");
287
+ if (result)
288
+ return result;
245
289
  }
246
290
  if (isJsonMode()) {
247
291
  await outputJson(createSuccessEnvelope("whoami", { authenticated: false }));
@@ -1,3 +1,5 @@
1
+ import { type AuthIdentity } from "../../auth/login.js";
2
+ import { type RemoteProject } from "../../sync/index.js";
1
3
  export interface DevOptions {
2
4
  port: number;
3
5
  projectDir: string;
@@ -12,5 +14,9 @@ export interface DevCommandResult {
12
14
  /** Stop the dev server programmatically (for demo mode) */
13
15
  stop: () => Promise<void>;
14
16
  }
17
+ export declare function preloadDevAuth(apiToken?: string): Promise<{
18
+ identity: AuthIdentity | null;
19
+ projects: RemoteProject[];
20
+ }>;
15
21
  export declare function devCommand(options: DevOptions): Promise<DevCommandResult>;
16
22
  //# sourceMappingURL=command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dev/command.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;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,2DAA2D;IAC3D,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwSzE"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/dev/command.ts"],"names":[],"mappings":"AAsBA,OAAO,EACL,KAAK,YAAY,EAIlB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAI9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;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,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,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqSzE"}
@@ -18,11 +18,24 @@ import { createKeyboardHandler } from "../../ui/keyboard.js";
18
18
  import { openBrowser } from "../../auth/browser.js";
19
19
  import { createMCPServer } from "../../mcp/server.js";
20
20
  import { withSpan } from "../../../src/observability/tracing/otlp-setup.js";
21
- import { login, validateToken } from "../../auth/login.js";
22
- import { readToken } from "../../auth/token-store.js";
21
+ import { isApiKeyIdentity, login, validateCredential, } from "../../auth/login.js";
23
22
  import { fetchRemoteProjects } from "../../sync/index.js";
24
23
  import { pullCommand } from "../pull/index.js";
25
24
  import { pushCommand } from "../push/index.js";
25
+ function authStatus(identity) {
26
+ return isApiKeyIdentity(identity)
27
+ ? "Authenticated with an API key"
28
+ : `Logged in as ${identity.email}`;
29
+ }
30
+ export async function preloadDevAuth(apiToken) {
31
+ if (!apiToken)
32
+ return { identity: null, projects: [] };
33
+ const identity = await validateCredential(apiToken);
34
+ if (!identity)
35
+ return { identity: null, projects: [] };
36
+ const result = await fetchRemoteProjects(apiToken);
37
+ return { identity, projects: result.projects };
38
+ }
26
39
  export function devCommand(options) {
27
40
  return withSpan("cli.command.dev", async () => {
28
41
  const { port, projectDir, hmr = true, demoMode = false } = options;
@@ -77,7 +90,7 @@ export function devCommand(options) {
77
90
  let devServer = null;
78
91
  let mcpServer = null;
79
92
  // Sync state
80
- let user = null;
93
+ let identity = null;
81
94
  let projects = [];
82
95
  let selectedProject = null;
83
96
  try {
@@ -111,14 +124,9 @@ export function devCommand(options) {
111
124
  }
112
125
  // Check for existing auth
113
126
  try {
114
- const token = await readToken();
115
- if (token) {
116
- user = await validateToken(token);
117
- if (user) {
118
- const result = await fetchRemoteProjects();
119
- projects = result.projects;
120
- }
121
- }
127
+ const initialAuth = await preloadDevAuth(runtimeAuth.apiToken);
128
+ identity = initialAuth.identity;
129
+ projects = initialAuth.projects;
122
130
  }
123
131
  catch {
124
132
  // Auth check failed - non-fatal
@@ -187,15 +195,15 @@ export function devCommand(options) {
187
195
  }
188
196
  console.log();
189
197
  // Context-aware next step hint
190
- if (!user) {
198
+ if (!identity) {
191
199
  console.log(` ${dim("To sync with Veryfront: press")} ${brand("a")} ${dim("to login")}`);
192
200
  }
193
201
  else if (projects.length > 0) {
194
- console.log(` ${success("✓")} Logged in as ${user.email}`);
202
+ console.log(` ${success("✓")} ${authStatus(identity)}`);
195
203
  console.log(` ${dim("Press")} ${brand("s")} ${dim("to select a project, then")} ${brand("p")} ${dim("to pull")}`);
196
204
  }
197
205
  else {
198
- console.log(` ${success("✓")} Logged in as ${user.email}`);
206
+ console.log(` ${success("✓")} ${authStatus(identity)}`);
199
207
  console.log(` ${dim("Press")} ${brand("s")} ${dim("to see your projects")}`);
200
208
  }
201
209
  console.log();
@@ -205,21 +213,21 @@ export function devCommand(options) {
205
213
  onClear: () => console.clear(),
206
214
  onQuit: () => void shutdown(),
207
215
  onAuth: async () => {
208
- if (user) {
209
- console.log(` ${dim("Logged in as")} ${user.email} ${dim(" press s to select project")}`);
216
+ if (identity) {
217
+ console.log(` ${dim(authStatus(identity))}${dim(", press s to select a project")}`);
210
218
  return;
211
219
  }
212
220
  console.log(` ${dim("Opening browser...")}`);
213
221
  const result = await login();
214
222
  if (!result)
215
223
  return;
216
- user = result;
224
+ identity = result;
217
225
  const projectResult = await fetchRemoteProjects();
218
226
  projects = projectResult.projects;
219
- console.log(` ${success("✓")} ${user.email} ${dim(`— ${projects.length} projects`)}`);
227
+ console.log(` ${success("✓")} ${authStatus(identity)}${dim(`, ${projects.length} projects`)}`);
220
228
  },
221
229
  onSync: () => {
222
- if (!user) {
230
+ if (!identity) {
223
231
  console.log(` ${dim("Press")} ${brand("a")} ${dim("to login")}`);
224
232
  return;
225
233
  }
@@ -1,12 +1,12 @@
1
1
  export const whoamiHelp = {
2
2
  name: "whoami",
3
3
  category: "auth",
4
- description: "Show current authenticated user",
4
+ description: "Show the current authenticated identity",
5
5
  usage: "veryfront whoami",
6
6
  options: [],
7
7
  examples: ["veryfront whoami"],
8
8
  notes: [
9
- "Shows email and name of authenticated user",
9
+ "Shows the authenticated user or API-key credential type",
10
10
  "Checks both environment variable and stored token",
11
11
  ],
12
12
  };
@@ -9,9 +9,10 @@ export interface RemoteProject {
9
9
  export interface ProjectDiscoveryResult {
10
10
  user: UserInfo | null;
11
11
  projects: RemoteProject[];
12
+ credentialType?: "user" | "apiKey";
12
13
  error?: string;
13
14
  }
14
- export declare function fetchRemoteProjects(): Promise<ProjectDiscoveryResult>;
15
+ export declare function fetchRemoteProjects(apiToken?: string): Promise<ProjectDiscoveryResult>;
15
16
  export declare function isAuthenticated(): Promise<boolean>;
16
17
  export declare function getCurrentUser(): Promise<UserInfo | null>;
17
18
  //# sourceMappingURL=project-discovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../../src/cli/sync/project-discovery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,kBAAkB,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAgD3E;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAKxD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAK/D"}
1
+ {"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../../src/cli/sync/project-discovery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,QAAQ,EAAqC,MAAM,kBAAkB,CAAC;AAEnG,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAuD5F;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAKxD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAM/D"}
@@ -1,8 +1,8 @@
1
1
  import { getApiUrl } from "../shared/constants.js";
2
2
  import { readToken } from "../auth/token-store.js";
3
- import { validateToken } from "../auth/login.js";
4
- export async function fetchRemoteProjects() {
5
- const token = await readToken();
3
+ import { isApiKeyToken, validateCredential, validateToken } from "../auth/login.js";
4
+ export async function fetchRemoteProjects(apiToken) {
5
+ const token = apiToken?.trim() || await readToken();
6
6
  if (!token) {
7
7
  return {
8
8
  user: null,
@@ -10,8 +10,9 @@ export async function fetchRemoteProjects() {
10
10
  error: "Not authenticated. Press A to login.",
11
11
  };
12
12
  }
13
- const user = await validateToken(token);
14
- if (!user) {
13
+ const apiKeyCredential = isApiKeyToken(token);
14
+ const user = apiKeyCredential ? null : await validateToken(token);
15
+ if (!apiKeyCredential && !user) {
15
16
  return {
16
17
  user: null,
17
18
  projects: [],
@@ -30,17 +31,23 @@ export async function fetchRemoteProjects() {
30
31
  return {
31
32
  user,
32
33
  projects: [],
34
+ credentialType: apiKeyCredential ? "apiKey" : "user",
33
35
  error: `Failed to fetch projects: ${errorText}`,
34
36
  };
35
37
  }
36
38
  const data = (await response.json());
37
- return { user, projects: data.data ?? [] };
39
+ return {
40
+ user,
41
+ projects: data.data ?? [],
42
+ credentialType: apiKeyCredential ? "apiKey" : "user",
43
+ };
38
44
  }
39
45
  catch (error) {
40
46
  const message = error instanceof Error ? error.message : String(error);
41
47
  return {
42
48
  user,
43
49
  projects: [],
50
+ credentialType: apiKeyCredential ? "apiKey" : "user",
44
51
  error: `Network error: ${message}`,
45
52
  };
46
53
  }
@@ -49,11 +56,13 @@ export async function isAuthenticated() {
49
56
  const token = await readToken();
50
57
  if (!token)
51
58
  return false;
52
- return (await validateToken(token)) !== null;
59
+ return (await validateCredential(token)) !== null;
53
60
  }
54
61
  export async function getCurrentUser() {
55
62
  const token = await readToken();
56
63
  if (!token)
57
64
  return null;
65
+ if (isApiKeyToken(token))
66
+ return null;
58
67
  return validateToken(token);
59
68
  }
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.1046",
3
+ "version": "0.1.1047",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "minimumDependencyAge": {
@@ -1 +1 @@
1
- {"version":3,"file":"execution-cleanup.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/child-run/execution-cleanup.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,MAAM,WAAW,mCAAmC;IAClD,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,+DAA+D;AAC/D,MAAM,WAAW,sCACf,SAAQ,mCAAmC;IAC3C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,gDAAgD;AAChD,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,mCAAmC,GACzC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,qDAAqD;AACrD,wBAAsB,kCAAkC,CACtD,KAAK,EAAE,sCAAsC,GAC5C,OAAO,CAAC,IAAI,CAAC,CASf"}
1
+ {"version":3,"file":"execution-cleanup.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/child-run/execution-cleanup.ts"],"names":[],"mappings":"AAEA,4DAA4D;AAC5D,MAAM,WAAW,mCAAmC;IAClD,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,+DAA+D;AAC/D,MAAM,WAAW,sCACf,SAAQ,mCAAmC;IAC3C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,gDAAgD;AAChD,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,mCAAmC,GACzC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,qDAAqD;AACrD,wBAAsB,kCAAkC,CACtD,KAAK,EAAE,sCAAsC,GAC5C,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -1,3 +1,4 @@
1
+ import { agentLogger } from "../../utils/logger/logger.js";
1
2
  /** Close child run execution buffers helper. */
2
3
  export async function closeChildRunExecutionBuffers(input) {
3
4
  await input.closeReasoningBuffer();
@@ -10,5 +11,14 @@ export async function finalizeChildRunExecutionResources(input) {
10
11
  await input.appendFinishStepChunk();
11
12
  }
12
13
  await input.flushMirror?.();
13
- await Promise.allSettled([input.closeTooling?.(), input.closeRuntime?.()]);
14
+ const [toolingResult, runtimeResult] = await Promise.allSettled([
15
+ input.closeTooling?.(),
16
+ input.closeRuntime?.(),
17
+ ]);
18
+ if (toolingResult.status === "rejected") {
19
+ agentLogger.warn("Child run teardown: closeTooling failed", { error: toolingResult.reason });
20
+ }
21
+ if (runtimeResult.status === "rejected") {
22
+ agentLogger.warn("Child run teardown: closeRuntime failed", { error: runtimeResult.reason });
23
+ }
14
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"child-fork-tool-sources.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/child-fork-tool-sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gCAAgC,EAChC,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,2BAA2B,EAGjC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EAEpC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EACL,KAAK,+BAA+B,EAErC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,KAAK,8CAA8C,EACpD,MAAM,4BAA4B,CAAC;AAGpC,qEAAqE;AACrE,MAAM,MAAM,gCAAgC,GAAG;IAC7C,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACtE,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,6CAA6C,GAAG;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACpD,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,8BAA8B,CAAC,EAAE,+BAA+B,CAAC;IACjE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,gBAAgB,CAAC;IACjF,gCAAgC,CAAC,EAAE,OAAO,gCAAgC,CAAC;IAC3E,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,OAAO,CAAC;QACpE,KAAK,EAAE,WAAW,CAAC;QACnB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KAC5B,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC3C,MAAM,CAAC,EAAE,gCAAgC,CAAC;CAC3C,CAAC;AAEF,mEAAmE;AACnE,MAAM,MAAM,uCAAuC,GAC/C;IACA,EAAE,EAAE,IAAI,CAAC;IACT,SAAS,EAAE,WAAW,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C,GACC;IACA,EAAE,EAAE,KAAK,CAAC;IACV,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEJ,gFAAgF;AAChF,MAAM,MAAM,oDAAoD,GAC5D,6CAA6C,GAC7C;IACA,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IAClE,8BAA8B,CAAC,EAAE,CAC/B,KAAK,EAAE,+BAA+B,KACnC,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAC9C,CAAC;AAEJ,sDAAsD;AACtD,wBAAsB,wCAAwC,CAC5D,KAAK,EAAE,6CAA6C,GACnD,OAAO,CAAC,uCAAuC,CAAC,CA4FlD;AAED,8DAA8D;AAC9D,wBAAsB,+CAA+C,CACnE,KAAK,EAAE,oDAAoD,GAC1D,OAAO,CAAC,8CAA8C,CAAC,CAyCzD"}
1
+ {"version":3,"file":"child-fork-tool-sources.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/child-fork-tool-sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gCAAgC,EAChC,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,2BAA2B,EAGjC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EAEpC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EACL,KAAK,+BAA+B,EAErC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,KAAK,8CAA8C,EACpD,MAAM,4BAA4B,CAAC;AAGpC,qEAAqE;AACrE,MAAM,MAAM,gCAAgC,GAAG;IAC7C,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACtE,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,6CAA6C,GAAG;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACpD,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,8BAA8B,CAAC,EAAE,+BAA+B,CAAC;IACjE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,gBAAgB,CAAC;IACjF,gCAAgC,CAAC,EAAE,OAAO,gCAAgC,CAAC;IAC3E,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,OAAO,CAAC;QACpE,KAAK,EAAE,WAAW,CAAC;QACnB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KAC5B,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC3C,MAAM,CAAC,EAAE,gCAAgC,CAAC;CAC3C,CAAC;AAEF,mEAAmE;AACnE,MAAM,MAAM,uCAAuC,GAC/C;IACA,EAAE,EAAE,IAAI,CAAC;IACT,SAAS,EAAE,WAAW,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C,GACC;IACA,EAAE,EAAE,KAAK,CAAC;IACV,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEJ,gFAAgF;AAChF,MAAM,MAAM,oDAAoD,GAC5D,6CAA6C,GAC7C;IACA,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IAClE,8BAA8B,CAAC,EAAE,CAC/B,KAAK,EAAE,+BAA+B,KACnC,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAC9C,CAAC;AAEJ,sDAAsD;AACtD,wBAAsB,wCAAwC,CAC5D,KAAK,EAAE,6CAA6C,GACnD,OAAO,CAAC,uCAAuC,CAAC,CA4FlD;AAED,8DAA8D;AAC9D,wBAAsB,+CAA+C,CACnE,KAAK,EAAE,oDAAoD,GAC1D,OAAO,CAAC,8CAA8C,CAAC,CAgDzD"}
@@ -118,7 +118,15 @@ export async function prepareDefaultHostedChildForkSandboxToolSources(input) {
118
118
  };
119
119
  }
120
120
  catch (error) {
121
- await sandboxResult.closeSandbox();
121
+ // Never let a close failure mask the original error that triggered cleanup.
122
+ try {
123
+ await sandboxResult.closeSandbox();
124
+ }
125
+ catch (closeError) {
126
+ input.logger?.error("Failed to close sandbox during child fork tool source cleanup", {
127
+ error: closeError,
128
+ });
129
+ }
122
130
  throw error;
123
131
  }
124
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"child-requested-tools.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/child-requested-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"child-requested-tools.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/child-requested-tools.ts"],"names":[],"mappings":"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"}
@@ -209,8 +209,9 @@ export async function prepareDefaultHostedChildForkToolAssembly(input) {
209
209
  logger: input.logger,
210
210
  });
211
211
  if (!preparedTools.ok) {
212
- await toolSources.closeTooling?.();
213
- await toolSources.closeRuntime?.();
212
+ // Run both closers even if one rejects; closeRuntime tears down the live
213
+ // sandbox and must not be skipped when closeTooling fails.
214
+ await Promise.allSettled([toolSources.closeTooling?.(), toolSources.closeRuntime?.()]);
214
215
  return preparedTools;
215
216
  }
216
217
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/memory/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/memory/memory.ts"],"names":[],"mappings":"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"}
@@ -139,7 +139,10 @@ export class SummaryMemory {
139
139
  .map((m) => getTextFromMemoryParts(m.parts))
140
140
  .map((text) => text.substring(0, 50))
141
141
  .join("; ");
142
- this.summary = `Discussed: ${topics}`;
142
+ // Merge with the existing summary so earlier context accumulates instead of
143
+ // being discarded on each resummarization.
144
+ const newSummary = `Discussed: ${topics}`;
145
+ this.summary = this.summary ? `${this.summary}; ${newSummary}` : newSummary;
143
146
  this.messages = remaining;
144
147
  return Promise.resolve();
145
148
  }
@@ -1 +1 @@
1
- {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/memory/redis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAG/B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,IAAI,EAAE,OAAO,CAAC;IACd,4BAA4B;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAKD,8BAA8B;AAC9B,qBAAa,WAAW,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,CAAE,YAAW,MAAM,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB;IAStD,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,aAAa;IAUrB,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B9B,WAAW,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;IAQ3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtB,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAehC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,OAAO,CAAC,gBAAgB;CAazB;AAED,2BAA2B;AAC3B,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EACzE,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,iBAAiB,GACxB,WAAW,CAAC,CAAC,CAAC,CAEhB"}
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/memory/redis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAI/B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,IAAI,EAAE,OAAO,CAAC;IACd,4BAA4B;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAKD,8BAA8B;AAC9B,qBAAa,WAAW,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,CAAE,YAAW,MAAM,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB;IAStD,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,aAAa;IAgBrB,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B9B,WAAW,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;IAQ3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtB,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAehC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,OAAO,CAAC,gBAAgB;CAazB;AAED,2BAA2B;AAC3B,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EACzE,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,iBAAiB,GACxB,WAAW,CAAC,CAAC,CAAC,CAEhB"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { estimateTokens, } from "./memory-interface.js";
8
8
  import { withSpan } from "../../observability/tracing/otlp-setup.js";
9
+ import { agentLogger } from "../../utils/logger/logger.js";
9
10
  const DEFAULT_TTL = 86_400; // 24 hours
10
11
  const DEFAULT_KEY_PREFIX = "veryfront:agent:memory:";
11
12
  /** Implement redis memory. */
@@ -33,14 +34,24 @@ export class RedisMemory {
33
34
  try {
34
35
  return JSON.parse(data);
35
36
  }
36
- catch (_) {
37
- /* expected: corrupted JSON in Redis, return empty message list */
38
- return [];
37
+ catch (error) {
38
+ // Do NOT swallow-and-return []: add() would then overwrite the key with a
39
+ // single message and permanently destroy the stored history. Surface the
40
+ // corruption so the caller aborts instead of silently truncating.
41
+ agentLogger.error("Corrupted JSON in Redis memory; refusing to overwrite", {
42
+ key: this.getKey(),
43
+ error,
44
+ });
45
+ throw error;
39
46
  }
40
47
  }
41
48
  add(message) {
42
49
  return withSpan("agent.memory.redis.add", async () => {
43
50
  const key = this.getKey();
51
+ // NOTE: this GET -> push -> SET is not atomic. The RedisClient interface
52
+ // exposes only get/set/del/expire (no eval/rPush), so concurrent add()
53
+ // calls on the same key can lose updates (last writer wins). Given an
54
+ // atomic list op or Lua eval, prefer an atomic append here.
44
55
  let messages = this.parseMessages(await this.client.get(key));
45
56
  messages.push(message);
46
57
  const { maxMessages, maxTokens } = this.config;
@@ -1 +1 @@
1
- {"version":3,"file":"data-stream.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/streaming/data-stream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1E,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kCAAkC,GACnC,MAAM,iBAAiB,CAAC;AAIzB,qCAAqC;AACrC,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG;IACvD,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,CAoBA;AAED,wCAAwC;AACxC,wBAAuB,sBAAsB,CAC3C,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACjC,cAAc,CAAC,sBAAsB,CAAC,CAsCxC"}
1
+ {"version":3,"file":"data-stream.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/streaming/data-stream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1E,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kCAAkC,GACnC,MAAM,iBAAiB,CAAC;AAIzB,qCAAqC;AACrC,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG;IACvD,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,CAyBA;AAED,wCAAwC;AACxC,wBAAuB,sBAAsB,CAC3C,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACjC,cAAc,CAAC,sBAAsB,CAAC,CAsCxC"}