@aion0/forge 0.5.26 → 0.5.27

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 (253) hide show
  1. package/.forge/worktrees/pipeline-4dd8dc2d/CLAUDE.md +86 -0
  2. package/.forge/worktrees/pipeline-4dd8dc2d/README.md +136 -0
  3. package/.forge/worktrees/pipeline-4dd8dc2d/RELEASE_NOTES.md +36 -0
  4. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/agents/route.ts +17 -0
  5. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/auth/[...nextauth]/route.ts +3 -0
  6. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/auth/verify/route.ts +46 -0
  7. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude/[id]/route.ts +31 -0
  8. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude/[id]/stream/route.ts +63 -0
  9. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude/route.ts +28 -0
  10. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/[projectName]/entries/route.ts +23 -0
  11. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/[projectName]/live/route.ts +72 -0
  12. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/[projectName]/route.ts +37 -0
  13. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-sessions/sync/route.ts +17 -0
  14. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/claude-templates/route.ts +145 -0
  15. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/code/route.ts +299 -0
  16. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/delivery/[id]/route.ts +62 -0
  17. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/delivery/route.ts +40 -0
  18. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/detect-cli/route.ts +46 -0
  19. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/docs/route.ts +176 -0
  20. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/docs/sessions/route.ts +54 -0
  21. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/favorites/route.ts +26 -0
  22. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/flows/route.ts +6 -0
  23. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/flows/run/route.ts +19 -0
  24. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/git/route.ts +149 -0
  25. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/help/route.ts +84 -0
  26. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/issue-scanner/route.ts +116 -0
  27. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/logs/route.ts +100 -0
  28. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/mobile-chat/route.ts +115 -0
  29. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/monitor/route.ts +74 -0
  30. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/notifications/route.ts +42 -0
  31. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/notify/test/route.ts +33 -0
  32. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/online/route.ts +40 -0
  33. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/pipelines/[id]/route.ts +41 -0
  34. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/pipelines/route.ts +90 -0
  35. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/plugins/route.ts +75 -0
  36. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/preview/[...path]/route.ts +64 -0
  37. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/preview/route.ts +156 -0
  38. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/project-pipelines/route.ts +91 -0
  39. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/project-sessions/route.ts +61 -0
  40. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/projects/route.ts +26 -0
  41. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/[id]/chat/route.ts +64 -0
  42. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/[id]/messages/route.ts +9 -0
  43. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/[id]/route.ts +17 -0
  44. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/sessions/route.ts +20 -0
  45. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/settings/route.ts +64 -0
  46. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/skills/local/route.ts +228 -0
  47. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/skills/route.ts +182 -0
  48. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/smith-templates/route.ts +81 -0
  49. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/status/route.ts +12 -0
  50. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tabs/route.ts +25 -0
  51. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/[id]/route.ts +51 -0
  52. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/[id]/stream/route.ts +77 -0
  53. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/link/route.ts +37 -0
  54. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/route.ts +44 -0
  55. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tasks/session/route.ts +14 -0
  56. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/telegram/route.ts +23 -0
  57. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/templates/route.ts +6 -0
  58. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/terminal-bell/route.ts +39 -0
  59. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/terminal-cwd/route.ts +19 -0
  60. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/terminal-state/route.ts +15 -0
  61. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/tunnel/route.ts +26 -0
  62. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/upgrade/route.ts +43 -0
  63. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/usage/route.ts +20 -0
  64. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/version/route.ts +78 -0
  65. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/watchers/route.ts +33 -0
  66. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/agents/route.ts +35 -0
  67. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/memory/route.ts +23 -0
  68. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/smith/route.ts +22 -0
  69. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/[id]/stream/route.ts +31 -0
  70. package/.forge/worktrees/pipeline-4dd8dc2d/app/api/workspace/route.ts +79 -0
  71. package/.forge/worktrees/pipeline-4dd8dc2d/app/global-error.tsx +21 -0
  72. package/.forge/worktrees/pipeline-4dd8dc2d/app/globals.css +52 -0
  73. package/.forge/worktrees/pipeline-4dd8dc2d/app/icon.ico +0 -0
  74. package/.forge/worktrees/pipeline-4dd8dc2d/app/icon.png +0 -0
  75. package/.forge/worktrees/pipeline-4dd8dc2d/app/icon.svg +106 -0
  76. package/.forge/worktrees/pipeline-4dd8dc2d/app/layout.tsx +17 -0
  77. package/.forge/worktrees/pipeline-4dd8dc2d/app/login/LoginForm.tsx +96 -0
  78. package/.forge/worktrees/pipeline-4dd8dc2d/app/login/page.tsx +10 -0
  79. package/.forge/worktrees/pipeline-4dd8dc2d/app/mobile/page.tsx +10 -0
  80. package/.forge/worktrees/pipeline-4dd8dc2d/app/page.tsx +22 -0
  81. package/.forge/worktrees/pipeline-4dd8dc2d/bin/forge-server.mjs +484 -0
  82. package/.forge/worktrees/pipeline-4dd8dc2d/check-forge-status.sh +71 -0
  83. package/.forge/worktrees/pipeline-4dd8dc2d/cli/mw.ts +579 -0
  84. package/.forge/worktrees/pipeline-4dd8dc2d/components/BrowserPanel.tsx +175 -0
  85. package/.forge/worktrees/pipeline-4dd8dc2d/components/ChatPanel.tsx +191 -0
  86. package/.forge/worktrees/pipeline-4dd8dc2d/components/ClaudeTerminal.tsx +267 -0
  87. package/.forge/worktrees/pipeline-4dd8dc2d/components/CodeViewer.tsx +787 -0
  88. package/.forge/worktrees/pipeline-4dd8dc2d/components/ConversationEditor.tsx +411 -0
  89. package/.forge/worktrees/pipeline-4dd8dc2d/components/ConversationGraphView.tsx +347 -0
  90. package/.forge/worktrees/pipeline-4dd8dc2d/components/ConversationTerminalView.tsx +303 -0
  91. package/.forge/worktrees/pipeline-4dd8dc2d/components/Dashboard.tsx +807 -0
  92. package/.forge/worktrees/pipeline-4dd8dc2d/components/DashboardWrapper.tsx +9 -0
  93. package/.forge/worktrees/pipeline-4dd8dc2d/components/DeliveryFlowEditor.tsx +491 -0
  94. package/.forge/worktrees/pipeline-4dd8dc2d/components/DeliveryList.tsx +230 -0
  95. package/.forge/worktrees/pipeline-4dd8dc2d/components/DeliveryWorkspace.tsx +589 -0
  96. package/.forge/worktrees/pipeline-4dd8dc2d/components/DocTerminal.tsx +187 -0
  97. package/.forge/worktrees/pipeline-4dd8dc2d/components/DocsViewer.tsx +574 -0
  98. package/.forge/worktrees/pipeline-4dd8dc2d/components/HelpDialog.tsx +169 -0
  99. package/.forge/worktrees/pipeline-4dd8dc2d/components/HelpTerminal.tsx +141 -0
  100. package/.forge/worktrees/pipeline-4dd8dc2d/components/InlinePipelineView.tsx +111 -0
  101. package/.forge/worktrees/pipeline-4dd8dc2d/components/LogViewer.tsx +194 -0
  102. package/.forge/worktrees/pipeline-4dd8dc2d/components/MarkdownContent.tsx +73 -0
  103. package/.forge/worktrees/pipeline-4dd8dc2d/components/MobileView.tsx +385 -0
  104. package/.forge/worktrees/pipeline-4dd8dc2d/components/MonitorPanel.tsx +122 -0
  105. package/.forge/worktrees/pipeline-4dd8dc2d/components/NewSessionModal.tsx +93 -0
  106. package/.forge/worktrees/pipeline-4dd8dc2d/components/NewTaskModal.tsx +492 -0
  107. package/.forge/worktrees/pipeline-4dd8dc2d/components/PipelineEditor.tsx +570 -0
  108. package/.forge/worktrees/pipeline-4dd8dc2d/components/PipelineView.tsx +1018 -0
  109. package/.forge/worktrees/pipeline-4dd8dc2d/components/PluginsPanel.tsx +472 -0
  110. package/.forge/worktrees/pipeline-4dd8dc2d/components/ProjectDetail.tsx +1618 -0
  111. package/.forge/worktrees/pipeline-4dd8dc2d/components/ProjectList.tsx +108 -0
  112. package/.forge/worktrees/pipeline-4dd8dc2d/components/ProjectManager.tsx +401 -0
  113. package/.forge/worktrees/pipeline-4dd8dc2d/components/SessionList.tsx +74 -0
  114. package/.forge/worktrees/pipeline-4dd8dc2d/components/SessionView.tsx +726 -0
  115. package/.forge/worktrees/pipeline-4dd8dc2d/components/SettingsModal.tsx +1647 -0
  116. package/.forge/worktrees/pipeline-4dd8dc2d/components/SkillsPanel.tsx +969 -0
  117. package/.forge/worktrees/pipeline-4dd8dc2d/components/StatusBar.tsx +99 -0
  118. package/.forge/worktrees/pipeline-4dd8dc2d/components/TabBar.tsx +46 -0
  119. package/.forge/worktrees/pipeline-4dd8dc2d/components/TaskBoard.tsx +113 -0
  120. package/.forge/worktrees/pipeline-4dd8dc2d/components/TaskDetail.tsx +372 -0
  121. package/.forge/worktrees/pipeline-4dd8dc2d/components/TerminalLauncher.tsx +398 -0
  122. package/.forge/worktrees/pipeline-4dd8dc2d/components/TunnelToggle.tsx +206 -0
  123. package/.forge/worktrees/pipeline-4dd8dc2d/components/UsagePanel.tsx +207 -0
  124. package/.forge/worktrees/pipeline-4dd8dc2d/components/WebTerminal.tsx +1743 -0
  125. package/.forge/worktrees/pipeline-4dd8dc2d/components/WorkspaceTree.tsx +221 -0
  126. package/.forge/worktrees/pipeline-4dd8dc2d/components/WorkspaceView.tsx +4048 -0
  127. package/.forge/worktrees/pipeline-4dd8dc2d/dev-test.sh +5 -0
  128. package/.forge/worktrees/pipeline-4dd8dc2d/docs/Forge_Memory_Layer_Design.docx +0 -0
  129. package/.forge/worktrees/pipeline-4dd8dc2d/docs/Forge_Strategy_Research_2026.docx +0 -0
  130. package/.forge/worktrees/pipeline-4dd8dc2d/docs/LOCAL-DEPLOY.md +144 -0
  131. package/.forge/worktrees/pipeline-4dd8dc2d/docs/roadmap-multi-agent-workflow.md +330 -0
  132. package/.forge/worktrees/pipeline-4dd8dc2d/forge-logo.png +0 -0
  133. package/.forge/worktrees/pipeline-4dd8dc2d/forge-logo.svg +106 -0
  134. package/.forge/worktrees/pipeline-4dd8dc2d/hooks/useSidebarResize.ts +52 -0
  135. package/.forge/worktrees/pipeline-4dd8dc2d/install.sh +29 -0
  136. package/.forge/worktrees/pipeline-4dd8dc2d/instrumentation.ts +35 -0
  137. package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/claude-adapter.ts +104 -0
  138. package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/generic-adapter.ts +64 -0
  139. package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/index.ts +245 -0
  140. package/.forge/worktrees/pipeline-4dd8dc2d/lib/agents/types.ts +70 -0
  141. package/.forge/worktrees/pipeline-4dd8dc2d/lib/artifacts.ts +106 -0
  142. package/.forge/worktrees/pipeline-4dd8dc2d/lib/auth.ts +62 -0
  143. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/docker.yaml +70 -0
  144. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/http.yaml +66 -0
  145. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/jenkins.yaml +92 -0
  146. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/llm-vision.yaml +85 -0
  147. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/playwright.yaml +111 -0
  148. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/shell-command.yaml +60 -0
  149. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/slack.yaml +48 -0
  150. package/.forge/worktrees/pipeline-4dd8dc2d/lib/builtin-plugins/webhook.yaml +56 -0
  151. package/.forge/worktrees/pipeline-4dd8dc2d/lib/claude-process.ts +361 -0
  152. package/.forge/worktrees/pipeline-4dd8dc2d/lib/claude-sessions.ts +266 -0
  153. package/.forge/worktrees/pipeline-4dd8dc2d/lib/claude-templates.ts +227 -0
  154. package/.forge/worktrees/pipeline-4dd8dc2d/lib/cloudflared.ts +424 -0
  155. package/.forge/worktrees/pipeline-4dd8dc2d/lib/crypto.ts +67 -0
  156. package/.forge/worktrees/pipeline-4dd8dc2d/lib/delivery.ts +787 -0
  157. package/.forge/worktrees/pipeline-4dd8dc2d/lib/dirs.ts +99 -0
  158. package/.forge/worktrees/pipeline-4dd8dc2d/lib/flows.ts +86 -0
  159. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-mcp-server.ts +732 -0
  160. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-inbox.md +38 -0
  161. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-send.md +47 -0
  162. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-status.md +32 -0
  163. package/.forge/worktrees/pipeline-4dd8dc2d/lib/forge-skills/forge-workspace-sync.md +37 -0
  164. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/00-overview.md +40 -0
  165. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/01-settings.md +194 -0
  166. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/02-telegram.md +41 -0
  167. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/03-tunnel.md +31 -0
  168. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/04-tasks.md +52 -0
  169. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/05-pipelines.md +460 -0
  170. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/06-skills.md +43 -0
  171. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/07-projects.md +73 -0
  172. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/08-rules.md +53 -0
  173. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/09-issue-autofix.md +55 -0
  174. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/10-troubleshooting.md +89 -0
  175. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/11-workspace.md +810 -0
  176. package/.forge/worktrees/pipeline-4dd8dc2d/lib/help-docs/CLAUDE.md +62 -0
  177. package/.forge/worktrees/pipeline-4dd8dc2d/lib/init.ts +266 -0
  178. package/.forge/worktrees/pipeline-4dd8dc2d/lib/issue-scanner.ts +298 -0
  179. package/.forge/worktrees/pipeline-4dd8dc2d/lib/logger.ts +79 -0
  180. package/.forge/worktrees/pipeline-4dd8dc2d/lib/notifications.ts +75 -0
  181. package/.forge/worktrees/pipeline-4dd8dc2d/lib/notify.ts +108 -0
  182. package/.forge/worktrees/pipeline-4dd8dc2d/lib/password.ts +97 -0
  183. package/.forge/worktrees/pipeline-4dd8dc2d/lib/pipeline-scheduler.ts +373 -0
  184. package/.forge/worktrees/pipeline-4dd8dc2d/lib/pipeline.ts +1565 -0
  185. package/.forge/worktrees/pipeline-4dd8dc2d/lib/plugins/executor.ts +347 -0
  186. package/.forge/worktrees/pipeline-4dd8dc2d/lib/plugins/registry.ts +228 -0
  187. package/.forge/worktrees/pipeline-4dd8dc2d/lib/plugins/types.ts +103 -0
  188. package/.forge/worktrees/pipeline-4dd8dc2d/lib/project-sessions.ts +53 -0
  189. package/.forge/worktrees/pipeline-4dd8dc2d/lib/projects.ts +86 -0
  190. package/.forge/worktrees/pipeline-4dd8dc2d/lib/session-manager.ts +156 -0
  191. package/.forge/worktrees/pipeline-4dd8dc2d/lib/session-utils.ts +53 -0
  192. package/.forge/worktrees/pipeline-4dd8dc2d/lib/session-watcher.ts +345 -0
  193. package/.forge/worktrees/pipeline-4dd8dc2d/lib/settings.ts +195 -0
  194. package/.forge/worktrees/pipeline-4dd8dc2d/lib/skills.ts +458 -0
  195. package/.forge/worktrees/pipeline-4dd8dc2d/lib/task-manager.ts +951 -0
  196. package/.forge/worktrees/pipeline-4dd8dc2d/lib/telegram-bot.ts +1477 -0
  197. package/.forge/worktrees/pipeline-4dd8dc2d/lib/telegram-standalone.ts +83 -0
  198. package/.forge/worktrees/pipeline-4dd8dc2d/lib/terminal-server.ts +70 -0
  199. package/.forge/worktrees/pipeline-4dd8dc2d/lib/terminal-standalone.ts +438 -0
  200. package/.forge/worktrees/pipeline-4dd8dc2d/lib/usage-scanner.ts +249 -0
  201. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/__tests__/state-machine.test.ts +388 -0
  202. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/__tests__/workspace.test.ts +311 -0
  203. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/agent-bus.ts +416 -0
  204. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/agent-worker.ts +655 -0
  205. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/backends/api-backend.ts +262 -0
  206. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/backends/cli-backend.ts +491 -0
  207. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/index.ts +84 -0
  208. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/manager.ts +136 -0
  209. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/orchestrator.ts +3415 -0
  210. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/persistence.ts +309 -0
  211. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/presets.ts +649 -0
  212. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/requests.ts +287 -0
  213. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/session-monitor.ts +240 -0
  214. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/skill-installer.ts +275 -0
  215. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/smith-memory.ts +498 -0
  216. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/types.ts +241 -0
  217. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace/watch-manager.ts +560 -0
  218. package/.forge/worktrees/pipeline-4dd8dc2d/lib/workspace-standalone.ts +978 -0
  219. package/.forge/worktrees/pipeline-4dd8dc2d/middleware.ts +51 -0
  220. package/.forge/worktrees/pipeline-4dd8dc2d/next.config.ts +26 -0
  221. package/.forge/worktrees/pipeline-4dd8dc2d/package.json +74 -0
  222. package/.forge/worktrees/pipeline-4dd8dc2d/pnpm-lock.yaml +3719 -0
  223. package/.forge/worktrees/pipeline-4dd8dc2d/pnpm-workspace.yaml +1 -0
  224. package/.forge/worktrees/pipeline-4dd8dc2d/postcss.config.mjs +7 -0
  225. package/.forge/worktrees/pipeline-4dd8dc2d/publish.sh +133 -0
  226. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/README.md +66 -0
  227. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/results/.gitignore +2 -0
  228. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/run.ts +635 -0
  229. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/01-text-utils/task.md +26 -0
  230. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/01-text-utils/validator.sh +46 -0
  231. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/02-pagination/setup.sh +19 -0
  232. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/02-pagination/task.md +48 -0
  233. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/02-pagination/validator.sh +69 -0
  234. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/03-bug-fix/setup.sh +82 -0
  235. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/03-bug-fix/task.md +30 -0
  236. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/bench/tasks/03-bug-fix/validator.sh +29 -0
  237. package/.forge/worktrees/pipeline-4dd8dc2d/scripts/verify-usage.ts +178 -0
  238. package/.forge/worktrees/pipeline-4dd8dc2d/src/config/index.ts +129 -0
  239. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/db/database.ts +259 -0
  240. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/memory/strategy.ts +32 -0
  241. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/providers/chat.ts +65 -0
  242. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/providers/registry.ts +60 -0
  243. package/.forge/worktrees/pipeline-4dd8dc2d/src/core/session/manager.ts +190 -0
  244. package/.forge/worktrees/pipeline-4dd8dc2d/src/types/index.ts +129 -0
  245. package/.forge/worktrees/pipeline-4dd8dc2d/start.sh +32 -0
  246. package/.forge/worktrees/pipeline-4dd8dc2d/templates/smith-lead.json +45 -0
  247. package/.forge/worktrees/pipeline-4dd8dc2d/tsconfig.json +42 -0
  248. package/RELEASE_NOTES.md +11 -28
  249. package/app/api/terminal-bell/route.ts +6 -2
  250. package/components/WebTerminal.tsx +36 -2
  251. package/lib/terminal-standalone.ts +19 -2
  252. package/next-env.d.ts +1 -1
  253. package/package.json +1 -1
