wave-agent-sdk 1.0.4 → 1.0.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 (194) hide show
  1. package/dist/agent.d.ts +23 -1
  2. package/dist/agent.js +34 -4
  3. package/dist/managers/aiManager.d.ts +36 -0
  4. package/dist/managers/aiManager.js +240 -8
  5. package/dist/managers/messageManager.d.ts +1 -3
  6. package/dist/managers/messageManager.js +19 -9
  7. package/dist/managers/slashCommandManager.js +28 -0
  8. package/dist/managers/subagentManager.d.ts +0 -2
  9. package/dist/services/session.js +2 -9
  10. package/dist/telemetry/instrumentation.d.ts +1 -1
  11. package/dist/telemetry/instrumentation.js +57 -28
  12. package/dist/tools/bashTool.js +16 -6
  13. package/dist/tools/grepTool.js +11 -3
  14. package/dist/types/index.d.ts +3 -0
  15. package/dist/types/messaging.d.ts +2 -0
  16. package/dist/utils/containerSetup.js +0 -3
  17. package/dist/utils/messageOperations.d.ts +10 -1
  18. package/dist/utils/messageOperations.js +19 -1
  19. package/dist/utils/notificationXml.js +5 -0
  20. package/dist/utils/ripgrep.d.ts +4 -4
  21. package/dist/utils/ripgrep.js +4 -27
  22. package/package.json +20 -8
  23. package/bin/rg +0 -79
  24. package/dist/managers/forkedAgentManager.d.ts +0 -50
  25. package/dist/managers/forkedAgentManager.js +0 -130
  26. package/scripts/install_ripgrep.js +0 -111
  27. package/scripts/postinstall.js +0 -38
  28. package/src/agent.ts +0 -1271
  29. package/src/constants/subagents.ts +0 -4
  30. package/src/constants/toolLimits.ts +0 -15
  31. package/src/constants/tools.ts +0 -24
  32. package/src/core/plugin.ts +0 -237
  33. package/src/core/session.ts +0 -9
  34. package/src/index.ts +0 -38
  35. package/src/managers/MemoryRuleManager.ts +0 -198
  36. package/src/managers/aiManager.ts +0 -2429
  37. package/src/managers/backgroundTaskManager.ts +0 -480
  38. package/src/managers/bangManager.ts +0 -119
  39. package/src/managers/cronManager.ts +0 -401
  40. package/src/managers/foregroundTaskManager.ts +0 -30
  41. package/src/managers/forkedAgentManager.ts +0 -216
  42. package/src/managers/hookManager.ts +0 -1089
  43. package/src/managers/liveConfigManager.ts +0 -445
  44. package/src/managers/lspManager.ts +0 -470
  45. package/src/managers/mcpManager.ts +0 -1010
  46. package/src/managers/messageManager.ts +0 -1180
  47. package/src/managers/messageQueue.ts +0 -157
  48. package/src/managers/permissionManager.ts +0 -1140
  49. package/src/managers/planManager.ts +0 -112
  50. package/src/managers/pluginManager.ts +0 -330
  51. package/src/managers/pluginScopeManager.ts +0 -124
  52. package/src/managers/reversionManager.ts +0 -178
  53. package/src/managers/skillManager.ts +0 -578
  54. package/src/managers/slashCommandManager.ts +0 -564
  55. package/src/managers/subagentManager.ts +0 -915
  56. package/src/managers/toolManager.ts +0 -489
  57. package/src/managers/workflowManager.ts +0 -493
  58. package/src/prompts/autoMemory.ts +0 -33
  59. package/src/prompts/autoMemoryExtraction.ts +0 -146
  60. package/src/prompts/index.ts +0 -506
  61. package/src/prompts/planModeReminders.ts +0 -126
  62. package/src/services/GitService.ts +0 -131
  63. package/src/services/MarketplaceService.ts +0 -1052
  64. package/src/services/MemoryRuleService.ts +0 -71
  65. package/src/services/aiService.ts +0 -919
  66. package/src/services/authService.ts +0 -565
  67. package/src/services/autoMemoryService.ts +0 -280
  68. package/src/services/configurationService.ts +0 -1520
  69. package/src/services/fileWatcher.ts +0 -319
  70. package/src/services/hook.ts +0 -348
  71. package/src/services/initializationService.ts +0 -357
  72. package/src/services/interactionService.ts +0 -229
  73. package/src/services/jsonlHandler.ts +0 -295
  74. package/src/services/memory.ts +0 -234
  75. package/src/services/pluginLoader.ts +0 -252
  76. package/src/services/remoteSettingsService.ts +0 -366
  77. package/src/services/reversionService.ts +0 -122
  78. package/src/services/session.ts +0 -922
  79. package/src/services/taskManager.ts +0 -321
  80. package/src/telemetry/events.ts +0 -65
  81. package/src/telemetry/instrumentation.ts +0 -499
  82. package/src/telemetry/sessionTracing.ts +0 -348
  83. package/src/tools/agentTool.ts +0 -322
  84. package/src/tools/askUserQuestion.ts +0 -160
  85. package/src/tools/bashTool.ts +0 -621
  86. package/src/tools/buildTool.ts +0 -61
  87. package/src/tools/cronCreateTool.ts +0 -161
  88. package/src/tools/cronDeleteTool.ts +0 -51
  89. package/src/tools/cronListTool.ts +0 -47
  90. package/src/tools/editTool.ts +0 -313
  91. package/src/tools/enterPlanMode.ts +0 -124
  92. package/src/tools/enterWorktreeTool.ts +0 -190
  93. package/src/tools/exitPlanMode.ts +0 -139
  94. package/src/tools/exitWorktreeTool.ts +0 -236
  95. package/src/tools/globTool.ts +0 -167
  96. package/src/tools/grepTool.ts +0 -399
  97. package/src/tools/lspTool.ts +0 -883
  98. package/src/tools/readTool.ts +0 -426
  99. package/src/tools/skillTool.ts +0 -248
  100. package/src/tools/taskManagementTools.ts +0 -574
  101. package/src/tools/taskStopTool.ts +0 -78
  102. package/src/tools/types.ts +0 -137
  103. package/src/tools/webFetchTool.ts +0 -373
  104. package/src/tools/workflowTool.ts +0 -205
  105. package/src/tools/writeTool.ts +0 -267
  106. package/src/types/agent.ts +0 -128
  107. package/src/types/auth.ts +0 -19
  108. package/src/types/commands.ts +0 -30
  109. package/src/types/config.ts +0 -43
  110. package/src/types/configuration.ts +0 -168
  111. package/src/types/core.ts +0 -105
  112. package/src/types/cron.ts +0 -13
  113. package/src/types/environment.ts +0 -106
  114. package/src/types/fileSearch.ts +0 -4
  115. package/src/types/history.ts +0 -7
  116. package/src/types/hooks.ts +0 -256
  117. package/src/types/index.ts +0 -41
  118. package/src/types/lsp.ts +0 -98
  119. package/src/types/marketplace.ts +0 -71
  120. package/src/types/mcp.ts +0 -43
  121. package/src/types/memoryRule.ts +0 -31
  122. package/src/types/messaging.ts +0 -114
  123. package/src/types/permissions.ts +0 -80
  124. package/src/types/plugins.ts +0 -39
  125. package/src/types/processes.ts +0 -99
  126. package/src/types/reversion.ts +0 -29
  127. package/src/types/session.ts +0 -12
  128. package/src/types/skills.ts +0 -108
  129. package/src/types/tasks.ts +0 -13
  130. package/src/types/telemetry.ts +0 -98
  131. package/src/types/tools.ts +0 -44
  132. package/src/types/workflow.ts +0 -6
  133. package/src/utils/abortUtils.ts +0 -118
  134. package/src/utils/atomicWrite.ts +0 -61
  135. package/src/utils/bashParser.ts +0 -899
  136. package/src/utils/cacheControlUtils.ts +0 -426
  137. package/src/utils/commandArgumentParser.ts +0 -161
  138. package/src/utils/commandPathResolver.ts +0 -88
  139. package/src/utils/configPaths.ts +0 -220
  140. package/src/utils/configValidator.ts +0 -100
  141. package/src/utils/constants.ts +0 -39
  142. package/src/utils/container.ts +0 -92
  143. package/src/utils/containerSetup.ts +0 -371
  144. package/src/utils/convertMessagesForAPI.ts +0 -326
  145. package/src/utils/cronTasks.ts +0 -128
  146. package/src/utils/cronTasksLock.ts +0 -182
  147. package/src/utils/cronToHuman.ts +0 -99
  148. package/src/utils/customCommands.ts +0 -95
  149. package/src/utils/editUtils.ts +0 -20
  150. package/src/utils/fileFormat.ts +0 -40
  151. package/src/utils/fileSearch.ts +0 -151
  152. package/src/utils/fileUtils.ts +0 -223
  153. package/src/utils/gitUtils.ts +0 -315
  154. package/src/utils/globalLogger.ts +0 -128
  155. package/src/utils/groupMessagesByApiRound.ts +0 -121
  156. package/src/utils/hookMatcher.ts +0 -176
  157. package/src/utils/markdownParser.ts +0 -317
  158. package/src/utils/mcpUtils.ts +0 -138
  159. package/src/utils/messageOperations.ts +0 -641
  160. package/src/utils/modelCapabilities.ts +0 -30
  161. package/src/utils/nameGenerator.ts +0 -99
  162. package/src/utils/notificationXml.ts +0 -57
  163. package/src/utils/openaiClient.ts +0 -251
  164. package/src/utils/parseCronExpression.ts +0 -78
  165. package/src/utils/path.ts +0 -72
  166. package/src/utils/pathEncoder.ts +0 -400
  167. package/src/utils/pathSafety.ts +0 -40
  168. package/src/utils/promptHistory.ts +0 -168
  169. package/src/utils/ripgrep.ts +0 -35
  170. package/src/utils/shellResolver.ts +0 -190
  171. package/src/utils/skillParser.ts +0 -246
  172. package/src/utils/stringUtils.ts +0 -156
  173. package/src/utils/subagentParser.ts +0 -279
  174. package/src/utils/taskReminder.ts +0 -96
  175. package/src/utils/tokenCalculation.ts +0 -43
  176. package/src/utils/tokenEstimate.ts +0 -34
  177. package/src/utils/toolResultStorage.ts +0 -117
  178. package/src/utils/worktreeSession.ts +0 -26
  179. package/src/utils/worktreeUtils.ts +0 -786
  180. package/src/workflow/budgetTracker.ts +0 -34
  181. package/src/workflow/concurrencyLimiter.ts +0 -47
  182. package/src/workflow/journal.ts +0 -95
  183. package/src/workflow/progressReporter.ts +0 -141
  184. package/src/workflow/runState.ts +0 -65
  185. package/src/workflow/scriptRuntime.ts +0 -274
  186. package/src/workflow/structuredOutput.ts +0 -123
  187. package/src/workflow/types.ts +0 -101
  188. package/src/workflow/workflowApis.ts +0 -410
  189. package/vendor/ripgrep/linux-aarch64/rg +0 -0
  190. package/vendor/ripgrep/linux-x86_64/rg +0 -0
  191. package/vendor/ripgrep/macos-aarch64/rg +0 -0
  192. package/vendor/ripgrep/macos-x86_64/rg +0 -0
  193. package/vendor/ripgrep/windows-aarch64/rg.exe +0 -0
  194. package/vendor/ripgrep/windows-x86_64/rg.exe +0 -0
