@sema-agent/server 7.51.0 → 7.52.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 (198) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/USAGE.md +83 -20
  4. package/dist/adoption/plan.d.ts +4 -4
  5. package/dist/adoption/plan.js +11 -0
  6. package/dist/approval-card.d.ts +26 -2
  7. package/dist/approval-card.js +9 -0
  8. package/dist/approval-hmac.d.ts +1 -1
  9. package/dist/approval-reconciler.d.ts +2 -2
  10. package/dist/approval-reconciler.js +1 -1
  11. package/dist/bench/l8/artifact.d.ts +1 -1
  12. package/dist/bench/s1/arms.d.ts +1 -1
  13. package/dist/bench/s1/live-deps.d.ts +1 -1
  14. package/dist/bench/s1/oracle.d.ts +1 -1
  15. package/dist/bench/s1/row.d.ts +1 -1
  16. package/dist/boot/budget-tracing.d.ts +1 -1
  17. package/dist/boot/budget-tracing.js +2 -5
  18. package/dist/boot/coordinators.js +3 -1
  19. package/dist/boot/deferred-sandbox-path-env.d.ts +1 -1
  20. package/dist/boot/engine-lease.d.ts +1 -1
  21. package/dist/boot/execution-env.d.ts +1 -1
  22. package/dist/boot/governance-seams.d.ts +2 -2
  23. package/dist/boot/leader.d.ts +1 -1
  24. package/dist/boot/memory-boundary.d.ts +2 -2
  25. package/dist/boot/memory-consolidation.d.ts +6 -6
  26. package/dist/boot/org-memory.d.ts +1 -1
  27. package/dist/boot/parked-revive-gate.d.ts +3 -3
  28. package/dist/boot/reapers.d.ts +2 -2
  29. package/dist/boot/reapers.js +17 -4
  30. package/dist/boot/resolve-spec.d.ts +12 -0
  31. package/dist/boot/resolve-spec.js +29 -7
  32. package/dist/boot/retention-lane.d.ts +2 -2
  33. package/dist/boot/runner-deps.d.ts +17 -7
  34. package/dist/boot/runner-deps.js +4 -2
  35. package/dist/boot/runtime-caps.d.ts +23 -0
  36. package/dist/boot/runtime-caps.js +24 -2
  37. package/dist/boot/session-faces.d.ts +1 -1
  38. package/dist/boot/session-faces.js +14 -3
  39. package/dist/boot/stores.js +31 -1
  40. package/dist/boot/task-list-lane.d.ts +2 -2
  41. package/dist/brain.js +51 -31
  42. package/dist/budget.d.ts +2 -2
  43. package/dist/capabilities/center-plugins.d.ts +1 -1
  44. package/dist/capabilities/collab-workflows.d.ts +1 -1
  45. package/dist/capabilities/hands-lane.d.ts +3 -3
  46. package/dist/capabilities/scenarios.d.ts +3 -3
  47. package/dist/capabilities/skills.d.ts +1 -1
  48. package/dist/config-center/hot-keys-registry.js +5 -0
  49. package/dist/config-center/http-client.d.ts +2 -2
  50. package/dist/config-center/read-face.d.ts +1 -1
  51. package/dist/config-center/restart-signal.d.ts +1 -1
  52. package/dist/config-types.d.ts +78 -18
  53. package/dist/config.js +45 -10
  54. package/dist/deployment-governance.d.ts +1 -1
  55. package/dist/device-enrollment.d.ts +2 -2
  56. package/dist/device-store.d.ts +3 -3
  57. package/dist/device-ws-protocol.d.ts +2 -2
  58. package/dist/env-facts.d.ts +1 -1
  59. package/dist/execution-lane-caps.d.ts +1 -1
  60. package/dist/fleet/fleet-bus.d.ts +1 -1
  61. package/dist/fleet/fleet-reconciler.d.ts +1 -1
  62. package/dist/fleet/fleet-terminal-window.d.ts +1 -1
  63. package/dist/http/active-run-conflict.d.ts +2 -2
  64. package/dist/http/principal-gate.d.ts +1 -1
  65. package/dist/http/route-ctx.d.ts +24 -4
  66. package/dist/http/routes/admin-memory-optout.d.ts +48 -0
  67. package/dist/http/routes/admin-memory-optout.js +75 -0
  68. package/dist/http/routes/agents-roster.d.ts +1 -1
  69. package/dist/http/routes/approvals-assistant.js +21 -21
  70. package/dist/http/routes/capabilities.js +20 -9
  71. package/dist/http/routes/diagnostics.d.ts +1 -1
  72. package/dist/http/routes/leader.d.ts +1 -1
  73. package/dist/http/routes/memory-bundle.d.ts +1 -1
  74. package/dist/http/routes/memory-bundle.js +3 -1
  75. package/dist/http/routes/memory-compliance.d.ts +4 -4
  76. package/dist/http/routes/memory-origin.d.ts +4 -4
  77. package/dist/http/routes/memory-origin.js +3 -1
  78. package/dist/http/routes/memory-policy.js +6 -2
  79. package/dist/http/routes/retention-ops.d.ts +1 -1
  80. package/dist/http/routes/rules.d.ts +5 -2
  81. package/dist/http/routes/rules.js +84 -5
  82. package/dist/http/routes/run-memory-capture.d.ts +34 -0
  83. package/dist/http/routes/run-memory-capture.js +97 -0
  84. package/dist/http/routes/runs.d.ts +1 -0
  85. package/dist/http/routes/runs.js +212 -6
  86. package/dist/http/routes/session-sync.d.ts +4 -6
  87. package/dist/http/routes/session-sync.js +60 -47
  88. package/dist/http/routes/sessions.js +61 -188
  89. package/dist/http/routes/shared-memory.d.ts +1 -1
  90. package/dist/http/routes/tasks.js +1 -1
  91. package/dist/http/routes/workflows.js +19 -0
  92. package/dist/http/server.d.ts +35 -13
  93. package/dist/http/server.js +105 -12
  94. package/dist/http/verify-rounds.d.ts +1 -1
  95. package/dist/http/wire-types.d.ts +41 -8
  96. package/dist/leader/endpoint.d.ts +1 -1
  97. package/dist/leader/leader.d.ts +1 -1
  98. package/dist/leader/repair-oracle.d.ts +2 -2
  99. package/dist/leader/repair-oracle.js +1 -1
  100. package/dist/main.js +13 -6
  101. package/dist/memory-bundle-engine.d.ts +1 -1
  102. package/dist/memory-operator-faces.d.ts +5 -5
  103. package/dist/memory-origin-fence.d.ts +50 -0
  104. package/dist/memory-origin-fence.js +15 -0
  105. package/dist/memory-posture.d.ts +13 -1
  106. package/dist/memory-posture.js +1 -0
  107. package/dist/memory-scope.d.ts +6 -1
  108. package/dist/memory-scope.js +3 -2
  109. package/dist/model-select.d.ts +2 -2
  110. package/dist/observability/fail-open.d.ts +17 -5
  111. package/dist/observability/fail-open.js +17 -5
  112. package/dist/orchestration/hardened-vm-runner.d.ts +2 -2
  113. package/dist/orchestration/workflow-completion-inbox.d.ts +2 -2
  114. package/dist/plugins/background-shell-support.d.ts +2 -2
  115. package/dist/plugins/blob-backend.d.ts +7 -2
  116. package/dist/plugins/blob-backend.js +22 -18
  117. package/dist/plugins/caching-session-store.d.ts +7 -3
  118. package/dist/plugins/checkpoint-store-sql.d.ts +2 -2
  119. package/dist/plugins/file-history-store-sql.d.ts +170 -0
  120. package/dist/plugins/file-history-store-sql.js +827 -0
  121. package/dist/plugins/file-run-store.d.ts +44 -5
  122. package/dist/plugins/file-run-store.js +85 -13
  123. package/dist/plugins/fork-routing-session-store.d.ts +1 -1
  124. package/dist/plugins/fork-routing-session-store.js +2 -2
  125. package/dist/plugins/leader-run-store-sql.d.ts +1 -1
  126. package/dist/plugins/local-session-store.d.ts +9 -1
  127. package/dist/plugins/memory-embedder-fingerprint.d.ts +1 -1
  128. package/dist/plugins/memory-optout-grant-store-sql.d.ts +139 -0
  129. package/dist/plugins/memory-optout-grant-store-sql.js +157 -0
  130. package/dist/plugins/memory-origin-law.d.ts +2 -2
  131. package/dist/plugins/memory-run-store.d.ts +4 -3
  132. package/dist/plugins/memory-run-store.js +2 -1
  133. package/dist/plugins/permission-rule-store-file.d.ts +16 -6
  134. package/dist/plugins/permission-rule-store-file.js +77 -13
  135. package/dist/plugins/permission-rule-store-sql.d.ts +156 -8
  136. package/dist/plugins/permission-rule-store-sql.js +123 -21
  137. package/dist/plugins/pg-pool.js +59 -0
  138. package/dist/plugins/pg-safe-json.d.ts +1 -1
  139. package/dist/plugins/remote-env-device.d.ts +1 -1
  140. package/dist/plugins/remote-env-k8s.d.ts +1 -1
  141. package/dist/plugins/retention-lane-store-sql.d.ts +3 -3
  142. package/dist/plugins/retention-store-sql.d.ts +7 -7
  143. package/dist/plugins/retention-store-sql.js +6 -0
  144. package/dist/plugins/run-store-sql.d.ts +9 -3
  145. package/dist/plugins/run-store-sql.js +2 -2
  146. package/dist/plugins/send-user-file.d.ts +1 -1
  147. package/dist/plugins/session-placement.d.ts +1 -1
  148. package/dist/plugins/sql-errors.d.ts +1 -1
  149. package/dist/plugins/store-backend.d.ts +59 -29
  150. package/dist/plugins/store-backend.js +75 -15
  151. package/dist/plugins/store-contracts.d.ts +5 -3
  152. package/dist/plugins/task-list-store-sql.d.ts +1 -1
  153. package/dist/plugins/tidb-pool.js +59 -0
  154. package/dist/plugins/web-search.d.ts +1 -1
  155. package/dist/prompts-domain-validate.js +1 -1
  156. package/dist/resource-suspend.d.ts +1 -1
  157. package/dist/resource-window.d.ts +3 -3
  158. package/dist/rules-consent.d.ts +231 -9
  159. package/dist/rules-consent.js +411 -13
  160. package/dist/run-local.js +1 -0
  161. package/dist/runs.d.ts +15 -1
  162. package/dist/runs.js +19 -0
  163. package/dist/runtime-caps-resolver.d.ts +36 -1
  164. package/dist/runtime-caps-resolver.js +25 -0
  165. package/dist/runtime-governance.d.ts +1 -1
  166. package/dist/security.d.ts +5 -5
  167. package/dist/security.js +1 -1
  168. package/dist/session-sync.d.ts +52 -37
  169. package/dist/session-sync.js +19 -16
  170. package/dist/shared-memory-scope-authorizer.d.ts +1 -1
  171. package/dist/sighup-idle.d.ts +1 -1
  172. package/dist/spec-fields.d.ts +22 -1
  173. package/dist/spec-fields.js +11 -0
  174. package/dist/store-live-probe.d.ts +2 -2
  175. package/dist/task-a2a.d.ts +1 -1
  176. package/dist/task-cwd.d.ts +1 -1
  177. package/dist/task-mcp.d.ts +3 -3
  178. package/dist/task-settings.d.ts +3 -3
  179. package/dist/task-workflow.d.ts +1 -1
  180. package/dist/text-bidi.d.ts +2 -2
  181. package/dist/tool-approval.d.ts +191 -9
  182. package/dist/tool-approval.js +248 -29
  183. package/dist/trace/core-keyset-guard.d.ts +1 -1
  184. package/dist/trace/engine-notice-wire.d.ts +6 -4
  185. package/dist/trace/engine-notice-wire.js +2 -0
  186. package/dist/trace/ledger-events.d.ts +1 -1
  187. package/dist/trace/ledger-sink.d.ts +2 -2
  188. package/dist/trace/project.d.ts +3 -2
  189. package/dist/trace/project.js +1 -0
  190. package/dist/turn-activity.d.ts +1 -1
  191. package/dist/wall-clock-jump-guard.d.ts +3 -3
  192. package/package.json +2 -2
  193. package/dist/http/tar.d.ts +0 -17
  194. package/dist/http/tar.js +0 -53
  195. package/dist/http/workspace-content.d.ts +0 -11
  196. package/dist/http/workspace-content.js +0 -20
  197. package/dist/plugins/file-snapshot-store-sql.d.ts +0 -170
  198. package/dist/plugins/file-snapshot-store-sql.js +0 -213
