veryfront 0.1.1049 → 0.1.1050
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/cli/commands/generate/handler.d.ts +1 -1
- package/esm/cli/mcp/tools/scaffold-tools.d.ts +1 -1
- package/esm/deno.js +1 -1
- package/esm/src/agent/hosted/child-tool-input.d.ts +2 -2
- package/esm/src/agent/hosted/default-invoke-agent-tool.d.ts +3 -3
- package/esm/src/cache/backends/api.d.ts.map +1 -1
- package/esm/src/cache/backends/api.js +13 -10
- package/esm/src/cache/verified-api-credential-context.d.ts +8 -0
- package/esm/src/cache/verified-api-credential-context.d.ts.map +1 -0
- package/esm/src/cache/verified-api-credential-context.js +13 -0
- package/esm/src/channels/control-plane.d.ts +5 -5
- package/esm/src/internal-agents/control-plane-auth.d.ts +13 -11
- package/esm/src/internal-agents/control-plane-auth.d.ts.map +1 -1
- package/esm/src/internal-agents/control-plane-auth.js +55 -4
- package/esm/src/platform/adapters/fs/veryfront/multi-project-adapter.d.ts +1 -3
- package/esm/src/platform/adapters/fs/veryfront/multi-project-adapter.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/multi-project-adapter.js +0 -2
- package/esm/src/platform/adapters/fs/veryfront/request-context.d.ts +0 -4
- package/esm/src/platform/adapters/fs/veryfront/request-context.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/request-context.js +0 -1
- package/esm/src/security/http/base-handler.d.ts +2 -2
- package/esm/src/security/http/base-handler.d.ts.map +1 -1
- package/esm/src/security/http/base-handler.js +6 -1
- package/esm/src/server/handlers/request/agent-stream.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/request/agent-stream.handler.js +2 -5
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/esm/src/workflow/schemas/workflow.schema.d.ts +4 -4
- package/package.json +5 -4
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { ParsedArgs } from "../../shared/types.js";
|
|
5
5
|
export declare const parseGenerateArgs: (args: ParsedArgs) => import("../../shared/args.js").SafeParseResult<import("../../../src/extensions/schema/schema-validator.js").InferShape<{
|
|
6
|
-
type: import("../../../src/internal-agents/schema.js").Schema<"prompt" | "page" | "api" | "agent" | "layout" | "resource" | "component" | "task" | "tool" | "integration" | "
|
|
6
|
+
type: import("../../../src/internal-agents/schema.js").Schema<"prompt" | "page" | "api" | "agent" | "layout" | "resource" | "component" | "task" | "tool" | "integration" | "skill" | "workflow" | undefined>;
|
|
7
7
|
name: import("../../../src/internal-agents/schema.js").Schema<string | undefined>;
|
|
8
8
|
}>>;
|
|
9
9
|
export declare function handleGenerateCommand(args: ParsedArgs): Promise<void>;
|
|
@@ -5,7 +5,7 @@ import type { InferSchema } from "../../../src/extensions/schema/index.js";
|
|
|
5
5
|
import type { MCPTool } from "../tools.js";
|
|
6
6
|
import { type ScaffoldResult } from "../../scaffold/engine.js";
|
|
7
7
|
declare const getScaffoldInput: () => import("../../../src/internal-agents/schema.js").Schema<import("../../../src/extensions/schema/schema-validator.js").InferShape<{
|
|
8
|
-
type: import("../../../src/internal-agents/schema.js").Schema<"prompt" | "page" | "api" | "agent" | "layout" | "resource" | "component" | "task" | "tool" | "
|
|
8
|
+
type: import("../../../src/internal-agents/schema.js").Schema<"prompt" | "page" | "api" | "agent" | "layout" | "resource" | "component" | "task" | "tool" | "skill" | "workflow">;
|
|
9
9
|
name: import("../../../src/internal-agents/schema.js").Schema<string>;
|
|
10
10
|
methods: import("../../../src/internal-agents/schema.js").Schema<string[] | undefined>;
|
|
11
11
|
projectPath: import("../../../src/internal-agents/schema.js").Schema<string | undefined>;
|
package/esm/deno.js
CHANGED
|
@@ -14,7 +14,7 @@ export declare const getHostedChildForkToolInputSchema: () => import("../../inte
|
|
|
14
14
|
model: import("../../internal-agents/schema.js").Schema<string | undefined>;
|
|
15
15
|
thinking: import("../../internal-agents/schema.js").Schema<number | undefined>;
|
|
16
16
|
max_steps: import("../../internal-agents/schema.js").Schema<number | undefined>;
|
|
17
|
-
result_mode: import("../../internal-agents/schema.js").Schema<"
|
|
17
|
+
result_mode: import("../../internal-agents/schema.js").Schema<"summary" | "full" | undefined>;
|
|
18
18
|
}>>;
|
|
19
19
|
/** Schema for hosted child fork tool input.
|
|
20
20
|
* @deprecated Use getHostedChildForkToolInputSchema()
|
|
@@ -28,7 +28,7 @@ export declare const hostedChildForkToolInputSchema: import("../../internal-agen
|
|
|
28
28
|
model: import("../../internal-agents/schema.js").Schema<string | undefined>;
|
|
29
29
|
thinking: import("../../internal-agents/schema.js").Schema<number | undefined>;
|
|
30
30
|
max_steps: import("../../internal-agents/schema.js").Schema<number | undefined>;
|
|
31
|
-
result_mode: import("../../internal-agents/schema.js").Schema<"
|
|
31
|
+
result_mode: import("../../internal-agents/schema.js").Schema<"summary" | "full" | undefined>;
|
|
32
32
|
}>>;
|
|
33
33
|
/** Input payload for hosted child fork tool. */
|
|
34
34
|
export type HostedChildForkToolInput = InferSchema<ReturnType<typeof getHostedChildForkToolInputSchema>>;
|
|
@@ -88,7 +88,7 @@ export declare const getDefaultHostedInvokeAgentInputSchema: () => import("../..
|
|
|
88
88
|
model?: string | undefined;
|
|
89
89
|
thinking?: number | undefined;
|
|
90
90
|
max_steps?: number | undefined;
|
|
91
|
-
result_mode?: "
|
|
91
|
+
result_mode?: "summary" | "full" | undefined;
|
|
92
92
|
} & {
|
|
93
93
|
agent_id: string;
|
|
94
94
|
}>;
|
|
@@ -105,7 +105,7 @@ export declare const defaultHostedInvokeAgentInputSchema: import("../../internal
|
|
|
105
105
|
model?: string | undefined;
|
|
106
106
|
thinking?: number | undefined;
|
|
107
107
|
max_steps?: number | undefined;
|
|
108
|
-
result_mode?: "
|
|
108
|
+
result_mode?: "summary" | "full" | undefined;
|
|
109
109
|
} & {
|
|
110
110
|
agent_id: string;
|
|
111
111
|
}>;
|
|
@@ -124,7 +124,7 @@ export declare function createDefaultHostedInvokeAgentTool<TContext extends Defa
|
|
|
124
124
|
model?: string | undefined;
|
|
125
125
|
thinking?: number | undefined;
|
|
126
126
|
max_steps?: number | undefined;
|
|
127
|
-
result_mode?: "
|
|
127
|
+
result_mode?: "summary" | "full" | undefined;
|
|
128
128
|
} & {
|
|
129
129
|
agent_id: string;
|
|
130
130
|
}, DefaultHostedInvokeAgentToolResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../src/src/cache/backends/api.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsDhD,qBAAa,eAAgB,YAAW,YAAY;IAClD,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAC;gBAGrB,OAAO,GAAE;QACP,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KACxB;IAiBR,OAAO,CAAC,SAAS;YAIH,OAAO;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../src/src/cache/backends/api.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsDhD,qBAAa,eAAgB,YAAW,YAAY;IAClD,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAC;gBAGrB,OAAO,GAAE;QACP,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KACxB;IAiBR,OAAO,CAAC,SAAS;YAIH,OAAO;IA2Gf,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQxC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;YAuBrD,eAAe;IAKvB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAMrD"}
|
|
@@ -9,6 +9,7 @@ import { buildBatchResults } from "../batch-results.js";
|
|
|
9
9
|
import { REQUEST_ERROR } from "../../errors/index.js";
|
|
10
10
|
import { sanitizeUrlForSpan } from "../../utils/logger/redact.js";
|
|
11
11
|
import { getHostEnv } from "../../platform/compat/process.js";
|
|
12
|
+
import { getVerifiedCacheApiCredential } from "../verified-api-credential-context.js";
|
|
12
13
|
const logger = baseLogger.component("api-cache-backend");
|
|
13
14
|
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
14
15
|
const CIRCUIT_BREAKER_RESET_TIMEOUT_MS = 15_000;
|
|
@@ -66,20 +67,22 @@ export class ApiCacheBackend {
|
|
|
66
67
|
const reqCtx = getCurrentRequestContext();
|
|
67
68
|
const hostToken = getHostEnv("VERYFRONT_API_TOKEN");
|
|
68
69
|
const envToken = getEnvValue("VERYFRONT_API_TOKEN");
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
const token = verifiedRequestToken || hostToken || envToken || null;
|
|
70
|
+
const verifiedCredential = getVerifiedCacheApiCredential();
|
|
71
|
+
const verifiedRequestToken = verifiedCredential?.token;
|
|
72
|
+
// The private verified-request context cannot be changed through the
|
|
73
|
+
// globally exposed filesystem request context.
|
|
74
|
+
const token = verifiedRequestToken || hostToken || reqCtx?.token || envToken || null;
|
|
75
75
|
const tokenSource = verifiedRequestToken
|
|
76
76
|
? "verified-control-plane"
|
|
77
77
|
: hostToken
|
|
78
78
|
? "host-env"
|
|
79
|
-
:
|
|
80
|
-
? "
|
|
81
|
-
:
|
|
82
|
-
|
|
79
|
+
: reqCtx?.token
|
|
80
|
+
? "request"
|
|
81
|
+
: envToken
|
|
82
|
+
? "env"
|
|
83
|
+
: "none";
|
|
84
|
+
const projectRef = verifiedCredential?.projectId || verifiedCredential?.projectSlug ||
|
|
85
|
+
reqCtx?.projectId || reqCtx?.projectSlug ||
|
|
83
86
|
tryGetCacheKeyContext()?.projectId || null;
|
|
84
87
|
if (!token || !projectRef) {
|
|
85
88
|
logger.debug("Missing auth or project context", {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type VerifiedControlPlaneCacheCredential, type VerifiedControlPlaneRequestClaims } from "../internal-agents/control-plane-auth.js";
|
|
2
|
+
/**
|
|
3
|
+
* Runs framework work with the exact cache API credential from a verified
|
|
4
|
+
* control-plane request body. Keep this helper on internal import surfaces.
|
|
5
|
+
*/
|
|
6
|
+
export declare function runWithVerifiedCacheApiCredential<T>(claims: VerifiedControlPlaneRequestClaims, fn: () => T): T;
|
|
7
|
+
export declare function getVerifiedCacheApiCredential(): VerifiedControlPlaneCacheCredential | undefined;
|
|
8
|
+
//# sourceMappingURL=verified-api-credential-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verified-api-credential-context.d.ts","sourceRoot":"","sources":["../../../src/src/cache/verified-api-credential-context.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,mCAAmC,EACxC,KAAK,iCAAiC,EACvC,MAAM,0CAA0C,CAAC;AAMlD;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,CAAC,EACjD,MAAM,EAAE,iCAAiC,EACzC,EAAE,EAAE,MAAM,CAAC,GACV,CAAC,CAKH;AAED,wBAAgB,6BAA6B,IACzC,mCAAmC,GACnC,SAAS,CAEZ"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { consumeVerifiedControlPlaneCacheCredential, } from "../internal-agents/control-plane-auth.js";
|
|
3
|
+
const verifiedCredentialStorage = new AsyncLocalStorage();
|
|
4
|
+
/**
|
|
5
|
+
* Runs framework work with the exact cache API credential from a verified
|
|
6
|
+
* control-plane request body. Keep this helper on internal import surfaces.
|
|
7
|
+
*/
|
|
8
|
+
export function runWithVerifiedCacheApiCredential(claims, fn) {
|
|
9
|
+
return verifiedCredentialStorage.run(consumeVerifiedControlPlaneCacheCredential(claims), fn);
|
|
10
|
+
}
|
|
11
|
+
export function getVerifiedCacheApiCredential() {
|
|
12
|
+
return verifiedCredentialStorage.getStore() || undefined;
|
|
13
|
+
}
|
|
@@ -11,20 +11,20 @@ export declare const CONTROL_PLANE_RUN_STREAM_PATH = "/api/control-plane/runs/:r
|
|
|
11
11
|
/** Allowed control-plane surfaces — source of truth for the schema and {@link ControlPlaneSurface}. */
|
|
12
12
|
export declare const CONTROL_PLANE_SURFACES: readonly ["studio", "channels", "a2a", "mcp"];
|
|
13
13
|
/** Zod schema for get control plane surface. */
|
|
14
|
-
export declare const getControlPlaneSurfaceSchema: () => Schema<"mcp" | "
|
|
14
|
+
export declare const getControlPlaneSurfaceSchema: () => Schema<"mcp" | "studio" | "channels" | "a2a">;
|
|
15
15
|
/** Zod schema for control plane surface. */
|
|
16
|
-
export declare const ControlPlaneSurfaceSchema: Schema<"mcp" | "
|
|
16
|
+
export declare const ControlPlaneSurfaceSchema: Schema<"mcp" | "studio" | "channels" | "a2a">;
|
|
17
17
|
/** Zod schema for get control plane agents list request. */
|
|
18
18
|
export declare const getControlPlaneAgentsListRequestSchema: () => Schema<import("../extensions/schema/schema-validator.js").InferShape<{
|
|
19
19
|
requestId: Schema<string>;
|
|
20
20
|
projectId: Schema<string>;
|
|
21
|
-
surface: Schema<"mcp" | "
|
|
21
|
+
surface: Schema<"mcp" | "studio" | "channels" | "a2a">;
|
|
22
22
|
}>>;
|
|
23
23
|
/** Zod schema for control plane agents list request. */
|
|
24
24
|
export declare const ControlPlaneAgentsListRequestSchema: Schema<import("../extensions/schema/schema-validator.js").InferShape<{
|
|
25
25
|
requestId: Schema<string>;
|
|
26
26
|
projectId: Schema<string>;
|
|
27
|
-
surface: Schema<"mcp" | "
|
|
27
|
+
surface: Schema<"mcp" | "studio" | "channels" | "a2a">;
|
|
28
28
|
}>>;
|
|
29
29
|
/** Zod schema for get runtime agent skill. */
|
|
30
30
|
export declare const getRuntimeAgentSkillSchema: () => Schema<import("../extensions/schema/schema-validator.js").InferShape<{
|
|
@@ -236,7 +236,7 @@ declare const getControlPlaneClaimsSchema: () => Schema<import("../extensions/sc
|
|
|
236
236
|
iss: Schema<string>;
|
|
237
237
|
aud: Schema<string>;
|
|
238
238
|
sub: Schema<string>;
|
|
239
|
-
surface: Schema<"mcp" | "
|
|
239
|
+
surface: Schema<"mcp" | "studio" | "channels" | "a2a">;
|
|
240
240
|
project_id: Schema<string>;
|
|
241
241
|
request_hash: Schema<string>;
|
|
242
242
|
iat: Schema<number>;
|
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
import { type ControlPlaneSurface } from "../channels/control-plane.js";
|
|
1
|
+
import { type ControlPlaneClaims, type ControlPlaneSurface } from "../channels/control-plane.js";
|
|
2
2
|
import type { HandlerContext } from "../types/index.js";
|
|
3
|
+
declare const verifiedControlPlaneRequestBrand: unique symbol;
|
|
4
|
+
export type VerifiedControlPlaneRequestClaims = ControlPlaneClaims & {
|
|
5
|
+
readonly [verifiedControlPlaneRequestBrand]: true;
|
|
6
|
+
};
|
|
7
|
+
export interface VerifiedControlPlaneCacheCredential {
|
|
8
|
+
readonly token: string;
|
|
9
|
+
readonly projectId: string;
|
|
10
|
+
readonly projectSlug: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function consumeVerifiedControlPlaneCacheCredential(claims: VerifiedControlPlaneRequestClaims): VerifiedControlPlaneCacheCredential | null;
|
|
3
13
|
export declare class ControlPlaneRequestError extends Error {
|
|
4
14
|
readonly status: number;
|
|
5
15
|
constructor(status: number, message: string);
|
|
@@ -8,14 +18,6 @@ export declare function getControlPlaneVerificationPublicKey(ctx: HandlerContext
|
|
|
8
18
|
export declare function verifyControlPlaneRequest(req: Request, ctx: HandlerContext, rawBody: string, options?: {
|
|
9
19
|
expectedSubject?: string;
|
|
10
20
|
expectedSurface?: ControlPlaneSurface;
|
|
11
|
-
}): Promise<
|
|
12
|
-
|
|
13
|
-
aud: import("./schema.js").Schema<string>;
|
|
14
|
-
sub: import("./schema.js").Schema<string>;
|
|
15
|
-
surface: import("./schema.js").Schema<"mcp" | "channels" | "studio" | "a2a">;
|
|
16
|
-
project_id: import("./schema.js").Schema<string>;
|
|
17
|
-
request_hash: import("./schema.js").Schema<string>;
|
|
18
|
-
iat: import("./schema.js").Schema<number>;
|
|
19
|
-
exp: import("./schema.js").Schema<number>;
|
|
20
|
-
}>>;
|
|
21
|
+
}): Promise<VerifiedControlPlaneRequestClaims>;
|
|
22
|
+
export {};
|
|
21
23
|
//# sourceMappingURL=control-plane-auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-plane-auth.d.ts","sourceRoot":"","sources":["../../../src/src/internal-agents/control-plane-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,mBAAmB,EAEzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"control-plane-auth.d.ts","sourceRoot":"","sources":["../../../src/src/internal-agents/control-plane-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAEzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AASxD,OAAO,CAAC,MAAM,gCAAgC,EAAE,OAAO,MAAM,CAAC;AAE9D,MAAM,MAAM,iCAAiC,GAAG,kBAAkB,GAAG;IACnE,QAAQ,CAAC,CAAC,gCAAgC,CAAC,EAAE,IAAI,CAAC;CACnD,CAAC;AAEF,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAoCD,wBAAgB,0CAA0C,CACxD,MAAM,EAAE,iCAAiC,GACxC,mCAAmC,GAAG,IAAI,CAK5C;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C;AAED,wBAAgB,oCAAoC,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAM5F;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,mBAAmB,CAAC;CAClC,GACL,OAAO,CAAC,iCAAiC,CAAC,CAsE5C"}
|
|
@@ -4,7 +4,36 @@ import { serverLogger } from "../utils/index.js";
|
|
|
4
4
|
import { HTTP_INTERNAL_SERVER_ERROR } from "../utils/constants/index.js";
|
|
5
5
|
const CONTROL_PLANE_JWS_HEADER = "x-veryfront-control-plane-jws";
|
|
6
6
|
const MAX_CONTROL_PLANE_SIGNATURE_AGE_SECONDS = 60;
|
|
7
|
+
const CONTROL_PLANE_SIGNING_KEY_ENV = "CHANNEL_DISPATCH_SIGNING_PUBLIC_KEY";
|
|
7
8
|
const logger = serverLogger.component("internal-agents-auth");
|
|
9
|
+
const verifiedCacheCredentials = new WeakMap();
|
|
10
|
+
function extractVerifiedCacheCredential(rawBody, claims) {
|
|
11
|
+
try {
|
|
12
|
+
const body = JSON.parse(rawBody);
|
|
13
|
+
const credentials = body.credentials;
|
|
14
|
+
if (!credentials || typeof credentials !== "object" || Array.isArray(credentials)) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const token = credentials.authToken;
|
|
18
|
+
if (typeof token !== "string" || token.length === 0)
|
|
19
|
+
return null;
|
|
20
|
+
return Object.freeze({
|
|
21
|
+
token,
|
|
22
|
+
projectId: claims.project_id,
|
|
23
|
+
projectSlug: claims.aud,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function consumeVerifiedControlPlaneCacheCredential(claims) {
|
|
31
|
+
const grant = verifiedCacheCredentials.get(claims);
|
|
32
|
+
verifiedCacheCredentials.delete(claims);
|
|
33
|
+
if (!grant || grant.expiresAt <= Math.floor(Date.now() / 1000))
|
|
34
|
+
return null;
|
|
35
|
+
return grant.credential;
|
|
36
|
+
}
|
|
8
37
|
export class ControlPlaneRequestError extends Error {
|
|
9
38
|
status;
|
|
10
39
|
constructor(status, message) {
|
|
@@ -17,10 +46,11 @@ export function getControlPlaneVerificationPublicKey(ctx) {
|
|
|
17
46
|
// Project env overlays intentionally hide host secrets from request-scoped reads.
|
|
18
47
|
// Control-plane verification is framework-owned config, so it must fall back to
|
|
19
48
|
// the host environment when the runtime adapter env is overlay-aware.
|
|
20
|
-
return ctx.adapter.env.get(
|
|
21
|
-
getHostEnv(
|
|
49
|
+
return ctx.adapter.env.get(CONTROL_PLANE_SIGNING_KEY_ENV) ??
|
|
50
|
+
getHostEnv(CONTROL_PLANE_SIGNING_KEY_ENV);
|
|
22
51
|
}
|
|
23
52
|
export async function verifyControlPlaneRequest(req, ctx, rawBody, options = {}) {
|
|
53
|
+
const hostPublicKeyPem = getHostEnv(CONTROL_PLANE_SIGNING_KEY_ENV);
|
|
24
54
|
const publicKeyPem = getControlPlaneVerificationPublicKey(ctx);
|
|
25
55
|
if (!publicKeyPem) {
|
|
26
56
|
throw new ControlPlaneRequestError(HTTP_INTERNAL_SERVER_ERROR, "Control-plane verification is not configured");
|
|
@@ -34,14 +64,35 @@ export async function verifyControlPlaneRequest(req, ctx, rawBody, options = {})
|
|
|
34
64
|
throw new ControlPlaneRequestError(401, "Missing control-plane signature");
|
|
35
65
|
}
|
|
36
66
|
try {
|
|
37
|
-
|
|
67
|
+
const verificationOptions = {
|
|
38
68
|
audience: projectSlug,
|
|
39
69
|
expectedProjectId: ctx.projectId,
|
|
40
70
|
expectedSubject: options.expectedSubject,
|
|
41
71
|
expectedSurface: options.expectedSurface,
|
|
42
72
|
publicKeyPem,
|
|
43
73
|
maxAgeSeconds: MAX_CONTROL_PLANE_SIGNATURE_AGE_SECONDS,
|
|
44
|
-
}
|
|
74
|
+
};
|
|
75
|
+
const claims = await verifyControlPlaneJws(controlPlaneJws, rawBody, verificationOptions);
|
|
76
|
+
const verifiedClaims = claims;
|
|
77
|
+
let hostVerified = hostPublicKeyPem === publicKeyPem && Boolean(hostPublicKeyPem);
|
|
78
|
+
if (hostPublicKeyPem && !hostVerified) {
|
|
79
|
+
try {
|
|
80
|
+
await verifyControlPlaneJws(controlPlaneJws, rawBody, {
|
|
81
|
+
...verificationOptions,
|
|
82
|
+
publicKeyPem: hostPublicKeyPem,
|
|
83
|
+
});
|
|
84
|
+
hostVerified = true;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Compatibility verification can still succeed through the adapter,
|
|
88
|
+
// but only the host key may mint the cache credential capability.
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
verifiedCacheCredentials.set(verifiedClaims, Object.freeze({
|
|
92
|
+
credential: hostVerified ? extractVerifiedCacheCredential(rawBody, claims) : null,
|
|
93
|
+
expiresAt: claims.exp,
|
|
94
|
+
}));
|
|
95
|
+
return verifiedClaims;
|
|
45
96
|
}
|
|
46
97
|
catch (error) {
|
|
47
98
|
// verifyControlPlaneJws performs only crypto and claim validation with no
|
|
@@ -2,9 +2,8 @@ import type { DirectoryEntry, FSAdapter, FSAdapterConfig } from "./types.js";
|
|
|
2
2
|
import type { FileInfo, ResolveFileOptions } from "../../base.js";
|
|
3
3
|
import { ProxyFSAdapterManager } from "./proxy-manager.js";
|
|
4
4
|
import type { VeryfrontFSAdapter } from "./adapter.js";
|
|
5
|
-
import { type RequestTokenTrust } from "./request-context.js";
|
|
6
5
|
export { clearRequestScopedFileCache, getCurrentRequestContext, getRequestScopedFile, runWithRequestContext, setRequestScopedFile, wrapWithCurrentContext, } from "./request-context.js";
|
|
7
|
-
export type { RequestContext
|
|
6
|
+
export type { RequestContext } from "./request-context.js";
|
|
8
7
|
export declare class MultiProjectFSAdapter implements FSAdapter {
|
|
9
8
|
private manager;
|
|
10
9
|
private defaultAdapter?;
|
|
@@ -14,7 +13,6 @@ export declare class MultiProjectFSAdapter implements FSAdapter {
|
|
|
14
13
|
releaseId?: string | null;
|
|
15
14
|
branch?: string | null;
|
|
16
15
|
environmentName?: string | null;
|
|
17
|
-
tokenTrust?: RequestTokenTrust;
|
|
18
16
|
}): Promise<T>;
|
|
19
17
|
setRequestContext(projectSlug: string, token: string): void;
|
|
20
18
|
setProductionMode(_enabled: boolean, _releaseId?: string | null): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-project-adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/multi-project-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"multi-project-adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/multi-project-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,7 +40,6 @@ export class MultiProjectFSAdapter {
|
|
|
40
40
|
projectSlug,
|
|
41
41
|
projectId,
|
|
42
42
|
token,
|
|
43
|
-
tokenTrust: options?.tokenTrust,
|
|
44
43
|
productionMode,
|
|
45
44
|
releaseId: productionMode ? releaseId : null,
|
|
46
45
|
branch: productionMode ? null : branch,
|
|
@@ -72,7 +71,6 @@ export class MultiProjectFSAdapter {
|
|
|
72
71
|
return;
|
|
73
72
|
store.projectSlug = projectSlug;
|
|
74
73
|
store.token = token;
|
|
75
|
-
store.tokenTrust = undefined;
|
|
76
74
|
}
|
|
77
75
|
setProductionMode(_enabled, _releaseId) {
|
|
78
76
|
// No-op: In proxy mode, productionMode/releaseId are passed via runWithContext().
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
-
export type RequestTokenTrust = "verified-control-plane";
|
|
3
2
|
export interface RequestContext {
|
|
4
3
|
projectSlug: string;
|
|
5
4
|
projectId?: string;
|
|
6
5
|
token: string;
|
|
7
|
-
/** Trust marker set only after the control-plane request signature is verified. */
|
|
8
|
-
tokenTrust?: RequestTokenTrust;
|
|
9
6
|
productionMode: boolean;
|
|
10
7
|
/** Release ID for production mode (mutually exclusive with branch) */
|
|
11
8
|
releaseId?: string | null;
|
|
@@ -43,7 +40,6 @@ export declare function clearRequestScopedFileCache(): number;
|
|
|
43
40
|
export declare function runWithRequestContext<T>(options: {
|
|
44
41
|
projectSlug: string;
|
|
45
42
|
token: string;
|
|
46
|
-
tokenTrust?: RequestTokenTrust;
|
|
47
43
|
projectId?: string;
|
|
48
44
|
productionMode?: boolean;
|
|
49
45
|
releaseId?: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/request-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,
|
|
1
|
+
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/request-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;;OAIG;IACH,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,eAAO,MAAM,iBAAiB,mCAA0C,CAAC;AAEzE,wBAAgB,wBAAwB,IAAI,cAAc,GAAG,IAAI,CAEhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAOxF;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEzE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE5E;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAKpD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,OAAO,EAAE;IACP,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,EACD,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAaZ;AAED;;;;GAIG;AACH,UAAU,2BAA2B;IACnC,wBAAwB,EAAE,MAAM,cAAc,GAAG,IAAI,CAAC;IACtD,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC/D,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,2BAA2B,EAAE,MAAM,MAAM,CAAC;CAC3C;AAED,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,0BAA0B,EAAE,2BAA2B,GAAG,SAAS,CAAC;CACzE"}
|
|
@@ -43,7 +43,6 @@ export function runWithRequestContext(options, fn) {
|
|
|
43
43
|
projectSlug: options.projectSlug,
|
|
44
44
|
projectId: options.projectId,
|
|
45
45
|
token: options.token,
|
|
46
|
-
tokenTrust: options.tokenTrust,
|
|
47
46
|
productionMode,
|
|
48
47
|
releaseId: options.releaseId ?? null,
|
|
49
48
|
branch: productionMode ? null : (options.branch ?? null),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Handler, HandlerContext, HandlerMetadata, HandlerResult } from "../../types/index.js";
|
|
2
|
+
import type { VerifiedControlPlaneRequestClaims } from "../../internal-agents/control-plane-auth.js";
|
|
2
3
|
import type { WebSocketUpgradeResponse } from "../../platform/adapters/base.js";
|
|
3
|
-
import type { RequestTokenTrust } from "../../platform/adapters/fs/veryfront/request-context.js";
|
|
4
4
|
import { ResponseBuilder } from "./response/index.js";
|
|
5
5
|
export interface HandlerHelpers {
|
|
6
6
|
createResponseBuilder: (ctx: HandlerContext, nonce?: string) => ResponseBuilder;
|
|
@@ -24,7 +24,7 @@ export declare abstract class BaseHandler implements Handler {
|
|
|
24
24
|
protected respond(response: Response | WebSocketUpgradeResponse, metadata?: Record<string, unknown>): HandlerResult;
|
|
25
25
|
protected withProxyContext<T>(ctx: HandlerContext, fn: () => Promise<T>, options?: {
|
|
26
26
|
requireToken?: boolean;
|
|
27
|
-
|
|
27
|
+
verifiedControlPlaneClaims?: VerifiedControlPlaneRequestClaims;
|
|
28
28
|
}): Promise<T>;
|
|
29
29
|
}
|
|
30
30
|
//# sourceMappingURL=base-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/security/http/base-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,eAAe,EACf,aAAa,EAEd,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/security/http/base-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,eAAe,EACf,aAAa,EAEd,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,6CAA6C,CAAC;AAErG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,qBAAqB,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,eAAe,CAAC;IAChF,OAAO,EAAE,CACP,QAAQ,EAAE,QAAQ,GAAG,wBAAwB,EAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC/B,aAAa,CAAC;IACnB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3F,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IAC5C,QAAQ,EAAE,MAAM,aAAa,CAAC;CAC/B;AAED,8BAAsB,WAAY,YAAW,OAAO;IAClD,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IAEnC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAMxC;IAEF,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAE1E,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO;IAYlE,OAAO,CAAC,cAAc;IAmBtB,SAAS,CAAC,qBAAqB,CAC7B,GAAG,EAAE,cAAc,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,eAAe;IAWlB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,GAAG,IAAI;IAKhG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI;IAIhG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI;IAIhG,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAKjD,SAAS,CAAC,QAAQ,IAAI,aAAa;IAInC,SAAS,CAAC,OAAO,CACf,QAAQ,EAAE,QAAQ,GAAG,wBAAwB,EAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,aAAa;IAIhB,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAC1B,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE;QACP,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,0BAA0B,CAAC,EAAE,iCAAiC,CAAC;KAC3D,GACL,OAAO,CAAC,CAAC,CAAC;CA6Fd"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { runWithCacheBatching } from "../../cache/request-cache-batcher.js";
|
|
2
|
+
import { runWithVerifiedCacheApiCredential } from "../../cache/verified-api-credential-context.js";
|
|
2
3
|
import { getHostEnv } from "../../platform/compat/process.js";
|
|
3
4
|
import { serverLogger } from "../../utils/index.js";
|
|
4
5
|
import { ResponseBuilder } from "./response/index.js";
|
|
@@ -67,6 +68,11 @@ export class BaseHandler {
|
|
|
67
68
|
return { response: response, continue: false, metadata };
|
|
68
69
|
}
|
|
69
70
|
withProxyContext(ctx, fn, options = {}) {
|
|
71
|
+
if (options.verifiedControlPlaneClaims) {
|
|
72
|
+
return runWithVerifiedCacheApiCredential(options.verifiedControlPlaneClaims, () => this.withProxyContext(ctx, fn, {
|
|
73
|
+
requireToken: options.requireToken,
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
70
76
|
// Framework-owned token: bypass project env overlay so proxy mode works
|
|
71
77
|
// when a remote project overlay is active.
|
|
72
78
|
const effectiveToken = ctx.proxyToken || getHostEnv("VERYFRONT_API_TOKEN") || "";
|
|
@@ -106,7 +112,6 @@ export class BaseHandler {
|
|
|
106
112
|
releaseId: ctx.releaseId,
|
|
107
113
|
branch,
|
|
108
114
|
environmentName: ctx.environmentName,
|
|
109
|
-
tokenTrust: options.tokenTrust,
|
|
110
115
|
});
|
|
111
116
|
}
|
|
112
117
|
if (typeof fsWrapper.setRequestToken === "function" && effectiveToken) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-stream.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/request/agent-stream.handler.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAEpF,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,wCAAwC,CAAC;AAQhD,OAAO,EACL,4BAA4B,EAE7B,MAAM,2CAA2C,CAAC;AAyBnD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAcnG,MAAM,WAAW,sBACf,SAAQ,yBAAyB,EAAE,+BAA+B;IAClE,4BAA4B,CAAC,EAAE,OAAO,4BAA4B,CAAC;IACnE,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,+BAA+B,CAAC,YAAY,CAAC,CAAC;CACpF;
|
|
1
|
+
{"version":3,"file":"agent-stream.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/request/agent-stream.handler.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAEpF,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,wCAAwC,CAAC;AAQhD,OAAO,EACL,4BAA4B,EAE7B,MAAM,2CAA2C,CAAC;AAyBnD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAcnG,MAAM,WAAW,sBACf,SAAQ,yBAAyB,EAAE,+BAA+B;IAClE,4BAA4B,CAAC,EAAE,OAAO,4BAA4B,CAAC;IACnE,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,+BAA+B,CAAC,YAAY,CAAC,CAAC;CACpF;AAwgBD,qBAAa,kBAAmB,SAAQ,WAAW;IASrC,OAAO,CAAC,QAAQ,CAAC,IAAI;IARjC,QAAQ,EAAE,eAAe,CAMvB;gBAE2B,IAAI,GAAE,sBAAoC;IAIvE,OAAO,CAAC,sBAAsB;IAwBxB,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CAqMxE"}
|
|
@@ -339,20 +339,17 @@ function buildAgentSourceRunOptions(sourceContext) {
|
|
|
339
339
|
return {
|
|
340
340
|
productionMode: false,
|
|
341
341
|
branch: sourceContext.branch,
|
|
342
|
-
tokenTrust: "verified-control-plane",
|
|
343
342
|
};
|
|
344
343
|
case "environment":
|
|
345
344
|
return {
|
|
346
345
|
productionMode: true,
|
|
347
346
|
environmentName: sourceContext.environmentName,
|
|
348
347
|
releaseId: sourceContext.releaseId ?? null,
|
|
349
|
-
tokenTrust: "verified-control-plane",
|
|
350
348
|
};
|
|
351
349
|
case "release":
|
|
352
350
|
return {
|
|
353
351
|
productionMode: true,
|
|
354
352
|
releaseId: sourceContext.releaseId,
|
|
355
|
-
tokenTrust: "verified-control-plane",
|
|
356
353
|
};
|
|
357
354
|
}
|
|
358
355
|
}
|
|
@@ -436,7 +433,7 @@ export class AgentStreamHandler extends BaseHandler {
|
|
|
436
433
|
if (!pathRunId || pathRunId !== payload.runId) {
|
|
437
434
|
return this.respond(builder.json({ error: "CONTROL_PLANE_RUN_ID_MISMATCH" }, 400));
|
|
438
435
|
}
|
|
439
|
-
await verifyControlPlaneRequest(req, ctx, rawBody, {
|
|
436
|
+
const verifiedClaims = await verifyControlPlaneRequest(req, ctx, rawBody, {
|
|
440
437
|
expectedSubject: payload.runId,
|
|
441
438
|
expectedSurface: "studio",
|
|
442
439
|
});
|
|
@@ -541,7 +538,7 @@ export class AgentStreamHandler extends BaseHandler {
|
|
|
541
538
|
? setResponseHeader(response, RUNTIME_OWNER_INVOKE_URL_HEADER, runtimeOwnerInvokeUrl)
|
|
542
539
|
: response;
|
|
543
540
|
return this.respond(applyBuilderHeaders(responseWithOwner, builder.headers));
|
|
544
|
-
}), {
|
|
541
|
+
}), { verifiedControlPlaneClaims: verifiedClaims });
|
|
545
542
|
}
|
|
546
543
|
catch (error) {
|
|
547
544
|
if (error instanceof InternalAgentRequestBodyTooLargeError) {
|
|
@@ -82,7 +82,7 @@ export declare const getCheckpointSchema: () => import("../../internal-agents/sc
|
|
|
82
82
|
/**
|
|
83
83
|
* Approval status schema
|
|
84
84
|
*/
|
|
85
|
-
export declare const getApprovalStatusSchema: () => import("../../internal-agents/schema.js").Schema<"
|
|
85
|
+
export declare const getApprovalStatusSchema: () => import("../../internal-agents/schema.js").Schema<"pending" | "rejected" | "approved" | "expired">;
|
|
86
86
|
/**
|
|
87
87
|
* Pending approval schema
|
|
88
88
|
*/
|
|
@@ -94,7 +94,7 @@ export declare const getPendingApprovalSchema: () => import("../../internal-agen
|
|
|
94
94
|
approvers: import("../../internal-agents/schema.js").Schema<string[] | undefined>;
|
|
95
95
|
requestedAt: import("../../internal-agents/schema.js").Schema<Date>;
|
|
96
96
|
expiresAt: import("../../internal-agents/schema.js").Schema<Date | undefined>;
|
|
97
|
-
status: import("../../internal-agents/schema.js").Schema<"
|
|
97
|
+
status: import("../../internal-agents/schema.js").Schema<"pending" | "rejected" | "approved" | "expired">;
|
|
98
98
|
decidedBy: import("../../internal-agents/schema.js").Schema<string | undefined>;
|
|
99
99
|
decidedAt: import("../../internal-agents/schema.js").Schema<Date | undefined>;
|
|
100
100
|
comment: import("../../internal-agents/schema.js").Schema<string | undefined>;
|
|
@@ -193,7 +193,7 @@ export declare const CheckpointSchema: import("../../internal-agents/schema.js")
|
|
|
193
193
|
completedAt: import("../../internal-agents/schema.js").Schema<Date | undefined>;
|
|
194
194
|
}>>>;
|
|
195
195
|
}>>;
|
|
196
|
-
export declare const ApprovalStatusSchema: import("../../internal-agents/schema.js").Schema<"
|
|
196
|
+
export declare const ApprovalStatusSchema: import("../../internal-agents/schema.js").Schema<"pending" | "rejected" | "approved" | "expired">;
|
|
197
197
|
export declare const PendingApprovalSchema: import("../../internal-agents/schema.js").Schema<import("../../extensions/schema/schema-validator.js").InferShape<{
|
|
198
198
|
id: import("../../internal-agents/schema.js").Schema<string>;
|
|
199
199
|
nodeId: import("../../internal-agents/schema.js").Schema<string>;
|
|
@@ -202,7 +202,7 @@ export declare const PendingApprovalSchema: import("../../internal-agents/schema
|
|
|
202
202
|
approvers: import("../../internal-agents/schema.js").Schema<string[] | undefined>;
|
|
203
203
|
requestedAt: import("../../internal-agents/schema.js").Schema<Date>;
|
|
204
204
|
expiresAt: import("../../internal-agents/schema.js").Schema<Date | undefined>;
|
|
205
|
-
status: import("../../internal-agents/schema.js").Schema<"
|
|
205
|
+
status: import("../../internal-agents/schema.js").Schema<"pending" | "rejected" | "approved" | "expired">;
|
|
206
206
|
decidedBy: import("../../internal-agents/schema.js").Schema<string | undefined>;
|
|
207
207
|
decidedAt: import("../../internal-agents/schema.js").Schema<Date | undefined>;
|
|
208
208
|
comment: import("../../internal-agents/schema.js").Schema<string | undefined>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "veryfront",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1050",
|
|
4
4
|
"description": "The simplest way to build AI-powered apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -329,9 +329,10 @@
|
|
|
329
329
|
"@types/react": "19.2.14",
|
|
330
330
|
"@types/react-dom": "19.2.3",
|
|
331
331
|
"ws": "8.21.0",
|
|
332
|
-
"@veryfront/ext-bundler-esbuild": "0.1.
|
|
333
|
-
"@veryfront/ext-content-mdx": "0.1.
|
|
334
|
-
"@veryfront/ext-css-tailwind": "0.1.
|
|
332
|
+
"@veryfront/ext-bundler-esbuild": "0.1.1050",
|
|
333
|
+
"@veryfront/ext-content-mdx": "0.1.1050",
|
|
334
|
+
"@veryfront/ext-css-tailwind": "0.1.1050",
|
|
335
|
+
"@veryfront/ext-parser-babel": "0.1.1050"
|
|
335
336
|
},
|
|
336
337
|
"devDependencies": {
|
|
337
338
|
"@types/node": "20.9.0"
|