@kvman/kvcoder 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/api.d.ts +386 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +2 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/artifacts/artifact-format.d.ts +9 -0
  8. package/dist/artifacts/artifact-format.d.ts.map +1 -0
  9. package/dist/artifacts/artifact-format.js +32 -0
  10. package/dist/artifacts/artifact-format.js.map +1 -0
  11. package/dist/artifacts/artifact-records.d.ts +12 -0
  12. package/dist/artifacts/artifact-records.d.ts.map +1 -0
  13. package/dist/artifacts/artifact-records.js +17 -0
  14. package/dist/artifacts/artifact-records.js.map +1 -0
  15. package/dist/artifacts/register-artifacts.d.ts +3 -0
  16. package/dist/artifacts/register-artifacts.d.ts.map +1 -0
  17. package/dist/artifacts/register-artifacts.js +37 -0
  18. package/dist/artifacts/register-artifacts.js.map +1 -0
  19. package/dist/calls/binary-checks.d.ts +8 -0
  20. package/dist/calls/binary-checks.d.ts.map +1 -0
  21. package/dist/calls/binary-checks.js +12 -0
  22. package/dist/calls/binary-checks.js.map +1 -0
  23. package/dist/calls/connector-help.d.ts +3 -0
  24. package/dist/calls/connector-help.d.ts.map +1 -0
  25. package/dist/calls/connector-help.js +73 -0
  26. package/dist/calls/connector-help.js.map +1 -0
  27. package/dist/calls/help-text.d.ts +19 -0
  28. package/dist/calls/help-text.d.ts.map +1 -0
  29. package/dist/calls/help-text.js +22 -0
  30. package/dist/calls/help-text.js.map +1 -0
  31. package/dist/calls/line-run.d.ts +33 -0
  32. package/dist/calls/line-run.d.ts.map +1 -0
  33. package/dist/calls/line-run.js +56 -0
  34. package/dist/calls/line-run.js.map +1 -0
  35. package/dist/calls/run-shell.d.ts +12 -0
  36. package/dist/calls/run-shell.d.ts.map +1 -0
  37. package/dist/calls/run-shell.js +88 -0
  38. package/dist/calls/run-shell.js.map +1 -0
  39. package/dist/calls/run-tool.d.ts +49 -0
  40. package/dist/calls/run-tool.d.ts.map +1 -0
  41. package/dist/calls/run-tool.js +66 -0
  42. package/dist/calls/run-tool.js.map +1 -0
  43. package/dist/calls/shell-command.d.ts +25 -0
  44. package/dist/calls/shell-command.d.ts.map +1 -0
  45. package/dist/calls/shell-command.js +31 -0
  46. package/dist/calls/shell-command.js.map +1 -0
  47. package/dist/calls/shell-program.d.ts +5 -0
  48. package/dist/calls/shell-program.d.ts.map +1 -0
  49. package/dist/calls/shell-program.js +8 -0
  50. package/dist/calls/shell-program.js.map +1 -0
  51. package/dist/connector-call.d.ts +66 -0
  52. package/dist/connector-call.d.ts.map +1 -0
  53. package/dist/connector-call.js +133 -0
  54. package/dist/connector-call.js.map +1 -0
  55. package/dist/connectors/artifact.d.ts +51 -0
  56. package/dist/connectors/artifact.d.ts.map +1 -0
  57. package/dist/connectors/artifact.js +101 -0
  58. package/dist/connectors/artifact.js.map +1 -0
  59. package/dist/connectors/ask.d.ts +58 -0
  60. package/dist/connectors/ask.d.ts.map +1 -0
  61. package/dist/connectors/ask.js +85 -0
  62. package/dist/connectors/ask.js.map +1 -0
  63. package/dist/connectors/background.d.ts +29 -0
  64. package/dist/connectors/background.d.ts.map +1 -0
  65. package/dist/connectors/background.js +56 -0
  66. package/dist/connectors/background.js.map +1 -0
  67. package/dist/connectors/binary.d.ts +5 -0
  68. package/dist/connectors/binary.d.ts.map +1 -0
  69. package/dist/connectors/binary.js +27 -0
  70. package/dist/connectors/binary.js.map +1 -0
  71. package/dist/connectors/builtin-connectors.d.ts +217 -0
  72. package/dist/connectors/builtin-connectors.d.ts.map +1 -0
  73. package/dist/connectors/builtin-connectors.js +49 -0
  74. package/dist/connectors/builtin-connectors.js.map +1 -0
  75. package/dist/connectors/connector-command.d.ts +26 -0
  76. package/dist/connectors/connector-command.d.ts.map +1 -0
  77. package/dist/connectors/connector-command.js +17 -0
  78. package/dist/connectors/connector-command.js.map +1 -0
  79. package/dist/connectors/delegate.d.ts +32 -0
  80. package/dist/connectors/delegate.d.ts.map +1 -0
  81. package/dist/connectors/delegate.js +82 -0
  82. package/dist/connectors/delegate.js.map +1 -0
  83. package/dist/connectors/fs.d.ts +60 -0
  84. package/dist/connectors/fs.d.ts.map +1 -0
  85. package/dist/connectors/fs.js +132 -0
  86. package/dist/connectors/fs.js.map +1 -0
  87. package/dist/connectors/mcp.d.ts +37 -0
  88. package/dist/connectors/mcp.d.ts.map +1 -0
  89. package/dist/connectors/mcp.js +69 -0
  90. package/dist/connectors/mcp.js.map +1 -0
  91. package/dist/connectors/payload-fields.d.ts +9 -0
  92. package/dist/connectors/payload-fields.d.ts.map +1 -0
  93. package/dist/connectors/payload-fields.js +13 -0
  94. package/dist/connectors/payload-fields.js.map +1 -0
  95. package/dist/connectors/shell.d.ts +19 -0
  96. package/dist/connectors/shell.d.ts.map +1 -0
  97. package/dist/connectors/shell.js +22 -0
  98. package/dist/connectors/shell.js.map +1 -0
  99. package/dist/delay.d.ts +3 -0
  100. package/dist/delay.d.ts.map +1 -0
  101. package/dist/delay.js +11 -0
  102. package/dist/delay.js.map +1 -0
  103. package/dist/delegate/approved-run.d.ts +13 -0
  104. package/dist/delegate/approved-run.d.ts.map +1 -0
  105. package/dist/delegate/approved-run.js +54 -0
  106. package/dist/delegate/approved-run.js.map +1 -0
  107. package/dist/delegate/programs.d.ts +32 -0
  108. package/dist/delegate/programs.d.ts.map +1 -0
  109. package/dist/delegate/programs.js +67 -0
  110. package/dist/delegate/programs.js.map +1 -0
  111. package/dist/delegate/register-worker-run.d.ts +9 -0
  112. package/dist/delegate/register-worker-run.d.ts.map +1 -0
  113. package/dist/delegate/register-worker-run.js +70 -0
  114. package/dist/delegate/register-worker-run.js.map +1 -0
  115. package/dist/delegate/run-program.d.ts +9 -0
  116. package/dist/delegate/run-program.d.ts.map +1 -0
  117. package/dist/delegate/run-program.js +59 -0
  118. package/dist/delegate/run-program.js.map +1 -0
  119. package/dist/delegate/runs.d.ts +27 -0
  120. package/dist/delegate/runs.d.ts.map +1 -0
  121. package/dist/delegate/runs.js +68 -0
  122. package/dist/delegate/runs.js.map +1 -0
  123. package/dist/delegate/workers.d.ts +266 -0
  124. package/dist/delegate/workers.d.ts.map +1 -0
  125. package/dist/delegate/workers.js +80 -0
  126. package/dist/delegate/workers.js.map +1 -0
  127. package/dist/docs.d.ts +14 -0
  128. package/dist/docs.d.ts.map +1 -0
  129. package/dist/docs.js +59 -0
  130. package/dist/docs.js.map +1 -0
  131. package/dist/files/edit-text.d.ts +13 -0
  132. package/dist/files/edit-text.d.ts.map +1 -0
  133. package/dist/files/edit-text.js +46 -0
  134. package/dist/files/edit-text.js.map +1 -0
  135. package/dist/files/file-queue.d.ts +3 -0
  136. package/dist/files/file-queue.d.ts.map +1 -0
  137. package/dist/files/file-queue.js +17 -0
  138. package/dist/files/file-queue.js.map +1 -0
  139. package/dist/files/list-entries.d.ts +14 -0
  140. package/dist/files/list-entries.d.ts.map +1 -0
  141. package/dist/files/list-entries.js +40 -0
  142. package/dist/files/list-entries.js.map +1 -0
  143. package/dist/files/read-file.d.ts +17 -0
  144. package/dist/files/read-file.d.ts.map +1 -0
  145. package/dist/files/read-file.js +53 -0
  146. package/dist/files/read-file.js.map +1 -0
  147. package/dist/files/search-text.d.ts +14 -0
  148. package/dist/files/search-text.d.ts.map +1 -0
  149. package/dist/files/search-text.js +62 -0
  150. package/dist/files/search-text.js.map +1 -0
  151. package/dist/files/workspace-path.d.ts +5 -0
  152. package/dist/files/workspace-path.d.ts.map +1 -0
  153. package/dist/files/workspace-path.js +37 -0
  154. package/dist/files/workspace-path.js.map +1 -0
  155. package/dist/index.d.ts +6 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +68 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/jobs/job-rows.d.ts +24 -0
  160. package/dist/jobs/job-rows.d.ts.map +1 -0
  161. package/dist/jobs/job-rows.js +74 -0
  162. package/dist/jobs/job-rows.js.map +1 -0
  163. package/dist/jobs/process-handlers.d.ts +8 -0
  164. package/dist/jobs/process-handlers.d.ts.map +1 -0
  165. package/dist/jobs/process-handlers.js +43 -0
  166. package/dist/jobs/process-handlers.js.map +1 -0
  167. package/dist/jobs/process-records.d.ts +15 -0
  168. package/dist/jobs/process-records.d.ts.map +1 -0
  169. package/dist/jobs/process-records.js +30 -0
  170. package/dist/jobs/process-records.js.map +1 -0
  171. package/dist/jobs/process-report.d.ts +8 -0
  172. package/dist/jobs/process-report.d.ts.map +1 -0
  173. package/dist/jobs/process-report.js +44 -0
  174. package/dist/jobs/process-report.js.map +1 -0
  175. package/dist/jobs/process-run.d.ts +26 -0
  176. package/dist/jobs/process-run.d.ts.map +1 -0
  177. package/dist/jobs/process-run.js +70 -0
  178. package/dist/jobs/process-run.js.map +1 -0
  179. package/dist/jobs/process-text.d.ts +5 -0
  180. package/dist/jobs/process-text.d.ts.map +1 -0
  181. package/dist/jobs/process-text.js +11 -0
  182. package/dist/jobs/process-text.js.map +1 -0
  183. package/dist/jobs/register-jobs.d.ts +3 -0
  184. package/dist/jobs/register-jobs.d.ts.map +1 -0
  185. package/dist/jobs/register-jobs.js +61 -0
  186. package/dist/jobs/register-jobs.js.map +1 -0
  187. package/dist/mcp/command-transport.d.ts +17 -0
  188. package/dist/mcp/command-transport.d.ts.map +1 -0
  189. package/dist/mcp/command-transport.js +60 -0
  190. package/dist/mcp/command-transport.js.map +1 -0
  191. package/dist/mcp/connect.d.ts +12 -0
  192. package/dist/mcp/connect.d.ts.map +1 -0
  193. package/dist/mcp/connect.js +54 -0
  194. package/dist/mcp/connect.js.map +1 -0
  195. package/dist/mcp/oauth-provider.d.ts +25 -0
  196. package/dist/mcp/oauth-provider.d.ts.map +1 -0
  197. package/dist/mcp/oauth-provider.js +59 -0
  198. package/dist/mcp/oauth-provider.js.map +1 -0
  199. package/dist/mcp/register-mcp.d.ts +3 -0
  200. package/dist/mcp/register-mcp.d.ts.map +1 -0
  201. package/dist/mcp/register-mcp.js +61 -0
  202. package/dist/mcp/register-mcp.js.map +1 -0
  203. package/dist/mcp/secrets.d.ts +7 -0
  204. package/dist/mcp/secrets.d.ts.map +1 -0
  205. package/dist/mcp/secrets.js +20 -0
  206. package/dist/mcp/secrets.js.map +1 -0
  207. package/dist/mcp/servers.d.ts +33 -0
  208. package/dist/mcp/servers.d.ts.map +1 -0
  209. package/dist/mcp/servers.js +31 -0
  210. package/dist/mcp/servers.js.map +1 -0
  211. package/dist/mcp/sign-in-record.d.ts +10 -0
  212. package/dist/mcp/sign-in-record.d.ts.map +1 -0
  213. package/dist/mcp/sign-in-record.js +4 -0
  214. package/dist/mcp/sign-in-record.js.map +1 -0
  215. package/dist/mcp/sign-in.d.ts +12 -0
  216. package/dist/mcp/sign-in.d.ts.map +1 -0
  217. package/dist/mcp/sign-in.js +75 -0
  218. package/dist/mcp/sign-in.js.map +1 -0
  219. package/dist/mcp/tools.d.ts +19 -0
  220. package/dist/mcp/tools.d.ts.map +1 -0
  221. package/dist/mcp/tools.js +31 -0
  222. package/dist/mcp/tools.js.map +1 -0
  223. package/dist/messages/attachments.d.ts +8 -0
  224. package/dist/messages/attachments.d.ts.map +1 -0
  225. package/dist/messages/attachments.js +48 -0
  226. package/dist/messages/attachments.js.map +1 -0
  227. package/dist/messages/receive-message.d.ts +15 -0
  228. package/dist/messages/receive-message.d.ts.map +1 -0
  229. package/dist/messages/receive-message.js +60 -0
  230. package/dist/messages/receive-message.js.map +1 -0
  231. package/dist/messages/register-messages.d.ts +3 -0
  232. package/dist/messages/register-messages.d.ts.map +1 -0
  233. package/dist/messages/register-messages.js +63 -0
  234. package/dist/messages/register-messages.js.map +1 -0
  235. package/dist/problems.d.ts +8 -0
  236. package/dist/problems.d.ts.map +1 -0
  237. package/dist/problems.js +14 -0
  238. package/dist/problems.js.map +1 -0
  239. package/dist/prompt/build-prompt.d.ts +29 -0
  240. package/dist/prompt/build-prompt.d.ts.map +1 -0
  241. package/dist/prompt/build-prompt.js +60 -0
  242. package/dist/prompt/build-prompt.js.map +1 -0
  243. package/dist/prompt/register-prompt.d.ts +3 -0
  244. package/dist/prompt/register-prompt.d.ts.map +1 -0
  245. package/dist/prompt/register-prompt.js +29 -0
  246. package/dist/prompt/register-prompt.js.map +1 -0
  247. package/dist/prompt/session-prompt.d.ts +24 -0
  248. package/dist/prompt/session-prompt.d.ts.map +1 -0
  249. package/dist/prompt/session-prompt.js +50 -0
  250. package/dist/prompt/session-prompt.js.map +1 -0
  251. package/dist/prompt/working-method.d.ts +7 -0
  252. package/dist/prompt/working-method.d.ts.map +1 -0
  253. package/dist/prompt/working-method.js +51 -0
  254. package/dist/prompt/working-method.js.map +1 -0
  255. package/dist/register-settings.d.ts +142 -0
  256. package/dist/register-settings.d.ts.map +1 -0
  257. package/dist/register-settings.js +51 -0
  258. package/dist/register-settings.js.map +1 -0
  259. package/dist/registry/loaded.d.ts +32 -0
  260. package/dist/registry/loaded.d.ts.map +1 -0
  261. package/dist/registry/loaded.js +41 -0
  262. package/dist/registry/loaded.js.map +1 -0
  263. package/dist/registry/register-connectors.d.ts +32 -0
  264. package/dist/registry/register-connectors.d.ts.map +1 -0
  265. package/dist/registry/register-connectors.js +126 -0
  266. package/dist/registry/register-connectors.js.map +1 -0
  267. package/dist/registry/register-sections.d.ts +18 -0
  268. package/dist/registry/register-sections.d.ts.map +1 -0
  269. package/dist/registry/register-sections.js +99 -0
  270. package/dist/registry/register-sections.js.map +1 -0
  271. package/dist/registry/session-points.d.ts +11 -0
  272. package/dist/registry/session-points.d.ts.map +1 -0
  273. package/dist/registry/session-points.js +89 -0
  274. package/dist/registry/session-points.js.map +1 -0
  275. package/dist/result-text.d.ts +11 -0
  276. package/dist/result-text.d.ts.map +1 -0
  277. package/dist/result-text.js +21 -0
  278. package/dist/result-text.js.map +1 -0
  279. package/dist/schemas/records.d.ts +357 -0
  280. package/dist/schemas/records.d.ts.map +1 -0
  281. package/dist/schemas/records.js +159 -0
  282. package/dist/schemas/records.js.map +1 -0
  283. package/dist/schemas/registry.d.ts +160 -0
  284. package/dist/schemas/registry.d.ts.map +1 -0
  285. package/dist/schemas/registry.js +37 -0
  286. package/dist/schemas/registry.js.map +1 -0
  287. package/dist/sessions/new-session.d.ts +6 -0
  288. package/dist/sessions/new-session.d.ts.map +1 -0
  289. package/dist/sessions/new-session.js +52 -0
  290. package/dist/sessions/new-session.js.map +1 -0
  291. package/dist/sessions/register-fork-export.d.ts +5 -0
  292. package/dist/sessions/register-fork-export.d.ts.map +1 -0
  293. package/dist/sessions/register-fork-export.js +62 -0
  294. package/dist/sessions/register-fork-export.js.map +1 -0
  295. package/dist/sessions/register-lifecycle.d.ts +3 -0
  296. package/dist/sessions/register-lifecycle.d.ts.map +1 -0
  297. package/dist/sessions/register-lifecycle.js +59 -0
  298. package/dist/sessions/register-lifecycle.js.map +1 -0
  299. package/dist/sessions/register-sessions.d.ts +3 -0
  300. package/dist/sessions/register-sessions.d.ts.map +1 -0
  301. package/dist/sessions/register-sessions.js +93 -0
  302. package/dist/sessions/register-sessions.js.map +1 -0
  303. package/dist/sessions/session-lookup.d.ts +10 -0
  304. package/dist/sessions/session-lookup.d.ts.map +1 -0
  305. package/dist/sessions/session-lookup.js +25 -0
  306. package/dist/sessions/session-lookup.js.map +1 -0
  307. package/dist/sessions/session-view.d.ts +118 -0
  308. package/dist/sessions/session-view.d.ts.map +1 -0
  309. package/dist/sessions/session-view.js +105 -0
  310. package/dist/sessions/session-view.js.map +1 -0
  311. package/dist/store/collections.d.ts +471 -0
  312. package/dist/store/collections.d.ts.map +1 -0
  313. package/dist/store/collections.js +46 -0
  314. package/dist/store/collections.js.map +1 -0
  315. package/dist/turns/background.d.ts +6 -0
  316. package/dist/turns/background.d.ts.map +1 -0
  317. package/dist/turns/background.js +27 -0
  318. package/dist/turns/background.js.map +1 -0
  319. package/dist/turns/cancel-turn.d.ts +3 -0
  320. package/dist/turns/cancel-turn.d.ts.map +1 -0
  321. package/dist/turns/cancel-turn.js +31 -0
  322. package/dist/turns/cancel-turn.js.map +1 -0
  323. package/dist/turns/compaction.d.ts +12 -0
  324. package/dist/turns/compaction.d.ts.map +1 -0
  325. package/dist/turns/compaction.js +55 -0
  326. package/dist/turns/compaction.js.map +1 -0
  327. package/dist/turns/end-turn.d.ts +15 -0
  328. package/dist/turns/end-turn.d.ts.map +1 -0
  329. package/dist/turns/end-turn.js +67 -0
  330. package/dist/turns/end-turn.js.map +1 -0
  331. package/dist/turns/history.d.ts +28 -0
  332. package/dist/turns/history.d.ts.map +1 -0
  333. package/dist/turns/history.js +47 -0
  334. package/dist/turns/history.js.map +1 -0
  335. package/dist/turns/lost-reply.d.ts +31 -0
  336. package/dist/turns/lost-reply.d.ts.map +1 -0
  337. package/dist/turns/lost-reply.js +43 -0
  338. package/dist/turns/lost-reply.js.map +1 -0
  339. package/dist/turns/message-blocks.d.ts +9 -0
  340. package/dist/turns/message-blocks.d.ts.map +1 -0
  341. package/dist/turns/message-blocks.js +25 -0
  342. package/dist/turns/message-blocks.js.map +1 -0
  343. package/dist/turns/model-context.d.ts +81 -0
  344. package/dist/turns/model-context.d.ts.map +1 -0
  345. package/dist/turns/model-context.js +46 -0
  346. package/dist/turns/model-context.js.map +1 -0
  347. package/dist/turns/model-info.d.ts +7 -0
  348. package/dist/turns/model-info.d.ts.map +1 -0
  349. package/dist/turns/model-info.js +10 -0
  350. package/dist/turns/model-info.js.map +1 -0
  351. package/dist/turns/model-retry.d.ts +3 -0
  352. package/dist/turns/model-retry.d.ts.map +1 -0
  353. package/dist/turns/model-retry.js +23 -0
  354. package/dist/turns/model-retry.js.map +1 -0
  355. package/dist/turns/register-interruptions.d.ts +3 -0
  356. package/dist/turns/register-interruptions.d.ts.map +1 -0
  357. package/dist/turns/register-interruptions.js +31 -0
  358. package/dist/turns/register-interruptions.js.map +1 -0
  359. package/dist/turns/register-turns.d.ts +3 -0
  360. package/dist/turns/register-turns.d.ts.map +1 -0
  361. package/dist/turns/register-turns.js +66 -0
  362. package/dist/turns/register-turns.js.map +1 -0
  363. package/dist/turns/resolve.d.ts +7 -0
  364. package/dist/turns/resolve.d.ts.map +1 -0
  365. package/dist/turns/resolve.js +29 -0
  366. package/dist/turns/resolve.js.map +1 -0
  367. package/dist/turns/run-calls.d.ts +34 -0
  368. package/dist/turns/run-calls.d.ts.map +1 -0
  369. package/dist/turns/run-calls.js +99 -0
  370. package/dist/turns/run-calls.js.map +1 -0
  371. package/dist/turns/run-command.d.ts +26 -0
  372. package/dist/turns/run-command.d.ts.map +1 -0
  373. package/dist/turns/run-command.js +118 -0
  374. package/dist/turns/run-command.js.map +1 -0
  375. package/dist/turns/settle-calls.d.ts +17 -0
  376. package/dist/turns/settle-calls.d.ts.map +1 -0
  377. package/dist/turns/settle-calls.js +98 -0
  378. package/dist/turns/settle-calls.js.map +1 -0
  379. package/dist/turns/start-turn.d.ts +87 -0
  380. package/dist/turns/start-turn.d.ts.map +1 -0
  381. package/dist/turns/start-turn.js +40 -0
  382. package/dist/turns/start-turn.js.map +1 -0
  383. package/dist/turns/step.d.ts +8 -0
  384. package/dist/turns/step.d.ts.map +1 -0
  385. package/dist/turns/step.js +168 -0
  386. package/dist/turns/step.js.map +1 -0
  387. package/dist/ui/register-ui.d.ts +3 -0
  388. package/dist/ui/register-ui.d.ts.map +1 -0
  389. package/dist/ui/register-ui.js +75 -0
  390. package/dist/ui/register-ui.js.map +1 -0
  391. package/dist/web/components/call.css +2 -0
  392. package/dist/web/components/call.js +386 -0
  393. package/dist/web/components/connectors.css +2 -0
  394. package/dist/web/components/connectors.js +2403 -0
  395. package/dist/web/components/conversation.css +2 -0
  396. package/dist/web/components/conversation.js +4319 -0
  397. package/dist/web/components/mcp-sign-in.css +2 -0
  398. package/dist/web/components/mcp-sign-in.js +265 -0
  399. package/dist/web/components/model.css +2 -0
  400. package/dist/web/components/model.js +545 -0
  401. package/dist/web/components/question.css +2 -0
  402. package/dist/web/components/question.js +321 -0
  403. package/dist/web/components/sessions.css +2 -0
  404. package/dist/web/components/sessions.js +264 -0
  405. package/docs/connectors.md +86 -0
  406. package/docs/sections.md +27 -0
  407. package/locales/ar.json +418 -0
  408. package/locales/en.json +418 -0
  409. package/package.json +70 -0
