beeai-framework 0.1.23 → 0.1.24

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 (135) hide show
  1. package/dist/adapters/a2a/serve/agent_executor.d.cts +1 -1
  2. package/dist/adapters/a2a/serve/agent_executor.d.ts +1 -1
  3. package/dist/adapters/amazon-bedrock/backend/chat.d.cts +4 -4
  4. package/dist/adapters/amazon-bedrock/backend/chat.d.ts +4 -4
  5. package/dist/adapters/amazon-bedrock/backend/embedding.d.cts +1 -1
  6. package/dist/adapters/amazon-bedrock/backend/embedding.d.ts +1 -1
  7. package/dist/adapters/anthropic/backend/chat.d.cts +5 -5
  8. package/dist/adapters/anthropic/backend/chat.d.ts +5 -5
  9. package/dist/adapters/anthropic/backend/embedding.d.cts +1 -1
  10. package/dist/adapters/anthropic/backend/embedding.d.ts +1 -1
  11. package/dist/adapters/azure-openai/backend/chat.d.cts +4 -4
  12. package/dist/adapters/azure-openai/backend/chat.d.ts +4 -4
  13. package/dist/adapters/azure-openai/backend/embedding.d.cts +1 -1
  14. package/dist/adapters/azure-openai/backend/embedding.d.ts +1 -1
  15. package/dist/adapters/dummy/backend/chat.d.cts +4 -3
  16. package/dist/adapters/dummy/backend/chat.d.ts +4 -3
  17. package/dist/adapters/dummy/backend/embedding.d.cts +1 -1
  18. package/dist/adapters/dummy/backend/embedding.d.ts +1 -1
  19. package/dist/adapters/google-vertex/backend/chat.d.cts +4 -4
  20. package/dist/adapters/google-vertex/backend/chat.d.ts +4 -4
  21. package/dist/adapters/google-vertex/backend/embedding.d.cts +1 -1
  22. package/dist/adapters/google-vertex/backend/embedding.d.ts +1 -1
  23. package/dist/adapters/groq/backend/chat.d.cts +4 -4
  24. package/dist/adapters/groq/backend/chat.d.ts +4 -4
  25. package/dist/adapters/groq/backend/embedding.d.cts +1 -1
  26. package/dist/adapters/groq/backend/embedding.d.ts +1 -1
  27. package/dist/adapters/langchain/backend/chat.d.cts +5 -4
  28. package/dist/adapters/langchain/backend/chat.d.ts +5 -4
  29. package/dist/adapters/langchain/backend/embedding.d.cts +1 -1
  30. package/dist/adapters/langchain/backend/embedding.d.ts +1 -1
  31. package/dist/adapters/ollama/backend/chat.d.cts +4 -4
  32. package/dist/adapters/ollama/backend/chat.d.ts +4 -4
  33. package/dist/adapters/ollama/backend/embedding.d.cts +1 -1
  34. package/dist/adapters/ollama/backend/embedding.d.ts +1 -1
  35. package/dist/adapters/openai/backend/chat.d.cts +4 -4
  36. package/dist/adapters/openai/backend/chat.d.ts +4 -4
  37. package/dist/adapters/openai/backend/embedding.d.cts +1 -1
  38. package/dist/adapters/openai/backend/embedding.d.ts +1 -1
  39. package/dist/adapters/vercel/backend/chat.d.cts +4 -3
  40. package/dist/adapters/vercel/backend/chat.d.ts +4 -3
  41. package/dist/adapters/vercel/backend/embedding.d.cts +1 -1
  42. package/dist/adapters/vercel/backend/embedding.d.ts +1 -1
  43. package/dist/adapters/vercel/backend/utils.d.cts +1 -1
  44. package/dist/adapters/vercel/backend/utils.d.ts +1 -1
  45. package/dist/adapters/watsonx/backend/chat.cjs +37 -9
  46. package/dist/adapters/watsonx/backend/chat.cjs.map +1 -1
  47. package/dist/adapters/watsonx/backend/chat.d.cts +5 -4
  48. package/dist/adapters/watsonx/backend/chat.d.ts +5 -4
  49. package/dist/adapters/watsonx/backend/chat.js +37 -9
  50. package/dist/adapters/watsonx/backend/chat.js.map +1 -1
  51. package/dist/adapters/watsonx/backend/embedding.d.cts +1 -1
  52. package/dist/adapters/watsonx/backend/embedding.d.ts +1 -1
  53. package/dist/adapters/xai/backend/chat.d.cts +4 -4
  54. package/dist/adapters/xai/backend/chat.d.ts +4 -4
  55. package/dist/{agent-BVuc9Nfn.d.cts → agent-Cy4QtsN8.d.cts} +2 -2
  56. package/dist/{agent-Cuy8Q4gw.d.ts → agent-DHLEPXEA.d.ts} +2 -2
  57. package/dist/agents/experimental/replan/agent.d.cts +1 -1
  58. package/dist/agents/experimental/replan/agent.d.ts +1 -1
  59. package/dist/agents/experimental/streamlit/agent.d.cts +1 -1
  60. package/dist/agents/experimental/streamlit/agent.d.ts +1 -1
  61. package/dist/agents/react/agent.d.cts +2 -2
  62. package/dist/agents/react/agent.d.ts +2 -2
  63. package/dist/agents/react/runners/base.d.cts +2 -2
  64. package/dist/agents/react/runners/base.d.ts +2 -2
  65. package/dist/agents/react/runners/deep-think/runner.d.cts +2 -2
  66. package/dist/agents/react/runners/deep-think/runner.d.ts +2 -2
  67. package/dist/agents/react/runners/default/runner.d.cts +2 -2
  68. package/dist/agents/react/runners/default/runner.d.ts +2 -2
  69. package/dist/agents/react/runners/granite/runner.d.cts +2 -2
  70. package/dist/agents/react/runners/granite/runner.d.ts +2 -2
  71. package/dist/agents/react/types.d.cts +1 -1
  72. package/dist/agents/react/types.d.ts +1 -1
  73. package/dist/agents/requirement/agent.d.cts +2 -2
  74. package/dist/agents/requirement/agent.d.ts +2 -2
  75. package/dist/agents/requirement/requirements/conditional.d.cts +2 -2
  76. package/dist/agents/requirement/requirements/conditional.d.ts +2 -2
  77. package/dist/agents/requirement/requirements/requirement.d.cts +2 -2
  78. package/dist/agents/requirement/requirements/requirement.d.ts +2 -2
  79. package/dist/agents/requirement/runner.d.cts +2 -2
  80. package/dist/agents/requirement/runner.d.ts +2 -2
  81. package/dist/agents/requirement/types.d.cts +2 -2
  82. package/dist/agents/requirement/types.d.ts +2 -2
  83. package/dist/agents/requirement/utils/llm.d.cts +2 -2
  84. package/dist/agents/requirement/utils/llm.d.ts +2 -2
  85. package/dist/agents/requirement/utils/tool.d.cts +2 -2
  86. package/dist/agents/requirement/utils/tool.d.ts +2 -2
  87. package/dist/agents/toolCalling/agent.d.cts +1 -1
  88. package/dist/agents/toolCalling/agent.d.ts +1 -1
  89. package/dist/backend/backend.d.cts +1 -1
  90. package/dist/backend/backend.d.ts +1 -1
  91. package/dist/backend/chat.cjs +4 -2
  92. package/dist/backend/chat.cjs.map +1 -1
  93. package/dist/backend/chat.d.cts +1 -1
  94. package/dist/backend/chat.d.ts +1 -1
  95. package/dist/backend/chat.js +5 -3
  96. package/dist/backend/chat.js.map +1 -1
  97. package/dist/backend/core.d.cts +1 -1
  98. package/dist/backend/core.d.ts +1 -1
  99. package/dist/backend/embedding.d.cts +1 -1
  100. package/dist/backend/embedding.d.ts +1 -1
  101. package/dist/backend/utils.d.cts +1 -1
  102. package/dist/backend/utils.d.ts +1 -1
  103. package/dist/{chat-BOb9n7AJ.d.cts → chat-CC0s8z23.d.cts} +3 -1
  104. package/dist/{chat-DrqwUgD8.d.ts → chat-D8SVtw5Q.d.ts} +3 -1
  105. package/dist/index.d.cts +1 -1
  106. package/dist/index.d.ts +1 -1
  107. package/dist/internals/helpers/object.cjs +18 -0
  108. package/dist/internals/helpers/object.cjs.map +1 -1
  109. package/dist/internals/helpers/object.d.cts +2 -1
  110. package/dist/internals/helpers/object.d.ts +2 -1
  111. package/dist/internals/helpers/object.js +18 -1
  112. package/dist/internals/helpers/object.js.map +1 -1
  113. package/dist/memory/summarizeMemory.d.cts +1 -1
  114. package/dist/memory/summarizeMemory.d.ts +1 -1
  115. package/dist/middleware/streamToolCall.cjs +7 -1
  116. package/dist/middleware/streamToolCall.cjs.map +1 -1
  117. package/dist/middleware/streamToolCall.d.cts +2 -0
  118. package/dist/middleware/streamToolCall.d.ts +2 -0
  119. package/dist/middleware/streamToolCall.js +7 -1
  120. package/dist/middleware/streamToolCall.js.map +1 -1
  121. package/dist/tools/custom.d.cts +1 -1
  122. package/dist/tools/custom.d.ts +1 -1
  123. package/dist/tools/database/milvus.d.cts +2 -2
  124. package/dist/tools/database/milvus.d.ts +2 -2
  125. package/dist/tools/llm.d.cts +1 -1
  126. package/dist/tools/llm.d.ts +1 -1
  127. package/dist/tools/python/python.d.cts +1 -1
  128. package/dist/tools/python/python.d.ts +1 -1
  129. package/dist/{types-W0QttuP_.d.cts → types-D9pn62yF.d.cts} +9 -9
  130. package/dist/{types-CJwiMH3u.d.ts → types-Dyd4e1G6.d.ts} +9 -9
  131. package/dist/version.cjs +1 -1
  132. package/dist/version.js +1 -1
  133. package/dist/workflows/agent.d.cts +38 -38
  134. package/dist/workflows/agent.d.ts +38 -38
  135. package/package.json +2 -2
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ export { AbortError, FrameworkError, FrameworkErrorOptions, NotImplementedError,
4
4
  export { Version } from './version.js';
5
5
  export { S as SerializeFactory, a as Serializer } from './serializer-53t8gGQa.js';
6
6
  export { A as AgentError, a as BaseAgent, B as BaseAgentRunOptions } from './base-CyFx7BRL.js';
7
- export { k as ChatConfig, m as ChatModel, i as ChatModelCache, h as ChatModelEmitter, g as ChatModelEvents, e as ChatModelFinishReason, d as ChatModelInput, a as ChatModelObjectInput, b as ChatModelObjectOutput, n as ChatModelOutput, C as ChatModelParameters, c as ChatModelToolChoice, l as ChatModelToolChoiceSupport, f as ChatModelUsage, j as ConfigFn } from './chat-DrqwUgD8.js';
7
+ export { k as ChatConfig, m as ChatModel, i as ChatModelCache, h as ChatModelEmitter, g as ChatModelEvents, e as ChatModelFinishReason, d as ChatModelInput, a as ChatModelObjectInput, b as ChatModelObjectOutput, n as ChatModelOutput, C as ChatModelParameters, c as ChatModelToolChoice, l as ChatModelToolChoiceSupport, f as ChatModelUsage, j as ConfigFn } from './chat-D8SVtw5Q.js';
8
8
  export { EmbeddingModel, EmbeddingModelEmitter, EmbeddingModelEvents, EmbeddingModelInput, EmbeddingModelOutput } from './backend/embedding.js';
9
9
  export { AnyTool, AnyToolClass, BaseToolOptions, BaseToolRunOptions, DynamicTool, InferToolOutput, JSONToolOutput, RetryOptions, StringToolOutput, Tool, ToolEmitter, ToolError, ToolEvents, ToolInput, ToolInputRaw, ToolInputValidationError, ToolOutput, ToolSnapshot } from './tools/base.js';
10
10
  import 'pino';
@@ -148,10 +148,28 @@ function safeDefineProperty(target, key, get) {
148
148
  }
149
149
  }
150
150
  __name(safeDefineProperty, "safeDefineProperty");
