@sema-agent/server 7.7.0 → 7.7.1

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.
@@ -43,6 +43,15 @@ export declare function pickHandsRunner(hands: ScenarioHands, pair: HandsRunnerP
43
43
  *
44
44
  * ⚠️ 本全集是**观测口径**(用于防漂移对账),**不是** deny 名单 —— deny 用下面的
45
45
  * {@link HANDS_EXCLUSIVE_TOOL_NAMES},理由见那里。
46
+ *
47
+ * 🚨 [3248] P0(2026-08-09):派生时必须过滤 core 的 `RETIRED_TOOL_NAMES` —— core 5.21.0 的
48
+ * `HAND_TOOL_EFFECTS` 里残留已退役的 `MultiEdit`,而 core `prepare-task` 的策略名审计见退役名
49
+ * **无条件 throw**(`config.legacy_tool_name`);不过滤,deny 名单一进 `spec.toolPolicy`,
50
+ * `hands: none` 三场景(scan/code-review/team)在**所有部署**上零 turn 全灭。core 5.21.1 已删
51
+ * 那条死条目([3249]),这道 filter 是结构性防御:将来 core 再退役任何 band 名都不会重演
52
+ * (test/scenario-hands-lane.test.ts 格7/格8 双钉:真 Runner 过审计 + 零交集门)。
53
+ * filter 打在**整表**(effect 表 + 钉死补集)之后 —— caret floor 下装置会解析到更新的 core,
54
+ * 补集名哪天被退役,只滤前半就是同一次故障换个名字(codex 复审 finding,2026-08-09)。
46
55
  */
47
56
  export declare const HANDS_BAND_TOOL_NAMES: readonly string[];
48
57
  /**
@@ -14,7 +14,7 @@
14
14
  * 有手 Runner 上,手独占名单逐一 deny。**不是**主保证(主保证是根本不挂 factory ⇒ 工具面不可见)。
15
15
  * ③ {@link createHandsLaneRegistry} —— resolveSpec 产出 spec 与执行点选 Runner 之间的 lane 传递。
16
16
  */
17
- import { HAND_TOOL_EFFECTS, combinePolicies, createAllowDenyPolicy } from "@sema-agent/core";
17
+ import { HAND_TOOL_EFFECTS, RETIRED_TOOL_NAMES, combinePolicies, createAllowDenyPolicy } from "@sema-agent/core";
18
18
  /**
19
19
  * 无手孪生 Runner 的 deps 构造:把 `executionEnvFactory` **摘键**(不是置 undefined)。
20
20
  * 摘键让「这只 Runner 没有手」在 deps 字面量上自证;置 undefined 留下一个值为 undefined 的键,
@@ -44,6 +44,15 @@ export function pickHandsRunner(hands, pair) {
44
44
  *
45
45
  * ⚠️ 本全集是**观测口径**(用于防漂移对账),**不是** deny 名单 —— deny 用下面的
46
46
  * {@link HANDS_EXCLUSIVE_TOOL_NAMES},理由见那里。
47
+ *
48
+ * 🚨 [3248] P0(2026-08-09):派生时必须过滤 core 的 `RETIRED_TOOL_NAMES` —— core 5.21.0 的
49
+ * `HAND_TOOL_EFFECTS` 里残留已退役的 `MultiEdit`,而 core `prepare-task` 的策略名审计见退役名
50
+ * **无条件 throw**(`config.legacy_tool_name`);不过滤,deny 名单一进 `spec.toolPolicy`,
51
+ * `hands: none` 三场景(scan/code-review/team)在**所有部署**上零 turn 全灭。core 5.21.1 已删
52
+ * 那条死条目([3249]),这道 filter 是结构性防御:将来 core 再退役任何 band 名都不会重演
53
+ * (test/scenario-hands-lane.test.ts 格7/格8 双钉:真 Runner 过审计 + 零交集门)。
54
+ * filter 打在**整表**(effect 表 + 钉死补集)之后 —— caret floor 下装置会解析到更新的 core,
55
+ * 补集名哪天被退役,只滤前半就是同一次故障换个名字(codex 复审 finding,2026-08-09)。
47
56
  */
48
57
  export const HANDS_BAND_TOOL_NAMES = Object.freeze([
49
58
  ...Object.keys(HAND_TOOL_EFFECTS),
@@ -52,7 +61,7 @@ export const HANDS_BAND_TOOL_NAMES = Object.freeze([
52
61
  "Monitor",
53
62
  "EnterWorktree",
54
63
  "ExitWorktree",
55
- ]);
64
+ ].filter((n) => !RETIRED_TOOL_NAMES.has(n)));
56
65
  /**
57
66
  * band 里**只有手才可能出现**的那批(= deny 名单)。
58
67
  *
@@ -1,7 +1,7 @@
1
1
  import http from "node:http";
2
2
  import { once } from "node:events";
3
3
  import { createHash } from "node:crypto";
4
- import { uuidv7, isThinkingLevel, expandTiers, resumeWithVerification, CheckpointError, HAND_TOOL_EFFECTS, defaultTaskRegistry, validatePendingSteer, subscribeWorkflow, GLOBAL_USAGE_KEY, usageRetryAfterMs } from "@sema-agent/core";
4
+ import { uuidv7, isThinkingLevel, expandTiers, resumeWithVerification, CheckpointError, HAND_TOOL_EFFECTS, RETIRED_TOOL_NAMES, defaultTaskRegistry, validatePendingSteer, subscribeWorkflow, GLOBAL_USAGE_KEY, usageRetryAfterMs } from "@sema-agent/core";
5
5
  import { decideParkedAgent, findParkedAgentForCheckpoint } from "../parked-decide.js";
6
6
  import { matchCatalogModel } from "../model-select.js";
7
7
  import {} from "../config-center/facade.js";
@@ -107,7 +107,10 @@ const MAX_IMAGE_BASE64_BYTES = 6 * 1024 * 1024; // a single inline image's base6
107
107
  // Hand (executionEnv) tool names core mounts at the runner when an executionEnvFactory is configured — the
108
108
  // authoritative set is core `HAND_TOOL_EFFECTS` (root-exported since 1.70). These are NEVER in spec.tools, so
109
109
  // the durable-resume satisfiability pre-check must union them when remote exec is on.
110
- const HAND_TOOL_NAMES = Object.keys(HAND_TOOL_EFFECTS);
110
+ // [3248]: filter RETIRED_TOOL_NAMES — core 5.21.0 left retired "MultiEdit" in HAND_TOOL_EFFECTS; a retired
111
+ // name is never mounted, so keeping it here would let the pre-check claim satisfiability for a tool that
112
+ // cannot exist (same derivation hygiene as hands-lane.ts HANDS_BAND_TOOL_NAMES).
113
+ const HAND_TOOL_NAMES = Object.keys(HAND_TOOL_EFFECTS).filter((n) => !RETIRED_TOOL_NAMES.has(n));
111
114
  /** [1245] codex-3/4 — the REOPEN-class resume failures: core's runtask reopened the checkpoint (store.reopen,
112
115
  * dist-read) BEFORE returning this failed result, so the park is STILL PENDING and decidable. Everything
113
116
  * downstream must treat these as a re-park, never terminal: the durable event log writes `suspended` (not
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/server",
3
- "version": "7.7.0",
3
+ "version": "7.7.1",
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",
@@ -69,7 +69,7 @@
69
69
  "sharp": "^0.35.3"
70
70
  },
71
71
  "devDependencies": {
72
- "@sema-agent/sdk": "^6.9.0",
72
+ "@sema-agent/sdk": "^6.10.0",
73
73
  "@types/libsodium-wrappers": "^0.7.14",
74
74
  "@types/node": "22.10.2",
75
75
  "@types/pg": "^8.20.0",