@sema-agent/server 1.312.0 → 1.314.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.
Files changed (45) hide show
  1. package/dist/auth-bridge.d.ts +3 -2
  2. package/dist/bench/s1/live-deps.js +2 -2
  3. package/dist/budget.d.ts +4 -76
  4. package/dist/budget.js +4 -83
  5. package/dist/capabilities/sandbox-file-send.d.ts +2 -1
  6. package/dist/config-types.d.ts +1 -1
  7. package/dist/elicitation.d.ts +5 -3
  8. package/dist/elicitation.js +3 -2
  9. package/dist/fleet/fleet-bus.d.ts +1 -0
  10. package/dist/fleet/fleet-bus.js +1 -0
  11. package/dist/fleet-lease.d.ts +1 -1
  12. package/dist/fleet-lease.js +1 -1
  13. package/dist/hooks/hook-llm.d.ts +5 -4
  14. package/dist/hooks/hook-runner.d.ts +1 -1
  15. package/dist/hooks/hook-runner.js +1 -1
  16. package/dist/http/server.js +67 -85
  17. package/dist/key-resolver.d.ts +1 -1
  18. package/dist/key-resolver.js +1 -1
  19. package/dist/leader/grader-env-factory.d.ts +1 -1
  20. package/dist/leader/grader-env-factory.js +2 -2
  21. package/dist/leader/wire.d.ts +1 -1
  22. package/dist/leader/wire.js +1 -1
  23. package/dist/main.js +26 -26
  24. package/dist/memory-scope.d.ts +18 -0
  25. package/dist/memory-scope.js +38 -0
  26. package/dist/observability/cost-taxonomy.d.ts +34 -0
  27. package/dist/observability/cost-taxonomy.js +26 -0
  28. package/dist/observability/prompt-manifest.d.ts +75 -0
  29. package/dist/observability/prompt-manifest.js +82 -0
  30. package/dist/plugins/mailbox-store-sql.d.ts +2 -2
  31. package/dist/plugins/mailbox-store-sql.js +8 -4
  32. package/dist/plugins/web-search.d.ts +4 -3
  33. package/dist/question.d.ts +2 -1
  34. package/dist/question.js +3 -2
  35. package/dist/run-local.js +2 -2
  36. package/dist/runtime-caps-resolver.d.ts +7 -7
  37. package/dist/runtime-caps-resolver.js +3 -3
  38. package/dist/security.d.ts +2 -16
  39. package/dist/security.js +3 -37
  40. package/dist/tool-approval.d.ts +2 -1
  41. package/dist/tool-approval.js +3 -2
  42. package/dist/trace/core-keyset-guard.d.ts +2 -2
  43. package/dist/trace/project.d.ts +1 -0
  44. package/dist/trace/project.js +1 -0
  45. package/package.json +2 -2
package/dist/security.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { createHash, createHmac, createPublicKey, timingSafeEqual, verify as cryptoVerify } from "node:crypto";
2
- import { join } from "node:path";
3
- import { uuidv7, FileMemoryEngineBackend, resolveMemoryEngineRoot, deriveControlPlaneDir, formatUserScope, formatProjScope } from "@sema-agent/core";
2
+ import { uuidv7 } from "@sema-agent/core";
4
3
  import { PROJECT_ID_REGEX } from "@sema-agent/registry-core";
5
4
  export { parseApprovalHmacKeys, parsePrincipalJwks } from "./auth-keys.js";
5
+ import { memoryScopeFor } from "./memory-scope.js";
6
6
  const UUIDV7_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