151
+ function getLast(iterable, fallback) {
152
+ const iterator = iterable[Symbol.iterator]();
153
+ let result = iterator.next();
154
+ if (result.done) {
155
+ if (arguments.length < 2) {
156
+ throw new Error(`Target is empty.`);
157
+ }
158
+ return fallback;
159
+ }
160
+ let lastValue;
161
+ do {
162
+ lastValue = result.value;
163
+ result = iterator.next();
164
+ } while (!result.done);
165
+ return lastValue;
166
+ }
167
+ __name(getLast, "getLast");
151
168
 
152
169
  exports.assign = assign;
153
170
  exports.assignFactory = assignFactory;
154
171
  exports.customMerge = customMerge;
172
+ exports.getLast = getLast;
155
173
  exports.getProp = getProp;
156
174
  exports.getPropStrict = getPropStrict;
157
175
  exports.hasProp = hasProp;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/internals/helpers/object.ts"],"names":["assignFactory","target","source","Object","assign","a","b","omitEmptyValues","R","pickBy","isTruthy","omitUndefined","isDefined","hasProp","key","Boolean","prototype","hasOwnProperty","call","hasProps","keys","every","setProp","paths","value","entry","entries","idx","isPlainObject","isArray","TypeError","isLast","length","newValue","getPropStrict","path","getProp","defaultValue","undefined","popProp","fallback","updateObject","old","update","val","existing","FrameworkError","context","customMerge","results","processors","finalResult","next","oldValue","takeFirstBy","mapObj","obj","fn","updated","pair","safeDefineProperty","get","defineProperty","enumerable","configurable","e"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,SAASA,cAAqEC,MAAAA,EAAS;AAC5F,EAAA,OAAO,CAACC,MAAAA,KAAAA;AACNC,IAAAA,MAAAA,CAAOC,MAAAA,CAAOH,QAAQC,MAAAA,CAAAA;AACxB,GAAA;AACF;AAJgBF,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAMT,MAAMI,MAAAA,2BACXC,CAAAA,EACAC,CAAAA,KACGN,cAAcK,CAAAA,CAAAA,CAAGC,CAAAA,CAAAA,EAHA,QAAA;AAIf,MAAMC,eAAAA,GAAkBC,YAAAA,CAAEC,MAAAA,CAAOD,YAAAA,CAAEE,QAAQ;AAC3C,MAAMC,aAAAA,GAAgBH,YAAAA,CAAEC,MAAAA,CAAOD,YAAAA,CAAEI,SAAS;AAE1C,SAASC,OAAAA,CAAWZ,QAAuBa,GAAAA,EAAY;AAC5D,EAAA,OAAOC,OAAAA,CAAQd,MAAAA,CAAAA,IAAWE,MAAAA,CAAOa,UAAUC,cAAAA,CAAeC,IAAAA,CAAKjB,QAAQa,GAAAA,CAAAA;AACzE;AAFgBD,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAIT,SAASM,SAAYC,IAAAA,EAAiB;AAC3C,EAAA,OAAO,CAACnB,WAA0BmB,IAAAA,CAAKC,KAAAA,CAAM,CAACP,GAAAA,KAAQD,OAAAA,CAAQZ,MAAAA,EAAQa,GAAAA,CAAAA,CAAAA;AACxE;AAFgBK,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;AAIT,SAASG,OAAAA,CAAQrB,MAAAA,EAAiBsB,KAAAA,EAA+BC,KAAAA,EAAc;AACpF,EAAA,KAAA,MAAWC,KAAAA,IAASF,KAAAA,CAAMG,OAAAA,EAAO,EAAI;AACnC,IAAA,MAAM,CAACC,GAAAA,EAAKb,GAAAA,CAAAA,GAAOW,KAAAA;AACnB,IAAA,IAAI,CAACjB,aAAEoB,aAAAA,CAAc3B,MAAAA,KAAW,CAACO,YAAAA,CAAEqB,OAAAA,CAAQ5B,MAAAA,CAAAA,EAAS;AAClD,MAAA,MAAM,IAAI6B,UAAU,8CAAA,CAAA;AACtB;AAEA,IAAA,MAAMC,MAAAA,GAASJ,GAAAA,KAAQJ,KAAAA,CAAMS,MAAAA,GAAS,CAAA;AACtC,IAAA,MAAMC,WAAWF,MAAAA,GAASP,KAAAA,GAASvB,MAAAA,CAAOa,GAAAA,KAAQ,EAAC;AACnDX,IAAAA,MAAAA,CAAOC,OAAOH,MAAAA,EAAQ;AAAE,MAAA,CAACa,GAAAA,GAAMmB;KAAS,CAAA;AACxChC,IAAAA,MAAAA,GAASA,OAAOa,GAAAA,CAAAA;AAClB;AACF;AAZgBQ,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAcT,SAASY,aAAAA,CAAcjC,QAA8BkC,IAAAA,EAAY;AACtE,EAAA,IAAI,CAAClC,MAAAA,IAAU,EAAEkC,IAAAA,IAAQlC,MAAAA,CAAAA,EAAS;AAChC,IAAA,MAAM,IAAI6B,SAAAA,CAAU,CAAA,6BAAA,EAAgCK,IAAAA,CAAAA,CAAAA,CAAO,CAAA;AAC7D;AACA,EAAA,OAAOlC,OAAOkC,IAAAA,CAAAA;AAChB;AALgBD,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAOT,SAASE,OAAAA,CACdnC,MAAAA,EACAsB,KAAAA,EACAc,YAAAA,GAAoBC,MAAAA,EAAS;AAE7B,EAAA,IAAId,KAAAA,GAAavB,MAAAA;AACjB,EAAA,IAAI,CAACuB,KAAAA,EAAO;AACV,IAAA,OAAOc,MAAAA;AACT;AAEA,EAAA,KAAA,MAAWxB,OAAOS,KAAAA,EAAO;AACvB,IAAA,IAAI,CAACV,OAAAA,CAAQW,KAAAA,EAAOV,GAAAA,CAAAA,EAAM;AACxB,MAAA,OAAOuB,YAAAA;AACT;AACAb,IAAAA,KAAAA,GAAQA,MAAMV,GAAAA,CAAAA;AAChB;AACA,EAAA,OAAOU,KAAAA;AACT;AAjBgBY,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAmBT,SAASG,OAAAA,CACdtC,MAAAA,EACAa,GAAAA,EACA0B,QAAAA,GAAwB,IAAA,EAAI;AAE5B,EAAA,IAAI,CAAC3B,OAAAA,CAAQZ,MAAAA,EAAQa,GAAAA,CAAAA,EAAM;AACzB,IAAA,OAAO0B,QAAAA;AACT;AACA,EAAA,MAAMhB,KAAAA,GAAQY,QAAQnC,MAAAA,EAAQ;AAACa,IAAAA;AAAI,GAAA,CAAA;AACnC,EAAA,IAAI;AAEF,IAAA,OAAOb,OAAOa,GAAAA,CAAAA;GAChB,CAAA,MAAQ;AAER;AACA,EAAA,OAAOU,KAAAA;AACT;AAhBgBe,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAkBT,SAASE,YAAAA,CACdC,KACAC,MAAAA,EAAS;AAET,EAAA,KAAA,MAAW,CAAC7B,GAAAA,EAAK8B,GAAAA,KAAQzC,MAAAA,CAAOuB,OAAAA,CAAQiB,MAAAA,CAAAA,EAAS;AAC/C,IAAA,MAAME,QAAAA,GAAWH,IAAI5B,GAAAA,CAAAA;AACrB,IAAA,IAAI+B,QAAAA,KAAaP,MAAAA,IAAaO,QAAAA,KAAa,IAAA,EAAM;AAC/C,MAAA,MAAM,IAAIC,yBAAAA,CACR,CAAA,2BAAA,EAA8BhC,GAAAA,CAAAA,gCAAAA,CAAAA,EAC9B,EAAA,EACA;QACEiC,OAAAA,EAAS;AACPF,UAAAA,QAAAA;UACAF,MAAAA,EAAQC;AACV;OACF,CAAA;AAEJ;AACAF,IAAAA,GAAAA,CAAI5B,GAAAA,CAAAA,GAAkB8B,GAAAA;AACxB;AACF;AApBgBH,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AAsBT,SAASO,WAAAA,CACdC,SACAC,UAAAA,EAEC;AAED,EAAA,IAAID,OAAAA,CAAQjB,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,IAAIF,UAAU,yCAAA,CAAA;AACtB;AAEA,EAAA,MAAMqB,cAAc,EAAC;AACrB,EAAA,KAAA,MAAWC,QAAQH,OAAAA,EAAS;AAC1B,IAAA,KAAA,MAAW,CAACnC,GAAAA,EAAKU,KAAAA,KAAUhB,YAAAA,CAAEkB,OAAAA,CAAQ0B,IAAAA,CAAAA,EAAO;AAC1C,MAAA,MAAMC,QAAAA,GAAWF,YAAYrC,GAAAA,CAAAA;AAE7BqC,MAAAA,WAAAA,CAAYrC,GAAAA,CAAAA,GAAAA,CAAQoC,UAAAA,CAAWpC,GAAAA,CAAAA,IAAQN,aAAE8C,WAAAA,CAAY,CAAA,CAAA,EAAI9B,KAAAA,EAAO6B,QAAAA,CAAAA;AAClE;AACF;AACA,EAAA,OAAOF,WAAAA;AACT;AAnBgBH,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AAqBT,SAASO,OAAyBC,GAAAA,EAAM;AAC7C,EAAA,OAAO,SACLC,EAAAA,EAA8B;AAE9B,IAAA,MAAMC,UAAU,EAAC;AACjB,IAAA,KAAA,MAAWC,IAAAA,IAAQxD,MAAAA,CAAOuB,OAAAA,CAAQ8B,GAAAA,CAAAA,EAAM;AACtC,MAAA,MAAM,CAAC1C,GAAAA,EAAKU,KAAAA,CAAAA,GAASmC,IAAAA;AACrBD,MAAAA,OAAAA,CAAQ5C,GAAAA,CAAAA,GAAO2C,EAAAA,CAAG3C,GAAAA,EAAKU,KAAAA,CAAAA;AACzB;AACA,IAAA,OAAOkC,OAAAA;AACT,GAAA;AACF;AAXgBH,MAAAA,CAAAA,MAAAA,EAAAA,QAAAA,CAAAA;AAaT,SAASK,kBAAAA,CAAyC3D,MAAAA,EAAWa,GAAAA,EAAQ+C,GAAAA,EAAe;AACzF,EAAA,IAAI;AACF1D,IAAAA,MAAAA,CAAO2D,cAAAA,CAAe7D,QAAQa,GAAAA,EAAK;MACjCiD,UAAAA,EAAY,KAAA;MACZC,YAAAA,EAAc,KAAA;MACdH,GAAAA,GAAAA;AACE,QAAA,OAAOA,GAAAA,EAAAA;AACT;KACF,CAAA;AACF,GAAA,CAAA,OAASI,CAAAA,EAAG;AACV,IAAA,IAAI,EAAEA,aAAanC,SAAAA,CAAAA,EAAY;AAC7B,MAAA,MAAMmC,CAAAA;AACR;AACF;AACF;AAdgBL,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA","file":"object.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as R from \"remeda\";\nimport { FrameworkError } from \"@/errors.js\";\n\nexport type Override<T, T2 extends Partial<T>> = {\n [K in keyof T2]: K extends keyof T ? T2[K] : never;\n};\n\nexport function assignFactory<T extends NonNullable<unknown>, T2 extends Partial<T>>(target: T) {\n return (source: NonNullable<Override<T, T2>>) => {\n Object.assign(target, source);\n };\n}\n\nexport const assign = <T extends NonNullable<unknown>, T2 extends Partial<T>>(\n a: T,\n b: NonNullable<Override<T, T2>>,\n) => assignFactory(a)(b);\nexport const omitEmptyValues = R.pickBy(R.isTruthy);\nexport const omitUndefined = R.pickBy(R.isDefined);\n\nexport function hasProp<T>(target: T | undefined, key: keyof T): key is keyof T {\n return Boolean(target) && Object.prototype.hasOwnProperty.call(target, key);\n}\n\nexport function hasProps<T>(keys: (keyof T)[]) {\n return (target: T | undefined) => keys.every((key) => hasProp(target, key));\n}\n\nexport function setProp(target: unknown, paths: readonly (keyof any)[], value: unknown) {\n for (const entry of paths.entries()) {\n const [idx, key] = entry as [number, keyof object];\n if (!R.isPlainObject(target) && !R.isArray(target)) {\n throw new TypeError(\"Only plain objects and arrays are supported!\");\n }\n\n const isLast = idx === paths.length - 1;\n const newValue = isLast ? value : (target[key] ?? {});\n Object.assign(target, { [key]: newValue });\n target = target[key];\n }\n}\n\nexport function getPropStrict(target: NonNullable<unknown>, path: string): any {\n if (!target || !(path in target)) {\n throw new TypeError(`Target does not contain key \"${path}\"`);\n }\n return target[path as keyof typeof target];\n}\n\nexport function getProp(\n target: unknown,\n paths: readonly (keyof any)[],\n defaultValue: any = undefined,\n) {\n let value: any = target;\n if (!value) {\n return undefined;\n }\n\n for (const key of paths) {\n if (!hasProp(value, key)) {\n return defaultValue;\n }\n value = value[key];\n }\n return value;\n}\n\nexport function popProp<T, K extends keyof T>(\n target: T,\n key: K,\n fallback: T[K] | null = null,\n): T[K] | null {\n if (!hasProp(target, key)) {\n return fallback;\n }\n const value = getProp(target, [key]);\n try {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete target[key];\n } catch {\n /* empty */\n }\n return value;\n}\n\nexport function updateObject<T extends object, L extends object>(\n old: T,\n update: L,\n): asserts old is T & L {\n for (const [key, val] of Object.entries(update)) {\n const existing = old[key as keyof T];\n if (existing !== undefined && existing !== null) {\n throw new FrameworkError(\n `Cannot update object. Key '${key}' already exists and is defined.`,\n [],\n {\n context: {\n existing,\n update: val,\n },\n },\n );\n }\n old[key as keyof T] = val;\n }\n}\n\nexport function customMerge<T extends NonNullable<unknown>>(\n results: T[],\n processors: {\n [K in keyof T]: (value: T[K], oldValue: T[K]) => T[K];\n },\n) {\n if (results.length === 0) {\n throw new TypeError(\"Cannot merge content of an empty array!\");\n }\n\n const finalResult = {} as T;\n for (const next of results) {\n for (const [key, value] of R.entries(next)) {\n const oldValue = finalResult[key as keyof T];\n // @ts-expect-error weak typing due to generated types\n finalResult[key] = (processors[key] ?? R.takeFirstBy(1))(value, oldValue);\n }\n }\n return finalResult;\n}\n\nexport function mapObj<T extends object>(obj: T) {\n return function <K extends keyof T, R = T[K]>(\n fn: (key: K, value: T[K]) => R,\n ): Record<keyof T, R> {\n const updated = {} as Record<keyof T, R>;\n for (const pair of Object.entries(obj)) {\n const [key, value] = pair as [K, T[K]];\n updated[key] = fn(key, value);\n }\n return updated;\n };\n}\n\nexport function safeDefineProperty<T, K extends keyof T>(target: T, key: K, get: () => T[K]) {\n try {\n Object.defineProperty(target, key, {\n enumerable: false,\n configurable: false,\n get() {\n return get();\n },\n });\n } catch (e) {\n if (!(e instanceof TypeError)) {\n throw e;\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/internals/helpers/object.ts"],"names":["assignFactory","target","source","Object","assign","a","b","omitEmptyValues","R","pickBy","isTruthy","omitUndefined","isDefined","hasProp","key","Boolean","prototype","hasOwnProperty","call","hasProps","keys","every","setProp","paths","value","entry","entries","idx","isPlainObject","isArray","TypeError","isLast","length","newValue","getPropStrict","path","getProp","defaultValue","undefined","popProp","fallback","updateObject","old","update","val","existing","FrameworkError","context","customMerge","results","processors","finalResult","next","oldValue","takeFirstBy","mapObj","obj","fn","updated","pair","safeDefineProperty","get","defineProperty","enumerable","configurable","e","getLast","iterable","iterator","Symbol","result","done","arguments","Error","lastValue"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,SAASA,cAAqEC,MAAAA,EAAS;AAC5F,EAAA,OAAO,CAACC,MAAAA,KAAAA;AACNC,IAAAA,MAAAA,CAAOC,MAAAA,CAAOH,QAAQC,MAAAA,CAAAA;AACxB,GAAA;AACF;AAJgBF,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAMT,MAAMI,MAAAA,2BACXC,CAAAA,EACAC,CAAAA,KACGN,cAAcK,CAAAA,CAAAA,CAAGC,CAAAA,CAAAA,EAHA,QAAA;AAIf,MAAMC,eAAAA,GAAkBC,YAAAA,CAAEC,MAAAA,CAAOD,YAAAA,CAAEE,QAAQ;AAC3C,MAAMC,aAAAA,GAAgBH,YAAAA,CAAEC,MAAAA,CAAOD,YAAAA,CAAEI,SAAS;AAE1C,SAASC,OAAAA,CAAWZ,QAAuBa,GAAAA,EAAY;AAC5D,EAAA,OAAOC,OAAAA,CAAQd,MAAAA,CAAAA,IAAWE,MAAAA,CAAOa,UAAUC,cAAAA,CAAeC,IAAAA,CAAKjB,QAAQa,GAAAA,CAAAA;AACzE;AAFgBD,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAIT,SAASM,SAAYC,IAAAA,EAAiB;AAC3C,EAAA,OAAO,CAACnB,WAA0BmB,IAAAA,CAAKC,KAAAA,CAAM,CAACP,GAAAA,KAAQD,OAAAA,CAAQZ,MAAAA,EAAQa,GAAAA,CAAAA,CAAAA;AACxE;AAFgBK,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;AAIT,SAASG,OAAAA,CAAQrB,MAAAA,EAAiBsB,KAAAA,EAA+BC,KAAAA,EAAc;AACpF,EAAA,KAAA,MAAWC,KAAAA,IAASF,KAAAA,CAAMG,OAAAA,EAAO,EAAI;AACnC,IAAA,MAAM,CAACC,GAAAA,EAAKb,GAAAA,CAAAA,GAAOW,KAAAA;AACnB,IAAA,IAAI,CAACjB,aAAEoB,aAAAA,CAAc3B,MAAAA,KAAW,CAACO,YAAAA,CAAEqB,OAAAA,CAAQ5B,MAAAA,CAAAA,EAAS;AAClD,MAAA,MAAM,IAAI6B,UAAU,8CAAA,CAAA;AACtB;AAEA,IAAA,MAAMC,MAAAA,GAASJ,GAAAA,KAAQJ,KAAAA,CAAMS,MAAAA,GAAS,CAAA;AACtC,IAAA,MAAMC,WAAWF,MAAAA,GAASP,KAAAA,GAASvB,MAAAA,CAAOa,GAAAA,KAAQ,EAAC;AACnDX,IAAAA,MAAAA,CAAOC,OAAOH,MAAAA,EAAQ;AAAE,MAAA,CAACa,GAAAA,GAAMmB;KAAS,CAAA;AACxChC,IAAAA,MAAAA,GAASA,OAAOa,GAAAA,CAAAA;AAClB;AACF;AAZgBQ,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAcT,SAASY,aAAAA,CAAcjC,QAA8BkC,IAAAA,EAAY;AACtE,EAAA,IAAI,CAAClC,MAAAA,IAAU,EAAEkC,IAAAA,IAAQlC,MAAAA,CAAAA,EAAS;AAChC,IAAA,MAAM,IAAI6B,SAAAA,CAAU,CAAA,6BAAA,EAAgCK,IAAAA,CAAAA,CAAAA,CAAO,CAAA;AAC7D;AACA,EAAA,OAAOlC,OAAOkC,IAAAA,CAAAA;AAChB;AALgBD,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAOT,SAASE,OAAAA,CACdnC,MAAAA,EACAsB,KAAAA,EACAc,YAAAA,GAAoBC,MAAAA,EAAS;AAE7B,EAAA,IAAId,KAAAA,GAAavB,MAAAA;AACjB,EAAA,IAAI,CAACuB,KAAAA,EAAO;AACV,IAAA,OAAOc,MAAAA;AACT;AAEA,EAAA,KAAA,MAAWxB,OAAOS,KAAAA,EAAO;AACvB,IAAA,IAAI,CAACV,OAAAA,CAAQW,KAAAA,EAAOV,GAAAA,CAAAA,EAAM;AACxB,MAAA,OAAOuB,YAAAA;AACT;AACAb,IAAAA,KAAAA,GAAQA,MAAMV,GAAAA,CAAAA;AAChB;AACA,EAAA,OAAOU,KAAAA;AACT;AAjBgBY,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAmBT,SAASG,OAAAA,CACdtC,MAAAA,EACAa,GAAAA,EACA0B,QAAAA,GAAwB,IAAA,EAAI;AAE5B,EAAA,IAAI,CAAC3B,OAAAA,CAAQZ,MAAAA,EAAQa,GAAAA,CAAAA,EAAM;AACzB,IAAA,OAAO0B,QAAAA;AACT;AACA,EAAA,MAAMhB,KAAAA,GAAQY,QAAQnC,MAAAA,EAAQ;AAACa,IAAAA;AAAI,GAAA,CAAA;AACnC,EAAA,IAAI;AAEF,IAAA,OAAOb,OAAOa,GAAAA,CAAAA;GAChB,CAAA,MAAQ;AAER;AACA,EAAA,OAAOU,KAAAA;AACT;AAhBgBe,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAkBT,SAASE,YAAAA,CACdC,KACAC,MAAAA,EAAS;AAET,EAAA,KAAA,MAAW,CAAC7B,GAAAA,EAAK8B,GAAAA,KAAQzC,MAAAA,CAAOuB,OAAAA,CAAQiB,MAAAA,CAAAA,EAAS;AAC/C,IAAA,MAAME,QAAAA,GAAWH,IAAI5B,GAAAA,CAAAA;AACrB,IAAA,IAAI+B,QAAAA,KAAaP,MAAAA,IAAaO,QAAAA,KAAa,IAAA,EAAM;AAC/C,MAAA,MAAM,IAAIC,yBAAAA,CACR,CAAA,2BAAA,EAA8BhC,GAAAA,CAAAA,gCAAAA,CAAAA,EAC9B,EAAA,EACA;QACEiC,OAAAA,EAAS;AACPF,UAAAA,QAAAA;UACAF,MAAAA,EAAQC;AACV;OACF,CAAA;AAEJ;AACAF,IAAAA,GAAAA,CAAI5B,GAAAA,CAAAA,GAAkB8B,GAAAA;AACxB;AACF;AApBgBH,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AAsBT,SAASO,WAAAA,CACdC,SACAC,UAAAA,EAEC;AAED,EAAA,IAAID,OAAAA,CAAQjB,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,IAAIF,UAAU,yCAAA,CAAA;AACtB;AAEA,EAAA,MAAMqB,cAAc,EAAC;AACrB,EAAA,KAAA,MAAWC,QAAQH,OAAAA,EAAS;AAC1B,IAAA,KAAA,MAAW,CAACnC,GAAAA,EAAKU,KAAAA,KAAUhB,YAAAA,CAAEkB,OAAAA,CAAQ0B,IAAAA,CAAAA,EAAO;AAC1C,MAAA,MAAMC,QAAAA,GAAWF,YAAYrC,GAAAA,CAAAA;AAE7BqC,MAAAA,WAAAA,CAAYrC,GAAAA,CAAAA,GAAAA,CAAQoC,UAAAA,CAAWpC,GAAAA,CAAAA,IAAQN,aAAE8C,WAAAA,CAAY,CAAA,CAAA,EAAI9B,KAAAA,EAAO6B,QAAAA,CAAAA;AAClE;AACF;AACA,EAAA,OAAOF,WAAAA;AACT;AAnBgBH,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AAqBT,SAASO,OAAyBC,GAAAA,EAAM;AAC7C,EAAA,OAAO,SACLC,EAAAA,EAA8B;AAE9B,IAAA,MAAMC,UAAU,EAAC;AACjB,IAAA,KAAA,MAAWC,IAAAA,IAAQxD,MAAAA,CAAOuB,OAAAA,CAAQ8B,GAAAA,CAAAA,EAAM;AACtC,MAAA,MAAM,CAAC1C,GAAAA,EAAKU,KAAAA,CAAAA,GAASmC,IAAAA;AACrBD,MAAAA,OAAAA,CAAQ5C,GAAAA,CAAAA,GAAO2C,EAAAA,CAAG3C,GAAAA,EAAKU,KAAAA,CAAAA;AACzB;AACA,IAAA,OAAOkC,OAAAA;AACT,GAAA;AACF;AAXgBH,MAAAA,CAAAA,MAAAA,EAAAA,QAAAA,CAAAA;AAaT,SAASK,kBAAAA,CAAyC3D,MAAAA,EAAWa,GAAAA,EAAQ+C,GAAAA,EAAe;AACzF,EAAA,IAAI;AACF1D,IAAAA,MAAAA,CAAO2D,cAAAA,CAAe7D,QAAQa,GAAAA,EAAK;MACjCiD,UAAAA,EAAY,KAAA;MACZC,YAAAA,EAAc,KAAA;MACdH,GAAAA,GAAAA;AACE,QAAA,OAAOA,GAAAA,EAAAA;AACT;KACF,CAAA;AACF,GAAA,CAAA,OAASI,CAAAA,EAAG;AACV,IAAA,IAAI,EAAEA,aAAanC,SAAAA,CAAAA,EAAY;AAC7B,MAAA,MAAMmC,CAAAA;AACR;AACF;AACF;AAdgBL,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;AAgBT,SAASM,OAAAA,CAAWC,UAAuB3B,QAAAA,EAAY;AAC5D,EAAA,MAAM4B,QAAAA,GAAWD,QAAAA,CAASE,MAAAA,CAAOD,QAAQ,CAAA,EAAC;AAC1C,EAAA,IAAIE,MAAAA,GAASF,SAAShB,IAAAA,EAAI;AAE1B,EAAA,IAAIkB,OAAOC,IAAAA,EAAM;AACf,IAAA,IAAIC,SAAAA,CAAUxC,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,IAAIyC,MAAM,CAAA,gBAAA,CAAkB,CAAA;AACpC;AACA,IAAA,OAAOjC,QAAAA;AACT;AAEA,EAAA,IAAIkC,SAAAA;AACJ,EAAA,GAAG;AACDA,IAAAA,SAAAA,GAAYJ,MAAAA,CAAO9C,KAAAA;AACnB8C,IAAAA,MAAAA,GAASF,SAAShB,IAAAA,EAAI;AACxB,GAAA,QAAS,CAACkB,MAAAA,CAAOC,IAAAA;AAEjB,EAAA,OAAOG,SAAAA;AACT;AAlBgBR,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA","file":"object.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as R from \"remeda\";\nimport { FrameworkError } from \"@/errors.js\";\n\nexport type Override<T, T2 extends Partial<T>> = {\n [K in keyof T2]: K extends keyof T ? T2[K] : never;\n};\n\nexport function assignFactory<T extends NonNullable<unknown>, T2 extends Partial<T>>(target: T) {\n return (source: NonNullable<Override<T, T2>>) => {\n Object.assign(target, source);\n };\n}\n\nexport const assign = <T extends NonNullable<unknown>, T2 extends Partial<T>>(\n a: T,\n b: NonNullable<Override<T, T2>>,\n) => assignFactory(a)(b);\nexport const omitEmptyValues = R.pickBy(R.isTruthy);\nexport const omitUndefined = R.pickBy(R.isDefined);\n\nexport function hasProp<T>(target: T | undefined, key: keyof T): key is keyof T {\n return Boolean(target) && Object.prototype.hasOwnProperty.call(target, key);\n}\n\nexport function hasProps<T>(keys: (keyof T)[]) {\n return (target: T | undefined) => keys.every((key) => hasProp(target, key));\n}\n\nexport function setProp(target: unknown, paths: readonly (keyof any)[], value: unknown) {\n for (const entry of paths.entries()) {\n const [idx, key] = entry as [number, keyof object];\n if (!R.isPlainObject(target) && !R.isArray(target)) {\n throw new TypeError(\"Only plain objects and arrays are supported!\");\n }\n\n const isLast = idx === paths.length - 1;\n const newValue = isLast ? value : (target[key] ?? {});\n Object.assign(target, { [key]: newValue });\n target = target[key];\n }\n}\n\nexport function getPropStrict(target: NonNullable<unknown>, path: string): any {\n if (!target || !(path in target)) {\n throw new TypeError(`Target does not contain key \"${path}\"`);\n }\n return target[path as keyof typeof target];\n}\n\nexport function getProp(\n target: unknown,\n paths: readonly (keyof any)[],\n defaultValue: any = undefined,\n) {\n let value: any = target;\n if (!value) {\n return undefined;\n }\n\n for (const key of paths) {\n if (!hasProp(value, key)) {\n return defaultValue;\n }\n value = value[key];\n }\n return value;\n}\n\nexport function popProp<T, K extends keyof T>(\n target: T,\n key: K,\n fallback: T[K] | null = null,\n): T[K] | null {\n if (!hasProp(target, key)) {\n return fallback;\n }\n const value = getProp(target, [key]);\n try {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete target[key];\n } catch {\n /* empty */\n }\n return value;\n}\n\nexport function updateObject<T extends object, L extends object>(\n old: T,\n update: L,\n): asserts old is T & L {\n for (const [key, val] of Object.entries(update)) {\n const existing = old[key as keyof T];\n if (existing !== undefined && existing !== null) {\n throw new FrameworkError(\n `Cannot update object. Key '${key}' already exists and is defined.`,\n [],\n {\n context: {\n existing,\n update: val,\n },\n },\n );\n }\n old[key as keyof T] = val;\n }\n}\n\nexport function customMerge<T extends NonNullable<unknown>>(\n results: T[],\n processors: {\n [K in keyof T]: (value: T[K], oldValue: T[K]) => T[K];\n },\n) {\n if (results.length === 0) {\n throw new TypeError(\"Cannot merge content of an empty array!\");\n }\n\n const finalResult = {} as T;\n for (const next of results) {\n for (const [key, value] of R.entries(next)) {\n const oldValue = finalResult[key as keyof T];\n // @ts-expect-error weak typing due to generated types\n finalResult[key] = (processors[key] ?? R.takeFirstBy(1))(value, oldValue);\n }\n }\n return finalResult;\n}\n\nexport function mapObj<T extends object>(obj: T) {\n return function <K extends keyof T, R = T[K]>(\n fn: (key: K, value: T[K]) => R,\n ): Record<keyof T, R> {\n const updated = {} as Record<keyof T, R>;\n for (const pair of Object.entries(obj)) {\n const [key, value] = pair as [K, T[K]];\n updated[key] = fn(key, value);\n }\n return updated;\n };\n}\n\nexport function safeDefineProperty<T, K extends keyof T>(target: T, key: K, get: () => T[K]) {\n try {\n Object.defineProperty(target, key, {\n enumerable: false,\n configurable: false,\n get() {\n return get();\n },\n });\n } catch (e) {\n if (!(e instanceof TypeError)) {\n throw e;\n }\n }\n}\n\nexport function getLast<T>(iterable: Iterable<T>, fallback?: T): T {\n const iterator = iterable[Symbol.iterator]();\n let result = iterator.next();\n\n if (result.done) {\n if (arguments.length < 2) {\n throw new Error(`Target is empty.`);\n }\n return fallback as T;\n }\n\n let lastValue: T;\n do {\n lastValue = result.value;\n result = iterator.next();\n } while (!result.done);\n\n return lastValue;\n}\n"]}
