@aion0/forge 0.5.40 → 0.5.42

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