@@ -22,7 +22,7 @@ import { PathEncoder } from "../utils/pathEncoder.js";
22
22
  import { JsonlHandler } from "../services/jsonlHandler.js";
23
23
  import { extractLatestTotalTokens } from "../utils/tokenCalculation.js";
24
24
  import { logger } from "../utils/globalLogger.js";
25
- import { getMessageContent } from "../utils/messageOperations.js";
25
+ import { getMessageContent, sliceFromLastCompact, } from "../utils/messageOperations.js";
26
26
  /**
27
27
  * Generate a new session ID using Node.js native crypto.randomUUID()
28
28
  * @returns UUID string for session identification
@@ -149,14 +149,7 @@ export async function loadSessionFromJsonl(sessionId, workdir, sessionType = "ma
149
149
  }
150
150
  const allMessages = await jsonlHandler.read(filePath);
151
151
  // Find the last compact boundary — only return messages from there forward
152
- let lastCompactIndex = -1;
153
- for (let i = allMessages.length - 1; i >= 0; i--) {
154
- if (allMessages[i].blocks?.some((b) => b.type === "compact")) {
155
- lastCompactIndex = i;
156
- break;
157
- }
158
- }
159
- const messages = lastCompactIndex >= 0 ? allMessages.slice(lastCompactIndex) : allMessages;
152
+ const messages = sliceFromLastCompact(allMessages);
160
153
  // Extract metadata from messages
161
154
  const lastMessage = messages.length > 0 ? messages[messages.length - 1] : null;
162
155
  const sessionData = {
@@ -5,7 +5,7 @@
5
5
  * and graceful shutdown for Wave's OpenTelemetry integration.
6
6
  */
