@kilnai/cli 1.0.4 → 2.0.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 (546) hide show
  1. package/README.md +31 -8
  2. package/dist/application/__tests__/session-report.test.d.ts +2 -0
  3. package/dist/application/__tests__/session-report.test.d.ts.map +1 -0
  4. package/dist/application/__tests__/session-report.test.js +100 -0
  5. package/dist/application/__tests__/session-report.test.js.map +1 -0
  6. package/dist/application/agent-loader.d.ts +30 -2
  7. package/dist/application/agent-loader.d.ts.map +1 -1
  8. package/dist/application/agent-loader.js +99 -3
  9. package/dist/application/agent-loader.js.map +1 -1
  10. package/dist/application/agent-loader.test.js +112 -18
  11. package/dist/application/agent-loader.test.js.map +1 -1
  12. package/dist/application/agent-skill-context.d.ts +12 -0
  13. package/dist/application/agent-skill-context.d.ts.map +1 -0
  14. package/dist/application/agent-skill-context.js +32 -0
  15. package/dist/application/agent-skill-context.js.map +1 -0
  16. package/dist/application/agent-skill-context.test.d.ts +2 -0
  17. package/dist/application/agent-skill-context.test.d.ts.map +1 -0
  18. package/dist/application/agent-skill-context.test.js +156 -0
  19. package/dist/application/agent-skill-context.test.js.map +1 -0
  20. package/dist/application/benchmark-session-executor.d.ts +14 -0
  21. package/dist/application/benchmark-session-executor.d.ts.map +1 -0
  22. package/dist/application/benchmark-session-executor.js +210 -0
  23. package/dist/application/benchmark-session-executor.js.map +1 -0
  24. package/dist/application/config-apply-tool.d.ts +30 -0
  25. package/dist/application/config-apply-tool.d.ts.map +1 -0
  26. package/dist/application/config-apply-tool.js +68 -0
  27. package/dist/application/config-apply-tool.js.map +1 -0
  28. package/dist/application/config-apply.d.ts +9 -0
  29. package/dist/application/config-apply.d.ts.map +1 -0
  30. package/dist/application/config-apply.js +146 -0
  31. package/dist/application/config-apply.js.map +1 -0
  32. package/dist/application/config-approval.d.ts +10 -0
  33. package/dist/application/config-approval.d.ts.map +1 -0
  34. package/dist/application/config-approval.js +30 -0
  35. package/dist/application/config-approval.js.map +1 -0
  36. package/dist/application/config-mutation-store.d.ts +25 -0
  37. package/dist/application/config-mutation-store.d.ts.map +1 -0
  38. package/dist/application/config-mutation-store.js +59 -0
  39. package/dist/application/config-mutation-store.js.map +1 -0
  40. package/dist/application/config-proposal.d.ts +22 -0
  41. package/dist/application/config-proposal.d.ts.map +1 -0
  42. package/dist/application/config-proposal.js +395 -0
  43. package/dist/application/config-proposal.js.map +1 -0
  44. package/dist/application/config-propose-tool.d.ts +30 -0
  45. package/dist/application/config-propose-tool.d.ts.map +1 -0
  46. package/dist/application/config-propose-tool.js +63 -0
  47. package/dist/application/config-propose-tool.js.map +1 -0
  48. package/dist/application/config-read-tool.d.ts +26 -0
  49. package/dist/application/config-read-tool.d.ts.map +1 -0
  50. package/dist/application/config-read-tool.js +51 -0
  51. package/dist/application/config-read-tool.js.map +1 -0
  52. package/dist/application/config-status.d.ts +9 -0
  53. package/dist/application/config-status.d.ts.map +1 -0
  54. package/dist/application/config-status.js +361 -0
  55. package/dist/application/config-status.js.map +1 -0
  56. package/dist/application/config-tools.d.ts +3 -0
  57. package/dist/application/config-tools.d.ts.map +1 -0
  58. package/dist/application/config-tools.js +11 -0
  59. package/dist/application/config-tools.js.map +1 -0
  60. package/dist/application/context-types.d.ts +4 -17
  61. package/dist/application/context-types.d.ts.map +1 -1
  62. package/dist/application/context-types.js.map +1 -1
  63. package/dist/application/first-party-agent-defaults.d.ts +3 -0
  64. package/dist/application/first-party-agent-defaults.d.ts.map +1 -0
  65. package/dist/application/first-party-agent-defaults.js +135 -0
  66. package/dist/application/first-party-agent-defaults.js.map +1 -0
  67. package/dist/application/instruction-profile-context.d.ts +15 -0
  68. package/dist/application/instruction-profile-context.d.ts.map +1 -0
  69. package/dist/application/instruction-profile-context.js +80 -0
  70. package/dist/application/instruction-profile-context.js.map +1 -0
  71. package/dist/application/instruction-profile-loader.d.ts +20 -0
  72. package/dist/application/instruction-profile-loader.d.ts.map +1 -0
  73. package/dist/application/instruction-profile-loader.js +132 -0
  74. package/dist/application/instruction-profile-loader.js.map +1 -0
  75. package/dist/application/instruction-profile-loader.test.d.ts +2 -0
  76. package/dist/application/instruction-profile-loader.test.d.ts.map +1 -0
  77. package/dist/application/instruction-profile-loader.test.js +100 -0
  78. package/dist/application/instruction-profile-loader.test.js.map +1 -0
  79. package/dist/application/operator-theme-preferences.d.ts +11 -0
  80. package/dist/application/operator-theme-preferences.d.ts.map +1 -0
  81. package/dist/application/operator-theme-preferences.js +49 -0
  82. package/dist/application/operator-theme-preferences.js.map +1 -0
  83. package/dist/application/project-context.d.ts +22 -0
  84. package/dist/application/project-context.d.ts.map +1 -0
  85. package/dist/application/project-context.js +139 -0
  86. package/dist/application/project-context.js.map +1 -0
  87. package/dist/application/project-root-resolver.d.ts +14 -0
  88. package/dist/application/project-root-resolver.d.ts.map +1 -0
  89. package/dist/application/project-root-resolver.js +71 -0
  90. package/dist/application/project-root-resolver.js.map +1 -0
  91. package/dist/application/repo-shim-projection.d.ts +48 -0
  92. package/dist/application/repo-shim-projection.d.ts.map +1 -0
  93. package/dist/application/repo-shim-projection.js +536 -0
  94. package/dist/application/repo-shim-projection.js.map +1 -0
  95. package/dist/application/resume-sidebar-info.d.ts +9 -0
  96. package/dist/application/resume-sidebar-info.d.ts.map +1 -0
  97. package/dist/application/resume-sidebar-info.js +40 -0
  98. package/dist/application/resume-sidebar-info.js.map +1 -0
  99. package/dist/application/resume-strategy-feedback.d.ts.map +1 -1
  100. package/dist/application/resume-strategy-feedback.js +2 -1
  101. package/dist/application/resume-strategy-feedback.js.map +1 -1
  102. package/dist/application/run-session.d.ts +15 -0
  103. package/dist/application/run-session.d.ts.map +1 -1
  104. package/dist/application/run-session.js +110 -19
  105. package/dist/application/run-session.js.map +1 -1
  106. package/dist/application/runtime-session-rehydration.d.ts +9 -0
  107. package/dist/application/runtime-session-rehydration.d.ts.map +1 -0
  108. package/dist/application/runtime-session-rehydration.js +115 -0
  109. package/dist/application/runtime-session-rehydration.js.map +1 -0
  110. package/dist/application/session-context-artifacts.d.ts +19 -0
  111. package/dist/application/session-context-artifacts.d.ts.map +1 -0
  112. package/dist/application/session-context-artifacts.js +60 -0
  113. package/dist/application/session-context-artifacts.js.map +1 -0
  114. package/dist/application/session-metadata.d.ts +35 -0
  115. package/dist/application/session-metadata.d.ts.map +1 -0
  116. package/dist/application/session-metadata.js +157 -0
  117. package/dist/application/session-metadata.js.map +1 -0
  118. package/dist/application/session-report.d.ts.map +1 -1
  119. package/dist/application/session-report.js +8 -0
  120. package/dist/application/session-report.js.map +1 -1
  121. package/dist/application/session-resume.d.ts +1 -1
  122. package/dist/application/session-resume.d.ts.map +1 -1
  123. package/dist/application/session-resume.js +4 -4
  124. package/dist/application/session-resume.js.map +1 -1
  125. package/dist/application/work-governance-context.d.ts +7 -0
  126. package/dist/application/work-governance-context.d.ts.map +1 -0
  127. package/dist/application/work-governance-context.js +64 -0
  128. package/dist/application/work-governance-context.js.map +1 -0
  129. package/dist/application/work-governance-context.test.d.ts +2 -0
  130. package/dist/application/work-governance-context.test.d.ts.map +1 -0
  131. package/dist/application/work-governance-context.test.js +55 -0
  132. package/dist/application/work-governance-context.test.js.map +1 -0
  133. package/dist/application/work-governance-policy.d.ts +15 -0
  134. package/dist/application/work-governance-policy.d.ts.map +1 -0
  135. package/dist/application/work-governance-policy.js +53 -0
  136. package/dist/application/work-governance-policy.js.map +1 -0
  137. package/dist/application/work-governance-tool.d.ts +421 -0
  138. package/dist/application/work-governance-tool.d.ts.map +1 -0
  139. package/dist/application/work-governance-tool.js +937 -0
  140. package/dist/application/work-governance-tool.js.map +1 -0
  141. package/dist/application/work-governance-tool.test.d.ts +2 -0
  142. package/dist/application/work-governance-tool.test.d.ts.map +1 -0
  143. package/dist/application/work-governance-tool.test.js +935 -0
  144. package/dist/application/work-governance-tool.test.js.map +1 -0
  145. package/dist/application/work-governance-workflows.d.ts +23 -0
  146. package/dist/application/work-governance-workflows.d.ts.map +1 -0
  147. package/dist/application/work-governance-workflows.js +177 -0
  148. package/dist/application/work-governance-workflows.js.map +1 -0
  149. package/dist/application/workflow-snapshot-export.d.ts +81 -0
  150. package/dist/application/workflow-snapshot-export.d.ts.map +1 -0
  151. package/dist/application/workflow-snapshot-export.js +141 -0
  152. package/dist/application/workflow-snapshot-export.js.map +1 -0
  153. package/dist/commands/auth.d.ts.map +1 -1
  154. package/dist/commands/auth.js +242 -24
  155. package/dist/commands/auth.js.map +1 -1
  156. package/dist/commands/benchmark.d.ts +8 -0
  157. package/dist/commands/benchmark.d.ts.map +1 -0
  158. package/dist/commands/benchmark.js +287 -0
  159. package/dist/commands/benchmark.js.map +1 -0
  160. package/dist/commands/config.d.ts +1 -1
  161. package/dist/commands/config.d.ts.map +1 -1
  162. package/dist/commands/config.js +369 -39
  163. package/dist/commands/config.js.map +1 -1
  164. package/dist/commands/config.test.d.ts +2 -0
  165. package/dist/commands/config.test.d.ts.map +1 -0
  166. package/dist/commands/config.test.js +86 -0
  167. package/dist/commands/config.test.js.map +1 -0
  168. package/dist/commands/goal.d.ts +12 -0
  169. package/dist/commands/goal.d.ts.map +1 -0
  170. package/dist/commands/goal.js +469 -0
  171. package/dist/commands/goal.js.map +1 -0
  172. package/dist/commands/goal.test.d.ts +2 -0
  173. package/dist/commands/goal.test.d.ts.map +1 -0
  174. package/dist/commands/goal.test.js +317 -0
  175. package/dist/commands/goal.test.js.map +1 -0
  176. package/dist/commands/gui-options.d.ts +5 -0
  177. package/dist/commands/gui-options.d.ts.map +1 -0
  178. package/dist/commands/gui-options.js +18 -0
  179. package/dist/commands/gui-options.js.map +1 -0
  180. package/dist/commands/gui-session-detail.d.ts +4 -0
  181. package/dist/commands/gui-session-detail.d.ts.map +1 -0
  182. package/dist/commands/gui-session-detail.js +32 -0
  183. package/dist/commands/gui-session-detail.js.map +1 -0
  184. package/dist/commands/gui-session-summaries.d.ts +5 -0
  185. package/dist/commands/gui-session-summaries.d.ts.map +1 -0
  186. package/dist/commands/gui-session-summaries.js +62 -0
  187. package/dist/commands/gui-session-summaries.js.map +1 -0
  188. package/dist/commands/gui-shutdown-monitor.d.ts +8 -0
  189. package/dist/commands/gui-shutdown-monitor.d.ts.map +1 -0
  190. package/dist/commands/gui-shutdown-monitor.js +50 -0
  191. package/dist/commands/gui-shutdown-monitor.js.map +1 -0
  192. package/dist/commands/gui-window.d.ts +42 -0
  193. package/dist/commands/gui-window.d.ts.map +1 -0
  194. package/dist/commands/gui-window.js +287 -0
  195. package/dist/commands/gui-window.js.map +1 -0
  196. package/dist/commands/gui-workspace.d.ts +3 -0
  197. package/dist/commands/gui-workspace.d.ts.map +1 -0
  198. package/dist/commands/gui-workspace.js +297 -0
  199. package/dist/commands/gui-workspace.js.map +1 -0
  200. package/dist/commands/gui.d.ts +14 -0
  201. package/dist/commands/gui.d.ts.map +1 -0
  202. package/dist/commands/gui.js +392 -0
  203. package/dist/commands/gui.js.map +1 -0
  204. package/dist/commands/import-native.d.ts +34 -0
  205. package/dist/commands/import-native.d.ts.map +1 -0
  206. package/dist/commands/import-native.js +302 -0
  207. package/dist/commands/import-native.js.map +1 -0
  208. package/dist/commands/init-templates.d.ts.map +1 -1
  209. package/dist/commands/init-templates.js +13 -12
  210. package/dist/commands/init-templates.js.map +1 -1
  211. package/dist/commands/init.js +1 -1
  212. package/dist/commands/init.js.map +1 -1
  213. package/dist/commands/mcp-config.d.ts.map +1 -1
  214. package/dist/commands/mcp-config.js +6 -3
  215. package/dist/commands/mcp-config.js.map +1 -1
  216. package/dist/commands/memory.d.ts +1 -1
  217. package/dist/commands/memory.d.ts.map +1 -1
  218. package/dist/commands/memory.js +188 -39
  219. package/dist/commands/memory.js.map +1 -1
  220. package/dist/commands/project.d.ts +3 -0
  221. package/dist/commands/project.d.ts.map +1 -0
  222. package/dist/commands/project.js +64 -0
  223. package/dist/commands/project.js.map +1 -0
  224. package/dist/commands/route.d.ts +3 -0
  225. package/dist/commands/route.d.ts.map +1 -0
  226. package/dist/commands/route.js +19 -0
  227. package/dist/commands/route.js.map +1 -0
  228. package/dist/commands/run.d.ts +23 -1
  229. package/dist/commands/run.d.ts.map +1 -1
  230. package/dist/commands/run.js +416 -81
  231. package/dist/commands/run.js.map +1 -1
  232. package/dist/commands/skill-capture.js +34 -14
  233. package/dist/commands/skill-capture.js.map +1 -1
  234. package/dist/commands/skill.d.ts.map +1 -1
  235. package/dist/commands/skill.js +10 -9
  236. package/dist/commands/skill.js.map +1 -1
  237. package/dist/commands/status.d.ts +5 -1
  238. package/dist/commands/status.d.ts.map +1 -1
  239. package/dist/commands/status.js +134 -5
  240. package/dist/commands/status.js.map +1 -1
  241. package/dist/commands/sync.d.ts +8 -6
  242. package/dist/commands/sync.d.ts.map +1 -1
  243. package/dist/commands/sync.js +173 -48
  244. package/dist/commands/sync.js.map +1 -1
  245. package/dist/commands/tools.d.ts +2 -0
  246. package/dist/commands/tools.d.ts.map +1 -1
  247. package/dist/commands/tools.js +34 -15
  248. package/dist/commands/tools.js.map +1 -1
  249. package/dist/commands/tui.d.ts +6 -4
  250. package/dist/commands/tui.d.ts.map +1 -1
  251. package/dist/commands/tui.js +594 -94
  252. package/dist/commands/tui.js.map +1 -1
  253. package/dist/commands/uninstall.d.ts +13 -0
  254. package/dist/commands/uninstall.d.ts.map +1 -0
  255. package/dist/commands/uninstall.js +111 -0
  256. package/dist/commands/uninstall.js.map +1 -0
  257. package/dist/config/builtin-tool-surface-config.d.ts +6 -0
  258. package/dist/config/builtin-tool-surface-config.d.ts.map +1 -0
  259. package/dist/config/builtin-tool-surface-config.js +27 -0
  260. package/dist/config/builtin-tool-surface-config.js.map +1 -0
  261. package/dist/config/config-merger.d.ts +1 -1
  262. package/dist/config/config-merger.d.ts.map +1 -1
  263. package/dist/config/config-merger.js +21 -4
  264. package/dist/config/config-merger.js.map +1 -1
  265. package/dist/config/config-merger.test.js +202 -7
  266. package/dist/config/config-merger.test.js.map +1 -1
  267. package/dist/config/global-config.d.ts +59 -13
  268. package/dist/config/global-config.d.ts.map +1 -1
  269. package/dist/config/global-config.js +580 -5
  270. package/dist/config/global-config.js.map +1 -1
  271. package/dist/config/global-config.test.js +481 -8
  272. package/dist/config/global-config.test.js.map +1 -1
  273. package/dist/config/harness-integration-capabilities.d.ts +27 -0
  274. package/dist/config/harness-integration-capabilities.d.ts.map +1 -0
  275. package/dist/config/harness-integration-capabilities.js +64 -0
  276. package/dist/config/harness-integration-capabilities.js.map +1 -0
  277. package/dist/config/interactive-use-config.d.ts +25 -0
  278. package/dist/config/interactive-use-config.d.ts.map +1 -0
  279. package/dist/config/interactive-use-config.js +210 -0
  280. package/dist/config/interactive-use-config.js.map +1 -0
  281. package/dist/config/json-comments.d.ts +2 -0
  282. package/dist/config/json-comments.d.ts.map +1 -0
  283. package/dist/config/json-comments.js +21 -0
  284. package/dist/config/json-comments.js.map +1 -0
  285. package/dist/config/managed-agent-direct-adapters.d.ts +15 -0
  286. package/dist/config/managed-agent-direct-adapters.d.ts.map +1 -0
  287. package/dist/config/managed-agent-direct-adapters.js +54 -0
  288. package/dist/config/managed-agent-direct-adapters.js.map +1 -0
  289. package/dist/config/managed-agent-provider-models.d.ts +3 -0
  290. package/dist/config/managed-agent-provider-models.d.ts.map +1 -0
  291. package/dist/config/managed-agent-provider-models.js +12 -0
  292. package/dist/config/managed-agent-provider-models.js.map +1 -0
  293. package/dist/config/managed-agent-routes.d.ts +49 -0
  294. package/dist/config/managed-agent-routes.d.ts.map +1 -0
  295. package/dist/config/managed-agent-routes.js +578 -0
  296. package/dist/config/managed-agent-routes.js.map +1 -0
  297. package/dist/config/managed-invocation-context-resolver.d.ts +10 -0
  298. package/dist/config/managed-invocation-context-resolver.d.ts.map +1 -0
  299. package/dist/config/managed-invocation-context-resolver.js +98 -0
  300. package/dist/config/managed-invocation-context-resolver.js.map +1 -0
  301. package/dist/config/managed-invocation-context-resolver.test.d.ts +2 -0
  302. package/dist/config/managed-invocation-context-resolver.test.d.ts.map +1 -0
  303. package/dist/config/managed-invocation-context-resolver.test.js +133 -0
  304. package/dist/config/managed-invocation-context-resolver.test.js.map +1 -0
  305. package/dist/config/model-task-suitability.d.ts +9 -0
  306. package/dist/config/model-task-suitability.d.ts.map +1 -0
  307. package/dist/config/model-task-suitability.js +40 -0
  308. package/dist/config/model-task-suitability.js.map +1 -0
  309. package/dist/config/native-agent-projection.d.ts +16 -0
  310. package/dist/config/native-agent-projection.d.ts.map +1 -0
  311. package/dist/config/native-agent-projection.js +242 -0
  312. package/dist/config/native-agent-projection.js.map +1 -0
  313. package/dist/config/native-hook-projection.d.ts +11 -0
  314. package/dist/config/native-hook-projection.d.ts.map +1 -0
  315. package/dist/config/native-hook-projection.js +180 -0
  316. package/dist/config/native-hook-projection.js.map +1 -0
  317. package/dist/config/native-permission-projection.d.ts +12 -0
  318. package/dist/config/native-permission-projection.d.ts.map +1 -0
  319. package/dist/config/native-permission-projection.js +162 -0
  320. package/dist/config/native-permission-projection.js.map +1 -0
  321. package/dist/config/native-projection-backup.d.ts +8 -0
  322. package/dist/config/native-projection-backup.d.ts.map +1 -0
  323. package/dist/config/native-projection-backup.js +19 -0
  324. package/dist/config/native-projection-backup.js.map +1 -0
  325. package/dist/config/native-projection-policy.d.ts +10 -0
  326. package/dist/config/native-projection-policy.d.ts.map +1 -0
  327. package/dist/config/native-projection-policy.js +9 -0
  328. package/dist/config/native-projection-policy.js.map +1 -0
  329. package/dist/config/native-projection-state.d.ts +57 -0
  330. package/dist/config/native-projection-state.d.ts.map +1 -0
  331. package/dist/config/native-projection-state.js +199 -0
  332. package/dist/config/native-projection-state.js.map +1 -0
  333. package/dist/config/native-skill-projection.d.ts +24 -0
  334. package/dist/config/native-skill-projection.d.ts.map +1 -0
  335. package/dist/config/native-skill-projection.js +170 -0
  336. package/dist/config/native-skill-projection.js.map +1 -0
  337. package/dist/config/operator-identity-context.d.ts +7 -0
  338. package/dist/config/operator-identity-context.d.ts.map +1 -0
  339. package/dist/config/operator-identity-context.js +46 -0
  340. package/dist/config/operator-identity-context.js.map +1 -0
  341. package/dist/config/operator-identity-context.test.d.ts +2 -0
  342. package/dist/config/operator-identity-context.test.d.ts.map +1 -0
  343. package/dist/config/operator-identity-context.test.js +61 -0
  344. package/dist/config/operator-identity-context.test.js.map +1 -0
  345. package/dist/config/operator-voice.d.ts +10 -0
  346. package/dist/config/operator-voice.d.ts.map +1 -0
  347. package/dist/config/operator-voice.js +29 -0
  348. package/dist/config/operator-voice.js.map +1 -0
  349. package/dist/config/provider-route-candidates.d.ts +20 -0
  350. package/dist/config/provider-route-candidates.d.ts.map +1 -0
  351. package/dist/config/provider-route-candidates.js +211 -0
  352. package/dist/config/provider-route-candidates.js.map +1 -0
  353. package/dist/config/provider-route-candidates.test.d.ts +2 -0
  354. package/dist/config/provider-route-candidates.test.d.ts.map +1 -0
  355. package/dist/config/provider-route-candidates.test.js +150 -0
  356. package/dist/config/provider-route-candidates.test.js.map +1 -0
  357. package/dist/config/skill-registry.d.ts +9 -0
  358. package/dist/config/skill-registry.d.ts.map +1 -0
  359. package/dist/config/skill-registry.js +13 -0
  360. package/dist/config/skill-registry.js.map +1 -0
  361. package/dist/config/skill-registry.test.d.ts +2 -0
  362. package/dist/config/skill-registry.test.d.ts.map +1 -0
  363. package/dist/config/skill-registry.test.js +64 -0
  364. package/dist/config/skill-registry.test.js.map +1 -0
  365. package/dist/config/task-skill-selection.d.ts +24 -0
  366. package/dist/config/task-skill-selection.d.ts.map +1 -0
  367. package/dist/config/task-skill-selection.js +79 -0
  368. package/dist/config/task-skill-selection.js.map +1 -0
  369. package/dist/config/translators/claude-translator.d.ts +7 -0
  370. package/dist/config/translators/claude-translator.d.ts.map +1 -0
  371. package/dist/config/translators/claude-translator.js +30 -0
  372. package/dist/config/translators/claude-translator.js.map +1 -0
  373. package/dist/config/translators/codex-translator.d.ts +7 -0
  374. package/dist/config/translators/codex-translator.d.ts.map +1 -0
  375. package/dist/config/translators/codex-translator.js +20 -0
  376. package/dist/config/translators/codex-translator.js.map +1 -0
  377. package/dist/config/translators/opencode-translator.d.ts +7 -0
  378. package/dist/config/translators/opencode-translator.d.ts.map +1 -0
  379. package/dist/config/translators/opencode-translator.js +19 -0
  380. package/dist/config/translators/opencode-translator.js.map +1 -0
  381. package/dist/config/translators/permission-projection.d.ts +26 -0
  382. package/dist/config/translators/permission-projection.d.ts.map +1 -0
  383. package/dist/config/translators/permission-projection.js +22 -0
  384. package/dist/config/translators/permission-projection.js.map +1 -0
  385. package/dist/config/web-tools-config.d.ts +45 -0
  386. package/dist/config/web-tools-config.d.ts.map +1 -0
  387. package/dist/config/web-tools-config.js +846 -0
  388. package/dist/config/web-tools-config.js.map +1 -0
  389. package/dist/config.d.ts +4 -0
  390. package/dist/config.d.ts.map +1 -1
  391. package/dist/config.js.map +1 -1
  392. package/dist/engines/engine-registry.d.ts +45 -0
  393. package/dist/engines/engine-registry.d.ts.map +1 -0
  394. package/dist/engines/engine-registry.js +125 -0
  395. package/dist/engines/engine-registry.js.map +1 -0
  396. package/dist/index.d.ts +2 -2
  397. package/dist/index.d.ts.map +1 -1
  398. package/dist/index.js +141 -18
  399. package/dist/index.js.map +1 -1
  400. package/dist/kiln-yaml-types.d.ts +207 -1
  401. package/dist/kiln-yaml-types.d.ts.map +1 -1
  402. package/dist/kiln-yaml-types.js +29 -0
  403. package/dist/kiln-yaml-types.js.map +1 -1
  404. package/dist/kiln-yaml.d.ts +1 -1
  405. package/dist/kiln-yaml.d.ts.map +1 -1
  406. package/dist/kiln-yaml.js +93 -0
  407. package/dist/kiln-yaml.js.map +1 -1
  408. package/dist/mcp/config-generator.d.ts.map +1 -1
  409. package/dist/mcp/config-generator.js +8 -7
  410. package/dist/mcp/config-generator.js.map +1 -1
  411. package/dist/mcp/index.d.ts +2 -25
  412. package/dist/mcp/index.d.ts.map +1 -1
  413. package/dist/mcp/index.js +1 -103
  414. package/dist/mcp/index.js.map +1 -1
  415. package/dist/wrapper/__tests__/session-manager-context-governor.test.d.ts +2 -0
  416. package/dist/wrapper/__tests__/session-manager-context-governor.test.d.ts.map +1 -0
  417. package/dist/wrapper/__tests__/session-manager-context-governor.test.js +210 -0
  418. package/dist/wrapper/__tests__/session-manager-context-governor.test.js.map +1 -0
  419. package/dist/wrapper/claude-code-process.d.ts +1 -0
  420. package/dist/wrapper/claude-code-process.d.ts.map +1 -1
  421. package/dist/wrapper/claude-code-process.js +32 -19
  422. package/dist/wrapper/claude-code-process.js.map +1 -1
  423. package/dist/wrapper/cleanup-registry.d.ts.map +1 -1
  424. package/dist/wrapper/cleanup-registry.js +3 -1
  425. package/dist/wrapper/cleanup-registry.js.map +1 -1
  426. package/dist/wrapper/codex-session.d.ts +3 -0
  427. package/dist/wrapper/codex-session.d.ts.map +1 -1
  428. package/dist/wrapper/codex-session.js +193 -85
  429. package/dist/wrapper/codex-session.js.map +1 -1
  430. package/dist/wrapper/debug.d.ts.map +1 -1
  431. package/dist/wrapper/debug.js +2 -0
  432. package/dist/wrapper/debug.js.map +1 -1
  433. package/dist/wrapper/direct-provider-adapter-factory.d.ts +12 -0
  434. package/dist/wrapper/direct-provider-adapter-factory.d.ts.map +1 -0
  435. package/dist/wrapper/direct-provider-adapter-factory.js +99 -0
  436. package/dist/wrapper/direct-provider-adapter-factory.js.map +1 -0
  437. package/dist/wrapper/index.d.ts +0 -2
  438. package/dist/wrapper/index.d.ts.map +1 -1
  439. package/dist/wrapper/index.js +0 -1
  440. package/dist/wrapper/index.js.map +1 -1
  441. package/dist/wrapper/opencode-session.d.ts +4 -0
  442. package/dist/wrapper/opencode-session.d.ts.map +1 -1
  443. package/dist/wrapper/opencode-session.js +245 -38
  444. package/dist/wrapper/opencode-session.js.map +1 -1
  445. package/dist/wrapper/permission-evaluator.d.ts +2 -1
  446. package/dist/wrapper/permission-evaluator.d.ts.map +1 -1
  447. package/dist/wrapper/permission-evaluator.js +54 -0
  448. package/dist/wrapper/permission-evaluator.js.map +1 -1
  449. package/dist/wrapper/permission-normalizer.d.ts +5 -1
  450. package/dist/wrapper/permission-normalizer.d.ts.map +1 -1
  451. package/dist/wrapper/permission-normalizer.js +17 -0
  452. package/dist/wrapper/permission-normalizer.js.map +1 -1
  453. package/dist/wrapper/permission-policy-authorizer.d.ts +1 -1
  454. package/dist/wrapper/permission-policy-authorizer.js +1 -1
  455. package/dist/wrapper/pooled-harness-session.d.ts +24 -0
  456. package/dist/wrapper/pooled-harness-session.d.ts.map +1 -0
  457. package/dist/wrapper/pooled-harness-session.js +123 -0
  458. package/dist/wrapper/pooled-harness-session.js.map +1 -0
  459. package/dist/wrapper/preamble-builder.d.ts +4 -1
  460. package/dist/wrapper/preamble-builder.d.ts.map +1 -1
  461. package/dist/wrapper/preamble-builder.js +48 -20
  462. package/dist/wrapper/preamble-builder.js.map +1 -1
  463. package/dist/wrapper/provider-session.d.ts +25 -5
  464. package/dist/wrapper/provider-session.d.ts.map +1 -1
  465. package/dist/wrapper/provider-session.js +562 -138
  466. package/dist/wrapper/provider-session.js.map +1 -1
  467. package/dist/wrapper/session-manager.d.ts.map +1 -1
  468. package/dist/wrapper/session-manager.js +16 -5
  469. package/dist/wrapper/session-manager.js.map +1 -1
  470. package/dist/wrapper/session-registry.d.ts +11 -1
  471. package/dist/wrapper/session-registry.d.ts.map +1 -1
  472. package/dist/wrapper/session-registry.js +167 -259
  473. package/dist/wrapper/session-registry.js.map +1 -1
  474. package/dist/wrapper/session-store.d.ts +33 -10
  475. package/dist/wrapper/session-store.d.ts.map +1 -1
  476. package/dist/wrapper/session-store.js +327 -84
  477. package/dist/wrapper/session-store.js.map +1 -1
  478. package/dist/wrapper/session.d.ts +55 -2
  479. package/dist/wrapper/session.d.ts.map +1 -1
  480. package/dist/wrapper/session.js +11 -2
  481. package/dist/wrapper/session.js.map +1 -1
  482. package/package.json +6 -5
  483. package/dist/application/__tests__/plan-exit-tool.test.d.ts +0 -2
  484. package/dist/application/__tests__/plan-exit-tool.test.d.ts.map +0 -1
  485. package/dist/application/__tests__/plan-exit-tool.test.js +0 -12
  486. package/dist/application/__tests__/plan-exit-tool.test.js.map +0 -1
  487. package/dist/application/context-governor.d.ts +0 -26
  488. package/dist/application/context-governor.d.ts.map +0 -1
  489. package/dist/application/context-governor.js +0 -164
  490. package/dist/application/context-governor.js.map +0 -1
  491. package/dist/application/plan-exit-tool.d.ts +0 -19
  492. package/dist/application/plan-exit-tool.d.ts.map +0 -1
  493. package/dist/application/plan-exit-tool.js +0 -13
  494. package/dist/application/plan-exit-tool.js.map +0 -1
  495. package/dist/commands/serve.d.ts +0 -7
  496. package/dist/commands/serve.d.ts.map +0 -1
  497. package/dist/commands/serve.js +0 -24
  498. package/dist/commands/serve.js.map +0 -1
  499. package/dist/mcp/server.d.ts +0 -36
  500. package/dist/mcp/server.d.ts.map +0 -1
  501. package/dist/mcp/server.js +0 -156
  502. package/dist/mcp/server.js.map +0 -1
  503. package/dist/mcp/transports.d.ts +0 -28
  504. package/dist/mcp/transports.d.ts.map +0 -1
  505. package/dist/mcp/transports.js +0 -108
  506. package/dist/mcp/transports.js.map +0 -1
  507. package/dist/mcp-entry.d.ts +0 -3
  508. package/dist/mcp-entry.d.ts.map +0 -1
  509. package/dist/mcp-entry.js +0 -19
  510. package/dist/mcp-entry.js.map +0 -1
  511. package/dist/sync/agent-sync.d.ts +0 -13
  512. package/dist/sync/agent-sync.d.ts.map +0 -1
  513. package/dist/sync/agent-sync.js +0 -130
  514. package/dist/sync/agent-sync.js.map +0 -1
  515. package/dist/sync/agent-sync.test.d.ts +0 -2
  516. package/dist/sync/agent-sync.test.d.ts.map +0 -1
  517. package/dist/sync/agent-sync.test.js +0 -130
  518. package/dist/sync/agent-sync.test.js.map +0 -1
  519. package/dist/sync/agents-md-sync.d.ts +0 -7
  520. package/dist/sync/agents-md-sync.d.ts.map +0 -1
  521. package/dist/sync/agents-md-sync.js +0 -44
  522. package/dist/sync/agents-md-sync.js.map +0 -1
  523. package/dist/sync/agents-md-sync.test.d.ts +0 -2
  524. package/dist/sync/agents-md-sync.test.d.ts.map +0 -1
  525. package/dist/sync/agents-md-sync.test.js +0 -154
  526. package/dist/sync/agents-md-sync.test.js.map +0 -1
  527. package/dist/sync/hook-sync.d.ts +0 -8
  528. package/dist/sync/hook-sync.d.ts.map +0 -1
  529. package/dist/sync/hook-sync.js +0 -90
  530. package/dist/sync/hook-sync.js.map +0 -1
  531. package/dist/sync/security-sync.d.ts +0 -9
  532. package/dist/sync/security-sync.d.ts.map +0 -1
  533. package/dist/sync/security-sync.js +0 -161
  534. package/dist/sync/security-sync.js.map +0 -1
  535. package/dist/sync/skill-sync.d.ts +0 -10
  536. package/dist/sync/skill-sync.d.ts.map +0 -1
  537. package/dist/sync/skill-sync.js +0 -87
  538. package/dist/sync/skill-sync.js.map +0 -1
  539. package/dist/sync/skill-sync.test.d.ts +0 -2
  540. package/dist/sync/skill-sync.test.d.ts.map +0 -1
  541. package/dist/sync/skill-sync.test.js +0 -163
  542. package/dist/sync/skill-sync.test.js.map +0 -1
  543. package/dist/wrapper/executable-provider-session.d.ts +0 -26
  544. package/dist/wrapper/executable-provider-session.d.ts.map +0 -1
  545. package/dist/wrapper/executable-provider-session.js +0 -214
  546. package/dist/wrapper/executable-provider-session.js.map +0 -1
