@mingyuxu/core 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.
Files changed (66) hide show
  1. package/README.md +7 -0
  2. package/dist/coding/agent.d.ts +64 -0
  3. package/dist/coding/agent.d.ts.map +1 -0
  4. package/dist/coding/agent.js +179 -0
  5. package/dist/coding/agent.js.map +1 -0
  6. package/dist/coding/tools.d.ts +45 -0
  7. package/dist/coding/tools.d.ts.map +1 -0
  8. package/dist/coding/tools.js +327 -0
  9. package/dist/coding/tools.js.map +1 -0
  10. package/dist/commander.d.ts +108 -0
  11. package/dist/commander.d.ts.map +1 -0
  12. package/dist/commander.js +246 -0
  13. package/dist/commander.js.map +1 -0
  14. package/dist/extensions.d.ts +26 -0
  15. package/dist/extensions.d.ts.map +1 -0
  16. package/dist/extensions.js +66 -0
  17. package/dist/extensions.js.map +1 -0
  18. package/dist/goal-loop.d.ts +30 -0
  19. package/dist/goal-loop.d.ts.map +1 -0
  20. package/dist/goal-loop.js +96 -0
  21. package/dist/goal-loop.js.map +1 -0
  22. package/dist/hooks.d.ts +17 -0
  23. package/dist/hooks.d.ts.map +1 -0
  24. package/dist/hooks.js +44 -0
  25. package/dist/hooks.js.map +1 -0
  26. package/dist/index.d.ts +33 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +20 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/loop.d.ts +42 -0
  31. package/dist/loop.d.ts.map +1 -0
  32. package/dist/loop.js +86 -0
  33. package/dist/loop.js.map +1 -0
  34. package/dist/orchestrator.d.ts +48 -0
  35. package/dist/orchestrator.d.ts.map +1 -0
  36. package/dist/orchestrator.js +194 -0
  37. package/dist/orchestrator.js.map +1 -0
  38. package/dist/reconcile.d.ts +5 -0
  39. package/dist/reconcile.d.ts.map +1 -0
  40. package/dist/reconcile.js +28 -0
  41. package/dist/reconcile.js.map +1 -0
  42. package/dist/sandbox.d.ts +14 -0
  43. package/dist/sandbox.d.ts.map +1 -0
  44. package/dist/sandbox.js +36 -0
  45. package/dist/sandbox.js.map +1 -0
  46. package/dist/session.d.ts +43 -0
  47. package/dist/session.d.ts.map +1 -0
  48. package/dist/session.js +104 -0
  49. package/dist/session.js.map +1 -0
  50. package/dist/subagents/dispatch.d.ts +34 -0
  51. package/dist/subagents/dispatch.d.ts.map +1 -0
  52. package/dist/subagents/dispatch.js +80 -0
  53. package/dist/subagents/dispatch.js.map +1 -0
  54. package/dist/task-graph.d.ts +32 -0
  55. package/dist/task-graph.d.ts.map +1 -0
  56. package/dist/task-graph.js +77 -0
  57. package/dist/task-graph.js.map +1 -0
  58. package/dist/tools.d.ts +24 -0
  59. package/dist/tools.d.ts.map +1 -0
  60. package/dist/tools.js +54 -0
  61. package/dist/tools.js.map +1 -0
  62. package/dist/workspace.d.ts +92 -0
  63. package/dist/workspace.d.ts.map +1 -0
  64. package/dist/workspace.js +346 -0
  65. package/dist/workspace.js.map +1 -0
  66. package/package.json +34 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** 每相位的最低期望产物(相对 workspace/<scenario>/)——宣称之外的硬底线。 */
