@try-works/dsh-model-as-tool 0.1.2 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/bin/dsh-tool-mode-credentials.mjs +20 -0
  2. package/bin/dsh-tool-mode.mjs +202 -0
  3. package/catalog/desert-ant-models.json +693 -693
  4. package/client/client.model-tools.js +592 -0
  5. package/client/index.js +1679 -0
  6. package/lib/adapters/index.d.ts.map +1 -1
  7. package/lib/adapters/index.js +4 -4
  8. package/lib/bindings.d.ts.map +1 -1
  9. package/lib/bindings.js +26 -25
  10. package/lib/capability.d.ts.map +1 -1
  11. package/lib/capability.js +17 -0
  12. package/lib/capture-path.d.ts +97 -0
  13. package/lib/capture-path.d.ts.map +1 -0
  14. package/lib/capture-path.js +152 -0
  15. package/lib/diagnostics.d.ts +166 -0
  16. package/lib/diagnostics.d.ts.map +1 -0
  17. package/lib/diagnostics.js +135 -0
  18. package/lib/extension-dependencies.d.ts +197 -0
  19. package/lib/extension-dependencies.d.ts.map +1 -0
  20. package/lib/extension-dependencies.js +369 -0
  21. package/lib/extension-dispatch.d.ts +117 -0
  22. package/lib/extension-dispatch.d.ts.map +1 -0
  23. package/lib/extension-dispatch.js +124 -0
  24. package/lib/extension-registrar.d.ts +100 -0
  25. package/lib/extension-registrar.d.ts.map +1 -0
  26. package/lib/extension-registrar.js +134 -0
  27. package/lib/extensions-api.d.ts +217 -0
  28. package/lib/extensions-api.d.ts.map +1 -0
  29. package/lib/extensions-api.js +17 -0
  30. package/lib/extensions-remote.d.ts +54 -0
  31. package/lib/extensions-remote.d.ts.map +1 -0
  32. package/lib/extensions-remote.js +66 -0
  33. package/lib/extensions-service.d.ts +334 -0
  34. package/lib/extensions-service.d.ts.map +1 -0
  35. package/lib/extensions-service.js +1351 -0
  36. package/lib/harness-llm.d.ts +138 -0
  37. package/lib/harness-llm.d.ts.map +1 -0
  38. package/lib/harness-llm.js +218 -0
  39. package/lib/harness-serving.d.ts +95 -0
  40. package/lib/harness-serving.d.ts.map +1 -0
  41. package/lib/harness-serving.js +157 -0
  42. package/lib/headless.d.ts +97 -0
  43. package/lib/headless.d.ts.map +1 -0
  44. package/lib/headless.js +349 -0
  45. package/lib/http-acquisition.d.ts +27 -0
  46. package/lib/http-acquisition.d.ts.map +1 -0
  47. package/lib/http-acquisition.js +136 -0
  48. package/lib/index.d.ts +250 -7
  49. package/lib/index.d.ts.map +1 -1
  50. package/lib/index.js +2625 -70
  51. package/lib/invocation-accounting.d.ts +169 -0
  52. package/lib/invocation-accounting.d.ts.map +1 -0
  53. package/lib/invocation-accounting.js +148 -0
  54. package/lib/legacy-migration.d.ts +95 -0
  55. package/lib/legacy-migration.d.ts.map +1 -0
  56. package/lib/legacy-migration.js +429 -0
  57. package/lib/managed-workers.d.ts +151 -0
  58. package/lib/managed-workers.d.ts.map +1 -0
  59. package/lib/managed-workers.js +249 -0
  60. package/lib/mcp/client-grant.d.ts +74 -0
  61. package/lib/mcp/client-grant.d.ts.map +1 -0
  62. package/lib/mcp/client-grant.js +60 -0
  63. package/lib/mcp/credential-cli.d.ts +38 -0
  64. package/lib/mcp/credential-cli.d.ts.map +1 -0
  65. package/lib/mcp/credential-cli.js +148 -0
  66. package/lib/mcp/credential-store.d.ts +143 -0
  67. package/lib/mcp/credential-store.d.ts.map +1 -0
  68. package/lib/mcp/credential-store.js +454 -0
  69. package/lib/mcp/host-binding.d.ts +25 -0
  70. package/lib/mcp/host-binding.d.ts.map +1 -1
  71. package/lib/mcp/host-binding.js +107 -14
  72. package/lib/mcp/http.d.ts +68 -18
  73. package/lib/mcp/http.d.ts.map +1 -1
  74. package/lib/mcp/http.js +390 -62
  75. package/lib/mcp/oauth.d.ts +149 -0
  76. package/lib/mcp/oauth.d.ts.map +1 -0
  77. package/lib/mcp/oauth.js +396 -0
  78. package/lib/mcp/protocol.d.ts +46 -7
  79. package/lib/mcp/protocol.d.ts.map +1 -1
  80. package/lib/mcp/protocol.js +63 -16
  81. package/lib/mcp/rate-limit.d.ts +68 -0
  82. package/lib/mcp/rate-limit.d.ts.map +1 -0
  83. package/lib/mcp/rate-limit.js +114 -0
  84. package/lib/mcp/sdk-v2.d.ts +17 -0
  85. package/lib/mcp/sdk-v2.d.ts.map +1 -0
  86. package/lib/mcp/sdk-v2.js +181 -0
  87. package/lib/mcp/server.d.ts +11 -1
  88. package/lib/mcp/server.d.ts.map +1 -1
  89. package/lib/mcp/server.js +80 -13
  90. package/lib/mcp/stdio.d.ts.map +1 -1
  91. package/lib/mcp/stdio.js +9 -1
  92. package/lib/mcp/subscriptions.d.ts +43 -1
  93. package/lib/mcp/subscriptions.d.ts.map +1 -1
  94. package/lib/mcp/subscriptions.js +90 -9
  95. package/lib/model-qualification.d.ts +192 -0
  96. package/lib/model-qualification.d.ts.map +1 -0
  97. package/lib/model-qualification.js +178 -0
  98. package/lib/planning.d.ts +246 -0
  99. package/lib/planning.d.ts.map +1 -0
  100. package/lib/planning.js +457 -0
  101. package/lib/prepared-assets.d.ts +178 -0
  102. package/lib/prepared-assets.d.ts.map +1 -0
  103. package/lib/prepared-assets.js +286 -0
  104. package/lib/provider-bridge.d.ts +37 -0
  105. package/lib/provider-bridge.d.ts.map +1 -1
  106. package/lib/provider-bridge.js +189 -12
  107. package/lib/ptc-authority.d.ts +140 -0
  108. package/lib/ptc-authority.d.ts.map +1 -0
  109. package/lib/ptc-authority.js +216 -0
  110. package/lib/ptc-runtime.d.ts +156 -0
  111. package/lib/ptc-runtime.d.ts.map +1 -0
  112. package/lib/ptc-runtime.js +191 -0
  113. package/lib/publication.d.ts +2 -1
  114. package/lib/publication.d.ts.map +1 -1
  115. package/lib/publication.js +13 -5
  116. package/lib/receipt.d.ts.map +1 -1
  117. package/lib/receipt.js +8 -0
  118. package/lib/title-proposal.d.ts +194 -0
  119. package/lib/title-proposal.d.ts.map +1 -0
  120. package/lib/title-proposal.js +244 -0
  121. package/lib/tool-mode-run.d.ts +235 -0
  122. package/lib/tool-mode-run.d.ts.map +1 -0
  123. package/lib/tool-mode-run.js +283 -0
  124. package/lib/types.d.ts +3 -1
  125. package/lib/types.d.ts.map +1 -1
  126. package/lib/update-surface.d.ts +79 -0
  127. package/lib/update-surface.d.ts.map +1 -0
  128. package/lib/update-surface.js +224 -0
  129. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/lang-detect.d.ts +16 -0
  130. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/lang-detect.d.ts.map +1 -0
  131. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/lang-detect.js +85 -0
  132. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/standard.d.ts +38 -0
  133. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/standard.d.ts.map +1 -0
  134. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/standard.js +445 -0
  135. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/stt-transcribe.d.ts +20 -0
  136. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/stt-transcribe.d.ts.map +1 -0
  137. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/stt-transcribe.js +112 -0
  138. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/text-embed.d.ts +14 -0
  139. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/text-embed.d.ts.map +1 -0
  140. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/text-embed.js +63 -0
  141. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/text-rerank.d.ts +14 -0
  142. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/text-rerank.d.ts.map +1 -0
  143. package/node_modules/@try-works/tool-mode-contracts/lib/contracts/text-rerank.js +76 -0
  144. package/node_modules/@try-works/tool-mode-contracts/lib/dsh.d.ts +82 -0
  145. package/node_modules/@try-works/tool-mode-contracts/lib/dsh.d.ts.map +1 -0
  146. package/node_modules/@try-works/tool-mode-contracts/lib/dsh.js +274 -0
  147. package/node_modules/@try-works/tool-mode-contracts/lib/index.d.ts +26 -0
  148. package/node_modules/@try-works/tool-mode-contracts/lib/index.d.ts.map +1 -0
  149. package/node_modules/@try-works/tool-mode-contracts/lib/index.js +48 -0
  150. package/node_modules/@try-works/tool-mode-contracts/lib/meta.d.ts +104 -0
  151. package/node_modules/@try-works/tool-mode-contracts/lib/meta.d.ts.map +1 -0
  152. package/node_modules/@try-works/tool-mode-contracts/lib/meta.js +55 -0
  153. package/node_modules/@try-works/tool-mode-contracts/lib/registry.d.ts +107 -0
  154. package/node_modules/@try-works/tool-mode-contracts/lib/registry.d.ts.map +1 -0
  155. package/node_modules/@try-works/tool-mode-contracts/lib/registry.js +246 -0
  156. package/node_modules/@try-works/tool-mode-contracts/package.json +34 -0
  157. package/node_modules/@try-works/tool-mode-extension-sdk/bin/dsh-tool-mode.mjs +20 -0
  158. package/node_modules/@try-works/tool-mode-extension-sdk/lib/cli.d.ts +80 -0
  159. package/node_modules/@try-works/tool-mode-extension-sdk/lib/cli.d.ts.map +1 -0
  160. package/node_modules/@try-works/tool-mode-extension-sdk/lib/cli.js +533 -0
  161. package/node_modules/@try-works/tool-mode-extension-sdk/lib/declarative-recipes.d.ts +83 -0
  162. package/node_modules/@try-works/tool-mode-extension-sdk/lib/declarative-recipes.d.ts.map +1 -0
  163. package/node_modules/@try-works/tool-mode-extension-sdk/lib/declarative-recipes.js +125 -0
  164. package/node_modules/@try-works/tool-mode-extension-sdk/lib/discovery.d.ts +70 -0
  165. package/node_modules/@try-works/tool-mode-extension-sdk/lib/discovery.d.ts.map +1 -0
  166. package/node_modules/@try-works/tool-mode-extension-sdk/lib/discovery.js +201 -0
  167. package/node_modules/@try-works/tool-mode-extension-sdk/lib/errors.d.ts +57 -0
  168. package/node_modules/@try-works/tool-mode-extension-sdk/lib/errors.d.ts.map +1 -0
  169. package/node_modules/@try-works/tool-mode-extension-sdk/lib/errors.js +83 -0
  170. package/node_modules/@try-works/tool-mode-extension-sdk/lib/index.d.ts +31 -0
  171. package/node_modules/@try-works/tool-mode-extension-sdk/lib/index.d.ts.map +1 -0
  172. package/node_modules/@try-works/tool-mode-extension-sdk/lib/index.js +31 -0
  173. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/archive.d.ts +86 -0
  174. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/archive.d.ts.map +1 -0
  175. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/archive.js +185 -0
  176. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/dependencies.d.ts +126 -0
  177. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/dependencies.d.ts.map +1 -0
  178. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/dependencies.js +297 -0
  179. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/lifecycle.d.ts +216 -0
  180. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/lifecycle.d.ts.map +1 -0
  181. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/lifecycle.js +800 -0
  182. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/migration.d.ts +210 -0
  183. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/migration.d.ts.map +1 -0
  184. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/migration.js +368 -0
  185. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/runtime-link.d.ts +63 -0
  186. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/runtime-link.d.ts.map +1 -0
  187. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/runtime-link.js +149 -0
  188. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/source-directory.d.ts +35 -0
  189. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/source-directory.d.ts.map +1 -0
  190. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/source-directory.js +179 -0
  191. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/staged.d.ts +179 -0
  192. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/staged.d.ts.map +1 -0
  193. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/staged.js +235 -0
  194. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/store.d.ts +367 -0
  195. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/store.d.ts.map +1 -0
  196. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/store.js +807 -0
  197. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/update-flow.d.ts +185 -0
  198. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/update-flow.d.ts.map +1 -0
  199. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/update-flow.js +504 -0
  200. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/zip-source.d.ts +17 -0
  201. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/zip-source.d.ts.map +1 -0
  202. package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/zip-source.js +80 -0
  203. package/node_modules/@try-works/tool-mode-extension-sdk/lib/load.d.ts +52 -0
  204. package/node_modules/@try-works/tool-mode-extension-sdk/lib/load.d.ts.map +1 -0
  205. package/node_modules/@try-works/tool-mode-extension-sdk/lib/load.js +102 -0
  206. package/node_modules/@try-works/tool-mode-extension-sdk/lib/manifest.d.ts +171 -0
  207. package/node_modules/@try-works/tool-mode-extension-sdk/lib/manifest.d.ts.map +1 -0
  208. package/node_modules/@try-works/tool-mode-extension-sdk/lib/manifest.js +271 -0
  209. package/node_modules/@try-works/tool-mode-extension-sdk/lib/runtime.d.ts +242 -0
  210. package/node_modules/@try-works/tool-mode-extension-sdk/lib/runtime.d.ts.map +1 -0
  211. package/node_modules/@try-works/tool-mode-extension-sdk/lib/runtime.js +58 -0
  212. package/node_modules/@try-works/tool-mode-extension-sdk/lib/state.d.ts +118 -0
  213. package/node_modules/@try-works/tool-mode-extension-sdk/lib/state.d.ts.map +1 -0
  214. package/node_modules/@try-works/tool-mode-extension-sdk/lib/state.js +113 -0
  215. package/node_modules/@try-works/tool-mode-extension-sdk/lib/worker/worker-child.d.ts +2 -0
  216. package/node_modules/@try-works/tool-mode-extension-sdk/lib/worker/worker-child.d.ts.map +1 -0
  217. package/node_modules/@try-works/tool-mode-extension-sdk/lib/worker/worker-child.js +351 -0
  218. package/node_modules/@try-works/tool-mode-extension-sdk/lib/worker.d.ts +150 -0
  219. package/node_modules/@try-works/tool-mode-extension-sdk/lib/worker.d.ts.map +1 -0
  220. package/node_modules/@try-works/tool-mode-extension-sdk/lib/worker.js +670 -0
  221. package/node_modules/@try-works/tool-mode-extension-sdk/package.json +53 -0
  222. package/node_modules/@try-works/tool-mode-extension-sdk/schema/extension-manifest-1.1.0.schema.json +253 -0
  223. package/node_modules/@try-works/tool-mode-recipes/bin/tool-mode-recipe.mjs +15 -0
  224. package/node_modules/@try-works/tool-mode-recipes/lib/broker.d.ts +427 -0
  225. package/node_modules/@try-works/tool-mode-recipes/lib/broker.d.ts.map +1 -0
  226. package/node_modules/@try-works/tool-mode-recipes/lib/broker.js +592 -0
  227. package/node_modules/@try-works/tool-mode-recipes/lib/cli.d.ts +60 -0
  228. package/node_modules/@try-works/tool-mode-recipes/lib/cli.d.ts.map +1 -0
  229. package/node_modules/@try-works/tool-mode-recipes/lib/cli.js +936 -0
  230. package/node_modules/@try-works/tool-mode-recipes/lib/dsh-adapter.d.ts +237 -0
  231. package/node_modules/@try-works/tool-mode-recipes/lib/dsh-adapter.d.ts.map +1 -0
  232. package/node_modules/@try-works/tool-mode-recipes/lib/dsh-adapter.js +200 -0
  233. package/node_modules/@try-works/tool-mode-recipes/lib/fixture-provider.d.ts +85 -0
  234. package/node_modules/@try-works/tool-mode-recipes/lib/fixture-provider.d.ts.map +1 -0
  235. package/node_modules/@try-works/tool-mode-recipes/lib/fixture-provider.js +176 -0
  236. package/node_modules/@try-works/tool-mode-recipes/lib/images.d.ts +105 -0
  237. package/node_modules/@try-works/tool-mode-recipes/lib/images.d.ts.map +1 -0
  238. package/node_modules/@try-works/tool-mode-recipes/lib/images.js +129 -0
  239. package/node_modules/@try-works/tool-mode-recipes/lib/index.d.ts +25 -0
  240. package/node_modules/@try-works/tool-mode-recipes/lib/index.d.ts.map +1 -0
  241. package/node_modules/@try-works/tool-mode-recipes/lib/index.js +25 -0
  242. package/node_modules/@try-works/tool-mode-recipes/lib/recipe-format.d.ts +325 -0
  243. package/node_modules/@try-works/tool-mode-recipes/lib/recipe-format.d.ts.map +1 -0
  244. package/node_modules/@try-works/tool-mode-recipes/lib/recipe-format.js +1310 -0
  245. package/node_modules/@try-works/tool-mode-recipes/lib/templates.d.ts +51 -0
  246. package/node_modules/@try-works/tool-mode-recipes/lib/templates.d.ts.map +1 -0
  247. package/node_modules/@try-works/tool-mode-recipes/lib/templates.js +310 -0
  248. package/node_modules/@try-works/tool-mode-recipes/lib/titles.d.ts +227 -0
  249. package/node_modules/@try-works/tool-mode-recipes/lib/titles.d.ts.map +1 -0
  250. package/node_modules/@try-works/tool-mode-recipes/lib/titles.js +407 -0
  251. package/node_modules/@try-works/tool-mode-recipes/package.json +56 -0
  252. package/node_modules/@try-works/tool-mode-recipes/recipes/describe-image.json +38 -0
  253. package/node_modules/@try-works/tool-mode-recipes/recipes/text-title.json +45 -0
  254. package/node_modules/@try-works/tool-mode-recipes/schema/harness-model-recipe.schema.json +273 -0
  255. package/package.json +50 -17
  256. package/remote/spec.mjs +439 -0
  257. package/remote/typert.host.mjs +14 -0
  258. package/remote/typert.remote-client.mjs +16 -0
  259. package/lib/adapters/tongue.d.ts +0 -31
  260. package/lib/adapters/tongue.d.ts.map +0 -1
  261. package/lib/adapters/tongue.js +0 -93
  262. package/lib/adapters/voz.d.ts +0 -28
  263. package/lib/adapters/voz.d.ts.map +0 -1
  264. package/lib/adapters/voz.js +0 -102
  265. /package/{lib → node_modules/@try-works/tool-mode-extension-sdk/lib}/licensing.d.ts +0 -0
  266. /package/{lib → node_modules/@try-works/tool-mode-extension-sdk/lib}/licensing.d.ts.map +0 -0
  267. /package/{lib → node_modules/@try-works/tool-mode-extension-sdk/lib}/licensing.js +0 -0
