@sema-agent/server 7.9.0 → 7.11.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/USAGE.md +6 -0
- package/dist/adoption/plan.d.ts +152 -0
- package/dist/adoption/plan.js +513 -0
- package/dist/adoption/runner.d.ts +54 -0
- package/dist/adoption/runner.js +505 -0
- package/dist/adoption/sql.d.ts +76 -0
- package/dist/adoption/sql.js +106 -0
- package/dist/adoption/wire.d.ts +250 -0
- package/dist/adoption/wire.js +153 -0
- package/dist/approval-card.d.ts +24 -0
- package/dist/approval-card.js +32 -0
- package/dist/approval-reconciler.d.ts +1 -1
- package/dist/approval-reconciler.js +1 -1
- package/dist/boot/adoption.d.ts +30 -0
- package/dist/boot/adoption.js +57 -0
- package/dist/boot/coordinators.d.ts +4 -0
- package/dist/boot/coordinators.js +3 -1
- package/dist/boot/parked-revive-gate.d.ts +38 -5
- package/dist/boot/parked-revive-gate.js +53 -6
- package/dist/boot/reapers.js +3 -3
- package/dist/boot/runner-deps.d.ts +10 -2
- package/dist/boot/runner-deps.js +12 -1
- package/dist/capabilities/repo-tools.d.ts +36 -2
- package/dist/capabilities/repo-tools.js +125 -11
- package/dist/capabilities/scenarios.d.ts +2 -2
- package/dist/capabilities/scenarios.js +1 -1
- package/dist/config-types.d.ts +22 -2
- package/dist/config.js +44 -2
- package/dist/fleet/fleet-terminal-window.d.ts +1 -1
- package/dist/fleet/fleet-terminal-window.js +1 -1
- package/dist/git-api-kind.d.ts +7 -0
- package/dist/git-api-kind.js +8 -0
- package/dist/http/routes/adoption.d.ts +26 -0
- package/dist/http/routes/adoption.js +120 -0
- package/dist/http/routes/approvals-assistant.js +2 -2
- package/dist/http/routes/capabilities.js +12 -0
- package/dist/http/routes/rules.d.ts +23 -0
- package/dist/http/routes/rules.js +117 -0
- package/dist/http/routes/shared-memory.d.ts +31 -0
- package/dist/http/routes/shared-memory.js +181 -0
- package/dist/http/routes/trace-usage.js +139 -3
- package/dist/http/server.d.ts +19 -1
- package/dist/http/server.js +47 -5
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/main.js +54 -5
- package/dist/observability/fail-open.d.ts +8 -0
- package/dist/observability/fail-open.js +8 -0
- package/dist/plugins/adoption-log-sql.d.ts +191 -0
- package/dist/plugins/adoption-log-sql.js +273 -0
- package/dist/plugins/checkpoint-store-sql.d.ts +22 -9
- package/dist/plugins/checkpoint-store-sql.js +40 -29
- package/dist/plugins/local-checkpoint-store.d.ts +11 -1
- package/dist/plugins/local-checkpoint-store.js +10 -2
- package/dist/plugins/memory-engine-pg.js +3 -3
- package/dist/plugins/permission-rule-store-sql.d.ts +242 -0
- package/dist/plugins/permission-rule-store-sql.js +817 -0
- package/dist/plugins/pg-pool.js +44 -7
- package/dist/plugins/run-store-sql.d.ts +3 -3
- package/dist/plugins/run-store-sql.js +3 -3
- package/dist/plugins/session-policy-store-sql.d.ts +6 -0
- package/dist/plugins/session-policy-store-sql.js +7 -1
- package/dist/plugins/shared-memory-store-sql.d.ts +223 -0
- package/dist/plugins/shared-memory-store-sql.js +516 -0
- package/dist/plugins/store-backend.d.ts +30 -0
- package/dist/plugins/store-backend.js +14 -0
- package/dist/plugins/tidb-pool.js +55 -8
- package/dist/plugins/workflow-journal-store-sql.d.ts +3 -3
- package/dist/plugins/workflow-journal-store-sql.js +6 -6
- package/dist/plugins/workflow-run-store-sql.d.ts +1 -1
- package/dist/plugins/workflow-run-store-sql.js +12 -12
- package/dist/rules-consent.d.ts +126 -0
- package/dist/rules-consent.js +198 -0
- package/dist/run-local.js +2 -2
- package/dist/shared-memory-scope-authorizer.d.ts +29 -0
- package/dist/shared-memory-scope-authorizer.js +17 -0
- package/dist/tool-approval.d.ts +55 -0
- package/dist/tool-approval.js +124 -5
- package/dist/trace/core-keyset-guard.d.ts +2 -2
- package/dist/trace/project.d.ts +1 -0
- package/dist/trace/project.js +1 -0
- package/package.json +3 -3
package/USAGE.md
CHANGED
|
@@ -413,6 +413,12 @@ curl -s http://<host>:8090/v1/runs/<taskId> -H 'x-agent-principal: user:42' #
|
|
|
413
413
|
> 不是裸主机名——服务端直接拼 `${GIT_API_BASEURL}/api/v1/...` 发请求,裸 `git.example.com` 会拼出非法 URL 而 fetch 失败。
|
|
414
414
|
> 末尾不要带 `/`,也不要把 `/api/v1` 写进来。
|
|
415
415
|
|
|
416
|
+
> **`GIT_API_KIND`(7.10.0 起)**:Git host 方言,闭集 `gitea`(缺省)/ `github`。GitHub 托管仓
|
|
417
|
+
> (github.com 或 GHE)设 `GIT_API_KIND=github`,此时 `GIT_API_BASEURL` 写 **API 根**(github.com 用
|
|
418
|
+
> `https://api.github.com`;GHE 用 `https://ghe.example.com/api/v3`),token 用 fine-grained PAT
|
|
419
|
+
> (仅 contents/pull-requests 只读)。未知词拒启;`GIT_API_BASEURL` 指向 github.com 族而 kind 仍是
|
|
420
|
+
> gitea 也拒启并指路(Gitea 形状对 GitHub 恒 404,启动即报优于运行时逐调用 404)。
|
|
421
|
+
|
|
416
422
|
> **升级注记(7.7.0)**:本版起 `code-review` / `scan` / `team` / `toolset: repo-readonly|none` 的场景改跑
|
|
417
423
|
> 无执行环境的引擎。**升级前**若还有这些场景的 durable 挂起任务(需同时满足:配了 `REMOTE_EXEC`、开了
|
|
418
424
|
> `DURABLE_APPROVAL`、任务已 park),它们在新版上续跑会以 409 `checkpoint.unsupported_version` 响亮失败
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { AdoptionLegAction, AdoptionNotMigrated } from "./wire.js";
|
|
2
|
+
/** 身份值的编码:`verbatim` = 列里存的就是 principal 本身;`memory-scope` = core 的 v2 typed scope 键。 */
|
|
3
|
+
export type IdentityEncoding = "verbatim" | "memory-scope";
|
|
4
|
+
/**
|
|
5
|
+
* 腿的执行形。
|
|
6
|
+
* · `bulk-rebind` —— 通用的等值 UPDATE(绝大多数腿);
|
|
7
|
+
* · `session-policy-rekey` —— 逐行**重算主键**(policy_key = sha256([sessionId, principal]),身份在键的
|
|
8
|
+
* hash 原像里,等值 UPDATE 够不着);
|
|
9
|
+
* · `blob-rewrite` —— 逐行改写 **JSON 载荷列**里的身份字段。
|
|
10
|
+
*
|
|
11
|
+
* 🔴 `blob-rewrite` 为什么必须存在(codex 对抗复审 R1-F2,亲核属实):本仓有三张表的 JSON 载荷是**真源**,
|
|
12
|
+
* 身份列只是它的投影,而读面读的是载荷:
|
|
13
|
+
* · `workflow_run.run` —— `get()` 是 `JSON.parse(run)` 且**只**覆盖 `rev`(store 行内注写死),
|
|
14
|
+
* 所以只改 `scope` 列的话 `get().scope` 仍是旧身份;调用方把它回传给 scope-guarded 的 `update()`
|
|
15
|
+
* 就再也命中不了已迁移的行 = **活的 workflow 被挂死**;
|
|
16
|
+
* · `background_agent.record_json` —— store 自己的注写着「真源在 record_json,摘要投影截断是诚实形」;
|
|
17
|
+
* · `checkpoint.checkpoint` —— core `Checkpoint.scope` 的类型注写着「Multi-tenant isolation key」。
|
|
18
|
+
* 只迁投影 = 库里两份身份说法不一致,而**说了算的那份没迁**。这一形在空表上完全无声(集成种子若把载荷
|
|
19
|
+
* 写成 `{}` 就永远测不出来)。
|
|
20
|
+
*/
|
|
21
|
+
export type LegKind = "bulk-rebind" | "session-policy-rekey" | "blob-rewrite";
|
|
22
|
+
/** `blob-rewrite` 腿的坐标。 */
|
|
23
|
+
export interface BlobRewriteSpec {
|
|
24
|
+
/** JSON 载荷列(真源)。 */
|
|
25
|
+
readonly column: string;
|
|
26
|
+
/** 定位行的主键列(逐行改写要按它回写)。 */
|
|
27
|
+
readonly pk: readonly string[];
|
|
28
|
+
/** 载荷里携带身份值的**顶层**字段(值等于旧身份时才改 —— 绝不盲改)。 */
|
|
29
|
+
readonly fields: readonly string[];
|
|
30
|
+
/** 除 `matchColumn` 外还要 OR 上的匹配列(同表另一根轴;漏了它,只在那根轴上带旧身份的行找不到)。 */
|
|
31
|
+
readonly alsoMatch?: readonly string[];
|
|
32
|
+
/**
|
|
33
|
+
* 该表自己的乐观并发守卫列(三张载荷表都有 `rev`)。
|
|
34
|
+
*
|
|
35
|
+
* 🔴 为什么必须绑它(codex R2-F1,亲核属实):载荷改写是「读-改-写」,中间那道窗里若有一次正常业务写
|
|
36
|
+
* 提交,盲写会把它**整条盖掉** —— 而这三张表的正常写路径本来都是 rev-CAS 守着的,收编凭什么可以绕过?
|
|
37
|
+
* 绑上之后:`affected === 0` ⇒ 有人在窗里动过这一行 ⇒ **响亮抛**,整个事务回滚(两侧字节零变更),
|
|
38
|
+
* 而不是静默丢一次别人的写。
|
|
39
|
+
*/
|
|
40
|
+
readonly revColumn: string;
|
|
41
|
+
/**
|
|
42
|
+
* 载荷里**内嵌**的 rev 字段名(有的表把 rev 同时写进 JSON 真源)。在场则与列上的 `rev + 1` 同步推进
|
|
43
|
+
* —— 否则改写之后列与载荷各说一个版本号,而这两处正是那些店的 CAS 读写两端。
|
|
44
|
+
* 缺席 = 该载荷没有版本字段(core `Checkpoint` 就没有;它的 rev 纯粹是服务端列)。
|
|
45
|
+
*/
|
|
46
|
+
readonly revInPayload?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface RebindLegSpec {
|
|
49
|
+
/** 腿的稳定标识(回执 `legs[].store`)= `<表名>#<身份轴>`。下游按它对账,改名 = wire 破坏。 */
|
|
50
|
+
readonly leg: string;
|
|
51
|
+
readonly table: string;
|
|
52
|
+
readonly kind: LegKind;
|
|
53
|
+
readonly action: AdoptionLegAction;
|
|
54
|
+
/** 携带同一个身份值、必须一起改的列(键列的字节孪生 `*_key` 与可读列并列时两个都在)。 */
|
|
55
|
+
readonly columns: readonly string[];
|
|
56
|
+
/** WHERE 谓词匹配的那一列(必属 {@link columns})。 */
|
|
57
|
+
readonly matchColumn: string;
|
|
58
|
+
readonly encoding: IdentityEncoding;
|
|
59
|
+
/**
|
|
60
|
+
* 唯一键**去掉身份轴**之后剩下的列。`undefined` = 没有任何唯一键含这根轴 ⇒ 重写不可能撞键
|
|
61
|
+
* (preflight 对它是**结构性无冲突**,不是「没查」)。`[]` = 唯一键**就是**这根轴本身
|
|
62
|
+
* (agent_memory_engine_cursor 的 PK(scope))⇒ 两侧各有任意一行即冲突。
|
|
63
|
+
*/
|
|
64
|
+
readonly residualKey: readonly string[] | undefined;
|
|
65
|
+
/** 仅 `blob-rewrite` 腿在场。 */
|
|
66
|
+
readonly blob?: BlobRewriteSpec;
|
|
67
|
+
readonly why: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 全部重绑腿。**次序即执行序**(同一事务内顺序跑):同表两轴相邻,workflow 家族相邻
|
|
71
|
+
* (183 §4.3「run + journal 同事务」在本车是「**全部腿同一个事务**」的更强形)。
|
|
72
|
+
*/
|
|
73
|
+
export declare const REBIND_LEGS: readonly RebindLegSpec[];
|
|
74
|
+
/**
|
|
75
|
+
* server 侧**按设计不迁**的面(183 §12 裁决号在案)。这份清单进回执的 `notMigratedByDesign`,
|
|
76
|
+
* 让「按设计不迁」与「漏了没迁」在黑盒上可分(183 §10.5)。
|
|
77
|
+
*
|
|
78
|
+
* 🔴 D1 三员为什么同族:它们全是**按对齐窗口分桶的治理瞬态计数**(usage_window / cost_quota /
|
|
79
|
+
* rate_limit),窗口语义与身份绑在一起搬过去要跨窗口对齐,复杂度与价值不成比例;清零重计的代价是
|
|
80
|
+
* 新身份在当前窗口拿到一份新额度 —— 一次性部署级动作里这是可接受的,而且**方向偏松不偏紧**,
|
|
81
|
+
* 不会把人锁在门外。
|
|
82
|
+
* 🔴 D2 三员为什么不改:它们是**谁在什么时候做了什么**的史实字段。改写史实 = 伪造审计。
|
|
83
|
+
*/
|
|
84
|
+
/**
|
|
85
|
+
* 🔴 本数组的成员集合必须与 {@link NOT_MIGRATED_FACES}(冻结词表)**全等** —— 词表说有而这里没有
|
|
86
|
+
* 就是一条下游按名写了断言、回执里却永远不出现的幽灵成员。等式由 `test/adoption-arc.test.ts` 钉住。
|
|
87
|
+
* (建表时真发生过:`outcome-ledger` 一度只进了词表 —— 它压根没有身份轴,属于「无可迁」而不是
|
|
88
|
+
* 「按设计不迁」,两者混在一起会让 D2 的语义从「史实不改写」滑成「凡是没迁的都算设计」。)
|
|
89
|
+
*/
|
|
90
|
+
export declare const NOT_MIGRATED_BY_DESIGN: readonly AdoptionNotMigrated[];
|
|
91
|
+
/**
|
|
92
|
+
* 受影响部署配置清单(183 §6 表的 server 投影)。`migrated` **恒 false** —— 这些配置住在别的部署单元,
|
|
93
|
+
* 收编动作够不到;183 §3.3 的明令是「改不到的配置,不假装改了」。清单在场就是「无缺席」那一半,
|
|
94
|
+
* 「不迁必红」那一半由消费端围栏(§10.4)执行。
|
|
95
|
+
*/
|
|
96
|
+
export interface ConfigTemplate {
|
|
97
|
+
readonly deployment: string;
|
|
98
|
+
readonly key: string;
|
|
99
|
+
/** `%TO%` 在铸清单时替换成 `toPrincipal`。 */
|
|
100
|
+
readonly requiredValue: string;
|
|
101
|
+
}
|
|
102
|
+
export declare const AFFECTED_CONFIG_TEMPLATES: readonly ConfigTemplate[];
|
|
103
|
+
/**
|
|
104
|
+
* 目的地身份值的**列宽约束**(codex 对抗复审 R1-F3,亲核属实)。
|
|
105
|
+
*
|
|
106
|
+
* 🔴 病:请求面收 ≤190 字符的 principal,而迁移腿要把它写进**最窄**只有 `VARCHAR(64)` 的列
|
|
107
|
+
* (`sandbox_image_index.tenant_id`),两根键列还是 `VARBINARY(190)`(**字节**,不是字符),memory scope
|
|
108
|
+
* 更是在 principal 外面再套前缀 + 百分号编码(非 ASCII 膨胀约 9 倍)。于是一个**合法**请求可以跑到腿的
|
|
109
|
+
* 中途才被库以截断/超宽打回 —— 那时 phase 停在 INTENT,每次重发与每次 boot 扫描都会再撞一次同样的墙。
|
|
110
|
+
*
|
|
111
|
+
* 🔴 姿势:在**铸行之前**按最窄真列校验并 typed 拒(fail-closed)。**不**在这里加自动截断——截断身份
|
|
112
|
+
* 就是把 A 的数据交给 B。
|
|
113
|
+
*
|
|
114
|
+
* 另一条可选解是把 `tenant_id` 拓宽到与其它身份列同宽(183/codex 的「统一身份契约」建议)。本车不动
|
|
115
|
+
* 别的特性的 schema:那是一次跨车道的列变更,该由镜像面属主拍。此处如实登记这条不对称。
|
|
116
|
+
*/
|
|
117
|
+
export declare const IDENTITY_WIDTH_LIMITS: readonly {
|
|
118
|
+
readonly what: string;
|
|
119
|
+
readonly unit: "chars" | "bytes";
|
|
120
|
+
readonly max: number;
|
|
121
|
+
}[];
|
|
122
|
+
/** memory scope 列宽(两方言 VARCHAR(190) 同宽;段编码后才是真长度)。 */
|
|
123
|
+
export declare const MEMORY_SCOPE_MAX_CHARS = 190;
|
|
124
|
+
/**
|
|
125
|
+
* 目的地身份能不能被每一根被写列容纳?返回**人可读的拒绝理由**,`undefined` = 可以。
|
|
126
|
+
* 纯函数(零 I/O),所以校验发生在任何库动作之前。
|
|
127
|
+
*/
|
|
128
|
+
export declare function checkAdoptionWidths(fromPrincipal: string, toPrincipal: string): string | undefined;
|
|
129
|
+
/** `proj:` / `userproj:` 键的 tenant 段前缀(值对由 DISTINCT 扫描按前缀解出)。 */
|
|
130
|
+
export declare const MEMORY_PROJECT_SCOPE_PREFIXES: readonly string[];
|
|
131
|
+
/**
|
|
132
|
+
* 一根身份轴上,「旧值 → 新值」的**值对**。`verbatim` 轴恒只有一对;`memory-scope` 轴的对数 =
|
|
133
|
+
* 该 principal 名下 user 盘 1 个 + 每个 project 盘各 1 个(由库里 DISTINCT 扫出来,不靠猜)。
|
|
134
|
+
*/
|
|
135
|
+
export interface IdentityValuePair {
|
|
136
|
+
readonly from: string;
|
|
137
|
+
readonly to: string;
|
|
138
|
+
}
|
|
139
|
+
/** `verbatim` 轴的值对(纯数据,零 I/O)。 */
|
|
140
|
+
export declare function buildVerbatimPair(fromPrincipal: string, toPrincipal: string): IdentityValuePair;
|
|
141
|
+
/**
|
|
142
|
+
* memory scope 键的重写(纯函数,给扫描出来的每个 scope 值算新值)。
|
|
143
|
+
* · `user:<enc(from)>` ⇒ `user:<enc(to)>`(逐字等值);
|
|
144
|
+
* · `proj:<enc(from)>/…` / `userproj:<enc(from)>/…` ⇒ 只换 tenant 段,项目段原样;
|
|
145
|
+
* · 其它(`org:` 组织盘、无前缀的旧不透明键)⇒ `undefined` = **不属这个 principal,不动**。
|
|
146
|
+
*
|
|
147
|
+
* 🔴 为什么不用 `LIKE '<prefix>%'`:段是**百分号编码**的(`user%3Aweb-demo`),`%` 在 LIKE 里是通配符,
|
|
148
|
+
* 不逐字符转义就会误命中一大片。用「DISTINCT 扫 + 纯函数判前缀」把这道坑整个绕开:判定在 JS 里做,
|
|
149
|
+
* 落到 SQL 的永远只有**等值**谓词。
|
|
150
|
+
*/
|
|
151
|
+
export declare function rewriteMemoryScope(scope: string, fromPrincipal: string, toPrincipal: string): string | undefined;
|
|
152
|
+
//# sourceMappingURL=plan.d.ts.map
|