@@ -21,5 +21,6 @@ declare function customMerge<T extends NonNullable<unknown>>(results: T[], proce
21
21
  }): T;
22
22
  declare function mapObj<T extends object>(obj: T): <K extends keyof T, R = T[K]>(fn: (key: K, value: T[K]) => R) => Record<keyof T, R>;
23
23
  declare function safeDefineProperty<T, K extends keyof T>(target: T, key: K, get: () => T[K]): void;
24
+ declare function getLast<T>(iterable: Iterable<T>, fallback?: T): T;
24
25
 
25
- export { type Override, assign, assignFactory, customMerge, getProp, getPropStrict, hasProp, hasProps, mapObj, omitEmptyValues, omitUndefined, popProp, safeDefineProperty, setProp, updateObject };
26
+ export { type Override, assign, assignFactory, customMerge, getLast, getProp, getPropStrict, hasProp, hasProps, mapObj, omitEmptyValues, omitUndefined, popProp, safeDefineProperty, setProp, updateObject };
@@ -21,5 +21,6 @@ declare function customMerge<T extends NonNullable<unknown>>(results: T[], proce
21
21
  }): T;
22
22
  declare function mapObj<T extends object>(obj: T): <K extends keyof T, R = T[K]>(fn: (key: K, value: T[K]) => R) => Record<keyof T, R>;