@@ -1,6 +1,6 @@
1
1
  import { type RuleOwner, type ImportPreview, type RedeemedBatchMember, type ImportedSettingsLayer, type PersistedAllowRule, type RemoveResult, type EditedRuleTextPrecheck, type RuleScope, type RuleOffer } from "@sema-agent/core";
2
2
  import type { PermissionRuleStoreProvider, RuleApprovalRecordStore } from "@sema-agent/core";
3
- import { type RuleImportTicket, type RuleTicketDecisionClock, type RuleTicketRedeemResult } from "./plugins/permission-rule-store-sql.js";
3
+ import { type RuleImportTicket, type RuleTicketDecisionClock, type RuleTicketPurpose, type RuleTicketReclaimResult, type RuleTicketRedeemResult, type RuleTicketSnapshot } from "./plugins/permission-rule-store-sql.js";
4
4
  /**
5
5
  * 本车道**真正**依赖的三面(**结构**接口,不是 SQL 类)。
6
6
  *
@@ -22,6 +22,7 @@ export interface RuleConsentStores {
22
22
  ticketId: string;
23
23
  principal: string;
24
24
  approvalId: string;
25
+ purpose: RuleTicketPurpose;
25
26
  candidates: ReadonlyArray<{
26
27
  rule: string;
27
28
  scope: RuleScope;
@@ -29,11 +30,24 @@ export interface RuleConsentStores {
29
30
  ttlMs: number;
30
31
  }): Promise<RuleImportTicket>;
31
32
  /** 一次**认领**(不是「已完成」)。语义与「认领之后怎么办」见 {@link RuleConsentStores.tickets.release}。
33
+ * `purpose` = 车道绑定(A7 R1-F2):一条车道的口只认它自己铸的票,不符与「票不存在」同形。
32
34
  * `opts.decisionNowMs` = [4232]③ 的判定钟覆写(记账列不受影响),见 {@link RuleTicketDecisionClock}。 */