@@ -0,0 +1,237 @@
1
+ /**
2
+ * A REAL DSH-backed {@link LlmProvider} for the harness broker (HLM-01).
3
+ *
4
+ * The broker has been tested only against fake providers; this adapter runs a
5
+ * recipe through the DSH harness's ACTUAL LLM service — `ctx.llm`
6
+ * (`@deepseek-ai/dsh-llm`'s `LlmRuntime`): `resolveModelInfo` for the model's
7
+ * own capability descriptors and `stream` for the chunk stream, including the
8
+ * `llm/stream` waterfall. The recipes package still ships NO import of the DSH
9
+ * packages: the surface below is a STRUCTURAL MIRROR of the DSH vocabulary,
10
+ * declared here so the published package stays dependency-free, and the
11
+ * conformance is proven in tests/dsh-adapter.test.ts by running the adapter
12
+ * through the REAL LlmRuntime with a registered LlmAdapter subclass.
13
+ *
14
+ * The mirrored DSH vocabulary (node_modules/@deepseek-ai/dsh-llm/src/types.ts):
15
+ * - `DshModelDescriptor` mirrors `LlmResolvedModelInfo` (types.ts:410-421):
16
+ * `inputModalities`, `context.contextWindow`, `defaultMaxTokens`.
17
+ * - `DshContentPart` mirrors `ContentBlock`'s text/image members (types.ts:62-89):
18
+ * text carries `{ type: 'text', text }`; images are `{ type: 'image',
19
+ * attachment }` — an ATTACHMENT REFERENCE owned by DSH's attachment service,
20
+ * which a recipes-only package cannot mint. Images therefore travel only
21
+ * through the deployment-supplied `images` hook (see below).
22
+ * - `DshCompletionRequest` mirrors the consumed subset of `GenerateOptions`
23
+ * (types.ts:511-553): provider/model/messages/maxTokens/signal.
24
+ * - `DshStreamChunk` mirrors `StreamChunk` (types.ts:452-464): text-delta,
25
+ * tool-call-delta, usage, finish; block-start/block-end/reasoning-delta are
26
+ * admitted as ignored passthroughs. `finish.reason.kind` mirrors
27
+ * `FinishReasonMap` (types.ts:156-162): stop, tool-calls, max-tokens,
28
+ * aborted{ failure }, error{ failure }.
29
+ *
30
+ * Mappings to the broker's vocabulary (RCP-11):
31
+ * - text-delta accumulation + finish `stop` -> { kind: 'text', text, usage }
32
+ * - finish `max-tokens` -> { kind: 'truncated', text }
33
+ * - finish `tool-calls` (or a tool-call-delta) -> { kind: 'tool_call', toolName }
34
+ * — NEVER executed (HLM-06); the broker refuses it as UNEXPECTED_MODEL_TOOL_CALL
35
+ * - finish `aborted` -> thrown; the broker reports CANCELLED
36
+ * when the caller's signal aborted, PROVIDER_FAILED otherwise
37
+ * - finish `error` / an unknown finish -> thrown with the failure facts; the
38
+ * broker reports PROVIDER_FAILED
39
+ *
40
+ * HLM-02: the provider carries a GENERATION. A deployment wires the generation
41
+ * to its adapter registration (or reload count), so an authorization issued
42
+ * against an old adapter cannot be satisfied by a new one.
43
+ *
44
+ * Capabilities are READ from the model descriptor, never hardcoded: an
45
+ * explicit `inputModalities` omission is negative capability (`images:
46
+ * 'unsupported'`), an absent descriptor field is the honest `unknown`, and a
47
+ * declared `image` modality is `supported` ONLY when the deployment also
48
+ * supplied the `images` transport hook — a model that can see images but has
49
+ * no transport for them must not have them silently dropped.
50
+ *
51
+ * @module @try-works/tool-mode-recipes/dsh-adapter
52
+ */
53
+ import type { ProviderDestination } from './broker.ts';
54
+ import type { BrokerImage, BrokerRequest, LlmCompletion, LlmProvider, ProviderCapabilities } from './broker.ts';
55
+ /** The model descriptor this adapter reads capabilities from (mirrors `LlmResolvedModelInfo`). */
56
+ export interface DshModelDescriptor {
57
+ /** The owning provider route; must equal the provider this adapter was built for. */
58
+ readonly provider: string;
59
+ /** The exact model id. */
60
+ readonly id: string;
61
+ /** Human-readable name. */
62
+ readonly name: string;
63
+ /** Accepted input modalities; absent means unknown, an explicit omission is negative capability. */
64
+ readonly inputModalities?: readonly ('text' | 'image')[];
65
+ /** Provider-owned context capacity, when known. */
66
+ readonly context?: {
67
+ readonly contextWindow: number;
68
+ };
69
+ /** Adapter-configured per-request output cap materialized when callers omit one. */
70
+ readonly defaultMaxTokens?: number;
71
+ }
72
+ /** A text part of a user message (mirrors `TextBlock`). */
73
+ export interface DshTextPart {
74
+ readonly type: 'text';
75
+ readonly text: string;
76
+ }
77
+ /**
78
+ * An image part of a user message (mirrors `ImageBlock`).
79
+ *
80
+ * The attachment reference is OPAQUE here: it is minted by DSH's attachment
81
+ * service, which the recipes package cannot reach. The deployment supplies the
82
+ * bytes-to-part transport (see {@link DshImageTransport}); this type merely
83
+ * says what the transport must produce.
84
+ */
85
+ export interface DshImagePart {
86
+ readonly type: 'image';
87
+ readonly attachment: unknown;
88
+ }
89
+ /** One content part, text or image. */
90
+ export type DshContentPart = DshTextPart | DshImagePart;
91
+ /** One user message in a completion request (mirrors `RequestUserInput`). */
92
+ export interface DshUserMessage {
93
+ readonly role: 'user';
94
+ readonly content: readonly DshContentPart[];
95
+ }
96
+ /** The completion request (mirrors the consumed subset of `GenerateOptions`). */
97
+ export interface DshCompletionRequest {
98
+ readonly provider: string;
99
+ readonly model: string;
100
+ /** Exactly the messages the adapter sends: one user message per recipe call. */
101
+ readonly messages: readonly DshUserMessage[];
102
+ readonly maxTokens?: number;
103
+ readonly signal?: AbortSignal;
104
+ }
105
+ /** The failure facts a terminal chunk carries (mirrors `LlmFailure`). */
106
+ export interface DshFailure {
107
+ readonly message: string;
108
+ readonly code: string;
109
+ readonly status?: number;
110
+ }
111
+ /** The terminal finish reason (mirrors `FinishReasonMap`, with an unknown-kind catch-all). */
112
+ export type DshFinishReason = {
113
+ readonly kind: 'stop';
114
+ } | {
115
+ readonly kind: 'tool-calls';
116
+ } | {
117
+ readonly kind: 'max-tokens';
118
+ } | {
119
+ readonly kind: 'aborted';
120
+ readonly failure: DshFailure;
121
+ } | {
122
+ readonly kind: 'error';
123
+ readonly failure: DshFailure;
124
+ } | {
125
+ readonly kind: string;
126
+ };
127
+ /** The stream chunk vocabulary (mirrors `StreamChunk`; passthrough members are ignored). */
128
+ export type DshStreamChunk = {
129
+ readonly type: 'text-delta';
130
+ readonly index: number;
131
+ readonly text: string;
132
+ } | {
133
+ readonly type: 'reasoning-delta';
134
+ readonly index: number;
135
+ readonly text: string;
136
+ } | {
137
+ readonly type: 'tool-call-delta';
138
+ readonly index: number;
139
+ readonly name?: string;
140
+ readonly argumentsDelta: string;
141
+ } | {
142
+ readonly type: 'block-start';
143
+ readonly index: number;
144
+ readonly blockType: string;
145
+ } | {
146
+ readonly type: 'block-end';
147
+ readonly index: number;
148
+ readonly block: unknown;
149
+ } | {
150
+ readonly type: 'usage';
151
+ readonly usage: {
152
+ readonly inputTokens: number;
153
+ readonly outputTokens: number;
154
+ };
155
+ } | {
156
+ readonly type: 'finish';
157
+ readonly reason: DshFinishReason;
158
+ };
159
+ /**
160
+ * The DSH LLM surface this adapter consumes.
161
+ *
162
+ * `ctx.llm` (an `LlmRuntime`) satisfies this structurally; the conformance
163
+ * test proves it by driving a REAL LlmRuntime through this interface. The
164
+ * declared property-style functions keep the check contravariant, so an
165
+ * incompatible DSH version fails to type, not fails at runtime.
166
+ */
167
+ export interface DshLlmSurface {
168
+ /** Resolve one exact model's descriptor (mirrors `LlmRuntime.resolveModelInfo`). */
169
+ readonly resolveModelInfo: (provider: string, model: string, signal?: AbortSignal) => Promise<DshModelDescriptor>;
170
+ /** Stream one call (mirrors `LlmRuntime.stream`). */
171
+ readonly stream: (request: DshCompletionRequest) => AsyncIterable<DshStreamChunk>;
172
+ }
173
+ /**
174
+ * The deployment-supplied image transport (HLM-11).
175
+ *
176
+ * A recipes-only package cannot mint DSH attachment references, so the
177
+ * deployment supplies this hook (in the host: reach `ctx.get('attachments')`
178
+ * and mint the reference there). Without the hook an image-capable model
179
+ * reports `images: 'unknown'`, and the broker refuses image recipes with
180
+ * EXECUTOR_CAPABILITY_UNKNOWN instead of dropping the image silently.
181
+ */
182
+ export type DshImageTransport = (image: BrokerImage) => DshImagePart | Promise<DshImagePart>;
183
+ /** Options for {@link DshLlmProvider.create}. */
184
+ export interface DshProviderOptions {
185
+ /** The DSH LLM surface (the deployment's `ctx.llm`, or a test double). */
186
+ readonly llm: DshLlmSurface;
187
+ /** The registered adapter route, e.g. `deepseek`. */
188
+ readonly provider: string;
189
+ /** The exact model id the recipes run against. */
190
+ readonly model: string;
191
+ /** Where this provider runs; defaults to `remote` (a harness model is not local). */
192
+ readonly destination?: ProviderDestination;
193
+ /**
194
+ * The adapter generation (HLM-02). The deployment should tie this to its DSH
195
+ * adapter registration so an old authorization cannot ride a new adapter.
196
+ * Defaults to 1.
197
+ */
198
+ readonly generation?: number;
199
+ /** The image transport hook; without it images are `unknown`, never dropped. */
200
+ readonly images?: DshImageTransport;
201
+ }
202
+ /**
203
+ * A DSH-backed {@link LlmProvider}, built against a resolved model descriptor.
204
+ */
205
+ export declare class DshLlmProvider implements LlmProvider {
206
+ #private;
207
+ readonly id: string;
208
+ readonly generation: number;
209
+ readonly destination: ProviderDestination;
210
+ private constructor();
211
+ /**
212
+ * Resolve the model descriptor and build the provider (HLM-02).
213
+ *
214
+ * The descriptor is resolved ONCE, at creation: capabilities are the model
215
+ * facts as of this generation, not whatever the endpoint happens to report
216
+ * mid-run.
217
+ * @param options - the surface, route, model and transports.
218
+ * @returns the provider.
219
+ * @throws when the descriptor cannot be resolved or names another route.
220
+ */
221
+ static create(options: DshProviderOptions): Promise<DshLlmProvider>;
222
+ /** The frozen descriptor-derived facts. */
223
+ capabilities(): ProviderCapabilities;
224
+ /**
225
+ * Perform one isolated call through the DSH stream.
226
+ *
227
+ * The request is one user message — the rendered prompt plus one attachment
228
+ * part per bound image via the transport hook — with no system prompt, no
229
+ * tools and no history, exactly as the broker's isolation invariant requires
230
+ * (HLM-05). Chunks are assembled per block index; the terminal finish maps
231
+ * to the broker's completion vocabulary.
232
+ * @param request - the broker request.
233
+ * @returns the completion.
234
+ */
235
+ complete(request: BrokerRequest): Promise<LlmCompletion>;
236
+ }
237
+ //# sourceMappingURL=dsh-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsh-adapter.d.ts","sourceRoot":"","sources":["../src/dsh-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * A REAL DSH-backed {@link LlmProvider} for the harness broker (HLM-01).
3
+ *
4
+ * The broker has been tested only against fake providers; this adapter runs a
5
+ * recipe through the DSH harness's ACTUAL LLM service — `ctx.llm`
6
+ * (`@deepseek-ai/dsh-llm`'s `LlmRuntime`): `resolveModelInfo` for the model's
7
+ * own capability descriptors and `stream` for the chunk stream, including the
8
+ * `llm/stream` waterfall. The recipes package still ships NO import of the DSH
9
+ * packages: the surface below is a STRUCTURAL MIRROR of the DSH vocabulary,
10
+ * declared here so the published package stays dependency-free, and the
11
+ * conformance is proven in tests/dsh-adapter.test.ts by running the adapter
12
+ * through the REAL LlmRuntime with a registered LlmAdapter subclass.
13
+ *
14
+ * The mirrored DSH vocabulary (node_modules/@deepseek-ai/dsh-llm/src/types.ts):
15
+ * - `DshModelDescriptor` mirrors `LlmResolvedModelInfo` (types.ts:410-421):
16
+ * `inputModalities`, `context.contextWindow`, `defaultMaxTokens`.
17
+ * - `DshContentPart` mirrors `ContentBlock`'s text/image members (types.ts:62-89):
18
+ * text carries `{ type: 'text', text }`; images are `{ type: 'image',
19
+ * attachment }` — an ATTACHMENT REFERENCE owned by DSH's attachment service,
20
+ * which a recipes-only package cannot mint. Images therefore travel only
21
+ * through the deployment-supplied `images` hook (see below).
22
+ * - `DshCompletionRequest` mirrors the consumed subset of `GenerateOptions`
23
+ * (types.ts:511-553): provider/model/messages/maxTokens/signal.
24
+ * - `DshStreamChunk` mirrors `StreamChunk` (types.ts:452-464): text-delta,
25
+ * tool-call-delta, usage, finish; block-start/block-end/reasoning-delta are
26
+ * admitted as ignored passthroughs. `finish.reason.kind` mirrors
27
+ * `FinishReasonMap` (types.ts:156-162): stop, tool-calls, max-tokens,
28
+ * aborted{ failure }, error{ failure }.
29
+ *
30
+ * Mappings to the broker's vocabulary (RCP-11):
31
+ * - text-delta accumulation + finish `stop` -> { kind: 'text', text, usage }
32
+ * - finish `max-tokens` -> { kind: 'truncated', text }
33
+ * - finish `tool-calls` (or a tool-call-delta) -> { kind: 'tool_call', toolName }
34
+ * — NEVER executed (HLM-06); the broker refuses it as UNEXPECTED_MODEL_TOOL_CALL
35
+ * - finish `aborted` -> thrown; the broker reports CANCELLED
36
+ * when the caller's signal aborted, PROVIDER_FAILED otherwise
37
+ * - finish `error` / an unknown finish -> thrown with the failure facts; the
38
+ * broker reports PROVIDER_FAILED
39
+ *
40
+ * HLM-02: the provider carries a GENERATION. A deployment wires the generation
41
+ * to its adapter registration (or reload count), so an authorization issued
42
+ * against an old adapter cannot be satisfied by a new one.
43
+ *
44
+ * Capabilities are READ from the model descriptor, never hardcoded: an
45
+ * explicit `inputModalities` omission is negative capability (`images:
46
+ * 'unsupported'`), an absent descriptor field is the honest `unknown`, and a
47
+ * declared `image` modality is `supported` ONLY when the deployment also
48
+ * supplied the `images` transport hook — a model that can see images but has
49
+ * no transport for them must not have them silently dropped.
50
+ *
51
+ * @module @try-works/tool-mode-recipes/dsh-adapter
52
+ */
53
+ import { INITIAL_MAX_OUTPUT_TOKENS } from "./recipe-format.js";
54
+ /**
55
+ * A DSH-backed {@link LlmProvider}, built against a resolved model descriptor.
56
+ */
57
+ export class DshLlmProvider {
58
+ id;
59
+ generation;
60
+ destination;
61
+ #llm;
62
+ #provider;
63
+ #model;
64
+ #images;
65
+ /** The frozen capability facts, derived from the descriptor at creation. */
66
+ #capabilities;
67
+ constructor(options, descriptor) {
68
+ this.id = `dsh:${options.provider}/${options.model}`;
69
+ this.generation = options.generation ?? 1;
70
+ this.destination = options.destination ?? 'remote';
71
+ this.#llm = options.llm;
72
+ this.#provider = options.provider;
73
+ this.#model = options.model;
74
+ this.#images = options.images;
75
+ // Capabilities are READ from the model's own descriptor, never hardcoded
76
+ // (HLM-02's capability half): an explicit modality omission is negative
77
+ // capability, an absent descriptor field is the honest `unknown`, and an
78
+ // image-capable model without a transport hook is `unknown` rather than a
79
+ // promise the transport cannot keep.
80
+ const declared = descriptor.inputModalities;
81
+ const images = declared === undefined
82
+ ? 'unknown'
83
+ : declared.includes('image')
84
+ ? this.#images === undefined ? 'unknown' : 'supported'
85
+ : 'unsupported';
86
+ this.#capabilities = Object.freeze({
87
+ images,
88
+ // The model's own per-request output default; the RES-10 ceiling is the
89
+ // fallback for a descriptor that discloses none.
90
+ maxOutputTokens: descriptor.defaultMaxTokens ?? INITIAL_MAX_OUTPUT_TOKENS,
91
+ });
92
+ }
93
+ /**
94
+ * Resolve the model descriptor and build the provider (HLM-02).
95
+ *
96
+ * The descriptor is resolved ONCE, at creation: capabilities are the model
97
+ * facts as of this generation, not whatever the endpoint happens to report
98
+ * mid-run.
99
+ * @param options - the surface, route, model and transports.
100
+ * @returns the provider.
101
+ * @throws when the descriptor cannot be resolved or names another route.
102
+ */
103
+ static async create(options) {
104
+ const descriptor = await options.llm.resolveModelInfo(options.provider, options.model);
105
+ if (descriptor.provider !== options.provider || descriptor.id !== options.model) {
106
+ throw new Error(`the DSH surface resolved ${descriptor.provider}/${descriptor.id}, not the requested `
107
+ + `${options.provider}/${options.model}; capabilities would be read from the wrong model`);
108
+ }
109
+ return new DshLlmProvider(options, descriptor);
110
+ }
111
+ /** The frozen descriptor-derived facts. */
112
+ capabilities() {
113
+ return this.#capabilities;
114
+ }
115
+ /**
116
+ * Perform one isolated call through the DSH stream.
117
+ *
118
+ * The request is one user message — the rendered prompt plus one attachment
119
+ * part per bound image via the transport hook — with no system prompt, no
120
+ * tools and no history, exactly as the broker's isolation invariant requires
121
+ * (HLM-05). Chunks are assembled per block index; the terminal finish maps
122
+ * to the broker's completion vocabulary.
123
+ * @param request - the broker request.
124
+ * @returns the completion.
125
+ */
126
+ async complete(request) {
127
+ const content = [{ type: 'text', text: request.prompt }];
128
+ if (request.images !== undefined && request.images.length > 0) {
129
+ if (this.#images === undefined) {
130
+ // Unreachable through the broker (capabilities say 'unknown'), but a
131
+ // caller bypassing the preflight must not silently drop the image.
132
+ throw new Error('the DSH provider has no image transport; the image inputs were not sent');
133
+ }
134
+ for (const image of request.images) {
135
+ content.push(await this.#images(image));
136
+ }
137
+ }
138
+ const text = new Map();
139
+ let toolName;
140
+ let usage;
141
+ for await (const chunk of this.#llm.stream({
142
+ provider: this.#provider,
143
+ model: this.#model,
144
+ messages: [{ role: 'user', content }],
145
+ maxTokens: request.maxOutputTokens,
146
+ signal: request.signal,
147
+ })) {
148
+ switch (chunk.type) {
149
+ case 'text-delta': {
150
+ text.set(chunk.index, (text.get(chunk.index) ?? '') + chunk.text);
151
+ break;
152
+ }
153
+ case 'tool-call-delta': {
154
+ toolName = chunk.name ?? toolName;
155
+ break;
156
+ }
157
+ case 'usage': {
158
+ usage = { known: true, inputTokens: chunk.usage.inputTokens, outputTokens: chunk.usage.outputTokens };
159
+ break;
160
+ }
161
+ case 'finish': {
162
+ const assembled = [...text.entries()].sort((left, right) => left[0] - right[0]).map(([, value]) => value).join('');
163
+ switch (chunk.reason.kind) {
164
+ case 'stop': {
165
+ return { kind: 'text', text: assembled, ...usage === undefined ? {} : { usage } };
166
+ }
167
+ case 'max-tokens': {
168
+ // Generation was cut short: an error, never a short result.
169
+ return { kind: 'truncated', text: assembled };
170
+ }
171
+ case 'tool-calls': {
172
+ // HLM-06: a tool call from a recipe model is never executed.
173
+ return { kind: 'tool_call', toolName: toolName ?? '(unnamed)' };
174
+ }
175
+ case 'aborted':
176
+ case 'error': {
177
+ // The catch-all union member (unknown adapter-specific kinds)
178
+ // keeps TS from narrowing failure onto these literal cases, so
179
+ // the fact is read defensively: the core DSH vocabulary always
180
+ // carries it for aborted/error (types.ts:160-161).
181
+ const failure = chunk.reason.failure;
182
+ const summary = `${failure?.message ?? 'no message'} (${failure?.code ?? 'UNKNOWN'})`;
183
+ throw new Error(`the DSH stream ${chunk.reason.kind === 'aborted' ? 'aborted' : 'failed'} the call: ${summary}`);
184
+ }
185
+ default: {
186
+ throw new Error(`the DSH stream finished with an unknown reason ${JSON.stringify(chunk.reason.kind)}`);
187
+ }
188
+ }
189
+ }
190
+ default: {
191
+ // block-start, block-end, reasoning-delta: assembly metadata, not content.
192
+ break;
193
+ }
194
+ }
195
+ }
196
+ // The stream ended without a finish chunk: a broken transport, not a result.
197
+ throw new Error('the DSH stream ended without a finish chunk');
198
+ }
199
+ }
200
+ //# sourceMappingURL=dsh-adapter.js.map
@@ -0,0 +1,85 @@
1
+ /**
2
+ * The deterministic fixture provider for `tool-mode-recipe test` (RCP-08).
3
+ *
4
+ * The test command runs the REAL broker against a SCRIPTED fake provider — the
5
+ * broker's binding, policy, budget and failure vocabulary are exercised
6
+ * end-to-end without any real model, network or installation. Every fixture
7
+ * declares its own expected outcome (kind and failure code), and the provider
8
+ * counts every call against a declared ceiling so a recipe that silently
9
+ * outgrows its budget fails the suite instead of passing quietly.
10
+ *
11
+ * This is a TEST CORPUS: a scripted provider, never a real model. A real
12
+ * inference result is outside this module's claim by construction.
13
+ *
14
+ * @module @try-works/tool-mode-recipes/fixture-provider
15
+ */
16
+ import type { BrokerErrorCode, BrokerHostPolicy, BrokerRequest, CapabilityState, LlmCompletion, LlmProvider, ProviderCapabilities, ProviderDestination } from './broker.ts';
17
+ import type { RecipeManifest } from './recipe-format.ts';
18
+ import type { RecipeCliIo } from './cli.ts';
19
+ /** The scripted completions the fake provider can play. */
20
+ export type FixtureScript = 'echo' | 'refuse' | 'truncate' | 'tool-call' | 'empty' | 'unused';
21
+ /** One expected outcome in a fixture case. */
22
+ export interface FixtureExpectation {
23
+ readonly kind: 'completed' | 'failed' | 'cancelled';
24
+ /** Required for a failed expectation: the exact code the broker must report. */
25
+ readonly code?: BrokerErrorCode;
26
+ }
27
+ /** One fixture case. */
28
+ export interface FixtureCase {
29
+ readonly id: string;
30
+ readonly args: unknown;
31
+ readonly script: FixtureScript;
32
+ readonly expect: FixtureExpectation;
33
+ }
34
+ /** The fixture document's provider stanza. */
35
+ export interface FixtureProvider {
36
+ readonly id: string;
37
+ readonly destination: ProviderDestination;
38
+ readonly images: CapabilityState;
39
+ readonly maxCalls: number;
40
+ }
41
+ /** The fixture document. */
42
+ export interface FixtureDocument {
43
+ readonly provider: FixtureProvider;
44
+ readonly cases: readonly FixtureCase[];
45
+ }
46
+ /** Validate a decoded fixture document; a malformed fixture is a refusal. */
47
+ export declare function validateFixtureDocument(raw: unknown): {
48
+ document?: FixtureDocument;
49
+ error?: string;
50
+ };
51
+ /** Raised when the scripted provider's call ceiling is exceeded. */
52
+ export declare class FixtureCeilingExceededError extends Error {
53
+ readonly name = "FixtureCeilingExceededError";
54
+ }
55
+ /** A scripted fake provider: deterministic, counting, never a real model. */
56
+ export declare class ScriptedFixtureProvider implements LlmProvider {
57
+ #private;
58
+ readonly id: string;
59
+ readonly generation = 1;
60
+ readonly destination: ProviderDestination;
61
+ constructor(stanza: FixtureProvider);
62
+ /** The number of provider calls made so far (the create-command guard reads this). */
63
+ get callCount(): number;
64
+ get maxCalls(): number;
65
+ /** Direct the next completion. */
66
+ direct(script: FixtureScript): void;
67
+ capabilities(): ProviderCapabilities;
68
+ complete(request: BrokerRequest): Promise<LlmCompletion>;
69
+ }
70
+ /** One case's verdict. */
71
+ export interface FixtureVerdict {
72
+ readonly caseId: string;
73
+ readonly pass: boolean;
74
+ readonly detail: string;
75
+ }
76
+ /**
77
+ * Run one recipe against a fixture document through the REAL broker.
78
+ * @param recipe - the recipe under test.
79
+ * @param fixture - the validated fixture document.
80
+ * @param io - the output sinks.
81
+ * @param policy - the broker policy to run under (defaults to the initial policy with recording).
82
+ * @returns the per-case verdicts, in fixture order.
83
+ */
84
+ export declare function runFixtureSuite(recipe: RecipeManifest, fixture: FixtureDocument, io: RecipeCliIo, policy: BrokerHostPolicy): Promise<readonly FixtureVerdict[]>;
85
+ //# sourceMappingURL=fixture-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixture-provider.d.ts","sourceRoot":"","sources":["../src/fixture-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAEhB,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,aAAa,CAAA;AAEpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,2DAA2D;AAC3D,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,QAAQ,GACR,UAAU,GACV,WAAW,GACX,OAAO,GACP,QAAQ,CAAA;AAEZ,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAA;IACnD,gFAAgF;IAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAA;CAChC;AAED,wBAAwB;AACxB,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;CACpC;AAED,8CAA8C;AAC9C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAA;IACzC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED,4BAA4B;AAC5B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAA;CACvC;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,eAAe,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA6BpG;AAED,oEAAoE;AACpE,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,SAAkB,IAAI,iCAAgC;CACvD;AAED,6EAA6E;AAC7E,qBAAa,uBAAwB,YAAW,WAAW;;IACzD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,UAAU,KAAI;IACvB,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAA;gBAO7B,MAAM,EAAE,eAAe;IAOnC,sFAAsF;IACtF,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,kCAAkC;IAClC,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAInC,YAAY,IAAI,oBAAoB;IAM9B,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;CAgB/D;AAED,0BAA0B;AAC1B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAiCD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,eAAe,EACxB,EAAE,EAAE,WAAW,EACf,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAoCpC"}