@aion0/forge 0.8.8 → 0.9.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 (2987) hide show
  1. package/RELEASE_NOTES.md +6 -4
  2. package/app/api/jobs/route.ts +1 -0
  3. package/cli/mw.mjs +8908 -0
  4. package/cli/mw.ts +0 -1
  5. package/components/SettingsModal.tsx +26 -0
  6. package/lib/help-docs/19-jobs.md +5 -0
  7. package/lib/help-docs/22-recipes.md +124 -0
  8. package/lib/help-docs/CLAUDE.md +2 -0
  9. package/lib/jobs/recipes.ts +33 -2
  10. package/lib/jobs/scheduler.ts +109 -31
  11. package/lib/jobs/store.ts +32 -2
  12. package/lib/jobs/types.ts +9 -0
  13. package/lib/settings.ts +8 -0
  14. package/package.json +7 -5
  15. package/scripts/test-mantis.ts +223 -0
  16. package/.forge/agent-context.json +0 -6
  17. package/.forge/mcp.json +0 -16
  18. package/.forge/memory/graph.json +0 -1
  19. package/.forge/memory/knowledge.json +0 -18
  20. package/.forge/memory/meta.json +0 -7
  21. package/.forge/migration/endpoints.json +0 -1
  22. package/.forge/worktrees/pipeline-0a33c50d/CLAUDE.md +0 -86
  23. package/.forge/worktrees/pipeline-0a33c50d/README.md +0 -136
  24. package/.forge/worktrees/pipeline-0a33c50d/RELEASE_NOTES.md +0 -11
  25. package/.forge/worktrees/pipeline-0a33c50d/app/api/agents/route.ts +0 -17
  26. package/.forge/worktrees/pipeline-0a33c50d/app/api/auth/[...nextauth]/route.ts +0 -3
  27. package/.forge/worktrees/pipeline-0a33c50d/app/api/auth/verify/route.ts +0 -46
  28. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude/[id]/route.ts +0 -31
  29. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude/[id]/stream/route.ts +0 -63
  30. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude/route.ts +0 -28
  31. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  32. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  33. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude-sessions/[projectName]/route.ts +0 -37
  34. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude-sessions/sync/route.ts +0 -17
  35. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude-templates/route.ts +0 -145
  36. package/.forge/worktrees/pipeline-0a33c50d/app/api/code/route.ts +0 -299
  37. package/.forge/worktrees/pipeline-0a33c50d/app/api/delivery/[id]/route.ts +0 -62
  38. package/.forge/worktrees/pipeline-0a33c50d/app/api/delivery/route.ts +0 -40
  39. package/.forge/worktrees/pipeline-0a33c50d/app/api/detect-cli/route.ts +0 -46
  40. package/.forge/worktrees/pipeline-0a33c50d/app/api/docs/route.ts +0 -176
  41. package/.forge/worktrees/pipeline-0a33c50d/app/api/docs/sessions/route.ts +0 -54
  42. package/.forge/worktrees/pipeline-0a33c50d/app/api/favorites/route.ts +0 -26
  43. package/.forge/worktrees/pipeline-0a33c50d/app/api/flows/route.ts +0 -6
  44. package/.forge/worktrees/pipeline-0a33c50d/app/api/flows/run/route.ts +0 -19
  45. package/.forge/worktrees/pipeline-0a33c50d/app/api/git/route.ts +0 -149
  46. package/.forge/worktrees/pipeline-0a33c50d/app/api/help/route.ts +0 -84
  47. package/.forge/worktrees/pipeline-0a33c50d/app/api/issue-scanner/route.ts +0 -116
  48. package/.forge/worktrees/pipeline-0a33c50d/app/api/logs/route.ts +0 -100
  49. package/.forge/worktrees/pipeline-0a33c50d/app/api/mobile-chat/route.ts +0 -115
  50. package/.forge/worktrees/pipeline-0a33c50d/app/api/monitor/route.ts +0 -74
  51. package/.forge/worktrees/pipeline-0a33c50d/app/api/notifications/route.ts +0 -42
  52. package/.forge/worktrees/pipeline-0a33c50d/app/api/notify/test/route.ts +0 -33
  53. package/.forge/worktrees/pipeline-0a33c50d/app/api/online/route.ts +0 -40
  54. package/.forge/worktrees/pipeline-0a33c50d/app/api/pipelines/[id]/route.ts +0 -41
  55. package/.forge/worktrees/pipeline-0a33c50d/app/api/pipelines/route.ts +0 -90
  56. package/.forge/worktrees/pipeline-0a33c50d/app/api/plugins/route.ts +0 -75
  57. package/.forge/worktrees/pipeline-0a33c50d/app/api/preview/[...path]/route.ts +0 -64
  58. package/.forge/worktrees/pipeline-0a33c50d/app/api/preview/route.ts +0 -156
  59. package/.forge/worktrees/pipeline-0a33c50d/app/api/project-pipelines/route.ts +0 -91
  60. package/.forge/worktrees/pipeline-0a33c50d/app/api/project-sessions/route.ts +0 -61
  61. package/.forge/worktrees/pipeline-0a33c50d/app/api/projects/route.ts +0 -26
  62. package/.forge/worktrees/pipeline-0a33c50d/app/api/sessions/[id]/chat/route.ts +0 -64
  63. package/.forge/worktrees/pipeline-0a33c50d/app/api/sessions/[id]/messages/route.ts +0 -9
  64. package/.forge/worktrees/pipeline-0a33c50d/app/api/sessions/[id]/route.ts +0 -17
  65. package/.forge/worktrees/pipeline-0a33c50d/app/api/sessions/route.ts +0 -20
  66. package/.forge/worktrees/pipeline-0a33c50d/app/api/settings/route.ts +0 -64
  67. package/.forge/worktrees/pipeline-0a33c50d/app/api/skills/local/route.ts +0 -228
  68. package/.forge/worktrees/pipeline-0a33c50d/app/api/skills/route.ts +0 -182
  69. package/.forge/worktrees/pipeline-0a33c50d/app/api/smith-templates/route.ts +0 -81
  70. package/.forge/worktrees/pipeline-0a33c50d/app/api/status/route.ts +0 -12
  71. package/.forge/worktrees/pipeline-0a33c50d/app/api/tabs/route.ts +0 -25
  72. package/.forge/worktrees/pipeline-0a33c50d/app/api/tasks/[id]/route.ts +0 -51
  73. package/.forge/worktrees/pipeline-0a33c50d/app/api/tasks/[id]/stream/route.ts +0 -77
  74. package/.forge/worktrees/pipeline-0a33c50d/app/api/tasks/link/route.ts +0 -37
  75. package/.forge/worktrees/pipeline-0a33c50d/app/api/tasks/route.ts +0 -44
  76. package/.forge/worktrees/pipeline-0a33c50d/app/api/tasks/session/route.ts +0 -14
  77. package/.forge/worktrees/pipeline-0a33c50d/app/api/telegram/route.ts +0 -23
  78. package/.forge/worktrees/pipeline-0a33c50d/app/api/templates/route.ts +0 -6
  79. package/.forge/worktrees/pipeline-0a33c50d/app/api/terminal-bell/route.ts +0 -35
  80. package/.forge/worktrees/pipeline-0a33c50d/app/api/terminal-cwd/route.ts +0 -19
  81. package/.forge/worktrees/pipeline-0a33c50d/app/api/terminal-state/route.ts +0 -15
  82. package/.forge/worktrees/pipeline-0a33c50d/app/api/tunnel/route.ts +0 -26
  83. package/.forge/worktrees/pipeline-0a33c50d/app/api/upgrade/route.ts +0 -43
  84. package/.forge/worktrees/pipeline-0a33c50d/app/api/usage/route.ts +0 -20
  85. package/.forge/worktrees/pipeline-0a33c50d/app/api/version/route.ts +0 -78
  86. package/.forge/worktrees/pipeline-0a33c50d/app/api/watchers/route.ts +0 -33
  87. package/.forge/worktrees/pipeline-0a33c50d/app/api/workspace/[id]/agents/route.ts +0 -35
  88. package/.forge/worktrees/pipeline-0a33c50d/app/api/workspace/[id]/memory/route.ts +0 -23
  89. package/.forge/worktrees/pipeline-0a33c50d/app/api/workspace/[id]/smith/route.ts +0 -22
  90. package/.forge/worktrees/pipeline-0a33c50d/app/api/workspace/[id]/stream/route.ts +0 -28
  91. package/.forge/worktrees/pipeline-0a33c50d/app/api/workspace/route.ts +0 -100
  92. package/.forge/worktrees/pipeline-0a33c50d/app/global-error.tsx +0 -21
  93. package/.forge/worktrees/pipeline-0a33c50d/app/globals.css +0 -52
  94. package/.forge/worktrees/pipeline-0a33c50d/app/icon.ico +0 -0
  95. package/.forge/worktrees/pipeline-0a33c50d/app/icon.png +0 -0
  96. package/.forge/worktrees/pipeline-0a33c50d/app/icon.svg +0 -106
  97. package/.forge/worktrees/pipeline-0a33c50d/app/layout.tsx +0 -17
  98. package/.forge/worktrees/pipeline-0a33c50d/app/login/LoginForm.tsx +0 -96
  99. package/.forge/worktrees/pipeline-0a33c50d/app/login/page.tsx +0 -10
  100. package/.forge/worktrees/pipeline-0a33c50d/app/mobile/page.tsx +0 -9
  101. package/.forge/worktrees/pipeline-0a33c50d/app/page.tsx +0 -21
  102. package/.forge/worktrees/pipeline-0a33c50d/bin/forge-server.mjs +0 -484
  103. package/.forge/worktrees/pipeline-0a33c50d/check-forge-status.sh +0 -71
  104. package/.forge/worktrees/pipeline-0a33c50d/cli/mw.ts +0 -579
  105. package/.forge/worktrees/pipeline-0a33c50d/components/BrowserPanel.tsx +0 -175
  106. package/.forge/worktrees/pipeline-0a33c50d/components/ChatPanel.tsx +0 -191
  107. package/.forge/worktrees/pipeline-0a33c50d/components/ClaudeTerminal.tsx +0 -267
  108. package/.forge/worktrees/pipeline-0a33c50d/components/CodeViewer.tsx +0 -787
  109. package/.forge/worktrees/pipeline-0a33c50d/components/ConversationEditor.tsx +0 -411
  110. package/.forge/worktrees/pipeline-0a33c50d/components/ConversationGraphView.tsx +0 -347
  111. package/.forge/worktrees/pipeline-0a33c50d/components/ConversationTerminalView.tsx +0 -303
  112. package/.forge/worktrees/pipeline-0a33c50d/components/Dashboard.tsx +0 -807
  113. package/.forge/worktrees/pipeline-0a33c50d/components/DashboardWrapper.tsx +0 -9
  114. package/.forge/worktrees/pipeline-0a33c50d/components/DeliveryFlowEditor.tsx +0 -491
  115. package/.forge/worktrees/pipeline-0a33c50d/components/DeliveryList.tsx +0 -230
  116. package/.forge/worktrees/pipeline-0a33c50d/components/DeliveryWorkspace.tsx +0 -589
  117. package/.forge/worktrees/pipeline-0a33c50d/components/DocTerminal.tsx +0 -187
  118. package/.forge/worktrees/pipeline-0a33c50d/components/DocsViewer.tsx +0 -574
  119. package/.forge/worktrees/pipeline-0a33c50d/components/HelpDialog.tsx +0 -169
  120. package/.forge/worktrees/pipeline-0a33c50d/components/HelpTerminal.tsx +0 -141
  121. package/.forge/worktrees/pipeline-0a33c50d/components/InlinePipelineView.tsx +0 -111
  122. package/.forge/worktrees/pipeline-0a33c50d/components/LogViewer.tsx +0 -194
  123. package/.forge/worktrees/pipeline-0a33c50d/components/MarkdownContent.tsx +0 -73
  124. package/.forge/worktrees/pipeline-0a33c50d/components/MobileView.tsx +0 -385
  125. package/.forge/worktrees/pipeline-0a33c50d/components/MonitorPanel.tsx +0 -122
  126. package/.forge/worktrees/pipeline-0a33c50d/components/NewSessionModal.tsx +0 -93
  127. package/.forge/worktrees/pipeline-0a33c50d/components/NewTaskModal.tsx +0 -492
  128. package/.forge/worktrees/pipeline-0a33c50d/components/PipelineEditor.tsx +0 -570
  129. package/.forge/worktrees/pipeline-0a33c50d/components/PipelineView.tsx +0 -1018
  130. package/.forge/worktrees/pipeline-0a33c50d/components/PluginsPanel.tsx +0 -472
  131. package/.forge/worktrees/pipeline-0a33c50d/components/ProjectDetail.tsx +0 -1618
  132. package/.forge/worktrees/pipeline-0a33c50d/components/ProjectList.tsx +0 -108
  133. package/.forge/worktrees/pipeline-0a33c50d/components/ProjectManager.tsx +0 -401
  134. package/.forge/worktrees/pipeline-0a33c50d/components/SessionList.tsx +0 -74
  135. package/.forge/worktrees/pipeline-0a33c50d/components/SessionView.tsx +0 -726
  136. package/.forge/worktrees/pipeline-0a33c50d/components/SettingsModal.tsx +0 -1647
  137. package/.forge/worktrees/pipeline-0a33c50d/components/SkillsPanel.tsx +0 -969
  138. package/.forge/worktrees/pipeline-0a33c50d/components/StatusBar.tsx +0 -99
  139. package/.forge/worktrees/pipeline-0a33c50d/components/TabBar.tsx +0 -46
  140. package/.forge/worktrees/pipeline-0a33c50d/components/TaskBoard.tsx +0 -113
  141. package/.forge/worktrees/pipeline-0a33c50d/components/TaskDetail.tsx +0 -372
  142. package/.forge/worktrees/pipeline-0a33c50d/components/TerminalLauncher.tsx +0 -398
  143. package/.forge/worktrees/pipeline-0a33c50d/components/TunnelToggle.tsx +0 -206
  144. package/.forge/worktrees/pipeline-0a33c50d/components/UsagePanel.tsx +0 -207
  145. package/.forge/worktrees/pipeline-0a33c50d/components/WebTerminal.tsx +0 -1683
  146. package/.forge/worktrees/pipeline-0a33c50d/components/WorkspaceTree.tsx +0 -221
  147. package/.forge/worktrees/pipeline-0a33c50d/components/WorkspaceView.tsx +0 -4048
  148. package/.forge/worktrees/pipeline-0a33c50d/dev-test.sh +0 -5
  149. package/.forge/worktrees/pipeline-0a33c50d/docs/Forge_Memory_Layer_Design.docx +0 -0
  150. package/.forge/worktrees/pipeline-0a33c50d/docs/Forge_Strategy_Research_2026.docx +0 -0
  151. package/.forge/worktrees/pipeline-0a33c50d/docs/LOCAL-DEPLOY.md +0 -144
  152. package/.forge/worktrees/pipeline-0a33c50d/docs/roadmap-multi-agent-workflow.md +0 -330
  153. package/.forge/worktrees/pipeline-0a33c50d/forge-logo.png +0 -0
  154. package/.forge/worktrees/pipeline-0a33c50d/forge-logo.svg +0 -106
  155. package/.forge/worktrees/pipeline-0a33c50d/hooks/useSidebarResize.ts +0 -52
  156. package/.forge/worktrees/pipeline-0a33c50d/install.sh +0 -29
  157. package/.forge/worktrees/pipeline-0a33c50d/instrumentation.ts +0 -35
  158. package/.forge/worktrees/pipeline-0a33c50d/lib/agents/claude-adapter.ts +0 -104
  159. package/.forge/worktrees/pipeline-0a33c50d/lib/agents/generic-adapter.ts +0 -64
  160. package/.forge/worktrees/pipeline-0a33c50d/lib/agents/index.ts +0 -245
  161. package/.forge/worktrees/pipeline-0a33c50d/lib/agents/types.ts +0 -70
  162. package/.forge/worktrees/pipeline-0a33c50d/lib/artifacts.ts +0 -106
  163. package/.forge/worktrees/pipeline-0a33c50d/lib/auth.ts +0 -62
  164. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/docker.yaml +0 -70
  165. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/http.yaml +0 -66
  166. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/jenkins.yaml +0 -92
  167. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/llm-vision.yaml +0 -85
  168. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/playwright.yaml +0 -111
  169. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/shell-command.yaml +0 -60
  170. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/slack.yaml +0 -48
  171. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/webhook.yaml +0 -56
  172. package/.forge/worktrees/pipeline-0a33c50d/lib/claude-process.ts +0 -352
  173. package/.forge/worktrees/pipeline-0a33c50d/lib/claude-sessions.ts +0 -266
  174. package/.forge/worktrees/pipeline-0a33c50d/lib/claude-templates.ts +0 -227
  175. package/.forge/worktrees/pipeline-0a33c50d/lib/cloudflared.ts +0 -424
  176. package/.forge/worktrees/pipeline-0a33c50d/lib/crypto.ts +0 -67
  177. package/.forge/worktrees/pipeline-0a33c50d/lib/delivery.ts +0 -787
  178. package/.forge/worktrees/pipeline-0a33c50d/lib/dirs.ts +0 -99
  179. package/.forge/worktrees/pipeline-0a33c50d/lib/flows.ts +0 -86
  180. package/.forge/worktrees/pipeline-0a33c50d/lib/forge-mcp-server.ts +0 -717
  181. package/.forge/worktrees/pipeline-0a33c50d/lib/forge-skills/forge-inbox.md +0 -38
  182. package/.forge/worktrees/pipeline-0a33c50d/lib/forge-skills/forge-send.md +0 -47
  183. package/.forge/worktrees/pipeline-0a33c50d/lib/forge-skills/forge-status.md +0 -32
  184. package/.forge/worktrees/pipeline-0a33c50d/lib/forge-skills/forge-workspace-sync.md +0 -37
  185. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/00-overview.md +0 -40
  186. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/01-settings.md +0 -194
  187. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/02-telegram.md +0 -41
  188. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/03-tunnel.md +0 -31
  189. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/04-tasks.md +0 -52
  190. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/05-pipelines.md +0 -460
  191. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/06-skills.md +0 -43
  192. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/07-projects.md +0 -73
  193. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/08-rules.md +0 -53
  194. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/09-issue-autofix.md +0 -55
  195. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/10-troubleshooting.md +0 -89
  196. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/11-workspace.md +0 -810
  197. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/CLAUDE.md +0 -62
  198. package/.forge/worktrees/pipeline-0a33c50d/lib/init.ts +0 -266
  199. package/.forge/worktrees/pipeline-0a33c50d/lib/issue-scanner.ts +0 -298
  200. package/.forge/worktrees/pipeline-0a33c50d/lib/logger.ts +0 -79
  201. package/.forge/worktrees/pipeline-0a33c50d/lib/notifications.ts +0 -75
  202. package/.forge/worktrees/pipeline-0a33c50d/lib/notify.ts +0 -108
  203. package/.forge/worktrees/pipeline-0a33c50d/lib/password.ts +0 -97
  204. package/.forge/worktrees/pipeline-0a33c50d/lib/pipeline-scheduler.ts +0 -373
  205. package/.forge/worktrees/pipeline-0a33c50d/lib/pipeline.ts +0 -1438
  206. package/.forge/worktrees/pipeline-0a33c50d/lib/plugins/executor.ts +0 -347
  207. package/.forge/worktrees/pipeline-0a33c50d/lib/plugins/registry.ts +0 -228
  208. package/.forge/worktrees/pipeline-0a33c50d/lib/plugins/types.ts +0 -103
  209. package/.forge/worktrees/pipeline-0a33c50d/lib/project-sessions.ts +0 -53
  210. package/.forge/worktrees/pipeline-0a33c50d/lib/projects.ts +0 -86
  211. package/.forge/worktrees/pipeline-0a33c50d/lib/session-manager.ts +0 -156
  212. package/.forge/worktrees/pipeline-0a33c50d/lib/session-utils.ts +0 -53
  213. package/.forge/worktrees/pipeline-0a33c50d/lib/session-watcher.ts +0 -345
  214. package/.forge/worktrees/pipeline-0a33c50d/lib/settings.ts +0 -195
  215. package/.forge/worktrees/pipeline-0a33c50d/lib/skills.ts +0 -458
  216. package/.forge/worktrees/pipeline-0a33c50d/lib/task-manager.ts +0 -949
  217. package/.forge/worktrees/pipeline-0a33c50d/lib/telegram-bot.ts +0 -1477
  218. package/.forge/worktrees/pipeline-0a33c50d/lib/telegram-standalone.ts +0 -83
  219. package/.forge/worktrees/pipeline-0a33c50d/lib/terminal-server.ts +0 -70
  220. package/.forge/worktrees/pipeline-0a33c50d/lib/terminal-standalone.ts +0 -421
  221. package/.forge/worktrees/pipeline-0a33c50d/lib/usage-scanner.ts +0 -249
  222. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/__tests__/state-machine.test.ts +0 -388
  223. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/__tests__/workspace.test.ts +0 -311
  224. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/agent-bus.ts +0 -416
  225. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/agent-worker.ts +0 -655
  226. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/backends/api-backend.ts +0 -262
  227. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/backends/cli-backend.ts +0 -491
  228. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/index.ts +0 -82
  229. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/manager.ts +0 -136
  230. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/orchestrator.ts +0 -3400
  231. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/persistence.ts +0 -309
  232. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/presets.ts +0 -649
  233. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/requests.ts +0 -287
  234. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/session-monitor.ts +0 -240
  235. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/skill-installer.ts +0 -275
  236. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/smith-memory.ts +0 -498
  237. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/types.ts +0 -241
  238. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/watch-manager.ts +0 -560
  239. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace-standalone.ts +0 -911
  240. package/.forge/worktrees/pipeline-0a33c50d/middleware.ts +0 -51
  241. package/.forge/worktrees/pipeline-0a33c50d/next.config.ts +0 -26
  242. package/.forge/worktrees/pipeline-0a33c50d/package.json +0 -74
  243. package/.forge/worktrees/pipeline-0a33c50d/pnpm-lock.yaml +0 -3719
  244. package/.forge/worktrees/pipeline-0a33c50d/pnpm-workspace.yaml +0 -1
  245. package/.forge/worktrees/pipeline-0a33c50d/postcss.config.mjs +0 -7
  246. package/.forge/worktrees/pipeline-0a33c50d/publish.sh +0 -133
  247. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/README.md +0 -66
  248. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/results/.gitignore +0 -2
  249. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/run.ts +0 -635
  250. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/01-text-utils/task.md +0 -26
  251. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  252. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  253. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/02-pagination/task.md +0 -48
  254. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  255. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  256. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  257. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  258. package/.forge/worktrees/pipeline-0a33c50d/scripts/verify-usage.ts +0 -178
  259. package/.forge/worktrees/pipeline-0a33c50d/src/config/index.ts +0 -129
  260. package/.forge/worktrees/pipeline-0a33c50d/src/core/db/database.ts +0 -259
  261. package/.forge/worktrees/pipeline-0a33c50d/src/core/memory/strategy.ts +0 -32
  262. package/.forge/worktrees/pipeline-0a33c50d/src/core/providers/chat.ts +0 -65
  263. package/.forge/worktrees/pipeline-0a33c50d/src/core/providers/registry.ts +0 -60
  264. package/.forge/worktrees/pipeline-0a33c50d/src/core/session/manager.ts +0 -190
  265. package/.forge/worktrees/pipeline-0a33c50d/src/types/index.ts +0 -129
  266. package/.forge/worktrees/pipeline-0a33c50d/start.sh +0 -31
  267. package/.forge/worktrees/pipeline-0a33c50d/templates/smith-lead.json +0 -45
  268. package/.forge/worktrees/pipeline-0a33c50d/tsconfig.json +0 -42
  269. package/.forge/worktrees/pipeline-2ba01c10/CLAUDE.md +0 -86
  270. package/.forge/worktrees/pipeline-2ba01c10/README.md +0 -136
  271. package/.forge/worktrees/pipeline-2ba01c10/RELEASE_NOTES.md +0 -11
  272. package/.forge/worktrees/pipeline-2ba01c10/app/api/agents/route.ts +0 -17
  273. package/.forge/worktrees/pipeline-2ba01c10/app/api/auth/[...nextauth]/route.ts +0 -3
  274. package/.forge/worktrees/pipeline-2ba01c10/app/api/auth/verify/route.ts +0 -46
  275. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude/[id]/route.ts +0 -31
  276. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude/[id]/stream/route.ts +0 -63
  277. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude/route.ts +0 -28
  278. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  279. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  280. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude-sessions/[projectName]/route.ts +0 -37
  281. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude-sessions/sync/route.ts +0 -17
  282. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude-templates/route.ts +0 -145
  283. package/.forge/worktrees/pipeline-2ba01c10/app/api/code/route.ts +0 -299
  284. package/.forge/worktrees/pipeline-2ba01c10/app/api/delivery/[id]/route.ts +0 -62
  285. package/.forge/worktrees/pipeline-2ba01c10/app/api/delivery/route.ts +0 -40
  286. package/.forge/worktrees/pipeline-2ba01c10/app/api/detect-cli/route.ts +0 -46
  287. package/.forge/worktrees/pipeline-2ba01c10/app/api/docs/route.ts +0 -176
  288. package/.forge/worktrees/pipeline-2ba01c10/app/api/docs/sessions/route.ts +0 -54
  289. package/.forge/worktrees/pipeline-2ba01c10/app/api/favorites/route.ts +0 -26
  290. package/.forge/worktrees/pipeline-2ba01c10/app/api/flows/route.ts +0 -6
  291. package/.forge/worktrees/pipeline-2ba01c10/app/api/flows/run/route.ts +0 -19
  292. package/.forge/worktrees/pipeline-2ba01c10/app/api/git/route.ts +0 -149
  293. package/.forge/worktrees/pipeline-2ba01c10/app/api/help/route.ts +0 -84
  294. package/.forge/worktrees/pipeline-2ba01c10/app/api/issue-scanner/route.ts +0 -116
  295. package/.forge/worktrees/pipeline-2ba01c10/app/api/logs/route.ts +0 -100
  296. package/.forge/worktrees/pipeline-2ba01c10/app/api/mobile-chat/route.ts +0 -115
  297. package/.forge/worktrees/pipeline-2ba01c10/app/api/monitor/route.ts +0 -74
  298. package/.forge/worktrees/pipeline-2ba01c10/app/api/notifications/route.ts +0 -42
  299. package/.forge/worktrees/pipeline-2ba01c10/app/api/notify/test/route.ts +0 -33
  300. package/.forge/worktrees/pipeline-2ba01c10/app/api/online/route.ts +0 -40
  301. package/.forge/worktrees/pipeline-2ba01c10/app/api/pipelines/[id]/route.ts +0 -41
  302. package/.forge/worktrees/pipeline-2ba01c10/app/api/pipelines/route.ts +0 -90
  303. package/.forge/worktrees/pipeline-2ba01c10/app/api/plugins/route.ts +0 -75
  304. package/.forge/worktrees/pipeline-2ba01c10/app/api/preview/[...path]/route.ts +0 -64
  305. package/.forge/worktrees/pipeline-2ba01c10/app/api/preview/route.ts +0 -156
  306. package/.forge/worktrees/pipeline-2ba01c10/app/api/project-pipelines/route.ts +0 -91
  307. package/.forge/worktrees/pipeline-2ba01c10/app/api/project-sessions/route.ts +0 -61
  308. package/.forge/worktrees/pipeline-2ba01c10/app/api/projects/route.ts +0 -26
  309. package/.forge/worktrees/pipeline-2ba01c10/app/api/sessions/[id]/chat/route.ts +0 -64
  310. package/.forge/worktrees/pipeline-2ba01c10/app/api/sessions/[id]/messages/route.ts +0 -9
  311. package/.forge/worktrees/pipeline-2ba01c10/app/api/sessions/[id]/route.ts +0 -17
  312. package/.forge/worktrees/pipeline-2ba01c10/app/api/sessions/route.ts +0 -20
  313. package/.forge/worktrees/pipeline-2ba01c10/app/api/settings/route.ts +0 -64
  314. package/.forge/worktrees/pipeline-2ba01c10/app/api/skills/local/route.ts +0 -228
  315. package/.forge/worktrees/pipeline-2ba01c10/app/api/skills/route.ts +0 -182
  316. package/.forge/worktrees/pipeline-2ba01c10/app/api/smith-templates/route.ts +0 -81
  317. package/.forge/worktrees/pipeline-2ba01c10/app/api/status/route.ts +0 -12
  318. package/.forge/worktrees/pipeline-2ba01c10/app/api/tabs/route.ts +0 -25
  319. package/.forge/worktrees/pipeline-2ba01c10/app/api/tasks/[id]/route.ts +0 -51
  320. package/.forge/worktrees/pipeline-2ba01c10/app/api/tasks/[id]/stream/route.ts +0 -77
  321. package/.forge/worktrees/pipeline-2ba01c10/app/api/tasks/link/route.ts +0 -37
  322. package/.forge/worktrees/pipeline-2ba01c10/app/api/tasks/route.ts +0 -44
  323. package/.forge/worktrees/pipeline-2ba01c10/app/api/tasks/session/route.ts +0 -14
  324. package/.forge/worktrees/pipeline-2ba01c10/app/api/telegram/route.ts +0 -23
  325. package/.forge/worktrees/pipeline-2ba01c10/app/api/templates/route.ts +0 -6
  326. package/.forge/worktrees/pipeline-2ba01c10/app/api/terminal-bell/route.ts +0 -35
  327. package/.forge/worktrees/pipeline-2ba01c10/app/api/terminal-cwd/route.ts +0 -19
  328. package/.forge/worktrees/pipeline-2ba01c10/app/api/terminal-state/route.ts +0 -15
  329. package/.forge/worktrees/pipeline-2ba01c10/app/api/tunnel/route.ts +0 -26
  330. package/.forge/worktrees/pipeline-2ba01c10/app/api/upgrade/route.ts +0 -43
  331. package/.forge/worktrees/pipeline-2ba01c10/app/api/usage/route.ts +0 -20
  332. package/.forge/worktrees/pipeline-2ba01c10/app/api/version/route.ts +0 -78
  333. package/.forge/worktrees/pipeline-2ba01c10/app/api/watchers/route.ts +0 -33
  334. package/.forge/worktrees/pipeline-2ba01c10/app/api/workspace/[id]/agents/route.ts +0 -35
  335. package/.forge/worktrees/pipeline-2ba01c10/app/api/workspace/[id]/memory/route.ts +0 -23
  336. package/.forge/worktrees/pipeline-2ba01c10/app/api/workspace/[id]/smith/route.ts +0 -22
  337. package/.forge/worktrees/pipeline-2ba01c10/app/api/workspace/[id]/stream/route.ts +0 -28
  338. package/.forge/worktrees/pipeline-2ba01c10/app/api/workspace/route.ts +0 -100
  339. package/.forge/worktrees/pipeline-2ba01c10/app/global-error.tsx +0 -21
  340. package/.forge/worktrees/pipeline-2ba01c10/app/globals.css +0 -52
  341. package/.forge/worktrees/pipeline-2ba01c10/app/icon.ico +0 -0
  342. package/.forge/worktrees/pipeline-2ba01c10/app/icon.png +0 -0
  343. package/.forge/worktrees/pipeline-2ba01c10/app/icon.svg +0 -106
  344. package/.forge/worktrees/pipeline-2ba01c10/app/layout.tsx +0 -17
  345. package/.forge/worktrees/pipeline-2ba01c10/app/login/LoginForm.tsx +0 -96
  346. package/.forge/worktrees/pipeline-2ba01c10/app/login/page.tsx +0 -10
  347. package/.forge/worktrees/pipeline-2ba01c10/app/mobile/page.tsx +0 -9
  348. package/.forge/worktrees/pipeline-2ba01c10/app/page.tsx +0 -21
  349. package/.forge/worktrees/pipeline-2ba01c10/bin/forge-server.mjs +0 -484
  350. package/.forge/worktrees/pipeline-2ba01c10/check-forge-status.sh +0 -71
  351. package/.forge/worktrees/pipeline-2ba01c10/cli/mw.ts +0 -579
  352. package/.forge/worktrees/pipeline-2ba01c10/components/BrowserPanel.tsx +0 -175
  353. package/.forge/worktrees/pipeline-2ba01c10/components/ChatPanel.tsx +0 -191
  354. package/.forge/worktrees/pipeline-2ba01c10/components/ClaudeTerminal.tsx +0 -267
  355. package/.forge/worktrees/pipeline-2ba01c10/components/CodeViewer.tsx +0 -787
  356. package/.forge/worktrees/pipeline-2ba01c10/components/ConversationEditor.tsx +0 -411
  357. package/.forge/worktrees/pipeline-2ba01c10/components/ConversationGraphView.tsx +0 -347
  358. package/.forge/worktrees/pipeline-2ba01c10/components/ConversationTerminalView.tsx +0 -303
  359. package/.forge/worktrees/pipeline-2ba01c10/components/Dashboard.tsx +0 -807
  360. package/.forge/worktrees/pipeline-2ba01c10/components/DashboardWrapper.tsx +0 -9
  361. package/.forge/worktrees/pipeline-2ba01c10/components/DeliveryFlowEditor.tsx +0 -491
  362. package/.forge/worktrees/pipeline-2ba01c10/components/DeliveryList.tsx +0 -230
  363. package/.forge/worktrees/pipeline-2ba01c10/components/DeliveryWorkspace.tsx +0 -589
  364. package/.forge/worktrees/pipeline-2ba01c10/components/DocTerminal.tsx +0 -187
  365. package/.forge/worktrees/pipeline-2ba01c10/components/DocsViewer.tsx +0 -574
  366. package/.forge/worktrees/pipeline-2ba01c10/components/HelpDialog.tsx +0 -169
  367. package/.forge/worktrees/pipeline-2ba01c10/components/HelpTerminal.tsx +0 -141
  368. package/.forge/worktrees/pipeline-2ba01c10/components/InlinePipelineView.tsx +0 -111
  369. package/.forge/worktrees/pipeline-2ba01c10/components/LogViewer.tsx +0 -194
  370. package/.forge/worktrees/pipeline-2ba01c10/components/MarkdownContent.tsx +0 -73
  371. package/.forge/worktrees/pipeline-2ba01c10/components/MobileView.tsx +0 -385
  372. package/.forge/worktrees/pipeline-2ba01c10/components/MonitorPanel.tsx +0 -122
  373. package/.forge/worktrees/pipeline-2ba01c10/components/NewSessionModal.tsx +0 -93
  374. package/.forge/worktrees/pipeline-2ba01c10/components/NewTaskModal.tsx +0 -492
  375. package/.forge/worktrees/pipeline-2ba01c10/components/PipelineEditor.tsx +0 -570
  376. package/.forge/worktrees/pipeline-2ba01c10/components/PipelineView.tsx +0 -1018
  377. package/.forge/worktrees/pipeline-2ba01c10/components/PluginsPanel.tsx +0 -472
  378. package/.forge/worktrees/pipeline-2ba01c10/components/ProjectDetail.tsx +0 -1618
  379. package/.forge/worktrees/pipeline-2ba01c10/components/ProjectList.tsx +0 -108
  380. package/.forge/worktrees/pipeline-2ba01c10/components/ProjectManager.tsx +0 -401
  381. package/.forge/worktrees/pipeline-2ba01c10/components/SessionList.tsx +0 -74
  382. package/.forge/worktrees/pipeline-2ba01c10/components/SessionView.tsx +0 -726
  383. package/.forge/worktrees/pipeline-2ba01c10/components/SettingsModal.tsx +0 -1647
  384. package/.forge/worktrees/pipeline-2ba01c10/components/SkillsPanel.tsx +0 -969
  385. package/.forge/worktrees/pipeline-2ba01c10/components/StatusBar.tsx +0 -99
  386. package/.forge/worktrees/pipeline-2ba01c10/components/TabBar.tsx +0 -46
  387. package/.forge/worktrees/pipeline-2ba01c10/components/TaskBoard.tsx +0 -113
  388. package/.forge/worktrees/pipeline-2ba01c10/components/TaskDetail.tsx +0 -372
  389. package/.forge/worktrees/pipeline-2ba01c10/components/TerminalLauncher.tsx +0 -398
  390. package/.forge/worktrees/pipeline-2ba01c10/components/TunnelToggle.tsx +0 -206
  391. package/.forge/worktrees/pipeline-2ba01c10/components/UsagePanel.tsx +0 -207
  392. package/.forge/worktrees/pipeline-2ba01c10/components/WebTerminal.tsx +0 -1683
  393. package/.forge/worktrees/pipeline-2ba01c10/components/WorkspaceTree.tsx +0 -221
  394. package/.forge/worktrees/pipeline-2ba01c10/components/WorkspaceView.tsx +0 -4048
  395. package/.forge/worktrees/pipeline-2ba01c10/dev-test.sh +0 -5
  396. package/.forge/worktrees/pipeline-2ba01c10/docs/Forge_Memory_Layer_Design.docx +0 -0
  397. package/.forge/worktrees/pipeline-2ba01c10/docs/Forge_Strategy_Research_2026.docx +0 -0
  398. package/.forge/worktrees/pipeline-2ba01c10/docs/LOCAL-DEPLOY.md +0 -144
  399. package/.forge/worktrees/pipeline-2ba01c10/docs/roadmap-multi-agent-workflow.md +0 -330
  400. package/.forge/worktrees/pipeline-2ba01c10/forge-logo.png +0 -0
  401. package/.forge/worktrees/pipeline-2ba01c10/forge-logo.svg +0 -106
  402. package/.forge/worktrees/pipeline-2ba01c10/hooks/useSidebarResize.ts +0 -52
  403. package/.forge/worktrees/pipeline-2ba01c10/install.sh +0 -29
  404. package/.forge/worktrees/pipeline-2ba01c10/instrumentation.ts +0 -35
  405. package/.forge/worktrees/pipeline-2ba01c10/lib/agents/claude-adapter.ts +0 -104
  406. package/.forge/worktrees/pipeline-2ba01c10/lib/agents/generic-adapter.ts +0 -64
  407. package/.forge/worktrees/pipeline-2ba01c10/lib/agents/index.ts +0 -245
  408. package/.forge/worktrees/pipeline-2ba01c10/lib/agents/types.ts +0 -70
  409. package/.forge/worktrees/pipeline-2ba01c10/lib/artifacts.ts +0 -106
  410. package/.forge/worktrees/pipeline-2ba01c10/lib/auth.ts +0 -62
  411. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/docker.yaml +0 -70
  412. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/http.yaml +0 -66
  413. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/jenkins.yaml +0 -92
  414. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/llm-vision.yaml +0 -85
  415. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/playwright.yaml +0 -111
  416. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/shell-command.yaml +0 -60
  417. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/slack.yaml +0 -48
  418. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/webhook.yaml +0 -56
  419. package/.forge/worktrees/pipeline-2ba01c10/lib/claude-process.ts +0 -352
  420. package/.forge/worktrees/pipeline-2ba01c10/lib/claude-sessions.ts +0 -266
  421. package/.forge/worktrees/pipeline-2ba01c10/lib/claude-templates.ts +0 -227
  422. package/.forge/worktrees/pipeline-2ba01c10/lib/cloudflared.ts +0 -424
  423. package/.forge/worktrees/pipeline-2ba01c10/lib/crypto.ts +0 -67
  424. package/.forge/worktrees/pipeline-2ba01c10/lib/delivery.ts +0 -787
  425. package/.forge/worktrees/pipeline-2ba01c10/lib/dirs.ts +0 -99
  426. package/.forge/worktrees/pipeline-2ba01c10/lib/flows.ts +0 -86
  427. package/.forge/worktrees/pipeline-2ba01c10/lib/forge-mcp-server.ts +0 -717
  428. package/.forge/worktrees/pipeline-2ba01c10/lib/forge-skills/forge-inbox.md +0 -38
  429. package/.forge/worktrees/pipeline-2ba01c10/lib/forge-skills/forge-send.md +0 -47
  430. package/.forge/worktrees/pipeline-2ba01c10/lib/forge-skills/forge-status.md +0 -32
  431. package/.forge/worktrees/pipeline-2ba01c10/lib/forge-skills/forge-workspace-sync.md +0 -37
  432. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/00-overview.md +0 -40
  433. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/01-settings.md +0 -194
  434. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/02-telegram.md +0 -41
  435. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/03-tunnel.md +0 -31
  436. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/04-tasks.md +0 -52
  437. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/05-pipelines.md +0 -460
  438. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/06-skills.md +0 -43
  439. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/07-projects.md +0 -73
  440. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/08-rules.md +0 -53
  441. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/09-issue-autofix.md +0 -55
  442. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/10-troubleshooting.md +0 -89
  443. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/11-workspace.md +0 -810
  444. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/CLAUDE.md +0 -62
  445. package/.forge/worktrees/pipeline-2ba01c10/lib/init.ts +0 -266
  446. package/.forge/worktrees/pipeline-2ba01c10/lib/issue-scanner.ts +0 -298
  447. package/.forge/worktrees/pipeline-2ba01c10/lib/logger.ts +0 -79
  448. package/.forge/worktrees/pipeline-2ba01c10/lib/notifications.ts +0 -75
  449. package/.forge/worktrees/pipeline-2ba01c10/lib/notify.ts +0 -108
  450. package/.forge/worktrees/pipeline-2ba01c10/lib/password.ts +0 -97
  451. package/.forge/worktrees/pipeline-2ba01c10/lib/pipeline-scheduler.ts +0 -373
  452. package/.forge/worktrees/pipeline-2ba01c10/lib/pipeline.ts +0 -1438
  453. package/.forge/worktrees/pipeline-2ba01c10/lib/plugins/executor.ts +0 -347
  454. package/.forge/worktrees/pipeline-2ba01c10/lib/plugins/registry.ts +0 -228
  455. package/.forge/worktrees/pipeline-2ba01c10/lib/plugins/types.ts +0 -103
  456. package/.forge/worktrees/pipeline-2ba01c10/lib/project-sessions.ts +0 -53
  457. package/.forge/worktrees/pipeline-2ba01c10/lib/projects.ts +0 -86
  458. package/.forge/worktrees/pipeline-2ba01c10/lib/session-manager.ts +0 -156
  459. package/.forge/worktrees/pipeline-2ba01c10/lib/session-utils.ts +0 -53
  460. package/.forge/worktrees/pipeline-2ba01c10/lib/session-watcher.ts +0 -345
  461. package/.forge/worktrees/pipeline-2ba01c10/lib/settings.ts +0 -195
  462. package/.forge/worktrees/pipeline-2ba01c10/lib/skills.ts +0 -458
  463. package/.forge/worktrees/pipeline-2ba01c10/lib/task-manager.ts +0 -949
  464. package/.forge/worktrees/pipeline-2ba01c10/lib/telegram-bot.ts +0 -1477
  465. package/.forge/worktrees/pipeline-2ba01c10/lib/telegram-standalone.ts +0 -83
  466. package/.forge/worktrees/pipeline-2ba01c10/lib/terminal-server.ts +0 -70
  467. package/.forge/worktrees/pipeline-2ba01c10/lib/terminal-standalone.ts +0 -421
  468. package/.forge/worktrees/pipeline-2ba01c10/lib/usage-scanner.ts +0 -249
  469. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/__tests__/state-machine.test.ts +0 -388
  470. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/__tests__/workspace.test.ts +0 -311
  471. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/agent-bus.ts +0 -416
  472. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/agent-worker.ts +0 -655
  473. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/backends/api-backend.ts +0 -262
  474. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/backends/cli-backend.ts +0 -491
  475. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/index.ts +0 -82
  476. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/manager.ts +0 -136
  477. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/orchestrator.ts +0 -3400
  478. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/persistence.ts +0 -309
  479. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/presets.ts +0 -649
  480. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/requests.ts +0 -287
  481. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/session-monitor.ts +0 -240
  482. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/skill-installer.ts +0 -275
  483. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/smith-memory.ts +0 -498
  484. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/types.ts +0 -241
  485. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/watch-manager.ts +0 -560
  486. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace-standalone.ts +0 -911
  487. package/.forge/worktrees/pipeline-2ba01c10/middleware.ts +0 -51
  488. package/.forge/worktrees/pipeline-2ba01c10/next.config.ts +0 -26
  489. package/.forge/worktrees/pipeline-2ba01c10/package.json +0 -74
  490. package/.forge/worktrees/pipeline-2ba01c10/pnpm-lock.yaml +0 -3719
  491. package/.forge/worktrees/pipeline-2ba01c10/pnpm-workspace.yaml +0 -1
  492. package/.forge/worktrees/pipeline-2ba01c10/postcss.config.mjs +0 -7
  493. package/.forge/worktrees/pipeline-2ba01c10/publish.sh +0 -133
  494. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/README.md +0 -66
  495. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/results/.gitignore +0 -2
  496. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/run.ts +0 -635
  497. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/01-text-utils/task.md +0 -26
  498. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  499. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  500. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/02-pagination/task.md +0 -48
  501. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  502. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  503. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  504. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  505. package/.forge/worktrees/pipeline-2ba01c10/scripts/verify-usage.ts +0 -178
  506. package/.forge/worktrees/pipeline-2ba01c10/src/config/index.ts +0 -129
  507. package/.forge/worktrees/pipeline-2ba01c10/src/core/db/database.ts +0 -259
  508. package/.forge/worktrees/pipeline-2ba01c10/src/core/memory/strategy.ts +0 -32
  509. package/.forge/worktrees/pipeline-2ba01c10/src/core/providers/chat.ts +0 -65
  510. package/.forge/worktrees/pipeline-2ba01c10/src/core/providers/registry.ts +0 -60
  511. package/.forge/worktrees/pipeline-2ba01c10/src/core/session/manager.ts +0 -190
  512. package/.forge/worktrees/pipeline-2ba01c10/src/types/index.ts +0 -129
  513. package/.forge/worktrees/pipeline-2ba01c10/start.sh +0 -31
  514. package/.forge/worktrees/pipeline-2ba01c10/templates/smith-lead.json +0 -45
  515. package/.forge/worktrees/pipeline-2ba01c10/tsconfig.json +0 -42
  516. package/.forge/worktrees/pipeline-3156a8b3/CLAUDE.md +0 -86
  517. package/.forge/worktrees/pipeline-3156a8b3/README.md +0 -136
  518. package/.forge/worktrees/pipeline-3156a8b3/RELEASE_NOTES.md +0 -11
  519. package/.forge/worktrees/pipeline-3156a8b3/app/api/agents/route.ts +0 -17
  520. package/.forge/worktrees/pipeline-3156a8b3/app/api/auth/[...nextauth]/route.ts +0 -3
  521. package/.forge/worktrees/pipeline-3156a8b3/app/api/auth/verify/route.ts +0 -46
  522. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude/[id]/route.ts +0 -31
  523. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude/[id]/stream/route.ts +0 -63
  524. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude/route.ts +0 -28
  525. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  526. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  527. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude-sessions/[projectName]/route.ts +0 -37
  528. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude-sessions/sync/route.ts +0 -17
  529. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude-templates/route.ts +0 -145
  530. package/.forge/worktrees/pipeline-3156a8b3/app/api/code/route.ts +0 -299
  531. package/.forge/worktrees/pipeline-3156a8b3/app/api/delivery/[id]/route.ts +0 -62
  532. package/.forge/worktrees/pipeline-3156a8b3/app/api/delivery/route.ts +0 -40
  533. package/.forge/worktrees/pipeline-3156a8b3/app/api/detect-cli/route.ts +0 -46
  534. package/.forge/worktrees/pipeline-3156a8b3/app/api/docs/route.ts +0 -176
  535. package/.forge/worktrees/pipeline-3156a8b3/app/api/docs/sessions/route.ts +0 -54
  536. package/.forge/worktrees/pipeline-3156a8b3/app/api/favorites/route.ts +0 -26
  537. package/.forge/worktrees/pipeline-3156a8b3/app/api/flows/route.ts +0 -6
  538. package/.forge/worktrees/pipeline-3156a8b3/app/api/flows/run/route.ts +0 -19
  539. package/.forge/worktrees/pipeline-3156a8b3/app/api/git/route.ts +0 -149
  540. package/.forge/worktrees/pipeline-3156a8b3/app/api/help/route.ts +0 -84
  541. package/.forge/worktrees/pipeline-3156a8b3/app/api/issue-scanner/route.ts +0 -116
  542. package/.forge/worktrees/pipeline-3156a8b3/app/api/logs/route.ts +0 -100
  543. package/.forge/worktrees/pipeline-3156a8b3/app/api/mobile-chat/route.ts +0 -115
  544. package/.forge/worktrees/pipeline-3156a8b3/app/api/monitor/route.ts +0 -74
  545. package/.forge/worktrees/pipeline-3156a8b3/app/api/notifications/route.ts +0 -42
  546. package/.forge/worktrees/pipeline-3156a8b3/app/api/notify/test/route.ts +0 -33
  547. package/.forge/worktrees/pipeline-3156a8b3/app/api/online/route.ts +0 -40
  548. package/.forge/worktrees/pipeline-3156a8b3/app/api/pipelines/[id]/route.ts +0 -41
  549. package/.forge/worktrees/pipeline-3156a8b3/app/api/pipelines/route.ts +0 -90
  550. package/.forge/worktrees/pipeline-3156a8b3/app/api/plugins/route.ts +0 -75
  551. package/.forge/worktrees/pipeline-3156a8b3/app/api/preview/[...path]/route.ts +0 -64
  552. package/.forge/worktrees/pipeline-3156a8b3/app/api/preview/route.ts +0 -156
  553. package/.forge/worktrees/pipeline-3156a8b3/app/api/project-pipelines/route.ts +0 -91
  554. package/.forge/worktrees/pipeline-3156a8b3/app/api/project-sessions/route.ts +0 -61
  555. package/.forge/worktrees/pipeline-3156a8b3/app/api/projects/route.ts +0 -26
  556. package/.forge/worktrees/pipeline-3156a8b3/app/api/sessions/[id]/chat/route.ts +0 -64
  557. package/.forge/worktrees/pipeline-3156a8b3/app/api/sessions/[id]/messages/route.ts +0 -9
  558. package/.forge/worktrees/pipeline-3156a8b3/app/api/sessions/[id]/route.ts +0 -17
  559. package/.forge/worktrees/pipeline-3156a8b3/app/api/sessions/route.ts +0 -20
  560. package/.forge/worktrees/pipeline-3156a8b3/app/api/settings/route.ts +0 -64
  561. package/.forge/worktrees/pipeline-3156a8b3/app/api/skills/local/route.ts +0 -228
  562. package/.forge/worktrees/pipeline-3156a8b3/app/api/skills/route.ts +0 -182
  563. package/.forge/worktrees/pipeline-3156a8b3/app/api/smith-templates/route.ts +0 -81
  564. package/.forge/worktrees/pipeline-3156a8b3/app/api/status/route.ts +0 -12
  565. package/.forge/worktrees/pipeline-3156a8b3/app/api/tabs/route.ts +0 -25
  566. package/.forge/worktrees/pipeline-3156a8b3/app/api/tasks/[id]/route.ts +0 -51
  567. package/.forge/worktrees/pipeline-3156a8b3/app/api/tasks/[id]/stream/route.ts +0 -77
  568. package/.forge/worktrees/pipeline-3156a8b3/app/api/tasks/link/route.ts +0 -37
  569. package/.forge/worktrees/pipeline-3156a8b3/app/api/tasks/route.ts +0 -44
  570. package/.forge/worktrees/pipeline-3156a8b3/app/api/tasks/session/route.ts +0 -14
  571. package/.forge/worktrees/pipeline-3156a8b3/app/api/telegram/route.ts +0 -23
  572. package/.forge/worktrees/pipeline-3156a8b3/app/api/templates/route.ts +0 -6
  573. package/.forge/worktrees/pipeline-3156a8b3/app/api/terminal-bell/route.ts +0 -35
  574. package/.forge/worktrees/pipeline-3156a8b3/app/api/terminal-cwd/route.ts +0 -19
  575. package/.forge/worktrees/pipeline-3156a8b3/app/api/terminal-state/route.ts +0 -15
  576. package/.forge/worktrees/pipeline-3156a8b3/app/api/tunnel/route.ts +0 -26
  577. package/.forge/worktrees/pipeline-3156a8b3/app/api/upgrade/route.ts +0 -43
  578. package/.forge/worktrees/pipeline-3156a8b3/app/api/usage/route.ts +0 -20
  579. package/.forge/worktrees/pipeline-3156a8b3/app/api/version/route.ts +0 -78
  580. package/.forge/worktrees/pipeline-3156a8b3/app/api/watchers/route.ts +0 -33
  581. package/.forge/worktrees/pipeline-3156a8b3/app/api/workspace/[id]/agents/route.ts +0 -35
  582. package/.forge/worktrees/pipeline-3156a8b3/app/api/workspace/[id]/memory/route.ts +0 -23
  583. package/.forge/worktrees/pipeline-3156a8b3/app/api/workspace/[id]/smith/route.ts +0 -22
  584. package/.forge/worktrees/pipeline-3156a8b3/app/api/workspace/[id]/stream/route.ts +0 -28
  585. package/.forge/worktrees/pipeline-3156a8b3/app/api/workspace/route.ts +0 -100
  586. package/.forge/worktrees/pipeline-3156a8b3/app/global-error.tsx +0 -21
  587. package/.forge/worktrees/pipeline-3156a8b3/app/globals.css +0 -52
  588. package/.forge/worktrees/pipeline-3156a8b3/app/icon.ico +0 -0
  589. package/.forge/worktrees/pipeline-3156a8b3/app/icon.png +0 -0
  590. package/.forge/worktrees/pipeline-3156a8b3/app/icon.svg +0 -106
  591. package/.forge/worktrees/pipeline-3156a8b3/app/layout.tsx +0 -17
  592. package/.forge/worktrees/pipeline-3156a8b3/app/login/LoginForm.tsx +0 -96
  593. package/.forge/worktrees/pipeline-3156a8b3/app/login/page.tsx +0 -10
  594. package/.forge/worktrees/pipeline-3156a8b3/app/mobile/page.tsx +0 -9
  595. package/.forge/worktrees/pipeline-3156a8b3/app/page.tsx +0 -21
  596. package/.forge/worktrees/pipeline-3156a8b3/bin/forge-server.mjs +0 -484
  597. package/.forge/worktrees/pipeline-3156a8b3/check-forge-status.sh +0 -71
  598. package/.forge/worktrees/pipeline-3156a8b3/cli/mw.ts +0 -579
  599. package/.forge/worktrees/pipeline-3156a8b3/components/BrowserPanel.tsx +0 -175
  600. package/.forge/worktrees/pipeline-3156a8b3/components/ChatPanel.tsx +0 -191
  601. package/.forge/worktrees/pipeline-3156a8b3/components/ClaudeTerminal.tsx +0 -267
  602. package/.forge/worktrees/pipeline-3156a8b3/components/CodeViewer.tsx +0 -787
  603. package/.forge/worktrees/pipeline-3156a8b3/components/ConversationEditor.tsx +0 -411
  604. package/.forge/worktrees/pipeline-3156a8b3/components/ConversationGraphView.tsx +0 -347
  605. package/.forge/worktrees/pipeline-3156a8b3/components/ConversationTerminalView.tsx +0 -303
  606. package/.forge/worktrees/pipeline-3156a8b3/components/Dashboard.tsx +0 -807
  607. package/.forge/worktrees/pipeline-3156a8b3/components/DashboardWrapper.tsx +0 -9
  608. package/.forge/worktrees/pipeline-3156a8b3/components/DeliveryFlowEditor.tsx +0 -491
  609. package/.forge/worktrees/pipeline-3156a8b3/components/DeliveryList.tsx +0 -230
  610. package/.forge/worktrees/pipeline-3156a8b3/components/DeliveryWorkspace.tsx +0 -589
  611. package/.forge/worktrees/pipeline-3156a8b3/components/DocTerminal.tsx +0 -187
  612. package/.forge/worktrees/pipeline-3156a8b3/components/DocsViewer.tsx +0 -574
  613. package/.forge/worktrees/pipeline-3156a8b3/components/HelpDialog.tsx +0 -169
  614. package/.forge/worktrees/pipeline-3156a8b3/components/HelpTerminal.tsx +0 -141
  615. package/.forge/worktrees/pipeline-3156a8b3/components/InlinePipelineView.tsx +0 -111
  616. package/.forge/worktrees/pipeline-3156a8b3/components/LogViewer.tsx +0 -194
  617. package/.forge/worktrees/pipeline-3156a8b3/components/MarkdownContent.tsx +0 -73
  618. package/.forge/worktrees/pipeline-3156a8b3/components/MobileView.tsx +0 -385
  619. package/.forge/worktrees/pipeline-3156a8b3/components/MonitorPanel.tsx +0 -122
  620. package/.forge/worktrees/pipeline-3156a8b3/components/NewSessionModal.tsx +0 -93
  621. package/.forge/worktrees/pipeline-3156a8b3/components/NewTaskModal.tsx +0 -492
  622. package/.forge/worktrees/pipeline-3156a8b3/components/PipelineEditor.tsx +0 -570
  623. package/.forge/worktrees/pipeline-3156a8b3/components/PipelineView.tsx +0 -1018
  624. package/.forge/worktrees/pipeline-3156a8b3/components/PluginsPanel.tsx +0 -472
  625. package/.forge/worktrees/pipeline-3156a8b3/components/ProjectDetail.tsx +0 -1618
  626. package/.forge/worktrees/pipeline-3156a8b3/components/ProjectList.tsx +0 -108
  627. package/.forge/worktrees/pipeline-3156a8b3/components/ProjectManager.tsx +0 -401
  628. package/.forge/worktrees/pipeline-3156a8b3/components/SessionList.tsx +0 -74
  629. package/.forge/worktrees/pipeline-3156a8b3/components/SessionView.tsx +0 -726
  630. package/.forge/worktrees/pipeline-3156a8b3/components/SettingsModal.tsx +0 -1647
  631. package/.forge/worktrees/pipeline-3156a8b3/components/SkillsPanel.tsx +0 -969
  632. package/.forge/worktrees/pipeline-3156a8b3/components/StatusBar.tsx +0 -99
  633. package/.forge/worktrees/pipeline-3156a8b3/components/TabBar.tsx +0 -46
  634. package/.forge/worktrees/pipeline-3156a8b3/components/TaskBoard.tsx +0 -113
  635. package/.forge/worktrees/pipeline-3156a8b3/components/TaskDetail.tsx +0 -372
  636. package/.forge/worktrees/pipeline-3156a8b3/components/TerminalLauncher.tsx +0 -398
  637. package/.forge/worktrees/pipeline-3156a8b3/components/TunnelToggle.tsx +0 -206
  638. package/.forge/worktrees/pipeline-3156a8b3/components/UsagePanel.tsx +0 -207
  639. package/.forge/worktrees/pipeline-3156a8b3/components/WebTerminal.tsx +0 -1683
  640. package/.forge/worktrees/pipeline-3156a8b3/components/WorkspaceTree.tsx +0 -221
  641. package/.forge/worktrees/pipeline-3156a8b3/components/WorkspaceView.tsx +0 -4048
  642. package/.forge/worktrees/pipeline-3156a8b3/dev-test.sh +0 -5
  643. package/.forge/worktrees/pipeline-3156a8b3/docs/Forge_Memory_Layer_Design.docx +0 -0
  644. package/.forge/worktrees/pipeline-3156a8b3/docs/Forge_Strategy_Research_2026.docx +0 -0
  645. package/.forge/worktrees/pipeline-3156a8b3/docs/LOCAL-DEPLOY.md +0 -144
  646. package/.forge/worktrees/pipeline-3156a8b3/docs/roadmap-multi-agent-workflow.md +0 -330
  647. package/.forge/worktrees/pipeline-3156a8b3/forge-logo.png +0 -0
  648. package/.forge/worktrees/pipeline-3156a8b3/forge-logo.svg +0 -106
  649. package/.forge/worktrees/pipeline-3156a8b3/hooks/useSidebarResize.ts +0 -52
  650. package/.forge/worktrees/pipeline-3156a8b3/install.sh +0 -29
  651. package/.forge/worktrees/pipeline-3156a8b3/instrumentation.ts +0 -35
  652. package/.forge/worktrees/pipeline-3156a8b3/lib/agents/claude-adapter.ts +0 -104
  653. package/.forge/worktrees/pipeline-3156a8b3/lib/agents/generic-adapter.ts +0 -64
  654. package/.forge/worktrees/pipeline-3156a8b3/lib/agents/index.ts +0 -245
  655. package/.forge/worktrees/pipeline-3156a8b3/lib/agents/types.ts +0 -70
  656. package/.forge/worktrees/pipeline-3156a8b3/lib/artifacts.ts +0 -106
  657. package/.forge/worktrees/pipeline-3156a8b3/lib/auth.ts +0 -62
  658. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/docker.yaml +0 -70
  659. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/http.yaml +0 -66
  660. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/jenkins.yaml +0 -92
  661. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/llm-vision.yaml +0 -85
  662. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/playwright.yaml +0 -111
  663. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/shell-command.yaml +0 -60
  664. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/slack.yaml +0 -48
  665. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/webhook.yaml +0 -56
  666. package/.forge/worktrees/pipeline-3156a8b3/lib/claude-process.ts +0 -351
  667. package/.forge/worktrees/pipeline-3156a8b3/lib/claude-sessions.ts +0 -266
  668. package/.forge/worktrees/pipeline-3156a8b3/lib/claude-templates.ts +0 -227
  669. package/.forge/worktrees/pipeline-3156a8b3/lib/cloudflared.ts +0 -424
  670. package/.forge/worktrees/pipeline-3156a8b3/lib/crypto.ts +0 -67
  671. package/.forge/worktrees/pipeline-3156a8b3/lib/delivery.ts +0 -787
  672. package/.forge/worktrees/pipeline-3156a8b3/lib/dirs.ts +0 -99
  673. package/.forge/worktrees/pipeline-3156a8b3/lib/flows.ts +0 -86
  674. package/.forge/worktrees/pipeline-3156a8b3/lib/forge-mcp-server.ts +0 -717
  675. package/.forge/worktrees/pipeline-3156a8b3/lib/forge-skills/forge-inbox.md +0 -38
  676. package/.forge/worktrees/pipeline-3156a8b3/lib/forge-skills/forge-send.md +0 -47
  677. package/.forge/worktrees/pipeline-3156a8b3/lib/forge-skills/forge-status.md +0 -32
  678. package/.forge/worktrees/pipeline-3156a8b3/lib/forge-skills/forge-workspace-sync.md +0 -37
  679. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/00-overview.md +0 -40
  680. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/01-settings.md +0 -194
  681. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/02-telegram.md +0 -41
  682. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/03-tunnel.md +0 -31
  683. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/04-tasks.md +0 -52
  684. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/05-pipelines.md +0 -460
  685. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/06-skills.md +0 -43
  686. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/07-projects.md +0 -73
  687. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/08-rules.md +0 -53
  688. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/09-issue-autofix.md +0 -55
  689. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/10-troubleshooting.md +0 -89
  690. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/11-workspace.md +0 -810
  691. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/CLAUDE.md +0 -62
  692. package/.forge/worktrees/pipeline-3156a8b3/lib/init.ts +0 -266
  693. package/.forge/worktrees/pipeline-3156a8b3/lib/issue-scanner.ts +0 -298
  694. package/.forge/worktrees/pipeline-3156a8b3/lib/logger.ts +0 -79
  695. package/.forge/worktrees/pipeline-3156a8b3/lib/notifications.ts +0 -75
  696. package/.forge/worktrees/pipeline-3156a8b3/lib/notify.ts +0 -108
  697. package/.forge/worktrees/pipeline-3156a8b3/lib/password.ts +0 -97
  698. package/.forge/worktrees/pipeline-3156a8b3/lib/pipeline-scheduler.ts +0 -373
  699. package/.forge/worktrees/pipeline-3156a8b3/lib/pipeline.ts +0 -1441
  700. package/.forge/worktrees/pipeline-3156a8b3/lib/plugins/executor.ts +0 -347
  701. package/.forge/worktrees/pipeline-3156a8b3/lib/plugins/registry.ts +0 -228
  702. package/.forge/worktrees/pipeline-3156a8b3/lib/plugins/types.ts +0 -103
  703. package/.forge/worktrees/pipeline-3156a8b3/lib/project-sessions.ts +0 -53
  704. package/.forge/worktrees/pipeline-3156a8b3/lib/projects.ts +0 -86
  705. package/.forge/worktrees/pipeline-3156a8b3/lib/session-manager.ts +0 -156
  706. package/.forge/worktrees/pipeline-3156a8b3/lib/session-utils.ts +0 -53
  707. package/.forge/worktrees/pipeline-3156a8b3/lib/session-watcher.ts +0 -345
  708. package/.forge/worktrees/pipeline-3156a8b3/lib/settings.ts +0 -195
  709. package/.forge/worktrees/pipeline-3156a8b3/lib/skills.ts +0 -458
  710. package/.forge/worktrees/pipeline-3156a8b3/lib/task-manager.ts +0 -949
  711. package/.forge/worktrees/pipeline-3156a8b3/lib/telegram-bot.ts +0 -1477
  712. package/.forge/worktrees/pipeline-3156a8b3/lib/telegram-standalone.ts +0 -83
  713. package/.forge/worktrees/pipeline-3156a8b3/lib/terminal-server.ts +0 -70
  714. package/.forge/worktrees/pipeline-3156a8b3/lib/terminal-standalone.ts +0 -421
  715. package/.forge/worktrees/pipeline-3156a8b3/lib/usage-scanner.ts +0 -249
  716. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/__tests__/state-machine.test.ts +0 -388
  717. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/__tests__/workspace.test.ts +0 -311
  718. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/agent-bus.ts +0 -416
  719. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/agent-worker.ts +0 -655
  720. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/backends/api-backend.ts +0 -262
  721. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/backends/cli-backend.ts +0 -491
  722. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/index.ts +0 -82
  723. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/manager.ts +0 -136
  724. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/orchestrator.ts +0 -3400
  725. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/persistence.ts +0 -309
  726. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/presets.ts +0 -649
  727. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/requests.ts +0 -287
  728. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/session-monitor.ts +0 -240
  729. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/skill-installer.ts +0 -275
  730. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/smith-memory.ts +0 -498
  731. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/types.ts +0 -241
  732. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/watch-manager.ts +0 -560
  733. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace-standalone.ts +0 -911
  734. package/.forge/worktrees/pipeline-3156a8b3/middleware.ts +0 -51
  735. package/.forge/worktrees/pipeline-3156a8b3/next.config.ts +0 -26
  736. package/.forge/worktrees/pipeline-3156a8b3/package.json +0 -74
  737. package/.forge/worktrees/pipeline-3156a8b3/pnpm-lock.yaml +0 -3719
  738. package/.forge/worktrees/pipeline-3156a8b3/pnpm-workspace.yaml +0 -1
  739. package/.forge/worktrees/pipeline-3156a8b3/postcss.config.mjs +0 -7
  740. package/.forge/worktrees/pipeline-3156a8b3/publish.sh +0 -133
  741. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/README.md +0 -66
  742. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/results/.gitignore +0 -2
  743. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/run.ts +0 -635
  744. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/01-text-utils/task.md +0 -26
  745. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  746. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  747. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/02-pagination/task.md +0 -48
  748. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  749. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  750. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  751. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  752. package/.forge/worktrees/pipeline-3156a8b3/scripts/verify-usage.ts +0 -178
  753. package/.forge/worktrees/pipeline-3156a8b3/src/config/index.ts +0 -129
  754. package/.forge/worktrees/pipeline-3156a8b3/src/core/db/database.ts +0 -259
  755. package/.forge/worktrees/pipeline-3156a8b3/src/core/memory/strategy.ts +0 -32
  756. package/.forge/worktrees/pipeline-3156a8b3/src/core/providers/chat.ts +0 -65
  757. package/.forge/worktrees/pipeline-3156a8b3/src/core/providers/registry.ts +0 -60
  758. package/.forge/worktrees/pipeline-3156a8b3/src/core/session/manager.ts +0 -190
  759. package/.forge/worktrees/pipeline-3156a8b3/src/types/index.ts +0 -129
  760. package/.forge/worktrees/pipeline-3156a8b3/start.sh +0 -31
  761. package/.forge/worktrees/pipeline-3156a8b3/templates/smith-lead.json +0 -45
  762. package/.forge/worktrees/pipeline-3156a8b3/tsconfig.json +0 -42
  763. package/.forge/worktrees/pipeline-316c6574/CLAUDE.md +0 -86
  764. package/.forge/worktrees/pipeline-316c6574/README.md +0 -136
  765. package/.forge/worktrees/pipeline-316c6574/RELEASE_NOTES.md +0 -11
  766. package/.forge/worktrees/pipeline-316c6574/app/api/agents/route.ts +0 -17
  767. package/.forge/worktrees/pipeline-316c6574/app/api/auth/[...nextauth]/route.ts +0 -3
  768. package/.forge/worktrees/pipeline-316c6574/app/api/auth/verify/route.ts +0 -46
  769. package/.forge/worktrees/pipeline-316c6574/app/api/claude/[id]/route.ts +0 -31
  770. package/.forge/worktrees/pipeline-316c6574/app/api/claude/[id]/stream/route.ts +0 -63
  771. package/.forge/worktrees/pipeline-316c6574/app/api/claude/route.ts +0 -28
  772. package/.forge/worktrees/pipeline-316c6574/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  773. package/.forge/worktrees/pipeline-316c6574/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  774. package/.forge/worktrees/pipeline-316c6574/app/api/claude-sessions/[projectName]/route.ts +0 -37
  775. package/.forge/worktrees/pipeline-316c6574/app/api/claude-sessions/sync/route.ts +0 -17
  776. package/.forge/worktrees/pipeline-316c6574/app/api/claude-templates/route.ts +0 -145
  777. package/.forge/worktrees/pipeline-316c6574/app/api/code/route.ts +0 -299
  778. package/.forge/worktrees/pipeline-316c6574/app/api/delivery/[id]/route.ts +0 -62
  779. package/.forge/worktrees/pipeline-316c6574/app/api/delivery/route.ts +0 -40
  780. package/.forge/worktrees/pipeline-316c6574/app/api/detect-cli/route.ts +0 -46
  781. package/.forge/worktrees/pipeline-316c6574/app/api/docs/route.ts +0 -176
  782. package/.forge/worktrees/pipeline-316c6574/app/api/docs/sessions/route.ts +0 -54
  783. package/.forge/worktrees/pipeline-316c6574/app/api/favorites/route.ts +0 -26
  784. package/.forge/worktrees/pipeline-316c6574/app/api/flows/route.ts +0 -6
  785. package/.forge/worktrees/pipeline-316c6574/app/api/flows/run/route.ts +0 -19
  786. package/.forge/worktrees/pipeline-316c6574/app/api/git/route.ts +0 -149
  787. package/.forge/worktrees/pipeline-316c6574/app/api/help/route.ts +0 -84
  788. package/.forge/worktrees/pipeline-316c6574/app/api/issue-scanner/route.ts +0 -116
  789. package/.forge/worktrees/pipeline-316c6574/app/api/logs/route.ts +0 -100
  790. package/.forge/worktrees/pipeline-316c6574/app/api/mobile-chat/route.ts +0 -115
  791. package/.forge/worktrees/pipeline-316c6574/app/api/monitor/route.ts +0 -74
  792. package/.forge/worktrees/pipeline-316c6574/app/api/notifications/route.ts +0 -42
  793. package/.forge/worktrees/pipeline-316c6574/app/api/notify/test/route.ts +0 -33
  794. package/.forge/worktrees/pipeline-316c6574/app/api/online/route.ts +0 -40
  795. package/.forge/worktrees/pipeline-316c6574/app/api/pipelines/[id]/route.ts +0 -41
  796. package/.forge/worktrees/pipeline-316c6574/app/api/pipelines/route.ts +0 -90
  797. package/.forge/worktrees/pipeline-316c6574/app/api/plugins/route.ts +0 -75
  798. package/.forge/worktrees/pipeline-316c6574/app/api/preview/[...path]/route.ts +0 -64
  799. package/.forge/worktrees/pipeline-316c6574/app/api/preview/route.ts +0 -156
  800. package/.forge/worktrees/pipeline-316c6574/app/api/project-pipelines/route.ts +0 -91
  801. package/.forge/worktrees/pipeline-316c6574/app/api/project-sessions/route.ts +0 -61
  802. package/.forge/worktrees/pipeline-316c6574/app/api/projects/route.ts +0 -26
  803. package/.forge/worktrees/pipeline-316c6574/app/api/sessions/[id]/chat/route.ts +0 -64
  804. package/.forge/worktrees/pipeline-316c6574/app/api/sessions/[id]/messages/route.ts +0 -9
  805. package/.forge/worktrees/pipeline-316c6574/app/api/sessions/[id]/route.ts +0 -17
  806. package/.forge/worktrees/pipeline-316c6574/app/api/sessions/route.ts +0 -20
  807. package/.forge/worktrees/pipeline-316c6574/app/api/settings/route.ts +0 -64
  808. package/.forge/worktrees/pipeline-316c6574/app/api/skills/local/route.ts +0 -228
  809. package/.forge/worktrees/pipeline-316c6574/app/api/skills/route.ts +0 -182
  810. package/.forge/worktrees/pipeline-316c6574/app/api/smith-templates/route.ts +0 -81
  811. package/.forge/worktrees/pipeline-316c6574/app/api/status/route.ts +0 -12
  812. package/.forge/worktrees/pipeline-316c6574/app/api/tabs/route.ts +0 -25
  813. package/.forge/worktrees/pipeline-316c6574/app/api/tasks/[id]/route.ts +0 -51
  814. package/.forge/worktrees/pipeline-316c6574/app/api/tasks/[id]/stream/route.ts +0 -77
  815. package/.forge/worktrees/pipeline-316c6574/app/api/tasks/link/route.ts +0 -37
  816. package/.forge/worktrees/pipeline-316c6574/app/api/tasks/route.ts +0 -44
  817. package/.forge/worktrees/pipeline-316c6574/app/api/tasks/session/route.ts +0 -14
  818. package/.forge/worktrees/pipeline-316c6574/app/api/telegram/route.ts +0 -23
  819. package/.forge/worktrees/pipeline-316c6574/app/api/templates/route.ts +0 -6
  820. package/.forge/worktrees/pipeline-316c6574/app/api/terminal-bell/route.ts +0 -35
  821. package/.forge/worktrees/pipeline-316c6574/app/api/terminal-cwd/route.ts +0 -19
  822. package/.forge/worktrees/pipeline-316c6574/app/api/terminal-state/route.ts +0 -15
  823. package/.forge/worktrees/pipeline-316c6574/app/api/tunnel/route.ts +0 -26
  824. package/.forge/worktrees/pipeline-316c6574/app/api/upgrade/route.ts +0 -43
  825. package/.forge/worktrees/pipeline-316c6574/app/api/usage/route.ts +0 -20
  826. package/.forge/worktrees/pipeline-316c6574/app/api/version/route.ts +0 -78
  827. package/.forge/worktrees/pipeline-316c6574/app/api/watchers/route.ts +0 -33
  828. package/.forge/worktrees/pipeline-316c6574/app/api/workspace/[id]/agents/route.ts +0 -35
  829. package/.forge/worktrees/pipeline-316c6574/app/api/workspace/[id]/memory/route.ts +0 -23
  830. package/.forge/worktrees/pipeline-316c6574/app/api/workspace/[id]/smith/route.ts +0 -22
  831. package/.forge/worktrees/pipeline-316c6574/app/api/workspace/[id]/stream/route.ts +0 -28
  832. package/.forge/worktrees/pipeline-316c6574/app/api/workspace/route.ts +0 -100
  833. package/.forge/worktrees/pipeline-316c6574/app/global-error.tsx +0 -21
  834. package/.forge/worktrees/pipeline-316c6574/app/globals.css +0 -52
  835. package/.forge/worktrees/pipeline-316c6574/app/icon.ico +0 -0
  836. package/.forge/worktrees/pipeline-316c6574/app/icon.png +0 -0
  837. package/.forge/worktrees/pipeline-316c6574/app/icon.svg +0 -106
  838. package/.forge/worktrees/pipeline-316c6574/app/layout.tsx +0 -17
  839. package/.forge/worktrees/pipeline-316c6574/app/login/LoginForm.tsx +0 -96
  840. package/.forge/worktrees/pipeline-316c6574/app/login/page.tsx +0 -10
  841. package/.forge/worktrees/pipeline-316c6574/app/mobile/page.tsx +0 -9
  842. package/.forge/worktrees/pipeline-316c6574/app/page.tsx +0 -21
  843. package/.forge/worktrees/pipeline-316c6574/bin/forge-server.mjs +0 -484
  844. package/.forge/worktrees/pipeline-316c6574/check-forge-status.sh +0 -71
  845. package/.forge/worktrees/pipeline-316c6574/cli/mw.ts +0 -579
  846. package/.forge/worktrees/pipeline-316c6574/components/BrowserPanel.tsx +0 -175
  847. package/.forge/worktrees/pipeline-316c6574/components/ChatPanel.tsx +0 -191
  848. package/.forge/worktrees/pipeline-316c6574/components/ClaudeTerminal.tsx +0 -267
  849. package/.forge/worktrees/pipeline-316c6574/components/CodeViewer.tsx +0 -787
  850. package/.forge/worktrees/pipeline-316c6574/components/ConversationEditor.tsx +0 -411
  851. package/.forge/worktrees/pipeline-316c6574/components/ConversationGraphView.tsx +0 -347
  852. package/.forge/worktrees/pipeline-316c6574/components/ConversationTerminalView.tsx +0 -303
  853. package/.forge/worktrees/pipeline-316c6574/components/Dashboard.tsx +0 -807
  854. package/.forge/worktrees/pipeline-316c6574/components/DashboardWrapper.tsx +0 -9
  855. package/.forge/worktrees/pipeline-316c6574/components/DeliveryFlowEditor.tsx +0 -491
  856. package/.forge/worktrees/pipeline-316c6574/components/DeliveryList.tsx +0 -230
  857. package/.forge/worktrees/pipeline-316c6574/components/DeliveryWorkspace.tsx +0 -589
  858. package/.forge/worktrees/pipeline-316c6574/components/DocTerminal.tsx +0 -187
  859. package/.forge/worktrees/pipeline-316c6574/components/DocsViewer.tsx +0 -574
  860. package/.forge/worktrees/pipeline-316c6574/components/HelpDialog.tsx +0 -169
  861. package/.forge/worktrees/pipeline-316c6574/components/HelpTerminal.tsx +0 -141
  862. package/.forge/worktrees/pipeline-316c6574/components/InlinePipelineView.tsx +0 -111
  863. package/.forge/worktrees/pipeline-316c6574/components/LogViewer.tsx +0 -194
  864. package/.forge/worktrees/pipeline-316c6574/components/MarkdownContent.tsx +0 -73
  865. package/.forge/worktrees/pipeline-316c6574/components/MobileView.tsx +0 -385
  866. package/.forge/worktrees/pipeline-316c6574/components/MonitorPanel.tsx +0 -122
  867. package/.forge/worktrees/pipeline-316c6574/components/NewSessionModal.tsx +0 -93
  868. package/.forge/worktrees/pipeline-316c6574/components/NewTaskModal.tsx +0 -492
  869. package/.forge/worktrees/pipeline-316c6574/components/PipelineEditor.tsx +0 -570
  870. package/.forge/worktrees/pipeline-316c6574/components/PipelineView.tsx +0 -1018
  871. package/.forge/worktrees/pipeline-316c6574/components/PluginsPanel.tsx +0 -472
  872. package/.forge/worktrees/pipeline-316c6574/components/ProjectDetail.tsx +0 -1618
  873. package/.forge/worktrees/pipeline-316c6574/components/ProjectList.tsx +0 -108
  874. package/.forge/worktrees/pipeline-316c6574/components/ProjectManager.tsx +0 -401
  875. package/.forge/worktrees/pipeline-316c6574/components/SessionList.tsx +0 -74
  876. package/.forge/worktrees/pipeline-316c6574/components/SessionView.tsx +0 -726
  877. package/.forge/worktrees/pipeline-316c6574/components/SettingsModal.tsx +0 -1647
  878. package/.forge/worktrees/pipeline-316c6574/components/SkillsPanel.tsx +0 -969
  879. package/.forge/worktrees/pipeline-316c6574/components/StatusBar.tsx +0 -99
  880. package/.forge/worktrees/pipeline-316c6574/components/TabBar.tsx +0 -46
  881. package/.forge/worktrees/pipeline-316c6574/components/TaskBoard.tsx +0 -113
  882. package/.forge/worktrees/pipeline-316c6574/components/TaskDetail.tsx +0 -372
  883. package/.forge/worktrees/pipeline-316c6574/components/TerminalLauncher.tsx +0 -398
  884. package/.forge/worktrees/pipeline-316c6574/components/TunnelToggle.tsx +0 -206
  885. package/.forge/worktrees/pipeline-316c6574/components/UsagePanel.tsx +0 -207
  886. package/.forge/worktrees/pipeline-316c6574/components/WebTerminal.tsx +0 -1683
  887. package/.forge/worktrees/pipeline-316c6574/components/WorkspaceTree.tsx +0 -221
  888. package/.forge/worktrees/pipeline-316c6574/components/WorkspaceView.tsx +0 -4048
  889. package/.forge/worktrees/pipeline-316c6574/dev-test.sh +0 -5
  890. package/.forge/worktrees/pipeline-316c6574/docs/Forge_Memory_Layer_Design.docx +0 -0
  891. package/.forge/worktrees/pipeline-316c6574/docs/Forge_Strategy_Research_2026.docx +0 -0
  892. package/.forge/worktrees/pipeline-316c6574/docs/LOCAL-DEPLOY.md +0 -144
  893. package/.forge/worktrees/pipeline-316c6574/docs/roadmap-multi-agent-workflow.md +0 -330
  894. package/.forge/worktrees/pipeline-316c6574/forge-logo.png +0 -0
  895. package/.forge/worktrees/pipeline-316c6574/forge-logo.svg +0 -106
  896. package/.forge/worktrees/pipeline-316c6574/hooks/useSidebarResize.ts +0 -52
  897. package/.forge/worktrees/pipeline-316c6574/install.sh +0 -29
  898. package/.forge/worktrees/pipeline-316c6574/instrumentation.ts +0 -35
  899. package/.forge/worktrees/pipeline-316c6574/lib/agents/claude-adapter.ts +0 -104
  900. package/.forge/worktrees/pipeline-316c6574/lib/agents/generic-adapter.ts +0 -64
  901. package/.forge/worktrees/pipeline-316c6574/lib/agents/index.ts +0 -245
  902. package/.forge/worktrees/pipeline-316c6574/lib/agents/types.ts +0 -70
  903. package/.forge/worktrees/pipeline-316c6574/lib/artifacts.ts +0 -106
  904. package/.forge/worktrees/pipeline-316c6574/lib/auth.ts +0 -62
  905. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/docker.yaml +0 -70
  906. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/http.yaml +0 -66
  907. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/jenkins.yaml +0 -92
  908. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/llm-vision.yaml +0 -85
  909. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/playwright.yaml +0 -111
  910. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/shell-command.yaml +0 -60
  911. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/slack.yaml +0 -48
  912. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/webhook.yaml +0 -56
  913. package/.forge/worktrees/pipeline-316c6574/lib/claude-process.ts +0 -361
  914. package/.forge/worktrees/pipeline-316c6574/lib/claude-sessions.ts +0 -266
  915. package/.forge/worktrees/pipeline-316c6574/lib/claude-templates.ts +0 -227
  916. package/.forge/worktrees/pipeline-316c6574/lib/cloudflared.ts +0 -424
  917. package/.forge/worktrees/pipeline-316c6574/lib/crypto.ts +0 -67
  918. package/.forge/worktrees/pipeline-316c6574/lib/delivery.ts +0 -787
  919. package/.forge/worktrees/pipeline-316c6574/lib/dirs.ts +0 -99
  920. package/.forge/worktrees/pipeline-316c6574/lib/flows.ts +0 -86
  921. package/.forge/worktrees/pipeline-316c6574/lib/forge-mcp-server.ts +0 -717
  922. package/.forge/worktrees/pipeline-316c6574/lib/forge-skills/forge-inbox.md +0 -38
  923. package/.forge/worktrees/pipeline-316c6574/lib/forge-skills/forge-send.md +0 -47
  924. package/.forge/worktrees/pipeline-316c6574/lib/forge-skills/forge-status.md +0 -32
  925. package/.forge/worktrees/pipeline-316c6574/lib/forge-skills/forge-workspace-sync.md +0 -37
  926. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/00-overview.md +0 -40
  927. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/01-settings.md +0 -194
  928. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/02-telegram.md +0 -41
  929. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/03-tunnel.md +0 -31
  930. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/04-tasks.md +0 -52
  931. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/05-pipelines.md +0 -460
  932. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/06-skills.md +0 -43
  933. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/07-projects.md +0 -73
  934. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/08-rules.md +0 -53
  935. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/09-issue-autofix.md +0 -55
  936. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/10-troubleshooting.md +0 -89
  937. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/11-workspace.md +0 -810
  938. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/CLAUDE.md +0 -62
  939. package/.forge/worktrees/pipeline-316c6574/lib/init.ts +0 -266
  940. package/.forge/worktrees/pipeline-316c6574/lib/issue-scanner.ts +0 -298
  941. package/.forge/worktrees/pipeline-316c6574/lib/logger.ts +0 -79
  942. package/.forge/worktrees/pipeline-316c6574/lib/notifications.ts +0 -75
  943. package/.forge/worktrees/pipeline-316c6574/lib/notify.ts +0 -108
  944. package/.forge/worktrees/pipeline-316c6574/lib/password.ts +0 -97
  945. package/.forge/worktrees/pipeline-316c6574/lib/pipeline-scheduler.ts +0 -373
  946. package/.forge/worktrees/pipeline-316c6574/lib/pipeline.ts +0 -1441
  947. package/.forge/worktrees/pipeline-316c6574/lib/plugins/executor.ts +0 -347
  948. package/.forge/worktrees/pipeline-316c6574/lib/plugins/registry.ts +0 -228
  949. package/.forge/worktrees/pipeline-316c6574/lib/plugins/types.ts +0 -103
  950. package/.forge/worktrees/pipeline-316c6574/lib/project-sessions.ts +0 -53
  951. package/.forge/worktrees/pipeline-316c6574/lib/projects.ts +0 -86
  952. package/.forge/worktrees/pipeline-316c6574/lib/session-manager.ts +0 -156
  953. package/.forge/worktrees/pipeline-316c6574/lib/session-utils.ts +0 -53
  954. package/.forge/worktrees/pipeline-316c6574/lib/session-watcher.ts +0 -345
  955. package/.forge/worktrees/pipeline-316c6574/lib/settings.ts +0 -195
  956. package/.forge/worktrees/pipeline-316c6574/lib/skills.ts +0 -458
  957. package/.forge/worktrees/pipeline-316c6574/lib/task-manager.ts +0 -949
  958. package/.forge/worktrees/pipeline-316c6574/lib/telegram-bot.ts +0 -1477
  959. package/.forge/worktrees/pipeline-316c6574/lib/telegram-standalone.ts +0 -83
  960. package/.forge/worktrees/pipeline-316c6574/lib/terminal-server.ts +0 -70
  961. package/.forge/worktrees/pipeline-316c6574/lib/terminal-standalone.ts +0 -421
  962. package/.forge/worktrees/pipeline-316c6574/lib/usage-scanner.ts +0 -249
  963. package/.forge/worktrees/pipeline-316c6574/lib/workspace/__tests__/state-machine.test.ts +0 -388
  964. package/.forge/worktrees/pipeline-316c6574/lib/workspace/__tests__/workspace.test.ts +0 -311
  965. package/.forge/worktrees/pipeline-316c6574/lib/workspace/agent-bus.ts +0 -416
  966. package/.forge/worktrees/pipeline-316c6574/lib/workspace/agent-worker.ts +0 -655
  967. package/.forge/worktrees/pipeline-316c6574/lib/workspace/backends/api-backend.ts +0 -262
  968. package/.forge/worktrees/pipeline-316c6574/lib/workspace/backends/cli-backend.ts +0 -491
  969. package/.forge/worktrees/pipeline-316c6574/lib/workspace/index.ts +0 -82
  970. package/.forge/worktrees/pipeline-316c6574/lib/workspace/manager.ts +0 -136
  971. package/.forge/worktrees/pipeline-316c6574/lib/workspace/orchestrator.ts +0 -3400
  972. package/.forge/worktrees/pipeline-316c6574/lib/workspace/persistence.ts +0 -309
  973. package/.forge/worktrees/pipeline-316c6574/lib/workspace/presets.ts +0 -649
  974. package/.forge/worktrees/pipeline-316c6574/lib/workspace/requests.ts +0 -287
  975. package/.forge/worktrees/pipeline-316c6574/lib/workspace/session-monitor.ts +0 -240
  976. package/.forge/worktrees/pipeline-316c6574/lib/workspace/skill-installer.ts +0 -275
  977. package/.forge/worktrees/pipeline-316c6574/lib/workspace/smith-memory.ts +0 -498
  978. package/.forge/worktrees/pipeline-316c6574/lib/workspace/types.ts +0 -241
  979. package/.forge/worktrees/pipeline-316c6574/lib/workspace/watch-manager.ts +0 -560
  980. package/.forge/worktrees/pipeline-316c6574/lib/workspace-standalone.ts +0 -911
  981. package/.forge/worktrees/pipeline-316c6574/middleware.ts +0 -51
  982. package/.forge/worktrees/pipeline-316c6574/next.config.ts +0 -26
  983. package/.forge/worktrees/pipeline-316c6574/package.json +0 -74
  984. package/.forge/worktrees/pipeline-316c6574/pnpm-lock.yaml +0 -3719
  985. package/.forge/worktrees/pipeline-316c6574/pnpm-workspace.yaml +0 -1
  986. package/.forge/worktrees/pipeline-316c6574/postcss.config.mjs +0 -7
  987. package/.forge/worktrees/pipeline-316c6574/publish.sh +0 -133
  988. package/.forge/worktrees/pipeline-316c6574/scripts/bench/README.md +0 -66
  989. package/.forge/worktrees/pipeline-316c6574/scripts/bench/results/.gitignore +0 -2
  990. package/.forge/worktrees/pipeline-316c6574/scripts/bench/run.ts +0 -635
  991. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/01-text-utils/task.md +0 -26
  992. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  993. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  994. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/02-pagination/task.md +0 -48
  995. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  996. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  997. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  998. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  999. package/.forge/worktrees/pipeline-316c6574/scripts/verify-usage.ts +0 -178
  1000. package/.forge/worktrees/pipeline-316c6574/src/config/index.ts +0 -129
  1001. package/.forge/worktrees/pipeline-316c6574/src/core/db/database.ts +0 -259
  1002. package/.forge/worktrees/pipeline-316c6574/src/core/memory/strategy.ts +0 -32
  1003. package/.forge/worktrees/pipeline-316c6574/src/core/providers/chat.ts +0 -65
  1004. package/.forge/worktrees/pipeline-316c6574/src/core/providers/registry.ts +0 -60
  1005. package/.forge/worktrees/pipeline-316c6574/src/core/session/manager.ts +0 -190
  1006. package/.forge/worktrees/pipeline-316c6574/src/types/index.ts +0 -129
  1007. package/.forge/worktrees/pipeline-316c6574/start.sh +0 -31
  1008. package/.forge/worktrees/pipeline-316c6574/templates/smith-lead.json +0 -45
  1009. package/.forge/worktrees/pipeline-316c6574/tsconfig.json +0 -42
  1010. package/.forge/worktrees/pipeline-44a94121/CLAUDE.md +0 -86
  1011. package/.forge/worktrees/pipeline-44a94121/README.md +0 -136
  1012. package/.forge/worktrees/pipeline-44a94121/RELEASE_NOTES.md +0 -11
  1013. package/.forge/worktrees/pipeline-44a94121/app/api/agents/route.ts +0 -17
  1014. package/.forge/worktrees/pipeline-44a94121/app/api/auth/[...nextauth]/route.ts +0 -3
  1015. package/.forge/worktrees/pipeline-44a94121/app/api/auth/verify/route.ts +0 -46
  1016. package/.forge/worktrees/pipeline-44a94121/app/api/claude/[id]/route.ts +0 -31
  1017. package/.forge/worktrees/pipeline-44a94121/app/api/claude/[id]/stream/route.ts +0 -63
  1018. package/.forge/worktrees/pipeline-44a94121/app/api/claude/route.ts +0 -28
  1019. package/.forge/worktrees/pipeline-44a94121/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  1020. package/.forge/worktrees/pipeline-44a94121/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  1021. package/.forge/worktrees/pipeline-44a94121/app/api/claude-sessions/[projectName]/route.ts +0 -37
  1022. package/.forge/worktrees/pipeline-44a94121/app/api/claude-sessions/sync/route.ts +0 -17
  1023. package/.forge/worktrees/pipeline-44a94121/app/api/claude-templates/route.ts +0 -145
  1024. package/.forge/worktrees/pipeline-44a94121/app/api/code/route.ts +0 -299
  1025. package/.forge/worktrees/pipeline-44a94121/app/api/delivery/[id]/route.ts +0 -62
  1026. package/.forge/worktrees/pipeline-44a94121/app/api/delivery/route.ts +0 -40
  1027. package/.forge/worktrees/pipeline-44a94121/app/api/detect-cli/route.ts +0 -46
  1028. package/.forge/worktrees/pipeline-44a94121/app/api/docs/route.ts +0 -176
  1029. package/.forge/worktrees/pipeline-44a94121/app/api/docs/sessions/route.ts +0 -54
  1030. package/.forge/worktrees/pipeline-44a94121/app/api/favorites/route.ts +0 -26
  1031. package/.forge/worktrees/pipeline-44a94121/app/api/flows/route.ts +0 -6
  1032. package/.forge/worktrees/pipeline-44a94121/app/api/flows/run/route.ts +0 -19
  1033. package/.forge/worktrees/pipeline-44a94121/app/api/git/route.ts +0 -149
  1034. package/.forge/worktrees/pipeline-44a94121/app/api/help/route.ts +0 -84
  1035. package/.forge/worktrees/pipeline-44a94121/app/api/issue-scanner/route.ts +0 -116
  1036. package/.forge/worktrees/pipeline-44a94121/app/api/logs/route.ts +0 -100
  1037. package/.forge/worktrees/pipeline-44a94121/app/api/mobile-chat/route.ts +0 -115
  1038. package/.forge/worktrees/pipeline-44a94121/app/api/monitor/route.ts +0 -74
  1039. package/.forge/worktrees/pipeline-44a94121/app/api/notifications/route.ts +0 -42
  1040. package/.forge/worktrees/pipeline-44a94121/app/api/notify/test/route.ts +0 -33
  1041. package/.forge/worktrees/pipeline-44a94121/app/api/online/route.ts +0 -40
  1042. package/.forge/worktrees/pipeline-44a94121/app/api/pipelines/[id]/route.ts +0 -41
  1043. package/.forge/worktrees/pipeline-44a94121/app/api/pipelines/route.ts +0 -90
  1044. package/.forge/worktrees/pipeline-44a94121/app/api/plugins/route.ts +0 -75
  1045. package/.forge/worktrees/pipeline-44a94121/app/api/preview/[...path]/route.ts +0 -64
  1046. package/.forge/worktrees/pipeline-44a94121/app/api/preview/route.ts +0 -156
  1047. package/.forge/worktrees/pipeline-44a94121/app/api/project-pipelines/route.ts +0 -91
  1048. package/.forge/worktrees/pipeline-44a94121/app/api/project-sessions/route.ts +0 -61
  1049. package/.forge/worktrees/pipeline-44a94121/app/api/projects/route.ts +0 -26
  1050. package/.forge/worktrees/pipeline-44a94121/app/api/sessions/[id]/chat/route.ts +0 -64
  1051. package/.forge/worktrees/pipeline-44a94121/app/api/sessions/[id]/messages/route.ts +0 -9
  1052. package/.forge/worktrees/pipeline-44a94121/app/api/sessions/[id]/route.ts +0 -17
  1053. package/.forge/worktrees/pipeline-44a94121/app/api/sessions/route.ts +0 -20
  1054. package/.forge/worktrees/pipeline-44a94121/app/api/settings/route.ts +0 -64
  1055. package/.forge/worktrees/pipeline-44a94121/app/api/skills/local/route.ts +0 -228
  1056. package/.forge/worktrees/pipeline-44a94121/app/api/skills/route.ts +0 -182
  1057. package/.forge/worktrees/pipeline-44a94121/app/api/smith-templates/route.ts +0 -81
  1058. package/.forge/worktrees/pipeline-44a94121/app/api/status/route.ts +0 -12
  1059. package/.forge/worktrees/pipeline-44a94121/app/api/tabs/route.ts +0 -25
  1060. package/.forge/worktrees/pipeline-44a94121/app/api/tasks/[id]/route.ts +0 -51
  1061. package/.forge/worktrees/pipeline-44a94121/app/api/tasks/[id]/stream/route.ts +0 -77
  1062. package/.forge/worktrees/pipeline-44a94121/app/api/tasks/link/route.ts +0 -37
  1063. package/.forge/worktrees/pipeline-44a94121/app/api/tasks/route.ts +0 -44
  1064. package/.forge/worktrees/pipeline-44a94121/app/api/tasks/session/route.ts +0 -14
  1065. package/.forge/worktrees/pipeline-44a94121/app/api/telegram/route.ts +0 -23
  1066. package/.forge/worktrees/pipeline-44a94121/app/api/templates/route.ts +0 -6
  1067. package/.forge/worktrees/pipeline-44a94121/app/api/terminal-bell/route.ts +0 -35
  1068. package/.forge/worktrees/pipeline-44a94121/app/api/terminal-cwd/route.ts +0 -19
  1069. package/.forge/worktrees/pipeline-44a94121/app/api/terminal-state/route.ts +0 -15
  1070. package/.forge/worktrees/pipeline-44a94121/app/api/tunnel/route.ts +0 -26
  1071. package/.forge/worktrees/pipeline-44a94121/app/api/upgrade/route.ts +0 -43
  1072. package/.forge/worktrees/pipeline-44a94121/app/api/usage/route.ts +0 -20
  1073. package/.forge/worktrees/pipeline-44a94121/app/api/version/route.ts +0 -78
  1074. package/.forge/worktrees/pipeline-44a94121/app/api/watchers/route.ts +0 -33
  1075. package/.forge/worktrees/pipeline-44a94121/app/api/workspace/[id]/agents/route.ts +0 -35
  1076. package/.forge/worktrees/pipeline-44a94121/app/api/workspace/[id]/memory/route.ts +0 -23
  1077. package/.forge/worktrees/pipeline-44a94121/app/api/workspace/[id]/smith/route.ts +0 -22
  1078. package/.forge/worktrees/pipeline-44a94121/app/api/workspace/[id]/stream/route.ts +0 -28
  1079. package/.forge/worktrees/pipeline-44a94121/app/api/workspace/route.ts +0 -100
  1080. package/.forge/worktrees/pipeline-44a94121/app/global-error.tsx +0 -21
  1081. package/.forge/worktrees/pipeline-44a94121/app/globals.css +0 -52
  1082. package/.forge/worktrees/pipeline-44a94121/app/icon.ico +0 -0
  1083. package/.forge/worktrees/pipeline-44a94121/app/icon.png +0 -0
  1084. package/.forge/worktrees/pipeline-44a94121/app/icon.svg +0 -106
  1085. package/.forge/worktrees/pipeline-44a94121/app/layout.tsx +0 -17
  1086. package/.forge/worktrees/pipeline-44a94121/app/login/LoginForm.tsx +0 -96
  1087. package/.forge/worktrees/pipeline-44a94121/app/login/page.tsx +0 -10
  1088. package/.forge/worktrees/pipeline-44a94121/app/mobile/page.tsx +0 -9
  1089. package/.forge/worktrees/pipeline-44a94121/app/page.tsx +0 -21
  1090. package/.forge/worktrees/pipeline-44a94121/bin/forge-server.mjs +0 -484
  1091. package/.forge/worktrees/pipeline-44a94121/check-forge-status.sh +0 -71
  1092. package/.forge/worktrees/pipeline-44a94121/cli/mw.ts +0 -579
  1093. package/.forge/worktrees/pipeline-44a94121/components/BrowserPanel.tsx +0 -175
  1094. package/.forge/worktrees/pipeline-44a94121/components/ChatPanel.tsx +0 -191
  1095. package/.forge/worktrees/pipeline-44a94121/components/ClaudeTerminal.tsx +0 -267
  1096. package/.forge/worktrees/pipeline-44a94121/components/CodeViewer.tsx +0 -787
  1097. package/.forge/worktrees/pipeline-44a94121/components/ConversationEditor.tsx +0 -411
  1098. package/.forge/worktrees/pipeline-44a94121/components/ConversationGraphView.tsx +0 -347
  1099. package/.forge/worktrees/pipeline-44a94121/components/ConversationTerminalView.tsx +0 -303
  1100. package/.forge/worktrees/pipeline-44a94121/components/Dashboard.tsx +0 -807
  1101. package/.forge/worktrees/pipeline-44a94121/components/DashboardWrapper.tsx +0 -9
  1102. package/.forge/worktrees/pipeline-44a94121/components/DeliveryFlowEditor.tsx +0 -491
  1103. package/.forge/worktrees/pipeline-44a94121/components/DeliveryList.tsx +0 -230
  1104. package/.forge/worktrees/pipeline-44a94121/components/DeliveryWorkspace.tsx +0 -589
  1105. package/.forge/worktrees/pipeline-44a94121/components/DocTerminal.tsx +0 -187
  1106. package/.forge/worktrees/pipeline-44a94121/components/DocsViewer.tsx +0 -574
  1107. package/.forge/worktrees/pipeline-44a94121/components/HelpDialog.tsx +0 -169
  1108. package/.forge/worktrees/pipeline-44a94121/components/HelpTerminal.tsx +0 -141
  1109. package/.forge/worktrees/pipeline-44a94121/components/InlinePipelineView.tsx +0 -111
  1110. package/.forge/worktrees/pipeline-44a94121/components/LogViewer.tsx +0 -194
  1111. package/.forge/worktrees/pipeline-44a94121/components/MarkdownContent.tsx +0 -73
  1112. package/.forge/worktrees/pipeline-44a94121/components/MobileView.tsx +0 -385
  1113. package/.forge/worktrees/pipeline-44a94121/components/MonitorPanel.tsx +0 -122
  1114. package/.forge/worktrees/pipeline-44a94121/components/NewSessionModal.tsx +0 -93
  1115. package/.forge/worktrees/pipeline-44a94121/components/NewTaskModal.tsx +0 -492
  1116. package/.forge/worktrees/pipeline-44a94121/components/PipelineEditor.tsx +0 -570
  1117. package/.forge/worktrees/pipeline-44a94121/components/PipelineView.tsx +0 -1018
  1118. package/.forge/worktrees/pipeline-44a94121/components/PluginsPanel.tsx +0 -472
  1119. package/.forge/worktrees/pipeline-44a94121/components/ProjectDetail.tsx +0 -1618
  1120. package/.forge/worktrees/pipeline-44a94121/components/ProjectList.tsx +0 -108
  1121. package/.forge/worktrees/pipeline-44a94121/components/ProjectManager.tsx +0 -401
  1122. package/.forge/worktrees/pipeline-44a94121/components/SessionList.tsx +0 -74
  1123. package/.forge/worktrees/pipeline-44a94121/components/SessionView.tsx +0 -726
  1124. package/.forge/worktrees/pipeline-44a94121/components/SettingsModal.tsx +0 -1647
  1125. package/.forge/worktrees/pipeline-44a94121/components/SkillsPanel.tsx +0 -969
  1126. package/.forge/worktrees/pipeline-44a94121/components/StatusBar.tsx +0 -99
  1127. package/.forge/worktrees/pipeline-44a94121/components/TabBar.tsx +0 -46
  1128. package/.forge/worktrees/pipeline-44a94121/components/TaskBoard.tsx +0 -113
  1129. package/.forge/worktrees/pipeline-44a94121/components/TaskDetail.tsx +0 -372
  1130. package/.forge/worktrees/pipeline-44a94121/components/TerminalLauncher.tsx +0 -398
  1131. package/.forge/worktrees/pipeline-44a94121/components/TunnelToggle.tsx +0 -206
  1132. package/.forge/worktrees/pipeline-44a94121/components/UsagePanel.tsx +0 -207
  1133. package/.forge/worktrees/pipeline-44a94121/components/WebTerminal.tsx +0 -1683
  1134. package/.forge/worktrees/pipeline-44a94121/components/WorkspaceTree.tsx +0 -221
  1135. package/.forge/worktrees/pipeline-44a94121/components/WorkspaceView.tsx +0 -4048
  1136. package/.forge/worktrees/pipeline-44a94121/dev-test.sh +0 -5
  1137. package/.forge/worktrees/pipeline-44a94121/docs/Forge_Memory_Layer_Design.docx +0 -0
  1138. package/.forge/worktrees/pipeline-44a94121/docs/Forge_Strategy_Research_2026.docx +0 -0
  1139. package/.forge/worktrees/pipeline-44a94121/docs/LOCAL-DEPLOY.md +0 -144
  1140. package/.forge/worktrees/pipeline-44a94121/docs/roadmap-multi-agent-workflow.md +0 -330
  1141. package/.forge/worktrees/pipeline-44a94121/forge-logo.png +0 -0
  1142. package/.forge/worktrees/pipeline-44a94121/forge-logo.svg +0 -106
  1143. package/.forge/worktrees/pipeline-44a94121/hooks/useSidebarResize.ts +0 -52
  1144. package/.forge/worktrees/pipeline-44a94121/install.sh +0 -29
  1145. package/.forge/worktrees/pipeline-44a94121/instrumentation.ts +0 -35
  1146. package/.forge/worktrees/pipeline-44a94121/lib/agents/claude-adapter.ts +0 -104
  1147. package/.forge/worktrees/pipeline-44a94121/lib/agents/generic-adapter.ts +0 -64
  1148. package/.forge/worktrees/pipeline-44a94121/lib/agents/index.ts +0 -245
  1149. package/.forge/worktrees/pipeline-44a94121/lib/agents/types.ts +0 -70
  1150. package/.forge/worktrees/pipeline-44a94121/lib/artifacts.ts +0 -106
  1151. package/.forge/worktrees/pipeline-44a94121/lib/auth.ts +0 -62
  1152. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/docker.yaml +0 -70
  1153. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/http.yaml +0 -66
  1154. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/jenkins.yaml +0 -92
  1155. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/llm-vision.yaml +0 -85
  1156. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/playwright.yaml +0 -111
  1157. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/shell-command.yaml +0 -60
  1158. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/slack.yaml +0 -48
  1159. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/webhook.yaml +0 -56
  1160. package/.forge/worktrees/pipeline-44a94121/lib/claude-process.ts +0 -351
  1161. package/.forge/worktrees/pipeline-44a94121/lib/claude-sessions.ts +0 -266
  1162. package/.forge/worktrees/pipeline-44a94121/lib/claude-templates.ts +0 -227
  1163. package/.forge/worktrees/pipeline-44a94121/lib/cloudflared.ts +0 -424
  1164. package/.forge/worktrees/pipeline-44a94121/lib/crypto.ts +0 -67
  1165. package/.forge/worktrees/pipeline-44a94121/lib/delivery.ts +0 -787
  1166. package/.forge/worktrees/pipeline-44a94121/lib/dirs.ts +0 -99
  1167. package/.forge/worktrees/pipeline-44a94121/lib/flows.ts +0 -86
  1168. package/.forge/worktrees/pipeline-44a94121/lib/forge-mcp-server.ts +0 -717
  1169. package/.forge/worktrees/pipeline-44a94121/lib/forge-skills/forge-inbox.md +0 -38
  1170. package/.forge/worktrees/pipeline-44a94121/lib/forge-skills/forge-send.md +0 -47
  1171. package/.forge/worktrees/pipeline-44a94121/lib/forge-skills/forge-status.md +0 -32
  1172. package/.forge/worktrees/pipeline-44a94121/lib/forge-skills/forge-workspace-sync.md +0 -37
  1173. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/00-overview.md +0 -40
  1174. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/01-settings.md +0 -194
  1175. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/02-telegram.md +0 -41
  1176. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/03-tunnel.md +0 -31
  1177. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/04-tasks.md +0 -52
  1178. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/05-pipelines.md +0 -460
  1179. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/06-skills.md +0 -43
  1180. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/07-projects.md +0 -73
  1181. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/08-rules.md +0 -53
  1182. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/09-issue-autofix.md +0 -55
  1183. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/10-troubleshooting.md +0 -89
  1184. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/11-workspace.md +0 -810
  1185. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/CLAUDE.md +0 -62
  1186. package/.forge/worktrees/pipeline-44a94121/lib/init.ts +0 -266
  1187. package/.forge/worktrees/pipeline-44a94121/lib/issue-scanner.ts +0 -298
  1188. package/.forge/worktrees/pipeline-44a94121/lib/logger.ts +0 -79
  1189. package/.forge/worktrees/pipeline-44a94121/lib/notifications.ts +0 -75
  1190. package/.forge/worktrees/pipeline-44a94121/lib/notify.ts +0 -108
  1191. package/.forge/worktrees/pipeline-44a94121/lib/password.ts +0 -97
  1192. package/.forge/worktrees/pipeline-44a94121/lib/pipeline-scheduler.ts +0 -373
  1193. package/.forge/worktrees/pipeline-44a94121/lib/pipeline.ts +0 -1441
  1194. package/.forge/worktrees/pipeline-44a94121/lib/plugins/executor.ts +0 -347
  1195. package/.forge/worktrees/pipeline-44a94121/lib/plugins/registry.ts +0 -228
  1196. package/.forge/worktrees/pipeline-44a94121/lib/plugins/types.ts +0 -103
  1197. package/.forge/worktrees/pipeline-44a94121/lib/project-sessions.ts +0 -53
  1198. package/.forge/worktrees/pipeline-44a94121/lib/projects.ts +0 -86
  1199. package/.forge/worktrees/pipeline-44a94121/lib/session-manager.ts +0 -156
  1200. package/.forge/worktrees/pipeline-44a94121/lib/session-utils.ts +0 -53
  1201. package/.forge/worktrees/pipeline-44a94121/lib/session-watcher.ts +0 -345
  1202. package/.forge/worktrees/pipeline-44a94121/lib/settings.ts +0 -195
  1203. package/.forge/worktrees/pipeline-44a94121/lib/skills.ts +0 -458
  1204. package/.forge/worktrees/pipeline-44a94121/lib/task-manager.ts +0 -949
  1205. package/.forge/worktrees/pipeline-44a94121/lib/telegram-bot.ts +0 -1477
  1206. package/.forge/worktrees/pipeline-44a94121/lib/telegram-standalone.ts +0 -83
  1207. package/.forge/worktrees/pipeline-44a94121/lib/terminal-server.ts +0 -70
  1208. package/.forge/worktrees/pipeline-44a94121/lib/terminal-standalone.ts +0 -421
  1209. package/.forge/worktrees/pipeline-44a94121/lib/usage-scanner.ts +0 -249
  1210. package/.forge/worktrees/pipeline-44a94121/lib/workspace/__tests__/state-machine.test.ts +0 -388
  1211. package/.forge/worktrees/pipeline-44a94121/lib/workspace/__tests__/workspace.test.ts +0 -311
  1212. package/.forge/worktrees/pipeline-44a94121/lib/workspace/agent-bus.ts +0 -416
  1213. package/.forge/worktrees/pipeline-44a94121/lib/workspace/agent-worker.ts +0 -655
  1214. package/.forge/worktrees/pipeline-44a94121/lib/workspace/backends/api-backend.ts +0 -262
  1215. package/.forge/worktrees/pipeline-44a94121/lib/workspace/backends/cli-backend.ts +0 -491
  1216. package/.forge/worktrees/pipeline-44a94121/lib/workspace/index.ts +0 -82
  1217. package/.forge/worktrees/pipeline-44a94121/lib/workspace/manager.ts +0 -136
  1218. package/.forge/worktrees/pipeline-44a94121/lib/workspace/orchestrator.ts +0 -3400
  1219. package/.forge/worktrees/pipeline-44a94121/lib/workspace/persistence.ts +0 -309
  1220. package/.forge/worktrees/pipeline-44a94121/lib/workspace/presets.ts +0 -649
  1221. package/.forge/worktrees/pipeline-44a94121/lib/workspace/requests.ts +0 -287
  1222. package/.forge/worktrees/pipeline-44a94121/lib/workspace/session-monitor.ts +0 -240
  1223. package/.forge/worktrees/pipeline-44a94121/lib/workspace/skill-installer.ts +0 -275
  1224. package/.forge/worktrees/pipeline-44a94121/lib/workspace/smith-memory.ts +0 -498
  1225. package/.forge/worktrees/pipeline-44a94121/lib/workspace/types.ts +0 -241
  1226. package/.forge/worktrees/pipeline-44a94121/lib/workspace/watch-manager.ts +0 -560
  1227. package/.forge/worktrees/pipeline-44a94121/lib/workspace-standalone.ts +0 -911
  1228. package/.forge/worktrees/pipeline-44a94121/middleware.ts +0 -51
  1229. package/.forge/worktrees/pipeline-44a94121/next.config.ts +0 -26
  1230. package/.forge/worktrees/pipeline-44a94121/package.json +0 -74
  1231. package/.forge/worktrees/pipeline-44a94121/pnpm-lock.yaml +0 -3719
  1232. package/.forge/worktrees/pipeline-44a94121/pnpm-workspace.yaml +0 -1
  1233. package/.forge/worktrees/pipeline-44a94121/postcss.config.mjs +0 -7
  1234. package/.forge/worktrees/pipeline-44a94121/publish.sh +0 -133
  1235. package/.forge/worktrees/pipeline-44a94121/scripts/bench/README.md +0 -66
  1236. package/.forge/worktrees/pipeline-44a94121/scripts/bench/results/.gitignore +0 -2
  1237. package/.forge/worktrees/pipeline-44a94121/scripts/bench/run.ts +0 -635
  1238. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/01-text-utils/task.md +0 -26
  1239. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  1240. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  1241. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/02-pagination/task.md +0 -48
  1242. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  1243. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  1244. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  1245. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  1246. package/.forge/worktrees/pipeline-44a94121/scripts/verify-usage.ts +0 -178
  1247. package/.forge/worktrees/pipeline-44a94121/src/config/index.ts +0 -129
  1248. package/.forge/worktrees/pipeline-44a94121/src/core/db/database.ts +0 -259
  1249. package/.forge/worktrees/pipeline-44a94121/src/core/memory/strategy.ts +0 -32
  1250. package/.forge/worktrees/pipeline-44a94121/src/core/providers/chat.ts +0 -65
  1251. package/.forge/worktrees/pipeline-44a94121/src/core/providers/registry.ts +0 -60
  1252. package/.forge/worktrees/pipeline-44a94121/src/core/session/manager.ts +0 -190
  1253. package/.forge/worktrees/pipeline-44a94121/src/types/index.ts +0 -129
  1254. package/.forge/worktrees/pipeline-44a94121/start.sh +0 -31
  1255. package/.forge/worktrees/pipeline-44a94121/templates/smith-lead.json +0 -45
  1256. package/.forge/worktrees/pipeline-44a94121/tsconfig.json +0 -42
  1257. package/.forge/worktrees/pipeline-4dd8dc2d/CLAUDE.md +0 -86
  1258. package/.forge/worktrees/pipeline-4dd8dc2d/README.md +0 -136
  1259. package/.forge/worktrees/pipeline-4dd8dc2d/RELEASE_NOTES.md +0 -36
  1260. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/agents/route.ts +0 -17
  1261. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/auth/[...nextauth]/route.ts +0 -3
  1262. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/auth/verify/route.ts +0 -46
  1263. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude/[id]/route.ts +0 -31
  1264. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude/[id]/stream/route.ts +0 -63
  1265. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude/route.ts +0 -28
  1266. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  1267. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  1268. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/[projectName]/route.ts +0 -37
  1269. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/sync/route.ts +0 -17
  1270. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-templates/route.ts +0 -145
  1271. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/code/route.ts +0 -299
  1272. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/delivery/[id]/route.ts +0 -62
  1273. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/delivery/route.ts +0 -40
  1274. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/detect-cli/route.ts +0 -46
  1275. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/docs/route.ts +0 -176
  1276. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/docs/sessions/route.ts +0 -54
  1277. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/favorites/route.ts +0 -26
  1278. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/flows/route.ts +0 -6
  1279. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/flows/run/route.ts +0 -19
  1280. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/git/route.ts +0 -149
  1281. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/help/route.ts +0 -84
  1282. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/issue-scanner/route.ts +0 -116
  1283. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/logs/route.ts +0 -100
  1284. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/mobile-chat/route.ts +0 -115
  1285. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/monitor/route.ts +0 -74
  1286. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/notifications/route.ts +0 -42
  1287. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/notify/test/route.ts +0 -33
  1288. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/online/route.ts +0 -40
  1289. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/pipelines/[id]/route.ts +0 -41
  1290. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/pipelines/route.ts +0 -90
  1291. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/plugins/route.ts +0 -75
  1292. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/preview/[...path]/route.ts +0 -64
  1293. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/preview/route.ts +0 -156
  1294. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/project-pipelines/route.ts +0 -91
  1295. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/project-sessions/route.ts +0 -61
  1296. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/projects/route.ts +0 -26
  1297. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/[id]/chat/route.ts +0 -64
  1298. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/[id]/messages/route.ts +0 -9
  1299. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/[id]/route.ts +0 -17
  1300. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/route.ts +0 -20
  1301. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/settings/route.ts +0 -64
  1302. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/skills/local/route.ts +0 -228
  1303. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/skills/route.ts +0 -182
  1304. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/smith-templates/route.ts +0 -81
  1305. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/status/route.ts +0 -12
  1306. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tabs/route.ts +0 -25
  1307. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/[id]/route.ts +0 -51
  1308. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/[id]/stream/route.ts +0 -77
  1309. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/link/route.ts +0 -37
  1310. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/route.ts +0 -44
  1311. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/session/route.ts +0 -14
  1312. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/telegram/route.ts +0 -23
  1313. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/templates/route.ts +0 -6
  1314. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/terminal-bell/route.ts +0 -39
  1315. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/terminal-cwd/route.ts +0 -19
  1316. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/terminal-state/route.ts +0 -15
  1317. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tunnel/route.ts +0 -26
  1318. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/upgrade/route.ts +0 -43
  1319. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/usage/route.ts +0 -20
  1320. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/version/route.ts +0 -78
  1321. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/watchers/route.ts +0 -33
  1322. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/agents/route.ts +0 -35
  1323. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/memory/route.ts +0 -23
  1324. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/smith/route.ts +0 -22
  1325. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/stream/route.ts +0 -31
  1326. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/route.ts +0 -79
  1327. package/.forge/worktrees/pipeline-4dd8dc2d/app/global-error.tsx +0 -21
  1328. package/.forge/worktrees/pipeline-4dd8dc2d/app/globals.css +0 -52
  1329. package/.forge/worktrees/pipeline-4dd8dc2d/app/icon.ico +0 -0
  1330. package/.forge/worktrees/pipeline-4dd8dc2d/app/icon.png +0 -0
  1331. package/.forge/worktrees/pipeline-4dd8dc2d/app/icon.svg +0 -106
  1332. package/.forge/worktrees/pipeline-4dd8dc2d/app/layout.tsx +0 -17
  1333. package/.forge/worktrees/pipeline-4dd8dc2d/app/login/LoginForm.tsx +0 -96
  1334. package/.forge/worktrees/pipeline-4dd8dc2d/app/login/page.tsx +0 -10
  1335. package/.forge/worktrees/pipeline-4dd8dc2d/app/mobile/page.tsx +0 -10
  1336. package/.forge/worktrees/pipeline-4dd8dc2d/app/page.tsx +0 -22
  1337. package/.forge/worktrees/pipeline-4dd8dc2d/bin/forge-server.mjs +0 -484
  1338. package/.forge/worktrees/pipeline-4dd8dc2d/check-forge-status.sh +0 -71
  1339. package/.forge/worktrees/pipeline-4dd8dc2d/cli/mw.ts +0 -579
  1340. package/.forge/worktrees/pipeline-4dd8dc2d/components/BrowserPanel.tsx +0 -175
  1341. package/.forge/worktrees/pipeline-4dd8dc2d/components/ChatPanel.tsx +0 -191
  1342. package/.forge/worktrees/pipeline-4dd8dc2d/components/ClaudeTerminal.tsx +0 -267
  1343. package/.forge/worktrees/pipeline-4dd8dc2d/components/CodeViewer.tsx +0 -787
  1344. package/.forge/worktrees/pipeline-4dd8dc2d/components/ConversationEditor.tsx +0 -411
  1345. package/.forge/worktrees/pipeline-4dd8dc2d/components/ConversationGraphView.tsx +0 -347
  1346. package/.forge/worktrees/pipeline-4dd8dc2d/components/ConversationTerminalView.tsx +0 -303
  1347. package/.forge/worktrees/pipeline-4dd8dc2d/components/Dashboard.tsx +0 -807
  1348. package/.forge/worktrees/pipeline-4dd8dc2d/components/DashboardWrapper.tsx +0 -9
  1349. package/.forge/worktrees/pipeline-4dd8dc2d/components/DeliveryFlowEditor.tsx +0 -491
  1350. package/.forge/worktrees/pipeline-4dd8dc2d/components/DeliveryList.tsx +0 -230
  1351. package/.forge/worktrees/pipeline-4dd8dc2d/components/DeliveryWorkspace.tsx +0 -589
  1352. package/.forge/worktrees/pipeline-4dd8dc2d/components/DocTerminal.tsx +0 -187
  1353. package/.forge/worktrees/pipeline-4dd8dc2d/components/DocsViewer.tsx +0 -574
  1354. package/.forge/worktrees/pipeline-4dd8dc2d/components/HelpDialog.tsx +0 -169
  1355. package/.forge/worktrees/pipeline-4dd8dc2d/components/HelpTerminal.tsx +0 -141
  1356. package/.forge/worktrees/pipeline-4dd8dc2d/components/InlinePipelineView.tsx +0 -111
  1357. package/.forge/worktrees/pipeline-4dd8dc2d/components/LogViewer.tsx +0 -194
  1358. package/.forge/worktrees/pipeline-4dd8dc2d/components/MarkdownContent.tsx +0 -73
  1359. package/.forge/worktrees/pipeline-4dd8dc2d/components/MobileView.tsx +0 -385
  1360. package/.forge/worktrees/pipeline-4dd8dc2d/components/MonitorPanel.tsx +0 -122
  1361. package/.forge/worktrees/pipeline-4dd8dc2d/components/NewSessionModal.tsx +0 -93
  1362. package/.forge/worktrees/pipeline-4dd8dc2d/components/NewTaskModal.tsx +0 -492
  1363. package/.forge/worktrees/pipeline-4dd8dc2d/components/PipelineEditor.tsx +0 -570
  1364. package/.forge/worktrees/pipeline-4dd8dc2d/components/PipelineView.tsx +0 -1018
  1365. package/.forge/worktrees/pipeline-4dd8dc2d/components/PluginsPanel.tsx +0 -472
  1366. package/.forge/worktrees/pipeline-4dd8dc2d/components/ProjectDetail.tsx +0 -1618
  1367. package/.forge/worktrees/pipeline-4dd8dc2d/components/ProjectList.tsx +0 -108
  1368. package/.forge/worktrees/pipeline-4dd8dc2d/components/ProjectManager.tsx +0 -401
  1369. package/.forge/worktrees/pipeline-4dd8dc2d/components/SessionList.tsx +0 -74
  1370. package/.forge/worktrees/pipeline-4dd8dc2d/components/SessionView.tsx +0 -726
  1371. package/.forge/worktrees/pipeline-4dd8dc2d/components/SettingsModal.tsx +0 -1647
  1372. package/.forge/worktrees/pipeline-4dd8dc2d/components/SkillsPanel.tsx +0 -969
  1373. package/.forge/worktrees/pipeline-4dd8dc2d/components/StatusBar.tsx +0 -99
  1374. package/.forge/worktrees/pipeline-4dd8dc2d/components/TabBar.tsx +0 -46
  1375. package/.forge/worktrees/pipeline-4dd8dc2d/components/TaskBoard.tsx +0 -113
  1376. package/.forge/worktrees/pipeline-4dd8dc2d/components/TaskDetail.tsx +0 -372
  1377. package/.forge/worktrees/pipeline-4dd8dc2d/components/TerminalLauncher.tsx +0 -398
  1378. package/.forge/worktrees/pipeline-4dd8dc2d/components/TunnelToggle.tsx +0 -206
  1379. package/.forge/worktrees/pipeline-4dd8dc2d/components/UsagePanel.tsx +0 -207
  1380. package/.forge/worktrees/pipeline-4dd8dc2d/components/WebTerminal.tsx +0 -1743
  1381. package/.forge/worktrees/pipeline-4dd8dc2d/components/WorkspaceTree.tsx +0 -221
  1382. package/.forge/worktrees/pipeline-4dd8dc2d/components/WorkspaceView.tsx +0 -4048
  1383. package/.forge/worktrees/pipeline-4dd8dc2d/dev-test.sh +0 -5
  1384. package/.forge/worktrees/pipeline-4dd8dc2d/docs/Forge_Memory_Layer_Design.docx +0 -0
  1385. package/.forge/worktrees/pipeline-4dd8dc2d/docs/Forge_Strategy_Research_2026.docx +0 -0
  1386. package/.forge/worktrees/pipeline-4dd8dc2d/docs/LOCAL-DEPLOY.md +0 -144
  1387. package/.forge/worktrees/pipeline-4dd8dc2d/docs/roadmap-multi-agent-workflow.md +0 -330
  1388. package/.forge/worktrees/pipeline-4dd8dc2d/forge-logo.png +0 -0
  1389. package/.forge/worktrees/pipeline-4dd8dc2d/forge-logo.svg +0 -106
  1390. package/.forge/worktrees/pipeline-4dd8dc2d/hooks/useSidebarResize.ts +0 -52
  1391. package/.forge/worktrees/pipeline-4dd8dc2d/install.sh +0 -29
  1392. package/.forge/worktrees/pipeline-4dd8dc2d/instrumentation.ts +0 -35
  1393. package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/claude-adapter.ts +0 -104
  1394. package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/generic-adapter.ts +0 -64
  1395. package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/index.ts +0 -245
  1396. package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/types.ts +0 -70
  1397. package/.forge/worktrees/pipeline-4dd8dc2d/lib/artifacts.ts +0 -106
  1398. package/.forge/worktrees/pipeline-4dd8dc2d/lib/auth.ts +0 -62
  1399. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/docker.yaml +0 -70
  1400. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/http.yaml +0 -66
  1401. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/jenkins.yaml +0 -92
  1402. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/llm-vision.yaml +0 -85
  1403. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/playwright.yaml +0 -111
  1404. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/shell-command.yaml +0 -60
  1405. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/slack.yaml +0 -48
  1406. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/webhook.yaml +0 -56
  1407. package/.forge/worktrees/pipeline-4dd8dc2d/lib/claude-process.ts +0 -361
  1408. package/.forge/worktrees/pipeline-4dd8dc2d/lib/claude-sessions.ts +0 -266
  1409. package/.forge/worktrees/pipeline-4dd8dc2d/lib/claude-templates.ts +0 -227
  1410. package/.forge/worktrees/pipeline-4dd8dc2d/lib/cloudflared.ts +0 -424
  1411. package/.forge/worktrees/pipeline-4dd8dc2d/lib/crypto.ts +0 -67
  1412. package/.forge/worktrees/pipeline-4dd8dc2d/lib/delivery.ts +0 -787
  1413. package/.forge/worktrees/pipeline-4dd8dc2d/lib/dirs.ts +0 -99
  1414. package/.forge/worktrees/pipeline-4dd8dc2d/lib/flows.ts +0 -86
  1415. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-mcp-server.ts +0 -732
  1416. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-inbox.md +0 -38
  1417. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-send.md +0 -47
  1418. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-status.md +0 -32
  1419. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-workspace-sync.md +0 -37
  1420. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/00-overview.md +0 -40
  1421. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/01-settings.md +0 -194
  1422. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/02-telegram.md +0 -41
  1423. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/03-tunnel.md +0 -31
  1424. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/04-tasks.md +0 -52
  1425. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/05-pipelines.md +0 -460
  1426. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/06-skills.md +0 -43
  1427. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/07-projects.md +0 -73
  1428. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/08-rules.md +0 -53
  1429. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/09-issue-autofix.md +0 -55
  1430. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/10-troubleshooting.md +0 -89
  1431. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/11-workspace.md +0 -810
  1432. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/CLAUDE.md +0 -62
  1433. package/.forge/worktrees/pipeline-4dd8dc2d/lib/init.ts +0 -266
  1434. package/.forge/worktrees/pipeline-4dd8dc2d/lib/issue-scanner.ts +0 -298
  1435. package/.forge/worktrees/pipeline-4dd8dc2d/lib/logger.ts +0 -79
  1436. package/.forge/worktrees/pipeline-4dd8dc2d/lib/notifications.ts +0 -75
  1437. package/.forge/worktrees/pipeline-4dd8dc2d/lib/notify.ts +0 -108
  1438. package/.forge/worktrees/pipeline-4dd8dc2d/lib/password.ts +0 -97
  1439. package/.forge/worktrees/pipeline-4dd8dc2d/lib/pipeline-scheduler.ts +0 -373
  1440. package/.forge/worktrees/pipeline-4dd8dc2d/lib/pipeline.ts +0 -1565
  1441. package/.forge/worktrees/pipeline-4dd8dc2d/lib/plugins/executor.ts +0 -347
  1442. package/.forge/worktrees/pipeline-4dd8dc2d/lib/plugins/registry.ts +0 -228
  1443. package/.forge/worktrees/pipeline-4dd8dc2d/lib/plugins/types.ts +0 -103
  1444. package/.forge/worktrees/pipeline-4dd8dc2d/lib/project-sessions.ts +0 -53
  1445. package/.forge/worktrees/pipeline-4dd8dc2d/lib/projects.ts +0 -86
  1446. package/.forge/worktrees/pipeline-4dd8dc2d/lib/session-manager.ts +0 -156
  1447. package/.forge/worktrees/pipeline-4dd8dc2d/lib/session-utils.ts +0 -53
  1448. package/.forge/worktrees/pipeline-4dd8dc2d/lib/session-watcher.ts +0 -345
  1449. package/.forge/worktrees/pipeline-4dd8dc2d/lib/settings.ts +0 -195
  1450. package/.forge/worktrees/pipeline-4dd8dc2d/lib/skills.ts +0 -458
  1451. package/.forge/worktrees/pipeline-4dd8dc2d/lib/task-manager.ts +0 -951
  1452. package/.forge/worktrees/pipeline-4dd8dc2d/lib/telegram-bot.ts +0 -1477
  1453. package/.forge/worktrees/pipeline-4dd8dc2d/lib/telegram-standalone.ts +0 -83
  1454. package/.forge/worktrees/pipeline-4dd8dc2d/lib/terminal-server.ts +0 -70
  1455. package/.forge/worktrees/pipeline-4dd8dc2d/lib/terminal-standalone.ts +0 -438
  1456. package/.forge/worktrees/pipeline-4dd8dc2d/lib/usage-scanner.ts +0 -249
  1457. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/__tests__/state-machine.test.ts +0 -388
  1458. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/__tests__/workspace.test.ts +0 -311
  1459. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/agent-bus.ts +0 -416
  1460. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/agent-worker.ts +0 -655
  1461. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/backends/api-backend.ts +0 -262
  1462. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/backends/cli-backend.ts +0 -491
  1463. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/index.ts +0 -84
  1464. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/manager.ts +0 -136
  1465. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/orchestrator.ts +0 -3415
  1466. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/persistence.ts +0 -309
  1467. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/presets.ts +0 -649
  1468. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/requests.ts +0 -287
  1469. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/session-monitor.ts +0 -240
  1470. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/skill-installer.ts +0 -275
  1471. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/smith-memory.ts +0 -498
  1472. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/types.ts +0 -241
  1473. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/watch-manager.ts +0 -560
  1474. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace-standalone.ts +0 -978
  1475. package/.forge/worktrees/pipeline-4dd8dc2d/middleware.ts +0 -51
  1476. package/.forge/worktrees/pipeline-4dd8dc2d/next.config.ts +0 -26
  1477. package/.forge/worktrees/pipeline-4dd8dc2d/package.json +0 -74
  1478. package/.forge/worktrees/pipeline-4dd8dc2d/pnpm-lock.yaml +0 -3719
  1479. package/.forge/worktrees/pipeline-4dd8dc2d/pnpm-workspace.yaml +0 -1
  1480. package/.forge/worktrees/pipeline-4dd8dc2d/postcss.config.mjs +0 -7
  1481. package/.forge/worktrees/pipeline-4dd8dc2d/publish.sh +0 -133
  1482. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/README.md +0 -66
  1483. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/results/.gitignore +0 -2
  1484. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/run.ts +0 -635
  1485. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/01-text-utils/task.md +0 -26
  1486. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  1487. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  1488. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/02-pagination/task.md +0 -48
  1489. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  1490. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  1491. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  1492. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  1493. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/verify-usage.ts +0 -178
  1494. package/.forge/worktrees/pipeline-4dd8dc2d/src/config/index.ts +0 -129
  1495. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/db/database.ts +0 -259
  1496. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/memory/strategy.ts +0 -32
  1497. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/providers/chat.ts +0 -65
  1498. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/providers/registry.ts +0 -60
  1499. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/session/manager.ts +0 -190
  1500. package/.forge/worktrees/pipeline-4dd8dc2d/src/types/index.ts +0 -129
  1501. package/.forge/worktrees/pipeline-4dd8dc2d/start.sh +0 -32
  1502. package/.forge/worktrees/pipeline-4dd8dc2d/templates/smith-lead.json +0 -45
  1503. package/.forge/worktrees/pipeline-4dd8dc2d/tsconfig.json +0 -42
  1504. package/.forge/worktrees/pipeline-d1757a50/CLAUDE.md +0 -86
  1505. package/.forge/worktrees/pipeline-d1757a50/README.md +0 -136
  1506. package/.forge/worktrees/pipeline-d1757a50/RELEASE_NOTES.md +0 -11
  1507. package/.forge/worktrees/pipeline-d1757a50/app/api/agents/route.ts +0 -17
  1508. package/.forge/worktrees/pipeline-d1757a50/app/api/auth/[...nextauth]/route.ts +0 -3
  1509. package/.forge/worktrees/pipeline-d1757a50/app/api/auth/verify/route.ts +0 -46
  1510. package/.forge/worktrees/pipeline-d1757a50/app/api/claude/[id]/route.ts +0 -31
  1511. package/.forge/worktrees/pipeline-d1757a50/app/api/claude/[id]/stream/route.ts +0 -63
  1512. package/.forge/worktrees/pipeline-d1757a50/app/api/claude/route.ts +0 -28
  1513. package/.forge/worktrees/pipeline-d1757a50/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  1514. package/.forge/worktrees/pipeline-d1757a50/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  1515. package/.forge/worktrees/pipeline-d1757a50/app/api/claude-sessions/[projectName]/route.ts +0 -37
  1516. package/.forge/worktrees/pipeline-d1757a50/app/api/claude-sessions/sync/route.ts +0 -17
  1517. package/.forge/worktrees/pipeline-d1757a50/app/api/claude-templates/route.ts +0 -145
  1518. package/.forge/worktrees/pipeline-d1757a50/app/api/code/route.ts +0 -299
  1519. package/.forge/worktrees/pipeline-d1757a50/app/api/delivery/[id]/route.ts +0 -62
  1520. package/.forge/worktrees/pipeline-d1757a50/app/api/delivery/route.ts +0 -40
  1521. package/.forge/worktrees/pipeline-d1757a50/app/api/detect-cli/route.ts +0 -46
  1522. package/.forge/worktrees/pipeline-d1757a50/app/api/docs/route.ts +0 -176
  1523. package/.forge/worktrees/pipeline-d1757a50/app/api/docs/sessions/route.ts +0 -54
  1524. package/.forge/worktrees/pipeline-d1757a50/app/api/favorites/route.ts +0 -26
  1525. package/.forge/worktrees/pipeline-d1757a50/app/api/flows/route.ts +0 -6
  1526. package/.forge/worktrees/pipeline-d1757a50/app/api/flows/run/route.ts +0 -19
  1527. package/.forge/worktrees/pipeline-d1757a50/app/api/git/route.ts +0 -149
  1528. package/.forge/worktrees/pipeline-d1757a50/app/api/help/route.ts +0 -84
  1529. package/.forge/worktrees/pipeline-d1757a50/app/api/issue-scanner/route.ts +0 -116
  1530. package/.forge/worktrees/pipeline-d1757a50/app/api/logs/route.ts +0 -100
  1531. package/.forge/worktrees/pipeline-d1757a50/app/api/mobile-chat/route.ts +0 -115
  1532. package/.forge/worktrees/pipeline-d1757a50/app/api/monitor/route.ts +0 -74
  1533. package/.forge/worktrees/pipeline-d1757a50/app/api/notifications/route.ts +0 -42
  1534. package/.forge/worktrees/pipeline-d1757a50/app/api/notify/test/route.ts +0 -33
  1535. package/.forge/worktrees/pipeline-d1757a50/app/api/online/route.ts +0 -40
  1536. package/.forge/worktrees/pipeline-d1757a50/app/api/pipelines/[id]/route.ts +0 -41
  1537. package/.forge/worktrees/pipeline-d1757a50/app/api/pipelines/route.ts +0 -90
  1538. package/.forge/worktrees/pipeline-d1757a50/app/api/plugins/route.ts +0 -75
  1539. package/.forge/worktrees/pipeline-d1757a50/app/api/preview/[...path]/route.ts +0 -64
  1540. package/.forge/worktrees/pipeline-d1757a50/app/api/preview/route.ts +0 -156
  1541. package/.forge/worktrees/pipeline-d1757a50/app/api/project-pipelines/route.ts +0 -91
  1542. package/.forge/worktrees/pipeline-d1757a50/app/api/project-sessions/route.ts +0 -61
  1543. package/.forge/worktrees/pipeline-d1757a50/app/api/projects/route.ts +0 -26
  1544. package/.forge/worktrees/pipeline-d1757a50/app/api/sessions/[id]/chat/route.ts +0 -64
  1545. package/.forge/worktrees/pipeline-d1757a50/app/api/sessions/[id]/messages/route.ts +0 -9
  1546. package/.forge/worktrees/pipeline-d1757a50/app/api/sessions/[id]/route.ts +0 -17
  1547. package/.forge/worktrees/pipeline-d1757a50/app/api/sessions/route.ts +0 -20
  1548. package/.forge/worktrees/pipeline-d1757a50/app/api/settings/route.ts +0 -64
  1549. package/.forge/worktrees/pipeline-d1757a50/app/api/skills/local/route.ts +0 -228
  1550. package/.forge/worktrees/pipeline-d1757a50/app/api/skills/route.ts +0 -182
  1551. package/.forge/worktrees/pipeline-d1757a50/app/api/smith-templates/route.ts +0 -81
  1552. package/.forge/worktrees/pipeline-d1757a50/app/api/status/route.ts +0 -12
  1553. package/.forge/worktrees/pipeline-d1757a50/app/api/tabs/route.ts +0 -25
  1554. package/.forge/worktrees/pipeline-d1757a50/app/api/tasks/[id]/route.ts +0 -51
  1555. package/.forge/worktrees/pipeline-d1757a50/app/api/tasks/[id]/stream/route.ts +0 -77
  1556. package/.forge/worktrees/pipeline-d1757a50/app/api/tasks/link/route.ts +0 -37
  1557. package/.forge/worktrees/pipeline-d1757a50/app/api/tasks/route.ts +0 -44
  1558. package/.forge/worktrees/pipeline-d1757a50/app/api/tasks/session/route.ts +0 -14
  1559. package/.forge/worktrees/pipeline-d1757a50/app/api/telegram/route.ts +0 -23
  1560. package/.forge/worktrees/pipeline-d1757a50/app/api/templates/route.ts +0 -6
  1561. package/.forge/worktrees/pipeline-d1757a50/app/api/terminal-bell/route.ts +0 -35
  1562. package/.forge/worktrees/pipeline-d1757a50/app/api/terminal-cwd/route.ts +0 -19
  1563. package/.forge/worktrees/pipeline-d1757a50/app/api/terminal-state/route.ts +0 -15
  1564. package/.forge/worktrees/pipeline-d1757a50/app/api/tunnel/route.ts +0 -26
  1565. package/.forge/worktrees/pipeline-d1757a50/app/api/upgrade/route.ts +0 -43
  1566. package/.forge/worktrees/pipeline-d1757a50/app/api/usage/route.ts +0 -20
  1567. package/.forge/worktrees/pipeline-d1757a50/app/api/version/route.ts +0 -78
  1568. package/.forge/worktrees/pipeline-d1757a50/app/api/watchers/route.ts +0 -33
  1569. package/.forge/worktrees/pipeline-d1757a50/app/api/workspace/[id]/agents/route.ts +0 -35
  1570. package/.forge/worktrees/pipeline-d1757a50/app/api/workspace/[id]/memory/route.ts +0 -23
  1571. package/.forge/worktrees/pipeline-d1757a50/app/api/workspace/[id]/smith/route.ts +0 -22
  1572. package/.forge/worktrees/pipeline-d1757a50/app/api/workspace/[id]/stream/route.ts +0 -28
  1573. package/.forge/worktrees/pipeline-d1757a50/app/api/workspace/route.ts +0 -100
  1574. package/.forge/worktrees/pipeline-d1757a50/app/global-error.tsx +0 -21
  1575. package/.forge/worktrees/pipeline-d1757a50/app/globals.css +0 -52
  1576. package/.forge/worktrees/pipeline-d1757a50/app/icon.ico +0 -0
  1577. package/.forge/worktrees/pipeline-d1757a50/app/icon.png +0 -0
  1578. package/.forge/worktrees/pipeline-d1757a50/app/icon.svg +0 -106
  1579. package/.forge/worktrees/pipeline-d1757a50/app/layout.tsx +0 -17
  1580. package/.forge/worktrees/pipeline-d1757a50/app/login/LoginForm.tsx +0 -96
  1581. package/.forge/worktrees/pipeline-d1757a50/app/login/page.tsx +0 -10
  1582. package/.forge/worktrees/pipeline-d1757a50/app/mobile/page.tsx +0 -9
  1583. package/.forge/worktrees/pipeline-d1757a50/app/page.tsx +0 -21
  1584. package/.forge/worktrees/pipeline-d1757a50/bin/forge-server.mjs +0 -484
  1585. package/.forge/worktrees/pipeline-d1757a50/check-forge-status.sh +0 -71
  1586. package/.forge/worktrees/pipeline-d1757a50/cli/mw.ts +0 -579
  1587. package/.forge/worktrees/pipeline-d1757a50/components/BrowserPanel.tsx +0 -175
  1588. package/.forge/worktrees/pipeline-d1757a50/components/ChatPanel.tsx +0 -191
  1589. package/.forge/worktrees/pipeline-d1757a50/components/ClaudeTerminal.tsx +0 -267
  1590. package/.forge/worktrees/pipeline-d1757a50/components/CodeViewer.tsx +0 -787
  1591. package/.forge/worktrees/pipeline-d1757a50/components/ConversationEditor.tsx +0 -411
  1592. package/.forge/worktrees/pipeline-d1757a50/components/ConversationGraphView.tsx +0 -347
  1593. package/.forge/worktrees/pipeline-d1757a50/components/ConversationTerminalView.tsx +0 -303
  1594. package/.forge/worktrees/pipeline-d1757a50/components/Dashboard.tsx +0 -807
  1595. package/.forge/worktrees/pipeline-d1757a50/components/DashboardWrapper.tsx +0 -9
  1596. package/.forge/worktrees/pipeline-d1757a50/components/DeliveryFlowEditor.tsx +0 -491
  1597. package/.forge/worktrees/pipeline-d1757a50/components/DeliveryList.tsx +0 -230
  1598. package/.forge/worktrees/pipeline-d1757a50/components/DeliveryWorkspace.tsx +0 -589
  1599. package/.forge/worktrees/pipeline-d1757a50/components/DocTerminal.tsx +0 -187
  1600. package/.forge/worktrees/pipeline-d1757a50/components/DocsViewer.tsx +0 -574
  1601. package/.forge/worktrees/pipeline-d1757a50/components/HelpDialog.tsx +0 -169
  1602. package/.forge/worktrees/pipeline-d1757a50/components/HelpTerminal.tsx +0 -141
  1603. package/.forge/worktrees/pipeline-d1757a50/components/InlinePipelineView.tsx +0 -111
  1604. package/.forge/worktrees/pipeline-d1757a50/components/LogViewer.tsx +0 -194
  1605. package/.forge/worktrees/pipeline-d1757a50/components/MarkdownContent.tsx +0 -73
  1606. package/.forge/worktrees/pipeline-d1757a50/components/MobileView.tsx +0 -385
  1607. package/.forge/worktrees/pipeline-d1757a50/components/MonitorPanel.tsx +0 -122
  1608. package/.forge/worktrees/pipeline-d1757a50/components/NewSessionModal.tsx +0 -93
  1609. package/.forge/worktrees/pipeline-d1757a50/components/NewTaskModal.tsx +0 -492
  1610. package/.forge/worktrees/pipeline-d1757a50/components/PipelineEditor.tsx +0 -570
  1611. package/.forge/worktrees/pipeline-d1757a50/components/PipelineView.tsx +0 -1018
  1612. package/.forge/worktrees/pipeline-d1757a50/components/PluginsPanel.tsx +0 -472
  1613. package/.forge/worktrees/pipeline-d1757a50/components/ProjectDetail.tsx +0 -1618
  1614. package/.forge/worktrees/pipeline-d1757a50/components/ProjectList.tsx +0 -108
  1615. package/.forge/worktrees/pipeline-d1757a50/components/ProjectManager.tsx +0 -401
  1616. package/.forge/worktrees/pipeline-d1757a50/components/SessionList.tsx +0 -74
  1617. package/.forge/worktrees/pipeline-d1757a50/components/SessionView.tsx +0 -726
  1618. package/.forge/worktrees/pipeline-d1757a50/components/SettingsModal.tsx +0 -1647
  1619. package/.forge/worktrees/pipeline-d1757a50/components/SkillsPanel.tsx +0 -969
  1620. package/.forge/worktrees/pipeline-d1757a50/components/StatusBar.tsx +0 -99
  1621. package/.forge/worktrees/pipeline-d1757a50/components/TabBar.tsx +0 -46
  1622. package/.forge/worktrees/pipeline-d1757a50/components/TaskBoard.tsx +0 -113
  1623. package/.forge/worktrees/pipeline-d1757a50/components/TaskDetail.tsx +0 -372
  1624. package/.forge/worktrees/pipeline-d1757a50/components/TerminalLauncher.tsx +0 -398
  1625. package/.forge/worktrees/pipeline-d1757a50/components/TunnelToggle.tsx +0 -206
  1626. package/.forge/worktrees/pipeline-d1757a50/components/UsagePanel.tsx +0 -207
  1627. package/.forge/worktrees/pipeline-d1757a50/components/WebTerminal.tsx +0 -1683
  1628. package/.forge/worktrees/pipeline-d1757a50/components/WorkspaceTree.tsx +0 -221
  1629. package/.forge/worktrees/pipeline-d1757a50/components/WorkspaceView.tsx +0 -4048
  1630. package/.forge/worktrees/pipeline-d1757a50/dev-test.sh +0 -5
  1631. package/.forge/worktrees/pipeline-d1757a50/docs/Forge_Memory_Layer_Design.docx +0 -0
  1632. package/.forge/worktrees/pipeline-d1757a50/docs/Forge_Strategy_Research_2026.docx +0 -0
  1633. package/.forge/worktrees/pipeline-d1757a50/docs/LOCAL-DEPLOY.md +0 -144
  1634. package/.forge/worktrees/pipeline-d1757a50/docs/roadmap-multi-agent-workflow.md +0 -330
  1635. package/.forge/worktrees/pipeline-d1757a50/forge-logo.png +0 -0
  1636. package/.forge/worktrees/pipeline-d1757a50/forge-logo.svg +0 -106
  1637. package/.forge/worktrees/pipeline-d1757a50/hooks/useSidebarResize.ts +0 -52
  1638. package/.forge/worktrees/pipeline-d1757a50/install.sh +0 -29
  1639. package/.forge/worktrees/pipeline-d1757a50/instrumentation.ts +0 -35
  1640. package/.forge/worktrees/pipeline-d1757a50/lib/agents/claude-adapter.ts +0 -104
  1641. package/.forge/worktrees/pipeline-d1757a50/lib/agents/generic-adapter.ts +0 -64
  1642. package/.forge/worktrees/pipeline-d1757a50/lib/agents/index.ts +0 -245
  1643. package/.forge/worktrees/pipeline-d1757a50/lib/agents/types.ts +0 -70
  1644. package/.forge/worktrees/pipeline-d1757a50/lib/artifacts.ts +0 -106
  1645. package/.forge/worktrees/pipeline-d1757a50/lib/auth.ts +0 -62
  1646. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/docker.yaml +0 -70
  1647. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/http.yaml +0 -66
  1648. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/jenkins.yaml +0 -92
  1649. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/llm-vision.yaml +0 -85
  1650. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/playwright.yaml +0 -111
  1651. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/shell-command.yaml +0 -60
  1652. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/slack.yaml +0 -48
  1653. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/webhook.yaml +0 -56
  1654. package/.forge/worktrees/pipeline-d1757a50/lib/claude-process.ts +0 -361
  1655. package/.forge/worktrees/pipeline-d1757a50/lib/claude-sessions.ts +0 -266
  1656. package/.forge/worktrees/pipeline-d1757a50/lib/claude-templates.ts +0 -227
  1657. package/.forge/worktrees/pipeline-d1757a50/lib/cloudflared.ts +0 -424
  1658. package/.forge/worktrees/pipeline-d1757a50/lib/crypto.ts +0 -67
  1659. package/.forge/worktrees/pipeline-d1757a50/lib/delivery.ts +0 -787
  1660. package/.forge/worktrees/pipeline-d1757a50/lib/dirs.ts +0 -99
  1661. package/.forge/worktrees/pipeline-d1757a50/lib/flows.ts +0 -86
  1662. package/.forge/worktrees/pipeline-d1757a50/lib/forge-mcp-server.ts +0 -717
  1663. package/.forge/worktrees/pipeline-d1757a50/lib/forge-skills/forge-inbox.md +0 -38
  1664. package/.forge/worktrees/pipeline-d1757a50/lib/forge-skills/forge-send.md +0 -47
  1665. package/.forge/worktrees/pipeline-d1757a50/lib/forge-skills/forge-status.md +0 -32
  1666. package/.forge/worktrees/pipeline-d1757a50/lib/forge-skills/forge-workspace-sync.md +0 -37
  1667. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/00-overview.md +0 -40
  1668. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/01-settings.md +0 -194
  1669. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/02-telegram.md +0 -41
  1670. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/03-tunnel.md +0 -31
  1671. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/04-tasks.md +0 -52
  1672. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/05-pipelines.md +0 -460
  1673. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/06-skills.md +0 -43
  1674. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/07-projects.md +0 -73
  1675. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/08-rules.md +0 -53
  1676. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/09-issue-autofix.md +0 -55
  1677. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/10-troubleshooting.md +0 -89
  1678. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/11-workspace.md +0 -810
  1679. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/CLAUDE.md +0 -62
  1680. package/.forge/worktrees/pipeline-d1757a50/lib/init.ts +0 -266
  1681. package/.forge/worktrees/pipeline-d1757a50/lib/issue-scanner.ts +0 -298
  1682. package/.forge/worktrees/pipeline-d1757a50/lib/logger.ts +0 -79
  1683. package/.forge/worktrees/pipeline-d1757a50/lib/notifications.ts +0 -75
  1684. package/.forge/worktrees/pipeline-d1757a50/lib/notify.ts +0 -108
  1685. package/.forge/worktrees/pipeline-d1757a50/lib/password.ts +0 -97
  1686. package/.forge/worktrees/pipeline-d1757a50/lib/pipeline-scheduler.ts +0 -373
  1687. package/.forge/worktrees/pipeline-d1757a50/lib/pipeline.ts +0 -1441
  1688. package/.forge/worktrees/pipeline-d1757a50/lib/plugins/executor.ts +0 -347
  1689. package/.forge/worktrees/pipeline-d1757a50/lib/plugins/registry.ts +0 -228
  1690. package/.forge/worktrees/pipeline-d1757a50/lib/plugins/types.ts +0 -103
  1691. package/.forge/worktrees/pipeline-d1757a50/lib/project-sessions.ts +0 -53
  1692. package/.forge/worktrees/pipeline-d1757a50/lib/projects.ts +0 -86
  1693. package/.forge/worktrees/pipeline-d1757a50/lib/session-manager.ts +0 -156
  1694. package/.forge/worktrees/pipeline-d1757a50/lib/session-utils.ts +0 -53
  1695. package/.forge/worktrees/pipeline-d1757a50/lib/session-watcher.ts +0 -345
  1696. package/.forge/worktrees/pipeline-d1757a50/lib/settings.ts +0 -195
  1697. package/.forge/worktrees/pipeline-d1757a50/lib/skills.ts +0 -458
  1698. package/.forge/worktrees/pipeline-d1757a50/lib/task-manager.ts +0 -949
  1699. package/.forge/worktrees/pipeline-d1757a50/lib/telegram-bot.ts +0 -1477
  1700. package/.forge/worktrees/pipeline-d1757a50/lib/telegram-standalone.ts +0 -83
  1701. package/.forge/worktrees/pipeline-d1757a50/lib/terminal-server.ts +0 -70
  1702. package/.forge/worktrees/pipeline-d1757a50/lib/terminal-standalone.ts +0 -421
  1703. package/.forge/worktrees/pipeline-d1757a50/lib/usage-scanner.ts +0 -249
  1704. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/__tests__/state-machine.test.ts +0 -388
  1705. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/__tests__/workspace.test.ts +0 -311
  1706. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/agent-bus.ts +0 -416
  1707. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/agent-worker.ts +0 -655
  1708. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/backends/api-backend.ts +0 -262
  1709. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/backends/cli-backend.ts +0 -491
  1710. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/index.ts +0 -82
  1711. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/manager.ts +0 -136
  1712. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/orchestrator.ts +0 -3400
  1713. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/persistence.ts +0 -309
  1714. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/presets.ts +0 -649
  1715. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/requests.ts +0 -287
  1716. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/session-monitor.ts +0 -240
  1717. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/skill-installer.ts +0 -275
  1718. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/smith-memory.ts +0 -498
  1719. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/types.ts +0 -241
  1720. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/watch-manager.ts +0 -560
  1721. package/.forge/worktrees/pipeline-d1757a50/lib/workspace-standalone.ts +0 -911
  1722. package/.forge/worktrees/pipeline-d1757a50/middleware.ts +0 -51
  1723. package/.forge/worktrees/pipeline-d1757a50/next.config.ts +0 -26
  1724. package/.forge/worktrees/pipeline-d1757a50/package.json +0 -74
  1725. package/.forge/worktrees/pipeline-d1757a50/pnpm-lock.yaml +0 -3719
  1726. package/.forge/worktrees/pipeline-d1757a50/pnpm-workspace.yaml +0 -1
  1727. package/.forge/worktrees/pipeline-d1757a50/postcss.config.mjs +0 -7
  1728. package/.forge/worktrees/pipeline-d1757a50/publish.sh +0 -133
  1729. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/README.md +0 -66
  1730. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/results/.gitignore +0 -2
  1731. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/run.ts +0 -635
  1732. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/01-text-utils/task.md +0 -26
  1733. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  1734. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  1735. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/02-pagination/task.md +0 -48
  1736. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  1737. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  1738. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  1739. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  1740. package/.forge/worktrees/pipeline-d1757a50/scripts/verify-usage.ts +0 -178
  1741. package/.forge/worktrees/pipeline-d1757a50/src/config/index.ts +0 -129
  1742. package/.forge/worktrees/pipeline-d1757a50/src/core/db/database.ts +0 -259
  1743. package/.forge/worktrees/pipeline-d1757a50/src/core/memory/strategy.ts +0 -32
  1744. package/.forge/worktrees/pipeline-d1757a50/src/core/providers/chat.ts +0 -65
  1745. package/.forge/worktrees/pipeline-d1757a50/src/core/providers/registry.ts +0 -60
  1746. package/.forge/worktrees/pipeline-d1757a50/src/core/session/manager.ts +0 -190
  1747. package/.forge/worktrees/pipeline-d1757a50/src/types/index.ts +0 -129
  1748. package/.forge/worktrees/pipeline-d1757a50/start.sh +0 -31
  1749. package/.forge/worktrees/pipeline-d1757a50/templates/smith-lead.json +0 -45
  1750. package/.forge/worktrees/pipeline-d1757a50/tsconfig.json +0 -42
  1751. package/.forge/worktrees/pipeline-d59c2fe2/CLAUDE.md +0 -86
  1752. package/.forge/worktrees/pipeline-d59c2fe2/README.md +0 -136
  1753. package/.forge/worktrees/pipeline-d59c2fe2/RELEASE_NOTES.md +0 -11
  1754. package/.forge/worktrees/pipeline-d59c2fe2/app/api/agents/route.ts +0 -17
  1755. package/.forge/worktrees/pipeline-d59c2fe2/app/api/auth/[...nextauth]/route.ts +0 -3
  1756. package/.forge/worktrees/pipeline-d59c2fe2/app/api/auth/verify/route.ts +0 -46
  1757. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude/[id]/route.ts +0 -31
  1758. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude/[id]/stream/route.ts +0 -63
  1759. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude/route.ts +0 -28
  1760. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  1761. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  1762. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude-sessions/[projectName]/route.ts +0 -37
  1763. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude-sessions/sync/route.ts +0 -17
  1764. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude-templates/route.ts +0 -145
  1765. package/.forge/worktrees/pipeline-d59c2fe2/app/api/code/route.ts +0 -299
  1766. package/.forge/worktrees/pipeline-d59c2fe2/app/api/delivery/[id]/route.ts +0 -62
  1767. package/.forge/worktrees/pipeline-d59c2fe2/app/api/delivery/route.ts +0 -40
  1768. package/.forge/worktrees/pipeline-d59c2fe2/app/api/detect-cli/route.ts +0 -46
  1769. package/.forge/worktrees/pipeline-d59c2fe2/app/api/docs/route.ts +0 -176
  1770. package/.forge/worktrees/pipeline-d59c2fe2/app/api/docs/sessions/route.ts +0 -54
  1771. package/.forge/worktrees/pipeline-d59c2fe2/app/api/favorites/route.ts +0 -26
  1772. package/.forge/worktrees/pipeline-d59c2fe2/app/api/flows/route.ts +0 -6
  1773. package/.forge/worktrees/pipeline-d59c2fe2/app/api/flows/run/route.ts +0 -19
  1774. package/.forge/worktrees/pipeline-d59c2fe2/app/api/git/route.ts +0 -149
  1775. package/.forge/worktrees/pipeline-d59c2fe2/app/api/help/route.ts +0 -84
  1776. package/.forge/worktrees/pipeline-d59c2fe2/app/api/issue-scanner/route.ts +0 -116
  1777. package/.forge/worktrees/pipeline-d59c2fe2/app/api/logs/route.ts +0 -100
  1778. package/.forge/worktrees/pipeline-d59c2fe2/app/api/mobile-chat/route.ts +0 -115
  1779. package/.forge/worktrees/pipeline-d59c2fe2/app/api/monitor/route.ts +0 -74
  1780. package/.forge/worktrees/pipeline-d59c2fe2/app/api/notifications/route.ts +0 -42
  1781. package/.forge/worktrees/pipeline-d59c2fe2/app/api/notify/test/route.ts +0 -33
  1782. package/.forge/worktrees/pipeline-d59c2fe2/app/api/online/route.ts +0 -40
  1783. package/.forge/worktrees/pipeline-d59c2fe2/app/api/pipelines/[id]/route.ts +0 -41
  1784. package/.forge/worktrees/pipeline-d59c2fe2/app/api/pipelines/route.ts +0 -90
  1785. package/.forge/worktrees/pipeline-d59c2fe2/app/api/plugins/route.ts +0 -75
  1786. package/.forge/worktrees/pipeline-d59c2fe2/app/api/preview/[...path]/route.ts +0 -64
  1787. package/.forge/worktrees/pipeline-d59c2fe2/app/api/preview/route.ts +0 -156
  1788. package/.forge/worktrees/pipeline-d59c2fe2/app/api/project-pipelines/route.ts +0 -91
  1789. package/.forge/worktrees/pipeline-d59c2fe2/app/api/project-sessions/route.ts +0 -61
  1790. package/.forge/worktrees/pipeline-d59c2fe2/app/api/projects/route.ts +0 -26
  1791. package/.forge/worktrees/pipeline-d59c2fe2/app/api/sessions/[id]/chat/route.ts +0 -64
  1792. package/.forge/worktrees/pipeline-d59c2fe2/app/api/sessions/[id]/messages/route.ts +0 -9
  1793. package/.forge/worktrees/pipeline-d59c2fe2/app/api/sessions/[id]/route.ts +0 -17
  1794. package/.forge/worktrees/pipeline-d59c2fe2/app/api/sessions/route.ts +0 -20
  1795. package/.forge/worktrees/pipeline-d59c2fe2/app/api/settings/route.ts +0 -64
  1796. package/.forge/worktrees/pipeline-d59c2fe2/app/api/skills/local/route.ts +0 -228
  1797. package/.forge/worktrees/pipeline-d59c2fe2/app/api/skills/route.ts +0 -182
  1798. package/.forge/worktrees/pipeline-d59c2fe2/app/api/smith-templates/route.ts +0 -81
  1799. package/.forge/worktrees/pipeline-d59c2fe2/app/api/status/route.ts +0 -12
  1800. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tabs/route.ts +0 -25
  1801. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tasks/[id]/route.ts +0 -51
  1802. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tasks/[id]/stream/route.ts +0 -77
  1803. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tasks/link/route.ts +0 -37
  1804. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tasks/route.ts +0 -44
  1805. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tasks/session/route.ts +0 -14
  1806. package/.forge/worktrees/pipeline-d59c2fe2/app/api/telegram/route.ts +0 -23
  1807. package/.forge/worktrees/pipeline-d59c2fe2/app/api/templates/route.ts +0 -6
  1808. package/.forge/worktrees/pipeline-d59c2fe2/app/api/terminal-bell/route.ts +0 -35
  1809. package/.forge/worktrees/pipeline-d59c2fe2/app/api/terminal-cwd/route.ts +0 -19
  1810. package/.forge/worktrees/pipeline-d59c2fe2/app/api/terminal-state/route.ts +0 -15
  1811. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tunnel/route.ts +0 -26
  1812. package/.forge/worktrees/pipeline-d59c2fe2/app/api/upgrade/route.ts +0 -43
  1813. package/.forge/worktrees/pipeline-d59c2fe2/app/api/usage/route.ts +0 -20
  1814. package/.forge/worktrees/pipeline-d59c2fe2/app/api/version/route.ts +0 -78
  1815. package/.forge/worktrees/pipeline-d59c2fe2/app/api/watchers/route.ts +0 -33
  1816. package/.forge/worktrees/pipeline-d59c2fe2/app/api/workspace/[id]/agents/route.ts +0 -35
  1817. package/.forge/worktrees/pipeline-d59c2fe2/app/api/workspace/[id]/memory/route.ts +0 -23
  1818. package/.forge/worktrees/pipeline-d59c2fe2/app/api/workspace/[id]/smith/route.ts +0 -22
  1819. package/.forge/worktrees/pipeline-d59c2fe2/app/api/workspace/[id]/stream/route.ts +0 -28
  1820. package/.forge/worktrees/pipeline-d59c2fe2/app/api/workspace/route.ts +0 -100
  1821. package/.forge/worktrees/pipeline-d59c2fe2/app/global-error.tsx +0 -21
  1822. package/.forge/worktrees/pipeline-d59c2fe2/app/globals.css +0 -52
  1823. package/.forge/worktrees/pipeline-d59c2fe2/app/icon.ico +0 -0
  1824. package/.forge/worktrees/pipeline-d59c2fe2/app/icon.png +0 -0
  1825. package/.forge/worktrees/pipeline-d59c2fe2/app/icon.svg +0 -106
  1826. package/.forge/worktrees/pipeline-d59c2fe2/app/layout.tsx +0 -17
  1827. package/.forge/worktrees/pipeline-d59c2fe2/app/login/LoginForm.tsx +0 -96
  1828. package/.forge/worktrees/pipeline-d59c2fe2/app/login/page.tsx +0 -10
  1829. package/.forge/worktrees/pipeline-d59c2fe2/app/mobile/page.tsx +0 -9
  1830. package/.forge/worktrees/pipeline-d59c2fe2/app/page.tsx +0 -21
  1831. package/.forge/worktrees/pipeline-d59c2fe2/bin/forge-server.mjs +0 -484
  1832. package/.forge/worktrees/pipeline-d59c2fe2/check-forge-status.sh +0 -71
  1833. package/.forge/worktrees/pipeline-d59c2fe2/cli/mw.ts +0 -579
  1834. package/.forge/worktrees/pipeline-d59c2fe2/components/BrowserPanel.tsx +0 -175
  1835. package/.forge/worktrees/pipeline-d59c2fe2/components/ChatPanel.tsx +0 -191
  1836. package/.forge/worktrees/pipeline-d59c2fe2/components/ClaudeTerminal.tsx +0 -267
  1837. package/.forge/worktrees/pipeline-d59c2fe2/components/CodeViewer.tsx +0 -787
  1838. package/.forge/worktrees/pipeline-d59c2fe2/components/ConversationEditor.tsx +0 -411
  1839. package/.forge/worktrees/pipeline-d59c2fe2/components/ConversationGraphView.tsx +0 -347
  1840. package/.forge/worktrees/pipeline-d59c2fe2/components/ConversationTerminalView.tsx +0 -303
  1841. package/.forge/worktrees/pipeline-d59c2fe2/components/Dashboard.tsx +0 -807
  1842. package/.forge/worktrees/pipeline-d59c2fe2/components/DashboardWrapper.tsx +0 -9
  1843. package/.forge/worktrees/pipeline-d59c2fe2/components/DeliveryFlowEditor.tsx +0 -491
  1844. package/.forge/worktrees/pipeline-d59c2fe2/components/DeliveryList.tsx +0 -230
  1845. package/.forge/worktrees/pipeline-d59c2fe2/components/DeliveryWorkspace.tsx +0 -589
  1846. package/.forge/worktrees/pipeline-d59c2fe2/components/DocTerminal.tsx +0 -187
  1847. package/.forge/worktrees/pipeline-d59c2fe2/components/DocsViewer.tsx +0 -574
  1848. package/.forge/worktrees/pipeline-d59c2fe2/components/HelpDialog.tsx +0 -169
  1849. package/.forge/worktrees/pipeline-d59c2fe2/components/HelpTerminal.tsx +0 -141
  1850. package/.forge/worktrees/pipeline-d59c2fe2/components/InlinePipelineView.tsx +0 -111
  1851. package/.forge/worktrees/pipeline-d59c2fe2/components/LogViewer.tsx +0 -194
  1852. package/.forge/worktrees/pipeline-d59c2fe2/components/MarkdownContent.tsx +0 -73
  1853. package/.forge/worktrees/pipeline-d59c2fe2/components/MobileView.tsx +0 -385
  1854. package/.forge/worktrees/pipeline-d59c2fe2/components/MonitorPanel.tsx +0 -122
  1855. package/.forge/worktrees/pipeline-d59c2fe2/components/NewSessionModal.tsx +0 -93
  1856. package/.forge/worktrees/pipeline-d59c2fe2/components/NewTaskModal.tsx +0 -492
  1857. package/.forge/worktrees/pipeline-d59c2fe2/components/PipelineEditor.tsx +0 -570
  1858. package/.forge/worktrees/pipeline-d59c2fe2/components/PipelineView.tsx +0 -1018
  1859. package/.forge/worktrees/pipeline-d59c2fe2/components/PluginsPanel.tsx +0 -472
  1860. package/.forge/worktrees/pipeline-d59c2fe2/components/ProjectDetail.tsx +0 -1618
  1861. package/.forge/worktrees/pipeline-d59c2fe2/components/ProjectList.tsx +0 -108
  1862. package/.forge/worktrees/pipeline-d59c2fe2/components/ProjectManager.tsx +0 -401
  1863. package/.forge/worktrees/pipeline-d59c2fe2/components/SessionList.tsx +0 -74
  1864. package/.forge/worktrees/pipeline-d59c2fe2/components/SessionView.tsx +0 -726
  1865. package/.forge/worktrees/pipeline-d59c2fe2/components/SettingsModal.tsx +0 -1647
  1866. package/.forge/worktrees/pipeline-d59c2fe2/components/SkillsPanel.tsx +0 -969
  1867. package/.forge/worktrees/pipeline-d59c2fe2/components/StatusBar.tsx +0 -99
  1868. package/.forge/worktrees/pipeline-d59c2fe2/components/TabBar.tsx +0 -46
  1869. package/.forge/worktrees/pipeline-d59c2fe2/components/TaskBoard.tsx +0 -113
  1870. package/.forge/worktrees/pipeline-d59c2fe2/components/TaskDetail.tsx +0 -372
  1871. package/.forge/worktrees/pipeline-d59c2fe2/components/TerminalLauncher.tsx +0 -398
  1872. package/.forge/worktrees/pipeline-d59c2fe2/components/TunnelToggle.tsx +0 -206
  1873. package/.forge/worktrees/pipeline-d59c2fe2/components/UsagePanel.tsx +0 -207
  1874. package/.forge/worktrees/pipeline-d59c2fe2/components/WebTerminal.tsx +0 -1683
  1875. package/.forge/worktrees/pipeline-d59c2fe2/components/WorkspaceTree.tsx +0 -221
  1876. package/.forge/worktrees/pipeline-d59c2fe2/components/WorkspaceView.tsx +0 -4048
  1877. package/.forge/worktrees/pipeline-d59c2fe2/dev-test.sh +0 -5
  1878. package/.forge/worktrees/pipeline-d59c2fe2/docs/Forge_Memory_Layer_Design.docx +0 -0
  1879. package/.forge/worktrees/pipeline-d59c2fe2/docs/Forge_Strategy_Research_2026.docx +0 -0
  1880. package/.forge/worktrees/pipeline-d59c2fe2/docs/LOCAL-DEPLOY.md +0 -144
  1881. package/.forge/worktrees/pipeline-d59c2fe2/docs/roadmap-multi-agent-workflow.md +0 -330
  1882. package/.forge/worktrees/pipeline-d59c2fe2/forge-logo.png +0 -0
  1883. package/.forge/worktrees/pipeline-d59c2fe2/forge-logo.svg +0 -106
  1884. package/.forge/worktrees/pipeline-d59c2fe2/hooks/useSidebarResize.ts +0 -52
  1885. package/.forge/worktrees/pipeline-d59c2fe2/install.sh +0 -29
  1886. package/.forge/worktrees/pipeline-d59c2fe2/instrumentation.ts +0 -35
  1887. package/.forge/worktrees/pipeline-d59c2fe2/lib/agents/claude-adapter.ts +0 -104
  1888. package/.forge/worktrees/pipeline-d59c2fe2/lib/agents/generic-adapter.ts +0 -64
  1889. package/.forge/worktrees/pipeline-d59c2fe2/lib/agents/index.ts +0 -245
  1890. package/.forge/worktrees/pipeline-d59c2fe2/lib/agents/types.ts +0 -70
  1891. package/.forge/worktrees/pipeline-d59c2fe2/lib/artifacts.ts +0 -106
  1892. package/.forge/worktrees/pipeline-d59c2fe2/lib/auth.ts +0 -62
  1893. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/docker.yaml +0 -70
  1894. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/http.yaml +0 -66
  1895. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/jenkins.yaml +0 -92
  1896. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/llm-vision.yaml +0 -85
  1897. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/playwright.yaml +0 -111
  1898. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/shell-command.yaml +0 -60
  1899. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/slack.yaml +0 -48
  1900. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/webhook.yaml +0 -56
  1901. package/.forge/worktrees/pipeline-d59c2fe2/lib/claude-process.ts +0 -361
  1902. package/.forge/worktrees/pipeline-d59c2fe2/lib/claude-sessions.ts +0 -266
  1903. package/.forge/worktrees/pipeline-d59c2fe2/lib/claude-templates.ts +0 -227
  1904. package/.forge/worktrees/pipeline-d59c2fe2/lib/cloudflared.ts +0 -424
  1905. package/.forge/worktrees/pipeline-d59c2fe2/lib/crypto.ts +0 -67
  1906. package/.forge/worktrees/pipeline-d59c2fe2/lib/delivery.ts +0 -787
  1907. package/.forge/worktrees/pipeline-d59c2fe2/lib/dirs.ts +0 -99
  1908. package/.forge/worktrees/pipeline-d59c2fe2/lib/flows.ts +0 -86
  1909. package/.forge/worktrees/pipeline-d59c2fe2/lib/forge-mcp-server.ts +0 -717
  1910. package/.forge/worktrees/pipeline-d59c2fe2/lib/forge-skills/forge-inbox.md +0 -38
  1911. package/.forge/worktrees/pipeline-d59c2fe2/lib/forge-skills/forge-send.md +0 -47
  1912. package/.forge/worktrees/pipeline-d59c2fe2/lib/forge-skills/forge-status.md +0 -32
  1913. package/.forge/worktrees/pipeline-d59c2fe2/lib/forge-skills/forge-workspace-sync.md +0 -37
  1914. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/00-overview.md +0 -40
  1915. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/01-settings.md +0 -194
  1916. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/02-telegram.md +0 -41
  1917. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/03-tunnel.md +0 -31
  1918. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/04-tasks.md +0 -52
  1919. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/05-pipelines.md +0 -460
  1920. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/06-skills.md +0 -43
  1921. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/07-projects.md +0 -73
  1922. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/08-rules.md +0 -53
  1923. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/09-issue-autofix.md +0 -55
  1924. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/10-troubleshooting.md +0 -89
  1925. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/11-workspace.md +0 -810
  1926. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/CLAUDE.md +0 -62
  1927. package/.forge/worktrees/pipeline-d59c2fe2/lib/init.ts +0 -266
  1928. package/.forge/worktrees/pipeline-d59c2fe2/lib/issue-scanner.ts +0 -298
  1929. package/.forge/worktrees/pipeline-d59c2fe2/lib/logger.ts +0 -79
  1930. package/.forge/worktrees/pipeline-d59c2fe2/lib/notifications.ts +0 -75
  1931. package/.forge/worktrees/pipeline-d59c2fe2/lib/notify.ts +0 -108
  1932. package/.forge/worktrees/pipeline-d59c2fe2/lib/password.ts +0 -97
  1933. package/.forge/worktrees/pipeline-d59c2fe2/lib/pipeline-scheduler.ts +0 -373
  1934. package/.forge/worktrees/pipeline-d59c2fe2/lib/pipeline.ts +0 -1441
  1935. package/.forge/worktrees/pipeline-d59c2fe2/lib/plugins/executor.ts +0 -347
  1936. package/.forge/worktrees/pipeline-d59c2fe2/lib/plugins/registry.ts +0 -228
  1937. package/.forge/worktrees/pipeline-d59c2fe2/lib/plugins/types.ts +0 -103
  1938. package/.forge/worktrees/pipeline-d59c2fe2/lib/project-sessions.ts +0 -53
  1939. package/.forge/worktrees/pipeline-d59c2fe2/lib/projects.ts +0 -86
  1940. package/.forge/worktrees/pipeline-d59c2fe2/lib/session-manager.ts +0 -156
  1941. package/.forge/worktrees/pipeline-d59c2fe2/lib/session-utils.ts +0 -53
  1942. package/.forge/worktrees/pipeline-d59c2fe2/lib/session-watcher.ts +0 -345
  1943. package/.forge/worktrees/pipeline-d59c2fe2/lib/settings.ts +0 -195
  1944. package/.forge/worktrees/pipeline-d59c2fe2/lib/skills.ts +0 -458
  1945. package/.forge/worktrees/pipeline-d59c2fe2/lib/task-manager.ts +0 -949
  1946. package/.forge/worktrees/pipeline-d59c2fe2/lib/telegram-bot.ts +0 -1477
  1947. package/.forge/worktrees/pipeline-d59c2fe2/lib/telegram-standalone.ts +0 -83
  1948. package/.forge/worktrees/pipeline-d59c2fe2/lib/terminal-server.ts +0 -70
  1949. package/.forge/worktrees/pipeline-d59c2fe2/lib/terminal-standalone.ts +0 -421
  1950. package/.forge/worktrees/pipeline-d59c2fe2/lib/usage-scanner.ts +0 -249
  1951. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/__tests__/state-machine.test.ts +0 -388
  1952. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/__tests__/workspace.test.ts +0 -311
  1953. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/agent-bus.ts +0 -416
  1954. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/agent-worker.ts +0 -655
  1955. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/backends/api-backend.ts +0 -262
  1956. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/backends/cli-backend.ts +0 -491
  1957. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/index.ts +0 -82
  1958. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/manager.ts +0 -136
  1959. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/orchestrator.ts +0 -3400
  1960. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/persistence.ts +0 -309
  1961. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/presets.ts +0 -649
  1962. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/requests.ts +0 -287
  1963. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/session-monitor.ts +0 -240
  1964. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/skill-installer.ts +0 -275
  1965. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/smith-memory.ts +0 -498
  1966. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/types.ts +0 -241
  1967. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/watch-manager.ts +0 -560
  1968. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace-standalone.ts +0 -911
  1969. package/.forge/worktrees/pipeline-d59c2fe2/middleware.ts +0 -51
  1970. package/.forge/worktrees/pipeline-d59c2fe2/next.config.ts +0 -26
  1971. package/.forge/worktrees/pipeline-d59c2fe2/package.json +0 -74
  1972. package/.forge/worktrees/pipeline-d59c2fe2/pnpm-lock.yaml +0 -3719
  1973. package/.forge/worktrees/pipeline-d59c2fe2/pnpm-workspace.yaml +0 -1
  1974. package/.forge/worktrees/pipeline-d59c2fe2/postcss.config.mjs +0 -7
  1975. package/.forge/worktrees/pipeline-d59c2fe2/publish.sh +0 -133
  1976. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/README.md +0 -66
  1977. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/results/.gitignore +0 -2
  1978. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/run.ts +0 -635
  1979. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/01-text-utils/task.md +0 -26
  1980. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  1981. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  1982. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/02-pagination/task.md +0 -48
  1983. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  1984. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  1985. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  1986. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  1987. package/.forge/worktrees/pipeline-d59c2fe2/scripts/verify-usage.ts +0 -178
  1988. package/.forge/worktrees/pipeline-d59c2fe2/src/config/index.ts +0 -129
  1989. package/.forge/worktrees/pipeline-d59c2fe2/src/core/db/database.ts +0 -259
  1990. package/.forge/worktrees/pipeline-d59c2fe2/src/core/memory/strategy.ts +0 -32
  1991. package/.forge/worktrees/pipeline-d59c2fe2/src/core/providers/chat.ts +0 -65
  1992. package/.forge/worktrees/pipeline-d59c2fe2/src/core/providers/registry.ts +0 -60
  1993. package/.forge/worktrees/pipeline-d59c2fe2/src/core/session/manager.ts +0 -190
  1994. package/.forge/worktrees/pipeline-d59c2fe2/src/types/index.ts +0 -129
  1995. package/.forge/worktrees/pipeline-d59c2fe2/start.sh +0 -31
  1996. package/.forge/worktrees/pipeline-d59c2fe2/templates/smith-lead.json +0 -45
  1997. package/.forge/worktrees/pipeline-d59c2fe2/tsconfig.json +0 -42
  1998. package/.forge/worktrees/pipeline-d6a6ef23/CLAUDE.md +0 -86
  1999. package/.forge/worktrees/pipeline-d6a6ef23/README.md +0 -136
  2000. package/.forge/worktrees/pipeline-d6a6ef23/RELEASE_NOTES.md +0 -11
  2001. package/.forge/worktrees/pipeline-d6a6ef23/app/api/agents/route.ts +0 -17
  2002. package/.forge/worktrees/pipeline-d6a6ef23/app/api/auth/[...nextauth]/route.ts +0 -3
  2003. package/.forge/worktrees/pipeline-d6a6ef23/app/api/auth/verify/route.ts +0 -46
  2004. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude/[id]/route.ts +0 -31
  2005. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude/[id]/stream/route.ts +0 -63
  2006. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude/route.ts +0 -28
  2007. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  2008. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  2009. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude-sessions/[projectName]/route.ts +0 -37
  2010. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude-sessions/sync/route.ts +0 -17
  2011. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude-templates/route.ts +0 -145
  2012. package/.forge/worktrees/pipeline-d6a6ef23/app/api/code/route.ts +0 -299
  2013. package/.forge/worktrees/pipeline-d6a6ef23/app/api/delivery/[id]/route.ts +0 -62
  2014. package/.forge/worktrees/pipeline-d6a6ef23/app/api/delivery/route.ts +0 -40
  2015. package/.forge/worktrees/pipeline-d6a6ef23/app/api/detect-cli/route.ts +0 -46
  2016. package/.forge/worktrees/pipeline-d6a6ef23/app/api/docs/route.ts +0 -176
  2017. package/.forge/worktrees/pipeline-d6a6ef23/app/api/docs/sessions/route.ts +0 -54
  2018. package/.forge/worktrees/pipeline-d6a6ef23/app/api/favorites/route.ts +0 -26
  2019. package/.forge/worktrees/pipeline-d6a6ef23/app/api/flows/route.ts +0 -6
  2020. package/.forge/worktrees/pipeline-d6a6ef23/app/api/flows/run/route.ts +0 -19
  2021. package/.forge/worktrees/pipeline-d6a6ef23/app/api/git/route.ts +0 -149
  2022. package/.forge/worktrees/pipeline-d6a6ef23/app/api/help/route.ts +0 -84
  2023. package/.forge/worktrees/pipeline-d6a6ef23/app/api/issue-scanner/route.ts +0 -116
  2024. package/.forge/worktrees/pipeline-d6a6ef23/app/api/logs/route.ts +0 -100
  2025. package/.forge/worktrees/pipeline-d6a6ef23/app/api/mobile-chat/route.ts +0 -115
  2026. package/.forge/worktrees/pipeline-d6a6ef23/app/api/monitor/route.ts +0 -74
  2027. package/.forge/worktrees/pipeline-d6a6ef23/app/api/notifications/route.ts +0 -42
  2028. package/.forge/worktrees/pipeline-d6a6ef23/app/api/notify/test/route.ts +0 -33
  2029. package/.forge/worktrees/pipeline-d6a6ef23/app/api/online/route.ts +0 -40
  2030. package/.forge/worktrees/pipeline-d6a6ef23/app/api/pipelines/[id]/route.ts +0 -41
  2031. package/.forge/worktrees/pipeline-d6a6ef23/app/api/pipelines/route.ts +0 -90
  2032. package/.forge/worktrees/pipeline-d6a6ef23/app/api/plugins/route.ts +0 -75
  2033. package/.forge/worktrees/pipeline-d6a6ef23/app/api/preview/[...path]/route.ts +0 -64
  2034. package/.forge/worktrees/pipeline-d6a6ef23/app/api/preview/route.ts +0 -156
  2035. package/.forge/worktrees/pipeline-d6a6ef23/app/api/project-pipelines/route.ts +0 -91
  2036. package/.forge/worktrees/pipeline-d6a6ef23/app/api/project-sessions/route.ts +0 -61
  2037. package/.forge/worktrees/pipeline-d6a6ef23/app/api/projects/route.ts +0 -26
  2038. package/.forge/worktrees/pipeline-d6a6ef23/app/api/sessions/[id]/chat/route.ts +0 -64
  2039. package/.forge/worktrees/pipeline-d6a6ef23/app/api/sessions/[id]/messages/route.ts +0 -9
  2040. package/.forge/worktrees/pipeline-d6a6ef23/app/api/sessions/[id]/route.ts +0 -17
  2041. package/.forge/worktrees/pipeline-d6a6ef23/app/api/sessions/route.ts +0 -20
  2042. package/.forge/worktrees/pipeline-d6a6ef23/app/api/settings/route.ts +0 -64
  2043. package/.forge/worktrees/pipeline-d6a6ef23/app/api/skills/local/route.ts +0 -228
  2044. package/.forge/worktrees/pipeline-d6a6ef23/app/api/skills/route.ts +0 -182
  2045. package/.forge/worktrees/pipeline-d6a6ef23/app/api/smith-templates/route.ts +0 -81
  2046. package/.forge/worktrees/pipeline-d6a6ef23/app/api/status/route.ts +0 -12
  2047. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tabs/route.ts +0 -25
  2048. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tasks/[id]/route.ts +0 -51
  2049. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tasks/[id]/stream/route.ts +0 -77
  2050. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tasks/link/route.ts +0 -37
  2051. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tasks/route.ts +0 -44
  2052. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tasks/session/route.ts +0 -14
  2053. package/.forge/worktrees/pipeline-d6a6ef23/app/api/telegram/route.ts +0 -23
  2054. package/.forge/worktrees/pipeline-d6a6ef23/app/api/templates/route.ts +0 -6
  2055. package/.forge/worktrees/pipeline-d6a6ef23/app/api/terminal-bell/route.ts +0 -35
  2056. package/.forge/worktrees/pipeline-d6a6ef23/app/api/terminal-cwd/route.ts +0 -19
  2057. package/.forge/worktrees/pipeline-d6a6ef23/app/api/terminal-state/route.ts +0 -15
  2058. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tunnel/route.ts +0 -26
  2059. package/.forge/worktrees/pipeline-d6a6ef23/app/api/upgrade/route.ts +0 -43
  2060. package/.forge/worktrees/pipeline-d6a6ef23/app/api/usage/route.ts +0 -20
  2061. package/.forge/worktrees/pipeline-d6a6ef23/app/api/version/route.ts +0 -78
  2062. package/.forge/worktrees/pipeline-d6a6ef23/app/api/watchers/route.ts +0 -33
  2063. package/.forge/worktrees/pipeline-d6a6ef23/app/api/workspace/[id]/agents/route.ts +0 -35
  2064. package/.forge/worktrees/pipeline-d6a6ef23/app/api/workspace/[id]/memory/route.ts +0 -23
  2065. package/.forge/worktrees/pipeline-d6a6ef23/app/api/workspace/[id]/smith/route.ts +0 -22
  2066. package/.forge/worktrees/pipeline-d6a6ef23/app/api/workspace/[id]/stream/route.ts +0 -28
  2067. package/.forge/worktrees/pipeline-d6a6ef23/app/api/workspace/route.ts +0 -100
  2068. package/.forge/worktrees/pipeline-d6a6ef23/app/global-error.tsx +0 -21
  2069. package/.forge/worktrees/pipeline-d6a6ef23/app/globals.css +0 -52
  2070. package/.forge/worktrees/pipeline-d6a6ef23/app/icon.ico +0 -0
  2071. package/.forge/worktrees/pipeline-d6a6ef23/app/icon.png +0 -0
  2072. package/.forge/worktrees/pipeline-d6a6ef23/app/icon.svg +0 -106
  2073. package/.forge/worktrees/pipeline-d6a6ef23/app/layout.tsx +0 -17
  2074. package/.forge/worktrees/pipeline-d6a6ef23/app/login/LoginForm.tsx +0 -96
  2075. package/.forge/worktrees/pipeline-d6a6ef23/app/login/page.tsx +0 -10
  2076. package/.forge/worktrees/pipeline-d6a6ef23/app/mobile/page.tsx +0 -9
  2077. package/.forge/worktrees/pipeline-d6a6ef23/app/page.tsx +0 -21
  2078. package/.forge/worktrees/pipeline-d6a6ef23/bin/forge-server.mjs +0 -484
  2079. package/.forge/worktrees/pipeline-d6a6ef23/check-forge-status.sh +0 -71
  2080. package/.forge/worktrees/pipeline-d6a6ef23/cli/mw.ts +0 -579
  2081. package/.forge/worktrees/pipeline-d6a6ef23/components/BrowserPanel.tsx +0 -175
  2082. package/.forge/worktrees/pipeline-d6a6ef23/components/ChatPanel.tsx +0 -191
  2083. package/.forge/worktrees/pipeline-d6a6ef23/components/ClaudeTerminal.tsx +0 -267
  2084. package/.forge/worktrees/pipeline-d6a6ef23/components/CodeViewer.tsx +0 -787
  2085. package/.forge/worktrees/pipeline-d6a6ef23/components/ConversationEditor.tsx +0 -411
  2086. package/.forge/worktrees/pipeline-d6a6ef23/components/ConversationGraphView.tsx +0 -347
  2087. package/.forge/worktrees/pipeline-d6a6ef23/components/ConversationTerminalView.tsx +0 -303
  2088. package/.forge/worktrees/pipeline-d6a6ef23/components/Dashboard.tsx +0 -807
  2089. package/.forge/worktrees/pipeline-d6a6ef23/components/DashboardWrapper.tsx +0 -9
  2090. package/.forge/worktrees/pipeline-d6a6ef23/components/DeliveryFlowEditor.tsx +0 -491
  2091. package/.forge/worktrees/pipeline-d6a6ef23/components/DeliveryList.tsx +0 -230
  2092. package/.forge/worktrees/pipeline-d6a6ef23/components/DeliveryWorkspace.tsx +0 -589
  2093. package/.forge/worktrees/pipeline-d6a6ef23/components/DocTerminal.tsx +0 -187
  2094. package/.forge/worktrees/pipeline-d6a6ef23/components/DocsViewer.tsx +0 -574
  2095. package/.forge/worktrees/pipeline-d6a6ef23/components/HelpDialog.tsx +0 -169
  2096. package/.forge/worktrees/pipeline-d6a6ef23/components/HelpTerminal.tsx +0 -141
  2097. package/.forge/worktrees/pipeline-d6a6ef23/components/InlinePipelineView.tsx +0 -111
  2098. package/.forge/worktrees/pipeline-d6a6ef23/components/LogViewer.tsx +0 -194
  2099. package/.forge/worktrees/pipeline-d6a6ef23/components/MarkdownContent.tsx +0 -73
  2100. package/.forge/worktrees/pipeline-d6a6ef23/components/MobileView.tsx +0 -385
  2101. package/.forge/worktrees/pipeline-d6a6ef23/components/MonitorPanel.tsx +0 -122
  2102. package/.forge/worktrees/pipeline-d6a6ef23/components/NewSessionModal.tsx +0 -93
  2103. package/.forge/worktrees/pipeline-d6a6ef23/components/NewTaskModal.tsx +0 -492
  2104. package/.forge/worktrees/pipeline-d6a6ef23/components/PipelineEditor.tsx +0 -570
  2105. package/.forge/worktrees/pipeline-d6a6ef23/components/PipelineView.tsx +0 -1018
  2106. package/.forge/worktrees/pipeline-d6a6ef23/components/PluginsPanel.tsx +0 -472
  2107. package/.forge/worktrees/pipeline-d6a6ef23/components/ProjectDetail.tsx +0 -1618
  2108. package/.forge/worktrees/pipeline-d6a6ef23/components/ProjectList.tsx +0 -108
  2109. package/.forge/worktrees/pipeline-d6a6ef23/components/ProjectManager.tsx +0 -401
  2110. package/.forge/worktrees/pipeline-d6a6ef23/components/SessionList.tsx +0 -74
  2111. package/.forge/worktrees/pipeline-d6a6ef23/components/SessionView.tsx +0 -726
  2112. package/.forge/worktrees/pipeline-d6a6ef23/components/SettingsModal.tsx +0 -1647
  2113. package/.forge/worktrees/pipeline-d6a6ef23/components/SkillsPanel.tsx +0 -969
  2114. package/.forge/worktrees/pipeline-d6a6ef23/components/StatusBar.tsx +0 -99
  2115. package/.forge/worktrees/pipeline-d6a6ef23/components/TabBar.tsx +0 -46
  2116. package/.forge/worktrees/pipeline-d6a6ef23/components/TaskBoard.tsx +0 -113
  2117. package/.forge/worktrees/pipeline-d6a6ef23/components/TaskDetail.tsx +0 -372
  2118. package/.forge/worktrees/pipeline-d6a6ef23/components/TerminalLauncher.tsx +0 -398
  2119. package/.forge/worktrees/pipeline-d6a6ef23/components/TunnelToggle.tsx +0 -206
  2120. package/.forge/worktrees/pipeline-d6a6ef23/components/UsagePanel.tsx +0 -207
  2121. package/.forge/worktrees/pipeline-d6a6ef23/components/WebTerminal.tsx +0 -1683
  2122. package/.forge/worktrees/pipeline-d6a6ef23/components/WorkspaceTree.tsx +0 -221
  2123. package/.forge/worktrees/pipeline-d6a6ef23/components/WorkspaceView.tsx +0 -4048
  2124. package/.forge/worktrees/pipeline-d6a6ef23/dev-test.sh +0 -5
  2125. package/.forge/worktrees/pipeline-d6a6ef23/docs/Forge_Memory_Layer_Design.docx +0 -0
  2126. package/.forge/worktrees/pipeline-d6a6ef23/docs/Forge_Strategy_Research_2026.docx +0 -0
  2127. package/.forge/worktrees/pipeline-d6a6ef23/docs/LOCAL-DEPLOY.md +0 -144
  2128. package/.forge/worktrees/pipeline-d6a6ef23/docs/roadmap-multi-agent-workflow.md +0 -330
  2129. package/.forge/worktrees/pipeline-d6a6ef23/forge-logo.png +0 -0
  2130. package/.forge/worktrees/pipeline-d6a6ef23/forge-logo.svg +0 -106
  2131. package/.forge/worktrees/pipeline-d6a6ef23/hooks/useSidebarResize.ts +0 -52
  2132. package/.forge/worktrees/pipeline-d6a6ef23/install.sh +0 -29
  2133. package/.forge/worktrees/pipeline-d6a6ef23/instrumentation.ts +0 -35
  2134. package/.forge/worktrees/pipeline-d6a6ef23/lib/agents/claude-adapter.ts +0 -104
  2135. package/.forge/worktrees/pipeline-d6a6ef23/lib/agents/generic-adapter.ts +0 -64
  2136. package/.forge/worktrees/pipeline-d6a6ef23/lib/agents/index.ts +0 -245
  2137. package/.forge/worktrees/pipeline-d6a6ef23/lib/agents/types.ts +0 -70
  2138. package/.forge/worktrees/pipeline-d6a6ef23/lib/artifacts.ts +0 -106
  2139. package/.forge/worktrees/pipeline-d6a6ef23/lib/auth.ts +0 -62
  2140. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/docker.yaml +0 -70
  2141. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/http.yaml +0 -66
  2142. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/jenkins.yaml +0 -92
  2143. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/llm-vision.yaml +0 -85
  2144. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/playwright.yaml +0 -111
  2145. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/shell-command.yaml +0 -60
  2146. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/slack.yaml +0 -48
  2147. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/webhook.yaml +0 -56
  2148. package/.forge/worktrees/pipeline-d6a6ef23/lib/claude-process.ts +0 -352
  2149. package/.forge/worktrees/pipeline-d6a6ef23/lib/claude-sessions.ts +0 -266
  2150. package/.forge/worktrees/pipeline-d6a6ef23/lib/claude-templates.ts +0 -227
  2151. package/.forge/worktrees/pipeline-d6a6ef23/lib/cloudflared.ts +0 -424
  2152. package/.forge/worktrees/pipeline-d6a6ef23/lib/crypto.ts +0 -67
  2153. package/.forge/worktrees/pipeline-d6a6ef23/lib/delivery.ts +0 -787
  2154. package/.forge/worktrees/pipeline-d6a6ef23/lib/dirs.ts +0 -99
  2155. package/.forge/worktrees/pipeline-d6a6ef23/lib/flows.ts +0 -86
  2156. package/.forge/worktrees/pipeline-d6a6ef23/lib/forge-mcp-server.ts +0 -717
  2157. package/.forge/worktrees/pipeline-d6a6ef23/lib/forge-skills/forge-inbox.md +0 -38
  2158. package/.forge/worktrees/pipeline-d6a6ef23/lib/forge-skills/forge-send.md +0 -47
  2159. package/.forge/worktrees/pipeline-d6a6ef23/lib/forge-skills/forge-status.md +0 -32
  2160. package/.forge/worktrees/pipeline-d6a6ef23/lib/forge-skills/forge-workspace-sync.md +0 -37
  2161. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/00-overview.md +0 -40
  2162. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/01-settings.md +0 -194
  2163. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/02-telegram.md +0 -41
  2164. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/03-tunnel.md +0 -31
  2165. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/04-tasks.md +0 -52
  2166. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/05-pipelines.md +0 -460
  2167. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/06-skills.md +0 -43
  2168. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/07-projects.md +0 -73
  2169. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/08-rules.md +0 -53
  2170. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/09-issue-autofix.md +0 -55
  2171. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/10-troubleshooting.md +0 -89
  2172. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/11-workspace.md +0 -810
  2173. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/CLAUDE.md +0 -62
  2174. package/.forge/worktrees/pipeline-d6a6ef23/lib/init.ts +0 -266
  2175. package/.forge/worktrees/pipeline-d6a6ef23/lib/issue-scanner.ts +0 -298
  2176. package/.forge/worktrees/pipeline-d6a6ef23/lib/logger.ts +0 -79
  2177. package/.forge/worktrees/pipeline-d6a6ef23/lib/notifications.ts +0 -75
  2178. package/.forge/worktrees/pipeline-d6a6ef23/lib/notify.ts +0 -108
  2179. package/.forge/worktrees/pipeline-d6a6ef23/lib/password.ts +0 -97
  2180. package/.forge/worktrees/pipeline-d6a6ef23/lib/pipeline-scheduler.ts +0 -373
  2181. package/.forge/worktrees/pipeline-d6a6ef23/lib/pipeline.ts +0 -1438
  2182. package/.forge/worktrees/pipeline-d6a6ef23/lib/plugins/executor.ts +0 -347
  2183. package/.forge/worktrees/pipeline-d6a6ef23/lib/plugins/registry.ts +0 -228
  2184. package/.forge/worktrees/pipeline-d6a6ef23/lib/plugins/types.ts +0 -103
  2185. package/.forge/worktrees/pipeline-d6a6ef23/lib/project-sessions.ts +0 -53
  2186. package/.forge/worktrees/pipeline-d6a6ef23/lib/projects.ts +0 -86
  2187. package/.forge/worktrees/pipeline-d6a6ef23/lib/session-manager.ts +0 -156
  2188. package/.forge/worktrees/pipeline-d6a6ef23/lib/session-utils.ts +0 -53
  2189. package/.forge/worktrees/pipeline-d6a6ef23/lib/session-watcher.ts +0 -345
  2190. package/.forge/worktrees/pipeline-d6a6ef23/lib/settings.ts +0 -195
  2191. package/.forge/worktrees/pipeline-d6a6ef23/lib/skills.ts +0 -458
  2192. package/.forge/worktrees/pipeline-d6a6ef23/lib/task-manager.ts +0 -949
  2193. package/.forge/worktrees/pipeline-d6a6ef23/lib/telegram-bot.ts +0 -1477
  2194. package/.forge/worktrees/pipeline-d6a6ef23/lib/telegram-standalone.ts +0 -83
  2195. package/.forge/worktrees/pipeline-d6a6ef23/lib/terminal-server.ts +0 -70
  2196. package/.forge/worktrees/pipeline-d6a6ef23/lib/terminal-standalone.ts +0 -421
  2197. package/.forge/worktrees/pipeline-d6a6ef23/lib/usage-scanner.ts +0 -249
  2198. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/__tests__/state-machine.test.ts +0 -388
  2199. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/__tests__/workspace.test.ts +0 -311
  2200. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/agent-bus.ts +0 -416
  2201. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/agent-worker.ts +0 -655
  2202. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/backends/api-backend.ts +0 -262
  2203. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/backends/cli-backend.ts +0 -491
  2204. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/index.ts +0 -82
  2205. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/manager.ts +0 -136
  2206. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/orchestrator.ts +0 -3400
  2207. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/persistence.ts +0 -309
  2208. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/presets.ts +0 -649
  2209. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/requests.ts +0 -287
  2210. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/session-monitor.ts +0 -240
  2211. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/skill-installer.ts +0 -275
  2212. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/smith-memory.ts +0 -498
  2213. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/types.ts +0 -241
  2214. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/watch-manager.ts +0 -560
  2215. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace-standalone.ts +0 -911
  2216. package/.forge/worktrees/pipeline-d6a6ef23/middleware.ts +0 -51
  2217. package/.forge/worktrees/pipeline-d6a6ef23/next.config.ts +0 -26
  2218. package/.forge/worktrees/pipeline-d6a6ef23/package.json +0 -74
  2219. package/.forge/worktrees/pipeline-d6a6ef23/pnpm-lock.yaml +0 -3719
  2220. package/.forge/worktrees/pipeline-d6a6ef23/pnpm-workspace.yaml +0 -1
  2221. package/.forge/worktrees/pipeline-d6a6ef23/postcss.config.mjs +0 -7
  2222. package/.forge/worktrees/pipeline-d6a6ef23/publish.sh +0 -133
  2223. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/README.md +0 -66
  2224. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/results/.gitignore +0 -2
  2225. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/run.ts +0 -635
  2226. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/01-text-utils/task.md +0 -26
  2227. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  2228. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  2229. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/02-pagination/task.md +0 -48
  2230. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  2231. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  2232. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  2233. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  2234. package/.forge/worktrees/pipeline-d6a6ef23/scripts/verify-usage.ts +0 -178
  2235. package/.forge/worktrees/pipeline-d6a6ef23/src/config/index.ts +0 -129
  2236. package/.forge/worktrees/pipeline-d6a6ef23/src/core/db/database.ts +0 -259
  2237. package/.forge/worktrees/pipeline-d6a6ef23/src/core/memory/strategy.ts +0 -32
  2238. package/.forge/worktrees/pipeline-d6a6ef23/src/core/providers/chat.ts +0 -65
  2239. package/.forge/worktrees/pipeline-d6a6ef23/src/core/providers/registry.ts +0 -60
  2240. package/.forge/worktrees/pipeline-d6a6ef23/src/core/session/manager.ts +0 -190
  2241. package/.forge/worktrees/pipeline-d6a6ef23/src/types/index.ts +0 -129
  2242. package/.forge/worktrees/pipeline-d6a6ef23/start.sh +0 -31
  2243. package/.forge/worktrees/pipeline-d6a6ef23/templates/smith-lead.json +0 -45
  2244. package/.forge/worktrees/pipeline-d6a6ef23/tsconfig.json +0 -42
  2245. package/.forge/worktrees/pipeline-e7f78b7a/CLAUDE.md +0 -86
  2246. package/.forge/worktrees/pipeline-e7f78b7a/README.md +0 -136
  2247. package/.forge/worktrees/pipeline-e7f78b7a/RELEASE_NOTES.md +0 -11
  2248. package/.forge/worktrees/pipeline-e7f78b7a/app/api/agents/route.ts +0 -17
  2249. package/.forge/worktrees/pipeline-e7f78b7a/app/api/auth/[...nextauth]/route.ts +0 -3
  2250. package/.forge/worktrees/pipeline-e7f78b7a/app/api/auth/verify/route.ts +0 -46
  2251. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude/[id]/route.ts +0 -31
  2252. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude/[id]/stream/route.ts +0 -63
  2253. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude/route.ts +0 -28
  2254. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  2255. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  2256. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude-sessions/[projectName]/route.ts +0 -37
  2257. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude-sessions/sync/route.ts +0 -17
  2258. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude-templates/route.ts +0 -145
  2259. package/.forge/worktrees/pipeline-e7f78b7a/app/api/code/route.ts +0 -299
  2260. package/.forge/worktrees/pipeline-e7f78b7a/app/api/delivery/[id]/route.ts +0 -62
  2261. package/.forge/worktrees/pipeline-e7f78b7a/app/api/delivery/route.ts +0 -40
  2262. package/.forge/worktrees/pipeline-e7f78b7a/app/api/detect-cli/route.ts +0 -46
  2263. package/.forge/worktrees/pipeline-e7f78b7a/app/api/docs/route.ts +0 -176
  2264. package/.forge/worktrees/pipeline-e7f78b7a/app/api/docs/sessions/route.ts +0 -54
  2265. package/.forge/worktrees/pipeline-e7f78b7a/app/api/favorites/route.ts +0 -26
  2266. package/.forge/worktrees/pipeline-e7f78b7a/app/api/flows/route.ts +0 -6
  2267. package/.forge/worktrees/pipeline-e7f78b7a/app/api/flows/run/route.ts +0 -19
  2268. package/.forge/worktrees/pipeline-e7f78b7a/app/api/git/route.ts +0 -149
  2269. package/.forge/worktrees/pipeline-e7f78b7a/app/api/help/route.ts +0 -84
  2270. package/.forge/worktrees/pipeline-e7f78b7a/app/api/issue-scanner/route.ts +0 -116
  2271. package/.forge/worktrees/pipeline-e7f78b7a/app/api/logs/route.ts +0 -100
  2272. package/.forge/worktrees/pipeline-e7f78b7a/app/api/mobile-chat/route.ts +0 -115
  2273. package/.forge/worktrees/pipeline-e7f78b7a/app/api/monitor/route.ts +0 -74
  2274. package/.forge/worktrees/pipeline-e7f78b7a/app/api/notifications/route.ts +0 -42
  2275. package/.forge/worktrees/pipeline-e7f78b7a/app/api/notify/test/route.ts +0 -33
  2276. package/.forge/worktrees/pipeline-e7f78b7a/app/api/online/route.ts +0 -40
  2277. package/.forge/worktrees/pipeline-e7f78b7a/app/api/pipelines/[id]/route.ts +0 -41
  2278. package/.forge/worktrees/pipeline-e7f78b7a/app/api/pipelines/route.ts +0 -90
  2279. package/.forge/worktrees/pipeline-e7f78b7a/app/api/plugins/route.ts +0 -75
  2280. package/.forge/worktrees/pipeline-e7f78b7a/app/api/preview/[...path]/route.ts +0 -64
  2281. package/.forge/worktrees/pipeline-e7f78b7a/app/api/preview/route.ts +0 -156
  2282. package/.forge/worktrees/pipeline-e7f78b7a/app/api/project-pipelines/route.ts +0 -91
  2283. package/.forge/worktrees/pipeline-e7f78b7a/app/api/project-sessions/route.ts +0 -61
  2284. package/.forge/worktrees/pipeline-e7f78b7a/app/api/projects/route.ts +0 -26
  2285. package/.forge/worktrees/pipeline-e7f78b7a/app/api/sessions/[id]/chat/route.ts +0 -64
  2286. package/.forge/worktrees/pipeline-e7f78b7a/app/api/sessions/[id]/messages/route.ts +0 -9
  2287. package/.forge/worktrees/pipeline-e7f78b7a/app/api/sessions/[id]/route.ts +0 -17
  2288. package/.forge/worktrees/pipeline-e7f78b7a/app/api/sessions/route.ts +0 -20
  2289. package/.forge/worktrees/pipeline-e7f78b7a/app/api/settings/route.ts +0 -64
  2290. package/.forge/worktrees/pipeline-e7f78b7a/app/api/skills/local/route.ts +0 -228
  2291. package/.forge/worktrees/pipeline-e7f78b7a/app/api/skills/route.ts +0 -182
  2292. package/.forge/worktrees/pipeline-e7f78b7a/app/api/smith-templates/route.ts +0 -81
  2293. package/.forge/worktrees/pipeline-e7f78b7a/app/api/status/route.ts +0 -12
  2294. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tabs/route.ts +0 -25
  2295. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tasks/[id]/route.ts +0 -51
  2296. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tasks/[id]/stream/route.ts +0 -77
  2297. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tasks/link/route.ts +0 -37
  2298. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tasks/route.ts +0 -44
  2299. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tasks/session/route.ts +0 -14
  2300. package/.forge/worktrees/pipeline-e7f78b7a/app/api/telegram/route.ts +0 -23
  2301. package/.forge/worktrees/pipeline-e7f78b7a/app/api/templates/route.ts +0 -6
  2302. package/.forge/worktrees/pipeline-e7f78b7a/app/api/terminal-bell/route.ts +0 -35
  2303. package/.forge/worktrees/pipeline-e7f78b7a/app/api/terminal-cwd/route.ts +0 -19
  2304. package/.forge/worktrees/pipeline-e7f78b7a/app/api/terminal-state/route.ts +0 -15
  2305. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tunnel/route.ts +0 -26
  2306. package/.forge/worktrees/pipeline-e7f78b7a/app/api/upgrade/route.ts +0 -43
  2307. package/.forge/worktrees/pipeline-e7f78b7a/app/api/usage/route.ts +0 -20
  2308. package/.forge/worktrees/pipeline-e7f78b7a/app/api/version/route.ts +0 -78
  2309. package/.forge/worktrees/pipeline-e7f78b7a/app/api/watchers/route.ts +0 -33
  2310. package/.forge/worktrees/pipeline-e7f78b7a/app/api/workspace/[id]/agents/route.ts +0 -35
  2311. package/.forge/worktrees/pipeline-e7f78b7a/app/api/workspace/[id]/memory/route.ts +0 -23
  2312. package/.forge/worktrees/pipeline-e7f78b7a/app/api/workspace/[id]/smith/route.ts +0 -22
  2313. package/.forge/worktrees/pipeline-e7f78b7a/app/api/workspace/[id]/stream/route.ts +0 -28
  2314. package/.forge/worktrees/pipeline-e7f78b7a/app/api/workspace/route.ts +0 -100
  2315. package/.forge/worktrees/pipeline-e7f78b7a/app/global-error.tsx +0 -21
  2316. package/.forge/worktrees/pipeline-e7f78b7a/app/globals.css +0 -52
  2317. package/.forge/worktrees/pipeline-e7f78b7a/app/icon.ico +0 -0
  2318. package/.forge/worktrees/pipeline-e7f78b7a/app/icon.png +0 -0
  2319. package/.forge/worktrees/pipeline-e7f78b7a/app/icon.svg +0 -106
  2320. package/.forge/worktrees/pipeline-e7f78b7a/app/layout.tsx +0 -17
  2321. package/.forge/worktrees/pipeline-e7f78b7a/app/login/LoginForm.tsx +0 -96
  2322. package/.forge/worktrees/pipeline-e7f78b7a/app/login/page.tsx +0 -10
  2323. package/.forge/worktrees/pipeline-e7f78b7a/app/mobile/page.tsx +0 -9
  2324. package/.forge/worktrees/pipeline-e7f78b7a/app/page.tsx +0 -21
  2325. package/.forge/worktrees/pipeline-e7f78b7a/bin/forge-server.mjs +0 -484
  2326. package/.forge/worktrees/pipeline-e7f78b7a/check-forge-status.sh +0 -71
  2327. package/.forge/worktrees/pipeline-e7f78b7a/cli/mw.ts +0 -579
  2328. package/.forge/worktrees/pipeline-e7f78b7a/components/BrowserPanel.tsx +0 -175
  2329. package/.forge/worktrees/pipeline-e7f78b7a/components/ChatPanel.tsx +0 -191
  2330. package/.forge/worktrees/pipeline-e7f78b7a/components/ClaudeTerminal.tsx +0 -267
  2331. package/.forge/worktrees/pipeline-e7f78b7a/components/CodeViewer.tsx +0 -787
  2332. package/.forge/worktrees/pipeline-e7f78b7a/components/ConversationEditor.tsx +0 -411
  2333. package/.forge/worktrees/pipeline-e7f78b7a/components/ConversationGraphView.tsx +0 -347
  2334. package/.forge/worktrees/pipeline-e7f78b7a/components/ConversationTerminalView.tsx +0 -303
  2335. package/.forge/worktrees/pipeline-e7f78b7a/components/Dashboard.tsx +0 -807
  2336. package/.forge/worktrees/pipeline-e7f78b7a/components/DashboardWrapper.tsx +0 -9
  2337. package/.forge/worktrees/pipeline-e7f78b7a/components/DeliveryFlowEditor.tsx +0 -491
  2338. package/.forge/worktrees/pipeline-e7f78b7a/components/DeliveryList.tsx +0 -230
  2339. package/.forge/worktrees/pipeline-e7f78b7a/components/DeliveryWorkspace.tsx +0 -589
  2340. package/.forge/worktrees/pipeline-e7f78b7a/components/DocTerminal.tsx +0 -187
  2341. package/.forge/worktrees/pipeline-e7f78b7a/components/DocsViewer.tsx +0 -574
  2342. package/.forge/worktrees/pipeline-e7f78b7a/components/HelpDialog.tsx +0 -169
  2343. package/.forge/worktrees/pipeline-e7f78b7a/components/HelpTerminal.tsx +0 -141
  2344. package/.forge/worktrees/pipeline-e7f78b7a/components/InlinePipelineView.tsx +0 -111
  2345. package/.forge/worktrees/pipeline-e7f78b7a/components/LogViewer.tsx +0 -194
  2346. package/.forge/worktrees/pipeline-e7f78b7a/components/MarkdownContent.tsx +0 -73
  2347. package/.forge/worktrees/pipeline-e7f78b7a/components/MobileView.tsx +0 -385
  2348. package/.forge/worktrees/pipeline-e7f78b7a/components/MonitorPanel.tsx +0 -122
  2349. package/.forge/worktrees/pipeline-e7f78b7a/components/NewSessionModal.tsx +0 -93
  2350. package/.forge/worktrees/pipeline-e7f78b7a/components/NewTaskModal.tsx +0 -492
  2351. package/.forge/worktrees/pipeline-e7f78b7a/components/PipelineEditor.tsx +0 -570
  2352. package/.forge/worktrees/pipeline-e7f78b7a/components/PipelineView.tsx +0 -1018
  2353. package/.forge/worktrees/pipeline-e7f78b7a/components/PluginsPanel.tsx +0 -472
  2354. package/.forge/worktrees/pipeline-e7f78b7a/components/ProjectDetail.tsx +0 -1618
  2355. package/.forge/worktrees/pipeline-e7f78b7a/components/ProjectList.tsx +0 -108
  2356. package/.forge/worktrees/pipeline-e7f78b7a/components/ProjectManager.tsx +0 -401
  2357. package/.forge/worktrees/pipeline-e7f78b7a/components/SessionList.tsx +0 -74
  2358. package/.forge/worktrees/pipeline-e7f78b7a/components/SessionView.tsx +0 -726
  2359. package/.forge/worktrees/pipeline-e7f78b7a/components/SettingsModal.tsx +0 -1647
  2360. package/.forge/worktrees/pipeline-e7f78b7a/components/SkillsPanel.tsx +0 -969
  2361. package/.forge/worktrees/pipeline-e7f78b7a/components/StatusBar.tsx +0 -99
  2362. package/.forge/worktrees/pipeline-e7f78b7a/components/TabBar.tsx +0 -46
  2363. package/.forge/worktrees/pipeline-e7f78b7a/components/TaskBoard.tsx +0 -113
  2364. package/.forge/worktrees/pipeline-e7f78b7a/components/TaskDetail.tsx +0 -372
  2365. package/.forge/worktrees/pipeline-e7f78b7a/components/TerminalLauncher.tsx +0 -398
  2366. package/.forge/worktrees/pipeline-e7f78b7a/components/TunnelToggle.tsx +0 -206
  2367. package/.forge/worktrees/pipeline-e7f78b7a/components/UsagePanel.tsx +0 -207
  2368. package/.forge/worktrees/pipeline-e7f78b7a/components/WebTerminal.tsx +0 -1683
  2369. package/.forge/worktrees/pipeline-e7f78b7a/components/WorkspaceTree.tsx +0 -221
  2370. package/.forge/worktrees/pipeline-e7f78b7a/components/WorkspaceView.tsx +0 -4048
  2371. package/.forge/worktrees/pipeline-e7f78b7a/dev-test.sh +0 -5
  2372. package/.forge/worktrees/pipeline-e7f78b7a/docs/Forge_Memory_Layer_Design.docx +0 -0
  2373. package/.forge/worktrees/pipeline-e7f78b7a/docs/Forge_Strategy_Research_2026.docx +0 -0
  2374. package/.forge/worktrees/pipeline-e7f78b7a/docs/LOCAL-DEPLOY.md +0 -144
  2375. package/.forge/worktrees/pipeline-e7f78b7a/docs/roadmap-multi-agent-workflow.md +0 -330
  2376. package/.forge/worktrees/pipeline-e7f78b7a/forge-logo.png +0 -0
  2377. package/.forge/worktrees/pipeline-e7f78b7a/forge-logo.svg +0 -106
  2378. package/.forge/worktrees/pipeline-e7f78b7a/hooks/useSidebarResize.ts +0 -52
  2379. package/.forge/worktrees/pipeline-e7f78b7a/install.sh +0 -29
  2380. package/.forge/worktrees/pipeline-e7f78b7a/instrumentation.ts +0 -35
  2381. package/.forge/worktrees/pipeline-e7f78b7a/lib/agents/claude-adapter.ts +0 -104
  2382. package/.forge/worktrees/pipeline-e7f78b7a/lib/agents/generic-adapter.ts +0 -64
  2383. package/.forge/worktrees/pipeline-e7f78b7a/lib/agents/index.ts +0 -245
  2384. package/.forge/worktrees/pipeline-e7f78b7a/lib/agents/types.ts +0 -70
  2385. package/.forge/worktrees/pipeline-e7f78b7a/lib/artifacts.ts +0 -106
  2386. package/.forge/worktrees/pipeline-e7f78b7a/lib/auth.ts +0 -62
  2387. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/docker.yaml +0 -70
  2388. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/http.yaml +0 -66
  2389. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/jenkins.yaml +0 -92
  2390. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/llm-vision.yaml +0 -85
  2391. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/playwright.yaml +0 -111
  2392. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/shell-command.yaml +0 -60
  2393. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/slack.yaml +0 -48
  2394. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/webhook.yaml +0 -56
  2395. package/.forge/worktrees/pipeline-e7f78b7a/lib/claude-process.ts +0 -352
  2396. package/.forge/worktrees/pipeline-e7f78b7a/lib/claude-sessions.ts +0 -266
  2397. package/.forge/worktrees/pipeline-e7f78b7a/lib/claude-templates.ts +0 -227
  2398. package/.forge/worktrees/pipeline-e7f78b7a/lib/cloudflared.ts +0 -424
  2399. package/.forge/worktrees/pipeline-e7f78b7a/lib/crypto.ts +0 -67
  2400. package/.forge/worktrees/pipeline-e7f78b7a/lib/delivery.ts +0 -787
  2401. package/.forge/worktrees/pipeline-e7f78b7a/lib/dirs.ts +0 -99
  2402. package/.forge/worktrees/pipeline-e7f78b7a/lib/flows.ts +0 -86
  2403. package/.forge/worktrees/pipeline-e7f78b7a/lib/forge-mcp-server.ts +0 -717
  2404. package/.forge/worktrees/pipeline-e7f78b7a/lib/forge-skills/forge-inbox.md +0 -38
  2405. package/.forge/worktrees/pipeline-e7f78b7a/lib/forge-skills/forge-send.md +0 -47
  2406. package/.forge/worktrees/pipeline-e7f78b7a/lib/forge-skills/forge-status.md +0 -32
  2407. package/.forge/worktrees/pipeline-e7f78b7a/lib/forge-skills/forge-workspace-sync.md +0 -37
  2408. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/00-overview.md +0 -40
  2409. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/01-settings.md +0 -194
  2410. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/02-telegram.md +0 -41
  2411. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/03-tunnel.md +0 -31
  2412. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/04-tasks.md +0 -52
  2413. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/05-pipelines.md +0 -460
  2414. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/06-skills.md +0 -43
  2415. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/07-projects.md +0 -73
  2416. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/08-rules.md +0 -53
  2417. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/09-issue-autofix.md +0 -55
  2418. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/10-troubleshooting.md +0 -89
  2419. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/11-workspace.md +0 -810
  2420. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/CLAUDE.md +0 -62
  2421. package/.forge/worktrees/pipeline-e7f78b7a/lib/init.ts +0 -266
  2422. package/.forge/worktrees/pipeline-e7f78b7a/lib/issue-scanner.ts +0 -298
  2423. package/.forge/worktrees/pipeline-e7f78b7a/lib/logger.ts +0 -79
  2424. package/.forge/worktrees/pipeline-e7f78b7a/lib/notifications.ts +0 -75
  2425. package/.forge/worktrees/pipeline-e7f78b7a/lib/notify.ts +0 -108
  2426. package/.forge/worktrees/pipeline-e7f78b7a/lib/password.ts +0 -97
  2427. package/.forge/worktrees/pipeline-e7f78b7a/lib/pipeline-scheduler.ts +0 -373
  2428. package/.forge/worktrees/pipeline-e7f78b7a/lib/pipeline.ts +0 -1441
  2429. package/.forge/worktrees/pipeline-e7f78b7a/lib/plugins/executor.ts +0 -347
  2430. package/.forge/worktrees/pipeline-e7f78b7a/lib/plugins/registry.ts +0 -228
  2431. package/.forge/worktrees/pipeline-e7f78b7a/lib/plugins/types.ts +0 -103
  2432. package/.forge/worktrees/pipeline-e7f78b7a/lib/project-sessions.ts +0 -53
  2433. package/.forge/worktrees/pipeline-e7f78b7a/lib/projects.ts +0 -86
  2434. package/.forge/worktrees/pipeline-e7f78b7a/lib/session-manager.ts +0 -156
  2435. package/.forge/worktrees/pipeline-e7f78b7a/lib/session-utils.ts +0 -53
  2436. package/.forge/worktrees/pipeline-e7f78b7a/lib/session-watcher.ts +0 -345
  2437. package/.forge/worktrees/pipeline-e7f78b7a/lib/settings.ts +0 -195
  2438. package/.forge/worktrees/pipeline-e7f78b7a/lib/skills.ts +0 -458
  2439. package/.forge/worktrees/pipeline-e7f78b7a/lib/task-manager.ts +0 -949
  2440. package/.forge/worktrees/pipeline-e7f78b7a/lib/telegram-bot.ts +0 -1477
  2441. package/.forge/worktrees/pipeline-e7f78b7a/lib/telegram-standalone.ts +0 -83
  2442. package/.forge/worktrees/pipeline-e7f78b7a/lib/terminal-server.ts +0 -70
  2443. package/.forge/worktrees/pipeline-e7f78b7a/lib/terminal-standalone.ts +0 -421
  2444. package/.forge/worktrees/pipeline-e7f78b7a/lib/usage-scanner.ts +0 -249
  2445. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/__tests__/state-machine.test.ts +0 -388
  2446. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/__tests__/workspace.test.ts +0 -311
  2447. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/agent-bus.ts +0 -416
  2448. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/agent-worker.ts +0 -655
  2449. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/backends/api-backend.ts +0 -262
  2450. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/backends/cli-backend.ts +0 -491
  2451. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/index.ts +0 -82
  2452. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/manager.ts +0 -136
  2453. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/orchestrator.ts +0 -3400
  2454. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/persistence.ts +0 -309
  2455. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/presets.ts +0 -649
  2456. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/requests.ts +0 -287
  2457. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/session-monitor.ts +0 -240
  2458. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/skill-installer.ts +0 -275
  2459. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/smith-memory.ts +0 -498
  2460. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/types.ts +0 -241
  2461. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/watch-manager.ts +0 -560
  2462. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace-standalone.ts +0 -911
  2463. package/.forge/worktrees/pipeline-e7f78b7a/middleware.ts +0 -51
  2464. package/.forge/worktrees/pipeline-e7f78b7a/next.config.ts +0 -26
  2465. package/.forge/worktrees/pipeline-e7f78b7a/package.json +0 -74
  2466. package/.forge/worktrees/pipeline-e7f78b7a/pnpm-lock.yaml +0 -3719
  2467. package/.forge/worktrees/pipeline-e7f78b7a/pnpm-workspace.yaml +0 -1
  2468. package/.forge/worktrees/pipeline-e7f78b7a/postcss.config.mjs +0 -7
  2469. package/.forge/worktrees/pipeline-e7f78b7a/publish.sh +0 -133
  2470. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/README.md +0 -66
  2471. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/results/.gitignore +0 -2
  2472. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/run.ts +0 -635
  2473. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/01-text-utils/task.md +0 -26
  2474. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  2475. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  2476. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/02-pagination/task.md +0 -48
  2477. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  2478. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  2479. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  2480. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  2481. package/.forge/worktrees/pipeline-e7f78b7a/scripts/verify-usage.ts +0 -178
  2482. package/.forge/worktrees/pipeline-e7f78b7a/src/config/index.ts +0 -129
  2483. package/.forge/worktrees/pipeline-e7f78b7a/src/core/db/database.ts +0 -259
  2484. package/.forge/worktrees/pipeline-e7f78b7a/src/core/memory/strategy.ts +0 -32
  2485. package/.forge/worktrees/pipeline-e7f78b7a/src/core/providers/chat.ts +0 -65
  2486. package/.forge/worktrees/pipeline-e7f78b7a/src/core/providers/registry.ts +0 -60
  2487. package/.forge/worktrees/pipeline-e7f78b7a/src/core/session/manager.ts +0 -190
  2488. package/.forge/worktrees/pipeline-e7f78b7a/src/types/index.ts +0 -129
  2489. package/.forge/worktrees/pipeline-e7f78b7a/start.sh +0 -31
  2490. package/.forge/worktrees/pipeline-e7f78b7a/templates/smith-lead.json +0 -45
  2491. package/.forge/worktrees/pipeline-e7f78b7a/tsconfig.json +0 -42
  2492. package/.forge/worktrees/pipeline-e97c13c7/CLAUDE.md +0 -86
  2493. package/.forge/worktrees/pipeline-e97c13c7/README.md +0 -136
  2494. package/.forge/worktrees/pipeline-e97c13c7/RELEASE_NOTES.md +0 -11
  2495. package/.forge/worktrees/pipeline-e97c13c7/app/api/agents/route.ts +0 -17
  2496. package/.forge/worktrees/pipeline-e97c13c7/app/api/auth/[...nextauth]/route.ts +0 -3
  2497. package/.forge/worktrees/pipeline-e97c13c7/app/api/auth/verify/route.ts +0 -46
  2498. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude/[id]/route.ts +0 -31
  2499. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude/[id]/stream/route.ts +0 -63
  2500. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude/route.ts +0 -28
  2501. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  2502. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  2503. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude-sessions/[projectName]/route.ts +0 -37
  2504. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude-sessions/sync/route.ts +0 -17
  2505. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude-templates/route.ts +0 -145
  2506. package/.forge/worktrees/pipeline-e97c13c7/app/api/code/route.ts +0 -299
  2507. package/.forge/worktrees/pipeline-e97c13c7/app/api/delivery/[id]/route.ts +0 -62
  2508. package/.forge/worktrees/pipeline-e97c13c7/app/api/delivery/route.ts +0 -40
  2509. package/.forge/worktrees/pipeline-e97c13c7/app/api/detect-cli/route.ts +0 -46
  2510. package/.forge/worktrees/pipeline-e97c13c7/app/api/docs/route.ts +0 -176
  2511. package/.forge/worktrees/pipeline-e97c13c7/app/api/docs/sessions/route.ts +0 -54
  2512. package/.forge/worktrees/pipeline-e97c13c7/app/api/favorites/route.ts +0 -26
  2513. package/.forge/worktrees/pipeline-e97c13c7/app/api/flows/route.ts +0 -6
  2514. package/.forge/worktrees/pipeline-e97c13c7/app/api/flows/run/route.ts +0 -19
  2515. package/.forge/worktrees/pipeline-e97c13c7/app/api/git/route.ts +0 -149
  2516. package/.forge/worktrees/pipeline-e97c13c7/app/api/help/route.ts +0 -84
  2517. package/.forge/worktrees/pipeline-e97c13c7/app/api/issue-scanner/route.ts +0 -116
  2518. package/.forge/worktrees/pipeline-e97c13c7/app/api/logs/route.ts +0 -100
  2519. package/.forge/worktrees/pipeline-e97c13c7/app/api/mobile-chat/route.ts +0 -115
  2520. package/.forge/worktrees/pipeline-e97c13c7/app/api/monitor/route.ts +0 -74
  2521. package/.forge/worktrees/pipeline-e97c13c7/app/api/notifications/route.ts +0 -42
  2522. package/.forge/worktrees/pipeline-e97c13c7/app/api/notify/test/route.ts +0 -33
  2523. package/.forge/worktrees/pipeline-e97c13c7/app/api/online/route.ts +0 -40
  2524. package/.forge/worktrees/pipeline-e97c13c7/app/api/pipelines/[id]/route.ts +0 -41
  2525. package/.forge/worktrees/pipeline-e97c13c7/app/api/pipelines/route.ts +0 -90
  2526. package/.forge/worktrees/pipeline-e97c13c7/app/api/plugins/route.ts +0 -75
  2527. package/.forge/worktrees/pipeline-e97c13c7/app/api/preview/[...path]/route.ts +0 -64
  2528. package/.forge/worktrees/pipeline-e97c13c7/app/api/preview/route.ts +0 -156
  2529. package/.forge/worktrees/pipeline-e97c13c7/app/api/project-pipelines/route.ts +0 -91
  2530. package/.forge/worktrees/pipeline-e97c13c7/app/api/project-sessions/route.ts +0 -61
  2531. package/.forge/worktrees/pipeline-e97c13c7/app/api/projects/route.ts +0 -26
  2532. package/.forge/worktrees/pipeline-e97c13c7/app/api/sessions/[id]/chat/route.ts +0 -64
  2533. package/.forge/worktrees/pipeline-e97c13c7/app/api/sessions/[id]/messages/route.ts +0 -9
  2534. package/.forge/worktrees/pipeline-e97c13c7/app/api/sessions/[id]/route.ts +0 -17
  2535. package/.forge/worktrees/pipeline-e97c13c7/app/api/sessions/route.ts +0 -20
  2536. package/.forge/worktrees/pipeline-e97c13c7/app/api/settings/route.ts +0 -64
  2537. package/.forge/worktrees/pipeline-e97c13c7/app/api/skills/local/route.ts +0 -228
  2538. package/.forge/worktrees/pipeline-e97c13c7/app/api/skills/route.ts +0 -182
  2539. package/.forge/worktrees/pipeline-e97c13c7/app/api/smith-templates/route.ts +0 -81
  2540. package/.forge/worktrees/pipeline-e97c13c7/app/api/status/route.ts +0 -12
  2541. package/.forge/worktrees/pipeline-e97c13c7/app/api/tabs/route.ts +0 -25
  2542. package/.forge/worktrees/pipeline-e97c13c7/app/api/tasks/[id]/route.ts +0 -51
  2543. package/.forge/worktrees/pipeline-e97c13c7/app/api/tasks/[id]/stream/route.ts +0 -77
  2544. package/.forge/worktrees/pipeline-e97c13c7/app/api/tasks/link/route.ts +0 -37
  2545. package/.forge/worktrees/pipeline-e97c13c7/app/api/tasks/route.ts +0 -44
  2546. package/.forge/worktrees/pipeline-e97c13c7/app/api/tasks/session/route.ts +0 -14
  2547. package/.forge/worktrees/pipeline-e97c13c7/app/api/telegram/route.ts +0 -23
  2548. package/.forge/worktrees/pipeline-e97c13c7/app/api/templates/route.ts +0 -6
  2549. package/.forge/worktrees/pipeline-e97c13c7/app/api/terminal-bell/route.ts +0 -35
  2550. package/.forge/worktrees/pipeline-e97c13c7/app/api/terminal-cwd/route.ts +0 -19
  2551. package/.forge/worktrees/pipeline-e97c13c7/app/api/terminal-state/route.ts +0 -15
  2552. package/.forge/worktrees/pipeline-e97c13c7/app/api/tunnel/route.ts +0 -26
  2553. package/.forge/worktrees/pipeline-e97c13c7/app/api/upgrade/route.ts +0 -43
  2554. package/.forge/worktrees/pipeline-e97c13c7/app/api/usage/route.ts +0 -20
  2555. package/.forge/worktrees/pipeline-e97c13c7/app/api/version/route.ts +0 -78
  2556. package/.forge/worktrees/pipeline-e97c13c7/app/api/watchers/route.ts +0 -33
  2557. package/.forge/worktrees/pipeline-e97c13c7/app/api/workspace/[id]/agents/route.ts +0 -35
  2558. package/.forge/worktrees/pipeline-e97c13c7/app/api/workspace/[id]/memory/route.ts +0 -23
  2559. package/.forge/worktrees/pipeline-e97c13c7/app/api/workspace/[id]/smith/route.ts +0 -22
  2560. package/.forge/worktrees/pipeline-e97c13c7/app/api/workspace/[id]/stream/route.ts +0 -28
  2561. package/.forge/worktrees/pipeline-e97c13c7/app/api/workspace/route.ts +0 -100
  2562. package/.forge/worktrees/pipeline-e97c13c7/app/global-error.tsx +0 -21
  2563. package/.forge/worktrees/pipeline-e97c13c7/app/globals.css +0 -52
  2564. package/.forge/worktrees/pipeline-e97c13c7/app/icon.ico +0 -0
  2565. package/.forge/worktrees/pipeline-e97c13c7/app/icon.png +0 -0
  2566. package/.forge/worktrees/pipeline-e97c13c7/app/icon.svg +0 -106
  2567. package/.forge/worktrees/pipeline-e97c13c7/app/layout.tsx +0 -17
  2568. package/.forge/worktrees/pipeline-e97c13c7/app/login/LoginForm.tsx +0 -96
  2569. package/.forge/worktrees/pipeline-e97c13c7/app/login/page.tsx +0 -10
  2570. package/.forge/worktrees/pipeline-e97c13c7/app/mobile/page.tsx +0 -9
  2571. package/.forge/worktrees/pipeline-e97c13c7/app/page.tsx +0 -21
  2572. package/.forge/worktrees/pipeline-e97c13c7/bin/forge-server.mjs +0 -484
  2573. package/.forge/worktrees/pipeline-e97c13c7/check-forge-status.sh +0 -71
  2574. package/.forge/worktrees/pipeline-e97c13c7/cli/mw.ts +0 -579
  2575. package/.forge/worktrees/pipeline-e97c13c7/components/BrowserPanel.tsx +0 -175
  2576. package/.forge/worktrees/pipeline-e97c13c7/components/ChatPanel.tsx +0 -191
  2577. package/.forge/worktrees/pipeline-e97c13c7/components/ClaudeTerminal.tsx +0 -267
  2578. package/.forge/worktrees/pipeline-e97c13c7/components/CodeViewer.tsx +0 -787
  2579. package/.forge/worktrees/pipeline-e97c13c7/components/ConversationEditor.tsx +0 -411
  2580. package/.forge/worktrees/pipeline-e97c13c7/components/ConversationGraphView.tsx +0 -347
  2581. package/.forge/worktrees/pipeline-e97c13c7/components/ConversationTerminalView.tsx +0 -303
  2582. package/.forge/worktrees/pipeline-e97c13c7/components/Dashboard.tsx +0 -807
  2583. package/.forge/worktrees/pipeline-e97c13c7/components/DashboardWrapper.tsx +0 -9
  2584. package/.forge/worktrees/pipeline-e97c13c7/components/DeliveryFlowEditor.tsx +0 -491
  2585. package/.forge/worktrees/pipeline-e97c13c7/components/DeliveryList.tsx +0 -230
  2586. package/.forge/worktrees/pipeline-e97c13c7/components/DeliveryWorkspace.tsx +0 -589
  2587. package/.forge/worktrees/pipeline-e97c13c7/components/DocTerminal.tsx +0 -187
  2588. package/.forge/worktrees/pipeline-e97c13c7/components/DocsViewer.tsx +0 -574
  2589. package/.forge/worktrees/pipeline-e97c13c7/components/HelpDialog.tsx +0 -169
  2590. package/.forge/worktrees/pipeline-e97c13c7/components/HelpTerminal.tsx +0 -141
  2591. package/.forge/worktrees/pipeline-e97c13c7/components/InlinePipelineView.tsx +0 -111
  2592. package/.forge/worktrees/pipeline-e97c13c7/components/LogViewer.tsx +0 -194
  2593. package/.forge/worktrees/pipeline-e97c13c7/components/MarkdownContent.tsx +0 -73
  2594. package/.forge/worktrees/pipeline-e97c13c7/components/MobileView.tsx +0 -385
  2595. package/.forge/worktrees/pipeline-e97c13c7/components/MonitorPanel.tsx +0 -122
  2596. package/.forge/worktrees/pipeline-e97c13c7/components/NewSessionModal.tsx +0 -93
  2597. package/.forge/worktrees/pipeline-e97c13c7/components/NewTaskModal.tsx +0 -492
  2598. package/.forge/worktrees/pipeline-e97c13c7/components/PipelineEditor.tsx +0 -570
  2599. package/.forge/worktrees/pipeline-e97c13c7/components/PipelineView.tsx +0 -1018
  2600. package/.forge/worktrees/pipeline-e97c13c7/components/PluginsPanel.tsx +0 -472
  2601. package/.forge/worktrees/pipeline-e97c13c7/components/ProjectDetail.tsx +0 -1618
  2602. package/.forge/worktrees/pipeline-e97c13c7/components/ProjectList.tsx +0 -108
  2603. package/.forge/worktrees/pipeline-e97c13c7/components/ProjectManager.tsx +0 -401
  2604. package/.forge/worktrees/pipeline-e97c13c7/components/SessionList.tsx +0 -74
  2605. package/.forge/worktrees/pipeline-e97c13c7/components/SessionView.tsx +0 -726
  2606. package/.forge/worktrees/pipeline-e97c13c7/components/SettingsModal.tsx +0 -1647
  2607. package/.forge/worktrees/pipeline-e97c13c7/components/SkillsPanel.tsx +0 -969
  2608. package/.forge/worktrees/pipeline-e97c13c7/components/StatusBar.tsx +0 -99
  2609. package/.forge/worktrees/pipeline-e97c13c7/components/TabBar.tsx +0 -46
  2610. package/.forge/worktrees/pipeline-e97c13c7/components/TaskBoard.tsx +0 -113
  2611. package/.forge/worktrees/pipeline-e97c13c7/components/TaskDetail.tsx +0 -372
  2612. package/.forge/worktrees/pipeline-e97c13c7/components/TerminalLauncher.tsx +0 -398
  2613. package/.forge/worktrees/pipeline-e97c13c7/components/TunnelToggle.tsx +0 -206
  2614. package/.forge/worktrees/pipeline-e97c13c7/components/UsagePanel.tsx +0 -207
  2615. package/.forge/worktrees/pipeline-e97c13c7/components/WebTerminal.tsx +0 -1683
  2616. package/.forge/worktrees/pipeline-e97c13c7/components/WorkspaceTree.tsx +0 -221
  2617. package/.forge/worktrees/pipeline-e97c13c7/components/WorkspaceView.tsx +0 -4048
  2618. package/.forge/worktrees/pipeline-e97c13c7/dev-test.sh +0 -5
  2619. package/.forge/worktrees/pipeline-e97c13c7/docs/Forge_Memory_Layer_Design.docx +0 -0
  2620. package/.forge/worktrees/pipeline-e97c13c7/docs/Forge_Strategy_Research_2026.docx +0 -0
  2621. package/.forge/worktrees/pipeline-e97c13c7/docs/LOCAL-DEPLOY.md +0 -144
  2622. package/.forge/worktrees/pipeline-e97c13c7/docs/roadmap-multi-agent-workflow.md +0 -330
  2623. package/.forge/worktrees/pipeline-e97c13c7/forge-logo.png +0 -0
  2624. package/.forge/worktrees/pipeline-e97c13c7/forge-logo.svg +0 -106
  2625. package/.forge/worktrees/pipeline-e97c13c7/hooks/useSidebarResize.ts +0 -52
  2626. package/.forge/worktrees/pipeline-e97c13c7/install.sh +0 -29
  2627. package/.forge/worktrees/pipeline-e97c13c7/instrumentation.ts +0 -35
  2628. package/.forge/worktrees/pipeline-e97c13c7/lib/agents/claude-adapter.ts +0 -104
  2629. package/.forge/worktrees/pipeline-e97c13c7/lib/agents/generic-adapter.ts +0 -64
  2630. package/.forge/worktrees/pipeline-e97c13c7/lib/agents/index.ts +0 -245
  2631. package/.forge/worktrees/pipeline-e97c13c7/lib/agents/types.ts +0 -70
  2632. package/.forge/worktrees/pipeline-e97c13c7/lib/artifacts.ts +0 -106
  2633. package/.forge/worktrees/pipeline-e97c13c7/lib/auth.ts +0 -62
  2634. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/docker.yaml +0 -70
  2635. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/http.yaml +0 -66
  2636. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/jenkins.yaml +0 -92
  2637. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/llm-vision.yaml +0 -85
  2638. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/playwright.yaml +0 -111
  2639. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/shell-command.yaml +0 -60
  2640. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/slack.yaml +0 -48
  2641. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/webhook.yaml +0 -56
  2642. package/.forge/worktrees/pipeline-e97c13c7/lib/claude-process.ts +0 -352
  2643. package/.forge/worktrees/pipeline-e97c13c7/lib/claude-sessions.ts +0 -266
  2644. package/.forge/worktrees/pipeline-e97c13c7/lib/claude-templates.ts +0 -227
  2645. package/.forge/worktrees/pipeline-e97c13c7/lib/cloudflared.ts +0 -424
  2646. package/.forge/worktrees/pipeline-e97c13c7/lib/crypto.ts +0 -67
  2647. package/.forge/worktrees/pipeline-e97c13c7/lib/delivery.ts +0 -787
  2648. package/.forge/worktrees/pipeline-e97c13c7/lib/dirs.ts +0 -99
  2649. package/.forge/worktrees/pipeline-e97c13c7/lib/flows.ts +0 -86
  2650. package/.forge/worktrees/pipeline-e97c13c7/lib/forge-mcp-server.ts +0 -717
  2651. package/.forge/worktrees/pipeline-e97c13c7/lib/forge-skills/forge-inbox.md +0 -38
  2652. package/.forge/worktrees/pipeline-e97c13c7/lib/forge-skills/forge-send.md +0 -47
  2653. package/.forge/worktrees/pipeline-e97c13c7/lib/forge-skills/forge-status.md +0 -32
  2654. package/.forge/worktrees/pipeline-e97c13c7/lib/forge-skills/forge-workspace-sync.md +0 -37
  2655. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/00-overview.md +0 -40
  2656. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/01-settings.md +0 -194
  2657. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/02-telegram.md +0 -41
  2658. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/03-tunnel.md +0 -31
  2659. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/04-tasks.md +0 -52
  2660. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/05-pipelines.md +0 -460
  2661. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/06-skills.md +0 -43
  2662. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/07-projects.md +0 -73
  2663. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/08-rules.md +0 -53
  2664. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/09-issue-autofix.md +0 -55
  2665. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/10-troubleshooting.md +0 -89
  2666. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/11-workspace.md +0 -810
  2667. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/CLAUDE.md +0 -62
  2668. package/.forge/worktrees/pipeline-e97c13c7/lib/init.ts +0 -266
  2669. package/.forge/worktrees/pipeline-e97c13c7/lib/issue-scanner.ts +0 -298
  2670. package/.forge/worktrees/pipeline-e97c13c7/lib/logger.ts +0 -79
  2671. package/.forge/worktrees/pipeline-e97c13c7/lib/notifications.ts +0 -75
  2672. package/.forge/worktrees/pipeline-e97c13c7/lib/notify.ts +0 -108
  2673. package/.forge/worktrees/pipeline-e97c13c7/lib/password.ts +0 -97
  2674. package/.forge/worktrees/pipeline-e97c13c7/lib/pipeline-scheduler.ts +0 -373
  2675. package/.forge/worktrees/pipeline-e97c13c7/lib/pipeline.ts +0 -1438
  2676. package/.forge/worktrees/pipeline-e97c13c7/lib/plugins/executor.ts +0 -347
  2677. package/.forge/worktrees/pipeline-e97c13c7/lib/plugins/registry.ts +0 -228
  2678. package/.forge/worktrees/pipeline-e97c13c7/lib/plugins/types.ts +0 -103
  2679. package/.forge/worktrees/pipeline-e97c13c7/lib/project-sessions.ts +0 -53
  2680. package/.forge/worktrees/pipeline-e97c13c7/lib/projects.ts +0 -86
  2681. package/.forge/worktrees/pipeline-e97c13c7/lib/session-manager.ts +0 -156
  2682. package/.forge/worktrees/pipeline-e97c13c7/lib/session-utils.ts +0 -53
  2683. package/.forge/worktrees/pipeline-e97c13c7/lib/session-watcher.ts +0 -345
  2684. package/.forge/worktrees/pipeline-e97c13c7/lib/settings.ts +0 -195
  2685. package/.forge/worktrees/pipeline-e97c13c7/lib/skills.ts +0 -458
  2686. package/.forge/worktrees/pipeline-e97c13c7/lib/task-manager.ts +0 -949
  2687. package/.forge/worktrees/pipeline-e97c13c7/lib/telegram-bot.ts +0 -1477
  2688. package/.forge/worktrees/pipeline-e97c13c7/lib/telegram-standalone.ts +0 -83
  2689. package/.forge/worktrees/pipeline-e97c13c7/lib/terminal-server.ts +0 -70
  2690. package/.forge/worktrees/pipeline-e97c13c7/lib/terminal-standalone.ts +0 -421
  2691. package/.forge/worktrees/pipeline-e97c13c7/lib/usage-scanner.ts +0 -249
  2692. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/__tests__/state-machine.test.ts +0 -388
  2693. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/__tests__/workspace.test.ts +0 -311
  2694. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/agent-bus.ts +0 -416
  2695. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/agent-worker.ts +0 -655
  2696. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/backends/api-backend.ts +0 -262
  2697. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/backends/cli-backend.ts +0 -491
  2698. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/index.ts +0 -82
  2699. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/manager.ts +0 -136
  2700. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/orchestrator.ts +0 -3400
  2701. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/persistence.ts +0 -309
  2702. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/presets.ts +0 -649
  2703. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/requests.ts +0 -287
  2704. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/session-monitor.ts +0 -240
  2705. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/skill-installer.ts +0 -275
  2706. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/smith-memory.ts +0 -498
  2707. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/types.ts +0 -241
  2708. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/watch-manager.ts +0 -560
  2709. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace-standalone.ts +0 -911
  2710. package/.forge/worktrees/pipeline-e97c13c7/middleware.ts +0 -51
  2711. package/.forge/worktrees/pipeline-e97c13c7/next.config.ts +0 -26
  2712. package/.forge/worktrees/pipeline-e97c13c7/package.json +0 -74
  2713. package/.forge/worktrees/pipeline-e97c13c7/pnpm-lock.yaml +0 -3719
  2714. package/.forge/worktrees/pipeline-e97c13c7/pnpm-workspace.yaml +0 -1
  2715. package/.forge/worktrees/pipeline-e97c13c7/postcss.config.mjs +0 -7
  2716. package/.forge/worktrees/pipeline-e97c13c7/publish.sh +0 -133
  2717. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/README.md +0 -66
  2718. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/results/.gitignore +0 -2
  2719. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/run.ts +0 -635
  2720. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/01-text-utils/task.md +0 -26
  2721. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  2722. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  2723. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/02-pagination/task.md +0 -48
  2724. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  2725. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  2726. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  2727. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  2728. package/.forge/worktrees/pipeline-e97c13c7/scripts/verify-usage.ts +0 -178
  2729. package/.forge/worktrees/pipeline-e97c13c7/src/config/index.ts +0 -129
  2730. package/.forge/worktrees/pipeline-e97c13c7/src/core/db/database.ts +0 -259
  2731. package/.forge/worktrees/pipeline-e97c13c7/src/core/memory/strategy.ts +0 -32
  2732. package/.forge/worktrees/pipeline-e97c13c7/src/core/providers/chat.ts +0 -65
  2733. package/.forge/worktrees/pipeline-e97c13c7/src/core/providers/registry.ts +0 -60
  2734. package/.forge/worktrees/pipeline-e97c13c7/src/core/session/manager.ts +0 -190
  2735. package/.forge/worktrees/pipeline-e97c13c7/src/types/index.ts +0 -129
  2736. package/.forge/worktrees/pipeline-e97c13c7/start.sh +0 -31
  2737. package/.forge/worktrees/pipeline-e97c13c7/templates/smith-lead.json +0 -45
  2738. package/.forge/worktrees/pipeline-e97c13c7/tsconfig.json +0 -42
  2739. package/.forge/worktrees/pipeline-ecd7cb0f/CLAUDE.md +0 -86
  2740. package/.forge/worktrees/pipeline-ecd7cb0f/README.md +0 -136
  2741. package/.forge/worktrees/pipeline-ecd7cb0f/RELEASE_NOTES.md +0 -11
  2742. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/agents/route.ts +0 -17
  2743. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/auth/[...nextauth]/route.ts +0 -3
  2744. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/auth/verify/route.ts +0 -46
  2745. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude/[id]/route.ts +0 -31
  2746. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude/[id]/stream/route.ts +0 -63
  2747. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude/route.ts +0 -28
  2748. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  2749. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  2750. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude-sessions/[projectName]/route.ts +0 -37
  2751. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude-sessions/sync/route.ts +0 -17
  2752. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude-templates/route.ts +0 -145
  2753. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/code/route.ts +0 -299
  2754. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/delivery/[id]/route.ts +0 -62
  2755. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/delivery/route.ts +0 -40
  2756. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/detect-cli/route.ts +0 -46
  2757. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/docs/route.ts +0 -176
  2758. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/docs/sessions/route.ts +0 -54
  2759. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/favorites/route.ts +0 -26
  2760. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/flows/route.ts +0 -6
  2761. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/flows/run/route.ts +0 -19
  2762. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/git/route.ts +0 -149
  2763. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/help/route.ts +0 -84
  2764. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/issue-scanner/route.ts +0 -116
  2765. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/logs/route.ts +0 -100
  2766. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/mobile-chat/route.ts +0 -115
  2767. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/monitor/route.ts +0 -74
  2768. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/notifications/route.ts +0 -42
  2769. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/notify/test/route.ts +0 -33
  2770. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/online/route.ts +0 -40
  2771. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/pipelines/[id]/route.ts +0 -41
  2772. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/pipelines/route.ts +0 -90
  2773. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/plugins/route.ts +0 -75
  2774. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/preview/[...path]/route.ts +0 -64
  2775. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/preview/route.ts +0 -156
  2776. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/project-pipelines/route.ts +0 -91
  2777. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/project-sessions/route.ts +0 -61
  2778. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/projects/route.ts +0 -26
  2779. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/sessions/[id]/chat/route.ts +0 -64
  2780. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/sessions/[id]/messages/route.ts +0 -9
  2781. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/sessions/[id]/route.ts +0 -17
  2782. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/sessions/route.ts +0 -20
  2783. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/settings/route.ts +0 -64
  2784. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/skills/local/route.ts +0 -228
  2785. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/skills/route.ts +0 -182
  2786. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/smith-templates/route.ts +0 -81
  2787. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/status/route.ts +0 -12
  2788. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tabs/route.ts +0 -25
  2789. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tasks/[id]/route.ts +0 -51
  2790. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tasks/[id]/stream/route.ts +0 -77
  2791. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tasks/link/route.ts +0 -37
  2792. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tasks/route.ts +0 -44
  2793. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tasks/session/route.ts +0 -14
  2794. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/telegram/route.ts +0 -23
  2795. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/templates/route.ts +0 -6
  2796. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/terminal-bell/route.ts +0 -35
  2797. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/terminal-cwd/route.ts +0 -19
  2798. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/terminal-state/route.ts +0 -15
  2799. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tunnel/route.ts +0 -26
  2800. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/upgrade/route.ts +0 -43
  2801. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/usage/route.ts +0 -20
  2802. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/version/route.ts +0 -78
  2803. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/watchers/route.ts +0 -33
  2804. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/workspace/[id]/agents/route.ts +0 -35
  2805. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/workspace/[id]/memory/route.ts +0 -23
  2806. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/workspace/[id]/smith/route.ts +0 -22
  2807. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/workspace/[id]/stream/route.ts +0 -28
  2808. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/workspace/route.ts +0 -100
  2809. package/.forge/worktrees/pipeline-ecd7cb0f/app/global-error.tsx +0 -21
  2810. package/.forge/worktrees/pipeline-ecd7cb0f/app/globals.css +0 -52
  2811. package/.forge/worktrees/pipeline-ecd7cb0f/app/icon.ico +0 -0
  2812. package/.forge/worktrees/pipeline-ecd7cb0f/app/icon.png +0 -0
  2813. package/.forge/worktrees/pipeline-ecd7cb0f/app/icon.svg +0 -106
  2814. package/.forge/worktrees/pipeline-ecd7cb0f/app/layout.tsx +0 -17
  2815. package/.forge/worktrees/pipeline-ecd7cb0f/app/login/LoginForm.tsx +0 -96
  2816. package/.forge/worktrees/pipeline-ecd7cb0f/app/login/page.tsx +0 -10
  2817. package/.forge/worktrees/pipeline-ecd7cb0f/app/mobile/page.tsx +0 -9
  2818. package/.forge/worktrees/pipeline-ecd7cb0f/app/page.tsx +0 -21
  2819. package/.forge/worktrees/pipeline-ecd7cb0f/bin/forge-server.mjs +0 -484
  2820. package/.forge/worktrees/pipeline-ecd7cb0f/check-forge-status.sh +0 -71
  2821. package/.forge/worktrees/pipeline-ecd7cb0f/cli/mw.ts +0 -579
  2822. package/.forge/worktrees/pipeline-ecd7cb0f/components/BrowserPanel.tsx +0 -175
  2823. package/.forge/worktrees/pipeline-ecd7cb0f/components/ChatPanel.tsx +0 -191
  2824. package/.forge/worktrees/pipeline-ecd7cb0f/components/ClaudeTerminal.tsx +0 -267
  2825. package/.forge/worktrees/pipeline-ecd7cb0f/components/CodeViewer.tsx +0 -787
  2826. package/.forge/worktrees/pipeline-ecd7cb0f/components/ConversationEditor.tsx +0 -411
  2827. package/.forge/worktrees/pipeline-ecd7cb0f/components/ConversationGraphView.tsx +0 -347
  2828. package/.forge/worktrees/pipeline-ecd7cb0f/components/ConversationTerminalView.tsx +0 -303
  2829. package/.forge/worktrees/pipeline-ecd7cb0f/components/Dashboard.tsx +0 -807
  2830. package/.forge/worktrees/pipeline-ecd7cb0f/components/DashboardWrapper.tsx +0 -9
  2831. package/.forge/worktrees/pipeline-ecd7cb0f/components/DeliveryFlowEditor.tsx +0 -491
  2832. package/.forge/worktrees/pipeline-ecd7cb0f/components/DeliveryList.tsx +0 -230
  2833. package/.forge/worktrees/pipeline-ecd7cb0f/components/DeliveryWorkspace.tsx +0 -589
  2834. package/.forge/worktrees/pipeline-ecd7cb0f/components/DocTerminal.tsx +0 -187
  2835. package/.forge/worktrees/pipeline-ecd7cb0f/components/DocsViewer.tsx +0 -574
  2836. package/.forge/worktrees/pipeline-ecd7cb0f/components/HelpDialog.tsx +0 -169
  2837. package/.forge/worktrees/pipeline-ecd7cb0f/components/HelpTerminal.tsx +0 -141
  2838. package/.forge/worktrees/pipeline-ecd7cb0f/components/InlinePipelineView.tsx +0 -111
  2839. package/.forge/worktrees/pipeline-ecd7cb0f/components/LogViewer.tsx +0 -194
  2840. package/.forge/worktrees/pipeline-ecd7cb0f/components/MarkdownContent.tsx +0 -73
  2841. package/.forge/worktrees/pipeline-ecd7cb0f/components/MobileView.tsx +0 -385
  2842. package/.forge/worktrees/pipeline-ecd7cb0f/components/MonitorPanel.tsx +0 -122
  2843. package/.forge/worktrees/pipeline-ecd7cb0f/components/NewSessionModal.tsx +0 -93
  2844. package/.forge/worktrees/pipeline-ecd7cb0f/components/NewTaskModal.tsx +0 -492
  2845. package/.forge/worktrees/pipeline-ecd7cb0f/components/PipelineEditor.tsx +0 -570
  2846. package/.forge/worktrees/pipeline-ecd7cb0f/components/PipelineView.tsx +0 -1018
  2847. package/.forge/worktrees/pipeline-ecd7cb0f/components/PluginsPanel.tsx +0 -472
  2848. package/.forge/worktrees/pipeline-ecd7cb0f/components/ProjectDetail.tsx +0 -1618
  2849. package/.forge/worktrees/pipeline-ecd7cb0f/components/ProjectList.tsx +0 -108
  2850. package/.forge/worktrees/pipeline-ecd7cb0f/components/ProjectManager.tsx +0 -401
  2851. package/.forge/worktrees/pipeline-ecd7cb0f/components/SessionList.tsx +0 -74
  2852. package/.forge/worktrees/pipeline-ecd7cb0f/components/SessionView.tsx +0 -726
  2853. package/.forge/worktrees/pipeline-ecd7cb0f/components/SettingsModal.tsx +0 -1647
  2854. package/.forge/worktrees/pipeline-ecd7cb0f/components/SkillsPanel.tsx +0 -969
  2855. package/.forge/worktrees/pipeline-ecd7cb0f/components/StatusBar.tsx +0 -99
  2856. package/.forge/worktrees/pipeline-ecd7cb0f/components/TabBar.tsx +0 -46
  2857. package/.forge/worktrees/pipeline-ecd7cb0f/components/TaskBoard.tsx +0 -113
  2858. package/.forge/worktrees/pipeline-ecd7cb0f/components/TaskDetail.tsx +0 -372
  2859. package/.forge/worktrees/pipeline-ecd7cb0f/components/TerminalLauncher.tsx +0 -398
  2860. package/.forge/worktrees/pipeline-ecd7cb0f/components/TunnelToggle.tsx +0 -206
  2861. package/.forge/worktrees/pipeline-ecd7cb0f/components/UsagePanel.tsx +0 -207
  2862. package/.forge/worktrees/pipeline-ecd7cb0f/components/WebTerminal.tsx +0 -1683
  2863. package/.forge/worktrees/pipeline-ecd7cb0f/components/WorkspaceTree.tsx +0 -221
  2864. package/.forge/worktrees/pipeline-ecd7cb0f/components/WorkspaceView.tsx +0 -4048
  2865. package/.forge/worktrees/pipeline-ecd7cb0f/dev-test.sh +0 -5
  2866. package/.forge/worktrees/pipeline-ecd7cb0f/docs/Forge_Memory_Layer_Design.docx +0 -0
  2867. package/.forge/worktrees/pipeline-ecd7cb0f/docs/Forge_Strategy_Research_2026.docx +0 -0
  2868. package/.forge/worktrees/pipeline-ecd7cb0f/docs/LOCAL-DEPLOY.md +0 -144
  2869. package/.forge/worktrees/pipeline-ecd7cb0f/docs/roadmap-multi-agent-workflow.md +0 -330
  2870. package/.forge/worktrees/pipeline-ecd7cb0f/forge-logo.png +0 -0
  2871. package/.forge/worktrees/pipeline-ecd7cb0f/forge-logo.svg +0 -106
  2872. package/.forge/worktrees/pipeline-ecd7cb0f/hooks/useSidebarResize.ts +0 -52
  2873. package/.forge/worktrees/pipeline-ecd7cb0f/install.sh +0 -29
  2874. package/.forge/worktrees/pipeline-ecd7cb0f/instrumentation.ts +0 -35
  2875. package/.forge/worktrees/pipeline-ecd7cb0f/lib/agents/claude-adapter.ts +0 -104
  2876. package/.forge/worktrees/pipeline-ecd7cb0f/lib/agents/generic-adapter.ts +0 -64
  2877. package/.forge/worktrees/pipeline-ecd7cb0f/lib/agents/index.ts +0 -245
  2878. package/.forge/worktrees/pipeline-ecd7cb0f/lib/agents/types.ts +0 -70
  2879. package/.forge/worktrees/pipeline-ecd7cb0f/lib/artifacts.ts +0 -106
  2880. package/.forge/worktrees/pipeline-ecd7cb0f/lib/auth.ts +0 -62
  2881. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/docker.yaml +0 -70
  2882. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/http.yaml +0 -66
  2883. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/jenkins.yaml +0 -92
  2884. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/llm-vision.yaml +0 -85
  2885. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/playwright.yaml +0 -111
  2886. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/shell-command.yaml +0 -60
  2887. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/slack.yaml +0 -48
  2888. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/webhook.yaml +0 -56
  2889. package/.forge/worktrees/pipeline-ecd7cb0f/lib/claude-process.ts +0 -352
  2890. package/.forge/worktrees/pipeline-ecd7cb0f/lib/claude-sessions.ts +0 -266
  2891. package/.forge/worktrees/pipeline-ecd7cb0f/lib/claude-templates.ts +0 -227
  2892. package/.forge/worktrees/pipeline-ecd7cb0f/lib/cloudflared.ts +0 -424
  2893. package/.forge/worktrees/pipeline-ecd7cb0f/lib/crypto.ts +0 -67
  2894. package/.forge/worktrees/pipeline-ecd7cb0f/lib/delivery.ts +0 -787
  2895. package/.forge/worktrees/pipeline-ecd7cb0f/lib/dirs.ts +0 -99
  2896. package/.forge/worktrees/pipeline-ecd7cb0f/lib/flows.ts +0 -86
  2897. package/.forge/worktrees/pipeline-ecd7cb0f/lib/forge-mcp-server.ts +0 -717
  2898. package/.forge/worktrees/pipeline-ecd7cb0f/lib/forge-skills/forge-inbox.md +0 -38
  2899. package/.forge/worktrees/pipeline-ecd7cb0f/lib/forge-skills/forge-send.md +0 -47
  2900. package/.forge/worktrees/pipeline-ecd7cb0f/lib/forge-skills/forge-status.md +0 -32
  2901. package/.forge/worktrees/pipeline-ecd7cb0f/lib/forge-skills/forge-workspace-sync.md +0 -37
  2902. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/00-overview.md +0 -40
  2903. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/01-settings.md +0 -194
  2904. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/02-telegram.md +0 -41
  2905. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/03-tunnel.md +0 -31
  2906. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/04-tasks.md +0 -52
  2907. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/05-pipelines.md +0 -460
  2908. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/06-skills.md +0 -43
  2909. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/07-projects.md +0 -73
  2910. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/08-rules.md +0 -53
  2911. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/09-issue-autofix.md +0 -55
  2912. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/10-troubleshooting.md +0 -89
  2913. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/11-workspace.md +0 -810
  2914. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/CLAUDE.md +0 -62
  2915. package/.forge/worktrees/pipeline-ecd7cb0f/lib/init.ts +0 -266
  2916. package/.forge/worktrees/pipeline-ecd7cb0f/lib/issue-scanner.ts +0 -298
  2917. package/.forge/worktrees/pipeline-ecd7cb0f/lib/logger.ts +0 -79
  2918. package/.forge/worktrees/pipeline-ecd7cb0f/lib/notifications.ts +0 -75
  2919. package/.forge/worktrees/pipeline-ecd7cb0f/lib/notify.ts +0 -108
  2920. package/.forge/worktrees/pipeline-ecd7cb0f/lib/password.ts +0 -97
  2921. package/.forge/worktrees/pipeline-ecd7cb0f/lib/pipeline-scheduler.ts +0 -373
  2922. package/.forge/worktrees/pipeline-ecd7cb0f/lib/pipeline.ts +0 -1441
  2923. package/.forge/worktrees/pipeline-ecd7cb0f/lib/plugins/executor.ts +0 -347
  2924. package/.forge/worktrees/pipeline-ecd7cb0f/lib/plugins/registry.ts +0 -228
  2925. package/.forge/worktrees/pipeline-ecd7cb0f/lib/plugins/types.ts +0 -103
  2926. package/.forge/worktrees/pipeline-ecd7cb0f/lib/project-sessions.ts +0 -53
  2927. package/.forge/worktrees/pipeline-ecd7cb0f/lib/projects.ts +0 -86
  2928. package/.forge/worktrees/pipeline-ecd7cb0f/lib/session-manager.ts +0 -156
  2929. package/.forge/worktrees/pipeline-ecd7cb0f/lib/session-utils.ts +0 -53
  2930. package/.forge/worktrees/pipeline-ecd7cb0f/lib/session-watcher.ts +0 -345
  2931. package/.forge/worktrees/pipeline-ecd7cb0f/lib/settings.ts +0 -195
  2932. package/.forge/worktrees/pipeline-ecd7cb0f/lib/skills.ts +0 -458
  2933. package/.forge/worktrees/pipeline-ecd7cb0f/lib/task-manager.ts +0 -949
  2934. package/.forge/worktrees/pipeline-ecd7cb0f/lib/telegram-bot.ts +0 -1477
  2935. package/.forge/worktrees/pipeline-ecd7cb0f/lib/telegram-standalone.ts +0 -83
  2936. package/.forge/worktrees/pipeline-ecd7cb0f/lib/terminal-server.ts +0 -70
  2937. package/.forge/worktrees/pipeline-ecd7cb0f/lib/terminal-standalone.ts +0 -421
  2938. package/.forge/worktrees/pipeline-ecd7cb0f/lib/usage-scanner.ts +0 -249
  2939. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/__tests__/state-machine.test.ts +0 -388
  2940. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/__tests__/workspace.test.ts +0 -311
  2941. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/agent-bus.ts +0 -416
  2942. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/agent-worker.ts +0 -655
  2943. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/backends/api-backend.ts +0 -262
  2944. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/backends/cli-backend.ts +0 -491
  2945. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/index.ts +0 -82
  2946. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/manager.ts +0 -136
  2947. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/orchestrator.ts +0 -3400
  2948. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/persistence.ts +0 -309
  2949. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/presets.ts +0 -649
  2950. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/requests.ts +0 -287
  2951. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/session-monitor.ts +0 -240
  2952. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/skill-installer.ts +0 -275
  2953. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/smith-memory.ts +0 -498
  2954. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/types.ts +0 -241
  2955. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/watch-manager.ts +0 -560
  2956. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace-standalone.ts +0 -911
  2957. package/.forge/worktrees/pipeline-ecd7cb0f/middleware.ts +0 -51
  2958. package/.forge/worktrees/pipeline-ecd7cb0f/next.config.ts +0 -26
  2959. package/.forge/worktrees/pipeline-ecd7cb0f/package.json +0 -74
  2960. package/.forge/worktrees/pipeline-ecd7cb0f/pnpm-lock.yaml +0 -3719
  2961. package/.forge/worktrees/pipeline-ecd7cb0f/pnpm-workspace.yaml +0 -1
  2962. package/.forge/worktrees/pipeline-ecd7cb0f/postcss.config.mjs +0 -7
  2963. package/.forge/worktrees/pipeline-ecd7cb0f/publish.sh +0 -133
  2964. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/README.md +0 -66
  2965. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/results/.gitignore +0 -2
  2966. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/run.ts +0 -635
  2967. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/01-text-utils/task.md +0 -26
  2968. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  2969. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  2970. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/02-pagination/task.md +0 -48
  2971. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  2972. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  2973. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  2974. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  2975. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/verify-usage.ts +0 -178
  2976. package/.forge/worktrees/pipeline-ecd7cb0f/src/config/index.ts +0 -129
  2977. package/.forge/worktrees/pipeline-ecd7cb0f/src/core/db/database.ts +0 -259
  2978. package/.forge/worktrees/pipeline-ecd7cb0f/src/core/memory/strategy.ts +0 -32
  2979. package/.forge/worktrees/pipeline-ecd7cb0f/src/core/providers/chat.ts +0 -65
  2980. package/.forge/worktrees/pipeline-ecd7cb0f/src/core/providers/registry.ts +0 -60
  2981. package/.forge/worktrees/pipeline-ecd7cb0f/src/core/session/manager.ts +0 -190
  2982. package/.forge/worktrees/pipeline-ecd7cb0f/src/types/index.ts +0 -129
  2983. package/.forge/worktrees/pipeline-ecd7cb0f/start.sh +0 -31
  2984. package/.forge/worktrees/pipeline-ecd7cb0f/templates/smith-lead.json +0 -45
  2985. package/.forge/worktrees/pipeline-ecd7cb0f/tsconfig.json +0 -42
  2986. package/qa/.forge/agent-context.json +0 -6
  2987. package/qa/.forge/mcp.json +0 -8
@@ -1,4048 +0,0 @@
1
- 'use client';
2
-
3
- import { useState, useEffect, useCallback, useMemo, useRef, forwardRef, useImperativeHandle, lazy, Suspense } from 'react';
4
- import { TerminalSessionPickerLazy, fetchAgentSessions, type PickerSelection } from './TerminalLauncher';
5
- import {
6
- ReactFlow, Background, Controls, Handle, Position, useReactFlow, ReactFlowProvider,
7
- type Node, type NodeProps, MarkerType, type NodeChange,
8
- applyNodeChanges,
9
- } from '@xyflow/react';
10
- import '@xyflow/react/dist/style.css';
11
-
12
- // ─── Types (mirrors lib/workspace/types) ─────────────────
13
-
14
- interface AgentConfig {
15
- id: string; label: string; icon: string; role: string;
16
- type?: 'agent' | 'input';
17
- primary?: boolean;
18
- content?: string;
19
- entries?: { content: string; timestamp: number }[];
20
- backend: 'api' | 'cli';
21
- agentId?: string; provider?: string; model?: string;
22
- dependsOn: string[];
23
- workDir?: string;
24
- outputs: string[];
25
- steps: { id: string; label: string; prompt: string }[];
26
- requiresApproval?: boolean;
27
- persistentSession?: boolean;
28
- skipPermissions?: boolean;
29
- boundSessionId?: string;
30
- watch?: { enabled: boolean; interval: number; targets: any[]; action?: 'log' | 'analyze' | 'approve' | 'send_message'; prompt?: string; sendTo?: string };
31
- plugins?: string[]; // plugin IDs to auto-install when agent is created
32
- }
33
-
34
- interface AgentState {
35
- smithStatus: 'down' | 'starting' | 'active';
36
- taskStatus: 'idle' | 'running' | 'done' | 'failed';
37
- currentStep?: number;
38
- tmuxSession?: string;
39
- artifacts: { type: string; path?: string; summary?: string }[];
40
- error?: string; lastCheckpoint?: number;
41
- daemonIteration?: number;
42
- }
43
-
44
- // ─── Constants ───────────────────────────────────────────
45
-
46
- const COLORS = [
47
- { border: '#22c55e', bg: '#0a1a0a', accent: '#4ade80' },
48
- { border: '#3b82f6', bg: '#0a0f1a', accent: '#60a5fa' },
49
- { border: '#a855f7', bg: '#100a1a', accent: '#c084fc' },
50
- { border: '#f97316', bg: '#1a100a', accent: '#fb923c' },
51
- { border: '#ec4899', bg: '#1a0a10', accent: '#f472b6' },
52
- { border: '#06b6d4', bg: '#0a1a1a', accent: '#22d3ee' },
53
- ];
54
-
55
- // Smith status colors
56
- const SMITH_STATUS: Record<string, { label: string; color: string; glow?: boolean }> = {
57
- down: { label: 'down', color: '#30363d' },
58
- starting: { label: 'starting', color: '#f0883e' }, // orange: ensurePersistentSession in progress
59
- active: { label: 'active', color: '#3fb950', glow: true },
60
- };
61
-
62
- // Task status colors
63
- const TASK_STATUS: Record<string, { label: string; color: string; glow?: boolean }> = {
64
- idle: { label: 'idle', color: '#30363d' },
65
- running: { label: 'running', color: '#3fb950', glow: true },
66
- done: { label: 'done', color: '#58a6ff' },
67
- failed: { label: 'failed', color: '#f85149' },
68
- };
69
-
70
- const PRESET_AGENTS: Omit<AgentConfig, 'id'>[] = [
71
- {
72
- label: 'Lead', icon: '👑', backend: 'cli', agentId: 'claude', dependsOn: [], outputs: ['docs/lead/'],
73
- primary: true, persistentSession: true, plugins: ['playwright', 'shell-command'],
74
- role: `Lead — primary coordinator (recommended for Primary smith). Context auto-includes Workspace Team (all agents, roles, status, missing roles).
75
-
76
- SOP: Intake → HAS Architect? delegate via create_request : break down yourself → HAS Engineer? create_request(open) : implement in src/ → HAS QA? auto-notified : test yourself → HAS Reviewer? auto-notified : review yourself.
77
-
78
- SOP: Monitor → get_status + list_requests → stuck/failed agents: send_message or take over → unclaimed requests: nudge Engineers.
79
-
80
- SOP: Quality Gate → ALL requests done + review=approved + qa=passed → write docs/lead/delivery-summary.md.
81
-
82
- Gap coverage: missing PM → you break requirements; missing Engineer → you code; missing QA → you test; missing Reviewer → you review. Every delegation uses create_request with acceptance_criteria.`,
83
- steps: [
84
- { id: 'intake', label: 'Intake & Analyze', prompt: 'Read Workspace Team in context. Identify present/missing roles and incoming requirements. Classify scope and plan delegation vs self-handling.' },
85
- { id: 'delegate', label: 'Create Requests & Route', prompt: 'create_request for each task with acceptance_criteria. Route to Architect/Engineer or note for self-implementation. Verify with list_requests.' },
86
- { id: 'cover-gaps', label: 'Cover Missing Roles', prompt: 'Implement/test/review for any missing role. update_response for each section you cover.' },
87
- { id: 'monitor', label: 'Monitor & Unblock', prompt: 'get_status + list_requests. Unblock stuck agents via send_message or take over their work.' },
88
- { id: 'gate', label: 'Quality Gate & Summary', prompt: 'Verify all requests done/approved/passed. Write docs/lead/delivery-summary.md.' },
89
- ],
90
- },
91
- {
92
- label: 'PM', icon: '📋', backend: 'cli', agentId: 'claude', dependsOn: [], outputs: ['docs/prd/'],
93
- role: `Product Manager. Context auto-includes Workspace Team.
94
-
95
- SOP: Read upstream input → list docs/prd/ for version history → identify NEW vs covered → create NEW versioned PRD (never overwrite).
96
-
97
- PRD structure: version + date, summary, goals, user stories with testable acceptance_criteria, constraints, out of scope, open questions.
98
-
99
- Version: patch (v1.0.1) = clarification, minor (v1.1) = new feature, major (v2.0) = scope overhaul.
100
-
101
- Handoff: Do NOT create request docs or write code. Architect/Lead reads docs/prd/ downstream.`,
102
- steps: [
103
- { id: 'analyze', label: 'Analyze Requirements', prompt: 'Read Workspace Team. Read upstream input. List docs/prd/ for version history. Identify NEW vs already covered requirements. Decide version number.' },
104
- { id: 'write-prd', label: 'Write PRD', prompt: 'Create NEW versioned file in docs/prd/. Include testable acceptance criteria for every user story. Never overwrite existing PRD files.' },
105
- { id: 'self-review', label: 'Self-Review', prompt: 'Checklist: criteria testable by QA? Edge cases? Scope clear for Engineer? No duplication? Fix issues.' },
106
- ],
107
- },
108
- {
109
- label: 'Engineer', icon: '🔨', backend: 'cli', agentId: 'claude', dependsOn: [], outputs: ['src/', 'docs/architecture/'],
110
- role: `Senior Software Engineer. Context auto-includes Workspace Team.
111
-
112
- SOP: Find Work → list_requests(status: "open") → claim_request → get_request for details.
113
- SOP: Implement → read acceptance_criteria → design (docs/architecture/) → code (src/) → self-test.
114
- SOP: Report → update_response(section: "engineer", data: {files_changed, notes}) → auto-notifies QA/Reviewer.
115
-
116
- IF claim fails (already taken) → pick next open request.
117
- IF blocked by unclear requirement → send_message to upstream (Architect/PM/Lead) with specific question.
118
- IF no open requests → check inbox for direct assignments.
119
-
120
- Rules: always claim before starting, always update_response when done, follow existing conventions, architecture docs versioned (never overwrite).`,
121
- steps: [
122
- { id: 'claim', label: 'Find & Claim', prompt: 'Read Workspace Team. Check inbox. list_requests(status: "open"). claim_request on highest priority. If none, check inbox.' },
123
- { id: 'design', label: 'Design', prompt: 'get_request for details. Read acceptance_criteria. Read existing code + docs/architecture/. Create new architecture doc if significant change.' },
124
- { id: 'implement', label: 'Implement', prompt: 'Implement per design. Follow conventions. Track files changed. Run existing tests. Verify against each acceptance_criterion.' },
125
- { id: 'report', label: 'Report Done', prompt: 'update_response(section: "engineer") with files_changed and notes. If blocked, send_message upstream.' },
126
- ],
127
- },
128
- {
129
- label: 'QA', icon: '🧪', backend: 'cli', agentId: 'claude', dependsOn: [], outputs: ['tests/', 'docs/qa/'],
130
- plugins: ['playwright', 'shell-command'],
131
- role: `QA Engineer. Context auto-includes Workspace Team.
132
-
133
- SOP: Find Work → list_requests(status: "qa") → get_request → read acceptance_criteria + engineer's files_changed.
134
- SOP: Test → map each criterion to test cases → write Playwright tests in tests/e2e/ → run via run_plugin or npx playwright.
135
- SOP: Report → update_response(section: "qa", data: {result, test_files, findings}).
136
-
137
- IF result=passed → auto-advances, no message needed.
138
- IF result=failed → classify: CRITICAL/MAJOR → ONE send_message to Engineer. MINOR → report only, no message.
139
-
140
- Rules: never fix bugs (report only), each test traces to acceptance_criterion, max 1 consolidated message, no messages during planning/writing steps.`,
141
- steps: [
142
- { id: 'find-work', label: 'Find Work', prompt: 'Read Workspace Team. Check inbox. list_requests(status: "qa"). get_request for acceptance_criteria and engineer notes.' },
143
- { id: 'plan', label: 'Test Plan', prompt: 'Map each criterion to test cases (happy path + edge + error). Write docs/qa/test-plan. Skip already-tested unchanged features.' },
144
- { id: 'write-tests', label: 'Write Tests', prompt: 'Write Playwright tests in tests/e2e/. Create config if missing. No messages in this step.' },
145
- { id: 'execute', label: 'Execute & Report', prompt: 'Run tests. Record pass/fail per criterion. update_response(section: qa). If critical/major failures: ONE send_message to Engineer.' },
146
- ],
147
- },
148
- {
149
- label: 'Reviewer', icon: '🔍', backend: 'cli', agentId: 'claude', dependsOn: [], outputs: ['docs/review/'],
150
- role: `Code Reviewer. Context auto-includes Workspace Team.
151
-
152
- SOP: Find Work → list_requests(status: "review") → get_request → read request + engineer response + QA results.
153
- SOP: Review each file in files_changed → check: criteria met? code quality? security (OWASP)? performance? → classify CRITICAL/MAJOR/MINOR.
154
- SOP: Verdict → approved (all good) / changes_requested (issues) / rejected (security/data).
155
- SOP: Report → update_response(section: "review", data: {result, findings}) → write docs/review/.
156
-
157
- IF approved → auto-advances to done, no message.
158
- IF changes_requested → ONE send_message to Engineer with top issues.
159
- IF rejected → send_message to Engineer AND Lead.
160
-
161
- Rules: never modify code, review only files_changed (not entire codebase), actionable feedback ("change X to Y because Z"), MINOR findings in report only.`,
162
- steps: [
163
- { id: 'find-work', label: 'Find Work', prompt: 'Read Workspace Team. Check inbox. list_requests(status: "review"). get_request for full context.' },
164
- { id: 'review', label: 'Code Review', prompt: 'Review each file in files_changed: criteria met? quality? security? performance? Classify CRITICAL/MAJOR/MINOR.' },
165
- { id: 'report', label: 'Verdict & Report', prompt: 'Decide verdict. update_response(section: review). Write docs/review/. If changes_requested/rejected: ONE message to Engineer (+ Lead if rejected).' },
166
- ],
167
- },
168
- {
169
- label: 'UI Designer', icon: '🎨', backend: 'cli', agentId: 'claude', dependsOn: [], outputs: ['docs/ui-spec.md', 'src/'],
170
- plugins: ['playwright', 'shell-command'],
171
- role: `UI/UX Designer — You design and implement user interfaces. You write real UI code, preview it visually, and iterate until the quality meets your standards.
172
-
173
- Rules:
174
- - You WRITE CODE, not just specs. Implement the UI yourself.
175
- - After writing UI code, always preview your work: take a screenshot and review it visually.
176
- - Iterate: if the screenshot doesn't look right, fix the code and screenshot again. Aim for 3-5 review cycles.
177
- - Focus on user experience first, aesthetics second
178
- - Design for the existing tech stack (check project's UI framework)
179
- - Be specific: colors (hex), spacing (px/rem), typography, component hierarchy
180
- - Consider responsive design, accessibility (WCAG), dark/light mode
181
- - Include interaction states: hover, active, disabled, loading, error, empty
182
- - Reference existing UI patterns in the codebase for consistency
183
-
184
- Visual review workflow:
185
- 1. Write/modify UI code
186
- 2. Start dev server if not running (e.g., npm run dev)
187
- 3. Take screenshot: run_plugin({ plugin: "<playwright-instance>", action: "screenshot", params: { url: "http://localhost:3000/page" } })
188
- 4. Read the screenshot file to visually evaluate your work
189
- 5. Grade yourself: layout correctness, visual polish, consistency with existing UI, responsiveness
190
- 6. If not satisfied, fix and repeat from step 2
191
- 7. When satisfied, document the final design in docs/ui-spec.md
192
-
193
- If reference designs or mockups exist in the project (e.g., docs/designs/), study them before implementing.`,
194
- steps: [
195
- { id: 'audit', label: 'UI Audit', prompt: 'Analyze the existing UI: framework used (React/Vue/etc), component library, design tokens (colors, spacing, fonts), layout patterns. Take screenshots of existing pages to understand the current look and feel. Document the current design system.' },
196
- { id: 'implement', label: 'Implement UI', prompt: 'Based on the PRD, implement the UI. Write real component code. Start the dev server, take screenshots of your work, and iterate until the visual quality is high. Aim for at least 3 review cycles — screenshot, evaluate, improve.' },
197
- { id: 'polish', label: 'Polish & Document', prompt: 'Final polish pass: check all states (loading, empty, error, hover, disabled), responsive breakpoints, dark/light mode. Take final screenshots. Write docs/ui-spec.md documenting: component hierarchy, design decisions, interaction patterns, and accessibility notes.' },
198
- ],
199
- },
200
- {
201
- label: 'Design Evaluator', icon: '🔍', backend: 'cli', agentId: 'claude', dependsOn: [], outputs: ['docs/design-review.md'],
202
- plugins: ['playwright', 'llm-vision'],
203
- role: `Design Evaluator — You are a senior design critic. You evaluate UI implementations visually, not by reading code. You are deliberately skeptical and hold work to a high standard.
204
-
205
- You evaluate on 4 dimensions (each scored 1-10):
206
- 1. **Design Quality** — Visual coherence, distinct identity, not generic/template-like
207
- 2. **Originality** — Evidence of intentional design decisions vs default AI patterns
208
- 3. **Craft** — Typography, spacing, color harmony, alignment, pixel-level polish
209
- 4. **Functionality** — Usability, interaction clarity, error states, responsiveness
210
-
211
- Rules:
212
- - NEVER modify code — only evaluate and report
213
- - Always take screenshots and visually inspect before scoring
214
- - Use run_plugin with Playwright to screenshot every relevant page/state
215
- - If llm-vision instances are available, use them for cross-model evaluation
216
- - Be specific: "the spacing between header and content is 8px, should be 16px for breathing room"
217
- - A score of 7+ means "good enough to ship". Below 7 means "needs revision"
218
- - Send feedback to UI Designer via send_message with specific, actionable items
219
- - If overall score < 7, request changes. If >= 7, approve with minor suggestions.
220
-
221
- Workflow:
222
- 1. Receive notification that UI Designer has completed work
223
- 2. Take screenshots of all relevant pages and states (normal, loading, error, empty, mobile)
224
- 3. Evaluate each screenshot against the 4 dimensions
225
- 4. Optionally send screenshots to llm-vision instances for additional opinions
226
- 5. Write docs/design-review.md with scores, specific feedback, and verdict
227
- 6. send_message to UI Designer: APPROVE or REQUEST_CHANGES with actionable feedback`,
228
- steps: [
229
- { id: 'screenshot', label: 'Visual Capture', prompt: 'Take screenshots of all pages and states the UI Designer worked on. Include: default view, loading state, error state, empty state, mobile viewport (375px), tablet viewport (768px). Save all screenshots to /tmp/ and list them.' },
230
- { id: 'evaluate', label: 'Evaluate', prompt: 'Review each screenshot. Score each page on the 4 dimensions (Design Quality, Originality, Craft, Functionality). Be critical and specific. If llm-vision plugin instances are available, send key screenshots for additional evaluation and compare opinions.' },
231
- { id: 'report', label: 'Report & Feedback', prompt: 'Write docs/design-review.md with: overall scores, per-page breakdown, specific issues with suggested fixes. Send verdict to UI Designer via send_message: APPROVE (score >= 7) or REQUEST_CHANGES (score < 7) with the top 3-5 actionable items.' },
232
- ],
233
- },
234
- ];
235
-
236
- // ─── API helpers ─────────────────────────────────────────
237
-
238
- async function wsApi(workspaceId: string, action: string, body?: Record<string, any>) {
239
- const res = await fetch(`/api/workspace/${workspaceId}/agents`, {
240
- method: 'POST',
241
- headers: { 'Content-Type': 'application/json' },
242
- body: JSON.stringify({ action, ...body }),
243
- });
244
- const data = await res.json();
245
- if (data.warning) {
246
- alert(`Warning: ${data.warning}`);
247
- }
248
- if (!res.ok && data.error) {
249
- alert(`Error: ${data.error}`);
250
- }
251
- return data;
252
- }
253
-
254
- async function ensureWorkspace(projectPath: string, projectName: string): Promise<string> {
255
- // Find or create workspace
256
- const res = await fetch(`/api/workspace?projectPath=${encodeURIComponent(projectPath)}`);
257
- const existing = await res.json();
258
- if (existing?.id) return existing.id;
259
-
260
- const createRes = await fetch('/api/workspace', {
261
- method: 'POST',
262
- headers: { 'Content-Type': 'application/json' },
263
- body: JSON.stringify({ projectPath, projectName }),
264
- });
265
- const created = await createRes.json();
266
- return created.id;
267
- }
268
-
269
- // ─── SSE Hook ────────────────────────────────────────────
270
-
271
- function useWorkspaceStream(workspaceId: string | null, onEvent?: (event: any) => void) {
272
- const [agents, setAgents] = useState<AgentConfig[]>([]);
273
- const [states, setStates] = useState<Record<string, AgentState>>({});
274
- const [logPreview, setLogPreview] = useState<Record<string, string[]>>({});
275
- const [busLog, setBusLog] = useState<any[]>([]);
276
- const [daemonActive, setDaemonActive] = useState(false);
277
- const onEventRef = useRef(onEvent);
278
- onEventRef.current = onEvent;
279
-
280
- useEffect(() => {
281
- if (!workspaceId) return;
282
-
283
- const es = new EventSource(`/api/workspace/${workspaceId}/stream`);
284
-
285
- es.onmessage = (e) => {
286
- try {
287
- const event = JSON.parse(e.data);
288
-
289
- if (event.type === 'init') {
290
- setAgents(event.agents || []);
291
- setStates(event.agentStates || {});
292
- setBusLog(event.busLog || []);
293
- if (event.daemonActive !== undefined) setDaemonActive(event.daemonActive);
294
- return;
295
- }
296
-
297
- if (event.type === 'task_status') {
298
- setStates(prev => ({
299
- ...prev,
300
- [event.agentId]: {
301
- ...prev[event.agentId],
302
- taskStatus: event.taskStatus,
303
- error: event.error,
304
- },
305
- }));
306
- }
307
-
308
- if (event.type === 'smith_status') {
309
- setStates(prev => ({
310
- ...prev,
311
- [event.agentId]: {
312
- ...prev[event.agentId],
313
- smithStatus: event.smithStatus,
314
- },
315
- }));
316
- }
317
-
318
- if (event.type === 'log') {
319
- const entry = event.entry;
320
- if (entry?.content) {
321
- setLogPreview(prev => {
322
- // Summary entries replace the preview entirely (cleaner display)
323
- if (entry.subtype === 'step_summary' || entry.subtype === 'final_summary') {
324
- const summaryLines = entry.content.split('\n').filter((l: string) => l.trim()).slice(0, 4);
325
- return { ...prev, [event.agentId]: summaryLines };
326
- }
327
- // Regular logs: append, keep last 3
328
- const lines = [...(prev[event.agentId] || []), entry.content].slice(-3);
329
- return { ...prev, [event.agentId]: lines };
330
- });
331
- }
332
- }
333
-
334
- if (event.type === 'step') {
335
- setStates(prev => ({
336
- ...prev,
337
- [event.agentId]: { ...prev[event.agentId], currentStep: event.stepIndex },
338
- }));
339
- }
340
-
341
- if (event.type === 'error') {
342
- setStates(prev => ({
343
- ...prev,
344
- [event.agentId]: { ...prev[event.agentId], taskStatus: 'failed', error: event.error },
345
- }));
346
- }
347
-
348
- if (event.type === 'bus_message') {
349
- setBusLog(prev => prev.some(m => m.id === event.message.id) ? prev : [...prev, event.message]);
350
- }
351
-
352
- if (event.type === 'bus_message_status') {
353
- setBusLog(prev => prev.map(m =>
354
- m.id === event.messageId ? { ...m, status: event.status } : m
355
- ));
356
- }
357
-
358
- if (event.type === 'bus_log_updated') {
359
- setBusLog(event.log || []);
360
- }
361
-
362
- // Server pushed updated agents list + states (after add/remove/update/reset)
363
- if (event.type === 'agents_changed') {
364
- const newAgents = event.agents || [];
365
- setAgents(prev => {
366
- // Guard: don't accept a smaller agents list unless it was an explicit removal
367
- // (removal shrinks by exactly 1, not more)
368
- if (newAgents.length > 0 && newAgents.length < prev.length - 1) {
369
- console.warn(`[sse] agents_changed: ignoring shrink from ${prev.length} to ${newAgents.length}`);
370
- return prev;
371
- }
372
- return newAgents;
373
- });
374
- if (event.agentStates) setStates(event.agentStates);
375
- }
376
-
377
- // Watch alerts — update agent state with last alert
378
- if (event.type === 'watch_alert') {
379
- setStates(prev => ({
380
- ...prev,
381
- [event.agentId]: {
382
- ...prev[event.agentId],
383
- lastWatchAlert: event.summary,
384
- lastWatchTime: event.timestamp,
385
- },
386
- }));
387
- }
388
-
389
- // Forward special events to the component
390
- if (event.type === 'user_input_request' || event.type === 'workspace_complete') {
391
- onEventRef.current?.(event);
392
- }
393
- } catch {}
394
- };
395
-
396
- return () => es.close();
397
- }, [workspaceId]);
398
-
399
- return { agents, states, logPreview, busLog, setAgents, daemonActive, setDaemonActive };
400
- }
401
-
402
- // ─── Session Target Selector (for Watch) ─────────────────
403
-
404
- function SessionTargetSelector({ target, agents, projectPath, onChange }: {
405
- target: { type: string; path?: string; pattern?: string; cmd?: string };
406
- agents: AgentConfig[];
407
- projectPath?: string;
408
- onChange: (updated: typeof target) => void;
409
- }) {
410
- const [sessions, setSessions] = useState<{ id: string; modified: string; label: string }[]>([]);
411
-
412
- // Load sessions and mark fixed session
413
- useEffect(() => {
414
- if (!projectPath) return;
415
- const pName = (projectPath || '').replace(/\/+$/, '').split('/').pop() || '';
416
- Promise.all([
417
- fetch(`/api/claude-sessions/${encodeURIComponent(pName)}`).then(r => r.json()).catch(() => []),
418
- fetch(`/api/project-sessions?projectPath=${encodeURIComponent(projectPath)}`).then(r => r.json()).catch(() => ({})),
419
- ]).then(([data, psData]) => {
420
- const fixedId = psData?.fixedSessionId || '';
421
- if (Array.isArray(data)) {
422
- setSessions(data.map((s: any, i: number) => {
423
- const sid = s.sessionId || s.id || '';
424
- const isBound = sid === fixedId;
425
- const label = isBound ? `${sid.slice(0, 8)} (fixed)` : i === 0 ? `${sid.slice(0, 8)} (latest)` : sid.slice(0, 8);
426
- return { id: sid, modified: s.modified || '', label };
427
- }));
428
- }
429
- });
430
- }, [projectPath]);
431
-
432
- return (
433
- <>
434
- <select value={target.path || ''} onChange={e => onChange({ ...target, path: e.target.value, cmd: '' })}
435
- className="text-[10px] bg-[#161b22] border border-[#30363d] rounded px-1 py-0.5 text-white w-24">
436
- <option value="">Any agent</option>
437
- {agents.map(a => <option key={a.id} value={a.id}>{a.icon} {a.label}</option>)}
438
- </select>
439
- <select value={target.cmd || ''} onChange={e => onChange({ ...target, cmd: e.target.value })}
440
- className="text-[10px] bg-[#161b22] border border-[#30363d] rounded px-1 py-0.5 text-white w-28">
441
- <option value="">Latest session</option>
442
- {sessions.map(s => (
443
- <option key={s.id} value={s.id}>{s.label}{s.modified ? ` · ${new Date(s.modified).toLocaleDateString()}` : ''}</option>
444
- ))}
445
- </select>
446
- <input value={target.pattern || ''} onChange={e => onChange({ ...target, pattern: e.target.value })}
447
- placeholder="regex (optional)"
448
- className="text-[10px] bg-[#161b22] border border-[#30363d] rounded px-1 py-0.5 text-white w-24" />
449
- </>
450
- );
451
- }
452
-
453
- // ─── Watch Path Picker (file/directory browser) ─────────
454
-
455
- function WatchPathPicker({ value, projectPath, onChange }: { value: string; projectPath: string; onChange: (v: string) => void }) {
456
- const [showBrowser, setShowBrowser] = useState(false);
457
- const [tree, setTree] = useState<any[]>([]);
458
- const [search, setSearch] = useState('');
459
- const [flatFiles, setFlatFiles] = useState<string[]>([]);
460
-
461
- const loadTree = useCallback(() => {
462
- if (!projectPath) return;
463
- fetch(`/api/code?dir=${encodeURIComponent(projectPath)}`)
464
- .then(r => r.json())
465
- .then(data => {
466
- setTree(data.tree || []);
467
- // Build flat list for search
468
- const files: string[] = [];
469
- const walk = (nodes: any[], prefix = '') => {
470
- for (const n of nodes || []) {
471
- const path = prefix ? `${prefix}/${n.name}` : n.name;
472
- files.push(n.type === 'dir' ? path + '/' : path);
473
- if (n.children) walk(n.children, path);
474
- }
475
- };
476
- walk(data.tree || []);
477
- setFlatFiles(files);
478
- })
479
- .catch(() => {});
480
- }, [projectPath]);
481
-
482
- const filtered = search ? flatFiles.filter(f => f.toLowerCase().includes(search.toLowerCase())).slice(0, 30) : [];
483
-
484
- return (
485
- <div className="flex-1 flex items-center gap-1 relative">
486
- <input
487
- value={value}
488
- onChange={e => onChange(e.target.value)}
489
- placeholder="./ (project root)"
490
- className="text-[10px] bg-[#161b22] border border-[#30363d] rounded px-1 py-0.5 text-white flex-1"
491
- />
492
- <button onClick={() => { setShowBrowser(!showBrowser); if (!showBrowser) loadTree(); }}
493
- className="text-[9px] px-1 py-0.5 rounded bg-[#30363d] text-gray-400 hover:text-white shrink-0">📂</button>
494
-
495
- {showBrowser && (
496
- <div className="absolute left-0 right-0 top-full mt-1 z-50 bg-[#0d1117] border border-[#30363d] rounded-lg shadow-xl max-h-60 overflow-hidden flex flex-col" style={{ minWidth: 250 }}>
497
- <input
498
- value={search}
499
- onChange={e => setSearch(e.target.value)}
500
- placeholder="Search files & dirs..."
501
- autoFocus
502
- className="text-[10px] bg-[#161b22] border-b border-[#30363d] px-2 py-1 text-white focus:outline-none"
503
- />
504
- <div className="overflow-y-auto flex-1">
505
- {search ? (
506
- // Search results
507
- filtered.length > 0 ? filtered.map(f => (
508
- <div key={f} onClick={() => { onChange(f); setShowBrowser(false); setSearch(''); }}
509
- className="px-2 py-0.5 text-[9px] text-gray-300 hover:bg-[#161b22] cursor-pointer truncate font-mono">
510
- {f.endsWith('/') ? `📁 ${f}` : `📄 ${f}`}
511
- </div>
512
- )) : <div className="px-2 py-1 text-[9px] text-gray-500">No matches</div>
513
- ) : (
514
- // Tree view (first 2 levels)
515
- tree.map(n => <PathTreeNode key={n.name} node={n} prefix="" onSelect={p => { onChange(p); setShowBrowser(false); }} />)
516
- )}
517
- </div>
518
- <div className="flex items-center justify-between px-2 py-0.5 border-t border-[#30363d] bg-[#161b22]">
519
- <span className="text-[8px] text-gray-600">{flatFiles.length} items</span>
520
- <button onClick={() => setShowBrowser(false)} className="text-[8px] text-gray-500 hover:text-white">Close</button>
521
- </div>
522
- </div>
523
- )}
524
- </div>
525
- );
526
- }
527
-
528
- function PathTreeNode({ node, prefix, onSelect, depth = 0 }: { node: any; prefix: string; onSelect: (path: string) => void; depth?: number }) {
529
- const [expanded, setExpanded] = useState(depth < 1);
530
- const path = prefix ? `${prefix}/${node.name}` : node.name;
531
- const isDir = node.type === 'dir';
532
-
533
- if (!isDir && depth > 1) return null; // only show files at top 2 levels
534
-
535
- return (
536
- <div>
537
- <div
538
- onClick={() => isDir ? setExpanded(!expanded) : onSelect(path)}
539
- className="flex items-center px-2 py-0.5 text-[9px] hover:bg-[#161b22] cursor-pointer"
540
- style={{ paddingLeft: 8 + depth * 12 }}
541
- >
542
- <span className="text-gray-500 mr-1 w-3">{isDir ? (expanded ? '▼' : '▶') : ''}</span>
543
- <span className={isDir ? 'text-[var(--accent)]' : 'text-gray-400'}>{isDir ? '📁' : '📄'} {node.name}</span>
544
- {isDir && (
545
- <button onClick={e => { e.stopPropagation(); onSelect(path + '/'); }}
546
- className="ml-auto text-[8px] text-gray-600 hover:text-[var(--accent)]">select</button>
547
- )}
548
- </div>
549
- {isDir && expanded && node.children && depth < 2 && (
550
- node.children.map((c: any) => <PathTreeNode key={c.name} node={c} prefix={path} onSelect={onSelect} depth={depth + 1} />)
551
- )}
552
- </div>
553
- );
554
- }
555
-
556
- // ─── Fixed Session Picker ────────────────────────────────
557
-
558
- function FixedSessionPicker({ projectPath, value, onChange }: { projectPath?: string; value: string; onChange: (v: string) => void }) {
559
- const [sessions, setSessions] = useState<{ id: string; modified: string; size: number }[]>([]);
560
- const [copied, setCopied] = useState(false);
561
-
562
- useEffect(() => {
563
- if (!projectPath) return;
564
- const pName = projectPath.replace(/\/+$/, '').split('/').pop() || '';
565
- fetch(`/api/claude-sessions/${encodeURIComponent(pName)}`)
566
- .then(r => r.json())
567
- .then(data => { if (Array.isArray(data)) setSessions(data.map((s: any) => ({ id: s.sessionId || s.id || '', modified: s.modified || '', size: s.size || 0 }))); })
568
- .catch(() => {});
569
- }, [projectPath]);
570
-
571
- const formatTime = (iso: string) => {
572
- if (!iso) return '';
573
- const diff = Date.now() - new Date(iso).getTime();
574
- if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;
575
- if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`;
576
- return new Date(iso).toLocaleDateString();
577
- };
578
- const formatSize = (b: number) => b < 1024 ? `${b}B` : b < 1048576 ? `${(b / 1024).toFixed(0)}KB` : `${(b / 1048576).toFixed(1)}MB`;
579
-
580
- const copyId = () => {
581
- if (!value) return;
582
- navigator.clipboard.writeText(value).then(() => { setCopied(true); setTimeout(() => setCopied(false), 1500); });
583
- };
584
-
585
- return (
586
- <div className="flex flex-col gap-0.5">
587
- <label className="text-[9px] text-gray-500">Bound Session {value ? '' : '(auto-detect on first start)'}</label>
588
- <select value={value} onChange={e => onChange(e.target.value)}
589
- className="text-[10px] bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-gray-400 font-mono focus:outline-none focus:border-[#58a6ff]">
590
- <option value="">Auto-detect (latest session)</option>
591
- {sessions.map(s => (
592
- <option key={s.id} value={s.id}>
593
- {s.id.slice(0, 8)} · {formatTime(s.modified)} · {formatSize(s.size)}
594
- </option>
595
- ))}
596
- </select>
597
- {value && (
598
- <div className="flex items-center gap-1 mt-0.5">
599
- <code className="text-[8px] text-gray-500 font-mono bg-[#0d1117] px-1.5 py-0.5 rounded border border-[#21262d] flex-1 overflow-hidden text-ellipsis select-all">{value}</code>
600
- <button onClick={copyId} className="text-[8px] px-1.5 py-0.5 rounded bg-[#30363d] text-gray-400 hover:text-white shrink-0">{copied ? '✓' : 'Copy'}</button>
601
- <button onClick={() => onChange('')} className="text-[8px] px-1.5 py-0.5 rounded text-gray-600 hover:text-red-400 shrink-0">Clear</button>
602
- </div>
603
- )}
604
- </div>
605
- );
606
- }
607
-
608
- // ─── Agent Config Modal ──────────────────────────────────
609
-
610
- function AgentConfigModal({ initial, mode, existingAgents, projectPath, onConfirm, onCancel }: {
611
- initial: Partial<AgentConfig>;
612
- mode: 'add' | 'edit';
613
- existingAgents: AgentConfig[];
614
- projectPath?: string;
615
- onConfirm: (cfg: Omit<AgentConfig, 'id'>) => void;
616
- onCancel: () => void;
617
- }) {
618
- const [label, setLabel] = useState(initial.label || '');
619
- const [icon, setIcon] = useState(initial.icon || '🤖');
620
- const [role, setRole] = useState(initial.role || '');
621
- const [backend, setBackend] = useState<'api' | 'cli'>(initial.backend === 'api' ? 'api' : 'cli');
622
- const [agentId, setAgentId] = useState(initial.agentId || 'claude');
623
- const [availableAgents, setAvailableAgents] = useState<{ id: string; name: string; isProfile?: boolean; backendType?: string; base?: string; cliType?: string }[]>([]);
624
-
625
- const [pluginInstances, setPluginInstances] = useState<{ id: string; name: string; icon: string; source?: string }[]>([]);
626
- const [pluginDefs, setPluginDefs] = useState<{ id: string; name: string; icon: string }[]>([]);
627
-
628
- useEffect(() => {
629
- fetch('/api/agents').then(r => r.json()).then(data => {
630
- const list = (data.agents || data || []).map((a: any) => ({
631
- id: a.id, name: a.name || a.id,
632
- isProfile: a.isProfile || a.base,
633
- base: a.base,
634
- cliType: a.cliType,
635
- backendType: a.backendType || 'cli',
636
- }));
637
- setAvailableAgents(list);
638
- }).catch(() => {});
639
- // Fetch saved smith templates
640
- fetch('/api/smith-templates').then(r => r.json()).then(data => {
641
- setSavedTemplates(data.templates || []);
642
- }).catch(() => {});
643
- // Fetch both: plugin definitions + installed instances
644
- Promise.all([
645
- fetch('/api/plugins').then(r => r.json()),
646
- fetch('/api/plugins?installed=true').then(r => r.json()),
647
- ]).then(([defData, instData]) => {
648
- setPluginDefs((defData.plugins || []).map((p: any) => ({ id: p.id, name: p.name, icon: p.icon })));
649
- setPluginInstances((instData.plugins || []).map((p: any) => ({
650
- id: p.id,
651
- name: p.instanceName || p.definition?.name || p.id,
652
- icon: p.definition?.icon || '🔌',
653
- source: p.source,
654
- })));
655
- }).catch(() => {});
656
- }, []);
657
- const [workDirVal, setWorkDirVal] = useState(initial.workDir || '');
658
- const [outputs, setOutputs] = useState((initial.outputs || []).join(', '));
659
- const [selectedDeps, setSelectedDeps] = useState<Set<string>>(new Set(initial.dependsOn || []));
660
- const [stepsText, setStepsText] = useState(
661
- (initial.steps || []).map(s => `${s.label}: ${s.prompt}`).join('\n') || ''
662
- );
663
- const [requiresApproval, setRequiresApproval] = useState(initial.requiresApproval || false);
664
- const [isPrimary, setIsPrimary] = useState(initial.primary || false);
665
- const hasPrimaryAlready = existingAgents.some(a => a.primary && a.id !== initial.id);
666
- const [persistentSession, setPersistentSession] = useState(initial.persistentSession || initial.primary || false);
667
- const [skipPermissions, setSkipPermissions] = useState(initial.skipPermissions !== false);
668
- const [agentModel, setAgentModel] = useState(initial.model || '');
669
- const [watchEnabled, setWatchEnabled] = useState(initial.watch?.enabled || false);
670
- const [watchInterval, setWatchInterval] = useState(String(initial.watch?.interval || 60));
671
- const [watchAction, setWatchAction] = useState<'log' | 'analyze' | 'approve' | 'send_message'>(initial.watch?.action || 'log');
672
- const [watchPrompt, setWatchPrompt] = useState(initial.watch?.prompt || '');
673
- const [watchSendTo, setWatchSendTo] = useState(initial.watch?.sendTo || '');
674
- const [selectedPlugins, setSelectedPlugins] = useState<string[]>(initial.plugins || []);
675
- const [recommendedTypes, setRecommendedTypes] = useState<string[]>([]);
676
- const [savedTemplates, setSavedTemplates] = useState<{ id: string; name: string; icon: string; description?: string; config: any }[]>([]);
677
- const [watchDebounce, setWatchDebounce] = useState(String(initial.watch?.targets?.[0]?.debounce ?? 10));
678
- const [watchTargets, setWatchTargets] = useState<{ type: string; path?: string; cmd?: string; pattern?: string }[]>(
679
- initial.watch?.targets || []
680
- );
681
- const [projectDirs, setProjectDirs] = useState<string[]>([]);
682
-
683
- useEffect(() => {
684
- if (!watchEnabled || !projectPath) return;
685
- fetch(`/api/code?dir=${encodeURIComponent(projectPath)}`)
686
- .then(r => r.json())
687
- .then(data => {
688
- // Collect directories with depth limit (max 2 levels for readability)
689
- const dirs: string[] = [];
690
- const walk = (nodes: any[], prefix = '', depth = 0) => {
691
- for (const n of nodes || []) {
692
- if (n.type === 'dir') {
693
- const path = prefix ? `${prefix}/${n.name}` : n.name;
694
- dirs.push(path);
695
- if (n.children && depth < 2) walk(n.children, path, depth + 1);
696
- }
697
- }
698
- };
699
- walk(data.tree || []);
700
- setProjectDirs(dirs);
701
- })
702
- .catch(() => {});
703
- }, [watchEnabled, projectPath]);
704
-
705
- const applyPreset = (p: Omit<AgentConfig, 'id'>) => {
706
- setLabel(p.label); setIcon(p.icon); setRole(p.role);
707
- setBackend(p.backend); setAgentId(p.agentId || 'claude');
708
- setWorkDirVal(p.workDir || './');
709
- setOutputs(p.outputs.join(', '));
710
- setStepsText(p.steps.map(s => `${s.label}: ${s.prompt}`).join('\n'));
711
- setRecommendedTypes(p.plugins || []);
712
- setSelectedPlugins(p.plugins || []);
713
- if (p.persistentSession !== undefined) setPersistentSession(!!p.persistentSession);
714
- if (p.skipPermissions !== undefined) setSkipPermissions(p.skipPermissions !== false);
715
- if (p.requiresApproval !== undefined) setRequiresApproval(!!p.requiresApproval);
716
- if (p.model) setAgentModel(p.model);
717
- if (p.watch) {
718
- setWatchEnabled(!!p.watch.enabled);
719
- setWatchInterval(String(p.watch.interval || 60));
720
- setWatchAction(p.watch.action || 'log');
721
- setWatchPrompt(p.watch.prompt || '');
722
- setWatchSendTo(p.watch.sendTo || '');
723
- setWatchTargets(p.watch.targets || []);
724
- setWatchDebounce(String(p.watch.targets?.[0]?.debounce ?? 10));
725
- }
726
- };
727
-
728
- const applySavedTemplate = (t: { config: any }) => {
729
- const c = t.config;
730
- applyPreset({
731
- label: c.label || '', icon: c.icon || '🤖', role: c.role || '',
732
- backend: c.backend || 'cli', agentId: c.agentId, dependsOn: [],
733
- workDir: c.workDir || './', outputs: c.outputs || [],
734
- steps: c.steps || [], plugins: c.plugins,
735
- persistentSession: c.persistentSession, skipPermissions: c.skipPermissions,
736
- requiresApproval: c.requiresApproval, model: c.model,
737
- watch: c.watch,
738
- } as any);
739
- };
740
-
741
- const handleImportFile = () => {
742
- const input = document.createElement('input');
743
- input.type = 'file';
744
- input.accept = '.json';
745
- input.onchange = async (e) => {
746
- const file = (e.target as HTMLInputElement).files?.[0];
747
- if (!file) return;
748
- try {
749
- const text = await file.text();
750
- const data = JSON.parse(text);
751
- // Support both raw config and template wrapper
752
- const config = data.config || data;
753
- applySavedTemplate({ config });
754
- } catch {
755
- alert('Invalid template file');
756
- }
757
- };
758
- input.click();
759
- };
760
-
761
- const toggleDep = (id: string) => {
762
- setSelectedDeps(prev => {
763
- const next = new Set(prev);
764
- if (next.has(id)) next.delete(id); else next.add(id);
765
- return next;
766
- });
767
- };
768
-
769
- const parseSteps = () => stepsText.split('\n').filter(Boolean).map((line, i) => {
770
- const [lbl, ...rest] = line.split(':');
771
- return { id: `step-${i}`, label: lbl.trim(), prompt: rest.join(':').trim() || lbl.trim() };
772
- });
773
-
774
- // Filter out self when editing
775
- const otherAgents = existingAgents.filter(a => a.id !== initial.id);
776
-
777
- return (
778
- <div className="fixed inset-0 z-50 flex items-center justify-center" style={{ background: 'rgba(0,0,0,0.75)' }}
779
- onClick={e => { if (e.target === e.currentTarget) onCancel(); }}>
780
- <div className="w-[440px] max-h-[80vh] overflow-auto rounded-lg border border-[#30363d] p-4 shadow-xl" style={{ background: '#0d1117' }}>
781
- <div className="flex items-center justify-between mb-3">
782
- <span className="text-sm font-bold text-white">{mode === 'add' ? 'Add Agent' : 'Edit Agent'}</span>
783
- <button onClick={onCancel} className="text-gray-500 hover:text-white text-xs">✕</button>
784
- </div>
785
-
786
- <div className="flex flex-col gap-2.5">
787
- {/* Preset + saved templates (add mode only) */}
788
- {mode === 'add' && (
789
- <div className="flex flex-col gap-1">
790
- <label className="text-[9px] text-gray-500 uppercase">Presets</label>
791
- <div className="flex gap-1 flex-wrap">
792
- {PRESET_AGENTS.map((p, i) => (
793
- <button key={i} onClick={() => applyPreset(p)}
794
- title={p.primary ? 'Recommended for Primary smith (runs at project root, coordinates others)' : p.label}
795
- className={`text-[9px] px-2 py-1 rounded border transition-colors ${label === p.label ? 'border-[#58a6ff] text-[#58a6ff] bg-[#58a6ff]/10' : p.primary ? 'border-[#f0883e]/40 text-[#f0883e] hover:border-[#f0883e]' : 'border-[#30363d] text-gray-400 hover:text-white'}`}>
796
- {p.icon} {p.label}{p.primary ? ' ★' : ''}
797
- </button>
798
- ))}
799
- <button onClick={() => { setLabel(''); setIcon('🤖'); setRole(''); setStepsText(''); setOutputs(''); }}
800
- className={`text-[9px] px-2 py-1 rounded border border-dashed ${!label ? 'border-[#58a6ff] text-[#58a6ff]' : 'border-[#30363d] text-gray-500 hover:text-white'}`}>
801
- Custom
802
- </button>
803
- </div>
804
- {savedTemplates.length > 0 && (<>
805
- <label className="text-[9px] text-gray-500 uppercase mt-1">Saved Templates</label>
806
- <div className="flex gap-1 flex-wrap">
807
- {savedTemplates.map(t => (
808
- <button key={t.id} onClick={() => applySavedTemplate(t)}
809
- className={`text-[9px] px-2 py-1 rounded border transition-colors ${label === t.config?.label ? 'border-[#f0883e] text-[#f0883e] bg-[#f0883e]/10' : 'border-[#30363d] text-gray-400 hover:text-white'}`}
810
- title={t.description || t.name}>
811
- {t.icon} {t.name}
812
- </button>
813
- ))}
814
- </div>
815
- </>)}
816
- <button onClick={handleImportFile}
817
- className="text-[9px] px-2 py-1 rounded border border-dashed border-[#30363d] text-gray-500 hover:text-white hover:border-gray-400 self-start mt-0.5">
818
- 📂 Import from file
819
- </button>
820
- </div>
821
- )}
822
-
823
- {/* Icon + Label */}
824
- <div className="flex gap-2">
825
- <div className="flex flex-col gap-1">
826
- <label className="text-[9px] text-gray-500 uppercase">Icon</label>
827
- <input value={icon} onChange={e => setIcon(e.target.value)} className="w-12 text-center text-sm bg-[#161b22] border border-[#30363d] rounded px-1 py-1 text-white focus:outline-none focus:border-[#58a6ff]" />
828
- </div>
829
- <div className="flex flex-col gap-1 flex-1">
830
- <label className="text-[9px] text-gray-500 uppercase">Label</label>
831
- <input value={label} onChange={e => setLabel(e.target.value)} placeholder="e.g. Engineer" className="text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-white focus:outline-none focus:border-[#58a6ff]" />
832
- </div>
833
- </div>
834
-
835
- {/* Backend */}
836
- <div className="flex flex-col gap-1">
837
- <label className="text-[9px] text-gray-500 uppercase">Backend</label>
838
- <div className="flex gap-1">
839
- {(['cli', 'api'] as const).map(b => (
840
- <button key={b} onClick={() => setBackend(b)}
841
- className={`text-[9px] px-2 py-1 rounded border ${backend === b ? 'border-[#58a6ff] text-[#58a6ff] bg-[#58a6ff]/10' : 'border-[#30363d] text-gray-400 hover:text-white'}`}>
842
- {b === 'cli' ? 'CLI (subscription)' : 'API (api key)'}
843
- </button>
844
- ))}
845
- </div>
846
- </div>
847
-
848
- {/* Agent selection — dynamic from /api/agents */}
849
- {backend === 'cli' && (
850
- <div className="flex flex-col gap-1">
851
- <label className="text-[9px] text-gray-500 uppercase">Agent / Profile</label>
852
- <div className="flex gap-1 flex-wrap">
853
- {(availableAgents.length > 0
854
- ? availableAgents.filter(a => a.backendType !== 'api')
855
- : [{ id: 'claude', name: 'claude' }, { id: 'codex', name: 'codex' }, { id: 'aider', name: 'aider' }]
856
- ).map(a => (
857
- <button key={a.id} onClick={() => setAgentId(a.id)}
858
- className={`text-[9px] px-2 py-1 rounded border ${agentId === a.id ? 'border-[#58a6ff] text-[#58a6ff] bg-[#58a6ff]/10' : 'border-[#30363d] text-gray-400 hover:text-white'}`}>
859
- {a.name}{a.isProfile ? ' ●' : ''}
860
- </button>
861
- ))}
862
- </div>
863
- </div>
864
- )}
865
- {backend === 'api' && (
866
- <div className="flex flex-col gap-1">
867
- <label className="text-[9px] text-gray-500 uppercase">API Profile</label>
868
- <div className="flex gap-1 flex-wrap">
869
- {availableAgents.filter(a => a.backendType === 'api').map(a => (
870
- <button key={a.id} onClick={() => setAgentId(a.id)}
871
- className={`text-[9px] px-2 py-1 rounded border ${agentId === a.id ? 'border-[#58a6ff] text-[#58a6ff] bg-[#58a6ff]/10' : 'border-[#30363d] text-gray-400 hover:text-white'}`}>
872
- {a.name}
873
- </button>
874
- ))}
875
- {availableAgents.filter(a => a.backendType === 'api').length === 0 && (
876
- <span className="text-[9px] text-gray-600">No API profiles configured. Add in Settings.</span>
877
- )}
878
- </div>
879
- </div>
880
- )}
881
-
882
- {/* Role */}
883
- <div className="flex flex-col gap-1">
884
- <label className="text-[9px] text-gray-500 uppercase">Role / System Prompt</label>
885
- <textarea value={role} onChange={e => setRole(e.target.value)} rows={5}
886
- placeholder="Describe this agent's role, responsibilities, available tools, and decision criteria. This will be synced to CLAUDE.md in the agent's working directory."
887
- className="text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-white focus:outline-none focus:border-[#58a6ff] resize-y" />
888
- </div>
889
-
890
- {/* Plugin Instances grouped by plugin */}
891
- <div className="flex flex-col gap-1">
892
- <label className="text-[9px] text-gray-500 uppercase">Plugin Instances</label>
893
- {(() => {
894
- const withSource = pluginInstances.filter(i => i.source);
895
- if (withSource.length === 0) return <span className="text-[8px] text-gray-600">No instances — create in Marketplace → Plugins</span>;
896
- // Group by source plugin
897
- const groups: Record<string, typeof withSource> = {};
898
- for (const inst of withSource) {
899
- const key = inst.source!;
900
- if (!groups[key]) groups[key] = [];
901
- groups[key].push(inst);
902
- }
903
- // Show recommended types that have no instances yet
904
- const missingRecommended = recommendedTypes.filter(rt =>
905
- !withSource.some(i => i.source === rt)
906
- );
907
-
908
- return <>
909
- {Object.entries(groups).map(([sourceId, insts]) => {
910
- const def = pluginDefs.find(d => d.id === sourceId);
911
- const isRecommended = recommendedTypes.includes(sourceId);
912
- return (
913
- <div key={sourceId} className="flex items-start gap-2">
914
- <span className={`text-[9px] shrink-0 w-20 pt-1 truncate ${isRecommended ? 'text-[#58a6ff]' : 'text-gray-500'}`} title={def?.name || sourceId}>
915
- {def?.icon || '🔌'} {def?.name || sourceId}
916
- {isRecommended && <span className="text-[7px] ml-0.5">★</span>}
917
- </span>
918
- <div className="flex flex-wrap gap-1 flex-1">
919
- {insts.map(inst => {
920
- const selected = selectedPlugins.includes(inst.id);
921
- return (
922
- <button key={inst.id}
923
- onClick={() => setSelectedPlugins(prev => selected ? prev.filter(x => x !== inst.id) : [...prev, inst.id])}
924
- className={`text-[9px] px-2 py-0.5 rounded border transition-colors ${
925
- selected
926
- ? 'border-green-500/40 text-green-400 bg-green-500/10'
927
- : isRecommended
928
- ? 'border-[#58a6ff]/30 text-[#58a6ff]/70 hover:text-[#58a6ff]'
929
- : 'border-[#30363d] text-gray-500 hover:text-gray-300'
930
- }`}>
931
- {inst.name}
932
- </button>
933
- );
934
- })}
935
- </div>
936
- </div>
937
- );
938
- })}
939
- {missingRecommended.length > 0 && missingRecommended.map(rt => {
940
- const def = pluginDefs.find(d => d.id === rt);
941
- return (
942
- <div key={rt} className="flex items-start gap-2">
943
- <span className="text-[9px] text-[#58a6ff] shrink-0 w-20 pt-1 truncate">
944
- {def?.icon || '🔌'} {def?.name || rt}<span className="text-[7px] ml-0.5">★</span>
945
- </span>
946
- <span className="text-[8px] text-[#58a6ff]/50 italic pt-1">No instances — create in Marketplace → Plugins</span>
947
- </div>
948
- );
949
- })}
950
- </>;
951
-
952
- })()}
953
- </div>
954
-
955
- {/* Depends On — checkbox list of existing agents */}
956
- {otherAgents.length > 0 && (
957
- <div className="flex flex-col gap-1">
958
- <label className="text-[9px] text-gray-500 uppercase">Depends On (upstream agents)</label>
959
- <div className="flex flex-wrap gap-1.5">
960
- {otherAgents.map(a => (
961
- <button key={a.id} onClick={() => toggleDep(a.id)}
962
- className={`text-[9px] px-2 py-1 rounded border flex items-center gap-1 ${
963
- selectedDeps.has(a.id)
964
- ? 'border-[#58a6ff] text-[#58a6ff] bg-[#58a6ff]/10'
965
- : 'border-[#30363d] text-gray-400 hover:text-white'}`}>
966
- <span>{selectedDeps.has(a.id) ? '☑' : '☐'}</span>
967
- <span>{a.icon} {a.label}</span>
968
- </button>
969
- ))}
970
- </div>
971
- </div>
972
- )}
973
-
974
- {/* Work Dir + Outputs */}
975
- <div className="flex gap-2">
976
- <div className="flex flex-col gap-1 w-28">
977
- <label className="text-[9px] text-gray-500 uppercase">Work Dir</label>
978
- <input value={isPrimary ? './' : workDirVal} onChange={e => !isPrimary && setWorkDirVal(e.target.value)} placeholder={label ? `${label.toLowerCase().replace(/\s+/g, '-')}/` : 'engineer/'}
979
- disabled={isPrimary}
980
- className={`text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-white focus:outline-none focus:border-[#58a6ff] ${isPrimary ? 'opacity-50 cursor-not-allowed' : ''}`} />
981
- <div className="text-[8px] text-gray-600 mt-0.5">
982
- → {'{project}/'}{(workDirVal || (label ? `${label.toLowerCase().replace(/\s+/g, '-')}/` : '')).replace(/^\.?\//, '')}
983
- </div>
984
- </div>
985
- <div className="flex flex-col gap-1 flex-1">
986
- <label className="text-[9px] text-gray-500 uppercase">Outputs</label>
987
- <input value={outputs} onChange={e => setOutputs(e.target.value)} placeholder="docs/prd.md, src/"
988
- className="text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-white focus:outline-none focus:border-[#58a6ff]" />
989
- </div>
990
- </div>
991
-
992
- {/* Primary Agent */}
993
- <div className="flex items-center gap-2">
994
- <input type="checkbox" id="primaryAgent" checked={isPrimary}
995
- onChange={e => {
996
- const v = e.target.checked;
997
- setIsPrimary(v);
998
- if (v) { setPersistentSession(true); setWorkDirVal('./'); }
999
- }}
1000
- disabled={hasPrimaryAlready && !isPrimary}
1001
- className={`accent-[#f0883e] ${hasPrimaryAlready && !isPrimary ? 'opacity-50 cursor-not-allowed' : ''}`} />
1002
- <label htmlFor="primaryAgent" className={`text-[9px] ${isPrimary ? 'text-[#f0883e] font-medium' : 'text-gray-400'}`}>
1003
- Primary agent (terminal-only, root directory, fixed session)
1004
- {hasPrimaryAlready && !isPrimary && <span className="text-gray-600 ml-1">— already set on another agent</span>}
1005
- </label>
1006
- </div>
1007
-
1008
- {/* Requires Approval */}
1009
- <div className="flex items-center gap-2">
1010
- <input type="checkbox" id="requiresApproval" checked={requiresApproval} onChange={e => setRequiresApproval(e.target.checked)}
1011
- className="accent-[#58a6ff]" />
1012
- <label htmlFor="requiresApproval" className="text-[9px] text-gray-400">Require approval before processing inbox messages</label>
1013
- </div>
1014
-
1015
- {/* Persistent Session — only for claude-code based agents */}
1016
- {(() => {
1017
- // Check if selected agent supports terminal mode (claude-code or its profiles)
1018
- const selectedAgent = availableAgents.find(a => a.id === agentId);
1019
- const isClaude = selectedAgent?.cliType === 'claude-code' || selectedAgent?.base === 'claude' || !selectedAgent;
1020
- const canTerminal = isClaude || isPrimary;
1021
- return canTerminal ? (
1022
- <>
1023
- <div className="flex items-center gap-2">
1024
- <input type="checkbox" id="persistentSession" checked={persistentSession} onChange={e => !isPrimary && setPersistentSession(e.target.checked)}
1025
- disabled={isPrimary}
1026
- className={`accent-[#3fb950] ${isPrimary ? 'opacity-50 cursor-not-allowed' : ''}`} />
1027
- <label htmlFor="persistentSession" className={`text-[9px] text-gray-400 ${isPrimary ? 'opacity-50' : ''}`}>
1028
- Terminal mode {isPrimary ? '(required for primary)' : '— run in terminal instead of headless'}
1029
- </label>
1030
- </div>
1031
- {persistentSession && (
1032
- <div className="flex flex-col gap-1.5 ml-4">
1033
- <div className="flex items-center gap-2">
1034
- <input type="checkbox" id="skipPermissions" checked={skipPermissions} onChange={e => setSkipPermissions(e.target.checked)}
1035
- className="accent-[#f0883e]" />
1036
- <label htmlFor="skipPermissions" className="text-[9px] text-gray-400">Skip permissions (auto-approve all tool calls)</label>
1037
- </div>
1038
- </div>
1039
- )}
1040
- </>
1041
- ) : (
1042
- <div className="text-[8px] text-gray-500 bg-gray-500/10 px-2 py-1 rounded">
1043
- Headless mode only — {agentId} does not support terminal mode
1044
- </div>
1045
- );
1046
- })()}
1047
-
1048
- {/* Model override — only for claude-code agents */}
1049
- {(() => {
1050
- const sa = availableAgents.find(a => a.id === agentId);
1051
- const ct = sa?.cliType || (agentId === 'claude' ? 'claude-code' : '');
1052
- if (ct !== 'claude-code') return null;
1053
- return (
1054
- <div className="flex flex-col gap-0.5">
1055
- <label className="text-[9px] text-gray-500 uppercase">Model</label>
1056
- <input value={agentModel} onChange={e => setAgentModel(e.target.value)}
1057
- placeholder="default (uses profile or system default)"
1058
- list="workspace-model-list"
1059
- className="text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-white focus:outline-none focus:border-[#58a6ff] font-mono" />
1060
- <datalist id="workspace-model-list">
1061
- <option value="claude-sonnet-4-6" />
1062
- <option value="claude-opus-4-6" />
1063
- <option value="claude-haiku-4-5-20251001" />
1064
- </datalist>
1065
- </div>
1066
- );
1067
- })()}
1068
-
1069
- {/* Steps */}
1070
- <div className="flex flex-col gap-1">
1071
- <label className="text-[9px] text-gray-500 uppercase">Steps (one per line — Label: Prompt)</label>
1072
- <textarea value={stepsText} onChange={e => setStepsText(e.target.value)} rows={4}
1073
- placeholder="Analyze: Read docs and identify requirements&#10;Write: Write PRD to docs/prd.md&#10;Review: Review and improve"
1074
- className="text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-white focus:outline-none focus:border-[#58a6ff] resize-none font-mono" />
1075
- </div>
1076
-
1077
- {/* Watch */}
1078
- <div className="flex flex-col gap-1.5 border-t border-[#21262d] pt-2 mt-1">
1079
- <div className="flex items-center gap-2">
1080
- <label className="text-[9px] text-gray-500 uppercase">Watch</label>
1081
- <input type="checkbox" checked={watchEnabled} onChange={e => setWatchEnabled(e.target.checked)}
1082
- className="accent-[#58a6ff]" />
1083
- <span className="text-[8px] text-gray-600">Autonomous periodic monitoring</span>
1084
- </div>
1085
- {watchEnabled && (<>
1086
- <div className="flex gap-2">
1087
- <div className="flex flex-col gap-0.5">
1088
- <label className="text-[8px] text-gray-600">Interval (s)</label>
1089
- <input value={watchInterval} onChange={e => setWatchInterval(e.target.value)} type="number" min="10"
1090
- className="text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-white focus:outline-none focus:border-[#58a6ff] w-16" />
1091
- </div>
1092
- <div className="flex flex-col gap-0.5">
1093
- <label className="text-[8px] text-gray-600">Debounce (s)</label>
1094
- <input value={watchDebounce} onChange={e => setWatchDebounce(e.target.value)} type="number" min="0"
1095
- className="text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-white focus:outline-none focus:border-[#58a6ff] w-16" />
1096
- </div>
1097
- <div className="flex flex-col gap-0.5 flex-1">
1098
- <label className="text-[8px] text-gray-600">On Change</label>
1099
- <select value={watchAction} onChange={e => setWatchAction(e.target.value as any)}
1100
- className="text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-white focus:outline-none focus:border-[#58a6ff]">
1101
- <option value="log">Log only</option>
1102
- <option value="analyze">Auto analyze</option>
1103
- <option value="approve">Require approval</option>
1104
- <option value="send_message">Send to agent</option>
1105
- </select>
1106
- </div>
1107
- {watchAction === 'send_message' && (
1108
- <div className="flex flex-col gap-0.5 flex-1">
1109
- <label className="text-[8px] text-gray-600">Send to</label>
1110
- <select value={watchSendTo} onChange={e => setWatchSendTo(e.target.value)}
1111
- className="text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-white focus:outline-none focus:border-[#58a6ff]">
1112
- <option value="">Select agent...</option>
1113
- {existingAgents.filter(a => a.id !== initial.id).map(a =>
1114
- <option key={a.id} value={a.id}>{a.icon} {a.label}</option>
1115
- )}
1116
- </select>
1117
- </div>
1118
- )}
1119
- </div>
1120
- <div className="flex flex-col gap-1">
1121
- <label className="text-[8px] text-gray-600">Targets</label>
1122
- {watchTargets.map((t, i) => (
1123
- <div key={i} className="flex items-center gap-1">
1124
- <select value={t.type} onChange={e => {
1125
- const next = [...watchTargets];
1126
- next[i] = { type: e.target.value };
1127
- setWatchTargets(next);
1128
- }} className="text-[10px] bg-[#161b22] border border-[#30363d] rounded px-1 py-0.5 text-white w-24">
1129
- <option value="directory">Directory</option>
1130
- <option value="git">Git</option>
1131
- <option value="agent_output">Agent Output</option>
1132
- <option value="agent_log">Agent Log</option>
1133
- <option value="session">Session Output</option>
1134
- <option value="command">Command</option>
1135
- <option value="agent_status">Agent Status</option>
1136
- </select>
1137
- {t.type === 'directory' && (
1138
- <WatchPathPicker
1139
- value={t.path || ''}
1140
- projectPath={projectPath || ''}
1141
- onChange={v => {
1142
- const next = [...watchTargets];
1143
- next[i] = { ...t, path: v };
1144
- setWatchTargets(next);
1145
- }}
1146
- />
1147
- )}
1148
- {t.type === 'agent_status' && (<>
1149
- <select value={t.path || ''} onChange={e => {
1150
- const next = [...watchTargets];
1151
- next[i] = { ...t, path: e.target.value };
1152
- setWatchTargets(next);
1153
- }} className="text-[10px] bg-[#161b22] border border-[#30363d] rounded px-1 py-0.5 text-white flex-1">
1154
- <option value="">Select agent...</option>
1155
- {existingAgents.filter(a => a.id !== initial.id).map(a =>
1156
- <option key={a.id} value={a.id}>{a.icon} {a.label}</option>
1157
- )}
1158
- </select>
1159
- <select value={t.pattern || ''} onChange={e => {
1160
- const next = [...watchTargets];
1161
- next[i] = { ...t, pattern: e.target.value };
1162
- setWatchTargets(next);
1163
- }} className="text-[10px] bg-[#161b22] border border-[#30363d] rounded px-1 py-0.5 text-white w-20">
1164
- <option value="">Any change</option>
1165
- <option value="done">done</option>
1166
- <option value="failed">failed</option>
1167
- <option value="running">running</option>
1168
- <option value="idle">idle</option>
1169
- </select>
1170
- </>)}
1171
- {t.type === 'agent_output' && (
1172
- <select value={t.path || ''} onChange={e => {
1173
- const next = [...watchTargets];
1174
- next[i] = { ...t, path: e.target.value };
1175
- setWatchTargets(next);
1176
- }} className="text-[10px] bg-[#161b22] border border-[#30363d] rounded px-1 py-0.5 text-white flex-1">
1177
- <option value="">Select agent...</option>
1178
- {existingAgents.filter(a => a.id !== initial.id).map(a =>
1179
- <option key={a.id} value={a.id}>{a.icon} {a.label}</option>
1180
- )}
1181
- </select>
1182
- )}
1183
- {t.type === 'agent_log' && (<>
1184
- <select value={t.path || ''} onChange={e => {
1185
- const next = [...watchTargets];
1186
- next[i] = { ...t, path: e.target.value };
1187
- setWatchTargets(next);
1188
- }} className="text-[10px] bg-[#161b22] border border-[#30363d] rounded px-1 py-0.5 text-white flex-1">
1189
- <option value="">Select agent...</option>
1190
- {existingAgents.filter(a => a.id !== initial.id).map(a =>
1191
- <option key={a.id} value={a.id}>{a.icon} {a.label}</option>
1192
- )}
1193
- </select>
1194
- <input value={t.pattern || ''} onChange={e => {
1195
- const next = [...watchTargets];
1196
- next[i] = { ...t, pattern: e.target.value };
1197
- setWatchTargets(next);
1198
- }} placeholder="keyword (optional)"
1199
- className="text-[10px] bg-[#161b22] border border-[#30363d] rounded px-1 py-0.5 text-white w-24" />
1200
- </>)}
1201
- {t.type === 'session' && (
1202
- <SessionTargetSelector
1203
- target={t}
1204
- agents={existingAgents.filter(a => a.id !== initial.id)}
1205
- projectPath={projectPath}
1206
- onChange={(updated) => {
1207
- const next = [...watchTargets];
1208
- next[i] = updated;
1209
- setWatchTargets(next);
1210
- }}
1211
- />
1212
- )}
1213
- {t.type === 'command' && (
1214
- <input value={t.cmd || ''} onChange={e => {
1215
- const next = [...watchTargets];
1216
- next[i] = { ...t, cmd: e.target.value };
1217
- setWatchTargets(next);
1218
- }} placeholder="npm test"
1219
- className="text-[10px] bg-[#161b22] border border-[#30363d] rounded px-1 py-0.5 text-white flex-1" />
1220
- )}
1221
- <button onClick={() => setWatchTargets(watchTargets.filter((_, j) => j !== i))}
1222
- className="text-[9px] text-gray-500 hover:text-red-400">✕</button>
1223
- </div>
1224
- ))}
1225
- <button onClick={() => setWatchTargets([...watchTargets, { type: 'directory' }])}
1226
- className="text-[8px] text-gray-500 hover:text-[#58a6ff] self-start">+ Add target</button>
1227
- </div>
1228
- {watchAction === 'analyze' && (
1229
- <div className="flex flex-col gap-0.5">
1230
- <label className="text-[8px] text-gray-600">Analysis prompt (optional)</label>
1231
- <input value={watchPrompt} onChange={e => setWatchPrompt(e.target.value)}
1232
- placeholder="Analyze these changes and check for issues..."
1233
- className="text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-white focus:outline-none focus:border-[#58a6ff]" />
1234
- </div>
1235
- )}
1236
- {watchAction === 'send_message' && (
1237
- <div className="flex flex-col gap-0.5">
1238
- <label className="text-[8px] text-gray-600">Message context (sent with detected changes)</label>
1239
- <input value={watchPrompt} onChange={e => setWatchPrompt(e.target.value)}
1240
- placeholder="Review the following changes and report issues..."
1241
- className="text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1 text-white focus:outline-none focus:border-[#58a6ff]" />
1242
- </div>
1243
- )}
1244
- </>)}
1245
- </div>
1246
- </div>
1247
-
1248
- <div className="flex justify-end gap-2 mt-4">
1249
- {mode === 'edit' && (
1250
- <button onClick={() => {
1251
- const config = {
1252
- label: label.trim(), icon: icon.trim() || '🤖', role: role.trim(),
1253
- backend, agentId, workDir: workDirVal.trim() || './',
1254
- outputs: outputs.split(',').map(s => s.trim()).filter(Boolean),
1255
- steps: parseSteps(), plugins: selectedPlugins.length > 0 ? selectedPlugins : undefined,
1256
- persistentSession: persistentSession || undefined, skipPermissions: persistentSession ? (skipPermissions ? undefined : false) : undefined,
1257
- model: agentModel || undefined, requiresApproval: requiresApproval || undefined,
1258
- watch: watchEnabled && watchTargets.length > 0 ? { enabled: true, interval: Math.max(10, parseInt(watchInterval) || 60), targets: watchTargets.map(t => ({ ...t, debounce: parseInt(watchDebounce) || 10 })), action: watchAction, prompt: watchPrompt || undefined, sendTo: watchSendTo || undefined } : undefined,
1259
- };
1260
- const blob = new Blob([JSON.stringify({ config, name: label.trim(), icon: icon.trim() || '🤖', exportedAt: Date.now() }, null, 2)], { type: 'application/json' });
1261
- const url = URL.createObjectURL(blob);
1262
- const a = document.createElement('a');
1263
- a.href = url; a.download = `smith-${label.trim().toLowerCase().replace(/\s+/g, '-')}.json`; a.click();
1264
- URL.revokeObjectURL(url);
1265
- }} className="text-xs px-3 py-1.5 rounded border border-[#30363d] text-gray-400 hover:text-white mr-auto" title="Export config as file">
1266
- 📤 Export
1267
- </button>
1268
- )}
1269
- <button onClick={onCancel} className="text-xs px-3 py-1.5 rounded border border-[#30363d] text-gray-400 hover:text-white">Cancel</button>
1270
- <button disabled={!label.trim()} onClick={() => {
1271
- onConfirm({
1272
- label: label.trim(), icon: icon.trim() || '🤖', role: role.trim(),
1273
- backend, agentId, dependsOn: Array.from(selectedDeps),
1274
- workDir: isPrimary ? './' : (workDirVal.trim() || label.trim().toLowerCase().replace(/\s+/g, '-') + '/'),
1275
- outputs: outputs.split(',').map(s => s.trim()).filter(Boolean),
1276
- steps: parseSteps(),
1277
- primary: isPrimary || undefined,
1278
- requiresApproval: requiresApproval || undefined,
1279
- persistentSession: (() => {
1280
- if (isPrimary) return true;
1281
- // Non-terminal agents (codex, aider, etc.) force headless
1282
- const sa = availableAgents.find(a => a.id === agentId);
1283
- const isClaude = sa?.cliType === 'claude-code' || sa?.base === 'claude' || !sa;
1284
- return (isClaude || isPrimary) ? (persistentSession || undefined) : false;
1285
- })(),
1286
- skipPermissions: persistentSession ? (skipPermissions ? undefined : false) : undefined,
1287
- model: agentModel || undefined,
1288
- watch: watchEnabled && watchTargets.length > 0 ? {
1289
- enabled: true,
1290
- interval: Math.max(10, parseInt(watchInterval) || 60),
1291
- targets: watchTargets.map(t => ({ ...t, debounce: parseInt(watchDebounce) || 10 })),
1292
- action: watchAction,
1293
- prompt: watchPrompt || undefined,
1294
- sendTo: watchSendTo || undefined,
1295
- } : undefined,
1296
- plugins: selectedPlugins.length > 0 ? selectedPlugins : undefined,
1297
- } as any);
1298
- }} className="text-xs px-3 py-1.5 rounded bg-[#238636] text-white hover:bg-[#2ea043] disabled:opacity-40">
1299
- {mode === 'add' ? 'Add' : 'Save'}
1300
- </button>
1301
- </div>
1302
- </div>
1303
- </div>
1304
- );
1305
- }
1306
-
1307
- // ─── Message Dialog ──────────────────────────────────────
1308
-
1309
- function MessageDialog({ agentLabel, onSend, onCancel }: {
1310
- agentLabel: string;
1311
- onSend: (msg: string) => void;
1312
- onCancel: () => void;
1313
- }) {
1314
- const [msg, setMsg] = useState('');
1315
- return (
1316
- <div className="fixed inset-0 z-50 flex items-center justify-center" style={{ background: 'rgba(0,0,0,0.75)' }}
1317
- onClick={e => { if (e.target === e.currentTarget) onCancel(); }}>
1318
- <div className="w-96 rounded-lg border border-[#30363d] p-4 shadow-xl" style={{ background: '#0d1117' }}>
1319
- <div className="text-sm font-bold text-white mb-2">Message to {agentLabel}</div>
1320
- <textarea value={msg} onChange={e => setMsg(e.target.value)} rows={3} autoFocus
1321
- placeholder="Type your message..."
1322
- className="w-full text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1.5 text-white focus:outline-none focus:border-[#58a6ff] resize-none" />
1323
- <div className="flex justify-end gap-2 mt-3">
1324
- <button onClick={onCancel} className="text-xs px-3 py-1.5 rounded border border-[#30363d] text-gray-400 hover:text-white">Cancel</button>
1325
- <button onClick={() => { if (msg.trim()) onSend(msg.trim()); }}
1326
- className="text-xs px-3 py-1.5 rounded bg-[#238636] text-white hover:bg-[#2ea043]">Send</button>
1327
- </div>
1328
- </div>
1329
- </div>
1330
- );
1331
- }
1332
-
1333
- // ─── Run Prompt Dialog ───────────────────────────────────
1334
-
1335
- function RunPromptDialog({ agentLabel, onRun, onCancel }: {
1336
- agentLabel: string;
1337
- onRun: (input: string) => void;
1338
- onCancel: () => void;
1339
- }) {
1340
- const [input, setInput] = useState('');
1341
- return (
1342
- <div className="fixed inset-0 z-50 flex items-center justify-center" style={{ background: 'rgba(0,0,0,0.75)' }}
1343
- onClick={e => { if (e.target === e.currentTarget) onCancel(); }}>
1344
- <div className="w-[460px] rounded-lg border border-[#30363d] p-4 shadow-xl" style={{ background: '#0d1117' }}>
1345
- <div className="text-sm font-bold text-white mb-1">Run {agentLabel}</div>
1346
- <div className="text-[9px] text-gray-500 mb-3">Describe the task or requirements. This will be the initial input for the agent.</div>
1347
- <textarea value={input} onChange={e => setInput(e.target.value)} rows={5} autoFocus
1348
- placeholder="e.g. Build a REST API for user management with login, registration, and profile endpoints. Use Express + TypeScript + PostgreSQL."
1349
- className="w-full text-xs bg-[#161b22] border border-[#30363d] rounded px-2 py-1.5 text-white focus:outline-none focus:border-[#58a6ff] resize-none" />
1350
- <div className="flex items-center justify-between mt-3">
1351
- <span className="text-[8px] text-gray-600">Leave empty to run without specific input</span>
1352
- <div className="flex gap-2">
1353
- <button onClick={onCancel} className="text-xs px-3 py-1.5 rounded border border-[#30363d] text-gray-400 hover:text-white">Cancel</button>
1354
- <button onClick={() => onRun(input.trim())}
1355
- className="text-xs px-3 py-1.5 rounded bg-[#238636] text-white hover:bg-[#2ea043]">▶ Run</button>
1356
- </div>
1357
- </div>
1358
- </div>
1359
- </div>
1360
- );
1361
- }
1362
-
1363
- // ─── Log Panel (overlay) ─────────────────────────────────
1364
-
1365
- /** Format log content: extract readable text from JSON, format nicely */
1366
- function LogContent({ content, subtype }: { content: string; subtype?: string }) {
1367
- if (!content) return null;
1368
- const MAX_LINES = 40;
1369
- const MAX_CHARS = 4000;
1370
-
1371
- let text = content;
1372
-
1373
- // Try to parse JSON and extract human-readable content
1374
- if (text.startsWith('{') || text.startsWith('[')) {
1375
- try {
1376
- const parsed = JSON.parse(text);
1377
- if (typeof parsed === 'string') {
1378
- text = parsed;
1379
- } else if (parsed.content) {
1380
- text = String(parsed.content);
1381
- } else if (parsed.text) {
1382
- text = String(parsed.text);
1383
- } else if (parsed.result) {
1384
- text = typeof parsed.result === 'string' ? parsed.result : JSON.stringify(parsed.result, null, 2);
1385
- } else if (parsed.message?.content) {
1386
- // Claude stream-json format
1387
- const blocks = Array.isArray(parsed.message.content) ? parsed.message.content : [parsed.message.content];
1388
- text = blocks.map((b: any) => {
1389
- if (typeof b === 'string') return b;
1390
- if (b.type === 'text') return b.text;
1391
- if (b.type === 'tool_use') return `🔧 ${b.name}(${typeof b.input === 'string' ? b.input : JSON.stringify(b.input).slice(0, 100)})`;
1392
- if (b.type === 'tool_result') return `→ ${typeof b.content === 'string' ? b.content.slice(0, 200) : JSON.stringify(b.content).slice(0, 200)}`;
1393
- return JSON.stringify(b).slice(0, 100);
1394
- }).join('\n');
1395
- } else if (Array.isArray(parsed)) {
1396
- text = parsed.map((item: any) => typeof item === 'string' ? item : JSON.stringify(item)).join('\n');
1397
- } else {
1398
- // Generic object — show key fields only
1399
- const keys = Object.keys(parsed);
1400
- if (keys.length <= 5) {
1401
- text = keys.map(k => `${k}: ${typeof parsed[k] === 'string' ? parsed[k] : JSON.stringify(parsed[k]).slice(0, 80)}`).join('\n');
1402
- } else {
1403
- text = JSON.stringify(parsed, null, 2);
1404
- }
1405
- }
1406
- } catch {
1407
- // Not valid JSON, keep as-is
1408
- }
1409
- }
1410
-
1411
- // Truncate
1412
- const lines = text.split('\n');
1413
- const truncatedLines = lines.length > MAX_LINES;
1414
- const truncatedChars = text.length > MAX_CHARS;
1415
- if (truncatedLines) text = lines.slice(0, MAX_LINES).join('\n');
1416
- if (truncatedChars) text = text.slice(0, MAX_CHARS);
1417
- const truncated = truncatedLines || truncatedChars;
1418
-
1419
- return (
1420
- <span className="break-all">
1421
- <pre className="whitespace-pre-wrap text-[10px] leading-relaxed inline">{text}</pre>
1422
- {truncated && <span className="text-gray-600 text-[9px]"> ...({lines.length} lines)</span>}
1423
- </span>
1424
- );
1425
- }
1426
-
1427
- function LogPanel({ agentId, agentLabel, workspaceId, onClose }: {
1428
- agentId: string; agentLabel: string; workspaceId: string; onClose: () => void;
1429
- }) {
1430
- const [logs, setLogs] = useState<any[]>([]);
1431
- const [filter, setFilter] = useState<'all' | 'messages' | 'summaries'>('all');
1432
- const scrollRef = useRef<HTMLDivElement>(null);
1433
-
1434
- useEffect(() => {
1435
- // Read persistent logs from logs.jsonl (not in-memory state history)
1436
- fetch(`/api/workspace/${workspaceId}/smith`, {
1437
- method: 'POST', headers: { 'Content-Type': 'application/json' },
1438
- body: JSON.stringify({ action: 'logs', agentId }),
1439
- }).then(r => r.json()).then(data => {
1440
- if (data.logs?.length) setLogs(data.logs);
1441
- }).catch(() => {});
1442
- }, [workspaceId, agentId]);
1443
-
1444
- useEffect(() => {
1445
- scrollRef.current?.scrollTo(0, scrollRef.current.scrollHeight);
1446
- }, [logs, filter]);
1447
-
1448
- const filteredLogs = filter === 'all' ? logs :
1449
- filter === 'messages' ? logs.filter((e: any) => e.subtype === 'bus_message' || e.subtype === 'revalidation_request' || e.subtype === 'user_message') :
1450
- logs.filter((e: any) => e.subtype === 'step_summary' || e.subtype === 'final_summary');
1451
-
1452
- const msgCount = logs.filter((e: any) => e.subtype === 'bus_message' || e.subtype === 'revalidation_request' || e.subtype === 'user_message').length;
1453
-
1454
- return (
1455
- <div className="fixed inset-0 z-50 flex items-center justify-center" style={{ background: 'rgba(0,0,0,0.85)' }}
1456
- onClick={e => { if (e.target === e.currentTarget) onClose(); }}>
1457
- <div className="flex flex-col rounded-xl overflow-hidden shadow-2xl" style={{ width: '75vw', height: '65vh', border: '1px solid #30363d', background: '#0d1117' }}>
1458
- <div className="flex items-center gap-2 px-4 py-2 border-b border-[#30363d] shrink-0">
1459
- <span className="text-sm font-bold text-white">Logs: {agentLabel}</span>
1460
- <span className="text-[9px] text-gray-500">{filteredLogs.length}/{logs.length}</span>
1461
- {/* Filter tabs */}
1462
- <div className="flex gap-1 ml-3">
1463
- {([['all', 'All'], ['messages', `📨 Messages${msgCount > 0 ? ` (${msgCount})` : ''}`], ['summaries', '📊 Summaries']] as const).map(([key, label]) => (
1464
- <button key={key} onClick={() => setFilter(key as any)}
1465
- className={`text-[8px] px-2 py-0.5 rounded ${filter === key ? 'bg-[#21262d] text-white' : 'text-gray-500 hover:text-gray-300'}`}>
1466
- {label}
1467
- </button>
1468
- ))}
1469
- </div>
1470
- <button onClick={async () => {
1471
- await fetch(`/api/workspace/${workspaceId}/smith`, {
1472
- method: 'POST', headers: { 'Content-Type': 'application/json' },
1473
- body: JSON.stringify({ action: 'clear_logs', agentId }),
1474
- });
1475
- setLogs([]);
1476
- }} className="text-[8px] text-gray-500 hover:text-red-400 ml-auto mr-2">Clear</button>
1477
- <button onClick={onClose} className="text-gray-500 hover:text-white text-sm">✕</button>
1478
- </div>
1479
- <div ref={scrollRef} className="flex-1 overflow-auto p-3 font-mono text-[11px] space-y-0.5">
1480
- {filteredLogs.length === 0 && <div className="text-gray-600 text-center mt-8">{filter === 'all' ? 'No logs yet' : 'No matching entries'}</div>}
1481
- {filteredLogs.map((entry, i) => {
1482
- const isSummary = entry.subtype === 'step_summary' || entry.subtype === 'final_summary';
1483
- const isBusMsg = entry.subtype === 'bus_message' || entry.subtype === 'revalidation_request' || entry.subtype === 'user_message';
1484
- return (
1485
- <div key={i} className={`${
1486
- isSummary ? 'my-1 px-2 py-1.5 rounded border border-[#21262d] text-[#58a6ff] bg-[#161b22]' :
1487
- isBusMsg ? 'my-0.5 px-2 py-1 rounded border border-[#f0883e30] text-[#f0883e] bg-[#f0883e08]' :
1488
- 'flex gap-2 ' + (
1489
- entry.type === 'system' ? 'text-gray-600' :
1490
- entry.type === 'result' ? 'text-green-400' : 'text-gray-300'
1491
- )
1492
- }`}>
1493
- {isSummary ? (
1494
- <pre className="whitespace-pre-wrap text-[10px] leading-relaxed">{entry.content}</pre>
1495
- ) : isBusMsg ? (
1496
- <div className="text-[10px] flex items-center gap-2">
1497
- <span>📨</span>
1498
- <span className="text-[8px] text-gray-500">{entry.timestamp ? new Date(entry.timestamp).toLocaleTimeString() : ''}</span>
1499
- <span>{entry.content}</span>
1500
- </div>
1501
- ) : (
1502
- <>
1503
- <span className="text-[8px] text-gray-600 shrink-0 w-16">{entry.timestamp ? new Date(entry.timestamp).toLocaleTimeString() : ''}</span>
1504
- {entry.subtype === 'tool_use' && <span className="text-yellow-500 shrink-0">🔧 {entry.tool || 'tool'}</span>}
1505
- {entry.subtype === 'tool_result' && <span className="text-cyan-500 shrink-0">→</span>}
1506
- {entry.subtype === 'init' && <span className="text-blue-400 shrink-0">⚡</span>}
1507
- {entry.subtype === 'daemon' && <span className="text-purple-400 shrink-0">👁</span>}
1508
- {entry.subtype === 'watch_detected' && <span className="text-orange-400 shrink-0">🔍</span>}
1509
- {entry.subtype === 'error' && <span className="text-red-400 shrink-0">❌</span>}
1510
- {!entry.tool && entry.subtype === 'text' && <span className="text-gray-500 shrink-0">💬</span>}
1511
- <LogContent content={entry.content} subtype={entry.subtype} />
1512
- </>
1513
- )}
1514
- </div>
1515
- );
1516
- })}
1517
- </div>
1518
- </div>
1519
- </div>
1520
- );
1521
- }
1522
-
1523
- // ─── Memory Panel ────────────────────────────────────────
1524
-
1525
- const TYPE_COLORS: Record<string, string> = {
1526
- decision: 'text-yellow-400', bugfix: 'text-red-400', feature: 'text-green-400',
1527
- refactor: 'text-cyan-400', discovery: 'text-purple-400', change: 'text-gray-400', session: 'text-blue-400',
1528
- };
1529
-
1530
- function MemoryPanel({ agentId, agentLabel, workspaceId, onClose }: {
1531
- agentId: string; agentLabel: string; workspaceId: string; onClose: () => void;
1532
- }) {
1533
- const [data, setData] = useState<any>(null);
1534
-
1535
- useEffect(() => {
1536
- fetch(`/api/workspace/${workspaceId}/memory?agentId=${encodeURIComponent(agentId)}`)
1537
- .then(r => r.json()).then(setData).catch(() => {});
1538
- }, [workspaceId, agentId]);
1539
-
1540
- const stats = data?.stats;
1541
- const display: any[] = data?.display || [];
1542
-
1543
- return (
1544
- <div className="fixed inset-0 z-50 flex items-center justify-center" style={{ background: 'rgba(0,0,0,0.85)' }}
1545
- onClick={e => { if (e.target === e.currentTarget) onClose(); }}>
1546
- <div className="flex flex-col rounded-xl overflow-hidden shadow-2xl" style={{ width: '70vw', height: '65vh', border: '1px solid #30363d', background: '#0d1117' }}>
1547
- {/* Header */}
1548
- <div className="flex items-center gap-2 px-4 py-2 border-b border-[#30363d] shrink-0">
1549
- <span className="text-sm">🧠</span>
1550
- <span className="text-sm font-bold text-white">Memory: {agentLabel}</span>
1551
- {stats && (
1552
- <span className="text-[9px] text-gray-500">
1553
- {stats.totalObservations} observations, {stats.totalSessions} sessions
1554
- {stats.lastUpdated && ` · last updated ${new Date(stats.lastUpdated).toLocaleString()}`}
1555
- </span>
1556
- )}
1557
- <button onClick={onClose} className="text-gray-500 hover:text-white text-sm ml-auto">✕</button>
1558
- </div>
1559
-
1560
- {/* Stats bar */}
1561
- {stats?.typeBreakdown && Object.keys(stats.typeBreakdown).length > 0 && (
1562
- <div className="flex items-center gap-3 px-4 py-1.5 border-b border-[#21262d] text-[9px]">
1563
- {Object.entries(stats.typeBreakdown).map(([type, count]) => (
1564
- <span key={type} className={TYPE_COLORS[type] || 'text-gray-400'}>
1565
- {type}: {count as number}
1566
- </span>
1567
- ))}
1568
- </div>
1569
- )}
1570
-
1571
- {/* Entries */}
1572
- <div className="flex-1 overflow-auto p-3 space-y-1.5">
1573
- {display.length === 0 && (
1574
- <div className="text-gray-600 text-center mt-8">No memory yet. Run this agent to build memory.</div>
1575
- )}
1576
- {display.map((entry: any) => (
1577
- <div key={entry.id} className={`rounded px-3 py-2 ${entry.isCompact ? 'opacity-60' : ''}`}
1578
- style={{ background: '#161b22', border: '1px solid #21262d' }}>
1579
- <div className="flex items-center gap-2">
1580
- <span className="text-[10px]">{entry.icon}</span>
1581
- <span className={`text-[9px] font-medium ${TYPE_COLORS[entry.type] || 'text-gray-400'}`}>{entry.type}</span>
1582
- <span className="text-[10px] text-white flex-1 truncate">{entry.title}</span>
1583
- <span className="text-[8px] text-gray-600 shrink-0">
1584
- {new Date(entry.timestamp).toLocaleString()}
1585
- </span>
1586
- </div>
1587
- {!entry.isCompact && entry.subtitle && (
1588
- <div className="text-[9px] text-gray-500 mt-1">{entry.subtitle}</div>
1589
- )}
1590
- {!entry.isCompact && entry.facts && entry.facts.length > 0 && (
1591
- <div className="mt-1 space-y-0.5">
1592
- {entry.facts.map((f: string, i: number) => (
1593
- <div key={i} className="text-[8px] text-gray-500">• {f}</div>
1594
- ))}
1595
- </div>
1596
- )}
1597
- {entry.files && entry.files.length > 0 && (
1598
- <div className="text-[8px] text-gray-600 mt-1">
1599
- Files: {entry.files.join(', ')}
1600
- </div>
1601
- )}
1602
- </div>
1603
- ))}
1604
- </div>
1605
- </div>
1606
- </div>
1607
- );
1608
- }
1609
-
1610
- // ─── Bus Message Panel ───────────────────────────────────
1611
-
1612
- // ─── Agent Inbox/Outbox Panel ────────────────────────────
1613
-
1614
- function InboxPanel({ agentId, agentLabel, busLog, agents, workspaceId, onClose }: {
1615
- agentId: string; agentLabel: string; busLog: any[]; agents: AgentConfig[]; workspaceId: string; onClose: () => void;
1616
- }) {
1617
- const labelMap = new Map(agents.map(a => [a.id, `${a.icon} ${a.label}`]));
1618
- const getLabel = (id: string) => labelMap.get(id) || id;
1619
- const [deletedIds, setDeletedIds] = useState<Set<string>>(new Set());
1620
- const [selected, setSelected] = useState<Set<string>>(new Set());
1621
-
1622
- // Filter messages related to this agent, exclude locally deleted
1623
- const inbox = busLog.filter(m => m.to === agentId && m.type !== 'ack' && !deletedIds.has(m.id));
1624
- const outbox = busLog.filter(m => m.from === agentId && m.to !== '_system' && m.type !== 'ack' && !deletedIds.has(m.id));
1625
- const [tab, setTab] = useState<'inbox' | 'outbox'>('inbox');
1626
- const messages = tab === 'inbox' ? inbox : outbox;
1627
-
1628
- const handleDelete = async (msgId: string) => {
1629
- await wsApi(workspaceId, 'delete_message', { messageId: msgId });
1630
- setDeletedIds(prev => new Set(prev).add(msgId));
1631
- };
1632
-
1633
- const toggleSelect = (msgId: string) => {
1634
- setSelected(prev => { const s = new Set(prev); s.has(msgId) ? s.delete(msgId) : s.add(msgId); return s; });
1635
- };
1636
-
1637
- const selectAll = () => {
1638
- const deletable = messages.filter(m => m.status === 'done' || m.status === 'failed');
1639
- setSelected(new Set(deletable.map(m => m.id)));
1640
- };
1641
-
1642
- const handleBatchDelete = async () => {
1643
- for (const id of selected) {
1644
- await wsApi(workspaceId, 'delete_message', { messageId: id });
1645
- setDeletedIds(prev => new Set(prev).add(id));
1646
- }
1647
- setSelected(new Set());
1648
- };
1649
-
1650
- const handleAbortAllPending = async () => {
1651
- const pendingMsgs = messages.filter(m => m.status === 'pending');
1652
- await Promise.all(pendingMsgs.map(m =>
1653
- wsApi(workspaceId, 'abort_message', { messageId: m.id }).catch(() => {})
1654
- ));
1655
- };
1656
-
1657
- return (
1658
- <div className="fixed inset-0 z-50 flex items-center justify-center" style={{ background: 'rgba(0,0,0,0.85)' }}
1659
- onClick={e => { if (e.target === e.currentTarget) onClose(); }}>
1660
- <div className="flex flex-col rounded-xl overflow-hidden shadow-2xl" style={{ width: '60vw', height: '50vh', border: '1px solid #30363d', background: '#0d1117' }}>
1661
- <div className="flex items-center gap-2 px-4 py-2 border-b border-[#30363d] shrink-0">
1662
- <span className="text-sm">📨</span>
1663
- <span className="text-sm font-bold text-white">{agentLabel}</span>
1664
- <div className="flex gap-1 ml-3">
1665
- <button onClick={() => setTab('inbox')}
1666
- className={`text-[9px] px-2 py-0.5 rounded ${tab === 'inbox' ? 'bg-[#21262d] text-white' : 'text-gray-500 hover:text-gray-300'}`}>
1667
- Inbox ({inbox.length})
1668
- </button>
1669
- <button onClick={() => setTab('outbox')}
1670
- className={`text-[9px] px-2 py-0.5 rounded ${tab === 'outbox' ? 'bg-[#21262d] text-white' : 'text-gray-500 hover:text-gray-300'}`}>
1671
- Outbox ({outbox.length})
1672
- </button>
1673
- </div>
1674
- {selected.size > 0 && (
1675
- <div className="flex items-center gap-2 ml-3">
1676
- <span className="text-[9px] text-gray-400">{selected.size} selected</span>
1677
- <button onClick={handleBatchDelete}
1678
- className="text-[8px] px-2 py-0.5 rounded bg-red-600/20 text-red-400 hover:bg-red-600/30">
1679
- Delete selected
1680
- </button>
1681
- <button onClick={() => setSelected(new Set())}
1682
- className="text-[8px] px-2 py-0.5 rounded bg-gray-600/20 text-gray-400 hover:bg-gray-600/30">
1683
- Clear
1684
- </button>
1685
- </div>
1686
- )}
1687
- {selected.size === 0 && (
1688
- <div className="flex items-center gap-2 ml-3">
1689
- {messages.some(m => m.status === 'done' || m.status === 'failed') && (
1690
- <button onClick={selectAll}
1691
- className="text-[8px] px-2 py-0.5 rounded text-gray-500 hover:text-gray-300">
1692
- Select all completed
1693
- </button>
1694
- )}
1695
- {messages.some(m => m.status === 'pending') && (
1696
- <button onClick={handleAbortAllPending}
1697
- className="text-[8px] px-2 py-0.5 rounded bg-red-600/20 text-red-400 hover:bg-red-600/30">
1698
- Abort all pending ({messages.filter(m => m.status === 'pending').length})
1699
- </button>
1700
- )}
1701
- </div>
1702
- )}
1703
- <button onClick={onClose} className="text-gray-500 hover:text-white text-sm ml-auto">✕</button>
1704
- </div>
1705
- <div className="flex-1 overflow-auto p-3 space-y-1.5">
1706
- {messages.length === 0 && (
1707
- <div className="text-gray-600 text-center mt-8">No {tab} messages</div>
1708
- )}
1709
- {[...messages].reverse().map((msg, i) => {
1710
- const isTicket = msg.category === 'ticket';
1711
- const canSelect = msg.status === 'done' || msg.status === 'failed';
1712
- return (
1713
- <div key={i} className="flex items-start gap-2 px-3 py-2 rounded text-[10px]" style={{
1714
- background: '#161b22',
1715
- border: `1px solid ${isTicket ? '#6e40c9' : '#21262d'}`,
1716
- borderLeft: isTicket ? '3px solid #a371f7' : undefined,
1717
- }}>
1718
- {canSelect && (
1719
- <input type="checkbox" checked={selected.has(msg.id)} onChange={() => toggleSelect(msg.id)}
1720
- className="mt-1 shrink-0 accent-[#58a6ff]" />
1721
- )}
1722
- <div className="flex-1 min-w-0">
1723
- <div className="flex items-center gap-2 mb-1 flex-wrap">
1724
- <span className="text-[8px] text-gray-600">{new Date(msg.timestamp).toLocaleString()}</span>
1725
- {tab === 'inbox' ? (
1726
- <span className="text-blue-400">← {getLabel(msg.from)}</span>
1727
- ) : (
1728
- <span className="text-green-400">→ {getLabel(msg.to)}</span>
1729
- )}
1730
- {/* Category badge */}
1731
- {isTicket && (
1732
- <span className="px-1 py-0.5 rounded text-[7px] bg-purple-500/20 text-purple-400">TICKET</span>
1733
- )}
1734
- {/* Action badge */}
1735
- <span className={`px-1.5 py-0.5 rounded text-[8px] ${
1736
- msg.payload?.action === 'fix_request' || msg.payload?.action === 'bug_report' ? 'bg-red-500/20 text-red-400' :
1737
- msg.payload?.action === 'update_notify' || msg.payload?.action === 'request_complete' ? 'bg-blue-500/20 text-blue-400' :
1738
- msg.payload?.action === 'question' ? 'bg-yellow-500/20 text-yellow-400' :
1739
- 'bg-gray-500/20 text-gray-400'
1740
- }`}>{msg.payload?.action}</span>
1741
- {/* Ticket status */}
1742
- {isTicket && msg.ticketStatus && (
1743
- <span className={`text-[7px] px-1 rounded ${
1744
- msg.ticketStatus === 'open' ? 'bg-yellow-500/20 text-yellow-400' :
1745
- msg.ticketStatus === 'in_progress' ? 'bg-blue-500/20 text-blue-400' :
1746
- msg.ticketStatus === 'fixed' ? 'bg-green-500/20 text-green-400' :
1747
- msg.ticketStatus === 'verified' ? 'bg-green-600/20 text-green-300' :
1748
- msg.ticketStatus === 'closed' ? 'bg-gray-500/20 text-gray-400' :
1749
- 'bg-gray-500/20 text-gray-400'
1750
- }`}>{msg.ticketStatus}</span>
1751
- )}
1752
- {/* Message delivery status */}
1753
- <span className={`text-[7px] ${msg.status === 'done' ? 'text-green-500' : msg.status === 'running' ? 'text-blue-400' : msg.status === 'failed' ? 'text-red-500' : msg.status === 'pending_approval' ? 'text-orange-400' : 'text-yellow-500'}`}>
1754
- {msg.status || 'pending'}
1755
- </span>
1756
- {/* Retry count for tickets */}
1757
- {isTicket && (msg.ticketRetries || 0) > 0 && (
1758
- <span className="text-[7px] text-orange-400">retry {msg.ticketRetries}/{msg.maxRetries || 3}</span>
1759
- )}
1760
- {/* CausedBy trace */}
1761
- {msg.causedBy && (
1762
- <span className="text-[7px] text-gray-600" title={`Triggered by message from ${getLabel(msg.causedBy.from)}`}>
1763
- ← {getLabel(msg.causedBy.from)}
1764
- </span>
1765
- )}
1766
- {/* Actions */}
1767
- {msg.status === 'pending_approval' && (
1768
- <div className="flex gap-1 ml-auto">
1769
- <button onClick={() => wsApi(workspaceId, 'approve_message', { messageId: msg.id })}
1770
- className="text-[7px] px-1.5 py-0.5 rounded bg-green-600/20 text-green-400 hover:bg-green-600/30">
1771
- ✓ Approve
1772
- </button>
1773
- <button onClick={() => wsApi(workspaceId, 'reject_message', { messageId: msg.id })}
1774
- className="text-[7px] px-1.5 py-0.5 rounded bg-red-600/20 text-red-400 hover:bg-red-600/30">
1775
- ✕ Reject
1776
- </button>
1777
- </div>
1778
- )}
1779
- {(msg.status === 'pending' || msg.status === 'running') && msg.type !== 'ack' && (
1780
- <div className="flex gap-1 ml-auto">
1781
- <button onClick={() => wsApi(workspaceId, 'message_done', { messageId: msg.id })}
1782
- className="text-[7px] px-1.5 py-0.5 rounded bg-green-600/20 text-green-400 hover:bg-green-600/30">
1783
- ✓ Done
1784
- </button>
1785
- <button onClick={() => wsApi(workspaceId, 'abort_message', { messageId: msg.id })}
1786
- className="text-[7px] px-1.5 py-0.5 rounded bg-red-600/20 text-red-400 hover:bg-red-600/30">
1787
- ✕ Abort
1788
- </button>
1789
- </div>
1790
- )}
1791
- {(msg.status === 'done' || msg.status === 'failed') && msg.type !== 'ack' && (
1792
- <div className="flex gap-1 ml-auto">
1793
- <button onClick={() => wsApi(workspaceId, 'retry_message', { messageId: msg.id })}
1794
- className="text-[7px] px-1.5 py-0.5 rounded bg-orange-600/20 text-orange-400 hover:bg-orange-600/30">
1795
- {msg.status === 'done' ? '↻ Re-run' : '↻ Retry'}
1796
- </button>
1797
- <button onClick={() => handleDelete(msg.id)}
1798
- className="text-[7px] px-1.5 py-0.5 rounded bg-gray-600/20 text-gray-400 hover:bg-red-600/20 hover:text-red-400">
1799
- 🗑
1800
- </button>
1801
- </div>
1802
- )}
1803
- </div>
1804
- <div className="text-gray-300">{msg.payload?.content || ''}</div>
1805
- {msg.payload?.files?.length > 0 && (
1806
- <div className="text-[8px] text-gray-600 mt-1">Files: {msg.payload.files.join(', ')}</div>
1807
- )}
1808
- </div>
1809
- </div>
1810
- );
1811
- })}
1812
- </div>
1813
- </div>
1814
- </div>
1815
- );
1816
- }
1817
-
1818
- function BusPanel({ busLog, agents, onClose }: {
1819
- busLog: any[]; agents: AgentConfig[]; onClose: () => void;
1820
- }) {
1821
- const labelMap = new Map(agents.map(a => [a.id, `${a.icon} ${a.label}`]));
1822
- const getLabel = (id: string) => labelMap.get(id) || id;
1823
-
1824
- return (
1825
- <div className="fixed inset-0 z-50 flex items-center justify-center" style={{ background: 'rgba(0,0,0,0.85)' }}
1826
- onClick={e => { if (e.target === e.currentTarget) onClose(); }}>
1827
- <div className="flex flex-col rounded-xl overflow-hidden shadow-2xl" style={{ width: '65vw', height: '55vh', border: '1px solid #30363d', background: '#0d1117' }}>
1828
- <div className="flex items-center gap-2 px-4 py-2 border-b border-[#30363d] shrink-0">
1829
- <span className="text-sm">📡</span>
1830
- <span className="text-sm font-bold text-white">Agent Communication Logs</span>
1831
- <span className="text-[9px] text-gray-500">{busLog.length} messages</span>
1832
- <button onClick={onClose} className="text-gray-500 hover:text-white text-sm ml-auto">✕</button>
1833
- </div>
1834
- <div className="flex-1 overflow-auto p-3 space-y-1">
1835
- {busLog.length === 0 && <div className="text-gray-600 text-center mt-8">No messages yet</div>}
1836
- {[...busLog].reverse().map((msg, i) => (
1837
- <div key={i} className="flex items-start gap-2 text-[10px] px-3 py-1.5 rounded"
1838
- style={{ background: '#161b22', border: '1px solid #21262d' }}>
1839
- <span className="text-gray-600 shrink-0 w-14">{new Date(msg.timestamp).toLocaleTimeString()}</span>
1840
- <span className="text-blue-400 shrink-0">{getLabel(msg.from)}</span>
1841
- <span className="text-gray-600">→</span>
1842
- <span className="text-green-400 shrink-0">{msg.to === '_system' ? '📡 system' : getLabel(msg.to)}</span>
1843
- <span className={`px-1 rounded text-[8px] ${
1844
- msg.payload?.action === 'fix_request' ? 'bg-red-500/20 text-red-400' :
1845
- msg.payload?.action === 'task_complete' ? 'bg-green-500/20 text-green-400' :
1846
- msg.payload?.action === 'ack' ? 'bg-gray-500/20 text-gray-500' :
1847
- 'bg-blue-500/20 text-blue-400'
1848
- }`}>{msg.payload?.action}</span>
1849
- <span className="text-gray-400 truncate flex-1">{msg.payload?.content || ''}</span>
1850
- {msg.status && msg.status !== 'done' && (
1851
- <span className={`text-[7px] px-1 rounded ${
1852
- msg.status === 'done' ? 'text-green-500' : msg.status === 'failed' ? 'text-red-500' : 'text-yellow-500'
1853
- }`}>{msg.status}</span>
1854
- )}
1855
- </div>
1856
- ))}
1857
- </div>
1858
- </div>
1859
- </div>
1860
- );
1861
- }
1862
-
1863
- // ─── Terminal Launch Dialog ───────────────────────────────
1864
-
1865
- function SessionItem({ session, formatTime, formatSize, onSelect }: {
1866
- session: { id: string; modified: string; size: number };
1867
- formatTime: (iso: string) => string;
1868
- formatSize: (bytes: number) => string;
1869
- onSelect: () => void;
1870
- }) {
1871
- const [expanded, setExpanded] = useState(false);
1872
- const [copied, setCopied] = useState(false);
1873
-
1874
- const copyId = (e: React.MouseEvent) => {
1875
- e.stopPropagation();
1876
- navigator.clipboard.writeText(session.id).then(() => {
1877
- setCopied(true);
1878
- setTimeout(() => setCopied(false), 1500);
1879
- });
1880
- };
1881
-
1882
- return (
1883
- <div className="rounded border border-[#21262d] hover:border-[#30363d] hover:bg-[#161b22] transition-colors">
1884
- <div className="flex items-center gap-2 px-3 py-1.5 cursor-pointer" onClick={() => setExpanded(!expanded)}>
1885
- <span className="text-[8px] text-gray-600">{expanded ? '▼' : '▶'}</span>
1886
- <span className="text-[9px] text-gray-400 font-mono">{session.id.slice(0, 8)}</span>
1887
- <span className="text-[8px] text-gray-600">{formatTime(session.modified)}</span>
1888
- <span className="text-[8px] text-gray-600">{formatSize(session.size)}</span>
1889
- <button onClick={(e) => { e.stopPropagation(); onSelect(); }}
1890
- className="ml-auto text-[8px] px-1.5 py-0.5 rounded bg-[#238636]/20 text-[#3fb950] hover:bg-[#238636]/40">Resume</button>
1891
- </div>
1892
- {expanded && (
1893
- <div className="px-3 pb-2 flex items-center gap-1.5">
1894
- <code className="text-[8px] text-gray-500 font-mono bg-[#161b22] px-1.5 py-0.5 rounded border border-[#21262d] select-all flex-1 overflow-hidden text-ellipsis">
1895
- {session.id}
1896
- </code>
1897
- <button onClick={copyId}
1898
- className="text-[8px] px-1.5 py-0.5 rounded bg-[#30363d] text-gray-400 hover:text-white hover:bg-[#484f58] shrink-0">
1899
- {copied ? '✓' : 'Copy'}
1900
- </button>
1901
- </div>
1902
- )}
1903
- </div>
1904
- );
1905
- }
1906
-
1907
- function TerminalLaunchDialog({ agent, workDir, sessName, projectPath, workspaceId, supportsSession, onLaunch, onCancel }: {
1908
- agent: AgentConfig; workDir?: string; sessName: string; projectPath: string; workspaceId: string;
1909
- supportsSession?: boolean;
1910
- onLaunch: (resumeMode: boolean, sessionId?: string) => void; onCancel: () => void;
1911
- }) {
1912
- const [sessions, setSessions] = useState<{ id: string; modified: string; size: number }[]>([]);
1913
- const [showSessions, setShowSessions] = useState(false);
1914
- // Use resolved supportsSession from API (defaults to true for backwards compat)
1915
- const isClaude = supportsSession !== false;
1916
-
1917
- // Fetch recent sessions (only for claude-based agents)
1918
- useEffect(() => {
1919
- if (!isClaude) return;
1920
- fetch(`/api/workspace/${workspaceId}/smith`, {
1921
- method: 'POST', headers: { 'Content-Type': 'application/json' },
1922
- body: JSON.stringify({ action: 'sessions', agentId: agent.id }),
1923
- }).then(r => r.json()).then(d => {
1924
- if (d.sessions?.length) setSessions(d.sessions);
1925
- }).catch(() => {});
1926
- }, [workspaceId, isClaude]);
1927
-
1928
- const formatTime = (iso: string) => {
1929
- const d = new Date(iso);
1930
- const now = new Date();
1931
- const diff = now.getTime() - d.getTime();
1932
- if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;
1933
- if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`;
1934
- return d.toLocaleDateString();
1935
- };
1936
-
1937
- const formatSize = (bytes: number) => {
1938
- if (bytes < 1024) return `${bytes}B`;
1939
- if (bytes < 1048576) return `${(bytes / 1024).toFixed(0)}KB`;
1940
- return `${(bytes / 1048576).toFixed(1)}MB`;
1941
- };
1942
-
1943
- return (
1944
- <div className="fixed inset-0 z-50 flex items-center justify-center" style={{ background: 'rgba(0,0,0,0.75)' }}
1945
- onClick={e => { if (e.target === e.currentTarget) onCancel(); }}>
1946
- <div className="w-80 rounded-lg border border-[#30363d] p-4 shadow-xl" style={{ background: '#0d1117' }}>
1947
- <div className="text-sm font-bold text-white mb-3">⌨️ {agent.label}</div>
1948
-
1949
- <div className="space-y-2">
1950
- <button onClick={() => onLaunch(false)}
1951
- className="w-full text-left px-3 py-2 rounded border border-[#30363d] hover:border-[#58a6ff] hover:bg-[#161b22] transition-colors">
1952
- <div className="text-xs text-white font-semibold">{isClaude ? 'New Session' : 'Open Terminal'}</div>
1953
- <div className="text-[9px] text-gray-500">{isClaude ? 'Start fresh claude session' : `Launch ${agent.agentId || 'agent'}`}</div>
1954
- </button>
1955
-
1956
- {isClaude && sessions.length > 0 && (
1957
- <button onClick={() => onLaunch(true)}
1958
- className="w-full text-left px-3 py-2 rounded border border-[#30363d] hover:border-[#3fb950] hover:bg-[#161b22] transition-colors">
1959
- <div className="text-xs text-white font-semibold">Resume Latest</div>
1960
- <div className="text-[9px] text-gray-500">
1961
- {sessions[0].id.slice(0, 8)} · {formatTime(sessions[0].modified)} · {formatSize(sessions[0].size)}
1962
- </div>
1963
- </button>
1964
- )}
1965
-
1966
- {isClaude && sessions.length > 1 && (
1967
- <button onClick={() => setShowSessions(!showSessions)}
1968
- className="w-full text-[9px] text-gray-500 hover:text-white py-1">
1969
- {showSessions ? '▼' : '▶'} All sessions ({sessions.length})
1970
- </button>
1971
- )}
1972
-
1973
- {showSessions && sessions.map(s => (
1974
- <SessionItem key={s.id} session={s} formatTime={formatTime} formatSize={formatSize}
1975
- onSelect={() => onLaunch(true, s.id)} />
1976
- ))}
1977
- </div>
1978
-
1979
- <button onClick={onCancel}
1980
- className="w-full mt-3 text-[9px] text-gray-500 hover:text-white">Cancel</button>
1981
- </div>
1982
- </div>
1983
- );
1984
- }
1985
-
1986
- // ─── Floating Terminal ────────────────────────────────────
1987
-
1988
- function getWsUrl() {
1989
- if (typeof window === 'undefined') return 'ws://localhost:8404';
1990
- const p = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
1991
- const h = window.location.hostname;
1992
- if (h !== 'localhost' && h !== '127.0.0.1') return `${p}//${window.location.host}/terminal-ws`;
1993
- const port = parseInt(window.location.port) || 8403;
1994
- return `${p}//${h}:${port + 1}`;
1995
- }
1996
-
1997
- // ─── Terminal Dock (right side panel with tabs) ──────────
1998
- type TerminalEntry = { agentId: string; label: string; icon: string; cliId: string; cliCmd?: string; cliType?: string; workDir?: string; tmuxSession?: string; sessionName: string; resumeMode?: boolean; resumeSessionId?: string; profileEnv?: Record<string, string> };
1999
-
2000
- function TerminalDock({ terminals, projectPath, workspaceId, onSessionReady, onClose }: {
2001
- terminals: TerminalEntry[];
2002
- projectPath: string;
2003
- workspaceId: string | null;
2004
- onSessionReady: (agentId: string, name: string) => void;
2005
- onClose: (agentId: string) => void;
2006
- }) {
2007
- const [activeTab, setActiveTab] = useState(terminals[0]?.agentId || '');
2008
- const [width, setWidth] = useState(520);
2009
- const dragRef = useRef<{ startX: number; origW: number } | null>(null);
2010
-
2011
- // Auto-select new tab when added
2012
- useEffect(() => {
2013
- if (terminals.length > 0 && !terminals.find(t => t.agentId === activeTab)) {
2014
- setActiveTab(terminals[terminals.length - 1].agentId);
2015
- }
2016
- }, [terminals, activeTab]);
2017
-
2018
- const active = terminals.find(t => t.agentId === activeTab);
2019
-
2020
- return (
2021
- <div className="flex shrink-0" style={{ width }}>
2022
- {/* Resize handle */}
2023
- <div
2024
- className="w-1 cursor-col-resize hover:bg-[#58a6ff]/30 active:bg-[#58a6ff]/50 transition-colors"
2025
- style={{ background: '#21262d' }}
2026
- onMouseDown={(e) => {
2027
- e.preventDefault();
2028
- dragRef.current = { startX: e.clientX, origW: width };
2029
- const onMove = (ev: MouseEvent) => {
2030
- if (!dragRef.current) return;
2031
- const newW = dragRef.current.origW - (ev.clientX - dragRef.current.startX);
2032
- setWidth(Math.max(300, Math.min(1200, newW)));
2033
- };
2034
- const onUp = () => { dragRef.current = null; window.removeEventListener('mousemove', onMove); window.removeEventListener('mouseup', onUp); };
2035
- window.addEventListener('mousemove', onMove);
2036
- window.addEventListener('mouseup', onUp);
2037
- }}
2038
- />
2039
- <div className="flex-1 flex flex-col min-w-0 bg-[#0d1117] border-l border-[#30363d]">
2040
- {/* Tabs */}
2041
- <div className="flex items-center bg-[#161b22] border-b border-[#30363d] overflow-x-auto shrink-0">
2042
- {terminals.map(t => (
2043
- <div
2044
- key={t.agentId}
2045
- onClick={() => setActiveTab(t.agentId)}
2046
- className={`flex items-center gap-1.5 px-3 py-1.5 text-[10px] border-r border-[#30363d] shrink-0 cursor-pointer ${
2047
- t.agentId === activeTab
2048
- ? 'bg-[#0d1117] text-white border-b-2 border-b-[#58a6ff]'
2049
- : 'text-gray-500 hover:text-gray-300 hover:bg-[#1c2128]'
2050
- }`}
2051
- >
2052
- <span>{t.icon}</span>
2053
- <span className="font-medium">{t.label}</span>
2054
- <span
2055
- onClick={(e) => { e.stopPropagation(); onClose(t.agentId); }}
2056
- className="ml-1 text-gray-600 hover:text-red-400 text-[8px] cursor-pointer"
2057
- >✕</span>
2058
- </div>
2059
- ))}
2060
- </div>
2061
- {/* Active terminal */}
2062
- {active && (
2063
- <div className="flex-1 min-h-0" key={active.agentId}>
2064
- <FloatingTerminalInline
2065
- agentLabel={active.label}
2066
- agentIcon={active.icon}
2067
- projectPath={projectPath}
2068
- agentCliId={active.cliId}
2069
- cliCmd={active.cliCmd}
2070
- cliType={active.cliType}
2071
- workDir={active.workDir}
2072
- preferredSessionName={active.sessionName}
2073
- existingSession={active.tmuxSession}
2074
- resumeMode={active.resumeMode}
2075
- resumeSessionId={active.resumeSessionId}
2076
- profileEnv={active.profileEnv}
2077
- onSessionReady={(name) => onSessionReady(active.agentId, name)}
2078
- />
2079
- </div>
2080
- )}
2081
- </div>
2082
- </div>
2083
- );
2084
- }
2085
-
2086
- // ─── Inline Terminal (no drag/resize, fills parent) ──────
2087
- function FloatingTerminalInline({ agentLabel, agentIcon, projectPath, agentCliId, cliCmd: cliCmdProp, cliType, workDir, preferredSessionName, existingSession, resumeMode, resumeSessionId, profileEnv, isPrimary, skipPermissions, boundSessionId, onSessionReady }: {
2088
- agentLabel: string;
2089
- agentIcon: string;
2090
- projectPath: string;
2091
- agentCliId: string;
2092
- cliCmd?: string;
2093
- cliType?: string;
2094
- workDir?: string;
2095
- preferredSessionName?: string;
2096
- existingSession?: string;
2097
- resumeMode?: boolean;
2098
- resumeSessionId?: string;
2099
- profileEnv?: Record<string, string>;
2100
- isPrimary?: boolean;
2101
- skipPermissions?: boolean;
2102
- boundSessionId?: string;
2103
- onSessionReady?: (name: string) => void;
2104
- }) {
2105
- const containerRef = useRef<HTMLDivElement>(null);
2106
-
2107
- useEffect(() => {
2108
- const el = containerRef.current;
2109
- if (!el) return;
2110
- let disposed = false;
2111
-
2112
- Promise.all([
2113
- import('@xterm/xterm'),
2114
- import('@xterm/addon-fit'),
2115
- ]).then(([{ Terminal }, { FitAddon }]) => {
2116
- if (disposed) return;
2117
-
2118
- const term = new Terminal({
2119
- cursorBlink: true, fontSize: 13,
2120
- fontFamily: 'Menlo, Monaco, "Courier New", monospace',
2121
- scrollback: 5000,
2122
- theme: { background: '#0d1117', foreground: '#c9d1d9', cursor: '#58a6ff' },
2123
- });
2124
- const fitAddon = new FitAddon();
2125
- term.loadAddon(fitAddon);
2126
- term.open(el);
2127
- setTimeout(() => { try { fitAddon.fit(); } catch {} }, 100);
2128
-
2129
- const ro = new ResizeObserver(() => { try { fitAddon.fit(); } catch {} });
2130
- ro.observe(el);
2131
-
2132
- // Connect to terminal server
2133
- const wsUrl = getWsUrl();
2134
- const ws = new WebSocket(wsUrl);
2135
- ws.binaryType = 'arraybuffer';
2136
- const decoder = new TextDecoder();
2137
-
2138
- ws.onopen = () => {
2139
- ws.send(JSON.stringify({
2140
- type: 'create',
2141
- cols: term.cols, rows: term.rows,
2142
- sessionName: existingSession || preferredSessionName,
2143
- existingSession: existingSession || undefined,
2144
- }));
2145
- };
2146
- ws.onmessage = async (event) => {
2147
- try {
2148
- const msg = JSON.parse(typeof event.data === 'string' ? event.data : decoder.decode(event.data));
2149
- if (msg.type === 'data') {
2150
- term.write(typeof msg.data === 'string' ? msg.data : new Uint8Array(Object.values(msg.data)));
2151
- } else if (msg.type === 'created') {
2152
- onSessionReady?.(msg.sessionName);
2153
- // Auto-run CLI on newly created session
2154
- if (!existingSession) {
2155
- const cli = cliCmdProp || 'claude';
2156
- const targetDir = workDir ? `${projectPath}/${workDir}` : projectPath;
2157
- const cdCmd = `mkdir -p "${targetDir}" && cd "${targetDir}"`;
2158
- const isClaude = (cliType || 'claude-code') === 'claude-code';
2159
- const modelFlag = isClaude && profileEnv?.CLAUDE_MODEL ? ` --model ${profileEnv.CLAUDE_MODEL}` : '';
2160
- const envWithoutModel = profileEnv ? Object.fromEntries(
2161
- Object.entries(profileEnv).filter(([k]) => k !== 'CLAUDE_MODEL')
2162
- ) : {};
2163
- // Build commands as separate short lines
2164
- const commands: string[] = [];
2165
- const profileVarsToReset = ['ANTHROPIC_AUTH_TOKEN', 'ANTHROPIC_BASE_URL', 'ANTHROPIC_SMALL_FAST_MODEL', 'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC', 'DISABLE_TELEMETRY', 'DISABLE_ERROR_REPORTING', 'DISABLE_AUTOUPDATER', 'DISABLE_NON_ESSENTIAL_MODEL_CALLS', 'CLAUDE_MODEL'];
2166
- commands.push(profileVarsToReset.map(v => `unset ${v}`).join('; '));
2167
- const envWithoutForge = Object.entries(envWithoutModel).filter(([k]) => !k.startsWith('FORGE_'));
2168
- if (envWithoutForge.length > 0) {
2169
- commands.push(envWithoutForge.map(([k, v]) => `export ${k}="${v}"`).join('; '));
2170
- }
2171
- const forgeVars = Object.entries(envWithoutModel).filter(([k]) => k.startsWith('FORGE_'));
2172
- if (forgeVars.length > 0) {
2173
- commands.push(forgeVars.map(([k, v]) => `export ${k}="${v}"`).join('; '));
2174
- }
2175
- let resumeId = resumeSessionId || boundSessionId;
2176
- if (isClaude && !resumeId && isPrimary) {
2177
- try {
2178
- const { resolveFixedSession } = await import('@/lib/session-utils');
2179
- resumeId = (await resolveFixedSession(projectPath)) || undefined;
2180
- } catch {}
2181
- }
2182
- const resumeFlag = isClaude && resumeId ? ` --resume ${resumeId}` : '';
2183
- let mcpFlag = '';
2184
- if (isClaude) { try { const { getMcpFlag } = await import('@/lib/session-utils'); mcpFlag = await getMcpFlag(projectPath); } catch {} }
2185
- const sf = skipPermissions ? (cliType === 'codex' ? ' --full-auto' : cliType === 'aider' ? ' --yes' : ' --dangerously-skip-permissions') : '';
2186
- commands.push(`${cdCmd} && ${cli}${resumeFlag}${modelFlag}${sf}${mcpFlag}`);
2187
- commands.forEach((cmd, i) => {
2188
- setTimeout(() => {
2189
- if (!disposed && ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({ type: 'input', data: cmd + '\n' }));
2190
- }, 300 + i * 300);
2191
- });
2192
- }
2193
- }
2194
- } catch {}
2195
- };
2196
-
2197
- term.onData(data => { if (ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({ type: 'input', data })); });
2198
- term.onResize(({ cols, rows }) => { if (ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({ type: 'resize', cols, rows })); });
2199
-
2200
- return () => {
2201
- disposed = true;
2202
- ro.disconnect();
2203
- ws.close();
2204
- term.dispose();
2205
- };
2206
- });
2207
-
2208
- return () => { disposed = true; };
2209
- }, []); // eslint-disable-line react-hooks/exhaustive-deps
2210
-
2211
- return <div ref={containerRef} className="w-full h-full" style={{ background: '#0d1117' }} />;
2212
- }
2213
-
2214
- function FloatingTerminal({ agentLabel, agentIcon, projectPath, agentCliId, cliCmd: cliCmdProp, cliType, workDir, preferredSessionName, existingSession, resumeMode, resumeSessionId, profileEnv, isPrimary, skipPermissions, persistentSession, boundSessionId, initialPos, onSessionReady, onClose }: {
2215
- agentLabel: string;
2216
- agentIcon: string;
2217
- projectPath: string;
2218
- agentCliId: string;
2219
- cliCmd?: string; // resolved CLI binary (claude/codex/aider)
2220
- cliType?: string; // claude-code/codex/aider/generic
2221
- workDir?: string;
2222
- preferredSessionName?: string;
2223
- existingSession?: string;
2224
- resumeMode?: boolean;
2225
- resumeSessionId?: string;
2226
- profileEnv?: Record<string, string>;
2227
- isPrimary?: boolean;
2228
- skipPermissions?: boolean;
2229
- persistentSession?: boolean;
2230
- boundSessionId?: string;
2231
- initialPos?: { x: number; y: number };
2232
- onSessionReady?: (name: string) => void;
2233
- onClose: (killSession: boolean) => void;
2234
- }) {
2235
- const containerRef = useRef<HTMLDivElement>(null);
2236
- const wsRef = useRef<WebSocket | null>(null);
2237
- const sessionNameRef = useRef('');
2238
- const [pos, setPos] = useState(initialPos || { x: 80, y: 60 });
2239
- const [userDragged, setUserDragged] = useState(false);
2240
- // Follow node position unless user manually dragged the terminal
2241
- useEffect(() => {
2242
- if (initialPos && !userDragged) setPos(initialPos);
2243
- }, [initialPos?.x, initialPos?.y]); // eslint-disable-line react-hooks/exhaustive-deps
2244
- const [size, setSize] = useState({ w: 500, h: 300 });
2245
- const [showCloseDialog, setShowCloseDialog] = useState(false);
2246
- const dragRef = useRef<{ startX: number; startY: number; origX: number; origY: number } | null>(null);
2247
- const resizeRef = useRef<{ startX: number; startY: number; origW: number; origH: number } | null>(null);
2248
-
2249
- useEffect(() => {
2250
- const el = containerRef.current;
2251
- if (!el) return;
2252
- let disposed = false;
2253
-
2254
- // Dynamic import xterm to avoid SSR issues
2255
- Promise.all([
2256
- import('@xterm/xterm'),
2257
- import('@xterm/addon-fit'),
2258
- ]).then(([{ Terminal }, { FitAddon }]) => {
2259
- if (disposed) return;
2260
-
2261
- const term = new Terminal({
2262
- cursorBlink: true, fontSize: 10,
2263
- fontFamily: 'Menlo, Monaco, "Courier New", monospace',
2264
- scrollback: 5000,
2265
- theme: { background: '#0d1117', foreground: '#c9d1d9', cursor: '#58a6ff' },
2266
- });
2267
- const fitAddon = new FitAddon();
2268
- term.loadAddon(fitAddon);
2269
- term.open(el);
2270
- setTimeout(() => { try { fitAddon.fit(); } catch {} }, 100);
2271
-
2272
- // Scale font: min 10 at small size, max 13 at large size
2273
- const ro = new ResizeObserver(() => {
2274
- try {
2275
- const w = el.clientWidth;
2276
- const newSize = Math.min(13, Math.max(10, Math.floor(w / 60)));
2277
- if (term.options.fontSize !== newSize) term.options.fontSize = newSize;
2278
- fitAddon.fit();
2279
- } catch {}
2280
- });
2281
- ro.observe(el);
2282
-
2283
- // Connect WebSocket — attach to existing or create new
2284
- const ws = new WebSocket(getWsUrl());
2285
- wsRef.current = ws;
2286
- ws.onopen = () => {
2287
- if (existingSession) {
2288
- ws.send(JSON.stringify({ type: 'attach', sessionName: existingSession, cols: term.cols, rows: term.rows }));
2289
- } else {
2290
- // Use fixed session name so it survives refresh/suspend
2291
- ws.send(JSON.stringify({ type: 'create', sessionName: preferredSessionName, cols: term.cols, rows: term.rows }));
2292
- }
2293
- };
2294
-
2295
- ws.onerror = () => {
2296
- if (!disposed) term.write('\r\n\x1b[91m[Connection error]\x1b[0m\r\n');
2297
- };
2298
- ws.onclose = () => {
2299
- if (!disposed) term.write('\r\n\x1b[90m[Disconnected]\x1b[0m\r\n');
2300
- };
2301
-
2302
- let launched = false;
2303
- ws.onmessage = async (event) => {
2304
- if (disposed) return;
2305
- try {
2306
- const msg = JSON.parse(event.data);
2307
- if (msg.type === 'output') { try { term.write(msg.data); } catch {} }
2308
- else if (msg.type === 'error') {
2309
- // Session no longer exists — fall back to creating a new one
2310
- if (msg.message?.includes('no longer exists') || msg.message?.includes('not found')) {
2311
- term.write(`\r\n\x1b[93m[Session lost — creating new one]\x1b[0m\r\n`);
2312
- ws.send(JSON.stringify({ type: 'create', cols: term.cols, rows: term.rows }));
2313
- // Clear existing session so next connected triggers CLI launch
2314
- (existingSession as any) = undefined;
2315
- } else {
2316
- term.write(`\r\n\x1b[91m[${msg.message || 'error'}]\x1b[0m\r\n`);
2317
- }
2318
- }
2319
- else if (msg.type === 'connected') {
2320
- if (msg.sessionName) {
2321
- sessionNameRef.current = msg.sessionName;
2322
- // Save session name (on create or if session changed after fallback)
2323
- onSessionReady?.(msg.sessionName);
2324
- }
2325
- if (launched) return;
2326
- launched = true;
2327
- if (existingSession) {
2328
- // Force terminal redraw for attached session
2329
- setTimeout(() => {
2330
- if (!disposed && ws.readyState === WebSocket.OPEN) {
2331
- ws.send(JSON.stringify({ type: 'resize', cols: term.cols - 1, rows: term.rows }));
2332
- setTimeout(() => {
2333
- if (!disposed && ws.readyState === WebSocket.OPEN)
2334
- ws.send(JSON.stringify({ type: 'resize', cols: term.cols, rows: term.rows }));
2335
- }, 50);
2336
- }
2337
- }, 200);
2338
- return;
2339
- }
2340
- const targetDir = workDir ? `${projectPath}/${workDir}` : projectPath;
2341
- const cli = cliCmdProp || 'claude';
2342
-
2343
- const cdCmd = `mkdir -p "${targetDir}" && cd "${targetDir}"`;
2344
- const isClaude = (cliType || 'claude-code') === 'claude-code';
2345
- const modelFlag = isClaude && profileEnv?.CLAUDE_MODEL ? ` --model ${profileEnv.CLAUDE_MODEL}` : '';
2346
- const envWithoutModel = profileEnv ? Object.fromEntries(
2347
- Object.entries(profileEnv).filter(([k]) => k !== 'CLAUDE_MODEL')
2348
- ) : {};
2349
- // Build commands as separate short lines to avoid terminal truncation
2350
- const commands: string[] = [];
2351
-
2352
- // 1. Unset old profile vars
2353
- const profileVarsToReset = ['ANTHROPIC_AUTH_TOKEN', 'ANTHROPIC_BASE_URL', 'ANTHROPIC_SMALL_FAST_MODEL', 'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC', 'DISABLE_TELEMETRY', 'DISABLE_ERROR_REPORTING', 'DISABLE_AUTOUPDATER', 'DISABLE_NON_ESSENTIAL_MODEL_CALLS', 'CLAUDE_MODEL'];
2354
- commands.push(profileVarsToReset.map(v => `unset ${v}`).join('; '));
2355
-
2356
- // 2. Export new profile vars (if any)
2357
- const envWithoutForge = Object.entries(envWithoutModel).filter(([k]) => !k.startsWith('FORGE_'));
2358
- if (envWithoutForge.length > 0) {
2359
- commands.push(envWithoutForge.map(([k, v]) => `export ${k}="${v}"`).join('; '));
2360
- }
2361
-
2362
- // 3. Export FORGE vars
2363
- const forgeVars = Object.entries(envWithoutModel).filter(([k]) => k.startsWith('FORGE_'));
2364
- if (forgeVars.length > 0) {
2365
- commands.push(forgeVars.map(([k, v]) => `export ${k}="${v}"`).join('; '));
2366
- }
2367
-
2368
- // 4. CLI command
2369
- let resumeId = resumeSessionId || boundSessionId;
2370
- if (isClaude && !resumeId && isPrimary) {
2371
- try {
2372
- const { resolveFixedSession } = await import('@/lib/session-utils');
2373
- resumeId = (await resolveFixedSession(projectPath)) || undefined;
2374
- } catch {}
2375
- }
2376
- const resumeFlag = isClaude && resumeId ? ` --resume ${resumeId}` : '';
2377
- let mcpFlag = '';
2378
- if (isClaude) { try { const { getMcpFlag } = await import('@/lib/session-utils'); mcpFlag = await getMcpFlag(projectPath); } catch {} }
2379
- const sf = skipPermissions ? (cliType === 'codex' ? ' --full-auto' : cliType === 'aider' ? ' --yes' : ' --dangerously-skip-permissions') : '';
2380
- commands.push(`${cdCmd} && ${cli}${resumeFlag}${modelFlag}${sf}${mcpFlag}`);
2381
-
2382
- // Send each command with delay between them
2383
- commands.forEach((cmd, i) => {
2384
- setTimeout(() => {
2385
- if (!disposed && ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({ type: 'input', data: cmd + '\n' }));
2386
- }, 300 + i * 300);
2387
- });
2388
- }
2389
- } catch {}
2390
- };
2391
-
2392
- term.onData(data => {
2393
- if (ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({ type: 'input', data }));
2394
- });
2395
- term.onResize(({ cols, rows }) => {
2396
- if (ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({ type: 'resize', cols, rows }));
2397
- });
2398
-
2399
- return () => {
2400
- disposed = true;
2401
- ro.disconnect();
2402
- ws.close();
2403
- term.dispose();
2404
- };
2405
- });
2406
-
2407
- return () => { disposed = true; };
2408
- }, []); // eslint-disable-line react-hooks/exhaustive-deps
2409
-
2410
- return (
2411
- <div
2412
- className="fixed z-50 bg-[#0d1117] border border-[#30363d] rounded-lg shadow-2xl flex flex-col overflow-hidden"
2413
- style={{ left: pos.x, top: pos.y, width: size.w, height: size.h }}
2414
- >
2415
- {/* Draggable header */}
2416
- <div
2417
- className="flex items-center gap-2 px-3 py-1.5 bg-[#161b22] border-b border-[#30363d] cursor-move shrink-0 select-none"
2418
- onMouseDown={(e) => {
2419
- e.preventDefault();
2420
- dragRef.current = { startX: e.clientX, startY: e.clientY, origX: pos.x, origY: pos.y };
2421
- setUserDragged(true);
2422
- const onMove = (ev: MouseEvent) => {
2423
- if (!dragRef.current) return;
2424
- setPos({ x: Math.max(0, dragRef.current.origX + ev.clientX - dragRef.current.startX), y: Math.max(0, dragRef.current.origY + ev.clientY - dragRef.current.startY) });
2425
- };
2426
- const onUp = () => { dragRef.current = null; window.removeEventListener('mousemove', onMove); window.removeEventListener('mouseup', onUp); };
2427
- window.addEventListener('mousemove', onMove);
2428
- window.addEventListener('mouseup', onUp);
2429
- }}
2430
- >
2431
- <span className="text-sm">{agentIcon}</span>
2432
- <span className="text-[11px] font-semibold text-white">{agentLabel}</span>
2433
- <span className="text-[8px] text-gray-500">⌨️ manual terminal</span>
2434
- <button onClick={() => setShowCloseDialog(true)} className="ml-auto text-gray-500 hover:text-white text-sm">✕</button>
2435
- </div>
2436
-
2437
- {/* Terminal */}
2438
- <div ref={containerRef} className="flex-1 min-h-0" style={{ background: '#0d1117' }} />
2439
-
2440
- {/* Resize handle */}
2441
- <div
2442
- className="absolute bottom-0 right-0 w-4 h-4 cursor-se-resize"
2443
- onMouseDown={(e) => {
2444
- e.preventDefault();
2445
- e.stopPropagation();
2446
- resizeRef.current = { startX: e.clientX, startY: e.clientY, origW: size.w, origH: size.h };
2447
- const onMove = (ev: MouseEvent) => {
2448
- if (!resizeRef.current) return;
2449
- setSize({ w: Math.max(400, resizeRef.current.origW + ev.clientX - resizeRef.current.startX), h: Math.max(250, resizeRef.current.origH + ev.clientY - resizeRef.current.startY) });
2450
- };
2451
- const onUp = () => { resizeRef.current = null; window.removeEventListener('mousemove', onMove); window.removeEventListener('mouseup', onUp); };
2452
- window.addEventListener('mousemove', onMove);
2453
- window.addEventListener('mouseup', onUp);
2454
- }}
2455
- >
2456
- <svg viewBox="0 0 16 16" className="w-3 h-3 absolute bottom-0.5 right-0.5 text-gray-600">
2457
- <path d="M14 14L8 14L14 8Z" fill="currentColor" />
2458
- </svg>
2459
- </div>
2460
-
2461
- {/* Close confirmation dialog */}
2462
- {showCloseDialog && (
2463
- <div className="fixed inset-0 z-[60] flex items-center justify-center bg-black/50" onClick={() => setShowCloseDialog(false)}>
2464
- <div className="bg-[#161b22] border border-[#30363d] rounded-lg p-4 shadow-xl max-w-sm" onClick={e => e.stopPropagation()}>
2465
- <h3 className="text-sm font-semibold text-white mb-2">Close Terminal — {agentLabel}</h3>
2466
- <p className="text-xs text-gray-400 mb-3">
2467
- This agent has an active terminal session.
2468
- </p>
2469
- <div className="flex gap-2">
2470
- <button onClick={() => { setShowCloseDialog(false); onClose(false); }}
2471
- className="flex-1 px-3 py-1.5 text-[11px] rounded bg-[#2a2a4a] text-gray-300 hover:bg-[#3a3a5a] hover:text-white">
2472
- Suspend
2473
- <span className="block text-[9px] text-gray-500 mt-0.5">Hide panel, session keeps running</span>
2474
- </button>
2475
- <button onClick={() => {
2476
- setShowCloseDialog(false);
2477
- if (wsRef.current?.readyState === WebSocket.OPEN && sessionNameRef.current) {
2478
- wsRef.current.send(JSON.stringify({ type: 'kill', sessionName: sessionNameRef.current }));
2479
- }
2480
- onClose(true);
2481
- }}
2482
- className={`flex-1 px-3 py-1.5 text-[11px] rounded ${persistentSession ? 'bg-yellow-500/20 text-yellow-400 hover:bg-yellow-500/30' : 'bg-red-500/20 text-red-400 hover:bg-red-500/30'}`}>
2483
- {persistentSession ? 'Restart Session' : 'Kill Session'}
2484
- <span className={`block text-[9px] mt-0.5 ${persistentSession ? 'text-yellow-400/60' : 'text-red-400/60'}`}>
2485
- {persistentSession ? 'Kill and restart with fresh env' : 'End session permanently'}
2486
- </span>
2487
- </button>
2488
- </div>
2489
- <button onClick={() => setShowCloseDialog(false)}
2490
- className="w-full mt-2 px-3 py-1 text-[10px] text-gray-500 hover:text-gray-300">
2491
- Cancel
2492
- </button>
2493
- </div>
2494
- </div>
2495
- )}
2496
- </div>
2497
- );
2498
- }
2499
-
2500
- // ─── ReactFlow Input Node ────────────────────────────────
2501
-
2502
- interface InputNodeData {
2503
- config: AgentConfig;
2504
- state: AgentState;
2505
- onSubmit: (content: string) => void;
2506
- onEdit: () => void;
2507
- onRemove: () => void;
2508
- [key: string]: unknown;
2509
- }
2510
-
2511
- function InputFlowNode({ data }: NodeProps<Node<InputNodeData>>) {
2512
- const { config, state, onSubmit, onEdit, onRemove } = data;
2513
- const isDone = state?.taskStatus === 'done';
2514
- const [text, setText] = useState('');
2515
- const entries = config.entries || [];
2516
-
2517
- return (
2518
- <div className="w-60 flex flex-col rounded-lg select-none"
2519
- style={{ border: `1px solid ${isDone ? '#58a6ff60' : '#30363d50'}`, background: '#0d1117',
2520
- boxShadow: isDone ? '0 0 10px #58a6ff15' : 'none' }}>
2521
- <Handle type="source" position={Position.Right} style={{ background: '#58a6ff', width: 8, height: 8, border: 'none' }} />
2522
-
2523
- {/* Header */}
2524
- <div className="flex items-center gap-2 px-3 py-2" style={{ borderBottom: '1px solid #21262d' }}>
2525
- <span className="text-sm">{config.icon || '📝'}</span>
2526
- <span className="text-xs font-semibold text-white flex-1">{config.label || 'Input'}</span>
2527
- {entries.length > 0 && <span className="text-[8px] text-gray-600">{entries.length}</span>}
2528
- <div className="w-2 h-2 rounded-full" style={{ background: isDone ? '#58a6ff' : '#484f58', boxShadow: isDone ? '0 0 6px #58a6ff' : 'none' }} />
2529
- </div>
2530
-
2531
- {/* History entries (scrollable, compact) */}
2532
- {entries.length > 0 && (
2533
- <div className="max-h-24 overflow-auto px-3 py-1.5 space-y-1" style={{ borderBottom: '1px solid #21262d' }}
2534
- onPointerDown={e => e.stopPropagation()}>
2535
- {entries.map((e, i) => (
2536
- <div key={i} className={`text-[9px] leading-relaxed ${i === entries.length - 1 ? 'text-gray-300' : 'text-gray-600'}`}>
2537
- <span className="text-[7px] text-gray-700 mr-1">#{i + 1}</span>
2538
- {e.content.length > 80 ? e.content.slice(0, 80) + '…' : e.content}
2539
- </div>
2540
- ))}
2541
- </div>
2542
- )}
2543
-
2544
- {/* New input */}
2545
- <div className="px-3 py-2">
2546
- <textarea value={text} onChange={e => setText(e.target.value)} rows={2}
2547
- placeholder={entries.length > 0 ? 'Add new requirement or change...' : 'Describe requirements...'}
2548
- className="w-full text-[10px] bg-[#0d1117] border border-[#21262d] rounded px-2 py-1.5 text-gray-300 placeholder-gray-600 focus:outline-none focus:border-[#58a6ff]/50 resize-none"
2549
- onPointerDown={e => e.stopPropagation()} />
2550
- </div>
2551
-
2552
- {/* Actions */}
2553
- <div className="flex items-center gap-1 px-2 py-1.5" style={{ borderTop: '1px solid #21262d' }}>
2554
- <button onPointerDown={e => e.stopPropagation()} onClick={e => {
2555
- e.stopPropagation();
2556
- if (!text.trim()) return;
2557
- onSubmit(text.trim());
2558
- setText('');
2559
- }}
2560
- className="text-[9px] px-2 py-0.5 rounded bg-[#238636]/20 text-[#3fb950] hover:bg-[#238636]/30 disabled:opacity-30"
2561
- disabled={!text.trim()}>
2562
- {entries.length > 0 ? '+ Add' : '✓ Submit'}
2563
- </button>
2564
- <div className="flex-1" />
2565
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); onRemove(); }}
2566
- className="text-[9px] text-gray-700 hover:text-red-400 px-1">✕</button>
2567
- </div>
2568
- </div>
2569
- );
2570
- }
2571
-
2572
- // ─── ReactFlow Agent Node ────────────────────────────────
2573
-
2574
- interface AgentNodeData {
2575
- config: AgentConfig;
2576
- state: AgentState;
2577
- colorIdx: number;
2578
- previewLines: string[];
2579
- projectPath: string;
2580
- workspaceId: string | null;
2581
- onRun: () => void;
2582
- onPause: () => void;
2583
- onStop: () => void;
2584
- onRetry: () => void;
2585
- onEdit: () => void;
2586
- onRemove: () => void;
2587
- onMessage: () => void;
2588
- onApprove: () => void;
2589
- onShowLog: () => void;
2590
- onShowMemory: () => void;
2591
- onShowInbox: () => void;
2592
- onOpenTerminal: () => void;
2593
- onSwitchSession: () => void;
2594
- onSaveAsTemplate: () => void;
2595
- mascotTheme: MascotTheme;
2596
- onMarkIdle?: () => void;
2597
- onMarkDone?: (notify: boolean) => void;
2598
- onMarkFailed?: (notify: boolean) => void;
2599
- inboxPending?: number;
2600
- inboxFailed?: number;
2601
- [key: string]: unknown;
2602
- }
2603
-
2604
- // PortalTerminal/NodeTerminal removed — xterm cannot render inside React Flow nodes
2605
- // and createPortal causes event routing issues. Using FloatingTerminal instead.
2606
-
2607
- // ─── Worker Mascot — SVG stick figure with pose-based animations ──────────────
2608
- const MASCOT_STYLES = `
2609
- @keyframes mascot-sleep {
2610
- 0%, 100% { transform: translateY(0) rotate(-3deg); opacity: 0.6; }
2611
- 50% { transform: translateY(-2px) rotate(3deg); opacity: 0.9; }
2612
- }
2613
- @keyframes mascot-work {
2614
- 0%, 100% { transform: translateY(0) rotate(0deg); }
2615
- 25% { transform: translateY(-2px) rotate(-6deg); }
2616
- 50% { transform: translateY(0) rotate(0deg); }
2617
- 75% { transform: translateY(-2px) rotate(6deg); }
2618
- }
2619
- @keyframes mascot-celebrate {
2620
- 0% { transform: translateY(0) scale(1); }
2621
- 12% { transform: translateY(-6px) scale(1.15) rotate(-10deg); }
2622
- 25% { transform: translateY(-3px) scale(1.1) rotate(0deg); }
2623
- 37% { transform: translateY(-6px) scale(1.15) rotate(10deg); }
2624
- 50% { transform: translateY(0) scale(1) rotate(0deg); }
2625
- 100% { transform: translateY(0) scale(1) rotate(0deg); }
2626
- }
2627
- @keyframes mascot-fall {
2628
- 0% { transform: translateY(0) rotate(0deg); }
2629
- 30% { transform: translateY(2px) rotate(-15deg); }
2630
- 60% { transform: translateY(4px) rotate(-90deg); }
2631
- 100% { transform: translateY(4px) rotate(-90deg); opacity: 0.6; }
2632
- }
2633
- @keyframes mascot-idle {
2634
- 0%, 100% { transform: translateY(0); }
2635
- 50% { transform: translateY(-1px); }
2636
- }
2637
- @keyframes mascot-blink { 0%, 95%, 100% { opacity: 1; } 97% { opacity: 0.3; } }
2638
- @keyframes stick-arm-hammer {
2639
- 0%, 100% { transform: rotate(-40deg); }
2640
- 50% { transform: rotate(20deg); }
2641
- }
2642
- @keyframes stick-arm-wave {
2643
- 0%, 100% { transform: rotate(-120deg); }
2644
- 50% { transform: rotate(-150deg); }
2645
- }
2646
- @keyframes stick-leg-walk-l {
2647
- 0%, 100% { transform: rotate(-10deg); }
2648
- 50% { transform: rotate(10deg); }
2649
- }
2650
- @keyframes stick-leg-walk-r {
2651
- 0%, 100% { transform: rotate(10deg); }
2652
- 50% { transform: rotate(-10deg); }
2653
- }
2654
- @keyframes stick-zzz {
2655
- 0% { opacity: 0; transform: translate(0, 0) scale(0.5); }
2656
- 50% { opacity: 1; transform: translate(4px, -6px) scale(1); }
2657
- 100% { opacity: 0; transform: translate(8px, -12px) scale(1.2); }
2658
- }
2659
- @keyframes stick-spark {
2660
- 0%, 100% { opacity: 0; }
2661
- 50% { opacity: 1; }
2662
- }
2663
- @keyframes stick-spark-burst {
2664
- 0% { opacity: 0; transform: scale(0.5); }
2665
- 30% { opacity: 1; transform: scale(1.2); }
2666
- 70% { opacity: 1; transform: scale(1); }
2667
- 100% { opacity: 0; transform: scale(0.8); }
2668
- }
2669
- `;
2670
- type MascotPose = 'idle' | 'work' | 'done' | 'fail' | 'sleep' | 'wake';
2671
- export type MascotTheme = 'off' | 'stick' | 'cat' | 'dog' | 'pig' | 'emoji';
2672
-
2673
- function StickCat({ pose, color, accentColor }: { pose: MascotPose; color: string; accentColor: string }) {
2674
- const strokeProps = { stroke: color, strokeWidth: 1.5, strokeLinecap: 'round' as const, fill: 'none' };
2675
- const body = (tailAnim: string) => (
2676
- <>
2677
- {/* head */}
2678
- <circle cx="10" cy="18" r="5" stroke={color} strokeWidth="1.5" fill="none" />
2679
- {/* ears */}
2680
- <path d="M 6 15 L 7 11 L 10 14 Z" fill={color} />
2681
- <path d="M 14 15 L 13 11 L 10 14 Z" fill={color} />
2682
- {/* eyes */}
2683
- <circle cx="8" cy="18" r="0.8" fill={accentColor} />
2684
- <circle cx="12" cy="18" r="0.8" fill={accentColor} />
2685
- {/* nose */}
2686
- <path d="M 9.5 19.5 L 10 20 L 10.5 19.5" stroke={accentColor} strokeWidth="0.8" fill="none" strokeLinecap="round" />
2687
- {/* whiskers */}
2688
- <line x1="5" y1="19" x2="2" y2="18" stroke={color} strokeWidth="0.6" />
2689
- <line x1="5" y1="20" x2="2" y2="20" stroke={color} strokeWidth="0.6" />
2690
- <line x1="15" y1="19" x2="18" y2="18" stroke={color} strokeWidth="0.6" />
2691
- <line x1="15" y1="20" x2="18" y2="20" stroke={color} strokeWidth="0.6" />
2692
- {/* body — oval */}
2693
- <ellipse cx="18" cy="26" rx="8" ry="5" stroke={color} strokeWidth="1.5" fill="none" />
2694
- {/* tail */}
2695
- <g style={{ transformOrigin: '26px 26px', animation: tailAnim }}>
2696
- <path d="M 26 26 Q 30 22 28 18" {...strokeProps} />
2697
- </g>
2698
- {/* legs */}
2699
- <line x1="13" y1="30" x2="13" y2="36" {...strokeProps} />
2700
- <line x1="23" y1="30" x2="23" y2="36" {...strokeProps} />
2701
- <line x1="16" y1="31" x2="16" y2="36" {...strokeProps} />
2702
- <line x1="20" y1="31" x2="20" y2="36" {...strokeProps} />
2703
- </>
2704
- );
2705
-
2706
- if (pose === 'sleep') {
2707
- return (
2708
- <svg width="32" height="40" viewBox="0 0 32 40">
2709
- {/* curled up cat — circle with tail */}
2710
- <circle cx="16" cy="30" r="8" stroke={color} strokeWidth="1.5" fill="none" />
2711
- <circle cx="10" cy="28" r="3" stroke={color} strokeWidth="1.5" fill="none" />
2712
- <line x1="9" y1="27" x2="9" y2="29" stroke={color} strokeWidth="0.8" />
2713
- <line x1="11" y1="27" x2="11" y2="29" stroke={color} strokeWidth="0.8" />
2714
- <path d="M 23 32 Q 28 32 26 26" {...strokeProps} />
2715
- {/* zzz */}
2716
- <text x="20" y="20" fill={accentColor} fontSize="6" fontWeight="bold" style={{ animation: 'stick-zzz 2s ease-out infinite' }}>z</text>
2717
- <text x="24" y="14" fill={accentColor} fontSize="4" fontWeight="bold" style={{ animation: 'stick-zzz 2s ease-out infinite 0.7s' }}>z</text>
2718
- </svg>
2719
- );
2720
- }
2721
-
2722
- if (pose === 'fail') {
2723
- return (
2724
- <svg width="32" height="40" viewBox="0 0 32 40">
2725
- {/* belly up */}
2726
- <ellipse cx="18" cy="26" rx="8" ry="5" stroke={color} strokeWidth="1.5" fill="none" />
2727
- <circle cx="10" cy="24" r="4" stroke={color} strokeWidth="1.5" fill="none" />
2728
- <line x1="8" y1="23" x2="9" y2="24" stroke={accentColor} strokeWidth="0.8" />
2729
- <line x1="9" y1="23" x2="8" y2="24" stroke={accentColor} strokeWidth="0.8" />
2730
- <line x1="11" y1="23" x2="12" y2="24" stroke={accentColor} strokeWidth="0.8" />
2731
- <line x1="12" y1="23" x2="11" y2="24" stroke={accentColor} strokeWidth="0.8" />
2732
- {/* legs up */}
2733
- <line x1="14" y1="22" x2="14" y2="16" {...strokeProps} />
2734
- <line x1="18" y1="22" x2="18" y2="15" {...strokeProps} />
2735
- <line x1="22" y1="22" x2="22" y2="16" {...strokeProps} />
2736
- </svg>
2737
- );
2738
- }
2739
-
2740
- if (pose === 'done') {
2741
- return (
2742
- <svg width="32" height="40" viewBox="0 0 32 40">
2743
- {/* jumping — body elevated */}
2744
- <g style={{ transform: 'translateY(-2px)' }}>
2745
- {body('none')}
2746
- </g>
2747
- <text x="2" y="8" fill="#ffd700" fontSize="6" style={{ animation: 'stick-spark-burst 1.2s ease-out forwards' }}>✦</text>
2748
- <text x="26" y="10" fill="#ffd700" fontSize="8" style={{ animation: 'stick-spark-burst 1.2s ease-out forwards 0.3s' }}>✦</text>
2749
- </svg>
2750
- );
2751
- }
2752
-
2753
- if (pose === 'work') {
2754
- return (
2755
- <svg width="32" height="40" viewBox="0 0 32 40">
2756
- {body('stick-arm-hammer 0.4s ease-in-out infinite')}
2757
- </svg>
2758
- );
2759
- }
2760
-
2761
- if (pose === 'wake') {
2762
- return (
2763
- <svg width="32" height="40" viewBox="0 0 32 40">
2764
- {/* stretching — elongated body */}
2765
- <circle cx="8" cy="22" r="4" stroke={color} strokeWidth="1.5" fill="none" />
2766
- <path d="M 4 19 L 5 16 L 8 18 Z" fill={color} />
2767
- <path d="M 12 19 L 11 16 L 8 18 Z" fill={color} />
2768
- <circle cx="6.5" cy="22" r="0.6" fill={accentColor} />
2769
- <circle cx="9.5" cy="22" r="0.6" fill={accentColor} />
2770
- <ellipse cx="20" cy="28" rx="10" ry="4" stroke={color} strokeWidth="1.5" fill="none" />
2771
- <line x1="14" y1="32" x2="14" y2="38" {...strokeProps} />
2772
- <line x1="26" y1="32" x2="26" y2="38" {...strokeProps} />
2773
- <path d="M 30 28 Q 32 24 30 20" {...strokeProps} />
2774
- </svg>
2775
- );
2776
- }
2777
-
2778
- // idle — tail swaying
2779
- return (
2780
- <svg width="32" height="40" viewBox="0 0 32 40">
2781
- {body('stick-arm-wave 2s ease-in-out infinite')}
2782
- </svg>
2783
- );
2784
- }
2785
-
2786
- function StickDog({ pose, color, accentColor }: { pose: MascotPose; color: string; accentColor: string }) {
2787
- // Side-profile dog — elongated snout forward, triangular perked ear, visible tail
2788
- // Designed to read clearly at small sizes with distinct dog silhouette
2789
-
2790
- if (pose === 'sleep') {
2791
- return (
2792
- <svg width="40" height="40" viewBox="0 0 40 40">
2793
- {/* body lying down */}
2794
- <ellipse cx="22" cy="32" rx="12" ry="4" stroke={color} strokeWidth="1.8" fill={color} fillOpacity="0.15" />
2795
- {/* head resting on paws — side profile */}
2796
- <path d="M 10 32 Q 6 30 4 32 Q 2 33 3 35 L 10 35 Z" stroke={color} strokeWidth="1.8" fill={color} fillOpacity="0.2" strokeLinejoin="round" />
2797
- {/* long snout */}
2798
- <path d="M 3 34 L 1 35 L 3 36" stroke={color} strokeWidth="1.5" fill="none" strokeLinecap="round" strokeLinejoin="round" />
2799
- {/* floppy ear */}
2800
- <path d="M 8 30 Q 6 33 9 34" stroke={color} strokeWidth="2" fill={color} fillOpacity="0.35" strokeLinecap="round" />
2801
- {/* closed eye */}
2802
- <path d="M 6 33 Q 7 32.5 8 33" stroke={color} strokeWidth="0.8" fill="none" strokeLinecap="round" />
2803
- {/* nose */}
2804
- <ellipse cx="1.5" cy="35" rx="0.9" ry="0.7" fill={color} />
2805
- {/* curled tail */}
2806
- <path d="M 33 32 Q 38 30 36 26 Q 35 25 36 24" stroke={color} strokeWidth="2" fill="none" strokeLinecap="round" />
2807
- <text x="18" y="18" fill={accentColor} fontSize="7" fontWeight="bold" style={{ animation: 'stick-zzz 2s ease-out infinite' }}>z</text>
2808
- <text x="24" y="12" fill={accentColor} fontSize="5" fontWeight="bold" style={{ animation: 'stick-zzz 2s ease-out infinite 0.7s' }}>z</text>
2809
- </svg>
2810
- );
2811
- }
2812
-
2813
- if (pose === 'fail') {
2814
- return (
2815
- <svg width="40" height="40" viewBox="0 0 40 40">
2816
- {/* belly up */}
2817
- <ellipse cx="22" cy="32" rx="12" ry="4" stroke={color} strokeWidth="1.8" fill={color} fillOpacity="0.15" />
2818
- {/* head upside down */}
2819
- <path d="M 10 32 Q 6 34 4 32 Q 2 31 3 29 L 10 29 Z" stroke={color} strokeWidth="1.8" fill={color} fillOpacity="0.2" strokeLinejoin="round" />
2820
- <path d="M 3 30 L 1 29 L 3 28" stroke={color} strokeWidth="1.5" fill="none" strokeLinecap="round" strokeLinejoin="round" />
2821
- {/* X eyes */}
2822
- <line x1="5" y1="30" x2="6.5" y2="31.5" stroke={accentColor} strokeWidth="1.2" strokeLinecap="round" />
2823
- <line x1="6.5" y1="30" x2="5" y2="31.5" stroke={accentColor} strokeWidth="1.2" strokeLinecap="round" />
2824
- {/* tongue hanging out sideways */}
2825
- <path d="M 2 30 Q 1 27 2 25" stroke="#ff6b9d" strokeWidth="1.5" fill="none" strokeLinecap="round" />
2826
- {/* all 4 legs sticking up */}
2827
- <line x1="14" y1="28" x2="13" y2="20" stroke={color} strokeWidth="1.8" strokeLinecap="round" />
2828
- <line x1="18" y1="28" x2="18" y2="18" stroke={color} strokeWidth="1.8" strokeLinecap="round" />
2829
- <line x1="26" y1="28" x2="26" y2="18" stroke={color} strokeWidth="1.8" strokeLinecap="round" />
2830
- <line x1="30" y1="28" x2="31" y2="20" stroke={color} strokeWidth="1.8" strokeLinecap="round" />
2831
- {/* limp tail */}
2832
- <path d="M 33 32 L 37 34" stroke={color} strokeWidth="2" fill="none" strokeLinecap="round" />
2833
- </svg>
2834
- );
2835
- }
2836
-
2837
- // Standing side-profile dog
2838
- const standingDog = (tailAnim: string, bounce: string = '') => (
2839
- <g style={bounce ? { transform: bounce } : {}}>
2840
- {/* body — side profile, clearly elongated horizontal */}
2841
- <path d="M 11 22 L 28 22 Q 32 22 32 26 L 32 30 Q 32 32 30 32 L 9 32 Q 7 32 7 30 L 7 27 Q 7 23 11 22 Z"
2842
- stroke={color} strokeWidth="1.8" fill={color} fillOpacity="0.15" strokeLinejoin="round" />
2843
- {/* head — side profile with long snout pointing LEFT */}
2844
- <path d="M 11 22 Q 8 22 6 20 Q 4 20 2 22 Q 0 23 1 25 Q 1 27 3 27 L 8 27 Q 10 27 11 25 Z"
2845
- stroke={color} strokeWidth="1.8" fill={color} fillOpacity="0.2" strokeLinejoin="round" />
2846
- {/* triangular perked ear (pointing up-back) */}
2847
- <path d="M 8 22 L 10 15 L 12 20 Z" stroke={color} strokeWidth="1.5" fill={color} fillOpacity="0.4" strokeLinejoin="round" />
2848
- {/* big black nose at tip */}
2849
- <ellipse cx="1" cy="24" rx="1.3" ry="1" fill={color} />
2850
- {/* eye */}
2851
- <circle cx="7" cy="23" r="1" fill={accentColor} />
2852
- <circle cx="6.7" cy="22.7" r="0.3" fill="#fff" />
2853
- {/* mouth line */}
2854
- <path d="M 1 25.5 Q 3 27 6 26" stroke={color} strokeWidth="0.8" fill="none" strokeLinecap="round" />
2855
- {/* tongue hanging out */}
2856
- <path d="M 2.5 26.5 Q 3 28.5 2 29" stroke="#ff6b9d" strokeWidth="1.2" fill="#ff6b9d" strokeLinecap="round" />
2857
- {/* curled tail (pointing up-right) — wags */}
2858
- <g style={{ transformOrigin: '32px 26px', animation: tailAnim }}>
2859
- <path d="M 32 26 Q 37 24 36 19 Q 36 17 38 17" stroke={color} strokeWidth="2.2" fill="none" strokeLinecap="round" />
2860
- </g>
2861
- {/* 4 legs — visible in side profile (2 front + 2 back, front pair visible) */}
2862
- <line x1="10" y1="32" x2="10" y2="38" stroke={color} strokeWidth="1.8" strokeLinecap="round" />
2863
- <line x1="14" y1="32" x2="14" y2="38" stroke={color} strokeWidth="1.8" strokeLinecap="round" />
2864
- <line x1="26" y1="32" x2="26" y2="38" stroke={color} strokeWidth="1.8" strokeLinecap="round" />
2865
- <line x1="30" y1="32" x2="30" y2="38" stroke={color} strokeWidth="1.8" strokeLinecap="round" />
2866
- {/* paws */}
2867
- <rect x="8.5" y="37.5" width="3" height="1.5" fill={color} rx="0.5" />
2868
- <rect x="12.5" y="37.5" width="3" height="1.5" fill={color} rx="0.5" />
2869
- <rect x="24.5" y="37.5" width="3" height="1.5" fill={color} rx="0.5" />
2870
- <rect x="28.5" y="37.5" width="3" height="1.5" fill={color} rx="0.5" />
2871
- {/* collar */}
2872
- <line x1="9" y1="27" x2="12" y2="27" stroke={accentColor} strokeWidth="1.5" strokeLinecap="round" />
2873
- <circle cx="10.5" cy="28" r="0.9" fill={accentColor} />
2874
- </g>
2875
- );
2876
-
2877
- if (pose === 'done') {
2878
- return (
2879
- <svg width="40" height="40" viewBox="0 0 40 40">
2880
- {standingDog('stick-arm-wave 0.3s ease-in-out infinite', 'translateY(-3px)')}
2881
- <text x="2" y="10" fill="#ffd700" fontSize="7" style={{ animation: 'stick-spark-burst 1.2s ease-out forwards' }}>✦</text>
2882
- <text x="34" y="12" fill="#ffd700" fontSize="9" style={{ animation: 'stick-spark-burst 1.2s ease-out forwards 0.3s' }}>✦</text>
2883
- <text x="18" y="6" fill="#ffd700" fontSize="6" style={{ animation: 'stick-spark-burst 1.2s ease-out forwards 0.5s' }}>✦</text>
2884
- </svg>
2885
- );
2886
- }
2887
-
2888
- if (pose === 'work') {
2889
- return (
2890
- <svg width="40" height="40" viewBox="0 0 40 40">
2891
- {standingDog('stick-arm-wave 0.25s ease-in-out infinite')}
2892
- {/* bone in mouth */}
2893
- <g transform="translate(-6, 0)">
2894
- <circle cx="0" cy="25" r="1.5" fill={accentColor} stroke={color} strokeWidth="0.6" />
2895
- <rect x="0" y="24.2" width="5" height="1.6" fill={accentColor} stroke={color} strokeWidth="0.6" rx="0.4" />
2896
- <circle cx="5" cy="25" r="1.5" fill={accentColor} stroke={color} strokeWidth="0.6" />
2897
- </g>
2898
- </svg>
2899
- );
2900
- }
2901
-
2902
- if (pose === 'wake') {
2903
- return (
2904
- <svg width="40" height="40" viewBox="0 0 40 40">
2905
- {standingDog('stick-arm-wave 1.5s ease-in-out infinite')}
2906
- {/* yawn — open mouth replaces tongue */}
2907
- <ellipse cx="2" cy="26" rx="1.3" ry="1.8" fill={color} opacity="0.5" />
2908
- </svg>
2909
- );
2910
- }
2911
-
2912
- // idle — standing, happy tail wag
2913
- return (
2914
- <svg width="40" height="40" viewBox="0 0 40 40">
2915
- {standingDog('stick-arm-wave 0.6s ease-in-out infinite')}
2916
- </svg>
2917
- );
2918
- }
2919
-
2920
- function StickPig({ pose, color, accentColor }: { pose: MascotPose; color: string; accentColor: string }) {
2921
- const pink = '#ff9ecb';
2922
- const pinkFill = '#ff9ecb';
2923
-
2924
- if (pose === 'sleep') {
2925
- return (
2926
- <svg width="32" height="40" viewBox="0 0 32 40">
2927
- <ellipse cx="16" cy="30" rx="12" ry="7" stroke={pink} strokeWidth="1.8" fill={pinkFill} fillOpacity="0.25" />
2928
- <circle cx="8" cy="28" r="4" stroke={pink} strokeWidth="1.8" fill={pinkFill} fillOpacity="0.3" />
2929
- {/* pig snout disc */}
2930
- <ellipse cx="4.5" cy="29" rx="2.5" ry="1.8" stroke={pink} strokeWidth="1.5" fill={pinkFill} fillOpacity="0.4" />
2931
- <circle cx="4" cy="29" r="0.5" fill={color} />
2932
- <circle cx="5" cy="29" r="0.5" fill={color} />
2933
- {/* pointy triangular ears */}
2934
- <path d="M 5 24 L 6 22 L 8 25 Z" fill={pinkFill} stroke={pink} strokeWidth="1" />
2935
- <path d="M 9 24 L 10 22 L 11 25 Z" fill={pinkFill} stroke={pink} strokeWidth="1" />
2936
- {/* closed eyes */}
2937
- <path d="M 7 27 Q 7.5 26.5 8 27" stroke={color} strokeWidth="0.8" fill="none" strokeLinecap="round" />
2938
- <path d="M 9 27 Q 9.5 26.5 10 27" stroke={color} strokeWidth="0.8" fill="none" strokeLinecap="round" />
2939
- {/* curly tail */}
2940
- <path d="M 28 28 Q 30 26 28 24 Q 26 24 28 22" stroke={pink} strokeWidth="2" fill="none" strokeLinecap="round" />
2941
- <text x="16" y="16" fill={accentColor} fontSize="7" fontWeight="bold" style={{ animation: 'stick-zzz 2s ease-out infinite' }}>z</text>
2942
- <text x="21" y="10" fill={accentColor} fontSize="5" fontWeight="bold" style={{ animation: 'stick-zzz 2s ease-out infinite 0.7s' }}>z</text>
2943
- </svg>
2944
- );
2945
- }
2946
-
2947
- if (pose === 'fail') {
2948
- return (
2949
- <svg width="32" height="40" viewBox="0 0 32 40">
2950
- <ellipse cx="18" cy="29" rx="11" ry="5" stroke={pink} strokeWidth="1.8" fill={pinkFill} fillOpacity="0.25" />
2951
- <circle cx="8" cy="27" r="4.5" stroke={pink} strokeWidth="1.8" fill={pinkFill} fillOpacity="0.3" />
2952
- <ellipse cx="7" cy="23" rx="2.5" ry="2" stroke={pink} strokeWidth="1.5" fill={pinkFill} fillOpacity="0.5" />
2953
- <circle cx="6.3" cy="23" r="0.5" fill={color} />
2954
- <circle cx="7.7" cy="23" r="0.5" fill={color} />
2955
- <path d="M 4 28 Q 0 30 2 34" fill={pinkFill} stroke={pink} strokeWidth="1.8" strokeLinecap="round" />
2956
- <path d="M 12 28 Q 16 30 14 34" fill={pinkFill} stroke={pink} strokeWidth="1.8" strokeLinecap="round" />
2957
- <line x1="6" y1="26" x2="7.5" y2="27.5" stroke={color} strokeWidth="1.2" strokeLinecap="round" />
2958
- <line x1="7.5" y1="26" x2="6" y2="27.5" stroke={color} strokeWidth="1.2" strokeLinecap="round" />
2959
- <line x1="9" y1="26" x2="10.5" y2="27.5" stroke={color} strokeWidth="1.2" strokeLinecap="round" />
2960
- <line x1="10.5" y1="26" x2="9" y2="27.5" stroke={color} strokeWidth="1.2" strokeLinecap="round" />
2961
- <line x1="14" y1="25" x2="13" y2="17" stroke={pink} strokeWidth="1.8" strokeLinecap="round" />
2962
- <line x1="18" y1="25" x2="18" y2="16" stroke={pink} strokeWidth="1.8" strokeLinecap="round" />
2963
- <line x1="22" y1="25" x2="22" y2="17" stroke={pink} strokeWidth="1.8" strokeLinecap="round" />
2964
- <line x1="26" y1="25" x2="27" y2="18" stroke={pink} strokeWidth="1.8" strokeLinecap="round" />
2965
- </svg>
2966
- );
2967
- }
2968
-
2969
- const pigBody = (tailAnim: string, bounce: string = '') => (
2970
- <g style={bounce ? { transform: bounce } : {}}>
2971
- {/* round pig body */}
2972
- <ellipse cx="18" cy="27" rx="11" ry="6.5" stroke={pink} strokeWidth="1.8" fill={pinkFill} fillOpacity="0.25" />
2973
- {/* round head */}
2974
- <circle cx="9" cy="18" r="6" stroke={pink} strokeWidth="1.8" fill={pinkFill} fillOpacity="0.3" />
2975
- {/* pig snout — flat disc with nostrils */}
2976
- <ellipse cx="5" cy="20" rx="3" ry="2.2" stroke={pink} strokeWidth="1.5" fill={pinkFill} fillOpacity="0.5" />
2977
- <circle cx="4" cy="20" r="0.6" fill={color} />
2978
- <circle cx="6" cy="20" r="0.6" fill={color} />
2979
- {/* triangular pointed ears */}
2980
- <path d="M 6 13 L 7 10 L 9 14 Z" fill={pinkFill} stroke={pink} strokeWidth="1.2" strokeLinejoin="round" />
2981
- <path d="M 11 13 L 12 10 L 14 14 Z" fill={pinkFill} stroke={pink} strokeWidth="1.2" strokeLinejoin="round" />
2982
- {/* eyes */}
2983
- <circle cx="8" cy="17" r="1" fill={color} />
2984
- <circle cx="12" cy="17" r="1" fill={color} />
2985
- <circle cx="7.7" cy="16.7" r="0.3" fill="#fff" />
2986
- <circle cx="11.7" cy="16.7" r="0.3" fill="#fff" />
2987
- {/* smile */}
2988
- <path d="M 7 22 Q 9 23 11 22" stroke={color} strokeWidth="0.8" fill="none" strokeLinecap="round" />
2989
- {/* curly tail — wagging */}
2990
- <g style={{ transformOrigin: '29px 25px', animation: tailAnim }}>
2991
- <path d="M 29 25 Q 32 23 30 21 Q 28 21 30 19 Q 31 18 32 19" stroke={pink} strokeWidth="2" fill="none" strokeLinecap="round" />
2992
- </g>
2993
- {/* trotter legs */}
2994
- <line x1="12" y1="32" x2="12" y2="38" stroke={pink} strokeWidth="2" strokeLinecap="round" />
2995
- <line x1="16" y1="33" x2="16" y2="38" stroke={pink} strokeWidth="2" strokeLinecap="round" />
2996
- <line x1="20" y1="33" x2="20" y2="38" stroke={pink} strokeWidth="2" strokeLinecap="round" />
2997
- <line x1="24" y1="32" x2="24" y2="38" stroke={pink} strokeWidth="2" strokeLinecap="round" />
2998
- {/* hooves */}
2999
- <rect x="10.5" y="37.5" width="3" height="1.8" fill={color} rx="0.3" />
3000
- <rect x="14.5" y="37.5" width="3" height="1.8" fill={color} rx="0.3" />
3001
- <rect x="18.5" y="37.5" width="3" height="1.8" fill={color} rx="0.3" />
3002
- <rect x="22.5" y="37.5" width="3" height="1.8" fill={color} rx="0.3" />
3003
- </g>
3004
- );
3005
-
3006
- if (pose === 'done') {
3007
- return (
3008
- <svg width="32" height="40" viewBox="0 0 32 40">
3009
- {pigBody('stick-arm-wave 0.4s ease-in-out infinite', 'translateY(-2px)')}
3010
- <text x="2" y="8" fill="#ffd700" fontSize="6" style={{ animation: 'stick-spark-burst 1.2s ease-out forwards' }}>✦</text>
3011
- <text x="26" y="10" fill="#ffd700" fontSize="8" style={{ animation: 'stick-spark-burst 1.2s ease-out forwards 0.3s' }}>✦</text>
3012
- </svg>
3013
- );
3014
- }
3015
-
3016
- if (pose === 'work') {
3017
- return (
3018
- <svg width="32" height="40" viewBox="0 0 32 40">
3019
- {pigBody('stick-arm-wave 0.3s ease-in-out infinite')}
3020
- </svg>
3021
- );
3022
- }
3023
-
3024
- if (pose === 'wake') {
3025
- return (
3026
- <svg width="32" height="40" viewBox="0 0 32 40">
3027
- {pigBody('stick-arm-wave 1.5s ease-in-out infinite')}
3028
- <ellipse cx="9" cy="20" rx="1.3" ry="1.5" fill={color} opacity="0.4" />
3029
- </svg>
3030
- );
3031
- }
3032
-
3033
- return (
3034
- <svg width="32" height="40" viewBox="0 0 32 40">
3035
- {pigBody('stick-arm-wave 0.7s ease-in-out infinite')}
3036
- </svg>
3037
- );
3038
- }
3039
-
3040
- function EmojiMascot({ pose, seed }: { pose: MascotPose; seed: number }) {
3041
- const characters = ['🦊', '🐱', '🐼', '🦉', '🐸', '🦝', '🐙', '🦖', '🐰', '🦄', '🐺', '🧙‍♂️', '🧝‍♀️', '🦸‍♂️', '🥷', '🐲'];
3042
- const character = characters[seed % characters.length];
3043
- let display = character;
3044
- if (pose === 'sleep') display = ['😴', '💤', '🌙', '💤'][Math.floor(Date.now() / 1200) % 4];
3045
- else if (pose === 'work') { const tools = ['🔨', '⚙️', '🛠️', '⚡']; const tick = Math.floor(Date.now() / 400); display = tick % 3 === 0 ? character : tools[tick % tools.length]; }
3046
- else if (pose === 'done') display = ['🎉', '🎊', '🥳', '🌟'][Math.floor(Date.now() / 600) % 4];
3047
- else if (pose === 'fail') display = ['😵', '💫', '🤕', '😿'][seed % 4];
3048
- else if (pose === 'wake') display = ['🥱', '☕', '🌅'][Math.floor(Date.now() / 1000) % 3];
3049
- return <div style={{ fontSize: '24px', lineHeight: 1 }}>{display}</div>;
3050
- }
3051
-
3052
- function StickFigure({ pose, color, accentColor }: { pose: MascotPose; color: string; accentColor: string }) {
3053
- // viewBox 32×40: head at (16,8), body (16,12)→(16,26), arms from (16,14), legs from (16,26)
3054
- const strokeProps = { stroke: color, strokeWidth: 2, strokeLinecap: 'round' as const, fill: 'none' };
3055
-
3056
- if (pose === 'sleep') {
3057
- // Lying down, sleeping
3058
- return (
3059
- <svg width="32" height="40" viewBox="0 0 32 40">
3060
- {/* body horizontal */}
3061
- <circle cx="8" cy="30" r="3" {...strokeProps} fill={color} />
3062
- <line x1="11" y1="30" x2="26" y2="30" {...strokeProps} />
3063
- <line x1="14" y1="30" x2="18" y2="26" {...strokeProps} />
3064
- <line x1="20" y1="30" x2="24" y2="34" {...strokeProps} />
3065
- {/* zzz */}
3066
- <text x="18" y="14" fill={accentColor} fontSize="8" fontWeight="bold" style={{ animation: 'stick-zzz 2s ease-out infinite' }}>z</text>
3067
- <text x="22" y="10" fill={accentColor} fontSize="6" fontWeight="bold" style={{ animation: 'stick-zzz 2s ease-out infinite 0.7s' }}>z</text>
3068
- </svg>
3069
- );
3070
- }
3071
-
3072
- if (pose === 'wake') {
3073
- // Stretching — arms up
3074
- return (
3075
- <svg width="32" height="40" viewBox="0 0 32 40">
3076
- <circle cx="16" cy="8" r="3" {...strokeProps} fill={color} />
3077
- <line x1="16" y1="11" x2="16" y2="26" {...strokeProps} />
3078
- <line x1="16" y1="14" x2="10" y2="6" {...strokeProps} />
3079
- <line x1="16" y1="14" x2="22" y2="6" {...strokeProps} />
3080
- <line x1="16" y1="26" x2="12" y2="34" {...strokeProps} />
3081
- <line x1="16" y1="26" x2="20" y2="34" {...strokeProps} />
3082
- {/* ☼ */}
3083
- <circle cx="26" cy="6" r="2" fill={accentColor} opacity="0.8" />
3084
- </svg>
3085
- );
3086
- }
3087
-
3088
- if (pose === 'done') {
3089
- // Victory pose — both arms up, legs apart
3090
- return (
3091
- <svg width="32" height="40" viewBox="0 0 32 40">
3092
- <circle cx="16" cy="8" r="3" {...strokeProps} fill={color} />
3093
- {/* smile */}
3094
- <path d="M 14 8 Q 16 10 18 8" stroke={accentColor} strokeWidth="1" fill="none" strokeLinecap="round" />
3095
- <line x1="16" y1="11" x2="16" y2="26" {...strokeProps} />
3096
- <line x1="16" y1="14" x2="8" y2="4" {...strokeProps} />
3097
- <line x1="16" y1="14" x2="24" y2="4" {...strokeProps} />
3098
- <line x1="16" y1="26" x2="10" y2="36" {...strokeProps} />
3099
- <line x1="16" y1="26" x2="22" y2="36" {...strokeProps} />
3100
- {/* sparkles */}
3101
- <text x="4" y="4" fill="#ffd700" fontSize="6" style={{ animation: 'stick-spark-burst 1.2s ease-out forwards' }}>✦</text>
3102
- <text x="26" y="6" fill="#ffd700" fontSize="8" style={{ animation: 'stick-spark-burst 1.2s ease-out forwards 0.3s' }}>✦</text>
3103
- <text x="2" y="20" fill="#ffd700" fontSize="5" style={{ animation: 'stick-spark-burst 1.2s ease-out forwards 0.5s' }}>✦</text>
3104
- </svg>
3105
- );
3106
- }
3107
-
3108
- if (pose === 'fail') {
3109
- // Fallen down — lying on back, X eyes (handled via external rotate)
3110
- return (
3111
- <svg width="32" height="40" viewBox="0 0 32 40">
3112
- <circle cx="16" cy="8" r="3" {...strokeProps} fill={color} />
3113
- {/* X eyes */}
3114
- <line x1="14" y1="6" x2="15" y2="7" stroke={accentColor} strokeWidth="1" strokeLinecap="round" />
3115
- <line x1="15" y1="6" x2="14" y2="7" stroke={accentColor} strokeWidth="1" strokeLinecap="round" />
3116
- <line x1="17" y1="6" x2="18" y2="7" stroke={accentColor} strokeWidth="1" strokeLinecap="round" />
3117
- <line x1="18" y1="6" x2="17" y2="7" stroke={accentColor} strokeWidth="1" strokeLinecap="round" />
3118
- <line x1="16" y1="11" x2="16" y2="26" {...strokeProps} />
3119
- <line x1="16" y1="14" x2="8" y2="18" {...strokeProps} />
3120
- <line x1="16" y1="14" x2="24" y2="18" {...strokeProps} />
3121
- <line x1="16" y1="26" x2="10" y2="34" {...strokeProps} />
3122
- <line x1="16" y1="26" x2="22" y2="34" {...strokeProps} />
3123
- </svg>
3124
- );
3125
- }
3126
-
3127
- if (pose === 'work') {
3128
- // Hammering — left arm stable, right arm swinging with hammer
3129
- return (
3130
- <svg width="32" height="40" viewBox="0 0 32 40">
3131
- <circle cx="16" cy="8" r="3" {...strokeProps} fill={color} />
3132
- <line x1="16" y1="11" x2="16" y2="26" {...strokeProps} />
3133
- {/* left arm holding nail */}
3134
- <line x1="16" y1="14" x2="10" y2="20" {...strokeProps} />
3135
- {/* right arm swinging hammer */}
3136
- <g style={{ transformOrigin: '16px 14px', animation: 'stick-arm-hammer 0.5s ease-in-out infinite' }}>
3137
- <line x1="16" y1="14" x2="24" y2="14" {...strokeProps} />
3138
- {/* hammer */}
3139
- <rect x="24" y="11" width="5" height="6" fill={accentColor} stroke={color} strokeWidth="1" rx="1" />
3140
- </g>
3141
- {/* legs walking */}
3142
- <g style={{ transformOrigin: '16px 26px', animation: 'stick-leg-walk-l 0.5s ease-in-out infinite' }}>
3143
- <line x1="16" y1="26" x2="12" y2="36" {...strokeProps} />
3144
- </g>
3145
- <g style={{ transformOrigin: '16px 26px', animation: 'stick-leg-walk-r 0.5s ease-in-out infinite' }}>
3146
- <line x1="16" y1="26" x2="20" y2="36" {...strokeProps} />
3147
- </g>
3148
- {/* sparks from hammer */}
3149
- <text x="26" y="22" fill="#ff9500" fontSize="6" style={{ animation: 'stick-spark 0.5s ease-in-out infinite' }}>✦</text>
3150
- </svg>
3151
- );
3152
- }
3153
-
3154
- // idle — standing, waving
3155
- return (
3156
- <svg width="32" height="40" viewBox="0 0 32 40">
3157
- <circle cx="16" cy="8" r="3" {...strokeProps} fill={color} />
3158
- {/* eyes dots */}
3159
- <circle cx="15" cy="7" r="0.6" fill={accentColor} />
3160
- <circle cx="17" cy="7" r="0.6" fill={accentColor} />
3161
- <line x1="16" y1="11" x2="16" y2="26" {...strokeProps} />
3162
- {/* left arm down */}
3163
- <line x1="16" y1="14" x2="12" y2="22" {...strokeProps} />
3164
- {/* right arm waving */}
3165
- <g style={{ transformOrigin: '16px 14px', animation: 'stick-arm-wave 2s ease-in-out infinite' }}>
3166
- <line x1="16" y1="14" x2="22" y2="14" {...strokeProps} />
3167
- </g>
3168
- <line x1="16" y1="26" x2="12" y2="36" {...strokeProps} />
3169
- <line x1="16" y1="26" x2="20" y2="36" {...strokeProps} />
3170
- </svg>
3171
- );
3172
- }
3173
-
3174
- function WorkerMascot({ taskStatus, smithStatus, seed, accentColor, theme }: { taskStatus: string; smithStatus: string; seed: number; accentColor: string; theme: MascotTheme }) {
3175
- if (theme === 'off') return null;
3176
-
3177
- let pose: MascotPose = 'idle';
3178
- let animation = 'mascot-idle 3s ease-in-out infinite';
3179
- let title = 'Ready for work';
3180
- const color = '#e6edf3';
3181
-
3182
- if (smithStatus === 'down') {
3183
- pose = 'sleep';
3184
- animation = 'mascot-sleep 2.5s ease-in-out infinite';
3185
- title = 'Smith is down — sleeping';
3186
- } else if (taskStatus === 'running') {
3187
- pose = 'work';
3188
- animation = 'mascot-work 0.6s ease-in-out infinite';
3189
- title = 'Hard at work!';
3190
- } else if (taskStatus === 'done') {
3191
- pose = 'done';
3192
- // Celebrate 2 times (~2.4s total), then hold the pose quietly
3193
- animation = 'mascot-celebrate 2.4s ease-in-out forwards';
3194
- title = 'Task done!';
3195
- } else if (taskStatus === 'failed') {
3196
- pose = 'fail';
3197
- animation = 'mascot-fall 0.8s ease-out forwards';
3198
- title = 'Task failed';
3199
- } else if (smithStatus === 'starting') {
3200
- pose = 'wake';
3201
- animation = 'mascot-sleep 1.8s ease-in-out infinite';
3202
- title = 'Waking up...';
3203
- } else {
3204
- animation = 'mascot-idle 3s ease-in-out infinite';
3205
- title = 'Ready for work';
3206
- }
3207
-
3208
- let figure: React.ReactNode;
3209
- if (theme === 'stick') figure = <StickFigure pose={pose} color={color} accentColor={accentColor} />;
3210
- else if (theme === 'cat') figure = <StickCat pose={pose} color={color} accentColor={accentColor} />;
3211
- else if (theme === 'dog') figure = <StickDog pose={pose} color={color} accentColor={accentColor} />;
3212
- else if (theme === 'pig') figure = <StickPig pose={pose} color={color} accentColor={accentColor} />;
3213
- else figure = <EmojiMascot pose={pose} seed={seed} />;
3214
-
3215
- return (
3216
- <div
3217
- className="absolute pointer-events-none select-none"
3218
- style={{
3219
- top: '-36px',
3220
- right: '-8px',
3221
- animation,
3222
- filter: 'drop-shadow(0 2px 3px rgba(0,0,0,0.6))',
3223
- zIndex: 10,
3224
- transformOrigin: 'bottom center',
3225
- }}
3226
- title={title}
3227
- >
3228
- {figure}
3229
- </div>
3230
- );
3231
- }
3232
-
3233
- function AgentFlowNode({ data }: NodeProps<Node<AgentNodeData>>) {
3234
- const { config, state, colorIdx, previewLines, projectPath, workspaceId, onRun, onPause, onStop, onRetry, onEdit, onRemove, onMessage, onApprove, onShowLog, onShowMemory, onShowInbox, onOpenTerminal, onSwitchSession, onSaveAsTemplate, mascotTheme, inboxPending = 0, inboxFailed = 0 } = data;
3235
- const c = COLORS[colorIdx % COLORS.length];
3236
- const smithStatus = state?.smithStatus || 'down';
3237
- const taskStatus = state?.taskStatus || 'idle';
3238
- const hasTmux = !!state?.tmuxSession;
3239
- const smithInfo = SMITH_STATUS[smithStatus] || SMITH_STATUS.down;
3240
- const taskInfo = TASK_STATUS[taskStatus] || TASK_STATUS.idle;
3241
- const currentStep = state?.currentStep;
3242
- const step = currentStep !== undefined ? config.steps[currentStep] : undefined;
3243
- const isApprovalPending = taskStatus === 'idle' && smithStatus === 'active';
3244
-
3245
- // Stable seed for mascot character from agent id
3246
- const mascotSeed = config.id.split('').reduce((a, c) => a + c.charCodeAt(0), 0);
3247
-
3248
- return (
3249
- <div className="w-52 flex flex-col rounded-lg select-none relative"
3250
- style={{ border: `1px solid ${c.border}${taskStatus === 'running' ? '90' : '40'}`, background: c.bg,
3251
- boxShadow: taskInfo.glow ? `0 0 12px ${taskInfo.color}25` : smithInfo.glow ? `0 0 8px ${smithInfo.color}15` : 'none' }}>
3252
- <style>{MASCOT_STYLES}</style>
3253
- <WorkerMascot taskStatus={taskStatus} smithStatus={smithStatus} seed={mascotSeed} accentColor={c.accent} theme={mascotTheme} />
3254
- <Handle type="target" position={Position.Left} style={{ background: c.accent, width: 8, height: 8, border: 'none' }} />
3255
- <Handle type="source" position={Position.Right} style={{ background: c.accent, width: 8, height: 8, border: 'none' }} />
3256
-
3257
- {/* Primary badge */}
3258
- {config.primary && <div className="bg-[#f0883e]/20 text-[#f0883e] text-[7px] font-bold text-center py-0.5 rounded-t-lg">PRIMARY</div>}
3259
-
3260
- {/* Header */}
3261
- <div className="flex items-center gap-2 px-3 py-2">
3262
- <span className="text-sm">{config.icon}</span>
3263
- <div className="flex-1 min-w-0">
3264
- <div className="text-xs font-semibold text-white truncate">{config.label}</div>
3265
- <div className="text-[8px]" style={{ color: c.accent }}>{config.backend === 'api' ? config.provider || 'api' : config.agentId || 'cli'}</div>
3266
- </div>
3267
- {/* Status: smith + terminal + task */}
3268
- <div className="flex flex-col items-end gap-0.5">
3269
- <div className="flex items-center gap-1">
3270
- <div className="w-1.5 h-1.5 rounded-full" style={{ background: smithInfo.color, boxShadow: smithInfo.glow ? `0 0 4px ${smithInfo.color}` : 'none' }} />
3271
- <span className="text-[7px]" style={{ color: smithInfo.color }}>{smithInfo.label}</span>
3272
- </div>
3273
- <div className="flex items-center gap-1">
3274
- {(() => {
3275
- // Execution mode is determined by config, not tmux state
3276
- const isTerminalMode = config.persistentSession;
3277
- const isActive = smithStatus === 'active';
3278
- const color = isTerminalMode
3279
- ? (hasTmux ? '#3fb950' : '#f0883e') // terminal: green (up) / orange (down)
3280
- : (isActive ? '#58a6ff' : '#484f58'); // headless: blue (active) / gray (down)
3281
- const label = isTerminalMode
3282
- ? (hasTmux ? 'terminal' : 'terminal (down)')
3283
- : (isActive ? 'headless' : 'headless (down)');
3284
- return (<>
3285
- <div className="w-1.5 h-1.5 rounded-full" style={{ background: color }} />
3286
- <span className="text-[7px] font-medium" style={{ color }}>{label}</span>
3287
- </>);
3288
- })()}
3289
- </div>
3290
- <div className="flex items-center gap-1">
3291
- <div className="w-1.5 h-1.5 rounded-full" style={{ background: taskInfo.color, boxShadow: taskInfo.glow ? `0 0 4px ${taskInfo.color}` : 'none' }} />
3292
- <span className="text-[7px]" style={{ color: taskInfo.color }}>{taskInfo.label}</span>
3293
- </div>
3294
- {config.watch?.enabled && (
3295
- <div className="flex items-center gap-1">
3296
- <span className="text-[7px]" style={{ color: (state as any)?.lastWatchAlert ? '#f0883e' : '#6e7681' }}>
3297
- {(state as any)?.lastWatchAlert ? '👁 alert' : '👁 watching'}
3298
- </span>
3299
- </div>
3300
- )}
3301
- </div>
3302
- </div>
3303
-
3304
- {/* Current step */}
3305
- {step && taskStatus === 'running' && (
3306
- <div className="px-3 pb-1 text-[8px] text-yellow-400/80" style={{ borderTop: `1px solid ${c.border}15` }}>
3307
- Step {(currentStep || 0) + 1}/{config.steps.length}: {step.label}
3308
- </div>
3309
- )}
3310
-
3311
- {/* Error */}
3312
- {state?.error && (
3313
- <div className="px-3 pb-1 text-[8px] text-red-400 truncate" style={{ borderTop: `1px solid ${c.border}15` }}>
3314
- {state.error}
3315
- </div>
3316
- )}
3317
-
3318
- {/* Preview lines */}
3319
- {previewLines.length > 0 && (
3320
- <div className="px-3 pb-2 space-y-0.5 cursor-pointer" style={{ borderTop: `1px solid ${c.border}15` }}
3321
- onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); onShowLog(); }}>
3322
- {previewLines.map((line, i) => (
3323
- <div key={i} className="text-[8px] text-gray-500 font-mono truncate">{line}</div>
3324
- ))}
3325
- </div>
3326
- )}
3327
-
3328
- {/* Inbox — prominent, shows pending/failed counts */}
3329
- {(inboxPending > 0 || inboxFailed > 0) && (
3330
- <div className="px-2 py-1" style={{ borderTop: `1px solid ${c.border}15` }}>
3331
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); onShowInbox(); }}
3332
- className="w-full text-[9px] px-2 py-1 rounded flex items-center justify-center gap-1.5 bg-orange-600/15 text-orange-400 hover:bg-orange-600/25 border border-orange-600/30">
3333
- 📨 Inbox
3334
- {inboxPending > 0 && <span className="px-1 rounded-full bg-yellow-600/30 text-yellow-400 text-[8px]">{inboxPending} pending</span>}
3335
- {inboxFailed > 0 && <span className="px-1 rounded-full bg-red-600/30 text-red-400 text-[8px]">{inboxFailed} failed</span>}
3336
- </button>
3337
- </div>
3338
- )}
3339
-
3340
- {/* Actions */}
3341
- <div className="flex items-center gap-1 px-2 py-1.5" style={{ borderTop: `1px solid ${c.border}15` }}>
3342
- {taskStatus === 'running' && (
3343
- <>
3344
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); data.onMarkIdle?.(); }}
3345
- className="text-[9px] px-1 py-0.5 rounded bg-gray-600/20 text-gray-400 hover:bg-gray-600/30" title="Silent stop — no notifications">■</button>
3346
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); data.onMarkDone?.(true); }}
3347
- className="text-[9px] px-1 py-0.5 rounded bg-green-600/20 text-green-400 hover:bg-green-600/30" title="Mark done + notify">✓</button>
3348
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); data.onMarkFailed?.(true); }}
3349
- className="text-[9px] px-1 py-0.5 rounded bg-red-600/20 text-red-400 hover:bg-red-600/30" title="Mark failed + notify">✕</button>
3350
- </>
3351
- )}
3352
- {/* Message button — send instructions to agent */}
3353
- {smithStatus === 'active' && taskStatus !== 'running' && (
3354
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); onMessage(); }}
3355
- className="text-[9px] px-1.5 py-0.5 rounded bg-blue-600/20 text-blue-400 hover:bg-blue-600/30">💬 Message</button>
3356
- )}
3357
- <div className="flex-1" />
3358
- <span className="flex items-center">
3359
- <button onPointerDown={e => e.stopPropagation()}
3360
- onClick={e => { e.stopPropagation(); if (smithStatus === 'active') onOpenTerminal(); }}
3361
- disabled={smithStatus !== 'active'}
3362
- className={`text-[9px] px-1 ${smithStatus !== 'active' ? 'text-gray-700 cursor-not-allowed' : hasTmux && taskStatus === 'running' ? 'text-green-400 animate-pulse' : 'text-gray-600 hover:text-green-400'}`}
3363
- title={smithStatus === 'starting' ? 'Starting session…' : smithStatus === 'down' ? 'Smith not started' : 'Open terminal'}>⌨️</button>
3364
- {hasTmux && !config.primary && (
3365
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); onSwitchSession(); }}
3366
- className="text-[10px] text-gray-600 hover:text-yellow-400 px-0.5 py-0.5" title="Switch session">▾</button>
3367
- )}
3368
- </span>
3369
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); onShowInbox(); }}
3370
- className="text-[9px] text-gray-600 hover:text-orange-400 px-1" title="Messages (inbox/outbox)">📨</button>
3371
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); onShowMemory(); }}
3372
- className="text-[9px] text-gray-600 hover:text-purple-400 px-1" title="Memory">🧠</button>
3373
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); onShowLog(); }}
3374
- className="text-[9px] text-gray-600 hover:text-gray-300 px-1" title="Logs">📋</button>
3375
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); onSaveAsTemplate(); }}
3376
- className="text-[9px] text-gray-600 hover:text-yellow-400 px-1" title="Save as template">💾</button>
3377
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); onEdit(); }}
3378
- className="text-[9px] text-gray-600 hover:text-blue-400 px-1">✏️</button>
3379
- <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); onRemove(); }}
3380
- className="text-[9px] text-gray-600 hover:text-red-400 px-1">✕</button>
3381
- </div>
3382
- </div>
3383
- );
3384
- }
3385
-
3386
- const nodeTypes = { agent: AgentFlowNode, input: InputFlowNode };
3387
-
3388
- // ─── Main Workspace ──────────────────────────────────────
3389
-
3390
- export interface WorkspaceViewHandle {
3391
- focusAgent: (agentId: string) => void;
3392
- }
3393
-
3394
- function WorkspaceViewInner({ projectPath, projectName, onClose }: {
3395
- projectPath: string;
3396
- projectName: string;
3397
- onClose: () => void;
3398
- }, ref: React.Ref<WorkspaceViewHandle>) {
3399
- const reactFlow = useReactFlow();
3400
- const [workspaceId, setWorkspaceId] = useState<string | null>(null);
3401
- const [rfNodes, setRfNodes] = useState<Node<any>[]>([]);
3402
- const [modal, setModal] = useState<{ mode: 'add' | 'edit'; initial: Partial<AgentConfig>; editId?: string } | null>(null);
3403
- const [messageTarget, setMessageTarget] = useState<{ id: string; label: string } | null>(null);
3404
- const [logTarget, setLogTarget] = useState<{ id: string; label: string } | null>(null);
3405
- const [runPromptTarget, setRunPromptTarget] = useState<{ id: string; label: string } | null>(null);
3406
- const [userInputRequest, setUserInputRequest] = useState<{ agentId: string; fromAgent: string; question: string } | null>(null);
3407
- const [memoryTarget, setMemoryTarget] = useState<{ id: string; label: string } | null>(null);
3408
- const [inboxTarget, setInboxTarget] = useState<{ id: string; label: string } | null>(null);
3409
- const [showBusPanel, setShowBusPanel] = useState(false);
3410
- const [mascotTheme, setMascotTheme] = useState<MascotTheme>(() => {
3411
- if (typeof window === 'undefined') return 'off';
3412
- return (localStorage.getItem('forge.mascotTheme') as MascotTheme) || 'off';
3413
- });
3414
- const updateMascotTheme = (t: MascotTheme) => {
3415
- setMascotTheme(t);
3416
- if (typeof window !== 'undefined') localStorage.setItem('forge.mascotTheme', t);
3417
- };
3418
- const [floatingTerminals, setFloatingTerminals] = useState<{ agentId: string; label: string; icon: string; cliId: string; cliCmd?: string; cliType?: string; workDir?: string; tmuxSession?: string; sessionName: string; resumeMode?: boolean; resumeSessionId?: string; profileEnv?: Record<string, string>; isPrimary?: boolean; skipPermissions?: boolean; persistentSession?: boolean; boundSessionId?: string; initialPos?: { x: number; y: number } }[]>([]);
3419
- const [termPicker, setTermPicker] = useState<{ agent: AgentConfig; sessName: string; workDir?: string; supportsSession?: boolean; currentSessionId: string | null; initialPos?: { x: number; y: number } } | null>(null);
3420
-
3421
- // Expose focusAgent to parent
3422
- useImperativeHandle(ref, () => ({
3423
- focusAgent(agentId: string) {
3424
- const node = rfNodes.find(n => n.id === agentId);
3425
- if (node && node.measured?.width) {
3426
- reactFlow.setCenter(
3427
- node.position.x + (node.measured.width / 2),
3428
- node.position.y + ((node.measured.height || 100) / 2),
3429
- { zoom: 1.2, duration: 400 }
3430
- );
3431
- // Flash highlight via selection
3432
- reactFlow.setNodes(nodes => nodes.map(n => ({ ...n, selected: n.id === agentId })));
3433
- setTimeout(() => {
3434
- reactFlow.setNodes(nodes => nodes.map(n => ({ ...n, selected: false })));
3435
- }, 1500);
3436
- }
3437
- },
3438
- }), [rfNodes, reactFlow]);
3439
-
3440
- // Initialize workspace
3441
- useEffect(() => {
3442
- ensureWorkspace(projectPath, projectName).then(setWorkspaceId).catch(() => {});
3443
- }, [projectPath, projectName]);
3444
-
3445
- // SSE stream — server is the single source of truth
3446
- const { agents, states, logPreview, busLog, daemonActive: daemonActiveFromStream, setDaemonActive: setDaemonActiveFromStream } = useWorkspaceStream(workspaceId, (event) => {
3447
- if (event.type === 'user_input_request') {
3448
- setUserInputRequest(event);
3449
- }
3450
- });
3451
-
3452
- // Auto-open terminals removed — persistent sessions run in background tmux.
3453
- // User opens terminal via ⌨️ button when needed.
3454
-
3455
- // Rebuild nodes when agents/states/preview change — preserve existing positions + dimensions
3456
- useEffect(() => {
3457
- setRfNodes(prev => {
3458
- const prevMap = new Map(prev.map(n => [n.id, n]));
3459
- return agents.map((agent, i) => {
3460
- const existing = prevMap.get(agent.id);
3461
- const base = {
3462
- id: agent.id,
3463
- position: existing?.position ?? { x: i * 260, y: 60 },
3464
- ...(existing?.measured ? { measured: existing.measured } : {}),
3465
- ...(existing?.width ? { width: existing.width, height: existing.height } : {}),
3466
- };
3467
-
3468
- // Input node
3469
- if (agent.type === 'input') {
3470
- return {
3471
- ...base,
3472
- type: 'input' as const,
3473
- data: {
3474
- config: agent,
3475
- state: states[agent.id] || { smithStatus: 'down', taskStatus: 'idle', artifacts: [] },
3476
- onSubmit: (content: string) => {
3477
- // Optimistic update
3478
- wsApi(workspaceId!, 'complete_input', { agentId: agent.id, content });
3479
- },
3480
- onEdit: () => setModal({ mode: 'edit', initial: agent, editId: agent.id }),
3481
- onRemove: () => {
3482
- if (!confirm(`Remove "${agent.label}"?`)) return;
3483
- wsApi(workspaceId!, 'remove', { agentId: agent.id });
3484
- },
3485
- } satisfies InputNodeData,
3486
- };
3487
- }
3488
-
3489
- // Agent node
3490
- return {
3491
- ...base,
3492
- type: 'agent' as const,
3493
- data: {
3494
- config: agent,
3495
- state: states[agent.id] || { smithStatus: 'down', taskStatus: 'idle', artifacts: [] },
3496
- colorIdx: i,
3497
- previewLines: logPreview[agent.id] || [],
3498
- projectPath,
3499
- workspaceId,
3500
- onRun: () => {
3501
- wsApi(workspaceId!, 'run', { agentId: agent.id });
3502
- },
3503
- onPause: () => wsApi(workspaceId!, 'pause', { agentId: agent.id }),
3504
- onStop: () => wsApi(workspaceId!, 'stop', { agentId: agent.id }),
3505
- mascotTheme,
3506
- onMarkIdle: () => wsApi(workspaceId!, 'mark_done', { agentId: agent.id, notify: false }),
3507
- onMarkDone: (notify: boolean) => wsApi(workspaceId!, 'mark_done', { agentId: agent.id, notify }),
3508
- onMarkFailed: (notify: boolean) => wsApi(workspaceId!, 'mark_failed', { agentId: agent.id, notify }),
3509
- onRetry: () => wsApi(workspaceId!, 'retry', { agentId: agent.id }),
3510
- onEdit: () => setModal({ mode: 'edit', initial: agent, editId: agent.id }),
3511
- onRemove: () => {
3512
- if (!confirm(`Remove "${agent.label}"?`)) return;
3513
- wsApi(workspaceId!, 'remove', { agentId: agent.id });
3514
- },
3515
- onMessage: () => setMessageTarget({ id: agent.id, label: agent.label }),
3516
- onApprove: () => wsApi(workspaceId!, 'approve', { agentId: agent.id }),
3517
- onShowLog: () => setLogTarget({ id: agent.id, label: agent.label }),
3518
- onShowMemory: () => setMemoryTarget({ id: agent.id, label: agent.label }),
3519
- onShowInbox: () => setInboxTarget({ id: agent.id, label: agent.label }),
3520
- inboxPending: busLog.filter(m => m.to === agent.id && (m.status === 'pending' || m.status === 'pending_approval') && m.type !== 'ack').length,
3521
- inboxFailed: busLog.filter(m => m.to === agent.id && m.status === 'failed' && m.type !== 'ack').length,
3522
- onOpenTerminal: async () => {
3523
- if (!workspaceId) return;
3524
- // Sync stale daemonActiveFromStream from agent states
3525
- const anyActive = Object.values(states).some(s => s?.smithStatus === 'active');
3526
- if (anyActive && !daemonActiveFromStream) setDaemonActiveFromStream(true);
3527
- // Close existing terminal (config may have changed)
3528
- setFloatingTerminals(prev => prev.filter(t => t.agentId !== agent.id));
3529
-
3530
- const nodeEl = document.querySelector(`[data-id="${agent.id}"]`);
3531
- const nodeRect = nodeEl?.getBoundingClientRect();
3532
- const initialPos = nodeRect ? { x: nodeRect.left, y: nodeRect.bottom + 4 } : { x: 80, y: 60 };
3533
- const safeName = (s: string) => s.toLowerCase().replace(/[^a-z0-9]/g, '-').replace(/-+/g, '-').slice(0, 20);
3534
- const sessName = `mw-forge-${safeName(projectName)}-${safeName(agent.label)}`;
3535
- const workDir = agent.workDir && agent.workDir !== './' && agent.workDir !== '.' ? agent.workDir : undefined;
3536
- // All agents: show picker (current session / new session / other sessions)
3537
- const resolveRes = await wsApi(workspaceId, 'open_terminal', { agentId: agent.id, resolveOnly: true }).catch(() => ({})) as any;
3538
- const currentSessionId = resolveRes?.currentSessionId ?? null;
3539
- setTermPicker({ agent, sessName, workDir, supportsSession: resolveRes?.supportsSession ?? true, currentSessionId, initialPos });
3540
- },
3541
- onSaveAsTemplate: async () => {
3542
- const name = prompt('Template name:', agent.label);
3543
- if (!name) return;
3544
- const desc = prompt('Description (optional):', '');
3545
- try {
3546
- await fetch('/api/smith-templates', {
3547
- method: 'POST',
3548
- headers: { 'Content-Type': 'application/json' },
3549
- body: JSON.stringify({ config: agent, name, icon: agent.icon, description: desc || '' }),
3550
- });
3551
- } catch {
3552
- alert('Failed to save template');
3553
- }
3554
- },
3555
- onSwitchSession: async () => {
3556
- if (!workspaceId) return;
3557
- setFloatingTerminals(prev => prev.filter(t => t.agentId !== agent.id));
3558
- if (agent.id) wsApi(workspaceId, 'close_terminal', { agentId: agent.id });
3559
- const nodeEl = document.querySelector(`[data-id="${agent.id}"]`);
3560
- const nodeRect = nodeEl?.getBoundingClientRect();
3561
- const initialPos = nodeRect ? { x: nodeRect.left, y: nodeRect.bottom + 4 } : { x: 80, y: 60 };
3562
- const safeName = (s: string) => s.toLowerCase().replace(/[^a-z0-9]/g, '-').replace(/-+/g, '-').slice(0, 20);
3563
- const sessName = `mw-forge-${safeName(projectName)}-${safeName(agent.label)}`;
3564
- const workDir = agent.workDir && agent.workDir !== './' && agent.workDir !== '.' ? agent.workDir : undefined;
3565
- const resolveRes = await wsApi(workspaceId, 'open_terminal', { agentId: agent.id, resolveOnly: true }).catch(() => ({})) as any;
3566
- const currentSessionId = resolveRes?.currentSessionId ?? null;
3567
- setTermPicker({ agent, sessName, workDir, supportsSession: resolveRes?.supportsSession ?? true, currentSessionId, initialPos });
3568
- },
3569
- } satisfies AgentNodeData,
3570
- };
3571
- });
3572
- });
3573
- }, [agents, states, logPreview, workspaceId, mascotTheme]); // eslint-disable-line react-hooks/exhaustive-deps
3574
-
3575
- // Derive edges from dependsOn
3576
- const rfEdges = useMemo(() => {
3577
- const edges: any[] = [];
3578
- for (const agent of agents) {
3579
- for (const depId of agent.dependsOn) {
3580
- const depState = states[depId];
3581
- const targetState = states[agent.id];
3582
- const depTask = depState?.taskStatus || 'idle';
3583
- const targetTask = targetState?.taskStatus || 'idle';
3584
- const isFlowing = depTask === 'running' || targetTask === 'running';
3585
- const isCompleted = depTask === 'done';
3586
- const color = isFlowing ? '#58a6ff70' : isCompleted ? '#58a6ff40' : '#30363d60';
3587
-
3588
- // Find last bus message between these two agents
3589
- const lastMsg = [...busLog].reverse().find(m =>
3590
- (m.from === depId && m.to === agent.id) || (m.from === agent.id && m.to === depId)
3591
- );
3592
- const edgeLabel = lastMsg?.payload?.action && lastMsg.payload.action !== 'task_complete' && lastMsg.payload.action !== 'ack'
3593
- ? `${lastMsg.payload.action}${lastMsg.payload.content ? ': ' + lastMsg.payload.content.slice(0, 30) : ''}`
3594
- : undefined;
3595
-
3596
- edges.push({
3597
- id: `${depId}-${agent.id}`,
3598
- source: depId,
3599
- target: agent.id,
3600
- animated: isFlowing,
3601
- label: edgeLabel,
3602
- labelStyle: { fill: '#8b949e', fontSize: 8 },
3603
- labelBgStyle: { fill: '#0d1117', fillOpacity: 0.8 },
3604
- labelBgPadding: [4, 2] as [number, number],
3605
- style: { stroke: color, strokeWidth: isFlowing ? 2 : isCompleted ? 1.5 : 1 },
3606
- markerEnd: { type: MarkerType.ArrowClosed, color },
3607
- });
3608
- }
3609
- }
3610
- return edges;
3611
- }, [agents, states]);
3612
-
3613
- // Let ReactFlow manage all node changes (position, dimensions, selection, etc.)
3614
- const onNodesChange = useCallback((changes: NodeChange[]) => {
3615
- setRfNodes(prev => applyNodeChanges(changes, prev) as Node<AgentNodeData>[]);
3616
- }, []);
3617
-
3618
- const handleAddAgent = async (cfg: Omit<AgentConfig, 'id'>) => {
3619
- if (!workspaceId) return;
3620
- const config: AgentConfig = { ...cfg, id: `${cfg.label.toLowerCase().replace(/\s+/g, '-')}-${Date.now()}` };
3621
- // Auto-install base plugins if not already installed (for preset templates)
3622
- // User-selected instances are already installed, so this is a no-op for them
3623
- if (cfg.plugins?.length) {
3624
- await Promise.all(cfg.plugins.map(pluginId =>
3625
- fetch('/api/plugins', {
3626
- method: 'POST',
3627
- headers: { 'Content-Type': 'application/json' },
3628
- body: JSON.stringify({ action: 'install', id: pluginId, config: {} }),
3629
- }).catch(() => {})
3630
- ));
3631
- }
3632
- // Optimistic update — show immediately
3633
- setModal(null);
3634
- await wsApi(workspaceId, 'add', { config });
3635
- };
3636
-
3637
- const handleEditAgent = async (cfg: Omit<AgentConfig, 'id'>) => {
3638
- if (!workspaceId || !modal?.editId) return;
3639
- const config: AgentConfig = { ...cfg, id: modal.editId };
3640
- // Optimistic update
3641
- setModal(null);
3642
- await wsApi(workspaceId, 'update', { agentId: modal.editId, config });
3643
- };
3644
-
3645
- const handleAddInput = async () => {
3646
- if (!workspaceId) return;
3647
- const config: AgentConfig = {
3648
- id: `input-${Date.now()}`, label: 'Requirements', icon: '📝',
3649
- type: 'input', content: '', entries: [], role: '', backend: 'cli',
3650
- dependsOn: [], outputs: [], steps: [],
3651
- };
3652
- await wsApi(workspaceId, 'add', { config });
3653
- };
3654
-
3655
- const handleCreatePipeline = async () => {
3656
- if (!workspaceId) return;
3657
- // Create pipeline via API — server uses presets with full prompts
3658
- const res = await fetch(`/api/workspace/${workspaceId}/agents`, {
3659
- method: 'POST',
3660
- headers: { 'Content-Type': 'application/json' },
3661
- body: JSON.stringify({ action: 'create_pipeline' }),
3662
- });
3663
- const data = await res.json();
3664
- if (!res.ok && data.error) alert(`Error: ${data.error}`);
3665
- };
3666
-
3667
- const handleExportTemplate = async () => {
3668
- if (!workspaceId) return;
3669
- try {
3670
- const res = await fetch(`/api/workspace?export=${workspaceId}`);
3671
- const template = await res.json();
3672
- // Download as JSON file
3673
- const blob = new Blob([JSON.stringify(template, null, 2)], { type: 'application/json' });
3674
- const url = URL.createObjectURL(blob);
3675
- const a = document.createElement('a');
3676
- a.href = url;
3677
- a.download = `workspace-template-${projectName.replace(/\s+/g, '-')}.json`;
3678
- a.click();
3679
- URL.revokeObjectURL(url);
3680
- } catch {
3681
- alert('Export failed');
3682
- }
3683
- };
3684
-
3685
- const handleImportTemplate = async (file: File) => {
3686
- if (!workspaceId) return;
3687
- try {
3688
- const text = await file.text();
3689
- const template = JSON.parse(text);
3690
- await fetch('/api/workspace', {
3691
- method: 'POST',
3692
- headers: { 'Content-Type': 'application/json' },
3693
- body: JSON.stringify({ projectPath, projectName, template }),
3694
- });
3695
- // Reload page to pick up new workspace
3696
- window.location.reload();
3697
- } catch {
3698
- alert('Import failed — invalid template file');
3699
- }
3700
- };
3701
-
3702
- const handleRunAll = () => { if (workspaceId) wsApi(workspaceId, 'run_all'); };
3703
- const handleStartDaemon = async () => {
3704
- if (!workspaceId) return;
3705
- const result = await wsApi(workspaceId, 'start_daemon');
3706
- if (result.ok) setDaemonActiveFromStream(true);
3707
- };
3708
- const handleStopDaemon = async () => {
3709
- if (!workspaceId) return;
3710
- const result = await wsApi(workspaceId, 'stop_daemon');
3711
- if (result.ok) setDaemonActiveFromStream(false);
3712
- };
3713
-
3714
- return (
3715
- <div className="flex-1 flex flex-col min-h-0" style={{ background: '#080810' }}>
3716
- {/* Header */}
3717
- <div className="flex items-center gap-2 px-3 py-1.5 border-b border-[#2a2a3a] shrink-0">
3718
- <button onClick={onClose} className="text-gray-400 hover:text-white text-sm">←</button>
3719
- <span className="text-xs font-bold text-white">Workspace</span>
3720
- <span className="text-[9px] text-gray-500">{projectName}</span>
3721
- {agents.length > 0 && !daemonActiveFromStream && (
3722
- <>
3723
- <button onClick={handleRunAll}
3724
- className="text-[8px] px-2 py-0.5 rounded bg-green-600/20 text-green-400 hover:bg-green-600/30 ml-2">
3725
- ▶ Run All
3726
- </button>
3727
- <button onClick={handleStartDaemon}
3728
- className="text-[8px] px-2 py-0.5 rounded bg-emerald-600/20 text-emerald-400 hover:bg-emerald-600/30">
3729
- ⚡ Start Daemon
3730
- </button>
3731
- </>
3732
- )}
3733
- {daemonActiveFromStream && (
3734
- <>
3735
- <span className="text-[8px] px-2 py-0.5 rounded bg-green-600/30 text-green-400 ml-2 animate-pulse">
3736
- ● Daemon Active
3737
- </span>
3738
- <button onClick={handleStopDaemon}
3739
- className="text-[8px] px-2 py-0.5 rounded bg-red-600/20 text-red-400 hover:bg-red-600/30">
3740
- ■ Stop
3741
- </button>
3742
- </>
3743
- )}
3744
- <div className="ml-auto flex items-center gap-2">
3745
- <select value={mascotTheme} onChange={e => updateMascotTheme(e.target.value as MascotTheme)}
3746
- className="text-[8px] px-1.5 py-0.5 rounded border border-[#30363d] bg-[#0d1117] text-gray-500 hover:text-white hover:border-[#58a6ff]/60 cursor-pointer focus:outline-none"
3747
- title="Mascot theme">
3748
- <option value="stick">🏃 Stick</option>
3749
- <option value="cat">🐱 Cat</option>
3750
- <option value="dog">🐶 Dog</option>
3751
- <option value="pig">🐷 Pig</option>
3752
- <option value="emoji">🎭 Emoji</option>
3753
- <option value="off">⊘ Off</option>
3754
- </select>
3755
- <button onClick={() => setShowBusPanel(true)}
3756
- className={`text-[8px] px-2 py-0.5 rounded border border-[#30363d] hover:border-[#58a6ff]/60 ${busLog.length > 0 ? 'text-[#58a6ff]' : 'text-gray-500'}`}>
3757
- 📡 Logs{busLog.length > 0 ? ` (${busLog.length})` : ''}
3758
- </button>
3759
- {agents.length > 0 && (
3760
- <button onClick={handleExportTemplate}
3761
- className="text-[8px] px-2 py-0.5 rounded border border-[#30363d] text-gray-500 hover:text-white hover:border-[#58a6ff]/60">
3762
- 📤 Export
3763
- </button>
3764
- )}
3765
- <button onClick={handleAddInput}
3766
- className="text-[8px] px-2 py-0.5 rounded border border-[#30363d] text-gray-400 hover:text-white hover:border-[#58a6ff]/60">
3767
- 📝 + Input
3768
- </button>
3769
- <button onClick={() => setModal({ mode: 'add', initial: {} })}
3770
- className="text-[8px] px-2 py-0.5 rounded border border-[#30363d] text-gray-400 hover:text-white hover:border-[#58a6ff]/60">
3771
- + Add Agent
3772
- </button>
3773
- </div>
3774
- </div>
3775
-
3776
- {/* Graph area */}
3777
- {agents.length === 0 ? (
3778
- <div className="flex-1 flex flex-col items-center justify-center gap-3">
3779
- <span className="text-3xl">🚀</span>
3780
- <div className="text-sm text-gray-400">Set up your workspace</div>
3781
- {/* Primary agent prompt */}
3782
- <button onClick={() => setModal({ mode: 'add', initial: {
3783
- label: 'Engineer', icon: '👨‍💻', primary: true, persistentSession: true,
3784
- role: 'Primary engineer — handles coding tasks in the project root.',
3785
- backend: 'cli' as const, agentId: 'claude', workDir: './', dependsOn: [], outputs: [], steps: [],
3786
- }})}
3787
- className="flex items-center gap-3 px-5 py-3 rounded-lg border-2 border-dashed border-[#f0883e]/50 bg-[#f0883e]/5 hover:bg-[#f0883e]/10 hover:border-[#f0883e]/80 transition-colors">
3788
- <span className="text-2xl">👨‍💻</span>
3789
- <div className="text-left">
3790
- <div className="text-[11px] font-semibold text-[#f0883e]">Add Primary Agent</div>
3791
- <div className="text-[9px] text-gray-500">Terminal-only, root directory, fixed session</div>
3792
- </div>
3793
- </button>
3794
- <div className="text-[9px] text-gray-600 mt-1">or add other agents:</div>
3795
- <div className="flex gap-2 flex-wrap justify-center">
3796
- {PRESET_AGENTS.map((p, i) => (
3797
- <button key={i} onClick={() => setModal({ mode: 'add', initial: p })}
3798
- className="text-[10px] px-3 py-1.5 rounded border border-[#30363d] text-gray-300 hover:text-white hover:border-[#58a6ff]/60 flex items-center gap-1">
3799
- {p.icon} {p.label}
3800
- </button>
3801
- ))}
3802
- </div>
3803
- <div className="flex gap-2 mt-1">
3804
- <button onClick={() => setModal({ mode: 'add', initial: {} })}
3805
- className="text-[10px] px-3 py-1.5 rounded border border-dashed border-[#30363d] text-gray-500 hover:text-white hover:border-[#58a6ff]/60">
3806
- ⚙️ Custom
3807
- </button>
3808
- <button onClick={handleCreatePipeline}
3809
- className="text-[10px] px-3 py-1.5 rounded border border-[#238636] text-[#3fb950] hover:bg-[#238636]/20">
3810
- 🚀 Dev Pipeline
3811
- </button>
3812
- <label className="text-[10px] px-3 py-1.5 rounded border border-dashed border-[#30363d] text-gray-500 hover:text-white hover:border-[#58a6ff]/60 cursor-pointer">
3813
- 📥 Import
3814
- <input type="file" accept=".json" className="hidden" onChange={e => {
3815
- const file = e.target.files?.[0];
3816
- if (file) handleImportTemplate(file);
3817
- e.target.value = '';
3818
- }} />
3819
- </label>
3820
- </div>
3821
- </div>
3822
- ) : (
3823
- <div className="flex-1 min-h-0 flex flex-col">
3824
- {/* No primary agent hint */}
3825
- {!agents.some(a => a.primary) && (
3826
- <div className="flex items-center gap-2 px-3 py-1.5 bg-[#f0883e]/10 border-b border-[#f0883e]/20 shrink-0">
3827
- <span className="text-[10px] text-[#f0883e]">No primary agent set.</span>
3828
- <button onClick={() => setModal({ mode: 'add', initial: {
3829
- label: 'Engineer', icon: '👨‍💻', primary: true, persistentSession: true,
3830
- role: 'Primary engineer — handles coding tasks in the project root.',
3831
- backend: 'cli' as const, agentId: 'claude', workDir: './', dependsOn: [], outputs: [], steps: [],
3832
- }})}
3833
- className="text-[10px] text-[#f0883e] underline hover:text-white">Add one</button>
3834
- <span className="text-[9px] text-gray-600">or edit an existing agent to set as primary.</span>
3835
- </div>
3836
- )}
3837
- <ReactFlow
3838
- nodes={rfNodes}
3839
- edges={rfEdges}
3840
- onNodesChange={onNodesChange}
3841
- onNodeDragStop={() => {
3842
- // Reposition terminals to follow their nodes
3843
- setFloatingTerminals(prev => prev.map(ft => {
3844
- const nodeEl = document.querySelector(`[data-id="${ft.agentId}"]`);
3845
- const rect = nodeEl?.getBoundingClientRect();
3846
- return rect ? { ...ft, initialPos: { x: rect.left, y: rect.bottom + 4 } } : ft;
3847
- }));
3848
- }}
3849
- onMoveEnd={() => {
3850
- // Reposition after pan/zoom
3851
- setFloatingTerminals(prev => prev.map(ft => {
3852
- const nodeEl = document.querySelector(`[data-id="${ft.agentId}"]`);
3853
- const rect = nodeEl?.getBoundingClientRect();
3854
- return rect ? { ...ft, initialPos: { x: rect.left, y: rect.bottom + 4 } } : ft;
3855
- }));
3856
- }}
3857
- nodeTypes={nodeTypes}
3858
- fitView
3859
- fitViewOptions={{ padding: 0.3 }}
3860
- minZoom={0.3}
3861
- maxZoom={2}
3862
- proOptions={{ hideAttribution: true }}
3863
- >
3864
- <Background color="#1a1a2e" gap={20} size={1} />
3865
- <Controls style={{ background: '#0d1117', border: '1px solid #30363d' }} showInteractive={false} />
3866
- </ReactFlow>
3867
- </div>
3868
- )}
3869
-
3870
- {/* Config modal */}
3871
- {modal && (
3872
- <AgentConfigModal
3873
- initial={modal.initial}
3874
- mode={modal.mode}
3875
- existingAgents={agents}
3876
- projectPath={projectPath}
3877
- onConfirm={modal.mode === 'add' ? handleAddAgent : handleEditAgent}
3878
- onCancel={() => setModal(null)}
3879
- />
3880
- )}
3881
-
3882
- {/* Run prompt dialog (for agents with no dependencies) */}
3883
- {runPromptTarget && workspaceId && (
3884
- <RunPromptDialog
3885
- agentLabel={runPromptTarget.label}
3886
- onRun={input => {
3887
- wsApi(workspaceId, 'run', { agentId: runPromptTarget.id, input: input || undefined });
3888
- setRunPromptTarget(null);
3889
- }}
3890
- onCancel={() => setRunPromptTarget(null)}
3891
- />
3892
- )}
3893
-
3894
- {/* Message dialog */}
3895
- {messageTarget && workspaceId && (
3896
- <MessageDialog
3897
- agentLabel={messageTarget.label}
3898
- onSend={msg => {
3899
- wsApi(workspaceId, 'message', { agentId: messageTarget.id, content: msg });
3900
- setMessageTarget(null);
3901
- }}
3902
- onCancel={() => setMessageTarget(null)}
3903
- />
3904
- )}
3905
-
3906
- {/* Log panel */}
3907
- {logTarget && workspaceId && (
3908
- <LogPanel
3909
- agentId={logTarget.id}
3910
- agentLabel={logTarget.label}
3911
- workspaceId={workspaceId}
3912
- onClose={() => setLogTarget(null)}
3913
- />
3914
- )}
3915
-
3916
- {/* Bus message panel */}
3917
- {showBusPanel && (
3918
- <BusPanel busLog={busLog} agents={agents} onClose={() => setShowBusPanel(false)} />
3919
- )}
3920
-
3921
- {/* Memory panel */}
3922
- {memoryTarget && workspaceId && (
3923
- <MemoryPanel
3924
- agentId={memoryTarget.id}
3925
- agentLabel={memoryTarget.label}
3926
- workspaceId={workspaceId}
3927
- onClose={() => setMemoryTarget(null)}
3928
- />
3929
- )}
3930
-
3931
- {/* Inbox panel */}
3932
- {inboxTarget && workspaceId && (
3933
- <InboxPanel
3934
- agentId={inboxTarget.id}
3935
- agentLabel={inboxTarget.label}
3936
- busLog={busLog}
3937
- agents={agents}
3938
- workspaceId={workspaceId}
3939
- onClose={() => setInboxTarget(null)}
3940
- />
3941
- )}
3942
-
3943
- {/* Terminal session picker */}
3944
- {termPicker && workspaceId && (
3945
- <TerminalSessionPickerLazy
3946
- agentLabel={termPicker.agent.label}
3947
- currentSessionId={termPicker.currentSessionId}
3948
- fetchSessions={() => fetchAgentSessions(workspaceId, termPicker.agent.id)}
3949
- supportsSession={termPicker.supportsSession}
3950
- onSelect={async (selection: PickerSelection) => {
3951
- const { agent, sessName, workDir } = termPicker;
3952
- const pickerInitialPos = termPicker.initialPos;
3953
- setTermPicker(null);
3954
-
3955
- let boundSessionId = agent.boundSessionId;
3956
- if (selection.mode === 'session') {
3957
- // Bind to a specific session
3958
- await wsApi(workspaceId, 'update', { agentId: agent.id, config: { ...agent, boundSessionId: selection.sessionId } }).catch(() => {});
3959
- boundSessionId = selection.sessionId;
3960
- } else if (selection.mode === 'new') {
3961
- // Clear bound session → fresh start
3962
- if (agent.boundSessionId) {
3963
- await wsApi(workspaceId, 'update', { agentId: agent.id, config: { ...agent, boundSessionId: undefined } }).catch(() => {});
3964
- }
3965
- boundSessionId = undefined;
3966
- }
3967
- // mode === 'current': keep existing boundSessionId
3968
-
3969
- // 'current': just attach — claude is running, don't interrupt.
3970
- // 'session' or 'new': forceRestart — rebuild launch script with correct --resume.
3971
- const forceRestart = selection.mode !== 'current';
3972
- const res = await wsApi(workspaceId, 'open_terminal', { agentId: agent.id, forceRestart }).catch(() => ({})) as any;
3973
- const tmux = res?.tmuxSession || sessName;
3974
- setFloatingTerminals(prev => [...prev, {
3975
- agentId: agent.id, label: agent.label, icon: agent.icon,
3976
- cliId: agent.agentId || 'claude', workDir,
3977
- tmuxSession: tmux, sessionName: sessName,
3978
- isPrimary: agent.primary, skipPermissions: agent.skipPermissions !== false,
3979
- persistentSession: agent.persistentSession, boundSessionId, initialPos: pickerInitialPos,
3980
- }]);
3981
- }}
3982
- onCancel={() => setTermPicker(null)}
3983
- />
3984
- )}
3985
-
3986
- {/* Floating terminals — positioned near their agent node */}
3987
- {floatingTerminals.map(ft => (
3988
- <FloatingTerminal
3989
- key={ft.agentId}
3990
- agentLabel={ft.label}
3991
- agentIcon={ft.icon}
3992
- projectPath={projectPath}
3993
- agentCliId={ft.cliId}
3994
- cliCmd={ft.cliCmd}
3995
- cliType={ft.cliType}
3996
- workDir={ft.workDir}
3997
- preferredSessionName={ft.sessionName}
3998
- existingSession={ft.tmuxSession}
3999
- resumeMode={ft.resumeMode}
4000
- resumeSessionId={ft.resumeSessionId}
4001
- profileEnv={ft.profileEnv}
4002
- isPrimary={ft.isPrimary}
4003
- skipPermissions={ft.skipPermissions}
4004
- persistentSession={ft.persistentSession}
4005
- boundSessionId={ft.boundSessionId}
4006
- initialPos={ft.initialPos}
4007
- onSessionReady={(name) => {
4008
- if (workspaceId) wsApi(workspaceId, 'set_tmux_session', { agentId: ft.agentId, sessionName: name });
4009
- setFloatingTerminals(prev => prev.map(t => t.agentId === ft.agentId ? { ...t, tmuxSession: name } : t));
4010
- }}
4011
- onClose={(killSession) => {
4012
- setFloatingTerminals(prev => prev.filter(t => t.agentId !== ft.agentId));
4013
- if (workspaceId) wsApi(workspaceId, 'close_terminal', { agentId: ft.agentId, kill: killSession });
4014
- }}
4015
- />
4016
- ))}
4017
-
4018
- {/* User input request from agent (via bus) */}
4019
- {userInputRequest && workspaceId && (
4020
- <RunPromptDialog
4021
- agentLabel={`${agents.find(a => a.id === userInputRequest.fromAgent)?.label || 'Agent'} asks`}
4022
- onRun={input => {
4023
- // Send response to the requesting agent's target (Input node)
4024
- wsApi(workspaceId, 'complete_input', {
4025
- agentId: userInputRequest.agentId,
4026
- content: input || userInputRequest.question,
4027
- });
4028
- setUserInputRequest(null);
4029
- }}
4030
- onCancel={() => setUserInputRequest(null)}
4031
- />
4032
- )}
4033
- </div>
4034
- );
4035
- }
4036
-
4037
- const WorkspaceViewWithRef = forwardRef(WorkspaceViewInner);
4038
-
4039
- // Wrap with ReactFlowProvider so useReactFlow works
4040
- export default forwardRef<WorkspaceViewHandle, { projectPath: string; projectName: string; onClose: () => void }>(
4041
- function WorkspaceView(props, ref) {
4042
- return (
4043
- <ReactFlowProvider>
4044
- <WorkspaceViewWithRef {...props} ref={ref} />
4045
- </ReactFlowProvider>
4046
- );
4047
- }
4048
- );