@action-llama/action-llama 0.13.7 → 0.15.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 (249) hide show
  1. package/agent-docs/AGENTS.md +123 -207
  2. package/dist/agents/container-entry.d.ts +1 -3
  3. package/dist/agents/container-entry.d.ts.map +1 -1
  4. package/dist/agents/container-entry.js +208 -154
  5. package/dist/agents/container-entry.js.map +1 -1
  6. package/dist/agents/container-runner.d.ts.map +1 -1
  7. package/dist/agents/container-runner.js +19 -8
  8. package/dist/agents/container-runner.js.map +1 -1
  9. package/dist/agents/context-injection.d.ts +7 -0
  10. package/dist/agents/context-injection.d.ts.map +1 -0
  11. package/dist/agents/context-injection.js +27 -0
  12. package/dist/agents/context-injection.js.map +1 -0
  13. package/dist/agents/execution-engine.d.ts.map +1 -1
  14. package/dist/agents/execution-engine.js +99 -109
  15. package/dist/agents/execution-engine.js.map +1 -1
  16. package/dist/agents/feedback-monitor.d.ts +56 -0
  17. package/dist/agents/feedback-monitor.d.ts.map +1 -0
  18. package/dist/agents/feedback-monitor.js +176 -0
  19. package/dist/agents/feedback-monitor.js.map +1 -0
  20. package/dist/agents/feedback-runner.d.ts +28 -0
  21. package/dist/agents/feedback-runner.d.ts.map +1 -0
  22. package/dist/agents/feedback-runner.js +138 -0
  23. package/dist/agents/feedback-runner.js.map +1 -0
  24. package/dist/agents/model-fallback.d.ts +18 -0
  25. package/dist/agents/model-fallback.d.ts.map +1 -0
  26. package/dist/agents/model-fallback.js +40 -0
  27. package/dist/agents/model-fallback.js.map +1 -0
  28. package/dist/agents/prompt.d.ts +9 -2
  29. package/dist/agents/prompt.d.ts.map +1 -1
  30. package/dist/agents/prompt.js +21 -49
  31. package/dist/agents/prompt.js.map +1 -1
  32. package/dist/agents/runner.d.ts +6 -0
  33. package/dist/agents/runner.d.ts.map +1 -1
  34. package/dist/agents/runner.js +153 -124
  35. package/dist/agents/runner.js.map +1 -1
  36. package/dist/agents/session-factory.d.ts +13 -0
  37. package/dist/agents/session-factory.d.ts.map +1 -0
  38. package/dist/agents/session-factory.js +27 -0
  39. package/dist/agents/session-factory.js.map +1 -0
  40. package/dist/build-info.json +1 -1
  41. package/dist/cli/commands/agent.d.ts.map +1 -1
  42. package/dist/cli/commands/agent.js +89 -23
  43. package/dist/cli/commands/agent.js.map +1 -1
  44. package/dist/cli/commands/chat.d.ts.map +1 -1
  45. package/dist/cli/commands/chat.js +26 -43
  46. package/dist/cli/commands/chat.js.map +1 -1
  47. package/dist/cli/commands/claude.d.ts +4 -0
  48. package/dist/cli/commands/claude.d.ts.map +1 -0
  49. package/dist/cli/commands/claude.js +8 -0
  50. package/dist/cli/commands/claude.js.map +1 -0
  51. package/dist/cli/commands/doctor.d.ts.map +1 -1
  52. package/dist/cli/commands/doctor.js +24 -6
  53. package/dist/cli/commands/doctor.js.map +1 -1
  54. package/dist/cli/commands/mcp.d.ts +8 -0
  55. package/dist/cli/commands/mcp.d.ts.map +1 -0
  56. package/dist/cli/commands/mcp.js +31 -0
  57. package/dist/cli/commands/mcp.js.map +1 -0
  58. package/dist/cli/commands/new.d.ts.map +1 -1
  59. package/dist/cli/commands/new.js +15 -6
  60. package/dist/cli/commands/new.js.map +1 -1
  61. package/dist/cli/commands/run.js +1 -1
  62. package/dist/cli/commands/run.js.map +1 -1
  63. package/dist/cli/commands/start.js +3 -3
  64. package/dist/cli/commands/start.js.map +1 -1
  65. package/dist/cli/commands/stats.d.ts +9 -0
  66. package/dist/cli/commands/stats.d.ts.map +1 -0
  67. package/dist/cli/commands/stats.js +149 -0
  68. package/dist/cli/commands/stats.js.map +1 -0
  69. package/dist/cli/commands/status.d.ts.map +1 -1
  70. package/dist/cli/commands/status.js +3 -0
  71. package/dist/cli/commands/status.js.map +1 -1
  72. package/dist/cli/main.js +50 -3
  73. package/dist/cli/main.js.map +1 -1
  74. package/dist/gateway/index.d.ts +3 -0
  75. package/dist/gateway/index.d.ts.map +1 -1
  76. package/dist/gateway/index.js +7 -1
  77. package/dist/gateway/index.js.map +1 -1
  78. package/dist/gateway/lock-store.d.ts +10 -0
  79. package/dist/gateway/lock-store.d.ts.map +1 -1
  80. package/dist/gateway/lock-store.js +38 -0
  81. package/dist/gateway/lock-store.js.map +1 -1
  82. package/dist/gateway/routes/control.d.ts +2 -0
  83. package/dist/gateway/routes/control.d.ts.map +1 -1
  84. package/dist/gateway/routes/control.js +56 -0
  85. package/dist/gateway/routes/control.js.map +1 -1
  86. package/dist/gateway/routes/dashboard.d.ts +2 -1
  87. package/dist/gateway/routes/dashboard.d.ts.map +1 -1
  88. package/dist/gateway/routes/dashboard.js +112 -6
  89. package/dist/gateway/routes/dashboard.js.map +1 -1
  90. package/dist/gateway/routes/locks.d.ts.map +1 -1
  91. package/dist/gateway/routes/locks.js +39 -0
  92. package/dist/gateway/routes/locks.js.map +1 -1
  93. package/dist/gateway/routes/logs.d.ts.map +1 -1
  94. package/dist/gateway/routes/logs.js +4 -5
  95. package/dist/gateway/routes/logs.js.map +1 -1
  96. package/dist/gateway/routes/stats.d.ts +4 -0
  97. package/dist/gateway/routes/stats.d.ts.map +1 -0
  98. package/dist/gateway/routes/stats.js +25 -0
  99. package/dist/gateway/routes/stats.js.map +1 -0
  100. package/dist/gateway/views/agent-detail-page.d.ts +14 -0
  101. package/dist/gateway/views/agent-detail-page.d.ts.map +1 -0
  102. package/dist/gateway/views/agent-detail-page.js +416 -0
  103. package/dist/gateway/views/agent-detail-page.js.map +1 -0
  104. package/dist/gateway/views/dashboard-page.d.ts.map +1 -1
  105. package/dist/gateway/views/dashboard-page.js +213 -245
  106. package/dist/gateway/views/dashboard-page.js.map +1 -1
  107. package/dist/gateway/views/instance-detail-page.d.ts +30 -0
  108. package/dist/gateway/views/instance-detail-page.d.ts.map +1 -0
  109. package/dist/gateway/views/instance-detail-page.js +360 -0
  110. package/dist/gateway/views/instance-detail-page.js.map +1 -0
  111. package/dist/gateway/views/layout.d.ts +17 -0
  112. package/dist/gateway/views/layout.d.ts.map +1 -0
  113. package/dist/gateway/views/layout.js +153 -0
  114. package/dist/gateway/views/layout.js.map +1 -0
  115. package/dist/gateway/views/login-page.d.ts.map +1 -1
  116. package/dist/gateway/views/login-page.js +24 -37
  117. package/dist/gateway/views/login-page.js.map +1 -1
  118. package/dist/gateway/views/project-config-page.d.ts +12 -0
  119. package/dist/gateway/views/project-config-page.d.ts.map +1 -0
  120. package/dist/gateway/views/project-config-page.js +199 -0
  121. package/dist/gateway/views/project-config-page.js.map +1 -0
  122. package/dist/hooks/runner.d.ts +12 -0
  123. package/dist/hooks/runner.d.ts.map +1 -0
  124. package/dist/hooks/runner.js +32 -0
  125. package/dist/hooks/runner.js.map +1 -0
  126. package/dist/mcp/server.d.ts +5 -0
  127. package/dist/mcp/server.d.ts.map +1 -0
  128. package/dist/mcp/server.js +336 -0
  129. package/dist/mcp/server.js.map +1 -0
  130. package/dist/scheduler/call-dispatcher.d.ts +2 -2
  131. package/dist/scheduler/call-dispatcher.js +3 -3
  132. package/dist/scheduler/call-dispatcher.js.map +1 -1
  133. package/dist/scheduler/execution.d.ts +5 -2
  134. package/dist/scheduler/execution.d.ts.map +1 -1
  135. package/dist/scheduler/execution.js +75 -4
  136. package/dist/scheduler/execution.js.map +1 -1
  137. package/dist/scheduler/gateway-setup.d.ts +2 -0
  138. package/dist/scheduler/gateway-setup.d.ts.map +1 -1
  139. package/dist/scheduler/gateway-setup.js +21 -2
  140. package/dist/scheduler/gateway-setup.js.map +1 -1
  141. package/dist/scheduler/image-builder.js +3 -3
  142. package/dist/scheduler/image-builder.js.map +1 -1
  143. package/dist/scheduler/index.d.ts.map +1 -1
  144. package/dist/scheduler/index.js +90 -3
  145. package/dist/scheduler/index.js.map +1 -1
  146. package/dist/scheduler/shutdown.d.ts +2 -0
  147. package/dist/scheduler/shutdown.d.ts.map +1 -1
  148. package/dist/scheduler/shutdown.js +4 -1
  149. package/dist/scheduler/shutdown.js.map +1 -1
  150. package/dist/scheduler/validation.d.ts.map +1 -1
  151. package/dist/scheduler/validation.js +5 -3
  152. package/dist/scheduler/validation.js.map +1 -1
  153. package/dist/scheduler/watcher.d.ts +1 -1
  154. package/dist/scheduler/watcher.js +1 -1
  155. package/dist/scheduler/webhook-setup.d.ts +2 -0
  156. package/dist/scheduler/webhook-setup.d.ts.map +1 -1
  157. package/dist/scheduler/webhook-setup.js +2 -0
  158. package/dist/scheduler/webhook-setup.js.map +1 -1
  159. package/dist/setup/prompts.d.ts.map +1 -1
  160. package/dist/setup/prompts.js +35 -6
  161. package/dist/setup/prompts.js.map +1 -1
  162. package/dist/setup/scaffold.d.ts +6 -0
  163. package/dist/setup/scaffold.d.ts.map +1 -1
  164. package/dist/setup/scaffold.js +185 -7
  165. package/dist/setup/scaffold.js.map +1 -1
  166. package/dist/shared/config.d.ts +42 -5
  167. package/dist/shared/config.d.ts.map +1 -1
  168. package/dist/shared/config.js +126 -20
  169. package/dist/shared/config.js.map +1 -1
  170. package/dist/shared/credential-refs.d.ts.map +1 -1
  171. package/dist/shared/credential-refs.js +8 -0
  172. package/dist/shared/credential-refs.js.map +1 -1
  173. package/dist/shared/default-feedback-agent.d.ts +10 -0
  174. package/dist/shared/default-feedback-agent.d.ts.map +1 -0
  175. package/dist/shared/default-feedback-agent.js +114 -0
  176. package/dist/shared/default-feedback-agent.js.map +1 -0
  177. package/dist/shared/environment.d.ts +0 -1
  178. package/dist/shared/environment.d.ts.map +1 -1
  179. package/dist/shared/environment.js +19 -3
  180. package/dist/shared/environment.js.map +1 -1
  181. package/dist/shared/frontmatter.d.ts +11 -0
  182. package/dist/shared/frontmatter.d.ts.map +1 -0
  183. package/dist/shared/frontmatter.js +30 -0
  184. package/dist/shared/frontmatter.js.map +1 -0
  185. package/dist/shared/paths.d.ts +1 -0
  186. package/dist/shared/paths.d.ts.map +1 -1
  187. package/dist/shared/paths.js +3 -0
  188. package/dist/shared/paths.js.map +1 -1
  189. package/dist/shared/usage.d.ts.map +1 -1
  190. package/dist/shared/usage.js +52 -7
  191. package/dist/shared/usage.js.map +1 -1
  192. package/dist/stats/index.d.ts +3 -0
  193. package/dist/stats/index.d.ts.map +1 -0
  194. package/dist/stats/index.js +2 -0
  195. package/dist/stats/index.js.map +1 -0
  196. package/dist/stats/store.d.ts +89 -0
  197. package/dist/stats/store.d.ts.map +1 -0
  198. package/dist/stats/store.js +242 -0
  199. package/dist/stats/store.js.map +1 -0
  200. package/dist/tui/App.d.ts +2 -1
  201. package/dist/tui/App.d.ts.map +1 -1
  202. package/dist/tui/App.js +132 -5
  203. package/dist/tui/App.js.map +1 -1
  204. package/dist/tui/render.d.ts +1 -1
  205. package/dist/tui/render.d.ts.map +1 -1
  206. package/dist/tui/render.js +2 -2
  207. package/dist/tui/render.js.map +1 -1
  208. package/dist/tui/status-tracker.d.ts +18 -1
  209. package/dist/tui/status-tracker.d.ts.map +1 -1
  210. package/dist/tui/status-tracker.js +32 -1
  211. package/dist/tui/status-tracker.js.map +1 -1
  212. package/docker/bin/{al-call → al-subagent} +2 -2
  213. package/docker/bin/{al-check → al-subagent-check} +2 -2
  214. package/docker/bin/{al-wait → al-subagent-wait} +2 -2
  215. package/package.json +8 -21
  216. package/LICENSE +0 -21
  217. package/README.md +0 -192
  218. package/dist/gateway/views/logs-page.d.ts +0 -2
  219. package/dist/gateway/views/logs-page.d.ts.map +0 -1
  220. package/dist/gateway/views/logs-page.js +0 -280
  221. package/dist/gateway/views/logs-page.js.map +0 -1
  222. package/dist/preflight/interpolate.d.ts +0 -10
  223. package/dist/preflight/interpolate.d.ts.map +0 -1
  224. package/dist/preflight/interpolate.js +0 -33
  225. package/dist/preflight/interpolate.js.map +0 -1
  226. package/dist/preflight/providers/git-clone.d.ts +0 -3
  227. package/dist/preflight/providers/git-clone.d.ts.map +0 -1
  228. package/dist/preflight/providers/git-clone.js +0 -36
  229. package/dist/preflight/providers/git-clone.js.map +0 -1
  230. package/dist/preflight/providers/http.d.ts +0 -3
  231. package/dist/preflight/providers/http.d.ts.map +0 -1
  232. package/dist/preflight/providers/http.js +0 -36
  233. package/dist/preflight/providers/http.js.map +0 -1
  234. package/dist/preflight/providers/shell.d.ts +0 -3
  235. package/dist/preflight/providers/shell.d.ts.map +0 -1
  236. package/dist/preflight/providers/shell.js +0 -28
  237. package/dist/preflight/providers/shell.js.map +0 -1
  238. package/dist/preflight/registry.d.ts +0 -4
  239. package/dist/preflight/registry.d.ts.map +0 -1
  240. package/dist/preflight/registry.js +0 -20
  241. package/dist/preflight/registry.js.map +0 -1
  242. package/dist/preflight/runner.d.ts +0 -7
  243. package/dist/preflight/runner.d.ts.map +0 -1
  244. package/dist/preflight/runner.js +0 -28
  245. package/dist/preflight/runner.js.map +0 -1
  246. package/dist/preflight/schema.d.ts +0 -21
  247. package/dist/preflight/schema.d.ts.map +0 -1
  248. package/dist/preflight/schema.js +0 -9
  249. package/dist/preflight/schema.js.map +0 -1