23
23
  declare function safeDefineProperty<T, K extends keyof T>(target: T, key: K, get: () => T[K]): void;
24
+ declare function getLast<T>(iterable: Iterable<T>, fallback?: T): T;
24
25
 
25
- export { type Override, assign, assignFactory, customMerge, getProp, getPropStrict, hasProp, hasProps, mapObj, omitEmptyValues, omitUndefined, popProp, safeDefineProperty, setProp, updateObject };
26
+ export { type Override, assign, assignFactory, customMerge, getLast, getProp, getPropStrict, hasProp, hasProps, mapObj, omitEmptyValues, omitUndefined, popProp, safeDefineProperty, setProp, updateObject };
@@ -126,7 +126,24 @@ function safeDefineProperty(target, key, get) {
126
126
  }
127
127
  }
128
128
  __name(safeDefineProperty, "safeDefineProperty");
129
+ function getLast(iterable, fallback) {
130
+ const iterator = iterable[Symbol.iterator]();
131
+ let result = iterator.next();
132
+ if (result.done) {
133
+ if (arguments.length < 2) {
134
+ throw new Error(`Target is empty.`);
135
+ }
136
+ return fallback;
137
+ }
138
+ let lastValue;
139
+ do {
140
+ lastValue = result.value;
141
+ result = iterator.next();
142
+ } while (!result.done);
143
+ return lastValue;
144
+ }
145
+ __name(getLast, "getLast");
129
146
 
130
- export { assign, assignFactory, customMerge, getProp, getPropStrict, hasProp, hasProps, mapObj, omitEmptyValues, omitUndefined, popProp, safeDefineProperty, setProp, updateObject };
147
+ export { assign, assignFactory, customMerge, getLast, getProp, getPropStrict, hasProp, hasProps, mapObj, omitEmptyValues, omitUndefined, popProp, safeDefineProperty, setProp, updateObject };
131
148
  //# sourceMappingURL=object.js.map
