@sema-agent/core 1.279.0 → 1.280.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 (76) hide show
  1. package/dist/agents/subagent.d.ts +12 -0
  2. package/dist/agents/subagent.d.ts.map +1 -1
  3. package/dist/agents/subagent.js +221 -19
  4. package/dist/agents/subagent.js.map +1 -1
  5. package/dist/bin/sema-tb.d.ts +10 -0
  6. package/dist/bin/sema-tb.d.ts.map +1 -1
  7. package/dist/bin/sema-tb.js +81 -10
  8. package/dist/bin/sema-tb.js.map +1 -1
  9. package/dist/core/background-shell.d.ts +2 -0
  10. package/dist/core/background-shell.d.ts.map +1 -1
  11. package/dist/core/background-shell.js.map +1 -1
  12. package/dist/core/context-guard.d.ts +2 -0
  13. package/dist/core/context-guard.d.ts.map +1 -1
  14. package/dist/core/context-guard.js +10 -0
  15. package/dist/core/context-guard.js.map +1 -1
  16. package/dist/core/mcp.d.ts +4 -0
  17. package/dist/core/mcp.d.ts.map +1 -1
  18. package/dist/core/mcp.js +189 -32
  19. package/dist/core/mcp.js.map +1 -1
  20. package/dist/core/runner/call-cap.d.ts +4 -0
  21. package/dist/core/runner/call-cap.d.ts.map +1 -1
  22. package/dist/core/runner/call-cap.js +15 -1
  23. package/dist/core/runner/call-cap.js.map +1 -1
  24. package/dist/core/runner/prepare-task.d.ts.map +1 -1
  25. package/dist/core/runner/prepare-task.js +5 -3
  26. package/dist/core/runner/prepare-task.js.map +1 -1
  27. package/dist/core/runner/runtask.d.ts.map +1 -1
  28. package/dist/core/runner/runtask.js +28 -20
  29. package/dist/core/runner/runtask.js.map +1 -1
  30. package/dist/core/session-reconcile.d.ts +1 -1
  31. package/dist/core/session-reconcile.d.ts.map +1 -1
  32. package/dist/core/session-reconcile.js +7 -2
  33. package/dist/core/session-reconcile.js.map +1 -1
  34. package/dist/core/task-notification.d.ts +2 -0
  35. package/dist/core/task-notification.d.ts.map +1 -1
  36. package/dist/core/task-notification.js.map +1 -1
  37. package/dist/core/task-registry.d.ts +1 -0
  38. package/dist/core/task-registry.d.ts.map +1 -1
  39. package/dist/core/task-registry.js +184 -55
  40. package/dist/core/task-registry.js.map +1 -1
  41. package/dist/core/types.d.ts.map +1 -1
  42. package/dist/engine/execution-env/node-execution-env.d.ts.map +1 -1
  43. package/dist/engine/execution-env/node-execution-env.js +17 -0
  44. package/dist/engine/execution-env/node-execution-env.js.map +1 -1
  45. package/dist/engine/harness/types.d.ts.map +1 -1
  46. package/dist/engine/harness/types.js.map +1 -1
  47. package/dist/engine/loop/agent-loop.js +15 -5
  48. package/dist/engine/loop/agent-loop.js.map +1 -1
  49. package/dist/index.d.ts +1 -1
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +1 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/orchestration/workflow.d.ts +19 -3
  54. package/dist/orchestration/workflow.d.ts.map +1 -1
  55. package/dist/orchestration/workflow.js +61 -11
  56. package/dist/orchestration/workflow.js.map +1 -1
  57. package/dist/tools/fs/index.d.ts +1 -0
  58. package/dist/tools/fs/index.d.ts.map +1 -1
  59. package/dist/tools/fs/index.js +137 -35
  60. package/dist/tools/fs/index.js.map +1 -1
  61. package/dist/tools/fs/pdf.d.ts +5 -0
  62. package/dist/tools/fs/pdf.d.ts.map +1 -1
  63. package/dist/tools/fs/pdf.js +58 -11
  64. package/dist/tools/fs/pdf.js.map +1 -1
  65. package/dist/tools/fs/safety.d.ts +1 -0
  66. package/dist/tools/fs/safety.d.ts.map +1 -1
  67. package/dist/tools/fs/safety.js +1 -0
  68. package/dist/tools/fs/safety.js.map +1 -1
  69. package/dist/tools/fs/search.d.ts +13 -0
  70. package/dist/tools/fs/search.d.ts.map +1 -1
  71. package/dist/tools/fs/search.js +58 -16
  72. package/dist/tools/fs/search.js.map +1 -1
  73. package/dist/tools/web.d.ts.map +1 -1
  74. package/dist/tools/web.js +141 -28
  75. package/dist/tools/web.js.map +1 -1
  76. package/package.json +1 -1
