@nhtio/adk 0.1.0-master-445a9ed0 → 1.20260529.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 (170) hide show
  1. package/batteries/llm/openai_chat_completions/adapter.cjs +10 -9
  2. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  3. package/batteries/llm/openai_chat_completions/adapter.mjs +8 -8
  4. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  5. package/batteries/llm/openai_chat_completions/exceptions.cjs +1 -1
  6. package/batteries/llm/openai_chat_completions/helpers.cjs +16 -16
  7. package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
  8. package/batteries/llm/openai_chat_completions/helpers.d.ts +10 -10
  9. package/batteries/llm/openai_chat_completions/helpers.mjs +16 -16
  10. package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
  11. package/batteries/llm/openai_chat_completions/types.d.ts +6 -26
  12. package/batteries/llm/openai_chat_completions/validation.cjs +1 -3
  13. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  14. package/batteries/llm/openai_chat_completions/validation.mjs +0 -2
  15. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  16. package/batteries/llm/webllm_chat_completions/adapter.cjs +10 -9
  17. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  18. package/batteries/llm/webllm_chat_completions/adapter.mjs +8 -8
  19. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  20. package/batteries/llm/webllm_chat_completions/exceptions.cjs +1 -1
  21. package/batteries/llm/webllm_chat_completions/validation.cjs +1 -3
  22. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  23. package/batteries/llm/webllm_chat_completions/validation.mjs +0 -2
  24. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  25. package/batteries/storage/flydrive/index.d.ts +4 -10
  26. package/batteries/storage/flydrive.cjs +3 -12
  27. package/batteries/storage/flydrive.cjs.map +1 -1
  28. package/batteries/storage/flydrive.mjs +2 -11
  29. package/batteries/storage/flydrive.mjs.map +1 -1
  30. package/batteries/storage/in_memory/index.d.ts +17 -31
  31. package/batteries/storage/in_memory.cjs +30 -89
  32. package/batteries/storage/in_memory.cjs.map +1 -1
  33. package/batteries/storage/in_memory.mjs +30 -89
  34. package/batteries/storage/in_memory.mjs.map +1 -1
  35. package/batteries/storage/opfs/index.d.ts +4 -10
  36. package/batteries/storage/opfs.cjs +5 -55
  37. package/batteries/storage/opfs.cjs.map +1 -1
  38. package/batteries/storage/opfs.mjs +4 -54
  39. package/batteries/storage/opfs.mjs.map +1 -1
  40. package/batteries/tools/color.cjs +3 -3
  41. package/batteries/tools/color.mjs +2 -2
  42. package/batteries/tools/comparison.cjs +4 -3
  43. package/batteries/tools/comparison.cjs.map +1 -1
  44. package/batteries/tools/comparison.mjs +2 -2
  45. package/batteries/tools/data_structure.cjs +4 -3
  46. package/batteries/tools/data_structure.cjs.map +1 -1
  47. package/batteries/tools/data_structure.mjs +2 -2
  48. package/batteries/tools/datetime_extended.cjs +4 -4
  49. package/batteries/tools/datetime_extended.mjs +2 -2
  50. package/batteries/tools/datetime_math.cjs +3 -3
  51. package/batteries/tools/datetime_math.mjs +2 -2
  52. package/batteries/tools/encoding.cjs +4 -3
  53. package/batteries/tools/encoding.cjs.map +1 -1
  54. package/batteries/tools/encoding.mjs +2 -2
  55. package/batteries/tools/formatting.cjs +4 -3
  56. package/batteries/tools/formatting.cjs.map +1 -1
  57. package/batteries/tools/formatting.mjs +2 -2
  58. package/batteries/tools/geo_basics.cjs +3 -3
  59. package/batteries/tools/geo_basics.mjs +2 -2
  60. package/batteries/tools/math.cjs +4 -3
  61. package/batteries/tools/math.cjs.map +1 -1
  62. package/batteries/tools/math.mjs +2 -2
  63. package/batteries/tools/memory.cjs +7 -6
  64. package/batteries/tools/memory.cjs.map +1 -1
  65. package/batteries/tools/memory.mjs +5 -5
  66. package/batteries/tools/parsing.cjs +6 -5
  67. package/batteries/tools/parsing.cjs.map +1 -1
  68. package/batteries/tools/parsing.mjs +3 -3
  69. package/batteries/tools/retrievables.cjs +11 -11
  70. package/batteries/tools/retrievables.cjs.map +1 -1
  71. package/batteries/tools/retrievables.mjs +9 -10
  72. package/batteries/tools/retrievables.mjs.map +1 -1
  73. package/batteries/tools/standing_instructions.cjs +5 -4
  74. package/batteries/tools/standing_instructions.cjs.map +1 -1
  75. package/batteries/tools/standing_instructions.mjs +3 -3
  76. package/batteries/tools/statistics.cjs +5 -4
  77. package/batteries/tools/statistics.cjs.map +1 -1
  78. package/batteries/tools/statistics.mjs +3 -3
  79. package/batteries/tools/string_processing.cjs +4 -3
  80. package/batteries/tools/string_processing.cjs.map +1 -1
  81. package/batteries/tools/string_processing.mjs +2 -2
  82. package/batteries/tools/structured_data.cjs +4 -3
  83. package/batteries/tools/structured_data.cjs.map +1 -1
  84. package/batteries/tools/structured_data.mjs +2 -2
  85. package/batteries/tools/text_analysis.cjs +4 -4
  86. package/batteries/tools/text_analysis.mjs +3 -3
  87. package/batteries/tools/text_comparison.cjs +3 -3
  88. package/batteries/tools/text_comparison.mjs +2 -2
  89. package/batteries/tools/time.cjs +3 -3
  90. package/batteries/tools/time.mjs +2 -2
  91. package/batteries/tools/unit_conversion.cjs +3 -3
  92. package/batteries/tools/unit_conversion.mjs +2 -2
  93. package/batteries/tools.cjs +1 -1
  94. package/batteries/tools.mjs +1 -1
  95. package/batteries.cjs +1 -1
  96. package/batteries.mjs +1 -1
  97. package/chunk-KmRHZBOW.js +35 -0
  98. package/{common-aFmr9Oqs.mjs → common-DeZaonK1.mjs} +10 -76
  99. package/common-DeZaonK1.mjs.map +1 -0
  100. package/{common-BJ6V6dsH.js → common-Od8edUXU.js} +12 -89
  101. package/common-Od8edUXU.js.map +1 -0
  102. package/common.cjs +7 -9
  103. package/common.d.ts +0 -8
  104. package/common.mjs +7 -7
  105. package/{dispatch_runner-OimGCkk7.mjs → dispatch_runner-9j6bXHL3.mjs} +2 -34
  106. package/dispatch_runner-9j6bXHL3.mjs.map +1 -0
  107. package/{dispatch_runner-BWYNxmnp.js → dispatch_runner-CsoH0nld.js} +6 -37
  108. package/dispatch_runner-CsoH0nld.js.map +1 -0
  109. package/dispatch_runner.cjs +1 -1
  110. package/dispatch_runner.mjs +1 -1
  111. package/{exceptions-CSqzbL1N.js → exceptions-D5YrO9Vm.js} +2 -2
  112. package/{exceptions-CSqzbL1N.js.map → exceptions-D5YrO9Vm.js.map} +1 -1
  113. package/exceptions.cjs +2 -2
  114. package/factories.cjs +1 -1
  115. package/forge.cjs +4 -4
  116. package/forge.mjs +3 -3
  117. package/guards.cjs +9 -9
  118. package/guards.mjs +7 -7
  119. package/index.cjs +13 -13
  120. package/index.cjs.map +1 -1
  121. package/index.d.ts +1 -1
  122. package/index.mjs +10 -10
  123. package/index.mjs.map +1 -1
  124. package/lib/classes/retrievable.d.ts +4 -47
  125. package/lib/contracts/dispatch_context.d.ts +0 -44
  126. package/lib/contracts/turn_runner_config.d.ts +1 -5
  127. package/lib/contracts/turn_runner_context.d.ts +0 -25
  128. package/package.json +74 -74
  129. package/{runtime-BUDWyd-R.js → runtime-BJVkrGQe.js} +2 -2
  130. package/{runtime-BUDWyd-R.js.map → runtime-BJVkrGQe.js.map} +1 -1
  131. package/skills/adk-assembly/SKILL.md +2 -2
  132. package/{spooled_artifact-B_tVDDdB.mjs → spooled_artifact-C5ZtGxuJ.mjs} +2 -2
  133. package/{spooled_artifact-B_tVDDdB.mjs.map → spooled_artifact-C5ZtGxuJ.mjs.map} +1 -1
  134. package/{spooled_artifact-CFstzlqX.js → spooled_artifact-Cm9Te22K.js} +6 -5
  135. package/{spooled_artifact-CFstzlqX.js.map → spooled_artifact-Cm9Te22K.js.map} +1 -1
  136. package/spooled_artifact.cjs +2 -2
  137. package/spooled_artifact.mjs +2 -2
  138. package/{spooled_markdown_artifact-DWWak35I.mjs → spooled_markdown_artifact-BpUJol0W.mjs} +2 -2
  139. package/{spooled_markdown_artifact-DWWak35I.mjs.map → spooled_markdown_artifact-BpUJol0W.mjs.map} +1 -1
  140. package/{spooled_markdown_artifact-DK-T8Hy6.js → spooled_markdown_artifact-RRB113sy.js} +7 -6
  141. package/{spooled_markdown_artifact-DK-T8Hy6.js.map → spooled_markdown_artifact-RRB113sy.js.map} +1 -1
  142. package/{thought-DDqjQu3m.mjs → thought-CDb457b4.mjs} +2 -2
  143. package/{thought-DDqjQu3m.mjs.map → thought-CDb457b4.mjs.map} +1 -1
  144. package/{thought-DTsFRGdE.js → thought-DuN2PgdO.js} +6 -5
  145. package/{thought-DTsFRGdE.js.map → thought-DuN2PgdO.js.map} +1 -1
  146. package/{tool-cwJyEHI9.js → tool-COSeH8I6.js} +5 -4
  147. package/{tool-cwJyEHI9.js.map → tool-COSeH8I6.js.map} +1 -1
  148. package/{tool-q4LskG7K.mjs → tool-D2WB1EA1.mjs} +1 -1
  149. package/{tool-q4LskG7K.mjs.map → tool-D2WB1EA1.mjs.map} +1 -1
  150. package/{tool_call-BKIdAAoY.mjs → tool_call-BKyyxGaZ.mjs} +2 -2
  151. package/{tool_call-BKIdAAoY.mjs.map → tool_call-BKyyxGaZ.mjs.map} +1 -1
  152. package/{tool_call-3T0xTXlD.js → tool_call-DFgzcVcU.js} +6 -5
  153. package/{tool_call-3T0xTXlD.js.map → tool_call-DFgzcVcU.js.map} +1 -1
  154. package/{tool_registry-snPjF0zJ.js → tool_registry-Dkfprsck.js} +5 -39
  155. package/{tool_registry-snPjF0zJ.js.map → tool_registry-Dkfprsck.js.map} +1 -1
  156. package/{turn_runner-BScT8OgA.js → turn_runner-CMm2BHdX.js} +7 -10
  157. package/turn_runner-CMm2BHdX.js.map +1 -0
  158. package/{turn_runner-DRBLN2Y_.mjs → turn_runner-y7eyEcJH.mjs} +3 -7
  159. package/turn_runner-y7eyEcJH.mjs.map +1 -0
  160. package/turn_runner.cjs +1 -1
  161. package/turn_runner.mjs +1 -1
  162. package/types.d.ts +2 -2
  163. package/CHANGELOG.md +0 -49
  164. package/common-BJ6V6dsH.js.map +0 -1
  165. package/common-aFmr9Oqs.mjs.map +0 -1
  166. package/dispatch_runner-BWYNxmnp.js.map +0 -1
  167. package/dispatch_runner-OimGCkk7.mjs.map +0 -1
  168. package/lib/contracts/byte_store.d.ts +0 -93
  169. package/turn_runner-BScT8OgA.js.map +0 -1
  170. package/turn_runner-DRBLN2Y_.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { o as isError } from "../../tool_registry-DqLOyGyG.mjs";
2
- import { t as Tool } from "../../tool-q4LskG7K.mjs";
3
- import "../../common-aFmr9Oqs.mjs";
2
+ import "../../common-DeZaonK1.mjs";
3
+ import { t as Tool } from "../../tool-D2WB1EA1.mjs";
4
4
  import "../../guards.mjs";
5
5
  import { validator } from "@nhtio/validation";
6
6
  //#region src/batteries/tools/formatting/index.ts
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("../../tool_registry-snPjF0zJ.js");
3
- const require_tool = require("../../tool-cwJyEHI9.js");
4
- require("../../common-BJ6V6dsH.js");
2
+ require("../../chunk-KmRHZBOW.js");
3
+ require("../../common-Od8edUXU.js");
4
+ const require_tool = require("../../tool-COSeH8I6.js");
5
5
  let _nhtio_validation = require("@nhtio/validation");
6
6
  //#region src/batteries/tools/geo_basics/index.ts
