zidane 6.6.4 → 7.0.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 (157) hide show
  1. package/dist/{acp-BQqhozmt.js → acp-Wr8l4IDI.js} +7 -180
  2. package/dist/acp-Wr8l4IDI.js.map +1 -0
  3. package/dist/acp-cli.js +6 -6
  4. package/dist/acp.d.ts +1 -1
  5. package/dist/acp.d.ts.map +1 -1
  6. package/dist/acp.js +2 -1
  7. package/dist/{agent-DTxH7RHW.js → agent-C-camKQW.js} +162 -12
  8. package/dist/agent-C-camKQW.js.map +1 -0
  9. package/dist/agent.d.ts +1 -1
  10. package/dist/agent.js +1 -1
  11. package/dist/{anthropic-DRNRnd6W.js → anthropic-BDOGzhtj.js} +3 -3
  12. package/dist/{anthropic-DRNRnd6W.js.map → anthropic-BDOGzhtj.js.map} +1 -1
  13. package/dist/{transcript-anchors-BjH-68k2.js → approvals-CqqxE5Vh.js} +4924 -275
  14. package/dist/approvals-CqqxE5Vh.js.map +1 -0
  15. package/dist/{auth-7rv6ZfWk.js → auth-BdwDROYg.js} +12 -8
  16. package/dist/{auth-7rv6ZfWk.js.map → auth-BdwDROYg.js.map} +1 -1
  17. package/dist/chat/pure.d.ts +221 -4
  18. package/dist/chat/pure.d.ts.map +1 -0
  19. package/dist/chat/pure.js +4 -2
  20. package/dist/chat.d.ts +6 -2911
  21. package/dist/chat.js +8 -261
  22. package/dist/{context-transport-D8yeGdpd.js → context-transport-BqYwzJYE.js} +2 -2
  23. package/dist/{context-transport-D8yeGdpd.js.map → context-transport-BqYwzJYE.js.map} +1 -1
  24. package/dist/contexts/daytona.d.ts +1 -1
  25. package/dist/contexts/daytona.js +1 -1
  26. package/dist/contexts/e2b.d.ts +1 -1
  27. package/dist/contexts/e2b.js +1 -1
  28. package/dist/daemon-cli.d.ts +1 -0
  29. package/dist/daemon-cli.js +90 -0
  30. package/dist/daemon-cli.js.map +1 -0
  31. package/dist/eval.d.ts +1 -1
  32. package/dist/eval.js +1 -1
  33. package/dist/extensions.d.ts +2 -2
  34. package/dist/extensions.js +2 -2
  35. package/dist/headless.d.ts +1 -1
  36. package/dist/headless.js +4 -4
  37. package/dist/{index-D0O-QO7Z.d.ts → index-B-FSaM3_.d.ts} +2863 -2375
  38. package/dist/index-B-FSaM3_.d.ts.map +1 -0
  39. package/dist/index-DgdzXRPH.d.ts +3590 -0
  40. package/dist/index-DgdzXRPH.d.ts.map +1 -0
  41. package/dist/index.d.ts +2 -2
  42. package/dist/index.js +14 -1179
  43. package/dist/ipc-CIv87xuH.js +331 -0
  44. package/dist/ipc-CIv87xuH.js.map +1 -0
  45. package/dist/ipc.d.ts +849 -0
  46. package/dist/ipc.d.ts.map +1 -0
  47. package/dist/ipc.js +4 -0
  48. package/dist/json-rpc-rSWMUh9b.js +192 -0
  49. package/dist/json-rpc-rSWMUh9b.js.map +1 -0
  50. package/dist/{logger-DBX9uYOw.js → logger--C1VQjwJ.js} +3 -13
  51. package/dist/logger--C1VQjwJ.js.map +1 -0
  52. package/dist/logs-view-CWG8aUAG.js +44 -0
  53. package/dist/logs-view-CWG8aUAG.js.map +1 -0
  54. package/dist/{mcp-CVtSQTWg.js → mcp-BIWa57eY.js} +3 -3
  55. package/dist/{mcp-CVtSQTWg.js.map → mcp-BIWa57eY.js.map} +1 -1
  56. package/dist/mcp.d.ts +1 -1
  57. package/dist/mcp.js +1 -1
  58. package/dist/{messages-CZMUuKzo.js → messages-21XfHxyF.js} +3 -3
  59. package/dist/{messages-CZMUuKzo.js.map → messages-21XfHxyF.js.map} +1 -1
  60. package/dist/{openai-compat-BoTi-9fd.js → openai-compat-DY-AKxCg.js} +2 -2
  61. package/dist/{openai-compat-BoTi-9fd.js.map → openai-compat-DY-AKxCg.js.map} +1 -1
  62. package/dist/output/stream-json.d.ts +1 -1
  63. package/dist/output/terminal.d.ts +1 -1
  64. package/dist/{plugins-onDvTHEm.js → plugins-B531Tz5b.js} +2 -2
  65. package/dist/{plugins-onDvTHEm.js.map → plugins-B531Tz5b.js.map} +1 -1
  66. package/dist/plugins.d.ts +1 -1
  67. package/dist/plugins.js +1 -1
  68. package/dist/presets.d.ts +1 -1
  69. package/dist/presets.js +1 -1
  70. package/dist/providers/anthropic.d.ts +1 -1
  71. package/dist/providers/anthropic.js +1 -1
  72. package/dist/providers/arcee.d.ts +1 -1
  73. package/dist/providers/arcee.js +1 -1
  74. package/dist/providers/baseten.d.ts +1 -1
  75. package/dist/providers/baseten.js +1 -1
  76. package/dist/providers/cerebras.d.ts +1 -1
  77. package/dist/providers/cerebras.js +1 -1
  78. package/dist/providers/local.d.ts +1 -1
  79. package/dist/providers/local.js +1 -1
  80. package/dist/providers/openai-compat.d.ts +1 -1
  81. package/dist/providers/openai-compat.js +1 -1
  82. package/dist/providers/openai.d.ts +1 -1
  83. package/dist/providers/openai.js +3 -3
  84. package/dist/providers/openrouter.d.ts +1 -1
  85. package/dist/providers/openrouter.js +1 -1
  86. package/dist/providers/xai.d.ts +1 -1
  87. package/dist/providers/xai.js +1 -1
  88. package/dist/{providers-CmhdtD7w.js → providers-DX91jwir.js} +2 -2
  89. package/dist/{providers-CmhdtD7w.js.map → providers-DX91jwir.js.map} +1 -1
  90. package/dist/providers.d.ts +1 -1
  91. package/dist/providers.js +3 -3
  92. package/dist/restate.d.ts +1 -1
  93. package/dist/restate.js +8 -8
  94. package/dist/restate.js.map +1 -1
  95. package/dist/server-DJqp9dIR.js +1317 -0
  96. package/dist/server-DJqp9dIR.js.map +1 -0
  97. package/dist/session/sqlite.d.ts +1 -1
  98. package/dist/session/sqlite.d.ts.map +1 -1
  99. package/dist/session/sqlite.js +42 -4
  100. package/dist/session/sqlite.js.map +1 -1
  101. package/dist/{session-CyRLSsVa.js → session-K3icbPH9.js} +8 -2
  102. package/dist/session-K3icbPH9.js.map +1 -0
  103. package/dist/session.d.ts +1 -1
  104. package/dist/session.js +2 -2
  105. package/dist/{skills-BMGH_KK1.js → skills-PJyiSRCp.js} +3 -21
  106. package/dist/skills-PJyiSRCp.js.map +1 -0
  107. package/dist/skills.d.ts +1 -1
  108. package/dist/skills.js +1 -1
  109. package/dist/src-DzzhE2YO.js +2461 -0
  110. package/dist/src-DzzhE2YO.js.map +1 -0
  111. package/dist/todo-edits-Dw2oO2ON.js +378 -0
  112. package/dist/todo-edits-Dw2oO2ON.js.map +1 -0
  113. package/dist/{tool-formatters-NrzD6Fkk.d.ts → tool-formatters-DO56YBBw.d.ts} +104 -4
  114. package/dist/tool-formatters-DO56YBBw.d.ts.map +1 -0
  115. package/dist/tools/fetch-url.d.ts +1 -1
  116. package/dist/tools/web-search.d.ts +1 -1
  117. package/dist/tools.d.ts +1 -1
  118. package/dist/tools.js +1 -1
  119. package/dist/{transcript-anchors-UhC58Tmj.d.ts → transcript-anchors-DXqWWGbq.d.ts} +53 -4
  120. package/dist/transcript-anchors-DXqWWGbq.d.ts.map +1 -0
  121. package/dist/tui.d.ts +94 -13
  122. package/dist/tui.d.ts.map +1 -1
  123. package/dist/tui.js +2241 -1009
  124. package/dist/tui.js.map +1 -1
  125. package/dist/{turn-operations-mMxDRgLY.js → turn-operations-CZLsNgw-.js} +896 -11
  126. package/dist/turn-operations-CZLsNgw-.js.map +1 -0
  127. package/dist/{turn-operations-Cuc9pwiB.d.ts → turn-operations-DKFYWP3O.d.ts} +501 -4
  128. package/dist/turn-operations-DKFYWP3O.d.ts.map +1 -0
  129. package/dist/{types-BIarq1qE.js → types-CWgENVLY.js} +24 -2
  130. package/dist/types-CWgENVLY.js.map +1 -0
  131. package/dist/types.d.ts +1 -1
  132. package/dist/types.js +1 -1
  133. package/dist/xml-D5HBhJle.js +22 -0
  134. package/dist/xml-D5HBhJle.js.map +1 -0
  135. package/docs/CHAT.md +39 -0
  136. package/docs/IPC.md +420 -0
  137. package/docs/TUI.md +62 -0
  138. package/package.json +8 -2
  139. package/dist/acp-BQqhozmt.js.map +0 -1
  140. package/dist/agent-DTxH7RHW.js.map +0 -1
  141. package/dist/chat.d.ts.map +0 -1
  142. package/dist/chat.js.map +0 -1
  143. package/dist/index-D0O-QO7Z.d.ts.map +0 -1
  144. package/dist/index.js.map +0 -1
  145. package/dist/inline-autocomplete-D0MPvBaS.js +0 -596
  146. package/dist/inline-autocomplete-D0MPvBaS.js.map +0 -1
  147. package/dist/logger-DBX9uYOw.js.map +0 -1
  148. package/dist/login-CB23LyI1.js +0 -707
  149. package/dist/login-CB23LyI1.js.map +0 -1
  150. package/dist/session-CyRLSsVa.js.map +0 -1
  151. package/dist/skills-BMGH_KK1.js.map +0 -1
  152. package/dist/tool-formatters-NrzD6Fkk.d.ts.map +0 -1
  153. package/dist/transcript-anchors-BjH-68k2.js.map +0 -1
  154. package/dist/transcript-anchors-UhC58Tmj.d.ts.map +0 -1
  155. package/dist/turn-operations-Cuc9pwiB.d.ts.map +0 -1
  156. package/dist/turn-operations-mMxDRgLY.js.map +0 -1
  157. package/dist/types-BIarq1qE.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.d.ts","names":[],"sources":["../src/ipc/attach.ts","../src/ipc/daemon/lifecycle.ts","../src/ipc/protocol.ts","../src/ipc/client.ts","../src/ipc/daemon/environment.ts","../src/ipc/daemon/server.ts"],"mappings":"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"}