33
- consume(ticketId: string, principal: string, opts?: RuleTicketDecisionClock): Promise<RuleTicketRedeemResult>;
34
- /** 把认领**放回去**(认领之后遇到不确定/瞬时失败时)。`mustRemainValidMs` = 放回之后这张票至少还要
35
- * 能用多久 —— 撑不过就**不算放回成功**(理由逐字见 store 侧 `release` 的头注)。 */
36
- release(ticketId: string, principal: string, mustRemainValidMs?: number, opts?: RuleTicketDecisionClock): Promise<boolean>;
35
+ consume(ticketId: string, principal: string, purpose: RuleTicketPurpose, opts?: RuleTicketDecisionClock): Promise<RuleTicketRedeemResult>;
36
+ /** 把认领**放回去**(认领之后遇到不确定/瞬时失败时)。`claimId` = 本次认领的代次(A7 R1-F1 围栏:
37
+ * 被顶替的旧持有者动不了现持有者的认领);`mustRemainValidMs` = 放回之后这张票至少还要能用多久
38
+ * —— 撑不过就**不算放回成功**(理由逐字见 store `release` 的头注) */
39
+ release(ticketId: string, principal: string, claimId: string, mustRemainValidMs?: number, opts?: RuleTicketDecisionClock): Promise<boolean>;
40
+ /**
41
+ * #265 A7 三态协议的三条口(CLAIMED → SETTLED / 三态快照 / 崩溃窗抢认领)。
42
+ *
43
+ * 🔴 **必填,不给 optional**:它们是 local-import 车道正确性的承重件 —— 一个"没有 settle 的店"上,
44
+ * 一次已经落地的导入会永远答不出终局(属主重放恒 409 到票过期)。把它们写成可选 = 让一台缺实现的
45
+ * 部署**静默**退化成那个形,而本仓对安全/权限轴的静默降级是明令禁止的。两个真实现(SQL / File)与
46
+ * 测试孪生各自实现同一份语义,缺一个当场编译红。
47
+ */
48
+ settle(ticketId: string, principal: string, claimId: string, outcome: unknown): Promise<boolean>;
49
+ peek(ticketId: string, principal: string, purpose: RuleTicketPurpose): Promise<RuleTicketSnapshot | undefined>;
50
+ reclaim(ticketId: string, principal: string, purpose: RuleTicketPurpose, minClaimAgeMs: number): Promise<RuleTicketReclaimResult>;
37
51
  };