7
7
  /**
@@ -1,5 +1,5 @@
1
- import { t as Tool } from "../../tool-q4LskG7K.mjs";
2
- import "../../common-aFmr9Oqs.mjs";
1
+ import "../../common-DeZaonK1.mjs";
2
+ import { t as Tool } from "../../tool-D2WB1EA1.mjs";
3
3
  import { validator } from "@nhtio/validation";
4
4
  //#region src/batteries/tools/geo_basics/index.ts
5
5
  /**
@@ -1,7 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_tool_registry = require("../../tool_registry-snPjF0zJ.js");
3
- const require_tool = require("../../tool-cwJyEHI9.js");
4
- require("../../common-BJ6V6dsH.js");
2
+ require("../../chunk-KmRHZBOW.js");
3
+ const require_tool_registry = require("../../tool_registry-Dkfprsck.js");
4
+ require("../../common-Od8edUXU.js");
5
+ const require_tool = require("../../tool-COSeH8I6.js");
5
6
  require("../../guards.cjs");
6
7
  let _nhtio_validation = require("@nhtio/validation");
7
8
  let mathjs = require("mathjs");
@@ -1 +1 @@
1
- {"version":3,"file":"math.cjs","names":[],"sources":["../../../src/batteries/tools/math/index.ts"],"sourcesContent":["/**\n * Pre-constructed tools for safe arithmetic, expression evaluation, and numeric operations.\n *\n * @module @nhtio/adk/batteries/tools/math\n *\n * @remarks\n * Pre-constructed bundled tools for the `math` category. Import individually, the whole\n * category, or import every tool via `@nhtio/adk/batteries`.\n */\n\nimport { create, all } from 'mathjs'\nimport { Tool } from '@nhtio/adk/common'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\n\nconst math = create(all)\n\nconst BLOCKED_FUNCTIONS = [\n 'import',\n 'createUnit',\n 'simplify',\n 'derivative',\n 'compile',\n 'chain',\n 'reviver',\n 'replacer',\n]\n\nfor (const fn of BLOCKED_FUNCTIONS) {\n if (fn in math) {\n ;(math as any)[fn] = undefined\n }\n}\n\nconst MAX_EXPRESSION_LENGTH = 1000\n\nfunction validateExpression(expr: string): string | undefined {\n if (expr.length > MAX_EXPRESSION_LENGTH) {\n return `Expression too long (max ${MAX_EXPRESSION_LENGTH} characters).`\n }\n return undefined\n}\n\n/**\n * Convert common LaTeX/KaTeX notation to a mathjs-evaluable expression.\n */\nfunction latexToMathjs(latex: string): string {\n let expr = latex.trim()\n\n expr = expr.replace(/^\\$\\$?|\\$\\$?$/g, '')\n expr = expr.replace(/^\\\\[[(]|\\\\[\\])]$/g, '')\n\n for (let i = 0; i < 10; i++) {\n const before = expr\n expr = expr.replace(/\\\\frac\\s*\\{([^{}]*)\\}\\s*\\{([^{}]*)\\}/g, '(($1)/($2))')\n if (expr === before) break\n }\n\n expr = expr.replace(/\\\\sqrt\\[([^\\]]+)\\]\\s*\\{([^{}]*)\\}/g, 'nthRoot($2, $1)')\n expr = expr.replace(/\\\\sqrt\\s*\\{([^{}]*)\\}/g, 'sqrt($1)')\n\n expr = expr.replace(\n /\\\\(sin|cos|tan|cot|sec|csc|arcsin|arccos|arctan|sinh|cosh|tanh|ln|log|exp|abs|det)/g,\n '$1'\n )\n\n expr = expr.replace(/log_\\{?(\\w+)\\}?\\s*\\(([^)]+)\\)/g, 'log($2, $1)')\n expr = expr.replace(/\\^{([^{}]*)}/g, '^($1)')\n expr = expr.replace(/_\\{[^{}]*\\}/g, '')\n expr = expr.replace(/_\\w/g, '')\n\n expr = expr.replace(/\\\\pi/g, 'pi')\n expr = expr.replace(\n /\\\\(alpha|beta|gamma|delta|epsilon|theta|lambda|mu|sigma|tau|phi|omega)/g,\n '$1'\n )\n\n expr = expr.replace(/\\\\cdot/g, '*')\n expr = expr.replace(/\\\\times/g, '*')\n expr = expr.replace(/\\\\div/g, '/')\n expr = expr.replace(/\\\\infty/g, 'Infinity')\n expr = expr.replace(/\\\\left\\s*([([{|])/g, '$1')\n expr = expr.replace(/\\\\right\\s*([)\\]}|])/g, '$1')\n expr = expr.replace(/\\\\sum/g, 'sum')\n expr = expr.replace(/\\\\prod/g, 'prod')\n expr = expr.replace(/\\\\,/g, ' ')\n expr = expr.replace(/\\\\;/g, ' ')\n expr = expr.replace(/\\\\quad/g, ' ')\n expr = expr.replace(/\\\\qquad/g, ' ')\n expr = expr.replace(/\\\\text\\{([^{}]*)\\}/g, '')\n expr = expr.replace(/(\\d)([a-zA-Z(])/g, '$1*$2')\n expr = expr.replace(/\\)\\s*\\(/g, ')*(')\n expr = expr.replace(/\\s+/g, ' ').trim()\n\n return expr\n}\n\n/**\n * Evaluates a mathjs-syntax expression and returns the numeric result alongside the KaTeX\n * representation of the parsed expression.\n *\n * @remarks\n * Supports arithmetic, trigonometric, logarithmic, exponential, factorial, matrix, and unit\n * operations via `mathjs`. The mathjs instance is hardened: dangerous functions (`import`,\n * `createUnit`, `simplify`, `derivative`, `compile`, `chain`, `reviver`, `replacer`) are\n * disabled to prevent interpreter-surface exposure.\n *\n * Expressions over 1000 characters are rejected with an error string (not thrown). Parse and\n * evaluation errors are also returned as error strings — the tool surfaces math errors as\n * content rather than exceptions, so the model can react to them in-line.\n */\nexport const calculateTool = new Tool({\n name: 'calculate',\n description:\n 'Evaluate a math expression. Supports arithmetic, trig, log, sqrt, factorial, matrices.',\n inputSchema: validator.object({\n expression: validator.string().required().description('Math expression, e.g. \"sin(pi/4) + 5!\"'),\n }),\n handler: async (args) => {\n const { expression } = args as { expression: string }\n\n const lengthError = validateExpression(expression)\n if (lengthError) return lengthError\n\n try {\n const result = math.evaluate!(expression)\n const node = math.parse!(expression)\n const katex = node.toTex()\n return `Result: ${result}\\nKaTeX: $${katex} = ${result}$`\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Translates a LaTeX/KaTeX expression into mathjs syntax, evaluates it, and returns the result.\n *\n * @remarks\n * Translates common LaTeX constructs (`\\frac{a}{b}`, `\\sqrt{...}`, `\\cdot`, `\\times`, Greek\n * macros like `\\pi`, `\\left`/`\\right` delimiters, `\\text{...}`, subscripts, etc.) into their\n * mathjs equivalents before evaluation. Both the source and the translated mathjs expression\n * are subject to the 1000-character length cap.\n *\n * Parse and evaluation errors are returned as error strings rather than thrown.\n */\nexport const evaluateKatexTool = new Tool({\n name: 'evaluate_katex',\n description: 'Evaluate a KaTeX/LaTeX math expression and return the numeric result.',\n inputSchema: validator.object({\n katex: validator\n .string()\n .required()\n .description('LaTeX expression, e.g. \"\\\\frac{1}{2} + \\\\sqrt{9}\"'),\n }),\n handler: async (args) => {\n const { katex } = args as { katex: string }\n\n const lengthError = validateExpression(katex)\n if (lengthError) return lengthError\n\n try {\n const mathjsExpr = latexToMathjs(katex)\n\n const translatedLengthError = validateExpression(mathjsExpr)\n if (translatedLengthError) return translatedLengthError\n\n const result = math.evaluate!(mathjsExpr)\n return `Converted: ${mathjsExpr}\\nResult: ${result}`\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"math.cjs","names":[],"sources":["../../../src/batteries/tools/math/index.ts"],"sourcesContent":["/**\n * Pre-constructed tools for safe arithmetic, expression evaluation, and numeric operations.\n *\n * @module @nhtio/adk/batteries/tools/math\n *\n * @remarks\n * Pre-constructed bundled tools for the `math` category. Import individually, the whole\n * category, or import every tool via `@nhtio/adk/batteries`.\n */\n\nimport { create, all } from 'mathjs'\nimport { Tool } from '@nhtio/adk/common'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\n\nconst math = create(all)\n\nconst BLOCKED_FUNCTIONS = [\n 'import',\n 'createUnit',\n 'simplify',\n 'derivative',\n 'compile',\n 'chain',\n 'reviver',\n 'replacer',\n]\n\nfor (const fn of BLOCKED_FUNCTIONS) {\n if (fn in math) {\n ;(math as any)[fn] = undefined\n }\n}\n\nconst MAX_EXPRESSION_LENGTH = 1000\n\nfunction validateExpression(expr: string): string | undefined {\n if (expr.length > MAX_EXPRESSION_LENGTH) {\n return `Expression too long (max ${MAX_EXPRESSION_LENGTH} characters).`\n }\n return undefined\n}\n\n/**\n * Convert common LaTeX/KaTeX notation to a mathjs-evaluable expression.\n */\nfunction latexToMathjs(latex: string): string {\n let expr = latex.trim()\n\n expr = expr.replace(/^\\$\\$?|\\$\\$?$/g, '')\n expr = expr.replace(/^\\\\[[(]|\\\\[\\])]$/g, '')\n\n for (let i = 0; i < 10; i++) {\n const before = expr\n expr = expr.replace(/\\\\frac\\s*\\{([^{}]*)\\}\\s*\\{([^{}]*)\\}/g, '(($1)/($2))')\n if (expr === before) break\n }\n\n expr = expr.replace(/\\\\sqrt\\[([^\\]]+)\\]\\s*\\{([^{}]*)\\}/g, 'nthRoot($2, $1)')\n expr = expr.replace(/\\\\sqrt\\s*\\{([^{}]*)\\}/g, 'sqrt($1)')\n\n expr = expr.replace(\n /\\\\(sin|cos|tan|cot|sec|csc|arcsin|arccos|arctan|sinh|cosh|tanh|ln|log|exp|abs|det)/g,\n '$1'\n )\n\n expr = expr.replace(/log_\\{?(\\w+)\\}?\\s*\\(([^)]+)\\)/g, 'log($2, $1)')\n expr = expr.replace(/\\^{([^{}]*)}/g, '^($1)')\n expr = expr.replace(/_\\{[^{}]*\\}/g, '')\n expr = expr.replace(/_\\w/g, '')\n\n expr = expr.replace(/\\\\pi/g, 'pi')\n expr = expr.replace(\n /\\\\(alpha|beta|gamma|delta|epsilon|theta|lambda|mu|sigma|tau|phi|omega)/g,\n '$1'\n )\n\n expr = expr.replace(/\\\\cdot/g, '*')\n expr = expr.replace(/\\\\times/g, '*')\n expr = expr.replace(/\\\\div/g, '/')\n expr = expr.replace(/\\\\infty/g, 'Infinity')\n expr = expr.replace(/\\\\left\\s*([([{|])/g, '$1')\n expr = expr.replace(/\\\\right\\s*([)\\]}|])/g, '$1')\n expr = expr.replace(/\\\\sum/g, 'sum')\n expr = expr.replace(/\\\\prod/g, 'prod')\n expr = expr.replace(/\\\\,/g, ' ')\n expr = expr.replace(/\\\\;/g, ' ')\n expr = expr.replace(/\\\\quad/g, ' ')\n expr = expr.replace(/\\\\qquad/g, ' ')\n expr = expr.replace(/\\\\text\\{([^{}]*)\\}/g, '')\n expr = expr.replace(/(\\d)([a-zA-Z(])/g, '$1*$2')\n expr = expr.replace(/\\)\\s*\\(/g, ')*(')\n expr = expr.replace(/\\s+/g, ' ').trim()\n\n return expr\n}\n\n/**\n * Evaluates a mathjs-syntax expression and returns the numeric result alongside the KaTeX\n * representation of the parsed expression.\n *\n * @remarks\n * Supports arithmetic, trigonometric, logarithmic, exponential, factorial, matrix, and unit\n * operations via `mathjs`. The mathjs instance is hardened: dangerous functions (`import`,\n * `createUnit`, `simplify`, `derivative`, `compile`, `chain`, `reviver`, `replacer`) are\n * disabled to prevent interpreter-surface exposure.\n *\n * Expressions over 1000 characters are rejected with an error string (not thrown). Parse and\n * evaluation errors are also returned as error strings — the tool surfaces math errors as\n * content rather than exceptions, so the model can react to them in-line.\n */\nexport const calculateTool = new Tool({\n name: 'calculate',\n description:\n 'Evaluate a math expression. Supports arithmetic, trig, log, sqrt, factorial, matrices.',\n inputSchema: validator.object({\n expression: validator.string().required().description('Math expression, e.g. \"sin(pi/4) + 5!\"'),\n }),\n handler: async (args) => {\n const { expression } = args as { expression: string }\n\n const lengthError = validateExpression(expression)\n if (lengthError) return lengthError\n\n try {\n const result = math.evaluate!(expression)\n const node = math.parse!(expression)\n const katex = node.toTex()\n return `Result: ${result}\\nKaTeX: $${katex} = ${result}$`\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Translates a LaTeX/KaTeX expression into mathjs syntax, evaluates it, and returns the result.\n *\n * @remarks\n * Translates common LaTeX constructs (`\\frac{a}{b}`, `\\sqrt{...}`, `\\cdot`, `\\times`, Greek\n * macros like `\\pi`, `\\left`/`\\right` delimiters, `\\text{...}`, subscripts, etc.) into their\n * mathjs equivalents before evaluation. Both the source and the translated mathjs expression\n * are subject to the 1000-character length cap.\n *\n * Parse and evaluation errors are returned as error strings rather than thrown.\n */\nexport const evaluateKatexTool = new Tool({\n name: 'evaluate_katex',\n description: 'Evaluate a KaTeX/LaTeX math expression and return the numeric result.',\n inputSchema: validator.object({\n katex: validator\n .string()\n .required()\n .description('LaTeX expression, e.g. \"\\\\frac{1}{2} + \\\\sqrt{9}\"'),\n }),\n handler: async (args) => {\n const { katex } = args as { katex: string }\n\n const lengthError = validateExpression(katex)\n if (lengthError) return lengthError\n\n try {\n const mathjsExpr = latexToMathjs(katex)\n\n const translatedLengthError = validateExpression(mathjsExpr)\n if (translatedLengthError) return translatedLengthError\n\n const result = math.evaluate!(mathjsExpr)\n return `Converted: ${mathjsExpr}\\nResult: ${result}`\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { o as isError } from "../../tool_registry-DqLOyGyG.mjs";
2
- import { t as Tool } from "../../tool-q4LskG7K.mjs";
3
- import "../../common-aFmr9Oqs.mjs";
2
+ import "../../common-DeZaonK1.mjs";
3
+ import { t as Tool } from "../../tool-D2WB1EA1.mjs";
4
4
  import "../../guards.mjs";
5
5
  import { validator } from "@nhtio/validation";
6
6
  import { all, create } from "mathjs";
@@ -1,13 +1,14 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_tool_registry = require("../../tool_registry-snPjF0zJ.js");
3
- const require_thought = require("../../thought-DTsFRGdE.js");
4
- const require_tool = require("../../tool-cwJyEHI9.js");
5
- require("../../common-BJ6V6dsH.js");
6
- const require_spooled_markdown_artifact = require("../../spooled_markdown_artifact-DK-T8Hy6.js");
2
+ require("../../chunk-KmRHZBOW.js");
3
+ const require_tool_registry = require("../../tool_registry-Dkfprsck.js");
4
+ const require_thought = require("../../thought-DuN2PgdO.js");
5
+ require("../../common-Od8edUXU.js");
6
+ const require_tool = require("../../tool-COSeH8I6.js");
7
+ const require_spooled_markdown_artifact = require("../../spooled_markdown_artifact-RRB113sy.js");
7
8
  require("../../guards.cjs");
8
9
  let _nhtio_validation = require("@nhtio/validation");
9
- let luxon = require("luxon");
10
10
  let uuid = require("uuid");
11
+ let luxon = require("luxon");
11
12
  //#region src/batteries/tools/memory/index.ts
12
13
  /**
13
14
  * Pre-constructed CRUD tools for model-visible ADK memory management.
@@ -1 +1 @@
1
- {"version":3,"file":"memory.cjs","names":[],"sources":["../../../src/batteries/tools/memory/index.ts"],"sourcesContent":["/**\n * Pre-constructed CRUD tools for model-visible ADK memory management.\n *\n * @module @nhtio/adk/batteries/tools/memory\n *\n * @remarks\n * Pre-constructed CRUD tools that expose the ADK's {@link @nhtio/adk!Memory} surface to the model.\n * Each tool delegates to the corresponding callback on the active {@link @nhtio/adk!DispatchContext}\n * (`fetchMemories`, `storeMemory`, `mutateMemory`, `deleteMemory`) — the persistence layer is\n * whatever the consumer wired into the runner.\n *\n * Memory entries carry agent-internal `confidence` / `importance` scores and are rendered\n * through the LLM battery's recall-tier envelope. Letting the model author and curate its own\n * memories is the canonical use case for these tools; deployers who do not want the model to\n * mutate memory should simply not register the relevant tools.\n *\n * Output is JSON for every tool so consumers can parse the result without re-tokenising — the\n * artifact constructor is set to {@link @nhtio/adk!SpooledJsonArtifact}.\n *\n * Tools:\n * - {@link listMemoriesTool} — read-only list of every memory currently held by the context.\n * - {@link storeMemoryTool} — create a new memory (auto-generates `id` / `createdAt` /\n * `updatedAt` unless explicit values are supplied).\n * - {@link updateMemoryTool} — replace an existing memory by `id`. Bumps `updatedAt`.\n * - {@link deleteMemoryTool} — remove a memory by `id`.\n */\n\nimport { DateTime } from 'luxon'\nimport { v6 as uuidv6 } from 'uuid'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Memory, SpooledJsonArtifact, Tool } from '@nhtio/adk/common'\n\nconst serialiseMemory = (m: Memory): Record<string, unknown> => ({\n id: m.id,\n content: m.content.toString(),\n confidence: m.confidence,\n importance: m.importance,\n createdAt: m.createdAt.toISO(),\n updatedAt: m.updatedAt.toISO(),\n})\n\n/**\n * List every memory currently held by the active execution context.\n *\n * @remarks\n * Delegates to `ctx.fetchMemories()`. Returns a JSON-encoded array of memory records (id,\n * content, confidence, importance, createdAt, updatedAt). The model can use the `id` values\n * to drive subsequent `update_memory` / `delete_memory` calls.\n */\nexport const listMemoriesTool = new Tool({\n name: 'list_memories',\n description:\n 'List every memory currently held by the agent. Returns a JSON array of memory records with id, content, confidence, importance, createdAt, and updatedAt.',\n inputSchema: validator.object({}),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (_args, ctx) => {\n try {\n const memories = await ctx.fetchMemories()\n return JSON.stringify(memories.map(serialiseMemory), null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Create a new {@link @nhtio/adk!Memory} record and persist it via the context's `storeMemory` callback.\n *\n * @remarks\n * When `id` is omitted, a UUID v6 is generated. When `createdAt` / `updatedAt` are omitted,\n * the current time is used. The model authors `content`, `confidence`, and `importance`\n * directly. The resulting record is added to `ctx.turnMemories` and flushed to the consumer's\n * persistence layer.\n */\nexport const storeMemoryTool = new Tool({\n name: 'store_memory',\n description:\n 'Store a new memory record. Provide the content, your confidence (0–1) that the memory is accurate, and the importance (0–1) of the memory for future recall. id and timestamps are auto-generated if omitted.',\n inputSchema: validator.object({\n content: validator.string().required().description('The memory content as a plain string.'),\n confidence: validator\n .number()\n .min(0)\n .max(1)\n .required()\n .description('Confidence in [0, 1] that this memory is accurate.'),\n importance: validator\n .number()\n .min(0)\n .max(1)\n .required()\n .description('Importance in [0, 1] — how much weight the memory should carry on recall.'),\n id: validator\n .string()\n .optional()\n .description('Optional stable id. Auto-generated when absent.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { content, confidence, importance, id } = args as {\n content: string\n confidence: number\n importance: number\n id?: string\n }\n try {\n const now = DateTime.now()\n const memory = new Memory({\n id: id ?? uuidv6(),\n content,\n confidence,\n importance,\n createdAt: now,\n updatedAt: now,\n })\n await ctx.storeMemory(memory)\n return JSON.stringify({ ok: true, memory: serialiseMemory(memory) }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Replace an existing {@link @nhtio/adk!Memory} by `id`.\n *\n * @remarks\n * The model supplies `id` plus any subset of `content` / `confidence` / `importance`; fields\n * left undefined retain their prior values. `updatedAt` is always bumped to the current time;\n * `createdAt` is preserved. Returns an error when no memory with the supplied `id` is found.\n */\nexport const updateMemoryTool = new Tool({\n name: 'update_memory',\n description:\n 'Update an existing memory by id. Supply any subset of content / confidence / importance — omitted fields retain their prior values. updatedAt is always refreshed.',\n inputSchema: validator.object({\n id: validator.string().required().description('Id of the memory to update.'),\n content: validator.string().optional().description('Replacement content.'),\n confidence: validator\n .number()\n .min(0)\n .max(1)\n .optional()\n .description('Replacement confidence in [0, 1].'),\n importance: validator\n .number()\n .min(0)\n .max(1)\n .optional()\n .description('Replacement importance in [0, 1].'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { id, content, confidence, importance } = args as {\n id: string\n content?: string\n confidence?: number\n importance?: number\n }\n try {\n const memories = await ctx.fetchMemories()\n const existing = memories.find((m) => m.id === id)\n if (!existing) {\n return `Error: No memory found with id \"${id}\".`\n }\n const updated = new Memory({\n id: existing.id,\n content: content ?? existing.content,\n confidence: confidence ?? existing.confidence,\n importance: importance ?? existing.importance,\n createdAt: existing.createdAt,\n updatedAt: DateTime.now(),\n })\n await ctx.mutateMemory(updated)\n return JSON.stringify({ ok: true, memory: serialiseMemory(updated) }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Remove an existing {@link @nhtio/adk!Memory} by `id`.\n *\n * @remarks\n * Delegates to `ctx.deleteMemory(id)`. Returns `{ ok: true, id }` on success regardless of\n * whether a memory was actually present — `deleteMemory` is idempotent at the ADK level.\n */\nexport const deleteMemoryTool = new Tool({\n name: 'delete_memory',\n description: 'Delete a memory by id.',\n inputSchema: validator.object({\n id: validator.string().required().description('Id of the memory to delete.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { id } = args as { id: string }\n try {\n await ctx.deleteMemory(id)\n return JSON.stringify({ ok: true, id }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Convenience tuple of every memory CRUD tool. Spread into a {@link @nhtio/adk!ToolRegistry} to register\n * the entire category at once: `registry.register(...memoryTools)`.\n */\nexport const memoryTools = [\n listMemoriesTool,\n storeMemoryTool,\n updateMemoryTool,\n deleteMemoryTool,\n] as const\n"],"mappings":"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"}
1
+ {"version":3,"file":"memory.cjs","names":[],"sources":["../../../src/batteries/tools/memory/index.ts"],"sourcesContent":["/**\n * Pre-constructed CRUD tools for model-visible ADK memory management.\n *\n * @module @nhtio/adk/batteries/tools/memory\n *\n * @remarks\n * Pre-constructed CRUD tools that expose the ADK's {@link @nhtio/adk!Memory} surface to the model.\n * Each tool delegates to the corresponding callback on the active {@link @nhtio/adk!DispatchContext}\n * (`fetchMemories`, `storeMemory`, `mutateMemory`, `deleteMemory`) — the persistence layer is\n * whatever the consumer wired into the runner.\n *\n * Memory entries carry agent-internal `confidence` / `importance` scores and are rendered\n * through the LLM battery's recall-tier envelope. Letting the model author and curate its own\n * memories is the canonical use case for these tools; deployers who do not want the model to\n * mutate memory should simply not register the relevant tools.\n *\n * Output is JSON for every tool so consumers can parse the result without re-tokenising — the\n * artifact constructor is set to {@link @nhtio/adk!SpooledJsonArtifact}.\n *\n * Tools:\n * - {@link listMemoriesTool} — read-only list of every memory currently held by the context.\n * - {@link storeMemoryTool} — create a new memory (auto-generates `id` / `createdAt` /\n * `updatedAt` unless explicit values are supplied).\n * - {@link updateMemoryTool} — replace an existing memory by `id`. Bumps `updatedAt`.\n * - {@link deleteMemoryTool} — remove a memory by `id`.\n */\n\nimport { DateTime } from 'luxon'\nimport { v6 as uuidv6 } from 'uuid'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Memory, SpooledJsonArtifact, Tool } from '@nhtio/adk/common'\n\nconst serialiseMemory = (m: Memory): Record<string, unknown> => ({\n id: m.id,\n content: m.content.toString(),\n confidence: m.confidence,\n importance: m.importance,\n createdAt: m.createdAt.toISO(),\n updatedAt: m.updatedAt.toISO(),\n})\n\n/**\n * List every memory currently held by the active execution context.\n *\n * @remarks\n * Delegates to `ctx.fetchMemories()`. Returns a JSON-encoded array of memory records (id,\n * content, confidence, importance, createdAt, updatedAt). The model can use the `id` values\n * to drive subsequent `update_memory` / `delete_memory` calls.\n */\nexport const listMemoriesTool = new Tool({\n name: 'list_memories',\n description:\n 'List every memory currently held by the agent. Returns a JSON array of memory records with id, content, confidence, importance, createdAt, and updatedAt.',\n inputSchema: validator.object({}),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (_args, ctx) => {\n try {\n const memories = await ctx.fetchMemories()\n return JSON.stringify(memories.map(serialiseMemory), null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Create a new {@link @nhtio/adk!Memory} record and persist it via the context's `storeMemory` callback.\n *\n * @remarks\n * When `id` is omitted, a UUID v6 is generated. When `createdAt` / `updatedAt` are omitted,\n * the current time is used. The model authors `content`, `confidence`, and `importance`\n * directly. The resulting record is added to `ctx.turnMemories` and flushed to the consumer's\n * persistence layer.\n */\nexport const storeMemoryTool = new Tool({\n name: 'store_memory',\n description:\n 'Store a new memory record. Provide the content, your confidence (0–1) that the memory is accurate, and the importance (0–1) of the memory for future recall. id and timestamps are auto-generated if omitted.',\n inputSchema: validator.object({\n content: validator.string().required().description('The memory content as a plain string.'),\n confidence: validator\n .number()\n .min(0)\n .max(1)\n .required()\n .description('Confidence in [0, 1] that this memory is accurate.'),\n importance: validator\n .number()\n .min(0)\n .max(1)\n .required()\n .description('Importance in [0, 1] — how much weight the memory should carry on recall.'),\n id: validator\n .string()\n .optional()\n .description('Optional stable id. Auto-generated when absent.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { content, confidence, importance, id } = args as {\n content: string\n confidence: number\n importance: number\n id?: string\n }\n try {\n const now = DateTime.now()\n const memory = new Memory({\n id: id ?? uuidv6(),\n content,\n confidence,\n importance,\n createdAt: now,\n updatedAt: now,\n })\n await ctx.storeMemory(memory)\n return JSON.stringify({ ok: true, memory: serialiseMemory(memory) }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Replace an existing {@link @nhtio/adk!Memory} by `id`.\n *\n * @remarks\n * The model supplies `id` plus any subset of `content` / `confidence` / `importance`; fields\n * left undefined retain their prior values. `updatedAt` is always bumped to the current time;\n * `createdAt` is preserved. Returns an error when no memory with the supplied `id` is found.\n */\nexport const updateMemoryTool = new Tool({\n name: 'update_memory',\n description:\n 'Update an existing memory by id. Supply any subset of content / confidence / importance — omitted fields retain their prior values. updatedAt is always refreshed.',\n inputSchema: validator.object({\n id: validator.string().required().description('Id of the memory to update.'),\n content: validator.string().optional().description('Replacement content.'),\n confidence: validator\n .number()\n .min(0)\n .max(1)\n .optional()\n .description('Replacement confidence in [0, 1].'),\n importance: validator\n .number()\n .min(0)\n .max(1)\n .optional()\n .description('Replacement importance in [0, 1].'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { id, content, confidence, importance } = args as {\n id: string\n content?: string\n confidence?: number\n importance?: number\n }\n try {\n const memories = await ctx.fetchMemories()\n const existing = memories.find((m) => m.id === id)\n if (!existing) {\n return `Error: No memory found with id \"${id}\".`\n }\n const updated = new Memory({\n id: existing.id,\n content: content ?? existing.content,\n confidence: confidence ?? existing.confidence,\n importance: importance ?? existing.importance,\n createdAt: existing.createdAt,\n updatedAt: DateTime.now(),\n })\n await ctx.mutateMemory(updated)\n return JSON.stringify({ ok: true, memory: serialiseMemory(updated) }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Remove an existing {@link @nhtio/adk!Memory} by `id`.\n *\n * @remarks\n * Delegates to `ctx.deleteMemory(id)`. Returns `{ ok: true, id }` on success regardless of\n * whether a memory was actually present — `deleteMemory` is idempotent at the ADK level.\n */\nexport const deleteMemoryTool = new Tool({\n name: 'delete_memory',\n description: 'Delete a memory by id.',\n inputSchema: validator.object({\n id: validator.string().required().description('Id of the memory to delete.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { id } = args as { id: string }\n try {\n await ctx.deleteMemory(id)\n return JSON.stringify({ ok: true, id }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Convenience tuple of every memory CRUD tool. Spread into a {@link @nhtio/adk!ToolRegistry} to register\n * the entire category at once: `registry.register(...memoryTools)`.\n */\nexport const memoryTools = [\n listMemoriesTool,\n storeMemoryTool,\n updateMemoryTool,\n deleteMemoryTool,\n] as const\n"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import { o as isError } from "../../tool_registry-DqLOyGyG.mjs";
2
- import { r as Memory } from "../../thought-DDqjQu3m.mjs";
3
- import { t as Tool } from "../../tool-q4LskG7K.mjs";
4
- import "../../common-aFmr9Oqs.mjs";
5
- import { n as SpooledJsonArtifact } from "../../spooled_markdown_artifact-DWWak35I.mjs";
2
+ import { r as Memory } from "../../thought-CDb457b4.mjs";
3
+ import "../../common-DeZaonK1.mjs";
4
+ import { t as Tool } from "../../tool-D2WB1EA1.mjs";
5
+ import { n as SpooledJsonArtifact } from "../../spooled_markdown_artifact-BpUJol0W.mjs";
6
6
  import "../../guards.mjs";
7
7
  import { validator } from "@nhtio/validation";
8
- import { DateTime } from "luxon";
9
8
  import { v6 } from "uuid";
9
+ import { DateTime } from "luxon";
10
10
  //#region src/batteries/tools/memory/index.ts
11
11
  /**
12
12
  * Pre-constructed CRUD tools for model-visible ADK memory management.
@@ -1,13 +1,14 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_tool_registry = require("../../tool_registry-snPjF0zJ.js");
3
- const require_tool = require("../../tool-cwJyEHI9.js");
4
- require("../../common-BJ6V6dsH.js");
5
- const require_spooled_markdown_artifact = require("../../spooled_markdown_artifact-DK-T8Hy6.js");
2
+ const require_chunk = require("../../chunk-KmRHZBOW.js");
3
+ const require_tool_registry = require("../../tool_registry-Dkfprsck.js");
4
+ require("../../common-Od8edUXU.js");
5
+ const require_tool = require("../../tool-COSeH8I6.js");
6
+ const require_spooled_markdown_artifact = require("../../spooled_markdown_artifact-RRB113sy.js");
6
7
  require("../../guards.cjs");
7
8
  let _nhtio_validation = require("@nhtio/validation");
8
9
  let js_yaml = require("js-yaml");
9
10
  let papaparse = require("papaparse");
10
- papaparse = require_tool_registry.__toESM(papaparse);
11
+ papaparse = require_chunk.__toESM(papaparse);
11
12
  //#region src/batteries/tools/parsing/index.ts
12
13
  /**
13
14
  * Pre-constructed tools for parsing CSV, TSV, JSON, YAML, and other structured text formats.
@@ -1 +1 @@
1
- {"version":3,"file":"parsing.cjs","names":[],"sources":["../../../src/batteries/tools/parsing/index.ts"],"sourcesContent":["/**\n * Pre-constructed tools for parsing CSV, TSV, JSON, YAML, and other structured text formats.\n *\n * @module @nhtio/adk/batteries/tools/parsing\n *\n * @remarks\n * Pre-constructed bundled tools for the `parsing` category. Import individually, the whole\n * category, or import every tool via `@nhtio/adk/batteries`.\n */\n\nimport { load as parseYaml } from 'js-yaml'\nimport { default as Papa } from 'papaparse'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Tool, SpooledJsonArtifact } from '@nhtio/adk/common'\n\n/**\n * Parse a CSV or TSV string into a JSON array.\n *\n * @remarks\n * With `has_header: true` (default), each row becomes an object keyed by column name. Without a\n * header, rows are returned as positional arrays. `delimiter` auto-detects when omitted; pass\n * `\"\\t\"` for TSV. Rows are clipped to `limit` (default 1000, max 10000). Parse warnings are\n * prepended to the output.\n */\nexport const parseCsvTool = new Tool({\n name: 'parse_csv',\n description:\n 'Parse a CSV or TSV string into a JSON array. With a header row, returns objects keyed by column name. Without, returns arrays of values.',\n inputSchema: validator.object({\n text: validator.string().required().description('CSV or TSV text to parse'),\n has_header: validator\n .boolean()\n .default(true)\n .description('First row is a header row (default: true)'),\n delimiter: validator\n .string()\n .default('')\n .allow('')\n .description('Field delimiter — auto-detected if omitted. Use \"\\\\t\" for TSV.'),\n limit: validator.number().default(1000).description('Maximum rows to return (default: 1000)'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const {\n text,\n has_header: hasHeader,\n delimiter,\n limit: rawLimit,\n } = args as {\n text: string\n has_header: boolean\n delimiter: string\n limit: number\n }\n const limit = Math.min(10_000, Math.max(1, Math.floor(rawLimit)))\n\n try {\n const result = Papa.parse<unknown>(text.trim(), {\n header: hasHeader,\n delimiter: delimiter || undefined,\n skipEmptyLines: true,\n dynamicTyping: true,\n })\n\n const rows = (result.data as unknown[]).slice(0, limit)\n const warnings =\n result.errors.length > 0\n ? `Parse warnings: ${result.errors\n .slice(0, 3)\n .map((e) => e.message)\n .join('; ')}\\n\\n`\n : ''\n const truncated =\n result.data.length > limit ? `\\n\\n(Showing ${limit} of ${result.data.length} rows)` : ''\n\n return warnings + JSON.stringify(rows, null, 2) + truncated\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Parse a YAML string into JSON.\n *\n * @remarks\n * Returns a pretty-printed JSON representation of the parsed YAML document. Invalid YAML\n * returns an error string.\n */\nexport const parseYamlTool = new Tool({\n name: 'parse_yaml',\n description: 'Parse a YAML string and return the equivalent JSON.',\n inputSchema: validator.object({\n text: validator.string().required().description('YAML text to parse'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const { text } = args as { text: string }\n try {\n const parsed = parseYaml(text)\n return JSON.stringify(parsed, null, 2)\n } catch (err) {\n return `Error: Invalid YAML — ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Extract key-value pairs from text.\n *\n * @remarks\n * Handles `.env` files, config files, and query strings. `kv_delimiter` chooses the\n * key→value separator (`=`, `:`, or `auto`); `pair_delimiter` selects how pairs are separated\n * (`newline`, `comma`, `semicolon`, `ampersand`). Surrounding single or double quotes around\n * values are stripped. Comment lines starting with `#` are skipped by default.\n */\nexport const parseKvTool = new Tool({\n name: 'parse_kv',\n description:\n 'Extract key-value pairs from text (e.g. .env files, config files, query strings). Returns a JSON object.',\n inputSchema: validator.object({\n text: validator.string().required().description('Text containing key-value pairs'),\n kv_delimiter: validator\n .string()\n .valid('=', ':', 'auto')\n .default('auto')\n .description('Separator between key and value (default: auto-detect)'),\n pair_delimiter: validator\n .string()\n .valid('newline', 'comma', 'semicolon', 'ampersand')\n .default('newline')\n .description('Separator between pairs (default: newline)'),\n skip_comments: validator\n .boolean()\n .default(true)\n .description('Skip lines starting with # (default: true)'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const {\n text,\n kv_delimiter: kvDelim,\n pair_delimiter: pairDelimKey,\n skip_comments: skipComments,\n } = args as {\n text: string\n kv_delimiter: string\n pair_delimiter: string\n skip_comments: boolean\n }\n\n const pairDelimMap: Record<string, string> = {\n newline: '\\n',\n comma: ',',\n semicolon: ';',\n ampersand: '&',\n }\n const pairDelim = pairDelimMap[pairDelimKey] ?? '\\n'\n\n const result: Record<string, string> = {}\n\n for (const raw of text.split(pairDelim)) {\n const line = raw.trim()\n if (line === '') continue\n if (skipComments && line.startsWith('#')) continue\n\n const delim =\n kvDelim === 'auto' ? (line.includes('=') ? '=' : line.includes(':') ? ':' : null) : kvDelim\n if (!delim) continue\n\n const sepIdx = line.indexOf(delim)\n if (sepIdx === -1) continue\n\n const key = line.slice(0, sepIdx).trim()\n let value = line.slice(sepIdx + delim.length).trim()\n\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n\n if (key) result[key] = value\n }\n\n return JSON.stringify(result, null, 2)\n },\n})\n\n/**\n * Detect the most likely field delimiter in a CSV-like text sample.\n *\n * @remarks\n * Tries comma, tab, semicolon, pipe, and colon. Scores each by mean field count divided by\n * variance (so consistent row widths beat noisy splits). Looks at up to the first 20 lines of\n * the first 5000 characters.\n */\nexport const detectDelimiterTool = new Tool({\n name: 'detect_delimiter',\n description: 'Detect the most likely field delimiter in a CSV-like text sample.',\n inputSchema: validator.object({\n text: validator.string().required().description('Sample of the delimited text to analyze'),\n }),\n handler: async (args) => {\n const { text } = args as { text: string }\n const sample = text.slice(0, 5000)\n const lines = sample\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .slice(0, 20)\n\n if (lines.length === 0) return 'Error: No lines to analyze.'\n\n const candidates: Array<{ delim: string; name: string }> = [\n { delim: ',', name: 'comma' },\n { delim: '\\t', name: 'tab' },\n { delim: ';', name: 'semicolon' },\n { delim: '|', name: 'pipe' },\n { delim: ':', name: 'colon' },\n ]\n\n let best = { name: 'comma', delim: ',', score: -1, avgFields: 0 }\n\n for (const { delim, name } of candidates) {\n const counts = lines.map((l) => l.split(delim).length - 1)\n const avg = counts.reduce((a, b) => a + b, 0) / counts.length\n if (avg === 0) continue\n const fieldVariance = counts.reduce((a, b) => a + (b - avg) ** 2, 0) / counts.length\n const score = avg / (1 + fieldVariance)\n if (score > best.score) {\n best = { name, delim, score, avgFields: Number.parseFloat((avg + 1).toFixed(1)) }\n }\n }\n\n return `Detected delimiter: ${best.name} (\"${best.delim === '\\t' ? '\\\\t' : best.delim}\") — ~${best.avgFields} fields per row`\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"parsing.cjs","names":[],"sources":["../../../src/batteries/tools/parsing/index.ts"],"sourcesContent":["/**\n * Pre-constructed tools for parsing CSV, TSV, JSON, YAML, and other structured text formats.\n *\n * @module @nhtio/adk/batteries/tools/parsing\n *\n * @remarks\n * Pre-constructed bundled tools for the `parsing` category. Import individually, the whole\n * category, or import every tool via `@nhtio/adk/batteries`.\n */\n\nimport { load as parseYaml } from 'js-yaml'\nimport { default as Papa } from 'papaparse'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Tool, SpooledJsonArtifact } from '@nhtio/adk/common'\n\n/**\n * Parse a CSV or TSV string into a JSON array.\n *\n * @remarks\n * With `has_header: true` (default), each row becomes an object keyed by column name. Without a\n * header, rows are returned as positional arrays. `delimiter` auto-detects when omitted; pass\n * `\"\\t\"` for TSV. Rows are clipped to `limit` (default 1000, max 10000). Parse warnings are\n * prepended to the output.\n */\nexport const parseCsvTool = new Tool({\n name: 'parse_csv',\n description:\n 'Parse a CSV or TSV string into a JSON array. With a header row, returns objects keyed by column name. Without, returns arrays of values.',\n inputSchema: validator.object({\n text: validator.string().required().description('CSV or TSV text to parse'),\n has_header: validator\n .boolean()\n .default(true)\n .description('First row is a header row (default: true)'),\n delimiter: validator\n .string()\n .default('')\n .allow('')\n .description('Field delimiter — auto-detected if omitted. Use \"\\\\t\" for TSV.'),\n limit: validator.number().default(1000).description('Maximum rows to return (default: 1000)'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const {\n text,\n has_header: hasHeader,\n delimiter,\n limit: rawLimit,\n } = args as {\n text: string\n has_header: boolean\n delimiter: string\n limit: number\n }\n const limit = Math.min(10_000, Math.max(1, Math.floor(rawLimit)))\n\n try {\n const result = Papa.parse<unknown>(text.trim(), {\n header: hasHeader,\n delimiter: delimiter || undefined,\n skipEmptyLines: true,\n dynamicTyping: true,\n })\n\n const rows = (result.data as unknown[]).slice(0, limit)\n const warnings =\n result.errors.length > 0\n ? `Parse warnings: ${result.errors\n .slice(0, 3)\n .map((e) => e.message)\n .join('; ')}\\n\\n`\n : ''\n const truncated =\n result.data.length > limit ? `\\n\\n(Showing ${limit} of ${result.data.length} rows)` : ''\n\n return warnings + JSON.stringify(rows, null, 2) + truncated\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Parse a YAML string into JSON.\n *\n * @remarks\n * Returns a pretty-printed JSON representation of the parsed YAML document. Invalid YAML\n * returns an error string.\n */\nexport const parseYamlTool = new Tool({\n name: 'parse_yaml',\n description: 'Parse a YAML string and return the equivalent JSON.',\n inputSchema: validator.object({\n text: validator.string().required().description('YAML text to parse'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const { text } = args as { text: string }\n try {\n const parsed = parseYaml(text)\n return JSON.stringify(parsed, null, 2)\n } catch (err) {\n return `Error: Invalid YAML — ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Extract key-value pairs from text.\n *\n * @remarks\n * Handles `.env` files, config files, and query strings. `kv_delimiter` chooses the\n * key→value separator (`=`, `:`, or `auto`); `pair_delimiter` selects how pairs are separated\n * (`newline`, `comma`, `semicolon`, `ampersand`). Surrounding single or double quotes around\n * values are stripped. Comment lines starting with `#` are skipped by default.\n */\nexport const parseKvTool = new Tool({\n name: 'parse_kv',\n description:\n 'Extract key-value pairs from text (e.g. .env files, config files, query strings). Returns a JSON object.',\n inputSchema: validator.object({\n text: validator.string().required().description('Text containing key-value pairs'),\n kv_delimiter: validator\n .string()\n .valid('=', ':', 'auto')\n .default('auto')\n .description('Separator between key and value (default: auto-detect)'),\n pair_delimiter: validator\n .string()\n .valid('newline', 'comma', 'semicolon', 'ampersand')\n .default('newline')\n .description('Separator between pairs (default: newline)'),\n skip_comments: validator\n .boolean()\n .default(true)\n .description('Skip lines starting with # (default: true)'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const {\n text,\n kv_delimiter: kvDelim,\n pair_delimiter: pairDelimKey,\n skip_comments: skipComments,\n } = args as {\n text: string\n kv_delimiter: string\n pair_delimiter: string\n skip_comments: boolean\n }\n\n const pairDelimMap: Record<string, string> = {\n newline: '\\n',\n comma: ',',\n semicolon: ';',\n ampersand: '&',\n }\n const pairDelim = pairDelimMap[pairDelimKey] ?? '\\n'\n\n const result: Record<string, string> = {}\n\n for (const raw of text.split(pairDelim)) {\n const line = raw.trim()\n if (line === '') continue\n if (skipComments && line.startsWith('#')) continue\n\n const delim =\n kvDelim === 'auto' ? (line.includes('=') ? '=' : line.includes(':') ? ':' : null) : kvDelim\n if (!delim) continue\n\n const sepIdx = line.indexOf(delim)\n if (sepIdx === -1) continue\n\n const key = line.slice(0, sepIdx).trim()\n let value = line.slice(sepIdx + delim.length).trim()\n\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n\n if (key) result[key] = value\n }\n\n return JSON.stringify(result, null, 2)\n },\n})\n\n/**\n * Detect the most likely field delimiter in a CSV-like text sample.\n *\n * @remarks\n * Tries comma, tab, semicolon, pipe, and colon. Scores each by mean field count divided by\n * variance (so consistent row widths beat noisy splits). Looks at up to the first 20 lines of\n * the first 5000 characters.\n */\nexport const detectDelimiterTool = new Tool({\n name: 'detect_delimiter',\n description: 'Detect the most likely field delimiter in a CSV-like text sample.',\n inputSchema: validator.object({\n text: validator.string().required().description('Sample of the delimited text to analyze'),\n }),\n handler: async (args) => {\n const { text } = args as { text: string }\n const sample = text.slice(0, 5000)\n const lines = sample\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .slice(0, 20)\n\n if (lines.length === 0) return 'Error: No lines to analyze.'\n\n const candidates: Array<{ delim: string; name: string }> = [\n { delim: ',', name: 'comma' },\n { delim: '\\t', name: 'tab' },\n { delim: ';', name: 'semicolon' },\n { delim: '|', name: 'pipe' },\n { delim: ':', name: 'colon' },\n ]\n\n let best = { name: 'comma', delim: ',', score: -1, avgFields: 0 }\n\n for (const { delim, name } of candidates) {\n const counts = lines.map((l) => l.split(delim).length - 1)\n const avg = counts.reduce((a, b) => a + b, 0) / counts.length\n if (avg === 0) continue\n const fieldVariance = counts.reduce((a, b) => a + (b - avg) ** 2, 0) / counts.length\n const score = avg / (1 + fieldVariance)\n if (score > best.score) {\n best = { name, delim, score, avgFields: Number.parseFloat((avg + 1).toFixed(1)) }\n }\n }\n\n return `Detected delimiter: ${best.name} (\"${best.delim === '\\t' ? '\\\\t' : best.delim}\") — ~${best.avgFields} fields per row`\n },\n})\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { o as isError } from "../../tool_registry-DqLOyGyG.mjs";
2
- import { t as Tool } from "../../tool-q4LskG7K.mjs";
3
- import "../../common-aFmr9Oqs.mjs";
4
- import { n as SpooledJsonArtifact } from "../../spooled_markdown_artifact-DWWak35I.mjs";
2
+ import "../../common-DeZaonK1.mjs";
3
+ import { t as Tool } from "../../tool-D2WB1EA1.mjs";
4
+ import { n as SpooledJsonArtifact } from "../../spooled_markdown_artifact-BpUJol0W.mjs";
5
5
  import "../../guards.mjs";
6
6
  import { validator } from "@nhtio/validation";
7
7
  import { load } from "js-yaml";
@@ -1,12 +1,13 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_tool_registry = require("../../tool_registry-snPjF0zJ.js");
3
- const require_tool = require("../../tool-cwJyEHI9.js");
4
- const require_common = require("../../common-BJ6V6dsH.js");
5
- const require_spooled_markdown_artifact = require("../../spooled_markdown_artifact-DK-T8Hy6.js");
2
+ require("../../chunk-KmRHZBOW.js");
3
+ const require_tool_registry = require("../../tool_registry-Dkfprsck.js");
4
+ const require_common = require("../../common-Od8edUXU.js");
5
+ const require_tool = require("../../tool-COSeH8I6.js");
6
+ const require_spooled_markdown_artifact = require("../../spooled_markdown_artifact-RRB113sy.js");
6
7
  require("../../guards.cjs");
7
8
  let _nhtio_validation = require("@nhtio/validation");
8
- let luxon = require("luxon");
9
9
  let uuid = require("uuid");
10
+ let luxon = require("luxon");
10
11
  //#region src/batteries/tools/retrievables/index.ts
11
12
  /**
12
13
  * Pre-constructed CRUD tools for model-visible retrievable and RAG-record management.
@@ -45,9 +46,9 @@ var TRUST_TIERS = [
45
46
  "third-party-public",
46
47
  "third-party-private"
47
48
  ];
48
- var serialiseRetrievable = async (r) => ({
49
+ var serialiseRetrievable = (r) => ({
49
50
  id: r.id,
50
- content: await r.contentString(),
51
+ content: r.content.toString(),
51
52
  trustTier: r.trustTier,
52
53
  source: r.source,
53
54
  kind: r.kind,
@@ -70,8 +71,7 @@ var listRetrievablesTool = new require_tool.Tool({
70
71
  handler: async (_args, ctx) => {
71
72
  try {
72
73
  const retrievables = await ctx.fetchRetrievables();
73
- const serialised = await Promise.all(retrievables.map(serialiseRetrievable));
74
- return JSON.stringify(serialised, null, 2);
74
+ return JSON.stringify(retrievables.map(serialiseRetrievable), null, 2);
75
75
  } catch (err) {
76
76
  return `Error: ${require_tool_registry.isError(err) ? err.message : String(err)}`;
77
77
  }
@@ -116,7 +116,7 @@ var storeRetrievableTool = new require_tool.Tool({
116
116
  await ctx.storeRetrievable(retrievable);
117
117
  return JSON.stringify({
118
118
  ok: true,
119
- retrievable: await serialiseRetrievable(retrievable)
119
+ retrievable: serialiseRetrievable(retrievable)
120
120
  }, null, 2);
121
121
  } catch (err) {
122
122
  return `Error: ${require_tool_registry.isError(err) ? err.message : String(err)}`;
@@ -162,7 +162,7 @@ var updateRetrievableTool = new require_tool.Tool({
162
162
  await ctx.mutateRetrievable(updated);
163
163
  return JSON.stringify({
164
164
  ok: true,
165
- retrievable: await serialiseRetrievable(updated)
165
+ retrievable: serialiseRetrievable(updated)
166
166
  }, null, 2);
167
167
  } catch (err) {
168
168
  return `Error: ${require_tool_registry.isError(err) ? err.message : String(err)}`;
@@ -1 +1 @@
1
- {"version":3,"file":"retrievables.cjs","names":[],"sources":["../../../src/batteries/tools/retrievables/index.ts"],"sourcesContent":["/**\n * Pre-constructed CRUD tools for model-visible retrievable and RAG-record management.\n *\n * @module @nhtio/adk/batteries/tools/retrievables\n *\n * @remarks\n * Pre-constructed CRUD tools that expose the ADK's {@link @nhtio/adk!Retrievable} surface to the\n * model. Each tool delegates to the corresponding callback on the active\n * {@link @nhtio/adk!DispatchContext} (`fetchRetrievables`, `storeRetrievable`, `mutateRetrievable`,\n * `deleteRetrievable`) — the persistence layer is whatever the consumer wired into the\n * runner.\n *\n * Retrievables are RAG records and carry an explicit `trustTier` that drives the LLM\n * battery's rendering envelope. Exposing these CRUD tools to the model is a deliberate\n * deployer decision; the trust tier the model declares when creating or updating a record\n * is honoured verbatim by the persistence layer. The deployer is responsible for choosing\n * whether to register all four tools, only the read-only `list_retrievables`, or any subset\n * thereof — that registration choice is exactly the trust boundary documented in the\n * Retrievable battery contract.\n *\n * Output is JSON for every tool so consumers can parse the result without re-tokenising —\n * the artifact constructor is set to {@link @nhtio/adk!SpooledJsonArtifact}.\n *\n * Tools:\n * - {@link listRetrievablesTool} — read-only list of every retrievable currently held by\n * the context.\n * - {@link storeRetrievableTool} — create a new retrievable record (auto-generates `id` /\n * `createdAt` / `updatedAt` unless explicit values are supplied).\n * - {@link updateRetrievableTool} — replace an existing retrievable by `id`. Bumps\n * `updatedAt`.\n * - {@link deleteRetrievableTool} — remove a retrievable by `id`.\n */\n\nimport { DateTime } from 'luxon'\nimport { v6 as uuidv6 } from 'uuid'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Retrievable, SpooledJsonArtifact, Tool } from '@nhtio/adk/common'\n\nconst TRUST_TIERS = ['first-party', 'third-party-public', 'third-party-private'] as const\ntype TrustTier = (typeof TRUST_TIERS)[number]\n\nconst serialiseRetrievable = async (r: Retrievable): Promise<Record<string, unknown>> => ({\n id: r.id,\n content: await r.contentString(),\n trustTier: r.trustTier,\n source: r.source,\n kind: r.kind,\n score: r.score,\n createdAt: r.createdAt.toISO(),\n updatedAt: r.updatedAt.toISO(),\n})\n\n/**\n * List every retrievable record currently held by the active execution context.\n *\n * @remarks\n * Delegates to `ctx.fetchRetrievables()`. Returns a JSON-encoded array of retrievable records\n * (id, content, trustTier, source, kind, score, createdAt, updatedAt).\n */\nexport const listRetrievablesTool = new Tool({\n name: 'list_retrievables',\n description:\n 'List every retrievable record currently available to the agent. Returns a JSON array of records with id, content, trustTier, source, kind, score, createdAt, and updatedAt.',\n inputSchema: validator.object({}),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (_args, ctx) => {\n try {\n const retrievables = await ctx.fetchRetrievables()\n const serialised = await Promise.all(retrievables.map(serialiseRetrievable))\n return JSON.stringify(serialised, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Create a new {@link @nhtio/adk!Retrievable} record and persist it via the context's `storeRetrievable`\n * callback.\n *\n * @remarks\n * When `id` is omitted, a UUID v6 is generated. When `createdAt` / `updatedAt` are omitted,\n * the current time is used. The model must declare `trustTier` explicitly — there is no\n * default; the choice is consciously the model's, exposed by the deployer's decision to\n * register this tool.\n */\nexport const storeRetrievableTool = new Tool({\n name: 'store_retrievable',\n description:\n \"Store a new retrievable (RAG) record. The trustTier MUST be one of 'first-party' (deployer-vetted), 'third-party-public' (open-web), or 'third-party-private' (user uploads). id and timestamps are auto-generated if omitted.\",\n inputSchema: validator.object({\n content: validator\n .string()\n .required()\n .description('The retrievable content as a plain string.'),\n trustTier: validator\n .string()\n .valid(...TRUST_TIERS)\n .required()\n .description(\n \"Trust tier: 'first-party' for deployer-vetted material, 'third-party-public' for open-web or public APIs, 'third-party-private' for user uploads or partner APIs.\"\n ),\n source: validator\n .string()\n .optional()\n .description('Optional provenance string: URL, document path, KB id, etc.'),\n kind: validator\n .string()\n .optional()\n .description(\"Optional semantic label: 'policy', 'reference', 'web-page', 'pdf', etc.\"),\n score: validator\n .number()\n .min(0)\n .max(1)\n .optional()\n .description('Optional relevance / similarity score in [0, 1].'),\n id: validator\n .string()\n .optional()\n .description('Optional stable id. Auto-generated when absent.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { content, trustTier, source, kind, score, id } = args as {\n content: string\n trustTier: TrustTier\n source?: string\n kind?: string\n score?: number\n id?: string\n }\n try {\n const now = DateTime.now()\n const retrievable = new Retrievable({\n id: id ?? uuidv6(),\n content,\n trustTier,\n source,\n kind,\n score,\n createdAt: now,\n updatedAt: now,\n })\n await ctx.storeRetrievable(retrievable)\n return JSON.stringify(\n { ok: true, retrievable: await serialiseRetrievable(retrievable) },\n null,\n 2\n )\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Replace an existing {@link @nhtio/adk!Retrievable} by `id`.\n *\n * @remarks\n * The model supplies `id` plus any subset of `content` / `trustTier` / `source` / `kind` /\n * `score`; omitted fields retain their prior values. `updatedAt` is always bumped;\n * `createdAt` is preserved. Returns an error when no retrievable with the supplied `id` is\n * found.\n */\nexport const updateRetrievableTool = new Tool({\n name: 'update_retrievable',\n description:\n 'Update an existing retrievable by id. Supply any subset of content / trustTier / source / kind / score — omitted fields retain their prior values. updatedAt is always refreshed.',\n inputSchema: validator.object({\n id: validator.string().required().description('Id of the retrievable to update.'),\n content: validator.string().optional().description('Replacement content.'),\n trustTier: validator\n .string()\n .valid(...TRUST_TIERS)\n .optional()\n .description('Replacement trust tier.'),\n source: validator.string().optional().description('Replacement provenance string.'),\n kind: validator.string().optional().description('Replacement semantic label.'),\n score: validator.number().min(0).max(1).optional().description('Replacement score in [0, 1].'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { id, content, trustTier, source, kind, score } = args as {\n id: string\n content?: string\n trustTier?: TrustTier\n source?: string\n kind?: string\n score?: number\n }\n try {\n const retrievables = await ctx.fetchRetrievables()\n const existing = retrievables.find((r) => r.id === id)\n if (!existing) {\n return `Error: No retrievable found with id \"${id}\".`\n }\n const updated = new Retrievable({\n id: existing.id,\n content: content ?? existing.content,\n trustTier: trustTier ?? existing.trustTier,\n source: source ?? existing.source,\n kind: kind ?? existing.kind,\n score: score ?? existing.score,\n createdAt: existing.createdAt,\n updatedAt: DateTime.now(),\n })\n await ctx.mutateRetrievable(updated)\n return JSON.stringify({ ok: true, retrievable: await serialiseRetrievable(updated) }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Remove an existing {@link @nhtio/adk!Retrievable} by `id`.\n *\n * @remarks\n * Delegates to `ctx.deleteRetrievable(id)`. Returns `{ ok: true, id }` on success regardless\n * of whether a retrievable was actually present — `deleteRetrievable` is idempotent at the\n * ADK level.\n */\nexport const deleteRetrievableTool = new Tool({\n name: 'delete_retrievable',\n description: 'Delete a retrievable by id.',\n inputSchema: validator.object({\n id: validator.string().required().description('Id of the retrievable to delete.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { id } = args as { id: string }\n try {\n await ctx.deleteRetrievable(id)\n return JSON.stringify({ ok: true, id }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Convenience tuple of every retrievable CRUD tool. Spread into a {@link @nhtio/adk!ToolRegistry} to\n * register the entire category at once.\n */\nexport const retrievableTools = [\n listRetrievablesTool,\n storeRetrievableTool,\n updateRetrievableTool,\n deleteRetrievableTool,\n] as const\n"],"mappings":"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"}
1
+ {"version":3,"file":"retrievables.cjs","names":[],"sources":["../../../src/batteries/tools/retrievables/index.ts"],"sourcesContent":["/**\n * Pre-constructed CRUD tools for model-visible retrievable and RAG-record management.\n *\n * @module @nhtio/adk/batteries/tools/retrievables\n *\n * @remarks\n * Pre-constructed CRUD tools that expose the ADK's {@link @nhtio/adk!Retrievable} surface to the\n * model. Each tool delegates to the corresponding callback on the active\n * {@link @nhtio/adk!DispatchContext} (`fetchRetrievables`, `storeRetrievable`, `mutateRetrievable`,\n * `deleteRetrievable`) — the persistence layer is whatever the consumer wired into the\n * runner.\n *\n * Retrievables are RAG records and carry an explicit `trustTier` that drives the LLM\n * battery's rendering envelope. Exposing these CRUD tools to the model is a deliberate\n * deployer decision; the trust tier the model declares when creating or updating a record\n * is honoured verbatim by the persistence layer. The deployer is responsible for choosing\n * whether to register all four tools, only the read-only `list_retrievables`, or any subset\n * thereof — that registration choice is exactly the trust boundary documented in the\n * Retrievable battery contract.\n *\n * Output is JSON for every tool so consumers can parse the result without re-tokenising —\n * the artifact constructor is set to {@link @nhtio/adk!SpooledJsonArtifact}.\n *\n * Tools:\n * - {@link listRetrievablesTool} — read-only list of every retrievable currently held by\n * the context.\n * - {@link storeRetrievableTool} — create a new retrievable record (auto-generates `id` /\n * `createdAt` / `updatedAt` unless explicit values are supplied).\n * - {@link updateRetrievableTool} — replace an existing retrievable by `id`. Bumps\n * `updatedAt`.\n * - {@link deleteRetrievableTool} — remove a retrievable by `id`.\n */\n\nimport { DateTime } from 'luxon'\nimport { v6 as uuidv6 } from 'uuid'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Retrievable, SpooledJsonArtifact, Tool } from '@nhtio/adk/common'\n\nconst TRUST_TIERS = ['first-party', 'third-party-public', 'third-party-private'] as const\ntype TrustTier = (typeof TRUST_TIERS)[number]\n\nconst serialiseRetrievable = (r: Retrievable): Record<string, unknown> => ({\n id: r.id,\n content: r.content.toString(),\n trustTier: r.trustTier,\n source: r.source,\n kind: r.kind,\n score: r.score,\n createdAt: r.createdAt.toISO(),\n updatedAt: r.updatedAt.toISO(),\n})\n\n/**\n * List every retrievable record currently held by the active execution context.\n *\n * @remarks\n * Delegates to `ctx.fetchRetrievables()`. Returns a JSON-encoded array of retrievable records\n * (id, content, trustTier, source, kind, score, createdAt, updatedAt).\n */\nexport const listRetrievablesTool = new Tool({\n name: 'list_retrievables',\n description:\n 'List every retrievable record currently available to the agent. Returns a JSON array of records with id, content, trustTier, source, kind, score, createdAt, and updatedAt.',\n inputSchema: validator.object({}),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (_args, ctx) => {\n try {\n const retrievables = await ctx.fetchRetrievables()\n return JSON.stringify(retrievables.map(serialiseRetrievable), null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Create a new {@link @nhtio/adk!Retrievable} record and persist it via the context's `storeRetrievable`\n * callback.\n *\n * @remarks\n * When `id` is omitted, a UUID v6 is generated. When `createdAt` / `updatedAt` are omitted,\n * the current time is used. The model must declare `trustTier` explicitly — there is no\n * default; the choice is consciously the model's, exposed by the deployer's decision to\n * register this tool.\n */\nexport const storeRetrievableTool = new Tool({\n name: 'store_retrievable',\n description:\n \"Store a new retrievable (RAG) record. The trustTier MUST be one of 'first-party' (deployer-vetted), 'third-party-public' (open-web), or 'third-party-private' (user uploads). id and timestamps are auto-generated if omitted.\",\n inputSchema: validator.object({\n content: validator\n .string()\n .required()\n .description('The retrievable content as a plain string.'),\n trustTier: validator\n .string()\n .valid(...TRUST_TIERS)\n .required()\n .description(\n \"Trust tier: 'first-party' for deployer-vetted material, 'third-party-public' for open-web or public APIs, 'third-party-private' for user uploads or partner APIs.\"\n ),\n source: validator\n .string()\n .optional()\n .description('Optional provenance string: URL, document path, KB id, etc.'),\n kind: validator\n .string()\n .optional()\n .description(\"Optional semantic label: 'policy', 'reference', 'web-page', 'pdf', etc.\"),\n score: validator\n .number()\n .min(0)\n .max(1)\n .optional()\n .description('Optional relevance / similarity score in [0, 1].'),\n id: validator\n .string()\n .optional()\n .description('Optional stable id. Auto-generated when absent.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { content, trustTier, source, kind, score, id } = args as {\n content: string\n trustTier: TrustTier\n source?: string\n kind?: string\n score?: number\n id?: string\n }\n try {\n const now = DateTime.now()\n const retrievable = new Retrievable({\n id: id ?? uuidv6(),\n content,\n trustTier,\n source,\n kind,\n score,\n createdAt: now,\n updatedAt: now,\n })\n await ctx.storeRetrievable(retrievable)\n return JSON.stringify({ ok: true, retrievable: serialiseRetrievable(retrievable) }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Replace an existing {@link @nhtio/adk!Retrievable} by `id`.\n *\n * @remarks\n * The model supplies `id` plus any subset of `content` / `trustTier` / `source` / `kind` /\n * `score`; omitted fields retain their prior values. `updatedAt` is always bumped;\n * `createdAt` is preserved. Returns an error when no retrievable with the supplied `id` is\n * found.\n */\nexport const updateRetrievableTool = new Tool({\n name: 'update_retrievable',\n description:\n 'Update an existing retrievable by id. Supply any subset of content / trustTier / source / kind / score — omitted fields retain their prior values. updatedAt is always refreshed.',\n inputSchema: validator.object({\n id: validator.string().required().description('Id of the retrievable to update.'),\n content: validator.string().optional().description('Replacement content.'),\n trustTier: validator\n .string()\n .valid(...TRUST_TIERS)\n .optional()\n .description('Replacement trust tier.'),\n source: validator.string().optional().description('Replacement provenance string.'),\n kind: validator.string().optional().description('Replacement semantic label.'),\n score: validator.number().min(0).max(1).optional().description('Replacement score in [0, 1].'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { id, content, trustTier, source, kind, score } = args as {\n id: string\n content?: string\n trustTier?: TrustTier\n source?: string\n kind?: string\n score?: number\n }\n try {\n const retrievables = await ctx.fetchRetrievables()\n const existing = retrievables.find((r) => r.id === id)\n if (!existing) {\n return `Error: No retrievable found with id \"${id}\".`\n }\n const updated = new Retrievable({\n id: existing.id,\n content: content ?? existing.content,\n trustTier: trustTier ?? existing.trustTier,\n source: source ?? existing.source,\n kind: kind ?? existing.kind,\n score: score ?? existing.score,\n createdAt: existing.createdAt,\n updatedAt: DateTime.now(),\n })\n await ctx.mutateRetrievable(updated)\n return JSON.stringify({ ok: true, retrievable: serialiseRetrievable(updated) }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Remove an existing {@link @nhtio/adk!Retrievable} by `id`.\n *\n * @remarks\n * Delegates to `ctx.deleteRetrievable(id)`. Returns `{ ok: true, id }` on success regardless\n * of whether a retrievable was actually present — `deleteRetrievable` is idempotent at the\n * ADK level.\n */\nexport const deleteRetrievableTool = new Tool({\n name: 'delete_retrievable',\n description: 'Delete a retrievable by id.',\n inputSchema: validator.object({\n id: validator.string().required().description('Id of the retrievable to delete.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { id } = args as { id: string }\n try {\n await ctx.deleteRetrievable(id)\n return JSON.stringify({ ok: true, id }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Convenience tuple of every retrievable CRUD tool. Spread into a {@link @nhtio/adk!ToolRegistry} to\n * register the entire category at once.\n */\nexport const retrievableTools = [\n listRetrievablesTool,\n storeRetrievableTool,\n updateRetrievableTool,\n deleteRetrievableTool,\n] as const\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { o as isError } from "../../tool_registry-DqLOyGyG.mjs";
2
- import { t as Tool } from "../../tool-q4LskG7K.mjs";
3
- import { o as Retrievable } from "../../common-aFmr9Oqs.mjs";
4
- import { n as SpooledJsonArtifact } from "../../spooled_markdown_artifact-DWWak35I.mjs";
2
+ import { i as Retrievable } from "../../common-DeZaonK1.mjs";
3
+ import { t as Tool } from "../../tool-D2WB1EA1.mjs";
4
+ import { n as SpooledJsonArtifact } from "../../spooled_markdown_artifact-BpUJol0W.mjs";
5
5
  import "../../guards.mjs";
6
6
  import { validator } from "@nhtio/validation";
7
- import { DateTime } from "luxon";
8
7
  import { v6 } from "uuid";
8
+ import { DateTime } from "luxon";
9
9
  //#region src/batteries/tools/retrievables/index.ts
10
10
  /**
11
11
  * Pre-constructed CRUD tools for model-visible retrievable and RAG-record management.
@@ -44,9 +44,9 @@ var TRUST_TIERS = [
44
44
  "third-party-public",
45
45
  "third-party-private"
46
46
  ];
47
- var serialiseRetrievable = async (r) => ({
47
+ var serialiseRetrievable = (r) => ({
48
48
  id: r.id,
49
- content: await r.contentString(),
49
+ content: r.content.toString(),
50
50
  trustTier: r.trustTier,
51
51
  source: r.source,
52
52
  kind: r.kind,
@@ -69,8 +69,7 @@ var listRetrievablesTool = new Tool({
69
69
  handler: async (_args, ctx) => {
70
70
  try {
71
71
  const retrievables = await ctx.fetchRetrievables();
72
- const serialised = await Promise.all(retrievables.map(serialiseRetrievable));
73
- return JSON.stringify(serialised, null, 2);
72
+ return JSON.stringify(retrievables.map(serialiseRetrievable), null, 2);
74
73
  } catch (err) {
75
74
  return `Error: ${isError(err) ? err.message : String(err)}`;
76
75
  }
@@ -115,7 +114,7 @@ var storeRetrievableTool = new Tool({
115
114
  await ctx.storeRetrievable(retrievable);
116
115
  return JSON.stringify({
117
116
  ok: true,
118
- retrievable: await serialiseRetrievable(retrievable)
117
+ retrievable: serialiseRetrievable(retrievable)
119
118
  }, null, 2);
120
119
  } catch (err) {
121
120
  return `Error: ${isError(err) ? err.message : String(err)}`;
@@ -161,7 +160,7 @@ var updateRetrievableTool = new Tool({
161
160
  await ctx.mutateRetrievable(updated);
162
161
  return JSON.stringify({
163
162
  ok: true,
164
- retrievable: await serialiseRetrievable(updated)
163
+ retrievable: serialiseRetrievable(updated)
165
164
  }, null, 2);
166
165
  } catch (err) {
167
166
  return `Error: ${isError(err) ? err.message : String(err)}`;
@@ -1 +1 @@
1
- {"version":3,"file":"retrievables.mjs","names":[],"sources":["../../../src/batteries/tools/retrievables/index.ts"],"sourcesContent":["/**\n * Pre-constructed CRUD tools for model-visible retrievable and RAG-record management.\n *\n * @module @nhtio/adk/batteries/tools/retrievables\n *\n * @remarks\n * Pre-constructed CRUD tools that expose the ADK's {@link @nhtio/adk!Retrievable} surface to the\n * model. Each tool delegates to the corresponding callback on the active\n * {@link @nhtio/adk!DispatchContext} (`fetchRetrievables`, `storeRetrievable`, `mutateRetrievable`,\n * `deleteRetrievable`) — the persistence layer is whatever the consumer wired into the\n * runner.\n *\n * Retrievables are RAG records and carry an explicit `trustTier` that drives the LLM\n * battery's rendering envelope. Exposing these CRUD tools to the model is a deliberate\n * deployer decision; the trust tier the model declares when creating or updating a record\n * is honoured verbatim by the persistence layer. The deployer is responsible for choosing\n * whether to register all four tools, only the read-only `list_retrievables`, or any subset\n * thereof — that registration choice is exactly the trust boundary documented in the\n * Retrievable battery contract.\n *\n * Output is JSON for every tool so consumers can parse the result without re-tokenising —\n * the artifact constructor is set to {@link @nhtio/adk!SpooledJsonArtifact}.\n *\n * Tools:\n * - {@link listRetrievablesTool} — read-only list of every retrievable currently held by\n * the context.\n * - {@link storeRetrievableTool} — create a new retrievable record (auto-generates `id` /\n * `createdAt` / `updatedAt` unless explicit values are supplied).\n * - {@link updateRetrievableTool} — replace an existing retrievable by `id`. Bumps\n * `updatedAt`.\n * - {@link deleteRetrievableTool} — remove a retrievable by `id`.\n */\n\nimport { DateTime } from 'luxon'\nimport { v6 as uuidv6 } from 'uuid'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Retrievable, SpooledJsonArtifact, Tool } from '@nhtio/adk/common'\n\nconst TRUST_TIERS = ['first-party', 'third-party-public', 'third-party-private'] as const\ntype TrustTier = (typeof TRUST_TIERS)[number]\n\nconst serialiseRetrievable = async (r: Retrievable): Promise<Record<string, unknown>> => ({\n id: r.id,\n content: await r.contentString(),\n trustTier: r.trustTier,\n source: r.source,\n kind: r.kind,\n score: r.score,\n createdAt: r.createdAt.toISO(),\n updatedAt: r.updatedAt.toISO(),\n})\n\n/**\n * List every retrievable record currently held by the active execution context.\n *\n * @remarks\n * Delegates to `ctx.fetchRetrievables()`. Returns a JSON-encoded array of retrievable records\n * (id, content, trustTier, source, kind, score, createdAt, updatedAt).\n */\nexport const listRetrievablesTool = new Tool({\n name: 'list_retrievables',\n description:\n 'List every retrievable record currently available to the agent. Returns a JSON array of records with id, content, trustTier, source, kind, score, createdAt, and updatedAt.',\n inputSchema: validator.object({}),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (_args, ctx) => {\n try {\n const retrievables = await ctx.fetchRetrievables()\n const serialised = await Promise.all(retrievables.map(serialiseRetrievable))\n return JSON.stringify(serialised, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Create a new {@link @nhtio/adk!Retrievable} record and persist it via the context's `storeRetrievable`\n * callback.\n *\n * @remarks\n * When `id` is omitted, a UUID v6 is generated. When `createdAt` / `updatedAt` are omitted,\n * the current time is used. The model must declare `trustTier` explicitly — there is no\n * default; the choice is consciously the model's, exposed by the deployer's decision to\n * register this tool.\n */\nexport const storeRetrievableTool = new Tool({\n name: 'store_retrievable',\n description:\n \"Store a new retrievable (RAG) record. The trustTier MUST be one of 'first-party' (deployer-vetted), 'third-party-public' (open-web), or 'third-party-private' (user uploads). id and timestamps are auto-generated if omitted.\",\n inputSchema: validator.object({\n content: validator\n .string()\n .required()\n .description('The retrievable content as a plain string.'),\n trustTier: validator\n .string()\n .valid(...TRUST_TIERS)\n .required()\n .description(\n \"Trust tier: 'first-party' for deployer-vetted material, 'third-party-public' for open-web or public APIs, 'third-party-private' for user uploads or partner APIs.\"\n ),\n source: validator\n .string()\n .optional()\n .description('Optional provenance string: URL, document path, KB id, etc.'),\n kind: validator\n .string()\n .optional()\n .description(\"Optional semantic label: 'policy', 'reference', 'web-page', 'pdf', etc.\"),\n score: validator\n .number()\n .min(0)\n .max(1)\n .optional()\n .description('Optional relevance / similarity score in [0, 1].'),\n id: validator\n .string()\n .optional()\n .description('Optional stable id. Auto-generated when absent.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { content, trustTier, source, kind, score, id } = args as {\n content: string\n trustTier: TrustTier\n source?: string\n kind?: string\n score?: number\n id?: string\n }\n try {\n const now = DateTime.now()\n const retrievable = new Retrievable({\n id: id ?? uuidv6(),\n content,\n trustTier,\n source,\n kind,\n score,\n createdAt: now,\n updatedAt: now,\n })\n await ctx.storeRetrievable(retrievable)\n return JSON.stringify(\n { ok: true, retrievable: await serialiseRetrievable(retrievable) },\n null,\n 2\n )\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Replace an existing {@link @nhtio/adk!Retrievable} by `id`.\n *\n * @remarks\n * The model supplies `id` plus any subset of `content` / `trustTier` / `source` / `kind` /\n * `score`; omitted fields retain their prior values. `updatedAt` is always bumped;\n * `createdAt` is preserved. Returns an error when no retrievable with the supplied `id` is\n * found.\n */\nexport const updateRetrievableTool = new Tool({\n name: 'update_retrievable',\n description:\n 'Update an existing retrievable by id. Supply any subset of content / trustTier / source / kind / score — omitted fields retain their prior values. updatedAt is always refreshed.',\n inputSchema: validator.object({\n id: validator.string().required().description('Id of the retrievable to update.'),\n content: validator.string().optional().description('Replacement content.'),\n trustTier: validator\n .string()\n .valid(...TRUST_TIERS)\n .optional()\n .description('Replacement trust tier.'),\n source: validator.string().optional().description('Replacement provenance string.'),\n kind: validator.string().optional().description('Replacement semantic label.'),\n score: validator.number().min(0).max(1).optional().description('Replacement score in [0, 1].'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { id, content, trustTier, source, kind, score } = args as {\n id: string\n content?: string\n trustTier?: TrustTier\n source?: string\n kind?: string\n score?: number\n }\n try {\n const retrievables = await ctx.fetchRetrievables()\n const existing = retrievables.find((r) => r.id === id)\n if (!existing) {\n return `Error: No retrievable found with id \"${id}\".`\n }\n const updated = new Retrievable({\n id: existing.id,\n content: content ?? existing.content,\n trustTier: trustTier ?? existing.trustTier,\n source: source ?? existing.source,\n kind: kind ?? existing.kind,\n score: score ?? existing.score,\n createdAt: existing.createdAt,\n updatedAt: DateTime.now(),\n })\n await ctx.mutateRetrievable(updated)\n return JSON.stringify({ ok: true, retrievable: await serialiseRetrievable(updated) }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Remove an existing {@link @nhtio/adk!Retrievable} by `id`.\n *\n * @remarks\n * Delegates to `ctx.deleteRetrievable(id)`. Returns `{ ok: true, id }` on success regardless\n * of whether a retrievable was actually present — `deleteRetrievable` is idempotent at the\n * ADK level.\n */\nexport const deleteRetrievableTool = new Tool({\n name: 'delete_retrievable',\n description: 'Delete a retrievable by id.',\n inputSchema: validator.object({\n id: validator.string().required().description('Id of the retrievable to delete.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { id } = args as { id: string }\n try {\n await ctx.deleteRetrievable(id)\n return JSON.stringify({ ok: true, id }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Convenience tuple of every retrievable CRUD tool. Spread into a {@link @nhtio/adk!ToolRegistry} to\n * register the entire category at once.\n */\nexport const retrievableTools = [\n listRetrievablesTool,\n storeRetrievableTool,\n updateRetrievableTool,\n deleteRetrievableTool,\n] as const\n"],"mappings":"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"}
1
+ {"version":3,"file":"retrievables.mjs","names":[],"sources":["../../../src/batteries/tools/retrievables/index.ts"],"sourcesContent":["/**\n * Pre-constructed CRUD tools for model-visible retrievable and RAG-record management.\n *\n * @module @nhtio/adk/batteries/tools/retrievables\n *\n * @remarks\n * Pre-constructed CRUD tools that expose the ADK's {@link @nhtio/adk!Retrievable} surface to the\n * model. Each tool delegates to the corresponding callback on the active\n * {@link @nhtio/adk!DispatchContext} (`fetchRetrievables`, `storeRetrievable`, `mutateRetrievable`,\n * `deleteRetrievable`) — the persistence layer is whatever the consumer wired into the\n * runner.\n *\n * Retrievables are RAG records and carry an explicit `trustTier` that drives the LLM\n * battery's rendering envelope. Exposing these CRUD tools to the model is a deliberate\n * deployer decision; the trust tier the model declares when creating or updating a record\n * is honoured verbatim by the persistence layer. The deployer is responsible for choosing\n * whether to register all four tools, only the read-only `list_retrievables`, or any subset\n * thereof — that registration choice is exactly the trust boundary documented in the\n * Retrievable battery contract.\n *\n * Output is JSON for every tool so consumers can parse the result without re-tokenising —\n * the artifact constructor is set to {@link @nhtio/adk!SpooledJsonArtifact}.\n *\n * Tools:\n * - {@link listRetrievablesTool} — read-only list of every retrievable currently held by\n * the context.\n * - {@link storeRetrievableTool} — create a new retrievable record (auto-generates `id` /\n * `createdAt` / `updatedAt` unless explicit values are supplied).\n * - {@link updateRetrievableTool} — replace an existing retrievable by `id`. Bumps\n * `updatedAt`.\n * - {@link deleteRetrievableTool} — remove a retrievable by `id`.\n */\n\nimport { DateTime } from 'luxon'\nimport { v6 as uuidv6 } from 'uuid'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Retrievable, SpooledJsonArtifact, Tool } from '@nhtio/adk/common'\n\nconst TRUST_TIERS = ['first-party', 'third-party-public', 'third-party-private'] as const\ntype TrustTier = (typeof TRUST_TIERS)[number]\n\nconst serialiseRetrievable = (r: Retrievable): Record<string, unknown> => ({\n id: r.id,\n content: r.content.toString(),\n trustTier: r.trustTier,\n source: r.source,\n kind: r.kind,\n score: r.score,\n createdAt: r.createdAt.toISO(),\n updatedAt: r.updatedAt.toISO(),\n})\n\n/**\n * List every retrievable record currently held by the active execution context.\n *\n * @remarks\n * Delegates to `ctx.fetchRetrievables()`. Returns a JSON-encoded array of retrievable records\n * (id, content, trustTier, source, kind, score, createdAt, updatedAt).\n */\nexport const listRetrievablesTool = new Tool({\n name: 'list_retrievables',\n description:\n 'List every retrievable record currently available to the agent. Returns a JSON array of records with id, content, trustTier, source, kind, score, createdAt, and updatedAt.',\n inputSchema: validator.object({}),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (_args, ctx) => {\n try {\n const retrievables = await ctx.fetchRetrievables()\n return JSON.stringify(retrievables.map(serialiseRetrievable), null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Create a new {@link @nhtio/adk!Retrievable} record and persist it via the context's `storeRetrievable`\n * callback.\n *\n * @remarks\n * When `id` is omitted, a UUID v6 is generated. When `createdAt` / `updatedAt` are omitted,\n * the current time is used. The model must declare `trustTier` explicitly — there is no\n * default; the choice is consciously the model's, exposed by the deployer's decision to\n * register this tool.\n */\nexport const storeRetrievableTool = new Tool({\n name: 'store_retrievable',\n description:\n \"Store a new retrievable (RAG) record. The trustTier MUST be one of 'first-party' (deployer-vetted), 'third-party-public' (open-web), or 'third-party-private' (user uploads). id and timestamps are auto-generated if omitted.\",\n inputSchema: validator.object({\n content: validator\n .string()\n .required()\n .description('The retrievable content as a plain string.'),\n trustTier: validator\n .string()\n .valid(...TRUST_TIERS)\n .required()\n .description(\n \"Trust tier: 'first-party' for deployer-vetted material, 'third-party-public' for open-web or public APIs, 'third-party-private' for user uploads or partner APIs.\"\n ),\n source: validator\n .string()\n .optional()\n .description('Optional provenance string: URL, document path, KB id, etc.'),\n kind: validator\n .string()\n .optional()\n .description(\"Optional semantic label: 'policy', 'reference', 'web-page', 'pdf', etc.\"),\n score: validator\n .number()\n .min(0)\n .max(1)\n .optional()\n .description('Optional relevance / similarity score in [0, 1].'),\n id: validator\n .string()\n .optional()\n .description('Optional stable id. Auto-generated when absent.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { content, trustTier, source, kind, score, id } = args as {\n content: string\n trustTier: TrustTier\n source?: string\n kind?: string\n score?: number\n id?: string\n }\n try {\n const now = DateTime.now()\n const retrievable = new Retrievable({\n id: id ?? uuidv6(),\n content,\n trustTier,\n source,\n kind,\n score,\n createdAt: now,\n updatedAt: now,\n })\n await ctx.storeRetrievable(retrievable)\n return JSON.stringify({ ok: true, retrievable: serialiseRetrievable(retrievable) }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Replace an existing {@link @nhtio/adk!Retrievable} by `id`.\n *\n * @remarks\n * The model supplies `id` plus any subset of `content` / `trustTier` / `source` / `kind` /\n * `score`; omitted fields retain their prior values. `updatedAt` is always bumped;\n * `createdAt` is preserved. Returns an error when no retrievable with the supplied `id` is\n * found.\n */\nexport const updateRetrievableTool = new Tool({\n name: 'update_retrievable',\n description:\n 'Update an existing retrievable by id. Supply any subset of content / trustTier / source / kind / score — omitted fields retain their prior values. updatedAt is always refreshed.',\n inputSchema: validator.object({\n id: validator.string().required().description('Id of the retrievable to update.'),\n content: validator.string().optional().description('Replacement content.'),\n trustTier: validator\n .string()\n .valid(...TRUST_TIERS)\n .optional()\n .description('Replacement trust tier.'),\n source: validator.string().optional().description('Replacement provenance string.'),\n kind: validator.string().optional().description('Replacement semantic label.'),\n score: validator.number().min(0).max(1).optional().description('Replacement score in [0, 1].'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { id, content, trustTier, source, kind, score } = args as {\n id: string\n content?: string\n trustTier?: TrustTier\n source?: string\n kind?: string\n score?: number\n }\n try {\n const retrievables = await ctx.fetchRetrievables()\n const existing = retrievables.find((r) => r.id === id)\n if (!existing) {\n return `Error: No retrievable found with id \"${id}\".`\n }\n const updated = new Retrievable({\n id: existing.id,\n content: content ?? existing.content,\n trustTier: trustTier ?? existing.trustTier,\n source: source ?? existing.source,\n kind: kind ?? existing.kind,\n score: score ?? existing.score,\n createdAt: existing.createdAt,\n updatedAt: DateTime.now(),\n })\n await ctx.mutateRetrievable(updated)\n return JSON.stringify({ ok: true, retrievable: serialiseRetrievable(updated) }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Remove an existing {@link @nhtio/adk!Retrievable} by `id`.\n *\n * @remarks\n * Delegates to `ctx.deleteRetrievable(id)`. Returns `{ ok: true, id }` on success regardless\n * of whether a retrievable was actually present — `deleteRetrievable` is idempotent at the\n * ADK level.\n */\nexport const deleteRetrievableTool = new Tool({\n name: 'delete_retrievable',\n description: 'Delete a retrievable by id.',\n inputSchema: validator.object({\n id: validator.string().required().description('Id of the retrievable to delete.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { id } = args as { id: string }\n try {\n await ctx.deleteRetrievable(id)\n return JSON.stringify({ ok: true, id }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Convenience tuple of every retrievable CRUD tool. Spread into a {@link @nhtio/adk!ToolRegistry} to\n * register the entire category at once.\n */\nexport const retrievableTools = [\n listRetrievablesTool,\n storeRetrievableTool,\n updateRetrievableTool,\n deleteRetrievableTool,\n] as const\n"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_tool_registry = require("../../tool_registry-snPjF0zJ.js");
3
- const require_tool = require("../../tool-cwJyEHI9.js");
4
- require("../../common-BJ6V6dsH.js");
5
- const require_spooled_markdown_artifact = require("../../spooled_markdown_artifact-DK-T8Hy6.js");
2
+ require("../../chunk-KmRHZBOW.js");
3
+ const require_tool_registry = require("../../tool_registry-Dkfprsck.js");
4
+ require("../../common-Od8edUXU.js");
5
+ const require_tool = require("../../tool-COSeH8I6.js");
6
+ const require_spooled_markdown_artifact = require("../../spooled_markdown_artifact-RRB113sy.js");
6
7
  require("../../guards.cjs");
7
8
  let _nhtio_validation = require("@nhtio/validation");
8
9
  //#region src/batteries/tools/standing_instructions/index.ts
@@ -1 +1 @@
1
- {"version":3,"file":"standing_instructions.cjs","names":[],"sources":["../../../src/batteries/tools/standing_instructions/index.ts"],"sourcesContent":["/**\n * Pre-constructed CRUD tools for model-visible standing instruction management.\n *\n * @module @nhtio/adk/batteries/tools/standing_instructions\n *\n * @remarks\n * Pre-constructed CRUD tools that expose the ADK's standing-instruction surface to the\n * model. Each tool delegates to the corresponding callback on the active\n * {@link @nhtio/adk!DispatchContext} (`standingInstructions` getter, `storeStandingInstruction`,\n * `deleteStandingInstruction`) — the persistence layer is whatever the consumer wired into\n * the runner.\n *\n * Standing instructions are stored as a {@link Set} of {@link @nhtio/adk!Tokenizable} values keyed by\n * identity, not by an `id` field — there is no separate \"update by id\" semantics. The tools\n * therefore expose only `list` / `add` / `remove`. To replace an existing instruction the\n * model should `remove` the old value and `add` the new one (the ADK's persistence layer\n * is free to interpret that pair as an update if appropriate).\n *\n * Output is JSON for every tool so consumers can parse the result without re-tokenising —\n * the artifact constructor is set to {@link @nhtio/adk!SpooledJsonArtifact}.\n *\n * Tools:\n * - {@link listStandingInstructionsTool} — read-only list of every standing instruction\n * currently held by the context (after refreshing from the persistence layer).\n * - {@link addStandingInstructionTool} — add a new standing instruction.\n * - {@link removeStandingInstructionTool} — remove a standing instruction by its content\n * (exact string match).\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { SpooledJsonArtifact, Tool } from '@nhtio/adk/common'\n\n/**\n * List every standing instruction currently held by the active execution context.\n *\n * @remarks\n * Calls `ctx.refreshStandingInstructions()` to ensure the local Set is in sync with the\n * persistence layer, then serialises the resulting strings to a JSON array. The list is\n * stringly-keyed; the same content string serves as the identifier for subsequent removes.\n */\nexport const listStandingInstructionsTool = new Tool({\n name: 'list_standing_instructions',\n description:\n 'List every standing instruction currently held by the agent. Returns a JSON array of strings. To replace an instruction, remove the old string and add a new one.',\n inputSchema: validator.object({}),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (_args, ctx) => {\n try {\n const refreshed = await ctx.refreshStandingInstructions()\n const items = refreshed.map((v) => (typeof v === 'string' ? v : v.toString()))\n return JSON.stringify(items, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Add a new standing instruction to the active execution context.\n *\n * @remarks\n * Delegates to `ctx.storeStandingInstruction(content)`. Standing instructions are stored as\n * a `Set` — adding the same content twice is a no-op at the local level, though the\n * consumer's persistence callback may interpret it differently.\n */\nexport const addStandingInstructionTool = new Tool({\n name: 'add_standing_instruction',\n description:\n 'Add a new standing instruction. Returns the stored content. Adding an identical instruction that already exists is a no-op.',\n inputSchema: validator.object({\n content: validator\n .string()\n .required()\n .description('The standing-instruction content as a plain string.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { content } = args as { content: string }\n try {\n await ctx.storeStandingInstruction(content)\n return JSON.stringify({ ok: true, content }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Remove an existing standing instruction by its content string.\n *\n * @remarks\n * Delegates to `ctx.deleteStandingInstruction(content)`. Idempotent — succeeds even when\n * no matching instruction is currently present.\n */\nexport const removeStandingInstructionTool = new Tool({\n name: 'remove_standing_instruction',\n description:\n 'Remove a standing instruction by its exact content string. Idempotent — succeeds even when no match is present.',\n inputSchema: validator.object({\n content: validator\n .string()\n .required()\n .description('The exact content string of the instruction to remove.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { content } = args as { content: string }\n try {\n await ctx.deleteStandingInstruction(content)\n return JSON.stringify({ ok: true, content }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Convenience tuple of every standing-instruction tool. Spread into a {@link @nhtio/adk!ToolRegistry}\n * to register the entire category at once.\n */\nexport const standingInstructionTools = [\n listStandingInstructionsTool,\n addStandingInstructionTool,\n removeStandingInstructionTool,\n] as const\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,IAAa,+BAA+B,IAAI,aAAA,KAAK;CACnD,MAAM;CACN,aACE;CACF,aAAa,kBAAA,UAAU,OAAO,CAAC,CAAC;CAChC,2BAA2B,kCAAA;CAC3B,SAAS,OAAO,OAAO,QAAQ;EAC7B,IAAI;GAEF,MAAM,SAAQ,MADU,IAAI,4BAA4B,GAChC,KAAK,MAAO,OAAO,MAAM,WAAW,IAAI,EAAE,SAAS,CAAE;GAC7E,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC;EACtC,SAAS,KAAK;GACZ,OAAO,UAAU,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;EAC1D;CACF;AACF,CAAC;;;;;;;;;AAUD,IAAa,6BAA6B,IAAI,aAAA,KAAK;CACjD,MAAM;CACN,aACE;CACF,aAAa,kBAAA,UAAU,OAAO,EAC5B,SAAS,kBAAA,UACN,OAAO,EACP,SAAS,EACT,YAAY,qDAAqD,EACtE,CAAC;CACD,2BAA2B,kCAAA;CAC3B,SAAS,OAAO,MAAM,QAAQ;EAC5B,MAAM,EAAE,YAAY;EACpB,IAAI;GACF,MAAM,IAAI,yBAAyB,OAAO;GAC1C,OAAO,KAAK,UAAU;IAAE,IAAI;IAAM;GAAQ,GAAG,MAAM,CAAC;EACtD,SAAS,KAAK;GACZ,OAAO,UAAU,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;EAC1D;CACF;AACF,CAAC;;;;;;;;AASD,IAAa,gCAAgC,IAAI,aAAA,KAAK;CACpD,MAAM;CACN,aACE;CACF,aAAa,kBAAA,UAAU,OAAO,EAC5B,SAAS,kBAAA,UACN,OAAO,EACP,SAAS,EACT,YAAY,wDAAwD,EACzE,CAAC;CACD,2BAA2B,kCAAA;CAC3B,SAAS,OAAO,MAAM,QAAQ;EAC5B,MAAM,EAAE,YAAY;EACpB,IAAI;GACF,MAAM,IAAI,0BAA0B,OAAO;GAC3C,OAAO,KAAK,UAAU;IAAE,IAAI;IAAM;GAAQ,GAAG,MAAM,CAAC;EACtD,SAAS,KAAK;GACZ,OAAO,UAAU,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;EAC1D;CACF;AACF,CAAC;;;;;AAMD,IAAa,2BAA2B;CACtC;CACA;CACA;AACF"}
1
+ {"version":3,"file":"standing_instructions.cjs","names":[],"sources":["../../../src/batteries/tools/standing_instructions/index.ts"],"sourcesContent":["/**\n * Pre-constructed CRUD tools for model-visible standing instruction management.\n *\n * @module @nhtio/adk/batteries/tools/standing_instructions\n *\n * @remarks\n * Pre-constructed CRUD tools that expose the ADK's standing-instruction surface to the\n * model. Each tool delegates to the corresponding callback on the active\n * {@link @nhtio/adk!DispatchContext} (`standingInstructions` getter, `storeStandingInstruction`,\n * `deleteStandingInstruction`) — the persistence layer is whatever the consumer wired into\n * the runner.\n *\n * Standing instructions are stored as a {@link Set} of {@link @nhtio/adk!Tokenizable} values keyed by\n * identity, not by an `id` field — there is no separate \"update by id\" semantics. The tools\n * therefore expose only `list` / `add` / `remove`. To replace an existing instruction the\n * model should `remove` the old value and `add` the new one (the ADK's persistence layer\n * is free to interpret that pair as an update if appropriate).\n *\n * Output is JSON for every tool so consumers can parse the result without re-tokenising —\n * the artifact constructor is set to {@link @nhtio/adk!SpooledJsonArtifact}.\n *\n * Tools:\n * - {@link listStandingInstructionsTool} — read-only list of every standing instruction\n * currently held by the context (after refreshing from the persistence layer).\n * - {@link addStandingInstructionTool} — add a new standing instruction.\n * - {@link removeStandingInstructionTool} — remove a standing instruction by its content\n * (exact string match).\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { SpooledJsonArtifact, Tool } from '@nhtio/adk/common'\n\n/**\n * List every standing instruction currently held by the active execution context.\n *\n * @remarks\n * Calls `ctx.refreshStandingInstructions()` to ensure the local Set is in sync with the\n * persistence layer, then serialises the resulting strings to a JSON array. The list is\n * stringly-keyed; the same content string serves as the identifier for subsequent removes.\n */\nexport const listStandingInstructionsTool = new Tool({\n name: 'list_standing_instructions',\n description:\n 'List every standing instruction currently held by the agent. Returns a JSON array of strings. To replace an instruction, remove the old string and add a new one.',\n inputSchema: validator.object({}),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (_args, ctx) => {\n try {\n const refreshed = await ctx.refreshStandingInstructions()\n const items = refreshed.map((v) => (typeof v === 'string' ? v : v.toString()))\n return JSON.stringify(items, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Add a new standing instruction to the active execution context.\n *\n * @remarks\n * Delegates to `ctx.storeStandingInstruction(content)`. Standing instructions are stored as\n * a `Set` — adding the same content twice is a no-op at the local level, though the\n * consumer's persistence callback may interpret it differently.\n */\nexport const addStandingInstructionTool = new Tool({\n name: 'add_standing_instruction',\n description:\n 'Add a new standing instruction. Returns the stored content. Adding an identical instruction that already exists is a no-op.',\n inputSchema: validator.object({\n content: validator\n .string()\n .required()\n .description('The standing-instruction content as a plain string.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { content } = args as { content: string }\n try {\n await ctx.storeStandingInstruction(content)\n return JSON.stringify({ ok: true, content }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Remove an existing standing instruction by its content string.\n *\n * @remarks\n * Delegates to `ctx.deleteStandingInstruction(content)`. Idempotent — succeeds even when\n * no matching instruction is currently present.\n */\nexport const removeStandingInstructionTool = new Tool({\n name: 'remove_standing_instruction',\n description:\n 'Remove a standing instruction by its exact content string. Idempotent — succeeds even when no match is present.',\n inputSchema: validator.object({\n content: validator\n .string()\n .required()\n .description('The exact content string of the instruction to remove.'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args, ctx) => {\n const { content } = args as { content: string }\n try {\n await ctx.deleteStandingInstruction(content)\n return JSON.stringify({ ok: true, content }, null, 2)\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Convenience tuple of every standing-instruction tool. Spread into a {@link @nhtio/adk!ToolRegistry}\n * to register the entire category at once.\n */\nexport const standingInstructionTools = [\n listStandingInstructionsTool,\n addStandingInstructionTool,\n removeStandingInstructionTool,\n] as const\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,IAAa,+BAA+B,IAAI,aAAA,KAAK;CACnD,MAAM;CACN,aACE;CACF,aAAa,kBAAA,UAAU,OAAO,CAAC,CAAC;CAChC,2BAA2B,kCAAA;CAC3B,SAAS,OAAO,OAAO,QAAQ;EAC7B,IAAI;GAEF,MAAM,SAAQ,MADU,IAAI,4BAA4B,GAChC,KAAK,MAAO,OAAO,MAAM,WAAW,IAAI,EAAE,SAAS,CAAE;GAC7E,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC;EACtC,SAAS,KAAK;GACZ,OAAO,UAAU,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;EAC1D;CACF;AACF,CAAC;;;;;;;;;AAUD,IAAa,6BAA6B,IAAI,aAAA,KAAK;CACjD,MAAM;CACN,aACE;CACF,aAAa,kBAAA,UAAU,OAAO,EAC5B,SAAS,kBAAA,UACN,OAAO,EACP,SAAS,EACT,YAAY,qDAAqD,EACtE,CAAC;CACD,2BAA2B,kCAAA;CAC3B,SAAS,OAAO,MAAM,QAAQ;EAC5B,MAAM,EAAE,YAAY;EACpB,IAAI;GACF,MAAM,IAAI,yBAAyB,OAAO;GAC1C,OAAO,KAAK,UAAU;IAAE,IAAI;IAAM;GAAQ,GAAG,MAAM,CAAC;EACtD,SAAS,KAAK;GACZ,OAAO,UAAU,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;EAC1D;CACF;AACF,CAAC;;;;;;;;AASD,IAAa,gCAAgC,IAAI,aAAA,KAAK;CACpD,MAAM;CACN,aACE;CACF,aAAa,kBAAA,UAAU,OAAO,EAC5B,SAAS,kBAAA,UACN,OAAO,EACP,SAAS,EACT,YAAY,wDAAwD,EACzE,CAAC;CACD,2BAA2B,kCAAA;CAC3B,SAAS,OAAO,MAAM,QAAQ;EAC5B,MAAM,EAAE,YAAY;EACpB,IAAI;GACF,MAAM,IAAI,0BAA0B,OAAO;GAC3C,OAAO,KAAK,UAAU;IAAE,IAAI;IAAM;GAAQ,GAAG,MAAM,CAAC;EACtD,SAAS,KAAK;GACZ,OAAO,UAAU,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;EAC1D;CACF;AACF,CAAC;;;;;AAMD,IAAa,2BAA2B;CACtC;CACA;CACA;AACF"}