132
149
  //# sourceMappingURL=object.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/internals/helpers/object.ts"],"names":["assignFactory","target","source","Object","assign","a","b","omitEmptyValues","R","pickBy","isTruthy","omitUndefined","isDefined","hasProp","key","Boolean","prototype","hasOwnProperty","call","hasProps","keys","every","setProp","paths","value","entry","entries","idx","isPlainObject","isArray","TypeError","isLast","length","newValue","getPropStrict","path","getProp","defaultValue","undefined","popProp","fallback","updateObject","old","update","val","existing","FrameworkError","context","customMerge","results","processors","finalResult","next","oldValue","takeFirstBy","mapObj","obj","fn","updated","pair","safeDefineProperty","get","defineProperty","enumerable","configurable","e"],"mappings":"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","file":"object.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as R from \"remeda\";\nimport { FrameworkError } from \"@/errors.js\";\n\nexport type Override<T, T2 extends Partial<T>> = {\n [K in keyof T2]: K extends keyof T ? T2[K] : never;\n};\n\nexport function assignFactory<T extends NonNullable<unknown>, T2 extends Partial<T>>(target: T) {\n return (source: NonNullable<Override<T, T2>>) => {\n Object.assign(target, source);\n };\n}\n\nexport const assign = <T extends NonNullable<unknown>, T2 extends Partial<T>>(\n a: T,\n b: NonNullable<Override<T, T2>>,\n) => assignFactory(a)(b);\nexport const omitEmptyValues = R.pickBy(R.isTruthy);\nexport const omitUndefined = R.pickBy(R.isDefined);\n\nexport function hasProp<T>(target: T | undefined, key: keyof T): key is keyof T {\n return Boolean(target) && Object.prototype.hasOwnProperty.call(target, key);\n}\n\nexport function hasProps<T>(keys: (keyof T)[]) {\n return (target: T | undefined) => keys.every((key) => hasProp(target, key));\n}\n\nexport function setProp(target: unknown, paths: readonly (keyof any)[], value: unknown) {\n for (const entry of paths.entries()) {\n const [idx, key] = entry as [number, keyof object];\n if (!R.isPlainObject(target) && !R.isArray(target)) {\n throw new TypeError(\"Only plain objects and arrays are supported!\");\n }\n\n const isLast = idx === paths.length - 1;\n const newValue = isLast ? value : (target[key] ?? {});\n Object.assign(target, { [key]: newValue });\n target = target[key];\n }\n}\n\nexport function getPropStrict(target: NonNullable<unknown>, path: string): any {\n if (!target || !(path in target)) {\n throw new TypeError(`Target does not contain key \"${path}\"`);\n }\n return target[path as keyof typeof target];\n}\n\nexport function getProp(\n target: unknown,\n paths: readonly (keyof any)[],\n defaultValue: any = undefined,\n) {\n let value: any = target;\n if (!value) {\n return undefined;\n }\n\n for (const key of paths) {\n if (!hasProp(value, key)) {\n return defaultValue;\n }\n value = value[key];\n }\n return value;\n}\n\nexport function popProp<T, K extends keyof T>(\n target: T,\n key: K,\n fallback: T[K] | null = null,\n): T[K] | null {\n if (!hasProp(target, key)) {\n return fallback;\n }\n const value = getProp(target, [key]);\n try {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete target[key];\n } catch {\n /* empty */\n }\n return value;\n}\n\nexport function updateObject<T extends object, L extends object>(\n old: T,\n update: L,\n): asserts old is T & L {\n for (const [key, val] of Object.entries(update)) {\n const existing = old[key as keyof T];\n if (existing !== undefined && existing !== null) {\n throw new FrameworkError(\n `Cannot update object. Key '${key}' already exists and is defined.`,\n [],\n {\n context: {\n existing,\n update: val,\n },\n },\n );\n }\n old[key as keyof T] = val;\n }\n}\n\nexport function customMerge<T extends NonNullable<unknown>>(\n results: T[],\n processors: {\n [K in keyof T]: (value: T[K], oldValue: T[K]) => T[K];\n },\n) {\n if (results.length === 0) {\n throw new TypeError(\"Cannot merge content of an empty array!\");\n }\n\n const finalResult = {} as T;\n for (const next of results) {\n for (const [key, value] of R.entries(next)) {\n const oldValue = finalResult[key as keyof T];\n // @ts-expect-error weak typing due to generated types\n finalResult[key] = (processors[key] ?? R.takeFirstBy(1))(value, oldValue);\n }\n }\n return finalResult;\n}\n\nexport function mapObj<T extends object>(obj: T) {\n return function <K extends keyof T, R = T[K]>(\n fn: (key: K, value: T[K]) => R,\n ): Record<keyof T, R> {\n const updated = {} as Record<keyof T, R>;\n for (const pair of Object.entries(obj)) {\n const [key, value] = pair as [K, T[K]];\n updated[key] = fn(key, value);\n }\n return updated;\n };\n}\n\nexport function safeDefineProperty<T, K extends keyof T>(target: T, key: K, get: () => T[K]) {\n try {\n Object.defineProperty(target, key, {\n enumerable: false,\n configurable: false,\n get() {\n return get();\n },\n });\n } catch (e) {\n if (!(e instanceof TypeError)) {\n throw e;\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/internals/helpers/object.ts"],"names":["assignFactory","target","source","Object","assign","a","b","omitEmptyValues","R","pickBy","isTruthy","omitUndefined","isDefined","hasProp","key","Boolean","prototype","hasOwnProperty","call","hasProps","keys","every","setProp","paths","value","entry","entries","idx","isPlainObject","isArray","TypeError","isLast","length","newValue","getPropStrict","path","getProp","defaultValue","undefined","popProp","fallback","updateObject","old","update","val","existing","FrameworkError","context","customMerge","results","processors","finalResult","next","oldValue","takeFirstBy","mapObj","obj","fn","updated","pair","safeDefineProperty","get","defineProperty","enumerable","configurable","e","getLast","iterable","iterator","Symbol","result","done","arguments","Error","lastValue"],"mappings":"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","file":"object.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as R from \"remeda\";\nimport { FrameworkError } from \"@/errors.js\";\n\nexport type Override<T, T2 extends Partial<T>> = {\n [K in keyof T2]: K extends keyof T ? T2[K] : never;\n};\n\nexport function assignFactory<T extends NonNullable<unknown>, T2 extends Partial<T>>(target: T) {\n return (source: NonNullable<Override<T, T2>>) => {\n Object.assign(target, source);\n };\n}\n\nexport const assign = <T extends NonNullable<unknown>, T2 extends Partial<T>>(\n a: T,\n b: NonNullable<Override<T, T2>>,\n) => assignFactory(a)(b);\nexport const omitEmptyValues = R.pickBy(R.isTruthy);\nexport const omitUndefined = R.pickBy(R.isDefined);\n\nexport function hasProp<T>(target: T | undefined, key: keyof T): key is keyof T {\n return Boolean(target) && Object.prototype.hasOwnProperty.call(target, key);\n}\n\nexport function hasProps<T>(keys: (keyof T)[]) {\n return (target: T | undefined) => keys.every((key) => hasProp(target, key));\n}\n\nexport function setProp(target: unknown, paths: readonly (keyof any)[], value: unknown) {\n for (const entry of paths.entries()) {\n const [idx, key] = entry as [number, keyof object];\n if (!R.isPlainObject(target) && !R.isArray(target)) {\n throw new TypeError(\"Only plain objects and arrays are supported!\");\n }\n\n const isLast = idx === paths.length - 1;\n const newValue = isLast ? value : (target[key] ?? {});\n Object.assign(target, { [key]: newValue });\n target = target[key];\n }\n}\n\nexport function getPropStrict(target: NonNullable<unknown>, path: string): any {\n if (!target || !(path in target)) {\n throw new TypeError(`Target does not contain key \"${path}\"`);\n }\n return target[path as keyof typeof target];\n}\n\nexport function getProp(\n target: unknown,\n paths: readonly (keyof any)[],\n defaultValue: any = undefined,\n) {\n let value: any = target;\n if (!value) {\n return undefined;\n }\n\n for (const key of paths) {\n if (!hasProp(value, key)) {\n return defaultValue;\n }\n value = value[key];\n }\n return value;\n}\n\nexport function popProp<T, K extends keyof T>(\n target: T,\n key: K,\n fallback: T[K] | null = null,\n): T[K] | null {\n if (!hasProp(target, key)) {\n return fallback;\n }\n const value = getProp(target, [key]);\n try {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete target[key];\n } catch {\n /* empty */\n }\n return value;\n}\n\nexport function updateObject<T extends object, L extends object>(\n old: T,\n update: L,\n): asserts old is T & L {\n for (const [key, val] of Object.entries(update)) {\n const existing = old[key as keyof T];\n if (existing !== undefined && existing !== null) {\n throw new FrameworkError(\n `Cannot update object. Key '${key}' already exists and is defined.`,\n [],\n {\n context: {\n existing,\n update: val,\n },\n },\n );\n }\n old[key as keyof T] = val;\n }\n}\n\nexport function customMerge<T extends NonNullable<unknown>>(\n results: T[],\n processors: {\n [K in keyof T]: (value: T[K], oldValue: T[K]) => T[K];\n },\n) {\n if (results.length === 0) {\n throw new TypeError(\"Cannot merge content of an empty array!\");\n }\n\n const finalResult = {} as T;\n for (const next of results) {\n for (const [key, value] of R.entries(next)) {\n const oldValue = finalResult[key as keyof T];\n // @ts-expect-error weak typing due to generated types\n finalResult[key] = (processors[key] ?? R.takeFirstBy(1))(value, oldValue);\n }\n }\n return finalResult;\n}\n\nexport function mapObj<T extends object>(obj: T) {\n return function <K extends keyof T, R = T[K]>(\n fn: (key: K, value: T[K]) => R,\n ): Record<keyof T, R> {\n const updated = {} as Record<keyof T, R>;\n for (const pair of Object.entries(obj)) {\n const [key, value] = pair as [K, T[K]];\n updated[key] = fn(key, value);\n }\n return updated;\n };\n}\n\nexport function safeDefineProperty<T, K extends keyof T>(target: T, key: K, get: () => T[K]) {\n try {\n Object.defineProperty(target, key, {\n enumerable: false,\n configurable: false,\n get() {\n return get();\n },\n });\n } catch (e) {\n if (!(e instanceof TypeError)) {\n throw e;\n }\n }\n}\n\nexport function getLast<T>(iterable: Iterable<T>, fallback?: T): T {\n const iterator = iterable[Symbol.iterator]();\n let result = iterator.next();\n\n if (result.done) {\n if (arguments.length < 2) {\n throw new Error(`Target is empty.`);\n }\n return fallback as T;\n }\n\n let lastValue: T;\n do {\n lastValue = result.value;\n result = iterator.next();\n } while (!result.done);\n\n return lastValue;\n}\n"]}
@@ -2,7 +2,7 @@ import { Message, MessageContentPart } from '../backend/message.cjs';
2
2
  import { BaseMemory } from './base.cjs';
3
3
  import { PromptTemplate } from '../template.cjs';
4
4
  import { z } from 'zod';
5
- import { m as ChatModel } from '../chat-BOb9n7AJ.cjs';
5
+ import { m as ChatModel } from '../chat-CC0s8z23.cjs';
6
6
  import '../internals/serializable.cjs';
7
7
  import '../internals/types.cjs';
8
8
  import '../internals/helpers/guards.cjs';
@@ -2,7 +2,7 @@ import { Message, MessageContentPart } from '../backend/message.js';
2
2
  import { BaseMemory } from './base.js';
3
3
  import { PromptTemplate } from '../template.js';
4
4
  import { z } from 'zod';
5
- import { m as ChatModel } from '../chat-DrqwUgD8.js';
5
+ import { m as ChatModel } from '../chat-D8SVtw5Q.js';
6
6
  import '../internals/serializable.js';
7
7
  import '../internals/types.js';
8
8
  import '../internals/helpers/guards.js';
@@ -35,10 +35,16 @@ class StreamToolCallMiddleware extends context_cjs.Middleware {
35
35
  ]
36
36
  });
37
37
  }