38
52
  }
39
53
  /**
@@ -60,7 +74,7 @@ export interface PermissionRuleStoreBundle extends RuleConsentStores {
60
74
  reapExpired?(nowMs: number): Promise<number>;
61
75
  }
62
76
  /** 导入票的存活窗。人从「看到预览」到「按下确认」是一次交互,不是一段会话——十分钟宽到不会误伤,
63
- * 窄到一张泄漏的票不会常驻。运维旋钮暂不开(没有部署形要求它可调;要开时走 config.ts 的既有姿势)。 */
77
+ * 窄到一张外泄的票不会常驻。运维旋钮暂不开(没有部署形要求它可调;要开时走 config.ts 的既有姿势)。 */
64
78
  export declare const RULE_IMPORT_TICKET_TTL_MS: number;
65
79
  /** 可重试那一支通告给客户端的等待秒数(`state.rule_import_retry` 的 `retryAfterSec` / `Retry-After`)。
66
80
  * 短 —— 它对应的是一次瞬时 store 抖动,不是排队。**单一真源在本文件**:放回认领时要用它判「这张票
@@ -80,6 +94,177 @@ export declare const RULE_IMPORT_RETRY_AFTER_SEC = 2;
80
94
  * 「几百次 SQL」而不是「几万次」。
81
95
  */
82
96
  export declare const MAX_IMPORT_CANDIDATES = 200;
