@agent-native/core 0.51.15 → 0.53.0
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/README.md +42 -96
- package/blueprints/action/crud.md +98 -0
- package/blueprints/channel/discord.md +74 -0
- package/blueprints/provider/stripe.md +87 -0
- package/blueprints/sandbox/docker.md +78 -0
- package/dist/action.d.ts +24 -0
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js +4 -0
- package/dist/action.js.map +1 -1
- package/dist/agent/observational-memory/compactor.d.ts +43 -0
- package/dist/agent/observational-memory/compactor.d.ts.map +1 -0
- package/dist/agent/observational-memory/compactor.js +50 -0
- package/dist/agent/observational-memory/compactor.js.map +1 -0
- package/dist/agent/observational-memory/config.d.ts +37 -0
- package/dist/agent/observational-memory/config.d.ts.map +1 -0
- package/dist/agent/observational-memory/config.js +48 -0
- package/dist/agent/observational-memory/config.js.map +1 -0
- package/dist/agent/observational-memory/index.d.ts +26 -0
- package/dist/agent/observational-memory/index.d.ts.map +1 -0
- package/dist/agent/observational-memory/index.js +25 -0
- package/dist/agent/observational-memory/index.js.map +1 -0
- package/dist/agent/observational-memory/internal-run.d.ts +37 -0
- package/dist/agent/observational-memory/internal-run.d.ts.map +1 -0
- package/dist/agent/observational-memory/internal-run.js +59 -0
- package/dist/agent/observational-memory/internal-run.js.map +1 -0
- package/dist/agent/observational-memory/message-text.d.ts +13 -0
- package/dist/agent/observational-memory/message-text.d.ts.map +1 -0
- package/dist/agent/observational-memory/message-text.js +46 -0
- package/dist/agent/observational-memory/message-text.js.map +1 -0
- package/dist/agent/observational-memory/migrations.d.ts +13 -0
- package/dist/agent/observational-memory/migrations.d.ts.map +1 -0
- package/dist/agent/observational-memory/migrations.js +43 -0
- package/dist/agent/observational-memory/migrations.js.map +1 -0
- package/dist/agent/observational-memory/observer.d.ts +37 -0
- package/dist/agent/observational-memory/observer.d.ts.map +1 -0
- package/dist/agent/observational-memory/observer.js +82 -0
- package/dist/agent/observational-memory/observer.js.map +1 -0
- package/dist/agent/observational-memory/plugin.d.ts +16 -0
- package/dist/agent/observational-memory/plugin.d.ts.map +1 -0
- package/dist/agent/observational-memory/plugin.js +26 -0
- package/dist/agent/observational-memory/plugin.js.map +1 -0
- package/dist/agent/observational-memory/prompts.d.ts +27 -0
- package/dist/agent/observational-memory/prompts.d.ts.map +1 -0
- package/dist/agent/observational-memory/prompts.js +42 -0
- package/dist/agent/observational-memory/prompts.js.map +1 -0
- package/dist/agent/observational-memory/read.d.ts +47 -0
- package/dist/agent/observational-memory/read.d.ts.map +1 -0
- package/dist/agent/observational-memory/read.js +99 -0
- package/dist/agent/observational-memory/read.js.map +1 -0
- package/dist/agent/observational-memory/reflector.d.ts +31 -0
- package/dist/agent/observational-memory/reflector.d.ts.map +1 -0
- package/dist/agent/observational-memory/reflector.js +76 -0
- package/dist/agent/observational-memory/reflector.js.map +1 -0
- package/dist/agent/observational-memory/schema.d.ts +267 -0
- package/dist/agent/observational-memory/schema.d.ts.map +1 -0
- package/dist/agent/observational-memory/schema.js +48 -0
- package/dist/agent/observational-memory/schema.js.map +1 -0
- package/dist/agent/observational-memory/store.d.ts +52 -0
- package/dist/agent/observational-memory/store.d.ts.map +1 -0
- package/dist/agent/observational-memory/store.js +197 -0
- package/dist/agent/observational-memory/store.js.map +1 -0
- package/dist/agent/observational-memory/types.d.ts +61 -0
- package/dist/agent/observational-memory/types.d.ts.map +1 -0
- package/dist/agent/observational-memory/types.js +9 -0
- package/dist/agent/observational-memory/types.js.map +1 -0
- package/dist/agent/production-agent.d.ts +15 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +240 -1
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
- package/dist/agent/run-loop-with-resume.js +49 -0
- package/dist/agent/run-loop-with-resume.js.map +1 -1
- package/dist/agent/run-store.d.ts +17 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +55 -0
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/runtime-context.d.ts +30 -0
- package/dist/agent/runtime-context.d.ts.map +1 -1
- package/dist/agent/runtime-context.js +54 -1
- package/dist/agent/runtime-context.js.map +1 -1
- package/dist/agent/tool-call-journal.d.ts +101 -0
- package/dist/agent/tool-call-journal.d.ts.map +1 -0
- package/dist/agent/tool-call-journal.js +214 -0
- package/dist/agent/tool-call-journal.js.map +1 -0
- package/dist/agent/types.d.ts +24 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/add.d.ts +109 -0
- package/dist/cli/add.d.ts.map +1 -0
- package/dist/cli/add.js +352 -0
- package/dist/cli/add.js.map +1 -0
- package/dist/cli/connect.d.ts +5 -4
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +157 -48
- package/dist/cli/connect.js.map +1 -1
- package/dist/cli/eval.d.ts +17 -0
- package/dist/cli/eval.d.ts.map +1 -0
- package/dist/cli/eval.js +121 -0
- package/dist/cli/eval.js.map +1 -0
- package/dist/cli/index.js +44 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-config-writers.d.ts +20 -13
- package/dist/cli/mcp-config-writers.d.ts.map +1 -1
- package/dist/cli/mcp-config-writers.js +152 -13
- package/dist/cli/mcp-config-writers.js.map +1 -1
- package/dist/cli/mcp.d.ts +2 -2
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +50 -196
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/plan-local.d.ts +69 -6
- package/dist/cli/plan-local.d.ts.map +1 -1
- package/dist/cli/plan-local.js +517 -23
- package/dist/cli/plan-local.js.map +1 -1
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +1 -1
- package/dist/cli/recap.js.map +1 -1
- package/dist/cli/skills.d.ts +13 -6
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +287 -111
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +118 -92
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +16 -0
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-engine-key.d.ts +6 -4
- package/dist/client/agent-engine-key.d.ts.map +1 -1
- package/dist/client/agent-engine-key.js +9 -6
- package/dist/client/agent-engine-key.js.map +1 -1
- package/dist/client/chat/run-recovery.js +1 -1
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +20 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +32 -7
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +7 -14
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +13 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +21 -0
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/coding-tools/run-code.d.ts +7 -0
- package/dist/coding-tools/run-code.d.ts.map +1 -1
- package/dist/coding-tools/run-code.js +21 -106
- package/dist/coding-tools/run-code.js.map +1 -1
- package/dist/coding-tools/sandbox/adapter.d.ts +79 -0
- package/dist/coding-tools/sandbox/adapter.d.ts.map +1 -0
- package/dist/coding-tools/sandbox/adapter.js +24 -0
- package/dist/coding-tools/sandbox/adapter.js.map +1 -0
- package/dist/coding-tools/sandbox/index.d.ts +51 -0
- package/dist/coding-tools/sandbox/index.d.ts.map +1 -0
- package/dist/coding-tools/sandbox/index.js +79 -0
- package/dist/coding-tools/sandbox/index.js.map +1 -0
- package/dist/coding-tools/sandbox/local-child-process-adapter.d.ts +24 -0
- package/dist/coding-tools/sandbox/local-child-process-adapter.d.ts.map +1 -0
- package/dist/coding-tools/sandbox/local-child-process-adapter.js +141 -0
- package/dist/coding-tools/sandbox/local-child-process-adapter.js.map +1 -0
- package/dist/db/client.d.ts +4 -2
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +6 -4
- package/dist/db/client.js.map +1 -1
- package/dist/deploy/route-discovery.d.ts.map +1 -1
- package/dist/deploy/route-discovery.js +1 -0
- package/dist/deploy/route-discovery.js.map +1 -1
- package/dist/eval/agent-runner.d.ts +63 -0
- package/dist/eval/agent-runner.d.ts.map +1 -0
- package/dist/eval/agent-runner.js +142 -0
- package/dist/eval/agent-runner.js.map +1 -0
- package/dist/eval/define-eval.d.ts +29 -0
- package/dist/eval/define-eval.d.ts.map +1 -0
- package/dist/eval/define-eval.js +43 -0
- package/dist/eval/define-eval.js.map +1 -0
- package/dist/eval/index.d.ts +18 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +17 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/report.d.ts +8 -0
- package/dist/eval/report.d.ts.map +1 -0
- package/dist/eval/report.js +44 -0
- package/dist/eval/report.js.map +1 -0
- package/dist/eval/runner.d.ts +67 -0
- package/dist/eval/runner.d.ts.map +1 -0
- package/dist/eval/runner.js +256 -0
- package/dist/eval/runner.js.map +1 -0
- package/dist/eval/scorer.d.ts +83 -0
- package/dist/eval/scorer.d.ts.map +1 -0
- package/dist/eval/scorer.js +195 -0
- package/dist/eval/scorer.js.map +1 -0
- package/dist/eval/types.d.ts +162 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +20 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +100 -1
- package/dist/observability/traces.js.map +1 -1
- package/dist/observability/tracing.d.ts +73 -0
- package/dist/observability/tracing.d.ts.map +1 -0
- package/dist/observability/tracing.js +126 -0
- package/dist/observability/tracing.js.map +1 -0
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +4 -1
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/provider-api/actions/query-staged-dataset.d.ts +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +10 -3
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +4 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +9 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +118 -110
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +37 -0
- package/dist/server/agent-engine-api-key-route.d.ts.map +1 -0
- package/dist/server/agent-engine-api-key-route.js +105 -0
- package/dist/server/agent-engine-api-key-route.js.map +1 -0
- package/dist/server/agent-teams.d.ts +62 -0
- package/dist/server/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +99 -2
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +17 -10
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/create-server.js +1 -1
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +2 -0
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +33 -1
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +17 -4
- package/dist/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +20 -0
- package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +20 -0
- package/docs/content/agent-teams.md +32 -0
- package/docs/content/blueprint-installer.md +73 -0
- package/docs/content/evals.md +141 -0
- package/docs/content/pr-visual-recap.md +7 -4
- package/docs/content/sandbox-adapters.md +134 -0
- package/docs/content/template-plan.md +20 -8
- package/package.json +5 -1
- package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +17 -4
- package/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +20 -0
- package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +20 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type H3Event } from "h3";
|
|
2
|
+
type AgentEngineApiKeyScope = "user" | "org";
|
|
3
|
+
export interface AgentEngineApiKeyWriteTarget {
|
|
4
|
+
scope: AgentEngineApiKeyScope;
|
|
5
|
+
scopeId: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function normalizeAgentEngineApiKeyPayload(body: unknown): {
|
|
8
|
+
ok: true;
|
|
9
|
+
key: string;
|
|
10
|
+
value: string;
|
|
11
|
+
scope: AgentEngineApiKeyScope;
|
|
12
|
+
} | {
|
|
13
|
+
ok: false;
|
|
14
|
+
statusCode: number;
|
|
15
|
+
error: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function resolveAgentEngineApiKeyWriteTarget(event: H3Event, scope: AgentEngineApiKeyScope): Promise<{
|
|
18
|
+
ok: true;
|
|
19
|
+
target: AgentEngineApiKeyWriteTarget;
|
|
20
|
+
} | {
|
|
21
|
+
ok: false;
|
|
22
|
+
statusCode: number;
|
|
23
|
+
error: string;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function createAgentEngineApiKeyHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
26
|
+
error: any;
|
|
27
|
+
ok?: undefined;
|
|
28
|
+
key?: undefined;
|
|
29
|
+
scope?: undefined;
|
|
30
|
+
} | {
|
|
31
|
+
ok: boolean;
|
|
32
|
+
key: string;
|
|
33
|
+
scope: AgentEngineApiKeyScope;
|
|
34
|
+
error?: undefined;
|
|
35
|
+
}>>;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=agent-engine-api-key-route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-engine-api-key-route.d.ts","sourceRoot":"","sources":["../../src/server/agent-engine-api-key-route.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,IAAI,CAAC;AAeZ,KAAK,sBAAsB,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7C,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,OAAO,GAC3D;IACE,EAAE,EAAE,IAAI,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,sBAAsB,CAAC;CAC/B,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAgDnD;AAED,wBAAsB,mCAAmC,CACvD,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CACN;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,4BAA4B,CAAA;CAAE,GAClD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CACnD,CA6BA;AAED,wBAAgB,8BAA8B;;;;;;;;;;IAqC7C"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { defineEventHandler, getMethod, setResponseStatus, } from "h3";
|
|
2
|
+
import { PROVIDER_ENV_META } from "../agent/engine/provider-env-vars.js";
|
|
3
|
+
import { getOrgContext } from "../org/context.js";
|
|
4
|
+
import { writeAppSecret } from "../secrets/storage.js";
|
|
5
|
+
import { getSession } from "./auth.js";
|
|
6
|
+
import { readBody } from "./h3-helpers.js";
|
|
7
|
+
const PROVIDER_TO_ENV_VAR = new Map(Object.entries(PROVIDER_ENV_META).map(([provider, meta]) => [
|
|
8
|
+
provider,
|
|
9
|
+
meta.envVar,
|
|
10
|
+
]));
|
|
11
|
+
const PROVIDER_ENV_VAR_KEYS = new Set(PROVIDER_TO_ENV_VAR.values());
|
|
12
|
+
export function normalizeAgentEngineApiKeyPayload(body) {
|
|
13
|
+
const payload = body && typeof body === "object" ? body : {};
|
|
14
|
+
const raw = payload;
|
|
15
|
+
const key = typeof raw.key === "string"
|
|
16
|
+
? raw.key.trim()
|
|
17
|
+
: typeof raw.provider === "string"
|
|
18
|
+
? (PROVIDER_TO_ENV_VAR.get(raw.provider.trim()) ?? "")
|
|
19
|
+
: "";
|
|
20
|
+
if (!key || !PROVIDER_ENV_VAR_KEYS.has(key)) {
|
|
21
|
+
return {
|
|
22
|
+
ok: false,
|
|
23
|
+
statusCode: 400,
|
|
24
|
+
error: "Unsupported agent engine provider key.",
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const value = typeof raw.value === "string"
|
|
28
|
+
? raw.value.trim()
|
|
29
|
+
: typeof raw.apiKey === "string"
|
|
30
|
+
? raw.apiKey.trim()
|
|
31
|
+
: "";
|
|
32
|
+
if (!value) {
|
|
33
|
+
return { ok: false, statusCode: 400, error: "value is required" };
|
|
34
|
+
}
|
|
35
|
+
if (raw.scope != null && raw.scope !== "user" && raw.scope !== "org") {
|
|
36
|
+
return {
|
|
37
|
+
ok: false,
|
|
38
|
+
statusCode: 400,
|
|
39
|
+
error: 'scope must be "user" or "org"',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
ok: true,
|
|
44
|
+
key,
|
|
45
|
+
value,
|
|
46
|
+
scope: raw.scope === "org" ? "org" : "user",
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export async function resolveAgentEngineApiKeyWriteTarget(event, scope) {
|
|
50
|
+
const session = await getSession(event).catch(() => null);
|
|
51
|
+
if (!session?.email) {
|
|
52
|
+
return { ok: false, statusCode: 401, error: "Authentication required" };
|
|
53
|
+
}
|
|
54
|
+
if (scope === "user") {
|
|
55
|
+
return {
|
|
56
|
+
ok: true,
|
|
57
|
+
target: { scope: "user", scopeId: session.email },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const ctx = await getOrgContext(event).catch(() => null);
|
|
61
|
+
if (!ctx?.orgId) {
|
|
62
|
+
return { ok: false, statusCode: 400, error: "No active organization" };
|
|
63
|
+
}
|
|
64
|
+
if (ctx.role !== "owner" && ctx.role !== "admin") {
|
|
65
|
+
return {
|
|
66
|
+
ok: false,
|
|
67
|
+
statusCode: 403,
|
|
68
|
+
error: "Only organization owners and admins can set org-scoped keys",
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
ok: true,
|
|
73
|
+
target: { scope: "org", scopeId: ctx.orgId },
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export function createAgentEngineApiKeyHandler() {
|
|
77
|
+
return defineEventHandler(async (event) => {
|
|
78
|
+
if (getMethod(event) !== "POST") {
|
|
79
|
+
setResponseStatus(event, 405);
|
|
80
|
+
return { error: "Method not allowed" };
|
|
81
|
+
}
|
|
82
|
+
const payload = normalizeAgentEngineApiKeyPayload(await readBody(event).catch(() => ({})));
|
|
83
|
+
if (!payload.ok) {
|
|
84
|
+
setResponseStatus(event, payload.statusCode);
|
|
85
|
+
return { error: payload.error };
|
|
86
|
+
}
|
|
87
|
+
const resolved = await resolveAgentEngineApiKeyWriteTarget(event, payload.scope);
|
|
88
|
+
if (!resolved.ok) {
|
|
89
|
+
setResponseStatus(event, resolved.statusCode);
|
|
90
|
+
return { error: resolved.error };
|
|
91
|
+
}
|
|
92
|
+
await writeAppSecret({
|
|
93
|
+
key: payload.key,
|
|
94
|
+
value: payload.value,
|
|
95
|
+
scope: resolved.target.scope,
|
|
96
|
+
scopeId: resolved.target.scopeId,
|
|
97
|
+
});
|
|
98
|
+
return {
|
|
99
|
+
ok: true,
|
|
100
|
+
key: payload.key,
|
|
101
|
+
scope: resolved.target.scope,
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=agent-engine-api-key-route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-engine-api-key-route.js","sourceRoot":"","sources":["../../src/server/agent-engine-api-key-route.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,iBAAiB,GAElB,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,mBAAmB,GAAG,IAAI,GAAG,CACjC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC1D,QAAQ;IACR,IAAI,CAAC,MAAM;CACZ,CAAC,CACH,CAAC;AACF,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;AASpE,MAAM,UAAU,iCAAiC,CAAC,IAAa;IAQ7D,MAAM,OAAO,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,OAMX,CAAC;IAEF,MAAM,GAAG,GACP,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ;QACzB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;QAChB,CAAC,CAAC,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAChC,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YACtD,CAAC,CAAC,EAAE,CAAC;IACX,IAAI,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,UAAU,EAAE,GAAG;YACf,KAAK,EAAE,wCAAwC;SAChD,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GACT,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QAC3B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;QAClB,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;YAC9B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;YACnB,CAAC,CAAC,EAAE,CAAC;IACX,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;IACpE,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACrE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,UAAU,EAAE,GAAG;YACf,KAAK,EAAE,+BAA+B;SACvC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG;QACH,KAAK;QACL,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,KAAc,EACd,KAA6B;IAK7B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC1E,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE;SAClD,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IACzE,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACjD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,UAAU,EAAE,GAAG;YACf,KAAK,EAAE,6DAA6D;SACrE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE;KAC7C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,OAAO,kBAAkB,CAAC,KAAK,EAAE,KAAc,EAAE,EAAE;QACjD,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,MAAM,EAAE,CAAC;YAChC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9B,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;QACzC,CAAC;QAED,MAAM,OAAO,GAAG,iCAAiC,CAC/C,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACxC,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,mCAAmC,CACxD,KAAK,EACL,OAAO,CAAC,KAAK,CACd,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC9C,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,cAAc,CAAC;YACnB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK;YAC5B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO;SACjC,CAAC,CAAC;QAEH,OAAO;YACL,EAAE,EAAE,IAAI;YACR,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK;SAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n defineEventHandler,\n getMethod,\n setResponseStatus,\n type H3Event,\n} from \"h3\";\nimport { PROVIDER_ENV_META } from \"../agent/engine/provider-env-vars.js\";\nimport { getOrgContext } from \"../org/context.js\";\nimport { writeAppSecret } from \"../secrets/storage.js\";\nimport { getSession } from \"./auth.js\";\nimport { readBody } from \"./h3-helpers.js\";\n\nconst PROVIDER_TO_ENV_VAR = new Map(\n Object.entries(PROVIDER_ENV_META).map(([provider, meta]) => [\n provider,\n meta.envVar,\n ]),\n);\nconst PROVIDER_ENV_VAR_KEYS = new Set(PROVIDER_TO_ENV_VAR.values());\n\ntype AgentEngineApiKeyScope = \"user\" | \"org\";\n\nexport interface AgentEngineApiKeyWriteTarget {\n scope: AgentEngineApiKeyScope;\n scopeId: string;\n}\n\nexport function normalizeAgentEngineApiKeyPayload(body: unknown):\n | {\n ok: true;\n key: string;\n value: string;\n scope: AgentEngineApiKeyScope;\n }\n | { ok: false; statusCode: number; error: string } {\n const payload = body && typeof body === \"object\" ? body : {};\n const raw = payload as {\n key?: unknown;\n provider?: unknown;\n value?: unknown;\n apiKey?: unknown;\n scope?: unknown;\n };\n\n const key =\n typeof raw.key === \"string\"\n ? raw.key.trim()\n : typeof raw.provider === \"string\"\n ? (PROVIDER_TO_ENV_VAR.get(raw.provider.trim()) ?? \"\")\n : \"\";\n if (!key || !PROVIDER_ENV_VAR_KEYS.has(key)) {\n return {\n ok: false,\n statusCode: 400,\n error: \"Unsupported agent engine provider key.\",\n };\n }\n\n const value =\n typeof raw.value === \"string\"\n ? raw.value.trim()\n : typeof raw.apiKey === \"string\"\n ? raw.apiKey.trim()\n : \"\";\n if (!value) {\n return { ok: false, statusCode: 400, error: \"value is required\" };\n }\n\n if (raw.scope != null && raw.scope !== \"user\" && raw.scope !== \"org\") {\n return {\n ok: false,\n statusCode: 400,\n error: 'scope must be \"user\" or \"org\"',\n };\n }\n\n return {\n ok: true,\n key,\n value,\n scope: raw.scope === \"org\" ? \"org\" : \"user\",\n };\n}\n\nexport async function resolveAgentEngineApiKeyWriteTarget(\n event: H3Event,\n scope: AgentEngineApiKeyScope,\n): Promise<\n | { ok: true; target: AgentEngineApiKeyWriteTarget }\n | { ok: false; statusCode: number; error: string }\n> {\n const session = await getSession(event).catch(() => null);\n if (!session?.email) {\n return { ok: false, statusCode: 401, error: \"Authentication required\" };\n }\n\n if (scope === \"user\") {\n return {\n ok: true,\n target: { scope: \"user\", scopeId: session.email },\n };\n }\n\n const ctx = await getOrgContext(event).catch(() => null);\n if (!ctx?.orgId) {\n return { ok: false, statusCode: 400, error: \"No active organization\" };\n }\n if (ctx.role !== \"owner\" && ctx.role !== \"admin\") {\n return {\n ok: false,\n statusCode: 403,\n error: \"Only organization owners and admins can set org-scoped keys\",\n };\n }\n\n return {\n ok: true,\n target: { scope: \"org\", scopeId: ctx.orgId },\n };\n}\n\nexport function createAgentEngineApiKeyHandler() {\n return defineEventHandler(async (event: H3Event) => {\n if (getMethod(event) !== \"POST\") {\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n\n const payload = normalizeAgentEngineApiKeyPayload(\n await readBody(event).catch(() => ({})),\n );\n if (!payload.ok) {\n setResponseStatus(event, payload.statusCode);\n return { error: payload.error };\n }\n\n const resolved = await resolveAgentEngineApiKeyWriteTarget(\n event,\n payload.scope,\n );\n if (!resolved.ok) {\n setResponseStatus(event, resolved.statusCode);\n return { error: resolved.error };\n }\n\n await writeAppSecret({\n key: payload.key,\n value: payload.value,\n scope: resolved.target.scope,\n scopeId: resolved.target.scopeId,\n });\n\n return {\n ok: true,\n key: payload.key,\n scope: resolved.target.scope,\n };\n });\n}\n"]}
|
|
@@ -22,6 +22,42 @@ import type { RunEvent } from "../agent/types.js";
|
|
|
22
22
|
import { type AgentTeamRunPayload } from "./agent-teams-run-queue.js";
|
|
23
23
|
import type { BackgroundAgentRun, BackgroundAgentRunStatus, BackgroundAgentTranscriptEvent } from "../code-agents/background-run.js";
|
|
24
24
|
import type { BackgroundAgentController } from "../code-agents/index.js";
|
|
25
|
+
/**
|
|
26
|
+
* Run `fn` with `depth` recorded as the ambient delegation depth so any
|
|
27
|
+
* `spawnTask` call made transitively from `fn` knows the depth of the agent
|
|
28
|
+
* doing the spawning.
|
|
29
|
+
*/
|
|
30
|
+
declare function runWithDelegationDepth<T>(depth: number, fn: () => T | Promise<T>): T | Promise<T>;
|
|
31
|
+
/** Depth of the agent currently executing (0 = top-level chat). */
|
|
32
|
+
declare function currentAmbientDelegationDepth(): number;
|
|
33
|
+
/**
|
|
34
|
+
* Public read of the ambient sub-agent delegation depth for the currently
|
|
35
|
+
* executing agent. 0 = the top-level (user-facing) chat; 1+ = a spawned
|
|
36
|
+
* sub-agent. Used by the chat plugin to thread the depth into
|
|
37
|
+
* `buildRuntimeContextPrompt` so a sub-agent at the cap is told it can't
|
|
38
|
+
* delegate further. Mirrors `currentAmbientDelegationDepth`; exported under a
|
|
39
|
+
* descriptive name so callers outside this module don't depend on the private
|
|
40
|
+
* helper or the test-only export object.
|
|
41
|
+
*/
|
|
42
|
+
export declare function getCurrentDelegationDepth(): number;
|
|
43
|
+
export interface SubagentDepthDecision {
|
|
44
|
+
/** Whether the spawn is allowed under the depth cap. */
|
|
45
|
+
allowed: boolean;
|
|
46
|
+
/** Depth of the agent doing the spawning (parent). */
|
|
47
|
+
parentDepth: number;
|
|
48
|
+
/** Depth the spawned sub-agent would have (parentDepth + 1). */
|
|
49
|
+
childDepth: number;
|
|
50
|
+
/** The effective cap (resolved from env, clamped). */
|
|
51
|
+
maxDepth: number;
|
|
52
|
+
/** Human-readable refusal message when `allowed` is false. */
|
|
53
|
+
error?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Decide whether an agent at `parentDepth` may spawn another sub-agent. The
|
|
57
|
+
* child would sit at `parentDepth + 1`; a child deeper than `maxDepth` is
|
|
58
|
+
* refused. Pure + exported so the enforcement is unit-testable and reusable.
|
|
59
|
+
*/
|
|
60
|
+
export declare function evaluateSubagentDepth(parentDepth: number, env?: Record<string, string | undefined>): SubagentDepthDecision;
|
|
25
61
|
/** Framework route the self-fire dispatch targets to run a queued sub-agent in
|
|
26
62
|
* a fresh function invocation. Mounted inside the agent-chat plugin (where the
|
|
27
63
|
* sub-agent action/prompt/engine closures live). */
|
|
@@ -42,6 +78,12 @@ export interface AgentTask {
|
|
|
42
78
|
completedAt?: number;
|
|
43
79
|
runId?: string;
|
|
44
80
|
error?: string;
|
|
81
|
+
/**
|
|
82
|
+
* Delegation depth of THIS sub-agent: 1 for a sub-agent spawned by the
|
|
83
|
+
* top-level chat, 2 for a sub-agent spawned by a depth-1 sub-agent, etc.
|
|
84
|
+
* Drives the runaway-delegation guardrail (see `evaluateSubagentDepth`).
|
|
85
|
+
*/
|
|
86
|
+
delegationDepth?: number;
|
|
45
87
|
}
|
|
46
88
|
export type AgentTeamBackgroundRun = Omit<BackgroundAgentRun, "kind" | "source" | "sourceRecord" | "status" | "cwd" | "goalId" | "transcriptPath" | "artifactRoot"> & {
|
|
47
89
|
kind: "agent-team";
|
|
@@ -154,6 +196,23 @@ export interface SpawnTaskOptions {
|
|
|
154
196
|
parentThreadId?: string;
|
|
155
197
|
/** Display name for the sub-agent tab (carried into the dispatch payload). */
|
|
156
198
|
name?: string;
|
|
199
|
+
/**
|
|
200
|
+
* Delegation depth of the agent doing the spawning (the parent). Top-level
|
|
201
|
+
* chat is 0. When omitted, the depth is read from the ambient run context
|
|
202
|
+
* (set by `processAgentTeamRun` when a sub-agent is itself running), so a
|
|
203
|
+
* sub-agent that reaches `spawnTask` inherits its own depth automatically.
|
|
204
|
+
* The spawned sub-agent's depth is `parentDelegationDepth + 1`.
|
|
205
|
+
*/
|
|
206
|
+
parentDelegationDepth?: number;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Error thrown when a spawn is refused because it would exceed the delegation
|
|
210
|
+
* depth cap. Carries the structured decision so callers (and the tool layer)
|
|
211
|
+
* can surface a precise message to the parent agent.
|
|
212
|
+
*/
|
|
213
|
+
export declare class SubagentDelegationDepthError extends Error {
|
|
214
|
+
readonly decision: SubagentDepthDecision;
|
|
215
|
+
constructor(decision: SubagentDepthDecision);
|
|
157
216
|
}
|
|
158
217
|
/**
|
|
159
218
|
* Spawn a sub-agent task. Creates a thread, starts a background agent run,
|
|
@@ -226,6 +285,9 @@ export declare const _agentTeamsQueueForTests: {
|
|
|
226
285
|
drainQueuedTaskMessages: typeof drainQueuedTaskMessages;
|
|
227
286
|
formatQueuedTaskMessages: typeof formatQueuedTaskMessages;
|
|
228
287
|
resolveTaskCompletion: typeof resolveTaskCompletion;
|
|
288
|
+
evaluateSubagentDepth: typeof evaluateSubagentDepth;
|
|
289
|
+
runWithDelegationDepth: typeof runWithDelegationDepth;
|
|
290
|
+
currentAmbientDelegationDepth: typeof currentAmbientDelegationDepth;
|
|
229
291
|
};
|
|
230
292
|
export {};
|
|
231
293
|
//# sourceMappingURL=agent-teams.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-teams.d.ts","sourceRoot":"","sources":["../../src/server/agent-teams.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EACV,WAAW,EACX,2BAA2B,EAC5B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAML,KAAK,SAAS,EACf,MAAM,yBAAyB,CAAC;AAWjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAMlD,OAAO,EAYL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EACV,kBAAkB,EAClB,wBAAwB,EACxB,8BAA8B,EAC/B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EACV,yBAAyB,EAK1B,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-teams.d.ts","sourceRoot":"","sources":["../../src/server/agent-teams.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,65 @@ import { fireInternalDispatch } from "./self-dispatch.js";
|
|
|
27
27
|
import { resolveOrgIdForEmail } from "../org/context.js";
|
|
28
28
|
import { readAppState, writeAppState, listAppState, deleteAppState, } from "../application-state/script-helpers.js";
|
|
29
29
|
import { getRequestUserEmail, runWithRequestContext, } from "./request-context.js";
|
|
30
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
31
|
+
import { resolveMaxSubagentDelegationDepth } from "../agent/runtime-context.js";
|
|
32
|
+
/**
|
|
33
|
+
* Ambient delegation depth for the agent whose run is currently executing.
|
|
34
|
+
*
|
|
35
|
+
* `processAgentTeamRun` runs each sub-agent inside `runWithDelegationDepth(d)`
|
|
36
|
+
* where `d` is that sub-agent's own depth. So if a sub-agent calls `spawnTask`
|
|
37
|
+
* (e.g. because tool-stripping was bypassed and it was handed the `agent-teams`
|
|
38
|
+
* tool anyway), the spawn path reads its parent's depth from here and refuses
|
|
39
|
+
* once the cap is reached — independent of any tool-level guard. The top-level
|
|
40
|
+
* chat runs outside this storage, so its ambient depth is 0.
|
|
41
|
+
*/
|
|
42
|
+
const delegationDepthStorage = new AsyncLocalStorage();
|
|
43
|
+
/**
|
|
44
|
+
* Run `fn` with `depth` recorded as the ambient delegation depth so any
|
|
45
|
+
* `spawnTask` call made transitively from `fn` knows the depth of the agent
|
|
46
|
+
* doing the spawning.
|
|
47
|
+
*/
|
|
48
|
+
function runWithDelegationDepth(depth, fn) {
|
|
49
|
+
return delegationDepthStorage.run(Math.max(0, Math.floor(depth || 0)), fn);
|
|
50
|
+
}
|
|
51
|
+
/** Depth of the agent currently executing (0 = top-level chat). */
|
|
52
|
+
function currentAmbientDelegationDepth() {
|
|
53
|
+
return delegationDepthStorage.getStore() ?? 0;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Public read of the ambient sub-agent delegation depth for the currently
|
|
57
|
+
* executing agent. 0 = the top-level (user-facing) chat; 1+ = a spawned
|
|
58
|
+
* sub-agent. Used by the chat plugin to thread the depth into
|
|
59
|
+
* `buildRuntimeContextPrompt` so a sub-agent at the cap is told it can't
|
|
60
|
+
* delegate further. Mirrors `currentAmbientDelegationDepth`; exported under a
|
|
61
|
+
* descriptive name so callers outside this module don't depend on the private
|
|
62
|
+
* helper or the test-only export object.
|
|
63
|
+
*/
|
|
64
|
+
export function getCurrentDelegationDepth() {
|
|
65
|
+
return currentAmbientDelegationDepth();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Decide whether an agent at `parentDepth` may spawn another sub-agent. The
|
|
69
|
+
* child would sit at `parentDepth + 1`; a child deeper than `maxDepth` is
|
|
70
|
+
* refused. Pure + exported so the enforcement is unit-testable and reusable.
|
|
71
|
+
*/
|
|
72
|
+
export function evaluateSubagentDepth(parentDepth, env = process.env) {
|
|
73
|
+
const safeParentDepth = Number.isFinite(parentDepth)
|
|
74
|
+
? Math.max(0, Math.floor(parentDepth))
|
|
75
|
+
: 0;
|
|
76
|
+
const childDepth = safeParentDepth + 1;
|
|
77
|
+
const maxDepth = resolveMaxSubagentDelegationDepth(env);
|
|
78
|
+
const allowed = childDepth <= maxDepth;
|
|
79
|
+
return {
|
|
80
|
+
allowed,
|
|
81
|
+
parentDepth: safeParentDepth,
|
|
82
|
+
childDepth,
|
|
83
|
+
maxDepth,
|
|
84
|
+
error: allowed
|
|
85
|
+
? undefined
|
|
86
|
+
: `Delegation depth limit reached (max ${maxDepth}); cannot spawn another sub-agent.`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
30
89
|
/** Framework route the self-fire dispatch targets to run a queued sub-agent in
|
|
31
90
|
* a fresh function invocation. Mounted inside the agent-chat plugin (where the
|
|
32
91
|
* sub-agent action/prompt/engine closures live). */
|
|
@@ -789,11 +848,38 @@ export function toAgentTaskBackgroundTranscriptEvent(runId, event, options = {})
|
|
|
789
848
|
metadata,
|
|
790
849
|
};
|
|
791
850
|
}
|
|
851
|
+
/**
|
|
852
|
+
* Error thrown when a spawn is refused because it would exceed the delegation
|
|
853
|
+
* depth cap. Carries the structured decision so callers (and the tool layer)
|
|
854
|
+
* can surface a precise message to the parent agent.
|
|
855
|
+
*/
|
|
856
|
+
export class SubagentDelegationDepthError extends Error {
|
|
857
|
+
decision;
|
|
858
|
+
constructor(decision) {
|
|
859
|
+
super(decision.error ??
|
|
860
|
+
`Delegation depth limit reached (max ${decision.maxDepth}); cannot spawn another sub-agent.`);
|
|
861
|
+
this.name = "SubagentDelegationDepthError";
|
|
862
|
+
this.decision = decision;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
792
865
|
/**
|
|
793
866
|
* Spawn a sub-agent task. Creates a thread, starts a background agent run,
|
|
794
867
|
* and emits agent_task events to the parent chat stream.
|
|
795
868
|
*/
|
|
796
869
|
export async function spawnTask(opts) {
|
|
870
|
+
// ── Delegation-depth guardrail ────────────────────────────────────────────
|
|
871
|
+
// Defensive, server-side enforcement that holds regardless of any tool-level
|
|
872
|
+
// stripping in the agent-chat plugin: a sub-agent cannot infinitely spawn
|
|
873
|
+
// sub-agents. The spawning agent's depth comes from the explicit option or,
|
|
874
|
+
// failing that, the ambient depth recorded while a sub-agent run executes.
|
|
875
|
+
const parentDepth = typeof opts.parentDelegationDepth === "number"
|
|
876
|
+
? opts.parentDelegationDepth
|
|
877
|
+
: currentAmbientDelegationDepth();
|
|
878
|
+
const decision = evaluateSubagentDepth(parentDepth);
|
|
879
|
+
if (!decision.allowed) {
|
|
880
|
+
throw new SubagentDelegationDepthError(decision);
|
|
881
|
+
}
|
|
882
|
+
const childDepth = decision.childDepth;
|
|
797
883
|
const taskId = generateTaskId();
|
|
798
884
|
// Create a dedicated thread for the sub-agent with the task as the first message
|
|
799
885
|
const thread = await createThread(opts.ownerEmail, {
|
|
@@ -842,6 +928,7 @@ export async function spawnTask(opts) {
|
|
|
842
928
|
updatedAt: createdAt,
|
|
843
929
|
startedAt: createdAt,
|
|
844
930
|
runId,
|
|
931
|
+
delegationDepth: childDepth,
|
|
845
932
|
};
|
|
846
933
|
await saveTask(task);
|
|
847
934
|
await startTaskProgressRun(task, opts.ownerEmail);
|
|
@@ -1176,7 +1263,14 @@ export async function processAgentTeamRun(opts) {
|
|
|
1176
1263
|
task.currentStep = "";
|
|
1177
1264
|
}
|
|
1178
1265
|
};
|
|
1179
|
-
await runWithRequestContext({ userEmail: ownerEmail || undefined, orgId: orgId ?? undefined },
|
|
1266
|
+
await runWithRequestContext({ userEmail: ownerEmail || undefined, orgId: orgId ?? undefined },
|
|
1267
|
+
// Record THIS sub-agent's own delegation depth as the ambient
|
|
1268
|
+
// depth for the duration of its agent loop. If a tool call from
|
|
1269
|
+
// within the loop reaches `spawnTask` (even with the team tool not
|
|
1270
|
+
// stripped), the spawn path reads this depth and refuses once the
|
|
1271
|
+
// cap is hit. Fall back to depth 1 for legacy tasks persisted
|
|
1272
|
+
// before delegationDepth was tracked.
|
|
1273
|
+
() => runWithDelegationDepth(task.delegationDepth ?? 1, async () => {
|
|
1180
1274
|
chunkUsage = await runAgentLoop({
|
|
1181
1275
|
engine: config.engine,
|
|
1182
1276
|
model: config.model,
|
|
@@ -1188,7 +1282,7 @@ export async function processAgentTeamRun(opts) {
|
|
|
1188
1282
|
signal,
|
|
1189
1283
|
finalResponseGuard: createTaskMessageFinalGuard(opts.taskId),
|
|
1190
1284
|
});
|
|
1191
|
-
});
|
|
1285
|
+
}));
|
|
1192
1286
|
}, async (run) => {
|
|
1193
1287
|
clearInterval(heartbeat);
|
|
1194
1288
|
try {
|
|
@@ -1476,5 +1570,8 @@ export const _agentTeamsQueueForTests = {
|
|
|
1476
1570
|
drainQueuedTaskMessages,
|
|
1477
1571
|
formatQueuedTaskMessages,
|
|
1478
1572
|
resolveTaskCompletion,
|
|
1573
|
+
evaluateSubagentDepth,
|
|
1574
|
+
runWithDelegationDepth,
|
|
1575
|
+
currentAmbientDelegationDepth,
|
|
1479
1576
|
};
|
|
1480
1577
|
//# sourceMappingURL=agent-teams.js.map
|