@qvac/harness 0.1.0 → 0.1.1

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 (460) hide show
  1. package/dist/harness.bundle +8 -59
  2. package/dist/prebuilds-manifest.json +0 -8
  3. package/dist-lib/index.d.ts +240 -0
  4. package/dist-lib/index.js +1063 -0
  5. package/dist-lib/lib/audio-transcode-bare.d.ts +2 -0
  6. package/dist-lib/lib/audio-transcode-bare.js +145 -0
  7. package/dist-lib/lib/audio-transcode-node.d.ts +2 -0
  8. package/dist-lib/lib/audio-transcode-node.js +6 -0
  9. package/dist-lib/lib/capabilities/audio-resample.d.ts +14 -0
  10. package/dist-lib/lib/capabilities/audio-resample.js +72 -0
  11. package/dist-lib/lib/capabilities/completion.d.ts +288 -0
  12. package/dist-lib/lib/capabilities/completion.js +1077 -0
  13. package/dist-lib/lib/capabilities/download.d.ts +46 -0
  14. package/dist-lib/lib/capabilities/download.js +124 -0
  15. package/dist-lib/lib/capabilities/embed.d.ts +20 -0
  16. package/dist-lib/lib/capabilities/embed.js +13 -0
  17. package/dist-lib/lib/capabilities/kv-cache.d.ts +13 -0
  18. package/dist-lib/lib/capabilities/kv-cache.js +21 -0
  19. package/dist-lib/lib/capabilities/prompt-prefix.d.ts +6 -0
  20. package/dist-lib/lib/capabilities/prompt-prefix.js +10 -0
  21. package/dist-lib/lib/capabilities/speech-lexicon.d.ts +5 -0
  22. package/dist-lib/lib/capabilities/speech-lexicon.js +32 -0
  23. package/dist-lib/lib/capabilities/speech-text.d.ts +6 -0
  24. package/dist-lib/lib/capabilities/speech-text.js +79 -0
  25. package/dist-lib/lib/capabilities/tool-names.d.ts +3 -0
  26. package/dist-lib/lib/capabilities/tool-names.js +3 -0
  27. package/dist-lib/lib/capabilities/tool-selection.d.ts +43 -0
  28. package/dist-lib/lib/capabilities/tool-selection.js +60 -0
  29. package/dist-lib/lib/capabilities/tool-turns.d.ts +9 -0
  30. package/dist-lib/lib/capabilities/tool-turns.js +101 -0
  31. package/dist-lib/lib/capabilities/usage-breakdown.d.ts +27 -0
  32. package/dist-lib/lib/capabilities/usage-breakdown.js +44 -0
  33. package/dist-lib/lib/capabilities/vision-history.d.ts +3 -0
  34. package/dist-lib/lib/capabilities/vision-history.js +21 -0
  35. package/dist-lib/lib/capabilities/voice.d.ts +78 -0
  36. package/dist-lib/lib/capabilities/voice.js +189 -0
  37. package/dist-lib/lib/connect.d.ts +76 -0
  38. package/dist-lib/lib/connect.js +789 -0
  39. package/dist-lib/lib/context-window.d.ts +7 -0
  40. package/dist-lib/lib/context-window.js +90 -0
  41. package/dist-lib/lib/contract-types.d.ts +210 -0
  42. package/dist-lib/lib/contract-types.js +1 -0
  43. package/dist-lib/lib/diagram-repair.d.ts +21 -0
  44. package/dist-lib/lib/diagram-repair.js +58 -0
  45. package/dist-lib/lib/dns-lookup.d.ts +1 -0
  46. package/dist-lib/lib/dns-lookup.js +13 -0
  47. package/dist-lib/lib/error-fields.d.ts +2 -0
  48. package/dist-lib/lib/error-fields.js +8 -0
  49. package/dist-lib/lib/fetch-node.d.ts +1 -0
  50. package/dist-lib/lib/fetch-node.js +1 -0
  51. package/dist-lib/lib/hardware/capability-probe.d.ts +9 -0
  52. package/dist-lib/lib/hardware/capability-probe.js +99 -0
  53. package/dist-lib/lib/hardware/gpu-classify.d.ts +2 -0
  54. package/dist-lib/lib/hardware/gpu-classify.js +32 -0
  55. package/dist-lib/lib/hardware/gpu-probe-addon.d.ts +2 -0
  56. package/dist-lib/lib/hardware/gpu-probe-addon.js +42 -0
  57. package/dist-lib/lib/hardware/gpu-stats.bare.d.ts +1 -0
  58. package/dist-lib/lib/hardware/gpu-stats.bare.js +24 -0
  59. package/dist-lib/lib/hardware/gpu-stats.stub.d.ts +1 -0
  60. package/dist-lib/lib/hardware/gpu-stats.stub.js +3 -0
  61. package/dist-lib/lib/hardware/memory-budget.d.ts +8 -0
  62. package/dist-lib/lib/hardware/memory-budget.js +1 -0
  63. package/dist-lib/lib/hardware/parsers.d.ts +7 -0
  64. package/dist-lib/lib/hardware/parsers.js +41 -0
  65. package/dist-lib/lib/headers-bare.d.ts +1 -0
  66. package/dist-lib/lib/headers-bare.js +1 -0
  67. package/dist-lib/lib/headers-node.d.ts +4 -0
  68. package/dist-lib/lib/headers-node.js +1 -0
  69. package/dist-lib/lib/helpers/buffer-burst.d.ts +1 -0
  70. package/dist-lib/lib/helpers/buffer-burst.js +20 -0
  71. package/dist-lib/lib/helpers/control-tokens.d.ts +7 -0
  72. package/dist-lib/lib/helpers/control-tokens.js +32 -0
  73. package/dist-lib/lib/helpers/join-guard.d.ts +6 -0
  74. package/dist-lib/lib/helpers/join-guard.js +46 -0
  75. package/dist-lib/lib/helpers/markup-stream-filter.d.ts +5 -0
  76. package/dist-lib/lib/helpers/markup-stream-filter.js +75 -0
  77. package/dist-lib/lib/helpers/race-abort.d.ts +5 -0
  78. package/dist-lib/lib/helpers/race-abort.js +18 -0
  79. package/dist-lib/lib/helpers/retry-memo.d.ts +5 -0
  80. package/dist-lib/lib/helpers/retry-memo.js +12 -0
  81. package/dist-lib/lib/helpers/run-outcome.d.ts +33 -0
  82. package/dist-lib/lib/helpers/run-outcome.js +204 -0
  83. package/dist-lib/lib/helpers/spawn-path.d.ts +5 -0
  84. package/dist-lib/lib/helpers/spawn-path.js +57 -0
  85. package/dist-lib/lib/helpers/text-coalescer.d.ts +15 -0
  86. package/dist-lib/lib/helpers/text-coalescer.js +34 -0
  87. package/dist-lib/lib/helpers/thinking.d.ts +8 -0
  88. package/dist-lib/lib/helpers/thinking.js +95 -0
  89. package/dist-lib/lib/helpers/tool-call-markup.d.ts +20 -0
  90. package/dist-lib/lib/helpers/tool-call-markup.js +201 -0
  91. package/dist-lib/lib/helpers/tool-intent.d.ts +7 -0
  92. package/dist-lib/lib/helpers/tool-intent.js +21 -0
  93. package/dist-lib/lib/helpers/tool-label.d.ts +8 -0
  94. package/dist-lib/lib/helpers/tool-label.js +131 -0
  95. package/dist-lib/lib/hooks/built-in/arg-repair.d.ts +5 -0
  96. package/dist-lib/lib/hooks/built-in/arg-repair.js +88 -0
  97. package/dist-lib/lib/hooks/built-in/egress.d.ts +5 -0
  98. package/dist-lib/lib/hooks/built-in/egress.js +29 -0
  99. package/dist-lib/lib/hooks/built-in/index.d.ts +3 -0
  100. package/dist-lib/lib/hooks/built-in/index.js +3 -0
  101. package/dist-lib/lib/hooks/built-in/skill-catalog.d.ts +10 -0
  102. package/dist-lib/lib/hooks/built-in/skill-catalog.js +17 -0
  103. package/dist-lib/lib/hooks/pipeline.d.ts +20 -0
  104. package/dist-lib/lib/hooks/pipeline.js +49 -0
  105. package/dist-lib/lib/hooks/registry.d.ts +2 -0
  106. package/dist-lib/lib/hooks/registry.js +6 -0
  107. package/dist-lib/lib/hooks/run.d.ts +5 -0
  108. package/dist-lib/lib/hooks/run.js +83 -0
  109. package/dist-lib/lib/hooks/types.d.ts +57 -0
  110. package/dist-lib/lib/hooks/types.js +1 -0
  111. package/dist-lib/lib/log.d.ts +5 -0
  112. package/dist-lib/lib/log.js +37 -0
  113. package/dist-lib/lib/model-download-progress.d.ts +22 -0
  114. package/dist-lib/lib/model-download-progress.js +95 -0
  115. package/dist-lib/lib/models/context.d.ts +5 -0
  116. package/dist-lib/lib/models/context.js +12 -0
  117. package/dist-lib/lib/models/embed-config.d.ts +14 -0
  118. package/dist-lib/lib/models/embed-config.js +31 -0
  119. package/dist-lib/lib/models/gpu-selection.d.ts +3 -0
  120. package/dist-lib/lib/models/gpu-selection.js +26 -0
  121. package/dist-lib/lib/models/kv-cache.d.ts +4 -0
  122. package/dist-lib/lib/models/kv-cache.js +6 -0
  123. package/dist-lib/lib/models/llm-presets.d.ts +10 -0
  124. package/dist-lib/lib/models/llm-presets.js +58 -0
  125. package/dist-lib/lib/models/model-catalog-constants.d.ts +29 -0
  126. package/dist-lib/lib/models/model-catalog-constants.js +103 -0
  127. package/dist-lib/lib/models/model-catalog.d.ts +125 -0
  128. package/dist-lib/lib/models/model-catalog.js +371 -0
  129. package/dist-lib/lib/models/model-delete.d.ts +18 -0
  130. package/dist-lib/lib/models/model-delete.js +47 -0
  131. package/dist-lib/lib/models/model-handle.d.ts +18 -0
  132. package/dist-lib/lib/models/model-handle.js +33 -0
  133. package/dist-lib/lib/models/model-list.d.ts +42 -0
  134. package/dist-lib/lib/models/model-list.js +123 -0
  135. package/dist-lib/lib/models/model-pool.d.ts +116 -0
  136. package/dist-lib/lib/models/model-pool.js +356 -0
  137. package/dist-lib/lib/models/model-source.d.ts +6 -0
  138. package/dist-lib/lib/models/model-source.js +21 -0
  139. package/dist-lib/lib/models/music-catalog.d.ts +12 -0
  140. package/dist-lib/lib/models/music-catalog.js +26 -0
  141. package/dist-lib/lib/models/opencl-cache.d.ts +5 -0
  142. package/dist-lib/lib/models/opencl-cache.js +50 -0
  143. package/dist-lib/lib/models/sdk-faults.d.ts +21 -0
  144. package/dist-lib/lib/models/sdk-faults.js +66 -0
  145. package/dist-lib/lib/models/tool-dialect.d.ts +2 -0
  146. package/dist-lib/lib/models/tool-dialect.js +19 -0
  147. package/dist-lib/lib/models/tts-model-default.d.ts +3 -0
  148. package/dist-lib/lib/models/tts-model-default.js +13 -0
  149. package/dist-lib/lib/no-redirect-fetch-bare.d.ts +15 -0
  150. package/dist-lib/lib/no-redirect-fetch-bare.js +59 -0
  151. package/dist-lib/lib/no-redirect-fetch-impl.d.ts +39 -0
  152. package/dist-lib/lib/no-redirect-fetch-impl.js +80 -0
  153. package/dist-lib/lib/no-redirect-fetch-node.d.ts +4 -0
  154. package/dist-lib/lib/no-redirect-fetch-node.js +52 -0
  155. package/dist-lib/lib/prompt.d.ts +22 -0
  156. package/dist-lib/lib/prompt.js +77 -0
  157. package/dist-lib/lib/queue.d.ts +9 -0
  158. package/dist-lib/lib/queue.js +48 -0
  159. package/dist-lib/lib/resolution-detector.d.ts +5 -0
  160. package/dist-lib/lib/resolution-detector.js +100 -0
  161. package/dist-lib/lib/rpc-session.d.ts +8 -0
  162. package/dist-lib/lib/rpc-session.js +20 -0
  163. package/dist-lib/lib/sdk-config-loader.node.d.ts +1 -0
  164. package/dist-lib/lib/sdk-config-loader.node.js +1 -0
  165. package/dist-lib/lib/sdk-loader.d.ts +30 -0
  166. package/dist-lib/lib/sdk-loader.js +53 -0
  167. package/dist-lib/lib/sdk-storage.d.ts +8 -0
  168. package/dist-lib/lib/sdk-storage.js +24 -0
  169. package/dist-lib/lib/serve.d.ts +3 -0
  170. package/dist-lib/lib/serve.js +612 -0
  171. package/dist-lib/lib/spawn.d.ts +62 -0
  172. package/dist-lib/lib/spawn.js +71 -0
  173. package/dist-lib/lib/staging.d.ts +4 -0
  174. package/dist-lib/lib/staging.js +28 -0
  175. package/dist-lib/lib/storage.d.ts +18 -0
  176. package/dist-lib/lib/storage.js +26 -0
  177. package/dist-lib/lib/tmp-path.d.ts +7 -0
  178. package/dist-lib/lib/tmp-path.js +17 -0
  179. package/dist-lib/lib/tool-call-display.d.ts +21 -0
  180. package/dist-lib/lib/tool-call-display.js +1 -0
  181. package/dist-lib/lib/tools/catalog.d.ts +13 -0
  182. package/dist-lib/lib/tools/catalog.js +13 -0
  183. package/dist-lib/lib/tools/create-documents.d.ts +3 -0
  184. package/dist-lib/lib/tools/create-documents.js +87 -0
  185. package/dist-lib/lib/tools/edit-documents.d.ts +3 -0
  186. package/dist-lib/lib/tools/edit-documents.js +122 -0
  187. package/dist-lib/lib/tools/edit-image.d.ts +25 -0
  188. package/dist-lib/lib/tools/edit-image.js +271 -0
  189. package/dist-lib/lib/tools/exec/adapters/adapter.d.ts +27 -0
  190. package/dist-lib/lib/tools/exec/adapters/adapter.js +1 -0
  191. package/dist-lib/lib/tools/exec/adapters/python/attachments.d.ts +26 -0
  192. package/dist-lib/lib/tools/exec/adapters/python/attachments.js +160 -0
  193. package/dist-lib/lib/tools/exec/adapters/python/create-effect.d.ts +7 -0
  194. package/dist-lib/lib/tools/exec/adapters/python/create-effect.js +290 -0
  195. package/dist-lib/lib/tools/exec/adapters/python/loader.d.ts +11 -0
  196. package/dist-lib/lib/tools/exec/adapters/python/loader.js +94 -0
  197. package/dist-lib/lib/tools/exec/adapters/python/memfs.d.ts +47 -0
  198. package/dist-lib/lib/tools/exec/adapters/python/memfs.js +85 -0
  199. package/dist-lib/lib/tools/exec/adapters/python/output-policy.d.ts +13 -0
  200. package/dist-lib/lib/tools/exec/adapters/python/output-policy.js +129 -0
  201. package/dist-lib/lib/tools/exec/adapters/python/pyodide.d.ts +19 -0
  202. package/dist-lib/lib/tools/exec/adapters/python/pyodide.js +107 -0
  203. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.d.ts +75 -0
  204. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.js +1094 -0
  205. package/dist-lib/lib/tools/exec/adapters/python/run-session.d.ts +75 -0
  206. package/dist-lib/lib/tools/exec/adapters/python/run-session.js +273 -0
  207. package/dist-lib/lib/tools/exec/adapters/python/wheels.d.ts +38 -0
  208. package/dist-lib/lib/tools/exec/adapters/python/wheels.js +102 -0
  209. package/dist-lib/lib/tools/exec/adapters/python/worker/client.d.ts +7 -0
  210. package/dist-lib/lib/tools/exec/adapters/python/worker/client.js +188 -0
  211. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.d.ts +1 -0
  212. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.js +105 -0
  213. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.d.ts +38 -0
  214. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.js +41 -0
  215. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.d.ts +2 -0
  216. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.js +30 -0
  217. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.d.ts +13 -0
  218. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.js +45 -0
  219. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.d.ts +12 -0
  220. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.js +20 -0
  221. package/dist-lib/lib/tools/exec/obsidian/cli-process.d.ts +8 -0
  222. package/dist-lib/lib/tools/exec/obsidian/cli-process.js +74 -0
  223. package/dist-lib/lib/tools/exec/obsidian/cli.d.ts +18 -0
  224. package/dist-lib/lib/tools/exec/obsidian/cli.js +153 -0
  225. package/dist-lib/lib/tools/exec/obsidian/command.d.ts +5 -0
  226. package/dist-lib/lib/tools/exec/obsidian/command.js +18 -0
  227. package/dist-lib/lib/tools/exec/obsidian/guidance.d.ts +5 -0
  228. package/dist-lib/lib/tools/exec/obsidian/guidance.js +18 -0
  229. package/dist-lib/lib/tools/exec/obsidian/note-name.d.ts +1 -0
  230. package/dist-lib/lib/tools/exec/obsidian/note-name.js +6 -0
  231. package/dist-lib/lib/tools/exec/obsidian/output.d.ts +1 -0
  232. package/dist-lib/lib/tools/exec/obsidian/output.js +31 -0
  233. package/dist-lib/lib/tools/exec/obsidian/route.d.ts +19 -0
  234. package/dist-lib/lib/tools/exec/obsidian/route.js +85 -0
  235. package/dist-lib/lib/tools/exec/obsidian/safe-path.d.ts +3 -0
  236. package/dist-lib/lib/tools/exec/obsidian/safe-path.js +56 -0
  237. package/dist-lib/lib/tools/exec/obsidian/vault-create.d.ts +1 -0
  238. package/dist-lib/lib/tools/exec/obsidian/vault-create.js +40 -0
  239. package/dist-lib/lib/tools/exec/obsidian/vault-fs.d.ts +3 -0
  240. package/dist-lib/lib/tools/exec/obsidian/vault-fs.js +57 -0
  241. package/dist-lib/lib/tools/exec/obsidian/vault-paths.d.ts +20 -0
  242. package/dist-lib/lib/tools/exec/obsidian/vault-paths.js +171 -0
  243. package/dist-lib/lib/tools/exec/obsidian/vault-read.d.ts +11 -0
  244. package/dist-lib/lib/tools/exec/obsidian/vault-read.js +119 -0
  245. package/dist-lib/lib/tools/exec/obsidian/vault-write.d.ts +7 -0
  246. package/dist-lib/lib/tools/exec/obsidian/vault-write.js +134 -0
  247. package/dist-lib/lib/tools/exec/runner.d.ts +62 -0
  248. package/dist-lib/lib/tools/exec/runner.js +87 -0
  249. package/dist-lib/lib/tools/exec/scope.d.ts +3 -0
  250. package/dist-lib/lib/tools/exec/scope.js +97 -0
  251. package/dist-lib/lib/tools/exec/shell-argv.d.ts +2 -0
  252. package/dist-lib/lib/tools/exec/shell-argv.js +48 -0
  253. package/dist-lib/lib/tools/exec.d.ts +29 -0
  254. package/dist-lib/lib/tools/exec.js +459 -0
  255. package/dist-lib/lib/tools/file-glob.d.ts +15 -0
  256. package/dist-lib/lib/tools/file-glob.js +112 -0
  257. package/dist-lib/lib/tools/fs/drive.d.ts +26 -0
  258. package/dist-lib/lib/tools/fs/drive.js +1 -0
  259. package/dist-lib/lib/tools/fs/glob.d.ts +1 -0
  260. package/dist-lib/lib/tools/fs/glob.js +34 -0
  261. package/dist-lib/lib/tools/fs/local.d.ts +2 -0
  262. package/dist-lib/lib/tools/fs/local.js +29 -0
  263. package/dist-lib/lib/tools/fs/read.d.ts +2 -0
  264. package/dist-lib/lib/tools/fs/read.js +17 -0
  265. package/dist-lib/lib/tools/fs/remote-protocol.d.ts +40 -0
  266. package/dist-lib/lib/tools/fs/remote-protocol.js +1 -0
  267. package/dist-lib/lib/tools/fs/remote.d.ts +17 -0
  268. package/dist-lib/lib/tools/fs/remote.js +131 -0
  269. package/dist-lib/lib/tools/fs/scope.d.ts +37 -0
  270. package/dist-lib/lib/tools/fs/scope.js +130 -0
  271. package/dist-lib/lib/tools/fs/walk.d.ts +15 -0
  272. package/dist-lib/lib/tools/fs/walk.js +38 -0
  273. package/dist-lib/lib/tools/fs/write.d.ts +4 -0
  274. package/dist-lib/lib/tools/fs/write.js +5 -0
  275. package/dist-lib/lib/tools/generate-image.d.ts +111 -0
  276. package/dist-lib/lib/tools/generate-image.js +369 -0
  277. package/dist-lib/lib/tools/generate-music.d.ts +124 -0
  278. package/dist-lib/lib/tools/generate-music.js +522 -0
  279. package/dist-lib/lib/tools/grep.d.ts +5 -0
  280. package/dist-lib/lib/tools/grep.js +158 -0
  281. package/dist-lib/lib/tools/http-methods.d.ts +1 -0
  282. package/dist-lib/lib/tools/http-methods.js +1 -0
  283. package/dist-lib/lib/tools/http-request/encode-fields.d.ts +2 -0
  284. package/dist-lib/lib/tools/http-request/encode-fields.js +69 -0
  285. package/dist-lib/lib/tools/http-request/truncate-response.d.ts +1 -0
  286. package/dist-lib/lib/tools/http-request/truncate-response.js +83 -0
  287. package/dist-lib/lib/tools/http-request/utils.d.ts +27 -0
  288. package/dist-lib/lib/tools/http-request/utils.js +84 -0
  289. package/dist-lib/lib/tools/http-request.d.ts +20 -0
  290. package/dist-lib/lib/tools/http-request.js +177 -0
  291. package/dist-lib/lib/tools/mcp/utils.d.ts +47 -0
  292. package/dist-lib/lib/tools/mcp/utils.js +172 -0
  293. package/dist-lib/lib/tools/mcp-call.d.ts +14 -0
  294. package/dist-lib/lib/tools/mcp-call.js +155 -0
  295. package/dist-lib/lib/tools/model-args.d.ts +1 -0
  296. package/dist-lib/lib/tools/model-args.js +4 -0
  297. package/dist-lib/lib/tools/operations/builders.d.ts +17 -0
  298. package/dist-lib/lib/tools/operations/builders.js +179 -0
  299. package/dist-lib/lib/tools/operations/compile.d.ts +7 -0
  300. package/dist-lib/lib/tools/operations/compile.js +92 -0
  301. package/dist-lib/lib/tools/operations/gmail-message.d.ts +15 -0
  302. package/dist-lib/lib/tools/operations/gmail-message.js +62 -0
  303. package/dist-lib/lib/tools/operations/manifest.d.ts +60 -0
  304. package/dist-lib/lib/tools/operations/manifest.js +50 -0
  305. package/dist-lib/lib/tools/outbound-guard.d.ts +10 -0
  306. package/dist-lib/lib/tools/outbound-guard.js +127 -0
  307. package/dist-lib/lib/tools/private-ip.d.ts +4 -0
  308. package/dist-lib/lib/tools/private-ip.js +126 -0
  309. package/dist-lib/lib/tools/rag-search.d.ts +2 -0
  310. package/dist-lib/lib/tools/rag-search.js +98 -0
  311. package/dist-lib/lib/tools/read-files.d.ts +5 -0
  312. package/dist-lib/lib/tools/read-files.js +153 -0
  313. package/dist-lib/lib/tools/skill.d.ts +10 -0
  314. package/dist-lib/lib/tools/skill.js +123 -0
  315. package/dist-lib/lib/tools/skills/auth-resolver.d.ts +43 -0
  316. package/dist-lib/lib/tools/skills/auth-resolver.js +121 -0
  317. package/dist-lib/lib/tools/skills/bin-check.d.ts +9 -0
  318. package/dist-lib/lib/tools/skills/bin-check.js +56 -0
  319. package/dist-lib/lib/tools/skills/bundled-dir.d.ts +2 -0
  320. package/dist-lib/lib/tools/skills/bundled-dir.js +117 -0
  321. package/dist-lib/lib/tools/skills/bundled-hash.d.ts +4 -0
  322. package/dist-lib/lib/tools/skills/bundled-hash.js +12 -0
  323. package/dist-lib/lib/tools/skills/catalog.d.ts +60 -0
  324. package/dist-lib/lib/tools/skills/catalog.js +203 -0
  325. package/dist-lib/lib/tools/skills/cli-argv.d.ts +9 -0
  326. package/dist-lib/lib/tools/skills/cli-argv.js +147 -0
  327. package/dist-lib/lib/tools/skills/cli-schema-check.d.ts +3 -0
  328. package/dist-lib/lib/tools/skills/cli-schema-check.js +62 -0
  329. package/dist-lib/lib/tools/skills/cli-schema-load.d.ts +4 -0
  330. package/dist-lib/lib/tools/skills/cli-schema-load.js +90 -0
  331. package/dist-lib/lib/tools/skills/cli-schema-types.d.ts +30 -0
  332. package/dist-lib/lib/tools/skills/cli-schema-types.js +1 -0
  333. package/dist-lib/lib/tools/skills/cli-schema.d.ts +7 -0
  334. package/dist-lib/lib/tools/skills/cli-schema.js +35 -0
  335. package/dist-lib/lib/tools/skills/credential-check.d.ts +20 -0
  336. package/dist-lib/lib/tools/skills/credential-check.js +94 -0
  337. package/dist-lib/lib/tools/skills/credential-grants.d.ts +9 -0
  338. package/dist-lib/lib/tools/skills/credential-grants.js +25 -0
  339. package/dist-lib/lib/tools/skills/credential-health.d.ts +8 -0
  340. package/dist-lib/lib/tools/skills/credential-health.js +51 -0
  341. package/dist-lib/lib/tools/skills/credential-slots.d.ts +7 -0
  342. package/dist-lib/lib/tools/skills/credential-slots.js +8 -0
  343. package/dist-lib/lib/tools/skills/frontmatter-parser.d.ts +23 -0
  344. package/dist-lib/lib/tools/skills/frontmatter-parser.js +68 -0
  345. package/dist-lib/lib/tools/skills/index.d.ts +5 -0
  346. package/dist-lib/lib/tools/skills/index.js +5 -0
  347. package/dist-lib/lib/tools/skills/manifest-parse.d.ts +12 -0
  348. package/dist-lib/lib/tools/skills/manifest-parse.js +199 -0
  349. package/dist-lib/lib/tools/skills/manifest.d.ts +47 -0
  350. package/dist-lib/lib/tools/skills/manifest.js +1 -0
  351. package/dist-lib/lib/tools/skills/mention-name.d.ts +1 -0
  352. package/dist-lib/lib/tools/skills/mention-name.js +4 -0
  353. package/dist-lib/lib/tools/skills/mention.d.ts +6 -0
  354. package/dist-lib/lib/tools/skills/mention.js +42 -0
  355. package/dist-lib/lib/tools/skills/obsidian-readiness.d.ts +16 -0
  356. package/dist-lib/lib/tools/skills/obsidian-readiness.js +95 -0
  357. package/dist-lib/lib/tools/skills/overlay-crud.d.ts +18 -0
  358. package/dist-lib/lib/tools/skills/overlay-crud.js +98 -0
  359. package/dist-lib/lib/tools/skills/overlay-dir.d.ts +2 -0
  360. package/dist-lib/lib/tools/skills/overlay-dir.js +22 -0
  361. package/dist-lib/lib/tools/skills/overlay-watch.d.ts +13 -0
  362. package/dist-lib/lib/tools/skills/overlay-watch.js +44 -0
  363. package/dist-lib/lib/tools/skills/scope-key.d.ts +7 -0
  364. package/dist-lib/lib/tools/skills/scope-key.js +7 -0
  365. package/dist-lib/lib/tools/skills/setup-routes.d.ts +4 -0
  366. package/dist-lib/lib/tools/skills/setup-routes.js +14 -0
  367. package/dist-lib/lib/tools/skills/skill-settings.d.ts +16 -0
  368. package/dist-lib/lib/tools/skills/skill-settings.js +33 -0
  369. package/dist-lib/lib/tools/skills/skill-state-constants.d.ts +12 -0
  370. package/dist-lib/lib/tools/skills/skill-state-constants.js +14 -0
  371. package/dist-lib/lib/tools/skills/skill-state.d.ts +40 -0
  372. package/dist-lib/lib/tools/skills/skill-state.js +117 -0
  373. package/dist-lib/lib/tools/skills/tool-grants.d.ts +5 -0
  374. package/dist-lib/lib/tools/skills/tool-grants.js +14 -0
  375. package/dist-lib/lib/tools/toolsets.d.ts +8 -0
  376. package/dist-lib/lib/tools/toolsets.js +20 -0
  377. package/dist-lib/lib/tools/url-guard.d.ts +8 -0
  378. package/dist-lib/lib/tools/url-guard.js +40 -0
  379. package/dist-lib/lib/tools/web-fetch.d.ts +8 -0
  380. package/dist-lib/lib/tools/web-fetch.js +302 -0
  381. package/dist-lib/lib/tools/web-search.d.ts +6 -0
  382. package/dist-lib/lib/tools/web-search.js +55 -0
  383. package/dist-lib/lib/transport.d.ts +12 -0
  384. package/dist-lib/lib/transport.js +59 -0
  385. package/dist-lib/lib/user-agent.d.ts +1 -0
  386. package/dist-lib/lib/user-agent.js +1 -0
  387. package/dist-lib/lib/validating-lookup.d.ts +17 -0
  388. package/dist-lib/lib/validating-lookup.js +25 -0
  389. package/dist-lib/lib/wav-encode.d.ts +5 -0
  390. package/dist-lib/lib/wav-encode.js +24 -0
  391. package/dist-lib/lib/web-fetch/embedded-state.d.ts +1 -0
  392. package/dist-lib/lib/web-fetch/embedded-state.js +131 -0
  393. package/dist-lib/lib/web-fetch/extract.d.ts +6 -0
  394. package/dist-lib/lib/web-fetch/extract.js +65 -0
  395. package/dist-lib/lib/web-fetch/images.d.ts +3 -0
  396. package/dist-lib/lib/web-fetch/images.js +43 -0
  397. package/dist-lib/lib/web-fetch/video.d.ts +5 -0
  398. package/dist-lib/lib/web-fetch/video.js +42 -0
  399. package/dist-lib/lib/web-search/engine-registry.d.ts +7 -0
  400. package/dist-lib/lib/web-search/engine-registry.js +17 -0
  401. package/dist-lib/lib/web-search/engines/aol.d.ts +3 -0
  402. package/dist-lib/lib/web-search/engines/aol.js +81 -0
  403. package/dist-lib/lib/web-search/engines/bing.d.ts +3 -0
  404. package/dist-lib/lib/web-search/engines/bing.js +111 -0
  405. package/dist-lib/lib/web-search/engines/brave.d.ts +3 -0
  406. package/dist-lib/lib/web-search/engines/brave.js +59 -0
  407. package/dist-lib/lib/web-search/engines/duckduckgo.d.ts +3 -0
  408. package/dist-lib/lib/web-search/engines/duckduckgo.js +112 -0
  409. package/dist-lib/lib/web-search/engines/google.d.ts +3 -0
  410. package/dist-lib/lib/web-search/engines/google.js +92 -0
  411. package/dist-lib/lib/web-search/engines/wikipedia.d.ts +3 -0
  412. package/dist-lib/lib/web-search/engines/wikipedia.js +37 -0
  413. package/dist-lib/lib/web-search/engines/yahoo.d.ts +3 -0
  414. package/dist-lib/lib/web-search/engines/yahoo.js +81 -0
  415. package/dist-lib/lib/web-search/fetch-html.d.ts +25 -0
  416. package/dist-lib/lib/web-search/fetch-html.js +97 -0
  417. package/dist-lib/lib/web-search/format-results.d.ts +3 -0
  418. package/dist-lib/lib/web-search/format-results.js +14 -0
  419. package/dist-lib/lib/web-search/html-helpers.d.ts +3 -0
  420. package/dist-lib/lib/web-search/html-helpers.js +24 -0
  421. package/dist-lib/lib/web-search/merge-results.d.ts +2 -0
  422. package/dist-lib/lib/web-search/merge-results.js +53 -0
  423. package/dist-lib/lib/web-search/orchestrator.d.ts +14 -0
  424. package/dist-lib/lib/web-search/orchestrator.js +50 -0
  425. package/dist-lib/lib/web-search/types.d.ts +34 -0
  426. package/dist-lib/lib/web-search/types.js +1 -0
  427. package/dist-lib/lib/web-search/url-helpers.d.ts +1 -0
  428. package/dist-lib/lib/web-search/url-helpers.js +11 -0
  429. package/dist-lib/lib/web-search/url-normalize.d.ts +1 -0
  430. package/dist-lib/lib/web-search/url-normalize.js +25 -0
  431. package/dist-lib/lib/web-search/user-agents.d.ts +3 -0
  432. package/dist-lib/lib/web-search/user-agents.js +3 -0
  433. package/dist-lib/lib/wire.d.ts +50 -0
  434. package/dist-lib/lib/wire.js +145 -0
  435. package/dist-lib/schema/baseline.d.ts +8 -0
  436. package/dist-lib/schema/baseline.js +35 -0
  437. package/dist-lib/schema/build.d.ts +1 -0
  438. package/dist-lib/schema/build.js +39 -0
  439. package/dist-lib/schema/generate.d.ts +20 -0
  440. package/dist-lib/schema/generate.js +149 -0
  441. package/dist-lib/schema/harness.d.ts +2 -0
  442. package/dist-lib/schema/harness.js +745 -0
  443. package/dist-lib/schema/release-tags.d.ts +5 -0
  444. package/dist-lib/schema/release-tags.js +58 -0
  445. package/dist-lib/spec/bind.d.ts +2 -0
  446. package/dist-lib/spec/bind.js +124 -0
  447. package/dist-lib/spec/calls.d.ts +3 -0
  448. package/dist-lib/spec/calls.js +41 -0
  449. package/dist-lib/spec/hrpc/hrpc.json +356 -0
  450. package/dist-lib/spec/hrpc/index.d.ts +3 -0
  451. package/dist-lib/spec/hrpc/index.js +463 -0
  452. package/dist-lib/spec/hrpc/messages.d.ts +4 -0
  453. package/dist-lib/spec/hrpc/messages.js +3102 -0
  454. package/dist-lib/spec/hyperschema/index.js +3102 -0
  455. package/dist-lib/spec/hyperschema/schema.json +2290 -0
  456. package/dist-lib/spec/hyperschema/types.d.ts +554 -0
  457. package/dist-lib/spec/index.d.ts +8 -0
  458. package/dist-lib/spec/index.js +1 -0
  459. package/package.json +239 -64
  460. package/.gitattributes +0 -1
