@lobu/worker 7.0.0 → 7.2.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 (84) hide show
  1. package/dist/core/error-handler.d.ts +0 -4
  2. package/dist/core/error-handler.d.ts.map +1 -1
  3. package/dist/core/error-handler.js +4 -15
  4. package/dist/core/error-handler.js.map +1 -1
  5. package/dist/core/types.d.ts +19 -19
  6. package/dist/core/types.d.ts.map +1 -1
  7. package/dist/core/types.js +0 -4
  8. package/dist/core/types.js.map +1 -1
  9. package/dist/core/workspace.d.ts +2 -11
  10. package/dist/core/workspace.d.ts.map +1 -1
  11. package/dist/core/workspace.js +14 -36
  12. package/dist/core/workspace.js.map +1 -1
  13. package/dist/embedded/just-bash-bootstrap.d.ts.map +1 -1
  14. package/dist/embedded/just-bash-bootstrap.js +34 -4
  15. package/dist/embedded/just-bash-bootstrap.js.map +1 -1
  16. package/dist/embedded/mcp-cli-commands.d.ts.map +1 -1
  17. package/dist/embedded/mcp-cli-commands.js +3 -38
  18. package/dist/embedded/mcp-cli-commands.js.map +1 -1
  19. package/dist/gateway/sse-client.d.ts.map +1 -1
  20. package/dist/gateway/sse-client.js +72 -10
  21. package/dist/gateway/sse-client.js.map +1 -1
  22. package/dist/gateway/types.d.ts +2 -0
  23. package/dist/gateway/types.d.ts.map +1 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +7 -24
  26. package/dist/index.js.map +1 -1
  27. package/dist/instructions/builder.d.ts.map +1 -1
  28. package/dist/instructions/builder.js +2 -1
  29. package/dist/instructions/builder.js.map +1 -1
  30. package/dist/openclaw/plugin-loader.d.ts.map +1 -1
  31. package/dist/openclaw/plugin-loader.js +8 -19
  32. package/dist/openclaw/plugin-loader.js.map +1 -1
  33. package/dist/openclaw/processor.d.ts.map +1 -1
  34. package/dist/openclaw/processor.js +2 -0
  35. package/dist/openclaw/processor.js.map +1 -1
  36. package/dist/openclaw/sandbox-leak.d.ts.map +1 -1
  37. package/dist/openclaw/sandbox-leak.js +1 -6
  38. package/dist/openclaw/sandbox-leak.js.map +1 -1
  39. package/dist/openclaw/session-context.d.ts.map +1 -1
  40. package/dist/openclaw/session-context.js +3 -0
  41. package/dist/openclaw/session-context.js.map +1 -1
  42. package/dist/openclaw/tool-policy.d.ts.map +1 -1
  43. package/dist/openclaw/tool-policy.js +5 -11
  44. package/dist/openclaw/tool-policy.js.map +1 -1
  45. package/dist/openclaw/transcript-snapshot.d.ts +88 -0
  46. package/dist/openclaw/transcript-snapshot.d.ts.map +1 -0
  47. package/dist/openclaw/transcript-snapshot.js +223 -0
  48. package/dist/openclaw/transcript-snapshot.js.map +1 -0
  49. package/dist/openclaw/worker.d.ts +14 -0
  50. package/dist/openclaw/worker.d.ts.map +1 -1
  51. package/dist/openclaw/worker.js +147 -10
  52. package/dist/openclaw/worker.js.map +1 -1
  53. package/dist/server.d.ts.map +1 -1
  54. package/dist/server.js +3 -40
  55. package/dist/server.js.map +1 -1
  56. package/dist/shared/audio-provider-suggestions.d.ts.map +1 -1
  57. package/dist/shared/audio-provider-suggestions.js +4 -6
  58. package/dist/shared/audio-provider-suggestions.js.map +1 -1
  59. package/dist/shared/tool-implementations.d.ts.map +1 -1
  60. package/dist/shared/tool-implementations.js +62 -24
  61. package/dist/shared/tool-implementations.js.map +1 -1
  62. package/package.json +2 -2
  63. package/src/__tests__/processor-harden.test.ts +6 -16
  64. package/src/__tests__/sse-client.test.ts +99 -0
  65. package/src/__tests__/transcript-snapshot.test.ts +275 -0
  66. package/src/core/error-handler.ts +5 -20
  67. package/src/core/types.ts +19 -35
  68. package/src/core/workspace.ts +22 -45
  69. package/src/embedded/just-bash-bootstrap.ts +36 -4
  70. package/src/embedded/mcp-cli-commands.ts +9 -6
  71. package/src/gateway/sse-client.ts +87 -22
  72. package/src/gateway/types.ts +15 -0
  73. package/src/index.ts +8 -26
  74. package/src/instructions/builder.ts +2 -3
  75. package/src/openclaw/plugin-loader.ts +15 -19
  76. package/src/openclaw/processor.ts +1 -0
  77. package/src/openclaw/sandbox-leak.ts +1 -6
  78. package/src/openclaw/session-context.ts +3 -0
  79. package/src/openclaw/tool-policy.ts +5 -12
  80. package/src/openclaw/transcript-snapshot.ts +238 -0
  81. package/src/openclaw/worker.ts +167 -13
  82. package/src/server.ts +1 -5
  83. package/src/shared/audio-provider-suggestions.ts +4 -6
  84. package/src/shared/tool-implementations.ts +57 -16