2
+ export declare const PHASE_MINIMUM: Record<string, string[]>;
3
+ /** 返回缺失清单(空 = 对账通过)。 */
4
+ export declare function reconcile(sessionHome: string, phase: string, claimed: string[]): string[];
5
+ //# sourceMappingURL=reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AAQA,sDAAsD;AACtD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAMlD,CAAC;AAEF,wBAAwB;AACxB,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAUzF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 磁盘对账(I3)—— 完成以盘上产物为准,不信 agent 宣称。
3
+ * 相位推进前:宣称产物 ∪ 该相位最低期望,逐一核对文件系统。差集非空 = 幽灵完成,打回。
4
+ * 从 Python reconcile.py 忠实移植。
5
+ */
6
+ import { existsSync, statSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ /** 每相位的最低期望产物(相对 workspace/<scenario>/)——宣称之外的硬底线。 */
9
+ export const PHASE_MINIMUM = {
10
+ analyze: ["build/targets.json"],
11
+ observe: ["build/targets.json", "build/observations.json"],
12
+ propose: ["build/specs.json", "build/proposals.json"],
13
+ test: ["build/test_report.json"],
14
+ freeze: ["pack/pack.json", "pack/freeze_manifest.json"],
15
+ };
16
+ /** 返回缺失清单(空 = 对账通过)。 */
17
+ export function reconcile(sessionHome, phase, claimed) {
18
+ const expected = [...new Set([...claimed, ...(PHASE_MINIMUM[phase] ?? [])])];
19
+ const missing = [];
20
+ for (const rel of expected) {
21
+ const p = join(sessionHome, rel);
22
+ if (!existsSync(p) || (statSync(p).isFile() && statSync(p).size === 0)) {
23
+ missing.push(rel);
24
+ }
25
+ }
26
+ return missing;
27
+ }
28
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,sDAAsD;AACtD,MAAM,CAAC,MAAM,aAAa,GAA6B;IACrD,OAAO,EAAE,CAAC,oBAAoB,CAAC;IAC/B,OAAO,EAAE,CAAC,oBAAoB,EAAE,yBAAyB,CAAC;IAC1D,OAAO,EAAE,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;IACrD,IAAI,EAAE,CAAC,wBAAwB,CAAC;IAChC,MAAM,EAAE,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;CACxD,CAAC;AAEF,wBAAwB;AACxB,MAAM,UAAU,SAAS,CAAC,WAAmB,EAAE,KAAa,EAAE,OAAiB;IAC7E,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare class SandboxViolation extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class Sandbox {
5
+ readonly root: string;
6
+ constructor(root: string);
7
+ private resolvePath;
8
+ contains(path: string): boolean;
9
+ /** 校验写路径在界内,返回解析后绝对路径;越界抛 SandboxViolation。 */
10
+ checkWrite(path: string): string;
11
+ /** 沙箱内安全写:先过 checkWrite,再建目录写入。 */
12
+ safeWrite(path: string, data: string): void;
13
+ }
14
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAOA,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAC5B;AAED,qBAAa,OAAO;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,IAAI,EAAE,MAAM;IAIxB,OAAO,CAAC,WAAW;IAInB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK/B,+CAA+C;IAC/C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAMhC,mCAAmC;IACnC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;CAK5C"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 沙箱边界护栏(宪法 §3.5)—— L1 目录沙箱:所有写限制在 build workdir 内,越界 fail-closed。
3
+ * 纯代码、确定性、可测;不调 LLM。从 Python core/sandbox.py 移植。
4
+ */
5
+ import { writeFileSync, mkdirSync } from "node:fs";
6
+ import { resolve, dirname, relative, isAbsolute } from "node:path";
7
+ export class SandboxViolation extends Error {
8
+ constructor(message) { super(message); this.name = "SandboxViolation"; }
9
+ }
10
+ export class Sandbox {
11
+ root;
12
+ constructor(root) {
13
+ this.root = resolve(root); // 文本规范化(处理 ..);不 realpath,避免符号链接不对称
14
+ }
15
+ resolvePath(path) {
16
+ return isAbsolute(path) ? resolve(path) : resolve(this.root, path);
17
+ }
18
+ contains(path) {
19
+ const rel = relative(this.root, this.resolvePath(path));
20
+ return !rel.startsWith("..") && !isAbsolute(rel);
21
+ }
22
+ /** 校验写路径在界内,返回解析后绝对路径;越界抛 SandboxViolation。 */
23
+ checkWrite(path) {
24
+ const resolved = this.resolvePath(path);
25
+ if (!this.contains(resolved))
26
+ throw new SandboxViolation(`写越界:${resolved} 不在沙箱 ${this.root} 内`);
27
+ return resolved;
28
+ }
29
+ /** 沙箱内安全写:先过 checkWrite,再建目录写入。 */
30
+ safeWrite(path, data) {
31
+ const p = this.checkWrite(path);
32
+ mkdirSync(dirname(p), { recursive: true });
33
+ writeFileSync(p, data, "utf-8");
34
+ }
35
+ }
36
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEnE,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC,CAAC,CAAC;CACjF;AAED,MAAM,OAAO,OAAO;IACT,IAAI,CAAS;IACtB,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAc,oCAAoC;IAC9E,CAAC;IAEO,WAAW,CAAC,IAAY;QAC9B,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;IAED,+CAA+C;IAC/C,UAAU,CAAC,IAAY;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,gBAAgB,CAAC,OAAO,QAAQ,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAChG,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,mCAAmC;IACnC,SAAS,CAAC,IAAY,EAAE,IAAY;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,43 @@
1
+ export declare const PHASES: readonly ["analyze", "observe", "propose", "test", "freeze"];
2
+ export declare const TERMINAL = "frozen";
3
+ export declare const IDENTITY: string;
4
+ export interface SessionData {
5
+ scenarioKey: string;
6
+ goal: string;
7
+ taskType?: string;
8
+ phase?: string;
9
+ inputs?: Record<string, string>;
10
+ artifacts?: Record<string, string[]>;
11
+ approved?: boolean;
12
+ winner?: string;
13
+ createdAt?: number;
14
+ updatedAt?: number;
15
+ lastProgressAt?: number;
16
+ ledgerSnapshot?: Record<string, unknown>;
17
+ }
18
+ export declare class Session {
19
+ scenarioKey: string;
20
+ goal: string;
21
+ taskType: string;
22
+ phase: string;
23
+ inputs: Record<string, string>;
24
+ artifacts: Record<string, string[]>;
25
+ approved: boolean;
26
+ winner: string;
27
+ createdAt: number;
28
+ updatedAt: number;
29
+ lastProgressAt: number;
30
+ ledgerSnapshot: Record<string, unknown>;
31
+ constructor(d: SessionData);
32
+ pinHeader(): string;
33
+ nextPhase(): string;
34
+ recordArtifact(rel: string, ts?: number): void;
35
+ home(workspace: string): string;
36
+ save(workspace: string, ts?: number): string;
37
+ toJSON(): SessionData;
38
+ static load(workspace: string, scenarioKey: string): Session;
39
+ event(workspace: string, kind: string, payload?: Record<string, unknown>, ts?: number): void;
40
+ transcriptAppend(workspace: string, role: string, text: string, ts?: number): void;
41
+ transcriptTail(workspace: string, n?: number): Array<Record<string, unknown>>;
42
+ }
43
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,MAAM,8DAA+D,CAAC;AACnF,eAAO,MAAM,QAAQ,WAAW,CAAC;AAEjC,eAAO,MAAM,QAAQ,QAGoB,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAID,qBAAa,OAAO;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAE5B,CAAC,EAAE,WAAW;IAe1B,SAAS,IAAI,MAAM;IASnB,SAAS,IAAI,MAAM;IAKnB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,GAAE,MAAc,GAAG,IAAI;IAMrD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI/B,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAE,MAAc,GAAG,MAAM;IASnD,MAAM,IAAI,WAAW;IAUrB,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAM5D,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAAE,EAAE,GAAE,MAAc,GAAG,IAAI;IAOvG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAE,MAAc,GAAG,IAAI;IAOzF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,SAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAM1E"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * 会话持久化 —— every conversation is a durable workflow(I1/I3 地基)。
3
+ * Session 是 build 的盘上状态:goal pin、兼容生命周期、产物清单、审批标记 + 对话账。
4
+ * 从 Python memory.py 忠实移植(file_lock 简化为进程内同步写)。
5
+ */
6
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, appendFileSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ export const PHASES = ["analyze", "observe", "propose", "test", "freeze"];
9
+ export const TERMINAL = "frozen";
10
+ export const IDENTITY = "你是 vet,造核查生产线的领域 agent。红线:判定必有证据(无据→needs_review,不猜);" +
11
+ "可写代码但须沙箱+探针门+人工审阅后冻结;冻结须自评达标+grounding+人工 approve(无权自批);" +
12
+ "完成以磁盘对账为准;judge≠doer。完整规格见 AGENTS.md。";
13
+ const now = () => Date.now() / 1000;
14
+ export class Session {
15
+ scenarioKey;
16
+ goal;
17
+ taskType;
18
+ phase;
19
+ inputs;
20
+ artifacts;
21
+ approved;
22
+ winner;
23
+ createdAt;
24
+ updatedAt;
25
+ lastProgressAt;
26
+ ledgerSnapshot;
27
+ constructor(d) {
28
+ this.scenarioKey = d.scenarioKey;
29
+ this.goal = d.goal;
30
+ this.taskType = d.taskType ?? "predicate";
31
+ this.phase = d.phase ?? "analyze";
32
+ this.inputs = d.inputs ?? {};
33
+ this.artifacts = d.artifacts ?? {};
34
+ this.approved = d.approved ?? false;
35
+ this.winner = d.winner ?? "";
36
+ this.createdAt = d.createdAt ?? 0;
37
+ this.updatedAt = d.updatedAt ?? 0;
38
+ this.lastProgressAt = d.lastProgressAt ?? 0;
39
+ this.ledgerSnapshot = d.ledgerSnapshot ?? {};
40
+ }
41
+ pinHeader() {
42
+ return (`${IDENTITY}\n` +
43
+ `[长程目标] ${this.goal}\n` +
44
+ `[场景] ${this.scenarioKey} · 任务类型 ${this.taskType}\n` +
45
+ `[兼容生命周期] ${this.phase}(Commander 的真实路径见 agent-plan.json)`);
46
+ }
47
+ nextPhase() {
48
+ if (this.phase === PHASES[PHASES.length - 1])
49
+ return TERMINAL;
50
+ return PHASES[PHASES.indexOf(this.phase) + 1];
51
+ }
52
+ recordArtifact(rel, ts = now()) {
53
+ (this.artifacts[this.phase] ??= []);
54
+ if (!this.artifacts[this.phase].includes(rel))
55
+ this.artifacts[this.phase].push(rel);
56
+ this.lastProgressAt = ts;
57
+ }
58
+ home(workspace) {
59
+ return join(workspace, this.scenarioKey);
60
+ }
61
+ save(workspace, ts = now()) {
62
+ this.updatedAt = ts;
63
+ const dir = join(this.home(workspace), ".session");
64
+ mkdirSync(dir, { recursive: true });
65
+ const path = join(dir, "state.json");
66
+ writeFileSync(path, JSON.stringify(this.toJSON(), null, 2), "utf-8");
67
+ return path;
68
+ }
69
+ toJSON() {
70
+ return {
71
+ scenarioKey: this.scenarioKey, goal: this.goal, taskType: this.taskType,
72
+ phase: this.phase, inputs: this.inputs, artifacts: this.artifacts,
73
+ approved: this.approved, winner: this.winner, createdAt: this.createdAt,
74
+ updatedAt: this.updatedAt, lastProgressAt: this.lastProgressAt,
75
+ ledgerSnapshot: this.ledgerSnapshot,
76
+ };
77
+ }
78
+ static load(workspace, scenarioKey) {
79
+ const path = join(workspace, scenarioKey, ".session", "state.json");
80
+ if (!existsSync(path))
81
+ throw new Error(`没有可恢复的会话: ${path}`);
82
+ return new Session(JSON.parse(readFileSync(path, "utf-8")));
83
+ }
84
+ event(workspace, kind, payload = {}, ts = now()) {
85
+ const dir = join(this.home(workspace), ".session");
86
+ mkdirSync(dir, { recursive: true });
87
+ const row = { ts, phase: this.phase, kind, ...payload };
88
+ appendFileSync(join(dir, "events.jsonl"), JSON.stringify(row) + "\n", "utf-8");
89
+ }
90
+ transcriptAppend(workspace, role, text, ts = now()) {
91
+ const dir = join(this.home(workspace), ".session");
92
+ mkdirSync(dir, { recursive: true });
93
+ const row = { ts, phase: this.phase, role, text };
94
+ appendFileSync(join(dir, "transcript.jsonl"), JSON.stringify(row) + "\n", "utf-8");
95
+ }
96
+ transcriptTail(workspace, n = 20) {
97
+ const path = join(this.home(workspace), ".session", "transcript.jsonl");
98
+ if (!existsSync(path))
99
+ return [];
100
+ const rows = readFileSync(path, "utf-8").split("\n").filter((l) => l.trim()).map((l) => JSON.parse(l));
101
+ return rows.slice(-n);
102
+ }
103
+ }
104
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 委派契约、subagent 生命周期(I4/I5/I6)—— 从 Python subagents/dispatch.py 移植。
3
+ * typed brief 取代散文委派:目标 + 输入清单 + 输出 schema + 预算,发出前过完整性 lint。
4
+ * subagent = 独立子进程 + 独立目录;kill 协作式(先落 STOP 文件,超时才 terminate)。
5
+ * spawn 跑一个 node worker 脚本(TS 无 python -m,改传 worker 脚本绝对路径,分层单向仍成立)。
6
+ */
7
+ import { type ChildProcess } from "node:child_process";
8
+ export interface TypedBrief {
9
+ goal: string;
10
+ inputs: string[];
11
+ output_schema: Record<string, unknown>;
12
+ budget: Record<string, number>;
13
+ items_declared?: number | null;
14
+ }
15
+ /** 完整性 lint:结构缺项 + 数量对账。返回错误清单(空 = 通过)。 */
16
+ export declare function lintBrief(b: TypedBrief): string[];
17
+ export interface SubagentHandle {
18
+ dir: string;
19
+ proc: ChildProcess;
20
+ exited: {
21
+ code: number | null;
22
+ };
23
+ }
24
+ /** 独立目录 + 独立进程启动 subagent;brief 发出前强制 lint(I5)。 */
25
+ export declare function spawnSubagent(parentDir: string, task: string, args: Record<string, unknown>, brief: TypedBrief, opts: {
26
+ env?: NodeJS.ProcessEnv;
27
+ workerScript: string;
28
+ }): SubagentHandle;
29
+ export declare function pollSubagent(h: SubagentHandle): string;
30
+ /** 等待完成并返回 result.json;超时先协作式 kill 再抛。 */
31
+ export declare function waitSubagent(h: SubagentHandle, timeoutSeconds: number, pollMs?: number): Promise<Record<string, unknown>>;
32
+ /** 协作式 kill:落 STOP 文件 → 宽限期 → 超时 terminate。 */
33
+ export declare function killSubagent(h: SubagentHandle, graceSeconds?: number): Promise<void>;
34
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/subagents/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI9D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,2CAA2C;AAC3C,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAQjD;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACjC;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAgBxL;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAGtD;AAID,0CAA0C;AAC1C,wBAAsB,YAAY,CAAC,CAAC,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,SAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAa5H;AAED,+CAA+C;AAC/C,wBAAsB,YAAY,CAAC,CAAC,EAAE,cAAc,EAAE,YAAY,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAQrF"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * 委派契约、subagent 生命周期(I4/I5/I6)—— 从 Python subagents/dispatch.py 移植。
3
+ * typed brief 取代散文委派:目标 + 输入清单 + 输出 schema + 预算,发出前过完整性 lint。
4
+ * subagent = 独立子进程 + 独立目录;kill 协作式(先落 STOP 文件,超时才 terminate)。
5
+ * spawn 跑一个 node worker 脚本(TS 无 python -m,改传 worker 脚本绝对路径,分层单向仍成立)。
6
+ */
7
+ import { spawn } from "node:child_process";
8
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, statSync, openSync, closeSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ /** 完整性 lint:结构缺项 + 数量对账。返回错误清单(空 = 通过)。 */
11
+ export function lintBrief(b) {
12
+ const e = [];
13
+ if (!b.goal?.trim())
14
+ e.push("brief.goal 为空");
15
+ if (!b.inputs?.length)
16
+ e.push("brief.inputs 为空——委派必须带输入清单");
17
+ if (!b.output_schema || !Object.keys(b.output_schema).length)
18
+ e.push("brief.output_schema 为空——没有输出契约的委派不可验收");
19
+ if (!b.budget || !Object.keys(b.budget).length)
20
+ e.push("brief.budget 为空——无预算的委派违反 I11");
21
+ if (b.items_declared != null && b.items_declared !== b.inputs.length)
22
+ e.push(`数量对账失败:宣称 ${b.items_declared} 项,实际枚举 ${b.inputs.length} 项`);
23
+ return e;
24
+ }
25
+ /** 独立目录 + 独立进程启动 subagent;brief 发出前强制 lint(I5)。 */
26
+ export function spawnSubagent(parentDir, task, args, brief, opts) {
27
+ const errors = lintBrief(brief);
28
+ if (errors.length)
29
+ throw new Error("brief lint 不通过,拒绝委派:\n - " + errors.join("\n - "));
30
+ const dir0 = join(parentDir, "subagents");
31
+ mkdirSync(dir0, { recursive: true });
32
+ const index = readdirSync(dir0).filter((n) => statSync(join(dir0, n)).isDirectory()).length + 1;
33
+ const workDir = join(dir0, `${task}-${String(index).padStart(3, "0")}`);
34
+ mkdirSync(workDir);
35
+ writeFileSync(join(workDir, "brief.json"), JSON.stringify(brief, null, 2), "utf-8");
36
+ writeFileSync(join(workDir, "task.json"), JSON.stringify({ task, args }, null, 2), "utf-8");
37
+ writeFileSync(join(workDir, "status.json"), '{"status": "running"}', "utf-8");
38
+ const logFd = openSync(join(workDir, "stdout.log"), "w");
39
+ const proc = spawn("node", [opts.workerScript, workDir], { stdio: ["ignore", logFd, logFd], env: opts.env ?? process.env });
40
+ const exited = { code: null };
41
+ proc.on("exit", (code) => { exited.code = code ?? 0; closeSync(logFd); });
42
+ return { dir: workDir, proc, exited };
43
+ }
44
+ export function pollSubagent(h) {
45
+ try {
46
+ return JSON.parse(readFileSync(join(h.dir, "status.json"), "utf-8")).status;
47
+ }
48
+ catch {
49
+ return "unknown";
50
+ }
51
+ }
52
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
53
+ /** 等待完成并返回 result.json;超时先协作式 kill 再抛。 */
54
+ export async function waitSubagent(h, timeoutSeconds, pollMs = 200) {
55
+ const deadline = Date.now() + timeoutSeconds * 1000;
56
+ while (Date.now() < deadline) {
57
+ if (h.exited.code !== null) {
58
+ const status = pollSubagent(h);
59
+ const resultPath = join(h.dir, "result.json");
60
+ if (status === "done" && existsSync(resultPath))
61
+ return JSON.parse(readFileSync(resultPath, "utf-8"));
62
+ throw new Error(`subagent 失败(status=${status}):见 ${h.dir}/stdout.log`);
63
+ }
64
+ await sleep(pollMs);
65
+ }
66
+ await killSubagent(h);
67
+ throw new Error(`subagent 超时(>${timeoutSeconds}s),已 kill:${h.dir}`);
68
+ }
69
+ /** 协作式 kill:落 STOP 文件 → 宽限期 → 超时 terminate。 */
70
+ export async function killSubagent(h, graceSeconds = 5) {
71
+ writeFileSync(join(h.dir, "STOP"), "", "utf-8");
72
+ const deadline = Date.now() + graceSeconds * 1000;
73
+ while (Date.now() < deadline) {
74
+ if (h.exited.code !== null)
75
+ return;
76
+ await sleep(100);
77
+ }
78
+ h.proc.kill("SIGTERM");
79
+ }
80
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/subagents/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAUjC,2CAA2C;AAC3C,MAAM,UAAU,SAAS,CAAC,CAAa;IACrC,MAAM,CAAC,GAAa,EAAE,CAAC;IACvB,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE;QAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM;QAAE,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC5D,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM;QAAE,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAC9G,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM;QAAE,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IACxF,IAAI,CAAC,CAAC,cAAc,IAAI,IAAI,IAAI,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM;QAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,cAAc,WAAW,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAC1I,OAAO,CAAC,CAAC;AACX,CAAC;AAQD,mDAAmD;AACnD,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,IAAY,EAAE,IAA6B,EAAE,KAAiB,EAAE,IAAuD;IACtK,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC1C,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACxE,SAAS,CAAC,OAAO,CAAC,CAAC;IACnB,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACpF,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5F,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5H,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,IAAqB,EAAE,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAiB;IAC5C,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAAC,CAAC;IACpF,MAAM,CAAC;QAAC,OAAO,SAAS,CAAC;IAAC,CAAC;AAC7B,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEpE,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,CAAiB,EAAE,cAAsB,EAAE,MAAM,GAAG,GAAG;IACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,IAAI,CAAC;IACpD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YAC9C,IAAI,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YACtG,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,OAAO,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,KAAK,CAAC,gBAAgB,cAAc,aAAa,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,CAAiB,EAAE,YAAY,GAAG,CAAC;IACpE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,GAAG,IAAI,CAAC;IAClD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QACnC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,32 @@
1
+ /** 动态任务图:表达依赖、就绪条件和 Goal Patch,不把 Agent 退化成阶段游标。 */
2
+ export type TaskNodeStatus = "pending" | "running" | "done" | "blocked" | "stale";
3
+ export interface TaskNode {
4
+ id: string;
5
+ text: string;
6
+ status: TaskNodeStatus;
7
+ dependsOn: string[];
8
+ evidence?: string;
9
+ acceptanceRefs?: string[];
10
+ }
11
+ export interface TaskGraph {
12
+ version: 2;
13
+ goal: string;
14
+ status: "planning" | "running" | "waiting_user" | "evaluating" | "complete" | "blocked" | "paused";
15
+ rationale?: string;
16
+ nodes: TaskNode[];
17
+ updatedAt: string;
18
+ }
19
+ export interface GoalPatch {
20
+ reason: string;
21
+ goal?: string;
22
+ add?: TaskNode[];
23
+ update?: Array<Partial<TaskNode> & {
24
+ id: string;
25
+ }>;
26
+ remove?: string[];
27
+ invalidate?: string[];
28
+ }
29
+ export declare function validateTaskGraph(graph: TaskGraph): string[];
30
+ export declare function readyTasks(graph: TaskGraph): TaskNode[];
31
+ export declare function applyGoalPatch(graph: TaskGraph, patch: GoalPatch, at?: string): TaskGraph;
32
+ //# sourceMappingURL=task-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-graph.d.ts","sourceRoot":"","sources":["../src/task-graph.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAElF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,cAAc,GAAG,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IACnG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CAuB5D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,EAAE,CAGvD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,SAA2B,GAAG,SAAS,CAwB3G"}
@@ -0,0 +1,77 @@
1
+ export function validateTaskGraph(graph) {
2
+ const issues = [];
3
+ const ids = new Set();
4
+ for (const node of graph.nodes) {
5
+ if (!node.id)
6
+ issues.push("任务节点缺 id");
7
+ if (ids.has(node.id))
8
+ issues.push(`任务节点重复:${node.id}`);
9
+ ids.add(node.id);
10
+ }
11
+ for (const node of graph.nodes)
12
+ for (const dep of node.dependsOn) {
13
+ if (!ids.has(dep))
14
+ issues.push(`${node.id} 依赖不存在的节点 ${dep}`);
15
+ if (dep === node.id)
16
+ issues.push(`${node.id} 不能依赖自身`);
17
+ }
18
+ const visiting = new Set(), visited = new Set();
19
+ const byId = new Map(graph.nodes.map((node) => [node.id, node]));
20
+ const visit = (id) => {
21
+ if (visiting.has(id)) {
22
+ issues.push(`任务图存在环:${id}`);
23
+ return;
24
+ }
25
+ if (visited.has(id))
26
+ return;
27
+ visiting.add(id);
28
+ for (const dep of byId.get(id)?.dependsOn ?? [])
29
+ if (byId.has(dep))
30
+ visit(dep);
31
+ visiting.delete(id);
32
+ visited.add(id);
33
+ };
34
+ for (const id of ids)
35
+ visit(id);
36
+ return [...new Set(issues)];
37
+ }
38
+ export function readyTasks(graph) {
39
+ const byId = new Map(graph.nodes.map((node) => [node.id, node]));
40
+ return graph.nodes.filter((node) => node.status === "pending" && node.dependsOn.every((id) => byId.get(id)?.status === "done"));
41
+ }
42
+ export function applyGoalPatch(graph, patch, at = new Date().toISOString()) {
43
+ const map = new Map(graph.nodes.map((node) => [node.id, { ...node, dependsOn: [...node.dependsOn] }]));
44
+ for (const id of patch.remove ?? [])
45
+ map.delete(id);
46
+ for (const change of patch.update ?? []) {
47
+ const prior = map.get(change.id);
48
+ if (!prior)
49
+ throw new Error(`Goal Patch 要更新的任务不存在:${change.id}`);
50
+ map.set(change.id, { ...prior, ...change, dependsOn: change.dependsOn ? [...change.dependsOn] : prior.dependsOn });
51
+ }
52
+ for (const node of patch.add ?? []) {
53
+ if (map.has(node.id))
54
+ throw new Error(`Goal Patch 新增任务已存在:${node.id}`);
55
+ map.set(node.id, { ...node, dependsOn: [...node.dependsOn] });
56
+ }
57
+ const reverse = new Map();
58
+ for (const node of map.values())
59
+ for (const dep of node.dependsOn)
60
+ reverse.set(dep, [...(reverse.get(dep) ?? []), node.id]);
61
+ const stale = [...(patch.invalidate ?? [])];
62
+ for (let i = 0; i < stale.length; i++)
63
+ for (const child of reverse.get(stale[i]) ?? [])
64
+ if (!stale.includes(child))
65
+ stale.push(child);
66
+ for (const id of stale) {
67
+ const node = map.get(id);
68
+ if (node && node.status !== "blocked")
69
+ map.set(id, { ...node, status: "stale", evidence: undefined });
70
+ }
71
+ const next = { ...graph, goal: patch.goal ?? graph.goal, nodes: [...map.values()], rationale: patch.reason, status: "running", updatedAt: at };
72
+ const issues = validateTaskGraph(next);
73
+ if (issues.length)
74
+ throw new Error(`Goal Patch 产生非法任务图:${issues.join(";")}`);
75
+ return next;
76
+ }
77
+ //# sourceMappingURL=task-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-graph.js","sourceRoot":"","sources":["../src/task-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 工具层(1.4)—— agent 能动手,但只有该动的手。
3
+ * 工具 = 白名单内的具名可调用。调不在白名单里的工具直接 ToolDenied。
4
+ * 每次调用记一条工具账(名称/耗时/成败)。从 Python whitelist.py 忠实移植。
5
+ */
6
+ export declare class ToolDenied extends Error {
7
+ constructor(message: string);
8
+ }
9
+ export type ToolFn = (args: Record<string, unknown>) => unknown | Promise<unknown>;
10
+ export type ToolLog = (record: Record<string, unknown>) => void;
11
+ export declare class ToolRegistry {
12
+ private whitelist;
13
+ private impl;
14
+ private logFn?;
15
+ private now;
16
+ constructor(whitelist: Iterable<string>, opts?: {
17
+ logFn?: ToolLog;
18
+ now?: () => number;
19
+ });
20
+ register(name: string, fn: ToolFn): void;
21
+ names(): string[];
22
+ call(name: string, args?: Record<string, unknown>): unknown;
23
+ }
24
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AACnF,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAEhE,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,KAAK,CAAC,CAAU;IACxB,OAAO,CAAC,GAAG,CAAe;gBAEd,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KAAO;IAM3F,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAIxC,KAAK,IAAI,MAAM,EAAE;IAIjB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO;CAwBhE"}
package/dist/tools.js ADDED
@@ -0,0 +1,54 @@
1
+ /**
2
+ * 工具层(1.4)—— agent 能动手,但只有该动的手。
3
+ * 工具 = 白名单内的具名可调用。调不在白名单里的工具直接 ToolDenied。
4
+ * 每次调用记一条工具账(名称/耗时/成败)。从 Python whitelist.py 忠实移植。
5
+ */
6
+ export class ToolDenied extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "ToolDenied";
10
+ }
11
+ }
12
+ export class ToolRegistry {
13
+ whitelist;
14
+ impl = new Map();
15
+ logFn;
16
+ now;
17
+ constructor(whitelist, opts = {}) {
18
+ this.whitelist = new Set(whitelist);
19
+ this.logFn = opts.logFn;
20
+ this.now = opts.now ?? (() => Date.now() / 1000);
21
+ }
22
+ register(name, fn) {
23
+ this.impl.set(name, fn);
24
+ }
25
+ names() {
26
+ return [...this.impl.keys()].sort();
27
+ }
28
+ call(name, args = {}) {
29
+ if (!this.whitelist.has(name)) {
30
+ throw new ToolDenied(`工具 ${name} 不在白名单(${[...this.whitelist].sort().join(", ")})——扩权需改白名单并评审`);
31
+ }
32
+ const fn = this.impl.get(name);
33
+ if (!fn)
34
+ throw new Error(`工具 ${name} 未注册实现`);
35
+ const start = this.now();
36
+ const record = { tool: name, ts: start };
37
+ try {
38
+ const result = fn(args);
39
+ record.ok = true;
40
+ record.ms = Math.round((this.now() - start) * 1000);
41
+ return result;
42
+ }
43
+ catch (e) {
44
+ record.ok = false;
45
+ record.ms = Math.round((this.now() - start) * 1000);
46
+ record.error = `${e.name}: ${e.message}`;
47
+ throw e;
48
+ }
49
+ finally {
50
+ this.logFn?.(record);
51
+ }
52
+ }
53
+ }
54
+ //# sourceMappingURL=tools.js.map