@@ -0,0 +1,416 @@
1
+ /**
2
+ * Agent Bus — reliable one-to-one message delivery for workspace agents.
3
+ *
4
+ * Features:
5
+ * - One-to-one delivery (no broadcast)
6
+ * - ACK confirmation from receiver
7
+ * - 30-second retry on no ACK (max 3 retries)
8
+ * - Message dedup by ID
9
+ * - Outbox for messages to down/unavailable agents
10
+ * - Inbox persistence per agent
11
+ */
12
+
13
+ import { EventEmitter } from 'node:events';
14
+ import { randomUUID } from 'node:crypto';
15
+ import type { BusMessage, AgentLiveness, MessageCategory } from './types';
16
+
17
+ const ACK_TIMEOUT_MS = 30_000;
18
+ const MAX_RETRIES = 3;
19
+
20
+ export class AgentBus extends EventEmitter {
21
+ private log: BusMessage[] = [];
22
+ private seen = new Set<string>(); // dedup: message IDs already processed
23
+ private outbox = new Map<string, BusMessage[]>(); // agentId → undelivered messages
24
+ private pendingAcks = new Map<string, { timer: NodeJS.Timeout; msg: BusMessage; retries: number }>();
25
+ private pendingRequests = new Map<string, { resolve: (msg: BusMessage) => void; timer: NodeJS.Timeout }>();
26
+ private agentStatus = new Map<string, AgentLiveness>();
27
+
28
+ // ─── Agent status tracking ─────────────────────────────
29
+
30
+ setAgentStatus(agentId: string, status: AgentLiveness): void {
31
+ const prev = this.agentStatus.get(agentId);
32
+ this.agentStatus.set(agentId, status);
33
+
34
+ // If agent came back alive, flush its outbox
35
+ if (status === 'alive' && prev === 'down') {
36
+ this.flushOutbox(agentId);
37
+ }
38
+ }
39
+
40
+ getAgentStatus(agentId: string): AgentLiveness {
41
+ return this.agentStatus.get(agentId) || 'down';
42
+ }
43
+
44
+ // ─── Send (one-to-one, reliable) ──────────────────────
45
+
46
+ send(from: string, to: string, type: BusMessage['type'], payload: BusMessage['payload'], options?: {
47
+ category?: MessageCategory;
48
+ causedBy?: BusMessage['causedBy'];
49
+ ticketStatus?: BusMessage['ticketStatus'];
50
+ maxRetries?: number;
51
+ }): BusMessage {
52
+ const msg: BusMessage = {
53
+ id: randomUUID(),
54
+ from, to, type, payload,
55
+ timestamp: Date.now(),
56
+ status: 'pending',
57
+ retries: 0,
58
+ category: options?.category || 'notification',
59
+ causedBy: options?.causedBy,
60
+ ticketStatus: options?.ticketStatus,
61
+ ticketRetries: 0,
62
+ maxRetries: options?.maxRetries ?? 3,
63
+ };
64
+
65
+ this.log.push(msg);
66
+ this.emit('message', msg);
67
+
68
+ // ACK messages don't need delivery tracking
69
+ if (type === 'ack') {
70
+ this.handleAck(msg);
71
+ return msg;
72
+ }
73
+
74
+ // Check if target is available
75
+ const targetStatus = this.getAgentStatus(to);
76
+ if (targetStatus === 'down') {
77
+ // Store in outbox, deliver when agent comes back
78
+ this.addToOutbox(to, msg);
79
+ return msg;
80
+ }
81
+
82
+ // No ACK timer — in same-process architecture, messages are handled synchronously
83
+ // Status is managed directly by orchestrator (pending → acked/failed)
84
+
85
+ // Check if this resolves a pending request
86
+ if (type === 'response' && payload.replyTo) {
87
+ const pending = this.pendingRequests.get(payload.replyTo);
88
+ if (pending) {
89
+ clearTimeout(pending.timer);
90
+ this.pendingRequests.delete(payload.replyTo);
91
+ pending.resolve(msg);
92
+ }
93
+ }
94
+
95
+ return msg;
96
+ }
97
+
98
+ /** Convenience: send ACK back to original sender */
99
+ ack(receiverId: string, senderId: string, messageId: string): void {
100
+ this.send(receiverId, senderId, 'ack', { action: 'ack', replyTo: messageId });
101
+ }
102
+
103
+ // ─── Request-Response ──────────────────────────────────
104
+
105
+ request(from: string, to: string, payload: BusMessage['payload'], timeoutMs = 300_000): Promise<BusMessage> {
106
+ const msg = this.send(from, to, 'request', payload);
107
+
108
+ return new Promise<BusMessage>((resolve, reject) => {
109
+ const timer = setTimeout(() => {
110
+ this.pendingRequests.delete(msg.id);
111
+ reject(new Error(`Bus request timed out: ${payload.action}`));
112
+ }, timeoutMs);
113
+
114
+ this.pendingRequests.set(msg.id, { resolve, timer });
115
+ });
116
+ }
117
+
118
+ // ─── Convenience methods ───────────────────────────────
119
+
120
+ notifyTaskComplete(agentId: string, files: string[], summary?: string): void {
121
+ // Only notify agents that depend on this one — caller handles routing
122
+ this.log.push({
123
+ id: randomUUID(),
124
+ from: agentId, to: '_system', type: 'notify',
125
+ payload: { action: 'task_complete', content: summary, files },
126
+ timestamp: Date.now(),
127
+ status: 'done',
128
+ });
129
+ this.emit('message', this.log[this.log.length - 1]);
130
+ }
131
+
132
+ notifyStepComplete(agentId: string, stepLabel: string, files?: string[]): void {
133
+ this.log.push({
134
+ id: randomUUID(),
135
+ from: agentId, to: '_system', type: 'notify',
136
+ payload: { action: 'step_complete', content: `Step "${stepLabel}" completed`, files },
137
+ timestamp: Date.now(),
138
+ status: 'done',
139
+ });
140
+ this.emit('message', this.log[this.log.length - 1]);
141
+ }
142
+
143
+ notifyError(agentId: string, error: string): void {
144
+ this.log.push({
145
+ id: randomUUID(),
146
+ from: agentId, to: '_system', type: 'notify',
147
+ payload: { action: 'error', content: error },
148
+ timestamp: Date.now(),
149
+ status: 'done',
150
+ });
151
+ this.emit('message', this.log[this.log.length - 1]);
152
+ }
153
+
154
+ // ─── ACK handling ──────────────────────────────────────
155
+
156
+ private handleAck(ackMsg: BusMessage): void {
157
+ const originalId = ackMsg.payload.replyTo;
158
+ if (!originalId) return;
159
+
160
+ const pending = this.pendingAcks.get(originalId);
161
+ if (pending) {
162
+ clearTimeout(pending.timer);
163
+ this.pendingAcks.delete(originalId);
164
+ pending.msg.status = 'done';
165
+ }
166
+ }
167
+
168
+ private startAckTimer(msg: BusMessage): void {
169
+ const timer = setTimeout(() => {
170
+ this.retryAckTimeout(msg);
171
+ }, ACK_TIMEOUT_MS);
172
+
173
+ this.pendingAcks.set(msg.id, { timer, msg, retries: 0 });
174
+ }
175
+
176
+ private retryAckTimeout(msg: BusMessage): void {
177
+ const pending = this.pendingAcks.get(msg.id);
178
+ if (!pending) return;
179
+
180
+ pending.retries++;
181
+ msg.retries = pending.retries;
182
+
183
+ if (pending.retries >= MAX_RETRIES) {
184
+ // Give up — mark as failed
185
+ this.pendingAcks.delete(msg.id);
186
+ msg.status = 'failed';
187
+ console.log(`[bus] Message to ${msg.to} failed after ${MAX_RETRIES} retries: ${msg.payload.action}`);
188
+ return;
189
+ }
190
+
191
+ console.log(`[bus] Retrying message to ${msg.to} (attempt ${pending.retries + 1}): ${msg.payload.action}`);
192
+
193
+ // Check if target is still available
194
+ if (this.getAgentStatus(msg.to) === 'down') {
195
+ this.pendingAcks.delete(msg.id);
196
+ this.addToOutbox(msg.to, msg);
197
+ return;
198
+ }
199
+
200
+ // Re-emit for delivery
201
+ this.emit('message', msg);
202
+
203
+ // Reset timer
204
+ pending.timer = setTimeout(() => {
205
+ this.retryAckTimeout(msg);
206
+ }, ACK_TIMEOUT_MS);
207
+ }
208
+
209
+ // ─── Outbox (for down agents) ──────────────────────────
210
+
211
+ private addToOutbox(agentId: string, msg: BusMessage): void {
212
+ if (!this.outbox.has(agentId)) this.outbox.set(agentId, []);
213
+ this.outbox.get(agentId)!.push(msg);
214
+ msg.status = 'pending';
215
+ console.log(`[bus] Agent ${agentId} is down, queued message: ${msg.payload.action}`);
216
+ }
217
+
218
+ private flushOutbox(agentId: string): void {
219
+ const queued = this.outbox.get(agentId);
220
+ if (!queued || queued.length === 0) return;
221
+
222
+ console.log(`[bus] Agent ${agentId} is back, flushing ${queued.length} queued messages`);
223
+ this.outbox.delete(agentId);
224
+
225
+ for (const msg of queued) {
226
+ // Remove from seen set so handleBusMessage won't dedup it
227
+ this.unsee(msg.id);
228
+ this.emit('message', msg);
229
+ }
230
+ }
231
+
232
+ // ─── Dedup ─────────────────────────────────────────────
233
+
234
+ /** Check if a message was already processed (for receiver side) */
235
+ isDuplicate(messageId: string): boolean {
236
+ if (this.seen.has(messageId)) return true;
237
+ this.seen.add(messageId);
238
+ // Keep seen set bounded
239
+ if (this.seen.size > 1000) {
240
+ const arr = Array.from(this.seen);
241
+ this.seen = new Set(arr.slice(-500));
242
+ }
243
+ return false;
244
+ }
245
+
246
+ /** Remove a message ID from the seen set (allow re-processing, e.g. after outbox flush) */
247
+ unsee(messageId: string): void {
248
+ this.seen.delete(messageId);
249
+ }
250
+
251
+ /** Mark a message as delivered by ID */
252
+ markDelivered(messageId: string): void {
253
+ const msg = this.log.find(m => m.id === messageId);
254
+ if (msg && msg.status === 'pending') {
255
+ msg.status = 'done';
256
+ }
257
+ }
258
+
259
+ /** Get undelivered messages for an agent (pending status only, excludes ACKs) */
260
+ getPendingMessagesFor(agentId: string): BusMessage[] {
261
+ return this.log.filter(m => m.to === agentId && m.status === 'pending' && m.type !== 'ack');
262
+ }
263
+
264
+ /** Retry a failed message by ID — mark as pending and re-emit for delivery */
265
+ /** Retry/re-run a message — set back to pending and re-deliver */
266
+ retryMessage(messageId: string): BusMessage | null {
267
+ const msg = this.log.find(m => m.id === messageId);
268
+ if (!msg || msg.status === 'pending' || msg.status === 'pending_approval' || msg.status === 'running') return null;
269
+ msg.status = 'pending';
270
+ msg.retries = 0;
271
+ this.unsee(messageId);
272
+ console.log(`[bus] Retrying message ${messageId.slice(0, 8)} (${msg.payload.action})`);
273
+ return msg;
274
+ }
275
+
276
+ /** Create a ticket (1-to-1, ignores DAG direction) */
277
+ createTicket(from: string, to: string, action: string, content: string, files?: string[], causedBy?: BusMessage['causedBy']): BusMessage {
278
+ return this.send(from, to, 'request', { action, content, files }, {
279
+ category: 'ticket',
280
+ causedBy,
281
+ ticketStatus: 'open',
282
+ });
283
+ }
284
+
285
+ /** Update ticket status */
286
+ updateTicketStatus(messageId: string, ticketStatus: BusMessage['ticketStatus']): void {
287
+ const msg = this.log.find(m => m.id === messageId && m.category === 'ticket');
288
+ if (msg) {
289
+ msg.ticketStatus = ticketStatus;
290
+ this.emit('message', msg);
291
+ }
292
+ }
293
+
294
+ /** Find outbox messages sent by an agent */
295
+ getOutboxFor(agentId: string): BusMessage[] {
296
+ return this.log.filter(m => m.from === agentId && m.type !== 'ack' && m.to !== '_system');
297
+ }
298
+
299
+ /** Find a message in agent's outbox by causedBy.messageId */
300
+ findInOutbox(agentId: string, causedByMessageId: string): BusMessage | null {
301
+ return this.log.find(m => m.from === agentId && m.causedBy?.messageId === causedByMessageId) || null;
302
+ }
303
+
304
+ /** Delete a message from the log (only done/failed) */
305
+ deleteMessage(messageId: string): void {
306
+ const idx = this.log.findIndex(m => m.id === messageId);
307
+ if (idx === -1) {
308
+ console.log(`[bus] deleteMessage: ${messageId.slice(0, 8)} not found`);
309
+ return;
310
+ }
311
+ const msg = this.log[idx];
312
+ if (msg.status === 'done' || msg.status === 'failed') {
313
+ this.log.splice(idx, 1);
314
+ console.log(`[bus] deleteMessage: ${messageId.slice(0, 8)} deleted (was ${msg.status})`);
315
+ } else {
316
+ console.log(`[bus] deleteMessage: ${messageId.slice(0, 8)} skipped (status=${msg.status})`);
317
+ }
318
+ }
319
+
320
+ /** Abort a pending message — mark as failed */
321
+ abortMessage(messageId: string): BusMessage | null {
322
+ const msg = this.log.find(m => m.id === messageId);
323
+ if (!msg || msg.status !== 'pending') return null;
324
+ msg.status = 'failed';
325
+ console.log(`[bus] Aborted message ${msg.payload.action} from ${msg.from} to ${msg.to}`);
326
+ return msg;
327
+ }
328
+
329
+ /** Mark all running messages as failed — called on stopDaemon/crash */
330
+ markAllRunningAsFailed(): void {
331
+ let count = 0;
332
+ for (const msg of this.log) {
333
+ if (msg.status === 'running' && msg.type !== 'ack') {
334
+ msg.status = 'failed';
335
+ count++;
336
+ }
337
+ }
338
+ if (count > 0) console.log(`[bus] Marked ${count} running messages as failed (shutdown)`);
339
+ }
340
+
341
+ /** Mark all pending (non-ack) messages as failed — called on restart/reload */
342
+ markAllPendingAsFailed(): void {
343
+ let count = 0;
344
+ for (const msg of this.log) {
345
+ if (msg.status === 'pending' && msg.type !== 'ack') {
346
+ msg.status = 'failed';
347
+ count++;
348
+ }
349
+ }
350
+ if (count > 0) console.log(`[bus] Marked ${count} pending messages as failed (restart cleanup)`);
351
+ }
352
+
353
+ // ─── Query ─────────────────────────────────────────────
354
+
355
+ getMessagesFor(agentId: string): BusMessage[] {
356
+ return this.log.filter(m => m.to === agentId);
357
+ }
358
+
359
+ getMessagesFrom(agentId: string): BusMessage[] {
360
+ return this.log.filter(m => m.from === agentId);
361
+ }
362
+
363
+ getConversation(a: string, b: string): BusMessage[] {
364
+ return this.log.filter(m =>
365
+ (m.from === a && m.to === b) || (m.from === b && m.to === a)
366
+ );
367
+ }
368
+
369
+ getOutbox(agentId: string): BusMessage[] {
370
+ return this.outbox.get(agentId) || [];
371
+ }
372
+
373
+ getLog(): readonly BusMessage[] {
374
+ return this.log;
375
+ }
376
+
377
+ /** Get all outbox queues (for persistence) */
378
+ getAllOutbox(): Record<string, BusMessage[]> {
379
+ const result: Record<string, BusMessage[]> = {};
380
+ for (const [id, msgs] of this.outbox) {
381
+ if (msgs.length > 0) result[id] = [...msgs];
382
+ }
383
+ return result;
384
+ }
385
+
386
+ loadLog(messages: BusMessage[]): void {
387
+ this.log = [...messages];
388
+ }
389
+
390
+ /** Restore outbox from persisted state */
391
+ loadOutbox(outbox: Record<string, BusMessage[]>): void {
392
+ this.outbox.clear();
393
+ for (const [id, msgs] of Object.entries(outbox)) {
394
+ this.outbox.set(id, [...msgs]);
395
+ }
396
+ }
397
+
398
+ clear(): void {
399
+ // Reject all pending requests
400
+ for (const [, pending] of this.pendingRequests) {
401
+ clearTimeout(pending.timer);
402
+ try { pending.resolve({ id: '', from: '', to: '', type: 'response', payload: { action: 'cancelled' }, timestamp: Date.now() }); } catch {}
403
+ }
404
+ this.pendingRequests.clear();
405
+
406
+ // Clear all pending ACK timers
407
+ for (const [, pending] of this.pendingAcks) {
408
+ clearTimeout(pending.timer);
409
+ }
410
+ this.pendingAcks.clear();
411
+
412
+ this.log = [];
413
+ this.outbox.clear();
414
+ this.seen.clear();
415
+ }
416
+ }