@sema-agent/server 7.79.2 → 7.79.3
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/dist/boot/late-binds.d.ts +35 -0
- package/dist/boot/late-binds.js +20 -0
- package/dist/boot/stage-01-config.d.ts +7 -0
- package/dist/boot/stage-01-config.js +60 -0
- package/dist/boot/stage-02-registry-pull.d.ts +10 -0
- package/dist/boot/stage-02-registry-pull.js +11 -0
- package/dist/boot/stage-03-store-backend.d.ts +32 -0
- package/dist/boot/stage-03-store-backend.js +11 -0
- package/dist/boot/stage-04-stores.d.ts +69 -0
- package/dist/boot/stage-04-stores.js +49 -0
- package/dist/boot/stage-05-execution-env.d.ts +82 -0
- package/dist/boot/stage-05-execution-env.js +20 -0
- package/dist/boot/stage-06-runners.d.ts +143 -0
- package/dist/boot/stage-06-runners.js +207 -0
- package/dist/boot/stage-07-capability-layer.d.ts +157 -0
- package/dist/boot/stage-07-capability-layer.js +162 -0
- package/dist/boot/stage-08-reapers.d.ts +172 -0
- package/dist/boot/stage-08-reapers.js +78 -0
- package/dist/boot/stage-09-leader.d.ts +204 -0
- package/dist/boot/stage-09-leader.js +47 -0
- package/dist/boot/stage-10-http-server.d.ts +204 -0
- package/dist/boot/stage-10-http-server.js +289 -0
- package/dist/config-invariants.d.ts +9 -0
- package/dist/config-invariants.js +7 -1
- package/dist/config-types.d.ts +1 -1
- package/dist/main.js +20 -870
- package/dist/service-version.d.ts +5 -0
- package/dist/service-version.js +12 -0
- package/dist/trace/redact.d.ts +7 -6
- package/dist/trace/redact.js +419 -229
- package/package.json +1 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { Runner, terminalProjection, InMemoryToolResultStore, TtlSessionStore, uuidv7, createAllowDenyPolicy, workflowsCapability } from "@sema-agent/core";
|
|
2
|
+
import { createSessionTitler } from "../session-titler.js";
|
|
3
|
+
import { cardRuleScopeRoot } from "../task-cwd.js";
|
|
4
|
+
import { ForkRoutingSessionStore } from "../plugins/fork-routing-session-store.js";
|
|
5
|
+
import { withoutExecutionEnv } from "../capabilities/hands-lane.js";
|
|
6
|
+
import { redactSecrets } from "../trace/redact.js";
|
|
7
|
+
import { hasServiceAuth } from "../http/server.js";
|
|
8
|
+
import { workflowModelAllowlistFor } from "../task-workflow.js";
|
|
9
|
+
import { backendOwnsControlPlane } from "../memory-operator-faces.js";
|
|
10
|
+
import { createHookLlm } from "../hooks/hook-llm.js";
|
|
11
|
+
import { assertRetentionLaneWirable } from "./retention-lane.js";
|
|
12
|
+
import { assertConsolidationDriverWirable, buildConsolidationValveAudit, createMemoryConsolidationFaces, resolveConsolidationDriverSeat } from "./memory-consolidation.js";
|
|
13
|
+
import { createPerModelAuthSeat } from "./side-query-lane.js";
|
|
14
|
+
import { createWorkflowOrchestration } from "./workflow-orchestration.js";
|
|
15
|
+
import { createLiveCoordinators } from "./coordinators.js";
|
|
16
|
+
import { createRuntimeCaps } from "./runtime-caps.js";
|
|
17
|
+
import { createSessionShellGateRegistry } from "./session-shell-gate-registry.js";
|
|
18
|
+
import { createRunnerDeps, createSharedRunnerDeps } from "./runner-deps.js";
|
|
19
|
+
import { createOrgMemoryAdmissionWiring } from "./org-memory.js";
|
|
20
|
+
import { createGovernanceSeams } from "./governance-seams.js";
|
|
21
|
+
import { createSharedMemoryScopeAuthorizer } from "../shared-memory-scope-authorizer.js";
|
|
22
|
+
import { parkedAskRedeem, runStore } from "./late-binds.js";
|
|
23
|
+
export function runStage06(ctx) {
|
|
24
|
+
const { backend, backgroundAgentStore, brain, config, configCenter, deploymentHooks, executionEnvFactory, fileHistoryStore, localRoot, logger, lspManager, mailboxStore, memoryEngine, memorySyncRunner, metrics, perSessionCwd, permissionRuleProvider, pricing, rosterStore, ruleConsent, sendUserFileTaskEnvs, sessionCaptureRecordStore, sessionCaptureRecords, sessionPolicyStore, sessionStore, taskAttachmentStore, taskListLane, toolResultStore, tracer, usageWindowStore } = ctx;
|
|
25
|
+
const { sqlWorkflowRunStore, workflowNotifyJournal, workflowCompletionInbox, deliverWorkflowCompletion, workflowNotifyGate, fleetBus, workflowRunStore, workflowJournalStore, outcomeSink, workflowRecoverOpts, workflowAgentRegistry, subagentSteerRegistry, workflowAgentSessionIndex, } = createWorkflowOrchestration({ config, logger, metrics, localRoot, backend, getRunStore: () => runStore });
|
|
26
|
+
const { elicitation, question, toolApproval, durableEnabled, streamApprovalGate, approvalAskAudit, sendUserFileEmitter, sendFileLedger, sendUserFileToolSpec } = createLiveCoordinators({
|
|
27
|
+
config, logger, backend, sendUserFileTaskEnvs, ruleConsent,
|
|
28
|
+
getParkedRedeem: () => parkedAskRedeem,
|
|
29
|
+
ruleScopeRootFor: (sessionId) => cardRuleScopeRoot(sessionId !== undefined ? perSessionCwd.get(sessionId) : undefined, config),
|
|
30
|
+
});
|
|
31
|
+
const memoryOptOutGrantStore = backend?.memoryOptOutGrant();
|
|
32
|
+
const { principalCaps, centerRuntimeCapsResolver, runtimeCapsResolver, runtimeCapsPeekResolver } = createRuntimeCaps({ config, logger, memoryOptOutGrant: memoryOptOutGrantStore });
|
|
33
|
+
const orgMemoryAdmission = createOrgMemoryAdmissionWiring({ config, logger, metrics });
|
|
34
|
+
const sharedMemoryStore = orgMemoryAdmission.directory !== undefined
|
|
35
|
+
? backend?.sharedMemoryStore?.(createSharedMemoryScopeAuthorizer({
|
|
36
|
+
directory: orgMemoryAdmission.directory,
|
|
37
|
+
deploymentScopes: config.requirePrincipal === true ? () => [] : orgMemoryAdmission.deploymentMemoryScopesLive,
|
|
38
|
+
}))
|
|
39
|
+
: undefined;
|
|
40
|
+
if (sharedMemoryStore)
|
|
41
|
+
logger.info("shared_memory_stores_enabled", { backend: backend?.kind });
|
|
42
|
+
const runnerOffloadStore = toolResultStore ?? new InMemoryToolResultStore({ maxTotalChars: 64_000_000 });
|
|
43
|
+
const commitHands = config.configProvider === "local" ? { commitCoAuthor: "Sema <noreply@vivi-ai.com>" } : undefined;
|
|
44
|
+
const checkpointStore = backend?.checkpoint && config.durableApproval ? backend.checkpoint(logger) : undefined;
|
|
45
|
+
const retentionExecutor = backend?.retention?.({ taskAttachmentTable: taskAttachmentStore !== undefined, taskListTables: taskListLane.backend !== "memory", logger });
|
|
46
|
+
const retentionLaneStore = backend?.retentionLane?.();
|
|
47
|
+
assertRetentionLaneWirable({
|
|
48
|
+
intervalSec: config.retentionSweep.intervalSec,
|
|
49
|
+
policy: config.retentionPolicy,
|
|
50
|
+
executor: retentionExecutor,
|
|
51
|
+
stores: [
|
|
52
|
+
{ name: "sessionStore", store: sessionStore },
|
|
53
|
+
{ name: "checkpointStore", store: checkpointStore },
|
|
54
|
+
{ name: "toolResultStore", store: runnerOffloadStore },
|
|
55
|
+
],
|
|
56
|
+
locked: (config.lockedConfigKeys ?? []).includes("retentionPolicy"),
|
|
57
|
+
});
|
|
58
|
+
assertConsolidationDriverWirable({
|
|
59
|
+
enabled: config.memoryConsolidationDriver.enabled,
|
|
60
|
+
memoryEngineWired: memoryEngine !== undefined,
|
|
61
|
+
controlPlaneOwned: backendOwnsControlPlane(memoryEngine?.backend),
|
|
62
|
+
memoryEngineBackend: config.memoryEngineBackend,
|
|
63
|
+
...(config.memoryProvenance !== undefined ? { provenance: config.memoryProvenance } : {}),
|
|
64
|
+
});
|
|
65
|
+
const memoryConsolidationFaces = config.memoryConsolidationDriver.enabled && memoryEngine
|
|
66
|
+
? createMemoryConsolidationFaces(memoryEngine, {
|
|
67
|
+
seat: resolveConsolidationDriverSeat({
|
|
68
|
+
brain,
|
|
69
|
+
models: config.models,
|
|
70
|
+
tiers: config.tiers,
|
|
71
|
+
roles: config.roles,
|
|
72
|
+
getApiKeyAndHeaders: createPerModelAuthSeat(() => configCenter.getKeyResolver()),
|
|
73
|
+
}),
|
|
74
|
+
scopes: config.memoryConsolidationDriver.scopes,
|
|
75
|
+
...(config.memoryProvenance !== undefined ? { provenance: config.memoryProvenance } : {}),
|
|
76
|
+
onIncident: (err) => logger.warn("memory_consolidation_incident", { code: err.code ?? null, detail: err.message }),
|
|
77
|
+
onStopDetail: (audit) => logger.warn("memory_consolidation_stop_detail", audit),
|
|
78
|
+
...(sessionCaptureRecordStore !== undefined ? { captureRecordStore: sessionCaptureRecordStore } : {}),
|
|
79
|
+
})
|
|
80
|
+
: undefined;
|
|
81
|
+
for (const w of buildConsolidationValveAudit({
|
|
82
|
+
enabled: config.memoryConsolidationDriver.enabled,
|
|
83
|
+
operatorPrincipals: config.operatorPrincipals,
|
|
84
|
+
hasServiceAuth: hasServiceAuth(config),
|
|
85
|
+
allowUnauthedWrites: config.allowUnauthedWrites ?? false,
|
|
86
|
+
}).warnings) {
|
|
87
|
+
logger.warn(w.tag, { detail: w.detail });
|
|
88
|
+
}
|
|
89
|
+
if (memoryConsolidationFaces !== undefined) {
|
|
90
|
+
logger.info("memory_consolidation_driver_armed", {
|
|
91
|
+
seat: memoryConsolidationFaces.seat,
|
|
92
|
+
model: memoryConsolidationFaces.model,
|
|
93
|
+
scopes: memoryConsolidationFaces.scopes,
|
|
94
|
+
periodic: false,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const governanceSeams = createGovernanceSeams({
|
|
98
|
+
config,
|
|
99
|
+
logger,
|
|
100
|
+
retentionStores: [
|
|
101
|
+
{ name: "sessionStore", store: sessionStore },
|
|
102
|
+
{ name: "checkpointStore", store: checkpointStore },
|
|
103
|
+
{ name: "toolResultStore", store: runnerOffloadStore },
|
|
104
|
+
],
|
|
105
|
+
retentionExecutorWired: config.retentionSweep.intervalSec > 0 && retentionExecutor !== undefined && retentionLaneStore !== undefined,
|
|
106
|
+
});
|
|
107
|
+
const mcpRevocations = configCenter.takeMcpRevocations();
|
|
108
|
+
const workflowModelAllowlistSnapshot = workflowModelAllowlistFor(config) ?? [];
|
|
109
|
+
const sessionShellGateRegistry = createSessionShellGateRegistry();
|
|
110
|
+
const runnerDeps = createRunnerDeps({
|
|
111
|
+
hands: commitHands,
|
|
112
|
+
mcpRevocations,
|
|
113
|
+
sessionShellGateExplicitlyOff: sessionShellGateRegistry.explicitlyOff,
|
|
114
|
+
config, logger, metrics, localRoot, promptSource: configCenter.promptSource, rosterStore, backgroundAgentStore, mailboxStore, usageWindowStore, brain,
|
|
115
|
+
pricing, tracer, outcomeSink, elicitation, question, toolApproval, sessionStore, memoryEngine,
|
|
116
|
+
sessionCaptureRecords,
|
|
117
|
+
memorySyncRunner, toolResultStore: runnerOffloadStore, checkpointStore, sessionPolicyStore, runtimeCapsResolver, fileHistoryStore,
|
|
118
|
+
permissionRuleStore: permissionRuleProvider,
|
|
119
|
+
executionEnvFactory, lspManager, fleetBus, deploymentHooks, workflowRunStore, workflowJournalStore,
|
|
120
|
+
workflowAgentRegistry, workflowNotifyGate, workflowCompletionInbox, deliverWorkflowCompletion, orgMemoryAdmission,
|
|
121
|
+
governanceSeams,
|
|
122
|
+
sharedMemoryStores: sharedMemoryStore ? sharedMemoryStore : undefined,
|
|
123
|
+
getRunStore: () => runStore,
|
|
124
|
+
});
|
|
125
|
+
const runner = new Runner(runnerDeps);
|
|
126
|
+
const handslessRunner = new Runner(withoutExecutionEnv(runnerDeps));
|
|
127
|
+
const runnerTierFrozen = Object.keys(config.tiers).length > 0;
|
|
128
|
+
const { hookModelFor, hookLlm } = createHookLlm({ config, getKeyResolver: () => configCenter.getKeyResolver(), metrics });
|
|
129
|
+
const hookAgentRunner = new Runner({ ...runnerDeps, sessionStore: new TtlSessionStore({ defaultTtlDays: 1 / 24 }) });
|
|
130
|
+
const hookAgent = async ({ prompt, model, timeoutMs, system }) => {
|
|
131
|
+
const pick = hookModelFor(model);
|
|
132
|
+
if (!pick.ok)
|
|
133
|
+
return pick;
|
|
134
|
+
try {
|
|
135
|
+
const result = await hookAgentRunner.runTask({
|
|
136
|
+
objective: prompt,
|
|
137
|
+
sessionId: uuidv7(),
|
|
138
|
+
model: pick.catalogRef,
|
|
139
|
+
...(system !== undefined ? { systemPrompt: system } : {}),
|
|
140
|
+
handsReadOnly: true,
|
|
141
|
+
enableFork: false,
|
|
142
|
+
limits: { maxTurns: 10, maxCostUsd: 0.05, maxWalltimeMs: Math.max(30_000, timeoutMs) },
|
|
143
|
+
toolPolicy: createAllowDenyPolicy({}),
|
|
144
|
+
});
|
|
145
|
+
metrics.inc("hook_llm_calls_total", { type: "agent" });
|
|
146
|
+
if (result.terminal.kind !== "completed") {
|
|
147
|
+
const plane = terminalProjection(result.terminal);
|
|
148
|
+
return { ok: false, error: `hook agent ${plane.status}: ${clipHookErr(plane.errorMessage)}` };
|
|
149
|
+
}
|
|
150
|
+
return { ok: true, text: result.result ?? "" };
|
|
151
|
+
}
|
|
152
|
+
catch (e) {
|
|
153
|
+
return { ok: false, error: String(e) };
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
const clipHookErr = (s) => (s ?? "").slice(0, 300);
|
|
157
|
+
const titleCapable = sessionStore;
|
|
158
|
+
const sessionTitler = config.sessionAutoTitle && titleCapable.setTitleIfNull && titleCapable.probeTitle
|
|
159
|
+
? createSessionTitler({
|
|
160
|
+
setTitleIfNull: titleCapable.setTitleIfNull.bind(sessionStore),
|
|
161
|
+
probeTitle: titleCapable.probeTitle.bind(sessionStore),
|
|
162
|
+
redact: redactSecrets,
|
|
163
|
+
llm: (o) => hookLlm({ prompt: o.prompt, timeoutMs: o.timeoutMs, model: o.model }),
|
|
164
|
+
logger,
|
|
165
|
+
metrics,
|
|
166
|
+
})
|
|
167
|
+
: undefined;
|
|
168
|
+
if (sessionTitler)
|
|
169
|
+
logger.info("session_auto_title_enabled", {});
|
|
170
|
+
const workflowsCapable = workflowsCapability(runnerDeps);
|
|
171
|
+
const subRunnerSessions = new ForkRoutingSessionStore(sessionStore, new TtlSessionStore({ defaultTtlDays: 1 / 24 }));
|
|
172
|
+
const subRunnerDeps = {
|
|
173
|
+
...createSharedRunnerDeps({
|
|
174
|
+
metrics,
|
|
175
|
+
config,
|
|
176
|
+
logger,
|
|
177
|
+
hands: commitHands,
|
|
178
|
+
mcpRevocations,
|
|
179
|
+
brain,
|
|
180
|
+
pricing,
|
|
181
|
+
tracer,
|
|
182
|
+
promptSource: configCenter.promptSource,
|
|
183
|
+
executionEnvFactory,
|
|
184
|
+
lspManager,
|
|
185
|
+
backgroundAgentStore,
|
|
186
|
+
mailboxStore,
|
|
187
|
+
rosterStore,
|
|
188
|
+
deploymentHooks,
|
|
189
|
+
toolResultStore: runnerOffloadStore,
|
|
190
|
+
checkpointStore,
|
|
191
|
+
sessionPolicyStore,
|
|
192
|
+
usageWindowStore,
|
|
193
|
+
orgMemoryAdmission,
|
|
194
|
+
governanceSeams,
|
|
195
|
+
sharedMemoryStores: sharedMemoryStore ? sharedMemoryStore : undefined,
|
|
196
|
+
}),
|
|
197
|
+
sessionStore: subRunnerSessions,
|
|
198
|
+
onBackgroundChildEvent: runnerDeps.onBackgroundChildEvent ? runnerDeps.onBackgroundChildEvent : undefined,
|
|
199
|
+
loadProjectMemory: runnerDeps.loadProjectMemory ? runnerDeps.loadProjectMemory : undefined,
|
|
200
|
+
probeInstructionSources: runnerDeps.probeInstructionSources ? runnerDeps.probeInstructionSources : undefined,
|
|
201
|
+
onError: runnerDeps.onError ? runnerDeps.onError : undefined,
|
|
202
|
+
};
|
|
203
|
+
const subRunner = new Runner(subRunnerDeps);
|
|
204
|
+
const handslessSubRunner = new Runner(withoutExecutionEnv(subRunnerDeps));
|
|
205
|
+
return { ...ctx, approvalAskAudit, centerRuntimeCapsResolver, checkpointStore, durableEnabled, elicitation, fleetBus, governanceSeams, handslessRunner, handslessSubRunner, hookAgent, hookAgentRunner, hookLlm, mcpRevocations, memoryConsolidationFaces, memoryOptOutGrantStore, orgMemoryAdmission, outcomeSink, principalCaps, question, retentionExecutor, retentionLaneStore, runner, runnerDeps, runnerTierFrozen, runtimeCapsPeekResolver, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionShellGateRegistry, sessionTitler, sharedMemoryStore, sqlWorkflowRunStore, streamApprovalGate, subRunner, subRunnerSessions, subagentSteerRegistry, toolApproval, workflowAgentRegistry, workflowAgentSessionIndex, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable };
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=stage-06-runners.js.map
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { RateLimiter } from "../observability/rate-limit.js";
|
|
2
|
+
import type { runStage06 } from "./stage-06-runners.js";
|
|
3
|
+
export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>): Promise<{
|
|
4
|
+
approvalExemptionStore: import("../plugins/approval-exemption-store.js").ApprovalExemptionStore | undefined;
|
|
5
|
+
approvalNonceStore: import("../plugins/approval-nonce-store.js").ApprovalNonceStore | undefined;
|
|
6
|
+
authorize: (ctx: {
|
|
7
|
+
req: import("http").IncomingMessage;
|
|
8
|
+
body: import("../index.js").TaskRequestBody;
|
|
9
|
+
}) => Promise<import("../security.js").AuthContext>;
|
|
10
|
+
imageBakes: import("../plugins/store-backend.js").ImageBake | undefined;
|
|
11
|
+
imageIndex: import("../plugins/store-backend.js").ImageIndex | undefined;
|
|
12
|
+
parkedReviveInheritedGate: ((row: import("@sema-agent/core").BackgroundAgentRecord, identity: import("./parked-revive-gate.js").ParkedReviveIdentity) => Promise<import("./parked-revive-gate.js").RebuiltInheritedGate>) | undefined;
|
|
13
|
+
parkedReviveTool: import("@sema-agent/core").ToolSpec<import("@sema-agent/core").TSchema> | undefined;
|
|
14
|
+
rateLimiter: RateLimiter | import("../plugins/pg-rate-limiter.js").PgRateLimiter | import("../plugins/tidb-rate-limiter.js").TiDBRateLimiter;
|
|
15
|
+
resumeAnchorStore: import("../plugins/store-backend.js").ResumeAnchorStore | undefined;
|
|
16
|
+
runStore: import("../plugins/store-backend.js").RunStore | undefined;
|
|
17
|
+
scenarioDetails: Record<string, import("../capabilities/scenarios.js").ScenarioDetail>;
|
|
18
|
+
scenarios: Record<string, import("../capabilities/scenarios.js").Scenario>;
|
|
19
|
+
selectEnvTool: import("@sema-agent/core").ToolSpec<import("@sema-agent/core").TSchema> | undefined;
|
|
20
|
+
singleUserAutoAcceptBaseline: boolean;
|
|
21
|
+
taskLimitCaps: {
|
|
22
|
+
timeoutSec: number | undefined;
|
|
23
|
+
maxOutputTokens: number | undefined;
|
|
24
|
+
maxTurns: number | undefined;
|
|
25
|
+
};
|
|
26
|
+
taskTimeoutSec: number;
|
|
27
|
+
approvalAskAudit: import("../approval-ask-audit-store.js").FileApprovalAskAuditStore | undefined;
|
|
28
|
+
centerRuntimeCapsResolver: ((principal: string | undefined) => Promise<import("@sema-agent/core").RuntimeCaps | undefined>) | undefined;
|
|
29
|
+
checkpointStore: import("../plugins/store-backend.js").CheckpointStoreFull | undefined;
|
|
30
|
+
durableEnabled: boolean;
|
|
31
|
+
elicitation: import("../elicitation.js").ElicitationCoordinator | undefined;
|
|
32
|
+
fleetBus: import("../fleet/fleet-bus.js").FleetEventBus;
|
|
33
|
+
governanceSeams: import("./governance-seams.js").GovernanceSeams;
|
|
34
|
+
handslessRunner: import("@sema-agent/core").Runner;
|
|
35
|
+
handslessSubRunner: import("@sema-agent/core").Runner;
|
|
36
|
+
hookAgent: import("../hooks/hook-runner.js").HookLlmCall;
|
|
37
|
+
hookAgentRunner: import("@sema-agent/core").Runner;
|
|
38
|
+
hookLlm: import("../hooks/hook-runner.js").HookLlmCall;
|
|
39
|
+
mcpRevocations: import("../config-center/mcp-revocation.js").McpRevocationLedger;
|
|
40
|
+
memoryConsolidationFaces: import("./memory-consolidation.js").MemoryConsolidationFaces | undefined;
|
|
41
|
+
memoryOptOutGrantStore: import("../plugins/memory-optout-grant-store-sql.js").MemoryOptOutGrantStore | undefined;
|
|
42
|
+
orgMemoryAdmission: import("./org-memory.js").OrgMemoryAdmissionWiring;
|
|
43
|
+
outcomeSink: import("../plugins/file-outcome-sink.js").OutcomeSink | undefined;
|
|
44
|
+
principalCaps: import("../runtime-caps-resolver.js").PrincipalEntitlementsClient | undefined;
|
|
45
|
+
question: import("../question.js").QuestionCoordinator | undefined;
|
|
46
|
+
retentionExecutor: import("../plugins/retention-store-sql.js").SqlRetentionStore | undefined;
|
|
47
|
+
retentionLaneStore: import("../plugins/retention-lane-store-sql.js").RetentionLaneStore | undefined;
|
|
48
|
+
runner: import("@sema-agent/core").Runner;
|
|
49
|
+
runnerDeps: import("@sema-agent/core").RunnerDeps;
|
|
50
|
+
runnerTierFrozen: boolean;
|
|
51
|
+
runtimeCapsPeekResolver: import("../runtime-caps-resolver.js").EntitlementsResolverFn | undefined;
|
|
52
|
+
sendFileLedger: import("../plugins/send-file-ledger.js").SendFileLedger | undefined;
|
|
53
|
+
sendUserFileEmitter: import("../capabilities/send-user-file-tool.js").SendUserFileEmitter | undefined;
|
|
54
|
+
sendUserFileToolSpec: import("@sema-agent/core").ToolSpec<import("@sema-agent/core").TSchema> | undefined;
|
|
55
|
+
sessionShellGateRegistry: import("./session-shell-gate-registry.js").SessionShellGateRegistry;
|
|
56
|
+
sessionTitler: import("../session-titler.js").SessionTitler | undefined;
|
|
57
|
+
sharedMemoryStore: import("../plugins/shared-memory-store-sql.js").SqlSharedMemoryStore | undefined;
|
|
58
|
+
sqlWorkflowRunStore: import("@sema-agent/core").WorkflowRunStore | undefined;
|
|
59
|
+
streamApprovalGate: import("../tool-approval.js").StreamApprovalGate;
|
|
60
|
+
subRunner: import("@sema-agent/core").Runner;
|
|
61
|
+
subRunnerSessions: import("../plugins/fork-routing-session-store.js").ForkRoutingSessionStore;
|
|
62
|
+
subagentSteerRegistry: import("../orchestration/subagent-steer.js").SubagentSteerRegistry;
|
|
63
|
+
toolApproval: import("../tool-approval.js").ToolApprovalCoordinator | undefined;
|
|
64
|
+
workflowAgentRegistry: import("../orchestration/workflow-agent-steer.js").WorkflowAgentRegistry | undefined;
|
|
65
|
+
workflowAgentSessionIndex: import("../orchestration/workflow-agent-session-index.js").WorkflowAgentSessionIndex | undefined;
|
|
66
|
+
workflowCompletionInbox: import("../orchestration/workflow-completion-inbox.js").WorkflowCompletionInbox | undefined;
|
|
67
|
+
workflowJournalStore: import("../plugins/store-backend.js").ServiceWorkflowJournalStore | undefined;
|
|
68
|
+
workflowModelAllowlistSnapshot: readonly string[];
|
|
69
|
+
workflowNotifyGate: import("../orchestration/workflow-notify-journal.js").WorkflowNotifyGate | undefined;
|
|
70
|
+
workflowNotifyJournal: import("../orchestration/workflow-notify-journal.js").WorkflowNotifyJournalStore | undefined;
|
|
71
|
+
workflowRecoverOpts: {
|
|
72
|
+
orphanGraceMs?: number;
|
|
73
|
+
finalizeStartedBeforeMs?: number;
|
|
74
|
+
publishTerminalFleetRow?: (id: string, run: import("@sema-agent/core").WorkflowRun) => void;
|
|
75
|
+
};
|
|
76
|
+
workflowRunStore: import("../orchestration/workflow-notify-journal.js").JournalingWorkflowRunStore | undefined;
|
|
77
|
+
workflowsCapable: boolean;
|
|
78
|
+
deploymentHooks: import("@sema-agent/core").Hooks;
|
|
79
|
+
deviceLane: import("./device-lane.js").DeviceLane | undefined;
|
|
80
|
+
dropSessionScoped: (sid: string) => void;
|
|
81
|
+
executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
|
|
82
|
+
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
83
|
+
lspManager: import("../lsp/manager.js").E2bLspManager | import("@sema-agent/core").NodeLspManager | undefined;
|
|
84
|
+
perSessionCwd: Map<string, string>;
|
|
85
|
+
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
86
|
+
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
87
|
+
sessionEnvSelection: import("../capabilities/select-environment-tool.js").SessionEnvironmentSelection;
|
|
88
|
+
setSessionCwd: (sid: string, cwd: string) => void;
|
|
89
|
+
setSessionShellEnv: (sid: string, env: Record<string, string>) => void;
|
|
90
|
+
worktreeReap: (() => Promise<void>) | undefined;
|
|
91
|
+
brain: import("@sema-agent/core").Brain;
|
|
92
|
+
costQuota: import("../observability/cost-quota.js").CostQuota | import("../plugins/pg-cost-quota.js").PgCostQuota | import("../plugins/tidb-cost-quota.js").TiDBCostQuota;
|
|
93
|
+
counterDegradeHook: (info: {
|
|
94
|
+
table: string;
|
|
95
|
+
kind: string;
|
|
96
|
+
streak: number;
|
|
97
|
+
prevStreak: number;
|
|
98
|
+
error?: string;
|
|
99
|
+
}) => void;
|
|
100
|
+
fileHistoryStore: import("../plugins/store-backend.js").ServiceFileHistoryStore | undefined;
|
|
101
|
+
fleetLease: import("../fleet-lease.js").FleetLeaseManager | undefined;
|
|
102
|
+
fleetUsage: import("../fleet-client.js").FleetUsageAccumulator | undefined;
|
|
103
|
+
memoryBundleFaces: import("../memory-bundle-engine.js").MemoryBundleFaces | undefined;
|
|
104
|
+
memoryComplianceFaces: import("../memory-operator-faces.js").MemoryComplianceFaces | undefined;
|
|
105
|
+
memoryOriginFaces: import("../memory-operator-faces.js").MemoryOriginFaces | undefined;
|
|
106
|
+
modelUsageTracker: import("../budget.js").ModelUsageTracker;
|
|
107
|
+
permissionRuleProvider: import("@sema-agent/core").PermissionRuleStoreProvider | undefined;
|
|
108
|
+
permissionRuleStores: import("../rules-consent.js").PermissionRuleStoreBundle | undefined;
|
|
109
|
+
pricing: Record<string, import("@sema-agent/core").ModelPricing>;
|
|
110
|
+
promptManifestTracker: import("../budget.js").PromptManifestTracker;
|
|
111
|
+
ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
|
|
112
|
+
sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
|
|
113
|
+
sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
|
|
114
|
+
sideQueryAccounting: (principal: string | undefined, r: {
|
|
115
|
+
model: string;
|
|
116
|
+
usage?: {
|
|
117
|
+
input?: number;
|
|
118
|
+
output?: number;
|
|
119
|
+
cacheRead?: number;
|
|
120
|
+
cacheWrite?: number;
|
|
121
|
+
cost?: {
|
|
122
|
+
total?: number;
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
}) => void;
|
|
126
|
+
toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
|
|
127
|
+
tracer: import("@sema-agent/core").TracerHook;
|
|
128
|
+
backend: import("../index.js").StoreBackend | undefined;
|
|
129
|
+
backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
|
|
130
|
+
breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
|
|
131
|
+
instanceId: string;
|
|
132
|
+
mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
|
|
133
|
+
memoryEngine: {
|
|
134
|
+
backend: import("@sema-agent/core").MemoryBackend;
|
|
135
|
+
root: string;
|
|
136
|
+
} | undefined;
|
|
137
|
+
memoryExportBackend: import("@sema-agent/core").MemoryBackend | undefined;
|
|
138
|
+
memoryPosture: import("../memory-posture.js").MemoryPosture;
|
|
139
|
+
memorySyncCursors: import("../plugins/memory-sync-store-pg.js").MemorySyncStore | undefined;
|
|
140
|
+
memorySyncRunner: import("../memory-sync-client.js").MemorySyncRunner | undefined;
|
|
141
|
+
rosterStore: import("@sema-agent/core").RosterStore | undefined;
|
|
142
|
+
sessionCaptureRecordStore: import("@sema-agent/core").SessionCaptureRecordStore | undefined;
|
|
143
|
+
sessionCaptureRecords: import("../index.js").SessionCaptureRecordSource | undefined;
|
|
144
|
+
sessionStore: import("@sema-agent/core").SessionStore;
|
|
145
|
+
sqlEngineFacts: (() => import("../plugins/sql-driver.js").SqlEngineFacts | null) | undefined;
|
|
146
|
+
storeBackendDegraded: boolean;
|
|
147
|
+
taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
|
|
148
|
+
taskListLane: import("./task-list-lane.js").TaskListLane;
|
|
149
|
+
usageWindowStore: import("@sema-agent/core").UsageWindowStore | undefined;
|
|
150
|
+
ceilingVerdict: import("./unpriced-ceiling-verdict.js").UnpricedCeilingVerdict;
|
|
151
|
+
configCenter: import("./config-center.js").ConfigCenterRuntime;
|
|
152
|
+
config: import("../config-types.js").ServiceConfig;
|
|
153
|
+
localRoot: string;
|
|
154
|
+
logger: import("../index.js").Logger;
|
|
155
|
+
metrics: import("../index.js").Metrics;
|
|
156
|
+
}>;
|
|
157
|
+
//# sourceMappingURL=stage-07-capability-layer.d.ts.map
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { DEFAULT_MODEL_REF } from "../model-select.js";
|
|
2
|
+
import { probeSearchBackend, DEFAULT_SUBAGENT_TOOL_NAME } from "@sema-agent/core";
|
|
3
|
+
import { selectEnvironmentTool } from "../capabilities/select-environment-tool.js";
|
|
4
|
+
import { subagentSendUserFileExtraTools } from "../capabilities/send-user-file-tool.js";
|
|
5
|
+
import { parseCapEnv, parseNumOrFailNonNegative } from "../config.js";
|
|
6
|
+
import { ensureChildSessionDurableWithPromotion } from "../plugins/session-store.js";
|
|
7
|
+
import { webSearchConfigFromEnv, createWebSearchBackend, shouldProbeWebSearchOnBoot } from "../plugins/web-search.js";
|
|
8
|
+
import { createAuthorizer } from "../security.js";
|
|
9
|
+
import { assertGateIntentServiceable, buildForceDurableGateInertNotice, hasOperatorGateIntent } from "../approval.js";
|
|
10
|
+
import { loadSkills } from "../capabilities/skills.js";
|
|
11
|
+
import { createRepoClient } from "../capabilities/repo-tools.js";
|
|
12
|
+
import { buildScenarios, builtinScenarioDetails } from "../capabilities/scenarios.js";
|
|
13
|
+
import { RateLimiter } from "../observability/rate-limit.js";
|
|
14
|
+
import { explicitOperatorOk } from "../http/server.js";
|
|
15
|
+
import { selfOrchestrationDenial } from "../task-workflow.js";
|
|
16
|
+
import { centerEntitlementSourceWired } from "../runtime-caps-resolver.js";
|
|
17
|
+
import { reclaimOrphansAtBoot } from "../boot-reclaim.js";
|
|
18
|
+
import { createParkedReviveInheritedGate } from "./parked-revive-gate.js";
|
|
19
|
+
import { createWebFetchSummarizeLane } from "./webfetch-summarize-lane.js";
|
|
20
|
+
import { createRunnerDepsOnAsk } from "./runner-deps.js";
|
|
21
|
+
import { bindRateLimiter, bindRunStore } from "./late-binds.js";
|
|
22
|
+
export async function runStage07(ctx) {
|
|
23
|
+
const { backend, backgroundAgentStore, brain, checkpointStore, config, configCenter, counterDegradeHook, durableEnabled, handslessSubRunner, localRoot, logger, memoryEngine, metrics, question, runner, runnerDeps, sendUserFileToolSpec, sessionEnvSelection, sessionStore, subRunner, subRunnerSessions, taskListLane, toolApproval } = ctx;
|
|
24
|
+
const authorize = createAuthorizer(config, sessionStore);
|
|
25
|
+
const runStore = backend ? backend.run() : undefined;
|
|
26
|
+
bindRunStore(runStore);
|
|
27
|
+
const resumeAnchorStore = backend ? backend.resumeAnchor() : undefined;
|
|
28
|
+
const approvalExemptionStore = backend ? backend.approvalExemption() : undefined;
|
|
29
|
+
const approvalNonceStore = backend ? backend.approvalNonce() : undefined;
|
|
30
|
+
const taskTimeoutSec = Math.floor(parseNumOrFailNonNegative("TASK_TIMEOUT_SEC", process.env.TASK_TIMEOUT_SEC || "0"));
|
|
31
|
+
const capEnv = (name) => {
|
|
32
|
+
const r = parseCapEnv(name, process.env[name]);
|
|
33
|
+
if (r.invalid !== undefined) {
|
|
34
|
+
logger.warn("task_limit_cap_invalid", {
|
|
35
|
+
env: name,
|
|
36
|
+
raw: r.invalid,
|
|
37
|
+
note: "this per-request rate cap is NOT in effect (a non-numeric or non-positive value parses to 'no cap'). Callers can self-report any value for this limit until the env is fixed.",
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return r.value;
|
|
41
|
+
};
|
|
42
|
+
const taskLimitCaps = {
|
|
43
|
+
timeoutSec: capEnv("TASK_TIMEOUT_MAX_SEC"),
|
|
44
|
+
maxOutputTokens: capEnv("TASK_MAX_OUTPUT_TOKENS_MAX"),
|
|
45
|
+
maxTurns: capEnv("TASK_MAX_TURNS_MAX"),
|
|
46
|
+
};
|
|
47
|
+
const operatorGateIntent = hasOperatorGateIntent(config);
|
|
48
|
+
assertGateIntentServiceable(config, checkpointStore !== undefined);
|
|
49
|
+
const singleUserAutoAcceptBaseline = config.requirePrincipal !== true && !operatorGateIntent;
|
|
50
|
+
await reclaimOrphansAtBoot(runStore, checkpointStore, logger);
|
|
51
|
+
const imageIndex = backend?.imageIndex ? backend.imageIndex() : undefined;
|
|
52
|
+
const selectEnvTool = config.selectEnvironmentTool && config.remoteExec?.provider === "k8s" && imageIndex
|
|
53
|
+
? selectEnvironmentTool({
|
|
54
|
+
catalog: imageIndex,
|
|
55
|
+
selection: sessionEnvSelection,
|
|
56
|
+
viewerFor: (principal) => ({ operator: explicitOperatorOk(principal, config.operatorPrincipals), tenantId: principal ?? null }),
|
|
57
|
+
})
|
|
58
|
+
: undefined;
|
|
59
|
+
const imageBakes = backend?.imageBake && config.imageBakes.enabled ? backend.imageBake() : undefined;
|
|
60
|
+
if (imageBakes)
|
|
61
|
+
logger.info("image_bakes_enabled", { operators: config.operatorPrincipals.length, runner: config.imageBakes.runnerPrincipal });
|
|
62
|
+
if (durableEnabled)
|
|
63
|
+
logger.info("durable_approval_enabled", { toolApprovalGate: config.approvalRequire.length });
|
|
64
|
+
if (config.a2aServe) {
|
|
65
|
+
logger.info("a2a_serve_enabled", {
|
|
66
|
+
card: "/.well-known/agent-card.json",
|
|
67
|
+
rpc: "/v1/a2a",
|
|
68
|
+
advertisedUrl: config.a2aServe.url,
|
|
69
|
+
skills: config.a2aServe.skills.length,
|
|
70
|
+
blockingWaitMs: config.a2aServe.blockingWaitMs,
|
|
71
|
+
tasksUsable: runStore !== undefined,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
if ((config.remoteExec === undefined || config.remoteExec.provider === "host") && !toolApproval && !durableEnabled) {
|
|
75
|
+
logger.warn("fs_write_gate_no_responder", {
|
|
76
|
+
hint: "host-semantics lane with no approval face: permissionMode default/auto Write/Edit asks will auto-deny (fail-closed); wire TOOL_APPROVAL_ENABLED=true or DURABLE_APPROVAL=true to answer them",
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (config.selfOrchestrationEnabled && config.remoteExec !== undefined && config.remoteExec.provider !== "host" && !toolApproval && !durableEnabled) {
|
|
80
|
+
logger.warn("workflow_gate_no_responder", {
|
|
81
|
+
hint: "self-orchestration with no approval face: permissionMode default/auto/acceptEdits run_workflow asks will auto-deny (fail-closed); wire TOOL_APPROVAL_ENABLED=true or DURABLE_APPROVAL=true to answer them",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (singleUserAutoAcceptBaseline) {
|
|
85
|
+
logger.info("tool_policy_single_user_default", {
|
|
86
|
+
posture: "adjudicated auto-accept — ALL write/hand/MCP tool surfaces auto-allowed (core per-surface UNGATED enumeration suppressed for single-user turnkey)",
|
|
87
|
+
tighten: "APPROVAL_REQUIRE / AUTONOMY / commandPolicy (re-surfaces + gates specific surfaces)",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
if (config.directDoorActive)
|
|
91
|
+
logger.info("direct_door_active", { iss: config.principalJwtIss, aud: config.principalJwtAud, operators: config.operatorPrincipals.length });
|
|
92
|
+
if (config.requirePrincipal && config.selfOrchestrationEnabled && !config.selfOrchestrationWorkerIsolation)
|
|
93
|
+
logger.warn("self_orchestration_no_worker_isolation", { detail: "multi-tenant self-orchestration without SELF_ORCHESTRATION_WORKER_ISOLATION=true — a tenant workflow can starve the host event loop (availability risk). Set it to enable worker_thread resource isolation." });
|
|
94
|
+
if (selfOrchestrationDenial(config, centerEntitlementSourceWired(config)) !== null)
|
|
95
|
+
logger.warn("self_orchestration_no_entitlement_source", { detail: "SELF_ORCHESTRATION_ENABLED is on and REQUIRE_PRINCIPAL is on, but no per-principal entitlement source is wired (no config center, or it is in dry-run). core's allowWorkflows is tighten-only — an absent resolver leaves it ungated — so this service fail-closes self-orchestration for EVERY principal: no task on this worker can ever get the workflow engine. /v1/capabilities now reports workflows:false (workflowsGate.denial=\"entitlement_resolver_absent\") and a submit carrying selfOrchestration/settings.ultracode is refused 501 instead of silently downgraded. Wire a config center (SEMA_REGISTRY_URL + token, not dry-run), or set SELF_ORCHESTRATION_ENABLED=false." });
|
|
96
|
+
{
|
|
97
|
+
const inert = buildForceDurableGateInertNotice({
|
|
98
|
+
entitlementSourceWired: centerEntitlementSourceWired(config),
|
|
99
|
+
checkpointStorePresent: checkpointStore !== undefined,
|
|
100
|
+
durableApproval: config.durableApproval,
|
|
101
|
+
});
|
|
102
|
+
if (inert)
|
|
103
|
+
logger.warn(inert.event, inert.fields);
|
|
104
|
+
}
|
|
105
|
+
if (config.requirePrincipal && !config.authToken && Object.keys(config.authTokens ?? {}).length === 0 && !config.traceToken)
|
|
106
|
+
logger.warn("multi_tenant_no_service_token", { detail: "REQUIRE_PRINCIPAL is on but no SERVICE_AUTH_TOKEN/authTokens/TRACE_TOKEN — fleet/trace/session-list are owner-gated only (never fleet-wide, tenant-isolation safe). Set a token for cross-tenant ops visibility." });
|
|
107
|
+
const rateLimiter = backend?.rateLimiter
|
|
108
|
+
? backend.rateLimiter(config.rateLimitPerMin, counterDegradeHook).startRefresh()
|
|
109
|
+
: new RateLimiter(config.rateLimitPerMin);
|
|
110
|
+
bindRateLimiter(rateLimiter);
|
|
111
|
+
let skills = loadSkills(config.skillsDir);
|
|
112
|
+
skills = await configCenter.applyCenterCapabilities(skills);
|
|
113
|
+
const repoClient = config.gitApiBaseUrl ? createRepoClient(config.gitApiKind, config.gitApiBaseUrl, config.gitApiToken) : undefined;
|
|
114
|
+
const webSearchCfg = webSearchConfigFromEnv();
|
|
115
|
+
const webSearch = webSearchCfg ? createWebSearchBackend(webSearchCfg) : undefined;
|
|
116
|
+
if (webSearch)
|
|
117
|
+
logger.info(`WebSearch enabled (provider=${webSearchCfg.provider}, maxResults=${webSearch.maxResults})`);
|
|
118
|
+
if (webSearch && shouldProbeWebSearchOnBoot()) {
|
|
119
|
+
void probeSearchBackend(webSearch.search, { timeoutMs: 10_000 })
|
|
120
|
+
.then((r) => {
|
|
121
|
+
if (r.ok)
|
|
122
|
+
logger.info("web_search_probe_ok", { provider: webSearchCfg.provider, results: r.results });
|
|
123
|
+
else
|
|
124
|
+
logger.warn("web_search_probe_failed", { provider: webSearchCfg.provider, error: r.error, note: "WebSearch stays mounted — the tool will fail per-call until this is fixed; the service is not blocked by it." });
|
|
125
|
+
})
|
|
126
|
+
.catch((e) => logger.warn("web_search_probe_failed", { provider: webSearchCfg.provider, error: e instanceof Error ? e.message : String(e) }));
|
|
127
|
+
}
|
|
128
|
+
const ensureChildSessionDurable = checkpointStore && config.sessionBackend === "tidb" ? (sessionId) => ensureChildSessionDurableWithPromotion(sessionStore, subRunnerSessions, sessionId) : undefined;
|
|
129
|
+
const webFetchSummarize = createWebFetchSummarizeLane({ brain, config, getKeyResolver: () => configCenter.getKeyResolver(), logger });
|
|
130
|
+
const scenarioDeps = {
|
|
131
|
+
runner, subRunner, handslessSubRunner, model: DEFAULT_MODEL_REF, skills, repoClient, requirePrincipal: config.requirePrincipal,
|
|
132
|
+
webSearch: webSearch ? webSearch : undefined, metrics, logger, webFetchSummarize,
|
|
133
|
+
backgroundAgentStore: backgroundAgentStore ? backgroundAgentStore : undefined,
|
|
134
|
+
checkpointStore: checkpointStore ? checkpointStore : undefined,
|
|
135
|
+
ensureChildSessionDurable: ensureChildSessionDurable ? ensureChildSessionDurable : undefined,
|
|
136
|
+
taskListStoreFor: taskListLane.storeFor,
|
|
137
|
+
brandIdentity: config.configProvider === "local",
|
|
138
|
+
subagentExtraTools: sendUserFileToolSpec
|
|
139
|
+
? subagentSendUserFileExtraTools({
|
|
140
|
+
spec: sendUserFileToolSpec,
|
|
141
|
+
approvalGate: () => ({ deny: config.approvalDeny, require: config.approvalRequire, neverAuto: config.approvalNeverAuto }),
|
|
142
|
+
})
|
|
143
|
+
: undefined,
|
|
144
|
+
};
|
|
145
|
+
const scenarios = buildScenarios(scenarioDeps);
|
|
146
|
+
const parkedReviveTool = checkpointStore && backgroundAgentStore ? scenarios.default?.({})?.tools.find((t) => t.name === DEFAULT_SUBAGENT_TOOL_NAME) : undefined;
|
|
147
|
+
const parkedReviveInheritedGate = parkedReviveTool && config.durableApproval
|
|
148
|
+
? createParkedReviveInheritedGate({
|
|
149
|
+
config, question, approvalExemptionStore, logger, localRoot,
|
|
150
|
+
memoryEngineRoot: memoryEngine?.root,
|
|
151
|
+
approverSeat: createRunnerDepsOnAsk(toolApproval),
|
|
152
|
+
...(runnerDeps.runtimeCapsResolver ? { resolveRuntimeCaps: runnerDeps.runtimeCapsResolver } : {}),
|
|
153
|
+
autoModeSeatMounted: runnerDeps.autoMode !== undefined,
|
|
154
|
+
})
|
|
155
|
+
: undefined;
|
|
156
|
+
const scenarioDetails = builtinScenarioDetails(scenarios, scenarioDeps);
|
|
157
|
+
const builtinScenarioNames = Object.keys(scenarioDetails);
|
|
158
|
+
configCenter.applyCenterScenarios({ scenarioDeps, scenarios, scenarioDetails, builtinScenarioNames });
|
|
159
|
+
logger.info("capabilities", { skills: skills.length, scenarios: Object.keys(scenarios), repoTools: Boolean(repoClient) });
|
|
160
|
+
return { ...ctx, approvalExemptionStore, approvalNonceStore, authorize, imageBakes, imageIndex, parkedReviveInheritedGate, parkedReviveTool, rateLimiter, resumeAnchorStore, runStore, scenarioDetails, scenarios, selectEnvTool, singleUserAutoAcceptBaseline, taskLimitCaps, taskTimeoutSec };
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=stage-07-capability-layer.js.map
|