@sema-agent/server 7.79.1 → 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.
Files changed (41) hide show
  1. package/dist/boot/late-binds.d.ts +35 -0
  2. package/dist/boot/late-binds.js +20 -0
  3. package/dist/boot/stage-01-config.d.ts +7 -0
  4. package/dist/boot/stage-01-config.js +60 -0
  5. package/dist/boot/stage-02-registry-pull.d.ts +10 -0
  6. package/dist/boot/stage-02-registry-pull.js +11 -0
  7. package/dist/boot/stage-03-store-backend.d.ts +32 -0
  8. package/dist/boot/stage-03-store-backend.js +11 -0
  9. package/dist/boot/stage-04-stores.d.ts +69 -0
  10. package/dist/boot/stage-04-stores.js +49 -0
  11. package/dist/boot/stage-05-execution-env.d.ts +82 -0
  12. package/dist/boot/stage-05-execution-env.js +20 -0
  13. package/dist/boot/stage-06-runners.d.ts +143 -0
  14. package/dist/boot/stage-06-runners.js +207 -0
  15. package/dist/boot/stage-07-capability-layer.d.ts +157 -0
  16. package/dist/boot/stage-07-capability-layer.js +162 -0
  17. package/dist/boot/stage-08-reapers.d.ts +172 -0
  18. package/dist/boot/stage-08-reapers.js +78 -0
  19. package/dist/boot/stage-09-leader.d.ts +204 -0
  20. package/dist/boot/stage-09-leader.js +47 -0
  21. package/dist/boot/stage-10-http-server.d.ts +204 -0
  22. package/dist/boot/stage-10-http-server.js +289 -0
  23. package/dist/config-invariants.d.ts +9 -0
  24. package/dist/config-invariants.js +7 -1
  25. package/dist/config-types.d.ts +1 -1
  26. package/dist/http/dispatch.d.ts +9 -73
  27. package/dist/http/dispatch.js +12 -281
  28. package/dist/http/route-table.d.ts +113 -0
  29. package/dist/http/route-table.js +235 -0
  30. package/dist/http/routes/admin-memory-optout.d.ts +1 -1
  31. package/dist/http/routes/memory-compliance.d.ts +1 -1
  32. package/dist/http/routes/memory-origin.d.ts +1 -1
  33. package/dist/http/routes/rules.js +4 -4
  34. package/dist/http/server.d.ts +2 -1
  35. package/dist/http/server.js +2 -1
  36. package/dist/main.js +20 -870
  37. package/dist/service-version.d.ts +5 -0
  38. package/dist/service-version.js +12 -0
  39. package/dist/trace/redact.d.ts +16 -6
  40. package/dist/trace/redact.js +568 -246
  41. 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