@aalis/api-reach 0.0.0-stage → 0.2.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 +21 -0
- package/README.md +33 -2
- package/dist/index.d.ts +259 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +299 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -3
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
|
-
#
|
|
1
|
+
# @aalis/api-reach
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
触及契约:一次工具调用最多能触及本机的什么。类型、纯函数与服务描述符,服务由 `@aalis/plugin-reach` 提供。
|
|
4
|
+
|
|
5
|
+
## 角色
|
|
6
|
+
|
|
7
|
+
- 档位 `ACCESS_TIERS`(只读、修改确认、工作区、全权)与越界策略 `BoundaryPolicy`。
|
|
8
|
+
- `resolveReach`:按主体、档位、越界策略、场所、绑定与三张清单解析出一份触及;`judgeReach` 判一个目标放行、问或拒。
|
|
9
|
+
- `protectedLists`:按家目录布局、用户家目录、平台与安装集的形态生成宿主控制面、持久化与自动执行落点、拒读清单;`withRealRoots` 按调用方取好的真实路径补上链接出去的根;`matchesRule` 判一个路径落不落在某条规则里。工具边界与沙箱用同一份清单。
|
|
10
|
+
- `sandboxPolicyOf`:按触及生成沙箱策略 `SandboxPolicy`。
|
|
11
|
+
- 触及凭据 `ReachCredential` 的类型与品牌符号 `REACH_CREDENTIAL`、`isReachCredential`:凭据只由触及插件构造,工具从调用上下文取得后转交给存储与沙箱。
|
|
12
|
+
- 服务描述符 `reach`(`ReachService`):`forCall` 按一次工具调用签发凭据。
|
|
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', 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。
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aalis/api-reach — 触及契约
|
|
3
|
+
*
|
|
4
|
+
* 一次工具调用最多能触及本机的什么:先按这一轮的主体定上限,主体是 owner 的有本地效果,不看会话(主体见权限服务的
|
|
5
|
+
* principalOf);再按档位收窄。本包只有类型与纯函数:
|
|
6
|
+
* - 档位与越界策略;
|
|
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 { 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
|
+
/**
|
|
27
|
+
* 路径匹配:`path` 是这个路径与它下面的全部;`pattern` 是对整条路径的正则(源码),只用锚点、字符类、分组与选择、量词,
|
|
28
|
+
* 沙箱的生成器才翻译得了。macOS 与 Windows 上不分大小写,Windows 上反斜杠按斜杠比较
|
|
29
|
+
*/
|
|
30
|
+
export type PathMatcher = {
|
|
31
|
+
readonly path: string;
|
|
32
|
+
} | {
|
|
33
|
+
readonly pattern: string;
|
|
34
|
+
};
|
|
35
|
+
/** 清单里的一条:命中 matcher 且不在 except 里 */
|
|
36
|
+
export type PathRule = PathMatcher & {
|
|
37
|
+
readonly except?: readonly PathMatcher[];
|
|
38
|
+
};
|
|
39
|
+
/** 路径落在这条规则里:命中它、且不在它的例外里 */
|
|
40
|
+
export declare function matchesRule(rule: PathRule, path: string, platform: NodeJS.Platform): boolean;
|
|
41
|
+
export interface ProtectedListsInput {
|
|
42
|
+
/** 家目录布局 */
|
|
43
|
+
readonly paths: HostPaths;
|
|
44
|
+
/** 操作系统用户的家目录 */
|
|
45
|
+
readonly userHome: string;
|
|
46
|
+
readonly platform: NodeJS.Platform;
|
|
47
|
+
/** 安装集的形态:源码形态下有 packages/;npm 形态是 create-aalis 生成的项目,家目录在安装集里 */
|
|
48
|
+
readonly form: 'source' | 'npm';
|
|
49
|
+
/** 安装集以外、守护进程加载了代码的目录,如经链接装进来的插件 */
|
|
50
|
+
readonly codeDirs: readonly string[];
|
|
51
|
+
/** 守护进程的入口文件(启动脚本的真实路径),取不到时不给;只在 npm 形态下归宿主控制面 */
|
|
52
|
+
readonly entry?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ProtectedLists {
|
|
55
|
+
readonly platform: NodeJS.Platform;
|
|
56
|
+
/** 宿主控制面:任何档位都拒绝写,不可申请 */
|
|
57
|
+
readonly control: readonly PathRule[];
|
|
58
|
+
/**
|
|
59
|
+
* 持久化与自动执行落点:只读与工作区档按越界策略问或拒,修改确认档问,全权写入并记审计。装着落点的目录本身也算,
|
|
60
|
+
* 免得在别处摆好整棵子树再改名到位。伪装裸仓库要的 HEAD 与不叫 .git 的 git 目录由触及按它的 git 目录补上
|
|
61
|
+
*/
|
|
62
|
+
readonly landing: readonly PathRule[];
|
|
63
|
+
/** 拒读清单:工具边界在任何档位都拒读,沙箱里同样读不到;在宿主上执行的命令(全权、修改确认,以及批准过的宿主执行)约束不到 */
|
|
64
|
+
readonly denyRead: readonly PathRule[];
|
|
65
|
+
}
|
|
66
|
+
/** 按家目录布局、用户家目录与平台生成三张清单 */
|
|
67
|
+
export declare function protectedLists(input: ProtectedListsInput): ProtectedLists;
|
|
68
|
+
/**
|
|
69
|
+
* 按真实路径补一份:以具体路径为根的规则,根的路径上有符号链接(`realOf` 给出的真实路径与写法不同)时,按真实路径再加
|
|
70
|
+
* 一份同样的规则,根下的例外随根挪过去。真实路径由调用方在激活时取好,路径不存在的不给;激活之后链接改指向不跟踪
|
|
71
|
+
*/
|
|
72
|
+
export declare function withRealRoots(lists: ProtectedLists, realOf: (path: string) => string | undefined): ProtectedLists;
|
|
73
|
+
/** 发起这一轮的主体(权限服务的 principalOf) */
|
|
74
|
+
export type ReachPrincipal = 'owner' | 'other';
|
|
75
|
+
export interface ReachInput {
|
|
76
|
+
readonly principal: ReachPrincipal;
|
|
77
|
+
/** 生效的档位与越界策略(子会话取根会话的) */
|
|
78
|
+
readonly tier: AccessTier;
|
|
79
|
+
readonly onBoundary: BoundaryPolicy;
|
|
80
|
+
/** 场所的主目录与白纸:默认工作区两者是同一处,项目工作区的主目录是绑定目录 */
|
|
81
|
+
readonly place: {
|
|
82
|
+
readonly home: string;
|
|
83
|
+
readonly paper: string;
|
|
84
|
+
};
|
|
85
|
+
/** 项目会话的附加可写目录与本会话树建的 worktree */
|
|
86
|
+
readonly binding?: Pick<WorkBinding, 'extraRoots' | 'worktrees'>;
|
|
87
|
+
/** 绑定所在仓库的 git 目录(common dir):工作区档可写,落点除外 */
|
|
88
|
+
readonly gitDirs: readonly string[];
|
|
89
|
+
/** 本会话临时区 */
|
|
90
|
+
readonly sessionTmp: string;
|
|
91
|
+
/** 沙箱里拒连的本机端口 */
|
|
92
|
+
readonly localPorts: readonly number[];
|
|
93
|
+
readonly lists: ProtectedLists;
|
|
94
|
+
readonly paths: HostPaths;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 有本地效果的触及:只有主体是 owner 的调用才有(续做与子任务的类别随起它的那一轮,主体按这次调用的参与者,批过的按批的人)
|
|
98
|
+
*/
|
|
99
|
+
export interface LocalReach {
|
|
100
|
+
/** 命令在哪执行:只读与工作区档在沙箱里,修改确认与全权在宿主上 */
|
|
101
|
+
readonly exec: 'sandbox' | 'host';
|
|
102
|
+
readonly tier: AccessTier;
|
|
103
|
+
readonly onBoundary: BoundaryPolicy;
|
|
104
|
+
/** 场所的主目录与白纸 */
|
|
105
|
+
readonly home: string;
|
|
106
|
+
readonly paper: string;
|
|
107
|
+
readonly sessionTmp: string;
|
|
108
|
+
/** 工作区档的可写范围:场所的主目录与白纸、附加可写目录、本会话树建的 worktree;其余档位为空 */
|
|
109
|
+
readonly workRoots: readonly string[];
|
|
110
|
+
/**
|
|
111
|
+
* 沙箱两档不问就能写的根:只读档只有本会话临时区;工作区档是 workRoots、仓库的 git 目录、本会话临时区与技能目录。
|
|
112
|
+
* 修改确认与全权为空
|
|
113
|
+
*/
|
|
114
|
+
readonly writable: readonly string[];
|
|
115
|
+
readonly localPorts: readonly number[];
|
|
116
|
+
/** 这份触及的三张清单:落点按仓库的 git 目录补上(见 resolveReach) */
|
|
117
|
+
readonly lists: ProtectedLists;
|
|
118
|
+
}
|
|
119
|
+
/** 一份触及:没有本地效果时读写执行一律拒,联网交给资格轴 */
|
|
120
|
+
export type Reach = {
|
|
121
|
+
readonly exec: 'none';
|
|
122
|
+
} | LocalReach;
|
|
123
|
+
/**
|
|
124
|
+
* 解析触及:只有主体是 owner 的一轮有本地效果。落点按这份触及的 git 目录补上:git 目录不一定叫 .git(裸仓库、分开放的
|
|
125
|
+
* git 目录),它本身与它里面的落点照样拦;伪装裸仓库要的 HEAD 是落点,.git 与这些 git 目录里的除外
|
|
126
|
+
*/
|
|
127
|
+
export declare function resolveReach(input: ReachInput): Reach;
|
|
128
|
+
/**
|
|
129
|
+
* 要判的一个目标:读写的真实路径;写一份编排定义(按 id,不是路径);执行一条命令(host 为要在沙箱外执行);
|
|
130
|
+
* 联网(模型给的任意网址、要联网的命令、插件固定的服务商)
|
|
131
|
+
*/
|
|
132
|
+
export type ReachRequest = {
|
|
133
|
+
readonly effect: 'read' | 'write';
|
|
134
|
+
readonly path: string;
|
|
135
|
+
} | {
|
|
136
|
+
readonly effect: 'write';
|
|
137
|
+
readonly workflow: string;
|
|
138
|
+
} | {
|
|
139
|
+
readonly effect: 'exec';
|
|
140
|
+
readonly host: boolean;
|
|
141
|
+
} | {
|
|
142
|
+
readonly effect: 'network';
|
|
143
|
+
readonly via: 'url' | 'command' | 'provider';
|
|
144
|
+
};
|
|
145
|
+
/** 要问的原因:修改确认档、越界(范围外写、宿主执行、只读档联网)、写落点 */
|
|
146
|
+
export type ReachAskReason = {
|
|
147
|
+
readonly kind: 'tier';
|
|
148
|
+
} | {
|
|
149
|
+
readonly kind: 'boundary';
|
|
150
|
+
readonly target: 'write-path' | 'host-exec' | 'network';
|
|
151
|
+
} | {
|
|
152
|
+
readonly kind: 'landing';
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* 判定:放行(全权写落点另带 landing,要记审计);问;拒——没有本地效果、宿主控制面与拒读清单不可申请,
|
|
156
|
+
* 越界策略为拒的带着本来要问的原因
|
|
157
|
+
*/
|
|
158
|
+
export type ReachDecision = {
|
|
159
|
+
readonly verdict: 'allow';
|
|
160
|
+
readonly landing?: true;
|
|
161
|
+
} | {
|
|
162
|
+
readonly verdict: 'ask';
|
|
163
|
+
readonly reason: ReachAskReason;
|
|
164
|
+
} | {
|
|
165
|
+
readonly verdict: 'deny';
|
|
166
|
+
readonly rule: 'no-local-effect' | 'control-plane' | 'deny-read';
|
|
167
|
+
} | {
|
|
168
|
+
readonly verdict: 'deny';
|
|
169
|
+
readonly rule: 'boundary-policy';
|
|
170
|
+
readonly reason: ReachAskReason;
|
|
171
|
+
};
|
|
172
|
+
/** 判一个目标放行、问或拒 */
|
|
173
|
+
export declare function judgeReach(reach: Reach, request: ReachRequest): ReachDecision;
|
|
174
|
+
/**
|
|
175
|
+
* 沙箱策略:只由触及生成,工具不自己拼。各段的先后(后面的压过前面的),生成器照这个顺序翻译:
|
|
176
|
+
* - 读:默认可读 → readDeny 拒 → readAllowWithin 放回;
|
|
177
|
+
* - 写:默认拒 → write 放 → writeDeny 拒 → writeExceptions 放回 → controlDeny 拒。
|
|
178
|
+
*/
|
|
179
|
+
export interface SandboxPolicy {
|
|
180
|
+
/** 拒读清单(规则自带例外) */
|
|
181
|
+
readonly readDeny: readonly PathRule[];
|
|
182
|
+
/** 拒读之后放回:本会话临时区 */
|
|
183
|
+
readonly readAllowWithin: readonly string[];
|
|
184
|
+
/** 可写的根,含这条命令批准过的范围外写 */
|
|
185
|
+
readonly write: readonly string[];
|
|
186
|
+
/** 落点拒写 */
|
|
187
|
+
readonly writeDeny: readonly PathRule[];
|
|
188
|
+
/** 拒写之后放回:锚定在可写范围各根下的项目内 node_modules,与这条命令按落点批准过的确切路径 */
|
|
189
|
+
readonly writeExceptions: readonly PathRule[];
|
|
190
|
+
/** 宿主控制面拒写,排在所有放行与例外之后 */
|
|
191
|
+
readonly controlDeny: readonly PathRule[];
|
|
192
|
+
/** on:IP 出网,减去 localPorts */
|
|
193
|
+
readonly network: 'off' | 'on';
|
|
194
|
+
/** 拒连的本机端口 */
|
|
195
|
+
readonly localPorts: readonly number[];
|
|
196
|
+
/** 可连的 unix socket 所在的目录:可写范围与本会话临时区,其余一律拒连,与 network 无关 */
|
|
197
|
+
readonly unixSockets: readonly string[];
|
|
198
|
+
}
|
|
199
|
+
/** 这条命令批准过的提权:按批准时的原因分开放,批准一个目录不连带放回它下面的落点 */
|
|
200
|
+
export interface SandboxGrants {
|
|
201
|
+
/** 按范围外写批准的路径:并进可写的根,其下的落点照样拒写 */
|
|
202
|
+
readonly writePaths?: readonly string[];
|
|
203
|
+
/** 按落点批准的路径:在拒写之后只放回这一个确切路径 */
|
|
204
|
+
readonly landingPaths?: readonly string[];
|
|
205
|
+
readonly network?: boolean;
|
|
206
|
+
}
|
|
207
|
+
/** 按触及生成这条命令的沙箱策略;命令不在沙箱里执行的触及(没有本地效果、修改确认、全权)没有沙箱策略 */
|
|
208
|
+
export declare function sandboxPolicyOf(reach: Reach, grants?: SandboxGrants): SandboxPolicy;
|
|
209
|
+
/**
|
|
210
|
+
* 凭据的品牌:只有触及插件构造的凭据带它(不可枚举,展开复制出来的对象不带),存储与沙箱据此把不带它的对象当作没有凭据。
|
|
211
|
+
* 它防的是漏传、误传:第一方包由架构守卫禁止拼凭据,插件是可信代码,进程内蓄意伪造挡不住。登记在全局符号表里,
|
|
212
|
+
* 进程里装了两份本包时也认得
|
|
213
|
+
*/
|
|
214
|
+
export declare const REACH_CREDENTIAL: unique symbol;
|
|
215
|
+
/** require 的结果:拒绝时 message 是回给模型的话(被哪条规则拦下、能不能申请、能申请时的最窄目标) */
|
|
216
|
+
export type ReachVerdict = {
|
|
217
|
+
readonly allowed: true;
|
|
218
|
+
} | {
|
|
219
|
+
readonly allowed: false;
|
|
220
|
+
readonly message: string;
|
|
221
|
+
};
|
|
222
|
+
/**
|
|
223
|
+
* 触及凭据:按一次工具调用签发,只由触及插件构造;工具从调用上下文取得后转交给存储与沙箱。exec、home、paper 按签发时的
|
|
224
|
+
* 触及;require、allows 与 sandboxPolicy 每次按会话当时的设置重算,降档立即生效
|
|
225
|
+
*/
|
|
226
|
+
export interface ReachCredential {
|
|
227
|
+
readonly [REACH_CREDENTIAL]: true;
|
|
228
|
+
/** 命令在哪执行;none 即这次调用没有本地效果 */
|
|
229
|
+
readonly exec: 'none' | 'sandbox' | 'host';
|
|
230
|
+
/** 场所的主目录与白纸:当前目录没有值时取 home,不写输出位置的工具写进 paper;没有本地效果时不带 */
|
|
231
|
+
readonly home?: string;
|
|
232
|
+
readonly paper?: string;
|
|
233
|
+
/** 判一个模型给的目标,要问时经审批服务问;批准过的记作这次调用的一次性目标 */
|
|
234
|
+
require(request: ReachRequest): Promise<ReachVerdict>;
|
|
235
|
+
/** 存储兜底:同步判一个真实路径能不能读写,含这次调用批准过的一次性目标 */
|
|
236
|
+
allows(effect: 'read' | 'write', realPath: string): boolean;
|
|
237
|
+
/**
|
|
238
|
+
* 这条命令的沙箱策略,带上这次调用批准过的提权:范围外写并进可写的根(其下的落点照样拒写),按落点批准的只放回那一个
|
|
239
|
+
* 确切路径;只在 exec 为 sandbox 时可取
|
|
240
|
+
*/
|
|
241
|
+
sandboxPolicy(): SandboxPolicy;
|
|
242
|
+
/**
|
|
243
|
+
* 子进程环境:取自 owner 的 login shell(在场所的主目录下取一次),宿主执行用完整的;沙箱内是同一份,只去掉 AALIS_* 与
|
|
244
|
+
* SSH_AUTH_SOCK,再注入沙箱要的几项。没有本地效果的凭据抛错
|
|
245
|
+
*/
|
|
246
|
+
processEnv(mode: 'sandbox' | 'host'): Promise<Record<string, string>>;
|
|
247
|
+
}
|
|
248
|
+
/** 带品牌符号的对象才是凭据 */
|
|
249
|
+
export declare function isReachCredential(value: unknown): value is ReachCredential;
|
|
250
|
+
export interface ReachService {
|
|
251
|
+
/**
|
|
252
|
+
* 按一次工具调用签发凭据:主体取权限服务的 principalOf,会话与绑定取会话管理里的记录。没有本地效果的调用拿到
|
|
253
|
+
* exec 为 none 的凭据
|
|
254
|
+
*/
|
|
255
|
+
forCall(call: OriginTurn): Promise<ReachCredential>;
|
|
256
|
+
}
|
|
257
|
+
/** 调用型服务:业务层就是提供者的形状 */
|
|
258
|
+
export declare const reach: import("@aalis/core").ServiceDescriptor<ReachService, ReachService>;
|
|
259
|
+
//# 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,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aalis/api-reach — 触及契约
|
|
3
|
+
*
|
|
4
|
+
* 一次工具调用最多能触及本机的什么:先按这一轮的主体定上限,主体是 owner 的有本地效果,不看会话(主体见权限服务的
|
|
5
|
+
* principalOf);再按档位收窄。本包只有类型与纯函数:
|
|
6
|
+
* - 档位与越界策略;
|
|
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 的一轮有本地效果。落点按这份触及的 git 目录补上:git 目录不一定叫 .git(裸仓库、分开放的
|
|
185
|
+
* git 目录),它本身与它里面的落点照样拦;伪装裸仓库要的 HEAD 是落点,.git 与这些 git 目录里的除外
|
|
186
|
+
*/
|
|
187
|
+
export function resolveReach(input) {
|
|
188
|
+
if (input.principal === 'other')
|
|
189
|
+
return NO_LOCAL;
|
|
190
|
+
const { tier } = input;
|
|
191
|
+
const { home, paper } = input.place;
|
|
192
|
+
const workRoots = tier === 'workspace'
|
|
193
|
+
? [...new Set([home, paper, ...(input.binding?.extraRoots ?? []), ...(input.binding?.worktrees ?? [])])]
|
|
194
|
+
: [];
|
|
195
|
+
const writable = tier === 'workspace'
|
|
196
|
+
? [...new Set([...workRoots, ...input.gitDirs, input.sessionTmp, input.paths.self.skills])]
|
|
197
|
+
: tier === 'readonly'
|
|
198
|
+
? [input.sessionTmp]
|
|
199
|
+
: [];
|
|
200
|
+
const landing = [
|
|
201
|
+
...input.lists.landing,
|
|
202
|
+
{ pattern: '/HEAD$', except: [{ pattern: '/\\.git/' }, ...input.gitDirs.map(path => ({ path }))] },
|
|
203
|
+
...input.gitDirs.map(dir => ({ pattern: `^${literal(dir, input.lists.platform)}($|/${GIT_DIR_LANDING})` })),
|
|
204
|
+
];
|
|
205
|
+
return {
|
|
206
|
+
exec: tier === 'readonly' || tier === 'workspace' ? 'sandbox' : 'host',
|
|
207
|
+
tier,
|
|
208
|
+
onBoundary: input.onBoundary,
|
|
209
|
+
home,
|
|
210
|
+
paper,
|
|
211
|
+
sessionTmp: input.sessionTmp,
|
|
212
|
+
workRoots,
|
|
213
|
+
writable,
|
|
214
|
+
localPorts: input.localPorts,
|
|
215
|
+
lists: { ...input.lists, landing },
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
const ALLOW = { verdict: 'allow' };
|
|
219
|
+
const TIER = { kind: 'tier' };
|
|
220
|
+
const LANDING = { kind: 'landing' };
|
|
221
|
+
const WRITE_PATH = { kind: 'boundary', target: 'write-path' };
|
|
222
|
+
/** 判一个目标放行、问或拒 */
|
|
223
|
+
export function judgeReach(reach, request) {
|
|
224
|
+
if (reach.exec === 'none')
|
|
225
|
+
return request.effect === 'network' ? ALLOW : { verdict: 'deny', rule: 'no-local-effect' };
|
|
226
|
+
const { tier, lists } = reach;
|
|
227
|
+
const ask = (reason) => tier !== 'confirm' && reach.onBoundary === 'deny'
|
|
228
|
+
? { verdict: 'deny', rule: 'boundary-policy', reason }
|
|
229
|
+
: { verdict: 'ask', reason };
|
|
230
|
+
const within = (root, path) => matchesRule({ path: root }, path, lists.platform);
|
|
231
|
+
const listed = (rules, path) => rules.some(rule => matchesRule(rule, path, lists.platform));
|
|
232
|
+
switch (request.effect) {
|
|
233
|
+
case 'read':
|
|
234
|
+
return within(reach.sessionTmp, request.path) || !listed(lists.denyRead, request.path)
|
|
235
|
+
? ALLOW
|
|
236
|
+
: { verdict: 'deny', rule: 'deny-read' };
|
|
237
|
+
case 'exec':
|
|
238
|
+
if (tier === 'full')
|
|
239
|
+
return ALLOW;
|
|
240
|
+
if (tier === 'confirm')
|
|
241
|
+
return ask(TIER);
|
|
242
|
+
return request.host ? ask({ kind: 'boundary', target: 'host-exec' }) : ALLOW;
|
|
243
|
+
case 'network':
|
|
244
|
+
return tier === 'readonly' ? ask({ kind: 'boundary', target: 'network' }) : ALLOW;
|
|
245
|
+
case 'write':
|
|
246
|
+
if ('path' in request) {
|
|
247
|
+
const { path } = request;
|
|
248
|
+
if (listed(lists.control, path))
|
|
249
|
+
return { verdict: 'deny', rule: 'control-plane' };
|
|
250
|
+
if (listed(lists.landing, path))
|
|
251
|
+
return tier === 'full' ? { verdict: 'allow', landing: true } : ask(LANDING);
|
|
252
|
+
if (tier === 'full')
|
|
253
|
+
return ALLOW;
|
|
254
|
+
if (tier === 'confirm')
|
|
255
|
+
return ask(TIER);
|
|
256
|
+
return reach.writable.some(root => within(root, path)) ? ALLOW : ask(WRITE_PATH);
|
|
257
|
+
}
|
|
258
|
+
// 编排定义:与工作区档的可写范围同等
|
|
259
|
+
if (tier === 'confirm')
|
|
260
|
+
return ask(TIER);
|
|
261
|
+
return tier === 'readonly' ? ask(WRITE_PATH) : ALLOW;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/** 按触及生成这条命令的沙箱策略;命令不在沙箱里执行的触及(没有本地效果、修改确认、全权)没有沙箱策略 */
|
|
265
|
+
export function sandboxPolicyOf(reach, grants = {}) {
|
|
266
|
+
if (reach.exec !== 'sandbox')
|
|
267
|
+
throw new Error(`这次调用的命令不在沙箱里执行(${reach.exec}),没有沙箱策略`);
|
|
268
|
+
const { platform } = reach.lists;
|
|
269
|
+
return {
|
|
270
|
+
readDeny: reach.lists.denyRead,
|
|
271
|
+
readAllowWithin: [reach.sessionTmp],
|
|
272
|
+
write: [...reach.writable, ...(grants.writePaths ?? [])],
|
|
273
|
+
writeDeny: reach.lists.landing,
|
|
274
|
+
writeExceptions: [
|
|
275
|
+
...reach.workRoots.map(root => ({ pattern: `^${literal(root, platform)}/(.*/)?node_modules/` })),
|
|
276
|
+
...(grants.landingPaths ?? []).map(path => ({ pattern: `^${literal(path, platform)}$` })),
|
|
277
|
+
],
|
|
278
|
+
controlDeny: reach.lists.control,
|
|
279
|
+
network: grants.network || reach.tier === 'workspace' ? 'on' : 'off',
|
|
280
|
+
localPorts: reach.localPorts,
|
|
281
|
+
unixSockets: [...reach.workRoots, reach.sessionTmp],
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
// ════════════════════════════════════════════════════════════
|
|
285
|
+
// 凭据
|
|
286
|
+
// ════════════════════════════════════════════════════════════
|
|
287
|
+
/**
|
|
288
|
+
* 凭据的品牌:只有触及插件构造的凭据带它(不可枚举,展开复制出来的对象不带),存储与沙箱据此把不带它的对象当作没有凭据。
|
|
289
|
+
* 它防的是漏传、误传:第一方包由架构守卫禁止拼凭据,插件是可信代码,进程内蓄意伪造挡不住。登记在全局符号表里,
|
|
290
|
+
* 进程里装了两份本包时也认得
|
|
291
|
+
*/
|
|
292
|
+
export const REACH_CREDENTIAL = Symbol.for('@aalis/api-reach/credential');
|
|
293
|
+
/** 带品牌符号的对象才是凭据 */
|
|
294
|
+
export function isReachCredential(value) {
|
|
295
|
+
return typeof value === 'object' && value !== null && value[REACH_CREDENTIAL] === true;
|
|
296
|
+
}
|
|
297
|
+
/** 调用型服务:业务层就是提供者的形状 */
|
|
298
|
+
export const reach = defineService('reach');
|
|
299
|
+
//# 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.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.2.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.12.0 <1.0.0",
|
|
23
|
+
"@aalis/api-host-paths": ">=0.1.0 <1.0.0",
|
|
24
|
+
"@aalis/api-session-manager": ">=0.12.0 <1.0.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "^22.0.0",
|
|
28
|
+
"typescript": "^5.7.0",
|
|
29
|
+
"@aalis/core": "0.21.0"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"@aalis/core": ">=0.21.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
|
}
|