7
7
  import type { TelemetryConfig } from "../types/telemetry.js";
8
- import type { SpanExporter, ReadableSpan } from "@opentelemetry/sdk-trace-node";
8
+ import type { SpanExporter, ReadableSpan } from "@opentelemetry/sdk-trace-base";
9
9
  import type { LogRecordExporter, ReadableLogRecord } from "@opentelemetry/sdk-logs";
10
10
  /**
11
11
  * Resolve the full TelemetryConfig from env vars + settings.json.
@@ -8,13 +8,17 @@ import { logger } from "../utils/globalLogger.js";
8
8
  import * as fs from "node:fs";
9
9
  import { AuthService, getOrCreateAnonymousId, } from "../services/authService.js";
10
10
  // Lazy-loaded OTEL modules — only imported when telemetry is initialized
11
- let sdkNode;
11
+ let sdkTraceBase;
12
+ let otelResources;
12
13
  let api;
14
+ let apiLogs;
13
15
  let sdkLogs;
14
16
  let exporterTraceOtlpHttp;
15
17
  let exporterLogsOtlpHttp;
16
- /** Internal SDK instance */
17
- let otelSdk;
18
+ /** Internal trace provider instance */
19
+ let tracerProvider;
20
+ /** Internal log provider instance */
21
+ let loggerProvider;
18
22
  /** Whether telemetry has been initialized */
19
23
  let initialized = false;
20
24
  /** Current resolved config */
