@sema-agent/client-core 0.68.1 → 0.69.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/CHANGELOG.md +129 -0
- package/README.md +8 -5
- package/dist/adapt/arms.js +30 -0
- package/dist/adapt/textSegmentAuthority.d.ts +157 -0
- package/dist/adapt/textSegmentAuthority.js +108 -0
- package/dist/adapt/textStream.d.ts +63 -0
- package/dist/adapt/textStream.js +122 -12
- package/dist/adapt.js +14 -0
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +19 -0
- package/dist/adapter/downstream/eventToSdkMessage.js +42 -14
- package/dist/coreValuePorts.d.ts +161 -0
- package/dist/coreValuePorts.js +98 -0
- package/dist/engineHttpTools.d.ts +31 -0
- package/dist/engineHttpTools.js +30 -0
- package/dist/engineNoticeCodes.d.ts +1 -1
- package/dist/engineNoticeCodes.js +12 -1
- package/dist/gateOutcome.d.ts +27 -13
- package/dist/gateOutcome.js +29 -2
- package/dist/index.d.ts +6 -0
- package/dist/index.js +22 -0
- package/dist/mcpPanel.d.ts +104 -0
- package/dist/mcpPanel.js +129 -0
- package/dist/request/taskRequest.d.ts +54 -0
- package/dist/request/taskRequest.js +30 -0
- package/dist/sdkWireTransit.d.ts +41 -0
- package/dist/sdkWireTransit.js +32 -0
- package/dist/seam.d.ts +49 -1
- package/dist/seam.js +9 -1
- package/dist/workflowClient.d.ts +20 -0
- package/dist/workflowClient.js +19 -1
- package/docs/INTEGRATION-CLIENTS.md +321 -12
- package/package.json +5 -5
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
|
|
20
20
|
| 项 | 值 | 真源 |
|
|
21
21
|
|---|---|---|
|
|
22
|
-
| 本包 | `@sema-agent/client-core` **0.
|
|
22
|
+
| 本包 | `@sema-agent/client-core` **0.69.0**(本批发布版 = **minor**:型面 BREAKING 仅 peer `@sema-agent/sdk` 地板 `>=8.8.0` → `>=9.4.0`,运行期零 BREAKING;提货批 = sdk 9.4.0 / core 7.18.0 / settings-schema 2.0.0 换钉 + CC-02 `thinking_segment_end`(`reasoning_end` 推理面权威替换)+ CC-05 core 7.18.0 三件(通告码 +4 / park 两新键 / `gate.disposition.classifier` 视图)+ CC-07 core 值级十件端口注入 `installCoreValuePorts` + CC-03 补件 `fetchMcpPanel`;投影口 `text_end` 进 switch、`tool_roster_delta` 有痕 dropped;§36 / 36y 三端升级必读四条)|
|
|
23
23
|
| peer:wire 契约 | `@sema-agent/sdk` **>=8.4.0**(value-level,非 type-only;**0.60.0 抬版**,四条硬理由见 §24a 与 `scripts/run-sdk-floor-test.mjs` 的 `FLOOR` 注;上一次是 0.59.0 的 `>=8.3.0`)。🔴 支持窗同批收到 **engine ≥7.64.0**:sdk 8.4.0 与 7.63.0 及以前的 wire **不同窗** | `package.json` `peerDependencies` |
|
|
24
24
|
| peer:会话词汇表 | `@sema-agent/agent-types` **>=0.2.0**(type-only,零运行时) | 同上 |
|
|
25
25
|
| runtime dep | `diff` ^9.0.0(**唯一**一条;portability 门按**等值**钉死) | `package.json` `dependencies` |
|
|
26
|
-
| 公开导出面 | **
|
|
26
|
+
| 公开导出面 | **982** 个运行期符号(+ 44 个测试钩;= 0.69.0 未发布版的值(原排 0.68.3,因 peer 地板抬升改 minor)= 相对 0.68.2 **十七件 additive、零删除**:`fetchMcpPanel`(CC-03 补件,§36e)+ `readWorkflowResumeAdmissionIncomplete`(CC-05 core 7.18.0 #755)+ `installCoreValuePorts`/`hasCoreValuePorts`/`hasCoreValuePort`/`coreValuePortMisses`/`CORE_VALUE_PORT_NAMES` + 十读口(CC-07 core 值级端口,§36d);0.68.2 相对 0.68.1 十三件 additive:`SEMA_SEGMENT_ID_KEY`(CC-01 段身份键,§35f)/ `projectMcpPanel`+`mcpPanelLastLegDetail`+`projectMcpSection`(CC-03 `/mcp` 面板读视图,§35g)/ `resolveTextSegmentAuthority`/`createTextSegmentLedger`(L-318 `text_end` 权威段替换的判决单源 + print 形段账,详见 §35b/§35c)/ `memoryCaptureDeclarationField`/`MEMORY_CAPTURE_OFF`(L-316 会话级隐私声明的字面唯一铸点,§35d)/ `engineUrl`/`probeHealth`(L-61 件④ SDK 纯工具面原样转口,§35d)/ `AgentClient`/`isApprovalRequestFrameV1`/`isApprovalRevokeFrameV1`(L-61 存量清零:SDK **wire 面**原样转口,§35e)。`0.68.1`/`0.68.0` 是 **952**,那批是相对 0.67.2 **二十件 additive、🔴 两件删除(BREAKING)**:additive = `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`/`RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`RUN_TERMINAL_STATUSES`(L-247 终态词两表分源,详见 §33b)/ `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(L-244 子代下界位自有名,§33g)/ `ASK_UNRESOLVABLE_CAUSES`/`readAskUnresolvable`/`DURABLE_MANDATE_SOURCES`/`readDurableGateUnavailable`(core 7.17.0 #709 ①② 两只通告事实窄读器,§33c)/ `WORKFLOW_PARK_TRUTH_UNREADABLE`/`WORKFLOW_PARK_NOT_PENDING`/`WORKFLOW_PARK_BINDING_BROKEN`/`WORKFLOW_PARK_REQUIRES_RUN_STORE`/`WORKFLOW_PARK_REFUSAL_CODES`/`isWorkflowParkRefusalCode`/`readWorkflowParks`(core 7.17.0 #652 park 真相四码 + parks 三键读器,§33d)/ `ENGINE_STOP_REASONS`/`engineStopReasonToCc`(L-246 A13 停止原词映射下沉,§33g)/ `readCancelRequested`(L-230 读面,§33f);🔴 **删除两件** `TERMINAL_NOT_SUCCESS_STATUSES`/`TERMINAL_STATUSES`(随 L-247 两表分源更名成 `RUN_TERMINAL_*`,clean-cut **不留别名** —— 留一个别名等于让端可以继续按合起来的那张表读,分源就白做了,详见 §33b)。`0.67.0` 是 **934**,那批是相对 0.66.0 **七件 additive、🔴 两件删除**:additive = `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`(core 7.14.0 退役 `classifierUnavailable` 之后的**拒绝面**继任读器与措辞,详见 §32b)/ `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`(core 7.14.0 #688 C3 的规则店机制位三件,详见 §32d);🔴 **删除两件** `classifierUnavailableOf`/`classifierUnavailableDetail`(随 core 7.14.0 的 Retired keys 表整族退役,clean-cut 不留别名,详见 §32b;同批删的还有**型** `ClassifierUnavailableView`、卡位与帧位 `classifierUnavailable`、以及一条恒真的型面钉 `_askOriginWordsPin`)。`0.66.0` 是 **929**,那批是一件 additive、零删除:`readRunCostFacts`(终局成本事实的唯一读器:`costBreakdown` / `nested` 窄读 + 对账三段与两个判别位,终帧超集键与 chrome 对账臂共用它;详见 §31c);已发的 **0.65.x 十一件 additive、两件删除**:additive = `DECIDE_WORKFLOW_HOST_UNKNOWN`/`DECIDE_WORKFLOW_HOST_NOT_PARKED`/`DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED`/`DECIDE_WORKFLOW_LANE_CODES`/`readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070 `/decide` 回执读面与三码人话,详见 §30h)/ `TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇单铸谓词,详见 §30j);🔴 **删除两件** `AUTO_MODE_BREAKER_CAUSES`/`classifierBreakerOf`(熔断族随 core 7.12.0 的 Removed(BREAKING) 整只退役,clean-cut 不留别名,详见 §30k②;同批删的还有**型** `ClassifierBreakerView` 与 `ClassifierStatusView.breaker` 一位)。`0.64.2` 是 **919**,那批是一件 additive、零删除:`readDenialLimitFallback`(限额回落卡的窄读器上公面,壳侧同判据副本退役,详见 §29③);`0.64.0` 是 **918**,那批是件①+件② 十三件 additive、零删除:`CLASSIFIER_STATUS_STATES`/`classifierBreakerOf`/`classifierStatusOf`/`classifierStatusDetail`(分类器状态面,详见 §28②)/ `THINKING_FORMATS`/`THINKING_FORMAT_WIRE_TWINS`/`THINKING_DISABLE_PROBE_ORDER`/`MODEL_PROBE_VERDICTS`/`PROBE_PROMPT`/`PROBE_MAX_TOKENS`/`probeRequestBody`/`probeModelCapability`/`applyProbeToEntry`(模型思考能力探测,详见 §28①);`0.63.0` 是 **905**,那批是八件 additive、零删除:`projectServerGateKnobs`/`postureKnobSourceOf`/`postureSourceIsOperatorPinned`/`postureKnobDetail`/`POSTURE_SOURCE_WORDS`(S-178 三根 posture 旋钮读数,详见 §27b)/ `PERSISTED_RULE_BEHAVIORS`/`PERSISTED_RULE_BEHAVIOR_UNKNOWN`/`persistedRuleBehaviorOf`/`persistedRuleBehaviorLabel`/`revokeTargetFromPersistedRule`(三态规则身份,§27c)/ `engineIdentityOf`/`engineIdentityVerdict`/`engineIdentityChanged`/`engineIdentityChangedBy`/`ENGINE_IDENTITY_ANCHORS`(S-179 代际锚,§27d)/ `GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail`(门词汇 +2,§27e)/ `PERMISSION_RULE_ISSUE_CODES`/`RETIRED_PERMISSION_RULE_ISSUE_CODES`/`permissionRuleIssueDetail`(规则 lint 码表,§27f)/ `projectToolRoster`/`toolRosterNames`/`toolShimFromRoster`/`applyToolRosterDelta`(L-161 工具名册,§27g)/ `ENGINE_NOTICE_CODES`/`ENGINE_NOTICE_AUDIENCE`/`noticeAudienceOf`/`engineNoticeInCatalog`/`MCP_INJECTION_DROP_REASONS`/`readMcpInjectionDrop`(L-167 通告码册,§27h)/ `AUTO_MODE_UNAVAILABLE_CAUSES`/`AUTO_MODE_BREAKER_CAUSES`/`classifierUnavailableOf`/`classifierUnavailableDetail`(件⑧ 分类器不可用事实,§27h2);`0.62.0` 是 **869**,那批是五件 additive、**零删除**:`capForDisplay`(呈前消毒 + 封长的共用铸点,详见 §26⑦)/ `SEAT_SEND_MESSAGE_KEY_ORIGINS`(座位载荷逐键出身表,详见 §26③)/ `configureSubagentContentStore`+`subagentContentStoreConfig`+`SUBAGENT_CONTENT_STORE_DEFAULTS`(子代内容账本字节预算,测试钩 `__resetSubagentContentStoreConfigForTests` +1,详见 §26②);`0.61.0` 是 **864**,那批是三件 additive、**零删除**:`projectReadFacePosture`/`readFacePostureDetail`/`readFaceDisagreement`(S-167 READ 容纳面 operator 读器,详见 §25);`0.60.0` 是 **861**,那批是二十五件 additive、**零删除**:`readRunTerminal`/`runTerminalCode`/`runTerminalGateKind`/`runTerminalGateToolName`/`isReviewPark`/`REVIEW_PARK_GATE_KINDS` 六件终局因由读器 + `gateOutcomeOf`/`isDeniedGate`/`gateDeniedBy`/`gateApprover`/`isApprovalWindowExpiredGate`/`isDenialLimitAutoDeniedGate`/`isParkSlaExpiredGate`/`isHumanSettledGate` 八件门记录读器 + `projectWriteProtectionCapability`/`noteEngineCapsForWriteProtection`/`observedWriteProtection`/`forgetWriteProtectionReading`/`writeProtectionDoctorDetail`/`projectWriteProtectionPosture`/`writeProtectionPostureDetail` 七件写保护读面(测试钩 `__resetWriteProtectionReadingsForTests` +1)+ `readWireErrorCode` + 真机边界①的两件 `isGateParkedToolEnd`/`GATE_PARKED_ERROR_CODE` + 异源复审逼出的 `engineCapsGeneration`;`0.59.0` 是 **836**,那批是八件 additive:`RULE_OFFERS_ABSENCE_REASONS`/`DENIAL_LIMIT_KINDS` 两张闭词表再导出 + `engineCapValue` 能力位四态通用读口 + `projectSqlEngineCapability`/`observedSqlEngine`/`noteEngineCapsForSqlEngine`/`forgetSqlEngineReading`/`sqlEngineDoctorDetail` 五件 SQL 姿态读面(测试钩 `__resetSqlEngineReadingsForTests` +1);`0.58.0` 是 **828**,那批是三件 additive:`RULE_OFFER_MATCHES`/`RULE_OFFER_BATCH_MEMBER_KINDS`/`RULE_OFFER_UNCOVERED_REASONS` 三张闭词表再导出 + `RESUME_REFUSAL_CODES`/`RESUME_PLACEMENT_MISMATCH`/`resumeRefusalFromError`/`resumeRefusalContent` 四件文案铸点;`0.57.0` 是 **821**;`0.56.0`/`0.55.0` 是 **815**;已发 `0.54.0`(design/385 十件 additive 含 `AUTHORITY_ENVELOPE_TAGS`);`0.52.0` 是 **805**(L-69⑨ 两件);`0.51.0` 是 **803**;`0.50.0` 是 **800**(S-81 五件);`0.49.0` 是 **795**;`0.48.0` 是 **794**;npm `0.47.0` 是 **790**,`0.46.0` 是 **787**,`0.44.0` 是 **783**,`0.43.1`/`0.43.0` 是 **776**,`0.42.0` 是 **771**,`0.41.0` 是 **767**,`0.39.0` 是 **766**,`0.38.0` 是 **764**;`0.37.0` 是 **753**,见 `CHANGELOG.md`) | `scripts/public-export-baseline.json` 的 `count` / `testHookCount` —— **别手抄进别处,以该文件为准** |
|
|
27
27
|
| 常驻门 | 以 `scripts/gates-manifest.json` 的 `suites` 长度为准(**本档不抄这个数**) | `scripts/gates-manifest.json`;`npm test` 的名单等值门与它逐名对账 |
|
|
28
28
|
| 沿革档 | 0.29.0 起建 `CHANGELOG.md`;更早批次记账在 `src/index.ts` 文件头 + `docs/REFACTOR-LEDGER.md` | — |
|
|
29
29
|
|
|
@@ -111,7 +111,7 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
|
|
|
111
111
|
|
|
112
112
|
## §2 公共导出面地图(按域)
|
|
113
113
|
|
|
114
|
-
> 全集真源 = `scripts/public-export-baseline.json` 的 `names`(**
|
|
114
|
+
> 全集真源 = `scripts/public-export-baseline.json` 的 `names`(**982** 项)。
|
|
115
115
|
> 本节**不逐名抄**,只给「域 → 承重导出 → 用途 → 实现锚」。承重导出 = 一个端为了让这个域干活
|
|
116
116
|
> **必须**直接调到的那几个符号;其余是它们的类型、变体与辅助位。
|
|
117
117
|
> 单一入口:`import { … } from '@sema-agent/client-core'`(`exports` 只有 `.` 一个;
|
|
@@ -135,30 +135,30 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
|
|
|
135
135
|
`WorkflowsGateUnknownDenial` 四形**不在**基线里,`src/selfOrchestrationDenial.ts` 对基线贡献
|
|
136
136
|
**4** 项运行期导出(三个函数 + `SELF_ORCHESTRATION_RETRY_WITHOUT`)。
|
|
137
137
|
|
|
138
|
-
|
|
139
|
-
(矩阵、键集、env 名、锚串)而非可调用物;**
|
|
138
|
+
982 项的内部构成(帮助端估读表大小):**298** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
|
|
139
|
+
(矩阵、键集、env 名、锚串)而非可调用物;**6** 项是 PascalCase 运行期值
|
|
140
140
|
(`ControlRouter` / `ControlSafetyError` / `HitlBridge` / `HitlSafetyError` / `DecideTransportRetryExhaustedError`);
|
|
141
141
|
**41** 项是 `*For(sessionKey, …)` 的 per-session 变体(§6;其中 `engineNamespaceKeyFor` 是命名巧合 —— 参数是 baseUrl 不是 sessionKey,见域 14)。
|
|
142
142
|
|
|
143
|
-
### 2b. 域图(16 域,逐域计数之和 =
|
|
143
|
+
### 2b. 域图(16 域,逐域计数之和 = 982)
|
|
144
144
|
|
|
145
145
|
| # | 域 | 名数 | 承重导出 | 用途 | 实现锚 |
|
|
146
146
|
|---|---|---|---|---|---|
|
|
147
|
-
| 1 | **适配内核(下行主链)** |
|
|
147
|
+
| 1 | **适配内核(下行主链)** | 52 | `adapt` · `createWireToCcAdapter` · `runStream` · `eventToSdkMessage` · `terminalToSdkResult` · `SEMA_SEGMENT_ID_KEY`(0.68.2 CC-01:committed assistant 文本行顶层段身份键的唯一字面量出处,壳只读)· `projectMcpSection`(0.68.2 CC-03:`wiring_manifest.mcp[]` 与 `/mcp` 面板 `lastLegMcp.mcp[]` 共用的同一只条目读器)· `readRunCostFacts`(0.66.0:终局成本事实的**唯一读器** —— `TaskStats.costBreakdown` / `nested` 逐键窄读 + 对账三段(own/nested/compaction)与两个「没定价」判别位;终帧的两个超集键与 chrome 臂 `run_cost_reconciled` **共用它**,两面不会各算各的,详见 §31c)· `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`(0.68.0 / L-247:**core 终局因由**闭集,四词 `completed|failed|blocked|paused`)· `RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`RUN_TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇的**单铸谓词**,0.68.0 随 L-247 **两表分源**更名 —— `killed` 属 server run 行状态面、`paused` 属 core 因由面,合成一张会让两边加词时都读不出该改哪儿;`blocked` 是 agent 自报终态,`suspended`/`needs_review` 刻意不在表里,详见 §33b / §30j)· `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(0.68.0 / L-244:子代用量下界位的**自有名**与唯一判据,与终帧 `_sema_usage_lower_bound` 分名,详见 §33g) · `turnUsageToModelUsage` · `isRunStreamActive` · `ADAPTER_DIVERGENCES` · `readRunTerminal` / `runTerminalCode` / `runTerminalGateKind` / `runTerminalGateToolName` / `isReviewPark` / `REVIEW_PARK_GATE_KINDS`(0.60.0 / engine ≥7.64.0:一次 run **怎么结束的**唯一读器 —— 终局从八个平面键换成一条带标因由 `terminal`,四臂 + `unknown` 防御臂 + `plane` 两代字节标;🔴 不认识的终态词绝不折成成功、本包不提供「因由→五词 status」的兼容投影,详见 §24b)| 引擎 SSE `AgentEvent` → 端要渲的**双面输出**:transcript(`SDKMessage`)+ chrome(瞬态 `ChromeEvent`)。**本包存在的理由** | `src/adapt.ts`、`src/adapt/{arms,wireShapes,panelTasks}.ts`(经 `adapt.ts` 再导出)、`src/adapter/runStream.ts`、`src/adapter/downstream/*`、`src/adapter/types.ts`、`src/runTerminal.ts` |
|
|
148
148
|
| 2 | **seam 公共契约** | 2(其余为 type-only) | `CHROME_ARMS` · `deriveTranscriptId` | 公共词汇 + **id 确定性不变量**(同一条流重放 ⇒ 同一串 id)。`CHROME_ARMS` = 端「我要消费哪些 chrome 臂」的对照清单 | `src/seam.ts` |
|
|
149
149
|
| 3 | **HITL 决断卡链**(§4/§5 主战场) | 167 | `makeHitlCanUseTool` · `HitlBridge` · `findPendingForTask` · `readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070:`/decide` 200 = **投递受理**不是「门已解决」;`executionOutcome` 缺席 = 未知,详见 §30h) · `HitlSafetyError` · `bridgeAskUserQuestionGates` · `surfaceToolApprovalFrameAndRespond` / `surfaceFsApprovalAndDecide` · `readToolApprovalRespondAck` · `installApprovalCardPort(For)` · `installHitlHostSurface(For)` · `armPlanReviewApproval` · `reopenPlanReviewCard` · `decidePlanReview` · `startApprovalsFeed` · `pendingRowIsOwnedByThisSession` · `approvalCallKey`/`liveFrameCallKey`/`planReviewQuestionId` · `registerArmedGateFor`/`wasGateArmedFor`/`clearArmedGateFor` · `waitForGateArmed(For)`/`onGateArmed(For)`/`gateArmedWaitMs`(#244 F1 呈现回执事件源) · `planReviewArmedKey(For)`/`notePlanReviewAnswered(For)`/`notePlanReviewAnsweredIfDecisive(For)`(A-024.4 plan 呈现分代) · `toolEndOutputText` · `isAskTool` · `waitForParkRowBirth` · `classifyAskParkRows` / `askParkRowArm` / `classifyAskParkChainFailure` · `readDecisionNoteAudit` / `decisionNoteAuditLine` · `resumeRunningOptions` / `resumeChoiceFromLabels` · `persistedRulesLaneAvailable`/`persistedRulesGovernanceAvailable` · `classifyRulesFailure` · `listAllPersistedRules` · `classifySkippedReason` · `readRulePersistOutcome`(#244 F2:persist-ack 读口与 `readToolApprovalRespondAck` 合成一处) · `parseLocalAllowRule`(durable 腿本地落规则窄化骨架,谓词经 `LocalAllowRuleDeps` 注入) · `readToolApprovalRespondRefusal`(#225 件5,0.42.0:respond 抛错的结构化原文读口 —— 三位各自防御读、各自缺席不铸、**三位皆缺席时整只返 `undefined`**;原样交还零加工,UNTRUSTED-for-display)· `installEditedRuleTextPrechecker` / `hasEditedRuleTextPrechecker` / `precheckEditedRuleText`([5076] 转出口,0.42.0:core 5.57.0 `precheckEditedRuleText` 的**端口注入形** —— 类型面 + 注入口 + 诚实缺席读口。🔴 **不是** value 级 re-export,理由见 §7 缺口 **P-34**;未装 ⇒ 返 `undefined`,绝不编一个 `{ok:true}`)· `surfaceRuleArmNotSent` / `RULE_NOT_SENT_WARN_TEXT` + `surfaceRuleArmRejected` / `RULE_NOT_SENT_REJECTED_WARN_TEXT`(#334,0.43.0:人在卡上按下的「不再询问」被整条丢弃时的诚实告知——**两条刻意分开**:前者=**引擎能力位未确认**(换台引擎/等探测就好),后者=**这次选择没过包内表核/互斥核**(表外文本/坏下标/两臂同场,换引擎也不会变) —— 编辑臂 `respondFreeFormRules` 与批臂 `respondBatchRuleOffers` 两条同形存量共用一条,与 `surfaceRememberNotApplied` 同族纪律:决断照送、只是规则没存,静默丢掉用户明确意图 = 让人以为功能坏了)· `projectCrashConverged`(L-38,0.49.0:`/v1/approvals` additive 键 `crashConverged` 的分桶投影 —— 崩溃收敛的孤儿审批读面,**缺席 ≠ 空数组**、分桶恰一个合取、坏行丢弃并计数,详见 §12;同批把 `ApprovalsResourceLike.list()` 的返回位 additive 放宽成 `ApprovalsListEnvelope`,老形 `{pending}` 仍可赋值)· `readRuleOffers` / `readRuleOfferSupply`(L-103/[C228],0.57.0 additive 导出:「不再询问」候选两代 wire 键的窄读器**公面化** —— 此前只经卡端口出包,不走卡端口架构的宿主只能自己重铸一把,而它承载的是兑付安全判据(原始下标不前移/逐条丢坏/闭集 kind/两代取舍序),详见 §20)· `RULE_OFFERS_ABSENCE_REASONS` / `DENIAL_LIMIT_KINDS`(0.59.0 / sdk 8.3.0 提货:`ruleOffersAbsence` 三词与 `denialLimitFallback.limit` 二词的**运行期**闭词表再导出 —— 与 0.58.0 那三张同一条纪律:端拿它做判定别再手抄字面量。⚠️ **本包自己不拿这两张表做窄读判定**(两处都按开集透传,词表属主是 core、server 已按闭集拒过),再导出只是给端的 `switch` 一份可数的表,端仍必须带 `default` 臂,详见 §23a)· `DecideTransportRetryExhaustedError`(Inkglow-1085 P0a:decide 出站瞬断重试耗尽的 typed 判别 —— HitlBridge 内建单次退避重试,耗尽走重呈臂不判死 turn;端一般只消费行为,不需要 instanceof) · `gateOutcomeOf` / `isDeniedGate` / `gateDeniedBy` / `gateApprover` / `isApprovalWindowExpiredGate` / `isDenialLimitAutoDeniedGate` / `isParkSlaExpiredGate` / `isHumanSettledGate`(0.60.0 / engine ≥7.64.0:`tool_end.gate` 整条门记录的窄读器 + 判定谓词 —— 取代退役的四个正交词 `settledBy`/`resolution`/`autoDenied`/`approver`。🔴 **判定归包**:「是不是审批窗自己走完的拒绝」旧形上是端各自拼的两键合取,而三条窗词现在分得开、合并读回去等于把刚修好的判别力扔掉;⚠️ 公面型一律带 `View` 后缀 —— 本文件的 `GateOutcome`(决断腿结局)与 sdk 的 `GateOutcome`(引擎门记录)**同名不同义**,详见 §24c)· `isGateParkedToolEnd`(「这次调用没在这里结算」的**第二形**谓词:gate 缺席 + `errorCode:"gate.parked"`;端判这件事必须与 `isApprovalWindowExpiredGate` **两形合读**) · `readWireErrorCode`(B-037 候包件②:decide/取件失败上引擎 wire 机器码的单源读口,结构视图读不 `instanceof`;与本包铸的 `code` 是两个命名空间,详见 §24g)| suspended→decide→resume 环。🔴 **D-1 两元组 verbatim 回显**是字节级断言的安全不变量,端**不许重实现它的任何一段**。🔴 键空间边界(web [C1] d3 拦截):`gateIdentity` 四常量两函数只覆盖 HITL questionId/callKey 空间;seat 的 `TOOL_PERMISSION_REQUEST_ID_DOMAINS`(`plan:` 等)是另一键空间,**两者绝不合并**(合并=座位校验器静默拒全部 plan-review 卡) | `src/hitl/hitlBridge.ts`、`toolApprovalWire.ts`、`askGateWire.ts`、`planReviewWire.ts`、`hitlHostSurface.ts`、`gateIdentity.ts`、`armedGateRegistry.ts`、`parkOwnership.ts`、`parkResolver.ts`、`approvalsFeed.ts`、`frameRouter.ts`(**只挑名导出** `toolEndOutputText`/`ENGINE_ABORT_TOOL_RESULT`/`isAskTool`/`HITL_REJECT_MESSAGE`/`HITL_INTERRUPT_MESSAGE_FOR_TOOL_USE`)、`parkRowBirthWait.ts`、`approvalDecisionNoteAudit.ts`、`askParkRowRouting.ts`、`resumeRunningCard.ts`(#265 上收的判定层)、`persistedRulesWire.ts`、`localAllowRule.ts`(#244 F2 规则侧)、`crashConverged.ts`(L-38 崩溃收敛读面)、`src/gateOutcome.ts` |
|
|
150
150
|
| 4 | **子代 wire + 面板侧信道台账** | 87 | `tailEngineSubagent` · `installSubagentActivitySink` · `installSubagentTailMetaSink`(#280 件2:tail meta 帧发布口,`contentFrames` 判别位载体)· `stopEngineTask` + `classifyTaskStopConflict` · `fetchEngineSubagentReport` · `steerEngineSubagent`(0.32.0 未发布 #280 件A:additive 第三参 `childTaskId` —— 端有行上下文时**应当**传,传了就走「台账优先 / 缺席即诚实缺席 + `noteBgOwnerAbsence` 留痕」的 Q3 口径,与 tail·taskOutput·subagentOutput 三腿同姿势、与孪生 resume 腿共用同一个 `resolveOwnerRunId` 判据;**不传**则逐字维持旧行为=回落在飞 run)· `resumeSettledSubagent` + `resolveSubagentResumeContext` + `resolveOwnerRunId` + `classifySubagentResumeFailure` + `subagentResumeAvailable`(#242 批 2 A-028.7:resume 判定半场上收,与 steer 孪生同居;取址三态 = 台账有行用行值 / 指名了行但台账缺席则**诚实缺席绝不回落在飞 run** / 没指名行才回落。出路文案归端)· `recordSubagentOwnerFromProgress` + `getBgParentRunOwner`(A-028.6:「子代 → 宿主 run」**单表**,宿主 run 必须由持 stream-local 值的调用方显式传入,包内绝不从 `activeEngineRunId()` 推断)· `noteBgOwnerAbsence`(#242 批 3 [4000] Q3=B:tail/taskOutput·taskStop/subagentOutput 三腿台账缺席即诚实缺席**绝不回落在飞 run**,缺席 warn 留痕每 (腿,taskId) 一条)· `clearBgTerminalFacts`(#242 批 3 扫码修:复活=新周期,旧周期终态事实作废——fleetLedger 复活两腿按尾段清账,factsAccepted 方向核不再拿上周期终态当先例)· `auditRetainWithoutWake`([4000] Q5:引擎宣示 `subagentResume` + 本端在付 `retainSubagentSessions` + 端未实现 `wakeSubagent` ⇒ 响亮一条;`CLIENT_VERBS.wakeSubagent` 维持 fail-soft)· `subscribeSubagentContent` · `subscribeEngineAgentPanel` · `publishQuestionFrame` / `respondToQuestion` · `configureSubagentContentStore` / `subagentContentStoreConfig` / `SUBAGENT_CONTENT_STORE_DEFAULTS`(0.62.0:子代内容账本的**字节预算** —— 此前只有条数帽而单条无上限,一条 base64 工具结果就能让一个子代槽吃到十几 MB;越限从最早的内容开始丢并留一条可渲染的 `truncated` 记录,总帽淘汰整条最久未用的账本。配置面 fail-loud,详见 §26②)| 驱动与观测委派子代;经 module 级台账喂活体 agent/task 面板。全部**能力位 gate**(§5b) | `src/subagent/*.ts`、`src/subagentContentStore.ts`、`src/engineAgentPanelStore.ts`、`src/engineInlineTaskStats.ts`、`src/engineToolLabelStore.ts`、`src/liveQuestionStore.ts` |
|
|
151
151
|
| 5 | **fleet 投影** | 47 | `createFleetLedger` · `projectTasks` · `projectWorkflows` · `projectFleetAgentRows` · `readEngineActiveBgTasks` · `FLEET_TASK_VIEW_KEYS` · `escapeDisplayControlChars`(不可见字符可见化,行标签/描述消毒的共享底座)· `capForDisplay`(0.62.0:呈前**消毒 + 封长**的共用铸点 —— 先转义、后按转义结果封长,截点避开半截转义 token 与合法代理对;本包该族四处此前各写一份、其中三份顺序是反的,详见 §26⑦)· `wireCycleSeq` / `wireRetiredBy`(0.38.0 提货补投的 #261 §2 两位:代际号 = SendMessage 复活即 +1,**缺席 ≠ 第一代**;`retiredBy` 在场 = 这条终态是对账腿从 durable run 行投影出来的、**不是**发布方亲报 —— 幽灵行与正常收尾唯一的 wire 判据。两位都只在场才落键) | 老 `fleetClient` 那一刀的成品:**帧体归库、连接归端** —— 端持 SSE 连接,库做行投影 + 保留台账 | `src/fleet/fleetProjection.ts`、`src/fleet/fleetLedger.ts`、`src/fleetAgentPanelProjection.ts`、`src/fleetTaskDesc.ts` |
|
|
152
|
-
| 6 | **请求装配(上行唯一构造口)** |
|
|
152
|
+
| 6 | **请求装配(上行唯一构造口)** | 10 | `buildTaskRequest` · `REQUEST_FIELD_MATRIX` · `unregisteredRequestKeys` · `applyLiveRequestDefaults` · `taskNotificationToPrintFrame` | 两条车道(`interactive`/`print`)出站请求的**唯一**构造器;`unregisteredRequestKeys` 是可执行门 —— 端偷带一个未登记键上 wire 就红 | `src/request/taskRequest.ts`、`src/request/printNotification.ts` |
|
|
153
153
|
| 7 | **通知与 outstanding 台账** | 51 | `installNotificationQueuePort` · `normalizeTaskNotification` · `taskNotificationDedupKeyFromWire` · `registerOutstandingBgTask` / `registerOutstandingWorkflowRun` · `notificationQueuePortMisses` · `subscribeOutstandingWorkflows` · `outstandingDeliverableWorkflowCount` | `task_notification` 归一 + 去重 + 投递进宿主命令队列的**一把闸**;`outstandingDeliverableWorkflowCount()` 是 headless `-p` 的**退出门** · `classifyPeerNotification` / `renderPeerFrameTranscriptText` / `parsePeerFrameText` / `peerFrameDisplayName` + 三张闭集表(design/385,0.54.0:同一条 `task_notification` 车道上三条**引擎注入帧**的类型化投影 —— 判别位=载体在场而非 summary 文本,详见 §17) | `src/notifications.ts`(11 个 module 台账) |
|
|
154
154
|
| 8 | **工具结果卡** | 25 | `structuredToToolUseResult` · `readAsyncLaunchedAgentReceipt` · `wireOutputToBody` · `parseModelFacingBash` · `getPatchFromContents` · `toolEndResultToUserFrame` · `flattenToolOutput` | 铸端要渲的 `tool_result` 卡体,含客户端 diff hunk(唯一 runtime dep 的用处) | `src/toolResult.ts`、`src/printToolResultFrame.ts`、`src/diff/patch.ts` |
|
|
155
155
|
| 9 | **能力/旋钮 wire 门族** | 96 | `projectAgentsForWire` / `awaitTaskAgentsWire` · `hooksForWire` · `mcpConfigsToSpecs` · `ultracodeForRequest` · `resolveWebSearch` + `buildWebSearchEnv` · `attachmentsForRequest` · `projectEffectiveBody` · `classifySelfOrchestrationRefusal` / `stripSelfOrchestrationIntent` / `projectWorkflowsGate` / `SELF_ORCHESTRATION_RETRY_WITHOUT`(S-81,server 7.57.0:上面两条 stamp 腿的**背面** —— 半配置多租户形态下 server 把带 `selfOrchestration` / `settings.ultracode` 的提交 501 拒掉,判型/去键/caps 闸三处都是判定不是文案,详见 §13) · `engineCapsGeneration`(0.60.0,异源对抗复审 [medium] 逼出:caps 探测的**当代号**读口 —— 代际闸在 probe **返回之后**才跑,而宿主的读面 tee 是在 probe **内部**落地的 ⇒ 一次慢的旧探测能把上一台引擎的读数写回来。宿主在**起探测那一刻**抓号、tee 时交回 `{generation}`,陈旧那一发整只丢掉;不传 = 逐字节同行为,详见 §24e)| 逐功能的「引擎有没有这个能力 + 这个字段怎么上 wire」投影器,由 `buildTaskRequest` 组装。🔴 `hooksForWire()` 是 **fail-closed**:无 `SettingsPort` ⇒ 返回 `undefined`(信任门,不是取值) | 17 个 `src/*WireCaps.ts` + `src/scratchpadWireCaps.ts`、`src/hooksWireCaps.ts`、`src/goalStopHook.ts`、`src/websearch/searchProviderPresets.ts`、`src/selfOrchestrationDenial.ts`(S-81 拒绝判定层) |
|
|
156
156
|
| 10 | **headless / 部署旋钮 wire** | 61 | `parseSandboxArgv` / `sandboxRequestFields` · `parseLimitsArgv` / `limitsForPrint` · `resolveHeadlessFinalVerify` · `resolveHeadlessPermissionMode` · `resolveHeadlessInteractiveTools` · `armDetachCancel` + `detachCancelArm` + `isDetachArmed` · `withHeadlessR1Reconnect` | `-p`/headless 车道的 env+argv 旋钮。🔴 `detachWire` 是**拆**的补偿:判定与 cancel-arm 台账在库,信号路径的裸 fetch 留宿主(`detachCancelArm()` 是取件口) | `src/sandboxWire.ts`、`scenarioWire.ts`、`finalVerifyWire.ts`、`limitsWire.ts`、`interactiveToolsWire.ts`、`headlessPermissionModeWire.ts`、`headlessReconnectWire.ts`、`detachWire.ts` |
|
|
157
157
|
| 11 | **模型目录与预算** | 76 | `resolveModelCatalog` · `loadCatalogWithSources` · `PROVIDER_PRESETS` / `MODEL_FAMILIES` · `defaultMaxTokensFor` · `getLiveModelCatalog` / `setLiveModelCatalogRefresher` · `providerAuthMethods` / `beginDeviceCodeAuth` · `providerCatalogRows` / `providerCatalogRowDetail` / `providerPresetById`(#244 F4 族D A-028.17:46 家表的规范折表层 —— 全表不重排、诚实缺席「model id typed in」,cli 目录/web 向导同一份折表)· `TIER_ORDER` / `CC_TIER_ALIASES` / `isTier` / `resolveTierBinding`(A-028.18:档位词表+校验+fail-open 降档派生单源;settings 存储归宿主)· `resolveEntryVision` / `computeDeleteBlockers` / `computeDeleteWarnings`(0.38.0 #318 件③ 上收:Model Hub 供给面的三端公共判定 —— vision 生效值+来源三态、删除断链核(拒删+指路)、删除降级后果(照删但必说)。**零 IO**,读盘那半场留各端;`doc === null` 的两义在调用方分流) | 三层 provider 目录解析(线上 URL → 包内预设 → 用户覆盖)+ per-model `maxTokens` 封顶。线上腿需注入 `CatalogFetchJson`,缺席 ⇒ 整条不启用(`online.reason='no-fetch-port'`);缓存落盘经 `CatalogCachePort` | `src/model/{catalog,catalogLoader,providerAuth,providerPresets,providerCatalog,tierVocabulary}.ts`、`src/liveModelCatalog.ts`、`src/modelBudgetRule.ts`、`src/sessionModelLatch.ts`、`src/effortWire.ts` |
|
|
158
|
-
| 12 | **workflow 与后台工作视图** |
|
|
158
|
+
| 12 | **workflow 与后台工作视图** | 21 | `projectWorkflowRun` · `readWorkflowResumeAdmissionIncomplete`(0.68.3 CC-05:core 7.18.0 `resumeAdmissionIncomplete` 在场 = 不是 resume 基,与 `readWorkflowParks` 同一条投影义务)· `createLiveWorkflowSource` · `ensureWorkflowActivityLedger` · `readWorkflowActivityLedger` · `stopWorkflowActivityLedger` · `resetWorkflowActivityLedgers` · `createBackgroundView` · `projectBackgroundView` · `recordWorkflowAgentTaskId` · `agentDisplayStatus` | 活过一个 turn 的长任务读面:workflow run + 跨 session 后台任务归一表(`assistant.tasks` 与 fleet SSE **两源独立降级**) | `src/workflow.ts`、`src/workflowClient.ts`、`src/workflowMonitor.ts`、`src/agentSession/backgroundView.ts`(+ 纯类型 `src/agentSession/contract.ts`) |
|
|
159
159
|
| 13 | **座位 IPC 契约** | 34 | `LOCAL_SESSIONS_SPEC` · `SEAT_METHOD_NAMES` · `SEAT_EVENT_TYPES` · `isLocalSessionEvent` · `isToolPermissionRequest` · `toolPermissionRequestId` · `SEAT_VALIDATOR_KEY_COVERAGE` · `SEAT_SEND_MESSAGE_KEY_ORIGINS`(0.62.0:座位载荷**逐键出身**登记 —— 每个位要么写明转投哪个引擎请求位、要么写明为什么不上 wire;常驻门对**装在盘上的** sdk 型面逐名核,详见 §26③)| desktop↔web 座位 IPC 契约的**单一真源**(此前两边各一份、名字零重合 ⇒ 编译器永远不会告诉你它们漂了)。🔴 加 verb 忘了加 `LOCAL_SESSIONS_SPEC` **不报错**:preload 不注册 channel、渲染端读到 `undefined` | `src/seatContract.ts`(**零 import**,纯类型 + 常量 + 纯谓词)。🔴 **证据等级标注(0.42.0,test [5087] 的「语料**种类**缺口」/ cli [5088] 认领件)**:该文件里所有以「CC 如何如何」为形的断言(`212 methods` / `854-channel census` / 方法名逐字保留 / `fQe` 逐字段对照 / 一切 `.vite/build/index.chunk-*.js` 坐标)**证据等级 = 桌面 unpack,本地语料库不可复验** —— 本仓手边可复验的参照语料**只覆盖终端 CLI 形态**的静态产物,拿它去 grep 桌面壳里的符号只会零命中,而零命中在这里**既不证真也不证伪**。复核这些断言**不得**拿本仓语料当反证 |
|
|
160
|
-
| 14 | **宿主端口与会话槽** |
|
|
161
|
-
| 15 | **控制面与传输** |
|
|
160
|
+
| 14 | **宿主端口与会话槽** | 41 | `installHost` · `installHostFor` · `installCoreValuePorts` + 十读口 + 三存在性口(0.69.0 CC-07:core 值级面端口注入,Node 宿主装配根装、浏览器 lane 恒缺席)· `hostPortMisses(For)` · `DEFAULT_SESSION_KEY` · `hostEnv` · `unrefTimer` · `parseLocaleTag` / `pickUiLanguage`(#244 F4 族D A-028.20:locale tag 手术单源 + UI 语言判定;与 `resolveRegionHint` 双出口成文 —— 语言偏好域 en/zh ≠ 地址可达域 cn/intl/unknown,`zh-Hant` 前者 zh 后者 intl 是设计)· `engineNamespaceKeyFor` / `mergeSessionMapRecord` / `mergeEngineEntry`(A-028.12:会话 id 映射单一键形 + merge 判定;存储经 `SessionMapStorePort` 归端 —— cli 文件锁/原子写,web localStorage)| 进程/端级装配层(settings/fs/queue/timers/session/log/probe),与 per-turn 的 `AdapterContext` **分层**。头注的判定规则:**这个能力每 turn 都会变吗?** 会 ⇒ `ctx`;不会 ⇒ `installHost` | `src/host.ts`、`src/hostEnv.ts`、`src/sessionSlot.ts`、`src/unrefTimer.ts`、`src/env/{localeGeo,localeTag,uiLanguage}.ts`、`src/sessionMap.ts` |
|
|
161
|
+
| 15 | **控制面与传输** | 122 | `ControlRouter`(+ `ControlSafetyError`)· `fetchMcpPanel`(0.69.0:经 sdk `sessions.mcp` 取体 + 投视图,不裸 fetch)· `projectMcpPanel` + `mcpPanelLastLegDetail`(0.68.2 CC-03:`GET /v1/sessions/:id/mcp` 面板体防御读视图 + `lastLegMcp` 一行措辞铸点;缺席 = 键不铸、读不懂 = `lastLegMcpUnreadable`、禁与 `servers[]` 对账)· `makeEngineWireClient` + `resolveWireAuth` · `installEngineWireTarget` · `diagnoseSseIdleTear` / `isSseIdleError` · `attemptActiveRunSelfHeal` + `activeRunBusySignal` + `activeRunSelfHealRow` / `activeRunBusyHeadlessRow` · `kickEngineCapsProbe` / `engineCapTrue` / `invalidateEngineCaps(baseUrl, probe?)`(#307 S25:引擎温切后的 caps 生产失效口 —— kick 自带幂等闸,同 baseUrl 重启后不显式失效就永远读到旧引擎那一版能力位;调用方 = 壳的 respawn/restartEngine。🔴 **推荐两参形**:第二参给替代探测则「推进代际 + 注册新探测」在同一同步块内完成,失效与下一次 kick 之间那个「等待者读到未判」的窗按构造不存在;单参形保留给「只丢缓存、这一刻没有替代探测」的调用方,那种情形下读到未判是诚实结局) · `engineCapValue`(S-131,0.59.0:能力位的**四态**通用读口 `unobserved`/`not_reported`/`null`/`value` —— 既有三口把四种「读不出」全折成 fail-closed 一档,对**放行**问题是对的、对**读面/诊断**问题是错的:`null`(引擎明确说没有,正面事实)会与「老引擎不报」「还没探到」在屏上同形。`value` 位刻意不做形校验,形归各能力位自己的窄读器,详见 §23b)· `projectSqlEngineCapability` / `observedSqlEngine` / `noteEngineCapsForSqlEngine` / `forgetSqlEngineReading` / `sqlEngineDoctorDetail`(S-131,0.59.0:`Capabilities.sql`(server ≥7.60.0)的四态读面**从壳侧上收** —— 归层债,0.58.0 时它长在壳里正是因为包侧没有嵌套对象读口。🔴 **导出名与壳侧那份逐字同名 = drift-lock**;`txnMode: null` 是铸点域内的合法值不是畸形;换代失效口清成未观测而不是留旧值,详见 §23b)· `mapBrainStatusToRetry` · `waitForClaimRelease` + `CLAIM_RELEASED_STATES` / `CLAIM_HELD_STATES` · `atMostOnceFailureClass` / `readSteerDelivery` · `clearRunningChoiceOffer`(Inkglow-1085 P0b①:「Do nothing」登记的清口 —— 端的「重新打开操作菜单」入口;登记在场时 attemptActiveRunSelfHeal 不整卡重弹,not-parked 结局带 `alreadyOffered: true` 判别位,端据此降级渲一行)· `INTERACTIVE_WAY_OUT`(默认出路串单源)· `engineSessionParamFor`(design/285 批 0:`?session=` 派生的 **per-key** 形 —— `hostSessionFor(sessionKey)?.currentSessionId()` + [1501] 空串归一;零参 `engineSessionParam()` = 默认槽兼容层,取值链逐字等价)· `normalizeWirePrincipal`(A-028.10:principal 在场性 trim 原语 —— 全空白=缺席不发头,engineWireTarget 两臂/makeEngineWireClient/壳 livePrincipal 同尺)· `readSessionMemoryStatus` / `classifyMemoryStatusFailure` / `readCaptureOptOut` / `readLastCapture`(S-53 会话记忆姿态读面,0.48.0:失败分诊**码优先**——两个 404 分道 `not_found.session` / `not_found.route`,无码 404 不猜落 failed;五键逐键缺席语义两个合读器,`lastCapture` 三态的判别材料是 `committedCount` 不是本键;IO 归宿主注入 `MemoryStatusClientLike`,详见 §11) · `classifyTurnWireError` / `isWireTransportError` / `isPreStreamDrainingReject` / `isResumeAtRejection` / `drainingRetryDelayMs` / `scenarioDenyFromError` + `WIRE_NETWORK_ERROR_PATTERN`(A-028.11/.13:turn 错误分型判定半场,人话文案与渲染归端)· `resumeRetryLaterFromError`(L-102,0.57.0:resume 族**时间性拒绝**二码的判型半场 —— 这一族里唯一**带得出「等多久」**(`retryAfterSec`)的两个码。🔴 闭集**不是**「哪些码可以等」的名单:同族 `resume.row_recycling` 同样可等(窗口自清)只是没有秒数 ⇒ 本读口返回 `null` 只意味着没命中这两码,详见 §21) · `projectWriteProtectionCapability` / `observedWriteProtection` / `noteEngineCapsForWriteProtection` / `forgetWriteProtectionReading` / `writeProtectionDoctorDetail` / `projectWriteProtectionPosture` / `writeProtectionPostureDetail`(S-138,0.60.0:`Capabilities.writeProtection` (engine ≥7.63.0)的**四态**读面 + operator 面行表 —— 与上面 S-131 那一格**同构同纪律**。🔴 三位刻意不合成一个布尔;`not_reported` **不是**「这台部署没有写保护表」(座位缺席恰是缺省表在岗);逐行 name/kind 走**最小披露**只上 operator 面,详见 §24e)· `projectReadFacePosture` / `readFacePostureDetail` / `readFaceDisagreement`(S-167,0.61.0:operator 面 `diagnostics.wiring.readFace`(engine ≥7.65.0)的窄读器 —— 与上面S-138 那一格**同构同纪律**。🔴 三句「答不出来」逐字互异且没有一句等于「没有 READ 档」;`source` 按开集读;与租户面 `capabilities.readFace` 刻意不合流,只带一个纯比较函数,详见 §25)| 上行通道的**监管**半场(submit / steer / kill / 队列命令定序)+ 传输构造、caps 探测、SSE 断流分诊、**409 active-run 自愈** | `src/controlRouter.ts`、`steering.ts`、`sseIdleTriage.ts`、`retryStatus.ts`、`diagnostics.ts`、`engineWireSdk.ts`、`engineWireTarget.ts`、`src/principalWire.ts`、`src/wireErrorTriage.ts`、`engineSessionParam.ts`、`engineCapsCache.ts`、`liveInitToolFace.ts`、`adapter/activeRunSelfHeal.ts`、`src/sessionMemoryStatus.ts`、`src/writeProtectionCapability.ts`、`src/readFacePosture.ts` |
|
|
162
162
|
| 16 | **引擎词汇表与包自检** | 90 | `CONFIG_REFUSAL_CODES` / `isConfigRefusalCode` · `DECIDE_WORKFLOW_LANE_CODES`(+ 三个具名码;`/decide` workflow 车道,三条出路刻意不合并,详见 §30h)· `STOP_CONFLICT_CODES` · `isInterruptedToolEndCode` · `isRewindFamilyCode` · `CLIENT_VERBS` · `compensationSplitViolations` · `DELEGATION_CAP_CODES` / `isDelegationCapCode` / `DELEGATION_CONCURRENCY_CAP` / `DELEGATION_SESSION_CAP`(0.38.0 #318 件④:core 5.48.0 design/323 委派席位到限**两码,处置不对称禁合并** —— 并发帽=**可等**(兄弟结束即有位)/ 会话累计帽=**等也没用**(这条会话的配额用尽))· `CONFIG_DELEGATION_ENTRY_CAPS`(同批入 `CONFIG_REFUSAL_CODES` 识别表)· `delegationCapDispositionOf` / `MCP_SERVER_REVOKED`(0.39.0 载体到货消费件:core 5.50.0 补 `{ error: code, code }` 孪生拼法后两码真上 `tool_end.errorCode`,0.38.0「先立词不落消费分支」的已知局限自此解除;处置轴 `wait-for-slot` / `reuse-existing-or-await-reap` 机器可读(累计帽=retained-window 帐,行回收配额即回,处置=SendMessage 复用,**非**「换会话/永久耗尽」——0.38.0 段该句系勘误),未知 `delegation.*` 码 ⇒ `undefined`;`mcp.server_revoked` = 操作员 mid-session 吊销 server 后的工具面本地闸(被吊销的 server **名**今天不过 wire 境:detail.server 是进程内位,抬升腿只 lift code——归因渲染候 core 补 typed detail,已点名);载体门 = engine-vocab G3 腿锚 core dist 铸点)· `CAPABILITY_SELF_ORCHESTRATION_REQUIRED`(S-81,server 7.57.0:提交面的 selfOrchestration 准入拒绝码。🔴 **复用码** —— 与其它 `capability.*` 501 同体形而处置不同,消费点必须按**恰等**判、绝不放宽成前缀判;判型与「去键重发一次」归 `src/selfOrchestrationDenial.ts`,详见 §13) · `GATE_PARKED_ERROR_CODE`(0.60.0:「门把这次调用 park 了」的机读码单源 —— `frameRouter` 的连坐/中断判据与 `gateOutcome.isGateParkedToolEnd` 读同一个常量;真机黑盒直证 park 短路帧上**没有 `gate`**,这个码是那一形唯一的信号,详见 §24c)| 三端分臂共用的**去字面化** `errorCode` 词表(病根正是三端各抄一份字面);编译期 verb 闭合门;搬迁补偿登记表 | `src/engineErrorCodes.ts`(计数以 `scripts/public-export-baseline.json` 为准,别手抄;A-028.11/.13 补 `DRAINING_ERROR_CODE`/`SCENARIO_NOT_ALLOWED_ERROR_CODE`/`RESUME_AT_ERROR_CODE_PREFIX`;#318 件④ 补 `delegation.*` 族四位 + `config.delegation_entry_caps`;0.39.0 补三新码消费件三位);S-81 补 `capability.self_orchestration_required` 一位;L-102 补 `resume.*` 时间性拒绝二码 + 闭集 `RESUME_RETRY_LATER_CODES` 三位)、`src/classifierVerdictWire.ts`、`src/compensations.ts`、`src/clientSlice.ts`;**0.67.0 补锚**(这三件的导出一直计在本域,而本表此前没有它们的锚行 —— 如实补上,不是搬家):`src/gateVocabulary.ts`(`GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail` + 🆕 `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`,详见 §32d)、`src/autoModeUnavailable.ts`(`AUTO_MODE_UNAVAILABLE_CAUSES` + 🆕 `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`;🔴 同批**删**`classifierUnavailableOf`/`classifierUnavailableDetail`,详见 §32b)、`src/classifierStatus.ts`(`CLASSIFIER_STATUS_STATES`/`classifierStatusOf`/`classifierStatusDetail`)|
|
|
163
163
|
|
|
164
164
|
🔴 **`engineErrorCodes` 的开集纪律**(该文件头注逐字):这些 `ReadonlySet` / 前缀谓词一律是**识别表**,
|
|
@@ -4621,7 +4621,7 @@ an argument」。audience 答另一问:这条事实**说给谁听**。
|
|
|
4621
4621
|
**签名**
|
|
4622
4622
|
|
|
4623
4623
|
```ts
|
|
4624
|
-
ENGINE_NOTICE_CODES: readonly string[] //
|
|
4624
|
+
ENGINE_NOTICE_CODES: readonly string[] // 56 码,顺序同源
|
|
4625
4625
|
ENGINE_NOTICE_AUDIENCE: Readonly<Record<string, 'user' | 'operator'>>
|
|
4626
4626
|
noticeAudienceOf(code: unknown): 'user' | 'operator'
|
|
4627
4627
|
engineNoticeInCatalog(code: unknown): boolean
|
|
@@ -7608,3 +7608,312 @@ body 键 `memoryCapture?: "off"` —— **单成员闭集,没有 `"on"`**。修
|
|
|
7608
7608
|
| 3 | `steering.parked_input_blocked`(park 腿的**通告**,不是拒绝码) | **n-a** | 它是 `engine_notice` 码册里的一员、不是 `steering.*` 拒绝族;本路由器调的是 live 腿,park 腿结构性不可达。通告面读点另在 `src/engineNoticeCodes.ts`,本批不动 |
|
|
7609
7609
|
| 4 | 中途翻转 verb `POST /v1/runs/:id/memory/capture-optout` + 能力位 `runMemoryCaptureOptOut` | **n-a**(本批) | 那是**动词面**(需要 run 属主门 + 活流句柄),不在请求构造面上;本批补的是它 409 时**指路**的那个声明键。端按能力位渲入口的纪律不变(假 affordance) |
|
|
7610
7610
|
| 5 | `memoryCapture` 坏拼写 400 `request.field_invalid` / core `config.memory_capture_spelling` | **n-a** | server 是权威校验方,本层不预铸第二判官;但也不替它买路(`'on'` / 表外拼写整键不 stamp) |
|
|
7611
|
+
|
|
7612
|
+
---
|
|
7613
|
+
|
|
7614
|
+
## §35 🆕 0.68.2 内容批(L-318 判决单源 / L-316 memoryCapture 单铸点 / L-61 件④ SDK 纯工具面转口)
|
|
7615
|
+
|
|
7616
|
+
### 35a. 本节速览
|
|
7617
|
+
|
|
7618
|
+
| 件 | 一句话 | 端要做什么 |
|
|
7619
|
+
|---|---|---|
|
|
7620
|
+
| S-1 🔴 **归层** | `text_end` 权威段替换的**六形判决**从「本包一份 + 每个端各一份」收成**一只纯函数** `resolveTextSegmentAuthority`。0.68.1 落的是交互车道那一份(`textStream.replaceAnswerSegment`),而 `-p` / web / desktop 这种**自己缝 delta 成帧**的车道拿不到那只段缓冲 ⇒ cli 1.0.114 在壳里逐形又写了一遍(B-122)。现在两边吃同一只 | **自己缝合 delta 的端**:把自写的六形判据换成 `resolveTextSegmentAuthority(content, { committedPrefix, openSegment })`,按回执的 `form` 分三支(`untouched` 什么都不做 / `replace_tail` 换尾段 / `withhold` 一个字节都不交 + 如实披露)。只渲 transcript 平面的端**零改动** |
|
|
7621
|
+
| S-2 | print 形车道的**段账状态机** `createTextSegmentLedger` 进包(已出门前缀跨卡累加 / 三处清账 / 被扣段终局判重) | 有「把叙述搭在工具卡帧上先发走」这条腿的端换用它,别再自持 `flushedPrefix` / `withheld[]` 两本账 |
|
|
7622
|
+
| S-3 | `memoryCaptureDeclarationField(declared)` —— 会话级隐私声明的**字面唯一铸点**(L-316) | 端交**意图位**(布尔),值由本层铸;端上不许再出现 `memoryCapture: 'off'` 字面量 |
|
|
7623
|
+
| S-4 | `engineHttpTools`:SDK 纯工具面 `engineUrl` / `probeHealth`(+ 型 `ProbeHealthResult`)**原样转口** | 只为取这两件而直连 `@sema-agent/sdk` 的端改经本包;🔴 **原样**转口(同一函数引用),端别在外面包一层 |
|
|
7624
|
+
| S-5 | `sdkWireTransit`:SDK **wire 面**转口(客户端类 `AgentClient` + 流内审批帧谓词两只 + 端上存量用到的那一小撮 wire 型面) | 存量直连改经本包;🔴 **新码不要用它** —— 新码走本包自有的 `makeEngineWireClient`,本转口口只给存量(理由与射程见 §35e) |
|
|
7625
|
+
| S-6 🔴 **归层** | **段身份铸点归包**(CC-01,cli L-314 壳侧对位):committed assistant **文本**转录行顶层盖 `_sema_segment_id`,`text_segment_end` 帧带同值 `segmentId`。此前由壳在自己的过境口自铸(先壳后包),本包 diff 门对壳树当场红 | **持有转录、要按 `committedPrefixLen` 换掉已提交那截的端**:认行改用**两把钥匙**(行 `uuid` ∧ 行上 `_sema_segment_id === 事件.segmentId`);自铸段身份的壳退成只读包盖的键;字面量读 `SEMA_SEGMENT_ID_KEY`(§35f) |
|
|
7626
|
+
| S-7 | **`/mcp` 面板读视图归包**(CC-03;server ≥7.77.0 S-297 可选键 `lastLegMcp`;A-093 ③):`projectMcpPanel(body)` + `mcpPanelLastLegDetail(view, { reachable })` | 渲 `GET /v1/sessions/:id/mcp` 的端经本包读,壳只渲**并排两块**;🔴 禁与 `servers[]` 对账渲「不一致」(契约 G.7 ④)(§35g) |
|
|
7627
|
+
|
|
7628
|
+
**共同形**:这一批四件都不是「新能力」,是**同一句话在几层里各说了一遍**。S-1/S-2 是判决与状态机,
|
|
7629
|
+
S-3 是一个字面量,S-4 是一个 builder。收编的判据也只有一条:**源码里还有没有第二个算式** ——
|
|
7630
|
+
所以本批的门(`run-segment-authority-single-source-test.mjs` ⑥ 段)锚的是「剥注释后的源码里那条
|
|
7631
|
+
判据串零命中」,而不是「行为还对不对」(两份独立实现对同一输入本来就会给同一答案,行为面
|
|
7632
|
+
对「有没有第二份真相」零判别力)。
|
|
7633
|
+
|
|
7634
|
+
**出处**:cli 审计 A-093 的同族结论(「壳不该持有第二份真相」)+ L-318 / L-316 / L-61。
|
|
7635
|
+
|
|
7636
|
+
---
|
|
7637
|
+
|
|
7638
|
+
### 35b. S-1 判决单源 `resolveTextSegmentAuthority`
|
|
7639
|
+
|
|
7640
|
+
```ts
|
|
7641
|
+
import { resolveTextSegmentAuthority } from '@sema-agent/client-core'
|
|
7642
|
+
|
|
7643
|
+
const v = resolveTextSegmentAuthority(textEnd.content, {
|
|
7644
|
+
committedPrefix, // 本段**已经撤不回**的那一截(跨工具卡/消息边界**相加**,不是二选一)
|
|
7645
|
+
openSegment, // 本段还押在端手里、可以改的那一截
|
|
7646
|
+
})
|
|
7647
|
+
switch (v.form) {
|
|
7648
|
+
case 'untouched': break // (d)/(f):本端零经手 ⇒ 什么都不做
|
|
7649
|
+
case 'replace_tail': replaceUnsent(v.tail); break // (a)/(b1)/(c)/(e)
|
|
7650
|
+
case 'withhold': dropUnsent(); disclose(v.committedPrefixLen); break // (b2)
|
|
7651
|
+
}
|
|
7652
|
+
```
|
|
7653
|
+
|
|
7654
|
+
🔴 三条**必须照搬**的纪律(每一条都是 0.68.1 异源对抗复审实抓出来的):
|
|
7655
|
+
|
|
7656
|
+
1. **判据锚是 `content.startsWith(committedPrefix)`,不是「有没有 flush 过」**。后者是前置条件;
|
|
7657
|
+
锚错会把一条**完全正常**的 b1(前缀对得上)判成 b2,把用户的终答整段扣掉还附一条错的披露行。
|
|
7658
|
+
2. **`committedPrefixLen` 的单位是 JS 字符串长度(UTF-16 代码单元)**,不是 UTF-8 字节、也不是
|
|
7659
|
+
「几条消息/几条帧」。按字节截会在任何非 ASCII 正文上截错位置——把要脱的那一段**原样留在屏上**
|
|
7660
|
+
还附带乱码。
|
|
7661
|
+
3. **`committedPrefix` 必须是相加后的那一份**。openai 车道的 `text_end` 在 `finalize()` 里才发,
|
|
7662
|
+
而工具卡先执行 ⇒ 一段散文可以跨过两张卡、每张带走一截;少算任何一截,判据就会在没分歧的
|
|
7663
|
+
常态上误判。
|
|
7664
|
+
|
|
7665
|
+
⚠️ **本包自己的落账没有变**:`textStream.replaceAnswerSegment` 的 handOffOnly(段跨过包侧消息
|
|
7666
|
+
边界、且已提交那截自己也过期 ⇒ 只发信号、不动任何既有行为)、活体尾巴重算、封存、终答补差账
|
|
7667
|
+
同步——**一行未动**。判决归一,落账不归一:两条车道的账本按**不同的边界**切(消息 vs 帧),
|
|
7668
|
+
把落账也归一就是改掉其中一条车道的既有行为。
|
|
7669
|
+
|
|
7670
|
+
---
|
|
7671
|
+
|
|
7672
|
+
### 35c. S-2 print 形段账 `createTextSegmentLedger`
|
|
7673
|
+
|
|
7674
|
+
四个动作,对应端上四个真实发生的事实:
|
|
7675
|
+
|
|
7676
|
+
| 动作 | 什么时候调 | 不调的后果(都实测过) |
|
|
7677
|
+
|---|---|---|
|
|
7678
|
+
| `noteFlushed(text)` | 叙述搭上 tool_use 那条 assistant 帧发走的那一拍 | 前缀少算 ⇒ 正常段被误判成 b2 |
|
|
7679
|
+
| `applyTextEnd(content, openSegment)` | 引擎明说段结束 | —— (本体) |
|
|
7680
|
+
| `closeSegmentAccount()` | ① durable 整块 `text` 臂取代本车道的段;② 模型轮收口(`turn_end`);③ 终局 flush | ② 不清账 ⇒ 引擎省掉 `text_end` 又继续下一轮时,**下一轮的正常终答被整段清掉** |
|
|
7681
|
+
| `repeatsWithheldSegment(candidate)` | 终局零 delta 兜底臂开火前 | 同一段话上屏两遍(前半截还留着两个版本) |
|
|
7682
|
+
|
|
7683
|
+
🔴 `repeatsWithheldSegment` 的判据是**规范化(`trim`)后逐字相等**,不是子串关系:短串碰撞会
|
|
7684
|
+
**误挡**(另一段独立终答只要提到同一个脱敏标记就被整条挡掉),而引擎的 `assembleResult` 会 trim
|
|
7685
|
+
最终正文 ⇒ 子串关系又会**漏挡**。
|
|
7686
|
+
|
|
7687
|
+
🔴 本台账**不持有正文块**:块对象身份锚(封存点属于哪一个块)留在端上——那是 CC 帧形的事。
|
|
7688
|
+
|
|
7689
|
+
---
|
|
7690
|
+
|
|
7691
|
+
### 35d. S-3 `memoryCaptureDeclarationField` / S-4 `engineHttpTools`
|
|
7692
|
+
|
|
7693
|
+
```ts
|
|
7694
|
+
// S-3:端只交意图位,值由本层唯一铸(拼错的隐私声明由 buildTaskRequest 响亮拒,不静默删键)
|
|
7695
|
+
// 🔴 **求值时刻属端,而且不是随便挑的**:这一位是**时效键**(会话级、单向、不可逆),必须与
|
|
7696
|
+
// 「这一发提交到哪条会话」**同一拍**求值。cli 的落点是它的出站转换函数(与 capturedSessionId
|
|
7697
|
+
// 同拍),**不是**请求构造那一刻 —— 构造完到提交之间有真实等待窗(就绪门 / 退避 / 后台请求跨
|
|
7698
|
+
// `/resume`),窗内换了会话就会把 A 的声明写到 B 头上(本批异源对抗复审 r2 [high] 实复现)。
|
|
7699
|
+
Object.assign(outgoingBody, memoryCaptureDeclarationField(declaredForCurrentSession()))
|
|
7700
|
+
|
|
7701
|
+
// S-4:原样转口(同一函数引用;端别在外面包一层)
|
|
7702
|
+
import { engineUrl, probeHealth, type ProbeHealthResult } from '@sema-agent/client-core'
|
|
7703
|
+
```
|
|
7704
|
+
|
|
7705
|
+
🔴 S-3 的 `false` ⇒ **整键缺席**,不是 `{ memoryCapture: undefined }`、更不是某个「on」值:
|
|
7706
|
+
wire 上压根没有那个值(单成员闭集),缺席**就是**「照常采集」的唯一写法。
|
|
7707
|
+
|
|
7708
|
+
🔴 S-4 为什么可以做**值级**转口,而 core 的同类件不能:可移植门对包总入口做外部包**等值集** +
|
|
7709
|
+
`--platform=browser` 真打包。`@sema-agent/sdk` **本来就在**等值集里,且 SDK 的 `dist/health.js`
|
|
7710
|
+
实测**零 import**(传输走全局 `fetch` = web 标准);`@sema-agent/core` 的 barrel 值级拉
|
|
7711
|
+
`node:crypto`/`node:fs`/`node:path`,一条那样的边会把整台引擎焊进 web/desktop 的产物 ⇒ core 那一族
|
|
7712
|
+
只能走**端口注入**形(`hitl/editedRuleTextPrecheck.ts` 的先例)。分界线是「这个外部包在不在等值集里」,
|
|
7713
|
+
不是「它是不是纯函数」。
|
|
7714
|
+
|
|
7715
|
+
---
|
|
7716
|
+
|
|
7717
|
+
### 35e. S-5 SDK wire 面转口 `sdkWireTransit`(L-61 存量清零)
|
|
7718
|
+
|
|
7719
|
+
```ts
|
|
7720
|
+
import { AgentClient, isApprovalRequestFrameV1, type AgentEvent } from '@sema-agent/client-core'
|
|
7721
|
+
```
|
|
7722
|
+
|
|
7723
|
+
🔴 **为什么是「原样转口」而不是「包一层」**:包一层就把「同一实现/同一型」这条唯一的抗漂移保证
|
|
7724
|
+
亲手拆掉。门(`run-segment-authority-single-source-test.mjs` ④/④b 段)按 **同一函数引用**(`===`)
|
|
7725
|
+
断言,不是「能调通」。
|
|
7726
|
+
|
|
7727
|
+
🔴 **射程边界(写明,别当成 SDK 全量镜像)**:型面只收端上**存量**实际用到的那些名字;权威恒是
|
|
7728
|
+
`@sema-agent/sdk`,本转口口是别名 —— 上游改名时红在**一处**,而不是散在九个端文件里。
|
|
7729
|
+
|
|
7730
|
+
🔴 **新码不要用这一口**:本包自有的 `makeEngineWireClient` 才是推荐姿势(它带本包的 wire 目标解析
|
|
7731
|
+
与鉴权装配)。转口口存在的唯一理由是让**存量**有一条「经包」的路,而不是给新码开一扇直连 SDK 的门。
|
|
7732
|
+
|
|
7733
|
+
---
|
|
7734
|
+
|
|
7735
|
+
### 35f. S-6 段身份 `_sema_segment_id` / `segmentId`(CC-01)
|
|
7736
|
+
|
|
7737
|
+
**语义一句话**:一个身份覆盖「上一次段收口 → 本次段收口」之间过境的**全部** committed assistant 文本行。流开场一个初值;idle-flush 提交的半段与终态提交的同段**共享**一个身份(归属正要这个);`text_segment_end` 帧带的是轮换**前**的那个(与它盖过的行同值);臂处理完之后轮换;思考→回答边界**不**轮换;子流(带 `parentToolCallId`)的段边界不轮换。
|
|
7738
|
+
|
|
7739
|
+
**形**:派生自窗口首帧锚 + 窗口序号(`idOf(anchor, 'segment<n>')`)⇒ **同流重放同身份**(与行 `uuid` 同一条确定性纪律);锚缺席那一形(durable 整条消息先于任何增量到达)退到 `ctx.uuid()` 并**缓存一次**。
|
|
7740
|
+
|
|
7741
|
+
**铸点唯一** = `adapt()` 的出口(`TextStream.stampSegmentIdentity`):durable 整条消息(`assistant` 臂)与流式分段(M1 提交口)两条腿都从那里过。🔴 **只盖尾块是 `text` 的 assistant 行**:思考块、只带 `tool_use` 的行、chrome 事件一个字节不动;就地盖不复制(台账/宿主持有的引用仍是同一条)。
|
|
7742
|
+
|
|
7743
|
+
🔴 **它是转录格式键,不是 wire 键**:只落宿主转录,不进 provider 请求(顶层自铸键不外溢,与 `_sema_degraded` 同律)。缺席 = 「这条不属于任何引擎段」,不是「属于某个未知段」。
|
|
7744
|
+
|
|
7745
|
+
**端的义务**(持有转录并做权威替换的端;只渲活体流的端零义务):
|
|
7746
|
+
```ts
|
|
7747
|
+
import { SEMA_SEGMENT_ID_KEY } from '@sema-agent/client-core'
|
|
7748
|
+
// text_segment_end 到达且 committedPrefixDiverged 时,认「这一段交出去的那一行」:
|
|
7749
|
+
const mine = row.type === 'assistant' && row.uuid === committedUuid && row[SEMA_SEGMENT_ID_KEY] === ev.segmentId
|
|
7750
|
+
// 缺席即否:没盖过段身份的行永远不是这一段交的那一份(按字节相等找行会被同后缀的独立行冒充)
|
|
7751
|
+
```
|
|
7752
|
+
自铸段身份的端(cli ≤1.0.114 `stampSegmentIdentity`)退成**只读**包盖的键 —— 两个铸点会让归属两把钥匙对不上。
|
|
7753
|
+
|
|
7754
|
+
**判据**:`run-text-segment-authority-test.mjs` G 段(38 格;变异三发:去臂后轮换 / 出口不盖 / 盖到 tool_use 尾块,各红);diff 门对 cli 1.0.114 树由红转绿(段身份按结构别名归一)。
|
|
7755
|
+
|
|
7756
|
+
---
|
|
7757
|
+
|
|
7758
|
+
### 35g. S-7 `/mcp` 面板读视图 `projectMcpPanel`(CC-03)
|
|
7759
|
+
|
|
7760
|
+
```ts
|
|
7761
|
+
import { projectMcpPanel, mcpPanelLastLegDetail } from '@sema-agent/client-core'
|
|
7762
|
+
const view = projectMcpPanel(body) // body = GET /v1/sessions/:id/mcp 的 200 体(unknown)
|
|
7763
|
+
const line = mcpPanelLastLegDetail(view, { reachable }) // 一行措辞唯一铸点(五句逐字互异)
|
|
7764
|
+
```
|
|
7765
|
+
|
|
7766
|
+
**缺席语义逐键**:
|
|
7767
|
+
| 键 | 在场 | 缺席 |
|
|
7768
|
+
|---|---|---|
|
|
7769
|
+
| `view` 本身 | 面板体读得出(`asOf` 非空串 ∧ `servers` 是数组 ∧ 非空输入至少一行幸存) | 必填位坏 / 非空零幸存 ⇒ `undefined`(「我读不出来」不是「我知道是零」) |
|
|
7770
|
+
| `servers[]` 行 | `name` + `status` 必需(`status` **按开集读**);`serverInfo` / `toolNames` / `error` 逐键挑,形坏只丢该键 | 坏行只丢自己;`[]` = 一台都没配(正面事实) |
|
|
7771
|
+
| `degraded` | `true`(never false)= materialize 超时/失败,`servers` 空但**不是**「没有 MCP」 | 正常 materialize |
|
|
7772
|
+
| `lastLegMcp` | `{ runId, at, mcp[] }`;`mcp[]` 与 `wiring_manifest` 第三段**同一只读器**(`projectMcpSection`,同形同缺席律) | server 三形同形(新会话 / 最近腿账本行在保留窗外 / 该腿没推 manifest)**或**引擎 <7.77.0 —— 视图不铸键,「为什么缺席」不猜 |
|
|
7773
|
+
| `lastLegMcpUnreadable` | `true`(never false)= server 送了 `lastLegMcp` 但本视图读不出(`runId`/`at` 非非空串、`mcp` 读不出一行、值是 null) | 缺席 = 没这回事 |
|
|
7774
|
+
|
|
7775
|
+
🔴 **两面合法可不同**(契约 G.7 ④;server 判据 LL-2):`servers[].name` 与 `lastLegMcp.mcp[].name` 是两张表(部署缺省场景 vs 按请求注入的名册),视图上**没有**任何「一致/不一致」位,五句措辞没有一句提到 `servers`。端渲并排两块,不对账。
|
|
7776
|
+
|
|
7777
|
+
**五句措辞**(黑盒锚,逐字互异):① 在场 `last leg mcp: <名册, 封顶 8 个 +N more> (run <runId>, at <at>)`;② `reachable:false` ⇒ 「not observed」;③ 面板体读不出 ⇒ 「unreadable (the MCP panel body …)」;④ 整键缺席 ⇒ 「not reported (no leg in the retention window, no manifest on the last leg, or the engine predates it)」—— 不武断咎为版本;⑤ 在场读不懂 ⇒ 「unreadable (the engine sent a shape …)」。
|
|
7778
|
+
|
|
7779
|
+
**传输口**:本批只收读视图;取面板体的 HTTP 口候 sdk 9.4.0(`McpStatusPanel.lastLegMcp?` 型面 + 若带客户端方法则换钉),未带前端经 sdk 基座 GET 取体、交本函数读。
|
|
7780
|
+
|
|
7781
|
+
**判据**:`run-mcp-panel-projection-test.mjs`(59 格;sdk `openapi.yaml` `McpStatusPanel` required `[asOf, servers]` 真字节;变异三发:读不懂折缺席 / 措辞对账 / 不走同一读器,各红)。
|
|
7782
|
+
|
|
7783
|
+
---
|
|
7784
|
+
|
|
7785
|
+
### 35z. 逐键处置表(0.68.2)
|
|
7786
|
+
|
|
7787
|
+
| # | 键 / 面 | 处置 | 坐标 / 理由 |
|
|
7788
|
+
|---|---|---|---|
|
|
7789
|
+
| 1 | `text_end` 六形判决(`startsWith` 锚 / UTF-16 单位 / 前缀相加) | **consumed** | `src/adapt/textSegmentAuthority.ts` 的 `#resolveTextSegmentAuthority`;`src/adapt/textStream.ts` 的 `#replaceAnswerSegment` 改调它;门 `run-segment-authority-single-source-test.mjs` ①/①'/⑥ |
|
|
7790
|
+
| 2 | print 形段账(前缀累加 / 三处清账 / 被扣段判重) | **consumed** | `src/adapt/textSegmentAuthority.ts` 的 `#createTextSegmentLedger`;门 ② 段 |
|
|
7791
|
+
| 3 | `textStream` 的 handOffOnly(跨包侧消息边界只发信号) | **declined**(刻意不归一) | 它是**交互车道专属的落账语义**(0.68.1 轮五 finding② 的基线对照结论);print 车道的 stdout 只进不退,没有那一形。归一 = 改掉一条车道的既有行为 |
|
|
7792
|
+
| 4 | `memoryCapture: 'off'` 字面铸点 | **consumed** | `src/request/taskRequest.ts` 的 `#MEMORY_CAPTURE_OFF` / `#memoryCaptureDeclarationField`;门 ③ 段 |
|
|
7793
|
+
| 5 | 中途翻转 verb `POST /v1/runs/:id/memory/capture-optout` | **pending**(L-286②) | 仍是包侧缺口:七种 typed 结局的处置表是三端公共判定,归本包;本批只收声明形的铸点 |
|
|
7794
|
+
| 6 | `engineUrl` / `probeHealth` / `ProbeHealthResult` | **consumed** | `src/engineHttpTools.ts`(原样 re-export);门 ④ 段(同一函数引用) |
|
|
7795
|
+
| 7 | SDK `AgentClient` 类本体 + 流内审批帧谓词 | **consumed**(改口) | `src/sdkWireTransit.ts`(原样 re-export)。**改口的理由**:此前记 declined,理由是「转口一个客户端类 = 本包为它的连接姿势/鉴权头/重试语义背书」——那条顾虑**仍然成立**,但它指向的是「端该不该直接 new 一个 `AgentClient`」这个**设计问题**,而把它与「这条 import 该不该经本包」这个**归层问题**绑在一起,代价是归层被一个未排期的设计件无限期挡住(cli 存量窗已因此过期两代;clay 令 C-R43「所有欠账绝不延期」)。⇒ 分开处理:归层现在做,设计件照旧欠着 —— 新码一律走本包自有的 `makeEngineWireClient`,转口口**只给存量**用(写在模块头注里,不靠人记得) |
|
|
7796
|
+
| 8 | SDK wire **型面**(`AgentEvent` / `TaskRequest` / `SemaSettings` / `SkillSpec` / `RunReceipt` / `CancelAck` / `RunRecord` / `ToolApprovalRespondAck` / `FleetTaskRow` / `FleetWorkflowRow` / 审批帧五型) | **consumed**(射程写明) | `src/sdkWireTransit.ts` 的 `export type` 段。🔴 **只收端上存量实际用到的那些名字,一个不多** —— 全量镜像是另一件事(会把本包 `.d.ts` 与 SDK 每一次型面改动绑死),与 `@sema-agent/agent-types` 的 **CC 形**全量镜像也不是一回事。权威恒是 SDK 本身;本文件是别名,上游改名 ⇒ 这里当场编译红(红在一处,不是散在九处)|
|
|
7797
|
+
| 9 | `@sema-agent/core` 的**值级**面(cli `core-value` 桶 4 条:`resolveAutonomousLoopPrompt` / `loosenReasons` / `combinePolicies`+`createAllowDenyPolicy` / `MCP_NAMESPACE`+`RETIRED_TOOL_NAMES`+`protocolOf`+`ruleToolGrammarOf`+`validatePermissionRules`) | **blocked**(上游缺口,逐条签名见 cli 回执) | 🔴 **结构性挡死,不是没排期**:core 的 barrel 值级拉 `node:crypto`/`node:fs`/`node:path`,而本包的可移植门是外部包**等值集** + `--platform=browser` 真打包 ⇒ 值级 re-export 会把整台引擎焊进 web/desktop 产物。唯一可用形 = **端口注入**(`hitl/editedRuleTextPrecheck.ts` 先例:包声明端口 + 诚实缺席读口,宿主装 core 的真实现),但它要求宿主有一个**可登记的装配根** —— 那是 cli 侧的决策(装在哪个文件、那个文件的 core 直连怎么登记),不是本包能单方面解的 |
|
|
7798
|
+
| 10 | 段身份 `_sema_segment_id`(转录行顶层)/ `segmentId`(`text_segment_end`) | **consumed** | `src/adapt/textStream.ts` 的 `#SEMA_SEGMENT_ID_KEY` / `#stampSegmentIdentity` / `#rotateSegmentIdentity`;`src/adapt.ts` 的 `#adapt` 出口;`src/adapt/arms.ts` 的 `#textSegmentEndArm`;门 `run-text-segment-authority-test.mjs` G 段;`docs/type-superset.json` 登记 |
|
|
7799
|
+
| 11 | 壳侧自铸段身份(cli `upstreamBridge.stampSegmentIdentity`) | **declined**(退役归端) | 铸点唯一在包;cli 1.0.115/1.0.116 退成只读(cli L-322) |
|
|
7800
|
+
| 12 | `/mcp` 面板体 `asOf` / `servers[]` / `degraded` | **consumed** | `src/mcpPanel.ts` 的 `#projectMcpPanel`;门 `run-mcp-panel-projection-test.mjs` A/B/D/E 段 |
|
|
7801
|
+
| 13 | `/mcp` 面板可选键 `lastLegMcp{runId,at,mcp[]}`(server 7.77.0 S-297) | **consumed** | 同上 `#projectLastLeg`;`mcp[]` 走 `src/adapter/downstream/eventToSdkMessage.ts` 的 `#projectMcpSection`(转公面);缺席 = 键不铸、读不懂 = `lastLegMcpUnreadable` |
|
|
7802
|
+
| 14 | `lastLegMcp` 与 `servers[]` 的对账/告警位 | **declined**(契约 G.7 ④) | 两面合法可不同;视图零对账位、措辞不提 servers;门 F/G6 段 |
|
|
7803
|
+
| 15 | 面板体的 HTTP 传输口(sdk 客户端方法) | **pending**(候 sdk 9.5) | sdk 9.4.0 无该端点调用口;带则换钉,否则本包经 sdk 基座 GET 转口(独立小件) |
|
|
7804
|
+
| 16 | `reasoning_end` 权威段(server 7.77.0 S-310;sdk 9.4.0 `SegmentEndFields`) | **pending**(CC-02,0.68.3) | 本包 thinking 块接 `text_end` 同一套替换律;随 sdk 9.4.0 换钉同批 |
|
|
7805
|
+
|
|
7806
|
+
### 35y. 🔴 三端升级必读(固定段式,[C295];本批**四条**)
|
|
7807
|
+
|
|
7808
|
+
1. 🔴 **段身份归包(S-6)**:`text_segment_end` 事件新带**必在** `segmentId`(与既有 `eventId` 不同:一个是本包段身份,一个是引擎事件身份),committed assistant **文本**转录行顶层新带 `_sema_segment_id`(本包在 `adapt()` 出口盖;思考块 / 只带 `tool_use` 的行 / chrome 事件一个字节不动)。
|
|
7809
|
+
· **持有转录并做权威替换的端**(cli):认「这一段交出去的那一行」改用**两把钥匙** —— 行 `uuid` ∧ 行上 `_sema_segment_id === ev.segmentId`,缺席即否;自铸段身份的壳退成**只读**包盖的键(两个铸点会让两把钥匙对不上)。
|
|
7810
|
+
· **只渲活体流的端**(web / desktop 当前形)零义务,但落盘转录时请**原样保留**该键(只加不减)。
|
|
7811
|
+
· 既有三键(`diverged` / `committedPrefixDiverged` / `committedPrefixLen`)与 §34e ① 义务一字未变。
|
|
7812
|
+
2. **`/mcp` 面板经包读(S-7)**:渲 `GET /v1/sessions/:id/mcp` 的端改调 `projectMcpPanel(body)`,那一行措辞由 `mcpPanelLastLegDetail(view, { reachable })` 出(五句逐字互异);并排两块,**不对账**。未渲面板的端零义务。
|
|
7813
|
+
3. **print 形宿主用 `createTextSegmentLedger` 不自拼(S-2)**:`-p` / web / desktop 这类自己缝 delta 成帧的车道,已出门前缀、三处清账、被扣段判重三本账全在包里;端只留「尾段写进哪个 content block」。
|
|
7814
|
+
4. **`memoryCaptureDeclarationField` 的求值在提交那一拍(S-3)**:它是时效键(会话级、单向、不可逆),端在 `buildTaskRequest` 调用那一拍取意图位,不在会话构造时冻结;转口两模块(`engineHttpTools` / `sdkWireTransit`)是 sdk **原样再导出**(同一函数引用),端别在外面包一层。
|
|
7815
|
+
|
|
7816
|
+
**包侧缺口:** ① 面板体 HTTP 传输口候 sdk 9.5(35z #15);② `reasoning_end` 包侧半场 CC-02(0.68.3,35z #16);③ 中途翻转 verb 的七种 typed 结局处置表(35z #5,L-286②);④ 跨消息那几形的分段根治(§34z 留白不变)。
|
|
7817
|
+
|
|
7818
|
+
---
|
|
7819
|
+
|
|
7820
|
+
## §36 🆕 0.69.0 提货批(sdk 9.4.0 / core 7.18.0 / settings-schema 2.0.0 换钉;CC-02 推理面权威替换 / CC-05 core 7.18.0 三件)
|
|
7821
|
+
|
|
7822
|
+
> 原排 0.68.3;因 peer `@sema-agent/sdk` 地板 `>=8.8.0` → `>=9.4.0` 改 **minor**。运行期零 BREAKING(老 server 不发
|
|
7823
|
+
> `reasoning_end`,本包照跑);型面 BREAKING 只有 peer 一处。§35 里写「0.68.3」的引用一律读作 0.69.0(已发段不回改)。
|
|
7824
|
+
|
|
7825
|
+
### 36a. 本节速览
|
|
7826
|
+
|
|
7827
|
+
| 件 | 一句话 | 端要做什么 |
|
|
7828
|
+
|---|---|---|
|
|
7829
|
+
| S-1 🔴 **安全面** | **推理面权威替换**(CC-02;server ≥7.77.0 `reasoning_end`,与 `text_end` 同脱敏器):新 chrome 臂 `thinking_segment_end`,三键与 `text_segment_end` 同名同律 + `committedUuid` | 自己拼 thinking `stream_delta` 上屏的端:`diverged` ⇒ 重渲该块;**所有端**:`committedPrefixDiverged` ⇒ 把 `uuid === committedUuid` 的那条思考行**整块**换成 `content`;print 车道把内部臂 `reasoning_end` 按 `text_end` 同律吞/转(§36b) |
|
|
7830
|
+
| S-6 | **`fetchMcpPanel(client, sessionId, { signal? })`**(CC-03 补件):经 sdk `sessions.mcp`(自 0.0.75 在场)取面板体 + `projectMcpPanel` 投视图;传输失败 / 体坏 / 空 sessionId 三形同返 `undefined` | 渲 `/mcp` 面板的端:`const view = await fetchMcpPanel(client, sessionId)` → `mcpPanelLastLegDetail(view, { reachable: view !== undefined })`;§35z #15 改记「sdk 早已有调用口」(我 [7277] 那句「无调用口」是漏核) |
|
|
7831
|
+
| S-2 | **peer 地板 `>=9.4.0`**(型面:`reasoning_end` 帧 / `McpStatusPanel.lastLegMcp?` / `WiringManifestMcpEntry` 别名) | 装 sdk ≥9.4.0;`WiringManifestMcpEntry` 同名影子:两边都 import 时显式取本包的(§36z #7) |
|
|
7832
|
+
| S-3 | core 7.18.0 三件(CC-05):`ENGINE_NOTICE_CODES` +4 / park 两新键(`originUnconfirmed` / `readWorkflowResumeAdmissionIncomplete`)/ `gate.disposition.classifier?` 视图 | 渲 resume 候选 / park 行的端**必须**带两新键(丢了 = 已拒记录变回可 resume);渲门记录的端可读 `classifier`(缺席 = 未知 ≠ 席自答);通告码消费 `switch` 带 `default` 照旧 |
|
|
7833
|
+
| S-5 🔴 **归层** | **core 值级面端口注入**(CC-07;cli L-249 到期桶 core-value 清零):`installCoreValuePorts({…十件…})` + 十个诚实缺席读口(`resolveAutonomousLoopPrompt` / `loosenReasons` / `combinePolicies` / `createAllowDenyPolicy` / `mcpNamespace()` / `retiredToolNames()` / `protocolOf` / `ruleToolGrammarOf` / `validatePermissionRules` / `discussionWorkflowName()`) | **Node 宿主**(cli / desktop 主进程):装配根一处装 core 的十件真实现(原样,不许包一层);壳里对这十件的 `@sema-agent/core` 值级 import 全部改经包;**web / desktop 渲染层**:结构上装不了 ⇒ 恒缺席,消费点按 `undefined` 走降级(§36d) |
|
|
7834
|
+
| S-4 | 投影口:`text_end` 进 switch(行为不变)/ `tool_roster_delta` 有痕 dropped / `tool_progress`·`tool_disclosure` 有痕 dropped | 零动作(dropped 有痕在 run driver 上报面) |
|
|
7835
|
+
|
|
7836
|
+
### 36b. S-1 `thinking_segment_end`(`reasoning_end` 的包侧半场)
|
|
7837
|
+
|
|
7838
|
+
**与 `text_segment_end` 的唯一结构差**:思考块**没有 idle-flush** —— 本包只在三处正常边界(思考→回答边界 / 工具卡前 / turn 收口)**整块**提交它。⇒ 「已提交前缀」在思考面上全有或全无:
|
|
7839
|
+
|
|
7840
|
+
| 形 | 时序 | 包做什么 | 事件键 | 端做什么 |
|
|
7841
|
+
|---|---|---|---|---|
|
|
7842
|
+
| (a) 押着 | `reasoning_end` 先于任何提交边界到达 | 缓冲整块换成 `content`;活体尾巴按已泄前缀重算(已泄不是前缀 ⇒ 不补) | `diverged?`(never false) | 自拼活体的端按 `content` 重渲;只渲 transcript 的端零改动(下一次提交交的就是权威全文) |
|
|
7843
|
+
| (b) 已整块提交 | **常态**:`text_delta` 先到 ⇒ MOD-1 边界把思考整块提交;server 的 `reasoning_end` 随后到 | 撤不回 ⇒ **一个字节都不再交**;对照物用过即清 | `diverged` + `committedPrefixDiverged` + `committedPrefixLen`(= 该行全文长度)+ **`committedUuid`** | **所有端**:找 `uuid === committedUuid` 的那条思考行,**整块**换成 `content`(不切片) |
|
|
7844
|
+
| (f) 零经手 | durable 整块思考臂已铸行 / 宿主只喂 end 不喂 delta | 什么都不做 | 三键 + uuid 全缺席 | 只当对账/定界;拿 `content` 再渲一行 = 同一段上屏两遍 |
|
|
7845
|
+
| 子流 | 帧带 `parentToolCallId` | 不产 leader 事件、不动 leader 缓冲 | — | — |
|
|
7846
|
+
|
|
7847
|
+
**缺席语义逐键**:`diverged` / `committedPrefixDiverged` 缺席 = 否定(never false);`committedPrefixLen` 缺席 = 0;`committedUuid` 只随 `committedPrefixDiverged` 在场;`eventId` 缺席 = wire 没带。整条流零本臂 ≠ 段没结束(只有会报块结束的引擎才发)。**段身份不轮换**(`_sema_segment_id` 是文本行的,CC-01)。
|
|
7848
|
+
|
|
7849
|
+
**print 车道(cli `-p`)**:内部臂 `reasoning_end` 与 `text_end` 同在 `INTERNAL_SDK_ARM_TYPES`;CC stdout 帧全集零同位帧 ⇒ 壳按 `text_end` 同律「吞帧不吞事实」——把权威全文交给壳侧 thinking 累积器整块替换(cli L-319 半场),裸透传 = 越界帧。
|
|
7850
|
+
|
|
7851
|
+
```ts
|
|
7852
|
+
// 交互车道(bridgeAdapter)—— 端只接 chrome 臂:
|
|
7853
|
+
case 'thinking_segment_end':
|
|
7854
|
+
if (ev.committedPrefixDiverged) replaceThinkingRow(ev.committedUuid!, ev.content) // 整块换
|
|
7855
|
+
else if (ev.diverged) rerenderLiveThinking(ev.content) // 自拼活体的端
|
|
7856
|
+
```
|
|
7857
|
+
|
|
7858
|
+
### 36c. S-3 core 7.18.0 三件(CC-05)
|
|
7859
|
+
|
|
7860
|
+
- **通告码 +4**(均 operator):`config.write_face_swapped` / `config.write_face_deployment_clamped` / `classifier.fallback` / `route.classifier_unroutable`;`noticeAudienceOf` 照旧,消费 `switch` 必带 `default`。签名块 §27h 表长 52 → 56。
|
|
7861
|
+
- **park 两新键**(`readWorkflowParks` / `readWorkflowResumeAdmissionIncomplete`):`parks[].originUnconfirmed: true` = 行在记录上但 journal 未确认归属(**禁**当已确认读;缺席 = 已确认);`resumeAdmissionIncomplete: true` = 该 resume run 准入未完成(**在场 = 不是 resume 基**;缺席 = 常态)。两者与 `parks` 同一条投影义务;互不折叠(`resumeAdmissionIncomplete` 在场时 `parks` 整键缺席仍读 `undefined`)。
|
|
7862
|
+
- **`gate.disposition.classifier?`**(`GateClassifierRoundView`):`modelRequested` / `modelUsed` 两必在位缺一 ⇒ 整只缺席;`fallback{from,to,cause}` 三键缺一只丢 fallback;`cause` 开集(core `AUTO_MODE_FALLBACK_CAUSES` 三词 `error`/`timeout`/`parse_error`,本包不持表);⚠️ core 顶注:prompt 组不出来那一形也记成 `{cause:'error'}`,端别据它渲「分类器席坏了」。
|
|
7863
|
+
- **八闭集**(`PARK_TRUTH_UNREADABLE_REASONS` 7 / `AUTO_MODE_FALLBACK_CAUSES` 3 / `AUTO_MODE_CLASSIFIER_FALLBACKS` 2 / `TOOL_SEARCH_POLICIES` 3 / `HOOK_FAMILIES` 10 / `LSP_LANES` 3 / `PROGRAM_POSITION_REFUSAL_KINDS` 2 / `ARTIFACT_COMMIT_CERTAINTIES` 2)+ 闭集补全 7 集:本包**零穷举表**,全部按开集读 ⇒ 零加行。
|
|
7864
|
+
|
|
7865
|
+
### 36d. S-5 core 值级面端口 `coreValuePorts`(CC-07)
|
|
7866
|
+
|
|
7867
|
+
十件签名与 core 7.18.0 `dist/**.d.ts` 逐字同,只把 core 私有型换成**结构等价的镜像**(`CoreToolPolicyHandle` 是不透明句柄:本包不调 `check`,只把策略原样交回;`PermissionRuleIssueView.code` **开集串**;`CoreProtocolNamespaceView.parse` 只钉「解出了一个对象」)。
|
|
7868
|
+
|
|
7869
|
+
| 读口 | 没装 | 装了 | 端注意 |
|
|
7870
|
+
|---|---|---|---|
|
|
7871
|
+
| `resolveAutonomousLoopPrompt(prompt, opts?)` | `undefined` | `string \| null`(core 判「不组」= `null`) | 两态不折:`undefined` 是缺席,`null` 是引擎的答案 |
|
|
7872
|
+
| `loosenReasons(prior, next)` | `undefined` | `string[]`(`[]` = 没放宽) | 不许拿 `?? []` 把缺席读成「没放宽」 |
|
|
7873
|
+
| `combinePolicies(...)` / `createAllowDenyPolicy(opts)` | `undefined` | `CoreToolPolicyHandle` | core 的 `config.invalid_tool_name_set` 响亮抛**原样上抛**;要 skip 用 `onInvalidName: 'skip'` |
|
|
7874
|
+
| `mcpNamespace()` / `retiredToolNames()` / `discussionWorkflowName()` | `undefined` | 同一引用 / `ReadonlyMap` / `string` | 不铸 `'mcp__'` / 空 Map / `'discussion'` 字面量 |
|
|
7875
|
+
| `protocolOf(name)` / `ruleToolGrammarOf(tool)` | `undefined` | `undefined` 也是合法答案(不属任何协议 / 无语法族) | 🔴 两态同形 —— 要分先问 `hasCoreValuePort(name)` |
|
|
7876
|
+
| `validatePermissionRules(rules, opts?)` | `undefined` | `PermissionRuleIssueView[]`(`[]` = 全过) | 缺席 ≠ 全过 |
|
|
7877
|
+
|
|
7878
|
+
```ts
|
|
7879
|
+
// Node 宿主装配根(逐字,别加工):
|
|
7880
|
+
import { resolveAutonomousLoopPrompt, loosenReasons, combinePolicies, createAllowDenyPolicy, MCP_NAMESPACE, RETIRED_TOOL_NAMES,
|
|
7881
|
+
protocolOf, ruleToolGrammarOf, validatePermissionRules, DISCUSSION_WORKFLOW_NAME } from '@sema-agent/core'
|
|
7882
|
+
installCoreValuePorts({ resolveAutonomousLoopPrompt, loosenReasons, combinePolicies, createAllowDenyPolicy, MCP_NAMESPACE, RETIRED_TOOL_NAMES,
|
|
7883
|
+
protocolOf, ruleToolGrammarOf, validatePermissionRules, DISCUSSION_WORKFLOW_NAME })
|
|
7884
|
+
```
|
|
7885
|
+
`coreValuePortMisses()` 给 `/doctor` 一行(全装 ⇒ `[]`);`hasCoreValuePorts()` 只答「装没装」,**不判部署形态**。
|
|
7886
|
+
|
|
7887
|
+
**判据**:`run-core-value-ports-test.mjs`(52 格;源码剥注释零 core import 直证)。
|
|
7888
|
+
|
|
7889
|
+
### 36z. 逐键处置表(0.69.0)
|
|
7890
|
+
|
|
7891
|
+
| # | 键 / 面 | 处置 | 坐标 / 理由 |
|
|
7892
|
+
|---|---|---|---|
|
|
7893
|
+
| 1 | `reasoning_end{content,eventId,parentToolCallId?,sourceTaskId?,bgAgentId?}`(server 7.77.0 S-310 / sdk 9.4.0 `SegmentEndFields`) | **consumed** | `src/adapter/downstream/eventToSdkMessage.ts` 的 `#segmentEndProjection`(`reasoning_end` 字面量铸点);`src/adapt/arms.ts` 的 `#thinkingSegmentEndArm`;`src/adapt/textStream.ts` 的 `#replaceThinkingSegment`;`src/seam.ts` 的 `#ThinkingSegmentEndChromeEvent`;门 `run-text-segment-authority-test.mjs` T 段 |
|
|
7894
|
+
| 2 | `sourceTaskId` / `bgAgentId`(身份四键的后两键) | **declined**(本臂) | 本包按 `parentToolCallId` 断闸即足够分 leader / 子流;后两键属子代内容账本(`subagentContentStore`)的身份域,由 `reasoning_delta` 那条腿已有的 `EventIdentity` 读法承接,本臂不重读 |
|
|
7895
|
+
| 3 | `text_end` 进 union | **consumed(行为不变)** | `#textEndProjection` 改为薄包装调 `#segmentEndProjection`;预分派删;pure 门 #323 段照绿 |
|
|
7896
|
+
| 4 | `tool_roster_delta` | **declined(有痕 dropped,L-315 候)** | `dropped('unsupported_arm')`;`wiring_manifest.tools` 不进切片前没有可挂的基线 |
|
|
7897
|
+
| 5 | `ENGINE_NOTICE_CODES` +4 | **consumed** | `src/engineNoticeCodes.ts` 的 `ENGINE_NOTICE_CODES` / `#ENGINE_NOTICE_AUDIENCE`;门 `run-engine-notice-catalog-test.mjs` A1/B2 |
|
|
7898
|
+
| 6 | `parks[].originUnconfirmed` / `WorkflowRun.resumeAdmissionIncomplete` | **consumed** | `src/workflowClient.ts` 的 `#readWorkflowParks` / `#readWorkflowResumeAdmissionIncomplete`;门 `run-workflow-park-truth-projection-test.mjs` G 段 |
|
|
7899
|
+
| 7 | `GateDisposition.classifier?` | **consumed** | `src/gateOutcome.ts` 的 `#readClassifierRound` / `#GateClassifierRoundView`;门 `run-decide-receipt-test.mjs` H 段 |
|
|
7900
|
+
| 8 | `tool_progress` 帧 / `ProgressMessage<BashProgress>` | **pending**(候 clay DV-741) | 帧形是非 CC 锚定,本包不先给一个可能要改的 chrome 形;今有痕 dropped(`unknown_arm` 或 switch 内 dropped,随 sdk 型面到位) |
|
|
7901
|
+
| 9 | `tool_disclosure` 帧 / `context_usage.sections?` / `WiringManifest.hooks?`·`lsp?` | **pending**(与 L-315 同批,0.70) | wiring 超集今只投三段;`context_usage` 臂今在投影口同组 `not_in_slice`;设计件 = 超集键或 chrome 位 |
|
|
7902
|
+
| 10 | `McpStatusPanel.lastLegMcp?`(sdk 9.4.0 型面) | **consumed(编译期钉)** | `src/mcpPanel.ts` 的 `#_mcpPanelShapePin`(sdk 形 ⇒ 视图必填半场可赋);读法 §35g 不变 |
|
|
7903
|
+
| 11 | sdk 9.4.0 类型别名 `WiringManifestMcpEntry`(同名影子) | **declined(本版)** | 本包同名 interface `errorCode` **开集**(词的属主在 core,抄闭集会吞新词);改名对 cli 是导出 BREAKING;收敛排 0.70,消费端两边都 import 时显式取本包的 |
|
|
7904
|
+
| 12 | `ReadFace` 族 → `ContainmentFace` 族(core BREAKING) | **n/a** | 本包零值级直连 core;`readFacePosture.ts` 读 sdk 型 |
|
|
7905
|
+
| 13 | settings-schema 2.0.0(`siblingResolver` 改名 / 逐条容错) | **n/a** | 本包零 src import;两只门(additive-key-passthrough G7 / model-capability-probe I)按真字节读,换钉后照绿 |
|
|
7906
|
+
| 14 | `SKILL_CAPS.items` 退役(C-R41 / C-R43 ①) | **pending**(CC-04,随 server 7.78.1 + core 7.18.1 进 0.69.1) | 与撤帽同窗;`agents[].skills` 轴照旧零删键 |
|
|
7907
|
+
| 15 | core 值级十件(cli L-249 core-value 桶:`resolveAutonomousLoopPrompt` / `loosenReasons` / `combinePolicies`+`createAllowDenyPolicy` / `MCP_NAMESPACE`+`RETIRED_TOOL_NAMES`+`protocolOf`+`ruleToolGrammarOf`+`validatePermissionRules` / `DISCUSSION_WORKFLOW_NAME`) | **consumed(端口注入形)** | `src/coreValuePorts.ts` 的 `#installCoreValuePorts` + 十读口;§35z #9 的 blocked 改口(cli 采端口形);门 `run-core-value-ports-test.mjs` |
|
|
7908
|
+
| 16 | sdk 9.4.0 运行期锚重含退役键 `classifierUnavailable`(`TOOL_APPROVAL_FRAME_KEYS` / `APPROVAL_CARD_KEYS`) | **declined(退役登记)** | 本包 0.67.0 已整族退役、普查门禁码内出现 ⇒ `run-approval-frame-keys-test.mjs` 的 `RETIRED_NOT_MIRRORED` 登记(带两条退出条件);sdk 删锚同批删 |
|
|
7909
|
+
| 18 | 面板体传输口(§35z #15 pending 的收口) | **consumed** | `src/mcpPanel.ts` 的 `#fetchMcpPanel`(sdk `sessions.mcp` ≥0.0.75,`dist/resources/sessions.d.ts:289`;不裸 fetch);门 `run-mcp-panel-projection-test.mjs` J 段 |
|
|
7910
|
+
| 17 | sdk 9.4.0 `AskOrigin` 联合追平 core(`ancestor_marked` 在 / `unresolvable` 不在) | **consumed(登记删)** | `run-gate-vocabulary-test.mjs` B-lag 滞后登记按退出条件删 → B-sync 三侧逐词等值 |
|
|
7911
|
+
|
|
7912
|
+
### 36y. 🔴 三端升级必读(固定段式,[C295];本批**四条**)
|
|
7913
|
+
|
|
7914
|
+
1. 🔴 **安全面:`thinking_segment_end` 新臂,`required: true`**(server ≥7.77.0 才发;老 server 上整条流零本臂,零改动)。`committedPrefixDiverged` 在场 ⇒ **所有端**把 `uuid === committedUuid` 的那条已 committed 思考行整块换成 `content`(不做 = 未脱敏的推理字节留在那个宿主的转录里);`diverged` 在场 ⇒ 自拼 thinking `stream_delta` 的端按 `content` 重渲。print 车道把内部臂 `reasoning_end` 按 `text_end` 同律吞/转,裸透传 = 越界帧。
|
|
7915
|
+
2. **peer sdk `>=9.4.0`**:装 9.4.0+;`WiringManifestMcpEntry` 两边同名不同形,显式 `import type { … } from '@sema-agent/client-core'`。
|
|
7916
|
+
3. **Node 宿主装 core 值级十件端口**(cli / desktop 主进程):`installCoreValuePorts({...})` 一处装、壳里十件 `@sema-agent/core` 值级 import 改经包;web / desktop 渲染层零动作(恒缺席,消费点按 `undefined` 降级)。
|
|
7917
|
+
4. **park 两新键必须逐字带**(渲 resume 候选 / park 行的端):`originUnconfirmed` 在场禁当已确认读;`resumeAdmissionIncomplete` 在场 = 不是 resume 基 —— 丢任一 = 已拒记录变回可 resume。
|
|
7918
|
+
|
|
7919
|
+
**包侧缺口:** ① `tool_progress` 投影候 DV-741(36z #8);② `tool_disclosure` / `sections` / `hooks`·`lsp` 与 L-315 同批(36z #9);③ `WiringManifestMcpEntry` 同名影子收敛(36z #11,0.70);④ CC-04 技能帽退役随 server 7.78.1 进 0.69.1(36z #14);⑤ 中途翻转 verb 处置表 / 跨消息分段根治(§35 包侧缺口 ③④ 不变;① 面板体传输口已由 36z #18 收口)。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sema-agent/client-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.69.0",
|
|
4
4
|
"description": "Client-side session runtime shared by every sema human client (TUI / web / desktop): sema wire frames (AgentEvent) -> CC session vocabulary (SDKMessage) with dual-plane output (transcript/chrome), deterministic transcript ids, lane discipline as a type, and the notification/dedup ledgers. Every CC-skin shape is collected here so the wire itself stays neutral. Renamed from @sema-agent/wire-cc-adapter (0.1.x).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -31,13 +31,13 @@
|
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"@sema-agent/agent-types": ">=0.2.0",
|
|
34
|
-
"@sema-agent/sdk": ">=
|
|
34
|
+
"@sema-agent/sdk": ">=9.4.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@sema-agent/agent-types": "^0.2.0",
|
|
38
|
-
"@sema-agent/core": "~7.
|
|
39
|
-
"@sema-agent/sdk": "^
|
|
40
|
-
"@sema-agent/settings-schema": "^
|
|
38
|
+
"@sema-agent/core": "~7.18.0",
|
|
39
|
+
"@sema-agent/sdk": "^9.4.0",
|
|
40
|
+
"@sema-agent/settings-schema": "^2.0.0",
|
|
41
41
|
"esbuild": "^0.27.4",
|
|
42
42
|
"typescript": "^6.0.2"
|
|
43
43
|
}
|