@@ -1,53 +1,40 @@
1
- function escapeHtml(str) {
2
- return str
3
- .replace(/&/g, "&")
4
- .replace(/</g, "&lt;")
5
- .replace(/>/g, "&gt;")
6
- .replace(/"/g, "&quot;");
7
- }
1
+ import { escapeHtml } from "./layout.js";
8
2
  export function renderLoginPage(error) {
9
3
  const errorHtml = error
10
- ? `<div class="error">${escapeHtml(error)}</div>`
4
+ ? `<div class="bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-3 mb-4 text-sm text-red-700 dark:text-red-400 text-center">${escapeHtml(error)}</div>`
11
5
  : "";
12
6
  return `<!DOCTYPE html>
13
- <html lang="en">
7
+ <html lang="en" class="dark">
14
8
  <head>
15
9
  <meta charset="utf-8">
16
10
  <meta name="viewport" content="width=device-width, initial-scale=1">
17
11
  <title>Login \u2014 Action Llama</title>
18
- <style>
19
- * { margin: 0; padding: 0; box-sizing: border-box; }
20
- body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; background: #0f172a; color: #e2e8f0; display: flex; align-items: center; justify-content: center; min-height: 100vh; }
21
- .login-box { background: #1e293b; border: 1px solid #334155; border-radius: 12px; padding: 32px; width: 100%; max-width: 380px; margin: 16px; }
22
- h1 { font-size: 1.4rem; margin-bottom: 8px; color: #f8fafc; text-align: center; }
23
- .subtitle { color: #94a3b8; font-size: 0.85rem; text-align: center; margin-bottom: 24px; }
24
- label { display: block; font-size: 0.85rem; color: #94a3b8; margin-bottom: 6px; }
25
- input[type="password"] {
26
- width: 100%; padding: 10px 12px; background: #0f172a; border: 1px solid #334155; border-radius: 6px;
27
- color: #e2e8f0; font-size: 0.95rem; outline: none; transition: border-color 0.15s;
28
- }
29
- input[type="password"]:focus { border-color: #60a5fa; }
30
- button {
31
- width: 100%; padding: 10px; margin-top: 16px; background: #3b82f6; color: #fff; border: none;
32
- border-radius: 6px; font-size: 0.95rem; font-weight: 500; cursor: pointer; transition: background 0.15s;
33
- }
34
- button:hover { background: #2563eb; }
35
- .error { background: #7f1d1d40; border: 1px solid #ef4444; border-radius: 6px; padding: 8px 12px; margin-bottom: 16px; font-size: 0.85rem; color: #fca5a5; text-align: center; }
36
- .hint { color: #64748b; font-size: 0.75rem; text-align: center; margin-top: 16px; }
37
- </style>
12
+ <script src="https://cdn.tailwindcss.com"></script>
13
+ <script>
14
+ tailwind.config = { darkMode: 'class' };
15
+ </script>
38
16
  </head>
39
- <body>
40
- <div class="login-box">
41
- <h1>Action Llama</h1>
42
- <div class="subtitle">Enter your API key to access the dashboard</div>
17
+ <body class="bg-white dark:bg-slate-950 text-slate-800 dark:text-slate-200 flex items-center justify-center min-h-screen">
18
+ <div class="bg-slate-50 dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-xl p-8 w-full max-w-sm mx-4">
19
+ <h1 class="text-2xl font-bold text-slate-900 dark:text-white text-center mb-2">Action Llama</h1>
20
+ <p class="text-slate-500 dark:text-slate-400 text-sm text-center mb-6">Enter your API key to access the dashboard</p>
43
21
  ${errorHtml}
44
22
  <form method="POST" action="/login">
45
- <label for="key">API Key</label>
46
- <input type="password" id="key" name="key" placeholder="Paste your gateway API key" autofocus required>
47
- <button type="submit">Log in</button>
23
+ <label for="key" class="block text-sm text-slate-500 dark:text-slate-400 mb-1.5">API Key</label>
24
+ <input type="password" id="key" name="key" placeholder="Paste your gateway API key" autofocus required
25
+ class="w-full px-3 py-2.5 bg-white dark:bg-slate-950 border border-slate-300 dark:border-slate-700 rounded-lg text-slate-900 dark:text-slate-200 text-sm outline-none focus:border-blue-500 dark:focus:border-blue-400 transition-colors">
26
+ <button type="submit"
27
+ class="w-full mt-4 px-4 py-2.5 bg-blue-600 hover:bg-blue-700 text-white rounded-lg text-sm font-medium transition-colors">
28
+ Log in
29
+ </button>
48
30
  </form>
49
- <div class="hint">Key is stored at ~/.action-llama/credentials/gateway_api_key/default/key</div>
31
+ <p class="text-slate-400 dark:text-slate-500 text-xs text-center mt-4">Key is stored at ~/.action-llama/credentials/gateway_api_key/default/key</p>
50
32
  </div>
33
+ <script>
34
+ // Apply saved theme
35
+ var theme = localStorage.getItem('al-theme') || 'dark';
36
+ document.documentElement.classList.toggle('dark', theme === 'dark');
37
+ </script>
51
38
  </body>
52
39
  </html>`;
53
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"login-page.js","sourceRoot":"","sources":["../../../src/gateway/views/login-page.ts"],"names":[],"mappings":"AAAA,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,SAAS,GAAG,KAAK;QACrB,CAAC,CAAC,sBAAsB,UAAU,CAAC,KAAK,CAAC,QAAQ;QACjD,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA+BH,SAAS;;;;;;;;;QASP,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"login-page.js","sourceRoot":"","sources":["../../../src/gateway/views/login-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,SAAS,GAAG,KAAK;QACrB,CAAC,CAAC,8JAA8J,UAAU,CAAC,KAAK,CAAC,QAAQ;QACzL,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;;;;;;;;;;;MAeH,SAAS;;;;;;;;;;;;;;;;;;QAkBP,CAAC;AACT,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface ProjectConfigData {
2
+ projectName?: string;
3
+ projectScale: number;
4
+ gatewayPort?: number;
5
+ webhooksActive: boolean;
6
+ feedbackEnabled: boolean;
7
+ feedbackAgent?: string;
8
+ feedbackErrorPatterns: string[];
9
+ feedbackContextLines: number;
10
+ }
11
+ export declare function renderProjectConfigPage(data: ProjectConfigData): string;
12
+ //# sourceMappingURL=project-config-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config-page.d.ts","sourceRoot":"","sources":["../../../src/gateway/views/project-config-page.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAuMvE"}
@@ -0,0 +1,199 @@
1
+ import { escapeHtml, renderLayout } from "./layout.js";
2
+ export function renderProjectConfigPage(data) {
3
+ const { projectName, projectScale, gatewayPort, webhooksActive } = data;
4
+ const content = `
5
+ <div class="flex flex-wrap items-center justify-between gap-3 mb-6">
6
+ <div class="flex items-center gap-3">
7
+ <h1 class="text-xl sm:text-2xl font-bold text-slate-900 dark:text-white">Project Configuration</h1>
8
+ </div>
9
+ </div>
10
+
11
+ <!-- Global Settings -->
12
+ <div class="bg-white dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-800 p-6 mb-6">
13
+ <h2 class="text-lg font-semibold text-slate-900 dark:text-white mb-4">Global Settings</h2>
14
+
15
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
16
+ <!-- Project Scale -->
17
+ <div>
18
+ <label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Project Scale</label>
19
+ <div class="flex items-center gap-3">
20
+ <input id="project-scale-input" type="number" min="1" max="50" value="${projectScale}" class="px-3 py-2 border border-slate-300 dark:border-slate-600 rounded-md bg-white dark:bg-slate-800 text-slate-900 dark:text-white w-24">
21
+ <button id="update-project-scale-btn" class="px-4 py-2 text-sm rounded-md font-semibold bg-blue-600 hover:bg-blue-700 text-white transition-colors" onclick="updateProjectScale()">Update</button>
22
+ </div>
23
+ <p class="text-sm text-slate-500 dark:text-slate-400 mt-2">Maximum number of concurrent agent runs across all agents in this project</p>
24
+ </div>
25
+
26
+ <!-- Gateway Info (read-only) -->
27
+ <div>
28
+ <label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Gateway Status</label>
29
+ <div class="space-y-2">
30
+ ${gatewayPort ? `<div class="text-sm text-slate-600 dark:text-slate-300">Port: ${gatewayPort}</div>` : ""}
31
+ <div class="text-sm text-slate-600 dark:text-slate-300">Webhooks: ${webhooksActive ? "Active" : "Inactive"}</div>
32
+ ${projectName ? `<div class="text-sm text-slate-600 dark:text-slate-300">Project: ${escapeHtml(projectName)}</div>` : ""}
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </div>
37
+
38
+ <!-- Feedback Configuration -->
39
+ <div class="bg-white dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-800 p-6 mb-6">
40
+ <h2 class="text-lg font-semibold text-slate-900 dark:text-white mb-4">Feedback Configuration</h2>
41
+ <p class="text-sm text-slate-500 dark:text-slate-400 mb-4">Automatically trigger feedback agents when other agents encounter errors</p>
42
+
43
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
44
+ <!-- Enable/Disable Feedback -->
45
+ <div>
46
+ <label class="flex items-center gap-3">
47
+ <input id="feedback-enabled" type="checkbox" ${data.feedbackEnabled ? 'checked' : ''} class="w-4 h-4 text-blue-600 bg-slate-100 border-slate-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-slate-800 dark:bg-slate-700 dark:border-slate-600">
48
+ <span class="text-sm font-medium text-slate-700 dark:text-slate-300">Enable Feedback Monitoring</span>
49
+ </label>
50
+ <p class="text-sm text-slate-500 dark:text-slate-400 mt-2 ml-7">Monitor agent logs for errors and trigger feedback agents to fix SKILL.md files</p>
51
+ </div>
52
+
53
+ <!-- Feedback Agent -->
54
+ <div>
55
+ <label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Feedback Agent</label>
56
+ <input id="feedback-agent" type="text" value="${escapeHtml(data.feedbackAgent || '')}" placeholder="default (built-in)" class="w-full px-3 py-2 border border-slate-300 dark:border-slate-600 rounded-md bg-white dark:bg-slate-800 text-slate-900 dark:text-white">
57
+ <p class="text-sm text-slate-500 dark:text-slate-400 mt-2">Agent to use for feedback (leave empty for built-in agent)</p>
58
+ </div>
59
+
60
+ <!-- Error Patterns -->
61
+ <div>
62
+ <label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Error Patterns</label>
63
+ <input id="error-patterns" type="text" value="${escapeHtml(data.feedbackErrorPatterns.join(', '))}" placeholder="error, fail" class="w-full px-3 py-2 border border-slate-300 dark:border-slate-600 rounded-md bg-white dark:bg-slate-800 text-slate-900 dark:text-white">
64
+ <p class="text-sm text-slate-500 dark:text-slate-400 mt-2">Comma-separated patterns to detect errors in logs (regex supported)</p>
65
+ </div>
66
+
67
+ <!-- Context Lines -->
68
+ <div>
69
+ <label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Context Lines</label>
70
+ <input id="context-lines" type="number" min="0" max="10" value="${data.feedbackContextLines}" class="w-24 px-3 py-2 border border-slate-300 dark:border-slate-600 rounded-md bg-white dark:bg-slate-800 text-slate-900 dark:text-white">
71
+ <p class="text-sm text-slate-500 dark:text-slate-400 mt-2">Number of lines around the error to include in feedback context</p>
72
+ </div>
73
+ </div>
74
+
75
+ <div class="mt-6">
76
+ <button id="update-feedback-btn" class="px-4 py-2 text-sm rounded-md font-semibold bg-blue-600 hover:bg-blue-700 text-white transition-colors" onclick="updateFeedbackConfig()">Update Feedback Configuration</button>
77
+ </div>
78
+ </div>
79
+
80
+ <!-- Actions -->
81
+ <div class="bg-white dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-800 p-6">
82
+ <h2 class="text-lg font-semibold text-slate-900 dark:text-white mb-4">Actions</h2>
83
+
84
+ <div class="flex flex-wrap gap-3">
85
+ <button class="px-4 py-2 text-sm rounded-md font-semibold border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 hover:bg-slate-50 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-200 transition-colors" onclick="pauseScheduler()">Pause All Agents</button>
86
+ <button class="px-4 py-2 text-sm rounded-md font-semibold border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 hover:bg-slate-50 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-200 transition-colors" onclick="resumeScheduler()">Resume All Agents</button>
87
+ </div>
88
+
89
+ <p class="text-sm text-slate-500 dark:text-slate-400 mt-3">These actions affect all agents in the project temporarily (until restart)</p>
90
+ </div>
91
+ `;
92
+ const scripts = `<script>
93
+ function ctrlPost(path) {
94
+ fetch(path, { method: "POST", credentials: "same-origin" })
95
+ .then(function(r) {
96
+ if (r.ok) {
97
+ return r.json();
98
+ } else {
99
+ throw new Error("HTTP " + r.status);
100
+ }
101
+ })
102
+ .then(function(data) {
103
+ if (data.message) alert(data.message);
104
+ })
105
+ .catch(function(err) {
106
+ alert("Error: " + err);
107
+ });
108
+ }
109
+
110
+ function updateProjectScale() {
111
+ var input = document.getElementById("project-scale-input");
112
+ var btn = document.getElementById("update-project-scale-btn");
113
+ var scale = parseInt(input.value);
114
+ if (!scale || scale < 1 || scale > 50) {
115
+ alert("Scale must be between 1 and 50");
116
+ return;
117
+ }
118
+ btn.disabled = true;
119
+ btn.textContent = "Updating...";
120
+ fetch("/control/project/scale", {
121
+ method: "POST",
122
+ credentials: "same-origin",
123
+ headers: { "Content-Type": "application/json" },
124
+ body: JSON.stringify({ scale: scale })
125
+ }).then(function(r) {
126
+ if (r.ok) {
127
+ alert("Project scale updated to " + scale);
128
+ } else {
129
+ r.text().then(function(text) { alert("Error: " + text); });
130
+ }
131
+ }).catch(function(err) {
132
+ alert("Error: " + err);
133
+ }).finally(function() {
134
+ btn.disabled = false;
135
+ btn.textContent = "Update";
136
+ });
137
+ }
138
+
139
+ function pauseScheduler() {
140
+ if (!confirm("Pause all agents? This will stop all scheduled and webhook-triggered runs.")) return;
141
+ ctrlPost("/control/pause");
142
+ }
143
+
144
+ function resumeScheduler() {
145
+ ctrlPost("/control/resume");
146
+ }
147
+
148
+ function updateFeedbackConfig() {
149
+ var btn = document.getElementById("update-feedback-btn");
150
+ var enabled = document.getElementById("feedback-enabled").checked;
151
+ var agent = document.getElementById("feedback-agent").value.trim();
152
+ var patterns = document.getElementById("error-patterns").value.trim();
153
+ var contextLines = parseInt(document.getElementById("context-lines").value);
154
+
155
+ if (isNaN(contextLines) || contextLines < 0 || contextLines > 10) {
156
+ alert("Context lines must be between 0 and 10");
157
+ return;
158
+ }
159
+
160
+ btn.disabled = true;
161
+ btn.textContent = "Updating...";
162
+
163
+ var config = {
164
+ enabled: enabled,
165
+ agent: agent || undefined,
166
+ errorPatterns: patterns ? patterns.split(',').map(function(p) { return p.trim(); }).filter(function(p) { return p; }) : ["error", "fail"],
167
+ contextLines: contextLines
168
+ };
169
+
170
+ fetch("/control/feedback/config", {
171
+ method: "POST",
172
+ credentials: "same-origin",
173
+ headers: { "Content-Type": "application/json" },
174
+ body: JSON.stringify(config)
175
+ }).then(function(r) {
176
+ if (r.ok) {
177
+ alert("Feedback configuration updated");
178
+ } else {
179
+ r.text().then(function(text) { alert("Error: " + text); });
180
+ }
181
+ }).catch(function(err) {
182
+ alert("Error: " + err);
183
+ }).finally(function() {
184
+ btn.disabled = false;
185
+ btn.textContent = "Update Feedback Configuration";
186
+ });
187
+ }
188
+ </script>`;
189
+ return renderLayout({
190
+ title: "Project Configuration",
191
+ breadcrumbs: [
192
+ { label: "Dashboard", href: "/dashboard" },
193
+ { label: "Configuration" },
194
+ ],
195
+ content,
196
+ scripts,
197
+ });
198
+ }
199
+ //# sourceMappingURL=project-config-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config-page.js","sourceRoot":"","sources":["../../../src/gateway/views/project-config-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAavD,MAAM,UAAU,uBAAuB,CAAC,IAAuB;IAC7D,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAExE,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;oFAgBkE,YAAY;;;;;;;;;;cAUlF,WAAW,CAAC,CAAC,CAAC,iEAAiE,WAAW,QAAQ,CAAC,CAAC,CAAC,EAAE;gFACrC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;cACxG,WAAW,CAAC,CAAC,CAAC,oEAAoE,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;2DAezE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;;;;;;;;;0DAStC,UAAU,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;;;;;;;0DAOpC,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;;;;;;4EAO/B,IAAI,CAAC,oBAAoB;;;;;;;;;;;;;;;;;;;;;GAqBlG,CAAC;IAEF,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAgGN,CAAC;IAEX,OAAO,YAAY,CAAC;QAClB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE;YACX,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE;YAC1C,EAAE,KAAK,EAAE,eAAe,EAAE;SAC3B;QACD,OAAO;QACP,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface HookContext {
2
+ env: Record<string, string>;
3
+ logger: (level: string, msg: string, data?: Record<string, any>) => void;
4
+ }
5
+ /**
6
+ * Run hook commands sequentially via `/bin/sh -c`.
7
+ * If any command exits non-zero, throws immediately.
8
+ */
9
+ export declare function runHooks(commands: string[], phase: "pre" | "post", ctx: HookContext): Promise<{
10
+ durationMs: number;
11
+ }>;
12
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/hooks/runner.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;CAC1E;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,KAAK,GAAG,MAAM,EACrB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BjC"}
@@ -0,0 +1,32 @@
1
+ import { execSync } from "child_process";
2
+ /**
3
+ * Run hook commands sequentially via `/bin/sh -c`.
4
+ * If any command exits non-zero, throws immediately.
5
+ */
6
+ export async function runHooks(commands, phase, ctx) {
7
+ const start = Date.now();
8
+ ctx.logger("info", `hooks.${phase} starting`, { count: commands.length });
9
+ for (let i = 0; i < commands.length; i++) {
10
+ const cmd = commands[i];
11
+ const label = `[${i + 1}/${commands.length}]`;
12
+ ctx.logger("info", `hooks.${phase} ${label}: ${cmd.slice(0, 200)}`);
13
+ try {
14
+ execSync(cmd, {
15
+ shell: "/bin/sh",
16
+ env: ctx.env,
17
+ cwd: "/tmp",
18
+ stdio: ["pipe", "pipe", "pipe"],
19
+ timeout: 300_000, // 5 minute max per hook
20
+ });
21
+ }
22
+ catch (err) {
23
+ const stderr = err?.stderr?.toString().trim() || err?.message || String(err);
24
+ ctx.logger("error", `hooks.${phase} ${label} failed`, { error: stderr.slice(0, 500) });
25
+ throw new Error(`Hook ${phase} command failed: ${cmd}\n${stderr}`);
26
+ }
27
+ }
28
+ const durationMs = Date.now() - start;
29
+ ctx.logger("info", `hooks.${phase} complete`, { durationMs });
30
+ return { durationMs };
31
+ }
32
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/hooks/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAOzC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAkB,EAClB,KAAqB,EACrB,GAAgB;IAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,KAAK,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAE9C,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,QAAQ,CAAC,GAAG,EAAE;gBACZ,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,GAAG,CAAC,GAAwB;gBACjC,GAAG,EAAE,MAAM;gBACX,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,OAAO,EAAE,OAAO,EAAE,wBAAwB;aAC3C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7E,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,KAAK,IAAI,KAAK,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACvF,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,oBAAoB,GAAG,KAAK,MAAM,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IACtC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,KAAK,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9D,OAAO,EAAE,UAAU,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function startMcpServer(opts: {
2
+ projectPath: string;
3
+ envName?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAiIA,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ShB"}