package/dist/ipc.js ADDED
@@ -0,0 +1,4 @@
1
+ import { $t as runCompaction, Bt as readFileSafe, Ht as serializePreview, It as createChatHost, Qt as EditOutcomeLedger, Rt as createInteractionHub, Vt as resolveCwdPath, n as createMemoryApprovalsStore, t as createApprovalHub, zt as extractEditPayloadForGate } from "./approvals-CqqxE5Vh.js";
2
+ import { a as connectIpcClient, c as IpcErrorCode, d as ensureDaemonRunning, f as probeSocket, i as IpcVersionMismatchError, l as IPC_BUILD_ID, n as createDaemonEnvironment, o as connectOrSpawnDaemon, p as selfDaemonSpawnCommand, r as createFileApprovalsStore, s as IPC_PROTOCOL_VERSION, t as startIpcDaemon, u as defaultSocketPath } from "./server-DJqp9dIR.js";
3
+ import { t as runAttach } from "./ipc-CIv87xuH.js";
4
+ export { EditOutcomeLedger, IPC_BUILD_ID, IPC_PROTOCOL_VERSION, IpcErrorCode, IpcVersionMismatchError, connectIpcClient, connectOrSpawnDaemon, createApprovalHub, createChatHost, createDaemonEnvironment, createFileApprovalsStore, createInteractionHub, createMemoryApprovalsStore, defaultSocketPath, ensureDaemonRunning, extractEditPayloadForGate, probeSocket, readFileSafe, resolveCwdPath, runAttach, runCompaction, selfDaemonSpawnCommand, serializePreview, startIpcDaemon };
@@ -0,0 +1,192 @@
1
+ import { Buffer } from "node:buffer";
2
+ //#region src/acp/json-rpc.ts
3
+ function createJsonRpcConnection(options) {
4
+ let nextId = 1;
5
+ let closed = false;
6
+ let buffer = Buffer.alloc(0);
7
+ const pending = /* @__PURE__ */ new Map();
8
+ const writeMessage = (message) => {
9
+ if (closed) return;
10
+ const json = JSON.stringify({
11
+ ...message,
12
+ jsonrpc: "2.0"
13
+ });
14
+ if (options.framing === "content-length") {
15
+ const bytes = Buffer.byteLength(json);
16
+ options.output.write(`Content-Length: ${bytes}\r\n\r\n${json}`);
17
+ return;
18
+ }
19
+ options.output.write(`${json}\n`);
20
+ };
21
+ const handleParsed = async (message) => {
22
+ if (!isObject(message)) {
23
+ writeMessage(errorResponse(null, -32600, "Invalid JSON-RPC message."));
24
+ return;
25
+ }
26
+ const msg = message;
27
+ if ("id" in msg && ("result" in msg || "error" in msg)) {
28
+ const request = pending.get(msg.id);
29
+ if (!request) return;
30
+ pending.delete(msg.id);
31
+ if ("error" in msg && msg.error) request.reject(new JsonRpcRemoteError(msg.error.message, msg.error.code, msg.error.data));
32
+ else request.resolve(msg.result);
33
+ return;
34
+ }
35
+ if (typeof msg.method !== "string") {
36
+ writeMessage(errorResponse(("id" in msg ? msg.id : null) ?? null, -32600, "Missing JSON-RPC method."));
37
+ return;
38
+ }
39
+ if ("id" in msg) {
40
+ try {
41
+ const response = await options.onRequest(msg);
42
+ if (response) writeMessage(response);
43
+ } catch (err) {
44
+ writeMessage(errorResponse(msg.id, -32603, err instanceof Error ? err.message : String(err)));
45
+ }
46
+ return;
47
+ }
48
+ try {
49
+ await options.onNotification?.(msg);
50
+ } catch (err) {
51
+ options.onError?.(err instanceof Error ? err : new Error(String(err)));
52
+ }
53
+ };
54
+ const onData = (chunk) => {
55
+ buffer = Buffer.concat([buffer, typeof chunk === "string" ? Buffer.from(chunk) : chunk]);
56
+ for (;;) {
57
+ let parsed;
58
+ try {
59
+ parsed = readNextMessage(buffer);
60
+ } catch (err) {
61
+ const newline = buffer.indexOf("\n");
62
+ buffer = newline >= 0 ? buffer.subarray(newline + 1) : Buffer.alloc(0);
63
+ writeMessage(errorResponse(null, -32700, err instanceof Error ? err.message : String(err)));
64
+ continue;
65
+ }
66
+ if (!parsed) break;
67
+ buffer = parsed.rest;
68
+ handleParsed(parsed.message);
69
+ }
70
+ };
71
+ const onError = (err) => {
72
+ options.onError?.(err);
73
+ };
74
+ return {
75
+ start() {
76
+ options.input.on("data", onData);
77
+ options.input.on("error", onError);
78
+ },
79
+ close() {
80
+ closed = true;
81
+ options.input.off("data", onData);
82
+ options.input.off("error", onError);
83
+ for (const request of pending.values()) request.reject(new JsonRpcConnectionClosedError());
84
+ pending.clear();
85
+ },
86
+ sendNotification(method, params) {
87
+ writeMessage({
88
+ jsonrpc: "2.0",
89
+ method,
90
+ ...params !== void 0 ? { params } : {}
91
+ });
92
+ },
93
+ sendRequest(method, params) {
94
+ if (closed) return Promise.reject(/* @__PURE__ */ new Error("JSON-RPC connection is closed."));
95
+ const id = nextId++;
96
+ writeMessage({
97
+ jsonrpc: "2.0",
98
+ id,
99
+ method,
100
+ ...params !== void 0 ? { params } : {}
101
+ });
102
+ return new Promise((resolve, reject) => {
103
+ pending.set(id, {
104
+ resolve,
105
+ reject
106
+ });
107
+ });
108
+ }
109
+ };
110
+ }
111
+ /**
112
+ * The transport closed while requests were in flight. Distinct from
113
+ * {@link JsonRpcRemoteError} because it is not a reply — nothing on the other
114
+ * side said anything — and callers must be able to tell "the daemon rejected
115
+ * this" from "the daemon went away" without parsing a message string. Every
116
+ * pending request is rejected with one of these on `close()`.
117
+ */
118
+ var JsonRpcConnectionClosedError = class extends Error {
119
+ constructor() {
120
+ super("JSON-RPC connection closed.");
121
+ this.name = "JsonRpcConnectionClosedError";
122
+ }
123
+ };
124
+ var JsonRpcRemoteError = class extends Error {
125
+ code;
126
+ data;
127
+ constructor(message, code, data) {
128
+ super(message);
129
+ this.code = code;
130
+ this.data = data;
131
+ this.name = "JsonRpcRemoteError";
132
+ }
133
+ };
134
+ function successResponse(id, result = {}) {
135
+ return {
136
+ jsonrpc: "2.0",
137
+ id,
138
+ result
139
+ };
140
+ }
141
+ function errorResponse(id, code, message, data) {
142
+ return {
143
+ jsonrpc: "2.0",
144
+ id,
145
+ error: {
146
+ code,
147
+ message,
148
+ ...data !== void 0 ? { data } : {}
149
+ }
150
+ };
151
+ }
152
+ function readNextMessage(input) {
153
+ if (input.length === 0) return null;
154
+ const headerEnd = input.indexOf("\r\n\r\n");
155
+ if (headerEnd >= 0) {
156
+ const header = input.subarray(0, headerEnd).toString("utf8");
157
+ const match = /^Content-Length:\s*(\d+)/im.exec(header);
158
+ if (!match) return readLineMessage(input);
159
+ const length = Number(match[1]);
160
+ const bodyStart = headerEnd + 4;
161
+ const bodyEnd = bodyStart + length;
162
+ if (input.length < bodyEnd) return null;
163
+ const body = input.subarray(bodyStart, bodyEnd).toString("utf8");
164
+ return {
165
+ message: JSON.parse(body),
166
+ rest: input.subarray(bodyEnd)
167
+ };
168
+ }
169
+ if (/^Content-Length:/i.test(input.subarray(0, Math.min(input.length, 32)).toString("utf8"))) return null;
170
+ return readLineMessage(input);
171
+ }
172
+ function readLineMessage(input) {
173
+ let rest = input;
174
+ for (;;) {
175
+ const lineEnd = rest.indexOf("\n");
176
+ if (lineEnd < 0) return null;
177
+ const line = rest.subarray(0, lineEnd).toString("utf8").trim();
178
+ rest = rest.subarray(lineEnd + 1);
179
+ if (line.length === 0) continue;
180
+ return {
181
+ message: JSON.parse(line),
182
+ rest
183
+ };
184
+ }
185
+ }
186
+ function isObject(value) {
187
+ return value !== null && typeof value === "object" && !Array.isArray(value);
188
+ }
189
+ //#endregion
190
+ export { successResponse as a, errorResponse as i, JsonRpcRemoteError as n, createJsonRpcConnection as r, JsonRpcConnectionClosedError as t };
191
+
192
+ //# sourceMappingURL=json-rpc-rSWMUh9b.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-rpc-rSWMUh9b.js","names":[],"sources":["../src/acp/json-rpc.ts"],"sourcesContent":["import type { Readable, Writable } from 'node:stream'\nimport type { AcpPeer, JsonRpcFailure, JsonRpcId, JsonRpcMessage, JsonRpcRequest, JsonRpcResponse } from './types'\nimport { Buffer } from 'node:buffer'\nimport { AcpErrorCode } from './types'\n\nexport interface JsonRpcConnectionOptions {\n input: Readable\n output: Writable\n onRequest: (message: JsonRpcRequest) => Promise<JsonRpcResponse | null | undefined> | JsonRpcResponse | null | undefined\n onNotification?: (message: JsonRpcMessage & { method: string, id?: undefined }) => void | Promise<void>\n framing?: 'content-length' | 'newline'\n onError?: (error: Error) => void\n}\n\nexport interface JsonRpcConnection extends AcpPeer {\n start: () => void\n close: () => void\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void\n reject: (error: Error) => void\n}\n\nexport function createJsonRpcConnection(options: JsonRpcConnectionOptions): JsonRpcConnection {\n let nextId = 1\n let closed = false\n let buffer: Buffer<ArrayBufferLike> = Buffer.alloc(0)\n const pending = new Map<JsonRpcId, PendingRequest>()\n\n const writeMessage = (message: JsonRpcMessage): void => {\n if (closed)\n return\n const json = JSON.stringify({ ...message, jsonrpc: '2.0' })\n // ACP stdio framing is newline-delimited JSON (NDJSON) and is the default.\n // `JSON.stringify` escapes any embedded newline, so a serialized message is\n // always a single line. LSP-style `Content-Length` framing is opt-in for\n // non-ACP transports only.\n if (options.framing === 'content-length') {\n const bytes = Buffer.byteLength(json)\n options.output.write(`Content-Length: ${bytes}\\r\\n\\r\\n${json}`)\n return\n }\n options.output.write(`${json}\\n`)\n }\n\n const handleParsed = async (message: unknown): Promise<void> => {\n if (!isObject(message)) {\n writeMessage(errorResponse(null, AcpErrorCode.InvalidRequest, 'Invalid JSON-RPC message.'))\n return\n }\n\n const msg = message as unknown as JsonRpcMessage\n if ('id' in msg && ('result' in msg || 'error' in msg)) {\n const request = pending.get(msg.id)\n if (!request)\n return\n pending.delete(msg.id)\n if ('error' in msg && msg.error) {\n request.reject(new JsonRpcRemoteError(msg.error.message, msg.error.code, msg.error.data))\n }\n else {\n request.resolve((msg as { result?: unknown }).result)\n }\n return\n }\n\n if (typeof (msg as { method?: unknown }).method !== 'string') {\n writeMessage(errorResponse(('id' in msg ? msg.id : null) ?? null, AcpErrorCode.InvalidRequest, 'Missing JSON-RPC method.'))\n return\n }\n\n if ('id' in msg) {\n try {\n const response = await options.onRequest(msg as JsonRpcRequest)\n if (response)\n writeMessage(response)\n }\n catch (err) {\n writeMessage(errorResponse(msg.id, AcpErrorCode.InternalError, err instanceof Error ? err.message : String(err)))\n }\n return\n }\n\n try {\n await options.onNotification?.(msg as JsonRpcMessage & { method: string, id?: undefined })\n }\n catch (err) {\n options.onError?.(err instanceof Error ? err : new Error(String(err)))\n }\n }\n\n const onData = (chunk: Buffer | string): void => {\n buffer = Buffer.concat([buffer, typeof chunk === 'string' ? Buffer.from(chunk) : chunk])\n for (;;) {\n let parsed: { message: unknown, rest: Buffer<ArrayBufferLike> } | null\n try {\n parsed = readNextMessage(buffer)\n }\n catch (err) {\n // Resync to the next newline: drop ONLY the malformed line instead\n // of zeroing the whole receive buffer, so one bad line can't discard\n // well-formed messages already buffered behind it. A parse error\n // implies a complete (newline-terminated) line was seen, so this\n // always consumes at least one byte — the loop can't spin.\n const newline = buffer.indexOf('\\n')\n buffer = newline >= 0 ? buffer.subarray(newline + 1) : Buffer.alloc(0)\n writeMessage(errorResponse(null, AcpErrorCode.ParseError, err instanceof Error ? err.message : String(err)))\n continue\n }\n if (!parsed)\n break\n buffer = parsed.rest\n void handleParsed(parsed.message)\n }\n }\n\n const onError = (err: Error): void => {\n options.onError?.(err)\n }\n\n return {\n start() {\n options.input.on('data', onData)\n options.input.on('error', onError)\n },\n close() {\n closed = true\n options.input.off('data', onData)\n options.input.off('error', onError)\n for (const request of pending.values())\n request.reject(new JsonRpcConnectionClosedError())\n pending.clear()\n },\n sendNotification(method: string, params?: unknown) {\n writeMessage({ jsonrpc: '2.0', method, ...(params !== undefined ? { params } : {}) })\n },\n sendRequest(method: string, params?: unknown) {\n if (closed)\n return Promise.reject(new Error('JSON-RPC connection is closed.'))\n const id = nextId++\n writeMessage({ jsonrpc: '2.0', id, method, ...(params !== undefined ? { params } : {}) })\n return new Promise((resolve, reject) => {\n pending.set(id, { resolve, reject })\n })\n },\n }\n}\n\n/**\n * The transport closed while requests were in flight. Distinct from\n * {@link JsonRpcRemoteError} because it is not a reply — nothing on the other\n * side said anything — and callers must be able to tell \"the daemon rejected\n * this\" from \"the daemon went away\" without parsing a message string. Every\n * pending request is rejected with one of these on `close()`.\n */\nexport class JsonRpcConnectionClosedError extends Error {\n constructor() {\n super('JSON-RPC connection closed.')\n this.name = 'JsonRpcConnectionClosedError'\n }\n}\n\nexport class JsonRpcRemoteError extends Error {\n constructor(message: string, readonly code: number, readonly data?: unknown) {\n super(message)\n this.name = 'JsonRpcRemoteError'\n }\n}\n\nexport function successResponse(id: JsonRpcId, result: unknown = {}): JsonRpcResponse {\n return { jsonrpc: '2.0', id, result }\n}\n\nexport function errorResponse(id: JsonRpcId, code: number, message: string, data?: unknown): JsonRpcFailure {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code,\n message,\n ...(data !== undefined ? { data } : {}),\n },\n }\n}\n\nfunction readNextMessage(input: Buffer<ArrayBufferLike>): { message: unknown, rest: Buffer<ArrayBufferLike> } | null {\n if (input.length === 0)\n return null\n\n const headerEnd = input.indexOf('\\r\\n\\r\\n')\n if (headerEnd >= 0) {\n const header = input.subarray(0, headerEnd).toString('utf8')\n const match = /^Content-Length:\\s*(\\d+)/im.exec(header)\n if (!match)\n return readLineMessage(input)\n const length = Number(match[1])\n const bodyStart = headerEnd + 4\n const bodyEnd = bodyStart + length\n if (input.length < bodyEnd)\n return null\n const body = input.subarray(bodyStart, bodyEnd).toString('utf8')\n return { message: JSON.parse(body), rest: input.subarray(bodyEnd) }\n }\n\n if (/^Content-Length:/i.test(input.subarray(0, Math.min(input.length, 32)).toString('utf8')))\n return null\n\n return readLineMessage(input)\n}\n\nfunction readLineMessage(input: Buffer<ArrayBufferLike>): { message: unknown, rest: Buffer<ArrayBufferLike> } | null {\n let rest = input\n // Skip blank lines: NDJSON streams may contain stray newlines (e.g. a keep-\n // alive or a trailing separator). Emitting an error for those would be wrong.\n for (;;) {\n const lineEnd = rest.indexOf('\\n')\n if (lineEnd < 0)\n return null\n const line = rest.subarray(0, lineEnd).toString('utf8').trim()\n rest = rest.subarray(lineEnd + 1)\n if (line.length === 0)\n continue\n return { message: JSON.parse(line), rest }\n }\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { r as formatLogLine } from "./logs-view-CWG8aUAG.js";
1
2
  import { dirname } from "node:path";
