@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.
@@ -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