@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.
Files changed (126) hide show
  1. package/dist/adapters/fs-workspace.d.ts +7 -0
  2. package/dist/adapters/fs-workspace.d.ts.map +1 -0
  3. package/dist/adapters/fs-workspace.js +91 -0
  4. package/dist/adapters/fs-workspace.js.map +1 -0
  5. package/dist/adapters/index.d.ts +46 -0
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/index.js +14 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/openai-provider.d.ts +17 -0
  10. package/dist/adapters/openai-provider.d.ts.map +1 -0
  11. package/dist/adapters/openai-provider.js +116 -0
  12. package/dist/adapters/openai-provider.js.map +1 -0
  13. package/dist/adapters/subprocess-sandbox.d.ts +7 -0
  14. package/dist/adapters/subprocess-sandbox.d.ts.map +1 -0
  15. package/dist/adapters/subprocess-sandbox.js +91 -0
  16. package/dist/adapters/subprocess-sandbox.js.map +1 -0
  17. package/dist/adapters/workspace-edit.d.ts +19 -0
  18. package/dist/adapters/workspace-edit.d.ts.map +1 -0
  19. package/dist/adapters/workspace-edit.js +36 -0
  20. package/dist/adapters/workspace-edit.js.map +1 -0
  21. package/dist/cli.d.ts +3 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +191 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/core/agent/loader.d.ts +17 -0
  26. package/dist/core/agent/loader.d.ts.map +1 -0
  27. package/dist/core/agent/loader.js +148 -0
  28. package/dist/core/agent/loader.js.map +1 -0
  29. package/dist/core/agent/plugin.d.ts +59 -0
  30. package/dist/core/agent/plugin.d.ts.map +1 -0
  31. package/dist/core/agent/plugin.js +125 -0
  32. package/dist/core/agent/plugin.js.map +1 -0
  33. package/dist/core/agent/registry.d.ts +45 -0
  34. package/dist/core/agent/registry.d.ts.map +1 -0
  35. package/dist/core/agent/registry.js +98 -0
  36. package/dist/core/agent/registry.js.map +1 -0
  37. package/dist/core/agent/resolver.d.ts +16 -0
  38. package/dist/core/agent/resolver.d.ts.map +1 -0
  39. package/dist/core/agent/resolver.js +2 -0
  40. package/dist/core/agent/resolver.js.map +1 -0
  41. package/dist/core/events/bus.d.ts +30 -0
  42. package/dist/core/events/bus.d.ts.map +1 -0
  43. package/dist/core/events/bus.js +112 -0
  44. package/dist/core/events/bus.js.map +1 -0
  45. package/dist/core/events/manifest.d.ts +117 -0
  46. package/dist/core/events/manifest.d.ts.map +1 -0
  47. package/dist/core/events/manifest.js +69 -0
  48. package/dist/core/events/manifest.js.map +1 -0
  49. package/dist/core/permission/engine.d.ts +84 -0
  50. package/dist/core/permission/engine.d.ts.map +1 -0
  51. package/dist/core/permission/engine.js +131 -0
  52. package/dist/core/permission/engine.js.map +1 -0
  53. package/dist/core/permission/ruleset.d.ts +30 -0
  54. package/dist/core/permission/ruleset.d.ts.map +1 -0
  55. package/dist/core/permission/ruleset.js +85 -0
  56. package/dist/core/permission/ruleset.js.map +1 -0
  57. package/dist/core/runtime/compaction.d.ts +59 -0
  58. package/dist/core/runtime/compaction.d.ts.map +1 -0
  59. package/dist/core/runtime/compaction.js +108 -0
  60. package/dist/core/runtime/compaction.js.map +1 -0
  61. package/dist/core/runtime/lease-recovery.d.ts +45 -0
  62. package/dist/core/runtime/lease-recovery.d.ts.map +1 -0
  63. package/dist/core/runtime/lease-recovery.js +112 -0
  64. package/dist/core/runtime/lease-recovery.js.map +1 -0
  65. package/dist/core/runtime/loop-guard.d.ts +51 -0
  66. package/dist/core/runtime/loop-guard.d.ts.map +1 -0
  67. package/dist/core/runtime/loop-guard.js +90 -0
  68. package/dist/core/runtime/loop-guard.js.map +1 -0
  69. package/dist/core/runtime/pi-bridge.d.ts +53 -0
  70. package/dist/core/runtime/pi-bridge.d.ts.map +1 -0
  71. package/dist/core/runtime/pi-bridge.js +259 -0
  72. package/dist/core/runtime/pi-bridge.js.map +1 -0
  73. package/dist/core/runtime/runner.d.ts +127 -0
  74. package/dist/core/runtime/runner.d.ts.map +1 -0
  75. package/dist/core/runtime/runner.js +614 -0
  76. package/dist/core/runtime/runner.js.map +1 -0
  77. package/dist/core/session/ids.d.ts +7 -0
  78. package/dist/core/session/ids.d.ts.map +1 -0
  79. package/dist/core/session/ids.js +18 -0
  80. package/dist/core/session/ids.js.map +1 -0
  81. package/dist/core/session/jsonl-store.d.ts +14 -0
  82. package/dist/core/session/jsonl-store.d.ts.map +1 -0
  83. package/dist/core/session/jsonl-store.js +142 -0
  84. package/dist/core/session/jsonl-store.js.map +1 -0
  85. package/dist/core/session/store.d.ts +25 -0
  86. package/dist/core/session/store.d.ts.map +1 -0
  87. package/dist/core/session/store.js +2 -0
  88. package/dist/core/session/store.js.map +1 -0
  89. package/dist/core/session/types.d.ts +142 -0
  90. package/dist/core/session/types.d.ts.map +1 -0
  91. package/dist/core/session/types.js +2 -0
  92. package/dist/core/session/types.js.map +1 -0
  93. package/dist/core/tools/adapter.d.ts +33 -0
  94. package/dist/core/tools/adapter.d.ts.map +1 -0
  95. package/dist/core/tools/adapter.js +87 -0
  96. package/dist/core/tools/adapter.js.map +1 -0
  97. package/dist/core/tools/builtins.d.ts +13 -0
  98. package/dist/core/tools/builtins.d.ts.map +1 -0
  99. package/dist/core/tools/builtins.js +219 -0
  100. package/dist/core/tools/builtins.js.map +1 -0
  101. package/dist/core/tools/context.d.ts +136 -0
  102. package/dist/core/tools/context.d.ts.map +1 -0
  103. package/dist/core/tools/context.js +2 -0
  104. package/dist/core/tools/context.js.map +1 -0
  105. package/dist/core/tools/def.d.ts +27 -0
  106. package/dist/core/tools/def.d.ts.map +1 -0
  107. package/dist/core/tools/def.js +2 -0
  108. package/dist/core/tools/def.js.map +1 -0
  109. package/dist/core/tools/qa-check.d.ts +30 -0
  110. package/dist/core/tools/qa-check.d.ts.map +1 -0
  111. package/dist/core/tools/qa-check.js +50 -0
  112. package/dist/core/tools/qa-check.js.map +1 -0
  113. package/dist/core/tools/task.d.ts +8 -0
  114. package/dist/core/tools/task.d.ts.map +1 -0
  115. package/dist/core/tools/task.js +33 -0
  116. package/dist/core/tools/task.js.map +1 -0
  117. package/dist/index.d.ts +38 -0
  118. package/dist/index.d.ts.map +1 -0
  119. package/dist/index.js +28 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/server/create-server.d.ts +51 -0
  122. package/dist/server/create-server.d.ts.map +1 -0
  123. package/dist/server/create-server.js +29 -0
  124. package/dist/server/create-server.js.map +1 -0
  125. package/openapi.yaml +239 -0
  126. package/package.json +32 -0