7
7
  export function isUuidV7(s) {
8
8
  return UUIDV7_RE.test(s);
@@ -128,41 +128,7 @@ export function verifiedPrincipal(req, config) {
128
128
  assertPrincipalShape(sub);
129
129
  return sub;
130
130
  }
131
- export function memoryScopeFor(config, principal, projectId) {
132
- if (config.requirePrincipal === true) {
133
- if (config.memoryEngineBackend === "pg" || config.memoryEngineBackend === "tidb") {
134
- if (!principal)
135
- return undefined;
136
- return projectId ? formatProjScope(principal, projectId) : formatUserScope(principal);
137
- }
138
- return undefined;
139
- }
140
- return config.memoryScope;
141
- }
142
- export function memoryEngineRemoteLanePosture(config) {
143
- const lane = config.remoteExec?.provider;
144
- if (lane === undefined || lane === "host")
145
- return undefined;
146
- return { lane, posture: config.memoryEngineRemoteLaneAllowed === true ? "forced" : "dark" };
147
- }
148
- export function memoryEngineBackendFor(config, fallbackRoot) {
149
- if (config.requirePrincipal === true || !config.memoryEngineEnabled)
150
- return undefined;
151
- if (memoryEngineRemoteLanePosture(config)?.posture === "dark")
152
- return undefined;
153
- const root = resolveMemoryEngineRoot(config.memoryEngineDir ?? fallbackRoot);
154
- const dir = join(root, "memory");
155
- return { backend: new FileMemoryEngineBackend(dir, { controlDir: deriveControlPlaneDir(root, dir) }), root };
156
- }
157
- export function memorySpecForRequest(scope, memoryWrite, defaultScopes) {
158
- if (!scope)
159
- return undefined;
160
- const isV2 = (k) => k.startsWith("user:") || k.startsWith("org:") || k.startsWith("proj:") || k.startsWith("userproj:");
161
- const extras = (defaultScopes ?? []).filter((s, i, arr) => typeof s === "string" && s.length > 0 && s !== scope && arr.indexOf(s) === i);
162
- const layered = extras.length > 0 ? { scopes: [scope, ...extras], writeScope: scope } : {};
163
- const v2 = isV2(scope) || extras.some(isV2) ? { scopeContract: "v2" } : {};
164
- return memoryWrite === false ? { scope, ...layered, writeScope: null, ...v2 } : { scope, ...layered, ...v2 };
165
- }
131
+ export { memoryScopeFor, memoryEngineRemoteLanePosture, memoryEngineBackendFor, memorySpecForRequest } from "./memory-scope.js";
166
132
  export function approvalHmacMessage(env) {
167
133
  return JSON.stringify([env.sessionId, env.boundCallId ?? null, env.boundInputHash ?? null, env.decision, env.reason ?? null]);
168
134
  }
@@ -20,7 +20,7 @@ export interface ToolApprovalRunContext {
20
20
  abortSignal?: AbortSignal;
21
21
  }
22
22
  export type ToolApprovalDecision = "allow" | "allow_session" | "deny";
23
- export declare function parseToolApprovalDecision(body: unknown): {
23
+ export declare function parseToolApprovalResponse(body: unknown): {
24
24
  ok: true;
25
25
  value: ToolApprovalDecision;
26
26
  updatedInput?: unknown;
@@ -28,6 +28,7 @@ export declare function parseToolApprovalDecision(body: unknown): {
28
28
  ok: false;
29
29
  error: string;
30
30
  };
31
+ export declare const parseToolApprovalDecision: typeof parseToolApprovalResponse;
31
32
  export declare class ToolApprovalCoordinator {
32
33
  private readonly als;
33
34
  private readonly pending;
@@ -12,7 +12,7 @@ function sessionAllowCategory(toolName) {
12
12
  function sessionAllowKey(owner, sessionId, category) {
13
13
  return JSON.stringify([owner, sessionId, category]);
14
14
  }
15
- export function parseToolApprovalDecision(body) {
15
+ export function parseToolApprovalResponse(body) {
16
16
  if (body === null || typeof body !== "object" || Array.isArray(body))
17
17
  return { ok: false, error: "body must be an object" };
18
18
  const d = body.decision;
@@ -22,6 +22,7 @@ export function parseToolApprovalDecision(body) {
22
22
  }
23
23
  return { ok: false, error: 'decision must be one of "allow" | "allow_session" | "deny"' };
24
24
  }
25
+ export const parseToolApprovalDecision = parseToolApprovalResponse;
25
26
  function isChildAsk(req) {
26
27
  return req.fromSubagent === true;
27
28
  }
@@ -208,7 +209,7 @@ export class ToolApprovalCoordinator {
208
209
  return settled.allowed;
209
210
  }
210
211
  respond(id, principal, body) {
211
- const parsed = parseToolApprovalDecision(body);
212
+ const parsed = parseToolApprovalResponse(body);
212
213
  if (!parsed.ok)
213
214
  return { status: 400, body: { error: parsed.error } };
214
215
  const entry = this.pending.get(id);
@@ -1,8 +1,8 @@
1
1
  import type { TaskNotificationPayload, BackgroundChildEvent, RosterEntry, AskRequest, TaskEvent } from "@sema-agent/core";
2
2
  type AssertAllKeysHandled<T extends never> = T;
3
- type NotificationProjected = "task_id" | "task_type" | "toolUseId" | "status" | "summary" | "result" | "output_file" | "usage" | "sessionId" | "seq" | "lines" | "stoppedBy" | "source" | "exitCode" | "partial" | "diagnostics" | "recentSteps" | "editedFiles" | "resumable";
3
+ type NotificationProjected = "task_id" | "task_type" | "toolUseId" | "status" | "summary" | "result" | "output_file" | "usage" | "sessionId" | "seq" | "lines" | "stoppedBy" | "source" | "exitCode" | "partial" | "diagnostics" | "recentSteps" | "editedFiles" | "resumable" | "completionId";
4
4
  type _GuardNotification = AssertAllKeysHandled<Exclude<keyof TaskNotificationPayload, NotificationProjected>>;
5
- type BgNotifProjected = "taskId" | "sessionId" | "seq" | "status" | "summary" | "stoppedBy" | "resumable" | "recentSteps" | "editedFiles" | "usage" | "transcriptId" | "rootSessionId" | "parentTaskId" | "parentToolCallId";
5
+ type BgNotifProjected = "taskId" | "sessionId" | "seq" | "status" | "summary" | "stoppedBy" | "resumable" | "recentSteps" | "editedFiles" | "usage" | "transcriptId" | "rootSessionId" | "parentTaskId" | "parentToolCallId" | "completionId";
6
6
  type BgNotifExcluded = "kind" | "sessionScoped" | "owner" | "scope" | "description" | "agentType" | "name" | "currentAction" | "currentTool" | "parentSessionId" | "startedAt" | "workflowRunId" | "progressTaskId" | "progressParentTaskId";
7
7
  type _GuardBgNotif = AssertAllKeysHandled<Exclude<keyof BackgroundChildEvent, BgNotifProjected | BgNotifExcluded>>;
8
8
  type RosterProjected = "name" | "agentId" | "sessionId" | "toolUseId" | "owner" | "scope" | "sessionScoped" | "rootSessionId" | "model" | "createdAt";
@@ -108,6 +108,7 @@ export declare function taskNotificationEventData(ev: {
108
108
  edits: number;
109
109
  }>;
110
110
  resumable?: boolean;
111
+ completionId?: string;
111
112
  };
112
113
  eventId?: string;
113
114
  parentToolCallId?: string;
@@ -92,6 +92,7 @@ export function taskNotificationEventData(ev) {
92
92
  ...(n.seq !== undefined ? { seq: n.seq } : {}),
93
93
  ...(n.lines !== undefined ? { lines: n.lines.map((l) => redactSecrets(l)) } : {}),
94
94
  ...(n.stoppedBy !== undefined ? { stoppedBy: n.stoppedBy } : {}),
95
+ ...(n.completionId !== undefined ? { completionId: n.completionId } : {}),
95
96
  ...(n.source !== undefined ? { source: redactSecrets(n.source) } : {}),
96
97
  ...(n.exitCode !== undefined ? { exitCode: n.exitCode } : {}),
97
98
  ...(n.partial !== undefined ? { partial: n.partial } : {}),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/server",
3
- "version": "1.312.0",
3
+ "version": "1.314.0",
4
4
  "description": "Sema Server — the server/API implementation layer for Sema, wiring core, registry, model providers, and cloud agent execution. Built on @sema-agent/core.",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",
@@ -51,7 +51,7 @@
51
51
  "build:binary:run-local:darwin-arm64": "bun build --compile --target=bun-darwin-arm64 src/run-local.ts --outfile dist/run-local-darwin-arm64"
52
52
  },
53
53
  "dependencies": {
54
- "@sema-agent/core": "^1.444.0",
54
+ "@sema-agent/core": "^1.452.0",
55
55
  "@sema-agent/registry-core": "^0.10.21",
56
56
  "e2b": "^2.28.0",
57
57
  "libsodium-wrappers": "^0.8.4",