@@ -0,0 +1,846 @@
1
+ import { DOCUMENTATION_DOMAINS, MEMORY_LAYER_KINDS, PACKAGE_MANAGER_DOMAINS, SandboxPolicy, SqliteMemoryRepository, MemoryMutationService, } from "@kilnai/core";
2
+ import { existsSync, mkdirSync } from "node:fs";
3
+ import { basename, join } from "node:path";
4
+ import { loadKilnConfig } from "./config-merger.js";
5
+ import { KilnYamlError } from "../kiln-yaml.js";
6
+ import { convertEffectiveMemoryPermissionPolicyToMemoryAuthorityPolicy, resolveEffectivePermissionPolicy, } from "../wrapper/permission-evaluator.js";
7
+ const VALID_NET_POLICIES = [
8
+ "none",
9
+ "documentation",
10
+ "package-managers",
11
+ "full",
12
+ ];
13
+ const VALID_SEARCH_PROVIDER_TYPES = ["none", "http", "searxng", "brave", "tavily", "exa"];
14
+ const VALID_EXTRACT_PROVIDER_TYPES = ["none", "http", "tavily", "firecrawl"];
15
+ const DEFAULT_BRAVE_SEARCH_URL = "https://api.search.brave.com/res/v1/web/search";
16
+ const DEFAULT_TAVILY_SEARCH_URL = "https://api.tavily.com/search";
17
+ const DEFAULT_EXA_SEARCH_URL = "https://api.exa.ai/search";
18
+ const DEFAULT_TAVILY_EXTRACT_URL = "https://api.tavily.com/extract";
19
+ const DEFAULT_FIRECRAWL_SCRAPE_URL = "https://api.firecrawl.dev/v2/scrape";
20
+ export async function loadConfiguredWebToolSurfaceOptions(appConfig, projectPath, options = {}) {
21
+ const config = appConfig.kilnYaml ?? await loadKilnConfig(projectPath);
22
+ return createWebToolSurfaceOptions({ config, projectPath, memoryAuthority: options.memoryAuthority });
23
+ }
24
+ export function createWebToolSurfaceOptions(input) {
25
+ const webConfig = input.config?.web;
26
+ const workspaceResources = { rootPath: input.projectPath };
27
+ const memoryAuthority = resolveMemoryAuthorityPolicy(input);
28
+ const memoryResources = createProjectMemoryResources(input.projectPath, memoryAuthority);
29
+ const memoryMutations = createMemoryMutationOptions(memoryResources?.repository, memoryAuthority, input.memoryAuthority?.caller);
30
+ if (webConfig?.enabled !== true) {
31
+ return {
32
+ workspaceResources,
33
+ ...(memoryResources ? { memoryResources } : {}),
34
+ ...(memoryMutations ? { memoryMutations } : {}),
35
+ };
36
+ }
37
+ const networkPolicy = createWebNetworkPolicy(webConfig, input.projectPath);
38
+ const searchProvider = createConfiguredWebSearchProvider(webConfig.searchProvider, input.fetchImpl);
39
+ const extractProvider = createConfiguredWebExtractProvider(webConfig.extractProvider, input.fetchImpl);
40
+ return {
41
+ workspaceResources,
42
+ ...(memoryResources ? { memoryResources } : {}),
43
+ ...(memoryMutations ? { memoryMutations } : {}),
44
+ webFetch: { networkPolicy },
45
+ webExtract: {
46
+ networkPolicy,
47
+ ...(extractProvider ? { extractProvider } : {}),
48
+ },
49
+ webSearch: {
50
+ networkPolicy,
51
+ ...(searchProvider ? { searchProvider } : {}),
52
+ },
53
+ };
54
+ }
55
+ export function describeWebToolConfiguration(config, sources = {}) {
56
+ const webConfig = config?.web;
57
+ const enabled = webConfig?.enabled === true;
58
+ const netPolicy = webConfig?.netPolicy ?? "none";
59
+ const issues = [];
60
+ let allowedDomains = [];
61
+ let searchProviderType = "none";
62
+ let searchProviderConfigured = false;
63
+ let extractProviderType = "none";
64
+ let extractProviderConfigured = false;
65
+ if (!enabled) {
66
+ issues.push("web.disabled");
67
+ }
68
+ if (!VALID_NET_POLICIES.includes(netPolicy)) {
69
+ issues.push("web.net_policy_invalid");
70
+ }
71
+ else {
72
+ allowedDomains = resolveAllowedDomains(netPolicy, webConfig?.allowedDomains);
73
+ if (enabled && netPolicy === "none") {
74
+ issues.push("web.network_policy_missing");
75
+ }
76
+ }
77
+ const providerConfig = webConfig?.searchProvider;
78
+ if (isRecord(providerConfig) && typeof providerConfig.type === "string") {
79
+ searchProviderType = providerConfig.type;
80
+ }
81
+ else if (providerConfig && !isRecord(providerConfig)) {
82
+ searchProviderType = "invalid";
83
+ }
84
+ searchProviderConfigured = isSearchProviderConfigured(providerConfig);
85
+ const searchProviderSource = resolveProviderSource({
86
+ effectiveProvider: providerConfig,
87
+ globalProvider: sources.globalWeb?.searchProvider,
88
+ projectProvider: sources.projectWeb?.searchProvider,
89
+ });
90
+ if (enabled && !searchProviderConfigured) {
91
+ issues.push("web.search_provider_missing");
92
+ }
93
+ const extractProviderConfig = webConfig?.extractProvider;
94
+ if (isRecord(extractProviderConfig) && typeof extractProviderConfig.type === "string") {
95
+ extractProviderType = extractProviderConfig.type;
96
+ }
97
+ else if (extractProviderConfig && !isRecord(extractProviderConfig)) {
98
+ extractProviderType = "invalid";
99
+ }
100
+ extractProviderConfigured = isExtractProviderConfigured(extractProviderConfig);
101
+ const extractProviderSource = resolveProviderSource({
102
+ effectiveProvider: extractProviderConfig,
103
+ globalProvider: sources.globalWeb?.extractProvider,
104
+ projectProvider: sources.projectWeb?.extractProvider,
105
+ });
106
+ return {
107
+ enabled,
108
+ netPolicy,
109
+ allowedDomains,
110
+ searchProviderType,
111
+ searchProviderConfigured,
112
+ searchProviderSource,
113
+ extractProviderType,
114
+ extractProviderConfigured,
115
+ extractProviderSource,
116
+ issues,
117
+ };
118
+ }
119
+ function resolveProviderSource(input) {
120
+ if (input.projectProvider !== undefined) {
121
+ return "project";
122
+ }
123
+ if (input.globalProvider !== undefined) {
124
+ return "global";
125
+ }
126
+ if (input.effectiveProvider !== undefined) {
127
+ return "effective";
128
+ }
129
+ return "none";
130
+ }
131
+ function createProjectMemoryResources(projectPath, authority) {
132
+ if (!existsSync(projectPath)) {
133
+ return undefined;
134
+ }
135
+ const kilnDir = join(projectPath, ".kiln");
136
+ mkdirSync(kilnDir, { recursive: true });
137
+ return {
138
+ repository: new SqliteMemoryRepository({ dbPath: join(kilnDir, "memory.db") }),
139
+ ...(authority ? { authority } : {}),
140
+ };
141
+ }
142
+ function createMemoryMutationOptions(repository, authority, caller) {
143
+ if (!repository || !authority) {
144
+ return undefined;
145
+ }
146
+ const callerIdentity = caller ?? { kind: "operator_surface", id: "cli" };
147
+ return {
148
+ callerContext: {
149
+ actorType: callerIdentity.kind,
150
+ actorId: callerIdentity.id,
151
+ authority,
152
+ },
153
+ createService: ({ repository: resourceRepository, eventBus, callerContext }) => {
154
+ return new MemoryMutationService({
155
+ repository: resourceRepository ?? repository,
156
+ eventBus,
157
+ sessionId: callerContext.sessionId,
158
+ tenantId: callerContext.tenantId,
159
+ authority,
160
+ });
161
+ },
162
+ };
163
+ }
164
+ function resolveMemoryAuthorityPolicy(input) {
165
+ const requested = input.memoryAuthority;
166
+ if (requested?.policy) {
167
+ return normalizeMemoryAuthorityPolicy(requested.policy);
168
+ }
169
+ const caller = requested?.caller ?? { kind: "operator_surface", id: "cli" };
170
+ const projectScopeId = resolveProjectScopeId(input.projectPath);
171
+ const permissionPolicy = requested?.permissionPolicy ?? input.config?.permissions;
172
+ const permissionAgent = requested?.permissionAgent;
173
+ const explicit = resolveExplicitMemoryAuthority({
174
+ permissionPolicy,
175
+ permissionAgent,
176
+ caller,
177
+ });
178
+ if (explicit) {
179
+ return explicit;
180
+ }
181
+ if (requested?.modelFacingSession === true) {
182
+ return createReadOnlyMemoryAuthority(caller, projectScopeId);
183
+ }
184
+ return undefined;
185
+ }
186
+ function resolveExplicitMemoryAuthority(input) {
187
+ if (!input.permissionPolicy) {
188
+ return undefined;
189
+ }
190
+ if (!hasExplicitMemoryPermission(input.permissionPolicy, input.permissionAgent)) {
191
+ return undefined;
192
+ }
193
+ const effective = resolveEffectivePermissionPolicy(input.permissionPolicy, input.permissionAgent);
194
+ return normalizeMemoryAuthorityPolicy(convertEffectiveMemoryPermissionPolicyToMemoryAuthorityPolicy(effective.policy, input.caller));
195
+ }
196
+ function hasExplicitMemoryPermission(permissionPolicy, permissionAgent) {
197
+ if (Object.prototype.hasOwnProperty.call(permissionPolicy, "memory")) {
198
+ return true;
199
+ }
200
+ if (!permissionAgent || !permissionPolicy.agentScopes) {
201
+ return false;
202
+ }
203
+ for (let index = permissionPolicy.agentScopes.length - 1; index >= 0; index -= 1) {
204
+ const scope = permissionPolicy.agentScopes[index];
205
+ if (!scope || scope.agent !== permissionAgent) {
206
+ continue;
207
+ }
208
+ return Object.prototype.hasOwnProperty.call(scope, "memory");
209
+ }
210
+ return false;
211
+ }
212
+ function createReadOnlyMemoryAuthority(caller, projectScopeId) {
213
+ return normalizeMemoryAuthorityPolicy({
214
+ caller,
215
+ rules: [{
216
+ access: "read",
217
+ operations: ["read"],
218
+ scopeKinds: ["project"],
219
+ scopeIds: [projectScopeId],
220
+ layers: MEMORY_LAYER_KINDS,
221
+ }],
222
+ });
223
+ }
224
+ export function resolveProjectMemoryScope(projectPath) {
225
+ return {
226
+ kind: "project",
227
+ id: resolveProjectScopeId(projectPath),
228
+ };
229
+ }
230
+ function resolveProjectScopeId(projectPath) {
231
+ const normalized = projectPath.replace(/\\/g, "/").replace(/\/+$/g, "");
232
+ const scopeId = basename(normalized);
233
+ return scopeId.trim().length > 0 ? scopeId : normalized;
234
+ }
235
+ function normalizeMemoryAuthorityPolicy(policy) {
236
+ return {
237
+ caller: {
238
+ kind: policy.caller.kind.trim(),
239
+ id: policy.caller.id.trim(),
240
+ },
241
+ rules: policy.rules.map((rule) => ({
242
+ ...rule,
243
+ operations: [...rule.operations],
244
+ ...(rule.scopeKinds ? { scopeKinds: [...rule.scopeKinds] } : {}),
245
+ ...(rule.scopeIds ? { scopeIds: [...rule.scopeIds] } : {}),
246
+ ...(rule.layers ? { layers: [...rule.layers] } : {}),
247
+ })),
248
+ };
249
+ }
250
+ function createWebNetworkPolicy(webConfig, projectPath) {
251
+ const netPolicy = resolveNetPolicy(webConfig.netPolicy);
252
+ const config = {
253
+ fsPolicy: "read-only",
254
+ netPolicy,
255
+ allowedPaths: [],
256
+ deniedPaths: [],
257
+ allowedDomains: resolveAllowedDomains(netPolicy, webConfig.allowedDomains),
258
+ };
259
+ return new SandboxPolicy({ config, projectPath });
260
+ }
261
+ function resolveNetPolicy(value) {
262
+ if (value === undefined) {
263
+ return "none";
264
+ }
265
+ if (VALID_NET_POLICIES.includes(value)) {
266
+ return value;
267
+ }
268
+ throw new KilnYamlError(`web.netPolicy must be one of: ${VALID_NET_POLICIES.join(", ")}`);
269
+ }
270
+ function resolveAllowedDomains(netPolicy, configuredDomains) {
271
+ if (configuredDomains === undefined) {
272
+ return defaultDomainsForPolicy(netPolicy);
273
+ }
274
+ if (!Array.isArray(configuredDomains)) {
275
+ throw new KilnYamlError("web.allowedDomains must be an array of domain strings");
276
+ }
277
+ return uniqueStrings(configuredDomains.map((domain) => normalizeDomain(domain)));
278
+ }
279
+ function defaultDomainsForPolicy(netPolicy) {
280
+ if (netPolicy === "documentation") {
281
+ return DOCUMENTATION_DOMAINS;
282
+ }
283
+ if (netPolicy === "package-managers") {
284
+ return PACKAGE_MANAGER_DOMAINS;
285
+ }
286
+ if (netPolicy === "full") {
287
+ return ["*"];
288
+ }
289
+ return [];
290
+ }
291
+ function normalizeDomain(value) {
292
+ if (typeof value !== "string") {
293
+ throw new KilnYamlError("web.allowedDomains must contain only strings");
294
+ }
295
+ const domain = value.trim().toLowerCase();
296
+ if (!domain) {
297
+ throw new KilnYamlError("web.allowedDomains must not contain empty domains");
298
+ }
299
+ return domain;
300
+ }
301
+ function createConfiguredWebSearchProvider(providerConfig, fetchImpl) {
302
+ if (providerConfig === undefined) {
303
+ return undefined;
304
+ }
305
+ if (!isRecord(providerConfig)) {
306
+ throw new KilnYamlError("web.searchProvider must be an object");
307
+ }
308
+ const type = providerConfig.type;
309
+ if (type === undefined || type === "none") {
310
+ return undefined;
311
+ }
312
+ if (type === "http") {
313
+ return createHttpWebSearchProvider({
314
+ url: requireConfigString(providerConfig, "url", "web.searchProvider.url must be a string"),
315
+ headers: providerConfig.headers,
316
+ }, fetchImpl);
317
+ }
318
+ if (type === "searxng") {
319
+ return createSearxngWebSearchProvider({
320
+ url: requireConfigString(providerConfig, "url", "web.searchProvider.url must be a string"),
321
+ headers: providerConfig.headers,
322
+ }, fetchImpl);
323
+ }
324
+ if (type === "brave") {
325
+ return createBraveWebSearchProvider({
326
+ url: optionalConfigString(providerConfig, "url"),
327
+ apiKeyEnv: requireConfigString(providerConfig, "apiKeyEnv", "web.searchProvider.apiKeyEnv must be a string"),
328
+ }, fetchImpl);
329
+ }
330
+ if (type === "tavily") {
331
+ return createTavilyWebSearchProvider({
332
+ url: optionalConfigString(providerConfig, "url"),
333
+ apiKeyEnv: requireConfigString(providerConfig, "apiKeyEnv", "web.searchProvider.apiKeyEnv must be a string"),
334
+ }, fetchImpl);
335
+ }
336
+ if (type === "exa") {
337
+ return createExaWebSearchProvider({
338
+ url: optionalConfigString(providerConfig, "url"),
339
+ apiKeyEnv: requireConfigString(providerConfig, "apiKeyEnv", "web.searchProvider.apiKeyEnv must be a string"),
340
+ }, fetchImpl);
341
+ }
342
+ throw new KilnYamlError(`web.searchProvider.type must be one of: ${VALID_SEARCH_PROVIDER_TYPES.join(", ")}`);
343
+ }
344
+ function createConfiguredWebExtractProvider(providerConfig, fetchImpl) {
345
+ if (providerConfig === undefined) {
346
+ return undefined;
347
+ }
348
+ if (!isRecord(providerConfig)) {
349
+ throw new KilnYamlError("web.extractProvider must be an object");
350
+ }
351
+ const type = providerConfig.type;
352
+ if (type === undefined || type === "none") {
353
+ return undefined;
354
+ }
355
+ if (type === "http") {
356
+ return createHttpWebExtractProvider({
357
+ url: requireConfigString(providerConfig, "url", "web.extractProvider.url must be a string"),
358
+ headers: providerConfig.headers,
359
+ }, fetchImpl);
360
+ }
361
+ if (type === "tavily") {
362
+ return createTavilyWebExtractProvider({
363
+ url: optionalConfigString(providerConfig, "url", "web.extractProvider"),
364
+ apiKeyEnv: requireConfigString(providerConfig, "apiKeyEnv", "web.extractProvider.apiKeyEnv must be a string"),
365
+ }, fetchImpl);
366
+ }
367
+ if (type === "firecrawl") {
368
+ return createFirecrawlWebExtractProvider({
369
+ url: optionalConfigString(providerConfig, "url", "web.extractProvider"),
370
+ apiKeyEnv: requireConfigString(providerConfig, "apiKeyEnv", "web.extractProvider.apiKeyEnv must be a string"),
371
+ }, fetchImpl);
372
+ }
373
+ throw new KilnYamlError(`web.extractProvider.type must be one of: ${VALID_EXTRACT_PROVIDER_TYPES.join(", ")}`);
374
+ }
375
+ function createHttpWebSearchProvider(providerConfig, fetchImpl) {
376
+ const endpoint = parseProviderEndpoint(providerConfig.url);
377
+ const fetchClient = fetchImpl ?? globalThis.fetch?.bind(globalThis);
378
+ if (!fetchClient) {
379
+ throw new KilnYamlError("web.searchProvider.type=http requires a fetch implementation");
380
+ }
381
+ const headers = normalizeHeaders(providerConfig.headers);
382
+ return async (request) => {
383
+ const response = await fetchClient(endpoint, {
384
+ method: "POST",
385
+ headers: {
386
+ accept: "application/json",
387
+ "content-type": "application/json",
388
+ ...headers,
389
+ },
390
+ body: JSON.stringify(request),
391
+ });
392
+ if (!response.ok) {
393
+ throw new Error(`Web search provider returned HTTP ${response.status}`);
394
+ }
395
+ return normalizeProviderResponse(await response.json());
396
+ };
397
+ }
398
+ function createHttpWebExtractProvider(providerConfig, fetchImpl) {
399
+ const endpoint = parseProviderEndpoint(providerConfig.url, "web.extractProvider.url");
400
+ const fetchClient = requireFetchClient("web.extractProvider.type=http", fetchImpl);
401
+ const headers = normalizeHeaders(providerConfig.headers, "web.extractProvider.headers");
402
+ return async (request) => {
403
+ const response = await fetchClient(endpoint, {
404
+ method: "POST",
405
+ headers: {
406
+ accept: "application/json",
407
+ "content-type": "application/json",
408
+ ...headers,
409
+ },
410
+ body: JSON.stringify(request),
411
+ });
412
+ if (!response.ok) {
413
+ throw new Error(`Web extract provider returned HTTP ${response.status}`);
414
+ }
415
+ return normalizeExtractProviderResponse(await response.json());
416
+ };
417
+ }
418
+ function createTavilyWebExtractProvider(providerConfig, fetchImpl) {
419
+ const endpoint = parseProviderEndpoint(providerConfig.url ?? DEFAULT_TAVILY_EXTRACT_URL, "web.extractProvider.url");
420
+ const fetchClient = requireFetchClient("web.extractProvider.type=tavily", fetchImpl);
421
+ const apiKey = readRequiredEnv(providerConfig.apiKeyEnv, "web.extractProvider.apiKeyEnv");
422
+ return async (request) => {
423
+ const response = await fetchClient(endpoint, {
424
+ method: "POST",
425
+ headers: {
426
+ accept: "application/json",
427
+ authorization: `Bearer ${apiKey}`,
428
+ "content-type": "application/json",
429
+ },
430
+ body: JSON.stringify({
431
+ urls: request.urls.length === 1 ? request.urls[0] : [...request.urls],
432
+ extract_depth: "basic",
433
+ format: request.format,
434
+ timeout: Math.min(60, Math.max(1, Math.ceil(request.timeoutMs / 1000))),
435
+ }),
436
+ });
437
+ if (!response.ok) {
438
+ throw new Error(`Web extract provider returned HTTP ${response.status}`);
439
+ }
440
+ return normalizeTavilyExtractResponse(await response.json(), request.format);
441
+ };
442
+ }
443
+ function createFirecrawlWebExtractProvider(providerConfig, fetchImpl) {
444
+ const endpoint = parseProviderEndpoint(providerConfig.url ?? DEFAULT_FIRECRAWL_SCRAPE_URL, "web.extractProvider.url");
445
+ const fetchClient = requireFetchClient("web.extractProvider.type=firecrawl", fetchImpl);
446
+ const apiKey = readRequiredEnv(providerConfig.apiKeyEnv, "web.extractProvider.apiKeyEnv");
447
+ return async (request) => {
448
+ const pages = [];
449
+ for (const url of request.urls) {
450
+ const response = await fetchClient(endpoint, {
451
+ method: "POST",
452
+ headers: {
453
+ accept: "application/json",
454
+ authorization: `Bearer ${apiKey}`,
455
+ "content-type": "application/json",
456
+ },
457
+ body: JSON.stringify({
458
+ url,
459
+ formats: [request.format === "markdown" ? "markdown" : "html"],
460
+ onlyMainContent: true,
461
+ timeout: request.timeoutMs,
462
+ }),
463
+ });
464
+ if (!response.ok) {
465
+ throw new Error(`Web extract provider returned HTTP ${response.status}`);
466
+ }
467
+ pages.push(normalizeFirecrawlExtractPage(await response.json(), url, request.format));
468
+ }
469
+ return {
470
+ provider: "firecrawl",
471
+ pages,
472
+ };
473
+ };
474
+ }
475
+ function createSearxngWebSearchProvider(providerConfig, fetchImpl) {
476
+ const baseUrl = parseProviderEndpoint(providerConfig.url);
477
+ const fetchClient = requireFetchClient("web.searchProvider.type=searxng", fetchImpl);
478
+ const headers = normalizeHeaders(providerConfig.headers);
479
+ return async (request) => {
480
+ const endpoint = new URL("search", ensureTrailingSlash(baseUrl));
481
+ endpoint.searchParams.set("q", scopedQuery(request.query, request.domains));
482
+ endpoint.searchParams.set("format", "json");
483
+ endpoint.searchParams.set("language", "all");
484
+ endpoint.searchParams.set("safesearch", "1");
485
+ const response = await fetchClient(endpoint, {
486
+ method: "GET",
487
+ headers: {
488
+ accept: "application/json",
489
+ ...headers,
490
+ },
491
+ });
492
+ if (!response.ok) {
493
+ throw new Error(`Web search provider returned HTTP ${response.status}`);
494
+ }
495
+ return normalizeSearxngResponse(await response.json());
496
+ };
497
+ }
498
+ function createBraveWebSearchProvider(providerConfig, fetchImpl) {
499
+ const endpoint = parseProviderEndpoint(providerConfig.url ?? DEFAULT_BRAVE_SEARCH_URL);
500
+ const fetchClient = requireFetchClient("web.searchProvider.type=brave", fetchImpl);
501
+ const apiKey = readRequiredEnv(providerConfig.apiKeyEnv, "web.searchProvider.apiKeyEnv");
502
+ return async (request) => {
503
+ const url = new URL(endpoint);
504
+ url.searchParams.set("q", scopedQuery(request.query, request.domains));
505
+ url.searchParams.set("count", String(request.maxResults));
506
+ if (request.recencyDays !== undefined) {
507
+ url.searchParams.set("freshness", `${request.recencyDays}d`);
508
+ }
509
+ const response = await fetchClient(url, {
510
+ method: "GET",
511
+ headers: {
512
+ accept: "application/json",
513
+ "x-subscription-token": apiKey,
514
+ },
515
+ });
516
+ if (!response.ok) {
517
+ throw new Error(`Web search provider returned HTTP ${response.status}`);
518
+ }
519
+ return normalizeBraveResponse(await response.json());
520
+ };
521
+ }
522
+ function createTavilyWebSearchProvider(providerConfig, fetchImpl) {
523
+ const endpoint = parseProviderEndpoint(providerConfig.url ?? DEFAULT_TAVILY_SEARCH_URL);
524
+ const fetchClient = requireFetchClient("web.searchProvider.type=tavily", fetchImpl);
525
+ const apiKey = readRequiredEnv(providerConfig.apiKeyEnv, "web.searchProvider.apiKeyEnv");
526
+ return async (request) => {
527
+ const body = {
528
+ query: request.query,
529
+ max_results: request.maxResults,
530
+ include_answer: false,
531
+ include_raw_content: false,
532
+ search_depth: "basic",
533
+ };
534
+ if (request.domains.length > 0) {
535
+ body.include_domains = request.domains;
536
+ }
537
+ if (request.recencyDays !== undefined) {
538
+ body.days = request.recencyDays;
539
+ }
540
+ const response = await fetchClient(endpoint, {
541
+ method: "POST",
542
+ headers: {
543
+ accept: "application/json",
544
+ authorization: `Bearer ${apiKey}`,
545
+ "content-type": "application/json",
546
+ },
547
+ body: JSON.stringify(body),
548
+ });
549
+ if (!response.ok) {
550
+ throw new Error(`Web search provider returned HTTP ${response.status}`);
551
+ }
552
+ return normalizeTavilyResponse(await response.json());
553
+ };
554
+ }
555
+ function createExaWebSearchProvider(providerConfig, fetchImpl) {
556
+ const endpoint = parseProviderEndpoint(providerConfig.url ?? DEFAULT_EXA_SEARCH_URL);
557
+ const fetchClient = requireFetchClient("web.searchProvider.type=exa", fetchImpl);
558
+ const apiKey = readRequiredEnv(providerConfig.apiKeyEnv, "web.searchProvider.apiKeyEnv");
559
+ return async (request) => {
560
+ const response = await fetchClient(endpoint, {
561
+ method: "POST",
562
+ headers: {
563
+ accept: "application/json",
564
+ "content-type": "application/json",
565
+ "x-api-key": apiKey,
566
+ },
567
+ body: JSON.stringify({
568
+ query: scopedQuery(request.query, request.domains),
569
+ type: "auto",
570
+ numResults: request.maxResults,
571
+ contents: { highlights: true },
572
+ }),
573
+ });
574
+ if (!response.ok) {
575
+ throw new Error(`Web search provider returned HTTP ${response.status}`);
576
+ }
577
+ return normalizeExaResponse(await response.json());
578
+ };
579
+ }
580
+ function parseProviderEndpoint(value, field = "web.searchProvider.url") {
581
+ let url;
582
+ try {
583
+ url = new URL(value);
584
+ }
585
+ catch {
586
+ throw new KilnYamlError(`${field} must be a valid URL`);
587
+ }
588
+ if (url.protocol !== "https:" && url.protocol !== "http:") {
589
+ throw new KilnYamlError(`${field} must use http or https`);
590
+ }
591
+ if (url.username || url.password) {
592
+ throw new KilnYamlError(`${field} must not include credentials`);
593
+ }
594
+ url.hash = "";
595
+ return url.toString();
596
+ }
597
+ function requireFetchClient(providerLabel, fetchImpl) {
598
+ const fetchClient = fetchImpl ?? globalThis.fetch?.bind(globalThis);
599
+ if (!fetchClient) {
600
+ throw new KilnYamlError(`${providerLabel} requires a fetch implementation`);
601
+ }
602
+ return fetchClient;
603
+ }
604
+ function ensureTrailingSlash(value) {
605
+ return value.endsWith("/") ? value : `${value}/`;
606
+ }
607
+ function readRequiredEnv(name, field) {
608
+ const envName = name.trim();
609
+ if (!envName) {
610
+ throw new KilnYamlError(`${field} must be a non-empty string`);
611
+ }
612
+ const value = process.env[envName];
613
+ if (!value) {
614
+ throw new KilnYamlError(`${field} references unset environment variable ${envName}`);
615
+ }
616
+ return value;
617
+ }
618
+ function normalizeHeaders(headers, field = "web.searchProvider.headers") {
619
+ if (!headers)
620
+ return {};
621
+ if (!isRecord(headers)) {
622
+ throw new KilnYamlError(`${field} must be an object`);
623
+ }
624
+ const out = {};
625
+ for (const [name, value] of Object.entries(headers)) {
626
+ if (!name.trim() || typeof value !== "string") {
627
+ throw new KilnYamlError(`${field} must map non-empty header names to string values`);
628
+ }
629
+ out[name.trim()] = value;
630
+ }
631
+ return out;
632
+ }
633
+ function requireConfigString(value, key, message) {
634
+ const field = value[key];
635
+ if (typeof field !== "string") {
636
+ throw new KilnYamlError(message);
637
+ }
638
+ return field;
639
+ }
640
+ function optionalConfigString(value, key, parent = "web.searchProvider") {
641
+ const field = value[key];
642
+ if (field === undefined) {
643
+ return undefined;
644
+ }
645
+ if (typeof field !== "string") {
646
+ throw new KilnYamlError(`${parent}.${key} must be a string`);
647
+ }
648
+ return field;
649
+ }
650
+ function isSearchProviderConfigured(providerConfig) {
651
+ if (!providerConfig || !isRecord(providerConfig)) {
652
+ return false;
653
+ }
654
+ const type = providerConfig.type;
655
+ if (type === undefined || type === "none") {
656
+ return false;
657
+ }
658
+ return typeof type === "string"
659
+ && VALID_SEARCH_PROVIDER_TYPES.includes(type);
660
+ }
661
+ function isExtractProviderConfigured(providerConfig) {
662
+ if (!providerConfig || !isRecord(providerConfig)) {
663
+ return false;
664
+ }
665
+ const type = providerConfig.type;
666
+ if (type === undefined || type === "none") {
667
+ return false;
668
+ }
669
+ return typeof type === "string"
670
+ && VALID_EXTRACT_PROVIDER_TYPES.includes(type);
671
+ }
672
+ function normalizeProviderResponse(value) {
673
+ if (!isRecord(value) || !Array.isArray(value.sources)) {
674
+ throw new Error("Web search provider response must include a sources array");
675
+ }
676
+ return {
677
+ ...(typeof value.provider === "string" ? { provider: value.provider } : {}),
678
+ ...(typeof value.retrievedAt === "string" ? { retrievedAt: value.retrievedAt } : {}),
679
+ sources: value.sources.map(normalizeSource),
680
+ };
681
+ }
682
+ function normalizeSearxngResponse(value) {
683
+ if (!isRecord(value) || !Array.isArray(value.results)) {
684
+ throw new Error("SearXNG response must include a results array");
685
+ }
686
+ return {
687
+ provider: "searxng",
688
+ sources: value.results.map((result) => normalizeSearchResult(result, {
689
+ snippetKeys: ["content", "snippet"],
690
+ publishedAtKeys: ["publishedDate", "published_date"],
691
+ })),
692
+ };
693
+ }
694
+ function normalizeBraveResponse(value) {
695
+ const results = isRecord(value) && isRecord(value.web) && Array.isArray(value.web.results)
696
+ ? value.web.results
697
+ : [];
698
+ return {
699
+ provider: "brave",
700
+ sources: results.map((result) => normalizeSearchResult(result, {
701
+ snippetKeys: ["description", "content", "snippet"],
702
+ publishedAtKeys: ["age", "publishedDate", "published_date"],
703
+ })),
704
+ };
705
+ }
706
+ function normalizeTavilyResponse(value) {
707
+ if (!isRecord(value) || !Array.isArray(value.results)) {
708
+ throw new Error("Tavily response must include a results array");
709
+ }
710
+ return {
711
+ provider: "tavily",
712
+ sources: value.results.map((result) => normalizeSearchResult(result, {
713
+ snippetKeys: ["content", "snippet"],
714
+ publishedAtKeys: ["published_date", "publishedDate"],
715
+ })),
716
+ };
717
+ }
718
+ function normalizeExaResponse(value) {
719
+ if (!isRecord(value) || !Array.isArray(value.results)) {
720
+ throw new Error("Exa response must include a results array");
721
+ }
722
+ return {
723
+ provider: "exa",
724
+ sources: value.results.map((result) => normalizeSearchResult(result, {
725
+ snippetKeys: ["text", "summary", "snippet"],
726
+ publishedAtKeys: ["publishedDate", "published_date"],
727
+ })),
728
+ };
729
+ }
730
+ function normalizeExtractProviderResponse(value) {
731
+ if (!isRecord(value) || !Array.isArray(value.pages)) {
732
+ throw new Error("Web extract provider response must include a pages array");
733
+ }
734
+ return {
735
+ ...(typeof value.provider === "string" ? { provider: value.provider } : {}),
736
+ ...(typeof value.retrievedAt === "string" ? { retrievedAt: value.retrievedAt } : {}),
737
+ pages: value.pages.map((page) => normalizeExtractPage(page, "provider")),
738
+ };
739
+ }
740
+ function normalizeTavilyExtractResponse(value, format) {
741
+ if (!isRecord(value) || !Array.isArray(value.results)) {
742
+ throw new Error("Tavily extract response must include a results array");
743
+ }
744
+ return {
745
+ provider: "tavily",
746
+ pages: value.results.map((page) => normalizeExtractPage(page, "tavily", format)),
747
+ };
748
+ }
749
+ function normalizeFirecrawlExtractPage(value, requestedUrl, format) {
750
+ const data = isRecord(value) && isRecord(value.data) ? value.data : value;
751
+ if (!isRecord(data)) {
752
+ throw new Error("Firecrawl scrape response must include a data object");
753
+ }
754
+ const metadata = isRecord(data.metadata) ? data.metadata : {};
755
+ const text = extractPageText(data, format);
756
+ return {
757
+ url: firstString(metadata, ["sourceURL", "sourceUrl", "url"]) ?? requestedUrl,
758
+ normalizedUrl: firstString(metadata, ["sourceURL", "sourceUrl", "url"]) ?? requestedUrl,
759
+ ...(firstString(metadata, ["title"]) ? { title: firstString(metadata, ["title"]) } : {}),
760
+ ...(firstString(data, ["contentType", "mimeType"]) ? { contentType: firstString(data, ["contentType", "mimeType"]) } : {}),
761
+ ...(typeof metadata.statusCode === "number" ? { status: metadata.statusCode } : {}),
762
+ text,
763
+ bytesRead: Buffer.byteLength(text, "utf8"),
764
+ };
765
+ }
766
+ function normalizeExtractPage(value, provider, format = "markdown") {
767
+ if (!isRecord(value) || typeof value.url !== "string") {
768
+ throw new Error(`${provider} extract result.url must be a string`);
769
+ }
770
+ const text = extractPageText(value, format);
771
+ return {
772
+ url: value.url,
773
+ ...(typeof value.normalizedUrl === "string" ? { normalizedUrl: value.normalizedUrl } : {}),
774
+ ...(typeof value.title === "string" ? { title: value.title } : {}),
775
+ ...(typeof value.contentType === "string" ? { contentType: value.contentType } : {}),
776
+ ...(typeof value.status === "number" ? { status: value.status } : {}),
777
+ text,
778
+ ...(typeof value.bytesRead === "number" ? { bytesRead: value.bytesRead } : { bytesRead: Buffer.byteLength(text, "utf8") }),
779
+ ...(typeof value.truncated === "boolean" ? { truncated: value.truncated } : {}),
780
+ };
781
+ }
782
+ function extractPageText(value, format) {
783
+ const text = format === "markdown"
784
+ ? firstString(value, ["markdown", "raw_content", "rawContent", "content", "text", "html"])
785
+ : firstString(value, ["text", "raw_content", "rawContent", "content", "markdown", "html"]);
786
+ if (!text) {
787
+ throw new Error("Web extract provider page must include extracted text");
788
+ }
789
+ return text;
790
+ }
791
+ function normalizeSearchResult(value, options) {
792
+ if (!isRecord(value) || typeof value.url !== "string") {
793
+ throw new Error("Web search provider result.url must be a string");
794
+ }
795
+ const highlights = Array.isArray(value.highlights)
796
+ ? value.highlights.filter((item) => typeof item === "string")
797
+ : [];
798
+ const snippet = firstString(value, options.snippetKeys) ?? highlights[0];
799
+ return {
800
+ url: value.url,
801
+ ...(typeof value.title === "string" ? { title: value.title } : {}),
802
+ ...(snippet ? { snippet } : {}),
803
+ ...(firstString(value, options.publishedAtKeys) ? { publishedAt: firstString(value, options.publishedAtKeys) } : {}),
804
+ ...(typeof value.source === "string" ? { source: value.source } : {}),
805
+ };
806
+ }
807
+ function firstString(value, keys) {
808
+ for (const key of keys) {
809
+ const candidate = value[key];
810
+ if (typeof candidate === "string" && candidate.trim().length > 0) {
811
+ return candidate;
812
+ }
813
+ }
814
+ return undefined;
815
+ }
816
+ function scopedQuery(query, domains) {
817
+ if (domains.length === 0) {
818
+ return query;
819
+ }
820
+ return `${query} ${domains.map((domain) => `site:${domain}`).join(" ")}`;
821
+ }
822
+ function normalizeSource(value) {
823
+ if (!isRecord(value) || typeof value.url !== "string") {
824
+ throw new Error("Web search provider source.url must be a string");
825
+ }
826
+ return {
827
+ url: value.url,
828
+ ...(typeof value.title === "string" ? { title: value.title } : {}),
829
+ ...(typeof value.snippet === "string" ? { snippet: value.snippet } : {}),
830
+ ...(typeof value.publishedAt === "string" ? { publishedAt: value.publishedAt } : {}),
831
+ ...(typeof value.source === "string" ? { source: value.source } : {}),
832
+ };
833
+ }
834
+ function isRecord(value) {
835
+ return typeof value === "object" && value !== null && !Array.isArray(value);
836
+ }
837
+ function uniqueStrings(values) {
838
+ const out = [];
839
+ for (const value of values) {
840
+ if (!out.includes(value)) {
841
+ out.push(value);
842
+ }
843
+ }
844
+ return out;
845
+ }
846
+ //# sourceMappingURL=web-tools-config.js.map