38
- bind(ctx) {
38
+ reset() {
39
39
  this.output = new chat_cjs.ChatModelOutput([]);
40
40
  this.buffer = "";
41
41
  this.delta = "";
42
+ }
43
+ isEmpty() {
44
+ return this.buffer.length === 0;
45
+ }
46
+ bind(ctx) {
47
+ this.reset();
42
48
  this.cleanups.push(ctx.instance.emitter.match((meta) => meta.creator instanceof chat_cjs.ChatModel && meta.name === "start", this.handleStart.bind(this), this.createEmitterOptions()));
43
49
  this.cleanups.push(ctx.instance.emitter.match((meta) => meta.creator instanceof chat_cjs.ChatModel && meta.name === "newToken", this.handleNewToken.bind(this), this.createEmitterOptions()));
44
50
  this.cleanups.push(ctx.instance.emitter.match((meta) => meta.creator instanceof chat_cjs.ChatModel && meta.name === "success", this.handleSuccess.bind(this), this.createEmitterOptions()));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/middleware/streamToolCall.ts"],"names":["StreamToolCallMiddleware","Middleware","target","key","matchNested","forceStreaming","cleanups","output","ChatModelOutput","buffer","delta","emitter","options","Emitter","root","child","namespace","bind","ctx","push","instance","match","meta","creator","ChatModel","name","handleStart","createEmitterOptions","handleNewToken","handleSuccess","unbind","length","fn","shift","isBlocking","process","toolName","args","parsedArgs","isString","parseBrokenJson","pair","outputStructured","parse","catch","hasProp","JSON","stringify","slice","emit","data","_meta","input","stream","streamPartialToolCalls","messages","value","callbacks","abort","merge","toolCalls","getToolCalls","toolCall","textContent","getTextContent","isPlainObject","parameters"],"mappings":"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","file":"streamToolCall.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Middleware, RunContext, RunInstance } from \"@/context.js\";\nimport { Callback, Emitter, EventMeta } from \"@/emitter/emitter.js\";\nimport { ChatModel, ChatModelEvents } from \"@/backend/chat.js\";\nimport { ChatModelOutput } from \"@/backend/chat.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport { parseBrokenJson } from \"@/internals/helpers/schema.js\";\nimport { isPlainObject, isString } from \"remeda\";\nimport { hasProp } from \"@/internals/helpers/object.js\";\nimport { EmitterOptions, InferCallbackValue } from \"@/emitter/types.js\";\n\n/**\n * Event emitted when the middleware detects an update to the target tool's arguments\n */\nexport interface StreamToolCallMiddlewareUpdateEvent<T = any> {\n /** The validated and structured tool input */\n outputStructured: T | null;\n /** The current value of the target field */\n output: string;\n /** The incremental change since the last update */\n delta: string;\n}\n\n/**\n * Callbacks for StreamToolCallMiddleware events\n */\nexport interface StreamToolCallMiddlewareCallbacks<T = any> {\n update: Callback<StreamToolCallMiddlewareUpdateEvent<T>>;\n}\n\n/**\n * Options for configuring StreamToolCallMiddleware\n */\nexport interface StreamToolCallMiddlewareOptions {\n /** The tool to monitor for streaming updates */\n target: Tool<any>;\n /** The field name in the tool's input schema to stream */\n key: string;\n /** Whether to apply middleware to nested run contexts */\n matchNested?: boolean;\n /** Whether to force streaming on the ChatModel */\n forceStreaming?: boolean;\n}\n\n/**\n * Middleware for handling streaming tool calls in a ChatModel.\n *\n * This middleware observes and listens to ChatModel stream updates and parses\n * the tool calls on demand so that they can be consumed as soon as possible.\n *\n * @example\n * ```typescript\n * const middleware = new StreamToolCallMiddleware({\n * target: thinkTool,\n * key: \"thoughts\",\n * matchNested: false,\n * forceStreaming: true,\n * });\n *\n * middleware.emitter.on(\"update\", (event) => {\n * console.log(\"Delta:\", event.delta);\n * console.log(\"Structured:\", event.outputStructured);\n * });\n *\n * await llm.run(messages, { tools: [thinkTool] }).middleware(middleware);\n * ```\n */\nexport class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance> {\n private readonly target: Tool<any>;\n private readonly key: string;\n private readonly matchNested: boolean;\n private readonly forceStreaming: boolean;\n private readonly cleanups: (() => void)[] = [];\n\n private output = new ChatModelOutput([]);\n private buffer = \"\";\n private delta = \"\";\n\n public readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;\n\n constructor(options: StreamToolCallMiddlewareOptions) {\n super();\n\n this.target = options.target;\n this.key = options.key;\n this.matchNested = options.matchNested ?? false;\n this.forceStreaming = options.forceStreaming ?? false;\n\n this.emitter = Emitter.root.child<StreamToolCallMiddlewareCallbacks<T>>({\n namespace: [\"middleware\", \"streamToolCall\"],\n });\n }\n\n bind(ctx: RunContext<RunInstance>): void {\n // Reset state\n this.output = new ChatModelOutput([]);\n this.buffer = \"\";\n this.delta = \"\";\n\n // Listen to ChatModel start event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"start\",\n this.handleStart.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel newToken event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"newToken\",\n this.handleNewToken.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel success event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"success\",\n this.handleSuccess.bind(this),\n this.createEmitterOptions(),\n ),\n );\n }\n\n unbind(): void {\n // Clean up previous bindings\n while (this.cleanups.length > 0) {\n const fn = this.cleanups.shift()!;\n fn();\n }\n }\n\n protected createEmitterOptions(): EmitterOptions {\n return {\n matchNested: this.matchNested,\n isBlocking: true,\n };\n }\n\n private async process(toolName: string, args: any): Promise<void> {\n if (toolName !== this.target.name) {\n return;\n }\n\n const parsedArgs = isString(args) ? parseBrokenJson(args, { pair: [\"{\", \"}\"] }) : args;\n const outputStructured = (await this.target.parse(parsedArgs).catch(() => null)) as T;\n if (!outputStructured) {\n return;\n }\n\n let output = \"\";\n if (hasProp(outputStructured, this.key as keyof T)) {\n output = (outputStructured as any)[this.key] || \"\";\n if (!isString(output)) {\n output = JSON.stringify(output);\n }\n this.delta = output.slice(this.buffer.length);\n this.buffer = output;\n\n if (!this.delta) {\n return;\n }\n }\n\n await this.emitter.emit(\"update\", {\n outputStructured,\n delta: this.delta,\n output,\n });\n }\n\n private async handleStart(\n data: InferCallbackValue<ChatModelEvents[\"start\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n if (this.forceStreaming) {\n data.input.stream = true;\n data.input.streamPartialToolCalls = true;\n }\n }\n\n private async handleSuccess(\n data: InferCallbackValue<ChatModelEvents[\"success\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n // If we haven't received any tokens yet, process the final output\n if (this.output.messages.length === 0) {\n await this.handleNewToken({ value: data.value, callbacks: { abort: () => {} } }, _meta);\n }\n }\n\n private async handleNewToken(\n data: InferCallbackValue<ChatModelEvents[\"newToken\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n await this.output.merge(data.value);\n\n const toolCalls = this.output.getToolCalls();\n if (toolCalls.length > 0) {\n for (const toolCall of toolCalls) {\n await this.process(toolCall.toolName, toolCall.input);\n }\n return;\n }\n\n // Try to parse text content as a tool call\n const textContent = this.output.getTextContent();\n const toolCall = parseBrokenJson(textContent, { pair: [\"{\", \"}\"] });\n\n if (!toolCall || !isPlainObject(toolCall)) {\n return;\n }\n\n await this.process(toolCall.name as string, toolCall.parameters as any);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/middleware/streamToolCall.ts"],"names":["StreamToolCallMiddleware","Middleware","target","key","matchNested","forceStreaming","cleanups","output","ChatModelOutput","buffer","delta","emitter","options","Emitter","root","child","namespace","reset","isEmpty","length","bind","ctx","push","instance","match","meta","creator","ChatModel","name","handleStart","createEmitterOptions","handleNewToken","handleSuccess","unbind","fn","shift","isBlocking","process","toolName","args","parsedArgs","isString","parseBrokenJson","pair","outputStructured","parse","catch","hasProp","JSON","stringify","slice","emit","data","_meta","input","stream","streamPartialToolCalls","messages","value","callbacks","abort","merge","toolCalls","getToolCalls","toolCall","textContent","getTextContent","isPlainObject","parameters"],"mappings":"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","file":"streamToolCall.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Middleware, RunContext, RunInstance } from \"@/context.js\";\nimport { Callback, Emitter, EventMeta } from \"@/emitter/emitter.js\";\nimport { ChatModel, ChatModelEvents } from \"@/backend/chat.js\";\nimport { ChatModelOutput } from \"@/backend/chat.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport { parseBrokenJson } from \"@/internals/helpers/schema.js\";\nimport { isPlainObject, isString } from \"remeda\";\nimport { hasProp } from \"@/internals/helpers/object.js\";\nimport { EmitterOptions, InferCallbackValue } from \"@/emitter/types.js\";\n\n/**\n * Event emitted when the middleware detects an update to the target tool's arguments\n */\nexport interface StreamToolCallMiddlewareUpdateEvent<T = any> {\n /** The validated and structured tool input */\n outputStructured: T | null;\n /** The current value of the target field */\n output: string;\n /** The incremental change since the last update */\n delta: string;\n}\n\n/**\n * Callbacks for StreamToolCallMiddleware events\n */\nexport interface StreamToolCallMiddlewareCallbacks<T = any> {\n update: Callback<StreamToolCallMiddlewareUpdateEvent<T>>;\n}\n\n/**\n * Options for configuring StreamToolCallMiddleware\n */\nexport interface StreamToolCallMiddlewareOptions {\n /** The tool to monitor for streaming updates */\n target: Tool<any>;\n /** The field name in the tool's input schema to stream */\n key: string;\n /** Whether to apply middleware to nested run contexts */\n matchNested?: boolean;\n /** Whether to force streaming on the ChatModel */\n forceStreaming?: boolean;\n}\n\n/**\n * Middleware for handling streaming tool calls in a ChatModel.\n *\n * This middleware observes and listens to ChatModel stream updates and parses\n * the tool calls on demand so that they can be consumed as soon as possible.\n *\n * @example\n * ```typescript\n * const middleware = new StreamToolCallMiddleware({\n * target: thinkTool,\n * key: \"thoughts\",\n * matchNested: false,\n * forceStreaming: true,\n * });\n *\n * middleware.emitter.on(\"update\", (event) => {\n * console.log(\"Delta:\", event.delta);\n * console.log(\"Structured:\", event.outputStructured);\n * });\n *\n * await llm.run(messages, { tools: [thinkTool] }).middleware(middleware);\n * ```\n */\nexport class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance> {\n private readonly target: Tool<any>;\n private readonly key: string;\n private readonly matchNested: boolean;\n private readonly forceStreaming: boolean;\n private readonly cleanups: (() => void)[] = [];\n\n private output = new ChatModelOutput([]);\n private buffer = \"\";\n private delta = \"\";\n\n public readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;\n\n constructor(options: StreamToolCallMiddlewareOptions) {\n super();\n\n this.target = options.target;\n this.key = options.key;\n this.matchNested = options.matchNested ?? false;\n this.forceStreaming = options.forceStreaming ?? false;\n\n this.emitter = Emitter.root.child<StreamToolCallMiddlewareCallbacks<T>>({\n namespace: [\"middleware\", \"streamToolCall\"],\n });\n }\n\n reset() {\n this.output = new ChatModelOutput([]);\n this.buffer = \"\";\n this.delta = \"\";\n }\n\n isEmpty() {\n return this.buffer.length === 0;\n }\n\n bind(ctx: RunContext<RunInstance>): void {\n this.reset();\n\n // Listen to ChatModel start event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"start\",\n this.handleStart.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel newToken event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"newToken\",\n this.handleNewToken.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel success event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"success\",\n this.handleSuccess.bind(this),\n this.createEmitterOptions(),\n ),\n );\n }\n\n unbind(): void {\n // Clean up previous bindings\n while (this.cleanups.length > 0) {\n const fn = this.cleanups.shift()!;\n fn();\n }\n }\n\n protected createEmitterOptions(): EmitterOptions {\n return {\n matchNested: this.matchNested,\n isBlocking: true,\n };\n }\n\n private async process(toolName: string, args: any): Promise<void> {\n if (toolName !== this.target.name) {\n return;\n }\n\n const parsedArgs = isString(args) ? parseBrokenJson(args, { pair: [\"{\", \"}\"] }) : args;\n const outputStructured = (await this.target.parse(parsedArgs).catch(() => null)) as T;\n if (!outputStructured) {\n return;\n }\n\n let output = \"\";\n if (hasProp(outputStructured, this.key as keyof T)) {\n output = (outputStructured as any)[this.key] || \"\";\n if (!isString(output)) {\n output = JSON.stringify(output);\n }\n this.delta = output.slice(this.buffer.length);\n this.buffer = output;\n\n if (!this.delta) {\n return;\n }\n }\n\n await this.emitter.emit(\"update\", {\n outputStructured,\n delta: this.delta,\n output,\n });\n }\n\n private async handleStart(\n data: InferCallbackValue<ChatModelEvents[\"start\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n if (this.forceStreaming) {\n data.input.stream = true;\n data.input.streamPartialToolCalls = true;\n }\n }\n\n private async handleSuccess(\n data: InferCallbackValue<ChatModelEvents[\"success\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n // If we haven't received any tokens yet, process the final output\n if (this.output.messages.length === 0) {\n await this.handleNewToken({ value: data.value, callbacks: { abort: () => {} } }, _meta);\n }\n }\n\n private async handleNewToken(\n data: InferCallbackValue<ChatModelEvents[\"newToken\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n await this.output.merge(data.value);\n\n const toolCalls = this.output.getToolCalls();\n if (toolCalls.length > 0) {\n for (const toolCall of toolCalls) {\n await this.process(toolCall.toolName, toolCall.input);\n }\n return;\n }\n\n // Try to parse text content as a tool call\n const textContent = this.output.getTextContent();\n const toolCall = parseBrokenJson(textContent, { pair: [\"{\", \"}\"] });\n\n if (!toolCall || !isPlainObject(toolCall)) {\n return;\n }\n\n await this.process(toolCall.name as string, toolCall.parameters as any);\n }\n}\n"]}
