@rong/agentscript 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/CHANGELOG.md +22 -0
- package/INSTALL.md +92 -0
- package/LICENSE +21 -0
- package/README.md +246 -0
- package/dist/ast/constants.js +1 -0
- package/dist/ast/format.js +41 -0
- package/dist/ast/types.js +1 -0
- package/dist/bin/agentscript.js +234 -0
- package/dist/bin/input.js +19 -0
- package/dist/bin/repl.js +290 -0
- package/dist/index.js +26 -0
- package/dist/parser/errors.js +8 -0
- package/dist/parser/parser.js +661 -0
- package/dist/parser/tokenizer.js +246 -0
- package/dist/providers/llm/anthropic.js +36 -0
- package/dist/providers/llm/index.js +3 -0
- package/dist/providers/llm/ollama.js +19 -0
- package/dist/providers/llm/openai.js +31 -0
- package/dist/providers/llm/protocol.js +45 -0
- package/dist/providers/llm/shared.js +147 -0
- package/dist/providers/llm/types.js +1 -0
- package/dist/providers/llm/uri.js +24 -0
- package/dist/providers/memory/file.js +44 -0
- package/dist/providers/memory/host.js +66 -0
- package/dist/providers/memory/index.js +1 -0
- package/dist/providers/memory/shared.js +56 -0
- package/dist/providers/memory/sqlite.js +98 -0
- package/dist/providers/mock/index.js +32 -0
- package/dist/providers/tools/env.js +11 -0
- package/dist/providers/tools/file.js +99 -0
- package/dist/providers/tools/host.js +34 -0
- package/dist/providers/tools/http.js +40 -0
- package/dist/providers/tools/index.js +2 -0
- package/dist/providers/tools/scheme.js +16 -0
- package/dist/providers/tools/shared.js +92 -0
- package/dist/providers/tools/shell.js +80 -0
- package/dist/runtime/context.js +160 -0
- package/dist/runtime/errors.js +14 -0
- package/dist/runtime/evaluator.js +276 -0
- package/dist/runtime/generate.js +175 -0
- package/dist/runtime/guards.js +39 -0
- package/dist/runtime/input.js +38 -0
- package/dist/runtime/interpreter.js +314 -0
- package/dist/runtime/json.js +59 -0
- package/dist/runtime/loader.js +146 -0
- package/dist/runtime/scope.js +47 -0
- package/dist/runtime/shape.js +132 -0
- package/dist/runtime/trace.js +54 -0
- package/dist/runtime/truth.js +13 -0
- package/dist/runtime/types.js +1 -0
- package/dist/runtime/uri.js +10 -0
- package/dist/semantic/analyzer.js +519 -0
- package/dist/semantic/diagnostics.js +16 -0
- package/dist/utils/assert.js +3 -0
- package/docs/cn/context-engineering.md +389 -0
- package/docs/cn/language.md +478 -0
- package/docs/design-history/v0-design.md +365 -0
- package/docs/design-history/v0-implement.md +274 -0
- package/docs/design-history/v1-design.md +323 -0
- package/docs/design-history/v1-implement.md +267 -0
- package/docs/design-history/v2-design.md +387 -0
- package/docs/design-history/v2-implement.md +399 -0
- package/docs/en/context-engineering.md +332 -0
- package/docs/en/language.md +478 -0
- package/examples/changelog.as +29 -0
- package/examples/extract.as +29 -0
- package/examples/review.as +38 -0
- package/examples/summarize.as +28 -0
- package/examples/translate.as +33 -0
- package/package.json +59 -0
- package/tutorials/cli.as +22 -0
- package/tutorials/helloworld.as +14 -0
- package/tutorials/memory.as +19 -0
- package/tutorials/plan-execute.as +155 -0
- package/tutorials/react.as +98 -0
- package/tutorials/repl.as +31 -0
- package/tutorials/self-improve.as +60 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
# AgentScript V2 实施计划
|
|
2
|
+
|
|
3
|
+
本文档描述 V2 的分阶段实施方案。V2 设计见 `v2-design.md`。
|
|
4
|
+
|
|
5
|
+
V2 的实现目标是新增 memory 资源能力,让 reflection、self-improvement 和保守 self-evolution 可以通过普通 AgentScript 模式组合出来。实现重点是可审计、可控、最小 API,而不是做通用数据库语言。
|
|
6
|
+
|
|
7
|
+
## 原则
|
|
8
|
+
|
|
9
|
+
- 不新增 `reflect`、`improve`、`evolve` 等模式关键词。
|
|
10
|
+
- Memory 作为资源绑定,不是普通 prompt context。
|
|
11
|
+
- Memory 查询结果是普通 JSON/list,必须显式 `use` 才进入 prompt。
|
|
12
|
+
- Memory 写入必须显式调用,不自动记录所有 trace 或局部变量。
|
|
13
|
+
- file 和 sqlite backend 使用同一 runtime 接口。
|
|
14
|
+
- 不支持任意 SQL。
|
|
15
|
+
- 不自动修改 `.as` 源码。
|
|
16
|
+
|
|
17
|
+
## 阶段 1:AST / Parser / Semantic
|
|
18
|
+
|
|
19
|
+
状态:已完成。
|
|
20
|
+
|
|
21
|
+
新增资源类型:
|
|
22
|
+
|
|
23
|
+
```agentscript
|
|
24
|
+
import memory Lessons from "file://./.agentscript/lessons.jsonl"
|
|
25
|
+
import memory Runs from "sqlite://./.agentscript/memory.db#runs"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
实现项:
|
|
29
|
+
|
|
30
|
+
- AST 扩展 `ImportResourceKind`,增加 `memory`。
|
|
31
|
+
- tokenizer 不需要新增关键词以外的语法;`memory` 作为 import resource kind 处理。
|
|
32
|
+
- parser 支持 `import memory Name from "uri"`。
|
|
33
|
+
- semantic analyzer 把 memory 注册为资源绑定。
|
|
34
|
+
- `use MemoryName` 报错,和 `tool`、`llm`、`agent` 一样不能作为 prompt context。
|
|
35
|
+
- 函数调用检查支持 memory method call:
|
|
36
|
+
- `Memory.add(record)`
|
|
37
|
+
- `Memory.query(filter)`
|
|
38
|
+
|
|
39
|
+
约束:
|
|
40
|
+
|
|
41
|
+
- V2 只允许上述两个 method。
|
|
42
|
+
- `add` 参数数量必须为 1。
|
|
43
|
+
- `query` 参数数量必须为 1。
|
|
44
|
+
- `MemoryName(input)` 不合法;memory 不是 callable Agent。
|
|
45
|
+
|
|
46
|
+
验收:
|
|
47
|
+
|
|
48
|
+
- `import memory` 可以 parse/check。
|
|
49
|
+
- `use Lessons` 被 semantic analyzer 拒绝。
|
|
50
|
+
- 未知 memory method 被拒绝。
|
|
51
|
+
- memory method arity 错误被拒绝。
|
|
52
|
+
|
|
53
|
+
## 阶段 2:Runtime Binding 和 Provider 接口
|
|
54
|
+
|
|
55
|
+
状态:已完成。
|
|
56
|
+
|
|
57
|
+
新增 runtime 类型:
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
interface MemoryBinding {
|
|
61
|
+
__agentScriptResource: "memory";
|
|
62
|
+
name: string;
|
|
63
|
+
uri: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
interface MemoryProvider {
|
|
67
|
+
add(request: MemoryAddRequest): Promise<RuntimeValue>;
|
|
68
|
+
query(request: MemoryQueryRequest): Promise<RuntimeValue>;
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
推荐请求结构:
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
interface MemoryAddRequest {
|
|
76
|
+
memoryName: string;
|
|
77
|
+
uri: string;
|
|
78
|
+
record: RuntimeValue;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
interface MemoryQueryRequest {
|
|
82
|
+
memoryName: string;
|
|
83
|
+
uri: string;
|
|
84
|
+
query: RuntimeValue;
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
实现项:
|
|
89
|
+
|
|
90
|
+
- `src/runtime/types.ts` 增加 memory binding 和 provider 类型。
|
|
91
|
+
- `src/runtime/guards.ts` 增加 `isMemoryBinding`。
|
|
92
|
+
- interpreter 加载 import memory,写入根作用域。
|
|
93
|
+
- evaluator 识别 `Memory.add(...)` 和 `Memory.query(...)`。
|
|
94
|
+
- 默认 runtime 创建 host memory provider。
|
|
95
|
+
- trace 增加 `memory` 事件类型。
|
|
96
|
+
|
|
97
|
+
约束:
|
|
98
|
+
|
|
99
|
+
- memory provider 返回值必须是 `RuntimeValue`。
|
|
100
|
+
- `add` 参数必须是 object,否则 runtime error。
|
|
101
|
+
- `query` 参数必须是 object,否则 runtime error。
|
|
102
|
+
- provider error 不做自动 retry。
|
|
103
|
+
|
|
104
|
+
验收:
|
|
105
|
+
|
|
106
|
+
- memory method 调用能进入 provider。
|
|
107
|
+
- trace 记录 memory name、operation、uri、args/result 摘要。
|
|
108
|
+
- memory binding 不能被 `use`。
|
|
109
|
+
|
|
110
|
+
## 阶段 3:File JSONL Memory
|
|
111
|
+
|
|
112
|
+
状态:已完成。
|
|
113
|
+
|
|
114
|
+
URI:
|
|
115
|
+
|
|
116
|
+
```agentscript
|
|
117
|
+
import memory Lessons from "file://./.agentscript/lessons.jsonl"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
实现模块:
|
|
121
|
+
|
|
122
|
+
- `src/providers/memory/host.ts`:统一 memory provider 和 URI dispatch。
|
|
123
|
+
- file JSONL backend 在 `src/providers/memory/file.ts` 中实现,SQLite backend 在 `src/providers/memory/sqlite.ts` 中实现。
|
|
124
|
+
|
|
125
|
+
存储格式:
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{"id":"...","created_at":"...","updated_at":"...","record":{"kind":"lesson","text":"..."}}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
实现项:
|
|
132
|
+
|
|
133
|
+
- 解析 `file://` URI。
|
|
134
|
+
- 相对路径基于入口 `.as` 文件目录;REPL 中基于当前工作目录。
|
|
135
|
+
- 路径必须限制在 workspace root 或 source 所在目录策略内。
|
|
136
|
+
- 文件不存在时自动创建。
|
|
137
|
+
- 父目录不存在时自动创建。
|
|
138
|
+
- `add(record)` 追加 JSONL。
|
|
139
|
+
- `query({ text, kind, where, limit })` 读取并过滤。
|
|
140
|
+
|
|
141
|
+
查询规则:
|
|
142
|
+
|
|
143
|
+
- `limit` 缺省建议为 `10`。
|
|
144
|
+
- `limit` 必须是正整数。
|
|
145
|
+
- `kind` 精确匹配 `record.kind`。
|
|
146
|
+
- `text` 对 `record.text` 和完整 record JSON 做大小写不敏感包含匹配。
|
|
147
|
+
- `where` 只匹配 record 顶层字段,使用 JSON stringify 后的精确相等。
|
|
148
|
+
- 默认按最近写入优先。
|
|
149
|
+
|
|
150
|
+
错误处理:
|
|
151
|
+
|
|
152
|
+
- 损坏 JSONL 行报 runtime error,并包含行号。
|
|
153
|
+
- 路径越界报 runtime error。
|
|
154
|
+
- 非 object record 或 query 报 runtime error。
|
|
155
|
+
|
|
156
|
+
验收:
|
|
157
|
+
|
|
158
|
+
- `Lessons.add({...})` 写入 JSONL。
|
|
159
|
+
- `Lessons.query({ limit: 5 })` 返回最近 5 条。
|
|
160
|
+
- `Lessons.query({ kind: "lesson", text: "agent" })` 可过滤。
|
|
161
|
+
- 损坏 JSONL 行有明确错误。
|
|
162
|
+
|
|
163
|
+
## 阶段 4:SQLite Memory
|
|
164
|
+
|
|
165
|
+
状态:已完成。
|
|
166
|
+
|
|
167
|
+
URI:
|
|
168
|
+
|
|
169
|
+
```agentscript
|
|
170
|
+
import memory Lessons from "sqlite://./.agentscript/memory.db#lessons"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
依赖选择:
|
|
174
|
+
|
|
175
|
+
- 当前实现使用 Node.js 内置 `node:sqlite` 的 `DatabaseSync`。
|
|
176
|
+
- 不需要引入第三方 sqlite 依赖。
|
|
177
|
+
|
|
178
|
+
固定 schema:
|
|
179
|
+
|
|
180
|
+
```sql
|
|
181
|
+
CREATE TABLE IF NOT EXISTS memory_records (
|
|
182
|
+
namespace TEXT NOT NULL,
|
|
183
|
+
id TEXT NOT NULL,
|
|
184
|
+
created_at TEXT NOT NULL,
|
|
185
|
+
updated_at TEXT NOT NULL,
|
|
186
|
+
kind TEXT,
|
|
187
|
+
text TEXT,
|
|
188
|
+
record_json TEXT NOT NULL,
|
|
189
|
+
PRIMARY KEY (namespace, id)
|
|
190
|
+
);
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
实现项:
|
|
194
|
+
|
|
195
|
+
- 解析 `sqlite://` URI。
|
|
196
|
+
- path 指向数据库文件。
|
|
197
|
+
- fragment 作为 namespace;缺省为 `memory`。
|
|
198
|
+
- 初始化固定 schema。
|
|
199
|
+
- `add(record)` 写入 envelope。
|
|
200
|
+
- 从 record 顶层提取:
|
|
201
|
+
- `kind`:string 时写入索引列。
|
|
202
|
+
- `text`:string 时写入索引列。
|
|
203
|
+
- `query({ text, kind, where, limit })` 使用固定 SQL 构造。
|
|
204
|
+
|
|
205
|
+
查询规则:
|
|
206
|
+
|
|
207
|
+
- `kind` 使用等值查询。
|
|
208
|
+
- `text` V2 第一版使用 `LIKE`。
|
|
209
|
+
- `where` 可先在 SQL 初筛后用 JS 过滤 record 顶层字段。
|
|
210
|
+
- 默认按 `created_at DESC`。
|
|
211
|
+
|
|
212
|
+
安全约束:
|
|
213
|
+
|
|
214
|
+
- 不暴露任意 SQL。
|
|
215
|
+
- table 固定为 `memory_records`。
|
|
216
|
+
- namespace 来自 URI fragment,必须做标识符无关处理,只作为参数值绑定。
|
|
217
|
+
- 所有查询使用 prepared statement。
|
|
218
|
+
- path 访问遵守 host workspace 限制。
|
|
219
|
+
|
|
220
|
+
验收:
|
|
221
|
+
|
|
222
|
+
- sqlite 文件可自动创建。
|
|
223
|
+
- 同一 db 不同 namespace 相互隔离。
|
|
224
|
+
- query 结果与 file backend 语义一致。
|
|
225
|
+
- 不存在任意 SQL 注入入口。
|
|
226
|
+
|
|
227
|
+
## 阶段 5:Reflection / Self-Improvement 示例
|
|
228
|
+
|
|
229
|
+
状态:已完成。
|
|
230
|
+
|
|
231
|
+
新增教程:
|
|
232
|
+
|
|
233
|
+
- `tutorials/memory.as`:最小 memory add/query。
|
|
234
|
+
- `tutorials/self-improve.as`:读取 lesson、执行任务、reflect、写入 lesson。
|
|
235
|
+
|
|
236
|
+
示例应展示:
|
|
237
|
+
|
|
238
|
+
- `import memory`。
|
|
239
|
+
- `past = Lessons.query(...)`。
|
|
240
|
+
- `use past < 2k`。
|
|
241
|
+
- `generate({ input, limit, attempts })`。
|
|
242
|
+
- `Lessons.add(...)`。
|
|
243
|
+
- trace 中能看到 memory query/add。
|
|
244
|
+
|
|
245
|
+
验收:
|
|
246
|
+
|
|
247
|
+
- 示例可 `--check`。
|
|
248
|
+
- 使用 mock LLM/provider 时可执行。
|
|
249
|
+
- 本地运行后能看到 JSONL 或 sqlite 记录。
|
|
250
|
+
|
|
251
|
+
## 阶段 6:CLI / REPL 支持
|
|
252
|
+
|
|
253
|
+
状态:已完成。
|
|
254
|
+
|
|
255
|
+
CLI:
|
|
256
|
+
|
|
257
|
+
- 默认启用 file memory。
|
|
258
|
+
- sqlite memory 使用 Node.js 内置 `node:sqlite`。
|
|
259
|
+
- `--quiet` 只输出最终结果,不输出 memory trace。
|
|
260
|
+
- `--verbose` 输出 memory trace。
|
|
261
|
+
|
|
262
|
+
REPL:
|
|
263
|
+
|
|
264
|
+
- `:load` 后相对 memory path 基于加载文件目录。
|
|
265
|
+
- 直接粘贴 agent 时相对 memory path 基于当前工作目录。
|
|
266
|
+
- memory 文件不应被 REPL 自动清理。
|
|
267
|
+
|
|
268
|
+
可选开发命令:
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
npm run check -- tutorials/memory.as
|
|
272
|
+
npm run execute -- tutorials/memory.as --input '{"topic":"learn"}'
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Trace 设计
|
|
276
|
+
|
|
277
|
+
新增 trace kind:
|
|
278
|
+
|
|
279
|
+
```ts
|
|
280
|
+
type TraceEventKind = "use" | "generate" | "tool" | "input" | "agent" | "for" | "memory";
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
query trace:
|
|
284
|
+
|
|
285
|
+
```json
|
|
286
|
+
{
|
|
287
|
+
"kind": "memory",
|
|
288
|
+
"data": {
|
|
289
|
+
"memory": "Lessons",
|
|
290
|
+
"operation": "query",
|
|
291
|
+
"uri": "file://./.agentscript/lessons.jsonl",
|
|
292
|
+
"args": { "kind": "lesson", "limit": 5 },
|
|
293
|
+
"count": 3
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
add trace:
|
|
299
|
+
|
|
300
|
+
```json
|
|
301
|
+
{
|
|
302
|
+
"kind": "memory",
|
|
303
|
+
"data": {
|
|
304
|
+
"memory": "Lessons",
|
|
305
|
+
"operation": "add",
|
|
306
|
+
"uri": "file://./.agentscript/lessons.jsonl",
|
|
307
|
+
"id": "...",
|
|
308
|
+
"record": { "kind": "lesson", "text": "..." }
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
trace 注意事项:
|
|
314
|
+
|
|
315
|
+
- trace 可记录 record 摘要,但应避免无限大输出。
|
|
316
|
+
- 未来如需隐私控制,可增加 trace redaction。
|
|
317
|
+
- trace 不自动写入 memory。
|
|
318
|
+
|
|
319
|
+
## 测试计划
|
|
320
|
+
|
|
321
|
+
单元测试:
|
|
322
|
+
|
|
323
|
+
- parser:`import memory`。
|
|
324
|
+
- semantic:memory binding、method、arity、`use Memory`。
|
|
325
|
+
- runtime:provider dispatch、trace。
|
|
326
|
+
- file backend:add/query/filter/bad JSONL/path。
|
|
327
|
+
- sqlite backend:add/query/namespace/filter。
|
|
328
|
+
|
|
329
|
+
回归测试:
|
|
330
|
+
|
|
331
|
+
- `fixtures/v2.as` 覆盖 memory + self-improvement 最小流程。
|
|
332
|
+
- `tutorials/memory.as` 和 `tutorials/self-improve.as` 能 check。
|
|
333
|
+
|
|
334
|
+
命令:
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
npm run typecheck
|
|
338
|
+
npm test
|
|
339
|
+
npm run build
|
|
340
|
+
npm run check -- fixtures/v2.as
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
## 实施顺序建议
|
|
344
|
+
|
|
345
|
+
推荐顺序:
|
|
346
|
+
|
|
347
|
+
1. `import memory` 语义接入。
|
|
348
|
+
2. runtime memory provider 接口和 mock provider。
|
|
349
|
+
3. file JSONL backend。
|
|
350
|
+
4. trace。
|
|
351
|
+
5. 示例和 fixture。
|
|
352
|
+
6. sqlite backend。
|
|
353
|
+
|
|
354
|
+
原因:
|
|
355
|
+
|
|
356
|
+
- file backend 能最快验证语言语义。
|
|
357
|
+
- sqlite 使用 Node.js 内置 `node:sqlite`,不需要新增依赖,但仍应在接口稳定后接入。
|
|
358
|
+
- 示例应尽早驱动 API 是否自然。
|
|
359
|
+
|
|
360
|
+
## 风险和取舍
|
|
361
|
+
|
|
362
|
+
### Memory 污染
|
|
363
|
+
|
|
364
|
+
风险:Agent 把低质量 lesson 持久化,未来反复污染 prompt。
|
|
365
|
+
|
|
366
|
+
V2 处理:
|
|
367
|
+
|
|
368
|
+
- 写入必须显式。
|
|
369
|
+
- 示例中推荐 reflection 输出 `ok`、`confidence` 或 `kind`。
|
|
370
|
+
- 查询必须显式 `use`。
|
|
371
|
+
|
|
372
|
+
### 上下文膨胀
|
|
373
|
+
|
|
374
|
+
风险:query 返回太多历史记录。
|
|
375
|
+
|
|
376
|
+
V2 处理:
|
|
377
|
+
|
|
378
|
+
- `query` 支持 `limit`。
|
|
379
|
+
- `use past < 2k` 继续用 context budget 控制 prompt。
|
|
380
|
+
|
|
381
|
+
### 数据库能力过大
|
|
382
|
+
|
|
383
|
+
风险:任意 SQL 让语言变成数据库脚本,并增加安全风险。
|
|
384
|
+
|
|
385
|
+
V2 处理:
|
|
386
|
+
|
|
387
|
+
- sqlite backend 固定 schema。
|
|
388
|
+
- 不支持任意 SQL。
|
|
389
|
+
- 查询 API 只支持 `text`、`kind`、`where`、`limit`。
|
|
390
|
+
|
|
391
|
+
### Self-Evolution 过早扩大
|
|
392
|
+
|
|
393
|
+
风险:自动修改代码需要权限、回滚、测试、审计,超出 V2。
|
|
394
|
+
|
|
395
|
+
V2 处理:
|
|
396
|
+
|
|
397
|
+
- 只持久化 lesson/rule/profile。
|
|
398
|
+
- 不自动修改 `.as` 源码。
|
|
399
|
+
- patch proposal 只能作为普通数据返回。
|