@aalis/api-reach 0.0.0-stage → 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ace Nyan <ace@acenyan.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,34 @@
1
- # Temporary Holding Version
1
+ # @aalis/api-reach
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ 触及契约:一次工具调用最多能触及本机的什么。类型、纯函数与服务描述符,服务由 `@aalis/plugin-reach` 提供。
4
+
5
+ ## 角色
6
+
7
+ - 档位 `ACCESS_TIERS`(只读、修改确认、工作区、全权)与越界策略 `BoundaryPolicy`,经 declaration merging 成为会话设置的 `accessTier`、`accessOnBoundary` 两个键。
8
+ - `resolveReach`:按主体、房间类别、档位、越界策略、污点、场所、绑定与三张清单解析出一份触及;`judgeReach` 判一个目标放行、问或拒。
9
+ - `protectedLists`:按家目录布局、用户家目录、平台与安装集的形态生成宿主控制面、持久化与自动执行落点、拒读清单;`withRealRoots` 按调用方取好的真实路径补上链接出去的根;`matchesRule` 判一个路径落不落在某条规则里。工具边界与沙箱用同一份清单。
10
+ - `sandboxPolicyOf`:按触及生成沙箱策略 `SandboxPolicy`。
11
+ - 触及凭据 `ReachCredential` 的类型与品牌符号 `REACH_CREDENTIAL`、`isReachCredential`:凭据只由触及插件构造,工具从调用上下文取得后转交给存储与沙箱。
12
+ - 服务描述符 `reach`(`ReachService`):`forCall` 按一次工具调用签发凭据,`markTainted` 记会话的污点,`provenanceOf` 查白纸的来源账本。
13
+
14
+ ## 安装
15
+
16
+ ```bash
17
+ pnpm add @aalis/api-reach
18
+ ```
19
+
20
+ ## 使用
21
+
22
+ ```ts
23
+ import { judgeReach, protectedLists, resolveReach } from '@aalis/api-reach';
24
+
25
+ const lists = protectedLists({ paths, userHome, platform: process.platform, form: 'npm', codeDirs: [] });
26
+ const reach = resolveReach({ principal: 'owner', roomClass: 'owner-only', tier: 'workspace', onBoundary: 'ask', /* … */ lists, paths });
27
+ judgeReach(reach, { effect: 'write', path: '/<项目>/src/a.ts' }); // { verdict: 'allow' }
28
+ ```
29
+
30
+ 规则详见文档站的 api-reach 页。
31
+
32
+ ## 许可
33
+
34
+ 见仓库根目录 LICENSE。
@@ -0,0 +1,298 @@
1
+ /**
2
+ * @aalis/api-reach — 触及契约
3
+ *
4
+ * 一次工具调用最多能触及本机的什么:先按「主体 × 房间类别」定上限,只有 owner 在受众只有 owner 的会话里有本地效果;
5
+ * 再按档位收窄,按污点把送出会话的动作改成问;子任务另与父会话实时的触及取较小值。本包只有类型与纯函数:
6
+ * - 档位与越界策略,经 declaration merging 成为会话设置的两个键;
7
+ * - `resolveReach` 解析出一份触及,`judgeReach` 判一个目标放行、问或拒;
8
+ * - `protectedLists` 生成宿主控制面、持久化与自动执行落点、拒读清单三张清单,`withRealRoots` 按真实路径补上链接出去的根,
9
+ * 工具边界与沙箱用同一份;
10
+ * - `sandboxPolicyOf` 按触及生成沙箱策略;
11
+ * - 触及凭据 `ReachCredential` 的类型与品牌符号:凭据只由触及插件构造,工具从调用上下文取得后转交;
12
+ * - 触及服务 `reach`:按一次工具调用签发凭据,存会话的污点与白纸的来源账本。
13
+ *
14
+ * 路径一律是真实路径:符号链接已解开;目标不存在时,取最近存在的祖先的真实路径,再接上后面不存在的各段。由调用方取好再交进来。
15
+ */
16
+ import type { OriginTurn } from '@aalis/api-authority';
17
+ import type { HostPaths } from '@aalis/api-host-paths';
18
+ import type { RoomClass, WorkBinding } from '@aalis/api-session-manager';
19
+ /** 权限四档,从低到高:只读、修改确认、工作区、全权。降档即在这张表里往前挪 */
20
+ export declare const ACCESS_TIERS: readonly ["readonly", "confirm", "workspace", "full"];
21
+ export type AccessTier = (typeof ACCESS_TIERS)[number];
22
+ /**
23
+ * 越界策略:需要问的时候在场就问、不在场按拒绝(ask),或一律直接拒绝(deny)。对修改确认档不起作用,那一档本身就是逐步确认
24
+ */
25
+ export type BoundaryPolicy = 'ask' | 'deny';
26
+ declare module '@aalis/api-session-manager' {
27
+ interface SessionConfig {
28
+ /** 档位:只对 owner 自己的会话起作用,子会话按根会话实时取 */
29
+ accessTier?: AccessTier;
30
+ /** 越界策略:子会话按根会话实时取 */
31
+ accessOnBoundary?: BoundaryPolicy;
32
+ }
33
+ }
34
+ /**
35
+ * 路径匹配:`path` 是这个路径与它下面的全部;`pattern` 是对整条路径的正则(源码),只用锚点、字符类、分组与选择、量词,
36
+ * 沙箱的生成器才翻译得了。macOS 与 Windows 上不分大小写,Windows 上反斜杠按斜杠比较
37
+ */
38
+ export type PathMatcher = {
39
+ readonly path: string;
40
+ } | {
41
+ readonly pattern: string;
42
+ };
43
+ /** 清单里的一条:命中 matcher 且不在 except 里 */
44
+ export type PathRule = PathMatcher & {
45
+ readonly except?: readonly PathMatcher[];
46
+ };
47
+ /** 路径落在这条规则里:命中它、且不在它的例外里 */
48
+ export declare function matchesRule(rule: PathRule, path: string, platform: NodeJS.Platform): boolean;
49
+ export interface ProtectedListsInput {
50
+ /** 家目录布局 */
51
+ readonly paths: HostPaths;
52
+ /** 操作系统用户的家目录 */
53
+ readonly userHome: string;
54
+ readonly platform: NodeJS.Platform;
55
+ /** 安装集的形态:源码形态下有 packages/;npm 形态是 create-aalis 生成的项目,家目录在安装集里 */
56
+ readonly form: 'source' | 'npm';
57
+ /** 安装集以外、守护进程加载了代码的目录,如经链接装进来的插件 */
58
+ readonly codeDirs: readonly string[];
59
+ /** 守护进程的入口文件(启动脚本的真实路径),取不到时不给;只在 npm 形态下归宿主控制面 */
60
+ readonly entry?: string;
61
+ }
62
+ export interface ProtectedLists {
63
+ readonly platform: NodeJS.Platform;
64
+ /** 宿主控制面:任何档位都拒绝写,不可申请 */
65
+ readonly control: readonly PathRule[];
66
+ /**
67
+ * 持久化与自动执行落点:只读与工作区档按越界策略问或拒,修改确认档问,全权写入并记审计。装着落点的目录本身也算,
68
+ * 免得在别处摆好整棵子树再改名到位。伪装裸仓库要的 HEAD 与不叫 .git 的 git 目录由触及按它的 git 目录补上
69
+ */
70
+ readonly landing: readonly PathRule[];
71
+ /** 拒读清单:工具边界在任何档位都拒读,沙箱里同样读不到;在宿主上执行的命令(全权、修改确认,以及批准过的宿主执行)约束不到 */
72
+ readonly denyRead: readonly PathRule[];
73
+ }
74
+ /** 按家目录布局、用户家目录与平台生成三张清单 */
75
+ export declare function protectedLists(input: ProtectedListsInput): ProtectedLists;
76
+ /**
77
+ * 按真实路径补一份:以具体路径为根的规则,根的路径上有符号链接(`realOf` 给出的真实路径与写法不同)时,按真实路径再加
78
+ * 一份同样的规则,根下的例外随根挪过去。真实路径由调用方在激活时取好,路径不存在的不给;激活之后链接改指向不跟踪
79
+ */
80
+ export declare function withRealRoots(lists: ProtectedLists, realOf: (path: string) => string | undefined): ProtectedLists;
81
+ /** 发起这一轮的主体。子任务不自己定主体,随发起它的父会话实时的触及 */
82
+ export type ReachPrincipal = 'owner' | 'other' | {
83
+ readonly subtaskOf: Reach;
84
+ };
85
+ export interface ReachInput {
86
+ readonly principal: ReachPrincipal;
87
+ /** 会话的房间类别(子会话取根会话的) */
88
+ readonly roomClass: RoomClass;
89
+ /** 生效的档位与越界策略(子会话取根会话的) */
90
+ readonly tier: AccessTier;
91
+ readonly onBoundary: BoundaryPolicy;
92
+ /** 这个会话读进过谁的内容(来源称呼);不给或为空即干净 */
93
+ readonly tainted?: readonly string[];
94
+ /** 场所的主目录与白纸:默认工作区两者是同一处,项目工作区的主目录是绑定目录 */
95
+ readonly place: {
96
+ readonly home: string;
97
+ readonly paper: string;
98
+ };
99
+ /** 项目会话的附加可写目录与本会话树建的 worktree */
100
+ readonly binding?: Pick<WorkBinding, 'extraRoots' | 'worktrees'>;
101
+ /** 绑定所在仓库的 git 目录(common dir):工作区档可写,落点除外 */
102
+ readonly gitDirs: readonly string[];
103
+ /** 本会话临时区 */
104
+ readonly sessionTmp: string;
105
+ /** 别人的内容所在:别人场所的白纸与来源账本里的文件。文件工具读得到(读了计污点),干净回合的沙箱读不到、改不了 */
106
+ readonly othersContent: readonly string[];
107
+ /** 沙箱里拒连的本机端口 */
108
+ readonly localPorts: readonly number[];
109
+ readonly lists: ProtectedLists;
110
+ readonly paths: HostPaths;
111
+ }
112
+ /** 有本地效果的触及:只有 owner 在受众只有 owner 的会话里才有 */
113
+ export interface LocalReach {
114
+ /** 命令在哪执行:只读与工作区档在沙箱里,修改确认与全权在宿主上 */
115
+ readonly exec: 'sandbox' | 'host';
116
+ readonly tier: AccessTier;
117
+ readonly onBoundary: BoundaryPolicy;
118
+ /** 读进过谁的内容;干净时没有 */
119
+ readonly tainted?: readonly string[];
120
+ /** 场所的主目录与白纸 */
121
+ readonly home: string;
122
+ readonly paper: string;
123
+ readonly sessionTmp: string;
124
+ readonly skills: string;
125
+ /** 工作区档的可写范围:场所的主目录与白纸、附加可写目录、本会话树建的 worktree;其余档位为空 */
126
+ readonly workRoots: readonly string[];
127
+ /**
128
+ * 沙箱两档不问就能写的根:只读档只有本会话临时区;工作区档是 workRoots、仓库的 git 目录、本会话临时区与技能目录
129
+ * (受污染时写技能目录属于送出会话,工具边界问、沙箱拒)。修改确认与全权为空
130
+ */
131
+ readonly writable: readonly string[];
132
+ readonly othersContent: readonly string[];
133
+ readonly localPorts: readonly number[];
134
+ /** 这份触及的三张清单:落点按仓库的 git 目录补上(见 resolveReach) */
135
+ readonly lists: ProtectedLists;
136
+ }
137
+ /** 一份触及:没有本地效果时读写执行一律拒,联网交给资格轴 */
138
+ export type Reach = {
139
+ readonly exec: 'none';
140
+ } | LocalReach;
141
+ /**
142
+ * 解析触及:只有 owner(子任务随父会话)在 owner-only 的会话里有本地效果;子任务的档位、越界策略取与父会话较严的那个,
143
+ * 污点并上父会话的。落点按这份触及的 git 目录补上:git 目录不一定叫 .git(裸仓库、分开放的 git 目录),它本身与
144
+ * 它里面的落点照样拦;伪装裸仓库要的 HEAD 是落点,.git 与这些 git 目录里的除外
145
+ */
146
+ export declare function resolveReach(input: ReachInput): Reach;
147
+ /**
148
+ * 要判的一个目标:读写的真实路径;写一份编排定义(按 id,不是路径);执行一条命令(host 为要在沙箱外执行);
149
+ * 联网(模型给的任意网址、要联网的命令、插件固定的服务商)
150
+ */
151
+ export type ReachRequest = {
152
+ readonly effect: 'read' | 'write';
153
+ readonly path: string;
154
+ } | {
155
+ readonly effect: 'write';
156
+ readonly workflow: string;
157
+ } | {
158
+ readonly effect: 'exec';
159
+ readonly host: boolean;
160
+ } | {
161
+ readonly effect: 'network';
162
+ readonly via: 'url' | 'command' | 'provider';
163
+ };
164
+ /** 要问的原因:修改确认档、越界(范围外写、宿主执行、只读档联网)、写落点、受污染后送出会话 */
165
+ export type ReachAskReason = {
166
+ readonly kind: 'tier';
167
+ } | {
168
+ readonly kind: 'boundary';
169
+ readonly target: 'write-path' | 'host-exec' | 'network';
170
+ } | {
171
+ readonly kind: 'landing';
172
+ } | {
173
+ readonly kind: 'outbound';
174
+ };
175
+ /**
176
+ * 判定:放行(全权写落点另带 landing,要记审计);问;拒——没有本地效果、宿主控制面与拒读清单不可申请,
177
+ * 越界策略为拒的带着本来要问的原因
178
+ */
179
+ export type ReachDecision = {
180
+ readonly verdict: 'allow';
181
+ readonly landing?: true;
182
+ } | {
183
+ readonly verdict: 'ask';
184
+ readonly reason: ReachAskReason;
185
+ } | {
186
+ readonly verdict: 'deny';
187
+ readonly rule: 'no-local-effect' | 'control-plane' | 'deny-read';
188
+ } | {
189
+ readonly verdict: 'deny';
190
+ readonly rule: 'boundary-policy';
191
+ readonly reason: ReachAskReason;
192
+ };
193
+ /** 判一个目标放行、问或拒 */
194
+ export declare function judgeReach(reach: Reach, request: ReachRequest): ReachDecision;
195
+ /**
196
+ * 沙箱策略:只由触及生成,工具不自己拼。各段的先后(后面的压过前面的),生成器照这个顺序翻译:
197
+ * - 读:默认可读 → readDeny 拒 → readAllowWithin 放回 → provenanceDeny 拒;
198
+ * - 写:默认拒 → write 放 → writeDeny 拒 → writeExceptions 放回 → controlDeny 拒 → provenanceDeny 拒。
199
+ */
200
+ export interface SandboxPolicy {
201
+ /** 拒读清单(规则自带例外) */
202
+ readonly readDeny: readonly PathRule[];
203
+ /** 拒读之后放回:本会话临时区 */
204
+ readonly readAllowWithin: readonly string[];
205
+ /** 干净回合里别人的内容:拒读拒写,排在一切放行之后;受污染时为空 */
206
+ readonly provenanceDeny: readonly string[];
207
+ /** 可写的根,含这条命令批准过的范围外写 */
208
+ readonly write: readonly string[];
209
+ /** 落点拒写;受污染时另拒技能目录(写它属于送出会话,批准过的那几处除外) */
210
+ readonly writeDeny: readonly PathRule[];
211
+ /** 拒写之后放回:锚定在可写范围各根下的项目内 node_modules(受污染时技能目录里的不放回),与这条命令按落点批准过的确切路径 */
212
+ readonly writeExceptions: readonly PathRule[];
213
+ /** 宿主控制面拒写,排在所有放行与例外之后 */
214
+ readonly controlDeny: readonly PathRule[];
215
+ /** on:IP 出网,减去 localPorts */
216
+ readonly network: 'off' | 'on';
217
+ /** 拒连的本机端口 */
218
+ readonly localPorts: readonly number[];
219
+ /** 可连的 unix socket 所在的目录:可写范围与本会话临时区,其余一律拒连,与 network 无关 */
220
+ readonly unixSockets: readonly string[];
221
+ }
222
+ /** 这条命令批准过的提权:按批准时的原因分开放,批准一个目录不连带放回它下面的落点 */
223
+ export interface SandboxGrants {
224
+ /** 按范围外写,或受污染时写技能目录(送出会话)批准的路径:并进可写的根,其下的落点照样拒写 */
225
+ readonly writePaths?: readonly string[];
226
+ /** 按落点批准的路径:在拒写之后只放回这一个确切路径 */
227
+ readonly landingPaths?: readonly string[];
228
+ readonly network?: boolean;
229
+ }
230
+ /** 按触及生成这条命令的沙箱策略;命令不在沙箱里执行的触及(没有本地效果、修改确认、全权)没有沙箱策略 */
231
+ export declare function sandboxPolicyOf(reach: Reach, grants?: SandboxGrants): SandboxPolicy;
232
+ /**
233
+ * 凭据的品牌:只有触及插件构造的凭据带它(不可枚举,展开复制出来的对象不带),存储与沙箱据此把不带它的对象当作没有凭据。
234
+ * 它防的是漏传、误传:第一方包由架构守卫禁止拼凭据,插件是可信代码,进程内蓄意伪造挡不住。登记在全局符号表里,
235
+ * 进程里装了两份本包时也认得
236
+ */
237
+ export declare const REACH_CREDENTIAL: unique symbol;
238
+ /** require 的结果:拒绝时 message 是回给模型的话(被哪条规则拦下、能不能申请、能申请时的最窄目标) */
239
+ export type ReachVerdict = {
240
+ readonly allowed: true;
241
+ } | {
242
+ readonly allowed: false;
243
+ readonly message: string;
244
+ };
245
+ /**
246
+ * 触及凭据:按一次工具调用签发,只由触及插件构造;工具从调用上下文取得后转交给存储与沙箱。exec、home、paper、tainted
247
+ * 按签发时的触及;require、allows、sandboxPolicy 与 noteWrite 每次按会话当时的设置与污点重算,降档与受污染立即生效
248
+ */
249
+ export interface ReachCredential {
250
+ readonly [REACH_CREDENTIAL]: true;
251
+ /** 这个会话读进过谁的内容(来源称呼),执行面闸据它给确认卡写来源;没有即干净。全权档不带:全权不提示 */
252
+ readonly tainted?: readonly string[];
253
+ /** 命令在哪执行;none 即这次调用没有本地效果 */
254
+ readonly exec: 'none' | 'sandbox' | 'host';
255
+ /** 场所的主目录与白纸:当前目录没有值时取 home,不写输出位置的工具写进 paper;没有本地效果时不带 */
256
+ readonly home?: string;
257
+ readonly paper?: string;
258
+ /** 判一个模型给的目标,要问时经审批服务问;批准过的记作这次调用的一次性目标 */
259
+ require(request: ReachRequest): Promise<ReachVerdict>;
260
+ /** 存储兜底:同步判一个真实路径能不能读写,含这次调用批准过的一次性目标 */
261
+ allows(effect: 'read' | 'write', realPath: string): boolean;
262
+ /**
263
+ * 这条命令的沙箱策略,带上这次调用批准过的提权:范围外写并进可写的根(其下的落点照样拒写),按落点批准的只放回那一个
264
+ * 确切路径;只在 exec 为 sandbox 时可取
265
+ */
266
+ sandboxPolicy(): SandboxPolicy;
267
+ /**
268
+ * 子进程环境:取自 owner 的 login shell(在场所的主目录下取一次),沙箱内去掉凭据类变量并注入沙箱要的几项,宿主执行用完整的。
269
+ * 没有本地效果的凭据抛错
270
+ */
271
+ processEnv(mode: 'sandbox' | 'host'): Promise<Record<string, string>>;
272
+ /** 经凭据写进白纸时调用:受污染回合的写入记进来源账本 */
273
+ noteWrite(realPath: string): void;
274
+ }
275
+ /** 带品牌符号的对象才是凭据 */
276
+ export declare function isReachCredential(value: unknown): value is ReachCredential;
277
+ /** 来源账本的一条:受污染的会话经凭据写进白纸的文件 */
278
+ export interface ProvenanceRecord {
279
+ /** 写入它的会话 */
280
+ readonly sessionId: string;
281
+ /** 写入时这个会话读进过谁的内容 */
282
+ readonly sources: readonly string[];
283
+ readonly at: number;
284
+ }
285
+ export interface ReachService {
286
+ /**
287
+ * 按一次工具调用签发凭据:发起类别取权限服务的 originOf,会话与绑定取会话管理里的记录。没有本地效果的调用拿到
288
+ * exec 为 none 的凭据
289
+ */
290
+ forCall(call: OriginTurn): Promise<ReachCredential>;
291
+ /** 记下这个会话读进了别人写的内容(来源称呼,至少一个):粘在会话上,之后签发的凭据都带着 */
292
+ markTainted(sessionId: string, sources: readonly string[]): void;
293
+ /** 白纸里一个文件(真实路径)在来源账本里的记录;没有记录的文件按 owner 写的算 */
294
+ provenanceOf(realPath: string): ProvenanceRecord | undefined;
295
+ }
296
+ /** 调用型服务:业务层就是提供者的形状 */
297
+ export declare const reach: import("@aalis/core").ServiceDescriptor<ReachService, ReachService>;
298
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,330 @@
1
+ /**
2
+ * @aalis/api-reach — 触及契约
3
+ *
4
+ * 一次工具调用最多能触及本机的什么:先按「主体 × 房间类别」定上限,只有 owner 在受众只有 owner 的会话里有本地效果;
5
+ * 再按档位收窄,按污点把送出会话的动作改成问;子任务另与父会话实时的触及取较小值。本包只有类型与纯函数:
6
+ * - 档位与越界策略,经 declaration merging 成为会话设置的两个键;
7
+ * - `resolveReach` 解析出一份触及,`judgeReach` 判一个目标放行、问或拒;
8
+ * - `protectedLists` 生成宿主控制面、持久化与自动执行落点、拒读清单三张清单,`withRealRoots` 按真实路径补上链接出去的根,
9
+ * 工具边界与沙箱用同一份;
10
+ * - `sandboxPolicyOf` 按触及生成沙箱策略;
11
+ * - 触及凭据 `ReachCredential` 的类型与品牌符号:凭据只由触及插件构造,工具从调用上下文取得后转交;
12
+ * - 触及服务 `reach`:按一次工具调用签发凭据,存会话的污点与白纸的来源账本。
13
+ *
14
+ * 路径一律是真实路径:符号链接已解开;目标不存在时,取最近存在的祖先的真实路径,再接上后面不存在的各段。由调用方取好再交进来。
15
+ */
16
+ import { defineService } from '@aalis/core';
17
+ // ════════════════════════════════════════════════════════════
18
+ // 档位
19
+ // ════════════════════════════════════════════════════════════
20
+ /** 权限四档,从低到高:只读、修改确认、工作区、全权。降档即在这张表里往前挪 */
21
+ export const ACCESS_TIERS = ['readonly', 'confirm', 'workspace', 'full'];
22
+ /** 路径落在这条规则里:命中它、且不在它的例外里 */
23
+ export function matchesRule(rule, path, platform) {
24
+ return hit(rule, path, platform) && !rule.except?.some(matcher => hit(matcher, path, platform));
25
+ }
26
+ function hit(matcher, path, platform) {
27
+ const key = keyOf(path, platform);
28
+ if ('pattern' in matcher)
29
+ return new RegExp(matcher.pattern, foldsCase(platform) ? 'i' : '').test(key);
30
+ const root = keyOf(matcher.path, platform);
31
+ return key === root || key.startsWith(root.endsWith('/') ? root : `${root}/`);
32
+ }
33
+ const foldsCase = (platform) => platform === 'darwin' || platform === 'win32';
34
+ const slash = (path, platform) => (platform === 'win32' ? path.replaceAll('\\', '/') : path);
35
+ const keyOf = (path, platform) => foldsCase(platform) ? slash(path, platform).toLowerCase() : slash(path, platform);
36
+ /** 把一个路径原样嵌进正则 */
37
+ const literal = (path, platform) => slash(path, platform).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
38
+ const MAC_BROWSERS = [
39
+ 'Library/Application Support/Google',
40
+ 'Library/Application Support/Chromium',
41
+ 'Library/Application Support/BraveSoftware',
42
+ 'Library/Application Support/Microsoft Edge',
43
+ 'Library/Application Support/Microsoft Edge Beta',
44
+ 'Library/Application Support/Microsoft Edge Dev',
45
+ 'Library/Application Support/Microsoft Edge Canary',
46
+ 'Library/Application Support/Firefox',
47
+ 'Library/Application Support/Vivaldi',
48
+ 'Library/Application Support/Arc',
49
+ 'Library/Application Support/com.operasoftware.Opera',
50
+ 'Library/Application Support/com.operasoftware.OperaGX',
51
+ 'Library/Safari',
52
+ 'Library/Containers/com.apple.Safari',
53
+ 'Library/Cookies',
54
+ ];
55
+ const LINUX_BROWSERS = [
56
+ '.config/google-chrome',
57
+ '.config/google-chrome-beta',
58
+ '.config/google-chrome-unstable',
59
+ '.config/chromium',
60
+ '.config/BraveSoftware',
61
+ '.config/microsoft-edge',
62
+ '.config/microsoft-edge-beta',
63
+ '.config/microsoft-edge-dev',
64
+ '.config/vivaldi',
65
+ '.config/opera',
66
+ '.mozilla',
67
+ 'snap/firefox',
68
+ 'snap/chromium',
69
+ 'snap/brave',
70
+ // Flatpak 装的浏览器
71
+ '.var/app/org.mozilla.firefox',
72
+ '.var/app/com.google.Chrome',
73
+ '.var/app/org.chromium.Chromium',
74
+ '.var/app/com.brave.Browser',
75
+ '.var/app/com.microsoft.Edge',
76
+ ];
77
+ /**
78
+ * git 目录里的落点(接在 git 目录后面):钩子、配置、commondir(git 把它指向的目录当共用目录,配置与钩子都从那里取);
79
+ * 子模块的名字可以带斜杠、可以嵌套,按目录名列不全,modules 整棵都算;worktree 的管理目录本身也算,免得整棵改名到位
80
+ */
81
+ const GIT_DIR_LANDING = '(hooks(/|$)|config$|(.+/)?(config\\.worktree|commondir)$|modules(/|$)|worktrees(/[^/]+)?$)';
82
+ /** 按家目录布局、用户家目录与平台生成三张清单 */
83
+ export function protectedLists(input) {
84
+ const { paths, platform } = input;
85
+ const mac = platform === 'darwin';
86
+ const linux = platform === 'linux';
87
+ // 用户家目录是根目录(容器里常见)时拼出的是 /.ssh,不是 //.ssh
88
+ const userHome = input.userHome.replace(/\/+$/, '');
89
+ const inUserHome = (...rels) => rels.map(rel => ({ path: `${userHome}/${rel}` }));
90
+ /** 路径的上一级 */
91
+ const parentOf = (path) => path.slice(0, Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\')));
92
+ /** 任何目录下的同名条目 */
93
+ const named = (tail) => ({ pattern: `/${tail}` });
94
+ return {
95
+ platform,
96
+ control: [
97
+ // 家目录下只有白纸、临时区与技能目录可写:公开区只经发布插件写入,编排定义只经定义工具写入。主配置与 secrets.yaml
98
+ // 常链接到别处(dotfiles 仓库),另以它们为根各列一条,才能按真实路径补上(withRealRoots)
99
+ { path: paths.home, except: [{ path: paths.stage.paper }, { path: paths.tmp }, { path: paths.self.skills }] },
100
+ { path: paths.config },
101
+ { path: paths.secrets },
102
+ // 守护进程加载的代码:安装集的依赖与构建产物(源码形态下另有各包的),以及安装集以外加载的插件
103
+ { path: `${paths.app}/node_modules` },
104
+ { path: `${paths.app}/dist` },
105
+ { pattern: `^${literal(paths.app, platform)}/packages/[^/]+/(dist|node_modules)(/|$)` },
106
+ ...input.codeDirs.map(path => ({ path })),
107
+ // npm 形态:每次启动在宿主上执行的入口,与插件发现读依赖的 package.json(源码形态下它们是在改的源码)
108
+ ...(input.form === 'npm'
109
+ ? [{ path: `${paths.app}/package.json` }, ...(input.entry ? [{ path: input.entry }] : [])]
110
+ : []),
111
+ ],
112
+ landing: [
113
+ // git:.git 本身(子模块工作树里文件形式的也是),与它里面的落点
114
+ named(`\\.git($|/${GIT_DIR_LANDING})`),
115
+ // shell 与登录
116
+ ...inUserHome('.profile', '.bashrc', '.bash_profile', '.bash_login', '.bash_logout', '.zshenv', '.zprofile', '.zshrc', '.zlogin', '.zlogout', '.kshrc', '.cshrc', '.tcshrc', '.login', '.logout', '.config/fish', '.ssh', '.gitconfig', '.config/git'),
117
+ ...(mac ? inUserHome('Library/LaunchAgents') : []),
118
+ ...(linux ? inUserHome('.config/systemd/user', '.config/autostart') : []),
119
+ // 装着上面这些的目录本身
120
+ ...['.config', ...(linux ? ['.config/systemd'] : []), ...(mac ? ['Library'] : [])].map(rel => ({
121
+ pattern: `^${literal(`${userHome}/${rel}`, platform)}$`,
122
+ })),
123
+ // 项目里会被工具自动执行的配置,其他代理与编辑器的可执行配置
124
+ named('\\.envrc$'),
125
+ named('\\.(vscode|claude|cursor|codex)$'),
126
+ named('\\.vscode/(tasks|settings)\\.json$'),
127
+ named('[^/]*\\.code-workspace$'),
128
+ named('\\.husky(/|$)'),
129
+ named('\\.pre-commit-config\\.yaml$'),
130
+ named('\\.claude/settings(\\.local)?\\.json$'),
131
+ named('\\.mcp\\.json$'),
132
+ named('\\.cursor/(hooks|mcp|permissions|sandbox|cli)\\.json$'),
133
+ named('\\.codex/(config\\.toml|hooks\\.json)$'),
134
+ named('\\.codex/(rules|hooks)(/|$)'),
135
+ // 项目指令与项目级设置;实例家目录自己也可能叫 .aalis,不算,但它里面(如白纸里的项目)再出现的照样算
136
+ named('(AALIS|AGENTS)\\.md$'),
137
+ { pattern: '/\\.aalis(/|$)', except: [{ path: paths.home }] },
138
+ { pattern: `^${literal(paths.home, platform)}/.+/\\.aalis(/|$)` },
139
+ ],
140
+ denyRead: [
141
+ // 家目录下只放行舞台、self 两个目录整个、本实例的日志与主配置;本会话临时区由触及按会话放回。secrets.yaml 另列一条,
142
+ // 理由同宿主控制面
143
+ {
144
+ path: paths.home,
145
+ except: [parentOf(paths.stage.paper), parentOf(paths.self.skills), paths.logs, paths.config].map(path => ({
146
+ path,
147
+ })),
148
+ },
149
+ { path: paths.secrets },
150
+ // 同一用户下其他实例的家目录
151
+ { pattern: `^${literal(userHome, platform)}/\\.aalis(-[^/]*)?(/|$)`, except: [{ path: paths.home }] },
152
+ // 凭据
153
+ ...inUserHome('.ssh', '.aws', '.config/gh', '.gnupg', '.npmrc', '.netrc', '.git-credentials', '.docker/config.json', '.kube/config'),
154
+ ...(mac ? inUserHome('Library/Keychains') : []),
155
+ { pattern: '/\\.env[^/]*(/|$)', except: [{ pattern: '/\\.env\\.(example|sample|template)$' }] },
156
+ // 浏览器的配置与数据
157
+ ...(mac ? inUserHome(...MAC_BROWSERS) : []),
158
+ ...(linux ? inUserHome(...LINUX_BROWSERS) : []),
159
+ ],
160
+ };
161
+ }
162
+ /**
163
+ * 按真实路径补一份:以具体路径为根的规则,根的路径上有符号链接(`realOf` 给出的真实路径与写法不同)时,按真实路径再加
164
+ * 一份同样的规则,根下的例外随根挪过去。真实路径由调用方在激活时取好,路径不存在的不给;激活之后链接改指向不跟踪
165
+ */
166
+ export function withRealRoots(lists, realOf) {
167
+ const { platform } = lists;
168
+ const expand = (rules) => rules.flatMap((rule) => {
169
+ if (!('path' in rule))
170
+ return [rule];
171
+ const root = rule.path;
172
+ const real = realOf(root);
173
+ if (real === undefined || keyOf(real, platform) === keyOf(root, platform))
174
+ return [rule];
175
+ const moved = (matcher) => 'path' in matcher && hit({ path: root }, matcher.path, platform)
176
+ ? { path: real + matcher.path.slice(root.length) }
177
+ : matcher;
178
+ return [rule, { path: real, ...(rule.except && { except: rule.except.map(moved) }) }];
179
+ });
180
+ return { ...lists, control: expand(lists.control), landing: expand(lists.landing), denyRead: expand(lists.denyRead) };
181
+ }
182
+ const NO_LOCAL = Object.freeze({ exec: 'none' });
183
+ /**
184
+ * 解析触及:只有 owner(子任务随父会话)在 owner-only 的会话里有本地效果;子任务的档位、越界策略取与父会话较严的那个,
185
+ * 污点并上父会话的。落点按这份触及的 git 目录补上:git 目录不一定叫 .git(裸仓库、分开放的 git 目录),它本身与
186
+ * 它里面的落点照样拦;伪装裸仓库要的 HEAD 是落点,.git 与这些 git 目录里的除外
187
+ */
188
+ export function resolveReach(input) {
189
+ const { principal } = input;
190
+ const parent = typeof principal === 'object' ? principal.subtaskOf : undefined;
191
+ if (parent?.exec === 'none' || principal === 'other' || input.roomClass !== 'owner-only')
192
+ return NO_LOCAL;
193
+ const tier = parent
194
+ ? ACCESS_TIERS[Math.min(ACCESS_TIERS.indexOf(input.tier), ACCESS_TIERS.indexOf(parent.tier))]
195
+ : input.tier;
196
+ const sources = [...new Set([...(input.tainted ?? []), ...(parent?.tainted ?? [])])];
197
+ const tainted = sources.length > 0 ? sources : undefined;
198
+ const { home, paper } = input.place;
199
+ const skills = input.paths.self.skills;
200
+ const workRoots = tier === 'workspace'
201
+ ? [...new Set([home, paper, ...(input.binding?.extraRoots ?? []), ...(input.binding?.worktrees ?? [])])]
202
+ : [];
203
+ const writable = tier === 'workspace'
204
+ ? [...new Set([...workRoots, ...input.gitDirs, input.sessionTmp, skills])]
205
+ : tier === 'readonly'
206
+ ? [input.sessionTmp]
207
+ : [];
208
+ const landing = [
209
+ ...input.lists.landing,
210
+ { pattern: '/HEAD$', except: [{ pattern: '/\\.git/' }, ...input.gitDirs.map(path => ({ path }))] },
211
+ ...input.gitDirs.map(dir => ({ pattern: `^${literal(dir, input.lists.platform)}($|/${GIT_DIR_LANDING})` })),
212
+ ];
213
+ return {
214
+ exec: tier === 'readonly' || tier === 'workspace' ? 'sandbox' : 'host',
215
+ tier,
216
+ onBoundary: parent?.onBoundary === 'deny' ? 'deny' : input.onBoundary,
217
+ ...(tainted ? { tainted } : {}),
218
+ home,
219
+ paper,
220
+ sessionTmp: input.sessionTmp,
221
+ skills,
222
+ workRoots,
223
+ writable,
224
+ othersContent: input.othersContent,
225
+ localPorts: input.localPorts,
226
+ lists: { ...input.lists, landing },
227
+ };
228
+ }
229
+ const ALLOW = { verdict: 'allow' };
230
+ const TIER = { kind: 'tier' };
231
+ const LANDING = { kind: 'landing' };
232
+ const OUTBOUND = { kind: 'outbound' };
233
+ const WRITE_PATH = { kind: 'boundary', target: 'write-path' };
234
+ /** 判一个目标放行、问或拒 */
235
+ export function judgeReach(reach, request) {
236
+ if (reach.exec === 'none')
237
+ return request.effect === 'network' ? ALLOW : { verdict: 'deny', rule: 'no-local-effect' };
238
+ const { tier, lists } = reach;
239
+ const ask = (reason) => tier !== 'confirm' && reach.onBoundary === 'deny'
240
+ ? { verdict: 'deny', rule: 'boundary-policy', reason }
241
+ : { verdict: 'ask', reason };
242
+ const within = (root, path) => matchesRule({ path: root }, path, lists.platform);
243
+ const listed = (rules, path) => rules.some(rule => matchesRule(rule, path, lists.platform));
244
+ // 受污染时全权以外的档位:送出会话的动作要问
245
+ const outbound = reach.tainted !== undefined && tier !== 'full';
246
+ switch (request.effect) {
247
+ case 'read':
248
+ return within(reach.sessionTmp, request.path) || !listed(lists.denyRead, request.path)
249
+ ? ALLOW
250
+ : { verdict: 'deny', rule: 'deny-read' };
251
+ case 'exec':
252
+ if (tier === 'full')
253
+ return ALLOW;
254
+ if (tier === 'confirm')
255
+ return ask(TIER);
256
+ return request.host ? ask({ kind: 'boundary', target: 'host-exec' }) : ALLOW;
257
+ case 'network':
258
+ if (outbound && request.via !== 'provider')
259
+ return ask(OUTBOUND);
260
+ return tier === 'readonly' ? ask({ kind: 'boundary', target: 'network' }) : ALLOW;
261
+ case 'write':
262
+ if ('path' in request) {
263
+ const { path } = request;
264
+ if (listed(lists.control, path))
265
+ return { verdict: 'deny', rule: 'control-plane' };
266
+ if (listed(lists.landing, path))
267
+ return tier === 'full' ? { verdict: 'allow', landing: true } : ask(LANDING);
268
+ if (!within(reach.skills, path)) {
269
+ if (tier === 'full')
270
+ return ALLOW;
271
+ if (tier === 'confirm')
272
+ return ask(TIER);
273
+ return reach.writable.some(root => within(root, path)) ? ALLOW : ask(WRITE_PATH);
274
+ }
275
+ }
276
+ // 技能目录与编排定义:受污染时属于送出会话;干净时与工作区档的可写范围同等
277
+ if (outbound)
278
+ return ask(OUTBOUND);
279
+ if (tier === 'confirm')
280
+ return ask(TIER);
281
+ return tier === 'readonly' ? ask(WRITE_PATH) : ALLOW;
282
+ }
283
+ }
284
+ /** 按触及生成这条命令的沙箱策略;命令不在沙箱里执行的触及(没有本地效果、修改确认、全权)没有沙箱策略 */
285
+ export function sandboxPolicyOf(reach, grants = {}) {
286
+ if (reach.exec !== 'sandbox')
287
+ throw new Error(`这次调用的命令不在沙箱里执行(${reach.exec}),没有沙箱策略`);
288
+ const { platform } = reach.lists;
289
+ const writePaths = grants.writePaths ?? [];
290
+ // 技能目录里批准过的那几处:只可能是写技能本身批准的(装着技能目录的范围外目录不算)
291
+ const approvedSkills = writePaths
292
+ .filter(path => matchesRule({ path: reach.skills }, path, platform))
293
+ .map(path => ({ path }));
294
+ return {
295
+ readDeny: reach.lists.denyRead,
296
+ readAllowWithin: [reach.sessionTmp],
297
+ provenanceDeny: reach.tainted ? [] : reach.othersContent,
298
+ write: [...reach.writable, ...writePaths],
299
+ writeDeny: reach.tainted
300
+ ? [...reach.lists.landing, { path: reach.skills, except: approvedSkills }]
301
+ : reach.lists.landing,
302
+ writeExceptions: [
303
+ ...reach.workRoots.map(root => ({
304
+ pattern: `^${literal(root, platform)}/(.*/)?node_modules/`,
305
+ ...(reach.tainted ? { except: [{ path: reach.skills }] } : {}),
306
+ })),
307
+ ...(grants.landingPaths ?? []).map(path => ({ pattern: `^${literal(path, platform)}$` })),
308
+ ],
309
+ controlDeny: reach.lists.control,
310
+ network: grants.network || (reach.tier === 'workspace' && !reach.tainted) ? 'on' : 'off',
311
+ localPorts: reach.localPorts,
312
+ unixSockets: [...reach.workRoots, reach.sessionTmp],
313
+ };
314
+ }
315
+ // ════════════════════════════════════════════════════════════
316
+ // 凭据
317
+ // ════════════════════════════════════════════════════════════
318
+ /**
319
+ * 凭据的品牌:只有触及插件构造的凭据带它(不可枚举,展开复制出来的对象不带),存储与沙箱据此把不带它的对象当作没有凭据。
320
+ * 它防的是漏传、误传:第一方包由架构守卫禁止拼凭据,插件是可信代码,进程内蓄意伪造挡不住。登记在全局符号表里,
321
+ * 进程里装了两份本包时也认得
322
+ */
323
+ export const REACH_CREDENTIAL = Symbol.for('@aalis/api-reach/credential');
324
+ /** 带品牌符号的对象才是凭据 */
325
+ export function isReachCredential(value) {
326
+ return typeof value === 'object' && value !== null && value[REACH_CREDENTIAL] === true;
327
+ }
328
+ /** 调用型服务:业务层就是提供者的形状 */
329
+ export const reach = defineService('reach');
330
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,43 @@
1
1
  {
2
2
  "name": "@aalis/api-reach",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/AalisLabs/Aalis.git",
8
+ "directory": "packages/api-reach"
9
+ },
10
+ "author": "Ace Nyan <ace@acenyan.com>",
11
+ "bugs": {
12
+ "url": "https://github.com/AalisLabs/Aalis/issues"
13
+ },
14
+ "homepage": "https://github.com/AalisLabs/Aalis#readme",
15
+ "type": "module",
16
+ "main": "dist/index.js",
17
+ "types": "dist/index.d.ts",
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "dependencies": {
22
+ "@aalis/api-authority": ">=0.11.0 <1.0.0",
23
+ "@aalis/api-host-paths": ">=0.1.0 <1.0.0",
24
+ "@aalis/api-session-manager": ">=0.11.0 <1.0.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^22.0.0",
28
+ "typescript": "^5.7.0",
29
+ "@aalis/core": "0.20.0"
30
+ },
31
+ "peerDependencies": {
32
+ "@aalis/core": ">=0.20.0 <1.0.0"
33
+ },
34
+ "keywords": [
35
+ "aalis",
36
+ "aalis-api"
37
+ ],
38
+ "description": "触及契约:档位、按主体与房间类别定上限的触及解析、三张受保护清单、沙箱策略、触及凭据的类型与触及服务描述符",
39
+ "scripts": {
40
+ "build": "tsc",
41
+ "dev": "tsc --watch"
42
+ }
6
43
  }