@@ -0,0 +1,522 @@
1
+ import process from 'process';
2
+ import ScopeLock from 'scope-lock';
3
+ import { AbortedError, raceAbort } from "../helpers/race-abort.js";
4
+ import { hdiag } from "../log.js";
5
+ import { AUDIOGEN_CATALOG, musicChoiceForDit, musicDefaultSteps, musicModelSet } from "../models/model-catalog.js";
6
+ import { GENERATE_MUSIC_TOOL } from "../models/music-catalog.js";
7
+ import { createLoadTracker } from "../models/model-pool.js";
8
+ import { resolveModelSrc } from "../models/model-source.js";
9
+ export const MAX_DURATION_SECONDS = 300;
10
+ export const MIN_DURATION_SECONDS = 1;
11
+ export const MAX_STEPS = 60;
12
+ const MAX_CAPTION_CHARS = 4000;
13
+ const MAX_LYRICS_CHARS = 8000;
14
+ const MAX_TITLE_CHARS = 60;
15
+ const MAX_SEED = 0xffffffff;
16
+ const INSTRUMENTAL = '[Instrumental]';
17
+ const DEFAULT_VOCAL_LANGUAGE = 'en';
18
+ const MAX_VOCAL_LANGUAGE_CHARS = 16;
19
+ const MIN_BPM = 20;
20
+ const MAX_BPM = 300;
21
+ const MAX_MUSIC_META_CHARS = 32;
22
+ const STAGE_WEIGHT = {
23
+ lm: { base: 0, span: 80 },
24
+ dit: { base: 80, span: 17 },
25
+ vae: { base: 97, span: 3 }
26
+ };
27
+ export function musicPercentTick(onPercent) {
28
+ let last = -1;
29
+ return ({ stage, step, total }) => {
30
+ const weight = STAGE_WEIGHT[stage];
31
+ if (!weight)
32
+ return;
33
+ const frac = total > 0 ? Math.min(1, Math.max(0, step / total)) : 0;
34
+ const percentage = Math.min(100, Math.round(weight.base + frac * weight.span));
35
+ if (percentage <= last)
36
+ return;
37
+ last = percentage;
38
+ onPercent(percentage);
39
+ };
40
+ }
41
+ const fingerprintOf = (stages, steps) => [stages.dit, stages.textEnc, stages.lm, stages.vae, steps ?? ''].join('\n');
42
+ const stagesFor = (modelChoice, base) => {
43
+ const set = modelChoice ? musicModelSet(modelChoice) : null;
44
+ return set ?? base;
45
+ };
46
+ function musicProgressName(dit) {
47
+ const entry = AUDIOGEN_CATALOG.find((candidate) => candidate.dit.src === dit || candidate.dit.name === dit);
48
+ return entry?.name ?? dit;
49
+ }
50
+ export function createMusicRuntime({ loadSdk, onProgress, onBeforeLoad, loads = createLoadTracker(), inferenceSteps: baseSteps, useGpu = true, ...base }) {
51
+ let loading = null;
52
+ let residentFingerprint = null;
53
+ let busy = false;
54
+ const lock = new ScopeLock();
55
+ const defaultSteps = baseSteps ?? musicDefaultSteps(musicChoiceForDit(base.dit));
56
+ const doUnload = async () => {
57
+ const pending = loading;
58
+ if (!pending) {
59
+ residentFingerprint = null;
60
+ return;
61
+ }
62
+ const loaded = await pending.catch(() => null);
63
+ if (!loaded) {
64
+ loading = null;
65
+ residentFingerprint = null;
66
+ return;
67
+ }
68
+ const sdk = await loadSdk();
69
+ await sdk.unloadModel({ modelId: loaded.modelId });
70
+ loading = null;
71
+ residentFingerprint = null;
72
+ };
73
+ const unload = async () => {
74
+ await lock.lock();
75
+ try {
76
+ await doUnload();
77
+ }
78
+ finally {
79
+ lock.unlock();
80
+ }
81
+ };
82
+ return {
83
+ loadSdk,
84
+ gpuRequested: useGpu,
85
+ defaultSteps,
86
+ ensureLoaded: async (sdk, signal, modelChoice, steps) => {
87
+ const stages = stagesFor(modelChoice, base);
88
+ const effectiveSteps = steps ?? baseSteps;
89
+ const fingerprint = fingerprintOf(stages, effectiveSteps);
90
+ await lock.lock();
91
+ try {
92
+ if (loading && residentFingerprint !== fingerprint)
93
+ await doUnload();
94
+ if (!loading && onBeforeLoad)
95
+ await onBeforeLoad(signal);
96
+ residentFingerprint = fingerprint;
97
+ loading ??= (async () => {
98
+ onProgress?.(musicProgressName(stages.dit), {});
99
+ const [textEncModelSrc, lmModelSrc, ditModelSrc, vaeModelSrc] = await Promise.all([
100
+ resolveModelSrc(sdk, stages.textEnc, 'audiogen'),
101
+ resolveModelSrc(sdk, stages.lm, 'audiogen'),
102
+ resolveModelSrc(sdk, stages.dit, 'audiogen'),
103
+ resolveModelSrc(sdk, stages.vae, 'audiogen')
104
+ ]);
105
+ const modelConfig = {
106
+ textEncModelSrc,
107
+ lmModelSrc,
108
+ ditModelSrc,
109
+ vaeModelSrc,
110
+ useGPU: useGpu,
111
+ ...(effectiveSteps ? { inferenceSteps: effectiveSteps } : {})
112
+ };
113
+ const modelId = await loads.track(sdk.loadModel({
114
+ modelType: 'audiogen',
115
+ modelConfig,
116
+ onProgress: onProgress && ((progress) => onProgress(musicProgressName(stages.dit), progress))
117
+ }));
118
+ return { modelId };
119
+ })().catch((err) => {
120
+ loading = null;
121
+ residentFingerprint = null;
122
+ throw err;
123
+ });
124
+ }
125
+ finally {
126
+ lock.unlock();
127
+ }
128
+ return raceAbort(loading, signal);
129
+ },
130
+ unload,
131
+ unloadIdle: () => (busy ? Promise.resolve() : unload()),
132
+ acquire: () => (busy ? false : (busy = true)),
133
+ release: () => {
134
+ busy = false;
135
+ }
136
+ };
137
+ }
138
+ export const BUSY_ERROR = 'a music generation is already running; try again when it finishes';
139
+ export async function runAudioGen(sdk, modelId, params, signal, onTick) {
140
+ if (signal?.aborted)
141
+ return { error: 'music generation canceled' };
142
+ let run;
143
+ try {
144
+ run = sdk.audioGen({ modelId, ...params });
145
+ }
146
+ catch (err) {
147
+ if (signal?.aborted)
148
+ return { error: 'music generation canceled' };
149
+ throw err;
150
+ }
151
+ const onAbort = () => {
152
+ void sdk.cancel?.({ requestId: run.requestId }).catch(() => { });
153
+ };
154
+ signal?.addEventListener('abort', onAbort, { once: true });
155
+ let settled = false;
156
+ try {
157
+ const drained = (async () => {
158
+ for await (const tick of run.progressStream)
159
+ if (!settled)
160
+ onTick?.(tick);
161
+ })().catch(() => { });
162
+ const audio = await run.audio;
163
+ await drained;
164
+ if (signal?.aborted)
165
+ return { error: 'music generation canceled' };
166
+ if (!audio?.pcm?.length)
167
+ return { error: 'the audiogen model produced no audio' };
168
+ const stats = await run.stats.catch(() => undefined);
169
+ return stats ? { ...audio, stats } : audio;
170
+ }
171
+ catch (err) {
172
+ if (signal?.aborted)
173
+ return { error: 'music generation canceled' };
174
+ throw err;
175
+ }
176
+ finally {
177
+ settled = true;
178
+ signal?.removeEventListener('abort', onAbort);
179
+ }
180
+ }
181
+ export function audioDurationSeconds(audio) {
182
+ const bytesPerSample = audio.bitsPerSample / 8;
183
+ if (bytesPerSample <= 0 || audio.channels <= 0 || audio.sampleRate <= 0)
184
+ return 0;
185
+ const samplesPerChannel = audio.pcm.byteLength / bytesPerSample / audio.channels;
186
+ return Math.round(samplesPerChannel / audio.sampleRate);
187
+ }
188
+ export function presentStats(stats) {
189
+ if (!stats)
190
+ return undefined;
191
+ const kept = {};
192
+ for (const key of [
193
+ 'audioDurationMs',
194
+ 'totalTimeMs',
195
+ 'realTimeFactor',
196
+ 'backendDevice',
197
+ 'backendId'
198
+ ]) {
199
+ const value = stats[key];
200
+ if (typeof value === 'number' && Number.isFinite(value))
201
+ kept[key] = value;
202
+ }
203
+ return Object.keys(kept).length > 0 ? kept : undefined;
204
+ }
205
+ export const CPU_FALLBACK_NOTICE = 'The GPU was unavailable, so this track was generated on the CPU and took much longer than usual.';
206
+ export function gpuFallback({ gpuRequested, stats }) {
207
+ return gpuRequested && stats?.backendDevice === 0;
208
+ }
209
+ const BACKEND_NAMES = {
210
+ 0: 'cpu',
211
+ 1: 'metal',
212
+ 2: 'cuda',
213
+ 3: 'vulkan',
214
+ 4: 'opencl',
215
+ 99: 'other'
216
+ };
217
+ export function backendDevice(stats) {
218
+ if (stats?.backendDevice === undefined)
219
+ return 'unknown';
220
+ return stats.backendDevice === 1 ? 'gpu' : 'cpu';
221
+ }
222
+ export function backendName(backendId) {
223
+ if (backendId === undefined)
224
+ return 'unknown';
225
+ return BACKEND_NAMES[backendId] ?? `id-${backendId}`;
226
+ }
227
+ function logBackendUsed({ gpuRequested, stats, fallback }) {
228
+ hdiag('music.backend', {
229
+ gpuRequested,
230
+ backend: backendName(stats?.backendId),
231
+ backendId: stats?.backendId ?? null,
232
+ backendDevice: stats?.backendDevice ?? null,
233
+ gpuFallback: fallback,
234
+ platform: `${process.platform}-${process.arch}`
235
+ });
236
+ }
237
+ export function pcmToWav(audio) {
238
+ const { pcm, sampleRate, channels, bitsPerSample } = audio;
239
+ const blockAlign = channels * (bitsPerSample / 8);
240
+ const header = new ArrayBuffer(44);
241
+ const view = new DataView(header);
242
+ const ascii = (offset, value) => {
243
+ for (let i = 0; i < value.length; i++)
244
+ view.setUint8(offset + i, value.charCodeAt(i));
245
+ };
246
+ ascii(0, 'RIFF');
247
+ view.setUint32(4, 36 + pcm.byteLength, true);
248
+ ascii(8, 'WAVE');
249
+ ascii(12, 'fmt ');
250
+ view.setUint32(16, 16, true);
251
+ view.setUint16(20, 1, true);
252
+ view.setUint16(22, channels, true);
253
+ view.setUint32(24, sampleRate, true);
254
+ view.setUint32(28, sampleRate * blockAlign, true);
255
+ view.setUint16(32, blockAlign, true);
256
+ view.setUint16(34, bitsPerSample, true);
257
+ ascii(36, 'data');
258
+ view.setUint32(40, pcm.byteLength, true);
259
+ const wav = new Uint8Array(44 + pcm.byteLength);
260
+ wav.set(new Uint8Array(header));
261
+ wav.set(pcm, 44);
262
+ return wav;
263
+ }
264
+ function parseArgs(args, defaults, maxDuration) {
265
+ const caption = typeof args.prompt === 'string' ? args.prompt.trim() : '';
266
+ if (!caption)
267
+ return { error: 'prompt must be a non-empty string' };
268
+ if (caption.length > MAX_CAPTION_CHARS) {
269
+ return { error: `prompt exceeds ${MAX_CAPTION_CHARS} characters` };
270
+ }
271
+ let lyrics;
272
+ if (typeof args.lyrics === 'string' && args.lyrics.trim()) {
273
+ if (args.lyrics.length > MAX_LYRICS_CHARS) {
274
+ return { error: `lyrics exceed ${MAX_LYRICS_CHARS} characters` };
275
+ }
276
+ lyrics = args.lyrics;
277
+ }
278
+ let duration = defaults.duration;
279
+ if (args.duration !== undefined && args.duration !== null) {
280
+ const n = Number(args.duration);
281
+ if (!Number.isFinite(n) || n < MIN_DURATION_SECONDS || n > MAX_DURATION_SECONDS) {
282
+ return {
283
+ error: `duration must be between ${MIN_DURATION_SECONDS} and ${MAX_DURATION_SECONDS} seconds`
284
+ };
285
+ }
286
+ duration = Math.round(n);
287
+ }
288
+ if (duration !== undefined)
289
+ duration = Math.min(duration, maxDuration);
290
+ let seed;
291
+ if (args.seed !== undefined && args.seed !== null) {
292
+ seed = Number(args.seed);
293
+ if (!Number.isInteger(seed) || seed < -1 || seed > MAX_SEED) {
294
+ return { error: `seed must be an integer between -1 (random) and ${MAX_SEED}` };
295
+ }
296
+ if (seed === -1)
297
+ seed = undefined;
298
+ }
299
+ let vocalLanguage;
300
+ if (typeof args.vocalLanguage === 'string' && args.vocalLanguage.trim()) {
301
+ const lang = args.vocalLanguage.trim();
302
+ if (lang.length > MAX_VOCAL_LANGUAGE_CHARS) {
303
+ return { error: `vocalLanguage exceeds ${MAX_VOCAL_LANGUAGE_CHARS} characters` };
304
+ }
305
+ vocalLanguage = lang;
306
+ }
307
+ let bpm;
308
+ if (args.bpm !== undefined && args.bpm !== null) {
309
+ const n = Number(args.bpm);
310
+ if (!Number.isInteger(n) || n < MIN_BPM || n > MAX_BPM) {
311
+ return { error: `bpm must be an integer between ${MIN_BPM} and ${MAX_BPM}` };
312
+ }
313
+ bpm = n;
314
+ }
315
+ const keyscale = musicMeta(args.keyscale);
316
+ const timesignature = musicMeta(args.timesignature);
317
+ const title = fileNameBase(typeof args.title === 'string' ? args.title : undefined);
318
+ return { caption, title, lyrics, duration, seed, vocalLanguage, bpm, keyscale, timesignature };
319
+ }
320
+ function musicFileName(title, caption) {
321
+ const base = title ?? fileNameBase(caption) ?? `generated-${Date.now()}`;
322
+ return `${base}.wav`;
323
+ }
324
+ function fileNameBase(value) {
325
+ const stem = value
326
+ ?.toLowerCase()
327
+ .replace(/\.wav$/i, '')
328
+ .replace(/[^\p{L}\p{N}]+/gu, '-')
329
+ .replace(/^-+|-+$/g, '')
330
+ .slice(0, MAX_TITLE_CHARS)
331
+ .replace(/-+$/, '');
332
+ return stem || undefined;
333
+ }
334
+ function musicMeta(value) {
335
+ if (typeof value !== 'string' || !value.trim())
336
+ return undefined;
337
+ return value.trim().slice(0, MAX_MUSIC_META_CHARS);
338
+ }
339
+ const VOCAL_CAPTION = /\b(?:vocal(?:ists?|s)?|sing(?:s|ing|ers?)?|sung|voices?|duet|choir|a ?cappella|acapella|rap(?:s|ping|per)?|chant(?:s|ing|ed)?)\b(?![\s-]*(?:chops?|fx|samples?|pads?|synths?|stabs?|textures?)\b)/i;
340
+ const INSTRUMENTAL_INTENT = /\b(?:instrumental|no vocals?|without vocals?|no singing|no lyrics|karaoke)\b/i;
341
+ function captionImpliesVocals(caption) {
342
+ return VOCAL_CAPTION.test(caption) && !INSTRUMENTAL_INTENT.test(caption);
343
+ }
344
+ export function settingsDuration(value, maxDuration) {
345
+ if (!value)
346
+ return undefined;
347
+ return Math.min(maxDuration, Math.max(MIN_DURATION_SECONDS, Math.round(value)));
348
+ }
349
+ export function settingsSteps(value, maxSteps = MAX_STEPS) {
350
+ if (!value || !Number.isInteger(value))
351
+ return undefined;
352
+ return Math.min(maxSteps, Math.max(1, value));
353
+ }
354
+ export function normalizeClamps(clamps) {
355
+ const maxDuration = clamps?.maxDuration
356
+ ? Math.min(MAX_DURATION_SECONDS, Math.max(MIN_DURATION_SECONDS, Math.floor(clamps.maxDuration)))
357
+ : MAX_DURATION_SECONDS;
358
+ const maxSteps = clamps?.maxSteps
359
+ ? Math.min(MAX_STEPS, Math.max(1, Math.floor(clamps.maxSteps)))
360
+ : MAX_STEPS;
361
+ return { maxDuration, maxSteps };
362
+ }
363
+ export function resolveMusicSettings(ctx) {
364
+ const settings = ctx?.settings;
365
+ if (!settings)
366
+ return {};
367
+ const out = {};
368
+ if (typeof settings.modelChoice === 'string' && settings.modelChoice) {
369
+ out.modelChoice = settings.modelChoice;
370
+ }
371
+ if (typeof settings.steps === 'number' && Number.isFinite(settings.steps)) {
372
+ out.steps = settings.steps;
373
+ }
374
+ if (typeof settings.duration === 'number' && Number.isFinite(settings.duration)) {
375
+ out.duration = settings.duration;
376
+ }
377
+ return out;
378
+ }
379
+ export function createGenerateMusicTool(runtime, clamps) {
380
+ const cap = normalizeClamps(clamps);
381
+ const stepsCap = clamps?.maxSteps ? cap.maxSteps : undefined;
382
+ return {
383
+ name: GENERATE_MUSIC_TOOL,
384
+ toolset: null,
385
+ skillGated: true,
386
+ description: 'Generate music or other audio from a text description using the local ACE-Step model. ' +
387
+ 'The prompt describes the genre, instruments, mood, and tempo in plain language. ' +
388
+ 'Optional `lyrics` add sung vocals (omit for an instrumental). `duration` is in seconds ' +
389
+ `(approximate, max ${cap.maxDuration} on this device). The generated audio is saved as a ` +
390
+ 'chat attachment and shown to the user automatically; the attachment id is returned to you. ' +
391
+ 'Use this when the user asks for a song, track, beat, melody, jingle, or sound.',
392
+ parameters: {
393
+ type: 'object',
394
+ properties: {
395
+ prompt: {
396
+ type: 'string',
397
+ description: 'The music to generate: genre, instruments, mood, tempo'
398
+ },
399
+ title: {
400
+ type: 'string',
401
+ description: 'A short, descriptive song title for this track, 2 to 5 words. Used to name the ' +
402
+ 'saved audio file, so keep it human-readable and omit any file extension.'
403
+ },
404
+ lyrics: {
405
+ type: 'string',
406
+ description: 'Optional sung lyrics; omit for an instrumental. Use [verse]/[chorus] tags.'
407
+ },
408
+ vocalLanguage: {
409
+ type: 'string',
410
+ description: 'Language the vocals are sung in, as a short code (e.g. "en", "es", "de", "it"). ' +
411
+ 'Only applies when lyrics have vocals; defaults to English.'
412
+ },
413
+ duration: {
414
+ type: 'number',
415
+ description: `Approximate length in seconds, max ${cap.maxDuration}`
416
+ },
417
+ seed: { type: 'number', description: 'Reproducibility seed; -1 or omitted = random' },
418
+ bpm: {
419
+ type: 'number',
420
+ description: 'Tempo in beats per minute, when the user asks for a specific tempo'
421
+ },
422
+ keyscale: {
423
+ type: 'string',
424
+ description: 'Musical key and scale, e.g. "C minor" or "A major", when the user names one'
425
+ },
426
+ timesignature: {
427
+ type: 'string',
428
+ description: 'Time signature, e.g. "4/4" or "3/4", when the user names one'
429
+ }
430
+ },
431
+ required: ['prompt']
432
+ },
433
+ resource: (args) => ({
434
+ kind: 'music-generation',
435
+ label: String(args.prompt ?? '').slice(0, 80)
436
+ }),
437
+ effect: () => 'read',
438
+ execute: async (args, ctx) => {
439
+ const music = resolveMusicSettings(ctx);
440
+ const parsed = parseArgs(args, { duration: settingsDuration(music.duration, cap.maxDuration) }, cap.maxDuration);
441
+ if ('error' in parsed)
442
+ return parsed;
443
+ if (!ctx?.attach)
444
+ return { error: 'this device cannot persist generated audio' };
445
+ if (!runtime.acquire())
446
+ return { error: BUSY_ERROR };
447
+ const report = ctx.progress;
448
+ const onTick = report && musicPercentTick((percentage) => report({ percentage }));
449
+ const capMax = stepsCap ?? MAX_STEPS;
450
+ const choiceDefault = music.modelChoice ? musicDefaultSteps(music.modelChoice) : undefined;
451
+ const steps = settingsSteps(music.steps, capMax) ??
452
+ settingsSteps(choiceDefault ?? runtime.defaultSteps, capMax) ??
453
+ stepsCap;
454
+ try {
455
+ const sdk = await runtime.loadSdk();
456
+ const { modelId } = await runtime.ensureLoaded(sdk, ctx.signal, music.modelChoice, steps);
457
+ const hasVocals = parsed.lyrics !== undefined &&
458
+ parsed.lyrics.trim().toLowerCase() !== INSTRUMENTAL.toLowerCase();
459
+ const instrumental = !hasVocals;
460
+ const vocalLanguage = hasVocals
461
+ ? (parsed.vocalLanguage ?? DEFAULT_VOCAL_LANGUAGE)
462
+ : undefined;
463
+ const result = await runAudioGen(sdk, modelId, {
464
+ caption: parsed.caption,
465
+ lyrics: hasVocals ? parsed.lyrics : INSTRUMENTAL,
466
+ ...(parsed.duration !== undefined ? { duration: parsed.duration } : {}),
467
+ ...(parsed.seed !== undefined ? { seed: parsed.seed } : {}),
468
+ ...(vocalLanguage ? { vocalLanguage } : {}),
469
+ ...(parsed.bpm !== undefined ? { bpm: parsed.bpm } : {}),
470
+ ...(parsed.keyscale ? { keyscale: parsed.keyscale } : {}),
471
+ ...(parsed.timesignature ? { timesignature: parsed.timesignature } : {})
472
+ }, ctx.signal, onTick);
473
+ if ('error' in result)
474
+ return result;
475
+ const wav = pcmToWav(result);
476
+ const record = await ctx.attach({
477
+ fileName: musicFileName(parsed.title, parsed.caption),
478
+ mimeType: 'audio/wav',
479
+ bytes: wav,
480
+ raw: true
481
+ });
482
+ const stats = presentStats(result.stats);
483
+ const fallback = gpuFallback({ gpuRequested: runtime.gpuRequested, stats });
484
+ const notice = fallback ? CPU_FALLBACK_NOTICE : undefined;
485
+ logBackendUsed({ gpuRequested: runtime.gpuRequested, stats, fallback });
486
+ ctx.reportBackend?.({
487
+ tool: GENERATE_MUSIC_TOOL,
488
+ requestedGpu: runtime.gpuRequested,
489
+ device: backendDevice(stats),
490
+ backend: backendName(stats?.backendId)
491
+ });
492
+ return {
493
+ attachmentId: record.id,
494
+ fileName: record.fileName,
495
+ byteLength: record.byteLength,
496
+ durationSeconds: audioDurationSeconds(result),
497
+ sampleRate: result.sampleRate,
498
+ channels: result.channels,
499
+ instrumental,
500
+ ...(instrumental && captionImpliesVocals(parsed.caption)
501
+ ? {
502
+ note: 'This track is instrumental: no lyrics were provided, so the model did not sing. ' +
503
+ 'The prompt described vocals; to produce a sung version, call generate_music again ' +
504
+ 'with lyrics ([verse]/[chorus] tags). Otherwise describe this track as instrumental, not vocal.'
505
+ }
506
+ : {}),
507
+ hostNotice: notice,
508
+ ...(stats ? { data: { stats } } : {})
509
+ };
510
+ }
511
+ catch (err) {
512
+ if (err instanceof AbortedError)
513
+ return { error: 'music generation canceled' };
514
+ throw err;
515
+ }
516
+ finally {
517
+ runtime.release();
518
+ report?.(null);
519
+ }
520
+ }
521
+ };
522
+ }
@@ -0,0 +1,5 @@
1
+ import type { ToolDefinition } from '../capabilities/completion.ts';
2
+ import { type FsToolOptions } from './fs/scope.ts';
3
+ export declare const DEFAULT_GREP_MATCHES = 200;
4
+ export declare const MAX_GREP_MATCHES = 1000;
5
+ export declare function createGrepTool({ realpath, deniedRoots }?: FsToolOptions): ToolDefinition;
@@ -0,0 +1,158 @@
1
+ import { hlog } from "../log.js";
2
+ import { searchTargets } from "./file-glob.js";
3
+ import { readLines } from "./fs/read.js";
4
+ import { isDriveReadTruncated } from "./fs/remote.js";
5
+ import { canonicalDenyRoots, defaultRealpath, isDeniedPath } from "./fs/scope.js";
6
+ import { walkFiles } from "./fs/walk.js";
7
+ export const DEFAULT_GREP_MATCHES = 200;
8
+ export const MAX_GREP_MATCHES = 1000;
9
+ const MAX_LINE_CHARS = 500;
10
+ const BINARY_PROBE_CHARS = 1024;
11
+ function stringArray(raw) {
12
+ if (!Array.isArray(raw) || raw.length === 0)
13
+ return null;
14
+ const values = raw.filter((entry) => typeof entry === 'string' && entry.length > 0);
15
+ return values.length === raw.length ? values : null;
16
+ }
17
+ function compileQueries(queries, regex, caseSensitive) {
18
+ if (regex) {
19
+ try {
20
+ return queries.map((q) => {
21
+ const rx = new RegExp(q, caseSensitive ? '' : 'i');
22
+ return (line) => rx.test(line);
23
+ });
24
+ }
25
+ catch (err) {
26
+ return { error: `invalid regex: ${err.message}` };
27
+ }
28
+ }
29
+ return queries.map((q) => {
30
+ const needle = caseSensitive ? q : q.toLowerCase();
31
+ return caseSensitive
32
+ ? (line) => line.includes(needle)
33
+ : (line) => line.toLowerCase().includes(needle);
34
+ });
35
+ }
36
+ export function createGrepTool({ realpath = defaultRealpath, deniedRoots } = {}) {
37
+ return {
38
+ name: 'grep',
39
+ toolset: 'files',
40
+ description: 'Search file contents inside the granted directories. Queries are literal ' +
41
+ 'substrings by default (case-insensitive); set regex=true for patterns. ' +
42
+ 'Returns matching lines with file and line number. Symlinks are never ' +
43
+ 'followed; skippedLinks counts the ones left out.',
44
+ parameters: {
45
+ type: 'object',
46
+ properties: {
47
+ queries: {
48
+ type: 'array',
49
+ description: 'Text or patterns to search for',
50
+ items: { type: 'string' }
51
+ },
52
+ dir: {
53
+ type: 'string',
54
+ description: 'Optional directory to search (default: every granted directory)'
55
+ },
56
+ regex: {
57
+ type: 'boolean',
58
+ description: 'Treat queries as regular expressions (default false)'
59
+ },
60
+ caseSensitive: { type: 'boolean', description: 'Match case exactly (default false)' },
61
+ maxMatches: {
62
+ type: 'number',
63
+ description: `Optional match cap (default ${DEFAULT_GREP_MATCHES}, max ${MAX_GREP_MATCHES})`
64
+ }
65
+ },
66
+ required: ['queries']
67
+ },
68
+ effect: () => 'read',
69
+ autoApprove: true,
70
+ rootsRequired: true,
71
+ validate(rawArgs) {
72
+ const queries = stringArray(rawArgs.queries);
73
+ if (!queries)
74
+ return 'queries must be a non-empty array of strings';
75
+ const compiled = compileQueries(queries, rawArgs.regex === true, rawArgs.caseSensitive === true);
76
+ if ('error' in compiled)
77
+ return compiled.error;
78
+ const maxMatches = rawArgs.maxMatches;
79
+ if (maxMatches !== undefined && maxMatches !== null) {
80
+ const n = Number(maxMatches);
81
+ if (!Number.isInteger(n) || n <= 0 || n > MAX_GREP_MATCHES) {
82
+ return `maxMatches must be a positive integer ≤ ${MAX_GREP_MATCHES}`;
83
+ }
84
+ }
85
+ return null;
86
+ },
87
+ resource(args) {
88
+ const queries = stringArray(args.queries);
89
+ return queries ? { kind: 'file', label: `grep ${queries.join(', ')}` } : null;
90
+ },
91
+ async execute(rawArgs, ctx) {
92
+ const roots = ctx?.fsRoots ?? [];
93
+ const queries = stringArray(rawArgs.queries);
94
+ if (!queries)
95
+ return { error: 'queries must be a non-empty array of strings' };
96
+ const compiled = compileQueries(queries, rawArgs.regex === true, rawArgs.caseSensitive === true);
97
+ if ('error' in compiled)
98
+ return compiled;
99
+ const maxMatches = rawArgs.maxMatches ? Number(rawArgs.maxMatches) : DEFAULT_GREP_MATCHES;
100
+ const deny = await canonicalDenyRoots(deniedRoots, realpath);
101
+ const scoped = await searchTargets(rawArgs.dir, roots, realpath, deny);
102
+ if ('error' in scoped)
103
+ return scoped;
104
+ const matches = [];
105
+ let truncated = false;
106
+ let skippedLinks = 0;
107
+ for (const target of scoped.targets) {
108
+ const walk = await walkFiles(target.root, target.folder);
109
+ truncated ||= walk.truncated;
110
+ skippedLinks += walk.skippedLinks;
111
+ for (const file of walk.files) {
112
+ if (isDeniedPath(file.path, deny))
113
+ continue;
114
+ const hits = [];
115
+ let probed = 0;
116
+ let binary = false;
117
+ let index = 0;
118
+ try {
119
+ for await (const line of readLines(target.root.drive, file.key)) {
120
+ index++;
121
+ if (probed < BINARY_PROBE_CHARS) {
122
+ if (line.includes('\0')) {
123
+ binary = true;
124
+ break;
125
+ }
126
+ probed += line.length + 1;
127
+ }
128
+ if (!compiled.some((test) => test(line)))
129
+ continue;
130
+ hits.push({ file: file.path, line: index, text: line.slice(0, MAX_LINE_CHARS) });
131
+ if (matches.length + hits.length >= maxMatches) {
132
+ matches.push(...hits);
133
+ return { matches, truncated: true, ...(skippedLinks ? { skippedLinks } : {}) };
134
+ }
135
+ }
136
+ }
137
+ catch (err) {
138
+ if (isDriveReadTruncated(err)) {
139
+ if (!binary)
140
+ matches.push(...hits);
141
+ truncated = true;
142
+ continue;
143
+ }
144
+ hlog('warn: grep skipped a file', { file: file.path, err: err.message });
145
+ continue;
146
+ }
147
+ if (!binary)
148
+ matches.push(...hits);
149
+ }
150
+ }
151
+ return {
152
+ matches,
153
+ ...(truncated ? { truncated } : {}),
154
+ ...(skippedLinks ? { skippedLinks } : {})
155
+ };
156
+ }
157
+ };
158
+ }
@@ -0,0 +1 @@
1
+ export declare const READ_METHODS: Set<string>;
@@ -0,0 +1 @@
1
+ export const READ_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);