@studiometa/forge-core 0.0.1 → 0.2.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 (254) hide show
  1. package/README.md +151 -0
  2. package/dist/constants.d.ts +13 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/context.d.ts +30 -0
  5. package/dist/context.d.ts.map +1 -0
  6. package/dist/executors/backups/create.d.ts +8 -0
  7. package/dist/executors/backups/create.d.ts.map +1 -0
  8. package/dist/executors/backups/delete.d.ts +7 -0
  9. package/dist/executors/backups/delete.d.ts.map +1 -0
  10. package/dist/executors/backups/get.d.ts +8 -0
  11. package/dist/executors/backups/get.d.ts.map +1 -0
  12. package/dist/executors/backups/index.d.ts +6 -0
  13. package/dist/executors/backups/index.d.ts.map +1 -0
  14. package/dist/executors/backups/list.d.ts +8 -0
  15. package/dist/executors/backups/list.d.ts.map +1 -0
  16. package/dist/executors/backups/types.d.ts +31 -0
  17. package/dist/executors/backups/types.d.ts.map +1 -0
  18. package/dist/executors/certificates/activate.d.ts +7 -0
  19. package/dist/executors/certificates/activate.d.ts.map +1 -0
  20. package/dist/executors/certificates/create.d.ts +8 -0
  21. package/dist/executors/certificates/create.d.ts.map +1 -0
  22. package/dist/executors/certificates/delete.d.ts +7 -0
  23. package/dist/executors/certificates/delete.d.ts.map +1 -0
  24. package/dist/executors/certificates/get.d.ts +8 -0
  25. package/dist/executors/certificates/get.d.ts.map +1 -0
  26. package/dist/executors/certificates/index.d.ts +7 -0
  27. package/dist/executors/certificates/index.d.ts.map +1 -0
  28. package/dist/executors/certificates/list.d.ts +8 -0
  29. package/dist/executors/certificates/list.d.ts.map +1 -0
  30. package/dist/executors/certificates/types.d.ts +43 -0
  31. package/dist/executors/certificates/types.d.ts.map +1 -0
  32. package/dist/executors/commands/create.d.ts +8 -0
  33. package/dist/executors/commands/create.d.ts.map +1 -0
  34. package/dist/executors/commands/get.d.ts +8 -0
  35. package/dist/executors/commands/get.d.ts.map +1 -0
  36. package/dist/executors/commands/index.d.ts +5 -0
  37. package/dist/executors/commands/index.d.ts.map +1 -0
  38. package/dist/executors/commands/list.d.ts +8 -0
  39. package/dist/executors/commands/list.d.ts.map +1 -0
  40. package/dist/executors/commands/types.d.ts +27 -0
  41. package/dist/executors/commands/types.d.ts.map +1 -0
  42. package/dist/executors/daemons/create.d.ts +8 -0
  43. package/dist/executors/daemons/create.d.ts.map +1 -0
  44. package/dist/executors/daemons/delete.d.ts +7 -0
  45. package/dist/executors/daemons/delete.d.ts.map +1 -0
  46. package/dist/executors/daemons/get.d.ts +8 -0
  47. package/dist/executors/daemons/get.d.ts.map +1 -0
  48. package/dist/executors/daemons/index.d.ts +7 -0
  49. package/dist/executors/daemons/index.d.ts.map +1 -0
  50. package/dist/executors/daemons/list.d.ts +8 -0
  51. package/dist/executors/daemons/list.d.ts.map +1 -0
  52. package/dist/executors/daemons/restart.d.ts +7 -0
  53. package/dist/executors/daemons/restart.d.ts.map +1 -0
  54. package/dist/executors/daemons/types.d.ts +38 -0
  55. package/dist/executors/daemons/types.d.ts.map +1 -0
  56. package/dist/executors/database-users/create.d.ts +8 -0
  57. package/dist/executors/database-users/create.d.ts.map +1 -0
  58. package/dist/executors/database-users/delete.d.ts +7 -0
  59. package/dist/executors/database-users/delete.d.ts.map +1 -0
  60. package/dist/executors/database-users/get.d.ts +8 -0
  61. package/dist/executors/database-users/get.d.ts.map +1 -0
  62. package/dist/executors/database-users/index.d.ts +6 -0
  63. package/dist/executors/database-users/index.d.ts.map +1 -0
  64. package/dist/executors/database-users/list.d.ts +8 -0
  65. package/dist/executors/database-users/list.d.ts.map +1 -0
  66. package/dist/executors/database-users/types.d.ts +31 -0
  67. package/dist/executors/database-users/types.d.ts.map +1 -0
  68. package/dist/executors/databases/create.d.ts +8 -0
  69. package/dist/executors/databases/create.d.ts.map +1 -0
  70. package/dist/executors/databases/delete.d.ts +7 -0
  71. package/dist/executors/databases/delete.d.ts.map +1 -0
  72. package/dist/executors/databases/get.d.ts +8 -0
  73. package/dist/executors/databases/get.d.ts.map +1 -0
  74. package/dist/executors/databases/index.d.ts +6 -0
  75. package/dist/executors/databases/index.d.ts.map +1 -0
  76. package/dist/executors/databases/list.d.ts +8 -0
  77. package/dist/executors/databases/list.d.ts.map +1 -0
  78. package/dist/executors/databases/types.d.ts +31 -0
  79. package/dist/executors/databases/types.d.ts.map +1 -0
  80. package/dist/executors/deployments/deploy-and-wait.d.ts +13 -0
  81. package/dist/executors/deployments/deploy-and-wait.d.ts.map +1 -0
  82. package/dist/executors/deployments/deploy.d.ts +7 -0
  83. package/dist/executors/deployments/deploy.d.ts.map +1 -0
  84. package/dist/executors/deployments/get-log.d.ts +7 -0
  85. package/dist/executors/deployments/get-log.d.ts.map +1 -0
  86. package/dist/executors/deployments/get-output.d.ts +7 -0
  87. package/dist/executors/deployments/get-output.d.ts.map +1 -0
  88. package/dist/executors/deployments/get-script.d.ts +7 -0
  89. package/dist/executors/deployments/get-script.d.ts.map +1 -0
  90. package/dist/executors/deployments/index.d.ts +9 -0
  91. package/dist/executors/deployments/index.d.ts.map +1 -0
  92. package/dist/executors/deployments/list.d.ts +8 -0
  93. package/dist/executors/deployments/list.d.ts.map +1 -0
  94. package/dist/executors/deployments/types.d.ts +72 -0
  95. package/dist/executors/deployments/types.d.ts.map +1 -0
  96. package/dist/executors/deployments/update-script.d.ts +7 -0
  97. package/dist/executors/deployments/update-script.d.ts.map +1 -0
  98. package/dist/executors/env/get.d.ts +7 -0
  99. package/dist/executors/env/get.d.ts.map +1 -0
  100. package/dist/executors/env/index.d.ts +4 -0
  101. package/dist/executors/env/index.d.ts.map +1 -0
  102. package/dist/executors/env/types.d.ts +19 -0
  103. package/dist/executors/env/types.d.ts.map +1 -0
  104. package/dist/executors/env/update.d.ts +7 -0
  105. package/dist/executors/env/update.d.ts.map +1 -0
  106. package/dist/executors/firewall-rules/create.d.ts +5 -0
  107. package/dist/executors/firewall-rules/create.d.ts.map +1 -0
  108. package/dist/executors/firewall-rules/delete.d.ts +4 -0
  109. package/dist/executors/firewall-rules/delete.d.ts.map +1 -0
  110. package/dist/executors/firewall-rules/get.d.ts +5 -0
  111. package/dist/executors/firewall-rules/get.d.ts.map +1 -0
  112. package/dist/executors/firewall-rules/index.d.ts +6 -0
  113. package/dist/executors/firewall-rules/index.d.ts.map +1 -0
  114. package/dist/executors/firewall-rules/list.d.ts +5 -0
  115. package/dist/executors/firewall-rules/list.d.ts.map +1 -0
  116. package/dist/executors/firewall-rules/types.d.ts +31 -0
  117. package/dist/executors/firewall-rules/types.d.ts.map +1 -0
  118. package/dist/executors/monitors/create.d.ts +5 -0
  119. package/dist/executors/monitors/create.d.ts.map +1 -0
  120. package/dist/executors/monitors/delete.d.ts +4 -0
  121. package/dist/executors/monitors/delete.d.ts.map +1 -0
  122. package/dist/executors/monitors/get.d.ts +5 -0
  123. package/dist/executors/monitors/get.d.ts.map +1 -0
  124. package/dist/executors/monitors/index.d.ts +6 -0
  125. package/dist/executors/monitors/index.d.ts.map +1 -0
  126. package/dist/executors/monitors/list.d.ts +5 -0
  127. package/dist/executors/monitors/list.d.ts.map +1 -0
  128. package/dist/executors/monitors/types.d.ts +31 -0
  129. package/dist/executors/monitors/types.d.ts.map +1 -0
  130. package/dist/executors/nginx/get.d.ts +7 -0
  131. package/dist/executors/nginx/get.d.ts.map +1 -0
  132. package/dist/executors/nginx/index.d.ts +4 -0
  133. package/dist/executors/nginx/index.d.ts.map +1 -0
  134. package/dist/executors/nginx/types.d.ts +19 -0
  135. package/dist/executors/nginx/types.d.ts.map +1 -0
  136. package/dist/executors/nginx/update.d.ts +7 -0
  137. package/dist/executors/nginx/update.d.ts.map +1 -0
  138. package/dist/executors/nginx-templates/create.d.ts +5 -0
  139. package/dist/executors/nginx-templates/create.d.ts.map +1 -0
  140. package/dist/executors/nginx-templates/delete.d.ts +4 -0
  141. package/dist/executors/nginx-templates/delete.d.ts.map +1 -0
  142. package/dist/executors/nginx-templates/get.d.ts +5 -0
  143. package/dist/executors/nginx-templates/get.d.ts.map +1 -0
  144. package/dist/executors/nginx-templates/index.d.ts +7 -0
  145. package/dist/executors/nginx-templates/index.d.ts.map +1 -0
  146. package/dist/executors/nginx-templates/list.d.ts +5 -0
  147. package/dist/executors/nginx-templates/list.d.ts.map +1 -0
  148. package/dist/executors/nginx-templates/types.d.ts +40 -0
  149. package/dist/executors/nginx-templates/types.d.ts.map +1 -0
  150. package/dist/executors/nginx-templates/update.d.ts +5 -0
  151. package/dist/executors/nginx-templates/update.d.ts.map +1 -0
  152. package/dist/executors/recipes/create.d.ts +5 -0
  153. package/dist/executors/recipes/create.d.ts.map +1 -0
  154. package/dist/executors/recipes/delete.d.ts +4 -0
  155. package/dist/executors/recipes/delete.d.ts.map +1 -0
  156. package/dist/executors/recipes/get.d.ts +5 -0
  157. package/dist/executors/recipes/get.d.ts.map +1 -0
  158. package/dist/executors/recipes/index.d.ts +7 -0
  159. package/dist/executors/recipes/index.d.ts.map +1 -0
  160. package/dist/executors/recipes/list.d.ts +5 -0
  161. package/dist/executors/recipes/list.d.ts.map +1 -0
  162. package/dist/executors/recipes/run.d.ts +7 -0
  163. package/dist/executors/recipes/run.d.ts.map +1 -0
  164. package/dist/executors/recipes/types.d.ts +34 -0
  165. package/dist/executors/recipes/types.d.ts.map +1 -0
  166. package/dist/executors/redirect-rules/create.d.ts +5 -0
  167. package/dist/executors/redirect-rules/create.d.ts.map +1 -0
  168. package/dist/executors/redirect-rules/delete.d.ts +4 -0
  169. package/dist/executors/redirect-rules/delete.d.ts.map +1 -0
  170. package/dist/executors/redirect-rules/get.d.ts +5 -0
  171. package/dist/executors/redirect-rules/get.d.ts.map +1 -0
  172. package/dist/executors/redirect-rules/index.d.ts +6 -0
  173. package/dist/executors/redirect-rules/index.d.ts.map +1 -0
  174. package/dist/executors/redirect-rules/list.d.ts +5 -0
  175. package/dist/executors/redirect-rules/list.d.ts.map +1 -0
  176. package/dist/executors/redirect-rules/types.d.ts +35 -0
  177. package/dist/executors/redirect-rules/types.d.ts.map +1 -0
  178. package/dist/executors/scheduled-jobs/create.d.ts +8 -0
  179. package/dist/executors/scheduled-jobs/create.d.ts.map +1 -0
  180. package/dist/executors/scheduled-jobs/delete.d.ts +7 -0
  181. package/dist/executors/scheduled-jobs/delete.d.ts.map +1 -0
  182. package/dist/executors/scheduled-jobs/get.d.ts +8 -0
  183. package/dist/executors/scheduled-jobs/get.d.ts.map +1 -0
  184. package/dist/executors/scheduled-jobs/index.d.ts +6 -0
  185. package/dist/executors/scheduled-jobs/index.d.ts.map +1 -0
  186. package/dist/executors/scheduled-jobs/list.d.ts +8 -0
  187. package/dist/executors/scheduled-jobs/list.d.ts.map +1 -0
  188. package/dist/executors/scheduled-jobs/types.d.ts +31 -0
  189. package/dist/executors/scheduled-jobs/types.d.ts.map +1 -0
  190. package/dist/executors/security-rules/create.d.ts +5 -0
  191. package/dist/executors/security-rules/create.d.ts.map +1 -0
  192. package/dist/executors/security-rules/delete.d.ts +4 -0
  193. package/dist/executors/security-rules/delete.d.ts.map +1 -0
  194. package/dist/executors/security-rules/get.d.ts +5 -0
  195. package/dist/executors/security-rules/get.d.ts.map +1 -0
  196. package/dist/executors/security-rules/index.d.ts +6 -0
  197. package/dist/executors/security-rules/index.d.ts.map +1 -0
  198. package/dist/executors/security-rules/list.d.ts +5 -0
  199. package/dist/executors/security-rules/list.d.ts.map +1 -0
  200. package/dist/executors/security-rules/types.d.ts +35 -0
  201. package/dist/executors/security-rules/types.d.ts.map +1 -0
  202. package/dist/executors/servers/create.d.ts +8 -0
  203. package/dist/executors/servers/create.d.ts.map +1 -0
  204. package/dist/executors/servers/delete.d.ts +7 -0
  205. package/dist/executors/servers/delete.d.ts.map +1 -0
  206. package/dist/executors/servers/get.d.ts +8 -0
  207. package/dist/executors/servers/get.d.ts.map +1 -0
  208. package/dist/executors/servers/index.d.ts +7 -0
  209. package/dist/executors/servers/index.d.ts.map +1 -0
  210. package/dist/executors/servers/list.d.ts +8 -0
  211. package/dist/executors/servers/list.d.ts.map +1 -0
  212. package/dist/executors/servers/reboot.d.ts +7 -0
  213. package/dist/executors/servers/reboot.d.ts.map +1 -0
  214. package/dist/executors/servers/types.d.ts +33 -0
  215. package/dist/executors/servers/types.d.ts.map +1 -0
  216. package/dist/executors/sites/create.d.ts +8 -0
  217. package/dist/executors/sites/create.d.ts.map +1 -0
  218. package/dist/executors/sites/delete.d.ts +7 -0
  219. package/dist/executors/sites/delete.d.ts.map +1 -0
  220. package/dist/executors/sites/get.d.ts +8 -0
  221. package/dist/executors/sites/get.d.ts.map +1 -0
  222. package/dist/executors/sites/index.d.ts +6 -0
  223. package/dist/executors/sites/index.d.ts.map +1 -0
  224. package/dist/executors/sites/list.d.ts +8 -0
  225. package/dist/executors/sites/list.d.ts.map +1 -0
  226. package/dist/executors/sites/types.d.ts +31 -0
  227. package/dist/executors/sites/types.d.ts.map +1 -0
  228. package/dist/executors/ssh-keys/create.d.ts +5 -0
  229. package/dist/executors/ssh-keys/create.d.ts.map +1 -0
  230. package/dist/executors/ssh-keys/delete.d.ts +4 -0
  231. package/dist/executors/ssh-keys/delete.d.ts.map +1 -0
  232. package/dist/executors/ssh-keys/get.d.ts +5 -0
  233. package/dist/executors/ssh-keys/get.d.ts.map +1 -0
  234. package/dist/executors/ssh-keys/index.d.ts +6 -0
  235. package/dist/executors/ssh-keys/index.d.ts.map +1 -0
  236. package/dist/executors/ssh-keys/list.d.ts +5 -0
  237. package/dist/executors/ssh-keys/list.d.ts.map +1 -0
  238. package/dist/executors/ssh-keys/types.d.ts +31 -0
  239. package/dist/executors/ssh-keys/types.d.ts.map +1 -0
  240. package/dist/executors/types.d.ts +18 -0
  241. package/dist/executors/types.d.ts.map +1 -0
  242. package/dist/executors/user/get.d.ts +8 -0
  243. package/dist/executors/user/get.d.ts.map +1 -0
  244. package/dist/executors/user/index.d.ts +3 -0
  245. package/dist/executors/user/index.d.ts.map +1 -0
  246. package/dist/executors/user/types.d.ts +9 -0
  247. package/dist/executors/user/types.d.ts.map +1 -0
  248. package/dist/index.d.ts +48 -0
  249. package/dist/index.d.ts.map +1 -0
  250. package/dist/index.js +1125 -0
  251. package/dist/index.js.map +1 -0
  252. package/dist/logger.d.ts +32 -0
  253. package/dist/logger.d.ts.map +1 -0
  254. package/package.json +34 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/constants.ts","../../../node_modules/quick-format-unescaped/index.js","../../../node_modules/pino/browser.js","../src/logger.ts","../src/context.ts","../src/executors/servers/create.ts","../src/executors/servers/delete.ts","../src/executors/servers/get.ts","../src/executors/servers/list.ts","../src/executors/servers/reboot.ts","../src/executors/sites/create.ts","../src/executors/sites/delete.ts","../src/executors/sites/get.ts","../src/executors/sites/list.ts","../src/executors/deployments/deploy.ts","../src/executors/deployments/deploy-and-wait.ts","../src/executors/deployments/get-log.ts","../src/executors/deployments/get-output.ts","../src/executors/deployments/get-script.ts","../src/executors/deployments/list.ts","../src/executors/deployments/update-script.ts","../src/executors/certificates/activate.ts","../src/executors/certificates/create.ts","../src/executors/certificates/delete.ts","../src/executors/certificates/get.ts","../src/executors/certificates/list.ts","../src/executors/databases/create.ts","../src/executors/databases/delete.ts","../src/executors/databases/get.ts","../src/executors/databases/list.ts","../src/executors/database-users/create.ts","../src/executors/database-users/delete.ts","../src/executors/database-users/get.ts","../src/executors/database-users/list.ts","../src/executors/daemons/create.ts","../src/executors/daemons/delete.ts","../src/executors/daemons/get.ts","../src/executors/daemons/list.ts","../src/executors/daemons/restart.ts","../src/executors/firewall-rules/create.ts","../src/executors/firewall-rules/delete.ts","../src/executors/firewall-rules/get.ts","../src/executors/firewall-rules/list.ts","../src/executors/ssh-keys/create.ts","../src/executors/ssh-keys/delete.ts","../src/executors/ssh-keys/get.ts","../src/executors/ssh-keys/list.ts","../src/executors/security-rules/create.ts","../src/executors/security-rules/delete.ts","../src/executors/security-rules/get.ts","../src/executors/security-rules/list.ts","../src/executors/redirect-rules/create.ts","../src/executors/redirect-rules/delete.ts","../src/executors/redirect-rules/get.ts","../src/executors/redirect-rules/list.ts","../src/executors/monitors/create.ts","../src/executors/monitors/delete.ts","../src/executors/monitors/get.ts","../src/executors/monitors/list.ts","../src/executors/nginx-templates/create.ts","../src/executors/nginx-templates/delete.ts","../src/executors/nginx-templates/get.ts","../src/executors/nginx-templates/list.ts","../src/executors/nginx-templates/update.ts","../src/executors/env/get.ts","../src/executors/env/update.ts","../src/executors/nginx/get.ts","../src/executors/nginx/update.ts","../src/executors/recipes/create.ts","../src/executors/recipes/delete.ts","../src/executors/recipes/get.ts","../src/executors/recipes/list.ts","../src/executors/recipes/run.ts","../src/executors/backups/create.ts","../src/executors/backups/delete.ts","../src/executors/backups/get.ts","../src/executors/backups/list.ts","../src/executors/commands/create.ts","../src/executors/commands/get.ts","../src/executors/commands/list.ts","../src/executors/scheduled-jobs/create.ts","../src/executors/scheduled-jobs/delete.ts","../src/executors/scheduled-jobs/get.ts","../src/executors/scheduled-jobs/list.ts","../src/executors/user/get.ts"],"sourcesContent":["/**\n * All supported resources.\n * Single source of truth — MCP schema and handlers derive from this.\n */\nexport const RESOURCES = [\n \"servers\",\n \"sites\",\n \"deployments\",\n \"certificates\",\n \"databases\",\n \"database-users\",\n \"daemons\",\n \"env\",\n \"nginx\",\n \"firewall-rules\",\n \"ssh-keys\",\n \"security-rules\",\n \"redirect-rules\",\n \"nginx-templates\",\n \"monitors\",\n \"recipes\",\n \"backups\",\n \"commands\",\n \"scheduled-jobs\",\n \"user\",\n] as const;\n\nexport type Resource = (typeof RESOURCES)[number];\n\n/**\n * All supported actions.\n * Single source of truth — MCP schema and handlers derive from this.\n */\nexport const ACTIONS = [\n \"list\",\n \"get\",\n \"create\",\n \"update\",\n \"delete\",\n \"deploy\",\n \"reboot\",\n \"restart\",\n \"activate\",\n \"run\",\n \"help\",\n \"schema\",\n] as const;\n\nexport type Action = (typeof ACTIONS)[number];\n","'use strict'\nfunction tryStringify (o) {\n try { return JSON.stringify(o) } catch(e) { return '\"[Circular]\"' }\n}\n\nmodule.exports = format\n\nfunction format(f, args, opts) {\n var ss = (opts && opts.stringify) || tryStringify\n var offset = 1\n if (typeof f === 'object' && f !== null) {\n var len = args.length + offset\n if (len === 1) return f\n var objects = new Array(len)\n objects[0] = ss(f)\n for (var index = 1; index < len; index++) {\n objects[index] = ss(args[index])\n }\n return objects.join(' ')\n }\n if (typeof f !== 'string') {\n return f\n }\n var argLen = args.length\n if (argLen === 0) return f\n var str = ''\n var a = 1 - offset\n var lastPos = -1\n var flen = (f && f.length) || 0\n for (var i = 0; i < flen;) {\n if (f.charCodeAt(i) === 37 && i + 1 < flen) {\n lastPos = lastPos > -1 ? lastPos : 0\n switch (f.charCodeAt(i + 1)) {\n case 100: // 'd'\n case 102: // 'f'\n if (a >= argLen)\n break\n if (args[a] == null) break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += Number(args[a])\n lastPos = i + 2\n i++\n break\n case 105: // 'i'\n if (a >= argLen)\n break\n if (args[a] == null) break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += Math.floor(Number(args[a]))\n lastPos = i + 2\n i++\n break\n case 79: // 'O'\n case 111: // 'o'\n case 106: // 'j'\n if (a >= argLen)\n break\n if (args[a] === undefined) break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n var type = typeof args[a]\n if (type === 'string') {\n str += '\\'' + args[a] + '\\''\n lastPos = i + 2\n i++\n break\n }\n if (type === 'function') {\n str += args[a].name || '<anonymous>'\n lastPos = i + 2\n i++\n break\n }\n str += ss(args[a])\n lastPos = i + 2\n i++\n break\n case 115: // 's'\n if (a >= argLen)\n break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += String(args[a])\n lastPos = i + 2\n i++\n break\n case 37: // '%'\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += '%'\n lastPos = i + 2\n i++\n a--\n break\n }\n ++a\n }\n ++i\n }\n if (lastPos === -1)\n return f\n else if (lastPos < flen) {\n str += f.slice(lastPos)\n }\n\n return str\n}\n","'use strict'\n\nconst format = require('quick-format-unescaped')\n\nmodule.exports = pino\n\nconst _console = pfGlobalThisOrFallback().console || {}\nconst stdSerializers = {\n mapHttpRequest: mock,\n mapHttpResponse: mock,\n wrapRequestSerializer: passthrough,\n wrapResponseSerializer: passthrough,\n wrapErrorSerializer: passthrough,\n req: mock,\n res: mock,\n err: asErrValue,\n errWithCause: asErrValue\n}\nfunction levelToValue (level, logger) {\n return level === 'silent'\n ? Infinity\n : logger.levels.values[level]\n}\nconst baseLogFunctionSymbol = Symbol('pino.logFuncs')\nconst hierarchySymbol = Symbol('pino.hierarchy')\n\nconst logFallbackMap = {\n error: 'log',\n fatal: 'error',\n warn: 'error',\n info: 'log',\n debug: 'log',\n trace: 'log'\n}\n\nfunction appendChildLogger (parentLogger, childLogger) {\n const newEntry = {\n logger: childLogger,\n parent: parentLogger[hierarchySymbol]\n }\n childLogger[hierarchySymbol] = newEntry\n}\n\nfunction setupBaseLogFunctions (logger, levels, proto) {\n const logFunctions = {}\n levels.forEach(level => {\n logFunctions[level] = proto[level] ? proto[level] : (_console[level] || _console[logFallbackMap[level] || 'log'] || noop)\n })\n logger[baseLogFunctionSymbol] = logFunctions\n}\n\nfunction shouldSerialize (serialize, serializers) {\n if (Array.isArray(serialize)) {\n const hasToFilter = serialize.filter(function (k) {\n return k !== '!stdSerializers.err'\n })\n return hasToFilter\n } else if (serialize === true) {\n return Object.keys(serializers)\n }\n\n return false\n}\n\nfunction pino (opts) {\n opts = opts || {}\n opts.browser = opts.browser || {}\n\n const transmit = opts.browser.transmit\n if (transmit && typeof transmit.send !== 'function') { throw Error('pino: transmit option must have a send function') }\n\n const proto = opts.browser.write || _console\n if (opts.browser.write) opts.browser.asObject = true\n const serializers = opts.serializers || {}\n const serialize = shouldSerialize(opts.browser.serialize, serializers)\n let stdErrSerialize = opts.browser.serialize\n\n if (\n Array.isArray(opts.browser.serialize) &&\n opts.browser.serialize.indexOf('!stdSerializers.err') > -1\n ) stdErrSerialize = false\n\n const customLevels = Object.keys(opts.customLevels || {})\n const levels = ['error', 'fatal', 'warn', 'info', 'debug', 'trace'].concat(customLevels)\n\n if (typeof proto === 'function') {\n levels.forEach(function (level) {\n proto[level] = proto\n })\n }\n if (opts.enabled === false || opts.browser.disabled) opts.level = 'silent'\n const level = opts.level || 'info'\n const logger = Object.create(proto)\n if (!logger.log) logger.log = noop\n\n setupBaseLogFunctions(logger, levels, proto)\n // setup root hierarchy entry\n appendChildLogger({}, logger)\n\n Object.defineProperty(logger, 'levelVal', {\n get: getLevelVal\n })\n Object.defineProperty(logger, 'level', {\n get: getLevel,\n set: setLevel\n })\n\n const setOpts = {\n transmit,\n serialize,\n asObject: opts.browser.asObject,\n asObjectBindingsOnly: opts.browser.asObjectBindingsOnly,\n formatters: opts.browser.formatters,\n reportCaller: opts.browser.reportCaller,\n levels,\n timestamp: getTimeFunction(opts),\n messageKey: opts.messageKey || 'msg',\n onChild: opts.onChild || noop\n }\n logger.levels = getLevels(opts)\n logger.level = level\n\n logger.isLevelEnabled = function (level) {\n if (!this.levels.values[level]) {\n return false\n }\n\n return this.levels.values[level] >= this.levels.values[this.level]\n }\n logger.setMaxListeners = logger.getMaxListeners =\n logger.emit = logger.addListener = logger.on =\n logger.prependListener = logger.once =\n logger.prependOnceListener = logger.removeListener =\n logger.removeAllListeners = logger.listeners =\n logger.listenerCount = logger.eventNames =\n logger.write = logger.flush = noop\n logger.serializers = serializers\n logger._serialize = serialize\n logger._stdErrSerialize = stdErrSerialize\n logger.child = function (...args) { return child.call(this, setOpts, ...args) }\n\n if (transmit) logger._logEvent = createLogEventShape()\n\n function getLevelVal () {\n return levelToValue(this.level, this)\n }\n\n function getLevel () {\n return this._level\n }\n function setLevel (level) {\n if (level !== 'silent' && !this.levels.values[level]) {\n throw Error('unknown level ' + level)\n }\n this._level = level\n\n set(this, setOpts, logger, 'error') // <-- must stay first\n set(this, setOpts, logger, 'fatal')\n set(this, setOpts, logger, 'warn')\n set(this, setOpts, logger, 'info')\n set(this, setOpts, logger, 'debug')\n set(this, setOpts, logger, 'trace')\n\n customLevels.forEach((level) => {\n set(this, setOpts, logger, level)\n })\n }\n\n function child (setOpts, bindings, childOptions) {\n if (!bindings) {\n throw new Error('missing bindings for child Pino')\n }\n childOptions = childOptions || {}\n if (serialize && bindings.serializers) {\n childOptions.serializers = bindings.serializers\n }\n const childOptionsSerializers = childOptions.serializers\n if (serialize && childOptionsSerializers) {\n var childSerializers = Object.assign({}, serializers, childOptionsSerializers)\n var childSerialize = opts.browser.serialize === true\n ? Object.keys(childSerializers)\n : serialize\n delete bindings.serializers\n applySerializers([bindings], childSerialize, childSerializers, this._stdErrSerialize)\n }\n function Child (parent) {\n this._childLevel = (parent._childLevel | 0) + 1\n\n // make sure bindings are available in the `set` function\n this.bindings = bindings\n\n if (childSerializers) {\n this.serializers = childSerializers\n this._serialize = childSerialize\n }\n if (transmit) {\n this._logEvent = createLogEventShape(\n [].concat(parent._logEvent.bindings, bindings)\n )\n }\n }\n Child.prototype = this\n const newLogger = new Child(this)\n\n // must happen before the level is assigned\n appendChildLogger(this, newLogger)\n newLogger.child = function (...args) { return child.call(this, setOpts, ...args) }\n // required to actually initialize the logger functions for any given child\n newLogger.level = childOptions.level || this.level // allow level to be set by childOptions\n setOpts.onChild(newLogger)\n\n return newLogger\n }\n return logger\n}\n\nfunction getLevels (opts) {\n const customLevels = opts.customLevels || {}\n\n const values = Object.assign({}, pino.levels.values, customLevels)\n const labels = Object.assign({}, pino.levels.labels, invertObject(customLevels))\n\n return {\n values,\n labels\n }\n}\n\nfunction invertObject (obj) {\n const inverted = {}\n Object.keys(obj).forEach(function (key) {\n inverted[obj[key]] = key\n })\n return inverted\n}\n\npino.levels = {\n values: {\n fatal: 60,\n error: 50,\n warn: 40,\n info: 30,\n debug: 20,\n trace: 10\n },\n labels: {\n 10: 'trace',\n 20: 'debug',\n 30: 'info',\n 40: 'warn',\n 50: 'error',\n 60: 'fatal'\n }\n}\n\npino.stdSerializers = stdSerializers\npino.stdTimeFunctions = Object.assign({}, { nullTime, epochTime, unixTime, isoTime })\n\nfunction getBindingChain (logger) {\n const bindings = []\n if (logger.bindings) {\n bindings.push(logger.bindings)\n }\n\n // traverse up the tree to get all bindings\n let hierarchy = logger[hierarchySymbol]\n while (hierarchy.parent) {\n hierarchy = hierarchy.parent\n if (hierarchy.logger.bindings) {\n bindings.push(hierarchy.logger.bindings)\n }\n }\n\n return bindings.reverse()\n}\n\nfunction set (self, opts, rootLogger, level) {\n // override the current log functions with either `noop` or the base log function\n Object.defineProperty(self, level, {\n value: (levelToValue(self.level, rootLogger) > levelToValue(level, rootLogger)\n ? noop\n : rootLogger[baseLogFunctionSymbol][level]),\n writable: true,\n enumerable: true,\n configurable: true\n })\n\n if (self[level] === noop) {\n if (!opts.transmit) return\n\n const transmitLevel = opts.transmit.level || self.level\n const transmitValue = levelToValue(transmitLevel, rootLogger)\n const methodValue = levelToValue(level, rootLogger)\n if (methodValue < transmitValue) return\n }\n\n // make sure the log format is correct\n self[level] = createWrap(self, opts, rootLogger, level)\n\n // prepend bindings if it is not the root logger\n const bindings = getBindingChain(self)\n if (bindings.length === 0) {\n // early exit in case for rootLogger\n return\n }\n self[level] = prependBindingsInArguments(bindings, self[level])\n}\n\nfunction prependBindingsInArguments (bindings, logFunc) {\n return function () {\n return logFunc.apply(this, [...bindings, ...arguments])\n }\n}\n\nfunction createWrap (self, opts, rootLogger, level) {\n return (function (write) {\n return function LOG () {\n const ts = opts.timestamp()\n const args = new Array(arguments.length)\n const proto = (Object.getPrototypeOf && Object.getPrototypeOf(this) === _console) ? _console : this\n for (var i = 0; i < args.length; i++) args[i] = arguments[i]\n\n var argsIsSerialized = false\n if (opts.serialize) {\n applySerializers(args, this._serialize, this.serializers, this._stdErrSerialize)\n argsIsSerialized = true\n }\n if (opts.asObject || opts.formatters) {\n const out = asObject(this, level, args, ts, opts)\n if (opts.reportCaller && out && out.length > 0 && out[0] && typeof out[0] === 'object') {\n try {\n const caller = getCallerLocation()\n if (caller) out[0].caller = caller\n } catch (e) {}\n }\n write.call(proto, ...out)\n } else {\n if (opts.reportCaller) {\n try {\n const caller = getCallerLocation()\n if (caller) args.push(caller)\n } catch (e) {}\n }\n write.apply(proto, args)\n }\n\n if (opts.transmit) {\n const transmitLevel = opts.transmit.level || self._level\n const transmitValue = levelToValue(transmitLevel, rootLogger)\n const methodValue = levelToValue(level, rootLogger)\n if (methodValue < transmitValue) return\n transmit(this, {\n ts,\n methodLevel: level,\n methodValue,\n transmitLevel,\n transmitValue: rootLogger.levels.values[opts.transmit.level || self._level],\n send: opts.transmit.send,\n val: levelToValue(self._level, rootLogger)\n }, args, argsIsSerialized)\n }\n }\n })(self[baseLogFunctionSymbol][level])\n}\n\nfunction asObject (logger, level, args, ts, opts) {\n const {\n level: levelFormatter,\n log: logObjectFormatter = (obj) => obj\n } = opts.formatters || {}\n const argsCloned = args.slice()\n let msg = argsCloned[0]\n const logObject = {}\n\n let lvl = (logger._childLevel | 0) + 1\n if (lvl < 1) lvl = 1\n\n if (ts) {\n logObject.time = ts\n }\n\n if (levelFormatter) {\n const formattedLevel = levelFormatter(level, logger.levels.values[level])\n Object.assign(logObject, formattedLevel)\n } else {\n logObject.level = logger.levels.values[level]\n }\n\n if (opts.asObjectBindingsOnly) {\n if (msg !== null && typeof msg === 'object') {\n while (lvl-- && typeof argsCloned[0] === 'object') {\n Object.assign(logObject, argsCloned.shift())\n }\n }\n\n const formattedLogObject = logObjectFormatter(logObject)\n return [formattedLogObject, ...argsCloned]\n } else {\n // deliberate, catching objects, arrays\n if (msg !== null && typeof msg === 'object') {\n while (lvl-- && typeof argsCloned[0] === 'object') {\n Object.assign(logObject, argsCloned.shift())\n }\n msg = argsCloned.length ? format(argsCloned.shift(), argsCloned) : undefined\n } else if (typeof msg === 'string') msg = format(argsCloned.shift(), argsCloned)\n if (msg !== undefined) logObject[opts.messageKey] = msg\n\n const formattedLogObject = logObjectFormatter(logObject)\n return [formattedLogObject]\n }\n}\n\nfunction applySerializers (args, serialize, serializers, stdErrSerialize) {\n for (const i in args) {\n if (stdErrSerialize && args[i] instanceof Error) {\n args[i] = pino.stdSerializers.err(args[i])\n } else if (typeof args[i] === 'object' && !Array.isArray(args[i]) && serialize) {\n for (const k in args[i]) {\n if (serialize.indexOf(k) > -1 && k in serializers) {\n args[i][k] = serializers[k](args[i][k])\n }\n }\n }\n }\n}\n\nfunction transmit (logger, opts, args, argsIsSerialized = false) {\n const send = opts.send\n const ts = opts.ts\n const methodLevel = opts.methodLevel\n const methodValue = opts.methodValue\n const val = opts.val\n const bindings = logger._logEvent.bindings\n\n if (!argsIsSerialized) {\n applySerializers(\n args,\n logger._serialize || Object.keys(logger.serializers),\n logger.serializers,\n logger._stdErrSerialize === undefined ? true : logger._stdErrSerialize\n )\n }\n\n logger._logEvent.ts = ts\n logger._logEvent.messages = args.filter(function (arg) {\n // bindings can only be objects, so reference equality check via indexOf is fine\n return bindings.indexOf(arg) === -1\n })\n\n logger._logEvent.level.label = methodLevel\n logger._logEvent.level.value = methodValue\n\n send(methodLevel, logger._logEvent, val)\n\n logger._logEvent = createLogEventShape(bindings)\n}\n\nfunction createLogEventShape (bindings) {\n return {\n ts: 0,\n messages: [],\n bindings: bindings || [],\n level: { label: '', value: 0 }\n }\n}\n\nfunction asErrValue (err) {\n const obj = {\n type: err.constructor.name,\n msg: err.message,\n stack: err.stack\n }\n for (const key in err) {\n if (obj[key] === undefined) {\n obj[key] = err[key]\n }\n }\n return obj\n}\n\nfunction getTimeFunction (opts) {\n if (typeof opts.timestamp === 'function') {\n return opts.timestamp\n }\n if (opts.timestamp === false) {\n return nullTime\n }\n return epochTime\n}\n\nfunction mock () { return {} }\nfunction passthrough (a) { return a }\nfunction noop () {}\n\nfunction nullTime () { return false }\nfunction epochTime () { return Date.now() }\nfunction unixTime () { return Math.round(Date.now() / 1000.0) }\nfunction isoTime () { return new Date(Date.now()).toISOString() } // using Date.now() for testability\n\n/* eslint-disable */\n/* istanbul ignore next */\nfunction pfGlobalThisOrFallback () {\n function defd (o) { return typeof o !== 'undefined' && o }\n try {\n if (typeof globalThis !== 'undefined') return globalThis\n Object.defineProperty(Object.prototype, 'globalThis', {\n get: function () {\n delete Object.prototype.globalThis\n return (this.globalThis = this)\n },\n configurable: true\n })\n return globalThis\n } catch (e) {\n return defd(self) || defd(window) || defd(this) || {}\n }\n}\n/* eslint-enable */\n\nmodule.exports.default = pino\nmodule.exports.pino = pino\n\n// Attempt to extract the user callsite (file:line:column)\n/* istanbul ignore next */\nfunction getCallerLocation () {\n const stack = (new Error()).stack\n if (!stack) return null\n const lines = stack.split('\\n')\n for (let i = 1; i < lines.length; i++) {\n const l = lines[i].trim()\n // skip frames from this file and internals\n if (/(^at\\s+)?(createWrap|LOG|set\\s*\\(|asObject|Object\\.apply|Function\\.apply)/.test(l)) continue\n if (l.indexOf('browser.js') !== -1) continue\n if (l.indexOf('node:internal') !== -1) continue\n if (l.indexOf('node_modules') !== -1) continue\n // try formats like: at func (file:line:col) or at file:line:col\n let m = l.match(/\\((.*?):(\\d+):(\\d+)\\)/)\n if (!m) m = l.match(/at\\s+(.*?):(\\d+):(\\d+)/)\n if (m) {\n const file = m[1]\n const line = m[2]\n const col = m[3]\n return file + ':' + line + ':' + col\n }\n }\n return null\n}\n","import { createWriteStream, mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport pino from \"pino\";\n\nexport interface AuditLogEntry {\n source: \"mcp\" | \"cli\";\n resource: string;\n action: string;\n args: Record<string, unknown>;\n status: \"success\" | \"error\";\n error?: string;\n}\n\nexport interface AuditLogger {\n log(entry: AuditLogEntry): void;\n}\n\n/**\n * Sensitive fields to strip from logged args.\n * These are replaced with '[REDACTED]' to prevent token leakage.\n */\nconst SENSITIVE_KEYS = [\"apiToken\", \"token\", \"password\", \"secret\", \"key\", \"credentials\"];\n\n/**\n * Return a shallow copy of `args` with sensitive keys replaced by '[REDACTED]'.\n */\nexport function sanitizeArgs(args: Record<string, unknown>): Record<string, unknown> {\n const sanitized = { ...args };\n for (const k of SENSITIVE_KEYS) {\n if (k in sanitized) {\n sanitized[k] = \"[REDACTED]\";\n }\n }\n return sanitized;\n}\n\n/**\n * Resolve the audit log file path.\n *\n * Priority:\n * 1. `FORGE_AUDIT_LOG` environment variable\n * 2. `~/.config/forge-tools/audit.log` (default)\n */\nexport function getAuditLogPath(): string {\n if (process.env.FORGE_AUDIT_LOG) {\n return process.env.FORGE_AUDIT_LOG;\n }\n return join(homedir(), \".config\", \"forge-tools\", \"audit.log\");\n}\n\n/**\n * Create an audit logger that appends structured JSON lines to the audit log.\n *\n * Failures are always silent — logging must never interrupt the actual operation.\n *\n * @param source - Identifies who is logging ('mcp' or 'cli').\n */\nexport function createAuditLogger(source: \"mcp\" | \"cli\"): AuditLogger {\n let logger: pino.Logger | null = null;\n\n try {\n const logPath = getAuditLogPath();\n mkdirSync(dirname(logPath), { recursive: true });\n const stream = createWriteStream(logPath, { flags: \"a\" });\n logger = pino({ level: \"info\" }, stream);\n } catch {\n // Silent failure — logging should never interrupt operations\n }\n\n return {\n log(entry: AuditLogEntry): void {\n try {\n if (!logger) return;\n logger.info({\n source,\n resource: entry.resource,\n action: entry.action,\n args: sanitizeArgs(entry.args),\n status: entry.status,\n ...(entry.error !== undefined ? { error: entry.error } : {}),\n });\n } catch {\n // Silent failure\n }\n },\n };\n}\n","import type { HttpClient } from \"@studiometa/forge-api\";\n\n/**\n * Execution context injected into all executors.\n *\n * Provides access to the HTTP client and other dependencies.\n * Uses DI for testability — tests inject mocks via `createTestExecutorContext()`.\n */\nexport interface ExecutorContext {\n /** HTTP client for Forge API calls. */\n client: HttpClient;\n}\n\n/**\n * Result of an executor function.\n */\nexport interface ExecutorResult<T> {\n /** The response data. */\n data: T;\n /** Pagination metadata (for list operations). */\n meta?: { total_count?: number; current_page?: number };\n}\n\n/**\n * Create a test executor context with a mock HTTP client.\n *\n * @param overrides Partial overrides for the context.\n */\nexport function createTestExecutorContext(\n overrides: Partial<ExecutorContext> = {},\n): ExecutorContext {\n const defaultClient = new Proxy({} as HttpClient, {\n get: (_target, prop) => {\n return (..._args: unknown[]) => {\n throw new Error(\n `HttpClient.${String(prop)}() called without mock — inject a mock client in createTestExecutorContext()`,\n );\n };\n },\n });\n\n return {\n client: defaultClient,\n ...overrides,\n };\n}\n","import type { ForgeServer, ServerResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateServerOptions } from \"./types.ts\";\n\n/**\n * Create a new server.\n */\nexport async function createServer(\n options: CreateServerOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeServer>> {\n const response = await ctx.client.post<ServerResponse>(\"/servers\", options);\n const server = response.server;\n\n return {\n data: server,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteServerOptions } from \"./types.ts\";\n\n/**\n * Delete a server.\n */\nexport async function deleteServer(\n options: DeleteServerOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeServer, ServerResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetServerOptions } from \"./types.ts\";\n\n/**\n * Get a specific server by ID.\n */\nexport async function getServer(\n options: GetServerOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeServer>> {\n const response = await ctx.client.get<ServerResponse>(`/servers/${options.server_id}`);\n const server = response.server;\n\n return {\n data: server,\n };\n}\n","import type { ForgeServer, ServersResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListServersOptions } from \"./types.ts\";\n\n/**\n * List all servers.\n */\nexport async function listServers(\n _options: ListServersOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeServer[]>> {\n const response = await ctx.client.get<ServersResponse>(\"/servers\");\n const servers = response.servers;\n\n return {\n data: servers,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { RebootServerOptions } from \"./types.ts\";\n\n/**\n * Reboot a server.\n */\nexport async function rebootServer(\n options: RebootServerOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(`/servers/${options.server_id}/reboot`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSite, SiteResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateSiteOptions } from \"./types.ts\";\n\n/**\n * Create a new site on a server.\n */\nexport async function createSite(\n options: CreateSiteOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSite>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<SiteResponse>(`/servers/${server_id}/sites`, data);\n const site = response.site;\n\n return {\n data: site,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteSiteOptions } from \"./types.ts\";\n\n/**\n * Delete a site.\n */\nexport async function deleteSite(\n options: DeleteSiteOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/sites/${options.site_id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSite, SiteResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetSiteOptions } from \"./types.ts\";\n\n/**\n * Get a specific site by ID.\n */\nexport async function getSite(\n options: GetSiteOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSite>> {\n const response = await ctx.client.get<SiteResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}`,\n );\n const site = response.site;\n\n return {\n data: site,\n };\n}\n","import type { ForgeSite, SitesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListSitesOptions } from \"./types.ts\";\n\n/**\n * List all sites on a server.\n */\nexport async function listSites(\n options: ListSitesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSite[]>> {\n const response = await ctx.client.get<SitesResponse>(`/servers/${options.server_id}/sites`);\n const sites = response.sites;\n\n return {\n data: sites,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeploySiteOptions } from \"./types.ts\";\n\n/**\n * Trigger a deployment for a site.\n */\nexport async function deploySite(\n options: DeploySiteOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(`/servers/${options.server_id}/sites/${options.site_id}/deployment/deploy`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSite, SiteResponse, DeploymentsResponse } from \"@studiometa/forge-api\";\n\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeploySiteAndWaitOptions, DeployResult } from \"./types.ts\";\n\n/**\n * Trigger a deployment and wait for it to complete.\n *\n * 1. POSTs to the deploy endpoint.\n * 2. Polls GET /servers/{id}/sites/{site_id} every `poll_interval_ms` ms.\n * 3. When `deployment_status` becomes null the deploy is done.\n * 4. Fetches the deployment log.\n * 5. Checks the most recent deployment status to determine success/failure.\n */\nexport async function deploySiteAndWait(\n options: DeploySiteAndWaitOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<DeployResult>> {\n const { server_id, site_id, poll_interval_ms = 3000, timeout_ms = 600_000, onProgress } = options;\n\n const baseUrl = `/servers/${server_id}/sites/${site_id}`;\n\n // 1. Trigger deploy\n await ctx.client.post(`${baseUrl}/deployment/deploy`);\n\n const startTime = Date.now();\n\n // 2. Poll until deployment_status is null (done)\n await new Promise<void>((resolve) => {\n const tick = async (): Promise<void> => {\n const elapsed_ms = Date.now() - startTime;\n\n if (elapsed_ms >= timeout_ms) {\n resolve();\n return;\n }\n\n const response = await ctx.client.get<SiteResponse>(`/servers/${server_id}/sites/${site_id}`);\n const site = response.site as ForgeSite;\n const currentStatus = site.deployment_status;\n\n if (onProgress) {\n onProgress({ status: currentStatus ?? \"done\", elapsed_ms });\n }\n\n if (currentStatus === null) {\n resolve();\n return;\n }\n\n await new Promise<void>((r) => setTimeout(r, poll_interval_ms));\n await tick();\n };\n\n tick().catch(() => resolve());\n });\n\n const elapsed_ms = Date.now() - startTime;\n\n // 3. Fetch deployment log\n let log = \"\";\n try {\n log = await ctx.client.get<string>(`${baseUrl}/deployment/log`);\n } catch {\n // log may not be available; continue\n }\n\n // 4. Determine success/failure from the most recent deployment\n let deployStatus: \"success\" | \"failed\" = \"failed\";\n try {\n const deploymentsResponse = await ctx.client.get<DeploymentsResponse>(`${baseUrl}/deployments`);\n const deployments = deploymentsResponse.deployments;\n if (deployments.length > 0) {\n const latest = deployments[0]!;\n deployStatus = latest.status === \"finished\" ? \"success\" : \"failed\";\n }\n } catch {\n // If we can't fetch deployments, keep 'failed'\n }\n\n // 5. If we timed out, force 'failed'\n if (elapsed_ms >= timeout_ms) {\n deployStatus = \"failed\";\n }\n\n return {\n data: {\n status: deployStatus,\n log,\n elapsed_ms,\n },\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDeploymentLogOptions } from \"./types.ts\";\n\n/**\n * Get the deployment log for a site.\n */\nexport async function getDeploymentLog(\n options: GetDeploymentLogOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const log = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/deployment/log`,\n );\n return { data: log };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDeploymentOutputOptions } from \"./types.ts\";\n\n/**\n * Get the output of a deployment.\n */\nexport async function getDeploymentOutput(\n options: GetDeploymentOutputOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const output = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/deployments/${options.deployment_id}/output`,\n );\n\n return {\n data: output,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDeploymentScriptOptions } from \"./types.ts\";\n\n/**\n * Get the deployment script for a site.\n */\nexport async function getDeploymentScript(\n options: GetDeploymentScriptOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const script = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/deployment/script`,\n );\n\n return {\n data: script,\n };\n}\n","import type { ForgeDeployment, DeploymentsResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListDeploymentsOptions } from \"./types.ts\";\n\n/**\n * List all deployments for a site.\n */\nexport async function listDeployments(\n options: ListDeploymentsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDeployment[]>> {\n const response = await ctx.client.get<DeploymentsResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/deployments`,\n );\n const deployments = response.deployments;\n\n return {\n data: deployments,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { UpdateDeploymentScriptOptions } from \"./types.ts\";\n\n/**\n * Update the deployment script for a site.\n */\nexport async function updateDeploymentScript(\n options: UpdateDeploymentScriptOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.put(`/servers/${options.server_id}/sites/${options.site_id}/deployment/script`, {\n content: options.content,\n });\n\n return {\n data: undefined,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ActivateCertificateOptions } from \"./types.ts\";\n\n/**\n * Activate an SSL certificate.\n */\nexport async function activateCertificate(\n options: ActivateCertificateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(\n `/servers/${options.server_id}/sites/${options.site_id}/certificates/${options.id}/activate`,\n {},\n );\n\n return {\n data: undefined,\n };\n}\n","import type { CertificateResponse, ForgeCertificate } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateCertificateOptions } from \"./types.ts\";\n\n/**\n * Create a new SSL certificate.\n */\nexport async function createCertificate(\n options: CreateCertificateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCertificate>> {\n const { server_id, site_id, ...data } = options;\n const response = await ctx.client.post<CertificateResponse>(\n `/servers/${server_id}/sites/${site_id}/certificates`,\n data,\n );\n const cert = response.certificate;\n\n return {\n data: cert,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteCertificateOptions } from \"./types.ts\";\n\n/**\n * Delete an SSL certificate.\n */\nexport async function deleteCertificate(\n options: DeleteCertificateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(\n `/servers/${options.server_id}/sites/${options.site_id}/certificates/${options.id}`,\n );\n\n return {\n data: undefined,\n };\n}\n","import type { CertificateResponse, ForgeCertificate } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetCertificateOptions } from \"./types.ts\";\n\n/**\n * Get a single SSL certificate.\n */\nexport async function getCertificate(\n options: GetCertificateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCertificate>> {\n const response = await ctx.client.get<CertificateResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/certificates/${options.id}`,\n );\n const cert = response.certificate;\n\n return {\n data: cert,\n };\n}\n","import type { CertificatesResponse, ForgeCertificate } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListCertificatesOptions } from \"./types.ts\";\n\n/**\n * List SSL certificates for a site.\n */\nexport async function listCertificates(\n options: ListCertificatesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCertificate[]>> {\n const response = await ctx.client.get<CertificatesResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/certificates`,\n );\n const certificates = response.certificates;\n\n return {\n data: certificates,\n };\n}\n","import type { DatabaseResponse, ForgeDatabase } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateDatabaseOptions } from \"./types.ts\";\n\n/**\n * Create a new database.\n */\nexport async function createDatabase(\n options: CreateDatabaseOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabase>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<DatabaseResponse>(`/servers/${server_id}/databases`, data);\n const db = response.database;\n\n return {\n data: db,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteDatabaseOptions } from \"./types.ts\";\n\n/**\n * Delete a database.\n */\nexport async function deleteDatabase(\n options: DeleteDatabaseOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/databases/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { DatabaseResponse, ForgeDatabase } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDatabaseOptions } from \"./types.ts\";\n\n/**\n * Get a single database.\n */\nexport async function getDatabase(\n options: GetDatabaseOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabase>> {\n const response = await ctx.client.get<DatabaseResponse>(\n `/servers/${options.server_id}/databases/${options.id}`,\n );\n const db = response.database;\n\n return {\n data: db,\n };\n}\n","import type { DatabasesResponse, ForgeDatabase } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListDatabasesOptions } from \"./types.ts\";\n\n/**\n * List databases on a server.\n */\nexport async function listDatabases(\n options: ListDatabasesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabase[]>> {\n const response = await ctx.client.get<DatabasesResponse>(\n `/servers/${options.server_id}/databases`,\n );\n const databases = response.databases;\n\n return {\n data: databases,\n };\n}\n","import type { DatabaseUserResponse, ForgeDatabaseUser } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateDatabaseUserOptions } from \"./types.ts\";\n\n/**\n * Create a new database user.\n */\nexport async function createDatabaseUser(\n options: CreateDatabaseUserOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabaseUser>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<DatabaseUserResponse>(\n `/servers/${server_id}/database-users`,\n data,\n );\n const user = response.user;\n\n return {\n data: user,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteDatabaseUserOptions } from \"./types.ts\";\n\n/**\n * Delete a database user.\n */\nexport async function deleteDatabaseUser(\n options: DeleteDatabaseUserOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/database-users/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { DatabaseUserResponse, ForgeDatabaseUser } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDatabaseUserOptions } from \"./types.ts\";\n\n/**\n * Get a single database user.\n */\nexport async function getDatabaseUser(\n options: GetDatabaseUserOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabaseUser>> {\n const response = await ctx.client.get<DatabaseUserResponse>(\n `/servers/${options.server_id}/database-users/${options.id}`,\n );\n const user = response.user;\n\n return {\n data: user,\n };\n}\n","import type { DatabaseUsersResponse, ForgeDatabaseUser } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListDatabaseUsersOptions } from \"./types.ts\";\n\n/**\n * List database users on a server.\n */\nexport async function listDatabaseUsers(\n options: ListDatabaseUsersOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabaseUser[]>> {\n const response = await ctx.client.get<DatabaseUsersResponse>(\n `/servers/${options.server_id}/database-users`,\n );\n const users = response.users;\n\n return {\n data: users,\n };\n}\n","import type { DaemonResponse, ForgeDaemon } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateDaemonOptions } from \"./types.ts\";\n\n/**\n * Create a new daemon (background process).\n */\nexport async function createDaemon(\n options: CreateDaemonOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDaemon>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<DaemonResponse>(`/servers/${server_id}/daemons`, data);\n const daemon = response.daemon;\n\n return {\n data: daemon,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteDaemonOptions } from \"./types.ts\";\n\n/**\n * Delete a daemon.\n */\nexport async function deleteDaemon(\n options: DeleteDaemonOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/daemons/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { DaemonResponse, ForgeDaemon } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDaemonOptions } from \"./types.ts\";\n\n/**\n * Get a single daemon.\n */\nexport async function getDaemon(\n options: GetDaemonOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDaemon>> {\n const response = await ctx.client.get<DaemonResponse>(\n `/servers/${options.server_id}/daemons/${options.id}`,\n );\n const daemon = response.daemon;\n\n return {\n data: daemon,\n };\n}\n","import type { DaemonsResponse, ForgeDaemon } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListDaemonsOptions } from \"./types.ts\";\n\n/**\n * List daemons (background processes) on a server.\n */\nexport async function listDaemons(\n options: ListDaemonsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDaemon[]>> {\n const response = await ctx.client.get<DaemonsResponse>(`/servers/${options.server_id}/daemons`);\n const daemons = response.daemons;\n\n return {\n data: daemons,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { RestartDaemonOptions } from \"./types.ts\";\n\n/**\n * Restart a daemon.\n */\nexport async function restartDaemon(\n options: RestartDaemonOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(`/servers/${options.server_id}/daemons/${options.id}/restart`, {});\n\n return {\n data: undefined,\n };\n}\n","import type { FirewallRuleResponse, ForgeFirewallRule } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateFirewallRuleOptions } from \"./types.ts\";\n\nexport async function createFirewallRule(\n options: CreateFirewallRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeFirewallRule>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<FirewallRuleResponse>(\n `/servers/${server_id}/firewall-rules`,\n data,\n );\n const rule = response.rule;\n\n return {\n data: rule,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteFirewallRuleOptions } from \"./types.ts\";\n\nexport async function deleteFirewallRule(\n options: DeleteFirewallRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/firewall-rules/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { FirewallRuleResponse, ForgeFirewallRule } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetFirewallRuleOptions } from \"./types.ts\";\n\nexport async function getFirewallRule(\n options: GetFirewallRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeFirewallRule>> {\n const response = await ctx.client.get<FirewallRuleResponse>(\n `/servers/${options.server_id}/firewall-rules/${options.id}`,\n );\n const rule = response.rule;\n\n return {\n data: rule,\n };\n}\n","import type { FirewallRulesResponse, ForgeFirewallRule } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListFirewallRulesOptions } from \"./types.ts\";\n\nexport async function listFirewallRules(\n options: ListFirewallRulesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeFirewallRule[]>> {\n const response = await ctx.client.get<FirewallRulesResponse>(\n `/servers/${options.server_id}/firewall-rules`,\n );\n const rules = response.rules;\n return {\n data: rules,\n };\n}\n","import type { ForgeSshKey, SshKeyResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateSshKeyOptions } from \"./types.ts\";\n\nexport async function createSshKey(\n options: CreateSshKeyOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSshKey>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<SshKeyResponse>(`/servers/${server_id}/keys`, data);\n const key = response.key;\n\n return {\n data: key,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteSshKeyOptions } from \"./types.ts\";\n\nexport async function deleteSshKey(\n options: DeleteSshKeyOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/keys/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSshKey, SshKeyResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetSshKeyOptions } from \"./types.ts\";\n\nexport async function getSshKey(\n options: GetSshKeyOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSshKey>> {\n const response = await ctx.client.get<SshKeyResponse>(\n `/servers/${options.server_id}/keys/${options.id}`,\n );\n const key = response.key;\n\n return {\n data: key,\n };\n}\n","import type { ForgeSshKey, SshKeysResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListSshKeysOptions } from \"./types.ts\";\n\nexport async function listSshKeys(\n options: ListSshKeysOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSshKey[]>> {\n const response = await ctx.client.get<SshKeysResponse>(`/servers/${options.server_id}/keys`);\n const keys = response.keys;\n return {\n data: keys,\n };\n}\n","import type { ForgeSecurityRule, SecurityRuleResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateSecurityRuleOptions } from \"./types.ts\";\n\nexport async function createSecurityRule(\n options: CreateSecurityRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSecurityRule>> {\n const { server_id, site_id, ...data } = options;\n const response = await ctx.client.post<SecurityRuleResponse>(\n `/servers/${server_id}/sites/${site_id}/security-rules`,\n data,\n );\n const rule = response.security_rule;\n\n return {\n data: rule,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteSecurityRuleOptions } from \"./types.ts\";\n\nexport async function deleteSecurityRule(\n options: DeleteSecurityRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(\n `/servers/${options.server_id}/sites/${options.site_id}/security-rules/${options.id}`,\n );\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSecurityRule, SecurityRuleResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetSecurityRuleOptions } from \"./types.ts\";\n\nexport async function getSecurityRule(\n options: GetSecurityRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSecurityRule>> {\n const response = await ctx.client.get<SecurityRuleResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/security-rules/${options.id}`,\n );\n const rule = response.security_rule;\n\n return {\n data: rule,\n };\n}\n","import type { ForgeSecurityRule, SecurityRulesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListSecurityRulesOptions } from \"./types.ts\";\n\nexport async function listSecurityRules(\n options: ListSecurityRulesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSecurityRule[]>> {\n const response = await ctx.client.get<SecurityRulesResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/security-rules`,\n );\n const rules = response.security_rules;\n\n return {\n data: rules,\n };\n}\n","import type { ForgeRedirectRule, RedirectRuleResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateRedirectRuleOptions } from \"./types.ts\";\n\nexport async function createRedirectRule(\n options: CreateRedirectRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRedirectRule>> {\n const { server_id, site_id, ...data } = options;\n const response = await ctx.client.post<RedirectRuleResponse>(\n `/servers/${server_id}/sites/${site_id}/redirect-rules`,\n data,\n );\n const rule = response.redirect_rule;\n\n return {\n data: rule,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteRedirectRuleOptions } from \"./types.ts\";\n\nexport async function deleteRedirectRule(\n options: DeleteRedirectRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(\n `/servers/${options.server_id}/sites/${options.site_id}/redirect-rules/${options.id}`,\n );\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeRedirectRule, RedirectRuleResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetRedirectRuleOptions } from \"./types.ts\";\n\nexport async function getRedirectRule(\n options: GetRedirectRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRedirectRule>> {\n const response = await ctx.client.get<RedirectRuleResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/redirect-rules/${options.id}`,\n );\n const rule = response.redirect_rule;\n\n return {\n data: rule,\n };\n}\n","import type { ForgeRedirectRule, RedirectRulesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListRedirectRulesOptions } from \"./types.ts\";\n\nexport async function listRedirectRules(\n options: ListRedirectRulesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRedirectRule[]>> {\n const response = await ctx.client.get<RedirectRulesResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/redirect-rules`,\n );\n const rules = response.redirect_rules;\n return {\n data: rules,\n };\n}\n","import type { ForgeMonitor, MonitorResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateMonitorOptions } from \"./types.ts\";\n\nexport async function createMonitor(\n options: CreateMonitorOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeMonitor>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<MonitorResponse>(`/servers/${server_id}/monitors`, data);\n const monitor = response.monitor;\n\n return {\n data: monitor,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteMonitorOptions } from \"./types.ts\";\n\nexport async function deleteMonitor(\n options: DeleteMonitorOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/monitors/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeMonitor, MonitorResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetMonitorOptions } from \"./types.ts\";\n\nexport async function getMonitor(\n options: GetMonitorOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeMonitor>> {\n const response = await ctx.client.get<MonitorResponse>(\n `/servers/${options.server_id}/monitors/${options.id}`,\n );\n const monitor = response.monitor;\n\n return {\n data: monitor,\n };\n}\n","import type { ForgeMonitor, MonitorsResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListMonitorsOptions } from \"./types.ts\";\n\nexport async function listMonitors(\n options: ListMonitorsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeMonitor[]>> {\n const response = await ctx.client.get<MonitorsResponse>(`/servers/${options.server_id}/monitors`);\n const monitors = response.monitors;\n return {\n data: monitors,\n };\n}\n","import type { ForgeNginxTemplate, NginxTemplateResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateNginxTemplateOptions } from \"./types.ts\";\n\nexport async function createNginxTemplate(\n options: CreateNginxTemplateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeNginxTemplate>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<NginxTemplateResponse>(\n `/servers/${server_id}/nginx/templates`,\n data,\n );\n const template = response.template;\n\n return {\n data: template,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteNginxTemplateOptions } from \"./types.ts\";\n\nexport async function deleteNginxTemplate(\n options: DeleteNginxTemplateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/nginx/templates/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeNginxTemplate, NginxTemplateResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetNginxTemplateOptions } from \"./types.ts\";\n\nexport async function getNginxTemplate(\n options: GetNginxTemplateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeNginxTemplate>> {\n const response = await ctx.client.get<NginxTemplateResponse>(\n `/servers/${options.server_id}/nginx/templates/${options.id}`,\n );\n const template = response.template;\n\n return {\n data: template,\n };\n}\n","import type { ForgeNginxTemplate, NginxTemplatesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListNginxTemplatesOptions } from \"./types.ts\";\n\nexport async function listNginxTemplates(\n options: ListNginxTemplatesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeNginxTemplate[]>> {\n const response = await ctx.client.get<NginxTemplatesResponse>(\n `/servers/${options.server_id}/nginx/templates`,\n );\n const templates = response.templates;\n return {\n data: templates,\n };\n}\n","import type { ForgeNginxTemplate, NginxTemplateResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { UpdateNginxTemplateOptions } from \"./types.ts\";\n\nexport async function updateNginxTemplate(\n options: UpdateNginxTemplateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeNginxTemplate>> {\n const { server_id, id, ...data } = options;\n const response = await ctx.client.put<NginxTemplateResponse>(\n `/servers/${server_id}/nginx/templates/${id}`,\n data,\n );\n const template = response.template;\n\n return {\n data: template,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetEnvOptions } from \"./types.ts\";\n\n/**\n * Get environment variables for a site.\n */\nexport async function getEnv(\n options: GetEnvOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const content = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/env`,\n );\n\n return {\n data: content,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { UpdateEnvOptions } from \"./types.ts\";\n\n/**\n * Update environment variables for a site.\n */\nexport async function updateEnv(\n options: UpdateEnvOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.put(`/servers/${options.server_id}/sites/${options.site_id}/env`, {\n content: options.content,\n });\n\n return {\n data: undefined,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetNginxConfigOptions } from \"./types.ts\";\n\n/**\n * Get Nginx configuration for a site.\n */\nexport async function getNginxConfig(\n options: GetNginxConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const content = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/nginx`,\n );\n\n return {\n data: content,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { UpdateNginxConfigOptions } from \"./types.ts\";\n\n/**\n * Update Nginx configuration for a site.\n */\nexport async function updateNginxConfig(\n options: UpdateNginxConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.put(`/servers/${options.server_id}/sites/${options.site_id}/nginx`, {\n content: options.content,\n });\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeRecipe, RecipeResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateRecipeOptions } from \"./types.ts\";\n\nexport async function createRecipe(\n options: CreateRecipeOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRecipe>> {\n const response = await ctx.client.post<RecipeResponse>(\"/recipes\", options);\n const recipe = response.recipe;\n\n return {\n data: recipe,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteRecipeOptions } from \"./types.ts\";\n\nexport async function deleteRecipe(\n options: DeleteRecipeOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/recipes/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeRecipe, RecipeResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetRecipeOptions } from \"./types.ts\";\n\nexport async function getRecipe(\n options: GetRecipeOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRecipe>> {\n const response = await ctx.client.get<RecipeResponse>(`/recipes/${options.id}`);\n const recipe = response.recipe;\n\n return {\n data: recipe,\n };\n}\n","import type { ForgeRecipe, RecipesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListRecipesOptions } from \"./types.ts\";\n\nexport async function listRecipes(\n _options: ListRecipesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRecipe[]>> {\n const response = await ctx.client.get<RecipesResponse>(\"/recipes\");\n const recipes = response.recipes;\n return {\n data: recipes,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { RunRecipeOptions } from \"./types.ts\";\n\n/**\n * Run a recipe on specified servers.\n */\nexport async function runRecipe(\n options: RunRecipeOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(`/recipes/${options.id}/run`, {\n servers: options.servers,\n });\n\n return {\n data: undefined,\n };\n}\n","import type { BackupConfigResponse, ForgeBackupConfig } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateBackupConfigOptions } from \"./types.ts\";\n\n/**\n * Create a new backup configuration.\n */\nexport async function createBackupConfig(\n options: CreateBackupConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeBackupConfig>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<BackupConfigResponse>(\n `/servers/${server_id}/backup-configs`,\n data,\n );\n const backup = response.backup;\n\n return {\n data: backup,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteBackupConfigOptions } from \"./types.ts\";\n\n/**\n * Delete a backup configuration.\n */\nexport async function deleteBackupConfig(\n options: DeleteBackupConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/backup-configs/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { BackupConfigResponse, ForgeBackupConfig } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetBackupConfigOptions } from \"./types.ts\";\n\n/**\n * Get a specific backup configuration.\n */\nexport async function getBackupConfig(\n options: GetBackupConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeBackupConfig>> {\n const response = await ctx.client.get<BackupConfigResponse>(\n `/servers/${options.server_id}/backup-configs/${options.id}`,\n );\n const backup = response.backup;\n\n return {\n data: backup,\n };\n}\n","import type { BackupConfigsResponse, ForgeBackupConfig } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListBackupConfigsOptions } from \"./types.ts\";\n\n/**\n * List backup configurations for a server.\n */\nexport async function listBackupConfigs(\n options: ListBackupConfigsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeBackupConfig[]>> {\n const response = await ctx.client.get<BackupConfigsResponse>(\n `/servers/${options.server_id}/backup-configs`,\n );\n const backups = response.backups;\n\n return {\n data: backups,\n };\n}\n","import type { CommandResponse, ForgeCommand } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateCommandOptions } from \"./types.ts\";\n\n/**\n * Execute a command on a site.\n */\nexport async function createCommand(\n options: CreateCommandOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCommand>> {\n const response = await ctx.client.post<CommandResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/commands`,\n { command: options.command },\n );\n const command = response.command;\n\n return {\n data: command,\n };\n}\n","import type { CommandResponse, ForgeCommand } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetCommandOptions } from \"./types.ts\";\n\n/**\n * Get a specific command.\n */\nexport async function getCommand(\n options: GetCommandOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCommand>> {\n const response = await ctx.client.get<CommandResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/commands/${options.id}`,\n );\n const command = response.command;\n\n return {\n data: command,\n };\n}\n","import type { CommandsResponse, ForgeCommand } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListCommandsOptions } from \"./types.ts\";\n\n/**\n * List commands executed on a site.\n */\nexport async function listCommands(\n options: ListCommandsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCommand[]>> {\n const response = await ctx.client.get<CommandsResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/commands`,\n );\n const commands = response.commands;\n\n return {\n data: commands,\n };\n}\n","import type { ForgeScheduledJob, ScheduledJobResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateScheduledJobOptions } from \"./types.ts\";\n\n/**\n * Create a new scheduled job (cron).\n */\nexport async function createScheduledJob(\n options: CreateScheduledJobOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeScheduledJob>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<ScheduledJobResponse>(`/servers/${server_id}/jobs`, data);\n const job = response.job;\n\n return {\n data: job,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteScheduledJobOptions } from \"./types.ts\";\n\n/**\n * Delete a scheduled job.\n */\nexport async function deleteScheduledJob(\n options: DeleteScheduledJobOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/jobs/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeScheduledJob, ScheduledJobResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetScheduledJobOptions } from \"./types.ts\";\n\n/**\n * Get a specific scheduled job.\n */\nexport async function getScheduledJob(\n options: GetScheduledJobOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeScheduledJob>> {\n const response = await ctx.client.get<ScheduledJobResponse>(\n `/servers/${options.server_id}/jobs/${options.id}`,\n );\n const job = response.job;\n\n return {\n data: job,\n };\n}\n","import type { ForgeScheduledJob, ScheduledJobsResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListScheduledJobsOptions } from \"./types.ts\";\n\n/**\n * List scheduled jobs (cron) on a server.\n */\nexport async function listScheduledJobs(\n options: ListScheduledJobsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeScheduledJob[]>> {\n const response = await ctx.client.get<ScheduledJobsResponse>(\n `/servers/${options.server_id}/jobs`,\n );\n const jobs = response.jobs;\n\n return {\n data: jobs,\n };\n}\n","import type { ForgeUser, UserResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetUserOptions } from \"./types.ts\";\n\n/**\n * Get the currently authenticated user.\n */\nexport async function getUser(\n _options: GetUserOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeUser>> {\n const response = await ctx.client.get<UserResponse>(\"/user\");\n const user = response.user;\n\n return {\n data: user,\n };\n}\n"],"x_google_ignoreList":[1,2],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface AuditLogEntry {
2
+ source: "mcp" | "cli";
3
+ resource: string;
4
+ action: string;
5
+ args: Record<string, unknown>;
6
+ status: "success" | "error";
7
+ error?: string;
8
+ }
9
+ export interface AuditLogger {
10
+ log(entry: AuditLogEntry): void;
11
+ }
12
+ /**
13
+ * Return a shallow copy of `args` with sensitive keys replaced by '[REDACTED]'.
14
+ */
15
+ export declare function sanitizeArgs(args: Record<string, unknown>): Record<string, unknown>;
16
+ /**
17
+ * Resolve the audit log file path.
18
+ *
19
+ * Priority:
20
+ * 1. `FORGE_AUDIT_LOG` environment variable
21
+ * 2. `~/.config/forge-tools/audit.log` (default)
22
+ */
23
+ export declare function getAuditLogPath(): string;
24
+ /**
25
+ * Create an audit logger that appends structured JSON lines to the audit log.
26
+ *
27
+ * Failures are always silent — logging must never interrupt the actual operation.
28
+ *
29
+ * @param source - Identifies who is logging ('mcp' or 'cli').
30
+ */
31
+ export declare function createAuditLogger(source: "mcp" | "cli"): AuditLogger;
32
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CACjC;AAQD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQnF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAKxC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,WAAW,CA6BpE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@studiometa/forge-core",
3
- "version": "0.0.1",
3
+ "version": "0.2.0",
4
4
  "description": "Shared business logic for Laravel Forge tools — executors and dependency injection",