@@ -0,0 +1,51 @@
1
+ /** 循环防护(借鉴 Reasonix storm_breaker / repeat_failure_guard,见
2
+ * docs/borrowable-techniques.md §P0-2/§P0-3):
3
+ *
4
+ * - storm 断路器:同一工具连续以相同响应(签名 = 工具名 + 归一化错误,
5
+ * 不含 args——卡住的模型会"化妆"参数重试,按 args 匹配会漏)失败 3 次,
6
+ * 注入"改变策略"指令。不是终止,是 redirect。
7
+ * - blocked streak:连续 3 次权限拒绝同样注入指令(模型在硬闯不允许的操作)。
8
+ * - 重复失败守卫(edit 专用):按语义签名 (path, oldText) 记失败,连续
9
+ * 2 次同类失败后第 3 次重试先复查文件状态——内容已变则放行清记录,
10
+ * 未变则拦截(避免无意义空转)。
11
+ *
12
+ * 只处理「工具执行了但死循环」,不碰模型级 error/retry 路径
13
+ * (F6 isRetryableError),两者互不干扰。 */
14
+ /** 连续同签名失败达到该次数 → 注入改变策略指令。 */
15
+ export declare const STORM_THRESHOLD = 3;
16
+ /** 连续权限拒绝达到该次数 → 注入改变策略指令。 */
17
+ export declare const BLOCKED_STREAK_THRESHOLD = 3;
18
+ /** edit 同语义签名失败达到该次数后,下一次重试触发状态复查。 */
19
+ export declare const REPEAT_EDIT_FAILURE_THRESHOLD = 2;
20
+ /** 归一化错误文本:抹掉数字(行号/字节数/耗时会让同因错误签名漂移),
21
+ * 截断到 512 字符防签名爆炸。 */
22
+ export declare function normalizeError(text: string): string;
23
+ /** storm 签名:(工具名, 归一化错误)。不含 args(见文件头)。 */
24
+ export declare function stormSignature(toolName: string, errorText: string): string;
25
+ /** edit 重复失败的语义签名:(path, oldText)。 */
26
+ export declare function editFailureSignature(path: string, oldText: string): string;
27
+ export declare function strategyAdvisory(toolName: string, kind: "failure" | "blocked"): string;
28
+ export declare class LoopGuard {
29
+ private stormSignature;
30
+ private stormCount;
31
+ private blockedStreak;
32
+ private readonly editFailures;
33
+ /** afterToolCall 调用:登记一次工具执行结果。命中 storm 阈值时返回
34
+ * 注入文本(调用方覆写 result.content),否则返回 null。
35
+ * 任何一次成功执行都清零 storm 与 blocked 计数。 */
36
+ onToolResult(input: {
37
+ toolName: string;
38
+ isError: boolean;
39
+ errorText: string;
40
+ }): string | null;
41
+ /** beforeToolCall 权限拒绝时调用。连续 BLOCKED_STREAK_THRESHOLD 次返回
42
+ * 注入文本(拼进 block reason)。 */
43
+ onBlocked(toolName: string): string | null;
44
+ /** edit 失败后登记语义签名。 */
45
+ noteEditFailure(path: string, oldText: string): void;
46
+ /** edit 成功后清除对应签名(状态真的变了)。 */
47
+ clearEditFailure(path: string, oldText: string): void;
48
+ /** 该 (path, oldText) 是否已失败到需要状态复查的程度。 */
49
+ needsEditRecheck(path: string, oldText: string): boolean;
50
+ }
51
+ //# sourceMappingURL=loop-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-guard.d.ts","sourceRoot":"","sources":["../../../src/core/runtime/loop-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;oCAYoC;AAEpC,+BAA+B;AAC/B,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,8BAA8B;AAC9B,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,sCAAsC;AACtC,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C;uBACuB;AACvB,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,2CAA2C;AAC3C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,sCAAsC;AACtC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAMtF;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAE1D;;0CAEsC;IACtC,YAAY,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,IAAI;IAoB7F;iCAC6B;IAC7B,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAS1C,sBAAsB;IACtB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAKpD,8BAA8B;IAC9B,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrD,yCAAyC;IACzC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;CAGzD"}
@@ -0,0 +1,90 @@
1
+ /** 循环防护(借鉴 Reasonix storm_breaker / repeat_failure_guard,见
2
+ * docs/borrowable-techniques.md §P0-2/§P0-3):
3
+ *
4
+ * - storm 断路器:同一工具连续以相同响应(签名 = 工具名 + 归一化错误,
5
+ * 不含 args——卡住的模型会"化妆"参数重试,按 args 匹配会漏)失败 3 次,
6
+ * 注入"改变策略"指令。不是终止,是 redirect。
7
+ * - blocked streak:连续 3 次权限拒绝同样注入指令(模型在硬闯不允许的操作)。
8
+ * - 重复失败守卫(edit 专用):按语义签名 (path, oldText) 记失败,连续
9
+ * 2 次同类失败后第 3 次重试先复查文件状态——内容已变则放行清记录,
10
+ * 未变则拦截(避免无意义空转)。
11
+ *
12
+ * 只处理「工具执行了但死循环」,不碰模型级 error/retry 路径
13
+ * (F6 isRetryableError),两者互不干扰。 */
14
+ /** 连续同签名失败达到该次数 → 注入改变策略指令。 */
15
+ export const STORM_THRESHOLD = 3;
16
+ /** 连续权限拒绝达到该次数 → 注入改变策略指令。 */
17
+ export const BLOCKED_STREAK_THRESHOLD = 3;
18
+ /** edit 同语义签名失败达到该次数后,下一次重试触发状态复查。 */
19
+ export const REPEAT_EDIT_FAILURE_THRESHOLD = 2;
20
+ /** 归一化错误文本:抹掉数字(行号/字节数/耗时会让同因错误签名漂移),
21
+ * 截断到 512 字符防签名爆炸。 */
22
+ export function normalizeError(text) {
23
+ return text.replace(/\d+/g, "N").replace(/\s+/g, " ").trim().slice(0, 512);
24
+ }
25
+ /** storm 签名:(工具名, 归一化错误)。不含 args(见文件头)。 */
26
+ export function stormSignature(toolName, errorText) {
27
+ return `${toolName}\u0000${normalizeError(errorText)}`;
28
+ }
29
+ /** edit 重复失败的语义签名:(path, oldText)。 */
30
+ export function editFailureSignature(path, oldText) {
31
+ return `${path}\u0000${oldText}`;
32
+ }
33
+ export function strategyAdvisory(toolName, kind) {
34
+ const what = kind === "failure" ? "连续以相同的响应失败" : "连续被权限拒绝";
35
+ return (`[循环防护] ${toolName} 已经${what}多次。换措辞重发没有用:调用会继续命中同样的结果。` +
36
+ `如果参数被截断,就拆成几个更小的调用;否则修正参数、换工具、或在最终答案里说明阻塞原因。`);
37
+ }
38
+ export class LoopGuard {
39
+ stormSignature = null;
40
+ stormCount = 0;
41
+ blockedStreak = 0;
42
+ editFailures = new Map();
43
+ /** afterToolCall 调用:登记一次工具执行结果。命中 storm 阈值时返回
44
+ * 注入文本(调用方覆写 result.content),否则返回 null。
45
+ * 任何一次成功执行都清零 storm 与 blocked 计数。 */
46
+ onToolResult(input) {
47
+ this.blockedStreak = 0;
48
+ if (!input.isError) {
49
+ this.stormSignature = null;
50
+ this.stormCount = 0;
51
+ return null;
52
+ }
53
+ const signature = stormSignature(input.toolName, input.errorText);
54
+ if (signature === this.stormSignature)
55
+ this.stormCount += 1;
56
+ else {
57
+ this.stormSignature = signature;
58
+ this.stormCount = 1;
59
+ }
60
+ if (this.stormCount >= STORM_THRESHOLD) {
61
+ this.stormCount = 0; // 注入一次后重新计数,允许下一轮再触发
62
+ return strategyAdvisory(input.toolName, "failure");
63
+ }
64
+ return null;
65
+ }
66
+ /** beforeToolCall 权限拒绝时调用。连续 BLOCKED_STREAK_THRESHOLD 次返回
67
+ * 注入文本(拼进 block reason)。 */
68
+ onBlocked(toolName) {
69
+ this.blockedStreak += 1;
70
+ if (this.blockedStreak >= BLOCKED_STREAK_THRESHOLD) {
71
+ this.blockedStreak = 0;
72
+ return strategyAdvisory(toolName, "blocked");
73
+ }
74
+ return null;
75
+ }
76
+ /** edit 失败后登记语义签名。 */
77
+ noteEditFailure(path, oldText) {
78
+ const signature = editFailureSignature(path, oldText);
79
+ this.editFailures.set(signature, (this.editFailures.get(signature) ?? 0) + 1);
80
+ }
81
+ /** edit 成功后清除对应签名(状态真的变了)。 */
82
+ clearEditFailure(path, oldText) {
83
+ this.editFailures.delete(editFailureSignature(path, oldText));
84
+ }
85
+ /** 该 (path, oldText) 是否已失败到需要状态复查的程度。 */
86
+ needsEditRecheck(path, oldText) {
87
+ return (this.editFailures.get(editFailureSignature(path, oldText)) ?? 0) >= REPEAT_EDIT_FAILURE_THRESHOLD;
88
+ }
89
+ }
90
+ //# sourceMappingURL=loop-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-guard.js","sourceRoot":"","sources":["../../../src/core/runtime/loop-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { AgentMessage } from "@earendil-works/pi-agent-core";
2
+ import type { FrameworkEvent } from "../events/manifest.js";
3
+ import type { MessageInfo, ModelRef } from "../session/types.js";
4
+ /** Part-projector (spec §8.2): folds PI agent events into the persisted
5
+ * Message/Part graph and the framework events to publish. Pure and sync —
6
+ * the runner feeds PI events one by one and drains the output queue. */
7
+ export type BridgeIdentity = {
8
+ sessionId: string;
9
+ agent: string;
10
+ model: ModelRef;
11
+ };
12
+ type Emit = (event: FrameworkEvent) => void;
13
+ /** Serializes the emitted events through an async sink while preserving order:
14
+ * handler calls stay sync, persistence/publish fan-out happens in a chained
15
+ * promise so PI's awaited subscribers never observe reordering. */
16
+ export declare function serializeEmit(sink: (event: FrameworkEvent) => Promise<void>): {
17
+ emit: Emit;
18
+ settled: () => Promise<void>;
19
+ };
20
+ export declare class PartProjector {
21
+ private readonly identity;
22
+ private userMessageId;
23
+ private assistantMessageId;
24
+ private readonly parts;
25
+ private readonly textByContent;
26
+ private readonly reasoningByContent;
27
+ private readonly toolPartByCallId;
28
+ private stepOpen;
29
+ private stepCounter;
30
+ /** Tools belong to the assistant message that requested them. PI emits
31
+ * message_end(assistant) before that turn's tool executions, so the tool
32
+ * parts anchor here instead of the (already cleared) current message. */
33
+ private toolAnchorMessageId;
34
+ /** Exposed for the runner's permission hook (permission requests carry the
35
+ * originating message id). */
36
+ get currentAssistantMessageId(): string | null;
37
+ constructor(identity: BridgeIdentity);
38
+ private emitPart;
39
+ private patchPart;
40
+ private flushText;
41
+ private flushAllText;
42
+ private assistantPart;
43
+ onUserPrompt(emit: Emit, text: string): MessageInfo;
44
+ onAssistantStart(emit: Emit): void;
45
+ onTextDelta(emit: Emit, contentIndex: number, delta: string): void;
46
+ onThinkingDelta(emit: Emit, contentIndex: number, delta: string): void;
47
+ onToolExecutionStart(emit: Emit, toolCallId: string, toolName: string, args: unknown, label?: string): void;
48
+ onToolExecutionUpdate(emit: Emit, toolCallId: string, partial: unknown): void;
49
+ onToolExecutionEnd(emit: Emit, toolCallId: string, result: unknown, isError: boolean): void;
50
+ onAssistantEnd(emit: Emit, message: AgentMessage): void;
51
+ }
52
+ export {};
53
+ //# sourceMappingURL=pi-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-bridge.d.ts","sourceRoot":"","sources":["../../../src/core/runtime/pi-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAmB,MAAM,qBAAqB,CAAC;AAElF;;yEAEyE;AAEzE,MAAM,MAAM,cAAc,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEnF,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AAY5C;;oEAEoE;AACpE,wBAAgB,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAQ1H;AAED,qBAAa,aAAa;IAoBZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAnBrC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgC;IAC9D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAgC;IACnE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAK;IACxB;;8EAE0E;IAC1E,OAAO,CAAC,mBAAmB,CAAuB;IAElD;mCAC+B;IAC/B,IAAI,yBAAyB,IAAI,MAAM,GAAG,IAAI,CAE7C;gBAE4B,QAAQ,EAAE,cAAc;IAErD,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;IAarB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW;IA0BnD,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAqBlC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAWlE,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAWtE,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAe3G,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAU7E,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAuB3F,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;CA6BxD"}
@@ -0,0 +1,259 @@
1
+ import { newMessageId, newPartId } from "../session/ids.js";
2
+ /** Serializes the emitted events through an async sink while preserving order:
3
+ * handler calls stay sync, persistence/publish fan-out happens in a chained
4
+ * promise so PI's awaited subscribers never observe reordering. */
5
+ export function serializeEmit(sink) {
6
+ let chain = Promise.resolve();
7
+ return {
8
+ emit: (event) => {
9
+ chain = chain.then(() => sink(event));
10
+ },
11
+ settled: () => chain,
12
+ };
13
+ }
14
+ export class PartProjector {
15
+ identity;
16
+ userMessageId = null;
17
+ assistantMessageId = null;
18
+ parts = new Map();
19
+ textByContent = new Map(); // contentIndex → text part
20
+ reasoningByContent = new Map();
21
+ toolPartByCallId = new Map(); // toolCallId → partId
22
+ stepOpen = false;
23
+ stepCounter = 0;
24
+ /** Tools belong to the assistant message that requested them. PI emits
25
+ * message_end(assistant) before that turn's tool executions, so the tool
26
+ * parts anchor here instead of the (already cleared) current message. */
27
+ toolAnchorMessageId = null;
28
+ /** Exposed for the runner's permission hook (permission requests carry the
29
+ * originating message id). */
30
+ get currentAssistantMessageId() {
31
+ return this.assistantMessageId ?? this.toolAnchorMessageId;
32
+ }
33
+ constructor(identity) {
34
+ this.identity = identity;
35
+ }
36
+ emitPart(emit, part) {
37
+ this.parts.set(part.id, part);
38
+ emit({ type: "message.part.updated", data: { part } });
39
+ }
40
+ patchPart(emit, partId, patch) {
41
+ const current = this.parts.get(partId);
42
+ if (!current)
43
+ return;
44
+ this.emitPart(emit, patch(current));
45
+ }
46
+ flushText(emit, track, kind) {
47
+ if (!track || !track.buffer)
48
+ return;
49
+ const delta = track.buffer;
50
+ track.buffer = "";
51
+ emit({ type: "message.part.delta", data: { messageId: this.assistantMessageId ?? "", partId: track.partId, field: "text", delta } });
52
+ this.patchPart(emit, track.partId, (part) => (part.type === kind ? { ...part, text: part.text + delta } : part));
53
+ }
54
+ flushAllText(emit) {
55
+ for (const track of this.textByContent.values())
56
+ this.flushText(emit, track, "text");
57
+ for (const track of this.reasoningByContent.values())
58
+ this.flushText(emit, track, "reasoning");
59
+ }
60
+ assistantPart(emit, extra, messageIdOverride) {
61
+ const part = {
62
+ id: newPartId(),
63
+ sessionId: this.identity.sessionId,
64
+ messageId: messageIdOverride ?? this.assistantMessageId ?? "",
65
+ ...extra,
66
+ };
67
+ this.emitPart(emit, part);
68
+ return part;
69
+ }
70
+ // ---- PI event handlers (called by handleAgentEvent) ----
71
+ onUserPrompt(emit, text) {
72
+ const message = {
73
+ id: newMessageId(),
74
+ sessionId: this.identity.sessionId,
75
+ role: "user",
76
+ agent: this.identity.agent,
77
+ model: this.identity.model,
78
+ time: { created: new Date().toISOString() },
79
+ };
80
+ this.userMessageId = message.id;
81
+ emit({ type: "message.updated", data: { message } });
82
+ const normalizedText = text.trim();
83
+ if (normalizedText) {
84
+ const part = {
85
+ id: newPartId(),
86
+ sessionId: this.identity.sessionId,
87
+ messageId: message.id,
88
+ type: "text",
89
+ text: normalizedText,
90
+ };
91
+ this.parts.set(part.id, part);
92
+ emit({ type: "message.part.updated", data: { part } });
93
+ }
94
+ return message;
95
+ }
96
+ onAssistantStart(emit) {
97
+ const message = {
98
+ id: newMessageId(),
99
+ sessionId: this.identity.sessionId,
100
+ role: "assistant",
101
+ parentId: this.userMessageId ?? "",
102
+ agent: this.identity.agent,
103
+ model: this.identity.model,
104
+ time: { created: new Date().toISOString() },
105
+ };
106
+ this.assistantMessageId = message.id;
107
+ this.toolAnchorMessageId = message.id;
108
+ this.toolPartByCallId.clear(); // new assistant message = new tool batch
109
+ emit({ type: "message.updated", data: { message } });
110
+ if (!this.stepOpen) {
111
+ this.stepOpen = true;
112
+ this.stepCounter += 1;
113
+ this.assistantPart(emit, { type: "step-start" });
114
+ }
115
+ }
116
+ onTextDelta(emit, contentIndex, delta) {
117
+ const track = this.textByContent.get(contentIndex) ?? { partId: "", buffer: "" };
118
+ if (!track.partId) {
119
+ const part = this.assistantPart(emit, { type: "text", text: "" });
120
+ track.partId = part.id;
121
+ }
122
+ track.buffer += delta;
123
+ this.textByContent.set(contentIndex, track);
124
+ if (Buffer.byteLength(track.buffer, "utf8") >= 2 * 1024)
125
+ this.flushText(emit, track, "text");
126
+ }
127
+ onThinkingDelta(emit, contentIndex, delta) {
128
+ const track = this.reasoningByContent.get(contentIndex) ?? { partId: "", buffer: "" };
129
+ if (!track.partId) {
130
+ const part = this.assistantPart(emit, { type: "reasoning", text: "" });
131
+ track.partId = part.id;
132
+ }
133
+ track.buffer += delta;
134
+ this.reasoningByContent.set(contentIndex, track);
135
+ if (Buffer.byteLength(track.buffer, "utf8") >= 2 * 1024)
136
+ this.flushText(emit, track, "reasoning");
137
+ }
138
+ onToolExecutionStart(emit, toolCallId, toolName, args, label) {
139
+ this.flushAllText(emit);
140
+ const part = this.assistantPart(emit, {
141
+ type: "tool",
142
+ callId: toolCallId,
143
+ tool: toolName,
144
+ state: { status: "running", input: args, ...(label ? { title: label } : {}), time: { start: new Date().toISOString() } },
145
+ }, this.toolAnchorMessageId ?? undefined);
146
+ this.toolPartByCallId.set(toolCallId, part.id);
147
+ }
148
+ onToolExecutionUpdate(emit, toolCallId, partial) {
149
+ const partId = this.toolPartByCallId.get(toolCallId);
150
+ if (!partId)
151
+ return;
152
+ const title = extractTitle(partial);
153
+ if (!title)
154
+ return;
155
+ this.patchPart(emit, partId, (part) => part.type === "tool" && part.state.status === "running" ? { ...part, state: { ...part.state, title } } : part);
156
+ }
157
+ onToolExecutionEnd(emit, toolCallId, result, isError) {
158
+ const partId = this.toolPartByCallId.get(toolCallId);
159
+ if (!partId)
160
+ return;
161
+ const { output, title, metadata } = extractResult(result);
162
+ this.patchPart(emit, partId, (part) => {
163
+ if (part.type !== "tool" || part.state.status !== "running")
164
+ return part;
165
+ const unknown = metadata?.outcome === "unknown";
166
+ const state = unknown
167
+ ? { status: "error", input: part.state.input, error: output, metadata: { ...(metadata ?? {}), outcome: "unknown" }, time: { start: part.state.time.start, end: new Date().toISOString() } }
168
+ : isError
169
+ ? { status: "error", input: part.state.input, error: output, ...(metadata ? { metadata } : {}), time: { start: part.state.time.start, end: new Date().toISOString() } }
170
+ : {
171
+ status: "completed",
172
+ input: part.state.input,
173
+ output,
174
+ title: title ?? part.state.title ?? "完成",
175
+ ...(metadata ? { metadata } : {}),
176
+ time: { start: part.state.time.start, end: new Date().toISOString() },
177
+ };
178
+ return { ...part, state };
179
+ });
180
+ }
181
+ onAssistantEnd(emit, message) {
182
+ this.flushAllText(emit);
183
+ if (!this.assistantMessageId)
184
+ return;
185
+ if (this.stepOpen) {
186
+ this.stepOpen = false;
187
+ const usage = extractUsage(message);
188
+ this.assistantPart(emit, { type: "step-finish", ...(usage ? { tokens: usage } : {}) });
189
+ }
190
+ const usage = extractUsage(message);
191
+ const error = extractError(message);
192
+ const info = {
193
+ id: this.assistantMessageId,
194
+ sessionId: this.identity.sessionId,
195
+ role: "assistant",
196
+ parentId: this.userMessageId ?? "",
197
+ agent: this.identity.agent,
198
+ model: this.identity.model,
199
+ ...(usage ? { tokens: usage } : {}),
200
+ ...(error ? { error } : {}),
201
+ time: { created: this.parts.size ? new Date().toISOString() : new Date().toISOString(), completed: new Date().toISOString() },
202
+ };
203
+ emit({ type: "message.updated", data: { message: info } });
204
+ this.assistantMessageId = null;
205
+ this.textByContent.clear();
206
+ this.reasoningByContent.clear();
207
+ // toolAnchorMessageId and toolPartByCallId survive message_end: this
208
+ // turn's tool executions arrive after it and must resolve their parts.
209
+ // They reset when the next assistant message starts (onAssistantStart).
210
+ }
211
+ }
212
+ function extractTitle(partial) {
213
+ if (typeof partial !== "object" || partial === null)
214
+ return null;
215
+ const details = partial.details;
216
+ if (typeof details === "object" && details !== null && typeof details.title === "string") {
217
+ return details.title;
218
+ }
219
+ return null;
220
+ }
221
+ function extractResult(result) {
222
+ if (typeof result !== "object" || result === null)
223
+ return { output: String(result), title: null, metadata: null };
224
+ const record = result;
225
+ let output = "";
226
+ if (Array.isArray(record.content)) {
227
+ output = record.content
228
+ .map((block) => (typeof block === "object" && block !== null && block.type === "text" ? String(block.text ?? "") : ""))
229
+ .filter(Boolean)
230
+ .join("\n");
231
+ }
232
+ const details = typeof record.details === "object" && record.details !== null ? record.details : null;
233
+ const title = details && typeof details.title === "string" ? details.title : null;
234
+ const metadata = details ? Object.fromEntries(Object.entries(details).filter(([key]) => key !== "title")) : null;
235
+ return { output: output || "(无输出)", title, metadata: metadata && Object.keys(metadata).length ? metadata : null };
236
+ }
237
+ function extractUsage(message) {
238
+ if (message.role !== "assistant")
239
+ return null;
240
+ const usage = message.usage;
241
+ if (!usage)
242
+ return null;
243
+ return {
244
+ input: usage.input ?? 0,
245
+ output: usage.output ?? 0,
246
+ ...(usage.cacheRead ? { cacheRead: usage.cacheRead } : {}),
247
+ ...(usage.cacheWrite ? { cacheWrite: usage.cacheWrite } : {}),
248
+ };
249
+ }
250
+ function extractError(message) {
251
+ if (message.role !== "assistant")
252
+ return null;
253
+ const record = message;
254
+ if (record.stopReason === "error" || record.stopReason === "aborted") {
255
+ return { name: record.stopReason === "aborted" ? "AbortedError" : "APIError", message: record.errorMessage ?? "模型调用失败" };
256
+ }
257
+ return null;
258
+ }
259
+ //# sourceMappingURL=pi-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-bridge.js","sourceRoot":"","sources":["../../../src/core/runtime/pi-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ import { Agent } from "@earendil-works/pi-agent-core";
2
+ import type { Api, Model } from "@earendil-works/pi-ai";
3
+ import { AgentRegistry, type AgentInfo } from "../agent/registry.js";
4
+ import type { AgentResolver } from "../agent/resolver.js";
5
+ import { type EventLog } from "../events/bus.js";
6
+ import { PermissionEngine, type Reply } from "../permission/engine.js";
7
+ import type { Ruleset } from "../permission/ruleset.js";
8
+ import type { SessionStore } from "../session/store.js";
9
+ import type { ModelRef, SessionInfo } from "../session/types.js";
10
+ import type { ToolContext, WorkspaceFiles } from "../tools/context.js";
11
+ import type { ToolDef } from "../tools/def.js";
12
+ import type { SandboxExecutor } from "../../adapters/index.js";
13
+ /** SessionRunner (spec §8.1): owns one session's full lifecycle — prompt →
14
+ * PI agent loop → persisted parts + framework events → terminal settlement
15
+ * → queued prompt continuation. Permission checks happen only in
16
+ * beforeToolCall (spec §5.4).
17
+ *
18
+ * M5: fully storage/backend-agnostic. All product surfaces (model, sandbox,
19
+ * workspace files, event log, lease) are injected. */
20
+ export type RunnerDeps = {
21
+ store: SessionStore;
22
+ registry: AgentRegistry;
23
+ /** Built per run so multi-tenant deployments bind the right billing
24
+ * identity (relay stream is keyed by userId). */
25
+ streamFnFor: (session: SessionInfo) => ConstructorParameters<typeof Agent>[0]["streamFn"];
26
+ modelFor: (ref: ModelRef) => Model<Api>;
27
+ /** Durable event log (framework events). Product supplies Mongo; package
28
+ * ships in-memory/JSONL. */
29
+ eventLog: EventLog;
30
+ /** Workspace file backend. Product supplies Mongo; package ships FS/JSONL. */
31
+ workspaceFor: (session: SessionInfo) => WorkspaceFiles;
32
+ /** Isolated command execution. Product supplies OpenSandbox; package ships a
33
+ * subprocess reference implementation. */
34
+ sandbox?: SandboxExecutor;
35
+ /** Lease store (runner stamps while owning a run). */
36
+ leaseStore?: {
37
+ stamp(sessionId: string, owner: string, expiresAt: Date): Promise<void>;
38
+ clear(sessionId: string): Promise<void>;
39
+ };
40
+ /** Product approval sessions may persist an "always" rule with a bounded
41
+ * lifetime. The in-memory rule remains valid for the current run. */
42
+ sessionRuleTtlMs?: number;
43
+ tools?: ToolDef[];
44
+ buildToolContext?: (input: {
45
+ session: SessionInfo;
46
+ engine: PermissionEngine;
47
+ }) => ToolContext;
48
+ /** Loads workspace custom agents (spec §6.3). */
49
+ loadWorkspaceAgents?: (session: SessionInfo) => Promise<AgentInfo[]>;
50
+ /** Optional control-plane lookup for an immutable Agent Version. */
51
+ agentResolver?: AgentResolver;
52
+ /** Max subagent nesting depth (spec §6.4, default 1). */
53
+ subagentDepth: number;
54
+ /** Auto-compaction (spec §8.3). Disabled when summaryModel is null. */
55
+ compaction?: {
56
+ enabled: boolean;
57
+ contextWindow: number;
58
+ summaryModel: Model<Api> | null;
59
+ };
60
+ };
61
+ /** 上游中断类错误(F6):模型流偶发终止/连接断开时自动重试一次,避免
62
+ * 偶发中断直接结束任务(实测 relay 透传 "terminated"、上游断流
63
+ * "upstream_http2_stream_error" 等)。余额/鉴权等确定性错误不重试。 */
64
+ export declare function isRetryableError(message: string): boolean;
65
+ export declare class SessionRunner {
66
+ private readonly deps;
67
+ constructor(deps: RunnerDeps);
68
+ /** fallbackSessionId 由 runLoop 闭包传入(而非实例字段):runner 是进程级
69
+ * 单例,两个会话并发时实例字段会互相覆盖,导致 message.part.delta 等
70
+ * 无自带 sessionId 的事件落到错误的会话事件流里(串台)。 */
71
+ private persist;
72
+ private publish;
73
+ private stampLease;
74
+ private clearLease;
75
+ prompt(sessionId: string, input: {
76
+ text: string;
77
+ agent?: string;
78
+ model?: ModelRef;
79
+ }): Promise<{
80
+ queued: boolean;
81
+ }>;
82
+ replyPermission(sessionId: string, requestId: string, reply: Reply, feedback?: string): Promise<boolean>;
83
+ /** Revokes matching session-scoped rules immediately for a live run and
84
+ * removes their persisted continuation access. */
85
+ revokePermission(sessionId: string, permission: string, patterns: string[]): Promise<boolean>;
86
+ abort(sessionId: string): Promise<void>;
87
+ /** Builds the compaction transformContext (spec §8.3) when the runner has a
88
+ * summary model configured. Emits a `compaction` part on the latest
89
+ * assistant message so the boundary shows in the transcript. */
90
+ private buildCompaction;
91
+ /** Layers the session's workspace custom agents (`.zmzai/agents/*.md`) on top
92
+ * of the shared registry without mutating it (spec §6.3). Load failures
93
+ * degrade to the base registry — a malformed md never blocks a run. */
94
+ private registryFor;
95
+ /** Versioned agents are resolved from the product control plane. A missing
96
+ * version intentionally falls back to the M1-M5 registry so old sessions
97
+ * and standalone consumers remain valid. */
98
+ private resolvedAgentFor;
99
+ private runLoop;
100
+ /** Spawns a subagent child session (spec §6.4): depth-capped, permission
101
+ * stamped from parent session + subagent preset, runs a nested PI loop to
102
+ * completion, and returns the child's final assistant text as the parent
103
+ * tool's result. Awaits the nested runLoop directly. */
104
+ private spawnSubagent;
105
+ /** Persists a subtask part on the parent's latest assistant message so the
106
+ * transcript links to the child session (spec §6.4 step 5). */
107
+ private recordSubtask;
108
+ private lastAssistantText;
109
+ private sessionDepth;
110
+ private rebuildMessages;
111
+ }
112
+ export declare function createFrameworkSession(input: {
113
+ store: SessionStore;
114
+ id?: string;
115
+ userId: string;
116
+ workspaceId: string;
117
+ agent?: string;
118
+ agentId?: string;
119
+ agentVersionId?: string;
120
+ model: ModelRef;
121
+ prompt?: string;
122
+ parentId?: string;
123
+ title?: string;
124
+ permission?: Ruleset;
125
+ }): Promise<SessionInfo>;
126
+ export declare function isSessionActive(sessionId: string): boolean;
127
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/core/runtime/runner.ts"],"names":[],"mappings":"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"}