2
3
  import { createWriteStream, mkdirSync } from "node:fs";
3
4
  //#region src/logger.ts
@@ -38,17 +39,6 @@ const LEVEL_ORDER = {
38
39
  error: 3
39
40
  };
40
41
  /**
41
- * Render a record as a single human-readable line (no trailing newline):
42
- * `<ISO timestamp> <LEVEL> <message> <attrs as kv pairs>`. Shared by the
43
- * console + file sinks and the in-TUI logs viewer so all three surfaces
44
- * present a byte-identical line.
45
- */
46
- function formatLogLine(record) {
47
- const ts = new Date(record.timestamp).toISOString();
48
- const kv = Object.entries(record.attrs).filter(([, v]) => v !== void 0).map(([k, v]) => `${k}=${typeof v === "string" ? v : JSON.stringify(v)}`).join(" ");
49
- return `${ts} ${record.level.toUpperCase().padEnd(5)} ${record.message}${kv ? ` ${kv}` : ""}`;
50
- }
51
- /**
52
42
  * Human-readable terminal sink. Renders each record as
53
43
  * `<ISO timestamp> <LEVEL> <message> <attrs as kv pairs>`.
54
44
  *
@@ -398,6 +388,6 @@ function createLoggingHooks(options) {
398
388
  } };
399
389
  }
400
390
  //#endregion
401
- export { createRingBufferSink as a, jsonSink as c, createLoggingHooks as i, logFileTimestamp as l, createFileSink as n, fanoutSink as o, createLogger as r, formatLogLine as s, consoleSink as t };
391
+ export { createRingBufferSink as a, logFileTimestamp as c, createLoggingHooks as i, createFileSink as n, fanoutSink as o, createLogger as r, jsonSink as s, consoleSink as t };
402
392
 
403
- //# sourceMappingURL=logger-DBX9uYOw.js.map
393
+ //# sourceMappingURL=logger--C1VQjwJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger--C1VQjwJ.js","names":[],"sources":["../src/logger.ts"],"sourcesContent":["/**\n * Structured logging primitive with auto-correlation.\n *\n * Every consumer of the harness used to roll its own logger; the TUI has\n * one, downstream apps have theirs, observability backends each want a\n * slightly different shape. This module ships the smallest reasonable\n * shared surface:\n *\n * - {@link Logger} — minimal level-tagged interface (`debug` / `info` /\n * `warn` / `error`) plus a `with(...)` method that returns a child\n * logger carrying baseline attributes (`runId`, `turnId`, `callId`,\n * `childId`, `depth`, anything you want).\n * - {@link createLogger} — builds a Logger from a {@link LogSink}.\n * - {@link consoleSink} / {@link jsonSink} — built-in sinks that cover\n * the common cases (human-readable to a terminal vs. one JSON object\n * per line to a log aggregator).\n * - {@link createLoggingHooks} — installs Logger-attached hook handlers\n * on an agent so every lifecycle event lands on the sink with the\n * right correlation ids already stamped in.\n *\n * Hosts that already own a logger (pino, winston, structlog binding,\n * platform-native) plug it in via a custom {@link LogSink} — the helper\n * itself does no I/O.\n */\n\nimport type { Hookable } from 'hookable'\nimport type { WriteStream } from 'node:fs'\nimport type { AgentHooks } from './agent'\nimport { createWriteStream, mkdirSync } from 'node:fs'\nimport { dirname } from 'node:path'\n\n// `formatLogLine` lives in the node-free `chat/logs-view` so the Electron\n// renderer's Logs tab can share it without pulling this module's `node:fs`\n// sinks (and, through the root barrel, the whole agent) into a browser bundle.\nimport { formatLogLine } from './chat/logs-view'\n\n// ---------------------------------------------------------------------------\n// Core types\n// ---------------------------------------------------------------------------\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\nexport interface LogRecord {\n level: LogLevel\n /** Unix ms — set by `Logger` at emit time. */\n timestamp: number\n /** Free-form message. Sinks render this as the human-facing line. */\n message: string\n /** Structured fields. Correlation ids land here automatically. */\n attrs: Record<string, unknown>\n}\n\nexport interface LogSink {\n emit: (record: LogRecord) => void\n}\n\nexport interface Logger {\n debug: (message: string, attrs?: Record<string, unknown>) => void\n info: (message: string, attrs?: Record<string, unknown>) => void\n warn: (message: string, attrs?: Record<string, unknown>) => void\n error: (message: string, attrs?: Record<string, unknown>) => void\n /**\n * Returns a child logger that prepends the given attributes onto every\n * subsequent emit. Equivalent to `pino.child` / `winston.child`. The\n * parent and child share the same sink — children are zero-cost.\n */\n with: (extra: Record<string, unknown>) => Logger\n /**\n * Inspectable baseline attributes — handy for tests and for hook\n * handlers that want to clone-with-extra without recursing.\n */\n readonly baseAttributes: Readonly<Record<string, unknown>>\n}\n\n// ---------------------------------------------------------------------------\n// createLogger\n// ---------------------------------------------------------------------------\n\n/**\n * Build a Logger from a sink. Stateless and cheap; create one per agent\n * (or per app) and use `.with()` to attach correlation ids per-call.\n */\nexport function createLogger(\n sink: LogSink,\n baseAttributes: Readonly<Record<string, unknown>> = {},\n): Logger {\n function emit(level: LogLevel, message: string, attrs?: Record<string, unknown>): void {\n try {\n sink.emit({\n level,\n timestamp: Date.now(),\n message,\n attrs: attrs ? { ...baseAttributes, ...attrs } : { ...baseAttributes },\n })\n }\n catch {\n // Sinks should never crash the run.\n }\n }\n\n return {\n debug: (m, a) => emit('debug', m, a),\n info: (m, a) => emit('info', m, a),\n warn: (m, a) => emit('warn', m, a),\n error: (m, a) => emit('error', m, a),\n with: extra => createLogger(sink, { ...baseAttributes, ...extra }),\n baseAttributes,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Built-in sinks\n// ---------------------------------------------------------------------------\n\nexport interface ConsoleSinkOptions {\n /**\n * Minimum level to emit. Defaults to `'info'` — `debug` is dropped so\n * the harness's lifecycle logging is not noisy by default. Set to\n * `'debug'` to see every event.\n */\n minLevel?: LogLevel\n /** Custom output stream. Defaults to `process.stderr` so logs don't pollute stdout. */\n stream?: { write: (chunk: string) => void }\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n}\n\nexport { formatLogLine }\n\n/**\n * Human-readable terminal sink. Renders each record as\n * `<ISO timestamp> <LEVEL> <message> <attrs as kv pairs>`.\n *\n * Honors `process.stderr` by default so log lines don't interleave with\n * the agent's stdout-bound output (chat responses, JSON results).\n */\nexport function consoleSink(options: ConsoleSinkOptions = {}): LogSink {\n const min = LEVEL_ORDER[options.minLevel ?? 'info']\n const stream = options.stream ?? process.stderr\n return {\n emit(record) {\n if (LEVEL_ORDER[record.level] < min)\n return\n stream.write(`${formatLogLine(record)}\\n`)\n },\n }\n}\n\n/**\n * One-JSON-object-per-line sink. Suitable for piping into log aggregators\n * (Datadog Agent, Fluent Bit, Loki, Vector) that expect JSONL.\n */\nexport function jsonSink(options: ConsoleSinkOptions = {}): LogSink {\n const min = LEVEL_ORDER[options.minLevel ?? 'info']\n const stream = options.stream ?? process.stderr\n return {\n emit(record) {\n if (LEVEL_ORDER[record.level] < min)\n return\n try {\n stream.write(`${JSON.stringify(record)}\\n`)\n }\n catch {\n // Non-serializable attr (cycle, BigInt, etc.). Skip rather than throw.\n }\n },\n }\n}\n\n/**\n * Fan a single record out to several sinks. Each sink's `emit` is guarded\n * so one throwing sink can't starve the others (mirrors `createLogger`'s\n * \"a sink must never crash the run\" contract).\n */\nexport function fanoutSink(sinks: readonly LogSink[]): LogSink {\n return {\n emit(record) {\n for (const sink of sinks) {\n try {\n sink.emit(record)\n }\n catch {\n // A misbehaving sink must not block its siblings.\n }\n }\n },\n }\n}\n\n/** Live handle over a {@link createRingBufferSink} — the read side the logs viewer consumes. */\nexport interface RingBufferSink extends LogSink {\n /** The buffered records, oldest first — the live array, so treat it as read-only. Bounded by `capacity`. */\n getRecords: () => readonly LogRecord[]\n /**\n * Subscribe to appends. The callback fires after each retained record is\n * pushed. Returns an unsubscribe fn. Used by the TUI logs viewer to\n * re-render on new lines without polling.\n */\n subscribe: (listener: () => void) => () => void\n}\n\nexport interface RingBufferSinkOptions {\n /** Max records retained; oldest are evicted past this. Default 2000. */\n capacity?: number\n /** Minimum level to retain. Default `'debug'` (retain everything). */\n minLevel?: LogLevel\n}\n\n/**\n * In-memory bounded log buffer backing the in-TUI logs viewer. Always\n * capturing and never touches I/O, so it's safe on the logging hot path.\n * Retains the most recent `capacity` records, dropping the oldest on\n * overflow. Kept simple (a plain array trimmed with `splice`) — TUI log\n * volume is low, so a true head-indexed ring isn't worth the complexity.\n */\nexport function createRingBufferSink(options: RingBufferSinkOptions = {}): RingBufferSink {\n const capacity = Math.max(1, options.capacity ?? 2000)\n const min = LEVEL_ORDER[options.minLevel ?? 'debug']\n const records: LogRecord[] = []\n const listeners = new Set<() => void>()\n return {\n emit(record) {\n if (LEVEL_ORDER[record.level] < min)\n return\n records.push(record)\n if (records.length > capacity)\n records.splice(0, records.length - capacity)\n for (const listener of listeners) {\n try {\n listener()\n }\n catch {\n // A viewer re-render callback must not break log capture.\n }\n }\n },\n getRecords: () => records,\n subscribe(listener) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n\n/** A file sink plus a `close()` for best-effort flush on teardown. */\nexport interface FileSink extends LogSink {\n /** Flush + close the underlying stream. Idempotent. */\n close: () => void\n}\n\nexport interface FileSinkOptions {\n /** Absolute path to the log file. Parent dirs are created lazily. */\n path: string\n /** Minimum level to write. Default `'debug'`. */\n minLevel?: LogLevel\n /**\n * Live gate. When it returns false the sink is fully inert — no dir, no\n * file, no I/O — so an opt-in setting can flip logging on mid-session\n * without a relaunch. Default: always enabled.\n */\n enabled?: () => boolean\n}\n\n/**\n * Append-mode file sink. The parent directory and the write stream are\n * opened lazily on the first record that passes the `enabled()` gate +\n * `minLevel`, so a disabled sink never creates the file. Writes are\n * buffered by the stream (no sync I/O per log). A single open failure\n * disables the sink rather than throwing on the logging path.\n */\nexport function createFileSink(options: FileSinkOptions): FileSink {\n const min = LEVEL_ORDER[options.minLevel ?? 'debug']\n const enabled = options.enabled ?? (() => true)\n let stream: WriteStream | null = null\n let failed = false\n const open = (): WriteStream | null => {\n if (stream || failed)\n return stream\n try {\n mkdirSync(dirname(options.path), { recursive: true })\n stream = createWriteStream(options.path, { flags: 'a' })\n return stream\n }\n catch {\n // Unwritable path (permissions, read-only FS) — disable rather than\n // retry the mkdir/open on every subsequent log line.\n failed = true\n return null\n }\n }\n return {\n emit(record) {\n if (failed || LEVEL_ORDER[record.level] < min || !enabled())\n return\n const s = open()\n if (!s)\n return\n try {\n s.write(`${formatLogLine(record)}\\n`)\n }\n catch {\n // Disk full / stream closed — stop trying rather than throw per-line.\n failed = true\n }\n },\n close() {\n if (stream) {\n try {\n stream.end()\n }\n catch {\n // Already-destroyed stream — nothing to flush.\n }\n stream = null\n }\n },\n }\n}\n\n/**\n * Filesystem-safe timestamp for a per-session log filename. ISO 8601 with\n * `:` (illegal on Windows / awkward in shells) swapped for `-` and the\n * fractional millis dropped, e.g. `2026-07-01T10-34-14`.\n */\nexport function logFileTimestamp(date: Date = new Date()): string {\n return date.toISOString().replace(/\\.\\d+Z$/, '').replace(/:/g, '-')\n}\n\n// ---------------------------------------------------------------------------\n// createLoggingHooks\n// ---------------------------------------------------------------------------\n\nexport interface LoggingHooksOptions {\n logger: Logger\n /**\n * Minimum interesting level for harness-emitted lines. Default `'info'`.\n * Set to `'debug'` to see every tool dispatch / stream event. Set to\n * `'warn'` to mute the chatty ones and only see failures + budgets.\n */\n level?: LogLevel\n /**\n * When true (default), lifecycle events (`agent:start`, `turn:before`,\n * `tool:before`, `mcp:bootstrap:start`) emit at `debug` level so they\n * stay quiet by default. Set false to mute them entirely regardless of\n * the configured minimum level — useful when piping into a tracer\n * that already captures lifecycle.\n */\n includeLifecycle?: boolean\n}\n\nexport interface LoggingHookSet {\n install: (hooks: Hookable<AgentHooks>) => () => void\n}\n\n/**\n * Install a bundle of hook handlers that emit a structured line per\n * relevant lifecycle event, automatically attaching correlation ids\n * (`runId`, `turnId`, `callId`, `childId`, `depth`, `agentName`).\n *\n * @example\n * ```ts\n * const logger = createLogger(consoleSink({ minLevel: 'debug' }), { service: 'tui' })\n * const lh = createLoggingHooks({ logger })\n * const uninstall = lh.install(agent.hooks)\n * try { await agent.run({ prompt }) }\n * finally { uninstall() }\n * ```\n */\nexport function createLoggingHooks(options: LoggingHooksOptions): LoggingHookSet {\n const root = options.logger\n const includeLifecycle = options.includeLifecycle ?? true\n const minLevel = LEVEL_ORDER[options.level ?? 'info']\n\n /**\n * Wrap a Logger so emissions below `minLevel` are dropped before they\n * hit the sink. Lets us gate harness chatter without forcing every\n * `LogSink` to re-implement level filtering. Preserves `.with()`\n * composition (children inherit the filter).\n */\n function gateLevel(logger: Logger): Logger {\n const skip = (level: LogLevel): boolean => LEVEL_ORDER[level] < minLevel\n const wrap = (l: Logger): Logger => ({\n debug: (m, a) => {\n if (!skip('debug'))\n l.debug(m, a)\n },\n info: (m, a) => {\n if (!skip('info'))\n l.info(m, a)\n },\n warn: (m, a) => {\n if (!skip('warn'))\n l.warn(m, a)\n },\n error: (m, a) => {\n if (!skip('error'))\n l.error(m, a)\n },\n with: extra => wrap(l.with(extra)),\n baseAttributes: l.baseAttributes,\n })\n return wrap(logger)\n }\n\n return {\n install(hooks: Hookable<AgentHooks>): () => void {\n const unregisters: Array<() => void> = []\n // Per-install loggers, refreshed on `agent:start` / `turn:before`.\n // Scoped INSIDE install() so concurrent installs across different\n // agents don't share state — each call to `install()` gets its own\n // attribution state.\n const gatedRoot = gateLevel(root)\n let runLogger = gatedRoot\n let turnLogger = gatedRoot\n\n // ---- Agent lifecycle --------------------------------------------\n\n unregisters.push(hooks.hook('agent:start', (ctx) => {\n runLogger = gatedRoot.with({\n runId: ctx.runId,\n ...(ctx.parentRunId ? { parentRunId: ctx.parentRunId } : {}),\n depth: ctx.depth,\n ...(ctx.agentName ? { agentName: ctx.agentName } : {}),\n })\n turnLogger = runLogger\n if (includeLifecycle)\n runLogger.debug('agent run started')\n }))\n\n unregisters.push(hooks.hook('agent:done', (stats) => {\n runLogger.info('agent run completed', {\n turns: stats.turns,\n totalIn: stats.totalIn,\n totalOut: stats.totalOut,\n ...(typeof stats.cost === 'number' ? { cost: stats.cost } : {}),\n elapsedMs: stats.elapsed,\n ...(typeof stats.timeTillFirstTokenMs === 'number' ? { ttftMs: stats.timeTillFirstTokenMs } : {}),\n })\n }))\n\n unregisters.push(hooks.hook('agent:abort', () => {\n runLogger.warn('agent run aborted')\n }))\n\n // ---- Turn / stream ---------------------------------------------\n\n unregisters.push(hooks.hook('turn:before', (ctx) => {\n turnLogger = runLogger.with({ turnId: ctx.turnId, turn: ctx.turn })\n if (includeLifecycle)\n turnLogger.debug('turn started')\n }))\n\n unregisters.push(hooks.hook('turn:after', (ctx) => {\n turnLogger.debug('turn ended', {\n inputTokens: ctx.usage.input,\n outputTokens: ctx.usage.output,\n ...(ctx.usage.finishReason ? { finishReason: ctx.usage.finishReason } : {}),\n ...(ctx.usage.modelId ? { modelId: ctx.usage.modelId } : {}),\n ...(typeof ctx.usage.timeToFirstTokenMs === 'number' ? { ttftMs: ctx.usage.timeToFirstTokenMs } : {}),\n })\n }))\n\n unregisters.push(hooks.hook('stream:error', (ctx) => {\n turnLogger.error('stream error', {\n message: ctx.err instanceof Error ? ctx.err.message : String(ctx.err),\n ...(ctx.statusCode !== undefined ? { statusCode: ctx.statusCode } : {}),\n ...(ctx.requestId !== undefined ? { requestId: ctx.requestId } : {}),\n })\n }))\n\n // ---- Tool calls -------------------------------------------------\n\n unregisters.push(hooks.hook('tool:before', (ctx) => {\n if (!includeLifecycle)\n return\n turnLogger.debug('tool started', {\n toolName: ctx.name,\n displayName: ctx.displayName,\n callId: ctx.callId,\n })\n }))\n\n unregisters.push(hooks.hook('tool:after', (ctx) => {\n if (!includeLifecycle)\n return\n turnLogger.debug('tool ended', {\n toolName: ctx.name,\n callId: ctx.callId,\n outputBytes: ctx.outputBytes,\n })\n }))\n\n unregisters.push(hooks.hook('tool:error', (ctx) => {\n turnLogger.error('tool error', {\n toolName: ctx.name,\n callId: ctx.callId,\n message: ctx.error.message,\n })\n }))\n\n unregisters.push(hooks.hook('tool:dispatched', (ctx) => {\n // Successful + gate-substitute paths are routine — only log at\n // debug level. The three \"something refused / went wrong\" paths\n // (gate-block, unknown tool, invalid input) land at warn so they\n // surface in default-config dashboards without forcing debug.\n const isAnomaly = ctx.outcome === 'gate-block'\n || ctx.outcome === 'unknown'\n || ctx.outcome === 'invalid-input'\n if (!isAnomaly && !includeLifecycle)\n return\n const lvl: LogLevel = isAnomaly ? 'warn' : 'debug'\n turnLogger[lvl]('tool dispatched', {\n toolName: ctx.name,\n callId: ctx.callId,\n outcome: ctx.outcome,\n ...(ctx.reason ? { reason: ctx.reason } : {}),\n })\n }))\n\n unregisters.push(hooks.hook('validation:reject', (ctx) => {\n turnLogger.warn('tool input rejected', {\n toolName: ctx.name,\n callId: ctx.callId,\n reason: ctx.reason,\n })\n }))\n\n // ---- Budgets ----------------------------------------------------\n\n unregisters.push(hooks.hook('budget:exceeded', (ctx) => {\n turnLogger.warn('byte budget exceeded', {\n bytes: ctx.bytes,\n budget: ctx.budget,\n })\n }))\n\n unregisters.push(hooks.hook('tool-budget:exceeded', (ctx) => {\n turnLogger.warn('tool budget exceeded', {\n toolName: ctx.tool,\n count: ctx.count,\n max: ctx.max,\n mode: ctx.mode,\n })\n }))\n\n // ---- MCP --------------------------------------------------------\n\n unregisters.push(hooks.hook('mcp:bootstrap:end', (ctx) => {\n if (ctx.ok) {\n if (includeLifecycle) {\n runLogger.debug('mcp bootstrap ok', {\n server: ctx.name,\n transport: ctx.transport,\n durationMs: ctx.durationMs,\n toolCount: ctx.toolCount,\n ...(ctx.lazy ? { lazy: true } : {}),\n ...(ctx.cached ? { cached: true } : {}),\n })\n }\n }\n else {\n runLogger.warn('mcp bootstrap failed', {\n server: ctx.name,\n transport: ctx.transport,\n durationMs: ctx.durationMs,\n message: ctx.error.message,\n })\n }\n }))\n\n unregisters.push(hooks.hook('mcp:error', (ctx) => {\n runLogger.error('mcp error', {\n server: ctx.name,\n message: ctx.error.message,\n })\n }))\n\n unregisters.push(hooks.hook('mcp:warn', (ctx) => {\n runLogger.warn('mcp warn', {\n server: ctx.name,\n message: ctx.message,\n })\n }))\n\n unregisters.push(hooks.hook('mcp:auth:required', (ctx) => {\n runLogger.warn('mcp auth required', {\n server: ctx.name,\n transport: ctx.transport,\n reason: ctx.reason,\n })\n }))\n\n unregisters.push(hooks.hook('mcp:tool:error', (ctx) => {\n turnLogger.error('mcp tool error', {\n server: ctx.server,\n tool: ctx.displayName,\n callId: ctx.callId,\n message: ctx.error.message,\n })\n }))\n\n // ---- Spawn ------------------------------------------------------\n\n unregisters.push(hooks.hook('spawn:before', (ctx) => {\n if (!includeLifecycle)\n return\n runLogger.debug('spawn started', {\n childId: ctx.id,\n depth: ctx.depth,\n })\n }))\n\n unregisters.push(hooks.hook('spawn:complete', (ctx) => {\n runLogger.info('spawn completed', {\n childId: ctx.id,\n ...(ctx.depth ? { depth: ctx.depth } : {}),\n status: ctx.status ?? 'completed',\n turns: ctx.stats.turns,\n totalIn: ctx.stats.totalIn,\n totalOut: ctx.stats.totalOut,\n ...(typeof ctx.stats.cost === 'number' ? { cost: ctx.stats.cost } : {}),\n })\n }))\n\n unregisters.push(hooks.hook('spawn:error', (ctx) => {\n runLogger.error('spawn error', {\n childId: ctx.id,\n ...(ctx.depth ? { depth: ctx.depth } : {}),\n message: ctx.error.message,\n })\n }))\n\n // -----------------------------------------------------------------\n // Disposal\n // -----------------------------------------------------------------\n\n let disposed = false\n return function uninstall() {\n if (disposed)\n return\n disposed = true\n for (const un of unregisters) {\n try {\n un()\n }\n catch { /* ignore */ }\n }\n }\n },\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ //#region src/chat/logs-view.ts
2
+ /** Level order for the tab's min-level filter (matches the logger's ordering). */
3
+ const LEVEL_ORDER = {
4
+ debug: 0,
5
+ info: 1,
6
+ warn: 2,
7
+ error: 3
8
+ };
9
+ /** The cycle order the `l` key walks through — coarsest last so it wraps back to "everything". */
10
+ const LOG_LEVEL_CYCLE = [
11
+ "debug",
12
+ "info",
13
+ "warn",
14
+ "error"
15
+ ];
16
+ /** Next min-level in {@link LOG_LEVEL_CYCLE}, wrapping around. */
17
+ function nextLogLevel(level) {
18
+ const i = LOG_LEVEL_CYCLE.indexOf(level);
19
+ return LOG_LEVEL_CYCLE[(i + 1) % LOG_LEVEL_CYCLE.length];
20
+ }
21
+ /** Retain only records at or above `minLevel`. Preserves order. */
22
+ function filterLogRecords(records, minLevel) {
23
+ const min = LEVEL_ORDER[minLevel];
24
+ return records.filter((r) => LEVEL_ORDER[r.level] >= min);
25
+ }
26
+ /**
27
+ * Render a record as a single human-readable line (no trailing newline):
28
+ * `<ISO timestamp> <LEVEL> <message> <attrs as kv pairs>`. Shared by the
29
+ * console + file sinks, the TUI logs viewer, and the GUI Logs tab so every
30
+ * surface presents a byte-identical line.
31
+ *
32
+ * Lives here rather than in `logger.ts` because that module imports
33
+ * `node:fs` for its file sink; this one function is pure and is the only part
34
+ * the renderer needs.
35
+ */
36
+ function formatLogLine(record) {
37
+ const ts = new Date(record.timestamp).toISOString();
38
+ const kv = Object.entries(record.attrs).filter(([, v]) => v !== void 0).map(([k, v]) => `${k}=${typeof v === "string" ? v : JSON.stringify(v)}`).join(" ");
39
+ return `${ts} ${record.level.toUpperCase().padEnd(5)} ${record.message}${kv ? ` ${kv}` : ""}`;
40
+ }
41
+ //#endregion
42
+ export { nextLogLevel as i, filterLogRecords as n, formatLogLine as r, LOG_LEVEL_CYCLE as t };
43
+
44
+ //# sourceMappingURL=logs-view-CWG8aUAG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs-view-CWG8aUAG.js","names":[],"sources":["../src/chat/logs-view.ts"],"sourcesContent":["/**\n * Pure helpers for the Settings \"Logs\" tab. Kept renderer-free so the\n * filtering / level-cycling logic is unit-testable without an OpenTUI\n * harness. The React view (`LogsList` in `settings-modal.tsx`) is a thin\n * shell over these.\n */\n\nimport type { LogLevel, LogRecord } from '../logger'\n\n/** Level order for the tab's min-level filter (matches the logger's ordering). */\nconst LEVEL_ORDER: Record<LogLevel, number> = { debug: 0, info: 1, warn: 2, error: 3 }\n\n/** The cycle order the `l` key walks through — coarsest last so it wraps back to \"everything\". */\nexport const LOG_LEVEL_CYCLE: readonly LogLevel[] = ['debug', 'info', 'warn', 'error']\n\n/** Next min-level in {@link LOG_LEVEL_CYCLE}, wrapping around. */\nexport function nextLogLevel(level: LogLevel): LogLevel {\n const i = LOG_LEVEL_CYCLE.indexOf(level)\n return LOG_LEVEL_CYCLE[(i + 1) % LOG_LEVEL_CYCLE.length]\n}\n\n/** Retain only records at or above `minLevel`. Preserves order. */\nexport function filterLogRecords(\n records: readonly LogRecord[],\n minLevel: LogLevel,\n): readonly LogRecord[] {\n const min = LEVEL_ORDER[minLevel]\n return records.filter(r => LEVEL_ORDER[r.level] >= min)\n}\n\n/**\n * Render a record as a single human-readable line (no trailing newline):\n * `<ISO timestamp> <LEVEL> <message> <attrs as kv pairs>`. Shared by the\n * console + file sinks, the TUI logs viewer, and the GUI Logs tab so every\n * surface presents a byte-identical line.\n *\n * Lives here rather than in `logger.ts` because that module imports\n * `node:fs` for its file sink; this one function is pure and is the only part\n * the renderer needs.\n */\nexport function formatLogLine(record: LogRecord): string {\n const ts = new Date(record.timestamp).toISOString()\n const kv = Object.entries(record.attrs)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${k}=${typeof v === 'string' ? v : JSON.stringify(v)}`)\n .join(' ')\n return `${ts} ${record.level.toUpperCase().padEnd(5)} ${record.message}${kv ? ` ${kv}` : ''}`\n}\n"],"mappings":";;AAUA,MAAM,cAAwC;CAAE,OAAO;CAAG,MAAM;CAAG,MAAM;CAAG,OAAO;AAAE;;AAGrF,MAAa,kBAAuC;CAAC;CAAS;CAAQ;CAAQ;AAAO;;AAGrF,SAAgB,aAAa,OAA2B;CACtD,MAAM,IAAI,gBAAgB,QAAQ,KAAK;CACvC,OAAO,iBAAiB,IAAI,KAAK,gBAAgB;AACnD;;AAGA,SAAgB,iBACd,SACA,UACsB;CACtB,MAAM,MAAM,YAAY;CACxB,OAAO,QAAQ,QAAO,MAAK,YAAY,EAAE,UAAU,GAAG;AACxD;;;;;;;;;;;AAYA,SAAgB,cAAc,QAA2B;CACvD,MAAM,KAAK,IAAI,KAAK,OAAO,SAAS,CAAC,CAAC,YAAY;CAClD,MAAM,KAAK,OAAO,QAAQ,OAAO,KAAK,CAAC,CACpC,QAAQ,GAAG,OAAO,MAAM,KAAA,CAAS,CAAC,CAClC,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC,GAAG,CAAC,CACxE,KAAK,GAAG;CACX,OAAO,GAAG,GAAG,GAAG,OAAO,MAAM,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,UAAU,KAAK,IAAI,OAAO;AAC3F"}
@@ -1,4 +1,4 @@
1
- import { c as toolOutputByteLength, l as toolResultToText } from "./types-BIarq1qE.js";
1
+ import { l as toolOutputByteLength, u as toolResultToText } from "./types-CWgENVLY.js";
2
2
  import { n as shellQuote } from "./shell-quote-BmnhZmdM.js";