@@ -285,17 +285,30 @@ export async function uploadUserFile(
285
285
  const formDataBuffer = await formDataToBuffer(formData);
286
286
  const fdHeaders = formData.getHeaders();
287
287
 
288
- const response = await fetch(`${gw.gatewayUrl}/internal/files/upload`, {
289
- method: "POST",
290
- headers: {
291
- Authorization: `Bearer ${gw.workerToken}`,
292
- "X-Channel-Id": gw.channelId,
293
- "X-Conversation-Id": gw.conversationId,
294
- ...fdHeaders,
295
- "Content-Length": formDataBuffer.length.toString(),
296
- },
297
- body: formDataBuffer,
298
- });
288
+ let response: Response;
289
+ try {
290
+ response = await fetch(`${gw.gatewayUrl}/internal/files/upload`, {
291
+ method: "POST",
292
+ headers: {
293
+ Authorization: `Bearer ${gw.workerToken}`,
294
+ "X-Channel-Id": gw.channelId,
295
+ "X-Conversation-Id": gw.conversationId,
296
+ ...fdHeaders,
297
+ "Content-Length": formDataBuffer.length.toString(),
298
+ },
299
+ body: formDataBuffer,
300
+ // A stalled gateway upload must not wedge the agent turn forever —
301
+ // a 5-minute ceiling is well above any legitimate file delivery.
302
+ signal: AbortSignal.timeout(300_000),
303
+ });
304
+ } catch (err) {
305
+ if (err instanceof Error && err.name === "TimeoutError") {
306
+ return textResult(
307
+ `Error: Failed to show file to user: upload timed out`
308
+ );
309
+ }
310
+ throw err;
311
+ }
299
312
 
300
313
  if (!response.ok) {
301
314
  const error = await response.text();
@@ -582,9 +595,9 @@ async function uploadGeneratedFile(
582
595
  const formDataBuffer = await formDataToBuffer(formData);
583
596
  const fdHeaders = formData.getHeaders();
584
597
 
585
- const uploadResponse = await fetch(
586
- `${gw.gatewayUrl}/internal/files/upload`,
587
- {
598
+ let uploadResponse: Response;
599
+ try {
600
+ uploadResponse = await fetch(`${gw.gatewayUrl}/internal/files/upload`, {
588
601
  method: "POST",
589
602
  headers: {
590
603
  Authorization: `Bearer ${gw.workerToken}`,
@@ -595,8 +608,14 @@ async function uploadGeneratedFile(
595
608
  ...extraHeaders,
596
609
  },
597
610
  body: formDataBuffer,
611
+ signal: AbortSignal.timeout(300_000),
612
+ });
613
+ } catch (err) {
614
+ if (err instanceof Error && err.name === "TimeoutError") {
615
+ return textResult(`Generated content but upload timed out`);
598
616
  }
599
- );
617
+ throw err;
618
+ }
600
619
 
601
620
  if (!uploadResponse.ok) {
602
621
  const uploadError = await uploadResponse.text();
@@ -638,6 +657,7 @@ export async function generateImage(
638
657
  `${gw.gatewayUrl}/internal/images/capabilities`,
639
658
  {
640
659
  headers: { Authorization: `Bearer ${gw.workerToken}` },
660
+ signal: AbortSignal.timeout(30_000),
641
661
  }
642
662
  );
643
663
 
@@ -668,6 +688,9 @@ export async function generateImage(
668
688
  background: args.background,
669
689
  format: args.format,
670
690
  }),
691
+ // Image gen can take a while at high quality, but never minutes — cap
692
+ // the wait so a stalled upstream provider doesn't hang the agent turn.
693
+ signal: AbortSignal.timeout(120_000),
671
694
  });
672
695
 
673
696
  if (!response.ok) {
@@ -758,6 +781,7 @@ export async function generateAudio(
758
781
  voice: args.voice,
759
782
  speed: args.speed,
760
783
  }),
784
+ signal: AbortSignal.timeout(120_000),
761
785
  });
762
786
 
763
787
  if (!response.ok) {
@@ -915,11 +939,28 @@ export async function callMcpTool(
915
939
  throw err;
916
940
  }
917
941
 
918
- const data = (await response.json()) as {
942
+ // MCP proxy returns JSON on success, but a misbehaving upstream (502
943
+ // HTML, plain-text 500, empty body) would otherwise crash the tool call
944
+ // with "Unexpected token < in JSON". Treat parse failure as a transport
945
+ // error message instead of letting it bubble out as an unhandled throw.
946
+ let data: {
919
947
  content?: Array<{ type: string; text: string }>;
920
948
  error?: string;
921
949
  isError?: boolean;
922
950
  };
951
+ try {
952
+ data = (await response.json()) as {
953
+ content?: Array<{ type: string; text: string }>;
954
+ error?: string;
955
+ isError?: boolean;
956
+ };
957
+ } catch (parseErr) {
958
+ const parseMsg =
959
+ parseErr instanceof Error ? parseErr.message : String(parseErr);
960
+ return textResult(
961
+ `Error: ${toolName} returned a non-JSON response (status ${response.status}): ${parseMsg}`
962
+ );
963
+ }
923
964
 
924
965
  if (!response.ok || data.isError) {
925
966
  const contentText = data.content