5
5
  "keywords": [
6
6
  "automation",
@@ -15,7 +15,40 @@
15
15
  "url": "https://github.com/studiometa/forge-tools",
16
16
  "directory": "packages/core"
17
17
  },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "type": "module",
22
+ "main": "./dist/index.js",
23
+ "types": "./dist/index.d.ts",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js"
28
+ }
29
+ },
18
30
  "publishConfig": {
19
31
  "access": "public"
32
+ },
33
+ "scripts": {
34
+ "dev": "vite build --watch",
35
+ "build": "vite build && tsc --emitDeclarationOnly",
36
+ "test": "vitest run",
37
+ "test:watch": "vitest",
38
+ "test:ci": "vitest run --coverage",
39
+ "typecheck": "tsc --noEmit"
40
+ },
41
+ "dependencies": {
42
+ "@studiometa/forge-api": "*",
43
+ "pino": "^10.3.1"
44
+ },
45
+ "devDependencies": {
46
+ "@vitest/coverage-v8": "^4.1.0-beta.4",
47
+ "typescript": "^5.7.3",
48
+ "vite": "^8.0.0-beta.14",
49
+ "vitest": "^4.1.0-beta.4"
50
+ },
51
+ "engines": {
52
+ "node": ">=24.0.0"
20
53
  }
21
54
  }