@@ -82,6 +82,8 @@ declare class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance>
82
82
  private delta;
83
83
  readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;
84
84
  constructor(options: StreamToolCallMiddlewareOptions);
85
+ reset(): void;
86
+ isEmpty(): boolean;
85
87
  bind(ctx: RunContext<RunInstance>): void;
86
88
  unbind(): void;
87
89
  protected createEmitterOptions(): EmitterOptions;
@@ -82,6 +82,8 @@ declare class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance>
82
82
  private delta;
83
83
  readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;
84
84
  constructor(options: StreamToolCallMiddlewareOptions);
85
+ reset(): void;
86
+ isEmpty(): boolean;
85
87
  bind(ctx: RunContext<RunInstance>): void;
86
88
  unbind(): void;
87
89
  protected createEmitterOptions(): EmitterOptions;
@@ -33,10 +33,16 @@ class StreamToolCallMiddleware extends Middleware {
33
33
  ]
34
34
  });
35
35
  }
36
- bind(ctx) {
36
+ reset() {
37
37
  this.output = new ChatModelOutput([]);
38
38
  this.buffer = "";
39
39
  this.delta = "";
40
+ }
41
+ isEmpty() {
42
+ return this.buffer.length === 0;
43
+ }
44
+ bind(ctx) {
45
+ this.reset();
40
46
  this.cleanups.push(ctx.instance.emitter.match((meta) => meta.creator instanceof ChatModel && meta.name === "start", this.handleStart.bind(this), this.createEmitterOptions()));
41
47
  this.cleanups.push(ctx.instance.emitter.match((meta) => meta.creator instanceof ChatModel && meta.name === "newToken", this.handleNewToken.bind(this), this.createEmitterOptions()));
42
48
  this.cleanups.push(ctx.instance.emitter.match((meta) => meta.creator instanceof ChatModel && meta.name === "success", this.handleSuccess.bind(this), this.createEmitterOptions()));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/middleware/streamToolCall.ts"],"names":["StreamToolCallMiddleware","Middleware","target","key","matchNested","forceStreaming","cleanups","output","ChatModelOutput","buffer","delta","emitter","options","Emitter","root","child","namespace","bind","ctx","push","instance","match","meta","creator","ChatModel","name","handleStart","createEmitterOptions","handleNewToken","handleSuccess","unbind","length","fn","shift","isBlocking","process","toolName","args","parsedArgs","isString","parseBrokenJson","pair","outputStructured","parse","catch","hasProp","JSON","stringify","slice","emit","data","_meta","input","stream","streamPartialToolCalls","messages","value","callbacks","abort","merge","toolCalls","getToolCalls","toolCall","textContent","getTextContent","isPlainObject","parameters"],"mappings":"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","file":"streamToolCall.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Middleware, RunContext, RunInstance } from \"@/context.js\";\nimport { Callback, Emitter, EventMeta } from \"@/emitter/emitter.js\";\nimport { ChatModel, ChatModelEvents } from \"@/backend/chat.js\";\nimport { ChatModelOutput } from \"@/backend/chat.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport { parseBrokenJson } from \"@/internals/helpers/schema.js\";\nimport { isPlainObject, isString } from \"remeda\";\nimport { hasProp } from \"@/internals/helpers/object.js\";\nimport { EmitterOptions, InferCallbackValue } from \"@/emitter/types.js\";\n\n/**\n * Event emitted when the middleware detects an update to the target tool's arguments\n */\nexport interface StreamToolCallMiddlewareUpdateEvent<T = any> {\n /** The validated and structured tool input */\n outputStructured: T | null;\n /** The current value of the target field */\n output: string;\n /** The incremental change since the last update */\n delta: string;\n}\n\n/**\n * Callbacks for StreamToolCallMiddleware events\n */\nexport interface StreamToolCallMiddlewareCallbacks<T = any> {\n update: Callback<StreamToolCallMiddlewareUpdateEvent<T>>;\n}\n\n/**\n * Options for configuring StreamToolCallMiddleware\n */\nexport interface StreamToolCallMiddlewareOptions {\n /** The tool to monitor for streaming updates */\n target: Tool<any>;\n /** The field name in the tool's input schema to stream */\n key: string;\n /** Whether to apply middleware to nested run contexts */\n matchNested?: boolean;\n /** Whether to force streaming on the ChatModel */\n forceStreaming?: boolean;\n}\n\n/**\n * Middleware for handling streaming tool calls in a ChatModel.\n *\n * This middleware observes and listens to ChatModel stream updates and parses\n * the tool calls on demand so that they can be consumed as soon as possible.\n *\n * @example\n * ```typescript\n * const middleware = new StreamToolCallMiddleware({\n * target: thinkTool,\n * key: \"thoughts\",\n * matchNested: false,\n * forceStreaming: true,\n * });\n *\n * middleware.emitter.on(\"update\", (event) => {\n * console.log(\"Delta:\", event.delta);\n * console.log(\"Structured:\", event.outputStructured);\n * });\n *\n * await llm.run(messages, { tools: [thinkTool] }).middleware(middleware);\n * ```\n */\nexport class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance> {\n private readonly target: Tool<any>;\n private readonly key: string;\n private readonly matchNested: boolean;\n private readonly forceStreaming: boolean;\n private readonly cleanups: (() => void)[] = [];\n\n private output = new ChatModelOutput([]);\n private buffer = \"\";\n private delta = \"\";\n\n public readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;\n\n constructor(options: StreamToolCallMiddlewareOptions) {\n super();\n\n this.target = options.target;\n this.key = options.key;\n this.matchNested = options.matchNested ?? false;\n this.forceStreaming = options.forceStreaming ?? false;\n\n this.emitter = Emitter.root.child<StreamToolCallMiddlewareCallbacks<T>>({\n namespace: [\"middleware\", \"streamToolCall\"],\n });\n }\n\n bind(ctx: RunContext<RunInstance>): void {\n // Reset state\n this.output = new ChatModelOutput([]);\n this.buffer = \"\";\n this.delta = \"\";\n\n // Listen to ChatModel start event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"start\",\n this.handleStart.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel newToken event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"newToken\",\n this.handleNewToken.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel success event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"success\",\n this.handleSuccess.bind(this),\n this.createEmitterOptions(),\n ),\n );\n }\n\n unbind(): void {\n // Clean up previous bindings\n while (this.cleanups.length > 0) {\n const fn = this.cleanups.shift()!;\n fn();\n }\n }\n\n protected createEmitterOptions(): EmitterOptions {\n return {\n matchNested: this.matchNested,\n isBlocking: true,\n };\n }\n\n private async process(toolName: string, args: any): Promise<void> {\n if (toolName !== this.target.name) {\n return;\n }\n\n const parsedArgs = isString(args) ? parseBrokenJson(args, { pair: [\"{\", \"}\"] }) : args;\n const outputStructured = (await this.target.parse(parsedArgs).catch(() => null)) as T;\n if (!outputStructured) {\n return;\n }\n\n let output = \"\";\n if (hasProp(outputStructured, this.key as keyof T)) {\n output = (outputStructured as any)[this.key] || \"\";\n if (!isString(output)) {\n output = JSON.stringify(output);\n }\n this.delta = output.slice(this.buffer.length);\n this.buffer = output;\n\n if (!this.delta) {\n return;\n }\n }\n\n await this.emitter.emit(\"update\", {\n outputStructured,\n delta: this.delta,\n output,\n });\n }\n\n private async handleStart(\n data: InferCallbackValue<ChatModelEvents[\"start\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n if (this.forceStreaming) {\n data.input.stream = true;\n data.input.streamPartialToolCalls = true;\n }\n }\n\n private async handleSuccess(\n data: InferCallbackValue<ChatModelEvents[\"success\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n // If we haven't received any tokens yet, process the final output\n if (this.output.messages.length === 0) {\n await this.handleNewToken({ value: data.value, callbacks: { abort: () => {} } }, _meta);\n }\n }\n\n private async handleNewToken(\n data: InferCallbackValue<ChatModelEvents[\"newToken\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n await this.output.merge(data.value);\n\n const toolCalls = this.output.getToolCalls();\n if (toolCalls.length > 0) {\n for (const toolCall of toolCalls) {\n await this.process(toolCall.toolName, toolCall.input);\n }\n return;\n }\n\n // Try to parse text content as a tool call\n const textContent = this.output.getTextContent();\n const toolCall = parseBrokenJson(textContent, { pair: [\"{\", \"}\"] });\n\n if (!toolCall || !isPlainObject(toolCall)) {\n return;\n }\n\n await this.process(toolCall.name as string, toolCall.parameters as any);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/middleware/streamToolCall.ts"],"names":["StreamToolCallMiddleware","Middleware","target","key","matchNested","forceStreaming","cleanups","output","ChatModelOutput","buffer","delta","emitter","options","Emitter","root","child","namespace","reset","isEmpty","length","bind","ctx","push","instance","match","meta","creator","ChatModel","name","handleStart","createEmitterOptions","handleNewToken","handleSuccess","unbind","fn","shift","isBlocking","process","toolName","args","parsedArgs","isString","parseBrokenJson","pair","outputStructured","parse","catch","hasProp","JSON","stringify","slice","emit","data","_meta","input","stream","streamPartialToolCalls","messages","value","callbacks","abort","merge","toolCalls","getToolCalls","toolCall","textContent","getTextContent","isPlainObject","parameters"],"mappings":"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","file":"streamToolCall.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Middleware, RunContext, RunInstance } from \"@/context.js\";\nimport { Callback, Emitter, EventMeta } from \"@/emitter/emitter.js\";\nimport { ChatModel, ChatModelEvents } from \"@/backend/chat.js\";\nimport { ChatModelOutput } from \"@/backend/chat.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport { parseBrokenJson } from \"@/internals/helpers/schema.js\";\nimport { isPlainObject, isString } from \"remeda\";\nimport { hasProp } from \"@/internals/helpers/object.js\";\nimport { EmitterOptions, InferCallbackValue } from \"@/emitter/types.js\";\n\n/**\n * Event emitted when the middleware detects an update to the target tool's arguments\n */\nexport interface StreamToolCallMiddlewareUpdateEvent<T = any> {\n /** The validated and structured tool input */\n outputStructured: T | null;\n /** The current value of the target field */\n output: string;\n /** The incremental change since the last update */\n delta: string;\n}\n\n/**\n * Callbacks for StreamToolCallMiddleware events\n */\nexport interface StreamToolCallMiddlewareCallbacks<T = any> {\n update: Callback<StreamToolCallMiddlewareUpdateEvent<T>>;\n}\n\n/**\n * Options for configuring StreamToolCallMiddleware\n */\nexport interface StreamToolCallMiddlewareOptions {\n /** The tool to monitor for streaming updates */\n target: Tool<any>;\n /** The field name in the tool's input schema to stream */\n key: string;\n /** Whether to apply middleware to nested run contexts */\n matchNested?: boolean;\n /** Whether to force streaming on the ChatModel */\n forceStreaming?: boolean;\n}\n\n/**\n * Middleware for handling streaming tool calls in a ChatModel.\n *\n * This middleware observes and listens to ChatModel stream updates and parses\n * the tool calls on demand so that they can be consumed as soon as possible.\n *\n * @example\n * ```typescript\n * const middleware = new StreamToolCallMiddleware({\n * target: thinkTool,\n * key: \"thoughts\",\n * matchNested: false,\n * forceStreaming: true,\n * });\n *\n * middleware.emitter.on(\"update\", (event) => {\n * console.log(\"Delta:\", event.delta);\n * console.log(\"Structured:\", event.outputStructured);\n * });\n *\n * await llm.run(messages, { tools: [thinkTool] }).middleware(middleware);\n * ```\n */\nexport class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance> {\n private readonly target: Tool<any>;\n private readonly key: string;\n private readonly matchNested: boolean;\n private readonly forceStreaming: boolean;\n private readonly cleanups: (() => void)[] = [];\n\n private output = new ChatModelOutput([]);\n private buffer = \"\";\n private delta = \"\";\n\n public readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;\n\n constructor(options: StreamToolCallMiddlewareOptions) {\n super();\n\n this.target = options.target;\n this.key = options.key;\n this.matchNested = options.matchNested ?? false;\n this.forceStreaming = options.forceStreaming ?? false;\n\n this.emitter = Emitter.root.child<StreamToolCallMiddlewareCallbacks<T>>({\n namespace: [\"middleware\", \"streamToolCall\"],\n });\n }\n\n reset() {\n this.output = new ChatModelOutput([]);\n this.buffer = \"\";\n this.delta = \"\";\n }\n\n isEmpty() {\n return this.buffer.length === 0;\n }\n\n bind(ctx: RunContext<RunInstance>): void {\n this.reset();\n\n // Listen to ChatModel start event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"start\",\n this.handleStart.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel newToken event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"newToken\",\n this.handleNewToken.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel success event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"success\",\n this.handleSuccess.bind(this),\n this.createEmitterOptions(),\n ),\n );\n }\n\n unbind(): void {\n // Clean up previous bindings\n while (this.cleanups.length > 0) {\n const fn = this.cleanups.shift()!;\n fn();\n }\n }\n\n protected createEmitterOptions(): EmitterOptions {\n return {\n matchNested: this.matchNested,\n isBlocking: true,\n };\n }\n\n private async process(toolName: string, args: any): Promise<void> {\n if (toolName !== this.target.name) {\n return;\n }\n\n const parsedArgs = isString(args) ? parseBrokenJson(args, { pair: [\"{\", \"}\"] }) : args;\n const outputStructured = (await this.target.parse(parsedArgs).catch(() => null)) as T;\n if (!outputStructured) {\n return;\n }\n\n let output = \"\";\n if (hasProp(outputStructured, this.key as keyof T)) {\n output = (outputStructured as any)[this.key] || \"\";\n if (!isString(output)) {\n output = JSON.stringify(output);\n }\n this.delta = output.slice(this.buffer.length);\n this.buffer = output;\n\n if (!this.delta) {\n return;\n }\n }\n\n await this.emitter.emit(\"update\", {\n outputStructured,\n delta: this.delta,\n output,\n });\n }\n\n private async handleStart(\n data: InferCallbackValue<ChatModelEvents[\"start\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n if (this.forceStreaming) {\n data.input.stream = true;\n data.input.streamPartialToolCalls = true;\n }\n }\n\n private async handleSuccess(\n data: InferCallbackValue<ChatModelEvents[\"success\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n // If we haven't received any tokens yet, process the final output\n if (this.output.messages.length === 0) {\n await this.handleNewToken({ value: data.value, callbacks: { abort: () => {} } }, _meta);\n }\n }\n\n private async handleNewToken(\n data: InferCallbackValue<ChatModelEvents[\"newToken\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n await this.output.merge(data.value);\n\n const toolCalls = this.output.getToolCalls();\n if (toolCalls.length > 0) {\n for (const toolCall of toolCalls) {\n await this.process(toolCall.toolName, toolCall.input);\n }\n return;\n }\n\n // Try to parse text content as a tool call\n const textContent = this.output.getTextContent();\n const toolCall = parseBrokenJson(textContent, { pair: [\"{\", \"}\"] });\n\n if (!toolCall || !isPlainObject(toolCall)) {\n return;\n }\n\n await this.process(toolCall.name as string, toolCall.parameters as any);\n }\n}\n"]}
