@aion0/forge 0.5.40 → 0.5.43

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 (2986) hide show
  1. package/.forge/mcp.json +1 -1
  2. package/CLAUDE.md +90 -42
  3. package/RELEASE_NOTES.md +6 -7
  4. package/app/api/git/route.ts +27 -9
  5. package/bin/forge-server.mjs +39 -0
  6. package/components/Dashboard.tsx +8 -1
  7. package/components/WorkspaceView.tsx +15 -2
  8. package/install.sh +40 -0
  9. package/lib/help-docs/11-workspace.md +2 -1
  10. package/lib/workspace/orchestrator.ts +80 -7
  11. package/lib/workspace/persistence.ts +16 -0
  12. package/lib/workspace/types.ts +13 -0
  13. package/lib/workspace/watch-manager.ts +65 -24
  14. package/lib/workspace-standalone.ts +5 -9
  15. package/package.json +1 -1
  16. package/start.sh +23 -0
  17. package/.forge/agent-context.json +0 -6
  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/worktrees/pipeline-0a33c50d/CLAUDE.md +0 -86
  22. package/.forge/worktrees/pipeline-0a33c50d/README.md +0 -136
  23. package/.forge/worktrees/pipeline-0a33c50d/RELEASE_NOTES.md +0 -11
  24. package/.forge/worktrees/pipeline-0a33c50d/app/api/agents/route.ts +0 -17
  25. package/.forge/worktrees/pipeline-0a33c50d/app/api/auth/[...nextauth]/route.ts +0 -3
  26. package/.forge/worktrees/pipeline-0a33c50d/app/api/auth/verify/route.ts +0 -46
  27. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude/[id]/route.ts +0 -31
  28. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude/[id]/stream/route.ts +0 -63
  29. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude/route.ts +0 -28
  30. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  31. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  32. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude-sessions/[projectName]/route.ts +0 -37
  33. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude-sessions/sync/route.ts +0 -17
  34. package/.forge/worktrees/pipeline-0a33c50d/app/api/claude-templates/route.ts +0 -145
  35. package/.forge/worktrees/pipeline-0a33c50d/app/api/code/route.ts +0 -299
  36. package/.forge/worktrees/pipeline-0a33c50d/app/api/delivery/[id]/route.ts +0 -62
  37. package/.forge/worktrees/pipeline-0a33c50d/app/api/delivery/route.ts +0 -40
  38. package/.forge/worktrees/pipeline-0a33c50d/app/api/detect-cli/route.ts +0 -46
  39. package/.forge/worktrees/pipeline-0a33c50d/app/api/docs/route.ts +0 -176
  40. package/.forge/worktrees/pipeline-0a33c50d/app/api/docs/sessions/route.ts +0 -54
  41. package/.forge/worktrees/pipeline-0a33c50d/app/api/favorites/route.ts +0 -26
  42. package/.forge/worktrees/pipeline-0a33c50d/app/api/flows/route.ts +0 -6
  43. package/.forge/worktrees/pipeline-0a33c50d/app/api/flows/run/route.ts +0 -19
  44. package/.forge/worktrees/pipeline-0a33c50d/app/api/git/route.ts +0 -149
  45. package/.forge/worktrees/pipeline-0a33c50d/app/api/help/route.ts +0 -84
  46. package/.forge/worktrees/pipeline-0a33c50d/app/api/issue-scanner/route.ts +0 -116
  47. package/.forge/worktrees/pipeline-0a33c50d/app/api/logs/route.ts +0 -100
  48. package/.forge/worktrees/pipeline-0a33c50d/app/api/mobile-chat/route.ts +0 -115
  49. package/.forge/worktrees/pipeline-0a33c50d/app/api/monitor/route.ts +0 -74
  50. package/.forge/worktrees/pipeline-0a33c50d/app/api/notifications/route.ts +0 -42
  51. package/.forge/worktrees/pipeline-0a33c50d/app/api/notify/test/route.ts +0 -33
  52. package/.forge/worktrees/pipeline-0a33c50d/app/api/online/route.ts +0 -40
  53. package/.forge/worktrees/pipeline-0a33c50d/app/api/pipelines/[id]/route.ts +0 -41
  54. package/.forge/worktrees/pipeline-0a33c50d/app/api/pipelines/route.ts +0 -90
  55. package/.forge/worktrees/pipeline-0a33c50d/app/api/plugins/route.ts +0 -75
  56. package/.forge/worktrees/pipeline-0a33c50d/app/api/preview/[...path]/route.ts +0 -64
  57. package/.forge/worktrees/pipeline-0a33c50d/app/api/preview/route.ts +0 -156
  58. package/.forge/worktrees/pipeline-0a33c50d/app/api/project-pipelines/route.ts +0 -91
  59. package/.forge/worktrees/pipeline-0a33c50d/app/api/project-sessions/route.ts +0 -61
  60. package/.forge/worktrees/pipeline-0a33c50d/app/api/projects/route.ts +0 -26
  61. package/.forge/worktrees/pipeline-0a33c50d/app/api/sessions/[id]/chat/route.ts +0 -64
  62. package/.forge/worktrees/pipeline-0a33c50d/app/api/sessions/[id]/messages/route.ts +0 -9
  63. package/.forge/worktrees/pipeline-0a33c50d/app/api/sessions/[id]/route.ts +0 -17
  64. package/.forge/worktrees/pipeline-0a33c50d/app/api/sessions/route.ts +0 -20
  65. package/.forge/worktrees/pipeline-0a33c50d/app/api/settings/route.ts +0 -64
  66. package/.forge/worktrees/pipeline-0a33c50d/app/api/skills/local/route.ts +0 -228
  67. package/.forge/worktrees/pipeline-0a33c50d/app/api/skills/route.ts +0 -182
  68. package/.forge/worktrees/pipeline-0a33c50d/app/api/smith-templates/route.ts +0 -81
  69. package/.forge/worktrees/pipeline-0a33c50d/app/api/status/route.ts +0 -12
  70. package/.forge/worktrees/pipeline-0a33c50d/app/api/tabs/route.ts +0 -25
  71. package/.forge/worktrees/pipeline-0a33c50d/app/api/tasks/[id]/route.ts +0 -51
  72. package/.forge/worktrees/pipeline-0a33c50d/app/api/tasks/[id]/stream/route.ts +0 -77
  73. package/.forge/worktrees/pipeline-0a33c50d/app/api/tasks/link/route.ts +0 -37
  74. package/.forge/worktrees/pipeline-0a33c50d/app/api/tasks/route.ts +0 -44
  75. package/.forge/worktrees/pipeline-0a33c50d/app/api/tasks/session/route.ts +0 -14
  76. package/.forge/worktrees/pipeline-0a33c50d/app/api/telegram/route.ts +0 -23
  77. package/.forge/worktrees/pipeline-0a33c50d/app/api/templates/route.ts +0 -6
  78. package/.forge/worktrees/pipeline-0a33c50d/app/api/terminal-bell/route.ts +0 -35
  79. package/.forge/worktrees/pipeline-0a33c50d/app/api/terminal-cwd/route.ts +0 -19
  80. package/.forge/worktrees/pipeline-0a33c50d/app/api/terminal-state/route.ts +0 -15
  81. package/.forge/worktrees/pipeline-0a33c50d/app/api/tunnel/route.ts +0 -26
  82. package/.forge/worktrees/pipeline-0a33c50d/app/api/upgrade/route.ts +0 -43
  83. package/.forge/worktrees/pipeline-0a33c50d/app/api/usage/route.ts +0 -20
  84. package/.forge/worktrees/pipeline-0a33c50d/app/api/version/route.ts +0 -78
  85. package/.forge/worktrees/pipeline-0a33c50d/app/api/watchers/route.ts +0 -33
  86. package/.forge/worktrees/pipeline-0a33c50d/app/api/workspace/[id]/agents/route.ts +0 -35
  87. package/.forge/worktrees/pipeline-0a33c50d/app/api/workspace/[id]/memory/route.ts +0 -23
  88. package/.forge/worktrees/pipeline-0a33c50d/app/api/workspace/[id]/smith/route.ts +0 -22
  89. package/.forge/worktrees/pipeline-0a33c50d/app/api/workspace/[id]/stream/route.ts +0 -28
  90. package/.forge/worktrees/pipeline-0a33c50d/app/api/workspace/route.ts +0 -100
  91. package/.forge/worktrees/pipeline-0a33c50d/app/global-error.tsx +0 -21
  92. package/.forge/worktrees/pipeline-0a33c50d/app/globals.css +0 -52
  93. package/.forge/worktrees/pipeline-0a33c50d/app/icon.ico +0 -0
  94. package/.forge/worktrees/pipeline-0a33c50d/app/icon.png +0 -0
  95. package/.forge/worktrees/pipeline-0a33c50d/app/icon.svg +0 -106
  96. package/.forge/worktrees/pipeline-0a33c50d/app/layout.tsx +0 -17
  97. package/.forge/worktrees/pipeline-0a33c50d/app/login/LoginForm.tsx +0 -96
  98. package/.forge/worktrees/pipeline-0a33c50d/app/login/page.tsx +0 -10
  99. package/.forge/worktrees/pipeline-0a33c50d/app/mobile/page.tsx +0 -9
  100. package/.forge/worktrees/pipeline-0a33c50d/app/page.tsx +0 -21
  101. package/.forge/worktrees/pipeline-0a33c50d/bin/forge-server.mjs +0 -484
  102. package/.forge/worktrees/pipeline-0a33c50d/check-forge-status.sh +0 -71
  103. package/.forge/worktrees/pipeline-0a33c50d/cli/mw.ts +0 -579
  104. package/.forge/worktrees/pipeline-0a33c50d/components/BrowserPanel.tsx +0 -175
  105. package/.forge/worktrees/pipeline-0a33c50d/components/ChatPanel.tsx +0 -191
  106. package/.forge/worktrees/pipeline-0a33c50d/components/ClaudeTerminal.tsx +0 -267
  107. package/.forge/worktrees/pipeline-0a33c50d/components/CodeViewer.tsx +0 -787
  108. package/.forge/worktrees/pipeline-0a33c50d/components/ConversationEditor.tsx +0 -411
  109. package/.forge/worktrees/pipeline-0a33c50d/components/ConversationGraphView.tsx +0 -347
  110. package/.forge/worktrees/pipeline-0a33c50d/components/ConversationTerminalView.tsx +0 -303
  111. package/.forge/worktrees/pipeline-0a33c50d/components/Dashboard.tsx +0 -807
  112. package/.forge/worktrees/pipeline-0a33c50d/components/DashboardWrapper.tsx +0 -9
  113. package/.forge/worktrees/pipeline-0a33c50d/components/DeliveryFlowEditor.tsx +0 -491
  114. package/.forge/worktrees/pipeline-0a33c50d/components/DeliveryList.tsx +0 -230
  115. package/.forge/worktrees/pipeline-0a33c50d/components/DeliveryWorkspace.tsx +0 -589
  116. package/.forge/worktrees/pipeline-0a33c50d/components/DocTerminal.tsx +0 -187
  117. package/.forge/worktrees/pipeline-0a33c50d/components/DocsViewer.tsx +0 -574
  118. package/.forge/worktrees/pipeline-0a33c50d/components/HelpDialog.tsx +0 -169
  119. package/.forge/worktrees/pipeline-0a33c50d/components/HelpTerminal.tsx +0 -141
  120. package/.forge/worktrees/pipeline-0a33c50d/components/InlinePipelineView.tsx +0 -111
  121. package/.forge/worktrees/pipeline-0a33c50d/components/LogViewer.tsx +0 -194
  122. package/.forge/worktrees/pipeline-0a33c50d/components/MarkdownContent.tsx +0 -73
  123. package/.forge/worktrees/pipeline-0a33c50d/components/MobileView.tsx +0 -385
  124. package/.forge/worktrees/pipeline-0a33c50d/components/MonitorPanel.tsx +0 -122
  125. package/.forge/worktrees/pipeline-0a33c50d/components/NewSessionModal.tsx +0 -93
  126. package/.forge/worktrees/pipeline-0a33c50d/components/NewTaskModal.tsx +0 -492
  127. package/.forge/worktrees/pipeline-0a33c50d/components/PipelineEditor.tsx +0 -570
  128. package/.forge/worktrees/pipeline-0a33c50d/components/PipelineView.tsx +0 -1018
  129. package/.forge/worktrees/pipeline-0a33c50d/components/PluginsPanel.tsx +0 -472
  130. package/.forge/worktrees/pipeline-0a33c50d/components/ProjectDetail.tsx +0 -1618
  131. package/.forge/worktrees/pipeline-0a33c50d/components/ProjectList.tsx +0 -108
  132. package/.forge/worktrees/pipeline-0a33c50d/components/ProjectManager.tsx +0 -401
  133. package/.forge/worktrees/pipeline-0a33c50d/components/SessionList.tsx +0 -74
  134. package/.forge/worktrees/pipeline-0a33c50d/components/SessionView.tsx +0 -726
  135. package/.forge/worktrees/pipeline-0a33c50d/components/SettingsModal.tsx +0 -1647
  136. package/.forge/worktrees/pipeline-0a33c50d/components/SkillsPanel.tsx +0 -969
  137. package/.forge/worktrees/pipeline-0a33c50d/components/StatusBar.tsx +0 -99
  138. package/.forge/worktrees/pipeline-0a33c50d/components/TabBar.tsx +0 -46
  139. package/.forge/worktrees/pipeline-0a33c50d/components/TaskBoard.tsx +0 -113
  140. package/.forge/worktrees/pipeline-0a33c50d/components/TaskDetail.tsx +0 -372
  141. package/.forge/worktrees/pipeline-0a33c50d/components/TerminalLauncher.tsx +0 -398
  142. package/.forge/worktrees/pipeline-0a33c50d/components/TunnelToggle.tsx +0 -206
  143. package/.forge/worktrees/pipeline-0a33c50d/components/UsagePanel.tsx +0 -207
  144. package/.forge/worktrees/pipeline-0a33c50d/components/WebTerminal.tsx +0 -1683
  145. package/.forge/worktrees/pipeline-0a33c50d/components/WorkspaceTree.tsx +0 -221
  146. package/.forge/worktrees/pipeline-0a33c50d/components/WorkspaceView.tsx +0 -4048
  147. package/.forge/worktrees/pipeline-0a33c50d/dev-test.sh +0 -5
  148. package/.forge/worktrees/pipeline-0a33c50d/docs/Forge_Memory_Layer_Design.docx +0 -0
  149. package/.forge/worktrees/pipeline-0a33c50d/docs/Forge_Strategy_Research_2026.docx +0 -0
  150. package/.forge/worktrees/pipeline-0a33c50d/docs/LOCAL-DEPLOY.md +0 -144
  151. package/.forge/worktrees/pipeline-0a33c50d/docs/roadmap-multi-agent-workflow.md +0 -330
  152. package/.forge/worktrees/pipeline-0a33c50d/forge-logo.png +0 -0
  153. package/.forge/worktrees/pipeline-0a33c50d/forge-logo.svg +0 -106
  154. package/.forge/worktrees/pipeline-0a33c50d/hooks/useSidebarResize.ts +0 -52
  155. package/.forge/worktrees/pipeline-0a33c50d/install.sh +0 -29
  156. package/.forge/worktrees/pipeline-0a33c50d/instrumentation.ts +0 -35
  157. package/.forge/worktrees/pipeline-0a33c50d/lib/agents/claude-adapter.ts +0 -104
  158. package/.forge/worktrees/pipeline-0a33c50d/lib/agents/generic-adapter.ts +0 -64
  159. package/.forge/worktrees/pipeline-0a33c50d/lib/agents/index.ts +0 -245
  160. package/.forge/worktrees/pipeline-0a33c50d/lib/agents/types.ts +0 -70
  161. package/.forge/worktrees/pipeline-0a33c50d/lib/artifacts.ts +0 -106
  162. package/.forge/worktrees/pipeline-0a33c50d/lib/auth.ts +0 -62
  163. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/docker.yaml +0 -70
  164. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/http.yaml +0 -66
  165. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/jenkins.yaml +0 -92
  166. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/llm-vision.yaml +0 -85
  167. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/playwright.yaml +0 -111
  168. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/shell-command.yaml +0 -60
  169. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/slack.yaml +0 -48
  170. package/.forge/worktrees/pipeline-0a33c50d/lib/builtin-plugins/webhook.yaml +0 -56
  171. package/.forge/worktrees/pipeline-0a33c50d/lib/claude-process.ts +0 -352
  172. package/.forge/worktrees/pipeline-0a33c50d/lib/claude-sessions.ts +0 -266
  173. package/.forge/worktrees/pipeline-0a33c50d/lib/claude-templates.ts +0 -227
  174. package/.forge/worktrees/pipeline-0a33c50d/lib/cloudflared.ts +0 -424
  175. package/.forge/worktrees/pipeline-0a33c50d/lib/crypto.ts +0 -67
  176. package/.forge/worktrees/pipeline-0a33c50d/lib/delivery.ts +0 -787
  177. package/.forge/worktrees/pipeline-0a33c50d/lib/dirs.ts +0 -99
  178. package/.forge/worktrees/pipeline-0a33c50d/lib/flows.ts +0 -86
  179. package/.forge/worktrees/pipeline-0a33c50d/lib/forge-mcp-server.ts +0 -717
  180. package/.forge/worktrees/pipeline-0a33c50d/lib/forge-skills/forge-inbox.md +0 -38
  181. package/.forge/worktrees/pipeline-0a33c50d/lib/forge-skills/forge-send.md +0 -47
  182. package/.forge/worktrees/pipeline-0a33c50d/lib/forge-skills/forge-status.md +0 -32
  183. package/.forge/worktrees/pipeline-0a33c50d/lib/forge-skills/forge-workspace-sync.md +0 -37
  184. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/00-overview.md +0 -40
  185. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/01-settings.md +0 -194
  186. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/02-telegram.md +0 -41
  187. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/03-tunnel.md +0 -31
  188. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/04-tasks.md +0 -52
  189. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/05-pipelines.md +0 -460
  190. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/06-skills.md +0 -43
  191. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/07-projects.md +0 -73
  192. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/08-rules.md +0 -53
  193. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/09-issue-autofix.md +0 -55
  194. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/10-troubleshooting.md +0 -89
  195. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/11-workspace.md +0 -810
  196. package/.forge/worktrees/pipeline-0a33c50d/lib/help-docs/CLAUDE.md +0 -62
  197. package/.forge/worktrees/pipeline-0a33c50d/lib/init.ts +0 -266
  198. package/.forge/worktrees/pipeline-0a33c50d/lib/issue-scanner.ts +0 -298
  199. package/.forge/worktrees/pipeline-0a33c50d/lib/logger.ts +0 -79
  200. package/.forge/worktrees/pipeline-0a33c50d/lib/notifications.ts +0 -75
  201. package/.forge/worktrees/pipeline-0a33c50d/lib/notify.ts +0 -108
  202. package/.forge/worktrees/pipeline-0a33c50d/lib/password.ts +0 -97
  203. package/.forge/worktrees/pipeline-0a33c50d/lib/pipeline-scheduler.ts +0 -373
  204. package/.forge/worktrees/pipeline-0a33c50d/lib/pipeline.ts +0 -1438
  205. package/.forge/worktrees/pipeline-0a33c50d/lib/plugins/executor.ts +0 -347
  206. package/.forge/worktrees/pipeline-0a33c50d/lib/plugins/registry.ts +0 -228
  207. package/.forge/worktrees/pipeline-0a33c50d/lib/plugins/types.ts +0 -103
  208. package/.forge/worktrees/pipeline-0a33c50d/lib/project-sessions.ts +0 -53
  209. package/.forge/worktrees/pipeline-0a33c50d/lib/projects.ts +0 -86
  210. package/.forge/worktrees/pipeline-0a33c50d/lib/session-manager.ts +0 -156
  211. package/.forge/worktrees/pipeline-0a33c50d/lib/session-utils.ts +0 -53
  212. package/.forge/worktrees/pipeline-0a33c50d/lib/session-watcher.ts +0 -345
  213. package/.forge/worktrees/pipeline-0a33c50d/lib/settings.ts +0 -195
  214. package/.forge/worktrees/pipeline-0a33c50d/lib/skills.ts +0 -458
  215. package/.forge/worktrees/pipeline-0a33c50d/lib/task-manager.ts +0 -949
  216. package/.forge/worktrees/pipeline-0a33c50d/lib/telegram-bot.ts +0 -1477
  217. package/.forge/worktrees/pipeline-0a33c50d/lib/telegram-standalone.ts +0 -83
  218. package/.forge/worktrees/pipeline-0a33c50d/lib/terminal-server.ts +0 -70
  219. package/.forge/worktrees/pipeline-0a33c50d/lib/terminal-standalone.ts +0 -421
  220. package/.forge/worktrees/pipeline-0a33c50d/lib/usage-scanner.ts +0 -249
  221. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/__tests__/state-machine.test.ts +0 -388
  222. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/__tests__/workspace.test.ts +0 -311
  223. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/agent-bus.ts +0 -416
  224. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/agent-worker.ts +0 -655
  225. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/backends/api-backend.ts +0 -262
  226. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/backends/cli-backend.ts +0 -491
  227. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/index.ts +0 -82
  228. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/manager.ts +0 -136
  229. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/orchestrator.ts +0 -3400
  230. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/persistence.ts +0 -309
  231. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/presets.ts +0 -649
  232. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/requests.ts +0 -287
  233. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/session-monitor.ts +0 -240
  234. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/skill-installer.ts +0 -275
  235. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/smith-memory.ts +0 -498
  236. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/types.ts +0 -241
  237. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace/watch-manager.ts +0 -560
  238. package/.forge/worktrees/pipeline-0a33c50d/lib/workspace-standalone.ts +0 -911
  239. package/.forge/worktrees/pipeline-0a33c50d/middleware.ts +0 -51
  240. package/.forge/worktrees/pipeline-0a33c50d/next.config.ts +0 -26
  241. package/.forge/worktrees/pipeline-0a33c50d/package.json +0 -74
  242. package/.forge/worktrees/pipeline-0a33c50d/pnpm-lock.yaml +0 -3719
  243. package/.forge/worktrees/pipeline-0a33c50d/pnpm-workspace.yaml +0 -1
  244. package/.forge/worktrees/pipeline-0a33c50d/postcss.config.mjs +0 -7
  245. package/.forge/worktrees/pipeline-0a33c50d/publish.sh +0 -133
  246. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/README.md +0 -66
  247. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/results/.gitignore +0 -2
  248. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/run.ts +0 -635
  249. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/01-text-utils/task.md +0 -26
  250. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  251. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  252. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/02-pagination/task.md +0 -48
  253. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  254. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  255. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  256. package/.forge/worktrees/pipeline-0a33c50d/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  257. package/.forge/worktrees/pipeline-0a33c50d/scripts/verify-usage.ts +0 -178
  258. package/.forge/worktrees/pipeline-0a33c50d/src/config/index.ts +0 -129
  259. package/.forge/worktrees/pipeline-0a33c50d/src/core/db/database.ts +0 -259
  260. package/.forge/worktrees/pipeline-0a33c50d/src/core/memory/strategy.ts +0 -32
  261. package/.forge/worktrees/pipeline-0a33c50d/src/core/providers/chat.ts +0 -65
  262. package/.forge/worktrees/pipeline-0a33c50d/src/core/providers/registry.ts +0 -60
  263. package/.forge/worktrees/pipeline-0a33c50d/src/core/session/manager.ts +0 -190
  264. package/.forge/worktrees/pipeline-0a33c50d/src/types/index.ts +0 -129
  265. package/.forge/worktrees/pipeline-0a33c50d/start.sh +0 -31
  266. package/.forge/worktrees/pipeline-0a33c50d/templates/smith-lead.json +0 -45
  267. package/.forge/worktrees/pipeline-0a33c50d/tsconfig.json +0 -42
  268. package/.forge/worktrees/pipeline-2ba01c10/CLAUDE.md +0 -86
  269. package/.forge/worktrees/pipeline-2ba01c10/README.md +0 -136
  270. package/.forge/worktrees/pipeline-2ba01c10/RELEASE_NOTES.md +0 -11
  271. package/.forge/worktrees/pipeline-2ba01c10/app/api/agents/route.ts +0 -17
  272. package/.forge/worktrees/pipeline-2ba01c10/app/api/auth/[...nextauth]/route.ts +0 -3
  273. package/.forge/worktrees/pipeline-2ba01c10/app/api/auth/verify/route.ts +0 -46
  274. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude/[id]/route.ts +0 -31
  275. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude/[id]/stream/route.ts +0 -63
  276. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude/route.ts +0 -28
  277. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  278. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  279. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude-sessions/[projectName]/route.ts +0 -37
  280. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude-sessions/sync/route.ts +0 -17
  281. package/.forge/worktrees/pipeline-2ba01c10/app/api/claude-templates/route.ts +0 -145
  282. package/.forge/worktrees/pipeline-2ba01c10/app/api/code/route.ts +0 -299
  283. package/.forge/worktrees/pipeline-2ba01c10/app/api/delivery/[id]/route.ts +0 -62
  284. package/.forge/worktrees/pipeline-2ba01c10/app/api/delivery/route.ts +0 -40
  285. package/.forge/worktrees/pipeline-2ba01c10/app/api/detect-cli/route.ts +0 -46
  286. package/.forge/worktrees/pipeline-2ba01c10/app/api/docs/route.ts +0 -176
  287. package/.forge/worktrees/pipeline-2ba01c10/app/api/docs/sessions/route.ts +0 -54
  288. package/.forge/worktrees/pipeline-2ba01c10/app/api/favorites/route.ts +0 -26
  289. package/.forge/worktrees/pipeline-2ba01c10/app/api/flows/route.ts +0 -6
  290. package/.forge/worktrees/pipeline-2ba01c10/app/api/flows/run/route.ts +0 -19
  291. package/.forge/worktrees/pipeline-2ba01c10/app/api/git/route.ts +0 -149
  292. package/.forge/worktrees/pipeline-2ba01c10/app/api/help/route.ts +0 -84
  293. package/.forge/worktrees/pipeline-2ba01c10/app/api/issue-scanner/route.ts +0 -116
  294. package/.forge/worktrees/pipeline-2ba01c10/app/api/logs/route.ts +0 -100
  295. package/.forge/worktrees/pipeline-2ba01c10/app/api/mobile-chat/route.ts +0 -115
  296. package/.forge/worktrees/pipeline-2ba01c10/app/api/monitor/route.ts +0 -74
  297. package/.forge/worktrees/pipeline-2ba01c10/app/api/notifications/route.ts +0 -42
  298. package/.forge/worktrees/pipeline-2ba01c10/app/api/notify/test/route.ts +0 -33
  299. package/.forge/worktrees/pipeline-2ba01c10/app/api/online/route.ts +0 -40
  300. package/.forge/worktrees/pipeline-2ba01c10/app/api/pipelines/[id]/route.ts +0 -41
  301. package/.forge/worktrees/pipeline-2ba01c10/app/api/pipelines/route.ts +0 -90
  302. package/.forge/worktrees/pipeline-2ba01c10/app/api/plugins/route.ts +0 -75
  303. package/.forge/worktrees/pipeline-2ba01c10/app/api/preview/[...path]/route.ts +0 -64
  304. package/.forge/worktrees/pipeline-2ba01c10/app/api/preview/route.ts +0 -156
  305. package/.forge/worktrees/pipeline-2ba01c10/app/api/project-pipelines/route.ts +0 -91
  306. package/.forge/worktrees/pipeline-2ba01c10/app/api/project-sessions/route.ts +0 -61
  307. package/.forge/worktrees/pipeline-2ba01c10/app/api/projects/route.ts +0 -26
  308. package/.forge/worktrees/pipeline-2ba01c10/app/api/sessions/[id]/chat/route.ts +0 -64
  309. package/.forge/worktrees/pipeline-2ba01c10/app/api/sessions/[id]/messages/route.ts +0 -9
  310. package/.forge/worktrees/pipeline-2ba01c10/app/api/sessions/[id]/route.ts +0 -17
  311. package/.forge/worktrees/pipeline-2ba01c10/app/api/sessions/route.ts +0 -20
  312. package/.forge/worktrees/pipeline-2ba01c10/app/api/settings/route.ts +0 -64
  313. package/.forge/worktrees/pipeline-2ba01c10/app/api/skills/local/route.ts +0 -228
  314. package/.forge/worktrees/pipeline-2ba01c10/app/api/skills/route.ts +0 -182
  315. package/.forge/worktrees/pipeline-2ba01c10/app/api/smith-templates/route.ts +0 -81
  316. package/.forge/worktrees/pipeline-2ba01c10/app/api/status/route.ts +0 -12
  317. package/.forge/worktrees/pipeline-2ba01c10/app/api/tabs/route.ts +0 -25
  318. package/.forge/worktrees/pipeline-2ba01c10/app/api/tasks/[id]/route.ts +0 -51
  319. package/.forge/worktrees/pipeline-2ba01c10/app/api/tasks/[id]/stream/route.ts +0 -77
  320. package/.forge/worktrees/pipeline-2ba01c10/app/api/tasks/link/route.ts +0 -37
  321. package/.forge/worktrees/pipeline-2ba01c10/app/api/tasks/route.ts +0 -44
  322. package/.forge/worktrees/pipeline-2ba01c10/app/api/tasks/session/route.ts +0 -14
  323. package/.forge/worktrees/pipeline-2ba01c10/app/api/telegram/route.ts +0 -23
  324. package/.forge/worktrees/pipeline-2ba01c10/app/api/templates/route.ts +0 -6
  325. package/.forge/worktrees/pipeline-2ba01c10/app/api/terminal-bell/route.ts +0 -35
  326. package/.forge/worktrees/pipeline-2ba01c10/app/api/terminal-cwd/route.ts +0 -19
  327. package/.forge/worktrees/pipeline-2ba01c10/app/api/terminal-state/route.ts +0 -15
  328. package/.forge/worktrees/pipeline-2ba01c10/app/api/tunnel/route.ts +0 -26
  329. package/.forge/worktrees/pipeline-2ba01c10/app/api/upgrade/route.ts +0 -43
  330. package/.forge/worktrees/pipeline-2ba01c10/app/api/usage/route.ts +0 -20
  331. package/.forge/worktrees/pipeline-2ba01c10/app/api/version/route.ts +0 -78
  332. package/.forge/worktrees/pipeline-2ba01c10/app/api/watchers/route.ts +0 -33
  333. package/.forge/worktrees/pipeline-2ba01c10/app/api/workspace/[id]/agents/route.ts +0 -35
  334. package/.forge/worktrees/pipeline-2ba01c10/app/api/workspace/[id]/memory/route.ts +0 -23
  335. package/.forge/worktrees/pipeline-2ba01c10/app/api/workspace/[id]/smith/route.ts +0 -22
  336. package/.forge/worktrees/pipeline-2ba01c10/app/api/workspace/[id]/stream/route.ts +0 -28
  337. package/.forge/worktrees/pipeline-2ba01c10/app/api/workspace/route.ts +0 -100
  338. package/.forge/worktrees/pipeline-2ba01c10/app/global-error.tsx +0 -21
  339. package/.forge/worktrees/pipeline-2ba01c10/app/globals.css +0 -52
  340. package/.forge/worktrees/pipeline-2ba01c10/app/icon.ico +0 -0
  341. package/.forge/worktrees/pipeline-2ba01c10/app/icon.png +0 -0
  342. package/.forge/worktrees/pipeline-2ba01c10/app/icon.svg +0 -106
  343. package/.forge/worktrees/pipeline-2ba01c10/app/layout.tsx +0 -17
  344. package/.forge/worktrees/pipeline-2ba01c10/app/login/LoginForm.tsx +0 -96
  345. package/.forge/worktrees/pipeline-2ba01c10/app/login/page.tsx +0 -10
  346. package/.forge/worktrees/pipeline-2ba01c10/app/mobile/page.tsx +0 -9
  347. package/.forge/worktrees/pipeline-2ba01c10/app/page.tsx +0 -21
  348. package/.forge/worktrees/pipeline-2ba01c10/bin/forge-server.mjs +0 -484
  349. package/.forge/worktrees/pipeline-2ba01c10/check-forge-status.sh +0 -71
  350. package/.forge/worktrees/pipeline-2ba01c10/cli/mw.ts +0 -579
  351. package/.forge/worktrees/pipeline-2ba01c10/components/BrowserPanel.tsx +0 -175
  352. package/.forge/worktrees/pipeline-2ba01c10/components/ChatPanel.tsx +0 -191
  353. package/.forge/worktrees/pipeline-2ba01c10/components/ClaudeTerminal.tsx +0 -267
  354. package/.forge/worktrees/pipeline-2ba01c10/components/CodeViewer.tsx +0 -787
  355. package/.forge/worktrees/pipeline-2ba01c10/components/ConversationEditor.tsx +0 -411
  356. package/.forge/worktrees/pipeline-2ba01c10/components/ConversationGraphView.tsx +0 -347
  357. package/.forge/worktrees/pipeline-2ba01c10/components/ConversationTerminalView.tsx +0 -303
  358. package/.forge/worktrees/pipeline-2ba01c10/components/Dashboard.tsx +0 -807
  359. package/.forge/worktrees/pipeline-2ba01c10/components/DashboardWrapper.tsx +0 -9
  360. package/.forge/worktrees/pipeline-2ba01c10/components/DeliveryFlowEditor.tsx +0 -491
  361. package/.forge/worktrees/pipeline-2ba01c10/components/DeliveryList.tsx +0 -230
  362. package/.forge/worktrees/pipeline-2ba01c10/components/DeliveryWorkspace.tsx +0 -589
  363. package/.forge/worktrees/pipeline-2ba01c10/components/DocTerminal.tsx +0 -187
  364. package/.forge/worktrees/pipeline-2ba01c10/components/DocsViewer.tsx +0 -574
  365. package/.forge/worktrees/pipeline-2ba01c10/components/HelpDialog.tsx +0 -169
  366. package/.forge/worktrees/pipeline-2ba01c10/components/HelpTerminal.tsx +0 -141
  367. package/.forge/worktrees/pipeline-2ba01c10/components/InlinePipelineView.tsx +0 -111
  368. package/.forge/worktrees/pipeline-2ba01c10/components/LogViewer.tsx +0 -194
  369. package/.forge/worktrees/pipeline-2ba01c10/components/MarkdownContent.tsx +0 -73
  370. package/.forge/worktrees/pipeline-2ba01c10/components/MobileView.tsx +0 -385
  371. package/.forge/worktrees/pipeline-2ba01c10/components/MonitorPanel.tsx +0 -122
  372. package/.forge/worktrees/pipeline-2ba01c10/components/NewSessionModal.tsx +0 -93
  373. package/.forge/worktrees/pipeline-2ba01c10/components/NewTaskModal.tsx +0 -492
  374. package/.forge/worktrees/pipeline-2ba01c10/components/PipelineEditor.tsx +0 -570
  375. package/.forge/worktrees/pipeline-2ba01c10/components/PipelineView.tsx +0 -1018
  376. package/.forge/worktrees/pipeline-2ba01c10/components/PluginsPanel.tsx +0 -472
  377. package/.forge/worktrees/pipeline-2ba01c10/components/ProjectDetail.tsx +0 -1618
  378. package/.forge/worktrees/pipeline-2ba01c10/components/ProjectList.tsx +0 -108
  379. package/.forge/worktrees/pipeline-2ba01c10/components/ProjectManager.tsx +0 -401
  380. package/.forge/worktrees/pipeline-2ba01c10/components/SessionList.tsx +0 -74
  381. package/.forge/worktrees/pipeline-2ba01c10/components/SessionView.tsx +0 -726
  382. package/.forge/worktrees/pipeline-2ba01c10/components/SettingsModal.tsx +0 -1647
  383. package/.forge/worktrees/pipeline-2ba01c10/components/SkillsPanel.tsx +0 -969
  384. package/.forge/worktrees/pipeline-2ba01c10/components/StatusBar.tsx +0 -99
  385. package/.forge/worktrees/pipeline-2ba01c10/components/TabBar.tsx +0 -46
  386. package/.forge/worktrees/pipeline-2ba01c10/components/TaskBoard.tsx +0 -113
  387. package/.forge/worktrees/pipeline-2ba01c10/components/TaskDetail.tsx +0 -372
  388. package/.forge/worktrees/pipeline-2ba01c10/components/TerminalLauncher.tsx +0 -398
  389. package/.forge/worktrees/pipeline-2ba01c10/components/TunnelToggle.tsx +0 -206
  390. package/.forge/worktrees/pipeline-2ba01c10/components/UsagePanel.tsx +0 -207
  391. package/.forge/worktrees/pipeline-2ba01c10/components/WebTerminal.tsx +0 -1683
  392. package/.forge/worktrees/pipeline-2ba01c10/components/WorkspaceTree.tsx +0 -221
  393. package/.forge/worktrees/pipeline-2ba01c10/components/WorkspaceView.tsx +0 -4048
  394. package/.forge/worktrees/pipeline-2ba01c10/dev-test.sh +0 -5
  395. package/.forge/worktrees/pipeline-2ba01c10/docs/Forge_Memory_Layer_Design.docx +0 -0
  396. package/.forge/worktrees/pipeline-2ba01c10/docs/Forge_Strategy_Research_2026.docx +0 -0
  397. package/.forge/worktrees/pipeline-2ba01c10/docs/LOCAL-DEPLOY.md +0 -144
  398. package/.forge/worktrees/pipeline-2ba01c10/docs/roadmap-multi-agent-workflow.md +0 -330
  399. package/.forge/worktrees/pipeline-2ba01c10/forge-logo.png +0 -0
  400. package/.forge/worktrees/pipeline-2ba01c10/forge-logo.svg +0 -106
  401. package/.forge/worktrees/pipeline-2ba01c10/hooks/useSidebarResize.ts +0 -52
  402. package/.forge/worktrees/pipeline-2ba01c10/install.sh +0 -29
  403. package/.forge/worktrees/pipeline-2ba01c10/instrumentation.ts +0 -35
  404. package/.forge/worktrees/pipeline-2ba01c10/lib/agents/claude-adapter.ts +0 -104
  405. package/.forge/worktrees/pipeline-2ba01c10/lib/agents/generic-adapter.ts +0 -64
  406. package/.forge/worktrees/pipeline-2ba01c10/lib/agents/index.ts +0 -245
  407. package/.forge/worktrees/pipeline-2ba01c10/lib/agents/types.ts +0 -70
  408. package/.forge/worktrees/pipeline-2ba01c10/lib/artifacts.ts +0 -106
  409. package/.forge/worktrees/pipeline-2ba01c10/lib/auth.ts +0 -62
  410. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/docker.yaml +0 -70
  411. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/http.yaml +0 -66
  412. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/jenkins.yaml +0 -92
  413. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/llm-vision.yaml +0 -85
  414. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/playwright.yaml +0 -111
  415. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/shell-command.yaml +0 -60
  416. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/slack.yaml +0 -48
  417. package/.forge/worktrees/pipeline-2ba01c10/lib/builtin-plugins/webhook.yaml +0 -56
  418. package/.forge/worktrees/pipeline-2ba01c10/lib/claude-process.ts +0 -352
  419. package/.forge/worktrees/pipeline-2ba01c10/lib/claude-sessions.ts +0 -266
  420. package/.forge/worktrees/pipeline-2ba01c10/lib/claude-templates.ts +0 -227
  421. package/.forge/worktrees/pipeline-2ba01c10/lib/cloudflared.ts +0 -424
  422. package/.forge/worktrees/pipeline-2ba01c10/lib/crypto.ts +0 -67
  423. package/.forge/worktrees/pipeline-2ba01c10/lib/delivery.ts +0 -787
  424. package/.forge/worktrees/pipeline-2ba01c10/lib/dirs.ts +0 -99
  425. package/.forge/worktrees/pipeline-2ba01c10/lib/flows.ts +0 -86
  426. package/.forge/worktrees/pipeline-2ba01c10/lib/forge-mcp-server.ts +0 -717
  427. package/.forge/worktrees/pipeline-2ba01c10/lib/forge-skills/forge-inbox.md +0 -38
  428. package/.forge/worktrees/pipeline-2ba01c10/lib/forge-skills/forge-send.md +0 -47
  429. package/.forge/worktrees/pipeline-2ba01c10/lib/forge-skills/forge-status.md +0 -32
  430. package/.forge/worktrees/pipeline-2ba01c10/lib/forge-skills/forge-workspace-sync.md +0 -37
  431. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/00-overview.md +0 -40
  432. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/01-settings.md +0 -194
  433. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/02-telegram.md +0 -41
  434. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/03-tunnel.md +0 -31
  435. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/04-tasks.md +0 -52
  436. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/05-pipelines.md +0 -460
  437. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/06-skills.md +0 -43
  438. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/07-projects.md +0 -73
  439. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/08-rules.md +0 -53
  440. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/09-issue-autofix.md +0 -55
  441. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/10-troubleshooting.md +0 -89
  442. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/11-workspace.md +0 -810
  443. package/.forge/worktrees/pipeline-2ba01c10/lib/help-docs/CLAUDE.md +0 -62
  444. package/.forge/worktrees/pipeline-2ba01c10/lib/init.ts +0 -266
  445. package/.forge/worktrees/pipeline-2ba01c10/lib/issue-scanner.ts +0 -298
  446. package/.forge/worktrees/pipeline-2ba01c10/lib/logger.ts +0 -79
  447. package/.forge/worktrees/pipeline-2ba01c10/lib/notifications.ts +0 -75
  448. package/.forge/worktrees/pipeline-2ba01c10/lib/notify.ts +0 -108
  449. package/.forge/worktrees/pipeline-2ba01c10/lib/password.ts +0 -97
  450. package/.forge/worktrees/pipeline-2ba01c10/lib/pipeline-scheduler.ts +0 -373
  451. package/.forge/worktrees/pipeline-2ba01c10/lib/pipeline.ts +0 -1438
  452. package/.forge/worktrees/pipeline-2ba01c10/lib/plugins/executor.ts +0 -347
  453. package/.forge/worktrees/pipeline-2ba01c10/lib/plugins/registry.ts +0 -228
  454. package/.forge/worktrees/pipeline-2ba01c10/lib/plugins/types.ts +0 -103
  455. package/.forge/worktrees/pipeline-2ba01c10/lib/project-sessions.ts +0 -53
  456. package/.forge/worktrees/pipeline-2ba01c10/lib/projects.ts +0 -86
  457. package/.forge/worktrees/pipeline-2ba01c10/lib/session-manager.ts +0 -156
  458. package/.forge/worktrees/pipeline-2ba01c10/lib/session-utils.ts +0 -53
  459. package/.forge/worktrees/pipeline-2ba01c10/lib/session-watcher.ts +0 -345
  460. package/.forge/worktrees/pipeline-2ba01c10/lib/settings.ts +0 -195
  461. package/.forge/worktrees/pipeline-2ba01c10/lib/skills.ts +0 -458
  462. package/.forge/worktrees/pipeline-2ba01c10/lib/task-manager.ts +0 -949
  463. package/.forge/worktrees/pipeline-2ba01c10/lib/telegram-bot.ts +0 -1477
  464. package/.forge/worktrees/pipeline-2ba01c10/lib/telegram-standalone.ts +0 -83
  465. package/.forge/worktrees/pipeline-2ba01c10/lib/terminal-server.ts +0 -70
  466. package/.forge/worktrees/pipeline-2ba01c10/lib/terminal-standalone.ts +0 -421
  467. package/.forge/worktrees/pipeline-2ba01c10/lib/usage-scanner.ts +0 -249
  468. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/__tests__/state-machine.test.ts +0 -388
  469. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/__tests__/workspace.test.ts +0 -311
  470. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/agent-bus.ts +0 -416
  471. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/agent-worker.ts +0 -655
  472. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/backends/api-backend.ts +0 -262
  473. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/backends/cli-backend.ts +0 -491
  474. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/index.ts +0 -82
  475. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/manager.ts +0 -136
  476. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/orchestrator.ts +0 -3400
  477. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/persistence.ts +0 -309
  478. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/presets.ts +0 -649
  479. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/requests.ts +0 -287
  480. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/session-monitor.ts +0 -240
  481. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/skill-installer.ts +0 -275
  482. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/smith-memory.ts +0 -498
  483. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/types.ts +0 -241
  484. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace/watch-manager.ts +0 -560
  485. package/.forge/worktrees/pipeline-2ba01c10/lib/workspace-standalone.ts +0 -911
  486. package/.forge/worktrees/pipeline-2ba01c10/middleware.ts +0 -51
  487. package/.forge/worktrees/pipeline-2ba01c10/next.config.ts +0 -26
  488. package/.forge/worktrees/pipeline-2ba01c10/package.json +0 -74
  489. package/.forge/worktrees/pipeline-2ba01c10/pnpm-lock.yaml +0 -3719
  490. package/.forge/worktrees/pipeline-2ba01c10/pnpm-workspace.yaml +0 -1
  491. package/.forge/worktrees/pipeline-2ba01c10/postcss.config.mjs +0 -7
  492. package/.forge/worktrees/pipeline-2ba01c10/publish.sh +0 -133
  493. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/README.md +0 -66
  494. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/results/.gitignore +0 -2
  495. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/run.ts +0 -635
  496. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/01-text-utils/task.md +0 -26
  497. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  498. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  499. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/02-pagination/task.md +0 -48
  500. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  501. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  502. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  503. package/.forge/worktrees/pipeline-2ba01c10/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  504. package/.forge/worktrees/pipeline-2ba01c10/scripts/verify-usage.ts +0 -178
  505. package/.forge/worktrees/pipeline-2ba01c10/src/config/index.ts +0 -129
  506. package/.forge/worktrees/pipeline-2ba01c10/src/core/db/database.ts +0 -259
  507. package/.forge/worktrees/pipeline-2ba01c10/src/core/memory/strategy.ts +0 -32
  508. package/.forge/worktrees/pipeline-2ba01c10/src/core/providers/chat.ts +0 -65
  509. package/.forge/worktrees/pipeline-2ba01c10/src/core/providers/registry.ts +0 -60
  510. package/.forge/worktrees/pipeline-2ba01c10/src/core/session/manager.ts +0 -190
  511. package/.forge/worktrees/pipeline-2ba01c10/src/types/index.ts +0 -129
  512. package/.forge/worktrees/pipeline-2ba01c10/start.sh +0 -31
  513. package/.forge/worktrees/pipeline-2ba01c10/templates/smith-lead.json +0 -45
  514. package/.forge/worktrees/pipeline-2ba01c10/tsconfig.json +0 -42
  515. package/.forge/worktrees/pipeline-3156a8b3/CLAUDE.md +0 -86
  516. package/.forge/worktrees/pipeline-3156a8b3/README.md +0 -136
  517. package/.forge/worktrees/pipeline-3156a8b3/RELEASE_NOTES.md +0 -11
  518. package/.forge/worktrees/pipeline-3156a8b3/app/api/agents/route.ts +0 -17
  519. package/.forge/worktrees/pipeline-3156a8b3/app/api/auth/[...nextauth]/route.ts +0 -3
  520. package/.forge/worktrees/pipeline-3156a8b3/app/api/auth/verify/route.ts +0 -46
  521. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude/[id]/route.ts +0 -31
  522. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude/[id]/stream/route.ts +0 -63
  523. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude/route.ts +0 -28
  524. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  525. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  526. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude-sessions/[projectName]/route.ts +0 -37
  527. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude-sessions/sync/route.ts +0 -17
  528. package/.forge/worktrees/pipeline-3156a8b3/app/api/claude-templates/route.ts +0 -145
  529. package/.forge/worktrees/pipeline-3156a8b3/app/api/code/route.ts +0 -299
  530. package/.forge/worktrees/pipeline-3156a8b3/app/api/delivery/[id]/route.ts +0 -62
  531. package/.forge/worktrees/pipeline-3156a8b3/app/api/delivery/route.ts +0 -40
  532. package/.forge/worktrees/pipeline-3156a8b3/app/api/detect-cli/route.ts +0 -46
  533. package/.forge/worktrees/pipeline-3156a8b3/app/api/docs/route.ts +0 -176
  534. package/.forge/worktrees/pipeline-3156a8b3/app/api/docs/sessions/route.ts +0 -54
  535. package/.forge/worktrees/pipeline-3156a8b3/app/api/favorites/route.ts +0 -26
  536. package/.forge/worktrees/pipeline-3156a8b3/app/api/flows/route.ts +0 -6
  537. package/.forge/worktrees/pipeline-3156a8b3/app/api/flows/run/route.ts +0 -19
  538. package/.forge/worktrees/pipeline-3156a8b3/app/api/git/route.ts +0 -149
  539. package/.forge/worktrees/pipeline-3156a8b3/app/api/help/route.ts +0 -84
  540. package/.forge/worktrees/pipeline-3156a8b3/app/api/issue-scanner/route.ts +0 -116
  541. package/.forge/worktrees/pipeline-3156a8b3/app/api/logs/route.ts +0 -100
  542. package/.forge/worktrees/pipeline-3156a8b3/app/api/mobile-chat/route.ts +0 -115
  543. package/.forge/worktrees/pipeline-3156a8b3/app/api/monitor/route.ts +0 -74
  544. package/.forge/worktrees/pipeline-3156a8b3/app/api/notifications/route.ts +0 -42
  545. package/.forge/worktrees/pipeline-3156a8b3/app/api/notify/test/route.ts +0 -33
  546. package/.forge/worktrees/pipeline-3156a8b3/app/api/online/route.ts +0 -40
  547. package/.forge/worktrees/pipeline-3156a8b3/app/api/pipelines/[id]/route.ts +0 -41
  548. package/.forge/worktrees/pipeline-3156a8b3/app/api/pipelines/route.ts +0 -90
  549. package/.forge/worktrees/pipeline-3156a8b3/app/api/plugins/route.ts +0 -75
  550. package/.forge/worktrees/pipeline-3156a8b3/app/api/preview/[...path]/route.ts +0 -64
  551. package/.forge/worktrees/pipeline-3156a8b3/app/api/preview/route.ts +0 -156
  552. package/.forge/worktrees/pipeline-3156a8b3/app/api/project-pipelines/route.ts +0 -91
  553. package/.forge/worktrees/pipeline-3156a8b3/app/api/project-sessions/route.ts +0 -61
  554. package/.forge/worktrees/pipeline-3156a8b3/app/api/projects/route.ts +0 -26
  555. package/.forge/worktrees/pipeline-3156a8b3/app/api/sessions/[id]/chat/route.ts +0 -64
  556. package/.forge/worktrees/pipeline-3156a8b3/app/api/sessions/[id]/messages/route.ts +0 -9
  557. package/.forge/worktrees/pipeline-3156a8b3/app/api/sessions/[id]/route.ts +0 -17
  558. package/.forge/worktrees/pipeline-3156a8b3/app/api/sessions/route.ts +0 -20
  559. package/.forge/worktrees/pipeline-3156a8b3/app/api/settings/route.ts +0 -64
  560. package/.forge/worktrees/pipeline-3156a8b3/app/api/skills/local/route.ts +0 -228
  561. package/.forge/worktrees/pipeline-3156a8b3/app/api/skills/route.ts +0 -182
  562. package/.forge/worktrees/pipeline-3156a8b3/app/api/smith-templates/route.ts +0 -81
  563. package/.forge/worktrees/pipeline-3156a8b3/app/api/status/route.ts +0 -12
  564. package/.forge/worktrees/pipeline-3156a8b3/app/api/tabs/route.ts +0 -25
  565. package/.forge/worktrees/pipeline-3156a8b3/app/api/tasks/[id]/route.ts +0 -51
  566. package/.forge/worktrees/pipeline-3156a8b3/app/api/tasks/[id]/stream/route.ts +0 -77
  567. package/.forge/worktrees/pipeline-3156a8b3/app/api/tasks/link/route.ts +0 -37
  568. package/.forge/worktrees/pipeline-3156a8b3/app/api/tasks/route.ts +0 -44
  569. package/.forge/worktrees/pipeline-3156a8b3/app/api/tasks/session/route.ts +0 -14
  570. package/.forge/worktrees/pipeline-3156a8b3/app/api/telegram/route.ts +0 -23
  571. package/.forge/worktrees/pipeline-3156a8b3/app/api/templates/route.ts +0 -6
  572. package/.forge/worktrees/pipeline-3156a8b3/app/api/terminal-bell/route.ts +0 -35
  573. package/.forge/worktrees/pipeline-3156a8b3/app/api/terminal-cwd/route.ts +0 -19
  574. package/.forge/worktrees/pipeline-3156a8b3/app/api/terminal-state/route.ts +0 -15
  575. package/.forge/worktrees/pipeline-3156a8b3/app/api/tunnel/route.ts +0 -26
  576. package/.forge/worktrees/pipeline-3156a8b3/app/api/upgrade/route.ts +0 -43
  577. package/.forge/worktrees/pipeline-3156a8b3/app/api/usage/route.ts +0 -20
  578. package/.forge/worktrees/pipeline-3156a8b3/app/api/version/route.ts +0 -78
  579. package/.forge/worktrees/pipeline-3156a8b3/app/api/watchers/route.ts +0 -33
  580. package/.forge/worktrees/pipeline-3156a8b3/app/api/workspace/[id]/agents/route.ts +0 -35
  581. package/.forge/worktrees/pipeline-3156a8b3/app/api/workspace/[id]/memory/route.ts +0 -23
  582. package/.forge/worktrees/pipeline-3156a8b3/app/api/workspace/[id]/smith/route.ts +0 -22
  583. package/.forge/worktrees/pipeline-3156a8b3/app/api/workspace/[id]/stream/route.ts +0 -28
  584. package/.forge/worktrees/pipeline-3156a8b3/app/api/workspace/route.ts +0 -100
  585. package/.forge/worktrees/pipeline-3156a8b3/app/global-error.tsx +0 -21
  586. package/.forge/worktrees/pipeline-3156a8b3/app/globals.css +0 -52
  587. package/.forge/worktrees/pipeline-3156a8b3/app/icon.ico +0 -0
  588. package/.forge/worktrees/pipeline-3156a8b3/app/icon.png +0 -0
  589. package/.forge/worktrees/pipeline-3156a8b3/app/icon.svg +0 -106
  590. package/.forge/worktrees/pipeline-3156a8b3/app/layout.tsx +0 -17
  591. package/.forge/worktrees/pipeline-3156a8b3/app/login/LoginForm.tsx +0 -96
  592. package/.forge/worktrees/pipeline-3156a8b3/app/login/page.tsx +0 -10
  593. package/.forge/worktrees/pipeline-3156a8b3/app/mobile/page.tsx +0 -9
  594. package/.forge/worktrees/pipeline-3156a8b3/app/page.tsx +0 -21
  595. package/.forge/worktrees/pipeline-3156a8b3/bin/forge-server.mjs +0 -484
  596. package/.forge/worktrees/pipeline-3156a8b3/check-forge-status.sh +0 -71
  597. package/.forge/worktrees/pipeline-3156a8b3/cli/mw.ts +0 -579
  598. package/.forge/worktrees/pipeline-3156a8b3/components/BrowserPanel.tsx +0 -175
  599. package/.forge/worktrees/pipeline-3156a8b3/components/ChatPanel.tsx +0 -191
  600. package/.forge/worktrees/pipeline-3156a8b3/components/ClaudeTerminal.tsx +0 -267
  601. package/.forge/worktrees/pipeline-3156a8b3/components/CodeViewer.tsx +0 -787
  602. package/.forge/worktrees/pipeline-3156a8b3/components/ConversationEditor.tsx +0 -411
  603. package/.forge/worktrees/pipeline-3156a8b3/components/ConversationGraphView.tsx +0 -347
  604. package/.forge/worktrees/pipeline-3156a8b3/components/ConversationTerminalView.tsx +0 -303
  605. package/.forge/worktrees/pipeline-3156a8b3/components/Dashboard.tsx +0 -807
  606. package/.forge/worktrees/pipeline-3156a8b3/components/DashboardWrapper.tsx +0 -9
  607. package/.forge/worktrees/pipeline-3156a8b3/components/DeliveryFlowEditor.tsx +0 -491
  608. package/.forge/worktrees/pipeline-3156a8b3/components/DeliveryList.tsx +0 -230
  609. package/.forge/worktrees/pipeline-3156a8b3/components/DeliveryWorkspace.tsx +0 -589
  610. package/.forge/worktrees/pipeline-3156a8b3/components/DocTerminal.tsx +0 -187
  611. package/.forge/worktrees/pipeline-3156a8b3/components/DocsViewer.tsx +0 -574
  612. package/.forge/worktrees/pipeline-3156a8b3/components/HelpDialog.tsx +0 -169
  613. package/.forge/worktrees/pipeline-3156a8b3/components/HelpTerminal.tsx +0 -141
  614. package/.forge/worktrees/pipeline-3156a8b3/components/InlinePipelineView.tsx +0 -111
  615. package/.forge/worktrees/pipeline-3156a8b3/components/LogViewer.tsx +0 -194
  616. package/.forge/worktrees/pipeline-3156a8b3/components/MarkdownContent.tsx +0 -73
  617. package/.forge/worktrees/pipeline-3156a8b3/components/MobileView.tsx +0 -385
  618. package/.forge/worktrees/pipeline-3156a8b3/components/MonitorPanel.tsx +0 -122
  619. package/.forge/worktrees/pipeline-3156a8b3/components/NewSessionModal.tsx +0 -93
  620. package/.forge/worktrees/pipeline-3156a8b3/components/NewTaskModal.tsx +0 -492
  621. package/.forge/worktrees/pipeline-3156a8b3/components/PipelineEditor.tsx +0 -570
  622. package/.forge/worktrees/pipeline-3156a8b3/components/PipelineView.tsx +0 -1018
  623. package/.forge/worktrees/pipeline-3156a8b3/components/PluginsPanel.tsx +0 -472
  624. package/.forge/worktrees/pipeline-3156a8b3/components/ProjectDetail.tsx +0 -1618
  625. package/.forge/worktrees/pipeline-3156a8b3/components/ProjectList.tsx +0 -108
  626. package/.forge/worktrees/pipeline-3156a8b3/components/ProjectManager.tsx +0 -401
  627. package/.forge/worktrees/pipeline-3156a8b3/components/SessionList.tsx +0 -74
  628. package/.forge/worktrees/pipeline-3156a8b3/components/SessionView.tsx +0 -726
  629. package/.forge/worktrees/pipeline-3156a8b3/components/SettingsModal.tsx +0 -1647
  630. package/.forge/worktrees/pipeline-3156a8b3/components/SkillsPanel.tsx +0 -969
  631. package/.forge/worktrees/pipeline-3156a8b3/components/StatusBar.tsx +0 -99
  632. package/.forge/worktrees/pipeline-3156a8b3/components/TabBar.tsx +0 -46
  633. package/.forge/worktrees/pipeline-3156a8b3/components/TaskBoard.tsx +0 -113
  634. package/.forge/worktrees/pipeline-3156a8b3/components/TaskDetail.tsx +0 -372
  635. package/.forge/worktrees/pipeline-3156a8b3/components/TerminalLauncher.tsx +0 -398
  636. package/.forge/worktrees/pipeline-3156a8b3/components/TunnelToggle.tsx +0 -206
  637. package/.forge/worktrees/pipeline-3156a8b3/components/UsagePanel.tsx +0 -207
  638. package/.forge/worktrees/pipeline-3156a8b3/components/WebTerminal.tsx +0 -1683
  639. package/.forge/worktrees/pipeline-3156a8b3/components/WorkspaceTree.tsx +0 -221
  640. package/.forge/worktrees/pipeline-3156a8b3/components/WorkspaceView.tsx +0 -4048
  641. package/.forge/worktrees/pipeline-3156a8b3/dev-test.sh +0 -5
  642. package/.forge/worktrees/pipeline-3156a8b3/docs/Forge_Memory_Layer_Design.docx +0 -0
  643. package/.forge/worktrees/pipeline-3156a8b3/docs/Forge_Strategy_Research_2026.docx +0 -0
  644. package/.forge/worktrees/pipeline-3156a8b3/docs/LOCAL-DEPLOY.md +0 -144
  645. package/.forge/worktrees/pipeline-3156a8b3/docs/roadmap-multi-agent-workflow.md +0 -330
  646. package/.forge/worktrees/pipeline-3156a8b3/forge-logo.png +0 -0
  647. package/.forge/worktrees/pipeline-3156a8b3/forge-logo.svg +0 -106
  648. package/.forge/worktrees/pipeline-3156a8b3/hooks/useSidebarResize.ts +0 -52
  649. package/.forge/worktrees/pipeline-3156a8b3/install.sh +0 -29
  650. package/.forge/worktrees/pipeline-3156a8b3/instrumentation.ts +0 -35
  651. package/.forge/worktrees/pipeline-3156a8b3/lib/agents/claude-adapter.ts +0 -104
  652. package/.forge/worktrees/pipeline-3156a8b3/lib/agents/generic-adapter.ts +0 -64
  653. package/.forge/worktrees/pipeline-3156a8b3/lib/agents/index.ts +0 -245
  654. package/.forge/worktrees/pipeline-3156a8b3/lib/agents/types.ts +0 -70
  655. package/.forge/worktrees/pipeline-3156a8b3/lib/artifacts.ts +0 -106
  656. package/.forge/worktrees/pipeline-3156a8b3/lib/auth.ts +0 -62
  657. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/docker.yaml +0 -70
  658. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/http.yaml +0 -66
  659. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/jenkins.yaml +0 -92
  660. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/llm-vision.yaml +0 -85
  661. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/playwright.yaml +0 -111
  662. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/shell-command.yaml +0 -60
  663. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/slack.yaml +0 -48
  664. package/.forge/worktrees/pipeline-3156a8b3/lib/builtin-plugins/webhook.yaml +0 -56
  665. package/.forge/worktrees/pipeline-3156a8b3/lib/claude-process.ts +0 -351
  666. package/.forge/worktrees/pipeline-3156a8b3/lib/claude-sessions.ts +0 -266
  667. package/.forge/worktrees/pipeline-3156a8b3/lib/claude-templates.ts +0 -227
  668. package/.forge/worktrees/pipeline-3156a8b3/lib/cloudflared.ts +0 -424
  669. package/.forge/worktrees/pipeline-3156a8b3/lib/crypto.ts +0 -67
  670. package/.forge/worktrees/pipeline-3156a8b3/lib/delivery.ts +0 -787
  671. package/.forge/worktrees/pipeline-3156a8b3/lib/dirs.ts +0 -99
  672. package/.forge/worktrees/pipeline-3156a8b3/lib/flows.ts +0 -86
  673. package/.forge/worktrees/pipeline-3156a8b3/lib/forge-mcp-server.ts +0 -717
  674. package/.forge/worktrees/pipeline-3156a8b3/lib/forge-skills/forge-inbox.md +0 -38
  675. package/.forge/worktrees/pipeline-3156a8b3/lib/forge-skills/forge-send.md +0 -47
  676. package/.forge/worktrees/pipeline-3156a8b3/lib/forge-skills/forge-status.md +0 -32
  677. package/.forge/worktrees/pipeline-3156a8b3/lib/forge-skills/forge-workspace-sync.md +0 -37
  678. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/00-overview.md +0 -40
  679. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/01-settings.md +0 -194
  680. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/02-telegram.md +0 -41
  681. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/03-tunnel.md +0 -31
  682. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/04-tasks.md +0 -52
  683. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/05-pipelines.md +0 -460
  684. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/06-skills.md +0 -43
  685. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/07-projects.md +0 -73
  686. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/08-rules.md +0 -53
  687. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/09-issue-autofix.md +0 -55
  688. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/10-troubleshooting.md +0 -89
  689. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/11-workspace.md +0 -810
  690. package/.forge/worktrees/pipeline-3156a8b3/lib/help-docs/CLAUDE.md +0 -62
  691. package/.forge/worktrees/pipeline-3156a8b3/lib/init.ts +0 -266
  692. package/.forge/worktrees/pipeline-3156a8b3/lib/issue-scanner.ts +0 -298
  693. package/.forge/worktrees/pipeline-3156a8b3/lib/logger.ts +0 -79
  694. package/.forge/worktrees/pipeline-3156a8b3/lib/notifications.ts +0 -75
  695. package/.forge/worktrees/pipeline-3156a8b3/lib/notify.ts +0 -108
  696. package/.forge/worktrees/pipeline-3156a8b3/lib/password.ts +0 -97
  697. package/.forge/worktrees/pipeline-3156a8b3/lib/pipeline-scheduler.ts +0 -373
  698. package/.forge/worktrees/pipeline-3156a8b3/lib/pipeline.ts +0 -1441
  699. package/.forge/worktrees/pipeline-3156a8b3/lib/plugins/executor.ts +0 -347
  700. package/.forge/worktrees/pipeline-3156a8b3/lib/plugins/registry.ts +0 -228
  701. package/.forge/worktrees/pipeline-3156a8b3/lib/plugins/types.ts +0 -103
  702. package/.forge/worktrees/pipeline-3156a8b3/lib/project-sessions.ts +0 -53
  703. package/.forge/worktrees/pipeline-3156a8b3/lib/projects.ts +0 -86
  704. package/.forge/worktrees/pipeline-3156a8b3/lib/session-manager.ts +0 -156
  705. package/.forge/worktrees/pipeline-3156a8b3/lib/session-utils.ts +0 -53
  706. package/.forge/worktrees/pipeline-3156a8b3/lib/session-watcher.ts +0 -345
  707. package/.forge/worktrees/pipeline-3156a8b3/lib/settings.ts +0 -195
  708. package/.forge/worktrees/pipeline-3156a8b3/lib/skills.ts +0 -458
  709. package/.forge/worktrees/pipeline-3156a8b3/lib/task-manager.ts +0 -949
  710. package/.forge/worktrees/pipeline-3156a8b3/lib/telegram-bot.ts +0 -1477
  711. package/.forge/worktrees/pipeline-3156a8b3/lib/telegram-standalone.ts +0 -83
  712. package/.forge/worktrees/pipeline-3156a8b3/lib/terminal-server.ts +0 -70
  713. package/.forge/worktrees/pipeline-3156a8b3/lib/terminal-standalone.ts +0 -421
  714. package/.forge/worktrees/pipeline-3156a8b3/lib/usage-scanner.ts +0 -249
  715. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/__tests__/state-machine.test.ts +0 -388
  716. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/__tests__/workspace.test.ts +0 -311
  717. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/agent-bus.ts +0 -416
  718. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/agent-worker.ts +0 -655
  719. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/backends/api-backend.ts +0 -262
  720. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/backends/cli-backend.ts +0 -491
  721. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/index.ts +0 -82
  722. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/manager.ts +0 -136
  723. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/orchestrator.ts +0 -3400
  724. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/persistence.ts +0 -309
  725. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/presets.ts +0 -649
  726. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/requests.ts +0 -287
  727. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/session-monitor.ts +0 -240
  728. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/skill-installer.ts +0 -275
  729. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/smith-memory.ts +0 -498
  730. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/types.ts +0 -241
  731. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace/watch-manager.ts +0 -560
  732. package/.forge/worktrees/pipeline-3156a8b3/lib/workspace-standalone.ts +0 -911
  733. package/.forge/worktrees/pipeline-3156a8b3/middleware.ts +0 -51
  734. package/.forge/worktrees/pipeline-3156a8b3/next.config.ts +0 -26
  735. package/.forge/worktrees/pipeline-3156a8b3/package.json +0 -74
  736. package/.forge/worktrees/pipeline-3156a8b3/pnpm-lock.yaml +0 -3719
  737. package/.forge/worktrees/pipeline-3156a8b3/pnpm-workspace.yaml +0 -1
  738. package/.forge/worktrees/pipeline-3156a8b3/postcss.config.mjs +0 -7
  739. package/.forge/worktrees/pipeline-3156a8b3/publish.sh +0 -133
  740. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/README.md +0 -66
  741. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/results/.gitignore +0 -2
  742. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/run.ts +0 -635
  743. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/01-text-utils/task.md +0 -26
  744. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  745. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  746. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/02-pagination/task.md +0 -48
  747. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  748. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  749. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  750. package/.forge/worktrees/pipeline-3156a8b3/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  751. package/.forge/worktrees/pipeline-3156a8b3/scripts/verify-usage.ts +0 -178
  752. package/.forge/worktrees/pipeline-3156a8b3/src/config/index.ts +0 -129
  753. package/.forge/worktrees/pipeline-3156a8b3/src/core/db/database.ts +0 -259
  754. package/.forge/worktrees/pipeline-3156a8b3/src/core/memory/strategy.ts +0 -32
  755. package/.forge/worktrees/pipeline-3156a8b3/src/core/providers/chat.ts +0 -65
  756. package/.forge/worktrees/pipeline-3156a8b3/src/core/providers/registry.ts +0 -60
  757. package/.forge/worktrees/pipeline-3156a8b3/src/core/session/manager.ts +0 -190
  758. package/.forge/worktrees/pipeline-3156a8b3/src/types/index.ts +0 -129
  759. package/.forge/worktrees/pipeline-3156a8b3/start.sh +0 -31
  760. package/.forge/worktrees/pipeline-3156a8b3/templates/smith-lead.json +0 -45
  761. package/.forge/worktrees/pipeline-3156a8b3/tsconfig.json +0 -42
  762. package/.forge/worktrees/pipeline-316c6574/CLAUDE.md +0 -86
  763. package/.forge/worktrees/pipeline-316c6574/README.md +0 -136
  764. package/.forge/worktrees/pipeline-316c6574/RELEASE_NOTES.md +0 -11
  765. package/.forge/worktrees/pipeline-316c6574/app/api/agents/route.ts +0 -17
  766. package/.forge/worktrees/pipeline-316c6574/app/api/auth/[...nextauth]/route.ts +0 -3
  767. package/.forge/worktrees/pipeline-316c6574/app/api/auth/verify/route.ts +0 -46
  768. package/.forge/worktrees/pipeline-316c6574/app/api/claude/[id]/route.ts +0 -31
  769. package/.forge/worktrees/pipeline-316c6574/app/api/claude/[id]/stream/route.ts +0 -63
  770. package/.forge/worktrees/pipeline-316c6574/app/api/claude/route.ts +0 -28
  771. package/.forge/worktrees/pipeline-316c6574/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  772. package/.forge/worktrees/pipeline-316c6574/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  773. package/.forge/worktrees/pipeline-316c6574/app/api/claude-sessions/[projectName]/route.ts +0 -37
  774. package/.forge/worktrees/pipeline-316c6574/app/api/claude-sessions/sync/route.ts +0 -17
  775. package/.forge/worktrees/pipeline-316c6574/app/api/claude-templates/route.ts +0 -145
  776. package/.forge/worktrees/pipeline-316c6574/app/api/code/route.ts +0 -299
  777. package/.forge/worktrees/pipeline-316c6574/app/api/delivery/[id]/route.ts +0 -62
  778. package/.forge/worktrees/pipeline-316c6574/app/api/delivery/route.ts +0 -40
  779. package/.forge/worktrees/pipeline-316c6574/app/api/detect-cli/route.ts +0 -46
  780. package/.forge/worktrees/pipeline-316c6574/app/api/docs/route.ts +0 -176
  781. package/.forge/worktrees/pipeline-316c6574/app/api/docs/sessions/route.ts +0 -54
  782. package/.forge/worktrees/pipeline-316c6574/app/api/favorites/route.ts +0 -26
  783. package/.forge/worktrees/pipeline-316c6574/app/api/flows/route.ts +0 -6
  784. package/.forge/worktrees/pipeline-316c6574/app/api/flows/run/route.ts +0 -19
  785. package/.forge/worktrees/pipeline-316c6574/app/api/git/route.ts +0 -149
  786. package/.forge/worktrees/pipeline-316c6574/app/api/help/route.ts +0 -84
  787. package/.forge/worktrees/pipeline-316c6574/app/api/issue-scanner/route.ts +0 -116
  788. package/.forge/worktrees/pipeline-316c6574/app/api/logs/route.ts +0 -100
  789. package/.forge/worktrees/pipeline-316c6574/app/api/mobile-chat/route.ts +0 -115
  790. package/.forge/worktrees/pipeline-316c6574/app/api/monitor/route.ts +0 -74
  791. package/.forge/worktrees/pipeline-316c6574/app/api/notifications/route.ts +0 -42
  792. package/.forge/worktrees/pipeline-316c6574/app/api/notify/test/route.ts +0 -33
  793. package/.forge/worktrees/pipeline-316c6574/app/api/online/route.ts +0 -40
  794. package/.forge/worktrees/pipeline-316c6574/app/api/pipelines/[id]/route.ts +0 -41
  795. package/.forge/worktrees/pipeline-316c6574/app/api/pipelines/route.ts +0 -90
  796. package/.forge/worktrees/pipeline-316c6574/app/api/plugins/route.ts +0 -75
  797. package/.forge/worktrees/pipeline-316c6574/app/api/preview/[...path]/route.ts +0 -64
  798. package/.forge/worktrees/pipeline-316c6574/app/api/preview/route.ts +0 -156
  799. package/.forge/worktrees/pipeline-316c6574/app/api/project-pipelines/route.ts +0 -91
  800. package/.forge/worktrees/pipeline-316c6574/app/api/project-sessions/route.ts +0 -61
  801. package/.forge/worktrees/pipeline-316c6574/app/api/projects/route.ts +0 -26
  802. package/.forge/worktrees/pipeline-316c6574/app/api/sessions/[id]/chat/route.ts +0 -64
  803. package/.forge/worktrees/pipeline-316c6574/app/api/sessions/[id]/messages/route.ts +0 -9
  804. package/.forge/worktrees/pipeline-316c6574/app/api/sessions/[id]/route.ts +0 -17
  805. package/.forge/worktrees/pipeline-316c6574/app/api/sessions/route.ts +0 -20
  806. package/.forge/worktrees/pipeline-316c6574/app/api/settings/route.ts +0 -64
  807. package/.forge/worktrees/pipeline-316c6574/app/api/skills/local/route.ts +0 -228
  808. package/.forge/worktrees/pipeline-316c6574/app/api/skills/route.ts +0 -182
  809. package/.forge/worktrees/pipeline-316c6574/app/api/smith-templates/route.ts +0 -81
  810. package/.forge/worktrees/pipeline-316c6574/app/api/status/route.ts +0 -12
  811. package/.forge/worktrees/pipeline-316c6574/app/api/tabs/route.ts +0 -25
  812. package/.forge/worktrees/pipeline-316c6574/app/api/tasks/[id]/route.ts +0 -51
  813. package/.forge/worktrees/pipeline-316c6574/app/api/tasks/[id]/stream/route.ts +0 -77
  814. package/.forge/worktrees/pipeline-316c6574/app/api/tasks/link/route.ts +0 -37
  815. package/.forge/worktrees/pipeline-316c6574/app/api/tasks/route.ts +0 -44
  816. package/.forge/worktrees/pipeline-316c6574/app/api/tasks/session/route.ts +0 -14
  817. package/.forge/worktrees/pipeline-316c6574/app/api/telegram/route.ts +0 -23
  818. package/.forge/worktrees/pipeline-316c6574/app/api/templates/route.ts +0 -6
  819. package/.forge/worktrees/pipeline-316c6574/app/api/terminal-bell/route.ts +0 -35
  820. package/.forge/worktrees/pipeline-316c6574/app/api/terminal-cwd/route.ts +0 -19
  821. package/.forge/worktrees/pipeline-316c6574/app/api/terminal-state/route.ts +0 -15
  822. package/.forge/worktrees/pipeline-316c6574/app/api/tunnel/route.ts +0 -26
  823. package/.forge/worktrees/pipeline-316c6574/app/api/upgrade/route.ts +0 -43
  824. package/.forge/worktrees/pipeline-316c6574/app/api/usage/route.ts +0 -20
  825. package/.forge/worktrees/pipeline-316c6574/app/api/version/route.ts +0 -78
  826. package/.forge/worktrees/pipeline-316c6574/app/api/watchers/route.ts +0 -33
  827. package/.forge/worktrees/pipeline-316c6574/app/api/workspace/[id]/agents/route.ts +0 -35
  828. package/.forge/worktrees/pipeline-316c6574/app/api/workspace/[id]/memory/route.ts +0 -23
  829. package/.forge/worktrees/pipeline-316c6574/app/api/workspace/[id]/smith/route.ts +0 -22
  830. package/.forge/worktrees/pipeline-316c6574/app/api/workspace/[id]/stream/route.ts +0 -28
  831. package/.forge/worktrees/pipeline-316c6574/app/api/workspace/route.ts +0 -100
  832. package/.forge/worktrees/pipeline-316c6574/app/global-error.tsx +0 -21
  833. package/.forge/worktrees/pipeline-316c6574/app/globals.css +0 -52
  834. package/.forge/worktrees/pipeline-316c6574/app/icon.ico +0 -0
  835. package/.forge/worktrees/pipeline-316c6574/app/icon.png +0 -0
  836. package/.forge/worktrees/pipeline-316c6574/app/icon.svg +0 -106
  837. package/.forge/worktrees/pipeline-316c6574/app/layout.tsx +0 -17
  838. package/.forge/worktrees/pipeline-316c6574/app/login/LoginForm.tsx +0 -96
  839. package/.forge/worktrees/pipeline-316c6574/app/login/page.tsx +0 -10
  840. package/.forge/worktrees/pipeline-316c6574/app/mobile/page.tsx +0 -9
  841. package/.forge/worktrees/pipeline-316c6574/app/page.tsx +0 -21
  842. package/.forge/worktrees/pipeline-316c6574/bin/forge-server.mjs +0 -484
  843. package/.forge/worktrees/pipeline-316c6574/check-forge-status.sh +0 -71
  844. package/.forge/worktrees/pipeline-316c6574/cli/mw.ts +0 -579
  845. package/.forge/worktrees/pipeline-316c6574/components/BrowserPanel.tsx +0 -175
  846. package/.forge/worktrees/pipeline-316c6574/components/ChatPanel.tsx +0 -191
  847. package/.forge/worktrees/pipeline-316c6574/components/ClaudeTerminal.tsx +0 -267
  848. package/.forge/worktrees/pipeline-316c6574/components/CodeViewer.tsx +0 -787
  849. package/.forge/worktrees/pipeline-316c6574/components/ConversationEditor.tsx +0 -411
  850. package/.forge/worktrees/pipeline-316c6574/components/ConversationGraphView.tsx +0 -347
  851. package/.forge/worktrees/pipeline-316c6574/components/ConversationTerminalView.tsx +0 -303
  852. package/.forge/worktrees/pipeline-316c6574/components/Dashboard.tsx +0 -807
  853. package/.forge/worktrees/pipeline-316c6574/components/DashboardWrapper.tsx +0 -9
  854. package/.forge/worktrees/pipeline-316c6574/components/DeliveryFlowEditor.tsx +0 -491
  855. package/.forge/worktrees/pipeline-316c6574/components/DeliveryList.tsx +0 -230
  856. package/.forge/worktrees/pipeline-316c6574/components/DeliveryWorkspace.tsx +0 -589
  857. package/.forge/worktrees/pipeline-316c6574/components/DocTerminal.tsx +0 -187
  858. package/.forge/worktrees/pipeline-316c6574/components/DocsViewer.tsx +0 -574
  859. package/.forge/worktrees/pipeline-316c6574/components/HelpDialog.tsx +0 -169
  860. package/.forge/worktrees/pipeline-316c6574/components/HelpTerminal.tsx +0 -141
  861. package/.forge/worktrees/pipeline-316c6574/components/InlinePipelineView.tsx +0 -111
  862. package/.forge/worktrees/pipeline-316c6574/components/LogViewer.tsx +0 -194
  863. package/.forge/worktrees/pipeline-316c6574/components/MarkdownContent.tsx +0 -73
  864. package/.forge/worktrees/pipeline-316c6574/components/MobileView.tsx +0 -385
  865. package/.forge/worktrees/pipeline-316c6574/components/MonitorPanel.tsx +0 -122
  866. package/.forge/worktrees/pipeline-316c6574/components/NewSessionModal.tsx +0 -93
  867. package/.forge/worktrees/pipeline-316c6574/components/NewTaskModal.tsx +0 -492
  868. package/.forge/worktrees/pipeline-316c6574/components/PipelineEditor.tsx +0 -570
  869. package/.forge/worktrees/pipeline-316c6574/components/PipelineView.tsx +0 -1018
  870. package/.forge/worktrees/pipeline-316c6574/components/PluginsPanel.tsx +0 -472
  871. package/.forge/worktrees/pipeline-316c6574/components/ProjectDetail.tsx +0 -1618
  872. package/.forge/worktrees/pipeline-316c6574/components/ProjectList.tsx +0 -108
  873. package/.forge/worktrees/pipeline-316c6574/components/ProjectManager.tsx +0 -401
  874. package/.forge/worktrees/pipeline-316c6574/components/SessionList.tsx +0 -74
  875. package/.forge/worktrees/pipeline-316c6574/components/SessionView.tsx +0 -726
  876. package/.forge/worktrees/pipeline-316c6574/components/SettingsModal.tsx +0 -1647
  877. package/.forge/worktrees/pipeline-316c6574/components/SkillsPanel.tsx +0 -969
  878. package/.forge/worktrees/pipeline-316c6574/components/StatusBar.tsx +0 -99
  879. package/.forge/worktrees/pipeline-316c6574/components/TabBar.tsx +0 -46
  880. package/.forge/worktrees/pipeline-316c6574/components/TaskBoard.tsx +0 -113
  881. package/.forge/worktrees/pipeline-316c6574/components/TaskDetail.tsx +0 -372
  882. package/.forge/worktrees/pipeline-316c6574/components/TerminalLauncher.tsx +0 -398
  883. package/.forge/worktrees/pipeline-316c6574/components/TunnelToggle.tsx +0 -206
  884. package/.forge/worktrees/pipeline-316c6574/components/UsagePanel.tsx +0 -207
  885. package/.forge/worktrees/pipeline-316c6574/components/WebTerminal.tsx +0 -1683
  886. package/.forge/worktrees/pipeline-316c6574/components/WorkspaceTree.tsx +0 -221
  887. package/.forge/worktrees/pipeline-316c6574/components/WorkspaceView.tsx +0 -4048
  888. package/.forge/worktrees/pipeline-316c6574/dev-test.sh +0 -5
  889. package/.forge/worktrees/pipeline-316c6574/docs/Forge_Memory_Layer_Design.docx +0 -0
  890. package/.forge/worktrees/pipeline-316c6574/docs/Forge_Strategy_Research_2026.docx +0 -0
  891. package/.forge/worktrees/pipeline-316c6574/docs/LOCAL-DEPLOY.md +0 -144
  892. package/.forge/worktrees/pipeline-316c6574/docs/roadmap-multi-agent-workflow.md +0 -330
  893. package/.forge/worktrees/pipeline-316c6574/forge-logo.png +0 -0
  894. package/.forge/worktrees/pipeline-316c6574/forge-logo.svg +0 -106
  895. package/.forge/worktrees/pipeline-316c6574/hooks/useSidebarResize.ts +0 -52
  896. package/.forge/worktrees/pipeline-316c6574/install.sh +0 -29
  897. package/.forge/worktrees/pipeline-316c6574/instrumentation.ts +0 -35
  898. package/.forge/worktrees/pipeline-316c6574/lib/agents/claude-adapter.ts +0 -104
  899. package/.forge/worktrees/pipeline-316c6574/lib/agents/generic-adapter.ts +0 -64
  900. package/.forge/worktrees/pipeline-316c6574/lib/agents/index.ts +0 -245
  901. package/.forge/worktrees/pipeline-316c6574/lib/agents/types.ts +0 -70
  902. package/.forge/worktrees/pipeline-316c6574/lib/artifacts.ts +0 -106
  903. package/.forge/worktrees/pipeline-316c6574/lib/auth.ts +0 -62
  904. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/docker.yaml +0 -70
  905. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/http.yaml +0 -66
  906. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/jenkins.yaml +0 -92
  907. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/llm-vision.yaml +0 -85
  908. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/playwright.yaml +0 -111
  909. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/shell-command.yaml +0 -60
  910. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/slack.yaml +0 -48
  911. package/.forge/worktrees/pipeline-316c6574/lib/builtin-plugins/webhook.yaml +0 -56
  912. package/.forge/worktrees/pipeline-316c6574/lib/claude-process.ts +0 -361
  913. package/.forge/worktrees/pipeline-316c6574/lib/claude-sessions.ts +0 -266
  914. package/.forge/worktrees/pipeline-316c6574/lib/claude-templates.ts +0 -227
  915. package/.forge/worktrees/pipeline-316c6574/lib/cloudflared.ts +0 -424
  916. package/.forge/worktrees/pipeline-316c6574/lib/crypto.ts +0 -67
  917. package/.forge/worktrees/pipeline-316c6574/lib/delivery.ts +0 -787
  918. package/.forge/worktrees/pipeline-316c6574/lib/dirs.ts +0 -99
  919. package/.forge/worktrees/pipeline-316c6574/lib/flows.ts +0 -86
  920. package/.forge/worktrees/pipeline-316c6574/lib/forge-mcp-server.ts +0 -717
  921. package/.forge/worktrees/pipeline-316c6574/lib/forge-skills/forge-inbox.md +0 -38
  922. package/.forge/worktrees/pipeline-316c6574/lib/forge-skills/forge-send.md +0 -47
  923. package/.forge/worktrees/pipeline-316c6574/lib/forge-skills/forge-status.md +0 -32
  924. package/.forge/worktrees/pipeline-316c6574/lib/forge-skills/forge-workspace-sync.md +0 -37
  925. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/00-overview.md +0 -40
  926. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/01-settings.md +0 -194
  927. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/02-telegram.md +0 -41
  928. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/03-tunnel.md +0 -31
  929. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/04-tasks.md +0 -52
  930. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/05-pipelines.md +0 -460
  931. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/06-skills.md +0 -43
  932. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/07-projects.md +0 -73
  933. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/08-rules.md +0 -53
  934. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/09-issue-autofix.md +0 -55
  935. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/10-troubleshooting.md +0 -89
  936. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/11-workspace.md +0 -810
  937. package/.forge/worktrees/pipeline-316c6574/lib/help-docs/CLAUDE.md +0 -62
  938. package/.forge/worktrees/pipeline-316c6574/lib/init.ts +0 -266
  939. package/.forge/worktrees/pipeline-316c6574/lib/issue-scanner.ts +0 -298
  940. package/.forge/worktrees/pipeline-316c6574/lib/logger.ts +0 -79
  941. package/.forge/worktrees/pipeline-316c6574/lib/notifications.ts +0 -75
  942. package/.forge/worktrees/pipeline-316c6574/lib/notify.ts +0 -108
  943. package/.forge/worktrees/pipeline-316c6574/lib/password.ts +0 -97
  944. package/.forge/worktrees/pipeline-316c6574/lib/pipeline-scheduler.ts +0 -373
  945. package/.forge/worktrees/pipeline-316c6574/lib/pipeline.ts +0 -1441
  946. package/.forge/worktrees/pipeline-316c6574/lib/plugins/executor.ts +0 -347
  947. package/.forge/worktrees/pipeline-316c6574/lib/plugins/registry.ts +0 -228
  948. package/.forge/worktrees/pipeline-316c6574/lib/plugins/types.ts +0 -103
  949. package/.forge/worktrees/pipeline-316c6574/lib/project-sessions.ts +0 -53
  950. package/.forge/worktrees/pipeline-316c6574/lib/projects.ts +0 -86
  951. package/.forge/worktrees/pipeline-316c6574/lib/session-manager.ts +0 -156
  952. package/.forge/worktrees/pipeline-316c6574/lib/session-utils.ts +0 -53
  953. package/.forge/worktrees/pipeline-316c6574/lib/session-watcher.ts +0 -345
  954. package/.forge/worktrees/pipeline-316c6574/lib/settings.ts +0 -195
  955. package/.forge/worktrees/pipeline-316c6574/lib/skills.ts +0 -458
  956. package/.forge/worktrees/pipeline-316c6574/lib/task-manager.ts +0 -949
  957. package/.forge/worktrees/pipeline-316c6574/lib/telegram-bot.ts +0 -1477
  958. package/.forge/worktrees/pipeline-316c6574/lib/telegram-standalone.ts +0 -83
  959. package/.forge/worktrees/pipeline-316c6574/lib/terminal-server.ts +0 -70
  960. package/.forge/worktrees/pipeline-316c6574/lib/terminal-standalone.ts +0 -421
  961. package/.forge/worktrees/pipeline-316c6574/lib/usage-scanner.ts +0 -249
  962. package/.forge/worktrees/pipeline-316c6574/lib/workspace/__tests__/state-machine.test.ts +0 -388
  963. package/.forge/worktrees/pipeline-316c6574/lib/workspace/__tests__/workspace.test.ts +0 -311
  964. package/.forge/worktrees/pipeline-316c6574/lib/workspace/agent-bus.ts +0 -416
  965. package/.forge/worktrees/pipeline-316c6574/lib/workspace/agent-worker.ts +0 -655
  966. package/.forge/worktrees/pipeline-316c6574/lib/workspace/backends/api-backend.ts +0 -262
  967. package/.forge/worktrees/pipeline-316c6574/lib/workspace/backends/cli-backend.ts +0 -491
  968. package/.forge/worktrees/pipeline-316c6574/lib/workspace/index.ts +0 -82
  969. package/.forge/worktrees/pipeline-316c6574/lib/workspace/manager.ts +0 -136
  970. package/.forge/worktrees/pipeline-316c6574/lib/workspace/orchestrator.ts +0 -3400
  971. package/.forge/worktrees/pipeline-316c6574/lib/workspace/persistence.ts +0 -309
  972. package/.forge/worktrees/pipeline-316c6574/lib/workspace/presets.ts +0 -649
  973. package/.forge/worktrees/pipeline-316c6574/lib/workspace/requests.ts +0 -287
  974. package/.forge/worktrees/pipeline-316c6574/lib/workspace/session-monitor.ts +0 -240
  975. package/.forge/worktrees/pipeline-316c6574/lib/workspace/skill-installer.ts +0 -275
  976. package/.forge/worktrees/pipeline-316c6574/lib/workspace/smith-memory.ts +0 -498
  977. package/.forge/worktrees/pipeline-316c6574/lib/workspace/types.ts +0 -241
  978. package/.forge/worktrees/pipeline-316c6574/lib/workspace/watch-manager.ts +0 -560
  979. package/.forge/worktrees/pipeline-316c6574/lib/workspace-standalone.ts +0 -911
  980. package/.forge/worktrees/pipeline-316c6574/middleware.ts +0 -51
  981. package/.forge/worktrees/pipeline-316c6574/next.config.ts +0 -26
  982. package/.forge/worktrees/pipeline-316c6574/package.json +0 -74
  983. package/.forge/worktrees/pipeline-316c6574/pnpm-lock.yaml +0 -3719
  984. package/.forge/worktrees/pipeline-316c6574/pnpm-workspace.yaml +0 -1
  985. package/.forge/worktrees/pipeline-316c6574/postcss.config.mjs +0 -7
  986. package/.forge/worktrees/pipeline-316c6574/publish.sh +0 -133
  987. package/.forge/worktrees/pipeline-316c6574/scripts/bench/README.md +0 -66
  988. package/.forge/worktrees/pipeline-316c6574/scripts/bench/results/.gitignore +0 -2
  989. package/.forge/worktrees/pipeline-316c6574/scripts/bench/run.ts +0 -635
  990. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/01-text-utils/task.md +0 -26
  991. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  992. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  993. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/02-pagination/task.md +0 -48
  994. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  995. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  996. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  997. package/.forge/worktrees/pipeline-316c6574/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  998. package/.forge/worktrees/pipeline-316c6574/scripts/verify-usage.ts +0 -178
  999. package/.forge/worktrees/pipeline-316c6574/src/config/index.ts +0 -129
  1000. package/.forge/worktrees/pipeline-316c6574/src/core/db/database.ts +0 -259
  1001. package/.forge/worktrees/pipeline-316c6574/src/core/memory/strategy.ts +0 -32
  1002. package/.forge/worktrees/pipeline-316c6574/src/core/providers/chat.ts +0 -65
  1003. package/.forge/worktrees/pipeline-316c6574/src/core/providers/registry.ts +0 -60
  1004. package/.forge/worktrees/pipeline-316c6574/src/core/session/manager.ts +0 -190
  1005. package/.forge/worktrees/pipeline-316c6574/src/types/index.ts +0 -129
  1006. package/.forge/worktrees/pipeline-316c6574/start.sh +0 -31
  1007. package/.forge/worktrees/pipeline-316c6574/templates/smith-lead.json +0 -45
  1008. package/.forge/worktrees/pipeline-316c6574/tsconfig.json +0 -42
  1009. package/.forge/worktrees/pipeline-44a94121/CLAUDE.md +0 -86
  1010. package/.forge/worktrees/pipeline-44a94121/README.md +0 -136
  1011. package/.forge/worktrees/pipeline-44a94121/RELEASE_NOTES.md +0 -11
  1012. package/.forge/worktrees/pipeline-44a94121/app/api/agents/route.ts +0 -17
  1013. package/.forge/worktrees/pipeline-44a94121/app/api/auth/[...nextauth]/route.ts +0 -3
  1014. package/.forge/worktrees/pipeline-44a94121/app/api/auth/verify/route.ts +0 -46
  1015. package/.forge/worktrees/pipeline-44a94121/app/api/claude/[id]/route.ts +0 -31
  1016. package/.forge/worktrees/pipeline-44a94121/app/api/claude/[id]/stream/route.ts +0 -63
  1017. package/.forge/worktrees/pipeline-44a94121/app/api/claude/route.ts +0 -28
  1018. package/.forge/worktrees/pipeline-44a94121/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  1019. package/.forge/worktrees/pipeline-44a94121/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  1020. package/.forge/worktrees/pipeline-44a94121/app/api/claude-sessions/[projectName]/route.ts +0 -37
  1021. package/.forge/worktrees/pipeline-44a94121/app/api/claude-sessions/sync/route.ts +0 -17
  1022. package/.forge/worktrees/pipeline-44a94121/app/api/claude-templates/route.ts +0 -145
  1023. package/.forge/worktrees/pipeline-44a94121/app/api/code/route.ts +0 -299
  1024. package/.forge/worktrees/pipeline-44a94121/app/api/delivery/[id]/route.ts +0 -62
  1025. package/.forge/worktrees/pipeline-44a94121/app/api/delivery/route.ts +0 -40
  1026. package/.forge/worktrees/pipeline-44a94121/app/api/detect-cli/route.ts +0 -46
  1027. package/.forge/worktrees/pipeline-44a94121/app/api/docs/route.ts +0 -176
  1028. package/.forge/worktrees/pipeline-44a94121/app/api/docs/sessions/route.ts +0 -54
  1029. package/.forge/worktrees/pipeline-44a94121/app/api/favorites/route.ts +0 -26
  1030. package/.forge/worktrees/pipeline-44a94121/app/api/flows/route.ts +0 -6
  1031. package/.forge/worktrees/pipeline-44a94121/app/api/flows/run/route.ts +0 -19
  1032. package/.forge/worktrees/pipeline-44a94121/app/api/git/route.ts +0 -149
  1033. package/.forge/worktrees/pipeline-44a94121/app/api/help/route.ts +0 -84
  1034. package/.forge/worktrees/pipeline-44a94121/app/api/issue-scanner/route.ts +0 -116
  1035. package/.forge/worktrees/pipeline-44a94121/app/api/logs/route.ts +0 -100
  1036. package/.forge/worktrees/pipeline-44a94121/app/api/mobile-chat/route.ts +0 -115
  1037. package/.forge/worktrees/pipeline-44a94121/app/api/monitor/route.ts +0 -74
  1038. package/.forge/worktrees/pipeline-44a94121/app/api/notifications/route.ts +0 -42
  1039. package/.forge/worktrees/pipeline-44a94121/app/api/notify/test/route.ts +0 -33
  1040. package/.forge/worktrees/pipeline-44a94121/app/api/online/route.ts +0 -40
  1041. package/.forge/worktrees/pipeline-44a94121/app/api/pipelines/[id]/route.ts +0 -41
  1042. package/.forge/worktrees/pipeline-44a94121/app/api/pipelines/route.ts +0 -90
  1043. package/.forge/worktrees/pipeline-44a94121/app/api/plugins/route.ts +0 -75
  1044. package/.forge/worktrees/pipeline-44a94121/app/api/preview/[...path]/route.ts +0 -64
  1045. package/.forge/worktrees/pipeline-44a94121/app/api/preview/route.ts +0 -156
  1046. package/.forge/worktrees/pipeline-44a94121/app/api/project-pipelines/route.ts +0 -91
  1047. package/.forge/worktrees/pipeline-44a94121/app/api/project-sessions/route.ts +0 -61
  1048. package/.forge/worktrees/pipeline-44a94121/app/api/projects/route.ts +0 -26
  1049. package/.forge/worktrees/pipeline-44a94121/app/api/sessions/[id]/chat/route.ts +0 -64
  1050. package/.forge/worktrees/pipeline-44a94121/app/api/sessions/[id]/messages/route.ts +0 -9
  1051. package/.forge/worktrees/pipeline-44a94121/app/api/sessions/[id]/route.ts +0 -17
  1052. package/.forge/worktrees/pipeline-44a94121/app/api/sessions/route.ts +0 -20
  1053. package/.forge/worktrees/pipeline-44a94121/app/api/settings/route.ts +0 -64
  1054. package/.forge/worktrees/pipeline-44a94121/app/api/skills/local/route.ts +0 -228
  1055. package/.forge/worktrees/pipeline-44a94121/app/api/skills/route.ts +0 -182
  1056. package/.forge/worktrees/pipeline-44a94121/app/api/smith-templates/route.ts +0 -81
  1057. package/.forge/worktrees/pipeline-44a94121/app/api/status/route.ts +0 -12
  1058. package/.forge/worktrees/pipeline-44a94121/app/api/tabs/route.ts +0 -25
  1059. package/.forge/worktrees/pipeline-44a94121/app/api/tasks/[id]/route.ts +0 -51
  1060. package/.forge/worktrees/pipeline-44a94121/app/api/tasks/[id]/stream/route.ts +0 -77
  1061. package/.forge/worktrees/pipeline-44a94121/app/api/tasks/link/route.ts +0 -37
  1062. package/.forge/worktrees/pipeline-44a94121/app/api/tasks/route.ts +0 -44
  1063. package/.forge/worktrees/pipeline-44a94121/app/api/tasks/session/route.ts +0 -14
  1064. package/.forge/worktrees/pipeline-44a94121/app/api/telegram/route.ts +0 -23
  1065. package/.forge/worktrees/pipeline-44a94121/app/api/templates/route.ts +0 -6
  1066. package/.forge/worktrees/pipeline-44a94121/app/api/terminal-bell/route.ts +0 -35
  1067. package/.forge/worktrees/pipeline-44a94121/app/api/terminal-cwd/route.ts +0 -19
  1068. package/.forge/worktrees/pipeline-44a94121/app/api/terminal-state/route.ts +0 -15
  1069. package/.forge/worktrees/pipeline-44a94121/app/api/tunnel/route.ts +0 -26
  1070. package/.forge/worktrees/pipeline-44a94121/app/api/upgrade/route.ts +0 -43
  1071. package/.forge/worktrees/pipeline-44a94121/app/api/usage/route.ts +0 -20
  1072. package/.forge/worktrees/pipeline-44a94121/app/api/version/route.ts +0 -78
  1073. package/.forge/worktrees/pipeline-44a94121/app/api/watchers/route.ts +0 -33
  1074. package/.forge/worktrees/pipeline-44a94121/app/api/workspace/[id]/agents/route.ts +0 -35
  1075. package/.forge/worktrees/pipeline-44a94121/app/api/workspace/[id]/memory/route.ts +0 -23
  1076. package/.forge/worktrees/pipeline-44a94121/app/api/workspace/[id]/smith/route.ts +0 -22
  1077. package/.forge/worktrees/pipeline-44a94121/app/api/workspace/[id]/stream/route.ts +0 -28
  1078. package/.forge/worktrees/pipeline-44a94121/app/api/workspace/route.ts +0 -100
  1079. package/.forge/worktrees/pipeline-44a94121/app/global-error.tsx +0 -21
  1080. package/.forge/worktrees/pipeline-44a94121/app/globals.css +0 -52
  1081. package/.forge/worktrees/pipeline-44a94121/app/icon.ico +0 -0
  1082. package/.forge/worktrees/pipeline-44a94121/app/icon.png +0 -0
  1083. package/.forge/worktrees/pipeline-44a94121/app/icon.svg +0 -106
  1084. package/.forge/worktrees/pipeline-44a94121/app/layout.tsx +0 -17
  1085. package/.forge/worktrees/pipeline-44a94121/app/login/LoginForm.tsx +0 -96
  1086. package/.forge/worktrees/pipeline-44a94121/app/login/page.tsx +0 -10
  1087. package/.forge/worktrees/pipeline-44a94121/app/mobile/page.tsx +0 -9
  1088. package/.forge/worktrees/pipeline-44a94121/app/page.tsx +0 -21
  1089. package/.forge/worktrees/pipeline-44a94121/bin/forge-server.mjs +0 -484
  1090. package/.forge/worktrees/pipeline-44a94121/check-forge-status.sh +0 -71
  1091. package/.forge/worktrees/pipeline-44a94121/cli/mw.ts +0 -579
  1092. package/.forge/worktrees/pipeline-44a94121/components/BrowserPanel.tsx +0 -175
  1093. package/.forge/worktrees/pipeline-44a94121/components/ChatPanel.tsx +0 -191
  1094. package/.forge/worktrees/pipeline-44a94121/components/ClaudeTerminal.tsx +0 -267
  1095. package/.forge/worktrees/pipeline-44a94121/components/CodeViewer.tsx +0 -787
  1096. package/.forge/worktrees/pipeline-44a94121/components/ConversationEditor.tsx +0 -411
  1097. package/.forge/worktrees/pipeline-44a94121/components/ConversationGraphView.tsx +0 -347
  1098. package/.forge/worktrees/pipeline-44a94121/components/ConversationTerminalView.tsx +0 -303
  1099. package/.forge/worktrees/pipeline-44a94121/components/Dashboard.tsx +0 -807
  1100. package/.forge/worktrees/pipeline-44a94121/components/DashboardWrapper.tsx +0 -9
  1101. package/.forge/worktrees/pipeline-44a94121/components/DeliveryFlowEditor.tsx +0 -491
  1102. package/.forge/worktrees/pipeline-44a94121/components/DeliveryList.tsx +0 -230
  1103. package/.forge/worktrees/pipeline-44a94121/components/DeliveryWorkspace.tsx +0 -589
  1104. package/.forge/worktrees/pipeline-44a94121/components/DocTerminal.tsx +0 -187
  1105. package/.forge/worktrees/pipeline-44a94121/components/DocsViewer.tsx +0 -574
  1106. package/.forge/worktrees/pipeline-44a94121/components/HelpDialog.tsx +0 -169
  1107. package/.forge/worktrees/pipeline-44a94121/components/HelpTerminal.tsx +0 -141
  1108. package/.forge/worktrees/pipeline-44a94121/components/InlinePipelineView.tsx +0 -111
  1109. package/.forge/worktrees/pipeline-44a94121/components/LogViewer.tsx +0 -194
  1110. package/.forge/worktrees/pipeline-44a94121/components/MarkdownContent.tsx +0 -73
  1111. package/.forge/worktrees/pipeline-44a94121/components/MobileView.tsx +0 -385
  1112. package/.forge/worktrees/pipeline-44a94121/components/MonitorPanel.tsx +0 -122
  1113. package/.forge/worktrees/pipeline-44a94121/components/NewSessionModal.tsx +0 -93
  1114. package/.forge/worktrees/pipeline-44a94121/components/NewTaskModal.tsx +0 -492
  1115. package/.forge/worktrees/pipeline-44a94121/components/PipelineEditor.tsx +0 -570
  1116. package/.forge/worktrees/pipeline-44a94121/components/PipelineView.tsx +0 -1018
  1117. package/.forge/worktrees/pipeline-44a94121/components/PluginsPanel.tsx +0 -472
  1118. package/.forge/worktrees/pipeline-44a94121/components/ProjectDetail.tsx +0 -1618
  1119. package/.forge/worktrees/pipeline-44a94121/components/ProjectList.tsx +0 -108
  1120. package/.forge/worktrees/pipeline-44a94121/components/ProjectManager.tsx +0 -401
  1121. package/.forge/worktrees/pipeline-44a94121/components/SessionList.tsx +0 -74
  1122. package/.forge/worktrees/pipeline-44a94121/components/SessionView.tsx +0 -726
  1123. package/.forge/worktrees/pipeline-44a94121/components/SettingsModal.tsx +0 -1647
  1124. package/.forge/worktrees/pipeline-44a94121/components/SkillsPanel.tsx +0 -969
  1125. package/.forge/worktrees/pipeline-44a94121/components/StatusBar.tsx +0 -99
  1126. package/.forge/worktrees/pipeline-44a94121/components/TabBar.tsx +0 -46
  1127. package/.forge/worktrees/pipeline-44a94121/components/TaskBoard.tsx +0 -113
  1128. package/.forge/worktrees/pipeline-44a94121/components/TaskDetail.tsx +0 -372
  1129. package/.forge/worktrees/pipeline-44a94121/components/TerminalLauncher.tsx +0 -398
  1130. package/.forge/worktrees/pipeline-44a94121/components/TunnelToggle.tsx +0 -206
  1131. package/.forge/worktrees/pipeline-44a94121/components/UsagePanel.tsx +0 -207
  1132. package/.forge/worktrees/pipeline-44a94121/components/WebTerminal.tsx +0 -1683
  1133. package/.forge/worktrees/pipeline-44a94121/components/WorkspaceTree.tsx +0 -221
  1134. package/.forge/worktrees/pipeline-44a94121/components/WorkspaceView.tsx +0 -4048
  1135. package/.forge/worktrees/pipeline-44a94121/dev-test.sh +0 -5
  1136. package/.forge/worktrees/pipeline-44a94121/docs/Forge_Memory_Layer_Design.docx +0 -0
  1137. package/.forge/worktrees/pipeline-44a94121/docs/Forge_Strategy_Research_2026.docx +0 -0
  1138. package/.forge/worktrees/pipeline-44a94121/docs/LOCAL-DEPLOY.md +0 -144
  1139. package/.forge/worktrees/pipeline-44a94121/docs/roadmap-multi-agent-workflow.md +0 -330
  1140. package/.forge/worktrees/pipeline-44a94121/forge-logo.png +0 -0
  1141. package/.forge/worktrees/pipeline-44a94121/forge-logo.svg +0 -106
  1142. package/.forge/worktrees/pipeline-44a94121/hooks/useSidebarResize.ts +0 -52
  1143. package/.forge/worktrees/pipeline-44a94121/install.sh +0 -29
  1144. package/.forge/worktrees/pipeline-44a94121/instrumentation.ts +0 -35
  1145. package/.forge/worktrees/pipeline-44a94121/lib/agents/claude-adapter.ts +0 -104
  1146. package/.forge/worktrees/pipeline-44a94121/lib/agents/generic-adapter.ts +0 -64
  1147. package/.forge/worktrees/pipeline-44a94121/lib/agents/index.ts +0 -245
  1148. package/.forge/worktrees/pipeline-44a94121/lib/agents/types.ts +0 -70
  1149. package/.forge/worktrees/pipeline-44a94121/lib/artifacts.ts +0 -106
  1150. package/.forge/worktrees/pipeline-44a94121/lib/auth.ts +0 -62
  1151. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/docker.yaml +0 -70
  1152. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/http.yaml +0 -66
  1153. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/jenkins.yaml +0 -92
  1154. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/llm-vision.yaml +0 -85
  1155. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/playwright.yaml +0 -111
  1156. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/shell-command.yaml +0 -60
  1157. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/slack.yaml +0 -48
  1158. package/.forge/worktrees/pipeline-44a94121/lib/builtin-plugins/webhook.yaml +0 -56
  1159. package/.forge/worktrees/pipeline-44a94121/lib/claude-process.ts +0 -351
  1160. package/.forge/worktrees/pipeline-44a94121/lib/claude-sessions.ts +0 -266
  1161. package/.forge/worktrees/pipeline-44a94121/lib/claude-templates.ts +0 -227
  1162. package/.forge/worktrees/pipeline-44a94121/lib/cloudflared.ts +0 -424
  1163. package/.forge/worktrees/pipeline-44a94121/lib/crypto.ts +0 -67
  1164. package/.forge/worktrees/pipeline-44a94121/lib/delivery.ts +0 -787
  1165. package/.forge/worktrees/pipeline-44a94121/lib/dirs.ts +0 -99
  1166. package/.forge/worktrees/pipeline-44a94121/lib/flows.ts +0 -86
  1167. package/.forge/worktrees/pipeline-44a94121/lib/forge-mcp-server.ts +0 -717
  1168. package/.forge/worktrees/pipeline-44a94121/lib/forge-skills/forge-inbox.md +0 -38
  1169. package/.forge/worktrees/pipeline-44a94121/lib/forge-skills/forge-send.md +0 -47
  1170. package/.forge/worktrees/pipeline-44a94121/lib/forge-skills/forge-status.md +0 -32
  1171. package/.forge/worktrees/pipeline-44a94121/lib/forge-skills/forge-workspace-sync.md +0 -37
  1172. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/00-overview.md +0 -40
  1173. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/01-settings.md +0 -194
  1174. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/02-telegram.md +0 -41
  1175. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/03-tunnel.md +0 -31
  1176. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/04-tasks.md +0 -52
  1177. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/05-pipelines.md +0 -460
  1178. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/06-skills.md +0 -43
  1179. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/07-projects.md +0 -73
  1180. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/08-rules.md +0 -53
  1181. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/09-issue-autofix.md +0 -55
  1182. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/10-troubleshooting.md +0 -89
  1183. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/11-workspace.md +0 -810
  1184. package/.forge/worktrees/pipeline-44a94121/lib/help-docs/CLAUDE.md +0 -62
  1185. package/.forge/worktrees/pipeline-44a94121/lib/init.ts +0 -266
  1186. package/.forge/worktrees/pipeline-44a94121/lib/issue-scanner.ts +0 -298
  1187. package/.forge/worktrees/pipeline-44a94121/lib/logger.ts +0 -79
  1188. package/.forge/worktrees/pipeline-44a94121/lib/notifications.ts +0 -75
  1189. package/.forge/worktrees/pipeline-44a94121/lib/notify.ts +0 -108
  1190. package/.forge/worktrees/pipeline-44a94121/lib/password.ts +0 -97
  1191. package/.forge/worktrees/pipeline-44a94121/lib/pipeline-scheduler.ts +0 -373
  1192. package/.forge/worktrees/pipeline-44a94121/lib/pipeline.ts +0 -1441
  1193. package/.forge/worktrees/pipeline-44a94121/lib/plugins/executor.ts +0 -347
  1194. package/.forge/worktrees/pipeline-44a94121/lib/plugins/registry.ts +0 -228
  1195. package/.forge/worktrees/pipeline-44a94121/lib/plugins/types.ts +0 -103
  1196. package/.forge/worktrees/pipeline-44a94121/lib/project-sessions.ts +0 -53
  1197. package/.forge/worktrees/pipeline-44a94121/lib/projects.ts +0 -86
  1198. package/.forge/worktrees/pipeline-44a94121/lib/session-manager.ts +0 -156
  1199. package/.forge/worktrees/pipeline-44a94121/lib/session-utils.ts +0 -53
  1200. package/.forge/worktrees/pipeline-44a94121/lib/session-watcher.ts +0 -345
  1201. package/.forge/worktrees/pipeline-44a94121/lib/settings.ts +0 -195
  1202. package/.forge/worktrees/pipeline-44a94121/lib/skills.ts +0 -458
  1203. package/.forge/worktrees/pipeline-44a94121/lib/task-manager.ts +0 -949
  1204. package/.forge/worktrees/pipeline-44a94121/lib/telegram-bot.ts +0 -1477
  1205. package/.forge/worktrees/pipeline-44a94121/lib/telegram-standalone.ts +0 -83
  1206. package/.forge/worktrees/pipeline-44a94121/lib/terminal-server.ts +0 -70
  1207. package/.forge/worktrees/pipeline-44a94121/lib/terminal-standalone.ts +0 -421
  1208. package/.forge/worktrees/pipeline-44a94121/lib/usage-scanner.ts +0 -249
  1209. package/.forge/worktrees/pipeline-44a94121/lib/workspace/__tests__/state-machine.test.ts +0 -388
  1210. package/.forge/worktrees/pipeline-44a94121/lib/workspace/__tests__/workspace.test.ts +0 -311
  1211. package/.forge/worktrees/pipeline-44a94121/lib/workspace/agent-bus.ts +0 -416
  1212. package/.forge/worktrees/pipeline-44a94121/lib/workspace/agent-worker.ts +0 -655
  1213. package/.forge/worktrees/pipeline-44a94121/lib/workspace/backends/api-backend.ts +0 -262
  1214. package/.forge/worktrees/pipeline-44a94121/lib/workspace/backends/cli-backend.ts +0 -491
  1215. package/.forge/worktrees/pipeline-44a94121/lib/workspace/index.ts +0 -82
  1216. package/.forge/worktrees/pipeline-44a94121/lib/workspace/manager.ts +0 -136
  1217. package/.forge/worktrees/pipeline-44a94121/lib/workspace/orchestrator.ts +0 -3400
  1218. package/.forge/worktrees/pipeline-44a94121/lib/workspace/persistence.ts +0 -309
  1219. package/.forge/worktrees/pipeline-44a94121/lib/workspace/presets.ts +0 -649
  1220. package/.forge/worktrees/pipeline-44a94121/lib/workspace/requests.ts +0 -287
  1221. package/.forge/worktrees/pipeline-44a94121/lib/workspace/session-monitor.ts +0 -240
  1222. package/.forge/worktrees/pipeline-44a94121/lib/workspace/skill-installer.ts +0 -275
  1223. package/.forge/worktrees/pipeline-44a94121/lib/workspace/smith-memory.ts +0 -498
  1224. package/.forge/worktrees/pipeline-44a94121/lib/workspace/types.ts +0 -241
  1225. package/.forge/worktrees/pipeline-44a94121/lib/workspace/watch-manager.ts +0 -560
  1226. package/.forge/worktrees/pipeline-44a94121/lib/workspace-standalone.ts +0 -911
  1227. package/.forge/worktrees/pipeline-44a94121/middleware.ts +0 -51
  1228. package/.forge/worktrees/pipeline-44a94121/next.config.ts +0 -26
  1229. package/.forge/worktrees/pipeline-44a94121/package.json +0 -74
  1230. package/.forge/worktrees/pipeline-44a94121/pnpm-lock.yaml +0 -3719
  1231. package/.forge/worktrees/pipeline-44a94121/pnpm-workspace.yaml +0 -1
  1232. package/.forge/worktrees/pipeline-44a94121/postcss.config.mjs +0 -7
  1233. package/.forge/worktrees/pipeline-44a94121/publish.sh +0 -133
  1234. package/.forge/worktrees/pipeline-44a94121/scripts/bench/README.md +0 -66
  1235. package/.forge/worktrees/pipeline-44a94121/scripts/bench/results/.gitignore +0 -2
  1236. package/.forge/worktrees/pipeline-44a94121/scripts/bench/run.ts +0 -635
  1237. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/01-text-utils/task.md +0 -26
  1238. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  1239. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  1240. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/02-pagination/task.md +0 -48
  1241. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  1242. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  1243. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  1244. package/.forge/worktrees/pipeline-44a94121/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  1245. package/.forge/worktrees/pipeline-44a94121/scripts/verify-usage.ts +0 -178
  1246. package/.forge/worktrees/pipeline-44a94121/src/config/index.ts +0 -129
  1247. package/.forge/worktrees/pipeline-44a94121/src/core/db/database.ts +0 -259
  1248. package/.forge/worktrees/pipeline-44a94121/src/core/memory/strategy.ts +0 -32
  1249. package/.forge/worktrees/pipeline-44a94121/src/core/providers/chat.ts +0 -65
  1250. package/.forge/worktrees/pipeline-44a94121/src/core/providers/registry.ts +0 -60
  1251. package/.forge/worktrees/pipeline-44a94121/src/core/session/manager.ts +0 -190
  1252. package/.forge/worktrees/pipeline-44a94121/src/types/index.ts +0 -129
  1253. package/.forge/worktrees/pipeline-44a94121/start.sh +0 -31
  1254. package/.forge/worktrees/pipeline-44a94121/templates/smith-lead.json +0 -45
  1255. package/.forge/worktrees/pipeline-44a94121/tsconfig.json +0 -42
  1256. package/.forge/worktrees/pipeline-4dd8dc2d/CLAUDE.md +0 -86
  1257. package/.forge/worktrees/pipeline-4dd8dc2d/README.md +0 -136
  1258. package/.forge/worktrees/pipeline-4dd8dc2d/RELEASE_NOTES.md +0 -36
  1259. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/agents/route.ts +0 -17
  1260. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/auth/[...nextauth]/route.ts +0 -3
  1261. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/auth/verify/route.ts +0 -46
  1262. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude/[id]/route.ts +0 -31
  1263. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude/[id]/stream/route.ts +0 -63
  1264. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude/route.ts +0 -28
  1265. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  1266. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  1267. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/[projectName]/route.ts +0 -37
  1268. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/sync/route.ts +0 -17
  1269. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-templates/route.ts +0 -145
  1270. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/code/route.ts +0 -299
  1271. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/delivery/[id]/route.ts +0 -62
  1272. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/delivery/route.ts +0 -40
  1273. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/detect-cli/route.ts +0 -46
  1274. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/docs/route.ts +0 -176
  1275. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/docs/sessions/route.ts +0 -54
  1276. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/favorites/route.ts +0 -26
  1277. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/flows/route.ts +0 -6
  1278. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/flows/run/route.ts +0 -19
  1279. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/git/route.ts +0 -149
  1280. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/help/route.ts +0 -84
  1281. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/issue-scanner/route.ts +0 -116
  1282. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/logs/route.ts +0 -100
  1283. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/mobile-chat/route.ts +0 -115
  1284. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/monitor/route.ts +0 -74
  1285. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/notifications/route.ts +0 -42
  1286. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/notify/test/route.ts +0 -33
  1287. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/online/route.ts +0 -40
  1288. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/pipelines/[id]/route.ts +0 -41
  1289. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/pipelines/route.ts +0 -90
  1290. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/plugins/route.ts +0 -75
  1291. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/preview/[...path]/route.ts +0 -64
  1292. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/preview/route.ts +0 -156
  1293. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/project-pipelines/route.ts +0 -91
  1294. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/project-sessions/route.ts +0 -61
  1295. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/projects/route.ts +0 -26
  1296. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/[id]/chat/route.ts +0 -64
  1297. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/[id]/messages/route.ts +0 -9
  1298. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/[id]/route.ts +0 -17
  1299. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/route.ts +0 -20
  1300. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/settings/route.ts +0 -64
  1301. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/skills/local/route.ts +0 -228
  1302. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/skills/route.ts +0 -182
  1303. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/smith-templates/route.ts +0 -81
  1304. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/status/route.ts +0 -12
  1305. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tabs/route.ts +0 -25
  1306. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/[id]/route.ts +0 -51
  1307. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/[id]/stream/route.ts +0 -77
  1308. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/link/route.ts +0 -37
  1309. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/route.ts +0 -44
  1310. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/session/route.ts +0 -14
  1311. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/telegram/route.ts +0 -23
  1312. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/templates/route.ts +0 -6
  1313. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/terminal-bell/route.ts +0 -39
  1314. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/terminal-cwd/route.ts +0 -19
  1315. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/terminal-state/route.ts +0 -15
  1316. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tunnel/route.ts +0 -26
  1317. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/upgrade/route.ts +0 -43
  1318. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/usage/route.ts +0 -20
  1319. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/version/route.ts +0 -78
  1320. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/watchers/route.ts +0 -33
  1321. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/agents/route.ts +0 -35
  1322. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/memory/route.ts +0 -23
  1323. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/smith/route.ts +0 -22
  1324. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/stream/route.ts +0 -31
  1325. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/route.ts +0 -79
  1326. package/.forge/worktrees/pipeline-4dd8dc2d/app/global-error.tsx +0 -21
  1327. package/.forge/worktrees/pipeline-4dd8dc2d/app/globals.css +0 -52
  1328. package/.forge/worktrees/pipeline-4dd8dc2d/app/icon.ico +0 -0
  1329. package/.forge/worktrees/pipeline-4dd8dc2d/app/icon.png +0 -0
  1330. package/.forge/worktrees/pipeline-4dd8dc2d/app/icon.svg +0 -106
  1331. package/.forge/worktrees/pipeline-4dd8dc2d/app/layout.tsx +0 -17
  1332. package/.forge/worktrees/pipeline-4dd8dc2d/app/login/LoginForm.tsx +0 -96
  1333. package/.forge/worktrees/pipeline-4dd8dc2d/app/login/page.tsx +0 -10
  1334. package/.forge/worktrees/pipeline-4dd8dc2d/app/mobile/page.tsx +0 -10
  1335. package/.forge/worktrees/pipeline-4dd8dc2d/app/page.tsx +0 -22
  1336. package/.forge/worktrees/pipeline-4dd8dc2d/bin/forge-server.mjs +0 -484
  1337. package/.forge/worktrees/pipeline-4dd8dc2d/check-forge-status.sh +0 -71
  1338. package/.forge/worktrees/pipeline-4dd8dc2d/cli/mw.ts +0 -579
  1339. package/.forge/worktrees/pipeline-4dd8dc2d/components/BrowserPanel.tsx +0 -175
  1340. package/.forge/worktrees/pipeline-4dd8dc2d/components/ChatPanel.tsx +0 -191
  1341. package/.forge/worktrees/pipeline-4dd8dc2d/components/ClaudeTerminal.tsx +0 -267
  1342. package/.forge/worktrees/pipeline-4dd8dc2d/components/CodeViewer.tsx +0 -787
  1343. package/.forge/worktrees/pipeline-4dd8dc2d/components/ConversationEditor.tsx +0 -411
  1344. package/.forge/worktrees/pipeline-4dd8dc2d/components/ConversationGraphView.tsx +0 -347
  1345. package/.forge/worktrees/pipeline-4dd8dc2d/components/ConversationTerminalView.tsx +0 -303
  1346. package/.forge/worktrees/pipeline-4dd8dc2d/components/Dashboard.tsx +0 -807
  1347. package/.forge/worktrees/pipeline-4dd8dc2d/components/DashboardWrapper.tsx +0 -9
  1348. package/.forge/worktrees/pipeline-4dd8dc2d/components/DeliveryFlowEditor.tsx +0 -491
  1349. package/.forge/worktrees/pipeline-4dd8dc2d/components/DeliveryList.tsx +0 -230
  1350. package/.forge/worktrees/pipeline-4dd8dc2d/components/DeliveryWorkspace.tsx +0 -589
  1351. package/.forge/worktrees/pipeline-4dd8dc2d/components/DocTerminal.tsx +0 -187
  1352. package/.forge/worktrees/pipeline-4dd8dc2d/components/DocsViewer.tsx +0 -574
  1353. package/.forge/worktrees/pipeline-4dd8dc2d/components/HelpDialog.tsx +0 -169
  1354. package/.forge/worktrees/pipeline-4dd8dc2d/components/HelpTerminal.tsx +0 -141
  1355. package/.forge/worktrees/pipeline-4dd8dc2d/components/InlinePipelineView.tsx +0 -111
  1356. package/.forge/worktrees/pipeline-4dd8dc2d/components/LogViewer.tsx +0 -194
  1357. package/.forge/worktrees/pipeline-4dd8dc2d/components/MarkdownContent.tsx +0 -73
  1358. package/.forge/worktrees/pipeline-4dd8dc2d/components/MobileView.tsx +0 -385
  1359. package/.forge/worktrees/pipeline-4dd8dc2d/components/MonitorPanel.tsx +0 -122
  1360. package/.forge/worktrees/pipeline-4dd8dc2d/components/NewSessionModal.tsx +0 -93
  1361. package/.forge/worktrees/pipeline-4dd8dc2d/components/NewTaskModal.tsx +0 -492
  1362. package/.forge/worktrees/pipeline-4dd8dc2d/components/PipelineEditor.tsx +0 -570
  1363. package/.forge/worktrees/pipeline-4dd8dc2d/components/PipelineView.tsx +0 -1018
  1364. package/.forge/worktrees/pipeline-4dd8dc2d/components/PluginsPanel.tsx +0 -472
  1365. package/.forge/worktrees/pipeline-4dd8dc2d/components/ProjectDetail.tsx +0 -1618
  1366. package/.forge/worktrees/pipeline-4dd8dc2d/components/ProjectList.tsx +0 -108
  1367. package/.forge/worktrees/pipeline-4dd8dc2d/components/ProjectManager.tsx +0 -401
  1368. package/.forge/worktrees/pipeline-4dd8dc2d/components/SessionList.tsx +0 -74
  1369. package/.forge/worktrees/pipeline-4dd8dc2d/components/SessionView.tsx +0 -726
  1370. package/.forge/worktrees/pipeline-4dd8dc2d/components/SettingsModal.tsx +0 -1647
  1371. package/.forge/worktrees/pipeline-4dd8dc2d/components/SkillsPanel.tsx +0 -969
  1372. package/.forge/worktrees/pipeline-4dd8dc2d/components/StatusBar.tsx +0 -99
  1373. package/.forge/worktrees/pipeline-4dd8dc2d/components/TabBar.tsx +0 -46
  1374. package/.forge/worktrees/pipeline-4dd8dc2d/components/TaskBoard.tsx +0 -113
  1375. package/.forge/worktrees/pipeline-4dd8dc2d/components/TaskDetail.tsx +0 -372
  1376. package/.forge/worktrees/pipeline-4dd8dc2d/components/TerminalLauncher.tsx +0 -398
  1377. package/.forge/worktrees/pipeline-4dd8dc2d/components/TunnelToggle.tsx +0 -206
  1378. package/.forge/worktrees/pipeline-4dd8dc2d/components/UsagePanel.tsx +0 -207
  1379. package/.forge/worktrees/pipeline-4dd8dc2d/components/WebTerminal.tsx +0 -1743
  1380. package/.forge/worktrees/pipeline-4dd8dc2d/components/WorkspaceTree.tsx +0 -221
  1381. package/.forge/worktrees/pipeline-4dd8dc2d/components/WorkspaceView.tsx +0 -4048
  1382. package/.forge/worktrees/pipeline-4dd8dc2d/dev-test.sh +0 -5
  1383. package/.forge/worktrees/pipeline-4dd8dc2d/docs/Forge_Memory_Layer_Design.docx +0 -0
  1384. package/.forge/worktrees/pipeline-4dd8dc2d/docs/Forge_Strategy_Research_2026.docx +0 -0
  1385. package/.forge/worktrees/pipeline-4dd8dc2d/docs/LOCAL-DEPLOY.md +0 -144
  1386. package/.forge/worktrees/pipeline-4dd8dc2d/docs/roadmap-multi-agent-workflow.md +0 -330
  1387. package/.forge/worktrees/pipeline-4dd8dc2d/forge-logo.png +0 -0
  1388. package/.forge/worktrees/pipeline-4dd8dc2d/forge-logo.svg +0 -106
  1389. package/.forge/worktrees/pipeline-4dd8dc2d/hooks/useSidebarResize.ts +0 -52
  1390. package/.forge/worktrees/pipeline-4dd8dc2d/install.sh +0 -29
  1391. package/.forge/worktrees/pipeline-4dd8dc2d/instrumentation.ts +0 -35
  1392. package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/claude-adapter.ts +0 -104
  1393. package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/generic-adapter.ts +0 -64
  1394. package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/index.ts +0 -245
  1395. package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/types.ts +0 -70
  1396. package/.forge/worktrees/pipeline-4dd8dc2d/lib/artifacts.ts +0 -106
  1397. package/.forge/worktrees/pipeline-4dd8dc2d/lib/auth.ts +0 -62
  1398. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/docker.yaml +0 -70
  1399. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/http.yaml +0 -66
  1400. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/jenkins.yaml +0 -92
  1401. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/llm-vision.yaml +0 -85
  1402. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/playwright.yaml +0 -111
  1403. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/shell-command.yaml +0 -60
  1404. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/slack.yaml +0 -48
  1405. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/webhook.yaml +0 -56
  1406. package/.forge/worktrees/pipeline-4dd8dc2d/lib/claude-process.ts +0 -361
  1407. package/.forge/worktrees/pipeline-4dd8dc2d/lib/claude-sessions.ts +0 -266
  1408. package/.forge/worktrees/pipeline-4dd8dc2d/lib/claude-templates.ts +0 -227
  1409. package/.forge/worktrees/pipeline-4dd8dc2d/lib/cloudflared.ts +0 -424
  1410. package/.forge/worktrees/pipeline-4dd8dc2d/lib/crypto.ts +0 -67
  1411. package/.forge/worktrees/pipeline-4dd8dc2d/lib/delivery.ts +0 -787
  1412. package/.forge/worktrees/pipeline-4dd8dc2d/lib/dirs.ts +0 -99
  1413. package/.forge/worktrees/pipeline-4dd8dc2d/lib/flows.ts +0 -86
  1414. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-mcp-server.ts +0 -732
  1415. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-inbox.md +0 -38
  1416. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-send.md +0 -47
  1417. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-status.md +0 -32
  1418. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-workspace-sync.md +0 -37
  1419. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/00-overview.md +0 -40
  1420. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/01-settings.md +0 -194
  1421. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/02-telegram.md +0 -41
  1422. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/03-tunnel.md +0 -31
  1423. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/04-tasks.md +0 -52
  1424. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/05-pipelines.md +0 -460
  1425. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/06-skills.md +0 -43
  1426. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/07-projects.md +0 -73
  1427. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/08-rules.md +0 -53
  1428. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/09-issue-autofix.md +0 -55
  1429. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/10-troubleshooting.md +0 -89
  1430. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/11-workspace.md +0 -810
  1431. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/CLAUDE.md +0 -62
  1432. package/.forge/worktrees/pipeline-4dd8dc2d/lib/init.ts +0 -266
  1433. package/.forge/worktrees/pipeline-4dd8dc2d/lib/issue-scanner.ts +0 -298
  1434. package/.forge/worktrees/pipeline-4dd8dc2d/lib/logger.ts +0 -79
  1435. package/.forge/worktrees/pipeline-4dd8dc2d/lib/notifications.ts +0 -75
  1436. package/.forge/worktrees/pipeline-4dd8dc2d/lib/notify.ts +0 -108
  1437. package/.forge/worktrees/pipeline-4dd8dc2d/lib/password.ts +0 -97
  1438. package/.forge/worktrees/pipeline-4dd8dc2d/lib/pipeline-scheduler.ts +0 -373
  1439. package/.forge/worktrees/pipeline-4dd8dc2d/lib/pipeline.ts +0 -1565
  1440. package/.forge/worktrees/pipeline-4dd8dc2d/lib/plugins/executor.ts +0 -347
  1441. package/.forge/worktrees/pipeline-4dd8dc2d/lib/plugins/registry.ts +0 -228
  1442. package/.forge/worktrees/pipeline-4dd8dc2d/lib/plugins/types.ts +0 -103
  1443. package/.forge/worktrees/pipeline-4dd8dc2d/lib/project-sessions.ts +0 -53
  1444. package/.forge/worktrees/pipeline-4dd8dc2d/lib/projects.ts +0 -86
  1445. package/.forge/worktrees/pipeline-4dd8dc2d/lib/session-manager.ts +0 -156
  1446. package/.forge/worktrees/pipeline-4dd8dc2d/lib/session-utils.ts +0 -53
  1447. package/.forge/worktrees/pipeline-4dd8dc2d/lib/session-watcher.ts +0 -345
  1448. package/.forge/worktrees/pipeline-4dd8dc2d/lib/settings.ts +0 -195
  1449. package/.forge/worktrees/pipeline-4dd8dc2d/lib/skills.ts +0 -458
  1450. package/.forge/worktrees/pipeline-4dd8dc2d/lib/task-manager.ts +0 -951
  1451. package/.forge/worktrees/pipeline-4dd8dc2d/lib/telegram-bot.ts +0 -1477
  1452. package/.forge/worktrees/pipeline-4dd8dc2d/lib/telegram-standalone.ts +0 -83
  1453. package/.forge/worktrees/pipeline-4dd8dc2d/lib/terminal-server.ts +0 -70
  1454. package/.forge/worktrees/pipeline-4dd8dc2d/lib/terminal-standalone.ts +0 -438
  1455. package/.forge/worktrees/pipeline-4dd8dc2d/lib/usage-scanner.ts +0 -249
  1456. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/__tests__/state-machine.test.ts +0 -388
  1457. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/__tests__/workspace.test.ts +0 -311
  1458. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/agent-bus.ts +0 -416
  1459. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/agent-worker.ts +0 -655
  1460. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/backends/api-backend.ts +0 -262
  1461. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/backends/cli-backend.ts +0 -491
  1462. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/index.ts +0 -84
  1463. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/manager.ts +0 -136
  1464. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/orchestrator.ts +0 -3415
  1465. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/persistence.ts +0 -309
  1466. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/presets.ts +0 -649
  1467. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/requests.ts +0 -287
  1468. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/session-monitor.ts +0 -240
  1469. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/skill-installer.ts +0 -275
  1470. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/smith-memory.ts +0 -498
  1471. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/types.ts +0 -241
  1472. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/watch-manager.ts +0 -560
  1473. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace-standalone.ts +0 -978
  1474. package/.forge/worktrees/pipeline-4dd8dc2d/middleware.ts +0 -51
  1475. package/.forge/worktrees/pipeline-4dd8dc2d/next.config.ts +0 -26
  1476. package/.forge/worktrees/pipeline-4dd8dc2d/package.json +0 -74
  1477. package/.forge/worktrees/pipeline-4dd8dc2d/pnpm-lock.yaml +0 -3719
  1478. package/.forge/worktrees/pipeline-4dd8dc2d/pnpm-workspace.yaml +0 -1
  1479. package/.forge/worktrees/pipeline-4dd8dc2d/postcss.config.mjs +0 -7
  1480. package/.forge/worktrees/pipeline-4dd8dc2d/publish.sh +0 -133
  1481. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/README.md +0 -66
  1482. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/results/.gitignore +0 -2
  1483. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/run.ts +0 -635
  1484. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/01-text-utils/task.md +0 -26
  1485. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  1486. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  1487. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/02-pagination/task.md +0 -48
  1488. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  1489. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  1490. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  1491. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  1492. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/verify-usage.ts +0 -178
  1493. package/.forge/worktrees/pipeline-4dd8dc2d/src/config/index.ts +0 -129
  1494. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/db/database.ts +0 -259
  1495. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/memory/strategy.ts +0 -32
  1496. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/providers/chat.ts +0 -65
  1497. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/providers/registry.ts +0 -60
  1498. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/session/manager.ts +0 -190
  1499. package/.forge/worktrees/pipeline-4dd8dc2d/src/types/index.ts +0 -129
  1500. package/.forge/worktrees/pipeline-4dd8dc2d/start.sh +0 -32
  1501. package/.forge/worktrees/pipeline-4dd8dc2d/templates/smith-lead.json +0 -45
  1502. package/.forge/worktrees/pipeline-4dd8dc2d/tsconfig.json +0 -42
  1503. package/.forge/worktrees/pipeline-d1757a50/CLAUDE.md +0 -86
  1504. package/.forge/worktrees/pipeline-d1757a50/README.md +0 -136
  1505. package/.forge/worktrees/pipeline-d1757a50/RELEASE_NOTES.md +0 -11
  1506. package/.forge/worktrees/pipeline-d1757a50/app/api/agents/route.ts +0 -17
  1507. package/.forge/worktrees/pipeline-d1757a50/app/api/auth/[...nextauth]/route.ts +0 -3
  1508. package/.forge/worktrees/pipeline-d1757a50/app/api/auth/verify/route.ts +0 -46
  1509. package/.forge/worktrees/pipeline-d1757a50/app/api/claude/[id]/route.ts +0 -31
  1510. package/.forge/worktrees/pipeline-d1757a50/app/api/claude/[id]/stream/route.ts +0 -63
  1511. package/.forge/worktrees/pipeline-d1757a50/app/api/claude/route.ts +0 -28
  1512. package/.forge/worktrees/pipeline-d1757a50/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  1513. package/.forge/worktrees/pipeline-d1757a50/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  1514. package/.forge/worktrees/pipeline-d1757a50/app/api/claude-sessions/[projectName]/route.ts +0 -37
  1515. package/.forge/worktrees/pipeline-d1757a50/app/api/claude-sessions/sync/route.ts +0 -17
  1516. package/.forge/worktrees/pipeline-d1757a50/app/api/claude-templates/route.ts +0 -145
  1517. package/.forge/worktrees/pipeline-d1757a50/app/api/code/route.ts +0 -299
  1518. package/.forge/worktrees/pipeline-d1757a50/app/api/delivery/[id]/route.ts +0 -62
  1519. package/.forge/worktrees/pipeline-d1757a50/app/api/delivery/route.ts +0 -40
  1520. package/.forge/worktrees/pipeline-d1757a50/app/api/detect-cli/route.ts +0 -46
  1521. package/.forge/worktrees/pipeline-d1757a50/app/api/docs/route.ts +0 -176
  1522. package/.forge/worktrees/pipeline-d1757a50/app/api/docs/sessions/route.ts +0 -54
  1523. package/.forge/worktrees/pipeline-d1757a50/app/api/favorites/route.ts +0 -26
  1524. package/.forge/worktrees/pipeline-d1757a50/app/api/flows/route.ts +0 -6
  1525. package/.forge/worktrees/pipeline-d1757a50/app/api/flows/run/route.ts +0 -19
  1526. package/.forge/worktrees/pipeline-d1757a50/app/api/git/route.ts +0 -149
  1527. package/.forge/worktrees/pipeline-d1757a50/app/api/help/route.ts +0 -84
  1528. package/.forge/worktrees/pipeline-d1757a50/app/api/issue-scanner/route.ts +0 -116
  1529. package/.forge/worktrees/pipeline-d1757a50/app/api/logs/route.ts +0 -100
  1530. package/.forge/worktrees/pipeline-d1757a50/app/api/mobile-chat/route.ts +0 -115
  1531. package/.forge/worktrees/pipeline-d1757a50/app/api/monitor/route.ts +0 -74
  1532. package/.forge/worktrees/pipeline-d1757a50/app/api/notifications/route.ts +0 -42
  1533. package/.forge/worktrees/pipeline-d1757a50/app/api/notify/test/route.ts +0 -33
  1534. package/.forge/worktrees/pipeline-d1757a50/app/api/online/route.ts +0 -40
  1535. package/.forge/worktrees/pipeline-d1757a50/app/api/pipelines/[id]/route.ts +0 -41
  1536. package/.forge/worktrees/pipeline-d1757a50/app/api/pipelines/route.ts +0 -90
  1537. package/.forge/worktrees/pipeline-d1757a50/app/api/plugins/route.ts +0 -75
  1538. package/.forge/worktrees/pipeline-d1757a50/app/api/preview/[...path]/route.ts +0 -64
  1539. package/.forge/worktrees/pipeline-d1757a50/app/api/preview/route.ts +0 -156
  1540. package/.forge/worktrees/pipeline-d1757a50/app/api/project-pipelines/route.ts +0 -91
  1541. package/.forge/worktrees/pipeline-d1757a50/app/api/project-sessions/route.ts +0 -61
  1542. package/.forge/worktrees/pipeline-d1757a50/app/api/projects/route.ts +0 -26
  1543. package/.forge/worktrees/pipeline-d1757a50/app/api/sessions/[id]/chat/route.ts +0 -64
  1544. package/.forge/worktrees/pipeline-d1757a50/app/api/sessions/[id]/messages/route.ts +0 -9
  1545. package/.forge/worktrees/pipeline-d1757a50/app/api/sessions/[id]/route.ts +0 -17
  1546. package/.forge/worktrees/pipeline-d1757a50/app/api/sessions/route.ts +0 -20
  1547. package/.forge/worktrees/pipeline-d1757a50/app/api/settings/route.ts +0 -64
  1548. package/.forge/worktrees/pipeline-d1757a50/app/api/skills/local/route.ts +0 -228
  1549. package/.forge/worktrees/pipeline-d1757a50/app/api/skills/route.ts +0 -182
  1550. package/.forge/worktrees/pipeline-d1757a50/app/api/smith-templates/route.ts +0 -81
  1551. package/.forge/worktrees/pipeline-d1757a50/app/api/status/route.ts +0 -12
  1552. package/.forge/worktrees/pipeline-d1757a50/app/api/tabs/route.ts +0 -25
  1553. package/.forge/worktrees/pipeline-d1757a50/app/api/tasks/[id]/route.ts +0 -51
  1554. package/.forge/worktrees/pipeline-d1757a50/app/api/tasks/[id]/stream/route.ts +0 -77
  1555. package/.forge/worktrees/pipeline-d1757a50/app/api/tasks/link/route.ts +0 -37
  1556. package/.forge/worktrees/pipeline-d1757a50/app/api/tasks/route.ts +0 -44
  1557. package/.forge/worktrees/pipeline-d1757a50/app/api/tasks/session/route.ts +0 -14
  1558. package/.forge/worktrees/pipeline-d1757a50/app/api/telegram/route.ts +0 -23
  1559. package/.forge/worktrees/pipeline-d1757a50/app/api/templates/route.ts +0 -6
  1560. package/.forge/worktrees/pipeline-d1757a50/app/api/terminal-bell/route.ts +0 -35
  1561. package/.forge/worktrees/pipeline-d1757a50/app/api/terminal-cwd/route.ts +0 -19
  1562. package/.forge/worktrees/pipeline-d1757a50/app/api/terminal-state/route.ts +0 -15
  1563. package/.forge/worktrees/pipeline-d1757a50/app/api/tunnel/route.ts +0 -26
  1564. package/.forge/worktrees/pipeline-d1757a50/app/api/upgrade/route.ts +0 -43
  1565. package/.forge/worktrees/pipeline-d1757a50/app/api/usage/route.ts +0 -20
  1566. package/.forge/worktrees/pipeline-d1757a50/app/api/version/route.ts +0 -78
  1567. package/.forge/worktrees/pipeline-d1757a50/app/api/watchers/route.ts +0 -33
  1568. package/.forge/worktrees/pipeline-d1757a50/app/api/workspace/[id]/agents/route.ts +0 -35
  1569. package/.forge/worktrees/pipeline-d1757a50/app/api/workspace/[id]/memory/route.ts +0 -23
  1570. package/.forge/worktrees/pipeline-d1757a50/app/api/workspace/[id]/smith/route.ts +0 -22
  1571. package/.forge/worktrees/pipeline-d1757a50/app/api/workspace/[id]/stream/route.ts +0 -28
  1572. package/.forge/worktrees/pipeline-d1757a50/app/api/workspace/route.ts +0 -100
  1573. package/.forge/worktrees/pipeline-d1757a50/app/global-error.tsx +0 -21
  1574. package/.forge/worktrees/pipeline-d1757a50/app/globals.css +0 -52
  1575. package/.forge/worktrees/pipeline-d1757a50/app/icon.ico +0 -0
  1576. package/.forge/worktrees/pipeline-d1757a50/app/icon.png +0 -0
  1577. package/.forge/worktrees/pipeline-d1757a50/app/icon.svg +0 -106
  1578. package/.forge/worktrees/pipeline-d1757a50/app/layout.tsx +0 -17
  1579. package/.forge/worktrees/pipeline-d1757a50/app/login/LoginForm.tsx +0 -96
  1580. package/.forge/worktrees/pipeline-d1757a50/app/login/page.tsx +0 -10
  1581. package/.forge/worktrees/pipeline-d1757a50/app/mobile/page.tsx +0 -9
  1582. package/.forge/worktrees/pipeline-d1757a50/app/page.tsx +0 -21
  1583. package/.forge/worktrees/pipeline-d1757a50/bin/forge-server.mjs +0 -484
  1584. package/.forge/worktrees/pipeline-d1757a50/check-forge-status.sh +0 -71
  1585. package/.forge/worktrees/pipeline-d1757a50/cli/mw.ts +0 -579
  1586. package/.forge/worktrees/pipeline-d1757a50/components/BrowserPanel.tsx +0 -175
  1587. package/.forge/worktrees/pipeline-d1757a50/components/ChatPanel.tsx +0 -191
  1588. package/.forge/worktrees/pipeline-d1757a50/components/ClaudeTerminal.tsx +0 -267
  1589. package/.forge/worktrees/pipeline-d1757a50/components/CodeViewer.tsx +0 -787
  1590. package/.forge/worktrees/pipeline-d1757a50/components/ConversationEditor.tsx +0 -411
  1591. package/.forge/worktrees/pipeline-d1757a50/components/ConversationGraphView.tsx +0 -347
  1592. package/.forge/worktrees/pipeline-d1757a50/components/ConversationTerminalView.tsx +0 -303
  1593. package/.forge/worktrees/pipeline-d1757a50/components/Dashboard.tsx +0 -807
  1594. package/.forge/worktrees/pipeline-d1757a50/components/DashboardWrapper.tsx +0 -9
  1595. package/.forge/worktrees/pipeline-d1757a50/components/DeliveryFlowEditor.tsx +0 -491
  1596. package/.forge/worktrees/pipeline-d1757a50/components/DeliveryList.tsx +0 -230
  1597. package/.forge/worktrees/pipeline-d1757a50/components/DeliveryWorkspace.tsx +0 -589
  1598. package/.forge/worktrees/pipeline-d1757a50/components/DocTerminal.tsx +0 -187
  1599. package/.forge/worktrees/pipeline-d1757a50/components/DocsViewer.tsx +0 -574
  1600. package/.forge/worktrees/pipeline-d1757a50/components/HelpDialog.tsx +0 -169
  1601. package/.forge/worktrees/pipeline-d1757a50/components/HelpTerminal.tsx +0 -141
  1602. package/.forge/worktrees/pipeline-d1757a50/components/InlinePipelineView.tsx +0 -111
  1603. package/.forge/worktrees/pipeline-d1757a50/components/LogViewer.tsx +0 -194
  1604. package/.forge/worktrees/pipeline-d1757a50/components/MarkdownContent.tsx +0 -73
  1605. package/.forge/worktrees/pipeline-d1757a50/components/MobileView.tsx +0 -385
  1606. package/.forge/worktrees/pipeline-d1757a50/components/MonitorPanel.tsx +0 -122
  1607. package/.forge/worktrees/pipeline-d1757a50/components/NewSessionModal.tsx +0 -93
  1608. package/.forge/worktrees/pipeline-d1757a50/components/NewTaskModal.tsx +0 -492
  1609. package/.forge/worktrees/pipeline-d1757a50/components/PipelineEditor.tsx +0 -570
  1610. package/.forge/worktrees/pipeline-d1757a50/components/PipelineView.tsx +0 -1018
  1611. package/.forge/worktrees/pipeline-d1757a50/components/PluginsPanel.tsx +0 -472
  1612. package/.forge/worktrees/pipeline-d1757a50/components/ProjectDetail.tsx +0 -1618
  1613. package/.forge/worktrees/pipeline-d1757a50/components/ProjectList.tsx +0 -108
  1614. package/.forge/worktrees/pipeline-d1757a50/components/ProjectManager.tsx +0 -401
  1615. package/.forge/worktrees/pipeline-d1757a50/components/SessionList.tsx +0 -74
  1616. package/.forge/worktrees/pipeline-d1757a50/components/SessionView.tsx +0 -726
  1617. package/.forge/worktrees/pipeline-d1757a50/components/SettingsModal.tsx +0 -1647
  1618. package/.forge/worktrees/pipeline-d1757a50/components/SkillsPanel.tsx +0 -969
  1619. package/.forge/worktrees/pipeline-d1757a50/components/StatusBar.tsx +0 -99
  1620. package/.forge/worktrees/pipeline-d1757a50/components/TabBar.tsx +0 -46
  1621. package/.forge/worktrees/pipeline-d1757a50/components/TaskBoard.tsx +0 -113
  1622. package/.forge/worktrees/pipeline-d1757a50/components/TaskDetail.tsx +0 -372
  1623. package/.forge/worktrees/pipeline-d1757a50/components/TerminalLauncher.tsx +0 -398
  1624. package/.forge/worktrees/pipeline-d1757a50/components/TunnelToggle.tsx +0 -206
  1625. package/.forge/worktrees/pipeline-d1757a50/components/UsagePanel.tsx +0 -207
  1626. package/.forge/worktrees/pipeline-d1757a50/components/WebTerminal.tsx +0 -1683
  1627. package/.forge/worktrees/pipeline-d1757a50/components/WorkspaceTree.tsx +0 -221
  1628. package/.forge/worktrees/pipeline-d1757a50/components/WorkspaceView.tsx +0 -4048
  1629. package/.forge/worktrees/pipeline-d1757a50/dev-test.sh +0 -5
  1630. package/.forge/worktrees/pipeline-d1757a50/docs/Forge_Memory_Layer_Design.docx +0 -0
  1631. package/.forge/worktrees/pipeline-d1757a50/docs/Forge_Strategy_Research_2026.docx +0 -0
  1632. package/.forge/worktrees/pipeline-d1757a50/docs/LOCAL-DEPLOY.md +0 -144
  1633. package/.forge/worktrees/pipeline-d1757a50/docs/roadmap-multi-agent-workflow.md +0 -330
  1634. package/.forge/worktrees/pipeline-d1757a50/forge-logo.png +0 -0
  1635. package/.forge/worktrees/pipeline-d1757a50/forge-logo.svg +0 -106
  1636. package/.forge/worktrees/pipeline-d1757a50/hooks/useSidebarResize.ts +0 -52
  1637. package/.forge/worktrees/pipeline-d1757a50/install.sh +0 -29
  1638. package/.forge/worktrees/pipeline-d1757a50/instrumentation.ts +0 -35
  1639. package/.forge/worktrees/pipeline-d1757a50/lib/agents/claude-adapter.ts +0 -104
  1640. package/.forge/worktrees/pipeline-d1757a50/lib/agents/generic-adapter.ts +0 -64
  1641. package/.forge/worktrees/pipeline-d1757a50/lib/agents/index.ts +0 -245
  1642. package/.forge/worktrees/pipeline-d1757a50/lib/agents/types.ts +0 -70
  1643. package/.forge/worktrees/pipeline-d1757a50/lib/artifacts.ts +0 -106
  1644. package/.forge/worktrees/pipeline-d1757a50/lib/auth.ts +0 -62
  1645. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/docker.yaml +0 -70
  1646. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/http.yaml +0 -66
  1647. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/jenkins.yaml +0 -92
  1648. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/llm-vision.yaml +0 -85
  1649. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/playwright.yaml +0 -111
  1650. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/shell-command.yaml +0 -60
  1651. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/slack.yaml +0 -48
  1652. package/.forge/worktrees/pipeline-d1757a50/lib/builtin-plugins/webhook.yaml +0 -56
  1653. package/.forge/worktrees/pipeline-d1757a50/lib/claude-process.ts +0 -361
  1654. package/.forge/worktrees/pipeline-d1757a50/lib/claude-sessions.ts +0 -266
  1655. package/.forge/worktrees/pipeline-d1757a50/lib/claude-templates.ts +0 -227
  1656. package/.forge/worktrees/pipeline-d1757a50/lib/cloudflared.ts +0 -424
  1657. package/.forge/worktrees/pipeline-d1757a50/lib/crypto.ts +0 -67
  1658. package/.forge/worktrees/pipeline-d1757a50/lib/delivery.ts +0 -787
  1659. package/.forge/worktrees/pipeline-d1757a50/lib/dirs.ts +0 -99
  1660. package/.forge/worktrees/pipeline-d1757a50/lib/flows.ts +0 -86
  1661. package/.forge/worktrees/pipeline-d1757a50/lib/forge-mcp-server.ts +0 -717
  1662. package/.forge/worktrees/pipeline-d1757a50/lib/forge-skills/forge-inbox.md +0 -38
  1663. package/.forge/worktrees/pipeline-d1757a50/lib/forge-skills/forge-send.md +0 -47
  1664. package/.forge/worktrees/pipeline-d1757a50/lib/forge-skills/forge-status.md +0 -32
  1665. package/.forge/worktrees/pipeline-d1757a50/lib/forge-skills/forge-workspace-sync.md +0 -37
  1666. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/00-overview.md +0 -40
  1667. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/01-settings.md +0 -194
  1668. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/02-telegram.md +0 -41
  1669. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/03-tunnel.md +0 -31
  1670. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/04-tasks.md +0 -52
  1671. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/05-pipelines.md +0 -460
  1672. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/06-skills.md +0 -43
  1673. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/07-projects.md +0 -73
  1674. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/08-rules.md +0 -53
  1675. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/09-issue-autofix.md +0 -55
  1676. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/10-troubleshooting.md +0 -89
  1677. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/11-workspace.md +0 -810
  1678. package/.forge/worktrees/pipeline-d1757a50/lib/help-docs/CLAUDE.md +0 -62
  1679. package/.forge/worktrees/pipeline-d1757a50/lib/init.ts +0 -266
  1680. package/.forge/worktrees/pipeline-d1757a50/lib/issue-scanner.ts +0 -298
  1681. package/.forge/worktrees/pipeline-d1757a50/lib/logger.ts +0 -79
  1682. package/.forge/worktrees/pipeline-d1757a50/lib/notifications.ts +0 -75
  1683. package/.forge/worktrees/pipeline-d1757a50/lib/notify.ts +0 -108
  1684. package/.forge/worktrees/pipeline-d1757a50/lib/password.ts +0 -97
  1685. package/.forge/worktrees/pipeline-d1757a50/lib/pipeline-scheduler.ts +0 -373
  1686. package/.forge/worktrees/pipeline-d1757a50/lib/pipeline.ts +0 -1441
  1687. package/.forge/worktrees/pipeline-d1757a50/lib/plugins/executor.ts +0 -347
  1688. package/.forge/worktrees/pipeline-d1757a50/lib/plugins/registry.ts +0 -228
  1689. package/.forge/worktrees/pipeline-d1757a50/lib/plugins/types.ts +0 -103
  1690. package/.forge/worktrees/pipeline-d1757a50/lib/project-sessions.ts +0 -53
  1691. package/.forge/worktrees/pipeline-d1757a50/lib/projects.ts +0 -86
  1692. package/.forge/worktrees/pipeline-d1757a50/lib/session-manager.ts +0 -156
  1693. package/.forge/worktrees/pipeline-d1757a50/lib/session-utils.ts +0 -53
  1694. package/.forge/worktrees/pipeline-d1757a50/lib/session-watcher.ts +0 -345
  1695. package/.forge/worktrees/pipeline-d1757a50/lib/settings.ts +0 -195
  1696. package/.forge/worktrees/pipeline-d1757a50/lib/skills.ts +0 -458
  1697. package/.forge/worktrees/pipeline-d1757a50/lib/task-manager.ts +0 -949
  1698. package/.forge/worktrees/pipeline-d1757a50/lib/telegram-bot.ts +0 -1477
  1699. package/.forge/worktrees/pipeline-d1757a50/lib/telegram-standalone.ts +0 -83
  1700. package/.forge/worktrees/pipeline-d1757a50/lib/terminal-server.ts +0 -70
  1701. package/.forge/worktrees/pipeline-d1757a50/lib/terminal-standalone.ts +0 -421
  1702. package/.forge/worktrees/pipeline-d1757a50/lib/usage-scanner.ts +0 -249
  1703. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/__tests__/state-machine.test.ts +0 -388
  1704. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/__tests__/workspace.test.ts +0 -311
  1705. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/agent-bus.ts +0 -416
  1706. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/agent-worker.ts +0 -655
  1707. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/backends/api-backend.ts +0 -262
  1708. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/backends/cli-backend.ts +0 -491
  1709. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/index.ts +0 -82
  1710. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/manager.ts +0 -136
  1711. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/orchestrator.ts +0 -3400
  1712. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/persistence.ts +0 -309
  1713. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/presets.ts +0 -649
  1714. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/requests.ts +0 -287
  1715. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/session-monitor.ts +0 -240
  1716. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/skill-installer.ts +0 -275
  1717. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/smith-memory.ts +0 -498
  1718. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/types.ts +0 -241
  1719. package/.forge/worktrees/pipeline-d1757a50/lib/workspace/watch-manager.ts +0 -560
  1720. package/.forge/worktrees/pipeline-d1757a50/lib/workspace-standalone.ts +0 -911
  1721. package/.forge/worktrees/pipeline-d1757a50/middleware.ts +0 -51
  1722. package/.forge/worktrees/pipeline-d1757a50/next.config.ts +0 -26
  1723. package/.forge/worktrees/pipeline-d1757a50/package.json +0 -74
  1724. package/.forge/worktrees/pipeline-d1757a50/pnpm-lock.yaml +0 -3719
  1725. package/.forge/worktrees/pipeline-d1757a50/pnpm-workspace.yaml +0 -1
  1726. package/.forge/worktrees/pipeline-d1757a50/postcss.config.mjs +0 -7
  1727. package/.forge/worktrees/pipeline-d1757a50/publish.sh +0 -133
  1728. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/README.md +0 -66
  1729. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/results/.gitignore +0 -2
  1730. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/run.ts +0 -635
  1731. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/01-text-utils/task.md +0 -26
  1732. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  1733. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  1734. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/02-pagination/task.md +0 -48
  1735. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  1736. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  1737. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  1738. package/.forge/worktrees/pipeline-d1757a50/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  1739. package/.forge/worktrees/pipeline-d1757a50/scripts/verify-usage.ts +0 -178
  1740. package/.forge/worktrees/pipeline-d1757a50/src/config/index.ts +0 -129
  1741. package/.forge/worktrees/pipeline-d1757a50/src/core/db/database.ts +0 -259
  1742. package/.forge/worktrees/pipeline-d1757a50/src/core/memory/strategy.ts +0 -32
  1743. package/.forge/worktrees/pipeline-d1757a50/src/core/providers/chat.ts +0 -65
  1744. package/.forge/worktrees/pipeline-d1757a50/src/core/providers/registry.ts +0 -60
  1745. package/.forge/worktrees/pipeline-d1757a50/src/core/session/manager.ts +0 -190
  1746. package/.forge/worktrees/pipeline-d1757a50/src/types/index.ts +0 -129
  1747. package/.forge/worktrees/pipeline-d1757a50/start.sh +0 -31
  1748. package/.forge/worktrees/pipeline-d1757a50/templates/smith-lead.json +0 -45
  1749. package/.forge/worktrees/pipeline-d1757a50/tsconfig.json +0 -42
  1750. package/.forge/worktrees/pipeline-d59c2fe2/CLAUDE.md +0 -86
  1751. package/.forge/worktrees/pipeline-d59c2fe2/README.md +0 -136
  1752. package/.forge/worktrees/pipeline-d59c2fe2/RELEASE_NOTES.md +0 -11
  1753. package/.forge/worktrees/pipeline-d59c2fe2/app/api/agents/route.ts +0 -17
  1754. package/.forge/worktrees/pipeline-d59c2fe2/app/api/auth/[...nextauth]/route.ts +0 -3
  1755. package/.forge/worktrees/pipeline-d59c2fe2/app/api/auth/verify/route.ts +0 -46
  1756. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude/[id]/route.ts +0 -31
  1757. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude/[id]/stream/route.ts +0 -63
  1758. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude/route.ts +0 -28
  1759. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  1760. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  1761. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude-sessions/[projectName]/route.ts +0 -37
  1762. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude-sessions/sync/route.ts +0 -17
  1763. package/.forge/worktrees/pipeline-d59c2fe2/app/api/claude-templates/route.ts +0 -145
  1764. package/.forge/worktrees/pipeline-d59c2fe2/app/api/code/route.ts +0 -299
  1765. package/.forge/worktrees/pipeline-d59c2fe2/app/api/delivery/[id]/route.ts +0 -62
  1766. package/.forge/worktrees/pipeline-d59c2fe2/app/api/delivery/route.ts +0 -40
  1767. package/.forge/worktrees/pipeline-d59c2fe2/app/api/detect-cli/route.ts +0 -46
  1768. package/.forge/worktrees/pipeline-d59c2fe2/app/api/docs/route.ts +0 -176
  1769. package/.forge/worktrees/pipeline-d59c2fe2/app/api/docs/sessions/route.ts +0 -54
  1770. package/.forge/worktrees/pipeline-d59c2fe2/app/api/favorites/route.ts +0 -26
  1771. package/.forge/worktrees/pipeline-d59c2fe2/app/api/flows/route.ts +0 -6
  1772. package/.forge/worktrees/pipeline-d59c2fe2/app/api/flows/run/route.ts +0 -19
  1773. package/.forge/worktrees/pipeline-d59c2fe2/app/api/git/route.ts +0 -149
  1774. package/.forge/worktrees/pipeline-d59c2fe2/app/api/help/route.ts +0 -84
  1775. package/.forge/worktrees/pipeline-d59c2fe2/app/api/issue-scanner/route.ts +0 -116
  1776. package/.forge/worktrees/pipeline-d59c2fe2/app/api/logs/route.ts +0 -100
  1777. package/.forge/worktrees/pipeline-d59c2fe2/app/api/mobile-chat/route.ts +0 -115
  1778. package/.forge/worktrees/pipeline-d59c2fe2/app/api/monitor/route.ts +0 -74
  1779. package/.forge/worktrees/pipeline-d59c2fe2/app/api/notifications/route.ts +0 -42
  1780. package/.forge/worktrees/pipeline-d59c2fe2/app/api/notify/test/route.ts +0 -33
  1781. package/.forge/worktrees/pipeline-d59c2fe2/app/api/online/route.ts +0 -40
  1782. package/.forge/worktrees/pipeline-d59c2fe2/app/api/pipelines/[id]/route.ts +0 -41
  1783. package/.forge/worktrees/pipeline-d59c2fe2/app/api/pipelines/route.ts +0 -90
  1784. package/.forge/worktrees/pipeline-d59c2fe2/app/api/plugins/route.ts +0 -75
  1785. package/.forge/worktrees/pipeline-d59c2fe2/app/api/preview/[...path]/route.ts +0 -64
  1786. package/.forge/worktrees/pipeline-d59c2fe2/app/api/preview/route.ts +0 -156
  1787. package/.forge/worktrees/pipeline-d59c2fe2/app/api/project-pipelines/route.ts +0 -91
  1788. package/.forge/worktrees/pipeline-d59c2fe2/app/api/project-sessions/route.ts +0 -61
  1789. package/.forge/worktrees/pipeline-d59c2fe2/app/api/projects/route.ts +0 -26
  1790. package/.forge/worktrees/pipeline-d59c2fe2/app/api/sessions/[id]/chat/route.ts +0 -64
  1791. package/.forge/worktrees/pipeline-d59c2fe2/app/api/sessions/[id]/messages/route.ts +0 -9
  1792. package/.forge/worktrees/pipeline-d59c2fe2/app/api/sessions/[id]/route.ts +0 -17
  1793. package/.forge/worktrees/pipeline-d59c2fe2/app/api/sessions/route.ts +0 -20
  1794. package/.forge/worktrees/pipeline-d59c2fe2/app/api/settings/route.ts +0 -64
  1795. package/.forge/worktrees/pipeline-d59c2fe2/app/api/skills/local/route.ts +0 -228
  1796. package/.forge/worktrees/pipeline-d59c2fe2/app/api/skills/route.ts +0 -182
  1797. package/.forge/worktrees/pipeline-d59c2fe2/app/api/smith-templates/route.ts +0 -81
  1798. package/.forge/worktrees/pipeline-d59c2fe2/app/api/status/route.ts +0 -12
  1799. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tabs/route.ts +0 -25
  1800. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tasks/[id]/route.ts +0 -51
  1801. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tasks/[id]/stream/route.ts +0 -77
  1802. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tasks/link/route.ts +0 -37
  1803. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tasks/route.ts +0 -44
  1804. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tasks/session/route.ts +0 -14
  1805. package/.forge/worktrees/pipeline-d59c2fe2/app/api/telegram/route.ts +0 -23
  1806. package/.forge/worktrees/pipeline-d59c2fe2/app/api/templates/route.ts +0 -6
  1807. package/.forge/worktrees/pipeline-d59c2fe2/app/api/terminal-bell/route.ts +0 -35
  1808. package/.forge/worktrees/pipeline-d59c2fe2/app/api/terminal-cwd/route.ts +0 -19
  1809. package/.forge/worktrees/pipeline-d59c2fe2/app/api/terminal-state/route.ts +0 -15
  1810. package/.forge/worktrees/pipeline-d59c2fe2/app/api/tunnel/route.ts +0 -26
  1811. package/.forge/worktrees/pipeline-d59c2fe2/app/api/upgrade/route.ts +0 -43
  1812. package/.forge/worktrees/pipeline-d59c2fe2/app/api/usage/route.ts +0 -20
  1813. package/.forge/worktrees/pipeline-d59c2fe2/app/api/version/route.ts +0 -78
  1814. package/.forge/worktrees/pipeline-d59c2fe2/app/api/watchers/route.ts +0 -33
  1815. package/.forge/worktrees/pipeline-d59c2fe2/app/api/workspace/[id]/agents/route.ts +0 -35
  1816. package/.forge/worktrees/pipeline-d59c2fe2/app/api/workspace/[id]/memory/route.ts +0 -23
  1817. package/.forge/worktrees/pipeline-d59c2fe2/app/api/workspace/[id]/smith/route.ts +0 -22
  1818. package/.forge/worktrees/pipeline-d59c2fe2/app/api/workspace/[id]/stream/route.ts +0 -28
  1819. package/.forge/worktrees/pipeline-d59c2fe2/app/api/workspace/route.ts +0 -100
  1820. package/.forge/worktrees/pipeline-d59c2fe2/app/global-error.tsx +0 -21
  1821. package/.forge/worktrees/pipeline-d59c2fe2/app/globals.css +0 -52
  1822. package/.forge/worktrees/pipeline-d59c2fe2/app/icon.ico +0 -0
  1823. package/.forge/worktrees/pipeline-d59c2fe2/app/icon.png +0 -0
  1824. package/.forge/worktrees/pipeline-d59c2fe2/app/icon.svg +0 -106
  1825. package/.forge/worktrees/pipeline-d59c2fe2/app/layout.tsx +0 -17
  1826. package/.forge/worktrees/pipeline-d59c2fe2/app/login/LoginForm.tsx +0 -96
  1827. package/.forge/worktrees/pipeline-d59c2fe2/app/login/page.tsx +0 -10
  1828. package/.forge/worktrees/pipeline-d59c2fe2/app/mobile/page.tsx +0 -9
  1829. package/.forge/worktrees/pipeline-d59c2fe2/app/page.tsx +0 -21
  1830. package/.forge/worktrees/pipeline-d59c2fe2/bin/forge-server.mjs +0 -484
  1831. package/.forge/worktrees/pipeline-d59c2fe2/check-forge-status.sh +0 -71
  1832. package/.forge/worktrees/pipeline-d59c2fe2/cli/mw.ts +0 -579
  1833. package/.forge/worktrees/pipeline-d59c2fe2/components/BrowserPanel.tsx +0 -175
  1834. package/.forge/worktrees/pipeline-d59c2fe2/components/ChatPanel.tsx +0 -191
  1835. package/.forge/worktrees/pipeline-d59c2fe2/components/ClaudeTerminal.tsx +0 -267
  1836. package/.forge/worktrees/pipeline-d59c2fe2/components/CodeViewer.tsx +0 -787
  1837. package/.forge/worktrees/pipeline-d59c2fe2/components/ConversationEditor.tsx +0 -411
  1838. package/.forge/worktrees/pipeline-d59c2fe2/components/ConversationGraphView.tsx +0 -347
  1839. package/.forge/worktrees/pipeline-d59c2fe2/components/ConversationTerminalView.tsx +0 -303
  1840. package/.forge/worktrees/pipeline-d59c2fe2/components/Dashboard.tsx +0 -807
  1841. package/.forge/worktrees/pipeline-d59c2fe2/components/DashboardWrapper.tsx +0 -9
  1842. package/.forge/worktrees/pipeline-d59c2fe2/components/DeliveryFlowEditor.tsx +0 -491
  1843. package/.forge/worktrees/pipeline-d59c2fe2/components/DeliveryList.tsx +0 -230
  1844. package/.forge/worktrees/pipeline-d59c2fe2/components/DeliveryWorkspace.tsx +0 -589
  1845. package/.forge/worktrees/pipeline-d59c2fe2/components/DocTerminal.tsx +0 -187
  1846. package/.forge/worktrees/pipeline-d59c2fe2/components/DocsViewer.tsx +0 -574
  1847. package/.forge/worktrees/pipeline-d59c2fe2/components/HelpDialog.tsx +0 -169
  1848. package/.forge/worktrees/pipeline-d59c2fe2/components/HelpTerminal.tsx +0 -141
  1849. package/.forge/worktrees/pipeline-d59c2fe2/components/InlinePipelineView.tsx +0 -111
  1850. package/.forge/worktrees/pipeline-d59c2fe2/components/LogViewer.tsx +0 -194
  1851. package/.forge/worktrees/pipeline-d59c2fe2/components/MarkdownContent.tsx +0 -73
  1852. package/.forge/worktrees/pipeline-d59c2fe2/components/MobileView.tsx +0 -385
  1853. package/.forge/worktrees/pipeline-d59c2fe2/components/MonitorPanel.tsx +0 -122
  1854. package/.forge/worktrees/pipeline-d59c2fe2/components/NewSessionModal.tsx +0 -93
  1855. package/.forge/worktrees/pipeline-d59c2fe2/components/NewTaskModal.tsx +0 -492
  1856. package/.forge/worktrees/pipeline-d59c2fe2/components/PipelineEditor.tsx +0 -570
  1857. package/.forge/worktrees/pipeline-d59c2fe2/components/PipelineView.tsx +0 -1018
  1858. package/.forge/worktrees/pipeline-d59c2fe2/components/PluginsPanel.tsx +0 -472
  1859. package/.forge/worktrees/pipeline-d59c2fe2/components/ProjectDetail.tsx +0 -1618
  1860. package/.forge/worktrees/pipeline-d59c2fe2/components/ProjectList.tsx +0 -108
  1861. package/.forge/worktrees/pipeline-d59c2fe2/components/ProjectManager.tsx +0 -401
  1862. package/.forge/worktrees/pipeline-d59c2fe2/components/SessionList.tsx +0 -74
  1863. package/.forge/worktrees/pipeline-d59c2fe2/components/SessionView.tsx +0 -726
  1864. package/.forge/worktrees/pipeline-d59c2fe2/components/SettingsModal.tsx +0 -1647
  1865. package/.forge/worktrees/pipeline-d59c2fe2/components/SkillsPanel.tsx +0 -969
  1866. package/.forge/worktrees/pipeline-d59c2fe2/components/StatusBar.tsx +0 -99
  1867. package/.forge/worktrees/pipeline-d59c2fe2/components/TabBar.tsx +0 -46
  1868. package/.forge/worktrees/pipeline-d59c2fe2/components/TaskBoard.tsx +0 -113
  1869. package/.forge/worktrees/pipeline-d59c2fe2/components/TaskDetail.tsx +0 -372
  1870. package/.forge/worktrees/pipeline-d59c2fe2/components/TerminalLauncher.tsx +0 -398
  1871. package/.forge/worktrees/pipeline-d59c2fe2/components/TunnelToggle.tsx +0 -206
  1872. package/.forge/worktrees/pipeline-d59c2fe2/components/UsagePanel.tsx +0 -207
  1873. package/.forge/worktrees/pipeline-d59c2fe2/components/WebTerminal.tsx +0 -1683
  1874. package/.forge/worktrees/pipeline-d59c2fe2/components/WorkspaceTree.tsx +0 -221
  1875. package/.forge/worktrees/pipeline-d59c2fe2/components/WorkspaceView.tsx +0 -4048
  1876. package/.forge/worktrees/pipeline-d59c2fe2/dev-test.sh +0 -5
  1877. package/.forge/worktrees/pipeline-d59c2fe2/docs/Forge_Memory_Layer_Design.docx +0 -0
  1878. package/.forge/worktrees/pipeline-d59c2fe2/docs/Forge_Strategy_Research_2026.docx +0 -0
  1879. package/.forge/worktrees/pipeline-d59c2fe2/docs/LOCAL-DEPLOY.md +0 -144
  1880. package/.forge/worktrees/pipeline-d59c2fe2/docs/roadmap-multi-agent-workflow.md +0 -330
  1881. package/.forge/worktrees/pipeline-d59c2fe2/forge-logo.png +0 -0
  1882. package/.forge/worktrees/pipeline-d59c2fe2/forge-logo.svg +0 -106
  1883. package/.forge/worktrees/pipeline-d59c2fe2/hooks/useSidebarResize.ts +0 -52
  1884. package/.forge/worktrees/pipeline-d59c2fe2/install.sh +0 -29
  1885. package/.forge/worktrees/pipeline-d59c2fe2/instrumentation.ts +0 -35
  1886. package/.forge/worktrees/pipeline-d59c2fe2/lib/agents/claude-adapter.ts +0 -104
  1887. package/.forge/worktrees/pipeline-d59c2fe2/lib/agents/generic-adapter.ts +0 -64
  1888. package/.forge/worktrees/pipeline-d59c2fe2/lib/agents/index.ts +0 -245
  1889. package/.forge/worktrees/pipeline-d59c2fe2/lib/agents/types.ts +0 -70
  1890. package/.forge/worktrees/pipeline-d59c2fe2/lib/artifacts.ts +0 -106
  1891. package/.forge/worktrees/pipeline-d59c2fe2/lib/auth.ts +0 -62
  1892. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/docker.yaml +0 -70
  1893. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/http.yaml +0 -66
  1894. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/jenkins.yaml +0 -92
  1895. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/llm-vision.yaml +0 -85
  1896. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/playwright.yaml +0 -111
  1897. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/shell-command.yaml +0 -60
  1898. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/slack.yaml +0 -48
  1899. package/.forge/worktrees/pipeline-d59c2fe2/lib/builtin-plugins/webhook.yaml +0 -56
  1900. package/.forge/worktrees/pipeline-d59c2fe2/lib/claude-process.ts +0 -361
  1901. package/.forge/worktrees/pipeline-d59c2fe2/lib/claude-sessions.ts +0 -266
  1902. package/.forge/worktrees/pipeline-d59c2fe2/lib/claude-templates.ts +0 -227
  1903. package/.forge/worktrees/pipeline-d59c2fe2/lib/cloudflared.ts +0 -424
  1904. package/.forge/worktrees/pipeline-d59c2fe2/lib/crypto.ts +0 -67
  1905. package/.forge/worktrees/pipeline-d59c2fe2/lib/delivery.ts +0 -787
  1906. package/.forge/worktrees/pipeline-d59c2fe2/lib/dirs.ts +0 -99
  1907. package/.forge/worktrees/pipeline-d59c2fe2/lib/flows.ts +0 -86
  1908. package/.forge/worktrees/pipeline-d59c2fe2/lib/forge-mcp-server.ts +0 -717
  1909. package/.forge/worktrees/pipeline-d59c2fe2/lib/forge-skills/forge-inbox.md +0 -38
  1910. package/.forge/worktrees/pipeline-d59c2fe2/lib/forge-skills/forge-send.md +0 -47
  1911. package/.forge/worktrees/pipeline-d59c2fe2/lib/forge-skills/forge-status.md +0 -32
  1912. package/.forge/worktrees/pipeline-d59c2fe2/lib/forge-skills/forge-workspace-sync.md +0 -37
  1913. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/00-overview.md +0 -40
  1914. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/01-settings.md +0 -194
  1915. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/02-telegram.md +0 -41
  1916. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/03-tunnel.md +0 -31
  1917. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/04-tasks.md +0 -52
  1918. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/05-pipelines.md +0 -460
  1919. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/06-skills.md +0 -43
  1920. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/07-projects.md +0 -73
  1921. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/08-rules.md +0 -53
  1922. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/09-issue-autofix.md +0 -55
  1923. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/10-troubleshooting.md +0 -89
  1924. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/11-workspace.md +0 -810
  1925. package/.forge/worktrees/pipeline-d59c2fe2/lib/help-docs/CLAUDE.md +0 -62
  1926. package/.forge/worktrees/pipeline-d59c2fe2/lib/init.ts +0 -266
  1927. package/.forge/worktrees/pipeline-d59c2fe2/lib/issue-scanner.ts +0 -298
  1928. package/.forge/worktrees/pipeline-d59c2fe2/lib/logger.ts +0 -79
  1929. package/.forge/worktrees/pipeline-d59c2fe2/lib/notifications.ts +0 -75
  1930. package/.forge/worktrees/pipeline-d59c2fe2/lib/notify.ts +0 -108
  1931. package/.forge/worktrees/pipeline-d59c2fe2/lib/password.ts +0 -97
  1932. package/.forge/worktrees/pipeline-d59c2fe2/lib/pipeline-scheduler.ts +0 -373
  1933. package/.forge/worktrees/pipeline-d59c2fe2/lib/pipeline.ts +0 -1441
  1934. package/.forge/worktrees/pipeline-d59c2fe2/lib/plugins/executor.ts +0 -347
  1935. package/.forge/worktrees/pipeline-d59c2fe2/lib/plugins/registry.ts +0 -228
  1936. package/.forge/worktrees/pipeline-d59c2fe2/lib/plugins/types.ts +0 -103
  1937. package/.forge/worktrees/pipeline-d59c2fe2/lib/project-sessions.ts +0 -53
  1938. package/.forge/worktrees/pipeline-d59c2fe2/lib/projects.ts +0 -86
  1939. package/.forge/worktrees/pipeline-d59c2fe2/lib/session-manager.ts +0 -156
  1940. package/.forge/worktrees/pipeline-d59c2fe2/lib/session-utils.ts +0 -53
  1941. package/.forge/worktrees/pipeline-d59c2fe2/lib/session-watcher.ts +0 -345
  1942. package/.forge/worktrees/pipeline-d59c2fe2/lib/settings.ts +0 -195
  1943. package/.forge/worktrees/pipeline-d59c2fe2/lib/skills.ts +0 -458
  1944. package/.forge/worktrees/pipeline-d59c2fe2/lib/task-manager.ts +0 -949
  1945. package/.forge/worktrees/pipeline-d59c2fe2/lib/telegram-bot.ts +0 -1477
  1946. package/.forge/worktrees/pipeline-d59c2fe2/lib/telegram-standalone.ts +0 -83
  1947. package/.forge/worktrees/pipeline-d59c2fe2/lib/terminal-server.ts +0 -70
  1948. package/.forge/worktrees/pipeline-d59c2fe2/lib/terminal-standalone.ts +0 -421
  1949. package/.forge/worktrees/pipeline-d59c2fe2/lib/usage-scanner.ts +0 -249
  1950. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/__tests__/state-machine.test.ts +0 -388
  1951. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/__tests__/workspace.test.ts +0 -311
  1952. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/agent-bus.ts +0 -416
  1953. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/agent-worker.ts +0 -655
  1954. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/backends/api-backend.ts +0 -262
  1955. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/backends/cli-backend.ts +0 -491
  1956. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/index.ts +0 -82
  1957. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/manager.ts +0 -136
  1958. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/orchestrator.ts +0 -3400
  1959. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/persistence.ts +0 -309
  1960. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/presets.ts +0 -649
  1961. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/requests.ts +0 -287
  1962. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/session-monitor.ts +0 -240
  1963. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/skill-installer.ts +0 -275
  1964. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/smith-memory.ts +0 -498
  1965. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/types.ts +0 -241
  1966. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace/watch-manager.ts +0 -560
  1967. package/.forge/worktrees/pipeline-d59c2fe2/lib/workspace-standalone.ts +0 -911
  1968. package/.forge/worktrees/pipeline-d59c2fe2/middleware.ts +0 -51
  1969. package/.forge/worktrees/pipeline-d59c2fe2/next.config.ts +0 -26
  1970. package/.forge/worktrees/pipeline-d59c2fe2/package.json +0 -74
  1971. package/.forge/worktrees/pipeline-d59c2fe2/pnpm-lock.yaml +0 -3719
  1972. package/.forge/worktrees/pipeline-d59c2fe2/pnpm-workspace.yaml +0 -1
  1973. package/.forge/worktrees/pipeline-d59c2fe2/postcss.config.mjs +0 -7
  1974. package/.forge/worktrees/pipeline-d59c2fe2/publish.sh +0 -133
  1975. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/README.md +0 -66
  1976. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/results/.gitignore +0 -2
  1977. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/run.ts +0 -635
  1978. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/01-text-utils/task.md +0 -26
  1979. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  1980. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  1981. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/02-pagination/task.md +0 -48
  1982. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  1983. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  1984. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  1985. package/.forge/worktrees/pipeline-d59c2fe2/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  1986. package/.forge/worktrees/pipeline-d59c2fe2/scripts/verify-usage.ts +0 -178
  1987. package/.forge/worktrees/pipeline-d59c2fe2/src/config/index.ts +0 -129
  1988. package/.forge/worktrees/pipeline-d59c2fe2/src/core/db/database.ts +0 -259
  1989. package/.forge/worktrees/pipeline-d59c2fe2/src/core/memory/strategy.ts +0 -32
  1990. package/.forge/worktrees/pipeline-d59c2fe2/src/core/providers/chat.ts +0 -65
  1991. package/.forge/worktrees/pipeline-d59c2fe2/src/core/providers/registry.ts +0 -60
  1992. package/.forge/worktrees/pipeline-d59c2fe2/src/core/session/manager.ts +0 -190
  1993. package/.forge/worktrees/pipeline-d59c2fe2/src/types/index.ts +0 -129
  1994. package/.forge/worktrees/pipeline-d59c2fe2/start.sh +0 -31
  1995. package/.forge/worktrees/pipeline-d59c2fe2/templates/smith-lead.json +0 -45
  1996. package/.forge/worktrees/pipeline-d59c2fe2/tsconfig.json +0 -42
  1997. package/.forge/worktrees/pipeline-d6a6ef23/CLAUDE.md +0 -86
  1998. package/.forge/worktrees/pipeline-d6a6ef23/README.md +0 -136
  1999. package/.forge/worktrees/pipeline-d6a6ef23/RELEASE_NOTES.md +0 -11
  2000. package/.forge/worktrees/pipeline-d6a6ef23/app/api/agents/route.ts +0 -17
  2001. package/.forge/worktrees/pipeline-d6a6ef23/app/api/auth/[...nextauth]/route.ts +0 -3
  2002. package/.forge/worktrees/pipeline-d6a6ef23/app/api/auth/verify/route.ts +0 -46
  2003. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude/[id]/route.ts +0 -31
  2004. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude/[id]/stream/route.ts +0 -63
  2005. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude/route.ts +0 -28
  2006. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  2007. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  2008. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude-sessions/[projectName]/route.ts +0 -37
  2009. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude-sessions/sync/route.ts +0 -17
  2010. package/.forge/worktrees/pipeline-d6a6ef23/app/api/claude-templates/route.ts +0 -145
  2011. package/.forge/worktrees/pipeline-d6a6ef23/app/api/code/route.ts +0 -299
  2012. package/.forge/worktrees/pipeline-d6a6ef23/app/api/delivery/[id]/route.ts +0 -62
  2013. package/.forge/worktrees/pipeline-d6a6ef23/app/api/delivery/route.ts +0 -40
  2014. package/.forge/worktrees/pipeline-d6a6ef23/app/api/detect-cli/route.ts +0 -46
  2015. package/.forge/worktrees/pipeline-d6a6ef23/app/api/docs/route.ts +0 -176
  2016. package/.forge/worktrees/pipeline-d6a6ef23/app/api/docs/sessions/route.ts +0 -54
  2017. package/.forge/worktrees/pipeline-d6a6ef23/app/api/favorites/route.ts +0 -26
  2018. package/.forge/worktrees/pipeline-d6a6ef23/app/api/flows/route.ts +0 -6
  2019. package/.forge/worktrees/pipeline-d6a6ef23/app/api/flows/run/route.ts +0 -19
  2020. package/.forge/worktrees/pipeline-d6a6ef23/app/api/git/route.ts +0 -149
  2021. package/.forge/worktrees/pipeline-d6a6ef23/app/api/help/route.ts +0 -84
  2022. package/.forge/worktrees/pipeline-d6a6ef23/app/api/issue-scanner/route.ts +0 -116
  2023. package/.forge/worktrees/pipeline-d6a6ef23/app/api/logs/route.ts +0 -100
  2024. package/.forge/worktrees/pipeline-d6a6ef23/app/api/mobile-chat/route.ts +0 -115
  2025. package/.forge/worktrees/pipeline-d6a6ef23/app/api/monitor/route.ts +0 -74
  2026. package/.forge/worktrees/pipeline-d6a6ef23/app/api/notifications/route.ts +0 -42
  2027. package/.forge/worktrees/pipeline-d6a6ef23/app/api/notify/test/route.ts +0 -33
  2028. package/.forge/worktrees/pipeline-d6a6ef23/app/api/online/route.ts +0 -40
  2029. package/.forge/worktrees/pipeline-d6a6ef23/app/api/pipelines/[id]/route.ts +0 -41
  2030. package/.forge/worktrees/pipeline-d6a6ef23/app/api/pipelines/route.ts +0 -90
  2031. package/.forge/worktrees/pipeline-d6a6ef23/app/api/plugins/route.ts +0 -75
  2032. package/.forge/worktrees/pipeline-d6a6ef23/app/api/preview/[...path]/route.ts +0 -64
  2033. package/.forge/worktrees/pipeline-d6a6ef23/app/api/preview/route.ts +0 -156
  2034. package/.forge/worktrees/pipeline-d6a6ef23/app/api/project-pipelines/route.ts +0 -91
  2035. package/.forge/worktrees/pipeline-d6a6ef23/app/api/project-sessions/route.ts +0 -61
  2036. package/.forge/worktrees/pipeline-d6a6ef23/app/api/projects/route.ts +0 -26
  2037. package/.forge/worktrees/pipeline-d6a6ef23/app/api/sessions/[id]/chat/route.ts +0 -64
  2038. package/.forge/worktrees/pipeline-d6a6ef23/app/api/sessions/[id]/messages/route.ts +0 -9
  2039. package/.forge/worktrees/pipeline-d6a6ef23/app/api/sessions/[id]/route.ts +0 -17
  2040. package/.forge/worktrees/pipeline-d6a6ef23/app/api/sessions/route.ts +0 -20
  2041. package/.forge/worktrees/pipeline-d6a6ef23/app/api/settings/route.ts +0 -64
  2042. package/.forge/worktrees/pipeline-d6a6ef23/app/api/skills/local/route.ts +0 -228
  2043. package/.forge/worktrees/pipeline-d6a6ef23/app/api/skills/route.ts +0 -182
  2044. package/.forge/worktrees/pipeline-d6a6ef23/app/api/smith-templates/route.ts +0 -81
  2045. package/.forge/worktrees/pipeline-d6a6ef23/app/api/status/route.ts +0 -12
  2046. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tabs/route.ts +0 -25
  2047. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tasks/[id]/route.ts +0 -51
  2048. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tasks/[id]/stream/route.ts +0 -77
  2049. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tasks/link/route.ts +0 -37
  2050. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tasks/route.ts +0 -44
  2051. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tasks/session/route.ts +0 -14
  2052. package/.forge/worktrees/pipeline-d6a6ef23/app/api/telegram/route.ts +0 -23
  2053. package/.forge/worktrees/pipeline-d6a6ef23/app/api/templates/route.ts +0 -6
  2054. package/.forge/worktrees/pipeline-d6a6ef23/app/api/terminal-bell/route.ts +0 -35
  2055. package/.forge/worktrees/pipeline-d6a6ef23/app/api/terminal-cwd/route.ts +0 -19
  2056. package/.forge/worktrees/pipeline-d6a6ef23/app/api/terminal-state/route.ts +0 -15
  2057. package/.forge/worktrees/pipeline-d6a6ef23/app/api/tunnel/route.ts +0 -26
  2058. package/.forge/worktrees/pipeline-d6a6ef23/app/api/upgrade/route.ts +0 -43
  2059. package/.forge/worktrees/pipeline-d6a6ef23/app/api/usage/route.ts +0 -20
  2060. package/.forge/worktrees/pipeline-d6a6ef23/app/api/version/route.ts +0 -78
  2061. package/.forge/worktrees/pipeline-d6a6ef23/app/api/watchers/route.ts +0 -33
  2062. package/.forge/worktrees/pipeline-d6a6ef23/app/api/workspace/[id]/agents/route.ts +0 -35
  2063. package/.forge/worktrees/pipeline-d6a6ef23/app/api/workspace/[id]/memory/route.ts +0 -23
  2064. package/.forge/worktrees/pipeline-d6a6ef23/app/api/workspace/[id]/smith/route.ts +0 -22
  2065. package/.forge/worktrees/pipeline-d6a6ef23/app/api/workspace/[id]/stream/route.ts +0 -28
  2066. package/.forge/worktrees/pipeline-d6a6ef23/app/api/workspace/route.ts +0 -100
  2067. package/.forge/worktrees/pipeline-d6a6ef23/app/global-error.tsx +0 -21
  2068. package/.forge/worktrees/pipeline-d6a6ef23/app/globals.css +0 -52
  2069. package/.forge/worktrees/pipeline-d6a6ef23/app/icon.ico +0 -0
  2070. package/.forge/worktrees/pipeline-d6a6ef23/app/icon.png +0 -0
  2071. package/.forge/worktrees/pipeline-d6a6ef23/app/icon.svg +0 -106
  2072. package/.forge/worktrees/pipeline-d6a6ef23/app/layout.tsx +0 -17
  2073. package/.forge/worktrees/pipeline-d6a6ef23/app/login/LoginForm.tsx +0 -96
  2074. package/.forge/worktrees/pipeline-d6a6ef23/app/login/page.tsx +0 -10
  2075. package/.forge/worktrees/pipeline-d6a6ef23/app/mobile/page.tsx +0 -9
  2076. package/.forge/worktrees/pipeline-d6a6ef23/app/page.tsx +0 -21
  2077. package/.forge/worktrees/pipeline-d6a6ef23/bin/forge-server.mjs +0 -484
  2078. package/.forge/worktrees/pipeline-d6a6ef23/check-forge-status.sh +0 -71
  2079. package/.forge/worktrees/pipeline-d6a6ef23/cli/mw.ts +0 -579
  2080. package/.forge/worktrees/pipeline-d6a6ef23/components/BrowserPanel.tsx +0 -175
  2081. package/.forge/worktrees/pipeline-d6a6ef23/components/ChatPanel.tsx +0 -191
  2082. package/.forge/worktrees/pipeline-d6a6ef23/components/ClaudeTerminal.tsx +0 -267
  2083. package/.forge/worktrees/pipeline-d6a6ef23/components/CodeViewer.tsx +0 -787
  2084. package/.forge/worktrees/pipeline-d6a6ef23/components/ConversationEditor.tsx +0 -411
  2085. package/.forge/worktrees/pipeline-d6a6ef23/components/ConversationGraphView.tsx +0 -347
  2086. package/.forge/worktrees/pipeline-d6a6ef23/components/ConversationTerminalView.tsx +0 -303
  2087. package/.forge/worktrees/pipeline-d6a6ef23/components/Dashboard.tsx +0 -807
  2088. package/.forge/worktrees/pipeline-d6a6ef23/components/DashboardWrapper.tsx +0 -9
  2089. package/.forge/worktrees/pipeline-d6a6ef23/components/DeliveryFlowEditor.tsx +0 -491
  2090. package/.forge/worktrees/pipeline-d6a6ef23/components/DeliveryList.tsx +0 -230
  2091. package/.forge/worktrees/pipeline-d6a6ef23/components/DeliveryWorkspace.tsx +0 -589
  2092. package/.forge/worktrees/pipeline-d6a6ef23/components/DocTerminal.tsx +0 -187
  2093. package/.forge/worktrees/pipeline-d6a6ef23/components/DocsViewer.tsx +0 -574
  2094. package/.forge/worktrees/pipeline-d6a6ef23/components/HelpDialog.tsx +0 -169
  2095. package/.forge/worktrees/pipeline-d6a6ef23/components/HelpTerminal.tsx +0 -141
  2096. package/.forge/worktrees/pipeline-d6a6ef23/components/InlinePipelineView.tsx +0 -111
  2097. package/.forge/worktrees/pipeline-d6a6ef23/components/LogViewer.tsx +0 -194
  2098. package/.forge/worktrees/pipeline-d6a6ef23/components/MarkdownContent.tsx +0 -73
  2099. package/.forge/worktrees/pipeline-d6a6ef23/components/MobileView.tsx +0 -385
  2100. package/.forge/worktrees/pipeline-d6a6ef23/components/MonitorPanel.tsx +0 -122
  2101. package/.forge/worktrees/pipeline-d6a6ef23/components/NewSessionModal.tsx +0 -93
  2102. package/.forge/worktrees/pipeline-d6a6ef23/components/NewTaskModal.tsx +0 -492
  2103. package/.forge/worktrees/pipeline-d6a6ef23/components/PipelineEditor.tsx +0 -570
  2104. package/.forge/worktrees/pipeline-d6a6ef23/components/PipelineView.tsx +0 -1018
  2105. package/.forge/worktrees/pipeline-d6a6ef23/components/PluginsPanel.tsx +0 -472
  2106. package/.forge/worktrees/pipeline-d6a6ef23/components/ProjectDetail.tsx +0 -1618
  2107. package/.forge/worktrees/pipeline-d6a6ef23/components/ProjectList.tsx +0 -108
  2108. package/.forge/worktrees/pipeline-d6a6ef23/components/ProjectManager.tsx +0 -401
  2109. package/.forge/worktrees/pipeline-d6a6ef23/components/SessionList.tsx +0 -74
  2110. package/.forge/worktrees/pipeline-d6a6ef23/components/SessionView.tsx +0 -726
  2111. package/.forge/worktrees/pipeline-d6a6ef23/components/SettingsModal.tsx +0 -1647
  2112. package/.forge/worktrees/pipeline-d6a6ef23/components/SkillsPanel.tsx +0 -969
  2113. package/.forge/worktrees/pipeline-d6a6ef23/components/StatusBar.tsx +0 -99
  2114. package/.forge/worktrees/pipeline-d6a6ef23/components/TabBar.tsx +0 -46
  2115. package/.forge/worktrees/pipeline-d6a6ef23/components/TaskBoard.tsx +0 -113
  2116. package/.forge/worktrees/pipeline-d6a6ef23/components/TaskDetail.tsx +0 -372
  2117. package/.forge/worktrees/pipeline-d6a6ef23/components/TerminalLauncher.tsx +0 -398
  2118. package/.forge/worktrees/pipeline-d6a6ef23/components/TunnelToggle.tsx +0 -206
  2119. package/.forge/worktrees/pipeline-d6a6ef23/components/UsagePanel.tsx +0 -207
  2120. package/.forge/worktrees/pipeline-d6a6ef23/components/WebTerminal.tsx +0 -1683
  2121. package/.forge/worktrees/pipeline-d6a6ef23/components/WorkspaceTree.tsx +0 -221
  2122. package/.forge/worktrees/pipeline-d6a6ef23/components/WorkspaceView.tsx +0 -4048
  2123. package/.forge/worktrees/pipeline-d6a6ef23/dev-test.sh +0 -5
  2124. package/.forge/worktrees/pipeline-d6a6ef23/docs/Forge_Memory_Layer_Design.docx +0 -0
  2125. package/.forge/worktrees/pipeline-d6a6ef23/docs/Forge_Strategy_Research_2026.docx +0 -0
  2126. package/.forge/worktrees/pipeline-d6a6ef23/docs/LOCAL-DEPLOY.md +0 -144
  2127. package/.forge/worktrees/pipeline-d6a6ef23/docs/roadmap-multi-agent-workflow.md +0 -330
  2128. package/.forge/worktrees/pipeline-d6a6ef23/forge-logo.png +0 -0
  2129. package/.forge/worktrees/pipeline-d6a6ef23/forge-logo.svg +0 -106
  2130. package/.forge/worktrees/pipeline-d6a6ef23/hooks/useSidebarResize.ts +0 -52
  2131. package/.forge/worktrees/pipeline-d6a6ef23/install.sh +0 -29
  2132. package/.forge/worktrees/pipeline-d6a6ef23/instrumentation.ts +0 -35
  2133. package/.forge/worktrees/pipeline-d6a6ef23/lib/agents/claude-adapter.ts +0 -104
  2134. package/.forge/worktrees/pipeline-d6a6ef23/lib/agents/generic-adapter.ts +0 -64
  2135. package/.forge/worktrees/pipeline-d6a6ef23/lib/agents/index.ts +0 -245
  2136. package/.forge/worktrees/pipeline-d6a6ef23/lib/agents/types.ts +0 -70
  2137. package/.forge/worktrees/pipeline-d6a6ef23/lib/artifacts.ts +0 -106
  2138. package/.forge/worktrees/pipeline-d6a6ef23/lib/auth.ts +0 -62
  2139. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/docker.yaml +0 -70
  2140. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/http.yaml +0 -66
  2141. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/jenkins.yaml +0 -92
  2142. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/llm-vision.yaml +0 -85
  2143. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/playwright.yaml +0 -111
  2144. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/shell-command.yaml +0 -60
  2145. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/slack.yaml +0 -48
  2146. package/.forge/worktrees/pipeline-d6a6ef23/lib/builtin-plugins/webhook.yaml +0 -56
  2147. package/.forge/worktrees/pipeline-d6a6ef23/lib/claude-process.ts +0 -352
  2148. package/.forge/worktrees/pipeline-d6a6ef23/lib/claude-sessions.ts +0 -266
  2149. package/.forge/worktrees/pipeline-d6a6ef23/lib/claude-templates.ts +0 -227
  2150. package/.forge/worktrees/pipeline-d6a6ef23/lib/cloudflared.ts +0 -424
  2151. package/.forge/worktrees/pipeline-d6a6ef23/lib/crypto.ts +0 -67
  2152. package/.forge/worktrees/pipeline-d6a6ef23/lib/delivery.ts +0 -787
  2153. package/.forge/worktrees/pipeline-d6a6ef23/lib/dirs.ts +0 -99
  2154. package/.forge/worktrees/pipeline-d6a6ef23/lib/flows.ts +0 -86
  2155. package/.forge/worktrees/pipeline-d6a6ef23/lib/forge-mcp-server.ts +0 -717
  2156. package/.forge/worktrees/pipeline-d6a6ef23/lib/forge-skills/forge-inbox.md +0 -38
  2157. package/.forge/worktrees/pipeline-d6a6ef23/lib/forge-skills/forge-send.md +0 -47
  2158. package/.forge/worktrees/pipeline-d6a6ef23/lib/forge-skills/forge-status.md +0 -32
  2159. package/.forge/worktrees/pipeline-d6a6ef23/lib/forge-skills/forge-workspace-sync.md +0 -37
  2160. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/00-overview.md +0 -40
  2161. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/01-settings.md +0 -194
  2162. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/02-telegram.md +0 -41
  2163. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/03-tunnel.md +0 -31
  2164. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/04-tasks.md +0 -52
  2165. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/05-pipelines.md +0 -460
  2166. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/06-skills.md +0 -43
  2167. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/07-projects.md +0 -73
  2168. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/08-rules.md +0 -53
  2169. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/09-issue-autofix.md +0 -55
  2170. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/10-troubleshooting.md +0 -89
  2171. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/11-workspace.md +0 -810
  2172. package/.forge/worktrees/pipeline-d6a6ef23/lib/help-docs/CLAUDE.md +0 -62
  2173. package/.forge/worktrees/pipeline-d6a6ef23/lib/init.ts +0 -266
  2174. package/.forge/worktrees/pipeline-d6a6ef23/lib/issue-scanner.ts +0 -298
  2175. package/.forge/worktrees/pipeline-d6a6ef23/lib/logger.ts +0 -79
  2176. package/.forge/worktrees/pipeline-d6a6ef23/lib/notifications.ts +0 -75
  2177. package/.forge/worktrees/pipeline-d6a6ef23/lib/notify.ts +0 -108
  2178. package/.forge/worktrees/pipeline-d6a6ef23/lib/password.ts +0 -97
  2179. package/.forge/worktrees/pipeline-d6a6ef23/lib/pipeline-scheduler.ts +0 -373
  2180. package/.forge/worktrees/pipeline-d6a6ef23/lib/pipeline.ts +0 -1438
  2181. package/.forge/worktrees/pipeline-d6a6ef23/lib/plugins/executor.ts +0 -347
  2182. package/.forge/worktrees/pipeline-d6a6ef23/lib/plugins/registry.ts +0 -228
  2183. package/.forge/worktrees/pipeline-d6a6ef23/lib/plugins/types.ts +0 -103
  2184. package/.forge/worktrees/pipeline-d6a6ef23/lib/project-sessions.ts +0 -53
  2185. package/.forge/worktrees/pipeline-d6a6ef23/lib/projects.ts +0 -86
  2186. package/.forge/worktrees/pipeline-d6a6ef23/lib/session-manager.ts +0 -156
  2187. package/.forge/worktrees/pipeline-d6a6ef23/lib/session-utils.ts +0 -53
  2188. package/.forge/worktrees/pipeline-d6a6ef23/lib/session-watcher.ts +0 -345
  2189. package/.forge/worktrees/pipeline-d6a6ef23/lib/settings.ts +0 -195
  2190. package/.forge/worktrees/pipeline-d6a6ef23/lib/skills.ts +0 -458
  2191. package/.forge/worktrees/pipeline-d6a6ef23/lib/task-manager.ts +0 -949
  2192. package/.forge/worktrees/pipeline-d6a6ef23/lib/telegram-bot.ts +0 -1477
  2193. package/.forge/worktrees/pipeline-d6a6ef23/lib/telegram-standalone.ts +0 -83
  2194. package/.forge/worktrees/pipeline-d6a6ef23/lib/terminal-server.ts +0 -70
  2195. package/.forge/worktrees/pipeline-d6a6ef23/lib/terminal-standalone.ts +0 -421
  2196. package/.forge/worktrees/pipeline-d6a6ef23/lib/usage-scanner.ts +0 -249
  2197. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/__tests__/state-machine.test.ts +0 -388
  2198. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/__tests__/workspace.test.ts +0 -311
  2199. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/agent-bus.ts +0 -416
  2200. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/agent-worker.ts +0 -655
  2201. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/backends/api-backend.ts +0 -262
  2202. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/backends/cli-backend.ts +0 -491
  2203. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/index.ts +0 -82
  2204. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/manager.ts +0 -136
  2205. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/orchestrator.ts +0 -3400
  2206. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/persistence.ts +0 -309
  2207. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/presets.ts +0 -649
  2208. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/requests.ts +0 -287
  2209. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/session-monitor.ts +0 -240
  2210. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/skill-installer.ts +0 -275
  2211. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/smith-memory.ts +0 -498
  2212. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/types.ts +0 -241
  2213. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace/watch-manager.ts +0 -560
  2214. package/.forge/worktrees/pipeline-d6a6ef23/lib/workspace-standalone.ts +0 -911
  2215. package/.forge/worktrees/pipeline-d6a6ef23/middleware.ts +0 -51
  2216. package/.forge/worktrees/pipeline-d6a6ef23/next.config.ts +0 -26
  2217. package/.forge/worktrees/pipeline-d6a6ef23/package.json +0 -74
  2218. package/.forge/worktrees/pipeline-d6a6ef23/pnpm-lock.yaml +0 -3719
  2219. package/.forge/worktrees/pipeline-d6a6ef23/pnpm-workspace.yaml +0 -1
  2220. package/.forge/worktrees/pipeline-d6a6ef23/postcss.config.mjs +0 -7
  2221. package/.forge/worktrees/pipeline-d6a6ef23/publish.sh +0 -133
  2222. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/README.md +0 -66
  2223. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/results/.gitignore +0 -2
  2224. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/run.ts +0 -635
  2225. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/01-text-utils/task.md +0 -26
  2226. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  2227. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  2228. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/02-pagination/task.md +0 -48
  2229. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  2230. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  2231. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  2232. package/.forge/worktrees/pipeline-d6a6ef23/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  2233. package/.forge/worktrees/pipeline-d6a6ef23/scripts/verify-usage.ts +0 -178
  2234. package/.forge/worktrees/pipeline-d6a6ef23/src/config/index.ts +0 -129
  2235. package/.forge/worktrees/pipeline-d6a6ef23/src/core/db/database.ts +0 -259
  2236. package/.forge/worktrees/pipeline-d6a6ef23/src/core/memory/strategy.ts +0 -32
  2237. package/.forge/worktrees/pipeline-d6a6ef23/src/core/providers/chat.ts +0 -65
  2238. package/.forge/worktrees/pipeline-d6a6ef23/src/core/providers/registry.ts +0 -60
  2239. package/.forge/worktrees/pipeline-d6a6ef23/src/core/session/manager.ts +0 -190
  2240. package/.forge/worktrees/pipeline-d6a6ef23/src/types/index.ts +0 -129
  2241. package/.forge/worktrees/pipeline-d6a6ef23/start.sh +0 -31
  2242. package/.forge/worktrees/pipeline-d6a6ef23/templates/smith-lead.json +0 -45
  2243. package/.forge/worktrees/pipeline-d6a6ef23/tsconfig.json +0 -42
  2244. package/.forge/worktrees/pipeline-e7f78b7a/CLAUDE.md +0 -86
  2245. package/.forge/worktrees/pipeline-e7f78b7a/README.md +0 -136
  2246. package/.forge/worktrees/pipeline-e7f78b7a/RELEASE_NOTES.md +0 -11
  2247. package/.forge/worktrees/pipeline-e7f78b7a/app/api/agents/route.ts +0 -17
  2248. package/.forge/worktrees/pipeline-e7f78b7a/app/api/auth/[...nextauth]/route.ts +0 -3
  2249. package/.forge/worktrees/pipeline-e7f78b7a/app/api/auth/verify/route.ts +0 -46
  2250. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude/[id]/route.ts +0 -31
  2251. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude/[id]/stream/route.ts +0 -63
  2252. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude/route.ts +0 -28
  2253. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  2254. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  2255. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude-sessions/[projectName]/route.ts +0 -37
  2256. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude-sessions/sync/route.ts +0 -17
  2257. package/.forge/worktrees/pipeline-e7f78b7a/app/api/claude-templates/route.ts +0 -145
  2258. package/.forge/worktrees/pipeline-e7f78b7a/app/api/code/route.ts +0 -299
  2259. package/.forge/worktrees/pipeline-e7f78b7a/app/api/delivery/[id]/route.ts +0 -62
  2260. package/.forge/worktrees/pipeline-e7f78b7a/app/api/delivery/route.ts +0 -40
  2261. package/.forge/worktrees/pipeline-e7f78b7a/app/api/detect-cli/route.ts +0 -46
  2262. package/.forge/worktrees/pipeline-e7f78b7a/app/api/docs/route.ts +0 -176
  2263. package/.forge/worktrees/pipeline-e7f78b7a/app/api/docs/sessions/route.ts +0 -54
  2264. package/.forge/worktrees/pipeline-e7f78b7a/app/api/favorites/route.ts +0 -26
  2265. package/.forge/worktrees/pipeline-e7f78b7a/app/api/flows/route.ts +0 -6
  2266. package/.forge/worktrees/pipeline-e7f78b7a/app/api/flows/run/route.ts +0 -19
  2267. package/.forge/worktrees/pipeline-e7f78b7a/app/api/git/route.ts +0 -149
  2268. package/.forge/worktrees/pipeline-e7f78b7a/app/api/help/route.ts +0 -84
  2269. package/.forge/worktrees/pipeline-e7f78b7a/app/api/issue-scanner/route.ts +0 -116
  2270. package/.forge/worktrees/pipeline-e7f78b7a/app/api/logs/route.ts +0 -100
  2271. package/.forge/worktrees/pipeline-e7f78b7a/app/api/mobile-chat/route.ts +0 -115
  2272. package/.forge/worktrees/pipeline-e7f78b7a/app/api/monitor/route.ts +0 -74
  2273. package/.forge/worktrees/pipeline-e7f78b7a/app/api/notifications/route.ts +0 -42
  2274. package/.forge/worktrees/pipeline-e7f78b7a/app/api/notify/test/route.ts +0 -33
  2275. package/.forge/worktrees/pipeline-e7f78b7a/app/api/online/route.ts +0 -40
  2276. package/.forge/worktrees/pipeline-e7f78b7a/app/api/pipelines/[id]/route.ts +0 -41
  2277. package/.forge/worktrees/pipeline-e7f78b7a/app/api/pipelines/route.ts +0 -90
  2278. package/.forge/worktrees/pipeline-e7f78b7a/app/api/plugins/route.ts +0 -75
  2279. package/.forge/worktrees/pipeline-e7f78b7a/app/api/preview/[...path]/route.ts +0 -64
  2280. package/.forge/worktrees/pipeline-e7f78b7a/app/api/preview/route.ts +0 -156
  2281. package/.forge/worktrees/pipeline-e7f78b7a/app/api/project-pipelines/route.ts +0 -91
  2282. package/.forge/worktrees/pipeline-e7f78b7a/app/api/project-sessions/route.ts +0 -61
  2283. package/.forge/worktrees/pipeline-e7f78b7a/app/api/projects/route.ts +0 -26
  2284. package/.forge/worktrees/pipeline-e7f78b7a/app/api/sessions/[id]/chat/route.ts +0 -64
  2285. package/.forge/worktrees/pipeline-e7f78b7a/app/api/sessions/[id]/messages/route.ts +0 -9
  2286. package/.forge/worktrees/pipeline-e7f78b7a/app/api/sessions/[id]/route.ts +0 -17
  2287. package/.forge/worktrees/pipeline-e7f78b7a/app/api/sessions/route.ts +0 -20
  2288. package/.forge/worktrees/pipeline-e7f78b7a/app/api/settings/route.ts +0 -64
  2289. package/.forge/worktrees/pipeline-e7f78b7a/app/api/skills/local/route.ts +0 -228
  2290. package/.forge/worktrees/pipeline-e7f78b7a/app/api/skills/route.ts +0 -182
  2291. package/.forge/worktrees/pipeline-e7f78b7a/app/api/smith-templates/route.ts +0 -81
  2292. package/.forge/worktrees/pipeline-e7f78b7a/app/api/status/route.ts +0 -12
  2293. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tabs/route.ts +0 -25
  2294. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tasks/[id]/route.ts +0 -51
  2295. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tasks/[id]/stream/route.ts +0 -77
  2296. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tasks/link/route.ts +0 -37
  2297. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tasks/route.ts +0 -44
  2298. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tasks/session/route.ts +0 -14
  2299. package/.forge/worktrees/pipeline-e7f78b7a/app/api/telegram/route.ts +0 -23
  2300. package/.forge/worktrees/pipeline-e7f78b7a/app/api/templates/route.ts +0 -6
  2301. package/.forge/worktrees/pipeline-e7f78b7a/app/api/terminal-bell/route.ts +0 -35
  2302. package/.forge/worktrees/pipeline-e7f78b7a/app/api/terminal-cwd/route.ts +0 -19
  2303. package/.forge/worktrees/pipeline-e7f78b7a/app/api/terminal-state/route.ts +0 -15
  2304. package/.forge/worktrees/pipeline-e7f78b7a/app/api/tunnel/route.ts +0 -26
  2305. package/.forge/worktrees/pipeline-e7f78b7a/app/api/upgrade/route.ts +0 -43
  2306. package/.forge/worktrees/pipeline-e7f78b7a/app/api/usage/route.ts +0 -20
  2307. package/.forge/worktrees/pipeline-e7f78b7a/app/api/version/route.ts +0 -78
  2308. package/.forge/worktrees/pipeline-e7f78b7a/app/api/watchers/route.ts +0 -33
  2309. package/.forge/worktrees/pipeline-e7f78b7a/app/api/workspace/[id]/agents/route.ts +0 -35
  2310. package/.forge/worktrees/pipeline-e7f78b7a/app/api/workspace/[id]/memory/route.ts +0 -23
  2311. package/.forge/worktrees/pipeline-e7f78b7a/app/api/workspace/[id]/smith/route.ts +0 -22
  2312. package/.forge/worktrees/pipeline-e7f78b7a/app/api/workspace/[id]/stream/route.ts +0 -28
  2313. package/.forge/worktrees/pipeline-e7f78b7a/app/api/workspace/route.ts +0 -100
  2314. package/.forge/worktrees/pipeline-e7f78b7a/app/global-error.tsx +0 -21
  2315. package/.forge/worktrees/pipeline-e7f78b7a/app/globals.css +0 -52
  2316. package/.forge/worktrees/pipeline-e7f78b7a/app/icon.ico +0 -0
  2317. package/.forge/worktrees/pipeline-e7f78b7a/app/icon.png +0 -0
  2318. package/.forge/worktrees/pipeline-e7f78b7a/app/icon.svg +0 -106
  2319. package/.forge/worktrees/pipeline-e7f78b7a/app/layout.tsx +0 -17
  2320. package/.forge/worktrees/pipeline-e7f78b7a/app/login/LoginForm.tsx +0 -96
  2321. package/.forge/worktrees/pipeline-e7f78b7a/app/login/page.tsx +0 -10
  2322. package/.forge/worktrees/pipeline-e7f78b7a/app/mobile/page.tsx +0 -9
  2323. package/.forge/worktrees/pipeline-e7f78b7a/app/page.tsx +0 -21
  2324. package/.forge/worktrees/pipeline-e7f78b7a/bin/forge-server.mjs +0 -484
  2325. package/.forge/worktrees/pipeline-e7f78b7a/check-forge-status.sh +0 -71
  2326. package/.forge/worktrees/pipeline-e7f78b7a/cli/mw.ts +0 -579
  2327. package/.forge/worktrees/pipeline-e7f78b7a/components/BrowserPanel.tsx +0 -175
  2328. package/.forge/worktrees/pipeline-e7f78b7a/components/ChatPanel.tsx +0 -191
  2329. package/.forge/worktrees/pipeline-e7f78b7a/components/ClaudeTerminal.tsx +0 -267
  2330. package/.forge/worktrees/pipeline-e7f78b7a/components/CodeViewer.tsx +0 -787
  2331. package/.forge/worktrees/pipeline-e7f78b7a/components/ConversationEditor.tsx +0 -411
  2332. package/.forge/worktrees/pipeline-e7f78b7a/components/ConversationGraphView.tsx +0 -347
  2333. package/.forge/worktrees/pipeline-e7f78b7a/components/ConversationTerminalView.tsx +0 -303
  2334. package/.forge/worktrees/pipeline-e7f78b7a/components/Dashboard.tsx +0 -807
  2335. package/.forge/worktrees/pipeline-e7f78b7a/components/DashboardWrapper.tsx +0 -9
  2336. package/.forge/worktrees/pipeline-e7f78b7a/components/DeliveryFlowEditor.tsx +0 -491
  2337. package/.forge/worktrees/pipeline-e7f78b7a/components/DeliveryList.tsx +0 -230
  2338. package/.forge/worktrees/pipeline-e7f78b7a/components/DeliveryWorkspace.tsx +0 -589
  2339. package/.forge/worktrees/pipeline-e7f78b7a/components/DocTerminal.tsx +0 -187
  2340. package/.forge/worktrees/pipeline-e7f78b7a/components/DocsViewer.tsx +0 -574
  2341. package/.forge/worktrees/pipeline-e7f78b7a/components/HelpDialog.tsx +0 -169
  2342. package/.forge/worktrees/pipeline-e7f78b7a/components/HelpTerminal.tsx +0 -141
  2343. package/.forge/worktrees/pipeline-e7f78b7a/components/InlinePipelineView.tsx +0 -111
  2344. package/.forge/worktrees/pipeline-e7f78b7a/components/LogViewer.tsx +0 -194
  2345. package/.forge/worktrees/pipeline-e7f78b7a/components/MarkdownContent.tsx +0 -73
  2346. package/.forge/worktrees/pipeline-e7f78b7a/components/MobileView.tsx +0 -385
  2347. package/.forge/worktrees/pipeline-e7f78b7a/components/MonitorPanel.tsx +0 -122
  2348. package/.forge/worktrees/pipeline-e7f78b7a/components/NewSessionModal.tsx +0 -93
  2349. package/.forge/worktrees/pipeline-e7f78b7a/components/NewTaskModal.tsx +0 -492
  2350. package/.forge/worktrees/pipeline-e7f78b7a/components/PipelineEditor.tsx +0 -570
  2351. package/.forge/worktrees/pipeline-e7f78b7a/components/PipelineView.tsx +0 -1018
  2352. package/.forge/worktrees/pipeline-e7f78b7a/components/PluginsPanel.tsx +0 -472
  2353. package/.forge/worktrees/pipeline-e7f78b7a/components/ProjectDetail.tsx +0 -1618
  2354. package/.forge/worktrees/pipeline-e7f78b7a/components/ProjectList.tsx +0 -108
  2355. package/.forge/worktrees/pipeline-e7f78b7a/components/ProjectManager.tsx +0 -401
  2356. package/.forge/worktrees/pipeline-e7f78b7a/components/SessionList.tsx +0 -74
  2357. package/.forge/worktrees/pipeline-e7f78b7a/components/SessionView.tsx +0 -726
  2358. package/.forge/worktrees/pipeline-e7f78b7a/components/SettingsModal.tsx +0 -1647
  2359. package/.forge/worktrees/pipeline-e7f78b7a/components/SkillsPanel.tsx +0 -969
  2360. package/.forge/worktrees/pipeline-e7f78b7a/components/StatusBar.tsx +0 -99
  2361. package/.forge/worktrees/pipeline-e7f78b7a/components/TabBar.tsx +0 -46
  2362. package/.forge/worktrees/pipeline-e7f78b7a/components/TaskBoard.tsx +0 -113
  2363. package/.forge/worktrees/pipeline-e7f78b7a/components/TaskDetail.tsx +0 -372
  2364. package/.forge/worktrees/pipeline-e7f78b7a/components/TerminalLauncher.tsx +0 -398
  2365. package/.forge/worktrees/pipeline-e7f78b7a/components/TunnelToggle.tsx +0 -206
  2366. package/.forge/worktrees/pipeline-e7f78b7a/components/UsagePanel.tsx +0 -207
  2367. package/.forge/worktrees/pipeline-e7f78b7a/components/WebTerminal.tsx +0 -1683
  2368. package/.forge/worktrees/pipeline-e7f78b7a/components/WorkspaceTree.tsx +0 -221
  2369. package/.forge/worktrees/pipeline-e7f78b7a/components/WorkspaceView.tsx +0 -4048
  2370. package/.forge/worktrees/pipeline-e7f78b7a/dev-test.sh +0 -5
  2371. package/.forge/worktrees/pipeline-e7f78b7a/docs/Forge_Memory_Layer_Design.docx +0 -0
  2372. package/.forge/worktrees/pipeline-e7f78b7a/docs/Forge_Strategy_Research_2026.docx +0 -0
  2373. package/.forge/worktrees/pipeline-e7f78b7a/docs/LOCAL-DEPLOY.md +0 -144
  2374. package/.forge/worktrees/pipeline-e7f78b7a/docs/roadmap-multi-agent-workflow.md +0 -330
  2375. package/.forge/worktrees/pipeline-e7f78b7a/forge-logo.png +0 -0
  2376. package/.forge/worktrees/pipeline-e7f78b7a/forge-logo.svg +0 -106
  2377. package/.forge/worktrees/pipeline-e7f78b7a/hooks/useSidebarResize.ts +0 -52
  2378. package/.forge/worktrees/pipeline-e7f78b7a/install.sh +0 -29
  2379. package/.forge/worktrees/pipeline-e7f78b7a/instrumentation.ts +0 -35
  2380. package/.forge/worktrees/pipeline-e7f78b7a/lib/agents/claude-adapter.ts +0 -104
  2381. package/.forge/worktrees/pipeline-e7f78b7a/lib/agents/generic-adapter.ts +0 -64
  2382. package/.forge/worktrees/pipeline-e7f78b7a/lib/agents/index.ts +0 -245
  2383. package/.forge/worktrees/pipeline-e7f78b7a/lib/agents/types.ts +0 -70
  2384. package/.forge/worktrees/pipeline-e7f78b7a/lib/artifacts.ts +0 -106
  2385. package/.forge/worktrees/pipeline-e7f78b7a/lib/auth.ts +0 -62
  2386. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/docker.yaml +0 -70
  2387. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/http.yaml +0 -66
  2388. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/jenkins.yaml +0 -92
  2389. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/llm-vision.yaml +0 -85
  2390. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/playwright.yaml +0 -111
  2391. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/shell-command.yaml +0 -60
  2392. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/slack.yaml +0 -48
  2393. package/.forge/worktrees/pipeline-e7f78b7a/lib/builtin-plugins/webhook.yaml +0 -56
  2394. package/.forge/worktrees/pipeline-e7f78b7a/lib/claude-process.ts +0 -352
  2395. package/.forge/worktrees/pipeline-e7f78b7a/lib/claude-sessions.ts +0 -266
  2396. package/.forge/worktrees/pipeline-e7f78b7a/lib/claude-templates.ts +0 -227
  2397. package/.forge/worktrees/pipeline-e7f78b7a/lib/cloudflared.ts +0 -424
  2398. package/.forge/worktrees/pipeline-e7f78b7a/lib/crypto.ts +0 -67
  2399. package/.forge/worktrees/pipeline-e7f78b7a/lib/delivery.ts +0 -787
  2400. package/.forge/worktrees/pipeline-e7f78b7a/lib/dirs.ts +0 -99
  2401. package/.forge/worktrees/pipeline-e7f78b7a/lib/flows.ts +0 -86
  2402. package/.forge/worktrees/pipeline-e7f78b7a/lib/forge-mcp-server.ts +0 -717
  2403. package/.forge/worktrees/pipeline-e7f78b7a/lib/forge-skills/forge-inbox.md +0 -38
  2404. package/.forge/worktrees/pipeline-e7f78b7a/lib/forge-skills/forge-send.md +0 -47
  2405. package/.forge/worktrees/pipeline-e7f78b7a/lib/forge-skills/forge-status.md +0 -32
  2406. package/.forge/worktrees/pipeline-e7f78b7a/lib/forge-skills/forge-workspace-sync.md +0 -37
  2407. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/00-overview.md +0 -40
  2408. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/01-settings.md +0 -194
  2409. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/02-telegram.md +0 -41
  2410. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/03-tunnel.md +0 -31
  2411. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/04-tasks.md +0 -52
  2412. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/05-pipelines.md +0 -460
  2413. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/06-skills.md +0 -43
  2414. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/07-projects.md +0 -73
  2415. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/08-rules.md +0 -53
  2416. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/09-issue-autofix.md +0 -55
  2417. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/10-troubleshooting.md +0 -89
  2418. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/11-workspace.md +0 -810
  2419. package/.forge/worktrees/pipeline-e7f78b7a/lib/help-docs/CLAUDE.md +0 -62
  2420. package/.forge/worktrees/pipeline-e7f78b7a/lib/init.ts +0 -266
  2421. package/.forge/worktrees/pipeline-e7f78b7a/lib/issue-scanner.ts +0 -298
  2422. package/.forge/worktrees/pipeline-e7f78b7a/lib/logger.ts +0 -79
  2423. package/.forge/worktrees/pipeline-e7f78b7a/lib/notifications.ts +0 -75
  2424. package/.forge/worktrees/pipeline-e7f78b7a/lib/notify.ts +0 -108
  2425. package/.forge/worktrees/pipeline-e7f78b7a/lib/password.ts +0 -97
  2426. package/.forge/worktrees/pipeline-e7f78b7a/lib/pipeline-scheduler.ts +0 -373
  2427. package/.forge/worktrees/pipeline-e7f78b7a/lib/pipeline.ts +0 -1441
  2428. package/.forge/worktrees/pipeline-e7f78b7a/lib/plugins/executor.ts +0 -347
  2429. package/.forge/worktrees/pipeline-e7f78b7a/lib/plugins/registry.ts +0 -228
  2430. package/.forge/worktrees/pipeline-e7f78b7a/lib/plugins/types.ts +0 -103
  2431. package/.forge/worktrees/pipeline-e7f78b7a/lib/project-sessions.ts +0 -53
  2432. package/.forge/worktrees/pipeline-e7f78b7a/lib/projects.ts +0 -86
  2433. package/.forge/worktrees/pipeline-e7f78b7a/lib/session-manager.ts +0 -156
  2434. package/.forge/worktrees/pipeline-e7f78b7a/lib/session-utils.ts +0 -53
  2435. package/.forge/worktrees/pipeline-e7f78b7a/lib/session-watcher.ts +0 -345
  2436. package/.forge/worktrees/pipeline-e7f78b7a/lib/settings.ts +0 -195
  2437. package/.forge/worktrees/pipeline-e7f78b7a/lib/skills.ts +0 -458
  2438. package/.forge/worktrees/pipeline-e7f78b7a/lib/task-manager.ts +0 -949
  2439. package/.forge/worktrees/pipeline-e7f78b7a/lib/telegram-bot.ts +0 -1477
  2440. package/.forge/worktrees/pipeline-e7f78b7a/lib/telegram-standalone.ts +0 -83
  2441. package/.forge/worktrees/pipeline-e7f78b7a/lib/terminal-server.ts +0 -70
  2442. package/.forge/worktrees/pipeline-e7f78b7a/lib/terminal-standalone.ts +0 -421
  2443. package/.forge/worktrees/pipeline-e7f78b7a/lib/usage-scanner.ts +0 -249
  2444. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/__tests__/state-machine.test.ts +0 -388
  2445. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/__tests__/workspace.test.ts +0 -311
  2446. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/agent-bus.ts +0 -416
  2447. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/agent-worker.ts +0 -655
  2448. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/backends/api-backend.ts +0 -262
  2449. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/backends/cli-backend.ts +0 -491
  2450. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/index.ts +0 -82
  2451. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/manager.ts +0 -136
  2452. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/orchestrator.ts +0 -3400
  2453. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/persistence.ts +0 -309
  2454. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/presets.ts +0 -649
  2455. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/requests.ts +0 -287
  2456. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/session-monitor.ts +0 -240
  2457. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/skill-installer.ts +0 -275
  2458. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/smith-memory.ts +0 -498
  2459. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/types.ts +0 -241
  2460. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace/watch-manager.ts +0 -560
  2461. package/.forge/worktrees/pipeline-e7f78b7a/lib/workspace-standalone.ts +0 -911
  2462. package/.forge/worktrees/pipeline-e7f78b7a/middleware.ts +0 -51
  2463. package/.forge/worktrees/pipeline-e7f78b7a/next.config.ts +0 -26
  2464. package/.forge/worktrees/pipeline-e7f78b7a/package.json +0 -74
  2465. package/.forge/worktrees/pipeline-e7f78b7a/pnpm-lock.yaml +0 -3719
  2466. package/.forge/worktrees/pipeline-e7f78b7a/pnpm-workspace.yaml +0 -1
  2467. package/.forge/worktrees/pipeline-e7f78b7a/postcss.config.mjs +0 -7
  2468. package/.forge/worktrees/pipeline-e7f78b7a/publish.sh +0 -133
  2469. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/README.md +0 -66
  2470. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/results/.gitignore +0 -2
  2471. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/run.ts +0 -635
  2472. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/01-text-utils/task.md +0 -26
  2473. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  2474. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  2475. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/02-pagination/task.md +0 -48
  2476. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  2477. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  2478. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  2479. package/.forge/worktrees/pipeline-e7f78b7a/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  2480. package/.forge/worktrees/pipeline-e7f78b7a/scripts/verify-usage.ts +0 -178
  2481. package/.forge/worktrees/pipeline-e7f78b7a/src/config/index.ts +0 -129
  2482. package/.forge/worktrees/pipeline-e7f78b7a/src/core/db/database.ts +0 -259
  2483. package/.forge/worktrees/pipeline-e7f78b7a/src/core/memory/strategy.ts +0 -32
  2484. package/.forge/worktrees/pipeline-e7f78b7a/src/core/providers/chat.ts +0 -65
  2485. package/.forge/worktrees/pipeline-e7f78b7a/src/core/providers/registry.ts +0 -60
  2486. package/.forge/worktrees/pipeline-e7f78b7a/src/core/session/manager.ts +0 -190
  2487. package/.forge/worktrees/pipeline-e7f78b7a/src/types/index.ts +0 -129
  2488. package/.forge/worktrees/pipeline-e7f78b7a/start.sh +0 -31
  2489. package/.forge/worktrees/pipeline-e7f78b7a/templates/smith-lead.json +0 -45
  2490. package/.forge/worktrees/pipeline-e7f78b7a/tsconfig.json +0 -42
  2491. package/.forge/worktrees/pipeline-e97c13c7/CLAUDE.md +0 -86
  2492. package/.forge/worktrees/pipeline-e97c13c7/README.md +0 -136
  2493. package/.forge/worktrees/pipeline-e97c13c7/RELEASE_NOTES.md +0 -11
  2494. package/.forge/worktrees/pipeline-e97c13c7/app/api/agents/route.ts +0 -17
  2495. package/.forge/worktrees/pipeline-e97c13c7/app/api/auth/[...nextauth]/route.ts +0 -3
  2496. package/.forge/worktrees/pipeline-e97c13c7/app/api/auth/verify/route.ts +0 -46
  2497. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude/[id]/route.ts +0 -31
  2498. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude/[id]/stream/route.ts +0 -63
  2499. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude/route.ts +0 -28
  2500. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  2501. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  2502. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude-sessions/[projectName]/route.ts +0 -37
  2503. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude-sessions/sync/route.ts +0 -17
  2504. package/.forge/worktrees/pipeline-e97c13c7/app/api/claude-templates/route.ts +0 -145
  2505. package/.forge/worktrees/pipeline-e97c13c7/app/api/code/route.ts +0 -299
  2506. package/.forge/worktrees/pipeline-e97c13c7/app/api/delivery/[id]/route.ts +0 -62
  2507. package/.forge/worktrees/pipeline-e97c13c7/app/api/delivery/route.ts +0 -40
  2508. package/.forge/worktrees/pipeline-e97c13c7/app/api/detect-cli/route.ts +0 -46
  2509. package/.forge/worktrees/pipeline-e97c13c7/app/api/docs/route.ts +0 -176
  2510. package/.forge/worktrees/pipeline-e97c13c7/app/api/docs/sessions/route.ts +0 -54
  2511. package/.forge/worktrees/pipeline-e97c13c7/app/api/favorites/route.ts +0 -26
  2512. package/.forge/worktrees/pipeline-e97c13c7/app/api/flows/route.ts +0 -6
  2513. package/.forge/worktrees/pipeline-e97c13c7/app/api/flows/run/route.ts +0 -19
  2514. package/.forge/worktrees/pipeline-e97c13c7/app/api/git/route.ts +0 -149
  2515. package/.forge/worktrees/pipeline-e97c13c7/app/api/help/route.ts +0 -84
  2516. package/.forge/worktrees/pipeline-e97c13c7/app/api/issue-scanner/route.ts +0 -116
  2517. package/.forge/worktrees/pipeline-e97c13c7/app/api/logs/route.ts +0 -100
  2518. package/.forge/worktrees/pipeline-e97c13c7/app/api/mobile-chat/route.ts +0 -115
  2519. package/.forge/worktrees/pipeline-e97c13c7/app/api/monitor/route.ts +0 -74
  2520. package/.forge/worktrees/pipeline-e97c13c7/app/api/notifications/route.ts +0 -42
  2521. package/.forge/worktrees/pipeline-e97c13c7/app/api/notify/test/route.ts +0 -33
  2522. package/.forge/worktrees/pipeline-e97c13c7/app/api/online/route.ts +0 -40
  2523. package/.forge/worktrees/pipeline-e97c13c7/app/api/pipelines/[id]/route.ts +0 -41
  2524. package/.forge/worktrees/pipeline-e97c13c7/app/api/pipelines/route.ts +0 -90
  2525. package/.forge/worktrees/pipeline-e97c13c7/app/api/plugins/route.ts +0 -75
  2526. package/.forge/worktrees/pipeline-e97c13c7/app/api/preview/[...path]/route.ts +0 -64
  2527. package/.forge/worktrees/pipeline-e97c13c7/app/api/preview/route.ts +0 -156
  2528. package/.forge/worktrees/pipeline-e97c13c7/app/api/project-pipelines/route.ts +0 -91
  2529. package/.forge/worktrees/pipeline-e97c13c7/app/api/project-sessions/route.ts +0 -61
  2530. package/.forge/worktrees/pipeline-e97c13c7/app/api/projects/route.ts +0 -26
  2531. package/.forge/worktrees/pipeline-e97c13c7/app/api/sessions/[id]/chat/route.ts +0 -64
  2532. package/.forge/worktrees/pipeline-e97c13c7/app/api/sessions/[id]/messages/route.ts +0 -9
  2533. package/.forge/worktrees/pipeline-e97c13c7/app/api/sessions/[id]/route.ts +0 -17
  2534. package/.forge/worktrees/pipeline-e97c13c7/app/api/sessions/route.ts +0 -20
  2535. package/.forge/worktrees/pipeline-e97c13c7/app/api/settings/route.ts +0 -64
  2536. package/.forge/worktrees/pipeline-e97c13c7/app/api/skills/local/route.ts +0 -228
  2537. package/.forge/worktrees/pipeline-e97c13c7/app/api/skills/route.ts +0 -182
  2538. package/.forge/worktrees/pipeline-e97c13c7/app/api/smith-templates/route.ts +0 -81
  2539. package/.forge/worktrees/pipeline-e97c13c7/app/api/status/route.ts +0 -12
  2540. package/.forge/worktrees/pipeline-e97c13c7/app/api/tabs/route.ts +0 -25
  2541. package/.forge/worktrees/pipeline-e97c13c7/app/api/tasks/[id]/route.ts +0 -51
  2542. package/.forge/worktrees/pipeline-e97c13c7/app/api/tasks/[id]/stream/route.ts +0 -77
  2543. package/.forge/worktrees/pipeline-e97c13c7/app/api/tasks/link/route.ts +0 -37
  2544. package/.forge/worktrees/pipeline-e97c13c7/app/api/tasks/route.ts +0 -44
  2545. package/.forge/worktrees/pipeline-e97c13c7/app/api/tasks/session/route.ts +0 -14
  2546. package/.forge/worktrees/pipeline-e97c13c7/app/api/telegram/route.ts +0 -23
  2547. package/.forge/worktrees/pipeline-e97c13c7/app/api/templates/route.ts +0 -6
  2548. package/.forge/worktrees/pipeline-e97c13c7/app/api/terminal-bell/route.ts +0 -35
  2549. package/.forge/worktrees/pipeline-e97c13c7/app/api/terminal-cwd/route.ts +0 -19
  2550. package/.forge/worktrees/pipeline-e97c13c7/app/api/terminal-state/route.ts +0 -15
  2551. package/.forge/worktrees/pipeline-e97c13c7/app/api/tunnel/route.ts +0 -26
  2552. package/.forge/worktrees/pipeline-e97c13c7/app/api/upgrade/route.ts +0 -43
  2553. package/.forge/worktrees/pipeline-e97c13c7/app/api/usage/route.ts +0 -20
  2554. package/.forge/worktrees/pipeline-e97c13c7/app/api/version/route.ts +0 -78
  2555. package/.forge/worktrees/pipeline-e97c13c7/app/api/watchers/route.ts +0 -33
  2556. package/.forge/worktrees/pipeline-e97c13c7/app/api/workspace/[id]/agents/route.ts +0 -35
  2557. package/.forge/worktrees/pipeline-e97c13c7/app/api/workspace/[id]/memory/route.ts +0 -23
  2558. package/.forge/worktrees/pipeline-e97c13c7/app/api/workspace/[id]/smith/route.ts +0 -22
  2559. package/.forge/worktrees/pipeline-e97c13c7/app/api/workspace/[id]/stream/route.ts +0 -28
  2560. package/.forge/worktrees/pipeline-e97c13c7/app/api/workspace/route.ts +0 -100
  2561. package/.forge/worktrees/pipeline-e97c13c7/app/global-error.tsx +0 -21
  2562. package/.forge/worktrees/pipeline-e97c13c7/app/globals.css +0 -52
  2563. package/.forge/worktrees/pipeline-e97c13c7/app/icon.ico +0 -0
  2564. package/.forge/worktrees/pipeline-e97c13c7/app/icon.png +0 -0
  2565. package/.forge/worktrees/pipeline-e97c13c7/app/icon.svg +0 -106
  2566. package/.forge/worktrees/pipeline-e97c13c7/app/layout.tsx +0 -17
  2567. package/.forge/worktrees/pipeline-e97c13c7/app/login/LoginForm.tsx +0 -96
  2568. package/.forge/worktrees/pipeline-e97c13c7/app/login/page.tsx +0 -10
  2569. package/.forge/worktrees/pipeline-e97c13c7/app/mobile/page.tsx +0 -9
  2570. package/.forge/worktrees/pipeline-e97c13c7/app/page.tsx +0 -21
  2571. package/.forge/worktrees/pipeline-e97c13c7/bin/forge-server.mjs +0 -484
  2572. package/.forge/worktrees/pipeline-e97c13c7/check-forge-status.sh +0 -71
  2573. package/.forge/worktrees/pipeline-e97c13c7/cli/mw.ts +0 -579
  2574. package/.forge/worktrees/pipeline-e97c13c7/components/BrowserPanel.tsx +0 -175
  2575. package/.forge/worktrees/pipeline-e97c13c7/components/ChatPanel.tsx +0 -191
  2576. package/.forge/worktrees/pipeline-e97c13c7/components/ClaudeTerminal.tsx +0 -267
  2577. package/.forge/worktrees/pipeline-e97c13c7/components/CodeViewer.tsx +0 -787
  2578. package/.forge/worktrees/pipeline-e97c13c7/components/ConversationEditor.tsx +0 -411
  2579. package/.forge/worktrees/pipeline-e97c13c7/components/ConversationGraphView.tsx +0 -347
  2580. package/.forge/worktrees/pipeline-e97c13c7/components/ConversationTerminalView.tsx +0 -303
  2581. package/.forge/worktrees/pipeline-e97c13c7/components/Dashboard.tsx +0 -807
  2582. package/.forge/worktrees/pipeline-e97c13c7/components/DashboardWrapper.tsx +0 -9
  2583. package/.forge/worktrees/pipeline-e97c13c7/components/DeliveryFlowEditor.tsx +0 -491
  2584. package/.forge/worktrees/pipeline-e97c13c7/components/DeliveryList.tsx +0 -230
  2585. package/.forge/worktrees/pipeline-e97c13c7/components/DeliveryWorkspace.tsx +0 -589
  2586. package/.forge/worktrees/pipeline-e97c13c7/components/DocTerminal.tsx +0 -187
  2587. package/.forge/worktrees/pipeline-e97c13c7/components/DocsViewer.tsx +0 -574
  2588. package/.forge/worktrees/pipeline-e97c13c7/components/HelpDialog.tsx +0 -169
  2589. package/.forge/worktrees/pipeline-e97c13c7/components/HelpTerminal.tsx +0 -141
  2590. package/.forge/worktrees/pipeline-e97c13c7/components/InlinePipelineView.tsx +0 -111
  2591. package/.forge/worktrees/pipeline-e97c13c7/components/LogViewer.tsx +0 -194
  2592. package/.forge/worktrees/pipeline-e97c13c7/components/MarkdownContent.tsx +0 -73
  2593. package/.forge/worktrees/pipeline-e97c13c7/components/MobileView.tsx +0 -385
  2594. package/.forge/worktrees/pipeline-e97c13c7/components/MonitorPanel.tsx +0 -122
  2595. package/.forge/worktrees/pipeline-e97c13c7/components/NewSessionModal.tsx +0 -93
  2596. package/.forge/worktrees/pipeline-e97c13c7/components/NewTaskModal.tsx +0 -492
  2597. package/.forge/worktrees/pipeline-e97c13c7/components/PipelineEditor.tsx +0 -570
  2598. package/.forge/worktrees/pipeline-e97c13c7/components/PipelineView.tsx +0 -1018
  2599. package/.forge/worktrees/pipeline-e97c13c7/components/PluginsPanel.tsx +0 -472
  2600. package/.forge/worktrees/pipeline-e97c13c7/components/ProjectDetail.tsx +0 -1618
  2601. package/.forge/worktrees/pipeline-e97c13c7/components/ProjectList.tsx +0 -108
  2602. package/.forge/worktrees/pipeline-e97c13c7/components/ProjectManager.tsx +0 -401
  2603. package/.forge/worktrees/pipeline-e97c13c7/components/SessionList.tsx +0 -74
  2604. package/.forge/worktrees/pipeline-e97c13c7/components/SessionView.tsx +0 -726
  2605. package/.forge/worktrees/pipeline-e97c13c7/components/SettingsModal.tsx +0 -1647
  2606. package/.forge/worktrees/pipeline-e97c13c7/components/SkillsPanel.tsx +0 -969
  2607. package/.forge/worktrees/pipeline-e97c13c7/components/StatusBar.tsx +0 -99
  2608. package/.forge/worktrees/pipeline-e97c13c7/components/TabBar.tsx +0 -46
  2609. package/.forge/worktrees/pipeline-e97c13c7/components/TaskBoard.tsx +0 -113
  2610. package/.forge/worktrees/pipeline-e97c13c7/components/TaskDetail.tsx +0 -372
  2611. package/.forge/worktrees/pipeline-e97c13c7/components/TerminalLauncher.tsx +0 -398
  2612. package/.forge/worktrees/pipeline-e97c13c7/components/TunnelToggle.tsx +0 -206
  2613. package/.forge/worktrees/pipeline-e97c13c7/components/UsagePanel.tsx +0 -207
  2614. package/.forge/worktrees/pipeline-e97c13c7/components/WebTerminal.tsx +0 -1683
  2615. package/.forge/worktrees/pipeline-e97c13c7/components/WorkspaceTree.tsx +0 -221
  2616. package/.forge/worktrees/pipeline-e97c13c7/components/WorkspaceView.tsx +0 -4048
  2617. package/.forge/worktrees/pipeline-e97c13c7/dev-test.sh +0 -5
  2618. package/.forge/worktrees/pipeline-e97c13c7/docs/Forge_Memory_Layer_Design.docx +0 -0
  2619. package/.forge/worktrees/pipeline-e97c13c7/docs/Forge_Strategy_Research_2026.docx +0 -0
  2620. package/.forge/worktrees/pipeline-e97c13c7/docs/LOCAL-DEPLOY.md +0 -144
  2621. package/.forge/worktrees/pipeline-e97c13c7/docs/roadmap-multi-agent-workflow.md +0 -330
  2622. package/.forge/worktrees/pipeline-e97c13c7/forge-logo.png +0 -0
  2623. package/.forge/worktrees/pipeline-e97c13c7/forge-logo.svg +0 -106
  2624. package/.forge/worktrees/pipeline-e97c13c7/hooks/useSidebarResize.ts +0 -52
  2625. package/.forge/worktrees/pipeline-e97c13c7/install.sh +0 -29
  2626. package/.forge/worktrees/pipeline-e97c13c7/instrumentation.ts +0 -35
  2627. package/.forge/worktrees/pipeline-e97c13c7/lib/agents/claude-adapter.ts +0 -104
  2628. package/.forge/worktrees/pipeline-e97c13c7/lib/agents/generic-adapter.ts +0 -64
  2629. package/.forge/worktrees/pipeline-e97c13c7/lib/agents/index.ts +0 -245
  2630. package/.forge/worktrees/pipeline-e97c13c7/lib/agents/types.ts +0 -70
  2631. package/.forge/worktrees/pipeline-e97c13c7/lib/artifacts.ts +0 -106
  2632. package/.forge/worktrees/pipeline-e97c13c7/lib/auth.ts +0 -62
  2633. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/docker.yaml +0 -70
  2634. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/http.yaml +0 -66
  2635. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/jenkins.yaml +0 -92
  2636. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/llm-vision.yaml +0 -85
  2637. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/playwright.yaml +0 -111
  2638. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/shell-command.yaml +0 -60
  2639. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/slack.yaml +0 -48
  2640. package/.forge/worktrees/pipeline-e97c13c7/lib/builtin-plugins/webhook.yaml +0 -56
  2641. package/.forge/worktrees/pipeline-e97c13c7/lib/claude-process.ts +0 -352
  2642. package/.forge/worktrees/pipeline-e97c13c7/lib/claude-sessions.ts +0 -266
  2643. package/.forge/worktrees/pipeline-e97c13c7/lib/claude-templates.ts +0 -227
  2644. package/.forge/worktrees/pipeline-e97c13c7/lib/cloudflared.ts +0 -424
  2645. package/.forge/worktrees/pipeline-e97c13c7/lib/crypto.ts +0 -67
  2646. package/.forge/worktrees/pipeline-e97c13c7/lib/delivery.ts +0 -787
  2647. package/.forge/worktrees/pipeline-e97c13c7/lib/dirs.ts +0 -99
  2648. package/.forge/worktrees/pipeline-e97c13c7/lib/flows.ts +0 -86
  2649. package/.forge/worktrees/pipeline-e97c13c7/lib/forge-mcp-server.ts +0 -717
  2650. package/.forge/worktrees/pipeline-e97c13c7/lib/forge-skills/forge-inbox.md +0 -38
  2651. package/.forge/worktrees/pipeline-e97c13c7/lib/forge-skills/forge-send.md +0 -47
  2652. package/.forge/worktrees/pipeline-e97c13c7/lib/forge-skills/forge-status.md +0 -32
  2653. package/.forge/worktrees/pipeline-e97c13c7/lib/forge-skills/forge-workspace-sync.md +0 -37
  2654. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/00-overview.md +0 -40
  2655. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/01-settings.md +0 -194
  2656. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/02-telegram.md +0 -41
  2657. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/03-tunnel.md +0 -31
  2658. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/04-tasks.md +0 -52
  2659. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/05-pipelines.md +0 -460
  2660. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/06-skills.md +0 -43
  2661. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/07-projects.md +0 -73
  2662. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/08-rules.md +0 -53
  2663. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/09-issue-autofix.md +0 -55
  2664. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/10-troubleshooting.md +0 -89
  2665. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/11-workspace.md +0 -810
  2666. package/.forge/worktrees/pipeline-e97c13c7/lib/help-docs/CLAUDE.md +0 -62
  2667. package/.forge/worktrees/pipeline-e97c13c7/lib/init.ts +0 -266
  2668. package/.forge/worktrees/pipeline-e97c13c7/lib/issue-scanner.ts +0 -298
  2669. package/.forge/worktrees/pipeline-e97c13c7/lib/logger.ts +0 -79
  2670. package/.forge/worktrees/pipeline-e97c13c7/lib/notifications.ts +0 -75
  2671. package/.forge/worktrees/pipeline-e97c13c7/lib/notify.ts +0 -108
  2672. package/.forge/worktrees/pipeline-e97c13c7/lib/password.ts +0 -97
  2673. package/.forge/worktrees/pipeline-e97c13c7/lib/pipeline-scheduler.ts +0 -373
  2674. package/.forge/worktrees/pipeline-e97c13c7/lib/pipeline.ts +0 -1438
  2675. package/.forge/worktrees/pipeline-e97c13c7/lib/plugins/executor.ts +0 -347
  2676. package/.forge/worktrees/pipeline-e97c13c7/lib/plugins/registry.ts +0 -228
  2677. package/.forge/worktrees/pipeline-e97c13c7/lib/plugins/types.ts +0 -103
  2678. package/.forge/worktrees/pipeline-e97c13c7/lib/project-sessions.ts +0 -53
  2679. package/.forge/worktrees/pipeline-e97c13c7/lib/projects.ts +0 -86
  2680. package/.forge/worktrees/pipeline-e97c13c7/lib/session-manager.ts +0 -156
  2681. package/.forge/worktrees/pipeline-e97c13c7/lib/session-utils.ts +0 -53
  2682. package/.forge/worktrees/pipeline-e97c13c7/lib/session-watcher.ts +0 -345
  2683. package/.forge/worktrees/pipeline-e97c13c7/lib/settings.ts +0 -195
  2684. package/.forge/worktrees/pipeline-e97c13c7/lib/skills.ts +0 -458
  2685. package/.forge/worktrees/pipeline-e97c13c7/lib/task-manager.ts +0 -949
  2686. package/.forge/worktrees/pipeline-e97c13c7/lib/telegram-bot.ts +0 -1477
  2687. package/.forge/worktrees/pipeline-e97c13c7/lib/telegram-standalone.ts +0 -83
  2688. package/.forge/worktrees/pipeline-e97c13c7/lib/terminal-server.ts +0 -70
  2689. package/.forge/worktrees/pipeline-e97c13c7/lib/terminal-standalone.ts +0 -421
  2690. package/.forge/worktrees/pipeline-e97c13c7/lib/usage-scanner.ts +0 -249
  2691. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/__tests__/state-machine.test.ts +0 -388
  2692. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/__tests__/workspace.test.ts +0 -311
  2693. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/agent-bus.ts +0 -416
  2694. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/agent-worker.ts +0 -655
  2695. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/backends/api-backend.ts +0 -262
  2696. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/backends/cli-backend.ts +0 -491
  2697. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/index.ts +0 -82
  2698. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/manager.ts +0 -136
  2699. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/orchestrator.ts +0 -3400
  2700. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/persistence.ts +0 -309
  2701. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/presets.ts +0 -649
  2702. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/requests.ts +0 -287
  2703. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/session-monitor.ts +0 -240
  2704. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/skill-installer.ts +0 -275
  2705. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/smith-memory.ts +0 -498
  2706. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/types.ts +0 -241
  2707. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace/watch-manager.ts +0 -560
  2708. package/.forge/worktrees/pipeline-e97c13c7/lib/workspace-standalone.ts +0 -911
  2709. package/.forge/worktrees/pipeline-e97c13c7/middleware.ts +0 -51
  2710. package/.forge/worktrees/pipeline-e97c13c7/next.config.ts +0 -26
  2711. package/.forge/worktrees/pipeline-e97c13c7/package.json +0 -74
  2712. package/.forge/worktrees/pipeline-e97c13c7/pnpm-lock.yaml +0 -3719
  2713. package/.forge/worktrees/pipeline-e97c13c7/pnpm-workspace.yaml +0 -1
  2714. package/.forge/worktrees/pipeline-e97c13c7/postcss.config.mjs +0 -7
  2715. package/.forge/worktrees/pipeline-e97c13c7/publish.sh +0 -133
  2716. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/README.md +0 -66
  2717. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/results/.gitignore +0 -2
  2718. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/run.ts +0 -635
  2719. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/01-text-utils/task.md +0 -26
  2720. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  2721. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  2722. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/02-pagination/task.md +0 -48
  2723. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  2724. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  2725. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  2726. package/.forge/worktrees/pipeline-e97c13c7/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  2727. package/.forge/worktrees/pipeline-e97c13c7/scripts/verify-usage.ts +0 -178
  2728. package/.forge/worktrees/pipeline-e97c13c7/src/config/index.ts +0 -129
  2729. package/.forge/worktrees/pipeline-e97c13c7/src/core/db/database.ts +0 -259
  2730. package/.forge/worktrees/pipeline-e97c13c7/src/core/memory/strategy.ts +0 -32
  2731. package/.forge/worktrees/pipeline-e97c13c7/src/core/providers/chat.ts +0 -65
  2732. package/.forge/worktrees/pipeline-e97c13c7/src/core/providers/registry.ts +0 -60
  2733. package/.forge/worktrees/pipeline-e97c13c7/src/core/session/manager.ts +0 -190
  2734. package/.forge/worktrees/pipeline-e97c13c7/src/types/index.ts +0 -129
  2735. package/.forge/worktrees/pipeline-e97c13c7/start.sh +0 -31
  2736. package/.forge/worktrees/pipeline-e97c13c7/templates/smith-lead.json +0 -45
  2737. package/.forge/worktrees/pipeline-e97c13c7/tsconfig.json +0 -42
  2738. package/.forge/worktrees/pipeline-ecd7cb0f/CLAUDE.md +0 -86
  2739. package/.forge/worktrees/pipeline-ecd7cb0f/README.md +0 -136
  2740. package/.forge/worktrees/pipeline-ecd7cb0f/RELEASE_NOTES.md +0 -11
  2741. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/agents/route.ts +0 -17
  2742. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/auth/[...nextauth]/route.ts +0 -3
  2743. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/auth/verify/route.ts +0 -46
  2744. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude/[id]/route.ts +0 -31
  2745. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude/[id]/stream/route.ts +0 -63
  2746. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude/route.ts +0 -28
  2747. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude-sessions/[projectName]/entries/route.ts +0 -23
  2748. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude-sessions/[projectName]/live/route.ts +0 -72
  2749. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude-sessions/[projectName]/route.ts +0 -37
  2750. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude-sessions/sync/route.ts +0 -17
  2751. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/claude-templates/route.ts +0 -145
  2752. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/code/route.ts +0 -299
  2753. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/delivery/[id]/route.ts +0 -62
  2754. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/delivery/route.ts +0 -40
  2755. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/detect-cli/route.ts +0 -46
  2756. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/docs/route.ts +0 -176
  2757. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/docs/sessions/route.ts +0 -54
  2758. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/favorites/route.ts +0 -26
  2759. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/flows/route.ts +0 -6
  2760. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/flows/run/route.ts +0 -19
  2761. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/git/route.ts +0 -149
  2762. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/help/route.ts +0 -84
  2763. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/issue-scanner/route.ts +0 -116
  2764. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/logs/route.ts +0 -100
  2765. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/mobile-chat/route.ts +0 -115
  2766. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/monitor/route.ts +0 -74
  2767. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/notifications/route.ts +0 -42
  2768. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/notify/test/route.ts +0 -33
  2769. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/online/route.ts +0 -40
  2770. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/pipelines/[id]/route.ts +0 -41
  2771. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/pipelines/route.ts +0 -90
  2772. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/plugins/route.ts +0 -75
  2773. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/preview/[...path]/route.ts +0 -64
  2774. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/preview/route.ts +0 -156
  2775. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/project-pipelines/route.ts +0 -91
  2776. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/project-sessions/route.ts +0 -61
  2777. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/projects/route.ts +0 -26
  2778. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/sessions/[id]/chat/route.ts +0 -64
  2779. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/sessions/[id]/messages/route.ts +0 -9
  2780. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/sessions/[id]/route.ts +0 -17
  2781. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/sessions/route.ts +0 -20
  2782. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/settings/route.ts +0 -64
  2783. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/skills/local/route.ts +0 -228
  2784. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/skills/route.ts +0 -182
  2785. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/smith-templates/route.ts +0 -81
  2786. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/status/route.ts +0 -12
  2787. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tabs/route.ts +0 -25
  2788. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tasks/[id]/route.ts +0 -51
  2789. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tasks/[id]/stream/route.ts +0 -77
  2790. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tasks/link/route.ts +0 -37
  2791. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tasks/route.ts +0 -44
  2792. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tasks/session/route.ts +0 -14
  2793. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/telegram/route.ts +0 -23
  2794. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/templates/route.ts +0 -6
  2795. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/terminal-bell/route.ts +0 -35
  2796. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/terminal-cwd/route.ts +0 -19
  2797. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/terminal-state/route.ts +0 -15
  2798. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/tunnel/route.ts +0 -26
  2799. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/upgrade/route.ts +0 -43
  2800. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/usage/route.ts +0 -20
  2801. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/version/route.ts +0 -78
  2802. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/watchers/route.ts +0 -33
  2803. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/workspace/[id]/agents/route.ts +0 -35
  2804. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/workspace/[id]/memory/route.ts +0 -23
  2805. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/workspace/[id]/smith/route.ts +0 -22
  2806. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/workspace/[id]/stream/route.ts +0 -28
  2807. package/.forge/worktrees/pipeline-ecd7cb0f/app/api/workspace/route.ts +0 -100
  2808. package/.forge/worktrees/pipeline-ecd7cb0f/app/global-error.tsx +0 -21
  2809. package/.forge/worktrees/pipeline-ecd7cb0f/app/globals.css +0 -52
  2810. package/.forge/worktrees/pipeline-ecd7cb0f/app/icon.ico +0 -0
  2811. package/.forge/worktrees/pipeline-ecd7cb0f/app/icon.png +0 -0
  2812. package/.forge/worktrees/pipeline-ecd7cb0f/app/icon.svg +0 -106
  2813. package/.forge/worktrees/pipeline-ecd7cb0f/app/layout.tsx +0 -17
  2814. package/.forge/worktrees/pipeline-ecd7cb0f/app/login/LoginForm.tsx +0 -96
  2815. package/.forge/worktrees/pipeline-ecd7cb0f/app/login/page.tsx +0 -10
  2816. package/.forge/worktrees/pipeline-ecd7cb0f/app/mobile/page.tsx +0 -9
  2817. package/.forge/worktrees/pipeline-ecd7cb0f/app/page.tsx +0 -21
  2818. package/.forge/worktrees/pipeline-ecd7cb0f/bin/forge-server.mjs +0 -484
  2819. package/.forge/worktrees/pipeline-ecd7cb0f/check-forge-status.sh +0 -71
  2820. package/.forge/worktrees/pipeline-ecd7cb0f/cli/mw.ts +0 -579
  2821. package/.forge/worktrees/pipeline-ecd7cb0f/components/BrowserPanel.tsx +0 -175
  2822. package/.forge/worktrees/pipeline-ecd7cb0f/components/ChatPanel.tsx +0 -191
  2823. package/.forge/worktrees/pipeline-ecd7cb0f/components/ClaudeTerminal.tsx +0 -267
  2824. package/.forge/worktrees/pipeline-ecd7cb0f/components/CodeViewer.tsx +0 -787
  2825. package/.forge/worktrees/pipeline-ecd7cb0f/components/ConversationEditor.tsx +0 -411
  2826. package/.forge/worktrees/pipeline-ecd7cb0f/components/ConversationGraphView.tsx +0 -347
  2827. package/.forge/worktrees/pipeline-ecd7cb0f/components/ConversationTerminalView.tsx +0 -303
  2828. package/.forge/worktrees/pipeline-ecd7cb0f/components/Dashboard.tsx +0 -807
  2829. package/.forge/worktrees/pipeline-ecd7cb0f/components/DashboardWrapper.tsx +0 -9
  2830. package/.forge/worktrees/pipeline-ecd7cb0f/components/DeliveryFlowEditor.tsx +0 -491
  2831. package/.forge/worktrees/pipeline-ecd7cb0f/components/DeliveryList.tsx +0 -230
  2832. package/.forge/worktrees/pipeline-ecd7cb0f/components/DeliveryWorkspace.tsx +0 -589
  2833. package/.forge/worktrees/pipeline-ecd7cb0f/components/DocTerminal.tsx +0 -187
  2834. package/.forge/worktrees/pipeline-ecd7cb0f/components/DocsViewer.tsx +0 -574
  2835. package/.forge/worktrees/pipeline-ecd7cb0f/components/HelpDialog.tsx +0 -169
  2836. package/.forge/worktrees/pipeline-ecd7cb0f/components/HelpTerminal.tsx +0 -141
  2837. package/.forge/worktrees/pipeline-ecd7cb0f/components/InlinePipelineView.tsx +0 -111
  2838. package/.forge/worktrees/pipeline-ecd7cb0f/components/LogViewer.tsx +0 -194
  2839. package/.forge/worktrees/pipeline-ecd7cb0f/components/MarkdownContent.tsx +0 -73
  2840. package/.forge/worktrees/pipeline-ecd7cb0f/components/MobileView.tsx +0 -385
  2841. package/.forge/worktrees/pipeline-ecd7cb0f/components/MonitorPanel.tsx +0 -122
  2842. package/.forge/worktrees/pipeline-ecd7cb0f/components/NewSessionModal.tsx +0 -93
  2843. package/.forge/worktrees/pipeline-ecd7cb0f/components/NewTaskModal.tsx +0 -492
  2844. package/.forge/worktrees/pipeline-ecd7cb0f/components/PipelineEditor.tsx +0 -570
  2845. package/.forge/worktrees/pipeline-ecd7cb0f/components/PipelineView.tsx +0 -1018
  2846. package/.forge/worktrees/pipeline-ecd7cb0f/components/PluginsPanel.tsx +0 -472
  2847. package/.forge/worktrees/pipeline-ecd7cb0f/components/ProjectDetail.tsx +0 -1618
  2848. package/.forge/worktrees/pipeline-ecd7cb0f/components/ProjectList.tsx +0 -108
  2849. package/.forge/worktrees/pipeline-ecd7cb0f/components/ProjectManager.tsx +0 -401
  2850. package/.forge/worktrees/pipeline-ecd7cb0f/components/SessionList.tsx +0 -74
  2851. package/.forge/worktrees/pipeline-ecd7cb0f/components/SessionView.tsx +0 -726
  2852. package/.forge/worktrees/pipeline-ecd7cb0f/components/SettingsModal.tsx +0 -1647
  2853. package/.forge/worktrees/pipeline-ecd7cb0f/components/SkillsPanel.tsx +0 -969
  2854. package/.forge/worktrees/pipeline-ecd7cb0f/components/StatusBar.tsx +0 -99
  2855. package/.forge/worktrees/pipeline-ecd7cb0f/components/TabBar.tsx +0 -46
  2856. package/.forge/worktrees/pipeline-ecd7cb0f/components/TaskBoard.tsx +0 -113
  2857. package/.forge/worktrees/pipeline-ecd7cb0f/components/TaskDetail.tsx +0 -372
  2858. package/.forge/worktrees/pipeline-ecd7cb0f/components/TerminalLauncher.tsx +0 -398
  2859. package/.forge/worktrees/pipeline-ecd7cb0f/components/TunnelToggle.tsx +0 -206
  2860. package/.forge/worktrees/pipeline-ecd7cb0f/components/UsagePanel.tsx +0 -207
  2861. package/.forge/worktrees/pipeline-ecd7cb0f/components/WebTerminal.tsx +0 -1683
  2862. package/.forge/worktrees/pipeline-ecd7cb0f/components/WorkspaceTree.tsx +0 -221
  2863. package/.forge/worktrees/pipeline-ecd7cb0f/components/WorkspaceView.tsx +0 -4048
  2864. package/.forge/worktrees/pipeline-ecd7cb0f/dev-test.sh +0 -5
  2865. package/.forge/worktrees/pipeline-ecd7cb0f/docs/Forge_Memory_Layer_Design.docx +0 -0
  2866. package/.forge/worktrees/pipeline-ecd7cb0f/docs/Forge_Strategy_Research_2026.docx +0 -0
  2867. package/.forge/worktrees/pipeline-ecd7cb0f/docs/LOCAL-DEPLOY.md +0 -144
  2868. package/.forge/worktrees/pipeline-ecd7cb0f/docs/roadmap-multi-agent-workflow.md +0 -330
  2869. package/.forge/worktrees/pipeline-ecd7cb0f/forge-logo.png +0 -0
  2870. package/.forge/worktrees/pipeline-ecd7cb0f/forge-logo.svg +0 -106
  2871. package/.forge/worktrees/pipeline-ecd7cb0f/hooks/useSidebarResize.ts +0 -52
  2872. package/.forge/worktrees/pipeline-ecd7cb0f/install.sh +0 -29
  2873. package/.forge/worktrees/pipeline-ecd7cb0f/instrumentation.ts +0 -35
  2874. package/.forge/worktrees/pipeline-ecd7cb0f/lib/agents/claude-adapter.ts +0 -104
  2875. package/.forge/worktrees/pipeline-ecd7cb0f/lib/agents/generic-adapter.ts +0 -64
  2876. package/.forge/worktrees/pipeline-ecd7cb0f/lib/agents/index.ts +0 -245
  2877. package/.forge/worktrees/pipeline-ecd7cb0f/lib/agents/types.ts +0 -70
  2878. package/.forge/worktrees/pipeline-ecd7cb0f/lib/artifacts.ts +0 -106
  2879. package/.forge/worktrees/pipeline-ecd7cb0f/lib/auth.ts +0 -62
  2880. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/docker.yaml +0 -70
  2881. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/http.yaml +0 -66
  2882. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/jenkins.yaml +0 -92
  2883. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/llm-vision.yaml +0 -85
  2884. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/playwright.yaml +0 -111
  2885. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/shell-command.yaml +0 -60
  2886. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/slack.yaml +0 -48
  2887. package/.forge/worktrees/pipeline-ecd7cb0f/lib/builtin-plugins/webhook.yaml +0 -56
  2888. package/.forge/worktrees/pipeline-ecd7cb0f/lib/claude-process.ts +0 -352
  2889. package/.forge/worktrees/pipeline-ecd7cb0f/lib/claude-sessions.ts +0 -266
  2890. package/.forge/worktrees/pipeline-ecd7cb0f/lib/claude-templates.ts +0 -227
  2891. package/.forge/worktrees/pipeline-ecd7cb0f/lib/cloudflared.ts +0 -424
  2892. package/.forge/worktrees/pipeline-ecd7cb0f/lib/crypto.ts +0 -67
  2893. package/.forge/worktrees/pipeline-ecd7cb0f/lib/delivery.ts +0 -787
  2894. package/.forge/worktrees/pipeline-ecd7cb0f/lib/dirs.ts +0 -99
  2895. package/.forge/worktrees/pipeline-ecd7cb0f/lib/flows.ts +0 -86
  2896. package/.forge/worktrees/pipeline-ecd7cb0f/lib/forge-mcp-server.ts +0 -717
  2897. package/.forge/worktrees/pipeline-ecd7cb0f/lib/forge-skills/forge-inbox.md +0 -38
  2898. package/.forge/worktrees/pipeline-ecd7cb0f/lib/forge-skills/forge-send.md +0 -47
  2899. package/.forge/worktrees/pipeline-ecd7cb0f/lib/forge-skills/forge-status.md +0 -32
  2900. package/.forge/worktrees/pipeline-ecd7cb0f/lib/forge-skills/forge-workspace-sync.md +0 -37
  2901. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/00-overview.md +0 -40
  2902. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/01-settings.md +0 -194
  2903. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/02-telegram.md +0 -41
  2904. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/03-tunnel.md +0 -31
  2905. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/04-tasks.md +0 -52
  2906. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/05-pipelines.md +0 -460
  2907. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/06-skills.md +0 -43
  2908. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/07-projects.md +0 -73
  2909. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/08-rules.md +0 -53
  2910. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/09-issue-autofix.md +0 -55
  2911. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/10-troubleshooting.md +0 -89
  2912. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/11-workspace.md +0 -810
  2913. package/.forge/worktrees/pipeline-ecd7cb0f/lib/help-docs/CLAUDE.md +0 -62
  2914. package/.forge/worktrees/pipeline-ecd7cb0f/lib/init.ts +0 -266
  2915. package/.forge/worktrees/pipeline-ecd7cb0f/lib/issue-scanner.ts +0 -298
  2916. package/.forge/worktrees/pipeline-ecd7cb0f/lib/logger.ts +0 -79
  2917. package/.forge/worktrees/pipeline-ecd7cb0f/lib/notifications.ts +0 -75
  2918. package/.forge/worktrees/pipeline-ecd7cb0f/lib/notify.ts +0 -108
  2919. package/.forge/worktrees/pipeline-ecd7cb0f/lib/password.ts +0 -97
  2920. package/.forge/worktrees/pipeline-ecd7cb0f/lib/pipeline-scheduler.ts +0 -373
  2921. package/.forge/worktrees/pipeline-ecd7cb0f/lib/pipeline.ts +0 -1441
  2922. package/.forge/worktrees/pipeline-ecd7cb0f/lib/plugins/executor.ts +0 -347
  2923. package/.forge/worktrees/pipeline-ecd7cb0f/lib/plugins/registry.ts +0 -228
  2924. package/.forge/worktrees/pipeline-ecd7cb0f/lib/plugins/types.ts +0 -103
  2925. package/.forge/worktrees/pipeline-ecd7cb0f/lib/project-sessions.ts +0 -53
  2926. package/.forge/worktrees/pipeline-ecd7cb0f/lib/projects.ts +0 -86
  2927. package/.forge/worktrees/pipeline-ecd7cb0f/lib/session-manager.ts +0 -156
  2928. package/.forge/worktrees/pipeline-ecd7cb0f/lib/session-utils.ts +0 -53
  2929. package/.forge/worktrees/pipeline-ecd7cb0f/lib/session-watcher.ts +0 -345
  2930. package/.forge/worktrees/pipeline-ecd7cb0f/lib/settings.ts +0 -195
  2931. package/.forge/worktrees/pipeline-ecd7cb0f/lib/skills.ts +0 -458
  2932. package/.forge/worktrees/pipeline-ecd7cb0f/lib/task-manager.ts +0 -949
  2933. package/.forge/worktrees/pipeline-ecd7cb0f/lib/telegram-bot.ts +0 -1477
  2934. package/.forge/worktrees/pipeline-ecd7cb0f/lib/telegram-standalone.ts +0 -83
  2935. package/.forge/worktrees/pipeline-ecd7cb0f/lib/terminal-server.ts +0 -70
  2936. package/.forge/worktrees/pipeline-ecd7cb0f/lib/terminal-standalone.ts +0 -421
  2937. package/.forge/worktrees/pipeline-ecd7cb0f/lib/usage-scanner.ts +0 -249
  2938. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/__tests__/state-machine.test.ts +0 -388
  2939. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/__tests__/workspace.test.ts +0 -311
  2940. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/agent-bus.ts +0 -416
  2941. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/agent-worker.ts +0 -655
  2942. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/backends/api-backend.ts +0 -262
  2943. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/backends/cli-backend.ts +0 -491
  2944. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/index.ts +0 -82
  2945. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/manager.ts +0 -136
  2946. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/orchestrator.ts +0 -3400
  2947. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/persistence.ts +0 -309
  2948. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/presets.ts +0 -649
  2949. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/requests.ts +0 -287
  2950. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/session-monitor.ts +0 -240
  2951. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/skill-installer.ts +0 -275
  2952. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/smith-memory.ts +0 -498
  2953. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/types.ts +0 -241
  2954. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace/watch-manager.ts +0 -560
  2955. package/.forge/worktrees/pipeline-ecd7cb0f/lib/workspace-standalone.ts +0 -911
  2956. package/.forge/worktrees/pipeline-ecd7cb0f/middleware.ts +0 -51
  2957. package/.forge/worktrees/pipeline-ecd7cb0f/next.config.ts +0 -26
  2958. package/.forge/worktrees/pipeline-ecd7cb0f/package.json +0 -74
  2959. package/.forge/worktrees/pipeline-ecd7cb0f/pnpm-lock.yaml +0 -3719
  2960. package/.forge/worktrees/pipeline-ecd7cb0f/pnpm-workspace.yaml +0 -1
  2961. package/.forge/worktrees/pipeline-ecd7cb0f/postcss.config.mjs +0 -7
  2962. package/.forge/worktrees/pipeline-ecd7cb0f/publish.sh +0 -133
  2963. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/README.md +0 -66
  2964. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/results/.gitignore +0 -2
  2965. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/run.ts +0 -635
  2966. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/01-text-utils/task.md +0 -26
  2967. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/01-text-utils/validator.sh +0 -46
  2968. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/02-pagination/setup.sh +0 -19
  2969. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/02-pagination/task.md +0 -48
  2970. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/02-pagination/validator.sh +0 -69
  2971. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/03-bug-fix/setup.sh +0 -82
  2972. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/03-bug-fix/task.md +0 -30
  2973. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/bench/tasks/03-bug-fix/validator.sh +0 -29
  2974. package/.forge/worktrees/pipeline-ecd7cb0f/scripts/verify-usage.ts +0 -178
  2975. package/.forge/worktrees/pipeline-ecd7cb0f/src/config/index.ts +0 -129
  2976. package/.forge/worktrees/pipeline-ecd7cb0f/src/core/db/database.ts +0 -259
  2977. package/.forge/worktrees/pipeline-ecd7cb0f/src/core/memory/strategy.ts +0 -32
  2978. package/.forge/worktrees/pipeline-ecd7cb0f/src/core/providers/chat.ts +0 -65
  2979. package/.forge/worktrees/pipeline-ecd7cb0f/src/core/providers/registry.ts +0 -60
  2980. package/.forge/worktrees/pipeline-ecd7cb0f/src/core/session/manager.ts +0 -190
  2981. package/.forge/worktrees/pipeline-ecd7cb0f/src/types/index.ts +0 -129
  2982. package/.forge/worktrees/pipeline-ecd7cb0f/start.sh +0 -31
  2983. package/.forge/worktrees/pipeline-ecd7cb0f/templates/smith-lead.json +0 -45
  2984. package/.forge/worktrees/pipeline-ecd7cb0f/tsconfig.json +0 -42
  2985. package/qa/.forge/agent-context.json +0 -6
  2986. 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
- );