@@ -34,14 +38,23 @@ function resolveTelemetryFilePath() {
34
38
  async function loadOTELModules() {
35
39
  if (api)
36
40
  return; // Already loaded
37
- [sdkNode, api, sdkLogs, exporterTraceOtlpHttp, exporterLogsOtlpHttp] =
38
- await Promise.all([
39
- import("@opentelemetry/sdk-node"),
40
- import("@opentelemetry/api"),
41
- import("@opentelemetry/sdk-logs"),
42
- import("@opentelemetry/exporter-trace-otlp-http"),
43
- import("@opentelemetry/exporter-logs-otlp-http"),
44
- ]);
41
+ [
42
+ sdkTraceBase,
43
+ otelResources,
44
+ api,
45
+ apiLogs,
46
+ sdkLogs,
47
+ exporterTraceOtlpHttp,
48
+ exporterLogsOtlpHttp,
49
+ ] = await Promise.all([
50
+ import("@opentelemetry/sdk-trace-base"),
51
+ import("@opentelemetry/resources"),
52
+ import("@opentelemetry/api"),
53
+ import("@opentelemetry/api-logs"),
54
+ import("@opentelemetry/sdk-logs"),
55
+ import("@opentelemetry/exporter-trace-otlp-http"),
56
+ import("@opentelemetry/exporter-logs-otlp-http"),
57
+ ]);
45
58
  }
46
59
  /**
47
60
  * Resolve the exporter target from environment variable or config.
@@ -281,33 +294,43 @@ export async function initializeTelemetry(config) {
281
294
  return;
282
295
  }
283
296
  const { tracesExporter, logsExporter } = currentConfig;
284
- // Build resource attributes using new API (sdk-node 0.217+)
285
- const { resources } = sdkNode;
286
- const resource = resources.defaultResource().merge(resources.resourceFromAttributes({
297
+ // Build resource attributes (lightweight assembly: sdk-trace-base + resources)
298
+ const resource = otelResources.defaultResource().merge(otelResources.resourceFromAttributes({
287
299
  "service.name": "wave",
288
300
  "service.version": process.env.npm_package_version || "unknown",
289
301
  "os.type": process.platform,
290
302
  "host.arch": process.arch,
291
303
  }));
292
- // Configure trace provider
293
- const nodeSdkOptions = { resource };
304
+ const spanProcessors = [];
294
305
  if (tracesExporter === "otlp" && currentConfig.endpoint) {
295
- nodeSdkOptions.traceExporter = createOTLPTraceExporter(currentConfig);
306
+ spanProcessors.push(new sdkTraceBase.BatchSpanProcessor(createOTLPTraceExporter(currentConfig)));
296
307
  }
297
308
  else if (tracesExporter === "jsonl") {
298
- nodeSdkOptions.traceExporter = new JsonlSpanExporter();
309
+ spanProcessors.push(new sdkTraceBase.BatchSpanProcessor(new JsonlSpanExporter()));
299
310
  }
300
- // Configure logs provider
311
+ const logProcessors = [];
301
312
  if (logsExporter === "otlp" && currentConfig.endpoint) {
302
- nodeSdkOptions.logRecordProcessor = new sdkLogs.BatchLogRecordProcessor(createOTLPLogExporter(currentConfig));
313
+ logProcessors.push(new sdkLogs.BatchLogRecordProcessor(createOTLPLogExporter(currentConfig)));
303
314
  }
304
315
  else if (logsExporter === "jsonl") {
305
- nodeSdkOptions.logRecordProcessor = new sdkLogs.BatchLogRecordProcessor(new JsonlLogExporter());
316
+ logProcessors.push(new sdkLogs.BatchLogRecordProcessor(new JsonlLogExporter()));
306
317
  }
307
- // Only initialize SDK if at least one exporter is configured
308
- if (nodeSdkOptions.traceExporter || nodeSdkOptions.logRecordProcessor) {
309
- otelSdk = new sdkNode.NodeSDK(nodeSdkOptions);
310
- await otelSdk.start();
318
+ // Only initialize providers if at least one exporter is configured
319
+ if (spanProcessors.length > 0 || logProcessors.length > 0) {
320
+ if (spanProcessors.length > 0) {
321
+ tracerProvider = new sdkTraceBase.BasicTracerProvider({
322
+ resource,
323
+ spanProcessors,
324
+ });
325
+ api.trace.setGlobalTracerProvider(tracerProvider);
326
+ }
327
+ if (logProcessors.length > 0) {
328
+ loggerProvider = new sdkLogs.LoggerProvider({
329
+ resource,
330
+ processors: logProcessors,
331
+ });
332
+ apiLogs.logs.setGlobalLoggerProvider(loggerProvider);
333
+ }
311
334
  initialized = true;
312
335
  logger?.info("OpenTelemetry initialized", {
313
336
  tracesExporter,
@@ -329,7 +352,7 @@ export async function initializeTelemetry(config) {
329
352
  * Respects shutdownTimeoutMs config.
330
353
  */
331
354
  export async function shutdownTelemetry() {
332
- if (!otelSdk || !initialized) {
355
+ if (!tracerProvider && !loggerProvider) {
333
356
  return;
334
357
  }
335
358
  try {
@@ -337,14 +360,20 @@ export async function shutdownTelemetry() {
337
360
  const timeoutPromise = new Promise((_, reject) => {
338
361
  setTimeout(() => reject(new Error("Telemetry shutdown timed out")), timeout);
339
362
  });
340
- await Promise.race([otelSdk.shutdown(), timeoutPromise]);
363
+ const shutdowns = [];
364
+ if (tracerProvider)
365
+ shutdowns.push(tracerProvider.shutdown());
366
+ if (loggerProvider)
367
+ shutdowns.push(loggerProvider.shutdown());
368
+ await Promise.race([Promise.all(shutdowns), timeoutPromise]);
341
369
  logger?.debug("OpenTelemetry shut down successfully");
342
370
  }
343
371
  catch (error) {
344
372
  logger?.warn("OpenTelemetry shutdown failed:", error);
345
373
  }
346
374
  finally {
347
- otelSdk = undefined;
375
+ tracerProvider = undefined;
376
+ loggerProvider = undefined;
348
377
  initialized = false;
349
378
  currentConfig = undefined;
350
379
  }
@@ -152,6 +152,13 @@ The working directory persists between commands. Try to maintain your current wo
152
152
  error: "Command parameter is required and must be a string",
153
153
  };
154
154
  }
155
+ // If the session cwd was auto-recovered (e.g. the previous worktree
156
+ // directory was removed manually via `git worktree remove`), surface
157
+ // the notice in this tool's result so the model is aware of the switch.
158
+ const cwdRecovery = context.aiManager?.consumeCwdRecovery?.();
159
+ const recoveryNotice = cwdRecovery
160
+ ? `Note: working directory ${cwdRecovery.from} no longer exists; session working directory recovered to ${cwdRecovery.to}.\n`
161
+ : "";
155
162
  // Resolve shell path: on Windows, use Git Bash; on macOS/Linux, use bash or zsh
156
163
  const shellPath = resolveShellPath();
157
164
  if (!shellPath) {
@@ -221,7 +228,7 @@ The working directory persists between commands. Try to maintain your current wo
221
228
  ].join("\n");
222
229
  return {
223
230
  success: true,
224
- content: backgroundMsg,
231
+ content: recoveryNotice + backgroundMsg,
225
232
  shortResult: `Background process ${taskId} started${outputPath ? ` → ${outputPath}` : ""}`,
226
233
  };
227
234
  }
@@ -387,9 +394,11 @@ The working directory persists between commands. Try to maintain your current wo
387
394
  const processedOutput = processToolResult(outputBuffer + (errorBuffer ? "\n" + errorBuffer : ""), BASH_MAX_OUTPUT_CHARS, "bash");
388
395
  resolve({
389
396
  success: false,
390
- content: processedOutput
391
- ? `${processedOutput}\n\n${reason}`
392
- : reason,
397
+ content: recoveryNotice
398
+ ? recoveryNotice + (processedOutput || reason)
399
+ : processedOutput
400
+ ? `${processedOutput}\n\n${reason}`
401
+ : reason,
393
402
  error: reason,
394
403
  });
395
404
  }