@@ -18,7 +18,7 @@ import './python/storage.cjs';
18
18
  import 'fs';
19
19
  import './python/output.cjs';
20
20
  import 'node:tls';
21
- import '../chat-BOb9n7AJ.cjs';
21
+ import '../chat-CC0s8z23.cjs';
22
22
  import '../backend/message.cjs';
23
23
  import 'ai';
24
24
  import '../backend/constants.cjs';
@@ -18,7 +18,7 @@ import './python/storage.js';
18
18
  import 'fs';
19
19
  import './python/output.js';
20
20
  import 'node:tls';
21
- import '../chat-DrqwUgD8.js';
21
+ import '../chat-D8SVtw5Q.js';
22
22
  import '../backend/message.js';
23
23
  import 'ai';
24
24
  import '../backend/constants.js';
@@ -46,21 +46,21 @@ declare class MilvusDatabaseTool extends Tool<JSONToolOutput<MilvusSearchToolRes
46
46
  }, "strip", z.ZodTypeAny, {
47
47
  action: MilvusAction;
48
48
  filter?: string | undefined;
49
+ metadata?: Record<string, any> | undefined;
49
50
  collectionName?: string | undefined;
50
51
  vector?: number[] | undefined;
51
52
  vectors?: number[][] | undefined;
52
53
  topK?: number | undefined;
53
- metadata?: Record<string, any> | undefined;
54
54
  ids?: (string | number)[] | undefined;
55
55
  searchOutput?: string[] | undefined;
56
56
  }, {
57
57
  action: MilvusAction;
58
58
  filter?: string | undefined;
59
+ metadata?: Record<string, any> | undefined;
59
60
  collectionName?: string | undefined;
60
61
  vector?: number[] | undefined;
61
62
  vectors?: number[][] | undefined;
62
63
  topK?: number | undefined;
63
- metadata?: Record<string, any> | undefined;
64
64
  ids?: (string | number)[] | undefined;
65
65
  searchOutput?: string[] | undefined;
66
66
  }>;
@@ -46,21 +46,21 @@ declare class MilvusDatabaseTool extends Tool<JSONToolOutput<MilvusSearchToolRes
46
46
  }, "strip", z.ZodTypeAny, {
47
47
  action: MilvusAction;
48
48
  filter?: string | undefined;
49
+ metadata?: Record<string, any> | undefined;
49
50
  collectionName?: string | undefined;
50
51
  vector?: number[] | undefined;
51
52
  vectors?: number[][] | undefined;
52
53
  topK?: number | undefined;
53
- metadata?: Record<string, any> | undefined;
54
54
  ids?: (string | number)[] | undefined;
55
55
  searchOutput?: string[] | undefined;
56
56
  }, {
57
57
  action: MilvusAction;
58
58
  filter?: string | undefined;
59
+ metadata?: Record<string, any> | undefined;
59
60
  collectionName?: string | undefined;
60
61
  vector?: number[] | undefined;
61
62
  vectors?: number[][] | undefined;
62
63
  topK?: number | undefined;
63
- metadata?: Record<string, any> | undefined;
64
64
  ids?: (string | number)[] | undefined;
65
65
  searchOutput?: string[] | undefined;
66
66
  }>;
@@ -2,7 +2,7 @@ import { BaseToolOptions, Tool, StringToolOutput, ToolEmitter, ToolInput, BaseTo
2
2
  import { z } from 'zod';
3
3
  import { GetRunContext } from '../context.cjs';
4
4
  import { PromptTemplate } from '../template.cjs';
5
- import { m as ChatModel } from '../chat-BOb9n7AJ.cjs';
5
+ import { m as ChatModel } from '../chat-CC0s8z23.cjs';
6
6
  import 'ajv';
7
7
  import '../errors.cjs';
8
8
  import '../internals/types.cjs';
@@ -2,7 +2,7 @@ import { BaseToolOptions, Tool, StringToolOutput, ToolEmitter, ToolInput, BaseTo
2
2
  import { z } from 'zod';
3
3
  import { GetRunContext } from '../context.js';
4
4
  import { PromptTemplate } from '../template.js';
5
- import { m as ChatModel } from '../chat-DrqwUgD8.js';
5
+ import { m as ChatModel } from '../chat-D8SVtw5Q.js';
6
6
  import 'ajv';
7
7
  import '../errors.js';
8
8
  import '../internals/types.js';
@@ -8,7 +8,7 @@ import { PythonToolOutput } from './output.cjs';
8
8
  import { ConnectionOptions } from 'node:tls';
9
9
  import { RunContext } from '../../context.cjs';
10
10
  import { E as Emitter } from '../../emitter-jN55XZZq.cjs';
11
- import { m as ChatModel } from '../../chat-BOb9n7AJ.cjs';
11
+ import { m as ChatModel } from '../../chat-CC0s8z23.cjs';
12
12
  import '../../internals/serializable.cjs';
13
13
  import '../../internals/types.cjs';
14
14
  import '../../internals/helpers/guards.cjs';
@@ -8,7 +8,7 @@ import { PythonToolOutput } from './output.js';
8
8
  import { ConnectionOptions } from 'node:tls';
9
9
  import { RunContext } from '../../context.js';
10
10
  import { E as Emitter } from '../../emitter-36-9MnvA.js';
11
- import { m as ChatModel } from '../../chat-DrqwUgD8.js';
11
+ import { m as ChatModel } from '../../chat-D8SVtw5Q.js';
12
12
  import '../../internals/serializable.js';
13
13
  import '../../internals/types.js';
14
14
  import '../../internals/helpers/guards.js';
@@ -3,7 +3,7 @@ import { AssistantMessage } from './backend/message.cjs';
3
3
  import { Tool, BaseToolRunOptions, StringToolOutput, AnyTool, ToolOutput } from './tools/base.cjs';
4
4
  import { FrameworkError } from './errors.cjs';
5
5
  import { PromptTemplate } from './template.cjs';
6
- import { f as ChatModelUsage, c as ChatModelToolChoice, n as ChatModelOutput } from './chat-BOb9n7AJ.cjs';
6
+ import { f as ChatModelUsage, c as ChatModelToolChoice, n as ChatModelOutput } from './chat-CC0s8z23.cjs';
7
7
  import { B as BaseAgentRunOptions } from './base-XfWeXQ-S.cjs';
8
8
  import { ZodSchema, z } from 'zod';
9
9
  import { ToolCallPart } from 'ai';
@@ -61,23 +61,23 @@ declare const RequirementAgentSystemPromptInputSchema: z.ZodObject<{
61
61
  allowed: z.ZodString;
62
62
  reason: z.ZodOptional<z.ZodString>;
63
63
  }, "strip", z.ZodTypeAny, {
64
- inputSchema: string;
65
64
  name: string;
66
65
  description: string;
66
+ inputSchema: string;
67
67
  allowed: string;
68
68
  reason?: string | undefined;
69
69
  }, {
70
- inputSchema: string;
71
70
  name: string;
72
71
  description: string;
72
+ inputSchema: string;
73
73
  allowed: string;
74
74
  reason?: string | undefined;
75
75
  }>, "many">;
76
76
  }, "strip", z.ZodTypeAny, {
77
77
  tools: {
78
- inputSchema: string;
79
78
  name: string;
80
79
  description: string;
80
+ inputSchema: string;
81
81
  allowed: string;
82
82
  reason?: string | undefined;
83
83
  }[];
@@ -89,9 +89,9 @@ declare const RequirementAgentSystemPromptInputSchema: z.ZodObject<{
89
89
  finalAnswerInstructions?: string | undefined;
90
90
  }, {
91
91
  tools: {
92
- inputSchema: string;
93
92
  name: string;
94
93
  description: string;
94
+ inputSchema: string;
95
95
  allowed: string;
96
96
  reason?: string | undefined;
97
97
  }[];
@@ -127,21 +127,21 @@ declare const RequirementAgentToolNoResultPromptInputSchema: z.ZodObject<{
127
127
  tool: z.ZodOptional<z.ZodAny>;
128
128
  input: z.ZodUnknown;
129
129
  }, "strip", z.ZodTypeAny, {
130
- tool?: any;
131
130
  input?: unknown;
132
- }, {
133
131
  tool?: any;
132
+ }, {
134
133
  input?: unknown;
134
+ tool?: any;
135
135
  }>;
136
136
  }, "strip", z.ZodTypeAny, {
137
137
  toolCall: {
138
- tool?: any;
139
138
  input?: unknown;
139
+ tool?: any;
140
140
  };
141
141
  }, {
142
142
  toolCall: {
143
- tool?: any;
144
143
  input?: unknown;
144
+ tool?: any;
145
145
  };
146
146
  }>;
147
147
  interface RequirementAgentTemplates {