97
+ /** 一批 local-import 的行数上限。**与 cc-import 同值同拒形**(413):帽住的是同一条东西 ——
98
+ * `redeemRuleBatch` 那条**逐成员**「读店 + CAS 写」的串行循环(见 {@link MAX_IMPORT_CANDIDATES} 的
99
+ * 头注,理由一个字不变)。两处用同一个数不是巧合,是同一条论证的两个入口,所以直接派生而不是另挑一个。 */
100
+ export declare const MAX_LOCAL_IMPORT_ROWS = 200;
101
+ /**
102
+ * 一批 rows 的**总字节**上限(D5「防巨包」)。
103
+ *
104
+ * 为什么行数帽不够:行数管住的是**下游工作量**(那条串行循环的长度),管不住**单次请求的体积** ——
105
+ * 200 行 × (512 字规则 + 1088 字 scope + 512 字命令 + 一串出处回声)在纯算术上能到兆字节级,而这条口
106
+ * 是**已鉴权即可打**的写面。256 KiB 宽到装得下任何真实的规则店(一份人手养出来的规则集是几十条到几百
107
+ * 条一行的短串),窄到一次请求不能拿它当上传通道。超帽与行数超帽**同拒形**(413):对客户端来说处置
108
+ * 相同(把这批拆小再来),分成两个码只会让它多一条分支。
109
+ */
110
+ export declare const MAX_LOCAL_IMPORT_BYTES: number;
111
+ /**
112
+ * **认领租约**:一次认领持续超过这么久还没落定,就当持有它的那个进程**已经死了**(A7 崩溃窗恢复臂)。
113
+ *
114
+ * 三问答(CLAUDE.md 行为面条款):
115
+ * · **谁要**:无状态多副本部署。`consume`(认领)与 `settle`(落定)之间隔着整条兑付走;副本在这中
116
+ * 间被杀/被驱逐/OOM 是常规运维事件,不是异常。没有这条租约,那张票就停在 CLAIMED 直到 TTL 到期
117
+ * ——**人的确认凭空丢掉**,而客户端拿到的是一个永远重试不出结果的 409。
118
+ * · **谁受伤**:一次**还活着**但走得特别慢的兑付,可能在租约到期后被第二条腿抢过去重驱 ⇒ 同一批被
119
+ * 两个走者同时走。这不是猜测出来的安全边界:core 的批走契约**逐字**写着「resuming a partial walk
120
+ * IS re-walking … two concurrent walkers converge on one dot set, zero double mints」——重叠的代价
121
+ * 是多跑一遍同样的重放,不是重复落规则。
122
+ * · **拿什么补**:取值远宽于一次真实的走(最坏 {@link MAX_LOCAL_IMPORT_ROWS} 次店往返),又远窄于
123
+ * 票的 TTL({@link RULE_IMPORT_TICKET_TTL_MS} = 10 分钟)—— 于是"崩了的票在它自己这一生里就能被
124
+ * 救回来",而不是等下一次 prepare。运维旋钮暂不开(没有部署形要求它可调)。
125
+ */
126
+ export declare const LOCAL_IMPORT_CLAIM_LEASE_MS = 60000;
127
+ /** 一条规则的 wire 身份键(规则文本 + {@link serializeRuleScope} 的判别式串)。两个面(预览 / 兑付回执)
128
+ * 用**同一把键**,客户端拿它把两张表 join 起来。 */
129
+ export interface LocalImportRuleKey {
130
+ rule: string;
131
+ scope: string;
132
+ }
133
+ /**
134
+ * prepare 面的**成员级拒因**(闭集,机读)。
135
+ *
136
+ * 🔴 闭集而不是自由文本:客户端要按拒因分流(「这条是你本机的数据坏了」vs「这条规则本身不合法」是
137
+ * 两句不同的话),而自由文本只能被展示、不能被分支。`detail` 才是给人看的那一半。
138
+ */
139
+ export type LocalImportRefusalCode =
140
+ /** scope 串读不出形(既不是 `global` 也不是 `project:<非空 root>`)。 */
141
+ "scope_unreadable"
142
+ /** scope 的 project root 里有 bidi 控制符([4537]② Trojan Source 族):人看到的射程与机器判据用的
143
+ * 射程不是同一串 —— 一条规则的**作用范围**因此可以被伪装。 */
144
+ | "scope_bidi_controls"
145
+ /** scope 的 project root 里有 **C0/DEL 控制字节**(codex 交叉轮 R9,验真后补)。与 bidi 分家成两个词:
146
+ * bidi 说的是"你看到的射程是假的",这个说的是"这串根本不是一条路径"。挡它有三条各自独立成立的理由:
147
+ * ①**跨后端行为分岔** —— PG 的协议编码器直接拒 NUL(整条 prepare 变 500),而 TiDB/File 收得下同一行;
148
+ * ②它把本层比较键的分隔符假设(见 {@link LOCAL_IMPORT_KEY_SEP} 的注:"路径里不可能出现它")变成假的
149
+ * —— 去重与对账的键就此可被撞;③治理面的分页游标按 (scope, rule) 的串序做 keyset,控制字节会让那个
150
+ * 序不再是人以为的那个。 */
151
+ | "scope_control_chars"
152
+ /** 规则文本过不了引擎的共享校验器,或它**不容纳它自称的那条命令**(覆盖门)。 */
153
+ | "rule_rejected"
154
+ /** 文本门**答不了**这一行(引擎对调用方 bug 是抛,不是拒:命令缺席/非串)——那是行本身坏了,
155
+ * 不是"你写的规则被拒了",故单独成词。 */
156
+ | "rule_uncheckable"
157
+ /** 行**自相矛盾**:规则文本解析出来的 tool/match/command 与行上自称的对不上。一行 File 店行的这三
158
+ * 格本该是从 `rule` 派生的事实,对不上 = 这一行是拼出来的,不是店里出来的。 */
159
+ | "row_inconsistent"
160
+ /** 同一个 (rule, scope) 在这一批里出现了两次。引擎会静默去重 —— 静默去重会让"我交了 20 条,只回了
161
+ * 19 条"变成一次无解的差异,所以在这里如实说出来。 */
162
+ | "duplicate_row"
163
+ /** 过了本层全部判据,却没能成为引擎的候选(= 本仓与 core 的判据分了家)。**响亮**而不是静默丢:
164
+ * 它意味着两侧的规则语法判据漂了,那是要人去看的事。 */
165
+ | "not_importable";
166
+ /** 兑付面的**成员级终态**(闭集,机读;`detail` 是给人看的那一半)。
167
+ *
168
+ * 🔴 **`refused` 在本版的兑付面结构上到不了,这是如实登记而不是遗漏**:走到兑付这一步的成员,已经
169
+ * 在 prepare 过了全部内容判据 —— 于是 core 交回的 `refused` 行只剩店侧成因(读不出店 / 写面抛 / OCC
170
+ * 用尽),而那些**都是"不知道落没落"**,不是"这条规则不行"。core 的 `RedeemedBatchMember` 拒绝臂
171
+ * 只带一个**自由文本** `reason`,把它按串去猜「这是裁定还是瞬时」正是本仓明令禁止的自造判读,
172
+ * 所以一律落到 `indeterminate`(安全方向)。词留在表里是因为**两个面共用同一张词表**(预览面发的
173
+ * 正是它),而不是留一个死枝:客户端一套分支读得通两张表。收窄需要 core 给拒绝臂一个**带类型的**
174
+ * 瞬时/裁定判别位 —— 已作为上游请托登记(server 不在下游造第二份判据,[2862])。 */
175
+ export type LocalImportMemberOutcome =
176
+ /** 这一次真的写进店里了。 */
177
+ "persisted"
178
+ /** 等价规则**已经在店**(引擎的 `deduped`)—— 同意早就生效,这次什么都不用做。 */
179
+ | "no-op"
180
+ /** 这条被拒了(预览面的词;兑付面见上方登记)。 */
181
+ | "refused"
182
+ /** **不知道落没落**:店在这一条上出了状况。如实编,禁猜(猜"成了"会谎报一次没发生的授权,猜"没成"
183
+ * 会让人以为可以重来一次,而重来会撞上一条其实已经存在的规则)。 */
184
+ | "indeterminate";
185
+ /** `indeterminate` 的成因(闭集)。 */
186
+ export type LocalImportIndeterminateCode =
187
+ /** 引擎在这一条上答了 refused,而拒因只有自由文本 ⇒ 落不了裁定,如实说"不知道"。 */
188
+ "store_refused"
189
+ /** 兑付走本身没走完(本层抛出/中断)⇒ 这一条连走都没走到。 */
190
+ | "walk_failed";
191
+ /** prepare 面的一行。判别式联合:被收下的行**没有**拒因字段可读,被拒的行**必然**带拒因 ——
192
+ * 「admitted 却带 reason」这种矛盾态在类型上不可表达。 */
193
+ export type LocalImportPreviewMember = {
194
+ key: LocalImportRuleKey;
195
+ admitted: true;
196
+ } | {
197
+ key: LocalImportRuleKey;
198
+ admitted: false;
199
+ reason: LocalImportRefusalCode;
200
+ detail: string;
201
+ };
202
+ /** 兑付回执的一行。 */
203
+ export interface LocalImportOutcomeMember {
204
+ key: LocalImportRuleKey;
205
+ outcome: LocalImportMemberOutcome;
206
+ reason?: LocalImportIndeterminateCode;
207
+ detail?: string;
208
+ }
209
+ /** 兑付回执整只 = **写进票行 `redeemed_outcome` 的逐字体**(回放同源:回放答的就是它)。 */
210
+ export interface LocalImportOutcome {
211
+ members: readonly LocalImportOutcomeMember[];
212
+ /** 这只桶在兑付结束时的 OCC 版本(与 cc-import 的 `result.rev` 同义)。 */
213
+ rev: number;
214
+ }
215
+ /** A7 prepare 的产物。第二臂(`ticket` 整键缺席)= **零可导入行** —— 与 cc-import 的「预览无票」臂
216
+ * 同形同理由(没有可确认的对象,也就没有票;键缺席即答案,不编一个 null)。 */
217
+ export type LocalImportPrepared = {
218
+ ok: true;
219
+ preview: {
220
+ members: readonly LocalImportPreviewMember[];
221
+ };
222
+ ticket: string;
223
+ expiresAtMs: number;
224
+ } | {
225
+ ok: true;
226
+ preview: {
227
+ members: readonly LocalImportPreviewMember[];
228
+ };
229
+ ticket?: undefined;
230
+ expiresAtMs?: undefined;
231
+ } | {
232
+ ok: false;
233
+ reason: "too-many-rows";
234
+ rows: number;
235
+ } | {
236
+ ok: false;
237
+ reason: "batch-too-large";
238
+ bytes: number;
239
+ };
240
+ /** A7 redeem 的结果。 */
241
+ export type LocalImportRedeemed =
242
+ /** `replayed` = 这份终局不是本次走出来的,是从票行里逐字读回来的(⑥ 丢响应重试那条路)。 */
243
+ {
244
+ ok: true;
245
+ outcome: LocalImportOutcome;
246
+ replayed: boolean;
247
+ }
248
+ /** 四类票拒(不存在 / 别人的 / 过期 / 已用过而无从回放)—— wire 面同形 404。 */
249
+ | {
250
+ ok: false;
251
+ reason: "ticket-unusable";
252
+ detail: string;
253
+ }
254
+ /** 裁定性拒绝(记录不存在 / 形太旧 / 载荷被改写)。`retryable` 与 cc-import 同义。 */
255
+ | {
256
+ ok: false;
257
+ reason: "record-unusable" | "payload-mismatch";
258
+ detail: string;
259
+ retryable?: true;
260
+ }
261
+ /** 另一条腿**正持着**这张票在走,而它在有界等待窗里没走完 ⇒ 稍后再来(409)。**不驱不猜**:
262
+ * 抢一个还活着的持有者是拿"两个走者"去换"少等两秒",方向不对。 */
263
+ | {
264
+ ok: false;
265
+ reason: "in-flight";
266
+ detail: string;
267
+ };
83
268
  /** 一次导入 prepare 的产物(HTTP 200 体的素材),或**超帽**的拒绝(见 {@link MAX_IMPORT_CANDIDATES})。
84
269
  * 5.58(design/375):零 importable 候选 ⇒ core **不铸** `approvalId`(「absence says so」)⇒ 无票可铸,
85
270
  * 第三臂把 preview(全 skipped 的理由就在里面)原样交给人看——不是错误,是「没有什么可确认」。 */