@@ -460,7 +469,8 @@ The working directory persists between commands. Try to maintain your current wo
460
469
  const exitCode = code ?? 0;
461
470
  const combinedOutput = outputBuffer + (errorBuffer ? "\n" + errorBuffer : "");
462
471
  // Prepend CWD change message to output if present
463
- const finalOutput = (cwdMessage ? cwdMessage + "\n" : "") +
472
+ const finalOutput = recoveryNotice +
473
+ (cwdMessage ? cwdMessage + "\n" : "") +
464
474
  (combinedOutput || `Command executed with exit code: ${exitCode}`);
465
475
  const content = processToolResult(finalOutput, BASH_MAX_OUTPUT_CHARS, "bash");
466
476
  const lines = combinedOutput.trim().split("\n");
@@ -490,7 +500,7 @@ The working directory persists between commands. Try to maintain your current wo
490
500
  resolve({
491
501
  success: false,
492
502
  content: "",
493
- error: `Failed to execute command: ${error.message}`,
503
+ error: `${recoveryNotice}Failed to execute command: ${error.message}`.trim(),
494
504
  });
495
505
  }
496
506
  });
@@ -131,6 +131,13 @@ export const grepTool = {
131
131
  }
132
132
  try {
133
133
  const workdir = context.workdir;
134
+ // If the session cwd was auto-recovered (e.g. the previous worktree
135
+ // directory was removed manually via `git worktree remove`), surface
136
+ // the notice in this tool's result so the model is aware of the switch.
137
+ const cwdRecovery = context.aiManager?.consumeCwdRecovery?.();
138
+ const recoveryNotice = cwdRecovery
139
+ ? `Note: working directory ${cwdRecovery.from} no longer exists; session working directory recovered to ${cwdRecovery.to}.\n`
140
+ : "";
134
141
  const rgArgs = [
135
142
  "--color=never",
136
143
  "--max-columns=500",
@@ -207,7 +214,7 @@ export const grepTool = {
207
214
  return {
208
215
  success: false,
209
216
  content: "",
210
- error: `ripgrep failed: ${result.stderr}`,
217
+ error: `${recoveryNotice}ripgrep failed: ${result.stderr}`.trim(),
211
218
  };
212
219
  }
213
220
  if (result.exitCode !== 0 && result.exitCode !== 1) {
@@ -217,7 +224,8 @@ export const grepTool = {
217
224
  if (!output) {
218
225
  return {
219
226
  success: true,
220
- content: "No matches found. Suggestion: specify the 'path' field to search in ignored or other directories (e.g., 'node_modules'), as the default search path is the current working directory and respects .gitignore.",
227
+ content: recoveryNotice +
228
+ "No matches found. Suggestion: specify the 'path' field to search in ignored or other directories (e.g., 'node_modules'), as the default search path is the current working directory and respects .gitignore.",
221
229
  shortResult: "No matches found",
222
230
  metadata: {
223
231
  numMatches: 0,
@@ -256,7 +264,7 @@ export const grepTool = {
256
264
  }
257
265
  return {
258
266
  success: true,
259
- content: finalOutput,
267
+ content: recoveryNotice + finalOutput,
260
268
  shortResult,
261
269
  metadata: {
262
270
  numMatches: totalMatches,
@@ -35,3 +35,6 @@ export * from "./cron.js";
35
35
  export * from "./telemetry.js";
36
36
  export * from "./auth.js";
37
37
  export * from "./workflow.js";
38
+ export type { SessionMetadata, SessionData } from "../services/session.js";
39
+ export type { ToolBlockUpdateCallbackParams } from "../utils/messageOperations.js";
40
+ export type { QueuedMessage } from "../managers/messageQueue.js";
@@ -88,4 +88,6 @@ export interface TaskNotificationBlock {
88
88
  status: "completed" | "failed" | "killed" | "aborted";
89
89
  summary: string;
90
90
  outputFile?: string;
91
+ /** Full final response of the task (e.g. a fork subagent's result). */
92
+ result?: string;
91
93
  }
@@ -20,7 +20,6 @@ import { WorkflowManager } from "../managers/workflowManager.js";
20
20
  import { MemoryRuleManager } from "../managers/MemoryRuleManager.js";
21
21
  import { ReversionManager } from "../managers/reversionManager.js";
22
22
  import { SubagentManager } from "../managers/subagentManager.js";
23
- import { ForkedAgentManager } from "../managers/forkedAgentManager.js";
24
23
  import { LiveConfigManager } from "../managers/liveConfigManager.js";
25
24
  import { ReversionService } from "../services/reversionService.js";
26
25
  import { cleanupMetaOnlySessions } from "../services/session.js";
@@ -245,8 +244,6 @@ export function setupAgentContainer(setupOptions) {
245
244
  stream,
246
245
  });
247
246
  container.register("SubagentManager", subagentManager);
248
- const forkedAgentManager = new ForkedAgentManager(container);
249
- container.register("ForkedAgentManager", forkedAgentManager);
250
247
  const aiManager = new AIManager(container, {
251
248
  callbacks: {
252
249
  ...callbacks,
@@ -112,6 +112,14 @@ export declare function cloneMessage(message: Message): Message;
112
112
  * Helper to format tool and token summary
113
113
  */
114
114
  export declare function formatToolTokenSummary(toolCount: number, tokens: number): string;
115
+ /**
116
+ * Fold a message list at the last compact boundary — returns only messages from
117
+ * the most recent compact summary forward. Mirrors what is sent to the LLM
118
+ * (convertMessagesForAPI stops at the last compact block), so the display layer
119
+ * matches the AI context. The session file keeps the full history; folding is
120
+ * display-only.
121
+ */
122
+ export declare function sliceFromLastCompact(messages: Message[]): Message[];
115
123
  /**
116
124
  * Extracts displayable text from a Message object, handling various block types.
117
125
  * Returns the first available content block.
@@ -124,5 +132,6 @@ export interface AddNotificationMessageParams {
124
132
  status: "completed" | "failed" | "killed" | "aborted";
125
133
  summary: string;
126
134
  outputFile?: string;
135
+ result?: string;
127
136
  }
128
- export declare const addNotificationMessageToMessages: ({ messages, taskId, taskType, status, summary, outputFile, }: AddNotificationMessageParams) => Message[];
137
+ export declare const addNotificationMessageToMessages: ({ messages, taskId, taskType, status, summary, outputFile, result, }: AddNotificationMessageParams) => Message[];
@@ -415,6 +415,23 @@ export function formatToolTokenSummary(toolCount, tokens) {
415
415
  summary += ")";
416
416
  return summary;
417
417
  }
418
+ /**
419
+ * Fold a message list at the last compact boundary — returns only messages from
420
+ * the most recent compact summary forward. Mirrors what is sent to the LLM
421
+ * (convertMessagesForAPI stops at the last compact block), so the display layer
422
+ * matches the AI context. The session file keeps the full history; folding is
423
+ * display-only.
424
+ */
425
+ export function sliceFromLastCompact(messages) {
426
+ let lastCompactIndex = -1;
427
+ for (let i = messages.length - 1; i >= 0; i--) {
428
+ if (messages[i].blocks?.some((b) => b.type === "compact")) {
429
+ lastCompactIndex = i;
430
+ break;
431
+ }
432
+ }
433
+ return lastCompactIndex >= 0 ? messages.slice(lastCompactIndex) : messages;
434
+ }
418
435
  /**
419
436
  * Extracts displayable text from a Message object, handling various block types.
420
437
  * Returns the first available content block.
@@ -435,7 +452,7 @@ export function getMessageContent(message) {
435
452
  }
436
453
  return "";
437
454
  }
438
- export const addNotificationMessageToMessages = ({ messages, taskId, taskType, status, summary, outputFile, }) => {
455
+ export const addNotificationMessageToMessages = ({ messages, taskId, taskType, status, summary, outputFile, result, }) => {
439
456
  const block = {
440
457
  type: "task_notification",
441
458
  taskId,
@@ -443,6 +460,7 @@ export const addNotificationMessageToMessages = ({ messages, taskId, taskType, s
443
460
  status,
444
461
  summary,
445
462
  ...(outputFile !== undefined && { outputFile }),
463
+ ...(result !== undefined && { result }),
446
464
  };
447
465
  const notificationMessage = {
448
466
  id: generateMessageId(),
@@ -5,6 +5,9 @@ export function taskNotificationToXml(block) {
5
5
  if (block.outputFile) {
6
6
  xml += `<output-file>${block.outputFile}</output-file>\n`;
7
7
  }
8
+ if (block.result) {
9
+ xml += `<result>${block.result}</result>\n`;
10
+ }
8
11
  xml += `<status>${block.status}</status>\n`;
9
12
  xml += `<summary>${block.summary}</summary>\n`;
10
13
  xml += `</task-notification>`;
@@ -25,6 +28,7 @@ export function parseTaskNotificationXml(xml) {
25
28
  return null;
26
29
  }
27
30
  const outputFile = extractTag(xml, "output-file") || undefined;
31
+ const result = extractTag(xml, "result") || undefined;
28
32
  return {
29
33
  type: "task_notification",
30
34
  taskId,
@@ -32,6 +36,7 @@ export function parseTaskNotificationXml(xml) {
32
36
  status,
33
37
  summary,
34
38
  ...(outputFile && { outputFile }),
39
+ ...(result && { result }),
35
40
  };
36
41
  }
37
42
  catch {
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Path to the ripgrep binary bundled in the vendor directory.
3
- * Uses findUpSync to locate the package root, working correctly even
4
- * when bundled (e.g. esbuild into a VS Code extension).
2
+ * Path to the ripgrep binary, provided by the @vscode/ripgrep dependency.
3
+ * The wrapper resolves the platform-specific binary package at import time
4
+ * via optionalDependencies + os/cpu filtering.
5
5
  */
6
- export declare const rgPath: string;
6
+ export { rgPath } from "@vscode/ripgrep";
@@ -1,29 +1,6 @@
1
- import path from "path";
2
- import process from "process";
3
- import { getPackageRoot } from "./configPaths.js";
4
1
  /**
5
- * Detect the current platform and architecture to find the correct bundled ripgrep binary.
2
+ * Path to the ripgrep binary, provided by the @vscode/ripgrep dependency.
3
+ * The wrapper resolves the platform-specific binary package at import time
4
+ * via optionalDependencies + os/cpu filtering.
6
5
  */
7
- function getPlatformKey() {
8
- const platform = process.platform;
9
- const arch = process.arch;
10
- if (platform === "darwin") {
11
- return arch === "arm64" ? "macos-aarch64" : "macos-x86_64";
12
- }
13
- else if (platform === "linux") {
14
- return arch === "arm64" ? "linux-aarch64" : "linux-x86_64";
15
- }
16
- else if (platform === "win32") {
17
- return arch === "arm64" ? "windows-aarch64" : "windows-x86_64";
18
- }
19
- throw new Error(`Unsupported platform: ${platform}-${arch}`);
20
- }
21
- const platformKey = getPlatformKey();
22
- const isWindows = platformKey.startsWith("windows");
23
- const binaryName = isWindows ? "rg.exe" : "rg";
24
- /**
25
- * Path to the ripgrep binary bundled in the vendor directory.
26
- * Uses findUpSync to locate the package root, working correctly even
27
- * when bundled (e.g. esbuild into a VS Code extension).
28
- */
29
- export const rgPath = path.join(getPackageRoot(), `vendor/ripgrep/${platformKey}/${binaryName}`);
6
+ export { rgPath } from "@vscode/ripgrep";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wave-agent-sdk",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "SDK for building AI-powered development tools and agents",
5
5
  "keywords": [
6
6
  "ai",
@@ -13,6 +13,22 @@
13
13
  "main": "dist/index.js",
14
14
  "types": "dist/index.d.ts",
15
15
  "type": "module",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "./types": {
22
+ "types": "./dist/types/index.d.ts",
23
+ "default": "./dist/types/index.js"
24
+ },
25
+ "./constants": {
26
+ "types": "./dist/constants/tools.d.ts",
27
+ "default": "./dist/constants/tools.js"
28
+ },
29
+ "./package.json": "./package.json",
30
+ "./*": "./*"
31
+ },
16
32
  "repository": {
17
33
  "type": "git",
18
34
  "url": "https://github.com/netease-lcap/wave-agent.git",
@@ -20,10 +36,6 @@
20
36
  },
21
37
  "files": [
22
38
  "dist",
23
- "src",
24
- "bin",
25
- "vendor",
26
- "scripts",
27
39
  "builtin",
28
40
  "README.md"
29
41
  ],
@@ -33,9 +45,10 @@
33
45
  "@opentelemetry/api-logs": "^0.217.0",
34
46
  "@opentelemetry/exporter-logs-otlp-http": "^0.217.0",
35
47
  "@opentelemetry/exporter-trace-otlp-http": "^0.217.0",
48
+ "@opentelemetry/resources": "^2.7.1",
36
49
  "@opentelemetry/sdk-logs": "^0.217.0",
37
- "@opentelemetry/sdk-node": "^0.217.0",
38
- "@opentelemetry/sdk-trace-node": "^2.7.1",
50
+ "@opentelemetry/sdk-trace-base": "^2.7.1",
51
+ "@vscode/ripgrep": "^1.18.0",
39
52
  "chokidar": "^4.0.3",
40
53
  "cron-parser": "^5.5.0",
41
54
  "find-up": "^8.0.0",
@@ -59,7 +72,6 @@
59
72
  },
60
73
  "license": "MIT",
61
74
  "scripts": {
62
- "postinstall": "node scripts/postinstall.js",
63
75
  "build": "rimraf dist && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
64
76
  "type-check": "tsc --noEmit --incremental",
65
77
  "watch": "tsc -p tsconfig.build.json --watch & tsc-alias -p tsconfig.build.json --watch",
package/bin/rg DELETED
@@ -1,79 +0,0 @@
1
- #!/usr/bin/env dotslash
2
-
3
- {
4
- "name": "rg",
5
- "platforms": {
6
- "macos-aarch64": {
7
- "size": 1787248,
8
- "hash": "blake3",
9
- "digest": "8d9942032585ea8ee805937634238d9aee7b210069f4703c88fbe568e26fb78a",
10
- "format": "tar.gz",
11
- "path": "ripgrep-14.1.1-aarch64-apple-darwin/rg",
12
- "providers": [
13
- {
14
- "url": "https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-aarch64-apple-darwin.tar.gz"
15
- }
16
- ]
17
- },
18
- "linux-aarch64": {
19
- "size": 2047405,
20
- "hash": "blake3",
21
- "digest": "0b670b8fa0a3df2762af2fc82cc4932f684ca4c02dbd1260d4f3133fd4b2a515",
22
- "format": "tar.gz",
23
- "path": "ripgrep-14.1.1-aarch64-unknown-linux-gnu/rg",
24
- "providers": [
25
- {
26
- "url": "https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-aarch64-unknown-linux-gnu.tar.gz"
27
- }
28
- ]
29
- },
30
- "macos-x86_64": {
31
- "size": 2082672,
32
- "hash": "blake3",
33
- "digest": "e9b862fc8da3127f92791f0ff6a799504154ca9d36c98bf3e60a81c6b1f7289e",
34
- "format": "tar.gz",
35
- "path": "ripgrep-14.1.1-x86_64-apple-darwin/rg",
36
- "providers": [
37
- {
38
- "url": "https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-x86_64-apple-darwin.tar.gz"
39
- }
40
- ]
41
- },
42
- "linux-x86_64": {
43
- "size": 2566310,
44
- "hash": "blake3",
45
- "digest": "f73cca4e54d78c31f832c7f6e2c0b4db8b04fa3eaa747915727d570893dbee76",
46
- "format": "tar.gz",
47
- "path": "ripgrep-14.1.1-x86_64-unknown-linux-musl/rg",
48
- "providers": [
49
- {
50
- "url": "https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-x86_64-unknown-linux-musl.tar.gz"
51
- }
52
- ]
53
- },
54
- "windows-x86_64": {
55
- "size": 2058893,
56
- "hash": "blake3",
57
- "digest": "a8ce1a6fed4f8093ee997e57f33254e94b2cd18e26358b09db599c89882eadbd",
58
- "format": "zip",
59
- "path": "ripgrep-14.1.1-x86_64-pc-windows-msvc/rg.exe",
60
- "providers": [
61
- {
62
- "url": "https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-x86_64-pc-windows-msvc.zip"
63
- }
64
- ]
65
- },
66
- "windows-aarch64": {
67
- "size": 1667740,
68
- "hash": "blake3",
69
- "digest": "47b971a8c4fca1d23a4e7c19bd4d88465ebc395598458133139406d3bf85f3fa",
70
- "format": "zip",
71
- "path": "rg.exe",
72
- "providers": [
73
- {
74
- "url": "https://github.com/microsoft/ripgrep-prebuilt/releases/download/v13.0.0-13/ripgrep-v13.0.0-13-aarch64-pc-windows-msvc.zip"
75
- }
76
- ]
77
- }
78
- }
79
- }
@@ -1,50 +0,0 @@
1
- import * as fs from "fs";
2
- import type { Message } from "../types/index.js";
3
- import { Container } from "../utils/container.js";
4
- import { type SubagentInstance } from "./subagentManager.js";
5
- import type { PermissionMode } from "../types/permissions.js";
6
- export interface ForkedAgentEntry {
7
- id: string;
8
- instance: SubagentInstance;
9
- logPath: string;
10
- logStream?: fs.WriteStream;
11
- status: "running" | "completed" | "failed";
12
- }
13
- export interface ForkedAgentManagerCallbacks {
14
- onForkedAgentStatusChange?: (entries: ForkedAgentEntry[]) => void;
15
- }
16
- export declare class ForkedAgentManager {
17
- private container;
18
- private activeForks;
19
- private inFlightPromises;
20
- private callbacks;
21
- constructor(container: Container, options?: {
22
- callbacks?: ForkedAgentManagerCallbacks;
23
- });
24
- private get subagentManager();
25
- /**
26
- * Creates a forked subagent with conversation history and executes it asynchronously (fire-and-forget).
27
- * Does NOT interact with BackgroundTaskManager.
28
- */
29
- forkAndExecute(subagentType: string, messages: Message[], parameters: {
30
- description: string;
31
- allowedTools?: string[];
32
- model?: string;
33
- permissionModeOverride?: PermissionMode;
34
- maxTurns?: number;
35
- }, prompt: string): Promise<string>;
36
- private executeFork;
37
- /**
38
- * Abort a running forked agent.
39
- */
40
- stop(id: string): boolean;
41
- /**
42
- * Stop all running forked agents, wait for in-flight executions to settle, and clear the map.
43
- */
44
- cleanup(): Promise<void>;
45
- /**
46
- * Returns list of active forked agents.
47
- */
48
- getActiveForks(): ForkedAgentEntry[];
49
- private notifyChange;
50
- }