@zmzai/agent-framework 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/dist/adapters/fs-workspace.d.ts +7 -0
- package/dist/adapters/fs-workspace.d.ts.map +1 -0
- package/dist/adapters/fs-workspace.js +91 -0
- package/dist/adapters/fs-workspace.js.map +1 -0
- package/dist/adapters/index.d.ts +46 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +14 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/openai-provider.d.ts +17 -0
- package/dist/adapters/openai-provider.d.ts.map +1 -0
- package/dist/adapters/openai-provider.js +116 -0
- package/dist/adapters/openai-provider.js.map +1 -0
- package/dist/adapters/subprocess-sandbox.d.ts +7 -0
- package/dist/adapters/subprocess-sandbox.d.ts.map +1 -0
- package/dist/adapters/subprocess-sandbox.js +91 -0
- package/dist/adapters/subprocess-sandbox.js.map +1 -0
- package/dist/adapters/workspace-edit.d.ts +19 -0
- package/dist/adapters/workspace-edit.d.ts.map +1 -0
- package/dist/adapters/workspace-edit.js +36 -0
- package/dist/adapters/workspace-edit.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +191 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/agent/loader.d.ts +17 -0
- package/dist/core/agent/loader.d.ts.map +1 -0
- package/dist/core/agent/loader.js +148 -0
- package/dist/core/agent/loader.js.map +1 -0
- package/dist/core/agent/plugin.d.ts +59 -0
- package/dist/core/agent/plugin.d.ts.map +1 -0
- package/dist/core/agent/plugin.js +125 -0
- package/dist/core/agent/plugin.js.map +1 -0
- package/dist/core/agent/registry.d.ts +45 -0
- package/dist/core/agent/registry.d.ts.map +1 -0
- package/dist/core/agent/registry.js +98 -0
- package/dist/core/agent/registry.js.map +1 -0
- package/dist/core/agent/resolver.d.ts +16 -0
- package/dist/core/agent/resolver.d.ts.map +1 -0
- package/dist/core/agent/resolver.js +2 -0
- package/dist/core/agent/resolver.js.map +1 -0
- package/dist/core/events/bus.d.ts +30 -0
- package/dist/core/events/bus.d.ts.map +1 -0
- package/dist/core/events/bus.js +112 -0
- package/dist/core/events/bus.js.map +1 -0
- package/dist/core/events/manifest.d.ts +117 -0
- package/dist/core/events/manifest.d.ts.map +1 -0
- package/dist/core/events/manifest.js +69 -0
- package/dist/core/events/manifest.js.map +1 -0
- package/dist/core/permission/engine.d.ts +84 -0
- package/dist/core/permission/engine.d.ts.map +1 -0
- package/dist/core/permission/engine.js +131 -0
- package/dist/core/permission/engine.js.map +1 -0
- package/dist/core/permission/ruleset.d.ts +30 -0
- package/dist/core/permission/ruleset.d.ts.map +1 -0
- package/dist/core/permission/ruleset.js +85 -0
- package/dist/core/permission/ruleset.js.map +1 -0
- package/dist/core/runtime/compaction.d.ts +59 -0
- package/dist/core/runtime/compaction.d.ts.map +1 -0
- package/dist/core/runtime/compaction.js +108 -0
- package/dist/core/runtime/compaction.js.map +1 -0
- package/dist/core/runtime/lease-recovery.d.ts +45 -0
- package/dist/core/runtime/lease-recovery.d.ts.map +1 -0
- package/dist/core/runtime/lease-recovery.js +112 -0
- package/dist/core/runtime/lease-recovery.js.map +1 -0
- package/dist/core/runtime/loop-guard.d.ts +51 -0
- package/dist/core/runtime/loop-guard.d.ts.map +1 -0
- package/dist/core/runtime/loop-guard.js +90 -0
- package/dist/core/runtime/loop-guard.js.map +1 -0
- package/dist/core/runtime/pi-bridge.d.ts +53 -0
- package/dist/core/runtime/pi-bridge.d.ts.map +1 -0
- package/dist/core/runtime/pi-bridge.js +259 -0
- package/dist/core/runtime/pi-bridge.js.map +1 -0
- package/dist/core/runtime/runner.d.ts +127 -0
- package/dist/core/runtime/runner.d.ts.map +1 -0
- package/dist/core/runtime/runner.js +614 -0
- package/dist/core/runtime/runner.js.map +1 -0
- package/dist/core/session/ids.d.ts +7 -0
- package/dist/core/session/ids.d.ts.map +1 -0
- package/dist/core/session/ids.js +18 -0
- package/dist/core/session/ids.js.map +1 -0
- package/dist/core/session/jsonl-store.d.ts +14 -0
- package/dist/core/session/jsonl-store.d.ts.map +1 -0
- package/dist/core/session/jsonl-store.js +142 -0
- package/dist/core/session/jsonl-store.js.map +1 -0
- package/dist/core/session/store.d.ts +25 -0
- package/dist/core/session/store.d.ts.map +1 -0
- package/dist/core/session/store.js +2 -0
- package/dist/core/session/store.js.map +1 -0
- package/dist/core/session/types.d.ts +142 -0
- package/dist/core/session/types.d.ts.map +1 -0
- package/dist/core/session/types.js +2 -0
- package/dist/core/session/types.js.map +1 -0
- package/dist/core/tools/adapter.d.ts +33 -0
- package/dist/core/tools/adapter.d.ts.map +1 -0
- package/dist/core/tools/adapter.js +87 -0
- package/dist/core/tools/adapter.js.map +1 -0
- package/dist/core/tools/builtins.d.ts +13 -0
- package/dist/core/tools/builtins.d.ts.map +1 -0
- package/dist/core/tools/builtins.js +219 -0
- package/dist/core/tools/builtins.js.map +1 -0
- package/dist/core/tools/context.d.ts +136 -0
- package/dist/core/tools/context.d.ts.map +1 -0
- package/dist/core/tools/context.js +2 -0
- package/dist/core/tools/context.js.map +1 -0
- package/dist/core/tools/def.d.ts +27 -0
- package/dist/core/tools/def.d.ts.map +1 -0
- package/dist/core/tools/def.js +2 -0
- package/dist/core/tools/def.js.map +1 -0
- package/dist/core/tools/qa-check.d.ts +30 -0
- package/dist/core/tools/qa-check.d.ts.map +1 -0
- package/dist/core/tools/qa-check.js +50 -0
- package/dist/core/tools/qa-check.js.map +1 -0
- package/dist/core/tools/task.d.ts +8 -0
- package/dist/core/tools/task.d.ts.map +1 -0
- package/dist/core/tools/task.js +33 -0
- package/dist/core/tools/task.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/server/create-server.d.ts +51 -0
- package/dist/server/create-server.d.ts.map +1 -0
- package/dist/server/create-server.js +29 -0
- package/dist/server/create-server.js.map +1 -0
- package/openapi.yaml +239 -0
- package/package.json +32 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { rulesetFromConfig } from "../permission/ruleset.js";
|
|
2
|
+
function define(def) {
|
|
3
|
+
return { ...def, permission: rulesetFromConfig(def.permission) };
|
|
4
|
+
}
|
|
5
|
+
const DEFAULT_PROMPT = "你是 ZMZAI Agent,一个会主动完成任务的 Coding Agent。可使用工具读取当前 Workspace,通过 write/edit 直接修改文件(每次修改生成可审查、可回滚的不可变版本),用 bash 在隔离沙箱中运行命令(stdout/stderr 会返回,生成的产物文件可下载)。\n" +
|
|
6
|
+
"工作方式:先 glob/read/grep 掌握 Workspace 现状,并用 todo 工具把任务拆成清单、边做边更新,再动手。对生成型任务(PPT、文档、脚本、报告等),不要只反问用户需求——基于已有信息自行决定合理的默认(主题、篇幅、风格、结构),直接写出生成脚本或内容 → 执行 → 校验产物 → 交付。只有信息确实无法推断、且追问明显比先交付默认方案更省事时,才问一两个关键问题,并同时给出你的默认方案。\n" +
|
|
7
|
+
"不能声称执行了未调用的操作。用中文给出简洁、可核实的结果。";
|
|
8
|
+
const READONLY_PROMPT = "你是 ZMZAI Agent 的只读分析模式。仅使用 read/glob/grep 工具读取当前 Workspace 并给出可核实的中文方案;你没有写入和执行权限,不能声称执行了任何修改。任务结束后用户可以在同一会话继续追问,或切换到 default 代理执行你的方案。";
|
|
9
|
+
const EXPLORE_PROMPT = "你是代码库探索子代理。快速定位与任务相关的文件、符号与数据流,返回精确的 path:line 引用和简洁结论。你只读,不做任何修改。按要求的彻底程度(quick/medium/thorough)控制搜索范围。";
|
|
10
|
+
const GENERAL_PROMPT = "你是通用子任务代理。完成父代理交代的独立子任务,返回简洁、可核实的结果。不要反问父代理;信息不足时基于合理默认推进并说明假设。";
|
|
11
|
+
export const builtinAgents = [
|
|
12
|
+
define({
|
|
13
|
+
name: "default",
|
|
14
|
+
description: "默认代理:读写 + 沙箱执行,自动完成任务",
|
|
15
|
+
mode: "primary",
|
|
16
|
+
steps: 12,
|
|
17
|
+
prompt: DEFAULT_PROMPT,
|
|
18
|
+
permission: { bash: "ask" }, // edit/read/... fall through to built-in defaults
|
|
19
|
+
}),
|
|
20
|
+
define({
|
|
21
|
+
name: "readonly",
|
|
22
|
+
description: "只读分析:等价于旧 plan 模式",
|
|
23
|
+
mode: "primary",
|
|
24
|
+
steps: 8,
|
|
25
|
+
prompt: READONLY_PROMPT,
|
|
26
|
+
permission: { edit: "deny", bash: "deny", task: "deny" },
|
|
27
|
+
}),
|
|
28
|
+
define({
|
|
29
|
+
name: "explore",
|
|
30
|
+
description: "代码库探索子代理(只读)",
|
|
31
|
+
mode: "subagent",
|
|
32
|
+
steps: 8,
|
|
33
|
+
prompt: EXPLORE_PROMPT,
|
|
34
|
+
permission: { "*": "deny", read: "allow", glob: "allow", grep: "allow", list: "allow", todo: "allow" },
|
|
35
|
+
}),
|
|
36
|
+
define({
|
|
37
|
+
name: "general",
|
|
38
|
+
description: "通用子任务代理",
|
|
39
|
+
mode: "subagent",
|
|
40
|
+
steps: 12,
|
|
41
|
+
prompt: GENERAL_PROMPT,
|
|
42
|
+
permission: {},
|
|
43
|
+
}),
|
|
44
|
+
];
|
|
45
|
+
/** Built-in baseline applied beneath every agent's own ruleset (spec §5.5). */
|
|
46
|
+
export const builtinDefaults = rulesetFromConfig({
|
|
47
|
+
"*": "allow",
|
|
48
|
+
external_directory: { "*": "ask" },
|
|
49
|
+
read: { "*": "allow", "*.env": "ask", "*.env.*": "ask" },
|
|
50
|
+
bash: "ask",
|
|
51
|
+
// A connector holds an external-system credential. Even read-only calls
|
|
52
|
+
// cross a trust boundary and must be approved unless a user grants it.
|
|
53
|
+
connector: "ask",
|
|
54
|
+
edit: "allow",
|
|
55
|
+
});
|
|
56
|
+
export class AgentRegistry {
|
|
57
|
+
agents = new Map();
|
|
58
|
+
constructor(customAgents = []) {
|
|
59
|
+
for (const agent of builtinAgents)
|
|
60
|
+
this.agents.set(agent.name, agent);
|
|
61
|
+
for (const agent of customAgents)
|
|
62
|
+
this.agents.set(agent.name, agent); // custom overrides builtin (spec §6.3)
|
|
63
|
+
}
|
|
64
|
+
get(name) {
|
|
65
|
+
return this.agents.get(name) ?? null;
|
|
66
|
+
}
|
|
67
|
+
list(filter) {
|
|
68
|
+
return [...this.agents.values()].filter((agent) => {
|
|
69
|
+
if (!filter?.includeHidden && agent.hidden)
|
|
70
|
+
return false;
|
|
71
|
+
if (filter?.mode && agent.mode !== filter.mode && agent.mode !== "all")
|
|
72
|
+
return false;
|
|
73
|
+
return true;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/** Effective ruleset stack for a session running this agent, in ascending
|
|
77
|
+
* precedence: builtin defaults → agent preset. Session rules are appended
|
|
78
|
+
* later by the permission engine. */
|
|
79
|
+
rulesetsFor(name) {
|
|
80
|
+
const agent = this.get(name);
|
|
81
|
+
return agent ? [builtinDefaults, agent.permission] : [builtinDefaults];
|
|
82
|
+
}
|
|
83
|
+
/** Returns a NEW registry with additional agents layered on top (workspace
|
|
84
|
+
* custom agents). The base registry is shared/process-wide, so per-run
|
|
85
|
+
* customization must not mutate it — this derive keeps the singleton
|
|
86
|
+
* immutable while letting a session see its workspace's .zmzai/agents. */
|
|
87
|
+
derive(extraAgents) {
|
|
88
|
+
if (!extraAgents.length)
|
|
89
|
+
return this;
|
|
90
|
+
const merged = new AgentRegistry([...this.customAgents, ...extraAgents]);
|
|
91
|
+
return merged;
|
|
92
|
+
}
|
|
93
|
+
/** Custom agents registered beyond the builtins (for derive()). */
|
|
94
|
+
get customAgents() {
|
|
95
|
+
return [...this.agents.values()].filter((agent) => !builtinAgents.some((builtin) => builtin.name === agent.name));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/agent/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AgentInfo } from "./registry.js";
|
|
2
|
+
import type { SessionInfo } from "../session/types.js";
|
|
3
|
+
import type { ToolDef } from "../tools/def.js";
|
|
4
|
+
/** A product resolves an immutable Agent Version into this runtime-safe shape.
|
|
5
|
+
* The framework deliberately does not know how versions, plugins, secrets,
|
|
6
|
+
* or connectors are stored. */
|
|
7
|
+
export type ResolvedAgent = {
|
|
8
|
+
agent: AgentInfo;
|
|
9
|
+
/** Extra tool definitions contributed by trusted, resolved capabilities.
|
|
10
|
+
* Base tools remain owned by the framework. */
|
|
11
|
+
tools?: ToolDef[];
|
|
12
|
+
};
|
|
13
|
+
export type AgentResolver = {
|
|
14
|
+
resolve(session: SessionInfo): Promise<ResolvedAgent | null>;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/core/agent/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;gCAEgC;AAChC,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB;oDACgD;IAChD,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;CAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/core/agent/resolver.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { FrameworkEvent, PersistedFrameworkEvent } from "./manifest.js";
|
|
2
|
+
/** EventLog (spec §4.1 abstracted for M5): the durable per-session event log.
|
|
3
|
+
* The framework ships an in-memory implementation (below) and a JSONL one;
|
|
4
|
+
* the product supplies a Mongo implementation (see zmzai-agent's
|
|
5
|
+
* framework/core/events/mongo-event-log.ts). All methods must be safe under
|
|
6
|
+
* the single-writer-per-session lease model. */
|
|
7
|
+
export interface EventLog {
|
|
8
|
+
/** Persists one validated event, allocating the next per-session seq. */
|
|
9
|
+
append(event: FrameworkEvent & {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
}): Promise<PersistedFrameworkEvent>;
|
|
12
|
+
/** Reads events with seq > sinceSeq, ascending, capped at limit. */
|
|
13
|
+
read(sessionId: string, sinceSeq: number, limit: number): Promise<PersistedFrameworkEvent[]>;
|
|
14
|
+
/** Raw record count (stats/audit). */
|
|
15
|
+
count(sessionId: string): Promise<number>;
|
|
16
|
+
}
|
|
17
|
+
export declare function createMemoryEventLog(): EventLog;
|
|
18
|
+
export type SubscribeOptions = {
|
|
19
|
+
sinceSeq?: number;
|
|
20
|
+
pollIntervalMs?: number;
|
|
21
|
+
signal?: AbortSignal;
|
|
22
|
+
};
|
|
23
|
+
/** Subscribes to a session's event stream: durable catch-up via log.read, then
|
|
24
|
+
* live delivery via the in-process listener registry. Cross-process delivery
|
|
25
|
+
* (product's Mongo log) works because log.read polls the durable store. */
|
|
26
|
+
export declare function subscribeEventLog(log: EventLog, sessionId: string, options?: SubscribeOptions): AsyncIterable<PersistedFrameworkEvent>;
|
|
27
|
+
/** Notifies live subscribers (called by framework when an event is appended —
|
|
28
|
+
* the runner does this after EventLog.append). */
|
|
29
|
+
export declare function notifyEventLogListeners(event: PersistedFrameworkEvent): void;
|
|
30
|
+
//# sourceMappingURL=bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../../src/core/events/bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAsB,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAIjG;;;;iDAIiD;AACjD,MAAM,WAAW,QAAQ;IACvB,yEAAyE;IACzE,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACxF,oEAAoE;IACpE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC7F,sCAAsC;IACtC,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAID,wBAAgB,oBAAoB,IAAI,QAAQ,CA4B/C;AAMD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF;;4EAE4E;AAC5E,wBAAuB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,aAAa,CAAC,uBAAuB,CAAC,CA2DjJ;AAKD;mDACmD;AACnD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,uBAAuB,GAAG,IAAI,CAQ5E"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { frameworkEventSchemas } from "./manifest.js";
|
|
2
|
+
import { newEventId } from "../session/ids.js";
|
|
3
|
+
// ---- In-memory implementation (single-process demo/tests) ----
|
|
4
|
+
export function createMemoryEventLog() {
|
|
5
|
+
const store = new Map();
|
|
6
|
+
return {
|
|
7
|
+
async append(event) {
|
|
8
|
+
const schema = frameworkEventSchemas[event.type];
|
|
9
|
+
const parsed = schema.safeParse(event.data);
|
|
10
|
+
if (!parsed.success)
|
|
11
|
+
throw new Error(`INVALID_FRAMEWORK_EVENT: ${event.type} ${parsed.error.issues[0]?.message ?? ""}`);
|
|
12
|
+
const list = store.get(event.sessionId) ?? [];
|
|
13
|
+
const persisted = {
|
|
14
|
+
id: newEventId(),
|
|
15
|
+
sessionId: event.sessionId,
|
|
16
|
+
seq: list.length + 1,
|
|
17
|
+
type: event.type,
|
|
18
|
+
data: parsed.data,
|
|
19
|
+
at: new Date().toISOString(),
|
|
20
|
+
};
|
|
21
|
+
list.push(persisted);
|
|
22
|
+
store.set(event.sessionId, list);
|
|
23
|
+
return persisted;
|
|
24
|
+
},
|
|
25
|
+
async read(sessionId, sinceSeq, limit) {
|
|
26
|
+
const list = store.get(sessionId) ?? [];
|
|
27
|
+
return list.filter((event) => event.seq > sinceSeq).slice(0, limit);
|
|
28
|
+
},
|
|
29
|
+
async count(sessionId) {
|
|
30
|
+
return (store.get(sessionId) ?? []).length;
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Subscribes to a session's event stream: durable catch-up via log.read, then
|
|
35
|
+
* live delivery via the in-process listener registry. Cross-process delivery
|
|
36
|
+
* (product's Mongo log) works because log.read polls the durable store. */
|
|
37
|
+
export async function* subscribeEventLog(log, sessionId, options = {}) {
|
|
38
|
+
const pollIntervalMs = options.pollIntervalMs ?? 1_000;
|
|
39
|
+
let cursor = options.sinceSeq ?? 0;
|
|
40
|
+
const queue = [];
|
|
41
|
+
let wake = null;
|
|
42
|
+
let done = false;
|
|
43
|
+
const listener = (event) => {
|
|
44
|
+
if (event.seq <= cursor)
|
|
45
|
+
return;
|
|
46
|
+
queue.push(event);
|
|
47
|
+
wake?.();
|
|
48
|
+
};
|
|
49
|
+
const registered = listeners.get(sessionId) ?? new Set();
|
|
50
|
+
registered.add(listener);
|
|
51
|
+
listeners.set(sessionId, registered);
|
|
52
|
+
const onAbort = () => {
|
|
53
|
+
done = true;
|
|
54
|
+
wake?.();
|
|
55
|
+
};
|
|
56
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
57
|
+
try {
|
|
58
|
+
while (!done) {
|
|
59
|
+
const missed = await log.read(sessionId, cursor, 500);
|
|
60
|
+
for (const record of missed) {
|
|
61
|
+
if (record.seq <= cursor)
|
|
62
|
+
continue;
|
|
63
|
+
queue.push(record);
|
|
64
|
+
}
|
|
65
|
+
queue.sort((a, b) => a.seq - b.seq);
|
|
66
|
+
while (queue.length && queue[0].seq > cursor) {
|
|
67
|
+
const event = queue.shift();
|
|
68
|
+
cursor = event.seq;
|
|
69
|
+
yield event;
|
|
70
|
+
}
|
|
71
|
+
queue.length = 0;
|
|
72
|
+
if (done)
|
|
73
|
+
break;
|
|
74
|
+
await new Promise((resolve) => {
|
|
75
|
+
const timer = setTimeout(() => {
|
|
76
|
+
wake = null;
|
|
77
|
+
resolve();
|
|
78
|
+
}, pollIntervalMs);
|
|
79
|
+
wake = () => {
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
wake = null;
|
|
82
|
+
resolve();
|
|
83
|
+
};
|
|
84
|
+
if (done) {
|
|
85
|
+
clearTimeout(timer);
|
|
86
|
+
resolve();
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
93
|
+
registered.delete(listener);
|
|
94
|
+
if (registered.size === 0)
|
|
95
|
+
listeners.delete(sessionId);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** In-process live fan-out registry shared by subscribeEventLog consumers. */
|
|
99
|
+
const listeners = new Map();
|
|
100
|
+
/** Notifies live subscribers (called by framework when an event is appended —
|
|
101
|
+
* the runner does this after EventLog.append). */
|
|
102
|
+
export function notifyEventLogListeners(event) {
|
|
103
|
+
for (const listener of listeners.get(event.sessionId) ?? []) {
|
|
104
|
+
try {
|
|
105
|
+
listener(event);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// A throwing subscriber must never break the publish path.
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.js","sourceRoot":"","sources":["../../../src/core/events/bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { MessageInfo, Part, SessionInfo } from "../session/types.js";
|
|
3
|
+
export declare const sessionInfoSchema: z.ZodType<SessionInfo>;
|
|
4
|
+
export declare const messageInfoSchema: z.ZodCustom<MessageInfo, MessageInfo>;
|
|
5
|
+
export declare const partSchema: z.ZodCustom<Part, Part>;
|
|
6
|
+
declare const todoItemSchema: z.ZodObject<{
|
|
7
|
+
content: z.ZodString;
|
|
8
|
+
status: z.ZodEnum<{
|
|
9
|
+
pending: "pending";
|
|
10
|
+
completed: "completed";
|
|
11
|
+
in_progress: "in_progress";
|
|
12
|
+
cancelled: "cancelled";
|
|
13
|
+
}>;
|
|
14
|
+
priority: z.ZodOptional<z.ZodEnum<{
|
|
15
|
+
high: "high";
|
|
16
|
+
medium: "medium";
|
|
17
|
+
low: "low";
|
|
18
|
+
}>>;
|
|
19
|
+
}, z.core.$strip>;
|
|
20
|
+
export declare const frameworkEventSchemas: {
|
|
21
|
+
readonly "session.updated": z.ZodObject<{
|
|
22
|
+
session: z.ZodType<SessionInfo, unknown, z.core.$ZodTypeInternals<SessionInfo, unknown>>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
readonly "session.status": z.ZodObject<{
|
|
25
|
+
status: z.ZodEnum<{
|
|
26
|
+
running: "running";
|
|
27
|
+
idle: "idle";
|
|
28
|
+
waiting_permission: "waiting_permission";
|
|
29
|
+
waiting_input: "waiting_input";
|
|
30
|
+
}>;
|
|
31
|
+
}, z.core.$strip>;
|
|
32
|
+
readonly "session.error": z.ZodObject<{
|
|
33
|
+
name: z.ZodString;
|
|
34
|
+
message: z.ZodString;
|
|
35
|
+
}, z.core.$strip>;
|
|
36
|
+
readonly "message.updated": z.ZodObject<{
|
|
37
|
+
message: z.ZodCustom<MessageInfo, MessageInfo>;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
readonly "message.part.updated": z.ZodObject<{
|
|
40
|
+
part: z.ZodCustom<Part, Part>;
|
|
41
|
+
}, z.core.$strip>;
|
|
42
|
+
readonly "message.part.delta": z.ZodObject<{
|
|
43
|
+
messageId: z.ZodString;
|
|
44
|
+
partId: z.ZodString;
|
|
45
|
+
field: z.ZodLiteral<"text">;
|
|
46
|
+
delta: z.ZodString;
|
|
47
|
+
}, z.core.$strip>;
|
|
48
|
+
readonly "permission.asked": z.ZodObject<{
|
|
49
|
+
request: z.ZodObject<{
|
|
50
|
+
id: z.ZodString;
|
|
51
|
+
sessionId: z.ZodString;
|
|
52
|
+
permission: z.ZodString;
|
|
53
|
+
patterns: z.ZodArray<z.ZodString>;
|
|
54
|
+
metadata: z.ZodOptional<z.ZodUnknown>;
|
|
55
|
+
always: z.ZodArray<z.ZodString>;
|
|
56
|
+
tool: z.ZodOptional<z.ZodObject<{
|
|
57
|
+
messageId: z.ZodString;
|
|
58
|
+
callId: z.ZodString;
|
|
59
|
+
}, z.core.$strip>>;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
}, z.core.$strip>;
|
|
62
|
+
readonly "permission.replied": z.ZodObject<{
|
|
63
|
+
id: z.ZodString;
|
|
64
|
+
reply: z.ZodEnum<{
|
|
65
|
+
once: "once";
|
|
66
|
+
always: "always";
|
|
67
|
+
reject: "reject";
|
|
68
|
+
}>;
|
|
69
|
+
}, z.core.$strip>;
|
|
70
|
+
readonly "todo.updated": z.ZodObject<{
|
|
71
|
+
todos: z.ZodArray<z.ZodObject<{
|
|
72
|
+
content: z.ZodString;
|
|
73
|
+
status: z.ZodEnum<{
|
|
74
|
+
pending: "pending";
|
|
75
|
+
completed: "completed";
|
|
76
|
+
in_progress: "in_progress";
|
|
77
|
+
cancelled: "cancelled";
|
|
78
|
+
}>;
|
|
79
|
+
priority: z.ZodOptional<z.ZodEnum<{
|
|
80
|
+
high: "high";
|
|
81
|
+
medium: "medium";
|
|
82
|
+
low: "low";
|
|
83
|
+
}>>;
|
|
84
|
+
}, z.core.$strip>>;
|
|
85
|
+
}, z.core.$strip>;
|
|
86
|
+
readonly "file.edited": z.ZodObject<{
|
|
87
|
+
path: z.ZodString;
|
|
88
|
+
revisionId: z.ZodString;
|
|
89
|
+
diff: z.ZodString;
|
|
90
|
+
}, z.core.$strip>;
|
|
91
|
+
readonly "artifact.created": z.ZodObject<{
|
|
92
|
+
artifactId: z.ZodString;
|
|
93
|
+
path: z.ZodString;
|
|
94
|
+
bytes: z.ZodNumber;
|
|
95
|
+
contentType: z.ZodString;
|
|
96
|
+
downloadUrl: z.ZodString;
|
|
97
|
+
previewUrl: z.ZodOptional<z.ZodString>;
|
|
98
|
+
}, z.core.$strip>;
|
|
99
|
+
};
|
|
100
|
+
export type FrameworkEventType = keyof typeof frameworkEventSchemas;
|
|
101
|
+
export type FrameworkEvent = {
|
|
102
|
+
[K in FrameworkEventType]: {
|
|
103
|
+
type: K;
|
|
104
|
+
data: z.infer<(typeof frameworkEventSchemas)[K]>;
|
|
105
|
+
};
|
|
106
|
+
}[FrameworkEventType];
|
|
107
|
+
export type PersistedFrameworkEvent = FrameworkEvent & {
|
|
108
|
+
id: string;
|
|
109
|
+
sessionId: string;
|
|
110
|
+
seq: number;
|
|
111
|
+
at: string;
|
|
112
|
+
};
|
|
113
|
+
export type TodoItem = z.infer<typeof todoItemSchema>;
|
|
114
|
+
/** Narrows an unknown payload (e.g. from an SSE frame) to a FrameworkEvent. */
|
|
115
|
+
export declare function parseFrameworkEvent(value: unknown): FrameworkEvent | null;
|
|
116
|
+
export {};
|
|
117
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/core/events/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAU1E,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAWzB,CAAC;AAE7B,eAAO,MAAM,iBAAiB,uCAO7B,CAAC;AAEF,eAAO,MAAM,UAAU,yBAGtB,CAAC;AAYF,QAAA,MAAM,cAAc;;;;;;;;;;;;;iBAIlB,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmBxB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,qBAAqB,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG;KAC1B,CAAC,IAAI,kBAAkB,GAAG;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE;CACzF,CAAC,kBAAkB,CAAC,CAAC;AAEtB,MAAM,MAAM,uBAAuB,GAAG,cAAc,GAAG;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAOzE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/** Framework event manifest (spec §4.2) — the frozen v0 wire contract.
|
|
3
|
+
* Every event is persisted to fw_events with a per-session ascending seq and
|
|
4
|
+
* can be replayed via subscribe(sinceSeq). */
|
|
5
|
+
const modelRefSchema = z.object({ providerId: z.string(), modelId: z.string() });
|
|
6
|
+
const rulesetSchema = z.array(z.object({ permission: z.string(), pattern: z.string(), action: z.enum(["allow", "deny", "ask"]) }));
|
|
7
|
+
export const sessionInfoSchema = z.object({
|
|
8
|
+
id: z.string(),
|
|
9
|
+
workspaceId: z.string(),
|
|
10
|
+
userId: z.string(),
|
|
11
|
+
parentId: z.string().optional(),
|
|
12
|
+
title: z.string(),
|
|
13
|
+
agent: z.string(),
|
|
14
|
+
model: modelRefSchema,
|
|
15
|
+
permission: rulesetSchema,
|
|
16
|
+
queuedPrompts: z.array(z.object({ text: z.string(), agent: z.string().optional(), enqueuedAt: z.string() })),
|
|
17
|
+
time: z.object({ created: z.string(), updated: z.string(), archived: z.string().optional() }),
|
|
18
|
+
});
|
|
19
|
+
export const messageInfoSchema = z.custom((value) => typeof value === "object" &&
|
|
20
|
+
value !== null &&
|
|
21
|
+
"role" in value &&
|
|
22
|
+
(value.role === "user" || value.role === "assistant"), "invalid MessageInfo");
|
|
23
|
+
export const partSchema = z.custom((value) => typeof value === "object" && value !== null && "type" in value && typeof value.type === "string", "invalid Part");
|
|
24
|
+
const permissionRequestSchema = z.object({
|
|
25
|
+
id: z.string(),
|
|
26
|
+
sessionId: z.string(),
|
|
27
|
+
permission: z.string(),
|
|
28
|
+
patterns: z.array(z.string()),
|
|
29
|
+
metadata: z.unknown().optional(),
|
|
30
|
+
always: z.array(z.string()),
|
|
31
|
+
tool: z.object({ messageId: z.string(), callId: z.string() }).optional(),
|
|
32
|
+
});
|
|
33
|
+
const todoItemSchema = z.object({
|
|
34
|
+
content: z.string(),
|
|
35
|
+
status: z.enum(["pending", "in_progress", "completed", "cancelled"]),
|
|
36
|
+
priority: z.enum(["high", "medium", "low"]).optional(),
|
|
37
|
+
});
|
|
38
|
+
export const frameworkEventSchemas = {
|
|
39
|
+
"session.updated": z.object({ session: sessionInfoSchema }),
|
|
40
|
+
"session.status": z.object({ status: z.enum(["idle", "running", "waiting_permission", "waiting_input"]) }),
|
|
41
|
+
"session.error": z.object({ name: z.string(), message: z.string() }),
|
|
42
|
+
"message.updated": z.object({ message: messageInfoSchema }),
|
|
43
|
+
"message.part.updated": z.object({ part: partSchema }),
|
|
44
|
+
"message.part.delta": z.object({ messageId: z.string(), partId: z.string(), field: z.literal("text"), delta: z.string() }),
|
|
45
|
+
"permission.asked": z.object({ request: permissionRequestSchema }),
|
|
46
|
+
"permission.replied": z.object({ id: z.string(), reply: z.enum(["once", "always", "reject"]) }),
|
|
47
|
+
"todo.updated": z.object({ todos: z.array(todoItemSchema) }),
|
|
48
|
+
"file.edited": z.object({ path: z.string(), revisionId: z.string(), diff: z.string() }),
|
|
49
|
+
"artifact.created": z.object({
|
|
50
|
+
artifactId: z.string(),
|
|
51
|
+
path: z.string(),
|
|
52
|
+
bytes: z.number(),
|
|
53
|
+
contentType: z.string(),
|
|
54
|
+
downloadUrl: z.string(),
|
|
55
|
+
previewUrl: z.string().optional(),
|
|
56
|
+
}),
|
|
57
|
+
};
|
|
58
|
+
/** Narrows an unknown payload (e.g. from an SSE frame) to a FrameworkEvent. */
|
|
59
|
+
export function parseFrameworkEvent(value) {
|
|
60
|
+
if (typeof value !== "object" || value === null)
|
|
61
|
+
return null;
|
|
62
|
+
const { type, data } = value;
|
|
63
|
+
if (typeof type !== "string" || !(type in frameworkEventSchemas))
|
|
64
|
+
return null;
|
|
65
|
+
const schema = frameworkEventSchemas[type];
|
|
66
|
+
const parsed = schema.safeParse(data);
|
|
67
|
+
return parsed.success ? { type, data: parsed.data } : null;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/core/events/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { type Action, type Ruleset } from "../permission/ruleset.js";
|
|
2
|
+
/** Permission engine (spec §5.2/§5.3). The single choke point for every
|
|
3
|
+
* dangerous operation: SessionRunner wires `ask()` into PI's beforeToolCall.
|
|
4
|
+
*
|
|
5
|
+
* - allow-all patterns short-circuit without emitting any event
|
|
6
|
+
* - otherwise a PermissionRequest is published (`permission.asked`) and the
|
|
7
|
+
* caller is suspended on a Deferred until `reply()` resolves it
|
|
8
|
+
* - "always" stamps an allow rule onto the session ruleset and auto-resolves
|
|
9
|
+
* other pending requests in the same session now covered by it
|
|
10
|
+
* - "reject" throws RejectedError back into the tool call (fed to the model)
|
|
11
|
+
*/
|
|
12
|
+
export type Reply = "once" | "always" | "reject";
|
|
13
|
+
export type PermissionRequest = {
|
|
14
|
+
id: string;
|
|
15
|
+
sessionId: string;
|
|
16
|
+
permission: string;
|
|
17
|
+
patterns: string[];
|
|
18
|
+
metadata?: unknown;
|
|
19
|
+
always: string[];
|
|
20
|
+
tool?: {
|
|
21
|
+
messageId: string;
|
|
22
|
+
callId: string;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
export declare class RejectedError extends Error {
|
|
26
|
+
readonly feedback?: string | undefined;
|
|
27
|
+
constructor(message: string, feedback?: string | undefined);
|
|
28
|
+
}
|
|
29
|
+
export type AskInput = {
|
|
30
|
+
sessionId: string;
|
|
31
|
+
permission: string;
|
|
32
|
+
patterns: string[];
|
|
33
|
+
metadata?: unknown;
|
|
34
|
+
always?: string[];
|
|
35
|
+
tool?: {
|
|
36
|
+
messageId: string;
|
|
37
|
+
callId: string;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
export type PermissionEngineOptions = {
|
|
41
|
+
/** Called after a request is created; typically publishes permission.asked. */
|
|
42
|
+
onAsked?: (request: PermissionRequest) => void | Promise<void>;
|
|
43
|
+
/** Called when a request resolves; typically publishes permission.replied. */
|
|
44
|
+
onReplied?: (request: PermissionRequest, reply: Reply) => void | Promise<void>;
|
|
45
|
+
/** Persist a session-scoped rule produced by an "always" reply. */
|
|
46
|
+
onSessionRuleAdded?: (sessionId: string, rule: {
|
|
47
|
+
permission: string;
|
|
48
|
+
pattern: string;
|
|
49
|
+
action: Action;
|
|
50
|
+
}) => void | Promise<void>;
|
|
51
|
+
};
|
|
52
|
+
export declare class PermissionEngine {
|
|
53
|
+
private readonly sessionId;
|
|
54
|
+
private readonly options;
|
|
55
|
+
/** Rulesets in ascending precedence: built-in defaults → agent preset → session. */
|
|
56
|
+
private readonly rulesets;
|
|
57
|
+
private readonly sessionRules;
|
|
58
|
+
private readonly pending;
|
|
59
|
+
private disposed;
|
|
60
|
+
/** 临时允许缓存:once 批准后同一 run 内相同模式直接放行(F1,避免 Agent
|
|
61
|
+
* 二次调用相同命令时重复打断用户)。run 结束(dispose)时清空,下次 run
|
|
62
|
+
* 重新询问。键 = permission + pattern(bash 的 pattern 即命令原文)。 */
|
|
63
|
+
private readonly onceAllowed;
|
|
64
|
+
constructor(sessionId: string, baseRulesets: Ruleset[], sessionRules?: Ruleset, options?: PermissionEngineOptions);
|
|
65
|
+
private onceKey;
|
|
66
|
+
evaluate(permission: string, pattern: string): Action;
|
|
67
|
+
/** Snapshot of the effective session rules (for persistence on reply "always"). */
|
|
68
|
+
get sessionRuleset(): Ruleset;
|
|
69
|
+
revoke(permission: string, patterns: string[]): boolean;
|
|
70
|
+
get pendingRequests(): PermissionRequest[];
|
|
71
|
+
ask(input: AskInput): Promise<Reply>;
|
|
72
|
+
/** Resolves a pending request. Returns false when the id is unknown (already
|
|
73
|
+
* resolved or session restarted — callers map that to a 404/conflict).
|
|
74
|
+
*
|
|
75
|
+
* Harness-course retrofit(tutorial-harness 08,OpenCode 拒绝级联):用户拒绝一个
|
|
76
|
+
* 请求时,同会话排队中的其他待批请求一并拒绝——用户说“不”的时候,
|
|
77
|
+
* 不该让后面的请求继续敲门。批准不连坐,拒绝连坐。 */
|
|
78
|
+
reply(requestId: string, reply: Reply, feedback?: string): boolean;
|
|
79
|
+
/** Rejects everything still pending — used on abort and process teardown so
|
|
80
|
+
* tool calls never hang forever (spec §5.4: restart semantics). Also clears
|
|
81
|
+
* the once-allowed cache so the next run asks again. */
|
|
82
|
+
dispose(reason?: string): void;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/core/permission/engine.ts"],"names":[],"mappings":"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"}
|