@@ -18,6 +18,8 @@ export interface BackgroundPoll {
18
18
  truncated?: boolean;
19
19
  bytesFromStart?: number;
20
20
  bytesDroppedBeforeCursor?: number;
21
+ timedOut?: boolean;
22
+ timeoutSec?: number;
21
23
  }
22
24
  export interface BackgroundShellCapability {
23
25
  readonly backgroundCapabilities: {
@@ -1 +1 @@
1
- {"version":3,"file":"background-shell.d.ts","sourceRoot":"","sources":["../../src/core/background-shell.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAM5F,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAGnF,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAM/E,MAAM,MAAM,wBAAwB,GAChC,aAAa,GACb,WAAW,GACX,cAAc,GACd,gBAAgB,GAChB,SAAS,GACT,IAAI,CAAC;AAGT,qBAAa,oBAAqB,SAAQ,KAAK;IAE3C,QAAQ,CAAC,IAAI,EAAE,wBAAwB;IAEvC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;gBAFf,IAAI,EAAE,wBAAwB,EACvC,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,OAAO,YAAA;CAK3B;AAQD,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,uBAAuB,EAAE,UAAU,GAAG,UAAU,GAAG,aAAa,CAAC,CAAC;AAG5G,MAAM,WAAW,cAAc;IAE7B,MAAM,EAAE,MAAM,CAAC;IAEf,MAAM,EAAE,MAAM,CAAC;IAEf,MAAM,EAAE,qBAAqB,CAAC;IAE9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAMlB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAMD,MAAM,WAAW,yBAAyB;IAExC,QAAQ,CAAC,sBAAsB,EAAE;QAE/B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAE5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAE/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QAErC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QAGjC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAQlC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;KAC9C,CAAC;IAMF,eAAe,CACb,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,iBAAiB,CAAA;KAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAQzE,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAGlG,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAYxF,uBAAuB,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAQD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,GAAG,IAAI,YAAY,GAAG,yBAAyB,CAWrG"}
1
+ {"version":3,"file":"background-shell.d.ts","sourceRoot":"","sources":["../../src/core/background-shell.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAM5F,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAGnF,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAM/E,MAAM,MAAM,wBAAwB,GAChC,aAAa,GACb,WAAW,GACX,cAAc,GACd,gBAAgB,GAChB,SAAS,GACT,IAAI,CAAC;AAGT,qBAAa,oBAAqB,SAAQ,KAAK;IAE3C,QAAQ,CAAC,IAAI,EAAE,wBAAwB;IAEvC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;gBAFf,IAAI,EAAE,wBAAwB,EACvC,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,OAAO,YAAA;CAK3B;AAQD,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,uBAAuB,EAAE,UAAU,GAAG,UAAU,GAAG,aAAa,CAAC,CAAC;AAG5G,MAAM,WAAW,cAAc;IAE7B,MAAM,EAAE,MAAM,CAAC;IAEf,MAAM,EAAE,MAAM,CAAC;IAEf,MAAM,EAAE,qBAAqB,CAAC;IAE9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAMlB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAIlC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAGnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD,MAAM,WAAW,yBAAyB;IAExC,QAAQ,CAAC,sBAAsB,EAAE;QAE/B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAE5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAE/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QAErC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QAGjC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAQlC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;KAC9C,CAAC;IAMF,eAAe,CACb,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,iBAAiB,CAAA;KAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAQzE,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAGlG,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAYxF,uBAAuB,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAQD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,GAAG,IAAI,YAAY,GAAG,yBAAyB,CAWrG"}
@@ -1 +1 @@
1
- {"version":3,"file":"background-shell.js","sourceRoot":"","sources":["../../src/core/background-shell.ts"],"names":[],"mappings":"AAuCA,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAElC;IAEA;IAHX,YACW,IAA8B,EACvC,OAAe,EACN,KAAe;QAExB,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,SAAI,GAAJ,IAAI,CAA0B;QAE9B,UAAK,GAAL,KAAK,CAAU;QAGxB,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAmGD,MAAM,UAAU,kBAAkB,CAAC,GAAiB;IAClD,MAAM,CAAC,GAAG,GAAyC,CAAC;IACpD,OAAO,CACL,OAAO,CAAC,CAAC,eAAe,KAAK,UAAU;QACvC,OAAO,CAAC,CAAC,cAAc,KAAK,UAAU;QACtC,OAAO,CAAC,CAAC,cAAc,KAAK,UAAU;QACtC,OAAO,CAAC,CAAC,uBAAuB,KAAK,UAAU;QAC/C,OAAO,CAAC,CAAC,sBAAsB,KAAK,QAAQ;QAC5C,CAAC,CAAC,sBAAsB,KAAK,IAAI;QACjC,CAAC,CAAC,sBAAsB,CAAC,SAAS,KAAK,IAAI,CAC5C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"background-shell.js","sourceRoot":"","sources":["../../src/core/background-shell.ts"],"names":[],"mappings":"AAuCA,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAElC;IAEA;IAHX,YACW,IAA8B,EACvC,OAAe,EACN,KAAe;QAExB,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,SAAI,GAAJ,IAAI,CAA0B;QAE9B,UAAK,GAAL,KAAK,CAAU;QAGxB,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AA0GD,MAAM,UAAU,kBAAkB,CAAC,GAAiB;IAClD,MAAM,CAAC,GAAG,GAAyC,CAAC;IACpD,OAAO,CACL,OAAO,CAAC,CAAC,eAAe,KAAK,UAAU;QACvC,OAAO,CAAC,CAAC,cAAc,KAAK,UAAU;QACtC,OAAO,CAAC,CAAC,cAAc,KAAK,UAAU;QACtC,OAAO,CAAC,CAAC,uBAAuB,KAAK,UAAU;QAC/C,OAAO,CAAC,CAAC,sBAAsB,KAAK,QAAQ;QAC5C,CAAC,CAAC,sBAAsB,KAAK,IAAI;QACjC,CAAC,CAAC,sBAAsB,CAAC,SAAS,KAAK,IAAI,CAC5C,CAAC;AACJ,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import type { AgentMessage } from "../internal/harness.js";
2
2
  import type { Model } from "../internal/llm.js";
3
3
  export declare function trimToBudget(messages: AgentMessage[], budgetTokens: number, anchoredTotalTokens?: number, charsPerToken?: number): AgentMessage[];
4
+ export declare const CONTEXT_TRIM_NOTICE: string;
5
+ export declare function insertTrimNotice(trimmed: AgentMessage[]): AgentMessage[];
4
6
  export declare function dropOrphanToolResults(messages: AgentMessage[]): {
5
7
  messages: AgentMessage[];
6
8
  dropped: Array<{
@@ -1 +1 @@
1
- {"version":3,"file":"context-guard.d.ts","sourceRoot":"","sources":["../../src/core/context-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA8BhD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,YAAY,EAAE,EACxB,YAAY,EAAE,MAAM,EACpB,mBAAmB,CAAC,EAAE,MAAM,EAC5B,aAAa,CAAC,EAAE,MAAM,GACrB,YAAY,EAAE,CA4FhB;AAYD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG;IAC/D,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3F,CAkCA;AAGD,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAGhD"}
1
+ {"version":3,"file":"context-guard.d.ts","sourceRoot":"","sources":["../../src/core/context-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA8BhD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,YAAY,EAAE,EACxB,YAAY,EAAE,MAAM,EACpB,mBAAmB,CAAC,EAAE,MAAM,EAC5B,aAAa,CAAC,EAAE,MAAM,GACrB,YAAY,EAAE,CA4FhB;AASD,eAAO,MAAM,mBAAmB,QAG8C,CAAC;AAQ/E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAKxE;AAYD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG;IAC/D,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3F,CAkCA;AAGD,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAGhD"}
@@ -65,6 +65,16 @@ export function trimToBudget(messages, budgetTokens, anchoredTotalTokens, charsP
65
65
  const keptTail = new Set(nonSummary.slice(start));
66
66
  return messages.filter((m) => isSummary(m) || keptTail.has(m));
67
67
  }
68
+ export const CONTEXT_TRIM_NOTICE = "[Note: earlier messages were omitted from this request to fit the context window — the full " +
69
+ "history is preserved in the session. If an earlier instruction, constraint, or detail seems to " +
70
+ "be missing, it may be in the omitted portion; say so instead of guessing.]";
71
+ export function insertTrimNotice(trimmed) {
72
+ const notice = { role: "user", content: CONTEXT_TRIM_NOTICE, timestamp: 0 };
73
+ let at = 0;
74
+ while (at < trimmed.length && isSummary(trimmed[at]))
75
+ at++;
76
+ return [...trimmed.slice(0, at), notice, ...trimmed.slice(at)];
77
+ }
68
78
  export function dropOrphanToolResults(messages) {
69
79
  const seenCallIds = new Set();
70
80
  let orphanAt = -1;
@@ -1 +1 @@
1
- {"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../src/core/context-guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../src/core/context-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxG,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAG/D,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B,SAAS,SAAS,CAAC,CAAe;IAGhC,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,mBAAmB,CAAC;AAChD,CAAC;AAoBD,MAAM,UAAU,YAAY,CAC1B,QAAwB,EACxB,YAAoB,EACpB,mBAA4B,EAC5B,aAAsB;IAEtB,MAAM,GAAG,GAAG,aAAa,IAAI,uBAAuB,CAAC;IACrD,MAAM,QAAQ,GAAG,mBAAmB,KAAK,SAAS,CAAC;IACnD,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,eAAe,IAAI,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAoB,CAAC,CAAC,CAAC,eAAe,CAAC;IAChE,IAAI,KAAK,IAAI,YAAY,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAGD,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAG9F,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,aAAa,IAAI,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAKD,MAAM,UAAU,GAAmB,EAAE,CAAC;IACtC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QACrC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,YAAY,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,iBAAiB,GAAG,KAAK,GAAG,YAAY,CAAC;IAC/C,IAAI,KAAa,CAAC;IAClB,IAAI,QAAQ,IAAI,YAAY,IAAI,iBAAiB,EAAE,CAAC;QAMlD,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QAIN,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,iBAAiB,CAAC,CAAC;QACjE,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,GAAG,GAAG,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;gBAClD,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,MAAM;YACR,CAAC;YACD,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IAGD,OAAO,KAAK,GAAG,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACpE,KAAK,EAAE,CAAC;IACV,CAAC;IACD,IAAI,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QAa/B,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,OAAO,KAAK,GAAG,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACpD,KAAK,EAAE,CAAC;QACV,CAAC;QACD,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACpC,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAIlD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AASD,MAAM,CAAC,MAAM,mBAAmB,GAC9B,8FAA8F;IAC9F,iGAAiG;IACjG,4EAA4E,CAAC;AAQ/E,MAAM,UAAU,gBAAgB,CAAC,OAAuB;IACtD,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAkB,CAAC;IAC5F,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAAE,EAAE,EAAE,CAAC;IAC3D,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAYD,MAAM,UAAU,qBAAqB,CAAC,QAAwB;IAI5D,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAA4F,CAAC;QACjH,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,EAAE,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ;oBAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3E,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;IACD,MAAM,OAAO,GAAqF,EAAE,CAAC;IACrG,MAAM,GAAG,GAAmB,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CACnC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,QAAQ,CAAC,CAAC,CAAuB,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC;IACtG,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAA4F,CAAC;QACjH,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,EAAE,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ;oBAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YACtH,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC;AAGD,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,CAAC;IAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC;AAC7C,CAAC"}
@@ -38,6 +38,10 @@ export interface McpServerStatus {
38
38
  export declare const MCP_PREFIX = "mcp__";
39
39
  export declare function resolveMcpDeclaredResultSize(meta: Record<string, unknown> | undefined): number | undefined;
40
40
  export declare function gateMcpOutput(content: Array<TextContent | ImageContent>, limitTokens?: number): Array<TextContent | ImageContent>;
41
+ export declare function truncateMcpErrorText(s: string): string;
42
+ export declare const MCP_TOOL_TIMEOUT_DEFAULT_MS = 100000000;
43
+ export declare function mcpToolTimeoutMs(): number;
44
+ export declare function mcpToolTotalTimeoutMs(perCallMs: number): number;
41
45
  export declare function normalizeMcpName(name: string): string;
42
46
  export declare const MCP_IMAGE_MAX_BASE64: number;
43
47
  export declare const IMAGE_TARGET_RAW_SIZE: number;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/core/mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/core/mcp.ts"],"names":[],"mappings":"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"}
package/dist/core/mcp.js CHANGED
@@ -63,6 +63,77 @@ export function gateMcpOutput(content, limitTokens = mcpMaxOutputTokens()) {
63
63
  gated.push({ type: "text", text: mcpTruncationNote(limitTokens) });
64
64
  return gated;
65
65
  }
66
+ const MCP_ERROR_HEAD_CHARS = 8_000;
67
+ const MCP_ERROR_TAIL_CHARS = 2_000;
68
+ export function truncateMcpErrorText(s) {
69
+ const max = MCP_ERROR_HEAD_CHARS + MCP_ERROR_TAIL_CHARS;
70
+ if (s.length <= max)
71
+ return s;
72
+ const removed = s.length - max;
73
+ return `${s.slice(0, MCP_ERROR_HEAD_CHARS)}\n\n... [${removed} characters truncated] ...\n\n${s.slice(s.length - MCP_ERROR_TAIL_CHARS)}`;
74
+ }
75
+ export const MCP_TOOL_TIMEOUT_DEFAULT_MS = 100_000_000;
76
+ function parseEnvMs(name) {
77
+ const raw = process.env[name];
78
+ if (!raw)
79
+ return undefined;
80
+ const n = parseInt(raw, 10);
81
+ return Number.isFinite(n) && n > 0 ? n : undefined;
82
+ }
83
+ export function mcpToolTimeoutMs() {
84
+ return parseEnvMs("MCP_TOOL_TIMEOUT") ?? MCP_TOOL_TIMEOUT_DEFAULT_MS;
85
+ }
86
+ export function mcpToolTotalTimeoutMs(perCallMs) {
87
+ return parseEnvMs("MCP_TOOL_TIMEOUT_TOTAL") ?? perCallMs;
88
+ }
89
+ function mcpStartupTimeoutMs() {
90
+ return parseEnvMs("MCP_TIMEOUT");
91
+ }
92
+ function isTransportLost(err) {
93
+ if (err instanceof McpError && err.code === ErrorCode.ConnectionClosed)
94
+ return true;
95
+ return err instanceof Error && /not connected|connection closed/i.test(err.message);
96
+ }
97
+ function writeEffectWarning(writeEffect) {
98
+ return writeEffect
99
+ ? " This tool is write-capable: treat its side effects as POSSIBLY APPLIED and verify the actual state before retrying."
100
+ : "";
101
+ }
102
+ function rethrowHonestMcpError(err, ctx) {
103
+ if (ctx.signal?.aborted)
104
+ throw err;
105
+ const serverLabel = inlineUntrusted(ctx.server);
106
+ if (err instanceof McpError && err.code === ErrorCode.RequestTimeout) {
107
+ const data = err.data;
108
+ const totalMs = typeof data?.maxTotalTimeout === "number" ? data.maxTotalTimeout : undefined;
109
+ const e = new Error(totalMs !== undefined
110
+ ? `${ctx.what} on MCP server "${serverLabel}" exceeded its total time ceiling of ${totalMs}ms (the call stayed alive — e.g. via progress notifications — but ran past the total wall-clock budget). The client stopped waiting, but the server may still be executing the request — the outcome is unknown.${writeEffectWarning(ctx.writeEffect)} (Set the MCP_TOOL_TIMEOUT_TOTAL environment variable (ms) to change this ceiling; MCP_TOOL_TIMEOUT only tunes the idle timeout, currently ${ctx.timeoutMs}ms.)`
111
+ : `${ctx.what} on MCP server "${serverLabel}" timed out after ${ctx.timeoutMs}ms. The client stopped waiting, but the server may still be executing the request — the outcome is unknown.${writeEffectWarning(ctx.writeEffect)} (Set the MCP_TOOL_TIMEOUT environment variable (ms) to change this limit.)`, { cause: err });
112
+ e.errorKind = "timeout";
113
+ e.details =
114
+ totalMs !== undefined
115
+ ? { timedOut: true, timeoutMs: totalMs, totalTimeout: true, server: ctx.server }
116
+ : { timedOut: true, timeoutMs: ctx.timeoutMs, server: ctx.server };
117
+ throw e;
118
+ }
119
+ if (isTransportLost(err)) {
120
+ const e = new Error(`The connection to MCP server "${serverLabel}" was lost while ${ctx.what} was in flight. The request may or may not have executed on the server — the outcome is unknown.${writeEffectWarning(ctx.writeEffect)}`, { cause: err });
121
+ e.errorKind = "transport_lost";
122
+ e.details = { transportLost: true, server: ctx.server };
123
+ throw e;
124
+ }
125
+ if (ctx.attributeServer) {
126
+ const msg = err instanceof Error ? err.message : String(err);
127
+ throw new Error(`${ctx.what} on MCP server "${serverLabel}" failed. The server's error text follows as external/untrusted data:\n${delimitUntrusted(`${ctx.server} error`, truncateMcpErrorText(msg))}`, { cause: err });
128
+ }
129
+ throw err;
130
+ }
131
+ function throwDeadServer(server, what) {
132
+ const e = new Error(`MCP server "${inlineUntrusted(server)}" is disconnected (its transport closed earlier in this task). ${what} was not attempted. This server's tools and resources will keep failing until the server is available again — do not retry them; use an alternative if one exists.`);
133
+ e.errorKind = "server_disconnected";
134
+ e.details = { server };
135
+ throw e;
136
+ }
66
137
  export function normalizeMcpName(name) {
67
138
  return name.replace(/[^a-zA-Z0-9_-]/g, "_");
68
139
  }
@@ -350,11 +421,14 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
350
421
  toolAxes.push(...s.axes);
351
422
  if (s.instructions) {
352
423
  serverInstructions.push({ server: spec.name, text: s.instructions });
353
- s.client.onclose = () => {
354
- if (!disposing)
355
- instructionsDelta.pendingRemovals.push(spec.name);
356
- };
357
424
  }
425
+ const hasInstructions = s.instructions !== undefined;
426
+ s.announce.fn = () => {
427
+ if (!disposing && hasInstructions)
428
+ instructionsDelta.pendingRemovals.push(spec.name);
429
+ };
430
+ if (s.health.dead && hasInstructions)
431
+ instructionsDelta.pendingRemovals.push(spec.name);
358
432
  if (s.resourceServer)
359
433
  resourceServers.push(s.resourceServer);
360
434
  statuses.push(s.status);
@@ -435,39 +509,58 @@ function resourceLine(r) {
435
509
  function serverNames(servers) {
436
510
  return servers.map((r) => r.server).join(", ") || "(none)";
437
511
  }
438
- async function readDirViaExtension(rs, uri, signal) {
512
+ async function readDirViaExtension(rs, uri, signal, timeoutMs) {
439
513
  const resources = [];
440
514
  let cursor;
441
515
  let pages = 0;
442
516
  do {
443
517
  let page;
444
518
  try {
445
- page = await rs.client.request({ method: "resources/directory/read", params: { uri, ...(cursor !== undefined ? { cursor } : {}) } }, ListResourcesResultSchema, { signal });
519
+ page = await rs.client.request({ method: "resources/directory/read", params: { uri, ...(cursor !== undefined ? { cursor } : {}) } }, ListResourcesResultSchema, { signal, timeout: timeoutMs });
446
520
  }
447
521
  catch (err) {
448
522
  if (err instanceof McpError && err.code === ErrorCode.InvalidParams) {
449
523
  if (pages > 0)
450
- break;
524
+ return { kind: "ok", resources, cursorInvalid: true };
451
525
  return { kind: "not_directory" };
452
526
  }
453
527
  if (err instanceof McpError && err.code === ErrorCode.MethodNotFound)
454
528
  return { kind: "unsupported" };
529
+ if (pages > 0 && !signal?.aborted) {
530
+ return { kind: "ok", resources, incomplete: err instanceof Error ? err.message : String(err) };
531
+ }
455
532
  throw err;
456
533
  }
457
534
  resources.push(...page.resources);
458
535
  cursor = page.nextCursor;
459
536
  pages++;
460
537
  } while (cursor !== undefined && pages < MAX_DIR_READ_PAGES);
538
+ if (cursor !== undefined)
539
+ return { kind: "ok", resources, truncated: true };
461
540
  return { kind: "ok", resources };
462
541
  }
463
- function renderDirChildren(server, uri, children) {
464
- if (children.length === 0) {
465
- return { content: [{ type: "text", text: `(Empty directory: ${inlineUntrusted(uri)})` }], details: { resources: [] }, terminate: false };
542
+ function renderDirChildren(server, uri, children, flags) {
543
+ const notes = [];
544
+ if (flags?.truncated) {
545
+ notes.push(`[listing truncated: the ${MAX_DIR_READ_PAGES}-page pagination limit was reached — more entries may exist beyond this listing]`);
546
+ }
547
+ if (flags?.incomplete !== undefined) {
548
+ notes.push(`[listing incomplete: the server failed mid-pagination (${inlineUntrusted(flags.incomplete)}) — only the pages retrieved before the failure are shown]`);
549
+ }
550
+ if (flags?.cursorInvalid) {
551
+ notes.push(`[listing incomplete: the server rejected the pagination cursor (invalid or expired) — only the pages retrieved before the rejection are shown; more entries may exist beyond this listing]`);
466
552
  }
467
- const lines = children.map((r) => resourceLine(r));
553
+ const detailFlags = {
554
+ ...(flags?.truncated ? { truncated: true } : {}),
555
+ ...(flags?.incomplete !== undefined ? { incomplete: true, error: flags.incomplete } : {}),
556
+ ...(flags?.cursorInvalid ? { incomplete: true, cursorInvalid: true } : {}),
557
+ };
558
+ const listing = children.length === 0
559
+ ? `(Empty directory: ${inlineUntrusted(uri)})`
560
+ : delimitUntrusted(`${server} dir ${uri}`, children.map((r) => resourceLine(r)).join("\n"));
468
561
  return {
469
- content: [{ type: "text", text: delimitUntrusted(`${server} dir ${uri}`, lines.join("\n")) }],
470
- details: { resources: children.map((r) => ({ server, ...r })) },
562
+ content: [{ type: "text", text: notes.length ? `${listing}\n${notes.join("\n")}` : listing }],
563
+ details: { resources: children.map((r) => ({ server, ...r })), ...detailFlags },
471
564
  terminate: false,
472
565
  };
473
566
  }
@@ -498,14 +591,33 @@ function buildResourceTools(resourceServers) {
498
591
  }
499
592
  const sections = [];
500
593
  const all = [];
594
+ const errors = [];
501
595
  for (const rs of targets) {
502
- const res = await rs.client.listResources(undefined, { signal });
503
- all.push(...res.resources.map((r) => ({ server: rs.server, ...r })));
504
- const lines = res.resources.map((r) => resourceLine(r));
505
- sections.push(`[${rs.server}]\n${lines.length ? lines.join("\n") : "(no resources)"}`);
596
+ if (rs.health.dead) {
597
+ errors.push({ server: rs.server, error: "server disconnected (transport closed earlier in this task)" });
598
+ sections.push(`[${rs.server}] Error: server disconnected — its resources are unavailable.`);
599
+ continue;
600
+ }
601
+ try {
602
+ const res = await rs.client.listResources(undefined, { signal, timeout: mcpToolTimeoutMs() });
603
+ all.push(...res.resources.map((r) => ({ server: rs.server, ...r })));
604
+ const lines = res.resources.map((r) => resourceLine(r));
605
+ sections.push(`[${rs.server}]\n${lines.length ? lines.join("\n") : "(no resources)"}`);
606
+ }
607
+ catch (err) {
608
+ if (signal?.aborted)
609
+ throw err;
610
+ const msg = err instanceof Error ? err.message : String(err);
611
+ errors.push({ server: rs.server, error: msg });
612
+ sections.push(`[${rs.server}] Error: could not list resources: ${inlineUntrusted(msg)}`);
613
+ }
506
614
  }
507
615
  const body = sections.join("\n\n");
508
- return { content: [{ type: "text", text: sections.length ? delimitUntrusted("mcp resources", body) : "(no MCP resources)" }], details: { resources: all }, terminate: false };
616
+ return {
617
+ content: [{ type: "text", text: sections.length ? delimitUntrusted("mcp resources", body) : "(no MCP resources)" }],
618
+ details: { resources: all, ...(errors.length ? { errors } : {}) },
619
+ terminate: false,
620
+ };
509
621
  },
510
622
  });
511
623
  axes.push({ name: LIST_MCP_RESOURCES, effect: "read" });
@@ -532,7 +644,13 @@ function buildResourceTools(resourceServers) {
532
644
  const rs = readable.find((r) => r.server === server);
533
645
  if (!rs)
534
646
  return { content: [{ type: "text", text: `Error: no MCP server ${inlineUntrusted(server)} with readable resources. Available: ${serverNames(readable)}.` }], details: undefined, terminate: false };
535
- const res = await rs.client.readResource({ uri }, { signal });
647
+ const what = `The read of resource ${inlineUntrusted(uri)}`;
648
+ if (rs.health.dead)
649
+ throwDeadServer(server, what);
650
+ const timeoutMs = mcpToolTimeoutMs();
651
+ const res = await rs.client
652
+ .readResource({ uri }, { signal, timeout: timeoutMs })
653
+ .catch((err) => rethrowHonestMcpError(err, { server, what, timeoutMs, writeEffect: false, signal, attributeServer: true }));
536
654
  const text = (await Promise.all((res.contents ?? []).map(async (c) => {
537
655
  if ("text" in c && typeof c.text === "string")
538
656
  return c.text;
@@ -570,9 +688,13 @@ function buildResourceTools(resourceServers) {
570
688
  const rs = listable.find((r) => r.server === server);
571
689
  if (!rs)
572
690
  return { content: [{ type: "text", text: `Error: no MCP server ${inlineUntrusted(server)} with listable resources. Available: ${serverNames(listable)}.` }], details: undefined, terminate: false };
691
+ const what = `The directory listing of ${inlineUntrusted(uri)}`;
692
+ if (rs.health.dead)
693
+ throwDeadServer(server, what);
694
+ const timeoutMs = mcpToolTimeoutMs();
573
695
  const ext = rs.client.getServerCapabilities()?.extensions?.[MCP_SKILLS_EXTENSION];
574
696
  if (ext?.directoryRead === true) {
575
- const r = await readDirViaExtension(rs, uri, signal);
697
+ const r = await readDirViaExtension(rs, uri, signal, timeoutMs).catch((err) => rethrowHonestMcpError(err, { server, what, timeoutMs, writeEffect: false, signal, attributeServer: true }));
576
698
  if (r.kind === "not_directory") {
577
699
  return {
578
700
  content: [{ type: "text", text: `Not a directory resource: ${inlineUntrusted(uri)}. If it is a file resource, use ${READ_MCP_RESOURCE} instead.` }],
@@ -581,9 +703,11 @@ function buildResourceTools(resourceServers) {
581
703
  };
582
704
  }
583
705
  if (r.kind === "ok")
584
- return renderDirChildren(server, uri, r.resources);
706
+ return renderDirChildren(server, uri, r.resources, { truncated: r.truncated, incomplete: r.incomplete, cursorInvalid: r.cursorInvalid });
585
707
  }
586
- const res = await rs.client.listResources(undefined, { signal });
708
+ const res = await rs.client
709
+ .listResources(undefined, { signal, timeout: timeoutMs })
710
+ .catch((err) => rethrowHonestMcpError(err, { server, what, timeoutMs, writeEffect: false, signal, attributeServer: true }));
587
711
  const children = res.resources.filter((r) => typeof r.uri === "string" && r.uri !== uri && r.uri.startsWith(uri));
588
712
  return renderDirChildren(server, uri, children);
589
713
  },
@@ -609,9 +733,17 @@ async function connectServer(spec, principal, onElicit, imageResizer) {
609
733
  });
610
734
  }
611
735
  const transport = buildTransport(spec, principal);
736
+ const health = { dead: false };
737
+ const announce = {};
738
+ const startupMs = mcpStartupTimeoutMs();
739
+ const startupOpts = startupMs !== undefined ? { timeout: startupMs } : undefined;
612
740
  try {
613
- await client.connect(transport);
614
- const listed = await client.listTools();
741
+ await client.connect(transport, startupOpts);
742
+ client.onclose = () => {
743
+ health.dead = true;
744
+ announce.fn?.();
745
+ };
746
+ const listed = await client.listTools(undefined, startupOpts);
615
747
  const serverTools = [];
616
748
  const serverAxes = [];
617
749
  for (const t of listed.tools) {
@@ -624,6 +756,7 @@ async function connectServer(spec, principal, onElicit, imageResizer) {
624
756
  const axis = applyCallerAxisOverride(namespacedName, hintAxis, spec.toolAxes?.[remoteName]);
625
757
  if (axis)
626
758
  serverAxes.push(axis);
759
+ const writeEffect = (axis?.effect ?? "write") === "write";
627
760
  const mcpMaxResultSizeChars = resolveMcpDeclaredResultSize(t._meta);
628
761
  serverTools.push({
629
762
  name: namespacedName,
@@ -632,16 +765,38 @@ async function connectServer(spec, principal, onElicit, imageResizer) {
632
765
  parameters: (t.inputSchema ?? { type: "object" }),
633
766
  ...(mcpMaxResultSizeChars !== undefined ? { mcpMaxResultSizeChars } : {}),
634
767
  execute: async (_toolCallId, params, signal) => {
635
- const res = await client.callTool({ name: remoteName, arguments: (params ?? {}) }, undefined, { signal });
636
- const content = gateMcpOutput(await mapContent(res.content, spec.name, imageResizer));
768
+ const what = `The call to tool ${inlineUntrusted(remoteName)}`;
769
+ if (health.dead)
770
+ throwDeadServer(spec.name, what);
771
+ const timeoutMs = mcpToolTimeoutMs();
772
+ const res = await client
773
+ .callTool({ name: remoteName, arguments: (params ?? {}) }, undefined, {
774
+ signal,
775
+ timeout: timeoutMs,
776
+ resetTimeoutOnProgress: true,
777
+ onprogress: () => { },
778
+ maxTotalTimeout: mcpToolTotalTimeoutMs(timeoutMs),
779
+ })
780
+ .catch((err) => rethrowHonestMcpError(err, { server: spec.name, what, timeoutMs, writeEffect, signal }));
781
+ const mapped = await mapContent(res.content, spec.name, imageResizer);
637
782
  if (res.isError === true) {
638
- const msg = content
639
- .map((c) => ("text" in c ? c.text : ""))
640
- .join(" ")
641
- .trim()
642
- .slice(0, 1000) || `MCP tool ${remoteName} reported an error`;
783
+ const parts = [];
784
+ for (const block of mapped) {
785
+ if (block.type === "text")
786
+ parts.push(block.text);
787
+ else
788
+ parts.push(`[${block.type} block omitted from error result]`);
789
+ }
790
+ const errSc = res.structuredContent;
791
+ if (errSc !== undefined)
792
+ parts.push(`[structuredContent] ${truncateMcpErrorText(JSON.stringify(errSc))}`);
793
+ const body = truncateMcpErrorText(parts.join("\n").trim());
794
+ const msg = body
795
+ ? `MCP tool ${inlineUntrusted(remoteName)} reported an error. The server's error content follows as external/untrusted data:\n${delimitUntrusted(`${spec.name} tool error`, body)}`
796
+ : `MCP tool ${inlineUntrusted(remoteName)} reported an error`;
643
797
  throw new Error(msg);
644
798
  }
799
+ const content = gateMcpOutput(mapped);
645
800
  const sc = res.structuredContent;
646
801
  if (sc !== undefined) {
647
802
  content.push({
@@ -672,10 +827,12 @@ async function connectServer(spec, principal, onElicit, imageResizer) {
672
827
  toolNames: serverTools.map((t) => t.name),
673
828
  },
674
829
  client,
830
+ health,
831
+ announce,
675
832
  tools: serverTools,
676
833
  axes: serverAxes,
677
834
  ...(instructions ? { instructions } : {}),
678
- ...(resourceInfo && (resourceInfo.listAllowed || resourceInfo.readAllowed) ? { resourceServer: { server: spec.name, client, ...resourceInfo } } : {}),
835
+ ...(resourceInfo && (resourceInfo.listAllowed || resourceInfo.readAllowed) ? { resourceServer: { server: spec.name, client, health, ...resourceInfo } } : {}),
679
836
  };
680
837
  }
681
838
  catch (err) {