3
3
  import { u as errorMessage } from "./errors-DKiMrOKq.js";
4
4
  import { n as originPinnedFetch } from "./origin-pinned-fetch-CqG8VZIq.js";
@@ -1001,7 +1001,7 @@ async function createTransport(rawConfig, authProvider, hooks, execution) {
1001
1001
  case "stdio": {
1002
1002
  if (config.scope === "context") {
1003
1003
  if (!execution) throw new Error(`MCP server "${config.name}" requests \`scope: 'context'\`, but no execution context was supplied to the connector. Pass \`execution\` to connectMcpServers(), or use \`scope: 'host'\`.`);
1004
- const { createContextStdioTransport } = await import("./context-transport-D8yeGdpd.js");
1004
+ const { createContextStdioTransport } = await import("./context-transport-BqYwzJYE.js");
1005
1005
  const executionHandle = await execution.getHandle();
1006
1006
  let commandLine = [config.command, ...config.args ?? []].map(shellQuote).join(" ");
1007
1007
  let env = config.env;
@@ -1912,4 +1912,4 @@ async function raceWithTimeoutAndSignal(task, timeoutMs, timeoutMessage, signal)
1912
1912
  //#endregion
1913
1913
  export { hasAuthorizationHeader as _, expandEnvPlaceholders as a, normalizeMcpBlocks as c, resultToString as d, wrapDiscoveredMcpTools as f, createMemoryMcpCredentialStore as g, McpOAuthProvider as h, deriveMcpToolMeta as i, normalizeMcpServers as l, sseToJsonFetchIfNeeded as m, connectMcpServers as n, expandMcpConfigEnv as o, createTolerantClient as p, createStderrLineEmitter as r, nonOwningMcpView as s, attachStderrWarnPump as t, resolveTransportConfig as u, isOAuthTokenRejectionError as v };
1914
1914
 
1915
- //# sourceMappingURL=mcp-CVtSQTWg.js.map
1915
+ //# sourceMappingURL=mcp-BIWa57eY.js.map