@zqagent/core 0.2.20 → 0.3.6

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 (238) hide show
  1. package/README.md +1 -1
  2. package/README.oss.en.md +3 -3
  3. package/README.oss.md +8 -3
  4. package/README.oss.zh-TW.md +3 -3
  5. package/dist/McpClient-CEQBUPuC.d.cts +145 -0
  6. package/dist/McpClient-CEQBUPuC.d.ts +145 -0
  7. package/dist/{ToolRegistry-C3pTFiaJ.d.cts → ToolRegistry-Cy0fQxrb.d.ts} +2 -111
  8. package/dist/{ToolRegistry-C3pTFiaJ.d.ts → ToolRegistry-DouDvn9E.d.cts} +2 -111
  9. package/dist/{explore-RtZtb-V6.d.ts → TurnEngine-BPKhWuSI.d.cts} +108 -73
  10. package/dist/{explore-BgRhj6SP.d.cts → TurnEngine-DtGEuVLT.d.ts} +108 -73
  11. package/dist/conflictGuard-BBOOIxxK.d.cts +42 -0
  12. package/dist/conflictGuard-BBOOIxxK.d.ts +42 -0
  13. package/dist/index.cjs +5418 -1096
  14. package/dist/index.cjs.map +1 -1
  15. package/dist/index.d.cts +577 -195
  16. package/dist/index.d.ts +577 -195
  17. package/dist/index.js +5299 -1011
  18. package/dist/index.js.map +1 -1
  19. package/dist/internal/crypto/secrets.cjs +25 -0
  20. package/dist/internal/crypto/secrets.cjs.map +1 -0
  21. package/dist/internal/crypto/secrets.d.cts +2 -0
  22. package/dist/internal/crypto/secrets.d.ts +2 -0
  23. package/dist/internal/crypto/secrets.js +3 -0
  24. package/dist/internal/crypto/secrets.js.map +1 -0
  25. package/dist/internal/engine/FileLogHook.cjs +179 -0
  26. package/dist/internal/engine/FileLogHook.cjs.map +1 -0
  27. package/dist/internal/engine/FileLogHook.d.cts +67 -0
  28. package/dist/internal/engine/FileLogHook.d.ts +67 -0
  29. package/dist/internal/engine/FileLogHook.js +144 -0
  30. package/dist/internal/engine/FileLogHook.js.map +1 -0
  31. package/dist/internal/engine/approvalView.cjs +25 -0
  32. package/dist/internal/engine/approvalView.cjs.map +1 -0
  33. package/dist/internal/engine/approvalView.d.cts +1 -0
  34. package/dist/internal/engine/approvalView.d.ts +1 -0
  35. package/dist/internal/engine/approvalView.js +3 -0
  36. package/dist/internal/engine/approvalView.js.map +1 -0
  37. package/dist/internal/engine/limits.cjs +59 -0
  38. package/dist/internal/engine/limits.cjs.map +1 -0
  39. package/dist/internal/engine/limits.d.cts +32 -0
  40. package/dist/internal/engine/limits.d.ts +32 -0
  41. package/dist/internal/engine/limits.js +31 -0
  42. package/dist/internal/engine/limits.js.map +1 -0
  43. package/dist/internal/engine/sessionNaming.cjs +47 -0
  44. package/dist/internal/engine/sessionNaming.cjs.map +1 -0
  45. package/dist/internal/engine/sessionNaming.d.cts +25 -0
  46. package/dist/internal/engine/sessionNaming.d.ts +25 -0
  47. package/dist/internal/engine/sessionNaming.js +20 -0
  48. package/dist/internal/engine/sessionNaming.js.map +1 -0
  49. package/dist/internal/llmConfig.cjs +561 -0
  50. package/dist/internal/llmConfig.cjs.map +1 -0
  51. package/dist/internal/llmConfig.d.cts +75 -0
  52. package/dist/internal/llmConfig.d.ts +75 -0
  53. package/dist/internal/llmConfig.js +535 -0
  54. package/dist/internal/llmConfig.js.map +1 -0
  55. package/dist/internal/mcp/builtin/index.cjs +685 -0
  56. package/dist/internal/mcp/builtin/index.cjs.map +1 -0
  57. package/dist/internal/mcp/builtin/index.d.cts +21 -0
  58. package/dist/internal/mcp/builtin/index.d.ts +21 -0
  59. package/dist/internal/mcp/builtin/index.js +652 -0
  60. package/dist/internal/mcp/builtin/index.js.map +1 -0
  61. package/dist/internal/mcp/config.cjs +278 -0
  62. package/dist/internal/mcp/config.cjs.map +1 -0
  63. package/dist/internal/mcp/config.d.cts +61 -0
  64. package/dist/internal/mcp/config.d.ts +61 -0
  65. package/dist/internal/mcp/config.js +235 -0
  66. package/dist/internal/mcp/config.js.map +1 -0
  67. package/dist/internal/mcp/presets.cjs +184 -0
  68. package/dist/internal/mcp/presets.cjs.map +1 -0
  69. package/dist/internal/mcp/presets.d.cts +39 -0
  70. package/dist/internal/mcp/presets.d.ts +39 -0
  71. package/dist/internal/mcp/presets.js +158 -0
  72. package/dist/internal/mcp/presets.js.map +1 -0
  73. package/dist/internal/node-name.cjs +45 -0
  74. package/dist/internal/node-name.cjs.map +1 -0
  75. package/dist/internal/node-name.d.cts +3 -0
  76. package/dist/internal/node-name.d.ts +3 -0
  77. package/dist/internal/node-name.js +10 -0
  78. package/dist/internal/node-name.js.map +1 -0
  79. package/dist/internal/paths.cjs +63 -0
  80. package/dist/internal/paths.cjs.map +1 -0
  81. package/dist/internal/paths.d.cts +17 -0
  82. package/dist/internal/paths.d.ts +17 -0
  83. package/dist/internal/paths.js +25 -0
  84. package/dist/internal/paths.js.map +1 -0
  85. package/dist/internal/providers/diagnostics.cjs +288 -0
  86. package/dist/internal/providers/diagnostics.cjs.map +1 -0
  87. package/dist/internal/providers/diagnostics.d.cts +103 -0
  88. package/dist/internal/providers/diagnostics.d.ts +103 -0
  89. package/dist/internal/providers/diagnostics.js +250 -0
  90. package/dist/internal/providers/diagnostics.js.map +1 -0
  91. package/dist/internal/providers/models.cjs +699 -0
  92. package/dist/internal/providers/models.cjs.map +1 -0
  93. package/dist/internal/providers/models.d.cts +136 -0
  94. package/dist/internal/providers/models.d.ts +136 -0
  95. package/dist/internal/providers/models.js +654 -0
  96. package/dist/internal/providers/models.js.map +1 -0
  97. package/dist/internal/terminal.cjs +161 -0
  98. package/dist/internal/terminal.cjs.map +1 -0
  99. package/dist/internal/terminal.d.cts +58 -0
  100. package/dist/internal/terminal.d.ts +58 -0
  101. package/dist/internal/terminal.js +128 -0
  102. package/dist/internal/terminal.js.map +1 -0
  103. package/dist/internal/tools/execAsync.cjs +187 -0
  104. package/dist/internal/tools/execAsync.cjs.map +1 -0
  105. package/dist/internal/tools/execAsync.d.cts +30 -0
  106. package/dist/internal/tools/execAsync.d.ts +30 -0
  107. package/dist/internal/tools/execAsync.js +162 -0
  108. package/dist/internal/tools/execAsync.js.map +1 -0
  109. package/dist/internal/tools/git.cjs +935 -0
  110. package/dist/internal/tools/git.cjs.map +1 -0
  111. package/dist/internal/tools/git.d.cts +206 -0
  112. package/dist/internal/tools/git.d.ts +206 -0
  113. package/dist/internal/tools/git.js +883 -0
  114. package/dist/internal/tools/git.js.map +1 -0
  115. package/dist/internal/tools/pathSafety.cjs +99 -0
  116. package/dist/internal/tools/pathSafety.cjs.map +1 -0
  117. package/dist/internal/tools/pathSafety.d.cts +44 -0
  118. package/dist/internal/tools/pathSafety.d.ts +44 -0
  119. package/dist/internal/tools/pathSafety.js +61 -0
  120. package/dist/internal/tools/pathSafety.js.map +1 -0
  121. package/dist/internal/tools/plan.cjs +146 -0
  122. package/dist/internal/tools/plan.cjs.map +1 -0
  123. package/dist/internal/tools/plan.d.cts +48 -0
  124. package/dist/internal/tools/plan.d.ts +48 -0
  125. package/dist/internal/tools/plan.js +117 -0
  126. package/dist/internal/tools/plan.js.map +1 -0
  127. package/dist/internal/tools/ripgrep.cjs +118 -0
  128. package/dist/internal/tools/ripgrep.cjs.map +1 -0
  129. package/dist/internal/tools/ripgrep.d.cts +6 -0
  130. package/dist/internal/tools/ripgrep.d.ts +6 -0
  131. package/dist/internal/tools/ripgrep.js +89 -0
  132. package/dist/internal/tools/ripgrep.js.map +1 -0
  133. package/dist/internal/tools/sandbox.cjs +253 -0
  134. package/dist/internal/tools/sandbox.cjs.map +1 -0
  135. package/dist/internal/tools/sandbox.d.cts +67 -0
  136. package/dist/internal/tools/sandbox.d.ts +67 -0
  137. package/dist/internal/tools/sandbox.js +213 -0
  138. package/dist/internal/tools/sandbox.js.map +1 -0
  139. package/dist/internal/tools/shell.cjs +771 -0
  140. package/dist/internal/tools/shell.cjs.map +1 -0
  141. package/dist/internal/tools/shell.d.cts +47 -0
  142. package/dist/internal/tools/shell.d.ts +47 -0
  143. package/dist/internal/tools/shell.js +731 -0
  144. package/dist/internal/tools/shell.js.map +1 -0
  145. package/dist/internal/tools/shellRuntime.cjs +220 -0
  146. package/dist/internal/tools/shellRuntime.cjs.map +1 -0
  147. package/dist/internal/tools/shellRuntime.d.cts +67 -0
  148. package/dist/internal/tools/shellRuntime.d.ts +67 -0
  149. package/dist/internal/tools/shellRuntime.js +181 -0
  150. package/dist/internal/tools/shellRuntime.js.map +1 -0
  151. package/dist/internal/update/controller.cjs +1035 -0
  152. package/dist/internal/update/controller.cjs.map +1 -0
  153. package/dist/internal/update/controller.d.cts +150 -0
  154. package/dist/internal/update/controller.d.ts +150 -0
  155. package/dist/internal/update/controller.js +991 -0
  156. package/dist/internal/update/controller.js.map +1 -0
  157. package/dist/internal/update/platform.cjs +234 -0
  158. package/dist/internal/update/platform.cjs.map +1 -0
  159. package/dist/internal/update/platform.d.cts +77 -0
  160. package/dist/internal/update/platform.d.ts +77 -0
  161. package/dist/internal/update/platform.js +184 -0
  162. package/dist/internal/update/platform.js.map +1 -0
  163. package/dist/tools/ask.d.cts +3 -1
  164. package/dist/tools/ask.d.ts +3 -1
  165. package/dist/tools/diff.cjs +17 -6
  166. package/dist/tools/diff.cjs.map +1 -1
  167. package/dist/tools/diff.d.cts +5 -2
  168. package/dist/tools/diff.d.ts +5 -2
  169. package/dist/tools/diff.js +17 -6
  170. package/dist/tools/diff.js.map +1 -1
  171. package/dist/tools/directories.d.cts +3 -1
  172. package/dist/tools/directories.d.ts +3 -1
  173. package/dist/tools/explore.cjs +1778 -204
  174. package/dist/tools/explore.cjs.map +1 -1
  175. package/dist/tools/explore.d.cts +82 -2
  176. package/dist/tools/explore.d.ts +82 -2
  177. package/dist/tools/explore.js +1780 -204
  178. package/dist/tools/explore.js.map +1 -1
  179. package/dist/tools/files.cjs +56 -21
  180. package/dist/tools/files.cjs.map +1 -1
  181. package/dist/tools/files.d.cts +6 -3
  182. package/dist/tools/files.d.ts +6 -3
  183. package/dist/tools/files.js +56 -21
  184. package/dist/tools/files.js.map +1 -1
  185. package/dist/tools/git.cjs +34 -25
  186. package/dist/tools/git.cjs.map +1 -1
  187. package/dist/tools/git.d.cts +4 -204
  188. package/dist/tools/git.d.ts +4 -204
  189. package/dist/tools/git.js +34 -25
  190. package/dist/tools/git.js.map +1 -1
  191. package/dist/tools/media.cjs +280 -3
  192. package/dist/tools/media.cjs.map +1 -1
  193. package/dist/tools/media.d.cts +3 -1
  194. package/dist/tools/media.d.ts +3 -1
  195. package/dist/tools/media.js +278 -1
  196. package/dist/tools/media.js.map +1 -1
  197. package/dist/tools/plan.cjs +62 -0
  198. package/dist/tools/plan.cjs.map +1 -1
  199. package/dist/tools/plan.d.cts +4 -17
  200. package/dist/tools/plan.d.ts +4 -17
  201. package/dist/tools/plan.js +59 -0
  202. package/dist/tools/plan.js.map +1 -1
  203. package/dist/tools/search.cjs +3 -0
  204. package/dist/tools/search.cjs.map +1 -1
  205. package/dist/tools/search.d.cts +3 -1
  206. package/dist/tools/search.d.ts +3 -1
  207. package/dist/tools/search.js +3 -0
  208. package/dist/tools/search.js.map +1 -1
  209. package/dist/tools/shell.cjs +76 -11
  210. package/dist/tools/shell.cjs.map +1 -1
  211. package/dist/tools/shell.d.cts +5 -39
  212. package/dist/tools/shell.d.ts +5 -39
  213. package/dist/tools/shell.js +75 -11
  214. package/dist/tools/shell.js.map +1 -1
  215. package/dist/tools/todo.d.cts +3 -1
  216. package/dist/tools/todo.d.ts +3 -1
  217. package/dist/tools/web.cjs +279 -5
  218. package/dist/tools/web.cjs.map +1 -1
  219. package/dist/tools/web.d.cts +3 -1
  220. package/dist/tools/web.d.ts +3 -1
  221. package/dist/tools/web.js +275 -3
  222. package/dist/tools/web.js.map +1 -1
  223. package/dist/types-BYyXWWPW.d.cts +237 -0
  224. package/dist/types-BYyXWWPW.d.ts +237 -0
  225. package/package.json +26 -37
  226. package/bin/zqagent +0 -2
  227. package/dist/cli/index.cjs +0 -25218
  228. package/dist/cli/index.cjs.map +0 -1
  229. package/dist/cli/index.d.cts +0 -2
  230. package/dist/cli/index.d.ts +0 -2
  231. package/dist/cli/index.js +0 -25201
  232. package/dist/cli/index.js.map +0 -1
  233. package/dist/server/index.cjs +0 -20510
  234. package/dist/server/index.cjs.map +0 -1
  235. package/dist/server/index.d.cts +0 -2
  236. package/dist/server/index.d.ts +0 -2
  237. package/dist/server/index.js +0 -20493
  238. package/dist/server/index.js.map +0 -1
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
+
17
+ // src/crypto/secrets.ts
18
+ var secrets_exports = {};
19
+ module.exports = __toCommonJS(secrets_exports);
20
+ __reExport(secrets_exports, require("@zqagent/shared/secrets"), module.exports);
21
+ // Annotate the CommonJS export names for ESM import in node:
22
+ 0 && (module.exports = {
23
+ ...require("@zqagent/shared/secrets")
24
+ });
25
+ //# sourceMappingURL=secrets.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/crypto/secrets.ts"],"sourcesContent":["// 已迁移至 @zqagent/shared(core 与 hub 共用);此文件保留为兼容再导出。\nexport * from \"@zqagent/shared/secrets\";\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AACA,4BAAc,oCADd;","names":[]}
@@ -0,0 +1,2 @@
1
+ export * from '@zqagent/shared/secrets';
2
+ import '@zqagent/shared/approval-view';
@@ -0,0 +1,2 @@
1
+ export * from '@zqagent/shared/secrets';
2
+ import '@zqagent/shared/approval-view';
@@ -0,0 +1,3 @@
1
+ // src/crypto/secrets.ts
2
+ export * from "@zqagent/shared/secrets";
3
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/crypto/secrets.ts"],"sourcesContent":["// 已迁移至 @zqagent/shared(core 与 hub 共用);此文件保留为兼容再导出。\nexport * from \"@zqagent/shared/secrets\";\n"],"mappings":";AACA,cAAc;","names":[]}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/engine/FileLogHook.ts
31
+ var FileLogHook_exports = {};
32
+ __export(FileLogHook_exports, {
33
+ FileLogHook: () => FileLogHook
34
+ });
35
+ module.exports = __toCommonJS(FileLogHook_exports);
36
+ var fs = __toESM(require("fs"), 1);
37
+ var path = __toESM(require("path"), 1);
38
+ var FileLogHook = class {
39
+ constructor(sessionId, stateDir) {
40
+ this.sessionId = sessionId;
41
+ fs.mkdirSync(stateDir, { recursive: true });
42
+ this._logPath = path.join(stateDir, `${sessionId}.jsonl`);
43
+ this._statePath = path.join(stateDir, `${sessionId}_state.json`);
44
+ }
45
+ sessionId;
46
+ _logPath;
47
+ _statePath;
48
+ onTurnStart(input) {
49
+ this._append({ type: "turn_start", input });
50
+ }
51
+ onTurnEnd(status, iterations, producedFiles) {
52
+ this._append({
53
+ type: "turn_end",
54
+ status,
55
+ iterations,
56
+ produced_files: producedFiles
57
+ });
58
+ }
59
+ onAssistantDelta(_text) {
60
+ }
61
+ onReasoningDelta(_text) {
62
+ }
63
+ onAssistantMessage(text, toolCalls, usage) {
64
+ this._append({
65
+ type: "assistant_message",
66
+ text,
67
+ tool_calls: toolCalls,
68
+ usage
69
+ });
70
+ }
71
+ onToolProposed(name, args) {
72
+ this._append({ type: "tool_proposed", name, args });
73
+ }
74
+ onToolStarted(name) {
75
+ this._append({ type: "tool_started", name });
76
+ }
77
+ onToolFinished(name, status, resultPreview) {
78
+ this._append({
79
+ type: "tool_finished",
80
+ name,
81
+ status,
82
+ result_preview: resultPreview
83
+ });
84
+ }
85
+ onPermissionRequired(name, reason) {
86
+ this._append({ type: "permission_required", name, reason });
87
+ }
88
+ onIterationEnd(iteration) {
89
+ this._append({ type: "iteration_end", iteration });
90
+ }
91
+ onCompacting(info) {
92
+ this._append({ type: "compacting", ...info ?? {} });
93
+ }
94
+ onCompacted(text, info) {
95
+ this._append({ type: "compacted", text, ...info ?? {} });
96
+ }
97
+ onError(error, errorType) {
98
+ this._append({ type: "error", error, error_type: errorType });
99
+ }
100
+ onRetry(attempt, max, reason) {
101
+ this._append({ type: "llm_retry", attempt, max, reason });
102
+ }
103
+ onInterrupted(iterations) {
104
+ this._append({ type: "interrupted", iterations });
105
+ }
106
+ onPaused(iteration, at) {
107
+ this._append({ type: "turn_paused", iteration, at });
108
+ }
109
+ onResumed(iteration) {
110
+ this._append({ type: "turn_resumed", iteration });
111
+ }
112
+ onEvent(type, data) {
113
+ this._append({ type, ...data });
114
+ }
115
+ /** 保存完整引擎状态快照(检查点) */
116
+ saveState(engine, meta) {
117
+ const permissions = engine.permissions;
118
+ const state = {
119
+ sessionId: this.sessionId,
120
+ model: engine.model,
121
+ messages: engine.messages,
122
+ compaction: engine.compactionState ? {
123
+ boundaryIndex: engine.compactionState.boundaryIndex,
124
+ summaryText: engine.compactionState.summaryText,
125
+ workingState: engine.compactionState.workingState,
126
+ userMessages: engine.compactionState.userMessages,
127
+ userMessagesDropped: engine.compactionState.userMessagesDropped,
128
+ createdAt: engine.compactionState.createdAt,
129
+ modelUsed: engine.compactionState.modelUsed,
130
+ trimmed: engine.compactionState.trimmed
131
+ } : null,
132
+ savedAt: (/* @__PURE__ */ new Date()).toISOString(),
133
+ ...permissions?.mode !== void 0 ? { permissionMode: permissions.mode } : {},
134
+ ...permissions?.sessionAllowTools ? { allowTools: [...permissions.sessionAllowTools] } : {},
135
+ ...permissions?.sessionAllowCommands ? { allowCommands: [...permissions.sessionAllowCommands] } : {},
136
+ // 会话命名元数据(可选,向后兼容旧调用)
137
+ ...meta?.name !== void 0 ? { name: meta.name } : {},
138
+ ...meta?.nameSource !== void 0 ? { nameSource: meta.nameSource } : {},
139
+ ...meta?.taskCount !== void 0 ? { taskCount: meta.taskCount } : {}
140
+ };
141
+ fs.writeFileSync(this._statePath, JSON.stringify(state, null, 2), "utf-8");
142
+ }
143
+ /** 读取保存的引擎状态 */
144
+ static loadState(sessionId, stateDir) {
145
+ const p = path.join(stateDir, `${sessionId}_state.json`);
146
+ try {
147
+ const raw = fs.readFileSync(p, "utf-8");
148
+ return JSON.parse(raw);
149
+ } catch (e) {
150
+ console.error(e);
151
+ return null;
152
+ }
153
+ }
154
+ /** 读取事件日志 */
155
+ static loadEvents(sessionId, stateDir) {
156
+ const p = path.join(stateDir, `${sessionId}.jsonl`);
157
+ try {
158
+ const raw = fs.readFileSync(p, "utf-8");
159
+ return raw.trim().split("\n").filter(Boolean).map((line) => JSON.parse(line));
160
+ } catch (e) {
161
+ console.error(e);
162
+ return [];
163
+ }
164
+ }
165
+ /** 追加一行 JSON 事件 */
166
+ _append(entry) {
167
+ entry["ts"] = (/* @__PURE__ */ new Date()).toISOString();
168
+ try {
169
+ fs.appendFileSync(this._logPath, JSON.stringify(entry) + "\n", "utf-8");
170
+ } catch (e) {
171
+ console.error(e);
172
+ }
173
+ }
174
+ };
175
+ // Annotate the CommonJS export names for ESM import in node:
176
+ 0 && (module.exports = {
177
+ FileLogHook
178
+ });
179
+ //# sourceMappingURL=FileLogHook.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/engine/FileLogHook.ts"],"sourcesContent":["/**\n * FileLogHook — 将引擎事件以 JSONL 格式持久化到文件\n *\n * 同时维护一个引擎状态快照(检查点),用于 Durable Resume。\n * 恢复时可通过 loadState() 读取消息历史和压缩状态。\n */\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type {\n EngineHook,\n EventType,\n CompactionStartInfo,\n CompactionDoneInfo,\n} from \"./events.js\";\nimport type { TokenUsage, Message } from \"./types.js\";\nimport type { CompactionState } from \"./compaction.js\";\nimport type { TurnEngine } from \"./TurnEngine.js\";\n\n/** 保存的引擎状态(用于恢复) */\nexport interface SavedState {\n sessionId: string;\n model: string;\n messages: Message[];\n compaction: Record<string, unknown> | null;\n savedAt: string;\n /** 会话名称(AI 自动生成或用户指定) */\n name?: string;\n /** 名称来源:auto=自动生成(可被后续自动生成覆盖);user=用户手动指定(不再自动生成) */\n nameSource?: \"auto\" | \"user\";\n /** 已成功完成的任务数(用于第 1/3/5 次自动命名) */\n taskCount?: number;\n /** 权限模式(恢复会话时还原,避免重启后回到逐条审批) */\n permissionMode?: string;\n /** 会话级「总是允许此工具」 */\n allowTools?: string[];\n /** 会话级「总是允许此命令」(按可执行程序名记录) */\n allowCommands?: string[];\n}\n\n/** 会话命名相关的元数据(由 CLI 维护,随 state 快照持久化) */\nexport interface SessionNameMeta {\n name?: string;\n nameSource?: \"auto\" | \"user\";\n taskCount?: number;\n}\n\nexport class FileLogHook implements EngineHook {\n private _logPath: string;\n private _statePath: string;\n\n constructor(\n private sessionId: string,\n stateDir: string,\n ) {\n fs.mkdirSync(stateDir, { recursive: true });\n this._logPath = path.join(stateDir, `${sessionId}.jsonl`);\n this._statePath = path.join(stateDir, `${sessionId}_state.json`);\n }\n\n onTurnStart(input: string): void {\n this._append({ type: \"turn_start\", input });\n }\n onTurnEnd(status: string, iterations: number, producedFiles: string[]): void {\n this._append({\n type: \"turn_end\",\n status,\n iterations,\n produced_files: producedFiles,\n });\n }\n onAssistantDelta(_text: string): void {\n // 逐 token 太频繁,不在日志中记录\n }\n onReasoningDelta(_text: string): void {\n // 逐 token 太频繁,不在日志中记录\n }\n onAssistantMessage(\n text: string | null,\n toolCalls: string[],\n usage?: TokenUsage,\n ): void {\n this._append({\n type: \"assistant_message\",\n text,\n tool_calls: toolCalls,\n usage,\n });\n }\n onToolProposed(name: string, args: Record<string, unknown>): void {\n this._append({ type: \"tool_proposed\", name, args });\n }\n onToolStarted(name: string): void {\n this._append({ type: \"tool_started\", name });\n }\n onToolFinished(name: string, status: string, resultPreview: string): void {\n this._append({\n type: \"tool_finished\",\n name,\n status,\n result_preview: resultPreview,\n });\n }\n onPermissionRequired(name: string, reason: string): void {\n this._append({ type: \"permission_required\", name, reason });\n }\n onIterationEnd(iteration: number): void {\n // 每个检查点保存引擎状态\n this._append({ type: \"iteration_end\", iteration });\n }\n onCompacting(info?: CompactionStartInfo): void {\n this._append({ type: \"compacting\", ...(info ?? {}) });\n }\n onCompacted(text: string, info?: CompactionDoneInfo): void {\n this._append({ type: \"compacted\", text, ...(info ?? {}) });\n }\n onError(error: string, errorType: string): void {\n this._append({ type: \"error\", error, error_type: errorType });\n }\n onRetry(attempt: number, max: number, reason: string): void {\n this._append({ type: \"llm_retry\", attempt, max, reason });\n }\n\n onInterrupted(iterations: number): void {\n this._append({ type: \"interrupted\", iterations });\n }\n onPaused(iteration: number, at: string): void {\n this._append({ type: \"turn_paused\", iteration, at });\n }\n onResumed(iteration: number): void {\n this._append({ type: \"turn_resumed\", iteration });\n }\n onEvent(type: EventType, data: Record<string, unknown>): void {\n this._append({ type, ...data });\n }\n\n /** 保存完整引擎状态快照(检查点) */\n saveState(engine: TurnEngine, meta?: SessionNameMeta): void {\n // 权限状态随快照落盘:/mode、/agent 重建引擎与重启恢复都不能丢掉\n // 用户已经做过的授权,否则同一批命令会被反复审批。\n // 用可选访问兼容只提供 model/messages 的轻量 stub。\n const permissions = engine.permissions as\n | {\n mode?: string;\n sessionAllowTools?: Set<string>;\n sessionAllowCommands?: Set<string>;\n }\n | undefined;\n const state: SavedState = {\n sessionId: this.sessionId,\n model: engine.model,\n messages: engine.messages,\n compaction: engine.compactionState\n ? {\n boundaryIndex: engine.compactionState.boundaryIndex,\n summaryText: engine.compactionState.summaryText,\n workingState: engine.compactionState.workingState,\n userMessages: engine.compactionState.userMessages,\n userMessagesDropped: engine.compactionState.userMessagesDropped,\n createdAt: engine.compactionState.createdAt,\n modelUsed: engine.compactionState.modelUsed,\n trimmed: engine.compactionState.trimmed,\n }\n : null,\n savedAt: new Date().toISOString(),\n ...(permissions?.mode !== undefined\n ? { permissionMode: permissions.mode }\n : {}),\n ...(permissions?.sessionAllowTools\n ? { allowTools: [...permissions.sessionAllowTools] }\n : {}),\n ...(permissions?.sessionAllowCommands\n ? { allowCommands: [...permissions.sessionAllowCommands] }\n : {}),\n // 会话命名元数据(可选,向后兼容旧调用)\n ...(meta?.name !== undefined ? { name: meta.name } : {}),\n ...(meta?.nameSource !== undefined\n ? { nameSource: meta.nameSource }\n : {}),\n ...(meta?.taskCount !== undefined ? { taskCount: meta.taskCount } : {}),\n };\n fs.writeFileSync(this._statePath, JSON.stringify(state, null, 2), \"utf-8\");\n }\n\n /** 读取保存的引擎状态 */\n static loadState(sessionId: string, stateDir: string): SavedState | null {\n const p = path.join(stateDir, `${sessionId}_state.json`);\n try {\n const raw = fs.readFileSync(p, \"utf-8\");\n return JSON.parse(raw) as SavedState;\n } catch (e) {\n console.error(e);\n return null;\n }\n }\n\n /** 读取事件日志 */\n static loadEvents(\n sessionId: string,\n stateDir: string,\n ): Record<string, unknown>[] {\n const p = path.join(stateDir, `${sessionId}.jsonl`);\n try {\n const raw = fs.readFileSync(p, \"utf-8\");\n return raw\n .trim()\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => JSON.parse(line));\n } catch (e) {\n console.error(e);\n return [];\n }\n }\n\n /** 追加一行 JSON 事件 */\n private _append(entry: Record<string, unknown>): void {\n entry[\"ts\"] = new Date().toISOString();\n try {\n fs.appendFileSync(this._logPath, JSON.stringify(entry) + \"\\n\", \"utf-8\");\n } catch (e) {\n // 持久化失败不影响核心逻辑\n console.error(e);\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,67 @@
1
+ import { E as EngineHook, C as CompactionStartInfo, a as CompactionDoneInfo, b as EventType, T as TurnEngine } from '../../TurnEngine-BPKhWuSI.cjs';
2
+ import { T as TokenUsage, M as Message } from '../../types-BYyXWWPW.cjs';
3
+ import '../../ToolRegistry-DouDvn9E.cjs';
4
+ import 'openai/resources/chat/completions.js';
5
+ import 'openai/core.mjs';
6
+ import '@zqagent/shared/model-capabilities';
7
+
8
+ /** 保存的引擎状态(用于恢复) */
9
+ interface SavedState {
10
+ sessionId: string;
11
+ model: string;
12
+ messages: Message[];
13
+ compaction: Record<string, unknown> | null;
14
+ savedAt: string;
15
+ /** 会话名称(AI 自动生成或用户指定) */
16
+ name?: string;
17
+ /** 名称来源:auto=自动生成(可被后续自动生成覆盖);user=用户手动指定(不再自动生成) */
18
+ nameSource?: "auto" | "user";
19
+ /** 已成功完成的任务数(用于第 1/3/5 次自动命名) */
20
+ taskCount?: number;
21
+ /** 权限模式(恢复会话时还原,避免重启后回到逐条审批) */
22
+ permissionMode?: string;
23
+ /** 会话级「总是允许此工具」 */
24
+ allowTools?: string[];
25
+ /** 会话级「总是允许此命令」(按可执行程序名记录) */
26
+ allowCommands?: string[];
27
+ }
28
+ /** 会话命名相关的元数据(由 CLI 维护,随 state 快照持久化) */
29
+ interface SessionNameMeta {
30
+ name?: string;
31
+ nameSource?: "auto" | "user";
32
+ taskCount?: number;
33
+ }
34
+ declare class FileLogHook implements EngineHook {
35
+ private sessionId;
36
+ private _logPath;
37
+ private _statePath;
38
+ constructor(sessionId: string, stateDir: string);
39
+ onTurnStart(input: string): void;
40
+ onTurnEnd(status: string, iterations: number, producedFiles: string[]): void;
41
+ onAssistantDelta(_text: string): void;
42
+ onReasoningDelta(_text: string): void;
43
+ onAssistantMessage(text: string | null, toolCalls: string[], usage?: TokenUsage): void;
44
+ onToolProposed(name: string, args: Record<string, unknown>): void;
45
+ onToolStarted(name: string): void;
46
+ onToolFinished(name: string, status: string, resultPreview: string): void;
47
+ onPermissionRequired(name: string, reason: string): void;
48
+ onIterationEnd(iteration: number): void;
49
+ onCompacting(info?: CompactionStartInfo): void;
50
+ onCompacted(text: string, info?: CompactionDoneInfo): void;
51
+ onError(error: string, errorType: string): void;
52
+ onRetry(attempt: number, max: number, reason: string): void;
53
+ onInterrupted(iterations: number): void;
54
+ onPaused(iteration: number, at: string): void;
55
+ onResumed(iteration: number): void;
56
+ onEvent(type: EventType, data: Record<string, unknown>): void;
57
+ /** 保存完整引擎状态快照(检查点) */
58
+ saveState(engine: TurnEngine, meta?: SessionNameMeta): void;
59
+ /** 读取保存的引擎状态 */
60
+ static loadState(sessionId: string, stateDir: string): SavedState | null;
61
+ /** 读取事件日志 */
62
+ static loadEvents(sessionId: string, stateDir: string): Record<string, unknown>[];
63
+ /** 追加一行 JSON 事件 */
64
+ private _append;
65
+ }
66
+
67
+ export { FileLogHook, type SavedState, type SessionNameMeta };
@@ -0,0 +1,67 @@
1
+ import { E as EngineHook, C as CompactionStartInfo, a as CompactionDoneInfo, b as EventType, T as TurnEngine } from '../../TurnEngine-DtGEuVLT.js';
2
+ import { T as TokenUsage, M as Message } from '../../types-BYyXWWPW.js';
3
+ import '../../ToolRegistry-Cy0fQxrb.js';
4
+ import 'openai/resources/chat/completions.js';
5
+ import 'openai/core.mjs';
6
+ import '@zqagent/shared/model-capabilities';
7
+
8
+ /** 保存的引擎状态(用于恢复) */
9
+ interface SavedState {
10
+ sessionId: string;
11
+ model: string;
12
+ messages: Message[];
13
+ compaction: Record<string, unknown> | null;
14
+ savedAt: string;
15
+ /** 会话名称(AI 自动生成或用户指定) */
16
+ name?: string;
17
+ /** 名称来源:auto=自动生成(可被后续自动生成覆盖);user=用户手动指定(不再自动生成) */
18
+ nameSource?: "auto" | "user";
19
+ /** 已成功完成的任务数(用于第 1/3/5 次自动命名) */
20
+ taskCount?: number;
21
+ /** 权限模式(恢复会话时还原,避免重启后回到逐条审批) */
22
+ permissionMode?: string;
23
+ /** 会话级「总是允许此工具」 */
24
+ allowTools?: string[];
25
+ /** 会话级「总是允许此命令」(按可执行程序名记录) */
26
+ allowCommands?: string[];
27
+ }
28
+ /** 会话命名相关的元数据(由 CLI 维护,随 state 快照持久化) */
29
+ interface SessionNameMeta {
30
+ name?: string;
31
+ nameSource?: "auto" | "user";
32
+ taskCount?: number;
33
+ }
34
+ declare class FileLogHook implements EngineHook {
35
+ private sessionId;
36
+ private _logPath;
37
+ private _statePath;
38
+ constructor(sessionId: string, stateDir: string);
39
+ onTurnStart(input: string): void;
40
+ onTurnEnd(status: string, iterations: number, producedFiles: string[]): void;
41
+ onAssistantDelta(_text: string): void;
42
+ onReasoningDelta(_text: string): void;
43
+ onAssistantMessage(text: string | null, toolCalls: string[], usage?: TokenUsage): void;
44
+ onToolProposed(name: string, args: Record<string, unknown>): void;
45
+ onToolStarted(name: string): void;
46
+ onToolFinished(name: string, status: string, resultPreview: string): void;
47
+ onPermissionRequired(name: string, reason: string): void;
48
+ onIterationEnd(iteration: number): void;
49
+ onCompacting(info?: CompactionStartInfo): void;
50
+ onCompacted(text: string, info?: CompactionDoneInfo): void;
51
+ onError(error: string, errorType: string): void;
52
+ onRetry(attempt: number, max: number, reason: string): void;
53
+ onInterrupted(iterations: number): void;
54
+ onPaused(iteration: number, at: string): void;
55
+ onResumed(iteration: number): void;
56
+ onEvent(type: EventType, data: Record<string, unknown>): void;
57
+ /** 保存完整引擎状态快照(检查点) */
58
+ saveState(engine: TurnEngine, meta?: SessionNameMeta): void;
59
+ /** 读取保存的引擎状态 */
60
+ static loadState(sessionId: string, stateDir: string): SavedState | null;
61
+ /** 读取事件日志 */
62
+ static loadEvents(sessionId: string, stateDir: string): Record<string, unknown>[];
63
+ /** 追加一行 JSON 事件 */
64
+ private _append;
65
+ }
66
+
67
+ export { FileLogHook, type SavedState, type SessionNameMeta };
@@ -0,0 +1,144 @@
1
+ // src/engine/FileLogHook.ts
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ var FileLogHook = class {
5
+ constructor(sessionId, stateDir) {
6
+ this.sessionId = sessionId;
7
+ fs.mkdirSync(stateDir, { recursive: true });
8
+ this._logPath = path.join(stateDir, `${sessionId}.jsonl`);
9
+ this._statePath = path.join(stateDir, `${sessionId}_state.json`);
10
+ }
11
+ sessionId;
12
+ _logPath;
13
+ _statePath;
14
+ onTurnStart(input) {
15
+ this._append({ type: "turn_start", input });
16
+ }
17
+ onTurnEnd(status, iterations, producedFiles) {
18
+ this._append({
19
+ type: "turn_end",
20
+ status,
21
+ iterations,
22
+ produced_files: producedFiles
23
+ });
24
+ }
25
+ onAssistantDelta(_text) {
26
+ }
27
+ onReasoningDelta(_text) {
28
+ }
29
+ onAssistantMessage(text, toolCalls, usage) {
30
+ this._append({
31
+ type: "assistant_message",
32
+ text,
33
+ tool_calls: toolCalls,
34
+ usage
35
+ });
36
+ }
37
+ onToolProposed(name, args) {
38
+ this._append({ type: "tool_proposed", name, args });
39
+ }
40
+ onToolStarted(name) {
41
+ this._append({ type: "tool_started", name });
42
+ }
43
+ onToolFinished(name, status, resultPreview) {
44
+ this._append({
45
+ type: "tool_finished",
46
+ name,
47
+ status,
48
+ result_preview: resultPreview
49
+ });
50
+ }
51
+ onPermissionRequired(name, reason) {
52
+ this._append({ type: "permission_required", name, reason });
53
+ }
54
+ onIterationEnd(iteration) {
55
+ this._append({ type: "iteration_end", iteration });
56
+ }
57
+ onCompacting(info) {
58
+ this._append({ type: "compacting", ...info ?? {} });
59
+ }
60
+ onCompacted(text, info) {
61
+ this._append({ type: "compacted", text, ...info ?? {} });
62
+ }
63
+ onError(error, errorType) {
64
+ this._append({ type: "error", error, error_type: errorType });
65
+ }
66
+ onRetry(attempt, max, reason) {
67
+ this._append({ type: "llm_retry", attempt, max, reason });
68
+ }
69
+ onInterrupted(iterations) {
70
+ this._append({ type: "interrupted", iterations });
71
+ }
72
+ onPaused(iteration, at) {
73
+ this._append({ type: "turn_paused", iteration, at });
74
+ }
75
+ onResumed(iteration) {
76
+ this._append({ type: "turn_resumed", iteration });
77
+ }
78
+ onEvent(type, data) {
79
+ this._append({ type, ...data });
80
+ }
81
+ /** 保存完整引擎状态快照(检查点) */
82
+ saveState(engine, meta) {
83
+ const permissions = engine.permissions;
84
+ const state = {
85
+ sessionId: this.sessionId,
86
+ model: engine.model,
87
+ messages: engine.messages,
88
+ compaction: engine.compactionState ? {
89
+ boundaryIndex: engine.compactionState.boundaryIndex,
90
+ summaryText: engine.compactionState.summaryText,
91
+ workingState: engine.compactionState.workingState,
92
+ userMessages: engine.compactionState.userMessages,
93
+ userMessagesDropped: engine.compactionState.userMessagesDropped,
94
+ createdAt: engine.compactionState.createdAt,
95
+ modelUsed: engine.compactionState.modelUsed,
96
+ trimmed: engine.compactionState.trimmed
97
+ } : null,
98
+ savedAt: (/* @__PURE__ */ new Date()).toISOString(),
99
+ ...permissions?.mode !== void 0 ? { permissionMode: permissions.mode } : {},
100
+ ...permissions?.sessionAllowTools ? { allowTools: [...permissions.sessionAllowTools] } : {},
101
+ ...permissions?.sessionAllowCommands ? { allowCommands: [...permissions.sessionAllowCommands] } : {},
102
+ // 会话命名元数据(可选,向后兼容旧调用)
103
+ ...meta?.name !== void 0 ? { name: meta.name } : {},
104
+ ...meta?.nameSource !== void 0 ? { nameSource: meta.nameSource } : {},
105
+ ...meta?.taskCount !== void 0 ? { taskCount: meta.taskCount } : {}
106
+ };
107
+ fs.writeFileSync(this._statePath, JSON.stringify(state, null, 2), "utf-8");
108
+ }
109
+ /** 读取保存的引擎状态 */
110
+ static loadState(sessionId, stateDir) {
111
+ const p = path.join(stateDir, `${sessionId}_state.json`);
112
+ try {
113
+ const raw = fs.readFileSync(p, "utf-8");
114
+ return JSON.parse(raw);
115
+ } catch (e) {
116
+ console.error(e);
117
+ return null;
118
+ }
119
+ }
120
+ /** 读取事件日志 */
121
+ static loadEvents(sessionId, stateDir) {
122
+ const p = path.join(stateDir, `${sessionId}.jsonl`);
123
+ try {
124
+ const raw = fs.readFileSync(p, "utf-8");
125
+ return raw.trim().split("\n").filter(Boolean).map((line) => JSON.parse(line));
126
+ } catch (e) {
127
+ console.error(e);
128
+ return [];
129
+ }
130
+ }
131
+ /** 追加一行 JSON 事件 */
132
+ _append(entry) {
133
+ entry["ts"] = (/* @__PURE__ */ new Date()).toISOString();
134
+ try {
135
+ fs.appendFileSync(this._logPath, JSON.stringify(entry) + "\n", "utf-8");
136
+ } catch (e) {
137
+ console.error(e);
138
+ }
139
+ }
140
+ };
141
+ export {
142
+ FileLogHook
143
+ };
144
+ //# sourceMappingURL=FileLogHook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/engine/FileLogHook.ts"],"sourcesContent":["/**\n * FileLogHook — 将引擎事件以 JSONL 格式持久化到文件\n *\n * 同时维护一个引擎状态快照(检查点),用于 Durable Resume。\n * 恢复时可通过 loadState() 读取消息历史和压缩状态。\n */\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type {\n EngineHook,\n EventType,\n CompactionStartInfo,\n CompactionDoneInfo,\n} from \"./events.js\";\nimport type { TokenUsage, Message } from \"./types.js\";\nimport type { CompactionState } from \"./compaction.js\";\nimport type { TurnEngine } from \"./TurnEngine.js\";\n\n/** 保存的引擎状态(用于恢复) */\nexport interface SavedState {\n sessionId: string;\n model: string;\n messages: Message[];\n compaction: Record<string, unknown> | null;\n savedAt: string;\n /** 会话名称(AI 自动生成或用户指定) */\n name?: string;\n /** 名称来源:auto=自动生成(可被后续自动生成覆盖);user=用户手动指定(不再自动生成) */\n nameSource?: \"auto\" | \"user\";\n /** 已成功完成的任务数(用于第 1/3/5 次自动命名) */\n taskCount?: number;\n /** 权限模式(恢复会话时还原,避免重启后回到逐条审批) */\n permissionMode?: string;\n /** 会话级「总是允许此工具」 */\n allowTools?: string[];\n /** 会话级「总是允许此命令」(按可执行程序名记录) */\n allowCommands?: string[];\n}\n\n/** 会话命名相关的元数据(由 CLI 维护,随 state 快照持久化) */\nexport interface SessionNameMeta {\n name?: string;\n nameSource?: \"auto\" | \"user\";\n taskCount?: number;\n}\n\nexport class FileLogHook implements EngineHook {\n private _logPath: string;\n private _statePath: string;\n\n constructor(\n private sessionId: string,\n stateDir: string,\n ) {\n fs.mkdirSync(stateDir, { recursive: true });\n this._logPath = path.join(stateDir, `${sessionId}.jsonl`);\n this._statePath = path.join(stateDir, `${sessionId}_state.json`);\n }\n\n onTurnStart(input: string): void {\n this._append({ type: \"turn_start\", input });\n }\n onTurnEnd(status: string, iterations: number, producedFiles: string[]): void {\n this._append({\n type: \"turn_end\",\n status,\n iterations,\n produced_files: producedFiles,\n });\n }\n onAssistantDelta(_text: string): void {\n // 逐 token 太频繁,不在日志中记录\n }\n onReasoningDelta(_text: string): void {\n // 逐 token 太频繁,不在日志中记录\n }\n onAssistantMessage(\n text: string | null,\n toolCalls: string[],\n usage?: TokenUsage,\n ): void {\n this._append({\n type: \"assistant_message\",\n text,\n tool_calls: toolCalls,\n usage,\n });\n }\n onToolProposed(name: string, args: Record<string, unknown>): void {\n this._append({ type: \"tool_proposed\", name, args });\n }\n onToolStarted(name: string): void {\n this._append({ type: \"tool_started\", name });\n }\n onToolFinished(name: string, status: string, resultPreview: string): void {\n this._append({\n type: \"tool_finished\",\n name,\n status,\n result_preview: resultPreview,\n });\n }\n onPermissionRequired(name: string, reason: string): void {\n this._append({ type: \"permission_required\", name, reason });\n }\n onIterationEnd(iteration: number): void {\n // 每个检查点保存引擎状态\n this._append({ type: \"iteration_end\", iteration });\n }\n onCompacting(info?: CompactionStartInfo): void {\n this._append({ type: \"compacting\", ...(info ?? {}) });\n }\n onCompacted(text: string, info?: CompactionDoneInfo): void {\n this._append({ type: \"compacted\", text, ...(info ?? {}) });\n }\n onError(error: string, errorType: string): void {\n this._append({ type: \"error\", error, error_type: errorType });\n }\n onRetry(attempt: number, max: number, reason: string): void {\n this._append({ type: \"llm_retry\", attempt, max, reason });\n }\n\n onInterrupted(iterations: number): void {\n this._append({ type: \"interrupted\", iterations });\n }\n onPaused(iteration: number, at: string): void {\n this._append({ type: \"turn_paused\", iteration, at });\n }\n onResumed(iteration: number): void {\n this._append({ type: \"turn_resumed\", iteration });\n }\n onEvent(type: EventType, data: Record<string, unknown>): void {\n this._append({ type, ...data });\n }\n\n /** 保存完整引擎状态快照(检查点) */\n saveState(engine: TurnEngine, meta?: SessionNameMeta): void {\n // 权限状态随快照落盘:/mode、/agent 重建引擎与重启恢复都不能丢掉\n // 用户已经做过的授权,否则同一批命令会被反复审批。\n // 用可选访问兼容只提供 model/messages 的轻量 stub。\n const permissions = engine.permissions as\n | {\n mode?: string;\n sessionAllowTools?: Set<string>;\n sessionAllowCommands?: Set<string>;\n }\n | undefined;\n const state: SavedState = {\n sessionId: this.sessionId,\n model: engine.model,\n messages: engine.messages,\n compaction: engine.compactionState\n ? {\n boundaryIndex: engine.compactionState.boundaryIndex,\n summaryText: engine.compactionState.summaryText,\n workingState: engine.compactionState.workingState,\n userMessages: engine.compactionState.userMessages,\n userMessagesDropped: engine.compactionState.userMessagesDropped,\n createdAt: engine.compactionState.createdAt,\n modelUsed: engine.compactionState.modelUsed,\n trimmed: engine.compactionState.trimmed,\n }\n : null,\n savedAt: new Date().toISOString(),\n ...(permissions?.mode !== undefined\n ? { permissionMode: permissions.mode }\n : {}),\n ...(permissions?.sessionAllowTools\n ? { allowTools: [...permissions.sessionAllowTools] }\n : {}),\n ...(permissions?.sessionAllowCommands\n ? { allowCommands: [...permissions.sessionAllowCommands] }\n : {}),\n // 会话命名元数据(可选,向后兼容旧调用)\n ...(meta?.name !== undefined ? { name: meta.name } : {}),\n ...(meta?.nameSource !== undefined\n ? { nameSource: meta.nameSource }\n : {}),\n ...(meta?.taskCount !== undefined ? { taskCount: meta.taskCount } : {}),\n };\n fs.writeFileSync(this._statePath, JSON.stringify(state, null, 2), \"utf-8\");\n }\n\n /** 读取保存的引擎状态 */\n static loadState(sessionId: string, stateDir: string): SavedState | null {\n const p = path.join(stateDir, `${sessionId}_state.json`);\n try {\n const raw = fs.readFileSync(p, \"utf-8\");\n return JSON.parse(raw) as SavedState;\n } catch (e) {\n console.error(e);\n return null;\n }\n }\n\n /** 读取事件日志 */\n static loadEvents(\n sessionId: string,\n stateDir: string,\n ): Record<string, unknown>[] {\n const p = path.join(stateDir, `${sessionId}.jsonl`);\n try {\n const raw = fs.readFileSync(p, \"utf-8\");\n return raw\n .trim()\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => JSON.parse(line));\n } catch (e) {\n console.error(e);\n return [];\n }\n }\n\n /** 追加一行 JSON 事件 */\n private _append(entry: Record<string, unknown>): void {\n entry[\"ts\"] = new Date().toISOString();\n try {\n fs.appendFileSync(this._logPath, JSON.stringify(entry) + \"\\n\", \"utf-8\");\n } catch (e) {\n // 持久化失败不影响核心逻辑\n console.error(e);\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
+
17
+ // src/engine/approvalView.ts
18
+ var approvalView_exports = {};
19
+ module.exports = __toCommonJS(approvalView_exports);
20
+ __reExport(approvalView_exports, require("@zqagent/shared/approval-view"), module.exports);
21
+ // Annotate the CommonJS export names for ESM import in node:
22
+ 0 && (module.exports = {
23
+ ...require("@zqagent/shared/approval-view")
24
+ });
25
+ //# sourceMappingURL=approvalView.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/engine/approvalView.ts"],"sourcesContent":["// 已迁移至 @zqagent/shared(core 与 hub 共用);此文件保留为兼容再导出。\nexport * from \"@zqagent/shared/approval-view\";\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AACA,iCAAc,0CADd;","names":[]}
@@ -0,0 +1 @@
1
+ export * from '@zqagent/shared/approval-view';
@@ -0,0 +1 @@
1
+ export * from '@zqagent/shared/approval-view';
@@ -0,0 +1,3 @@
1
+ // src/engine/approvalView.ts
2
+ export * from "@zqagent/shared/approval-view";
3
+ //# sourceMappingURL=approvalView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/engine/approvalView.ts"],"sourcesContent":["// 已迁移至 @zqagent/shared(core 与 hub 共用);此文件保留为兼容再导出。\nexport * from \"@zqagent/shared/approval-view\";\n"],"mappings":";AACA,cAAc;","names":[]}