@@ -108,7 +293,7 @@ export type RuleImportRedeemed = {
108
293
  };
109
294
  }
110
295
  /** `retryable` = 这次失败**没有裁定任何事**(store 抛错 / CAS 冲突),认领已放回,属主原样重试即可。
111
- * 它与裁定性拒绝(载荷被篡改、记录不存在)分家是承重的:把两者塌成一格,一次数据库抖动就会被
296
+ * 它与裁定性拒绝(载荷被改写、记录不存在)分家是承重的:把两者塌成一格,一次数据库抖动就会被
112
297
  * 客户端读成「这张票永远不能用了」。⚠️ **wire 面仍然折成同一个 404**(零存在性 oracle 不因此松动);
113
298
  * 这一位只进服务端日志与本层的重试判据。 */
114
299
  | {
@@ -116,6 +301,19 @@ export type RuleImportRedeemed = {
116
301
  reason: "ticket-unusable" | "record-unusable" | "payload-mismatch";
117
302
  detail: string;
118
303
  retryable?: true;
304
+ }
305
+ /** #265 独立复审 件2(codex 轮二、轮三改形):首跳 `consume` 抛错后**结局歧义**的那一支 —— 认领
306
+ * 可能已提交而代次丢了,可能根本没提交,甚至可能**还在途、稍后才提交**(轮三 R3-F2:一次事后
307
+ * peek 读到 MINTED 证明不了在途的写不会迟到落地,同一场店故障也常让 peek 一起挂)。终局宣布不了
308
+ * (可能把活票说死),「票还能用」承诺不了(可能撒谎),断言「在途」也不行(那是冒充知道)——
309
+ * 唯一诚实的形是**独立的歧义响应**(503 `state.rule_ticket_unreadable`):只说「现在答不了,稍后
310
+ * 拿同一张票来读个诚实答案;届时若报 not found 就重新 prepare」。`retryable?: never`:这一臂
311
+ * 永远不许携重试承诺(它存在的全部意义就是不承诺),声明出来只为联合型上的读点可编译。 */
312
+ | {
313
+ ok: false;
314
+ reason: "state-unreadable";
315
+ detail: string;
316
+ retryable?: never;
119
317
  };
120
318
  export declare function precheckCardRuleText(text: string, command: string): EditedRuleTextPrecheck | undefined;
121
319
  export type CardRuleRedemption =
@@ -206,7 +404,18 @@ export type CardRulePersisted = {
206
404
  * 各自有自己的词,不到这里)与「预检过了但记录级仍拒」的残余竞态。到这个词时那句老话仍然成立
207
405
  * ——卡已消费、同一把 approvalId 再回决是 404。
208
406
  */
209
- | "edit-rejected";
407
+ | "edit-rejected"
408
+ /**
409
+ * core 7.0.0(#490② BREAKING B2,design/382 §4.4):silent-global 死——`prepareCardApproval`
410
+ * 在**既无显式 scope 又无 cwd**时响亮拒(`config.missing_scope`),不再默落 global。本仓的
411
+ * scope 素材=铸卡时 `ruleScopeRootFor` 咨询一次的落点(行列 `rule_scope_root`);resolver 答不出
412
+ * root 的车道(host lane 未注册 launch dir)在 v7 下就是这一形。**刻意不在兑付时刻补一个
413
+ * `process.cwd()`**:core 契约明写 cwd=被裁决调用的工作目录、never inferred from the process——
414
+ * server 进程的 cwd 不是那个坐标,编一个等于把规则锚到错误的射程上(比修前的 global 更糟)。
415
+ * 出路=部署接 `ruleScopeRootFor`(host lane 注册 launch dir),或调用方在回决体带显式 scope。
416
+ * 裁决本身照常生效(与全族同律:规则没存上不改判这次放行)。
417
+ */
418
+ | "scope-unresolved";
210
419
  detail: string;
211
420
  /** #345:core 的**共享校验器**refusal code(`RuleRejectCode`,开集透传)。覆盖门拒时**缺席** ——
212
421
  * 这条在场规则与 core `confirmRuleApproval` 的 `edit_rejected` detail 逐字同源(同一个函数体)。
@@ -252,9 +461,15 @@ export declare function serializeRuleScope(scope: RuleScope): string;
252
461
  * 的尺,撤侧自动跟。
253
462
  */
254
463
  export declare const MAX_RULE_SCOPE_CHARS: number;
464
+ /** durable 面的**二员**窄型(core 7.0.0 design/382 §4.3:consent 面三员、durable 面二员分治)。
465
+ * wire 判别式串只拼得出这两员(session 刻意无 wire 拼法——它的家在引擎的会话 overlay,不在持久店),
466
+ * 所以 parse 产物与本仓筛选行都钉在这个窄型上:`.root` 访问零猜测,session 员漏进来是编译错不是运行病。 */
467
+ export type DurableRuleScope = Exclude<RuleScope, {
468
+ kind: "session";
469
+ }>;
255
470
  /** {@link serializeRuleScope} 的逆。读不出形 ⇒ `undefined`(调用方 400,绝不猜一个 global 出来 ——
256
471
  * 猜 global 会把一次「删项目内规则」的请求变成一次删不掉任何东西的 no-op,或者更糟)。 */
257
- export declare function parseRuleScope(text: string): RuleScope | undefined;
472
+ export declare function parseRuleScope(text: string): DurableRuleScope | undefined;
258
473
  /** 一条规则在 wire 上的行 = 一个逻辑 (rule, scope) 对(design/203 v2 §6 F5)。
259
474
  * `adds` **如实上 wire**、不折叠成单值:同一条规则可以被批准过多次(不同 dot、不同来源、不同时刻),
260
475
  * 折成「一个 addedAt」会让「这条规则是我导入的还是我点过卡的」在治理面上不可分。 */
@@ -306,6 +521,10 @@ export interface RuleConsentLane {
306
521
  prepareImport(principal: string, layers: readonly RuleImportLayerInput[]): Promise<RuleImportPrepared>;
307
522
  /** 导入道:原子消费票 → confirm → redeemRuleBatch。 */
308
523
  redeemImport(principal: string, ticket: string): Promise<RuleImportRedeemed>;
524
+ /** #265 A7 直通道:逐行校验 → 预览 + pending 记录 + 票(零可导入行 ⇒ 无票)。 */
525
+ prepareLocalImport(principal: string, rows: readonly PersistedRuleWireRow[]): Promise<LocalImportPrepared>;
526
+ /** #265 A7 直通道:三态兑付(首兑 / 逐字回放 / 崩溃窗重驱),终局落进票行。 */
527
+ redeemLocalImport(principal: string, ticket: string): Promise<LocalImportRedeemed>;
309
528
  /**
310
529
  * 撤销面读半场:列出一只桶名下**活着**的规则(墓碑已折算)。
311
530
  *
@@ -339,5 +558,8 @@ export declare function createRuleConsentLane(stores: RuleConsentStores, opts?:
339
558
  newTicketId?: () => string;
340
559
  /** [4232]③ 的单调钟 seam。缺省 `performance.now()` —— 本仓既定单调域。 */
341
560
  monotonic?: () => number;
561
+ /** A7 有界等待的睡眠 seam(缺省真定时器)。等待窗与轮询步长都是**实现常数**,不是旋钮 ——
562
+ * 开成 opts 只是为了让"输者到底等没等"这件事可被确定性地钉住。 */
563
+ sleep?: (ms: number) => Promise<void>;
342
564
  }): RuleConsentLane;
343
565
  //# sourceMappingURL=rules-consent.d.ts.map