@@ -0,0 +1,2403 @@
1
+ import { Fragment as e, computed as t, createBlock as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, createTextVNode as o, createVNode as s, defineComponent as c, h as l, inject as u, mergeModels as d, mergeProps as f, nextTick as p, onBeforeUnmount as m, onMounted as h, onUnmounted as g, openBlock as _, reactive as v, ref as y, renderList as b, renderSlot as x, shallowRef as S, toDisplayString as C, useModel as w, useTemplateRef as T, vModelCheckbox as E, vModelRadio as D, vModelSelect as O, vModelText as k, watch as A, withCtx as j, withDirectives as M, withKeys as N, withModifiers as P } from "vue";
2
+ //#region ../../node_modules/.pnpm/@lucide+vue@1.49.0_vue@3.5.43_typescript@6.0.3_/node_modules/@lucide/vue/dist/esm/shared/src/build/defaultAttributes.mjs
3
+ var F = {
4
+ xmlns: "http://www.w3.org/2000/svg",
5
+ width: 24,
6
+ height: 24,
7
+ viewBox: "0 0 24 24",
8
+ fill: "none",
9
+ stroke: "currentColor",
10
+ "stroke-width": 2,
11
+ "stroke-linecap": "round",
12
+ "stroke-linejoin": "round"
13
+ }, I = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim();
14
+ //#endregion
15
+ //#region ../../node_modules/.pnpm/@lucide+vue@1.49.0_vue@3.5.43_typescript@6.0.3_/node_modules/@lucide/vue/dist/esm/shared/src/build/buildLucideIconNode.mjs
16
+ function L(e) {
17
+ return e != null;
18
+ }
19
+ function ee(e, t = {}) {
20
+ let n = t.attributeNames ?? {}, r = (e) => n[e] ?? e, i = e.size ?? e.width ?? F.width, a = e.size ?? e.height ?? F.height, o = e.aliases?.filter((e) => typeof e == "string" && e.trim() !== "").map((e) => `lucide-${e}`) ?? [], s = [...e.name ? [`lucide-${e.name}`] : [], ...o], c = t.className?.split(" ").filter(Boolean) ?? [], l = t.includeDefaultClasses === !1 ? I(...c) : I("lucide", ...s, ...c), u = t.absoluteStrokeWidth ? Number(t.strokeWidth ?? F["stroke-width"]) * Number(e.size ?? e.width ?? F.width) / Number(t.size ?? t.width ?? F.width) : t.strokeWidth ?? F["stroke-width"];
21
+ return [
22
+ "svg",
23
+ {
24
+ ...Object.entries(F).reduce((e, [t, n]) => (e[r(t)] = n, e), {}),
25
+ ..."color" in t && t.color && { [r("stroke")]: t.color },
26
+ ..."size" in t && L(t.size) && {
27
+ [r("width")]: t.size,
28
+ [r("height")]: t.size
29
+ },
30
+ ..."width" in t && L(t.width) && { [r("width")]: t.width },
31
+ ..."height" in t && L(t.height) && { [r("height")]: t.height },
32
+ [r("stroke-width")]: u,
33
+ ...l && { [r("class")]: l },
34
+ [r("viewBox")]: `0 0 ${i} ${a}`,
35
+ ...t.hasA11yProp === !1 ? { [r("aria-hidden")]: "true" } : {},
36
+ ..."attributes" in t && t.attributes
37
+ },
38
+ e.node.map((e) => {
39
+ let [n, i, a] = e, o = t.nonScalingStroke ? {
40
+ [r("vector-effect")]: "non-scaling-stroke",
41
+ ...i
42
+ } : i;
43
+ return a ? [
44
+ n,
45
+ o,
46
+ a
47
+ ] : [n, o];
48
+ })
49
+ ];
50
+ }
51
+ //#endregion
52
+ //#region ../../node_modules/.pnpm/@lucide+vue@1.49.0_vue@3.5.43_typescript@6.0.3_/node_modules/@lucide/vue/dist/esm/shared/src/utils/hasA11yProp.mjs
53
+ var te = (e) => {
54
+ for (let t in e) if (t.startsWith("aria-") || t === "role" || t === "title") return !0;
55
+ return !1;
56
+ }, R = (e) => e === "", ne = (e) => e?.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), re = /* @__PURE__ */ Symbol("lucide-icons");
57
+ function ie() {
58
+ return u(re, {});
59
+ }
60
+ //#endregion
61
+ //#region ../../node_modules/.pnpm/@lucide+vue@1.49.0_vue@3.5.43_typescript@6.0.3_/node_modules/@lucide/vue/dist/esm/Icon.mjs
62
+ var ae = ({ name: e, iconNode: t, "icon-node": n, icon: r = {
63
+ name: e && ne(e),
64
+ node: t ?? n ?? [],
65
+ size: 24,
66
+ aliases: []
67
+ }, absoluteStrokeWidth: i, "absolute-stroke-width": a, nonScalingStroke: o, "non-scaling-stroke": s, strokeWidth: c, "stroke-width": u, size: d, width: f = d, height: p = d, color: m, ...h }, { slots: g }) => {
68
+ let { size: _, color: v, strokeWidth: y = 2, absoluteStrokeWidth: b = !1, nonScalingStroke: x = !1, class: S = "" } = ie(), C = R(i) || R(a) || i === !0 || a === !0 || b === !0, w = R(o) || R(s) || o === !0 || s === !0 || x === !0;
69
+ delete h.class;
70
+ let T = g.default?.(), [, E, D = []] = ee(r, {
71
+ color: m ?? v,
72
+ width: f ?? d ?? _,
73
+ height: p ?? d ?? _,
74
+ strokeWidth: c ?? u ?? y,
75
+ absoluteStrokeWidth: C,
76
+ nonScalingStroke: w,
77
+ className: S,
78
+ hasA11yProp: T != null && T.length > 0 || te(h),
79
+ attributes: h
80
+ });
81
+ return l("svg", E, [...D.map(([e, t]) => l(e, t)), ...T ?? []]);
82
+ };
83
+ //#endregion
84
+ //#region ../../node_modules/.pnpm/@lucide+vue@1.49.0_vue@3.5.43_typescript@6.0.3_/node_modules/@lucide/vue/dist/esm/createLucideIcon.mjs
85
+ function z(e, t = []) {
86
+ let n = typeof e == "string" ? {
87
+ name: e,
88
+ node: t
89
+ } : e;
90
+ return (e, { slots: t }) => l(ae, {
91
+ ...e,
92
+ icon: n
93
+ }, t.default ? { default: t.default } : void 0);
94
+ }
95
+ var oe = z({
96
+ name: "check",
97
+ size: 24,
98
+ node: [["path", {
99
+ d: "M20 6 9 17l-5-5",
100
+ key: "1gmf2c"
101
+ }]]
102
+ }), se = z({
103
+ name: "chevron-down",
104
+ size: 24,
105
+ node: [["path", {
106
+ d: "m6 9 6 6 6-6",
107
+ key: "qrunsl"
108
+ }]]
109
+ }), ce = z({
110
+ name: "pencil",
111
+ size: 24,
112
+ node: [["path", {
113
+ d: "M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",
114
+ key: "1a8usu"
115
+ }], ["path", {
116
+ d: "m15 5 4 4",
117
+ key: "1mk7zo"
118
+ }]]
119
+ }), B = z({
120
+ name: "plus",
121
+ size: 24,
122
+ node: [["path", {
123
+ d: "M5 12h14",
124
+ key: "1ays0h"
125
+ }], ["path", {
126
+ d: "M12 5v14",
127
+ key: "s699le"
128
+ }]]
129
+ }), le = z({
130
+ name: "search",
131
+ size: 24,
132
+ node: [["path", {
133
+ d: "m21 21-4.34-4.34",
134
+ key: "14j7rj"
135
+ }], ["circle", {
136
+ cx: "11",
137
+ cy: "11",
138
+ r: "8",
139
+ key: "4ej97u"
140
+ }]]
141
+ }), ue = z({
142
+ name: "settings",
143
+ size: 24,
144
+ node: [["path", {
145
+ d: "M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",
146
+ key: "1i5ecw"
147
+ }], ["circle", {
148
+ cx: "12",
149
+ cy: "12",
150
+ r: "3",
151
+ key: "1v7zrd"
152
+ }]]
153
+ }), de = z({
154
+ name: "trash",
155
+ size: 24,
156
+ node: [
157
+ ["path", {
158
+ d: "M10 11v6",
159
+ key: "nco0om"
160
+ }],
161
+ ["path", {
162
+ d: "M14 11v6",
163
+ key: "outv1u"
164
+ }],
165
+ ["path", {
166
+ d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",
167
+ key: "miytrc"
168
+ }],
169
+ ["path", {
170
+ d: "M3 6h18",
171
+ key: "d0wm0j"
172
+ }],
173
+ ["path", {
174
+ d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",
175
+ key: "e791ji"
176
+ }]
177
+ ],
178
+ aliases: ["trash-2"]
179
+ }), fe = z({
180
+ name: "x",
181
+ size: 24,
182
+ node: [["path", {
183
+ d: "M18 6 6 18",
184
+ key: "1bl5f8"
185
+ }], ["path", {
186
+ d: "m6 6 12 12",
187
+ key: "d8bk6v"
188
+ }]]
189
+ });
190
+ //#endregion
191
+ //#region web/src/kvman.ts
192
+ function V() {
193
+ let e = u("kvman");
194
+ if (e === void 0) throw Error("kvcoder components run inside kvwebui, which provides kvman.");
195
+ return e;
196
+ }
197
+ function pe(e) {
198
+ return typeof e == "object" && e && !Array.isArray(e) ? Object.fromEntries(Object.entries(e)) : {};
199
+ }
200
+ function me(e) {
201
+ let t = e.indexOf("/");
202
+ return t < 0 ? `kernel.errors.${e}` : `${e.slice(0, t)}.errors.${e.slice(t + 1)}`;
203
+ }
204
+ function he(e) {
205
+ if (!(e instanceof Error) || !("problem" in e)) return;
206
+ let t = e.problem;
207
+ if (typeof t == "object" && t && "code" in t && typeof t.code == "string") return {
208
+ code: t.code,
209
+ params: ge("params" in t ? t.params : void 0)
210
+ };
211
+ }
212
+ function ge(e) {
213
+ return Object.fromEntries(Object.entries(pe(e)).map(([e, t]) => [e, typeof t == "string" ? t : JSON.stringify(t)]));
214
+ }
215
+ function H(e, t) {
216
+ let n = he(t);
217
+ e.toast(n === void 0 ? "kvcoder.ui.failed" : me(n.code), n?.params ?? {}, "error");
218
+ }
219
+ //#endregion
220
+ //#region web/src/ConnectorDialog.vue?vue&type=script&setup=true&lang.ts
221
+ var _e = /*@__PURE__*/ c({
222
+ __name: "ConnectorDialog",
223
+ props: { name: {
224
+ type: String,
225
+ required: !0
226
+ } },
227
+ emits: ["close"],
228
+ setup(e, { expose: t, emit: n }) {
229
+ t();
230
+ let r = e, i = n, a = V(), o = T("dialog"), s = () => [...o.value?.querySelectorAll("button:not(:disabled), select:not(:disabled), input:not(:disabled), textarea:not(:disabled), a[href]") ?? []];
231
+ function c(e) {
232
+ let t = s(), n = e.shiftKey ? t[0] : t.at(-1);
233
+ (document.activeElement === n || document.activeElement === o.value) && (e.preventDefault(), (e.shiftKey ? t.at(-1) : t[0])?.focus());
234
+ }
235
+ h(() => o.value?.focus());
236
+ let l = {
237
+ props: r,
238
+ emit: i,
239
+ kvman: a,
240
+ dialog: o,
241
+ focusable: s,
242
+ onTab: c,
243
+ get X() {
244
+ return fe;
245
+ }
246
+ };
247
+ return Object.defineProperty(l, "__isScriptSetup", {
248
+ enumerable: !1,
249
+ value: !0
250
+ }), l;
251
+ }
252
+ }), U = (e, t) => {
253
+ let n = e.__vccOpts || e;
254
+ for (let [e, r] of t) n[e] = r;
255
+ return n;
256
+ }, ve = ["aria-label"], ye = { class: "kvc-dialog-head" }, be = { class: "kvc-connector-text" }, xe = {
257
+ class: "kvc-mono kvc-dialog-title",
258
+ "data-test": "connector-dialog-title"
259
+ }, Se = {
260
+ class: "kvc-muted",
261
+ "data-test": "connector-dialog-scope"
262
+ }, Ce = ["aria-label", "title"];
263
+ function we(e, t, n, r, o, c) {
264
+ return _(), i("div", {
265
+ class: "kvc-dialog-backdrop",
266
+ "data-test": "connector-dialog-backdrop",
267
+ onClick: t[2] ||= P((e) => r.emit("close"), ["self"])
268
+ }, [a("div", {
269
+ ref: "dialog",
270
+ class: "kvc-dialog",
271
+ role: "dialog",
272
+ "aria-modal": "true",
273
+ "aria-label": r.kvman.t("kvcoder.config.connectors.configure", { name: r.props.name }),
274
+ tabindex: "-1",
275
+ "data-test": "connector-dialog",
276
+ onKeydown: [t[1] ||= N(P((e) => r.emit("close"), ["stop"]), ["esc"]), N(r.onTab, ["tab"])]
277
+ }, [a("div", ye, [a("span", be, [a("span", xe, C(r.props.name), 1), a("span", Se, C(r.kvman.t(`kvcoder.config.dialog.scope.${r.kvman.scope.value}`, { name: r.kvman.workspace.value.name })), 1)]), a("button", {
278
+ type: "button",
279
+ class: "kvc-button kvc-ghost kvc-icon-button",
280
+ "aria-label": r.kvman.t("kvcoder.config.dialog.close"),
281
+ title: r.kvman.t("kvcoder.config.dialog.close"),
282
+ "data-test": "connector-dialog-close",
283
+ onClick: t[0] ||= (e) => r.emit("close")
284
+ }, [s(r.X, {
285
+ size: 18,
286
+ "aria-hidden": "true"
287
+ })], 8, Ce)]), x(e.$slots, "default")], 40, ve)]);
288
+ }
289
+ var Te = /*#__PURE__*/ U(_e, [["render", we], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/src/ConnectorDialog.vue"]]);
290
+ //#endregion
291
+ //#region web/src/use-setting.ts
292
+ function W(e, n) {
293
+ let r = S(null), i = y("default"), a = y(!1), o = async () => {
294
+ let t = (await e.exec("kernel.settings.list", {})).find((e) => e.key === n);
295
+ r.value = t?.value ?? null, i.value = t?.source ?? "default";
296
+ }, s = async (t) => {
297
+ a.value = !0;
298
+ try {
299
+ return await t(), await o(), !0;
300
+ } catch (t) {
301
+ return H(e, t), !1;
302
+ } finally {
303
+ a.value = !1;
304
+ }
305
+ };
306
+ return h(o), A(() => [e.scope.value, e.workspace.value.id], o), {
307
+ value: r,
308
+ saving: a,
309
+ locked: t(() => e.scope.value === "global" && i.value === "workspace"),
310
+ changed: t(() => i.value === e.scope.value),
311
+ set: (t) => s(() => e.exec("kernel.settings.set", {
312
+ key: n,
313
+ value: t,
314
+ scope: e.scope.value
315
+ })),
316
+ reset: () => s(() => e.exec("kernel.settings.reset", {
317
+ key: n,
318
+ scope: e.scope.value
319
+ }))
320
+ };
321
+ }
322
+ //#endregion
323
+ //#region web/src/model-groups.ts
324
+ function Ee(e, t, n) {
325
+ let r = new Map(e.map((e) => [e.id, e.title])), i = new Set(e.filter((e) => e.status !== "needsKey").map((e) => e.id)), a = t.filter((e) => i.has(e.provider) || e.id === n), o = /* @__PURE__ */ new Map();
326
+ for (let e of a) {
327
+ let t = o.get(e.provider) ?? {
328
+ provider: e.provider,
329
+ title: r.get(e.provider) ?? e.provider,
330
+ models: []
331
+ };
332
+ t.models.push({
333
+ id: e.id,
334
+ name: e.name
335
+ }), o.set(e.provider, t);
336
+ }
337
+ return [...o.values()].sort((e, t) => e.title.localeCompare(t.title));
338
+ }
339
+ function De(e, t) {
340
+ let n = t.toLowerCase().split(/\s+/).filter((e) => e !== ""), r = (e) => n.every((t) => `${e.name} ${e.id}`.toLowerCase().includes(t)), i = e.map((e) => ({
341
+ ...e,
342
+ models: e.models.filter(r)
343
+ })).filter((e) => e.models.length > 0);
344
+ return {
345
+ groups: i,
346
+ shown: i.reduce((e, t) => e + t.models.length, 0),
347
+ total: e.reduce((e, t) => e + t.models.length, 0)
348
+ };
349
+ }
350
+ var Oe = [
351
+ "off",
352
+ "minimal",
353
+ "low",
354
+ "medium",
355
+ "high"
356
+ ], ke = [
357
+ "off",
358
+ "minimal",
359
+ "low",
360
+ "medium",
361
+ "high",
362
+ "xhigh",
363
+ "max"
364
+ ], Ae = [
365
+ "low",
366
+ "medium",
367
+ "high",
368
+ "xhigh",
369
+ "max"
370
+ ], je = [
371
+ "acceptEdits",
372
+ "auto",
373
+ "bypassPermissions",
374
+ "dontAsk",
375
+ "plan"
376
+ ], Me = [
377
+ "subagent",
378
+ "opencode",
379
+ "pi",
380
+ "claude"
381
+ ], Ne = (e) => Array.isArray(e) && e.every((e) => typeof e == "string"), G = (e) => e === null || typeof e == "string", K = (e, t) => e.some((e) => e === t), q = (e, ...t) => t.every((t) => t in e);
382
+ function Pe(e) {
383
+ return typeof e != "object" || !e || !q(e, "name", "description", "enabled", "kind", "instructions") || typeof e.name != "string" || typeof e.description != "string" || typeof e.enabled != "boolean" || typeof e.instructions != "string" ? !1 : e.kind === "subagent" ? q(e, "connectors", "model", "thinking") && (e.connectors === null || Ne(e.connectors)) && G(e.model) && (e.thinking === null || K(Oe, e.thinking)) : !q(e, "approval", "timeoutMs", "model") || !K(["ask", "auto"], e.approval) || typeof e.timeoutMs != "number" || !G(e.model) ? !1 : e.kind === "opencode" ? q(e, "agent", "autoApprove") && G(e.agent) && typeof e.autoApprove == "boolean" : e.kind === "pi" ? q(e, "thinking", "tools") && (e.thinking === null || K(ke, e.thinking)) && (e.tools === null || Ne(e.tools)) : e.kind === "claude" && q(e, "effort", "permissionMode") && (e.effort === null || K(Ae, e.effort)) && K(je, e.permissionMode);
384
+ }
385
+ var Fe = (e) => Array.isArray(e) ? e.filter(Pe) : [], Ie = {
386
+ name: "",
387
+ description: "",
388
+ enabled: !0,
389
+ instructions: "",
390
+ kind: "subagent",
391
+ all: !0,
392
+ connectors: [],
393
+ model: null,
394
+ thinking: "",
395
+ approval: "ask",
396
+ minutes: "30",
397
+ programModel: "",
398
+ agent: "",
399
+ autoApprove: !0,
400
+ piThinking: "",
401
+ tools: "",
402
+ effort: "",
403
+ permissionMode: "acceptEdits"
404
+ };
405
+ function Le(e) {
406
+ if (e === void 0) return { ...Ie };
407
+ let t = {
408
+ ...Ie,
409
+ name: e.name,
410
+ description: e.description,
411
+ enabled: e.enabled,
412
+ instructions: e.instructions
413
+ };
414
+ if (e.kind === "subagent") return {
415
+ ...t,
416
+ kind: "subagent",
417
+ all: e.connectors === null,
418
+ connectors: [...e.connectors ?? []],
419
+ model: e.model,
420
+ thinking: e.thinking ?? ""
421
+ };
422
+ let n = {
423
+ ...t,
424
+ approval: e.approval,
425
+ minutes: String(e.timeoutMs / 6e4),
426
+ programModel: e.model ?? ""
427
+ };
428
+ return e.kind === "opencode" ? {
429
+ ...n,
430
+ kind: "opencode",
431
+ agent: e.agent ?? "",
432
+ autoApprove: e.autoApprove
433
+ } : e.kind === "pi" ? {
434
+ ...n,
435
+ kind: "pi",
436
+ piThinking: e.thinking ?? "",
437
+ tools: (e.tools ?? []).join("\n")
438
+ } : {
439
+ ...n,
440
+ kind: "claude",
441
+ effort: e.effort ?? "",
442
+ permissionMode: e.permissionMode
443
+ };
444
+ }
445
+ var J = (e) => e === "" ? null : e;
446
+ function Re(e, t) {
447
+ let n = {
448
+ name: e.name.trim(),
449
+ description: e.description.trim(),
450
+ enabled: e.enabled,
451
+ instructions: e.instructions
452
+ };
453
+ if (e.kind === "subagent") {
454
+ let r = e.all ? null : [...t.filter((t) => e.connectors.includes(t)), ...e.connectors.filter((e) => !t.includes(e))];
455
+ return {
456
+ ...n,
457
+ kind: "subagent",
458
+ connectors: r,
459
+ model: e.model,
460
+ thinking: J(e.thinking)
461
+ };
462
+ }
463
+ let r = {
464
+ ...n,
465
+ approval: e.approval,
466
+ timeoutMs: Number(e.minutes) * 6e4,
467
+ model: J(e.programModel.trim())
468
+ };
469
+ if (e.kind === "opencode") return {
470
+ ...r,
471
+ kind: "opencode",
472
+ agent: J(e.agent.trim()),
473
+ autoApprove: e.autoApprove
474
+ };
475
+ let i = e.tools.split("\n").map((e) => e.trim()).filter((e) => e !== "");
476
+ return e.kind === "pi" ? {
477
+ ...r,
478
+ kind: "pi",
479
+ thinking: J(e.piThinking),
480
+ tools: i.length === 0 ? null : i
481
+ } : {
482
+ ...r,
483
+ kind: "claude",
484
+ effort: J(e.effort),
485
+ permissionMode: e.permissionMode
486
+ };
487
+ }
488
+ var ze = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/, Be = 16384, Ve = /^(?:[1-9]|[1-9]\d|1[01]\d|120)$/, He = [
489
+ "bypassPermissions",
490
+ "auto",
491
+ "dontAsk"
492
+ ], Ue = (e) => e.approval === "auto" && (e.kind === "opencode" && e.autoApprove || e.kind === "claude" && He.includes(e.permissionMode));
493
+ function We(e, t) {
494
+ let n = e.name.trim(), r = {};
495
+ return n === "" ? r.name = "kvcoder.config.workers.invalid.nameEmpty" : ze.test(n) ? t.includes(n) && (r.name = "kvcoder.config.workers.invalid.nameTaken") : r.name = "kvcoder.config.workers.invalid.nameShape", e.description.trim() === "" && (r.description = "kvcoder.config.workers.invalid.descriptionEmpty"), new TextEncoder().encode(e.instructions).length > Be && (r.instructions = "kvcoder.config.workers.invalid.instructionsLong"), e.kind === "subagent" && !e.all && e.connectors.length === 0 && (r.connectors = "kvcoder.config.workers.invalid.connectorsEmpty"), e.kind !== "subagent" && !Ve.test(e.minutes.trim()) && (r.minutes = "kvcoder.config.workers.invalid.minutes"), Ue(e) && (r.approval = "kvcoder.config.workers.invalid.unattended"), r;
496
+ }
497
+ //#endregion
498
+ //#region web/src/use-workers.ts
499
+ function Ge(e) {
500
+ let n = W(e, "kvcoder.delegate.workers"), r = t(() => Fe(n.value.value)), i = y({});
501
+ async function a(t) {
502
+ i.value = {
503
+ ...i.value,
504
+ [t]: "checking"
505
+ };
506
+ let n;
507
+ try {
508
+ n = (await e.exec("kvcoder.delegate.worker.check", { name: t })).status;
509
+ } catch (t) {
510
+ H(e, t), n = "notFound";
511
+ }
512
+ i.value = {
513
+ ...i.value,
514
+ [t]: n
515
+ };
516
+ }
517
+ return A(r, (e) => {
518
+ for (let t of e) t.kind !== "subagent" && !(t.name in i.value) && a(t.name);
519
+ }), {
520
+ workers: r,
521
+ states: i,
522
+ locked: n.locked,
523
+ changed: n.changed,
524
+ working: n.saving,
525
+ save: (e) => {
526
+ let t = r.value.findIndex((t) => t.name === e.name);
527
+ return n.set(t < 0 ? [...r.value, e] : [
528
+ ...r.value.slice(0, t),
529
+ e,
530
+ ...r.value.slice(t + 1)
531
+ ]);
532
+ },
533
+ remove: (e) => n.set(r.value.filter((t) => t.name !== e)),
534
+ toggle: (e) => n.set(r.value.map((t) => t.name === e ? {
535
+ ...t,
536
+ enabled: !t.enabled
537
+ } : t)),
538
+ reset: n.reset,
539
+ check: a
540
+ };
541
+ }
542
+ //#endregion
543
+ //#region web/src/ModelPicker.vue?vue&type=script&setup=true&lang.ts
544
+ var Y = 24, Ke = /*@__PURE__*/ c({
545
+ __name: "ModelPicker",
546
+ props: {
547
+ groups: {
548
+ type: Array,
549
+ required: !0
550
+ },
551
+ current: {
552
+ type: [String, null],
553
+ required: !0
554
+ },
555
+ empty: {
556
+ type: null,
557
+ required: !1
558
+ },
559
+ none: {
560
+ type: null,
561
+ required: !1
562
+ },
563
+ disabled: {
564
+ type: Boolean,
565
+ required: !1
566
+ }
567
+ },
568
+ emits: ["pick", "none"],
569
+ setup(e, { expose: n, emit: r }) {
570
+ n();
571
+ let i = e, a = r, o = V(), s = y(!1), c = y(""), l = y(0), u = T("trigger"), d = T("search"), f = T("panel"), h = t(() => De(i.groups, c.value)), g = t(() => h.value.groups.flatMap((e) => e.models)), _ = t(() => i.groups.flatMap((e) => e.models).find((e) => e.id === i.current)?.name ?? i.current ?? i.empty ?? ""), v = t(() => i.none !== void 0 && c.value.trim() === ""), b = t(() => +!!v.value), x = t(() => g.value.length + b.value), S = (e) => {
572
+ let t = g.value.findIndex((t) => t.id === e);
573
+ return t < 0 ? -1 : t + b.value;
574
+ };
575
+ function C() {
576
+ s.value = !1, u.value?.focus();
577
+ }
578
+ async function w() {
579
+ c.value = "", l.value = Math.max(S(i.current ?? ""), 0), E = 0, s.value = !0, await p(), O(), d.value?.focus(), j();
580
+ }
581
+ let E = 0, D = 0;
582
+ function O() {
583
+ let e = f.value, t = u.value?.closest(".kvc-conversation")?.getBoundingClientRect();
584
+ if (e === null || t === void 0) return;
585
+ let n = e.getBoundingClientRect(), r = t.left + Y - (n.left - E), i = t.right - Y - (n.right - E), a = r > 0 ? r : i < 0 ? i : 0;
586
+ a !== E && (E = a, e.style.translate = `${a}px 0`);
587
+ }
588
+ function k() {
589
+ O(), D = requestAnimationFrame(k);
590
+ }
591
+ function j() {
592
+ f.value?.querySelector("[data-active=\"true\"]")?.scrollIntoView?.({ block: "nearest" });
593
+ }
594
+ async function M(e) {
595
+ x.value !== 0 && (l.value = (l.value + e + x.value) % x.value, await p(), j());
596
+ }
597
+ function N(e) {
598
+ e !== void 0 && (a("pick", e), C());
599
+ }
600
+ function P() {
601
+ a("none"), C();
602
+ }
603
+ function F() {
604
+ v.value && l.value === 0 ? P() : N(g.value[l.value - b.value]?.id);
605
+ }
606
+ function I(e) {
607
+ e.target instanceof Node && !u.value?.parentElement?.contains(e.target) && (s.value = !1);
608
+ }
609
+ A(c, () => l.value = 0), A(s, (e) => {
610
+ e ? (document.addEventListener("pointerdown", I), D = requestAnimationFrame(k)) : (document.removeEventListener("pointerdown", I), cancelAnimationFrame(D));
611
+ }), m(() => {
612
+ document.removeEventListener("pointerdown", I), cancelAnimationFrame(D);
613
+ });
614
+ let L = {
615
+ props: i,
616
+ emit: a,
617
+ kvman: o,
618
+ open: s,
619
+ query: c,
620
+ highlight: l,
621
+ trigger: u,
622
+ search: d,
623
+ panel: f,
624
+ gutterPx: Y,
625
+ found: h,
626
+ models: g,
627
+ label: _,
628
+ offersNone: v,
629
+ first: b,
630
+ count: x,
631
+ indexOf: S,
632
+ close: C,
633
+ show: w,
634
+ get shift() {
635
+ return E;
636
+ },
637
+ set shift(e) {
638
+ E = e;
639
+ },
640
+ get frame() {
641
+ return D;
642
+ },
643
+ set frame(e) {
644
+ D = e;
645
+ },
646
+ keepInside: O,
647
+ follow: k,
648
+ scrollToHighlight: j,
649
+ move: M,
650
+ pick: N,
651
+ pickNone: P,
652
+ pickHighlighted: F,
653
+ outside: I,
654
+ get Check() {
655
+ return oe;
656
+ },
657
+ get ChevronDown() {
658
+ return se;
659
+ },
660
+ get Search() {
661
+ return le;
662
+ }
663
+ };
664
+ return Object.defineProperty(L, "__isScriptSetup", {
665
+ enumerable: !1,
666
+ value: !0
667
+ }), L;
668
+ }
669
+ }), qe = { class: "kvc-picker" }, Je = [
670
+ "aria-expanded",
671
+ "aria-label",
672
+ "disabled"
673
+ ], Ye = { class: "kvc-picker-label" }, Xe = ["onKeydown"], Ze = { class: "kvc-search" }, Qe = [
674
+ "placeholder",
675
+ "aria-label",
676
+ "onKeydown"
677
+ ], $e = ["aria-label"], et = ["aria-selected", "data-active"], tt = { class: "kvc-model-name" }, nt = {
678
+ class: "kvc-group",
679
+ role: "presentation",
680
+ "data-test": "model-group"
681
+ }, rt = [
682
+ "aria-selected",
683
+ "data-active",
684
+ "data-test",
685
+ "onClick",
686
+ "onMousemove"
687
+ ], it = { class: "kvc-model-name" }, at = {
688
+ key: 1,
689
+ class: "kvc-muted kvc-none",
690
+ "data-test": "model-none"
691
+ }, ot = {
692
+ class: "kvc-muted kvc-count",
693
+ "data-test": "model-count"
694
+ };
695
+ function st(t, o, c, l, u, d) {
696
+ return _(), i("div", qe, [a("button", {
697
+ ref: "trigger",
698
+ type: "button",
699
+ class: "kvc-button",
700
+ "aria-haspopup": "listbox",
701
+ "aria-expanded": l.open,
702
+ "aria-label": `${l.kvman.t("kvcoder.ui.model")}: ${l.label}`,
703
+ disabled: l.props.disabled,
704
+ "data-test": "model-picker",
705
+ onClick: o[0] ||= (e) => l.open ? l.close() : l.show()
706
+ }, [a("span", Ye, C(l.label), 1), s(l.ChevronDown, {
707
+ size: 16,
708
+ "aria-hidden": "true"
709
+ })], 8, Je), l.open ? (_(), i("div", {
710
+ key: 0,
711
+ ref: "panel",
712
+ class: "kvc-popover",
713
+ "data-test": "model-popover",
714
+ onKeydown: N(P(l.close, ["stop"]), ["esc"])
715
+ }, [
716
+ a("label", Ze, [s(l.Search, {
717
+ size: 16,
718
+ "aria-hidden": "true"
719
+ }), M(a("input", {
720
+ ref: "search",
721
+ "onUpdate:modelValue": o[1] ||= (e) => l.query = e,
722
+ type: "search",
723
+ role: "combobox",
724
+ "aria-expanded": "true",
725
+ "aria-controls": "kvc-models",
726
+ placeholder: l.kvman.t("kvcoder.ui.searchModels"),
727
+ "aria-label": l.kvman.t("kvcoder.ui.searchModels"),
728
+ "data-test": "model-search",
729
+ onKeydown: [
730
+ o[2] ||= N(P((e) => l.move(1), ["prevent"]), ["down"]),
731
+ o[3] ||= N(P((e) => l.move(-1), ["prevent"]), ["up"]),
732
+ N(P(l.pickHighlighted, ["prevent"]), ["enter"])
733
+ ]
734
+ }, null, 40, Qe), [[k, l.query]])]),
735
+ a("div", {
736
+ id: "kvc-models",
737
+ class: "kvc-options",
738
+ role: "listbox",
739
+ "aria-label": l.kvman.t("kvcoder.ui.model")
740
+ }, [
741
+ l.offersNone ? (_(), i("div", {
742
+ key: 0,
743
+ class: "kvc-model",
744
+ role: "option",
745
+ "aria-selected": l.props.current === null,
746
+ "data-active": l.highlight === 0,
747
+ "data-test": "model-none-entry",
748
+ onClick: l.pickNone,
749
+ onMousemove: o[4] ||= (e) => l.highlight = 0
750
+ }, [a("span", tt, C(l.props.none), 1), l.props.current === null ? (_(), n(l.Check, {
751
+ key: 0,
752
+ size: 16,
753
+ "aria-hidden": "true"
754
+ })) : r("v-if", !0)], 40, et)) : r("v-if", !0),
755
+ (_(!0), i(e, null, b(l.found.groups, (t) => (_(), i(e, { key: t.provider }, [a("div", nt, C(t.title), 1), (_(!0), i(e, null, b(t.models, (e) => (_(), i("div", {
756
+ key: e.id,
757
+ class: "kvc-model",
758
+ role: "option",
759
+ "aria-selected": e.id === l.props.current,
760
+ "data-active": l.indexOf(e.id) === l.highlight,
761
+ "data-test": `model-${e.id}`,
762
+ onClick: (t) => l.pick(e.id),
763
+ onMousemove: (t) => l.highlight = l.indexOf(e.id)
764
+ }, [a("span", it, C(e.name), 1), e.id === l.props.current ? (_(), n(l.Check, {
765
+ key: 0,
766
+ size: 16,
767
+ "aria-hidden": "true"
768
+ })) : r("v-if", !0)], 40, rt))), 128))], 64))), 128)),
769
+ l.found.shown === 0 ? (_(), i("p", at, C(l.kvman.t("kvcoder.ui.noModels")), 1)) : r("v-if", !0)
770
+ ], 8, $e),
771
+ a("p", ot, C(l.kvman.t("kvcoder.ui.modelsCount", {
772
+ shown: l.found.shown,
773
+ total: l.found.total
774
+ })), 1)
775
+ ], 40, Xe)) : r("v-if", !0)]);
776
+ }
777
+ var ct = /*#__PURE__*/ U(Ke, [["render", st], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/src/ModelPicker.vue"]]), lt = [
778
+ "shell",
779
+ "fs",
780
+ "artifact",
781
+ "background",
782
+ "ask",
783
+ "delegate",
784
+ "mcp"
785
+ ], ut = [
786
+ "shell",
787
+ "delegate",
788
+ "mcp"
789
+ ], dt = (e) => Array.isArray(e) ? e.filter((e) => typeof e == "string") : [];
790
+ function ft(e) {
791
+ let n = y([]), r = W(e, "kvcoder.connectors.disabled"), i = t(() => dt(r.value.value)), a = async () => {
792
+ n.value = await e.exec("kvcoder.connector.list", {});
793
+ }, o = t(() => [...lt.map((t) => ({
794
+ name: t,
795
+ description: e.t(`kvcoder.config.connector.${t}`)
796
+ })), ...n.value.map((e) => ({
797
+ name: e.name,
798
+ description: e.description
799
+ }))].map((e) => ({
800
+ ...e,
801
+ on: !i.value.includes(e.name),
802
+ configurable: ut.includes(e.name)
803
+ })));
804
+ return h(a), A(() => e.workspace.value.id, a), {
805
+ items: o,
806
+ locked: r.locked,
807
+ changed: r.changed,
808
+ saving: r.saving,
809
+ toggle: (e) => r.set(i.value.includes(e) ? i.value.filter((t) => t !== e) : [...i.value, e]),
810
+ reset: r.reset
811
+ };
812
+ }
813
+ //#endregion
814
+ //#region web/src/WorkerProgramFields.vue?vue&type=script&setup=true&lang.ts
815
+ var pt = /*@__PURE__*/ c({
816
+ __name: "WorkerProgramFields",
817
+ props: /*@__PURE__*/ d({
818
+ minutesProblem: {
819
+ type: null,
820
+ required: !1
821
+ },
822
+ approvalProblem: {
823
+ type: null,
824
+ required: !1
825
+ }
826
+ }, {
827
+ draft: {
828
+ type: Object,
829
+ required: !0
830
+ },
831
+ draftModifiers: {}
832
+ }),
833
+ emits: ["update:draft"],
834
+ setup(e, { expose: t }) {
835
+ t();
836
+ let n = w(e, "draft"), r = e, i = V(), a = {
837
+ draft: n,
838
+ props: r,
839
+ kvman: i,
840
+ text: (e) => i.t(`kvcoder.config.workers.form.${e}`),
841
+ get claudeEffort() {
842
+ return Ae;
843
+ },
844
+ get permissionModes() {
845
+ return je;
846
+ },
847
+ get piThinking() {
848
+ return ke;
849
+ }
850
+ };
851
+ return Object.defineProperty(a, "__isScriptSetup", {
852
+ enumerable: !1,
853
+ value: !0
854
+ }), a;
855
+ }
856
+ }), mt = { class: "kvc-form-choice" }, ht = { class: "kvc-form-label" }, gt = ["value", "data-test"], _t = {
857
+ key: 0,
858
+ class: "kvc-form-error",
859
+ role: "alert",
860
+ "data-test": "worker-approval-error"
861
+ }, vt = {
862
+ key: 1,
863
+ class: "kvc-muted"
864
+ }, yt = { class: "kvc-form-field" }, bt = { class: "kvc-form-label" }, xt = ["aria-invalid"], St = {
865
+ key: 0,
866
+ class: "kvc-form-error",
867
+ role: "alert",
868
+ "data-test": "worker-minutes-error"
869
+ }, Ct = {
870
+ key: 1,
871
+ class: "kvc-muted"
872
+ }, wt = { class: "kvc-form-field" }, Tt = { class: "kvc-form-label" }, Et = { class: "kvc-muted" }, Dt = { class: "kvc-form-field" }, Ot = { class: "kvc-form-label" }, kt = { class: "kvc-muted" }, At = { class: "kvc-form-radio" }, jt = { class: "kvc-form-field" }, Mt = { class: "kvc-form-label" }, Nt = { value: "" }, Pt = ["value"], Ft = { class: "kvc-form-field" }, It = { class: "kvc-form-label" }, Lt = { class: "kvc-muted" }, Rt = { class: "kvc-form-field" }, zt = { class: "kvc-form-label" }, Bt = { value: "" }, Vt = ["value"], Ht = { class: "kvc-form-field" }, Ut = { class: "kvc-form-label" }, Wt = ["value"], Gt = { class: "kvc-muted" };
873
+ function Kt(t, n, r, s, c, l) {
874
+ return _(), i(e, null, [
875
+ a("fieldset", mt, [
876
+ a("legend", ht, C(s.text("approval")), 1),
877
+ (_(), i(e, null, b(["ask", "auto"], (e) => a("label", {
878
+ key: e,
879
+ class: "kvc-form-radio"
880
+ }, [M(a("input", {
881
+ "onUpdate:modelValue": n[0] ||= (e) => s.draft.approval = e,
882
+ type: "radio",
883
+ name: "kvc-worker-approval",
884
+ value: e,
885
+ "data-test": `worker-approval-${e}`
886
+ }, null, 8, gt), [[D, s.draft.approval]]), o(" " + C(s.text(`approval.${e}`)), 1)])), 64)),
887
+ s.props.approvalProblem === void 0 ? (_(), i("span", vt, C(s.text("approvalHint")), 1)) : (_(), i("span", _t, C(s.kvman.t(s.props.approvalProblem)), 1))
888
+ ]),
889
+ a("label", yt, [
890
+ a("span", bt, C(s.text("minutes")), 1),
891
+ M(a("input", {
892
+ "onUpdate:modelValue": n[1] ||= (e) => s.draft.minutes = e,
893
+ type: "text",
894
+ inputmode: "numeric",
895
+ dir: "ltr",
896
+ class: "kvc-field kvc-mono",
897
+ autocomplete: "off",
898
+ "aria-invalid": s.props.minutesProblem !== void 0,
899
+ "data-test": "worker-minutes"
900
+ }, null, 8, xt), [[k, s.draft.minutes]]),
901
+ s.props.minutesProblem === void 0 ? (_(), i("span", Ct, C(s.text("minutesHint")), 1)) : (_(), i("span", St, C(s.kvman.t(s.props.minutesProblem)), 1))
902
+ ]),
903
+ a("label", wt, [
904
+ a("span", Tt, C(s.text("model")), 1),
905
+ M(a("input", {
906
+ "onUpdate:modelValue": n[2] ||= (e) => s.draft.programModel = e,
907
+ type: "text",
908
+ dir: "ltr",
909
+ class: "kvc-field kvc-mono",
910
+ spellcheck: "false",
911
+ autocomplete: "off",
912
+ "data-test": "worker-program-model"
913
+ }, null, 512), [[k, s.draft.programModel]]),
914
+ a("span", Et, C(s.text("programDefault")), 1)
915
+ ]),
916
+ s.draft.kind === "opencode" ? (_(), i(e, { key: 0 }, [a("label", Dt, [
917
+ a("span", Ot, C(s.text("agent")), 1),
918
+ M(a("input", {
919
+ "onUpdate:modelValue": n[3] ||= (e) => s.draft.agent = e,
920
+ type: "text",
921
+ dir: "ltr",
922
+ class: "kvc-field kvc-mono",
923
+ spellcheck: "false",
924
+ autocomplete: "off",
925
+ "data-test": "worker-agent"
926
+ }, null, 512), [[k, s.draft.agent]]),
927
+ a("span", kt, C(s.text("programDefault")), 1)
928
+ ]), a("label", At, [M(a("input", {
929
+ "onUpdate:modelValue": n[4] ||= (e) => s.draft.autoApprove = e,
930
+ type: "checkbox",
931
+ "data-test": "worker-auto-approve"
932
+ }, null, 512), [[E, s.draft.autoApprove]]), o(" " + C(s.text("autoApprove")), 1)])], 64)) : s.draft.kind === "pi" ? (_(), i(e, { key: 1 }, [a("label", jt, [a("span", Mt, C(s.text("thinking")), 1), M(a("select", {
933
+ "onUpdate:modelValue": n[5] ||= (e) => s.draft.piThinking = e,
934
+ class: "kvc-button",
935
+ "data-test": "worker-pi-thinking"
936
+ }, [a("option", Nt, C(s.text("programDefault")), 1), (_(!0), i(e, null, b(s.piThinking, (e) => (_(), i("option", {
937
+ key: e,
938
+ value: e
939
+ }, C(e), 9, Pt))), 128))], 512), [[O, s.draft.piThinking]])]), a("label", Ft, [
940
+ a("span", It, C(s.text("tools")), 1),
941
+ M(a("textarea", {
942
+ "onUpdate:modelValue": n[6] ||= (e) => s.draft.tools = e,
943
+ dir: "ltr",
944
+ rows: "3",
945
+ class: "kvc-field kvc-mono",
946
+ spellcheck: "false",
947
+ "data-test": "worker-tools"
948
+ }, null, 512), [[k, s.draft.tools]]),
949
+ a("span", Lt, C(s.text("toolsHint")), 1)
950
+ ])], 64)) : (_(), i(e, { key: 2 }, [a("label", Rt, [a("span", zt, C(s.text("effort")), 1), M(a("select", {
951
+ "onUpdate:modelValue": n[7] ||= (e) => s.draft.effort = e,
952
+ class: "kvc-button",
953
+ "data-test": "worker-effort"
954
+ }, [a("option", Bt, C(s.text("programDefault")), 1), (_(!0), i(e, null, b(s.claudeEffort, (e) => (_(), i("option", {
955
+ key: e,
956
+ value: e
957
+ }, C(e), 9, Vt))), 128))], 512), [[O, s.draft.effort]])]), a("label", Ht, [
958
+ a("span", Ut, C(s.text("permissionMode")), 1),
959
+ M(a("select", {
960
+ "onUpdate:modelValue": n[8] ||= (e) => s.draft.permissionMode = e,
961
+ class: "kvc-button",
962
+ "data-test": "worker-permission-mode"
963
+ }, [(_(!0), i(e, null, b(s.permissionModes, (e) => (_(), i("option", {
964
+ key: e,
965
+ value: e
966
+ }, C(e), 9, Wt))), 128))], 512), [[O, s.draft.permissionMode]]),
967
+ a("span", Gt, C(s.text("permissionModeHint")), 1)
968
+ ])], 64))
969
+ ], 64);
970
+ }
971
+ var qt = /*#__PURE__*/ U(pt, [["render", Kt], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/src/WorkerProgramFields.vue"]]), Jt = /*@__PURE__*/ c({
972
+ __name: "WorkerForm",
973
+ props: {
974
+ entry: {
975
+ type: Object,
976
+ required: !1
977
+ },
978
+ taken: {
979
+ type: Array,
980
+ required: !0
981
+ },
982
+ working: {
983
+ type: Boolean,
984
+ required: !0
985
+ }
986
+ },
987
+ emits: ["save", "cancel"],
988
+ setup(e, { expose: n, emit: r }) {
989
+ n();
990
+ let i = e, a = r, o = V(), s = v(Le(i.entry)), c = y({}), l = y([]), u = y([]), d = y([]), f = (e) => o.t(`kvcoder.config.workers.form.${e}`), p = i.entry !== void 0, m = t(() => [...lt.filter((e) => e !== "delegate"), ...d.value]), g = t(() => Ee(l.value, u.value, s.model));
991
+ h(async () => {
992
+ try {
993
+ let [e, t, n] = await Promise.all([
994
+ o.exec("kvai.provider.list", {}),
995
+ o.exec("kvai.model.list", {}),
996
+ o.exec("kvcoder.connector.list", {})
997
+ ]);
998
+ l.value = e, u.value = t, d.value = n.map((e) => e.name);
999
+ } catch (e) {
1000
+ H(o, e);
1001
+ }
1002
+ });
1003
+ function _(e, t) {
1004
+ let n = t.target instanceof HTMLInputElement && t.target.checked;
1005
+ s.connectors = n ? [...s.connectors, e] : s.connectors.filter((t) => t !== e);
1006
+ }
1007
+ function b() {
1008
+ c.value = We(s, i.taken), !(Object.keys(c.value).length > 0) && a("save", Re(s, m.value));
1009
+ }
1010
+ let x = {
1011
+ props: i,
1012
+ emit: a,
1013
+ kvman: o,
1014
+ get draft() {
1015
+ return s;
1016
+ },
1017
+ set draft(e) {
1018
+ s = e;
1019
+ },
1020
+ problems: c,
1021
+ providers: l,
1022
+ models: u,
1023
+ added: d,
1024
+ text: f,
1025
+ editing: p,
1026
+ offered: m,
1027
+ groups: g,
1028
+ tick: _,
1029
+ submit: b,
1030
+ get thinkingLevels() {
1031
+ return Oe;
1032
+ },
1033
+ ModelPicker: ct,
1034
+ get workerKinds() {
1035
+ return Me;
1036
+ },
1037
+ WorkerProgramFields: qt
1038
+ };
1039
+ return Object.defineProperty(x, "__isScriptSetup", {
1040
+ enumerable: !1,
1041
+ value: !0
1042
+ }), x;
1043
+ }
1044
+ }), Yt = {
1045
+ class: "kvc-setting-title",
1046
+ "data-test": "worker-form-title"
1047
+ }, Xt = { class: "kvc-form-field" }, Zt = { class: "kvc-form-label" }, Qt = ["aria-invalid"], $t = {
1048
+ key: 0,
1049
+ class: "kvc-form-error",
1050
+ role: "alert",
1051
+ "data-test": "worker-name-error"
1052
+ }, en = {
1053
+ key: 1,
1054
+ class: "kvc-muted"
1055
+ }, tn = { class: "kvc-form-field" }, nn = { class: "kvc-form-label" }, rn = ["aria-invalid"], an = {
1056
+ key: 0,
1057
+ class: "kvc-form-error",
1058
+ role: "alert",
1059
+ "data-test": "worker-description-error"
1060
+ }, on = {
1061
+ key: 1,
1062
+ class: "kvc-muted"
1063
+ }, sn = { class: "kvc-form-field" }, cn = { class: "kvc-form-label" }, ln = ["value"], un = { class: "kvc-muted" }, dn = { class: "kvc-form-field" }, fn = { class: "kvc-form-label" }, pn = ["aria-invalid"], mn = {
1064
+ key: 0,
1065
+ class: "kvc-form-error",
1066
+ role: "alert",
1067
+ "data-test": "worker-instructions-error"
1068
+ }, hn = {
1069
+ key: 1,
1070
+ class: "kvc-muted"
1071
+ }, gn = { class: "kvc-form-choice" }, _n = { class: "kvc-form-label" }, vn = { class: "kvc-form-radio" }, yn = ["checked"], bn = { class: "kvc-form-radio" }, xn = ["checked"], Sn = [
1072
+ "checked",
1073
+ "data-test",
1074
+ "onChange"
1075
+ ], Cn = {
1076
+ key: 1,
1077
+ class: "kvc-form-error",
1078
+ role: "alert",
1079
+ "data-test": "worker-connectors-error"
1080
+ }, wn = {
1081
+ key: 2,
1082
+ class: "kvc-muted"
1083
+ }, Tn = {
1084
+ class: "kvc-form-field",
1085
+ "data-test": "worker-model"
1086
+ }, En = { class: "kvc-form-label" }, Dn = { class: "kvc-form-field" }, On = { class: "kvc-form-label" }, kn = { value: "" }, An = ["value"], jn = { class: "kvc-actions" }, Mn = ["disabled"], Nn = ["disabled"];
1087
+ function Pn(t, c, l, u, d, f) {
1088
+ return _(), i("form", {
1089
+ class: "kvc-form",
1090
+ novalidate: "",
1091
+ "data-test": "worker-form",
1092
+ onSubmit: P(u.submit, ["prevent"])
1093
+ }, [
1094
+ a("span", Yt, C(u.editing ? u.kvman.t("kvcoder.config.workers.form.titleEdit", { name: u.draft.name }) : u.text("titleNew")), 1),
1095
+ a("label", Xt, [
1096
+ a("span", Zt, C(u.text("name")), 1),
1097
+ M(a("input", {
1098
+ "onUpdate:modelValue": c[0] ||= (e) => u.draft.name = e,
1099
+ type: "text",
1100
+ dir: "ltr",
1101
+ class: "kvc-field kvc-mono",
1102
+ disabled: u.editing,
1103
+ spellcheck: "false",
1104
+ autocomplete: "off",
1105
+ "aria-invalid": u.problems.name !== void 0,
1106
+ "data-test": "worker-name"
1107
+ }, null, 8, Qt), [[k, u.draft.name]]),
1108
+ u.problems.name === void 0 ? (_(), i("span", en, C(u.text("nameHint")), 1)) : (_(), i("span", $t, C(u.kvman.t(u.problems.name)), 1))
1109
+ ]),
1110
+ a("label", tn, [
1111
+ a("span", nn, C(u.text("description")), 1),
1112
+ M(a("input", {
1113
+ "onUpdate:modelValue": c[1] ||= (e) => u.draft.description = e,
1114
+ type: "text",
1115
+ dir: "auto",
1116
+ class: "kvc-field",
1117
+ autocomplete: "off",
1118
+ "aria-invalid": u.problems.description !== void 0,
1119
+ "data-test": "worker-description"
1120
+ }, null, 8, rn), [[k, u.draft.description]]),
1121
+ u.problems.description === void 0 ? (_(), i("span", on, C(u.text("descriptionHint")), 1)) : (_(), i("span", an, C(u.kvman.t(u.problems.description)), 1))
1122
+ ]),
1123
+ a("label", sn, [
1124
+ a("span", cn, C(u.text("kind")), 1),
1125
+ M(a("select", {
1126
+ "onUpdate:modelValue": c[2] ||= (e) => u.draft.kind = e,
1127
+ class: "kvc-button",
1128
+ disabled: u.editing,
1129
+ "data-test": "worker-kind-select"
1130
+ }, [(_(!0), i(e, null, b(u.workerKinds, (e) => (_(), i("option", {
1131
+ key: e,
1132
+ value: e
1133
+ }, C(u.kvman.t(`kvcoder.config.workers.kind.${e}`)), 9, ln))), 128))], 512), [[O, u.draft.kind]]),
1134
+ a("span", un, C(u.text("kindHint")), 1)
1135
+ ]),
1136
+ a("label", dn, [
1137
+ a("span", fn, C(u.text("instructions")), 1),
1138
+ M(a("textarea", {
1139
+ "onUpdate:modelValue": c[3] ||= (e) => u.draft.instructions = e,
1140
+ dir: "auto",
1141
+ rows: "8",
1142
+ class: "kvc-field",
1143
+ "aria-invalid": u.problems.instructions !== void 0,
1144
+ "data-test": "worker-instructions"
1145
+ }, null, 8, pn), [[k, u.draft.instructions]]),
1146
+ u.problems.instructions === void 0 ? (_(), i("span", hn, C(u.text("instructionsHint")), 1)) : (_(), i("span", mn, C(u.kvman.t(u.problems.instructions)), 1))
1147
+ ]),
1148
+ u.draft.kind === "subagent" ? (_(), i(e, { key: 1 }, [
1149
+ a("fieldset", gn, [
1150
+ a("legend", _n, C(u.text("connectors")), 1),
1151
+ a("label", vn, [a("input", {
1152
+ type: "radio",
1153
+ name: "kvc-worker-connectors",
1154
+ checked: u.draft.all,
1155
+ "data-test": "worker-connectors-all",
1156
+ onChange: c[5] ||= (e) => u.draft.all = !0
1157
+ }, null, 40, yn), o(" " + C(u.text("connectors.all")), 1)]),
1158
+ a("label", bn, [a("input", {
1159
+ type: "radio",
1160
+ name: "kvc-worker-connectors",
1161
+ checked: !u.draft.all,
1162
+ "data-test": "worker-connectors-some",
1163
+ onChange: c[6] ||= (e) => u.draft.all = !1
1164
+ }, null, 40, xn), o(" " + C(u.text("connectors.some")), 1)]),
1165
+ u.draft.all ? r("v-if", !0) : (_(!0), i(e, { key: 0 }, b(u.offered, (e) => (_(), i("label", {
1166
+ key: e,
1167
+ class: "kvc-form-radio kvc-mono"
1168
+ }, [a("input", {
1169
+ type: "checkbox",
1170
+ checked: u.draft.connectors.includes(e),
1171
+ "data-test": `worker-connector-${e}`,
1172
+ onChange: (t) => u.tick(e, t)
1173
+ }, null, 40, Sn), o(" " + C(e), 1)]))), 128)),
1174
+ u.problems.connectors === void 0 ? (_(), i("span", wn, C(u.text("connectorsHint")), 1)) : (_(), i("span", Cn, C(u.kvman.t(u.problems.connectors)), 1))
1175
+ ]),
1176
+ a("div", Tn, [a("span", En, C(u.text("model")), 1), s(u.ModelPicker, {
1177
+ groups: u.groups,
1178
+ current: u.draft.model,
1179
+ empty: u.text("sameModel"),
1180
+ none: u.text("sameModel"),
1181
+ onPick: c[7] ||= (e) => u.draft.model = e,
1182
+ onNone: c[8] ||= (e) => u.draft.model = null
1183
+ }, null, 8, [
1184
+ "groups",
1185
+ "current",
1186
+ "empty",
1187
+ "none"
1188
+ ])]),
1189
+ a("label", Dn, [a("span", On, C(u.text("thinking")), 1), M(a("select", {
1190
+ "onUpdate:modelValue": c[9] ||= (e) => u.draft.thinking = e,
1191
+ class: "kvc-button",
1192
+ "data-test": "worker-thinking"
1193
+ }, [a("option", kn, C(u.text("sameThinking")), 1), (_(!0), i(e, null, b(u.thinkingLevels, (e) => (_(), i("option", {
1194
+ key: e,
1195
+ value: e
1196
+ }, C(u.kvman.t(`kvcoder.ui.thinkingLevels.${e}`)), 9, An))), 128))], 512), [[O, u.draft.thinking]])])
1197
+ ], 64)) : (_(), n(u.WorkerProgramFields, {
1198
+ key: 0,
1199
+ draft: u.draft,
1200
+ "onUpdate:draft": c[4] ||= (e) => u.draft = e,
1201
+ "minutes-problem": u.problems.minutes,
1202
+ "approval-problem": u.problems.approval
1203
+ }, null, 8, [
1204
+ "draft",
1205
+ "minutes-problem",
1206
+ "approval-problem"
1207
+ ])),
1208
+ a("div", jn, [a("button", {
1209
+ type: "button",
1210
+ class: "kvc-button",
1211
+ disabled: u.props.working,
1212
+ "data-test": "worker-cancel",
1213
+ onClick: c[10] ||= (e) => u.emit("cancel")
1214
+ }, C(u.kvman.t("kvcoder.config.workers.cancel")), 9, Mn), a("button", {
1215
+ type: "submit",
1216
+ class: "kvc-button kvc-primary",
1217
+ disabled: u.props.working,
1218
+ "data-test": "worker-save"
1219
+ }, C(u.text("save")), 9, Nn)])
1220
+ ], 32);
1221
+ }
1222
+ var Fn = /*#__PURE__*/ U(Jt, [["render", Pn], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/src/WorkerForm.vue"]]), In = /*@__PURE__*/ c({
1223
+ __name: "DelegateWorkers",
1224
+ setup(e, { expose: t }) {
1225
+ t();
1226
+ let n = V(), { workers: r, states: i, locked: a, changed: o, working: s, save: c, remove: l, toggle: u, reset: d, check: f } = Ge(n), p = y(), m = y(), h = (e) => n.t(`${e}.${n.scope.value}`, { name: n.workspace.value.name }), g = (e, t) => n.t(`kvcoder.config.workers.${e}`, { name: t });
1227
+ async function _(e) {
1228
+ await c(e) && (p.value = void 0, n.toast("kvcoder.config.workers.saved", { name: e.name }, "success"));
1229
+ }
1230
+ async function v(e) {
1231
+ await l(e) && n.toast("kvcoder.config.workers.removed", { name: e }, "success"), m.value = void 0;
1232
+ }
1233
+ let b = {
1234
+ kvman: n,
1235
+ workers: r,
1236
+ states: i,
1237
+ locked: a,
1238
+ changed: o,
1239
+ working: s,
1240
+ save: c,
1241
+ remove: l,
1242
+ toggle: u,
1243
+ reset: d,
1244
+ check: f,
1245
+ form: p,
1246
+ removing: m,
1247
+ scoped: h,
1248
+ named: g,
1249
+ saved: _,
1250
+ removed: v,
1251
+ get Pencil() {
1252
+ return ce;
1253
+ },
1254
+ get Plus() {
1255
+ return B;
1256
+ },
1257
+ get Trash2() {
1258
+ return de;
1259
+ },
1260
+ WorkerForm: Fn
1261
+ };
1262
+ return Object.defineProperty(b, "__isScriptSetup", {
1263
+ enumerable: !1,
1264
+ value: !0
1265
+ }), b;
1266
+ }
1267
+ }), Ln = {
1268
+ key: 1,
1269
+ class: "kvc-dialog-rows",
1270
+ "data-test": "workers"
1271
+ }, Rn = { class: "kvc-muted" }, zn = {
1272
+ key: 0,
1273
+ class: "kvc-muted",
1274
+ "data-test": "workers-own-value"
1275
+ }, Bn = {
1276
+ key: 1,
1277
+ class: "kvc-connectors-state"
1278
+ }, Vn = {
1279
+ class: "kvc-chip",
1280
+ "data-test": "workers-changed"
1281
+ }, Hn = ["disabled"], Un = {
1282
+ key: 2,
1283
+ class: "kvc-muted",
1284
+ "data-test": "workers-empty"
1285
+ }, Wn = ["data-test"], Gn = { class: "kvc-connector-text" }, Kn = {
1286
+ class: "kvc-mono kvc-connector-name",
1287
+ "data-test": "worker-name"
1288
+ }, qn = {
1289
+ class: "kvc-muted",
1290
+ dir: "auto",
1291
+ "data-test": "worker-description"
1292
+ }, Jn = {
1293
+ class: "kvc-chip",
1294
+ "data-test": "worker-kind"
1295
+ }, Yn = {
1296
+ key: 0,
1297
+ class: "kvc-server-state",
1298
+ "data-status": "checking",
1299
+ role: "status",
1300
+ "data-test": "worker-state"
1301
+ }, Xn = {
1302
+ key: 1,
1303
+ class: "kvc-server-state",
1304
+ "data-status": "failed",
1305
+ role: "status",
1306
+ "data-test": "worker-state"
1307
+ }, Zn = ["onClick"], Qn = ["aria-label"], $n = { class: "kvc-muted" }, er = ["disabled"], tr = ["disabled", "onClick"], nr = {
1308
+ key: 1,
1309
+ class: "kvc-connector-actions"
1310
+ }, rr = [
1311
+ "disabled",
1312
+ "aria-label",
1313
+ "title",
1314
+ "onClick"
1315
+ ], ir = [
1316
+ "disabled",
1317
+ "aria-label",
1318
+ "title",
1319
+ "onClick"
1320
+ ], ar = [
1321
+ "aria-checked",
1322
+ "aria-label",
1323
+ "disabled",
1324
+ "onClick"
1325
+ ], or = { class: "kvc-actions" }, sr = ["disabled"];
1326
+ function cr(t, c, l, u, d, p) {
1327
+ return u.form === void 0 ? (_(), i("div", Ln, [
1328
+ a("p", Rn, C(u.kvman.t("kvcoder.config.workers.intro")), 1),
1329
+ u.locked ? (_(), i("p", zn, C(u.kvman.t("kvcoder.config.connectors.ownValue", { name: u.kvman.workspace.value.name })), 1)) : u.changed ? (_(), i("div", Bn, [a("span", Vn, C(u.scoped("kvcoder.config.connectors.changed")), 1), a("button", {
1330
+ type: "button",
1331
+ class: "kvc-text-button",
1332
+ disabled: u.working,
1333
+ "data-test": "workers-reset",
1334
+ onClick: c[1] ||= (...e) => u.reset && u.reset(...e)
1335
+ }, C(u.scoped("kvcoder.config.connectors.reset")), 9, Hn)])) : r("v-if", !0),
1336
+ u.workers.length === 0 ? (_(), i("p", Un, C(u.kvman.t("kvcoder.config.workers.empty")), 1)) : r("v-if", !0),
1337
+ (_(!0), i(e, null, b(u.workers, (e) => (_(), i("div", {
1338
+ key: e.name,
1339
+ class: "kvc-connector",
1340
+ "data-test": `worker-${e.name}`
1341
+ }, [a("span", Gn, [
1342
+ a("span", Kn, C(e.name), 1),
1343
+ a("span", qn, C(e.description), 1),
1344
+ a("span", null, [a("span", Jn, C(u.kvman.t(`kvcoder.config.workers.kind.${e.kind}`)), 1)]),
1345
+ u.states[e.name] === "checking" ? (_(), i("span", Yn, C(u.kvman.t("kvcoder.config.workers.checking")), 1)) : u.states[e.name] === "notFound" ? (_(), i("span", Xn, [o(C(u.kvman.t("kvcoder.config.workers.notFound", { program: e.kind })) + " ", 1), a("button", {
1346
+ type: "button",
1347
+ class: "kvc-text-button",
1348
+ "data-test": "worker-check",
1349
+ onClick: (t) => u.check(e.name)
1350
+ }, C(u.kvman.t("kvcoder.config.workers.recheck")), 9, Zn)])) : r("v-if", !0)
1351
+ ]), u.removing === e.name ? (_(), i("span", {
1352
+ key: 0,
1353
+ class: "kvc-connector-actions",
1354
+ role: "alertdialog",
1355
+ "aria-label": u.named("removeConfirm", e.name),
1356
+ "data-test": "worker-remove-confirm"
1357
+ }, [
1358
+ a("span", $n, C(u.named("removeConfirm", e.name)), 1),
1359
+ a("button", {
1360
+ type: "button",
1361
+ class: "kvc-button",
1362
+ disabled: u.working,
1363
+ "data-test": "worker-remove-cancel",
1364
+ onClick: c[2] ||= (e) => u.removing = void 0
1365
+ }, C(u.kvman.t("kvcoder.config.workers.cancel")), 9, er),
1366
+ a("button", {
1367
+ type: "button",
1368
+ class: "kvc-button kvc-danger",
1369
+ disabled: u.working,
1370
+ "data-test": "worker-remove-yes",
1371
+ onClick: (t) => u.removed(e.name)
1372
+ }, C(u.kvman.t("kvcoder.config.workers.removeYes")), 9, tr)
1373
+ ], 8, Qn)) : (_(), i("span", nr, [
1374
+ a("button", {
1375
+ type: "button",
1376
+ class: "kvc-button kvc-ghost kvc-icon-button",
1377
+ disabled: u.locked || u.working,
1378
+ "aria-label": u.named("edit", e.name),
1379
+ title: u.named("edit", e.name),
1380
+ "data-test": "worker-edit",
1381
+ onClick: (t) => u.form = { entry: e }
1382
+ }, [s(u.Pencil, {
1383
+ size: 16,
1384
+ "aria-hidden": "true"
1385
+ })], 8, rr),
1386
+ a("button", {
1387
+ type: "button",
1388
+ class: "kvc-button kvc-ghost kvc-icon-button",
1389
+ disabled: u.locked || u.working,
1390
+ "aria-label": u.named("remove", e.name),
1391
+ title: u.named("remove", e.name),
1392
+ "data-test": "worker-remove",
1393
+ onClick: (t) => u.removing = e.name
1394
+ }, [s(u.Trash2, {
1395
+ size: 16,
1396
+ "aria-hidden": "true"
1397
+ })], 8, ir),
1398
+ a("button", {
1399
+ type: "button",
1400
+ role: "switch",
1401
+ class: "kvc-switch",
1402
+ "aria-checked": e.enabled,
1403
+ "aria-label": u.named("use", e.name),
1404
+ disabled: u.locked || u.working,
1405
+ "data-test": "worker-switch",
1406
+ onClick: (t) => u.toggle(e.name)
1407
+ }, [...c[4] ||= [a("span", {
1408
+ class: "kvc-switch-knob",
1409
+ "aria-hidden": "true"
1410
+ }, null, -1)]], 8, ar)
1411
+ ]))], 8, Wn))), 128)),
1412
+ a("div", or, [a("button", {
1413
+ type: "button",
1414
+ class: "kvc-button kvc-primary",
1415
+ disabled: u.locked || u.working,
1416
+ "data-test": "worker-add",
1417
+ onClick: c[3] ||= (e) => u.form = {}
1418
+ }, [s(u.Plus, {
1419
+ size: 16,
1420
+ "aria-hidden": "true"
1421
+ }), o(C(u.kvman.t("kvcoder.config.workers.add")), 1)], 8, sr)])
1422
+ ])) : (_(), n(u.WorkerForm, f({ key: 0 }, u.form.entry === void 0 ? {} : { entry: u.form.entry }, {
1423
+ taken: u.workers.filter((e) => e.name !== u.form?.entry?.name).map((e) => e.name),
1424
+ working: u.working,
1425
+ onSave: u.saved,
1426
+ onCancel: c[0] ||= (e) => u.form = void 0
1427
+ }), null, 16, ["taken", "working"]));
1428
+ }
1429
+ var lr = /*#__PURE__*/ U(In, [["render", cr], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/src/DelegateWorkers.vue"]]), X = "@kvman/kvcoder", Z = (e) => Array.isArray(e) && e.every((e) => typeof e == "string");
1430
+ function ur(e) {
1431
+ return typeof e != "object" || !e || !("name" in e) || !("description" in e) || typeof e.name != "string" || typeof e.description != "string" ? !1 : "command" in e ? typeof e.command == "string" && "args" in e && Z(e.args) && "env" in e && Z(e.env) : "url" in e && typeof e.url == "string" && "headers" in e && Z(e.headers);
1432
+ }
1433
+ var dr = (e) => Array.isArray(e) ? e.filter(ur) : [], Q = (e, t, n) => `mcp.${e}.${t}.${n}`, $ = (e) => `mcp.${e}.`, fr = (e) => e.kind === "command" ? "env" : "header";
1434
+ function pr(e, t) {
1435
+ if (e === void 0) return {
1436
+ name: "",
1437
+ description: "",
1438
+ kind: "command",
1439
+ command: "",
1440
+ args: "",
1441
+ url: "",
1442
+ values: []
1443
+ };
1444
+ let [n, r] = "command" in e ? ["env", e.env] : ["header", e.headers], i = r.map((r) => ({
1445
+ name: r,
1446
+ value: "",
1447
+ set: t.includes(Q(e.name, n, r)),
1448
+ replacing: !1
1449
+ }));
1450
+ return "command" in e ? {
1451
+ name: e.name,
1452
+ description: e.description,
1453
+ kind: "command",
1454
+ command: e.command,
1455
+ args: e.args.join("\n"),
1456
+ url: "",
1457
+ values: i
1458
+ } : {
1459
+ name: e.name,
1460
+ description: e.description,
1461
+ kind: "url",
1462
+ command: "",
1463
+ args: "",
1464
+ url: e.url,
1465
+ values: i
1466
+ };
1467
+ }
1468
+ function mr(e) {
1469
+ let t = {
1470
+ name: e.name.trim(),
1471
+ description: e.description.trim()
1472
+ }, n = e.values.map((e) => e.name.trim());
1473
+ return e.kind === "url" ? {
1474
+ ...t,
1475
+ url: e.url.trim(),
1476
+ headers: n
1477
+ } : {
1478
+ ...t,
1479
+ command: e.command.trim(),
1480
+ args: e.args.split("\n").filter((e) => e !== ""),
1481
+ env: n
1482
+ };
1483
+ }
1484
+ var hr = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/, gr = {
1485
+ env: /^[A-Za-z_][A-Za-z0-9_]*$/,
1486
+ header: /^[A-Za-z0-9!#$%&'*+.^_`|~-]+$/
1487
+ }, _r = (e) => URL.canParse(e) && ["http:", "https:"].includes(new URL(e).protocol);
1488
+ function vr(e) {
1489
+ let t = fr(e), n = e.values.map((e) => e.name.trim());
1490
+ return n.some((e) => !gr[t].test(e)) ? `kvcoder.config.mcp.invalid.valueName.${t}` : new Set(n).size === n.length ? e.values.some((e) => (!e.set || e.replacing) && e.value === "") ? "kvcoder.config.mcp.invalid.valueEmpty" : void 0 : "kvcoder.config.mcp.invalid.valueRepeated";
1491
+ }
1492
+ function yr(e, t) {
1493
+ let n = e.name.trim(), r = {};
1494
+ n === "" ? r.name = "kvcoder.config.mcp.invalid.nameEmpty" : hr.test(n) ? t.includes(n) && (r.name = "kvcoder.config.mcp.invalid.nameTaken") : r.name = "kvcoder.config.mcp.invalid.nameShape", e.description.trim() === "" && (r.description = "kvcoder.config.mcp.invalid.descriptionEmpty"), e.kind === "command" && e.command.trim() === "" && (r.command = "kvcoder.config.mcp.invalid.commandEmpty"), e.kind === "url" && !_r(e.url.trim()) && (r.url = "kvcoder.config.mcp.invalid.url");
1495
+ let i = vr(e);
1496
+ return i !== void 0 && (r.values = i), r;
1497
+ }
1498
+ function br(e, t, n) {
1499
+ let r = e.name.trim(), i = fr(e), a = new Set(e.values.map((e) => Q(r, i, e.name.trim())));
1500
+ return {
1501
+ set: Object.fromEntries(e.values.filter((e) => !e.set || e.replacing).map((e) => [Q(r, i, e.name.trim()), e.value])),
1502
+ remove: (t === void 0 ? [] : n.filter((e) => e.startsWith(`${$(r)}env.`) || e.startsWith(`${$(r)}header.`))).filter((e) => !a.has(e))
1503
+ };
1504
+ }
1505
+ //#endregion
1506
+ //#region web/src/McpServerForm.vue?vue&type=script&setup=true&lang.ts
1507
+ var xr = /*@__PURE__*/ c({
1508
+ __name: "McpServerForm",
1509
+ props: {
1510
+ entry: {
1511
+ type: Object,
1512
+ required: !1
1513
+ },
1514
+ taken: {
1515
+ type: Array,
1516
+ required: !0
1517
+ },
1518
+ secrets: {
1519
+ type: Array,
1520
+ required: !0
1521
+ },
1522
+ working: {
1523
+ type: Boolean,
1524
+ required: !0
1525
+ }
1526
+ },
1527
+ emits: ["save", "cancel"],
1528
+ setup(e, { expose: n, emit: r }) {
1529
+ n();
1530
+ let i = e, a = r, o = V(), s = v(pr(i.entry, i.secrets)), c = y({}), l = t(() => fr(s)), u = (e) => o.t(`kvcoder.config.mcp.form.${e}`), d = i.entry !== void 0;
1531
+ function f() {
1532
+ c.value = yr(s, i.taken), !(Object.keys(c.value).length > 0) && a("save", mr(s), br(s, i.entry, i.secrets));
1533
+ }
1534
+ function p(e) {
1535
+ s.kind !== e && (s.kind = e, s.values = []);
1536
+ }
1537
+ let m = {
1538
+ props: i,
1539
+ emit: a,
1540
+ kvman: o,
1541
+ draft: s,
1542
+ problems: c,
1543
+ kind: l,
1544
+ text: u,
1545
+ editing: d,
1546
+ submit: f,
1547
+ runAs: p,
1548
+ get Plus() {
1549
+ return B;
1550
+ },
1551
+ get X() {
1552
+ return fe;
1553
+ }
1554
+ };
1555
+ return Object.defineProperty(m, "__isScriptSetup", {
1556
+ enumerable: !1,
1557
+ value: !0
1558
+ }), m;
1559
+ }
1560
+ }), Sr = {
1561
+ class: "kvc-setting-title",
1562
+ "data-test": "mcp-form-title"
1563
+ }, Cr = { class: "kvc-form-field" }, wr = { class: "kvc-form-label" }, Tr = ["aria-invalid"], Er = {
1564
+ key: 0,
1565
+ class: "kvc-form-error",
1566
+ role: "alert",
1567
+ "data-test": "mcp-name-error"
1568
+ }, Dr = {
1569
+ key: 1,
1570
+ class: "kvc-muted"
1571
+ }, Or = { class: "kvc-form-field" }, kr = { class: "kvc-form-label" }, Ar = ["aria-invalid"], jr = {
1572
+ key: 0,
1573
+ class: "kvc-form-error",
1574
+ role: "alert",
1575
+ "data-test": "mcp-description-error"
1576
+ }, Mr = {
1577
+ key: 1,
1578
+ class: "kvc-muted"
1579
+ }, Nr = { class: "kvc-form-choice" }, Pr = { class: "kvc-form-label" }, Fr = [
1580
+ "value",
1581
+ "checked",
1582
+ "data-test",
1583
+ "onChange"
1584
+ ], Ir = { class: "kvc-form-field" }, Lr = { class: "kvc-form-label" }, Rr = ["aria-invalid"], zr = {
1585
+ key: 0,
1586
+ class: "kvc-form-error",
1587
+ role: "alert",
1588
+ "data-test": "mcp-command-error"
1589
+ }, Br = {
1590
+ key: 1,
1591
+ class: "kvc-muted"
1592
+ }, Vr = { class: "kvc-form-field" }, Hr = { class: "kvc-form-label" }, Ur = { class: "kvc-muted" }, Wr = {
1593
+ key: 1,
1594
+ class: "kvc-form-field"
1595
+ }, Gr = { class: "kvc-form-label" }, Kr = ["aria-invalid"], qr = {
1596
+ key: 0,
1597
+ class: "kvc-form-error",
1598
+ role: "alert",
1599
+ "data-test": "mcp-url-error"
1600
+ }, Jr = {
1601
+ class: "kvc-form-field",
1602
+ "data-test": "mcp-values"
1603
+ }, Yr = { class: "kvc-form-label" }, Xr = { class: "kvc-muted" }, Zr = [
1604
+ "onUpdate:modelValue",
1605
+ "disabled",
1606
+ "placeholder",
1607
+ "aria-label"
1608
+ ], Qr = {
1609
+ key: 0,
1610
+ class: "kvc-form-set"
1611
+ }, $r = {
1612
+ class: "kvc-chip",
1613
+ "data-test": "mcp-value-set"
1614
+ }, ei = ["onClick"], ti = [
1615
+ "onUpdate:modelValue",
1616
+ "placeholder",
1617
+ "aria-label"
1618
+ ], ni = ["aria-label", "onClick"], ri = {
1619
+ key: 0,
1620
+ class: "kvc-form-error",
1621
+ role: "alert",
1622
+ "data-test": "mcp-values-error"
1623
+ }, ii = { class: "kvc-actions" }, ai = ["disabled"], oi = ["disabled"];
1624
+ function si(t, n, c, l, u, d) {
1625
+ return _(), i("form", {
1626
+ class: "kvc-form",
1627
+ novalidate: "",
1628
+ "data-test": "mcp-form",
1629
+ onSubmit: P(l.submit, ["prevent"])
1630
+ }, [
1631
+ a("span", Sr, C(l.editing ? l.kvman.t("kvcoder.config.mcp.form.titleEdit", { name: l.draft.name }) : l.text("titleNew")), 1),
1632
+ a("label", Cr, [
1633
+ a("span", wr, C(l.text("name")), 1),
1634
+ M(a("input", {
1635
+ "onUpdate:modelValue": n[0] ||= (e) => l.draft.name = e,
1636
+ type: "text",
1637
+ dir: "ltr",
1638
+ class: "kvc-field kvc-mono",
1639
+ disabled: l.editing,
1640
+ spellcheck: "false",
1641
+ autocomplete: "off",
1642
+ "aria-invalid": l.problems.name !== void 0,
1643
+ "data-test": "mcp-name"
1644
+ }, null, 8, Tr), [[k, l.draft.name]]),
1645
+ l.problems.name === void 0 ? (_(), i("span", Dr, C(l.text("nameHint")), 1)) : (_(), i("span", Er, C(l.kvman.t(l.problems.name)), 1))
1646
+ ]),
1647
+ a("label", Or, [
1648
+ a("span", kr, C(l.text("description")), 1),
1649
+ M(a("input", {
1650
+ "onUpdate:modelValue": n[1] ||= (e) => l.draft.description = e,
1651
+ type: "text",
1652
+ dir: "auto",
1653
+ class: "kvc-field",
1654
+ autocomplete: "off",
1655
+ "aria-invalid": l.problems.description !== void 0,
1656
+ "data-test": "mcp-description"
1657
+ }, null, 8, Ar), [[k, l.draft.description]]),
1658
+ l.problems.description === void 0 ? (_(), i("span", Mr, C(l.text("descriptionHint")), 1)) : (_(), i("span", jr, C(l.kvman.t(l.problems.description)), 1))
1659
+ ]),
1660
+ a("fieldset", Nr, [a("legend", Pr, C(l.text("kind")), 1), (_(), i(e, null, b(["command", "url"], (e) => a("label", {
1661
+ key: e,
1662
+ class: "kvc-form-radio"
1663
+ }, [a("input", {
1664
+ type: "radio",
1665
+ name: "kvc-mcp-kind",
1666
+ value: e,
1667
+ checked: l.draft.kind === e,
1668
+ "data-test": `mcp-kind-${e}`,
1669
+ onChange: (t) => l.runAs(e)
1670
+ }, null, 40, Fr), o(" " + C(l.text(`kind.${e}`)), 1)])), 64))]),
1671
+ l.draft.kind === "command" ? (_(), i(e, { key: 0 }, [a("label", Ir, [
1672
+ a("span", Lr, C(l.text("command")), 1),
1673
+ M(a("input", {
1674
+ "onUpdate:modelValue": n[2] ||= (e) => l.draft.command = e,
1675
+ type: "text",
1676
+ dir: "ltr",
1677
+ class: "kvc-field kvc-mono",
1678
+ spellcheck: "false",
1679
+ autocomplete: "off",
1680
+ "aria-invalid": l.problems.command !== void 0,
1681
+ "data-test": "mcp-command"
1682
+ }, null, 8, Rr), [[k, l.draft.command]]),
1683
+ l.problems.command === void 0 ? (_(), i("span", Br, C(l.text("commandHint")), 1)) : (_(), i("span", zr, C(l.kvman.t(l.problems.command)), 1))
1684
+ ]), a("label", Vr, [
1685
+ a("span", Hr, C(l.text("args")), 1),
1686
+ M(a("textarea", {
1687
+ "onUpdate:modelValue": n[3] ||= (e) => l.draft.args = e,
1688
+ dir: "ltr",
1689
+ rows: "3",
1690
+ class: "kvc-field kvc-mono",
1691
+ spellcheck: "false",
1692
+ "data-test": "mcp-args"
1693
+ }, null, 512), [[k, l.draft.args]]),
1694
+ a("span", Ur, C(l.text("argsHint")), 1)
1695
+ ])], 64)) : (_(), i("label", Wr, [
1696
+ a("span", Gr, C(l.text("url")), 1),
1697
+ M(a("input", {
1698
+ "onUpdate:modelValue": n[4] ||= (e) => l.draft.url = e,
1699
+ type: "url",
1700
+ dir: "ltr",
1701
+ class: "kvc-field kvc-mono",
1702
+ spellcheck: "false",
1703
+ autocomplete: "off",
1704
+ placeholder: "https://",
1705
+ "aria-invalid": l.problems.url !== void 0,
1706
+ "data-test": "mcp-url"
1707
+ }, null, 8, Kr), [[k, l.draft.url]]),
1708
+ l.problems.url === void 0 ? r("v-if", !0) : (_(), i("span", qr, C(l.kvman.t(l.problems.url)), 1))
1709
+ ])),
1710
+ a("div", Jr, [
1711
+ a("span", Yr, C(l.text(l.kind)), 1),
1712
+ a("span", Xr, C(l.text("secretsHint")), 1),
1713
+ (_(!0), i(e, null, b(l.draft.values, (e, t) => (_(), i("div", {
1714
+ key: t,
1715
+ class: "kvc-form-value",
1716
+ "data-test": "mcp-value"
1717
+ }, [
1718
+ M(a("input", {
1719
+ "onUpdate:modelValue": (t) => e.name = t,
1720
+ type: "text",
1721
+ dir: "ltr",
1722
+ class: "kvc-field kvc-mono",
1723
+ disabled: e.set,
1724
+ placeholder: l.text(`valueName.${l.kind}`),
1725
+ "aria-label": l.text(`valueName.${l.kind}`),
1726
+ spellcheck: "false",
1727
+ autocomplete: "off",
1728
+ "data-test": "mcp-value-name"
1729
+ }, null, 8, Zr), [[k, e.name]]),
1730
+ e.set && !e.replacing ? (_(), i("span", Qr, [a("span", $r, C(l.text("set")), 1), a("button", {
1731
+ type: "button",
1732
+ class: "kvc-text-button",
1733
+ "data-test": "mcp-value-replace",
1734
+ onClick: (t) => e.replacing = !0
1735
+ }, C(l.text("replace")), 9, ei)])) : M((_(), i("input", {
1736
+ key: 1,
1737
+ "onUpdate:modelValue": (t) => e.value = t,
1738
+ type: "password",
1739
+ autocomplete: "off",
1740
+ class: "kvc-field",
1741
+ placeholder: l.text("value"),
1742
+ "aria-label": l.kvman.t("kvcoder.config.mcp.form.valueOf", { name: e.name }),
1743
+ "data-test": "mcp-value-secret"
1744
+ }, null, 8, ti)), [[k, e.value]]),
1745
+ a("button", {
1746
+ type: "button",
1747
+ class: "kvc-button kvc-ghost kvc-icon-button",
1748
+ "aria-label": l.kvman.t("kvcoder.config.mcp.form.removeValue", { name: e.name }),
1749
+ "data-test": "mcp-value-remove",
1750
+ onClick: (e) => l.draft.values.splice(t, 1)
1751
+ }, [s(l.X, {
1752
+ size: 16,
1753
+ "aria-hidden": "true"
1754
+ })], 8, ni)
1755
+ ]))), 128)),
1756
+ l.problems.values === void 0 ? r("v-if", !0) : (_(), i("span", ri, C(l.kvman.t(l.problems.values)), 1)),
1757
+ a("button", {
1758
+ type: "button",
1759
+ class: "kvc-text-button kvc-form-add",
1760
+ "data-test": "mcp-value-add",
1761
+ onClick: n[5] ||= (e) => l.draft.values.push({
1762
+ name: "",
1763
+ value: "",
1764
+ set: !1,
1765
+ replacing: !1
1766
+ })
1767
+ }, [s(l.Plus, {
1768
+ size: 14,
1769
+ "aria-hidden": "true"
1770
+ }), o(C(l.text(`add.${l.kind}`)), 1)])
1771
+ ]),
1772
+ a("div", ii, [a("button", {
1773
+ type: "button",
1774
+ class: "kvc-button",
1775
+ disabled: l.props.working,
1776
+ "data-test": "mcp-cancel",
1777
+ onClick: n[6] ||= (e) => l.emit("cancel")
1778
+ }, C(l.kvman.t("kvcoder.config.mcp.cancel")), 9, ai), a("button", {
1779
+ type: "submit",
1780
+ class: "kvc-button kvc-primary",
1781
+ disabled: l.props.working,
1782
+ "data-test": "mcp-save"
1783
+ }, C(l.text("save")), 9, oi)])
1784
+ ], 32);
1785
+ }
1786
+ var ci = /*#__PURE__*/ U(xr, [["render", si], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/src/McpServerForm.vue"]]);
1787
+ //#endregion
1788
+ //#region web/src/use-mcp-servers.ts
1789
+ function li(e) {
1790
+ let n = W(e, "kvcoder.mcp.servers"), r = t(() => dr(n.value.value)), i = y({}), a = y([]), o = y(!1), s = /* @__PURE__ */ new Set(), c = async () => {
1791
+ a.value = (await e.exec("kernel.secrets.list", {})).filter((e) => e.extension === X).map((e) => e.name);
1792
+ };
1793
+ async function l(t) {
1794
+ i.value = {
1795
+ ...i.value,
1796
+ [t]: { status: "checking" }
1797
+ };
1798
+ let n;
1799
+ try {
1800
+ let r = await e.exec("kvcoder.mcp.server.check", { name: t });
1801
+ n = r.status === "failed" ? {
1802
+ status: "failed",
1803
+ problem: {
1804
+ code: r.problem.code,
1805
+ params: ge(r.problem.params)
1806
+ }
1807
+ } : r;
1808
+ } catch (e) {
1809
+ n = {
1810
+ status: "failed",
1811
+ problem: he(e)
1812
+ };
1813
+ }
1814
+ i.value = {
1815
+ ...i.value,
1816
+ [t]: n
1817
+ };
1818
+ }
1819
+ let u = () => Promise.all(r.value.map((e) => l(e.name)));
1820
+ async function d(t) {
1821
+ o.value = !0;
1822
+ try {
1823
+ return await t();
1824
+ } catch (t) {
1825
+ return H(e, t), !1;
1826
+ } finally {
1827
+ o.value = !1;
1828
+ }
1829
+ }
1830
+ let f = async (t) => {
1831
+ for (let n of t) await e.exec("kernel.secrets.delete", {
1832
+ extension: X,
1833
+ name: n
1834
+ });
1835
+ }, p = (t, i) => d(async () => {
1836
+ let a = r.value.filter((e) => e.name !== t.name), o = r.value.findIndex((e) => e.name === t.name), u = o < 0 ? [...a, t] : [
1837
+ ...r.value.slice(0, o),
1838
+ t,
1839
+ ...r.value.slice(o + 1)
1840
+ ];
1841
+ s.add(t.name);
1842
+ try {
1843
+ if (!await n.set(u)) return !1;
1844
+ for (let [t, n] of Object.entries(i.set)) await e.exec("kernel.secrets.set", {
1845
+ extension: X,
1846
+ name: t,
1847
+ value: n
1848
+ });
1849
+ await f(i.remove), await c();
1850
+ } finally {
1851
+ s.delete(t.name);
1852
+ }
1853
+ return l(t.name), !0;
1854
+ });
1855
+ async function m(t) {
1856
+ let n;
1857
+ if (await d(async () => (n = (await e.exec("kvcoder.mcp.sign-in.start", {
1858
+ name: t,
1859
+ redirectUrl: `${window.location.origin}/kvcoder/mcp-sign-in`
1860
+ })).url, !0)), n === void 0) return "failed";
1861
+ let r = window.open(n, "_blank");
1862
+ return r === null ? "blocked" : (r.opener = null, "opened");
1863
+ }
1864
+ let _ = (e) => d(async () => (await f(a.value.filter((t) => t.startsWith(`${$(e)}oauth.`))), await c(), l(e), !0)), v = (e) => a.value.includes(`${$(e)}oauth.tokens`);
1865
+ async function b() {
1866
+ let e = r.value.filter((e) => i.value[e.name]?.status === "signInNeeded");
1867
+ if (e.length !== 0) {
1868
+ await c();
1869
+ for (let t of e) l(t.name);
1870
+ }
1871
+ }
1872
+ return h(async () => {
1873
+ window.addEventListener("focus", b);
1874
+ try {
1875
+ await c();
1876
+ } catch (t) {
1877
+ H(e, t);
1878
+ }
1879
+ }), A(r, (e, t) => {
1880
+ let n = new Set((t ?? []).map((e) => e.name));
1881
+ for (let t of e) !s.has(t.name) && (!n.has(t.name) || !(t.name in i.value)) && l(t.name);
1882
+ }), g(() => window.removeEventListener("focus", b)), A(() => e.workspace.value.id, u), {
1883
+ servers: r,
1884
+ states: i,
1885
+ secrets: a,
1886
+ locked: n.locked,
1887
+ changed: n.changed,
1888
+ working: t(() => o.value || n.saving.value),
1889
+ save: p,
1890
+ remove: (e) => d(async () => await n.set(r.value.filter((t) => t.name !== e)) ? (await f(a.value.filter((t) => t.startsWith($(e)))), await c(), !0) : !1),
1891
+ reset: n.reset,
1892
+ check: l,
1893
+ signIn: m,
1894
+ signOut: _,
1895
+ signedIn: v
1896
+ };
1897
+ }
1898
+ //#endregion
1899
+ //#region web/src/McpServers.vue?vue&type=script&setup=true&lang.ts
1900
+ var ui = /*@__PURE__*/ c({
1901
+ __name: "McpServers",
1902
+ setup(e, { expose: t }) {
1903
+ t();
1904
+ let n = V(), { servers: r, states: i, secrets: a, locked: o, changed: s, working: c, save: l, remove: u, reset: d, check: f, signIn: p, signOut: m, signedIn: h } = li(n), g = y(), _ = y(), v = (e) => n.t(`${e}.${n.scope.value}`, { name: n.workspace.value.name }), b = (e) => i.value[e] ?? { status: "checking" };
1905
+ function x(e) {
1906
+ return e.status === "ready" ? n.t("kvcoder.config.mcp.ready", { count: e.tools }) : n.t(`kvcoder.config.mcp.${e.status}`);
1907
+ }
1908
+ let S = (e) => e.status === "failed" && e.problem !== void 0 ? n.t(me(e.problem.code), e.problem.params) : void 0;
1909
+ async function C(e, t) {
1910
+ await l(e, t) && (g.value = void 0, n.toast("kvcoder.config.mcp.saved", { name: e.name }, "success"));
1911
+ }
1912
+ async function w(e) {
1913
+ await p(e) === "blocked" && n.toast("kvcoder.config.mcp.signIn.blocked", {}, "warning");
1914
+ }
1915
+ async function T(e) {
1916
+ await u(e) && n.toast("kvcoder.config.mcp.removed", { name: e }, "success"), _.value = void 0;
1917
+ }
1918
+ let E = {
1919
+ kvman: n,
1920
+ servers: r,
1921
+ states: i,
1922
+ secrets: a,
1923
+ locked: o,
1924
+ changed: s,
1925
+ working: c,
1926
+ save: l,
1927
+ remove: u,
1928
+ reset: d,
1929
+ check: f,
1930
+ signIn: p,
1931
+ signOut: m,
1932
+ signedIn: h,
1933
+ form: g,
1934
+ removing: _,
1935
+ scoped: v,
1936
+ stateOf: b,
1937
+ stateText: x,
1938
+ reason: S,
1939
+ saved: C,
1940
+ startSignIn: w,
1941
+ removed: T,
1942
+ get Pencil() {
1943
+ return ce;
1944
+ },
1945
+ get Plus() {
1946
+ return B;
1947
+ },
1948
+ get Trash2() {
1949
+ return de;
1950
+ },
1951
+ McpServerForm: ci
1952
+ };
1953
+ return Object.defineProperty(E, "__isScriptSetup", {
1954
+ enumerable: !1,
1955
+ value: !0
1956
+ }), E;
1957
+ }
1958
+ }), di = {
1959
+ key: 1,
1960
+ class: "kvc-dialog-rows",
1961
+ "data-test": "mcp-servers"
1962
+ }, fi = { class: "kvc-muted" }, pi = {
1963
+ key: 0,
1964
+ class: "kvc-muted",
1965
+ "data-test": "mcp-own-value"
1966
+ }, mi = {
1967
+ key: 1,
1968
+ class: "kvc-connectors-state"
1969
+ }, hi = {
1970
+ class: "kvc-chip",
1971
+ "data-test": "mcp-changed"
1972
+ }, gi = ["disabled"], _i = {
1973
+ key: 2,
1974
+ class: "kvc-muted",
1975
+ "data-test": "mcp-empty"
1976
+ }, vi = ["data-test"], yi = { class: "kvc-connector-text" }, bi = {
1977
+ class: "kvc-mono kvc-connector-name",
1978
+ "data-test": "mcp-server-name"
1979
+ }, xi = {
1980
+ class: "kvc-muted",
1981
+ dir: "auto",
1982
+ "data-test": "mcp-server-description"
1983
+ }, Si = ["data-status"], Ci = ["onClick"], wi = ["disabled", "onClick"], Ti = ["disabled", "onClick"], Ei = {
1984
+ key: 1,
1985
+ class: "kvc-muted kvc-server-reason",
1986
+ dir: "auto",
1987
+ "data-test": "mcp-server-reason"
1988
+ }, Di = ["aria-label"], Oi = { class: "kvc-muted" }, ki = ["disabled"], Ai = ["disabled", "onClick"], ji = {
1989
+ key: 1,
1990
+ class: "kvc-connector-actions"
1991
+ }, Mi = [
1992
+ "disabled",
1993
+ "aria-label",
1994
+ "title",
1995
+ "onClick"
1996
+ ], Ni = [
1997
+ "disabled",
1998
+ "aria-label",
1999
+ "title",
2000
+ "onClick"
2001
+ ], Pi = { class: "kvc-actions" }, Fi = ["disabled"];
2002
+ function Ii(t, c, l, u, d, p) {
2003
+ return u.form === void 0 ? (_(), i("div", di, [
2004
+ a("p", fi, C(u.kvman.t("kvcoder.config.mcp.intro")), 1),
2005
+ u.locked ? (_(), i("p", pi, C(u.kvman.t("kvcoder.config.connectors.ownValue", { name: u.kvman.workspace.value.name })), 1)) : u.changed ? (_(), i("div", mi, [a("span", hi, C(u.scoped("kvcoder.config.connectors.changed")), 1), a("button", {
2006
+ type: "button",
2007
+ class: "kvc-text-button",
2008
+ disabled: u.working,
2009
+ "data-test": "mcp-reset",
2010
+ onClick: c[1] ||= (...e) => u.reset && u.reset(...e)
2011
+ }, C(u.scoped("kvcoder.config.connectors.reset")), 9, gi)])) : r("v-if", !0),
2012
+ u.servers.length === 0 ? (_(), i("p", _i, C(u.kvman.t("kvcoder.config.mcp.empty")), 1)) : r("v-if", !0),
2013
+ (_(!0), i(e, null, b(u.servers, (e) => (_(), i("div", {
2014
+ key: e.name,
2015
+ class: "kvc-connector kvc-server",
2016
+ "data-test": `mcp-server-${e.name}`
2017
+ }, [a("span", yi, [
2018
+ a("span", bi, C(e.name), 1),
2019
+ a("span", xi, C(e.description), 1),
2020
+ a("span", {
2021
+ class: "kvc-server-state",
2022
+ "data-status": u.stateOf(e.name).status,
2023
+ role: "status",
2024
+ "data-test": "mcp-server-state"
2025
+ }, [
2026
+ o(C(u.stateText(u.stateOf(e.name))) + " ", 1),
2027
+ u.stateOf(e.name).status === "checking" ? r("v-if", !0) : (_(), i("button", {
2028
+ key: 0,
2029
+ type: "button",
2030
+ class: "kvc-text-button",
2031
+ "data-test": "mcp-server-check",
2032
+ onClick: (t) => u.check(e.name)
2033
+ }, C(u.kvman.t("kvcoder.config.mcp.recheck")), 9, Ci)),
2034
+ "url" in e && u.signedIn(e.name) ? (_(), i("button", {
2035
+ key: 1,
2036
+ type: "button",
2037
+ class: "kvc-text-button",
2038
+ disabled: u.working,
2039
+ "data-test": "mcp-server-sign-out",
2040
+ onClick: (t) => u.signOut(e.name)
2041
+ }, C(u.kvman.t("kvcoder.config.mcp.signOut")), 9, wi)) : r("v-if", !0)
2042
+ ], 8, Si),
2043
+ "url" in e && u.stateOf(e.name).status === "signInNeeded" ? (_(), i("button", {
2044
+ key: 0,
2045
+ type: "button",
2046
+ class: "kvc-button kvc-primary kvc-server-sign-in",
2047
+ disabled: u.working,
2048
+ "data-test": "mcp-server-sign-in",
2049
+ onClick: (t) => u.startSignIn(e.name)
2050
+ }, C(u.kvman.t("kvcoder.config.mcp.signIn")), 9, Ti)) : r("v-if", !0),
2051
+ u.reason(u.stateOf(e.name)) === void 0 ? r("v-if", !0) : (_(), i("span", Ei, C(u.reason(u.stateOf(e.name))), 1))
2052
+ ]), u.removing === e.name ? (_(), i("span", {
2053
+ key: 0,
2054
+ class: "kvc-connector-actions",
2055
+ role: "alertdialog",
2056
+ "aria-label": u.kvman.t("kvcoder.config.mcp.removeConfirm", { name: e.name }),
2057
+ "data-test": "mcp-remove-confirm"
2058
+ }, [
2059
+ a("span", Oi, C(u.kvman.t("kvcoder.config.mcp.removeConfirm", { name: e.name })), 1),
2060
+ a("button", {
2061
+ type: "button",
2062
+ class: "kvc-button",
2063
+ disabled: u.working,
2064
+ "data-test": "mcp-remove-cancel",
2065
+ onClick: c[2] ||= (e) => u.removing = void 0
2066
+ }, C(u.kvman.t("kvcoder.config.mcp.cancel")), 9, ki),
2067
+ a("button", {
2068
+ type: "button",
2069
+ class: "kvc-button kvc-danger",
2070
+ disabled: u.working,
2071
+ "data-test": "mcp-remove-yes",
2072
+ onClick: (t) => u.removed(e.name)
2073
+ }, C(u.kvman.t("kvcoder.config.mcp.removeYes")), 9, Ai)
2074
+ ], 8, Di)) : (_(), i("span", ji, [a("button", {
2075
+ type: "button",
2076
+ class: "kvc-button kvc-ghost kvc-icon-button",
2077
+ disabled: u.locked || u.working,
2078
+ "aria-label": u.kvman.t("kvcoder.config.mcp.edit", { name: e.name }),
2079
+ title: u.kvman.t("kvcoder.config.mcp.edit", { name: e.name }),
2080
+ "data-test": "mcp-server-edit",
2081
+ onClick: (t) => u.form = { entry: e }
2082
+ }, [s(u.Pencil, {
2083
+ size: 16,
2084
+ "aria-hidden": "true"
2085
+ })], 8, Mi), a("button", {
2086
+ type: "button",
2087
+ class: "kvc-button kvc-ghost kvc-icon-button",
2088
+ disabled: u.locked || u.working,
2089
+ "aria-label": u.kvman.t("kvcoder.config.mcp.remove", { name: e.name }),
2090
+ title: u.kvman.t("kvcoder.config.mcp.remove", { name: e.name }),
2091
+ "data-test": "mcp-server-remove",
2092
+ onClick: (t) => u.removing = e.name
2093
+ }, [s(u.Trash2, {
2094
+ size: 16,
2095
+ "aria-hidden": "true"
2096
+ })], 8, Ni)]))], 8, vi))), 128)),
2097
+ a("div", Pi, [a("button", {
2098
+ type: "button",
2099
+ class: "kvc-button kvc-primary",
2100
+ disabled: u.locked || u.working,
2101
+ "data-test": "mcp-add",
2102
+ onClick: c[3] ||= (e) => u.form = {}
2103
+ }, [s(u.Plus, {
2104
+ size: 16,
2105
+ "aria-hidden": "true"
2106
+ }), o(C(u.kvman.t("kvcoder.config.mcp.add")), 1)], 8, Fi)])
2107
+ ])) : (_(), n(u.McpServerForm, f({ key: 0 }, u.form.entry === void 0 ? {} : { entry: u.form.entry }, {
2108
+ taken: u.servers.filter((e) => e.name !== u.form?.entry?.name).map((e) => e.name),
2109
+ secrets: u.secrets,
2110
+ working: u.working,
2111
+ onSave: u.saved,
2112
+ onCancel: c[0] ||= (e) => u.form = void 0
2113
+ }), null, 16, [
2114
+ "taken",
2115
+ "secrets",
2116
+ "working"
2117
+ ]));
2118
+ }
2119
+ var Li = /*#__PURE__*/ U(ui, [["render", Ii], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/src/McpServers.vue"]]), Ri = /*@__PURE__*/ c({
2120
+ __name: "SettingFrame",
2121
+ props: {
2122
+ settingKey: {
2123
+ type: String,
2124
+ required: !0
2125
+ },
2126
+ name: {
2127
+ type: String,
2128
+ required: !0
2129
+ },
2130
+ setting: {
2131
+ type: null,
2132
+ required: !0
2133
+ },
2134
+ saved: {
2135
+ type: Boolean,
2136
+ required: !0
2137
+ }
2138
+ },
2139
+ setup(e, { expose: t }) {
2140
+ t();
2141
+ let n = e, r = V(), i = {
2142
+ props: n,
2143
+ kvman: r,
2144
+ scoped: (e) => r.t(`${e}.${r.scope.value}`, { name: r.workspace.value.name })
2145
+ };
2146
+ return Object.defineProperty(i, "__isScriptSetup", {
2147
+ enumerable: !1,
2148
+ value: !0
2149
+ }), i;
2150
+ }
2151
+ }), zi = ["data-test"], Bi = { class: "kvc-setting-text" }, Vi = ["data-test"], Hi = { class: "kvc-muted" }, Ui = { class: "kvc-setting-control" }, Wi = ["data-test"], Gi = {
2152
+ key: 1,
2153
+ class: "kvc-connectors-state"
2154
+ }, Ki = ["data-test"], qi = ["data-test"], Ji = ["disabled", "data-test"];
2155
+ function Yi(t, n, o, s, c, l) {
2156
+ return _(), i("div", {
2157
+ class: "kvc-setting",
2158
+ "data-test": s.props.name
2159
+ }, [a("span", Bi, [a("span", {
2160
+ class: "kvc-setting-title",
2161
+ "data-test": `${s.props.name}-title`
2162
+ }, C(s.kvman.t(`${s.props.settingKey}.title`)), 9, Vi), a("span", Hi, C(s.kvman.t(`${s.props.settingKey}.description`)), 1)]), a("span", Ui, [x(t.$slots, "default", { disabled: s.props.setting.locked.value || s.props.setting.saving.value }), s.props.setting.locked.value ? (_(), i("span", {
2163
+ key: 0,
2164
+ class: "kvc-muted",
2165
+ "data-test": `${s.props.name}-own-value`
2166
+ }, C(s.kvman.t("kvcoder.config.setting.ownValue", { name: s.kvman.workspace.value.name })), 9, Wi)) : s.props.setting.changed.value || s.props.saved ? (_(), i("span", Gi, [s.props.saved ? (_(), i("span", {
2167
+ key: 0,
2168
+ class: "kvc-muted",
2169
+ role: "status",
2170
+ "data-test": `${s.props.name}-saved`
2171
+ }, C(s.kvman.t("kvcoder.config.setting.saved")), 9, Ki)) : r("v-if", !0), s.props.setting.changed.value ? (_(), i(e, { key: 1 }, [a("span", {
2172
+ class: "kvc-chip",
2173
+ "data-test": `${s.props.name}-changed`
2174
+ }, C(s.scoped("kvcoder.config.setting.changed")), 9, qi), a("button", {
2175
+ type: "button",
2176
+ class: "kvc-text-button",
2177
+ disabled: s.props.setting.saving.value,
2178
+ "data-test": `${s.props.name}-reset`,
2179
+ onClick: n[0] ||= (...e) => s.props.setting.reset && s.props.setting.reset(...e)
2180
+ }, C(s.scoped("kvcoder.config.setting.reset")), 9, Ji)], 64)) : r("v-if", !0)])) : r("v-if", !0)])], 8, zi);
2181
+ }
2182
+ var Xi = /*#__PURE__*/ U(Ri, [["render", Yi], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/src/SettingFrame.vue"]]), Zi = /*@__PURE__*/ c({
2183
+ __name: "ShellSettings",
2184
+ setup(e, { expose: n }) {
2185
+ n();
2186
+ let r = V(), i = W(r, "kvcoder.shell.approval"), a = W(r, "kvcoder.shell.path"), o = y(), s = ["auto", "ask"], c = t(() => typeof a.value.value == "string" ? a.value.value : ""), l = y("");
2187
+ A(c, (e) => l.value = e, { immediate: !0 });
2188
+ async function u(e) {
2189
+ e.target instanceof HTMLSelectElement && (o.value = await i.set(e.target.value) ? "approval" : void 0);
2190
+ }
2191
+ async function d() {
2192
+ let e = l.value.trim();
2193
+ if (e === c.value) return void (l.value = e);
2194
+ o.value = await a.set(e === "" ? null : e) ? "path" : void 0, l.value = c.value;
2195
+ }
2196
+ let f = {
2197
+ kvman: r,
2198
+ approval: i,
2199
+ path: a,
2200
+ saved: o,
2201
+ choices: s,
2202
+ storedPath: c,
2203
+ typed: l,
2204
+ saveApproval: u,
2205
+ savePath: d,
2206
+ SettingFrame: Xi
2207
+ };
2208
+ return Object.defineProperty(f, "__isScriptSetup", {
2209
+ enumerable: !1,
2210
+ value: !0
2211
+ }), f;
2212
+ }
2213
+ }), Qi = {
2214
+ class: "kvc-dialog-rows",
2215
+ "data-test": "shell-settings"
2216
+ }, $i = [
2217
+ "value",
2218
+ "disabled",
2219
+ "aria-label"
2220
+ ], ea = ["value"], ta = [
2221
+ "disabled",
2222
+ "placeholder",
2223
+ "aria-label"
2224
+ ];
2225
+ function na(t, n, r, o, c, l) {
2226
+ return _(), i("div", Qi, [s(o.SettingFrame, {
2227
+ "setting-key": "kvcoder.shell.approval",
2228
+ name: "shell-approval",
2229
+ setting: o.approval,
2230
+ saved: o.saved === "approval"
2231
+ }, {
2232
+ default: j(({ disabled: t }) => [a("select", {
2233
+ class: "kvc-field",
2234
+ value: o.approval.value.value,
2235
+ disabled: t,
2236
+ "aria-label": o.kvman.t("kvcoder.shell.approval.title"),
2237
+ "data-test": "shell-approval-control",
2238
+ onChange: o.saveApproval
2239
+ }, [(_(), i(e, null, b(o.choices, (e) => a("option", {
2240
+ key: e,
2241
+ value: e
2242
+ }, C(o.kvman.t(`kvcoder.shell.approval.options.${e}`)), 9, ea)), 64))], 40, $i)]),
2243
+ _: 1
2244
+ }, 8, ["setting", "saved"]), s(o.SettingFrame, {
2245
+ "setting-key": "kvcoder.shell.path",
2246
+ name: "shell-path",
2247
+ setting: o.path,
2248
+ saved: o.saved === "path"
2249
+ }, {
2250
+ default: j(({ disabled: e }) => [M(a("input", {
2251
+ "onUpdate:modelValue": n[0] ||= (e) => o.typed = e,
2252
+ type: "text",
2253
+ dir: "ltr",
2254
+ class: "kvc-field kvc-mono",
2255
+ disabled: e,
2256
+ placeholder: o.kvman.t("kvcoder.config.shell.pathFound"),
2257
+ "aria-label": o.kvman.t("kvcoder.shell.path.title"),
2258
+ spellcheck: "false",
2259
+ autocomplete: "off",
2260
+ "data-test": "shell-path-control",
2261
+ onKeydown: N(o.savePath, ["enter"]),
2262
+ onBlur: o.savePath
2263
+ }, null, 40, ta), [[k, o.typed]])]),
2264
+ _: 1
2265
+ }, 8, ["setting", "saved"])]);
2266
+ }
2267
+ var ra = /*#__PURE__*/ U(Zi, [["render", na], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/src/ShellSettings.vue"]]), ia = /*@__PURE__*/ c({
2268
+ __name: "ConnectorsList",
2269
+ setup(e, { expose: t }) {
2270
+ t();
2271
+ let n = V(), { items: r, locked: i, changed: a, saving: o, toggle: s, reset: c } = ft(n), l = y(), u = /* @__PURE__ */ new Map();
2272
+ function d(e, t) {
2273
+ t instanceof HTMLElement ? u.set(e, t) : u.delete(e);
2274
+ }
2275
+ async function f() {
2276
+ let e = l.value;
2277
+ l.value = void 0, await p(), e !== void 0 && u.get(e)?.focus();
2278
+ }
2279
+ let m = {
2280
+ kvman: n,
2281
+ items: r,
2282
+ locked: i,
2283
+ changed: a,
2284
+ saving: o,
2285
+ toggle: s,
2286
+ reset: c,
2287
+ opened: l,
2288
+ cogs: u,
2289
+ keepCog: d,
2290
+ close: f,
2291
+ scoped: (e) => n.t(`${e}.${n.scope.value}`, { name: n.workspace.value.name }),
2292
+ get Settings() {
2293
+ return ue;
2294
+ },
2295
+ ConnectorDialog: Te,
2296
+ DelegateWorkers: lr,
2297
+ McpServers: Li,
2298
+ ShellSettings: ra
2299
+ };
2300
+ return Object.defineProperty(m, "__isScriptSetup", {
2301
+ enumerable: !1,
2302
+ value: !0
2303
+ }), m;
2304
+ }
2305
+ }), aa = {
2306
+ class: "kvc-connectors",
2307
+ "data-test": "connectors"
2308
+ }, oa = {
2309
+ key: 0,
2310
+ class: "kvc-muted",
2311
+ "data-test": "connectors-own-value"
2312
+ }, sa = {
2313
+ key: 1,
2314
+ class: "kvc-connectors-state"
2315
+ }, ca = {
2316
+ class: "kvc-chip",
2317
+ "data-test": "connectors-changed"
2318
+ }, la = ["disabled"], ua = ["data-test"], da = { class: "kvc-connector-text" }, fa = {
2319
+ class: "kvc-mono kvc-connector-name",
2320
+ "data-test": "connector-name"
2321
+ }, pa = {
2322
+ class: "kvc-muted",
2323
+ dir: "auto",
2324
+ "data-test": "connector-description"
2325
+ }, ma = { class: "kvc-connector-actions" }, ha = [
2326
+ "aria-label",
2327
+ "title",
2328
+ "onClick"
2329
+ ], ga = [
2330
+ "aria-checked",
2331
+ "aria-label",
2332
+ "disabled",
2333
+ "onClick"
2334
+ ];
2335
+ function _a(t, o, c, l, u, d) {
2336
+ return _(), i("div", aa, [
2337
+ l.locked ? (_(), i("p", oa, C(l.kvman.t("kvcoder.config.connectors.ownValue", { name: l.kvman.workspace.value.name })), 1)) : l.changed ? (_(), i("div", sa, [a("span", ca, C(l.scoped("kvcoder.config.connectors.changed")), 1), a("button", {
2338
+ type: "button",
2339
+ class: "kvc-text-button",
2340
+ disabled: l.saving,
2341
+ "data-test": "connectors-reset",
2342
+ onClick: o[0] ||= (...e) => l.reset && l.reset(...e)
2343
+ }, C(l.scoped("kvcoder.config.connectors.reset")), 9, la)])) : r("v-if", !0),
2344
+ (_(!0), i(e, null, b(l.items, (e) => (_(), i("div", {
2345
+ key: e.name,
2346
+ class: "kvc-connector",
2347
+ "data-test": `connector-${e.name}`
2348
+ }, [a("span", da, [a("span", fa, C(e.name), 1), a("span", pa, C(e.description), 1)]), a("span", ma, [e.configurable ? (_(), i("button", {
2349
+ key: 0,
2350
+ ref_for: !0,
2351
+ ref: (t) => l.keepCog(e.name, t),
2352
+ type: "button",
2353
+ class: "kvc-button kvc-ghost kvc-icon-button",
2354
+ "aria-haspopup": "dialog",
2355
+ "aria-label": l.kvman.t("kvcoder.config.connectors.configure", { name: e.name }),
2356
+ title: l.kvman.t("kvcoder.config.connectors.configure", { name: e.name }),
2357
+ "data-test": "connector-configure",
2358
+ onClick: (t) => l.opened = e.name
2359
+ }, [s(l.Settings, {
2360
+ size: 18,
2361
+ "aria-hidden": "true"
2362
+ })], 8, ha)) : r("v-if", !0), a("button", {
2363
+ type: "button",
2364
+ role: "switch",
2365
+ class: "kvc-switch",
2366
+ "aria-checked": e.on,
2367
+ "aria-label": l.kvman.t("kvcoder.config.connectors.use", { name: e.name }),
2368
+ disabled: l.locked || l.saving,
2369
+ "data-test": "connector-switch",
2370
+ onClick: (t) => l.toggle(e.name)
2371
+ }, [...o[1] ||= [a("span", {
2372
+ class: "kvc-switch-knob",
2373
+ "aria-hidden": "true"
2374
+ }, null, -1)]], 8, ga)])], 8, ua))), 128)),
2375
+ l.opened === void 0 ? r("v-if", !0) : (_(), n(l.ConnectorDialog, {
2376
+ key: 2,
2377
+ name: l.opened,
2378
+ onClose: l.close
2379
+ }, {
2380
+ default: j(() => [l.opened === "shell" ? (_(), n(l.ShellSettings, { key: 0 })) : l.opened === "delegate" ? (_(), n(l.DelegateWorkers, { key: 1 })) : l.opened === "mcp" ? (_(), n(l.McpServers, { key: 2 })) : r("v-if", !0)]),
2381
+ _: 1
2382
+ }, 8, ["name"]))
2383
+ ]);
2384
+ }
2385
+ var va = /*#__PURE__*/ U(ia, [["render", _a], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/src/ConnectorsList.vue"]]), ya = /*@__PURE__*/ c({
2386
+ __name: "connectors",
2387
+ setup(e, { expose: t }) {
2388
+ t();
2389
+ let n = { ConnectorsList: va };
2390
+ return Object.defineProperty(n, "__isScriptSetup", {
2391
+ enumerable: !1,
2392
+ value: !0
2393
+ }), n;
2394
+ }
2395
+ });
2396
+ //#endregion
2397
+ //#region web/components/connectors.vue
2398
+ function ba(e, t, r, i, a, o) {
2399
+ return _(), n(i.ConnectorsList);
2400
+ }
2401
+ var xa = /*#__PURE__*/ U(ya, [["render", ba], ["__file", "/home/runner/work/kvman/kvman/extensions/kvcoder/web/components/connectors.vue"]]);
2402
+ //#endregion
2403
+ export { xa as default };