@sema-agent/server 7.136.0 → 7.137.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION.md +173 -0
- package/USAGE.md +84 -16
- package/deploy/sema-up/README.md +14 -0
- package/deploy/sema-up/chart/templates/sandbox-rbac.yaml +7 -1
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +7 -1
- package/dist/approval-content-kind.d.ts +6 -0
- package/dist/approval-content-kind.js +7 -0
- package/dist/approval-gate-currency.d.ts +48 -6
- package/dist/approval-gate-currency.js +16 -9
- package/dist/approval-hmac.d.ts +13 -1
- package/dist/approval-hmac.js +1 -1
- package/dist/approval.js +3 -3
- package/dist/auth-bridge.js +2 -2
- package/dist/boot/execution-env.d.ts +24 -1
- package/dist/boot/execution-env.js +69 -6
- package/dist/boot/reapers.d.ts +3 -0
- package/dist/boot/reapers.js +15 -1
- package/dist/boot/resolve-spec.d.ts +4 -0
- package/dist/boot/resolve-spec.js +16 -17
- package/dist/boot/stage-03-store-backend.d.ts +1 -1
- package/dist/boot/stage-04-stores.d.ts +1 -1
- package/dist/boot/stage-05-execution-env.d.ts +3 -1
- package/dist/boot/stage-05-execution-env.js +11 -2
- package/dist/boot/stage-06-runners.d.ts +3 -1
- package/dist/boot/stage-06-runners.js +5 -1
- package/dist/boot/stage-07-capability-layer.d.ts +4 -1
- package/dist/boot/stage-07-capability-layer.js +1 -1
- package/dist/boot/stage-08-reapers.d.ts +4 -1
- package/dist/boot/stage-08-reapers.js +2 -1
- package/dist/boot/stage-09-leader.d.ts +4 -1
- package/dist/boot/stage-10-http-server.d.ts +4 -1
- package/dist/boot/stage-10-http-server.js +3 -2
- package/dist/boot/stores.d.ts +1 -1
- package/dist/broker/broker.d.ts +89 -0
- package/dist/broker/broker.js +287 -0
- package/dist/broker/constants.d.ts +39 -0
- package/dist/broker/constants.js +15 -0
- package/dist/broker/http1.d.ts +111 -0
- package/dist/broker/http1.js +256 -0
- package/dist/broker/lease-book.d.ts +87 -0
- package/dist/broker/lease-book.js +142 -0
- package/dist/broker/lease-file.d.ts +60 -0
- package/dist/broker/lease-file.js +127 -0
- package/dist/broker/main.d.ts +2 -0
- package/dist/broker/main.js +20 -0
- package/dist/capabilities/composite-members.d.ts +2 -1
- package/dist/capabilities/composite-members.js +2 -1
- package/dist/capabilities/engine-capabilities.js +1 -0
- package/dist/capabilities/scenarios.d.ts +23 -8
- package/dist/capabilities/scenarios.js +13 -8
- package/dist/capabilities/skills.d.ts +28 -5
- package/dist/capabilities/skills.js +8 -0
- package/dist/center-credential-renewer.js +5 -1
- package/dist/checkpoint-ctx-seal-m28.d.ts +3 -10
- package/dist/checkpoint-ctx-seal-m28.js +1 -1
- package/dist/checkpoint-identity.d.ts +3 -3
- package/dist/config-catalog.js +9 -6
- package/dist/config-types.d.ts +9 -0
- package/dist/config.d.ts +1 -1
- package/dist/config.js +34 -8
- package/dist/deployment-governance.d.ts +2 -2
- package/dist/deployment-governance.js +7 -9
- package/dist/device-ws-protocol.d.ts +1 -0
- package/dist/device-ws-protocol.js +2 -1
- package/dist/file-history-disclosure.d.ts +4 -2
- package/dist/file-history-disclosure.js +2 -0
- package/dist/hooks/classic-stations.d.ts +11 -54
- package/dist/http/admission.js +10 -7
- package/dist/http/approval-sweeps.js +4 -3
- package/dist/http/caller-trust.d.ts +2 -1
- package/dist/http/caller-trust.js +1 -3
- package/dist/http/checkpoint-ctx.d.ts +48 -7
- package/dist/http/checkpoint-ctx.js +40 -0
- package/dist/http/dispatch.js +15 -10
- package/dist/http/durable-run-leg.d.ts +5 -1
- package/dist/http/durable-run-leg.js +1 -1
- package/dist/http/health-self-report.d.ts +2 -2
- package/dist/http/mcp-remote-text.d.ts +5 -0
- package/dist/http/mcp-remote-text.js +7 -0
- package/dist/http/principal-gate.d.ts +15 -10
- package/dist/http/principal-gate.js +48 -9
- package/dist/http/resume-legs.d.ts +2 -20
- package/dist/http/resume-legs.js +52 -38
- package/dist/http/route-ctx.d.ts +8 -2
- package/dist/http/routes/approvals-assistant.js +18 -4
- package/dist/http/routes/capabilities.js +11 -1
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +5 -7
- package/dist/http/routes/runs.js +2 -1
- package/dist/http/routes/session-sync.js +42 -6
- package/dist/http/routes/sessions.js +2 -1
- package/dist/http/routes/tasks.js +8 -6
- package/dist/http/server.d.ts +4 -0
- package/dist/http/stored-body-replay.d.ts +3 -3
- package/dist/http/stored-body-replay.js +6 -1
- package/dist/http/wire-types.d.ts +52 -27
- package/dist/identity-source.d.ts +65 -0
- package/dist/identity-source.js +45 -0
- package/dist/memory-store-refusal.d.ts +3 -3
- package/dist/model-entry-refusal.d.ts +2 -0
- package/dist/model-entry-refusal.js +11 -0
- package/dist/model-select.d.ts +6 -17
- package/dist/model-select.js +0 -3
- package/dist/namespaced-rule-name.d.ts +1 -1
- package/dist/observability/fail-open.d.ts +13 -1
- package/dist/observability/fail-open.js +13 -1
- package/dist/observability/metrics.js +1 -1
- package/dist/observability/run-terminal.js +1 -0
- package/dist/operator-ask.d.ts +2 -2
- package/dist/org-delivery-gate.js +1 -1
- package/dist/org-memory-admission.d.ts +2 -2
- package/dist/org-memory-admission.js +39 -2
- package/dist/parked-decide.js +3 -2
- package/dist/peer-directory.js +2 -0
- package/dist/permission-rule-list.d.ts +2 -2
- package/dist/plugins/checkpoint-store-sql.d.ts +19 -9
- package/dist/plugins/checkpoint-store-sql.js +6 -6
- package/dist/plugins/file-history-store-sql.js +7 -14
- package/dist/plugins/file-run-store.js +8 -2
- package/dist/plugins/k8s-exec-protocol.d.ts +69 -13
- package/dist/plugins/k8s-exec-protocol.js +116 -28
- package/dist/plugins/k8s-pod-delete-failure.d.ts +25 -0
- package/dist/plugins/k8s-pod-delete-failure.js +17 -0
- package/dist/plugins/k8s-pod-reaper.d.ts +112 -0
- package/dist/plugins/k8s-pod-reaper.js +122 -0
- package/dist/plugins/local-checkpoint-store.d.ts +3 -6
- package/dist/plugins/local-checkpoint-store.js +3 -3
- package/dist/plugins/memory-run-store.js +2 -0
- package/dist/plugins/one-time-migrations.d.ts +28 -9
- package/dist/plugins/one-time-migrations.js +48 -5
- package/dist/plugins/permission-rule-store-file.js +2 -2
- package/dist/plugins/permission-rule-store-sql.d.ts +17 -17
- package/dist/plugins/permission-rule-store-sql.js +16 -17
- package/dist/plugins/pg-pool.js +4 -0
- package/dist/plugins/pg-session-storage.js +2 -2
- package/dist/plugins/remote-env-adb.d.ts +3 -0
- package/dist/plugins/remote-env-adb.js +1 -0
- package/dist/plugins/remote-env-device.d.ts +3 -0
- package/dist/plugins/remote-env-device.js +4 -0
- package/dist/plugins/remote-env-e2b.d.ts +3 -0
- package/dist/plugins/remote-env-e2b.js +1 -0
- package/dist/plugins/remote-env-file-error.d.ts +8 -1
- package/dist/plugins/remote-env-file-error.js +7 -1
- package/dist/plugins/remote-env-host.d.ts +7 -1
- package/dist/plugins/remote-env-host.js +7 -1
- package/dist/plugins/remote-env-k8s.d.ts +137 -10
- package/dist/plugins/remote-env-k8s.js +276 -14
- package/dist/plugins/remote-env-local-docker.d.ts +3 -0
- package/dist/plugins/remote-env-local-docker.js +1 -0
- package/dist/plugins/remote-env-ssh.d.ts +3 -0
- package/dist/plugins/remote-env-ssh.js +1 -0
- package/dist/plugins/run-store-sql.js +10 -4
- package/dist/plugins/session-ownership.d.ts +17 -3
- package/dist/plugins/session-ownership.js +19 -5
- package/dist/plugins/sql-errors.d.ts +23 -2
- package/dist/plugins/sql-errors.js +15 -0
- package/dist/plugins/store-contracts.d.ts +10 -1
- package/dist/plugins/store-fault.d.ts +2 -2
- package/dist/plugins/store-fault.js +4 -2
- package/dist/plugins/tidb-pool.js +7 -0
- package/dist/plugins/tidb-session-store.js +2 -2
- package/dist/request-key-closure.js +1 -1
- package/dist/request-value-closure.d.ts +31 -2
- package/dist/request-value-closure.js +7 -1
- package/dist/rule-entry-list.d.ts +3 -2
- package/dist/rule-entry-list.js +2 -2
- package/dist/rules-consent.js +7 -4
- package/dist/run-local.d.ts +2 -2
- package/dist/runs.js +2 -1
- package/dist/runtime-governance.d.ts +5 -5
- package/dist/sandbox-git-lease.d.ts +49 -0
- package/dist/sandbox-git-lease.js +60 -0
- package/dist/sandbox-git-plane.d.ts +84 -0
- package/dist/sandbox-git-plane.js +105 -0
- package/dist/security.d.ts +16 -4
- package/dist/security.js +8 -3
- package/dist/server-secret-env.d.ts +6 -0
- package/dist/server-secret-env.js +14 -0
- package/dist/session-error-wire.d.ts +14 -6
- package/dist/session-error-wire.js +2 -1
- package/dist/session-policy-wire.d.ts +1 -1
- package/dist/session-policy-wire.js +2 -2
- package/dist/session-sync.d.ts +1 -1
- package/dist/spec-fields.d.ts +43 -13
- package/dist/spec-fields.js +33 -12
- package/dist/stored-request-prompt-profile-m30.d.ts +49 -0
- package/dist/stored-request-prompt-profile-m30.js +25 -0
- package/dist/task-mcp.d.ts +1 -1
- package/dist/task-settings.d.ts +2 -2
- package/dist/tool-approval.d.ts +12 -2
- package/dist/tool-approval.js +8 -3
- package/dist/tool-rule-names.d.ts +5 -0
- package/dist/trace/core-keyset-guard.d.ts +4 -4
- package/dist/trace/engine-notice-wire.d.ts +1 -1
- package/dist/trace/engine-notice-wire.js +2 -0
- package/dist/trace/exit-seat.js +2 -2
- package/dist/trace/ledger-sink.d.ts +4 -5
- package/dist/trace/ledger-sink.js +3 -7
- package/dist/trace/project.d.ts +37 -3
- package/dist/trace/project.js +20 -6
- package/dist/trace/redact.d.ts +18 -6
- package/dist/trace/redact.js +118 -53
- package/dist/trace/self-minted-wire.d.ts +377 -3
- package/dist/trace/self-minted-wire.js +122 -0
- package/dist/trace/wire-projection-faces.d.ts +5 -3
- package/dist/trace/wire-projection-faces.js +7 -3
- package/dist/web-admin-client/apply-effective.js +0 -1
- package/dist/web-admin-client/center-request.d.ts +20 -2
- package/dist/web-admin-client/center-request.js +40 -5
- package/dist/web-admin-client/http-client.js +6 -6
- package/dist/web-admin-client/types.d.ts +5 -5
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +11 -5
- package/package.json +2 -2
- package/wire-changes/server@7.137.0.json +825 -0
|
@@ -5,7 +5,8 @@ import { cappedCeiling } from "../budget.js";
|
|
|
5
5
|
import { recordFailOpen } from "../observability/fail-open.js";
|
|
6
6
|
import { SessionEnvironmentSelection, selectEnvironmentTool } from "../capabilities/select-environment-tool.js";
|
|
7
7
|
import { sendUserFileTool } from "../capabilities/send-user-file-tool.js";
|
|
8
|
-
import { buildExcludeToolsSeat, buildPromptSeats,
|
|
8
|
+
import { buildExcludeToolsSeat, buildPromptSeats, buildRunSkills, createScenarioGate, selectScenario } from "../capabilities/scenarios.js";
|
|
9
|
+
import { stampRunSkills } from "../capabilities/skills.js";
|
|
9
10
|
import { stampHandsLane, toolPolicyForHands } from "../capabilities/hands-lane.js";
|
|
10
11
|
import { applyLongtailDefer } from "../capabilities/tool-defer.js";
|
|
11
12
|
import { assertGuardPatternsUsable, buildApprovalGrantNotice, buildOnlySensitiveBaselineWarning, createApprovalBaselinePolicy, createDeploymentGovernanceInputs } from "../deployment-governance.js";
|
|
@@ -16,7 +17,7 @@ import { createSettingsHooksRegistration, settingsHooksBudgetMs } from "../hooks
|
|
|
16
17
|
import { HOST_POSTURE_REFUSED_CODE, taskInheritEnvRefusal, taskWriteFaceRefusal } from "../hosted-posture.js";
|
|
17
18
|
import { headerStr } from "../http/principal-gate.js";
|
|
18
19
|
import { explicitOperatorOk } from "../http/server.js";
|
|
19
|
-
import { isAtMentionable, matchCatalogModel,
|
|
20
|
+
import { isAtMentionable, matchCatalogModel, refusedCatalogEntry, resolveTaskModel, selectableCatalog, terminalCatalogName } from "../model-select.js";
|
|
20
21
|
import { echoModelRef, modelUnavailableMessage } from "../model-entry-refusal.js";
|
|
21
22
|
import { PerTaskImageRegistry, resolveSandboxImageRef } from "../per-task-image.js";
|
|
22
23
|
import { remoteScratchpadDirFor } from "../plugins/remote-scratchpad.js";
|
|
@@ -30,9 +31,9 @@ import { HttpError, createCodedHttpError, encodeCheckpointScope } from "../secur
|
|
|
30
31
|
import { headReadOf, sessionFaceOfHead } from "../session-incarnation.js";
|
|
31
32
|
import { memorySpecForRequest } from "../memory-scope.js";
|
|
32
33
|
import { createMemoryProjectLayers } from "../memory-project-layer.js";
|
|
33
|
-
import { inheritEnvFieldIssue, singleMemberOffFieldIssue } from "../request-value-closure.js";
|
|
34
|
+
import { inheritEnvFacts, inheritEnvFieldIssue, singleMemberOffFieldIssue } from "../request-value-closure.js";
|
|
34
35
|
import { a2aForScenario, mcpForScenario } from "../web-admin-client/facade.js";
|
|
35
|
-
import { normalizeAttachments, normalizeResilience, normalizeResumeAtMode, normalizeSuggestNextPrompts,
|
|
36
|
+
import { normalizeAttachments, normalizeResilience, normalizeResumeAtMode, normalizeSuggestNextPrompts, promptLeanSpecFragment, resolveTaskLimits, retainBackgroundProcessesFromBody, taskAgentsSpecFragment, toolMaterializeStrategyFromBody, allowToolsSpecFragment, toolNameListFromBody } from "../spec-fields.js";
|
|
36
37
|
import { isAbsoluteHostPath } from "@sema-agent/settings-schema";
|
|
37
38
|
import { effectiveHostWorkspace, parseAdditionalDirectories, satisfiedByProcessCwd, shellEnvMismatchCount } from "../task-cwd.js";
|
|
38
39
|
import { DEPLOYMENT_SHAPE_PREDICATES } from "../deployment-shape.js";
|
|
@@ -53,7 +54,8 @@ import { effectiveMemoryPersistenceCapable } from "./memory-boundary.js";
|
|
|
53
54
|
import { withUnattendedLeg } from "../unattended-permission-mode.js";
|
|
54
55
|
import { fieldConflictFacts } from "../field-conflict.js";
|
|
55
56
|
export function createResolveSpec(ctx) {
|
|
56
|
-
const { config, logger, metrics, localRoot, scenarios, principalCaps, centerRuntimeCapsResolver, getKeyResolver, taskAttachmentStore, perSessionCwd, setSessionCwd, setSessionShellEnv, fenceSessionOwner, hookLlm, hookAgent, fleetBus, hookWakeBus, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec, selectEnvTool, sendUserFileToolSpec, memoryEngine, memorySyncRunner, durableEnabled, approvalExemptionStore, checkpointStore, imageIndex, perTaskImage, sessionEnvSelection, liveQuestionFace, approverSeat, lockedKeys, } = ctx;
|
|
57
|
+
const { config, logger, metrics, localRoot, scenarios, principalCaps, centerRuntimeCapsResolver, getKeyResolver, taskAttachmentStore, perSessionCwd, setSessionCwd, setSessionShellEnv, fenceSessionOwner, hookLlm, hookAgent, fleetBus, hookWakeBus, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec, selectEnvTool, sendUserFileToolSpec, memoryEngine, memorySyncRunner, durableEnabled, approvalExemptionStore, checkpointStore, imageIndex, perTaskImage, sessionEnvSelection, liveQuestionFace, approverSeat, lockedKeys, loadedSkills, } = ctx;
|
|
58
|
+
const deploymentSkillSources = new Map(loadedSkills.map((k) => [k.spec.name, k.source]));
|
|
57
59
|
const scenarioGate = createScenarioGate({ config, scenarios, principalCaps, logger }, "enforce");
|
|
58
60
|
const sessionHeadOf = headReadOf(ownerAware);
|
|
59
61
|
assertGuardPatternsUsable(config);
|
|
@@ -100,17 +102,17 @@ export function createResolveSpec(ctx) {
|
|
|
100
102
|
{
|
|
101
103
|
const inheritEnvIssue = inheritEnvFieldIssue(body);
|
|
102
104
|
if (inheritEnvIssue)
|
|
103
|
-
throw new HttpError(400, inheritEnvIssue, { code: "request.field_invalid" });
|
|
105
|
+
throw new HttpError(400, inheritEnvIssue.message, { code: "request.field_invalid", extra: inheritEnvIssue.facts });
|
|
104
106
|
if (body.inheritEnv === "all") {
|
|
105
107
|
const lane = executionLaneOf(config.remoteExec?.provider);
|
|
106
108
|
if (lane !== "host") {
|
|
107
|
-
throw new HttpError(400, `inheritEnv:"all" applies to the host lane only (this deployment runs ${lane}) — only the host lane builds the model-driven shell's environment from this machine's own, so the declaration has no effect here; omit it (or send "scrub", the default, which every lane accepts)`, { code: "request.field_invalid" });
|
|
109
|
+
throw new HttpError(400, `inheritEnv:"all" applies to the host lane only (this deployment runs ${lane}) — only the host lane builds the model-driven shell's environment from this machine's own, so the declaration has no effect here; omit it (or send "scrub", the default, which every lane accepts)`, { code: "request.field_invalid", extra: inheritEnvFacts("lane_not_host") });
|
|
108
110
|
}
|
|
109
111
|
const why = taskInheritEnvRefusal(config);
|
|
110
112
|
if (why !== undefined)
|
|
111
113
|
throw new HttpError(422, why, { code: HOST_POSTURE_REFUSED_CODE });
|
|
112
114
|
if (!auth?.sessionId)
|
|
113
|
-
throw new HttpError(400, `inheritEnv:"all" requires a session-resolving deployment (no authorizer session) — the host shell's environment is bound per session`, { code: "request.field_invalid" });
|
|
115
|
+
throw new HttpError(400, `inheritEnv:"all" requires a session-resolving deployment (no authorizer session) — the host shell's environment is bound per session`, { code: "request.field_invalid", extra: inheritEnvFacts("no_authorizer_session") });
|
|
114
116
|
}
|
|
115
117
|
}
|
|
116
118
|
{
|
|
@@ -156,7 +158,8 @@ export function createResolveSpec(ctx) {
|
|
|
156
158
|
const lane = bindSettingsCwdEnvAndModel(body, auth, gated, opts);
|
|
157
159
|
const anchors = await resolveHistoryAnchors(body, auth);
|
|
158
160
|
const projectKey = memoryEngine ? await memoryProjectLayers.prepare(config, auth?.memoryScope, realTaskRootOf(auth)) : undefined;
|
|
159
|
-
const
|
|
161
|
+
const runSkills = buildRunSkills({ scenario: gated.cap.skills, request: body.skills, disable: body.disableSkills === true, deploymentSources: deploymentSkillSources }, logger);
|
|
162
|
+
const spec = assembleSpecLiteral(body, auth, req, opts, { ...gated, ...lane, ...anchors, projectKey, a2aPeers, storedToolAxes, runSkills }, effMode);
|
|
160
163
|
const folded = await foldGovernanceAndSettings(body, auth, spec, gated);
|
|
161
164
|
const final = await applyImageFactsAndRouting(body, auth, folded.governed, {
|
|
162
165
|
scenarioName: gated.scenarioName,
|
|
@@ -164,7 +167,7 @@ export function createResolveSpec(ctx) {
|
|
|
164
167
|
hostSemanticsLane: folded.hostSemanticsLane,
|
|
165
168
|
});
|
|
166
169
|
const stamped = stampHandsLane(final, gated.hands);
|
|
167
|
-
return stamped;
|
|
170
|
+
return stampRunSkills(stamped, runSkills.roster);
|
|
168
171
|
};
|
|
169
172
|
const gateScenarioAndAppend = async (body, auth, opts) => {
|
|
170
173
|
const scenarioName = await scenarioGate(auth?.principal, body.scenario);
|
|
@@ -312,10 +315,6 @@ export function createResolveSpec(ctx) {
|
|
|
312
315
|
metrics.inc("task_model_unknown_fallback_total");
|
|
313
316
|
logger.warn("task_model_unknown_fallback", { requested: echoModelRef(picked.unknownExplicit), fallback: picked.model, sessionId: auth?.sessionId ?? null });
|
|
314
317
|
}
|
|
315
|
-
if (Array.isArray(body.images) && body.images.length > 0 && !modelSupportsImages(wireCatalog[picked.model])) {
|
|
316
|
-
metrics.inc("images_omitted_total", { model: picked.model });
|
|
317
|
-
logger.warn("images_omitted_no_vision_model", { model: picked.model, count: body.images.length });
|
|
318
|
-
}
|
|
319
318
|
return { taskHooks, additionalDirectories, additionalReadDirectories, wireCatalog, picked };
|
|
320
319
|
};
|
|
321
320
|
const NO_ANCHOR_HINT = "no rewind anchor is recorded under that handle (a prompt that carried attachments records none when its attachment frames were interrupted or their count did not match)";
|
|
@@ -359,7 +358,7 @@ export function createResolveSpec(ctx) {
|
|
|
359
358
|
return deriveAskEffective(askForm.form, "unresolved") === "human_reachable";
|
|
360
359
|
};
|
|
361
360
|
const assembleSpecLiteral = (body, auth, req, opts, parts, effMode) => {
|
|
362
|
-
const { scenarioName, cap, hands, acceptedAppend, parsedSettings, attachmentNotice, taskHooks, additionalDirectories, additionalReadDirectories, wireCatalog, picked, resumeAtEntryId, rewindFilesToEntryId, s4DefaultScopes, projectKey, a2aPeers, storedToolAxes, } = parts;
|
|
361
|
+
const { scenarioName, cap, hands, acceptedAppend, parsedSettings, attachmentNotice, taskHooks, additionalDirectories, additionalReadDirectories, wireCatalog, picked, resumeAtEntryId, rewindFilesToEntryId, s4DefaultScopes, projectKey, a2aPeers, storedToolAxes, runSkills, } = parts;
|
|
363
362
|
const spec = {
|
|
364
363
|
objective: attachmentNotice ? `${picked.cleanedObjective}\n\n${attachmentNotice}` : picked.cleanedObjective,
|
|
365
364
|
...buildPromptSeats(scenarioName, cap.prompt, typeof body.systemPrompt === "string" ? body.systemPrompt : undefined),
|
|
@@ -404,7 +403,7 @@ export function createResolveSpec(ctx) {
|
|
|
404
403
|
...buildExcludeToolsSeat(cap.excludeTools, toolNameListFromBody(body.excludeTools)),
|
|
405
404
|
...allowToolsSpecFragment(body.allowTools),
|
|
406
405
|
...(() => { const v = toolNameListFromBody(body.deferTools); return v ? { deferTools: v } : {}; })(),
|
|
407
|
-
...(
|
|
406
|
+
...promptLeanSpecFragment(body),
|
|
408
407
|
...(() => { const v = toolMaterializeStrategyFromBody(body.toolMaterializeStrategy); return v ? { toolMaterializeStrategy: v } : {}; })(),
|
|
409
408
|
...(typeof body.interactiveTools === "boolean" ? { interactiveTools: body.interactiveTools } : {}),
|
|
410
409
|
...(declaresInteractivePosture(body, req, opts) ? { interactionPosture: "interactive" } : {}),
|
|
@@ -488,7 +487,7 @@ export function createResolveSpec(ctx) {
|
|
|
488
487
|
const merged = extra.length > 0 ? [...(base ?? []), ...extra] : base;
|
|
489
488
|
return merged && config.toolDeferLongtail ? applyLongtailDefer(merged, true) : merged;
|
|
490
489
|
})(cap.tools),
|
|
491
|
-
skills:
|
|
490
|
+
skills: runSkills.specs,
|
|
492
491
|
...(() => { const v = toolNameListFromBody(body.userInvokedSkills); return v ? { userInvokedSkills: v } : {}; })(),
|
|
493
492
|
...(parsedSettings.settings?.skillListingBudgetFraction !== undefined ? { skillListingBudgetFraction: parsedSettings.settings.skillListingBudgetFraction } : {}),
|
|
494
493
|
...(parsedSettings.settings?.skillListingMaxDescChars !== undefined ? { skillListingMaxDescChars: parsedSettings.settings.skillListingMaxDescChars } : {}),
|
|
@@ -18,7 +18,7 @@ export declare function runStage03(ctx: Awaited<ReturnType<typeof runStage02>>):
|
|
|
18
18
|
rosterStore: import("@sema-agent/core").RosterStore | undefined;
|
|
19
19
|
sessionCaptureRecordStore: import("@sema-agent/core").SessionCaptureRecordStore | undefined;
|
|
20
20
|
sessionCaptureRecords: import("../index.js").SessionCaptureRecordSource | undefined;
|
|
21
|
-
sessionStore: import("@sema-agent/core").SessionStore
|
|
21
|
+
sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
|
|
22
22
|
sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
|
|
23
23
|
storePosture: import("../store-posture.js").StorePosture;
|
|
24
24
|
taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
|
|
@@ -59,7 +59,7 @@ export declare function runStage04(ctx: Awaited<ReturnType<typeof runStage03>>):
|
|
|
59
59
|
rosterStore: import("@sema-agent/core").RosterStore | undefined;
|
|
60
60
|
sessionCaptureRecordStore: import("@sema-agent/core").SessionCaptureRecordStore | undefined;
|
|
61
61
|
sessionCaptureRecords: import("../index.js").SessionCaptureRecordSource | undefined;
|
|
62
|
-
sessionStore: import("@sema-agent/core").SessionStore
|
|
62
|
+
sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
|
|
63
63
|
sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
|
|
64
64
|
storePosture: import("../store-posture.js").StorePosture;
|
|
65
65
|
taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
|
|
@@ -7,6 +7,8 @@ export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>):
|
|
|
7
7
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
8
8
|
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
9
9
|
spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
|
|
10
|
+
sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
|
|
11
|
+
sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
10
12
|
perSessionCwd: Map<string, string>;
|
|
11
13
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
12
14
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -74,7 +76,7 @@ export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>):
|
|
|
74
76
|
rosterStore: import("@sema-agent/core").RosterStore | undefined;
|
|
75
77
|
sessionCaptureRecordStore: import("@sema-agent/core").SessionCaptureRecordStore | undefined;
|
|
76
78
|
sessionCaptureRecords: import("../index.js").SessionCaptureRecordSource | undefined;
|
|
77
|
-
sessionStore: import("@sema-agent/core").SessionStore
|
|
79
|
+
sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
|
|
78
80
|
sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
|
|
79
81
|
storePosture: import("../store-posture.js").StorePosture;
|
|
80
82
|
taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
|
|
@@ -6,18 +6,27 @@ import { headReadOf } from "../session-incarnation.js";
|
|
|
6
6
|
import * as facts from "../capability-facts.js";
|
|
7
7
|
import { sessionStoreLabelOf } from "../store-posture.js";
|
|
8
8
|
import { runStore } from "./late-binds.js";
|
|
9
|
+
import { SANDBOX_GIT_PLANE_OFF_TEXT } from "../sandbox-git-plane.js";
|
|
9
10
|
export async function runStage05(ctx) {
|
|
10
11
|
const { backend, config, instanceId, logger, metrics, sessionStore, taskAttachmentStore } = ctx;
|
|
11
12
|
const deviceLane = config.remoteExec?.provider === "device" ? createDeviceLane({ config, logger, metrics, backend, replicaId: instanceId }) : undefined;
|
|
12
13
|
const headOf = headReadOf(sessionStore);
|
|
13
14
|
const spaceCommits = backend !== undefined ? () => runStore : undefined;
|
|
14
|
-
const { perTaskImage, sessionEnvSelection, perSessionCwd, setSessionCwd, setSessionShellEnv, setSessionInheritEnv, fenceSessionOwner, dropSessionScoped, executionEnvFactory, worktreeReap, sendUserFileTaskEnvs, lspManager, spaceReclaimer, } = createExecutionEnv({ config, logger, metrics, taskAttachmentStore, ...(deviceLane ? { deviceLane } : {}), ...(spaceCommits !== undefined ? { spaceCommits } : {}), ...(headOf !== undefined ? { headOf } : {}) });
|
|
15
|
+
const { perTaskImage, sessionEnvSelection, perSessionCwd, setSessionCwd, setSessionShellEnv, setSessionInheritEnv, fenceSessionOwner, dropSessionScoped, executionEnvFactory, worktreeReap, sendUserFileTaskEnvs, lspManager, spaceReclaimer, sandboxSecretSeatGate, sandboxPodReaper, readSandboxGitPlane, } = createExecutionEnv({ config, logger, metrics, taskAttachmentStore, ...(deviceLane ? { deviceLane } : {}), ...(spaceCommits !== undefined ? { spaceCommits } : {}), ...(headOf !== undefined ? { headOf } : {}), ...(backend !== undefined ? { runRows: () => runStore } : {}) });
|
|
15
16
|
assertDeviceLaneWired(config.remoteExec?.provider === "device", deviceLane, executionEnvFactory !== undefined);
|
|
16
17
|
assertWorkspaceSpaceReadable(facts.workspaceSpace(config), { headOf, spaceCommits }, facts.workspaceCache(config), sessionStoreLabelOf(config.sessionBackend, backend?.kind));
|
|
18
|
+
if (sandboxSecretSeatGate !== undefined)
|
|
19
|
+
await sandboxSecretSeatGate();
|
|
20
|
+
const sandboxGitPlane = await readSandboxGitPlane();
|
|
21
|
+
if (sandboxGitPlane.state === "on")
|
|
22
|
+
logger.info("credential_plane_sandbox_git", { state: "on", origins: sandboxGitPlane.origins });
|
|
23
|
+
else if (sandboxGitPlane.reason !== "single_user" && sandboxGitPlane.reason !== "lane_without_boundary") {
|
|
24
|
+
logger.info("credential_plane_sandbox_git", { state: "off", reason: sandboxGitPlane.reason, why: SANDBOX_GIT_PLANE_OFF_TEXT[sandboxGitPlane.reason] });
|
|
25
|
+
}
|
|
17
26
|
const deploymentMods = createDeploymentMods({ metrics, ...(config.toolTrace ? { traceLogger: logger } : {}), brandIdentity: isBrandedDeployment(config) });
|
|
18
27
|
if (config.toolTrace)
|
|
19
28
|
logger.info("tool_trace_enabled", {});
|
|
20
29
|
await assertDeploymentModsAdmitted(deploymentMods);
|
|
21
|
-
return { ...ctx, deploymentMods, deviceLane, dropSessionScoped, executionEnvFactory, fenceSessionOwner, lspManager, spaceReclaimer, perSessionCwd, perTaskImage, sendUserFileTaskEnvs, sessionEnvSelection, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, worktreeReap };
|
|
30
|
+
return { ...ctx, deploymentMods, deviceLane, dropSessionScoped, executionEnvFactory, fenceSessionOwner, lspManager, spaceReclaimer, sandboxPodReaper, sandboxGitPlane, perSessionCwd, perTaskImage, sendUserFileTaskEnvs, sessionEnvSelection, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, worktreeReap };
|
|
22
31
|
}
|
|
23
32
|
//# sourceMappingURL=stage-05-execution-env.js.map
|
|
@@ -70,6 +70,8 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
|
|
|
70
70
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
71
71
|
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
72
72
|
spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
|
|
73
|
+
sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
|
|
74
|
+
sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
73
75
|
perSessionCwd: Map<string, string>;
|
|
74
76
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
75
77
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -137,7 +139,7 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
|
|
|
137
139
|
rosterStore: import("@sema-agent/core").RosterStore | undefined;
|
|
138
140
|
sessionCaptureRecordStore: import("@sema-agent/core").SessionCaptureRecordStore | undefined;
|
|
139
141
|
sessionCaptureRecords: import("../index.js").SessionCaptureRecordSource | undefined;
|
|
140
|
-
sessionStore: import("@sema-agent/core").SessionStore
|
|
142
|
+
sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
|
|
141
143
|
sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
|
|
142
144
|
storePosture: import("../store-posture.js").StorePosture;
|
|
143
145
|
taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
|
|
@@ -18,6 +18,7 @@ import { assertApprovalAskRuleMaterialOnBackend } from "./stores.js";
|
|
|
18
18
|
import { createParkCommitWatch } from "../plugins/park-commit-watch.js";
|
|
19
19
|
import { CHECKPOINT_CTX_SEALING_REQUIRED } from "../http/checkpoint-ctx.js";
|
|
20
20
|
import { sealCheckpointCtxCredentialsM28 } from "../checkpoint-ctx-seal-m28.js";
|
|
21
|
+
import { retirePromptProfileM30 } from "../stored-request-prompt-profile-m30.js";
|
|
21
22
|
import { createRuntimeCaps } from "./runtime-caps.js";
|
|
22
23
|
import { createEngineNoticeForwarder, createRunnerDeps, createSharedRunnerDeps } from "./runner-deps.js";
|
|
23
24
|
import { defaultEngineNoticeRouter } from "../trace/engine-notice-wire.js";
|
|
@@ -37,8 +38,11 @@ export async function runStage06(ctx) {
|
|
|
37
38
|
if (checkpointStore !== undefined) {
|
|
38
39
|
if (checkpointCtxSealing === undefined)
|
|
39
40
|
throw new Error(CHECKPOINT_CTX_SEALING_REQUIRED);
|
|
40
|
-
const
|
|
41
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
42
|
+
const m28 = await sealCheckpointCtxCredentialsM28(checkpointStore, checkpointCtxSealing, { today });
|
|
41
43
|
logger.info("checkpoint_ctx_credentials_sealed", { ...m28, note: "one-time migration M28: plaintext request credentials in suspended tasks' resume contexts sealed in place" });
|
|
44
|
+
const m30 = await retirePromptProfileM30(checkpointStore, { today });
|
|
45
|
+
logger.info("checkpoint_ctx_prompt_profile_rewritten", { ...m30, note: "one-time migration M30: the retired request key promptProfile in suspended tasks' stored requests rewritten in place (classic becomes promptLean: false); a stored request this did not reach is refused on resume" });
|
|
42
46
|
}
|
|
43
47
|
const { elicitation, question, toolApproval, durableEnabled, streamApprovalGate, approvalAskAudit, approvalExemptionStore, sendUserFileEmitter, sendFileLedger, sendUserFileToolSpec } = createLiveCoordinators({
|
|
44
48
|
config, logger, backend, sendUserFileTaskEnvs, ruleConsent, parkCommits,
|
|
@@ -9,6 +9,7 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
|
|
|
9
9
|
}) => Promise<import("../security.js").AuthContext>;
|
|
10
10
|
imageBakes: import("../plugins/store-backend.js").ImageBake | undefined;
|
|
11
11
|
imageIndex: import("../plugins/store-backend.js").ImageIndex | undefined;
|
|
12
|
+
loadedSkills: import("../capabilities/skills.js").LoadedSkill[];
|
|
12
13
|
parkedReviveInheritedGate: ((row: import("@sema-agent/core").BackgroundAgentRecord, identity: import("./parked-revive-gate.js").ParkedReviveIdentity) => Promise<import("./parked-revive-gate.js").RebuiltInheritedGate>) | undefined;
|
|
13
14
|
parkedReviveSurface: import("../parked-revive-surface.js").ParkedReviveSurfaceFactory | undefined;
|
|
14
15
|
rateLimiter: RateLimiter | import("../plugins/pg-rate-limiter.js").PgRateLimiter | import("../plugins/tidb-rate-limiter.js").TiDBRateLimiter;
|
|
@@ -85,6 +86,8 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
|
|
|
85
86
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
86
87
|
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
87
88
|
spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
|
|
89
|
+
sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
|
|
90
|
+
sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
88
91
|
perSessionCwd: Map<string, string>;
|
|
89
92
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
90
93
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -152,7 +155,7 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
|
|
|
152
155
|
rosterStore: import("@sema-agent/core").RosterStore | undefined;
|
|
153
156
|
sessionCaptureRecordStore: import("@sema-agent/core").SessionCaptureRecordStore | undefined;
|
|
154
157
|
sessionCaptureRecords: import("../index.js").SessionCaptureRecordSource | undefined;
|
|
155
|
-
sessionStore: import("@sema-agent/core").SessionStore
|
|
158
|
+
sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
|
|
156
159
|
sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
|
|
157
160
|
storePosture: import("../store-posture.js").StorePosture;
|
|
158
161
|
taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
|
|
@@ -202,6 +202,6 @@ export async function runStage07(ctx) {
|
|
|
202
202
|
if (defaultScenarioRefusal !== undefined)
|
|
203
203
|
throw new Error(defaultScenarioRefusal);
|
|
204
204
|
logger.info("capabilities", { skills: skills.length, scenarios: Object.keys(scenarios), repoTools: Boolean(repoClient) });
|
|
205
|
-
return { ...ctx, approvalExemptionStore, approvalNonceStore, authorize, imageBakes, imageIndex, parkedReviveInheritedGate, parkedReviveSurface, rateLimiter, resumeAnchorStore, runStore, scenarioDetails, scenarios, selectEnvTool, taskLimitCaps, taskTimeoutSec, userInputLedger, userInputLedgerStore, webSearchProvider: webSearchCfg?.provider };
|
|
205
|
+
return { ...ctx, approvalExemptionStore, approvalNonceStore, authorize, imageBakes, imageIndex, loadedSkills: skills, parkedReviveInheritedGate, parkedReviveSurface, rateLimiter, resumeAnchorStore, runStore, scenarioDetails, scenarios, selectEnvTool, taskLimitCaps, taskTimeoutSec, userInputLedger, userInputLedgerStore, webSearchProvider: webSearchCfg?.provider };
|
|
206
206
|
}
|
|
207
207
|
//# sourceMappingURL=stage-07-capability-layer.js.map
|
|
@@ -22,6 +22,7 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
|
|
|
22
22
|
}) => Promise<import("../security.js").AuthContext>;
|
|
23
23
|
imageBakes: import("../plugins/store-backend.js").ImageBake | undefined;
|
|
24
24
|
imageIndex: import("../plugins/store-backend.js").ImageIndex | undefined;
|
|
25
|
+
loadedSkills: import("../index.js").LoadedSkill[];
|
|
25
26
|
parkedReviveInheritedGate: ((row: import("@sema-agent/core").BackgroundAgentRecord, identity: import("./parked-revive-gate.js").ParkedReviveIdentity) => Promise<import("./parked-revive-gate.js").RebuiltInheritedGate>) | undefined;
|
|
26
27
|
parkedReviveSurface: import("../parked-revive-surface.js").ParkedReviveSurfaceFactory | undefined;
|
|
27
28
|
rateLimiter: import("../index.js").RateLimiter | import("../plugins/pg-rate-limiter.js").PgRateLimiter | import("../plugins/tidb-rate-limiter.js").TiDBRateLimiter;
|
|
@@ -98,6 +99,8 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
|
|
|
98
99
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
99
100
|
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
100
101
|
spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
|
|
102
|
+
sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
|
|
103
|
+
sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
101
104
|
perSessionCwd: Map<string, string>;
|
|
102
105
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
103
106
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -165,7 +168,7 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
|
|
|
165
168
|
rosterStore: import("@sema-agent/core").RosterStore | undefined;
|
|
166
169
|
sessionCaptureRecordStore: import("@sema-agent/core").SessionCaptureRecordStore | undefined;
|
|
167
170
|
sessionCaptureRecords: import("../index.js").SessionCaptureRecordSource | undefined;
|
|
168
|
-
sessionStore: import("@sema-agent/core").SessionStore
|
|
171
|
+
sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
|
|
169
172
|
sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
|
|
170
173
|
storePosture: import("../store-posture.js").StorePosture;
|
|
171
174
|
taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
|
|
@@ -5,12 +5,13 @@ import { startRetentionLane, RETENTION_LEASE_TTL_FACTOR } from "./retention-lane
|
|
|
5
5
|
import { createLimitSync } from "./limit-sync.js";
|
|
6
6
|
import { runDenySweep } from "./late-binds.js";
|
|
7
7
|
export function runStage08(ctx) {
|
|
8
|
-
const { approvalAskAudit, approvalNonceStore, backend, backgroundAgentStore, ceilingVerdict, checkpointStore, parkCommits, config, webAdmin, consolidationSeatWatch, costQuota, degradeRouteWatch, fileHistoryErasure, spaceReclaimer, handslessRunner, hookAgentRunner, imageBakes, instanceId, localRoot, logger, mailboxStore, metrics, permissionRuleStores, pricing, rateLimiter, retentionExecutor, retentionLaneStore, rosterStore, runStore, runner, sqlWorkflowRunStore, subRunner, taskAttachmentStore, toolApproval, toolResultStore, userInputLedger, workflowJournalStore, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, worktreeReap } = ctx;
|
|
8
|
+
const { approvalAskAudit, approvalNonceStore, backend, backgroundAgentStore, ceilingVerdict, checkpointStore, parkCommits, config, webAdmin, consolidationSeatWatch, costQuota, degradeRouteWatch, fileHistoryErasure, spaceReclaimer, sandboxPodReaper, handslessRunner, hookAgentRunner, imageBakes, instanceId, localRoot, logger, mailboxStore, metrics, permissionRuleStores, pricing, rateLimiter, retentionExecutor, retentionLaneStore, rosterStore, runStore, runner, sqlWorkflowRunStore, subRunner, taskAttachmentStore, toolApproval, toolResultStore, userInputLedger, workflowJournalStore, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, worktreeReap } = ctx;
|
|
9
9
|
const reaper = startReapers({
|
|
10
10
|
config, logger, metrics, localRoot, backend, subRunner, runStore, checkpointStore, parkCommits,
|
|
11
11
|
rateLimiter, costQuota, toolResultStore, fileHistoryErasure, taskAttachmentStore, imageBakes, worktreeReap,
|
|
12
12
|
workflowNotifyGate, workflowRecoverOpts, workflowJournalStore, sqlWorkflowRunStore, workflowNotifyJournal, rosterStore,
|
|
13
13
|
backgroundAgentStore, mailboxStore, toolApproval, permissionRuleStores, approvalNonceStore, userInputLedger, approvalAskAudit,
|
|
14
|
+
...(sandboxPodReaper !== undefined ? { sandboxPodReaper } : {}),
|
|
14
15
|
getRunDenySweep: () => runDenySweep,
|
|
15
16
|
});
|
|
16
17
|
const ttlMs = config.retentionSweep.intervalSec * 1000 * RETENTION_LEASE_TTL_FACTOR;
|
|
@@ -46,6 +46,7 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
|
|
|
46
46
|
}) => Promise<import("../security.js").AuthContext>;
|
|
47
47
|
imageBakes: import("../plugins/store-backend.js").ImageBake | undefined;
|
|
48
48
|
imageIndex: import("../plugins/store-backend.js").ImageIndex | undefined;
|
|
49
|
+
loadedSkills: import("../index.js").LoadedSkill[];
|
|
49
50
|
parkedReviveInheritedGate: ((row: import("@sema-agent/core").BackgroundAgentRecord, identity: import("./parked-revive-gate.js").ParkedReviveIdentity) => Promise<import("./parked-revive-gate.js").RebuiltInheritedGate>) | undefined;
|
|
50
51
|
parkedReviveSurface: import("../parked-revive-surface.js").ParkedReviveSurfaceFactory | undefined;
|
|
51
52
|
rateLimiter: import("../index.js").RateLimiter | import("../plugins/pg-rate-limiter.js").PgRateLimiter | import("../plugins/tidb-rate-limiter.js").TiDBRateLimiter;
|
|
@@ -122,6 +123,8 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
|
|
|
122
123
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
123
124
|
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
124
125
|
spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
|
|
126
|
+
sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
|
|
127
|
+
sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
125
128
|
perSessionCwd: Map<string, string>;
|
|
126
129
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
127
130
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -189,7 +192,7 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
|
|
|
189
192
|
rosterStore: import("@sema-agent/core").RosterStore | undefined;
|
|
190
193
|
sessionCaptureRecordStore: import("@sema-agent/core").SessionCaptureRecordStore | undefined;
|
|
191
194
|
sessionCaptureRecords: import("../index.js").SessionCaptureRecordSource | undefined;
|
|
192
|
-
sessionStore: import("@sema-agent/core").SessionStore
|
|
195
|
+
sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
|
|
193
196
|
sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
|
|
194
197
|
storePosture: import("../store-posture.js").StorePosture;
|
|
195
198
|
taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
|
|
@@ -45,6 +45,7 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
|
|
|
45
45
|
}) => Promise<import("../security.js").AuthContext>;
|
|
46
46
|
imageBakes: import("../plugins/store-backend.js").ImageBake | undefined;
|
|
47
47
|
imageIndex: import("../plugins/store-backend.js").ImageIndex | undefined;
|
|
48
|
+
loadedSkills: import("../index.js").LoadedSkill[];
|
|
48
49
|
parkedReviveInheritedGate: ((row: import("@sema-agent/core").BackgroundAgentRecord, identity: import("./parked-revive-gate.js").ParkedReviveIdentity) => Promise<import("./parked-revive-gate.js").RebuiltInheritedGate>) | undefined;
|
|
49
50
|
parkedReviveSurface: import("../parked-revive-surface.js").ParkedReviveSurfaceFactory | undefined;
|
|
50
51
|
rateLimiter: import("../index.js").RateLimiter | import("../plugins/pg-rate-limiter.js").PgRateLimiter | import("../plugins/tidb-rate-limiter.js").TiDBRateLimiter;
|
|
@@ -121,6 +122,8 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
|
|
|
121
122
|
fenceSessionOwner: (sid: string, owner: string | null) => void;
|
|
122
123
|
lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
|
|
123
124
|
spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
|
|
125
|
+
sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
|
|
126
|
+
sandboxGitPlane: import("../sandbox-git-plane.js").SandboxGitPlane;
|
|
124
127
|
perSessionCwd: Map<string, string>;
|
|
125
128
|
perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
|
|
126
129
|
sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
|
|
@@ -188,7 +191,7 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
|
|
|
188
191
|
rosterStore: import("@sema-agent/core").RosterStore | undefined;
|
|
189
192
|
sessionCaptureRecordStore: import("@sema-agent/core").SessionCaptureRecordStore | undefined;
|
|
190
193
|
sessionCaptureRecords: import("../plugins/store-backend.js").SessionCaptureRecordSource | undefined;
|
|
191
|
-
sessionStore: import("@sema-agent/core").SessionStore
|
|
194
|
+
sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
|
|
192
195
|
sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
|
|
193
196
|
storePosture: import("../store-posture.js").StorePosture;
|
|
194
197
|
taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
|
|
@@ -29,7 +29,7 @@ import { bindServerLateSeats } from "./late-binds.js";
|
|
|
29
29
|
import { serviceVersion } from "../service-version.js";
|
|
30
30
|
import { buildDisplaySafeUrl } from "../trace/redact.js";
|
|
31
31
|
export async function runStage10(ctx) {
|
|
32
|
-
const { approvalAskAudit, approvalExemptionStore, approvalNonceStore, authorize, backend, backgroundAgentStore, brain, breakerState, centerRuntimeCapsResolver, checkpointStore, checkpointCtxSealing, parkCommits, config, webAdmin, consolidationValve, costQuota, deviceLane, drainState, durableEnabled, elicitation, fenceSessionOwner, fileHistoryStore, fleetBus, fleetLease, fleetUsage, governanceSeams, handslessRunner, hookAgent, hookLlm, hookWakeBus, imageBakes, imageIndex, instanceId, instrumentDegenerate, leaderEndpoint, localRoot, logger, lspManager, mcpRevocations, memoryBundleFaces, memoryComplianceFaces, memoryConsolidationFaces, memoryEngine, memoryExportBackend, memoryOptOutGrantStore, memoryOriginFaces, memoryPosture, memorySyncCursors, memorySyncRunner, metrics, modelUsageTracker, orgMemoryAdmission, otelExporter, outcomeSink, ownerAware, parkedReviveInheritedGate, parkedReviveSurface, perSessionCwd, perTaskImage, planCacheProbe, pricing, principalCaps, promptManifestTracker, purgeSession, question, rateLimiter, reaper, webAdminJwtVerifier, resumeAnchorStore, retentionLaneStarted, retentionLaneStore, ruleConsent, runStore, runner, runnerDeps, runtimeCapsPeekResolver, scenarioDetails, scenarios, selectEnvTool, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionAudit, sessionEnvSelection, sessionMemoryStatusFace, sessionPolicyStore, sessionTitler, sessionWatchRegistry, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, sharedMemoryStore, sideQueryAccounting, sqlEngine, sqlWorkflowRunStore, staticWiring, storePosture, subRunner, subagentSteerRegistry, taskAttachmentStore, taskLimitCaps, taskTimeoutSec, toolApproval, toolResultStore, usageWindowStore, userInputLedger, webSearchProvider, workflowAgentRegistry, workflowAgentSessionIndex, workflowParkDecisions, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable, orgDeliveryGate } = ctx;
|
|
32
|
+
const { approvalAskAudit, approvalExemptionStore, approvalNonceStore, authorize, backend, backgroundAgentStore, brain, breakerState, centerRuntimeCapsResolver, checkpointStore, checkpointCtxSealing, parkCommits, config, webAdmin, consolidationValve, costQuota, deviceLane, drainState, durableEnabled, elicitation, fenceSessionOwner, fileHistoryStore, fleetBus, fleetLease, fleetUsage, governanceSeams, handslessRunner, hookAgent, hookLlm, hookWakeBus, imageBakes, imageIndex, instanceId, instrumentDegenerate, leaderEndpoint, loadedSkills, localRoot, logger, lspManager, mcpRevocations, memoryBundleFaces, memoryComplianceFaces, memoryConsolidationFaces, memoryEngine, memoryExportBackend, memoryOptOutGrantStore, memoryOriginFaces, memoryPosture, memorySyncCursors, memorySyncRunner, metrics, modelUsageTracker, orgMemoryAdmission, otelExporter, outcomeSink, ownerAware, parkedReviveInheritedGate, parkedReviveSurface, perSessionCwd, perTaskImage, planCacheProbe, pricing, principalCaps, promptManifestTracker, purgeSession, question, rateLimiter, reaper, webAdminJwtVerifier, resumeAnchorStore, retentionLaneStarted, retentionLaneStore, ruleConsent, runStore, runner, runnerDeps, runtimeCapsPeekResolver, sandboxGitPlane, scenarioDetails, scenarios, selectEnvTool, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionAudit, sessionEnvSelection, sessionMemoryStatusFace, sessionPolicyStore, sessionTitler, sessionWatchRegistry, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, sharedMemoryStore, sideQueryAccounting, sqlEngine, sqlWorkflowRunStore, staticWiring, storePosture, subRunner, subagentSteerRegistry, taskAttachmentStore, taskLimitCaps, taskTimeoutSec, toolApproval, toolResultStore, usageWindowStore, userInputLedger, webSearchProvider, workflowAgentRegistry, workflowAgentSessionIndex, workflowParkDecisions, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable, orgDeliveryGate } = ctx;
|
|
33
33
|
const stores = {
|
|
34
34
|
runStore,
|
|
35
35
|
resumeAnchorStore: resumeAnchorStore ? resumeAnchorStore : undefined,
|
|
@@ -168,6 +168,7 @@ export async function runStage10(ctx) {
|
|
|
168
168
|
writeProtection: buildWriteProtectionPosture(config),
|
|
169
169
|
webSearchProvider,
|
|
170
170
|
sealedKeyPublic: webAdmin.sealedKeyPublic,
|
|
171
|
+
sandboxGitPlane,
|
|
171
172
|
instanceId,
|
|
172
173
|
capabilities: {
|
|
173
174
|
version: serviceVersion(),
|
|
@@ -197,7 +198,7 @@ export async function runStage10(ctx) {
|
|
|
197
198
|
sessionEventsMaxConnections: sessionWatchRegistry ? posIntEnv(process.env.SESSION_EVENTS_MAX_CONNS, 256, 100_000) : undefined,
|
|
198
199
|
};
|
|
199
200
|
const resolveSpec = createResolveSpec({
|
|
200
|
-
config, logger, metrics, localRoot, scenarios, principalCaps, centerRuntimeCapsResolver,
|
|
201
|
+
config, logger, metrics, localRoot, scenarios, loadedSkills, principalCaps, centerRuntimeCapsResolver,
|
|
201
202
|
getKeyResolver: () => webAdmin.getKeyResolver(),
|
|
202
203
|
taskAttachmentStore, perSessionCwd, setSessionCwd, setSessionShellEnv, fenceSessionOwner,
|
|
203
204
|
hookLlm, hookAgent, fleetBus, hookWakeBus, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec,
|
package/dist/boot/stores.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ export declare function openStores(ctx: OpenStoresCtx): Promise<{
|
|
|
37
37
|
mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
|
|
38
38
|
memoryExportBackend: MemoryBackend | undefined;
|
|
39
39
|
memorySyncRunner: MemorySyncRunner | undefined;
|
|
40
|
-
sessionStore: import("@sema-agent/core").SessionStore
|
|
40
|
+
sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
|
|
41
41
|
breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
|
|
42
42
|
usageWindowStore: import("@sema-agent/core").UsageWindowStore | undefined;
|
|
43
43
|
memoryPosture: import("../memory-posture.js").MemoryPosture;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as net from "node:net";
|
|
2
|
+
import * as tls from "node:tls";
|
|
3
|
+
import type { Duplex } from "node:stream";
|
|
4
|
+
import { type GitEndpoint } from "./http1.js";
|
|
5
|
+
import { LeaseBook, type LeaseBookEvent, type MonotonicClock } from "./lease-book.js";
|
|
6
|
+
/** Every line the broker logs (closed set; none carries a credential or a body). */
|
|
7
|
+
export type BrokerLogEvent = LeaseBookEvent | {
|
|
8
|
+
event: "refused";
|
|
9
|
+
status: number;
|
|
10
|
+
rule: string;
|
|
11
|
+
} | {
|
|
12
|
+
event: "exchange";
|
|
13
|
+
i: number;
|
|
14
|
+
method: string;
|
|
15
|
+
endpoint: GitEndpoint;
|
|
16
|
+
upstreamStatus: number;
|
|
17
|
+
authenticated: boolean;
|
|
18
|
+
} | {
|
|
19
|
+
event: "upstream_failed";
|
|
20
|
+
i: number;
|
|
21
|
+
endpoint: GitEndpoint;
|
|
22
|
+
problem: string;
|
|
23
|
+
} | {
|
|
24
|
+
event: "aborted";
|
|
25
|
+
i: number;
|
|
26
|
+
endpoint: GitEndpoint;
|
|
27
|
+
why: string;
|
|
28
|
+
} | {
|
|
29
|
+
event: "listening";
|
|
30
|
+
host: string;
|
|
31
|
+
port: number;
|
|
32
|
+
} | {
|
|
33
|
+
event: "lease_file_unreadable";
|
|
34
|
+
problem: string;
|
|
35
|
+
};
|
|
36
|
+
export interface UpstreamTarget {
|
|
37
|
+
readonly protocol: "https:" | "http:";
|
|
38
|
+
readonly hostname: string;
|
|
39
|
+
readonly port: number;
|
|
40
|
+
}
|
|
41
|
+
/** Opens the upstream connection for one exchange (production: {@link createUpstreamConnector}; the pins inject a plain socket). */
|
|
42
|
+
export type UpstreamConnector = (target: UpstreamTarget) => Duplex;
|
|
43
|
+
/**
|
|
44
|
+
* Rule 9. https ⇒ `tls.connect` with the runtime's default trust store, `rejectUnauthorized: true` and the origin's host name as SNI / the
|
|
45
|
+
* name checked (no CA override, no identity override, no knob to skip either); http ⇒ a plain socket (an http entry is never usable, so it
|
|
46
|
+
* never carries a credential). No proxy environment is read.
|
|
47
|
+
*/
|
|
48
|
+
export declare function createUpstreamConnector(impl?: {
|
|
49
|
+
tlsConnect?: (opts: tls.ConnectionOptions) => Duplex;
|
|
50
|
+
netConnect?: (opts: net.NetConnectOpts) => Duplex;
|
|
51
|
+
}): UpstreamConnector;
|
|
52
|
+
/** The two upstream bounds (rule 14). */
|
|
53
|
+
export interface BrokerUpstreamTimeouts {
|
|
54
|
+
readonly connectMs: number;
|
|
55
|
+
readonly headersMs: number;
|
|
56
|
+
}
|
|
57
|
+
/** The bounds every broker runs with — the two constants; nothing configures them. */
|
|
58
|
+
export declare const BROKER_UPSTREAM_TIMEOUTS_DEFAULT: BrokerUpstreamTimeouts;
|
|
59
|
+
export interface BrokerDeps {
|
|
60
|
+
readonly book: LeaseBook;
|
|
61
|
+
readonly connect: UpstreamConnector;
|
|
62
|
+
readonly log: (e: BrokerLogEvent) => void;
|
|
63
|
+
/** Test seam only (the pins shorten the bounds); absent ⇒ {@link BROKER_UPSTREAM_TIMEOUTS_DEFAULT}. */
|
|
64
|
+
readonly timeouts?: BrokerUpstreamTimeouts;
|
|
65
|
+
}
|
|
66
|
+
/** The broker's listener: each connection carries one request. */
|
|
67
|
+
export declare function createBrokerServer(deps: BrokerDeps): net.Server;
|
|
68
|
+
/** Rule 11: a Location resolved against the upstream request URL stays only if it is this origin, inside the git namespace, with an allowed query. */
|
|
69
|
+
export declare function rewriteLocation(location: string, upstreamUrl: string, origin: string, i: number): string | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* The broker process: load the lease file, listen on the loopback, re-read the file every `pollMs` (a changed text is loaded; an
|
|
72
|
+
* unreadable file is a refused file — everything withdrawn). Returns once listening.
|
|
73
|
+
*/
|
|
74
|
+
export declare function runBroker(opts: {
|
|
75
|
+
leasePath: string;
|
|
76
|
+
host: string;
|
|
77
|
+
port: number;
|
|
78
|
+
pollMs: number;
|
|
79
|
+
log: (e: BrokerLogEvent) => void;
|
|
80
|
+
clock?: MonotonicClock;
|
|
81
|
+
connect?: UpstreamConnector;
|
|
82
|
+
}): Promise<{
|
|
83
|
+
port: number;
|
|
84
|
+
book: LeaseBook;
|
|
85
|
+
close(): Promise<void>;
|
|
86
|
+
}>;
|
|
87
|
+
/** The readiness probe (same program, `--probe`): GET the local ready route; true ⇔ 200 within `timeoutMs`. */
|
|
88
|
+
export declare function probeBroker(host: string, port: number, timeoutMs: number): Promise<boolean>;
|
|
89
|
+
//# sourceMappingURL=broker.d.ts.map
|