@vibe-forge/client 2.0.0 → 3.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/AGENTS.md +4 -1
  2. package/dist/assets/{arc-CbOXL0l9.js → arc-1JbypnRY.js} +1 -1
  3. package/dist/assets/{blockDiagram-c4efeb88-CqxINvsS.js → blockDiagram-c4efeb88-jT5b9nId.js} +1 -1
  4. package/dist/assets/{c4Diagram-c83219d4-BKazU0hb.js → c4Diagram-c83219d4-KNPh-1ta.js} +1 -1
  5. package/dist/assets/channel-pzvjJnfd.js +1 -0
  6. package/dist/assets/{classDiagram-beda092f-fAFX5BpB.js → classDiagram-beda092f-vvXuOT3F.js} +1 -1
  7. package/dist/assets/{classDiagram-v2-2358418a-w1VkNGJj.js → classDiagram-v2-2358418a-vH4j7skr.js} +1 -1
  8. package/dist/assets/clone-CtWwIeUb.js +1 -0
  9. package/dist/assets/{createText-1719965b-CEinakVP.js → createText-1719965b-COeSYnf3.js} +1 -1
  10. package/dist/assets/{cssMode-DPqRki4y.js → cssMode-Doc7QRKn.js} +1 -1
  11. package/dist/assets/{edges-96097737-Cb0F1_3K.js → edges-96097737-D09v6R_r.js} +1 -1
  12. package/dist/assets/{erDiagram-0228fc6a-C-N2fx-J.js → erDiagram-0228fc6a-CbZ6rfxl.js} +1 -1
  13. package/dist/assets/{flowDb-c6c81e3f-D1Xz_8Gf.js → flowDb-c6c81e3f-CnZOzhdk.js} +1 -1
  14. package/dist/assets/{flowDiagram-50d868cf-DyPSZyAj.js → flowDiagram-50d868cf-jv-xWM2p.js} +1 -1
  15. package/dist/assets/flowDiagram-v2-4f6560a1-BiyrkIKs.js +1 -0
  16. package/dist/assets/{flowchart-elk-definition-6af322e1-Dr1DDXwE.js → flowchart-elk-definition-6af322e1-D8pf677G.js} +1 -1
  17. package/dist/assets/{freemarker2-C3DvPFaK.js → freemarker2-CL0o23Gj.js} +1 -1
  18. package/dist/assets/{ganttDiagram-a2739b55-DmvY1GRj.js → ganttDiagram-a2739b55-BAPQzC4u.js} +1 -1
  19. package/dist/assets/{gitGraphDiagram-82fe8481-CoXfPYYi.js → gitGraphDiagram-82fe8481-BI2x71m0.js} +1 -1
  20. package/dist/assets/{graph-BkDQy7Qt.js → graph-CZK4Bjpq.js} +1 -1
  21. package/dist/assets/{handlebars-BcTFdqjl.js → handlebars-CCG38Pg6.js} +1 -1
  22. package/dist/assets/{html-Dg-O6XFr.js → html-BddshTWG.js} +1 -1
  23. package/dist/assets/{htmlMode-B_wqYWvn.js → htmlMode-xKXiYcDz.js} +1 -1
  24. package/dist/assets/{index-5325376f-kxPTR3_e.js → index-5325376f-BWMTD8RU.js} +1 -1
  25. package/dist/assets/{index-wkhI4dr6.js → index-CBe7kDkV.js} +398 -377
  26. package/dist/assets/index-MWOwVzqE.css +32 -0
  27. package/dist/assets/{infoDiagram-8eee0895-BEvqkwPI.js → infoDiagram-8eee0895-CR78btIF.js} +1 -1
  28. package/dist/assets/{javascript-DhlOH8_z.js → javascript-BPlRHPjg.js} +1 -1
  29. package/dist/assets/{journeyDiagram-c64418c1-gKtLYmmp.js → journeyDiagram-c64418c1-DZRv6FKz.js} +1 -1
  30. package/dist/assets/{jsonMode-DxTbF9OD.js → jsonMode-BYLVfdkf.js} +1 -1
  31. package/dist/assets/{layout-CDaZEk6E.js → layout-BtudyPU2.js} +1 -1
  32. package/dist/assets/{line-DNRQu8iq.js → line-DgHXrIhS.js} +1 -1
  33. package/dist/assets/{linear-Cph9Z6_j.js → linear-DtBoKICx.js} +1 -1
  34. package/dist/assets/{liquid-ByZ6JgRG.js → liquid-DxBlJk0W.js} +1 -1
  35. package/dist/assets/{lspLanguageFeatures-DzvhkgnM.js → lspLanguageFeatures-DmKVpmeH.js} +1 -1
  36. package/dist/assets/{mdx-D8RGHTl6.js → mdx-DrScsd-w.js} +1 -1
  37. package/dist/assets/{mermaid.core-BgcryF__.js → mermaid.core-Cj_NJ_lZ.js} +4 -4
  38. package/dist/assets/{mindmap-definition-8da855dc-WrxK0FcB.js → mindmap-definition-8da855dc-CMXbwtsc.js} +1 -1
  39. package/dist/assets/{pieDiagram-a8764435-VsZBsiQy.js → pieDiagram-a8764435-Bd6rfpJv.js} +1 -1
  40. package/dist/assets/{python-CXVtk_cg.js → python-Crbi7B7n.js} +1 -1
  41. package/dist/assets/{quadrantDiagram-1e28029f-BVlgwOvU.js → quadrantDiagram-1e28029f-H-FdBQn6.js} +1 -1
  42. package/dist/assets/{razor-0tind7h2.js → razor-DHyrzIfE.js} +1 -1
  43. package/dist/assets/{requirementDiagram-08caed73-CpPMPoYp.js → requirementDiagram-08caed73-BSyCVDSG.js} +1 -1
  44. package/dist/assets/{sankeyDiagram-a04cb91d-Cm5nnRmc.js → sankeyDiagram-a04cb91d-S6E6BReg.js} +1 -1
  45. package/dist/assets/{sequenceDiagram-c5b8d532-DpMlJvJB.js → sequenceDiagram-c5b8d532-BMHY4KMj.js} +1 -1
  46. package/dist/assets/{stateDiagram-1ecb1508-DU1zc7vq.js → stateDiagram-1ecb1508-BMrMw6XR.js} +1 -1
  47. package/dist/assets/{stateDiagram-v2-c2b004d7-D-0RgmAp.js → stateDiagram-v2-c2b004d7-B5SIFUb_.js} +1 -1
  48. package/dist/assets/{styles-b4e223ce-BSO-yNWV.js → styles-b4e223ce-DqiXwnx3.js} +1 -1
  49. package/dist/assets/{styles-ca3715f6-CHnsn2Ro.js → styles-ca3715f6-jNxW2Db8.js} +1 -1
  50. package/dist/assets/{styles-d45a18b0-B-rVGjEq.js → styles-d45a18b0-C4nlfLcZ.js} +1 -1
  51. package/dist/assets/{svgDrawCommon-b86b1483-CA3Pl89f.js → svgDrawCommon-b86b1483-FIWFuZfb.js} +1 -1
  52. package/dist/assets/{timeline-definition-faaaa080-BcihLR6s.js → timeline-definition-faaaa080-CEQDoqdf.js} +1 -1
  53. package/dist/assets/{tsMode-D9GGa5Ur.js → tsMode-DnNy3rE9.js} +1 -1
  54. package/dist/assets/{typescript-BT9CK_EL.js → typescript-YBZ4vw5B.js} +1 -1
  55. package/dist/assets/{xml-DNO75J-T.js → xml-BJGGYD70.js} +1 -1
  56. package/dist/assets/{xychartDiagram-f5964ef8-DJTwe32X.js → xychartDiagram-f5964ef8-DUNOFOk0.js} +1 -1
  57. package/dist/assets/{yaml-7CVzhiP2.js → yaml-BMY4mu5s.js} +1 -1
  58. package/dist/index.html +8 -3
  59. package/dist/manifest.webmanifest +30 -0
  60. package/dist/pwa-icon-192.png +0 -0
  61. package/dist/pwa-icon-512.png +0 -0
  62. package/dist/sw.js +105 -0
  63. package/index.html +6 -1
  64. package/package.json +13 -13
  65. package/public/manifest.webmanifest +30 -0
  66. package/public/pwa-icon-192.png +0 -0
  67. package/public/pwa-icon-512.png +0 -0
  68. package/public/sw.js +105 -0
  69. package/src/App.tsx +13 -1
  70. package/src/api/README.md +1 -0
  71. package/src/api/adapters.ts +63 -0
  72. package/src/api/auth-token.ts +51 -0
  73. package/src/api/auth.ts +46 -0
  74. package/src/api/automation.ts +10 -0
  75. package/src/api/base.ts +20 -17
  76. package/src/api/config.ts +5 -1
  77. package/src/api/knowledge.ts +59 -0
  78. package/src/api/sessions.ts +35 -3
  79. package/src/api/skill-hub.ts +126 -0
  80. package/src/api/workspace.ts +33 -1
  81. package/src/api/worktree-environments.ts +53 -0
  82. package/src/api.ts +62 -7
  83. package/src/client-build-info.ts +19 -0
  84. package/src/components/ConfigView.scss +596 -28
  85. package/src/components/ConfigView.tsx +569 -138
  86. package/src/components/NavRail.scss +1 -2
  87. package/src/components/NavRail.tsx +33 -3
  88. package/src/components/Sidebar.scss +0 -44
  89. package/src/components/Sidebar.tsx +110 -37
  90. package/src/components/auth/AuthGate.scss +79 -0
  91. package/src/components/auth/AuthGate.tsx +174 -0
  92. package/src/components/automation-view/@components/AutomationTaskComposer.tsx +220 -0
  93. package/src/components/automation-view/@components/AutomationTriggerRow.tsx +192 -0
  94. package/src/components/automation-view/@hooks/use-automation-startup-options-data.tsx +289 -0
  95. package/src/components/automation-view/@hooks/use-automation-startup-static-options.ts +51 -0
  96. package/src/components/automation-view/@utils/sender-model-options.tsx +52 -0
  97. package/src/components/automation-view/@utils/startup-options.ts +26 -0
  98. package/src/components/automation-view/AutomationEmptyGuide.tsx +61 -0
  99. package/src/components/automation-view/AutomationEmptyLanding.scss +165 -0
  100. package/src/components/automation-view/AutomationEmptyLanding.tsx +211 -0
  101. package/src/components/automation-view/AutomationRuleDetailPreview.tsx +179 -0
  102. package/src/components/automation-view/PanelTitleActions.tsx +66 -0
  103. package/src/components/automation-view/RuleFormPanel.scss +172 -49
  104. package/src/components/automation-view/RuleFormPanel.tsx +196 -91
  105. package/src/components/automation-view/RuleSidebar.scss +128 -41
  106. package/src/components/automation-view/RuleSidebar.tsx +173 -89
  107. package/src/components/automation-view/RunHistoryPanel.scss +307 -72
  108. package/src/components/automation-view/RunHistoryPanel.tsx +185 -165
  109. package/src/components/automation-view/TaskList.scss +130 -64
  110. package/src/components/automation-view/TaskList.tsx +15 -31
  111. package/src/components/automation-view/TriggerList.scss +87 -8
  112. package/src/components/automation-view/TriggerList.tsx +14 -173
  113. package/src/components/automation-view/index.scss +165 -37
  114. package/src/components/automation-view/index.tsx +174 -87
  115. package/src/components/automation-view/types.ts +13 -0
  116. package/src/components/chat/AGENTS.md +3 -1
  117. package/src/components/chat/ChatHeader.tsx +56 -33
  118. package/src/components/chat/ChatHistoryView.tsx +254 -123
  119. package/src/components/chat/NewSessionGuide.scss +274 -204
  120. package/src/components/chat/NewSessionGuide.tsx +46 -111
  121. package/src/components/chat/NewSessionGuideStarterList.tsx +190 -0
  122. package/src/components/chat/NewSessionGuideStarterSection.tsx +121 -0
  123. package/src/components/chat/bottom-dock-constants.ts +4 -0
  124. package/src/components/chat/conversation-starter-apply.ts +181 -0
  125. package/src/components/chat/git-controls/ChatGitControls.scss +65 -0
  126. package/src/components/chat/git-controls/DraftGitControls.tsx +14 -0
  127. package/src/components/chat/git-controls/DraftWorktreeEnvironmentDropdown.tsx +115 -0
  128. package/src/components/chat/messages/MessageItem.tsx +21 -6
  129. package/src/components/chat/messages/MessageStatusNotice.tsx +12 -4
  130. package/src/components/chat/messages/build-chat-history-status-notices.ts +18 -13
  131. package/src/components/chat/messages/message-action-utils.ts +29 -0
  132. package/src/components/chat/new-session-guide-config.ts +19 -0
  133. package/src/components/chat/new-session-guide-items.ts +172 -0
  134. package/src/components/chat/new-session-guide-list-order.ts +58 -0
  135. package/src/components/chat/sender/@components/account-select/AccountSelectControl.scss +112 -0
  136. package/src/components/chat/sender/@components/account-select/AccountSelectControl.tsx +280 -0
  137. package/src/components/chat/sender/@components/account-select/AccountSelectDropdown.scss +155 -0
  138. package/src/components/chat/sender/@components/adapter-select/AdapterSelectControl.scss +51 -12
  139. package/src/components/chat/sender/@components/adapter-select/AdapterSelectDropdown.scss +14 -0
  140. package/src/components/chat/sender/@components/effort-select/EffortSelectControl.scss +36 -0
  141. package/src/components/chat/sender/@components/effort-select/EffortSelectControl.tsx +17 -12
  142. package/src/components/chat/sender/@components/model-select/ModelSelectControl.scss +62 -0
  143. package/src/components/chat/sender/@components/model-select/ModelSelectControl.tsx +17 -12
  144. package/src/components/chat/sender/@components/model-select/ModelSelectMenu.scss +2 -0
  145. package/src/components/chat/sender/@components/model-select/ModelSelectMenuLabels.scss +24 -0
  146. package/src/components/chat/sender/@components/permission-mode-control/PermissionModeControl.scss +199 -0
  147. package/src/components/chat/sender/@components/permission-mode-control/PermissionModeControl.tsx +172 -0
  148. package/src/components/chat/sender/@components/reference-actions/ReferenceActionsControl.scss +1 -10
  149. package/src/components/chat/sender/@components/reference-actions/ReferenceActionsControl.tsx +16 -65
  150. package/src/components/chat/sender/@components/sender-body/SenderBody.tsx +13 -1
  151. package/src/components/chat/sender/@components/sender-header-controls/SenderHeaderControls.tsx +157 -0
  152. package/src/components/chat/sender/@components/sender-monaco-editor/monaco-runtime.ts +1 -17
  153. package/src/components/chat/sender/@components/sender-toolbar/SenderSelectBase.scss +18 -2
  154. package/src/components/chat/sender/@components/sender-toolbar/SenderSelectShared.scss +18 -1
  155. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.scss +2 -0
  156. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.tsx +40 -40
  157. package/src/components/chat/sender/@components/session-target/SenderSessionTargetBar.scss +215 -0
  158. package/src/components/chat/sender/@components/session-target/SenderSessionTargetBar.tsx +185 -0
  159. package/src/components/chat/sender/@core/build-sender-toolbar.ts +6 -0
  160. package/src/components/chat/sender/@core/create-sender-toolbar-handlers.ts +21 -1
  161. package/src/components/chat/sender/@core/get-sender-runtime-state.ts +3 -2
  162. package/src/components/chat/sender/@core/sender-toolbar-bindings.ts +12 -0
  163. package/src/components/chat/sender/@hooks/use-sender-controller.ts +56 -1
  164. package/src/components/chat/sender/@hooks/use-sender-reference-actions.ts +9 -66
  165. package/src/components/chat/sender/@types/sender-props.ts +18 -0
  166. package/src/components/chat/sender/@types/sender-toolbar-types.ts +8 -1
  167. package/src/components/chat/sender/@types/sender-types.ts +1 -3
  168. package/src/components/chat/sender/@utils/sender-constants.ts +1 -1
  169. package/src/components/chat/sender/Sender.scss +257 -2
  170. package/src/components/chat/sender/Sender.tsx +1 -0
  171. package/src/components/chat/status-bar/ChatStatusBar.scss +85 -0
  172. package/src/components/chat/status-bar/ChatStatusBar.tsx +48 -0
  173. package/src/components/chat/terminal/@components/TerminalManagerList.tsx +191 -0
  174. package/src/components/chat/terminal/@components/TerminalPane.scss +71 -0
  175. package/src/components/chat/terminal/@components/TerminalPane.tsx +137 -0
  176. package/src/components/chat/terminal/@components/TerminalPanelActions.tsx +75 -0
  177. package/src/components/chat/terminal/@hooks/use-terminal-instance.ts +36 -0
  178. package/src/components/chat/terminal/@hooks/use-terminal-session.ts +18 -21
  179. package/src/components/chat/terminal/@hooks/use-terminal-title-editor.ts +72 -0
  180. package/src/components/chat/terminal/@utils/terminal-keyboard.ts +141 -0
  181. package/src/components/chat/terminal/@utils/terminal-panes.ts +123 -0
  182. package/src/components/chat/terminal/ChatTerminalView.scss +310 -38
  183. package/src/components/chat/terminal/ChatTerminalView.tsx +151 -79
  184. package/src/components/chat/tools/core/ToolDiffViewer.tsx +3 -17
  185. package/src/components/chat/workspace-drawer/ChatWorkspaceDrawer.scss +778 -0
  186. package/src/components/chat/workspace-drawer/ChatWorkspaceDrawer.tsx +112 -0
  187. package/src/components/chat/workspace-drawer/ChatWorkspaceDrawerToolbar.tsx +183 -0
  188. package/src/components/chat/workspace-drawer/WorkspaceDrawerChangedFileRow.tsx +75 -0
  189. package/src/components/chat/workspace-drawer/WorkspaceDrawerChangedFiles.tsx +161 -0
  190. package/src/components/chat/workspace-drawer/WorkspaceDrawerChangedFolderTree.tsx +191 -0
  191. package/src/components/chat/workspace-drawer/WorkspaceDrawerTree.tsx +35 -0
  192. package/src/components/chat/workspace-drawer/WorkspaceDrawerTreeState.tsx +17 -0
  193. package/src/components/chat/workspace-drawer/changed-files-model.ts +152 -0
  194. package/src/components/chat/workspace-drawer/workspace-drawer-icons.ts +110 -0
  195. package/src/components/chat/workspace-file-editor/WorkspaceFileBreadcrumb.tsx +17 -0
  196. package/src/components/chat/workspace-file-editor/WorkspaceFileEditorView.scss +283 -0
  197. package/src/components/chat/workspace-file-editor/WorkspaceFileEditorView.tsx +165 -0
  198. package/src/components/chat/workspace-file-editor/WorkspaceFileTabs.tsx +135 -0
  199. package/src/components/chat/workspace-file-editor/use-workspace-file-editor-state.ts +113 -0
  200. package/src/components/chat/workspace-file-editor/workspace-file-editor-language.ts +55 -0
  201. package/src/components/composer-landing/ComposerLanding.scss +75 -0
  202. package/src/components/composer-landing/ComposerLanding.tsx +47 -0
  203. package/src/components/config/AGENTS.md +45 -0
  204. package/src/components/config/AdapterAccountsManager.scss +540 -0
  205. package/src/components/config/AdapterAccountsManager.tsx +846 -0
  206. package/src/components/config/AppSettingsPanel.tsx +85 -9
  207. package/src/components/config/ConfigAboutSection.scss +7 -1
  208. package/src/components/config/ConfigAboutSection.tsx +21 -3
  209. package/src/components/config/ConfigEditors.scss +12 -0
  210. package/src/components/config/ConfigFieldRow.scss +88 -4
  211. package/src/components/config/ConfigSectionForm.scss +88 -3
  212. package/src/components/config/ConfigSectionForm.tsx +948 -138
  213. package/src/components/config/ConfigSectionPanel.tsx +188 -12
  214. package/src/components/config/ConfigSourceSwitch.tsx +32 -18
  215. package/src/components/config/DetailCollectionFieldActions.tsx +63 -0
  216. package/src/components/config/DetailListField.tsx +413 -0
  217. package/src/components/config/McpServerItemEditor.tsx +154 -0
  218. package/src/components/config/RecommendedModelsItemEditor.tsx +146 -0
  219. package/src/components/config/WorktreeEnvironmentDetailView.tsx +126 -0
  220. package/src/components/config/WorktreeEnvironmentListView.tsx +126 -0
  221. package/src/components/config/WorktreeEnvironmentPanel.scss +430 -0
  222. package/src/components/config/WorktreeEnvironmentPanel.tsx +147 -0
  223. package/src/components/config/WorktreeEnvironmentScriptEditorCard.tsx +125 -0
  224. package/src/components/config/WorktreeEnvironmentScriptEditors.tsx +189 -0
  225. package/src/components/config/configConflict.ts +41 -0
  226. package/src/components/config/configDetail.ts +381 -0
  227. package/src/components/config/configSchema.ts +850 -179
  228. package/src/components/config/configUtils.ts +1 -1
  229. package/src/components/config/record-editors/RecordEditors.scss +187 -2
  230. package/src/components/config/record-editors/RecordJsonEditor.tsx +27 -2
  231. package/src/components/config/record-editors/SchemaObjectEditor.tsx +183 -0
  232. package/src/components/config/record-editors/SchemaRecordEditor.tsx +184 -0
  233. package/src/components/config/record-editors/index.tsx +2 -1
  234. package/src/components/config/record-editors/schemaRecordUtils.ts +55 -0
  235. package/src/components/config/use-worktree-environment-auto-save.ts +386 -0
  236. package/src/components/config/worktree-environment-panel-model.ts +108 -0
  237. package/src/components/dock-panel/DockPanel.scss +84 -17
  238. package/src/components/dock-panel/DockPanel.tsx +37 -34
  239. package/src/components/dock-panel/DockPanelHeader.tsx +65 -0
  240. package/src/components/dock-panel/use-dock-panel-fullscreen.ts +51 -0
  241. package/src/components/knowledge-base/KnowledgeBaseView.scss +276 -38
  242. package/src/components/knowledge-base/KnowledgeBaseView.tsx +252 -46
  243. package/src/components/knowledge-base/components/@hooks/use-skills-cli-modal-controller.ts +157 -0
  244. package/src/components/knowledge-base/components/@hooks/use-skills-tab-actions.ts +63 -0
  245. package/src/components/knowledge-base/components/ActionButton.scss +30 -4
  246. package/src/components/knowledge-base/components/ActionButton.tsx +13 -3
  247. package/src/components/knowledge-base/components/CreateSkillModal.tsx +59 -0
  248. package/src/components/knowledge-base/components/EmptyState.scss +4 -2
  249. package/src/components/knowledge-base/components/EntitiesTab.tsx +20 -20
  250. package/src/components/knowledge-base/components/EntityList.scss +3 -0
  251. package/src/components/knowledge-base/components/FilterBar.scss +1 -0
  252. package/src/components/knowledge-base/components/FilterBar.tsx +12 -8
  253. package/src/components/knowledge-base/components/FlowsTab.tsx +20 -20
  254. package/src/components/knowledge-base/components/KnowledgeBaseHeader.tsx +7 -6
  255. package/src/components/knowledge-base/components/KnowledgeContentControls.tsx +35 -0
  256. package/src/components/knowledge-base/components/KnowledgeList.scss +14 -3
  257. package/src/components/knowledge-base/components/KnowledgeMobilePanel.tsx +122 -0
  258. package/src/components/knowledge-base/components/KnowledgeSidebar.tsx +97 -0
  259. package/src/components/knowledge-base/components/LoadingState.scss +2 -1
  260. package/src/components/knowledge-base/components/ProjectSkillsList.tsx +79 -0
  261. package/src/components/knowledge-base/components/RuleList.scss +3 -0
  262. package/src/components/knowledge-base/components/RulesTab.tsx +31 -30
  263. package/src/components/knowledge-base/components/SectionHeader.scss +13 -1
  264. package/src/components/knowledge-base/components/SectionHeader.tsx +5 -3
  265. package/src/components/knowledge-base/components/SkillArchiveInput.tsx +43 -0
  266. package/src/components/knowledge-base/components/SkillHubResultItem.tsx +112 -0
  267. package/src/components/knowledge-base/components/SkillMarketResults.tsx +98 -0
  268. package/src/components/knowledge-base/components/SkillMarketView.tsx +198 -0
  269. package/src/components/knowledge-base/components/SkillMarketView.types.ts +28 -0
  270. package/src/components/knowledge-base/components/SkillRegistryErrors.tsx +21 -0
  271. package/src/components/knowledge-base/components/SkillRegistryModal.tsx +74 -0
  272. package/src/components/knowledge-base/components/SkillsCliModal.tsx +154 -0
  273. package/src/components/knowledge-base/components/SkillsTab.scss +424 -0
  274. package/src/components/knowledge-base/components/SkillsTab.tsx +166 -35
  275. package/src/components/knowledge-base/components/SkillsTabActions.tsx +88 -0
  276. package/src/components/knowledge-base/components/SpecList.scss +3 -0
  277. package/src/components/knowledge-base/components/TabContent.scss +4 -3
  278. package/src/components/knowledge-base/components/skill-hub-utils.ts +108 -0
  279. package/src/components/knowledge-base/components/use-skill-market-filters.ts +37 -0
  280. package/src/components/knowledge-base/components/use-skill-market-query-input.ts +44 -0
  281. package/src/components/knowledge-base/components/use-skill-market-search.ts +49 -0
  282. package/src/components/knowledge-base/components/use-skill-registry-modal.ts +68 -0
  283. package/src/components/monaco/monaco-runtime.ts +44 -0
  284. package/src/components/monaco/use-monaco-theme.ts +63 -0
  285. package/src/components/nav-rail-account-actions.tsx +104 -0
  286. package/src/components/server-connection/ServerConnectionGate.scss +356 -0
  287. package/src/components/server-connection/ServerConnectionGate.tsx +238 -0
  288. package/src/components/server-connection/ServerConnectionProfileModal.tsx +145 -0
  289. package/src/components/server-connection/ServerConnectionProfiles.tsx +113 -0
  290. package/src/components/server-connection/ServerConnectionUrlInput.tsx +85 -0
  291. package/src/components/sidebar/SidebarHeader.scss +5 -41
  292. package/src/components/sidebar/SidebarHeader.tsx +117 -91
  293. package/src/components/sidebar/SidebarHeaderSearchActions.tsx +24 -28
  294. package/src/components/sidebar/sidebar-search-visibility.ts +18 -0
  295. package/src/components/sidebar-list/SidebarListHeader.scss +246 -0
  296. package/src/components/sidebar-list/SidebarListHeader.tsx +146 -0
  297. package/src/components/workspace/ContextFilePicker.scss +9 -26
  298. package/src/components/workspace/ContextFilePicker.tsx +31 -113
  299. package/src/components/workspace/context-file-types.ts +36 -0
  300. package/src/components/workspace/project-file-tree/ProjectFileTree.scss +298 -0
  301. package/src/components/workspace/project-file-tree/ProjectFileTree.tsx +138 -0
  302. package/src/components/workspace/project-file-tree/ProjectFileTreeRow.tsx +167 -0
  303. package/src/components/workspace/project-file-tree/ProjectFileTreeRowContextMenu.tsx +106 -0
  304. package/src/components/workspace/project-file-tree/ProjectFileTreeRows.tsx +139 -0
  305. package/src/components/workspace/project-file-tree/project-file-tree-helpers.ts +101 -0
  306. package/src/components/workspace/project-file-tree/project-file-tree-icons.ts +93 -0
  307. package/src/components/workspace/project-file-tree/project-file-tree-types.ts +27 -0
  308. package/src/components/workspace/project-file-tree/use-project-file-tree-data.ts +197 -0
  309. package/src/components/workspace/project-file-tree/use-project-file-tree-selection.ts +144 -0
  310. package/src/hooks/chat/chat-session-target.ts +69 -0
  311. package/src/hooks/chat/chat-session-workspace-draft.ts +11 -4
  312. package/src/hooks/chat/interaction-state.ts +1 -0
  313. package/src/hooks/chat/optimistic-session-creation.ts +189 -0
  314. package/src/hooks/chat/use-chat-adapter-account-selection.tsx +156 -0
  315. package/src/hooks/chat/use-chat-route-bottom-panel.ts +181 -0
  316. package/src/hooks/chat/use-chat-route-deep-link-view.ts +33 -0
  317. package/src/hooks/chat/use-chat-session-actions.ts +259 -65
  318. package/src/hooks/chat/use-chat-session-messages.ts +71 -4
  319. package/src/hooks/chat/use-chat-session.ts +36 -1
  320. package/src/hooks/chat/workspace-file-panel-state.ts +43 -0
  321. package/src/hooks/session-subscription-cache.ts +25 -0
  322. package/src/hooks/use-chat-layout-query-state.ts +29 -0
  323. package/src/hooks/use-sender-header-query-state.ts +35 -0
  324. package/src/hooks/use-session-subscription.ts +17 -8
  325. package/src/hooks/useQueryParams.ts +91 -23
  326. package/src/i18n-resources.ts +44 -0
  327. package/src/i18n.ts +21 -6
  328. package/src/main.tsx +8 -0
  329. package/src/pwa.ts +46 -0
  330. package/src/resources/locales/en.json +741 -24
  331. package/src/resources/locales/zh.json +743 -26
  332. package/src/routes/ChatRoute.scss +110 -7
  333. package/src/routes/ChatRoute.tsx +11 -165
  334. package/src/routes/ChatRouteBottomPanel.tsx +47 -0
  335. package/src/routes/ChatRouteView.tsx +199 -0
  336. package/src/runtime-config.ts +155 -2
  337. package/src/server-connection-history.ts +179 -0
  338. package/src/store/index.ts +151 -3
  339. package/src/styles/global.scss +3 -0
  340. package/src/utils/mobile-viewport.ts +67 -0
  341. package/src/version-compatibility.ts +37 -0
  342. package/src/vite-env.d.ts +9 -0
  343. package/src/ws.ts +20 -9
  344. package/vite.config.ts +23 -1
  345. package/dist/assets/channel-Dnopc5A6.js +0 -1
  346. package/dist/assets/clone-sQthahUA.js +0 -1
  347. package/dist/assets/flowDiagram-v2-4f6560a1-OazrdWQO.js +0 -1
  348. package/dist/assets/index-o93dlo92.css +0 -32
  349. package/src/components/chat/NewSessionGuideCompactPanel.tsx +0 -130
  350. package/src/components/chat/NewSessionGuideGrid.tsx +0 -141
  351. package/src/components/chat/sender/@components/reference-actions/ReferencePermissionActionsPopover.tsx +0 -114
package/public/sw.js ADDED
@@ -0,0 +1,105 @@
1
+ const CACHE_PREFIX = 'vibe-forge-web'
2
+ const CACHE_VERSION = 'v1'
3
+ const APP_CACHE = `${CACHE_PREFIX}-app-${CACHE_VERSION}`
4
+ const STATIC_CACHE = `${CACHE_PREFIX}-static-${CACHE_VERSION}`
5
+ const serviceWorkerGlobal = globalThis
6
+
7
+ const appScopeUrl = new URL(serviceWorkerGlobal.registration.scope)
8
+
9
+ const isSameOrigin = url => url.origin === serviceWorkerGlobal.location.origin
10
+
11
+ const isInsideAppScope = url => url.href.startsWith(appScopeUrl.href)
12
+
13
+ const isStaticAssetRequest = url => (
14
+ url.pathname.includes('/assets/') ||
15
+ url.pathname.endsWith('/favicon.svg') ||
16
+ url.pathname.endsWith('/manifest.webmanifest') ||
17
+ url.pathname.endsWith('/pwa-icon-192.png') ||
18
+ url.pathname.endsWith('/pwa-icon-512.png')
19
+ )
20
+
21
+ const pruneOldCaches = async () => {
22
+ const cacheNames = await caches.keys()
23
+ await Promise.all(
24
+ cacheNames
25
+ .filter(name => name.startsWith(CACHE_PREFIX) && name !== APP_CACHE && name !== STATIC_CACHE)
26
+ .map(name => caches.delete(name))
27
+ )
28
+ }
29
+
30
+ const cacheAppShell = async () => {
31
+ const cache = await caches.open(APP_CACHE)
32
+ try {
33
+ await cache.add(new Request(appScopeUrl.href, { cache: 'reload' }))
34
+ } catch {
35
+ // Installing should still succeed if the first shell refresh races the network.
36
+ }
37
+ }
38
+
39
+ const networkFirstNavigation = async request => {
40
+ const cache = await caches.open(APP_CACHE)
41
+ try {
42
+ const response = await fetch(request)
43
+ if (response.ok) {
44
+ await cache.put(appScopeUrl.href, response.clone())
45
+ }
46
+ return response
47
+ } catch (error) {
48
+ const cached = await cache.match(appScopeUrl.href)
49
+ if (cached != null) {
50
+ return cached
51
+ }
52
+ throw error
53
+ }
54
+ }
55
+
56
+ const staleWhileRevalidate = async request => {
57
+ const cache = await caches.open(STATIC_CACHE)
58
+ const cached = await cache.match(request)
59
+ const networkResponse = fetch(request)
60
+ .then(async response => {
61
+ if (response.ok) {
62
+ await cache.put(request, response.clone())
63
+ }
64
+ return response
65
+ })
66
+ .catch(error => {
67
+ if (cached != null) {
68
+ return cached
69
+ }
70
+ throw error
71
+ })
72
+
73
+ return cached ?? networkResponse
74
+ }
75
+
76
+ serviceWorkerGlobal.addEventListener('install', event => {
77
+ event.waitUntil(
78
+ cacheAppShell()
79
+ .then(() => serviceWorkerGlobal.skipWaiting())
80
+ )
81
+ })
82
+
83
+ serviceWorkerGlobal.addEventListener('activate', event => {
84
+ event.waitUntil(
85
+ pruneOldCaches()
86
+ .then(() => serviceWorkerGlobal.clients.claim())
87
+ )
88
+ })
89
+
90
+ serviceWorkerGlobal.addEventListener('fetch', event => {
91
+ const { request } = event
92
+ if (request.method !== 'GET') return
93
+
94
+ const url = new URL(request.url)
95
+ if (!isSameOrigin(url) || !isInsideAppScope(url)) return
96
+
97
+ if (request.mode === 'navigate') {
98
+ event.respondWith(networkFirstNavigation(request))
99
+ return
100
+ }
101
+
102
+ if (isStaticAssetRequest(url)) {
103
+ event.respondWith(staleWhileRevalidate(request))
104
+ }
105
+ })
package/src/App.tsx CHANGED
@@ -1,12 +1,14 @@
1
1
  import { ConfigProvider } from 'antd'
2
2
 
3
+ import { AuthGate } from '#~/components/auth/AuthGate'
3
4
  import { AppShell } from '#~/components/layout/AppShell'
5
+ import { ServerConnectionGate } from '#~/components/server-connection/ServerConnectionGate'
4
6
  import { useAppPreferences } from '#~/hooks/use-app-preferences'
5
7
  import { useSessionSubscription } from '#~/hooks/use-session-subscription.js'
6
8
  import { useSidebarNavigation } from '#~/hooks/use-sidebar-navigation'
7
9
  import { AppRoutes } from '#~/routes/AppRoutes'
8
10
 
9
- export default function App() {
11
+ function AuthenticatedApp() {
10
12
  useSessionSubscription()
11
13
  const { isDarkMode, themeConfig } = useAppPreferences()
12
14
  const sidebarNavigation = useSidebarNavigation()
@@ -26,3 +28,13 @@ export default function App() {
26
28
  </ConfigProvider>
27
29
  )
28
30
  }
31
+
32
+ export default function App() {
33
+ return (
34
+ <ServerConnectionGate>
35
+ <AuthGate>
36
+ <AuthenticatedApp />
37
+ </AuthGate>
38
+ </ServerConnectionGate>
39
+ )
40
+ }
package/src/api/README.md CHANGED
@@ -11,6 +11,7 @@
11
11
  - `projects.ts`: 项目列表与创建
12
12
  - `sessions.ts`: 会话与消息
13
13
  - `types.ts`: 跨模块共享的响应类型
14
+ - `worktree-environments.ts`: worktree 环境脚本管理
14
15
 
15
16
  ## 新增或修改 API 的标准流程
16
17
 
@@ -0,0 +1,63 @@
1
+ import type {
2
+ AdapterAccountDetailResult,
3
+ AdapterAccountsResult,
4
+ AdapterManageAccountOptions,
5
+ AdapterManageAccountResult
6
+ } from '@vibe-forge/types'
7
+
8
+ import { createApiUrl, fetchApiJson, jsonHeaders } from './base'
9
+
10
+ export async function getAdapterAccounts(
11
+ adapter: string,
12
+ options: {
13
+ model?: string
14
+ account?: string
15
+ refresh?: boolean
16
+ } = {}
17
+ ): Promise<AdapterAccountsResult> {
18
+ const url = createApiUrl(`/api/adapters/${encodeURIComponent(adapter)}/accounts`)
19
+ if (options.model != null && options.model.trim() !== '') {
20
+ url.searchParams.set('model', options.model)
21
+ }
22
+ if (options.account != null && options.account.trim() !== '') {
23
+ url.searchParams.set('account', options.account)
24
+ }
25
+ if (options.refresh === true) {
26
+ url.searchParams.set('refresh', 'true')
27
+ }
28
+ return fetchApiJson<AdapterAccountsResult>(url)
29
+ }
30
+
31
+ export async function getAdapterAccountDetail(
32
+ adapter: string,
33
+ account: string,
34
+ options: {
35
+ model?: string
36
+ refresh?: boolean
37
+ } = {}
38
+ ): Promise<AdapterAccountDetailResult> {
39
+ const url = createApiUrl(`/api/adapters/${encodeURIComponent(adapter)}/accounts/${encodeURIComponent(account)}`)
40
+ if (options.model != null && options.model.trim() !== '') {
41
+ url.searchParams.set('model', options.model)
42
+ }
43
+ if (options.refresh === true) {
44
+ url.searchParams.set('refresh', 'true')
45
+ }
46
+ return fetchApiJson<AdapterAccountDetailResult>(url)
47
+ }
48
+
49
+ export async function manageAdapterAccount(
50
+ adapter: string,
51
+ options: Pick<AdapterManageAccountOptions, 'action' | 'account' | 'model' | 'refresh'>,
52
+ requestOptions?: Pick<RequestInit, 'signal'>
53
+ ): Promise<AdapterManageAccountResult> {
54
+ return fetchApiJson<AdapterManageAccountResult>(
55
+ createApiUrl(`/api/adapters/${encodeURIComponent(adapter)}/accounts/actions`),
56
+ {
57
+ method: 'POST',
58
+ headers: jsonHeaders,
59
+ body: JSON.stringify(options),
60
+ ...requestOptions
61
+ }
62
+ )
63
+ }
@@ -0,0 +1,51 @@
1
+ import { getServerBaseUrl } from '#~/runtime-config'
2
+ import {
3
+ clearAuthTokenForServerUrl,
4
+ getAuthTokenForServerUrl,
5
+ setAuthTokenForServerUrl
6
+ } from '#~/server-connection-history'
7
+
8
+ const LEGACY_AUTH_TOKEN_STORAGE_KEY = 'vf_auth_token'
9
+
10
+ const getStorage = () => {
11
+ try {
12
+ return globalThis.localStorage
13
+ } catch {
14
+ return undefined
15
+ }
16
+ }
17
+
18
+ export const getAuthToken = () => {
19
+ const serverUrl = getServerBaseUrl()
20
+ const scopedToken = getAuthTokenForServerUrl(serverUrl)?.trim()
21
+ if (scopedToken != null && scopedToken !== '') return scopedToken
22
+
23
+ const legacyToken = getStorage()?.getItem(LEGACY_AUTH_TOKEN_STORAGE_KEY)?.trim()
24
+ if (legacyToken == null || legacyToken === '') return undefined
25
+
26
+ setAuthTokenForServerUrl(serverUrl, legacyToken)
27
+ getStorage()?.removeItem(LEGACY_AUTH_TOKEN_STORAGE_KEY)
28
+ return legacyToken
29
+ }
30
+
31
+ export const setAuthToken = (token: string) => {
32
+ const normalized = token.trim()
33
+ if (normalized === '') {
34
+ return
35
+ }
36
+ setAuthTokenForServerUrl(getServerBaseUrl(), normalized)
37
+ getStorage()?.removeItem(LEGACY_AUTH_TOKEN_STORAGE_KEY)
38
+ }
39
+
40
+ export const clearAuthToken = () => {
41
+ clearAuthTokenForServerUrl(getServerBaseUrl())
42
+ getStorage()?.removeItem(LEGACY_AUTH_TOKEN_STORAGE_KEY)
43
+ }
44
+
45
+ export const applyAuthHeader = (headers: Headers) => {
46
+ const token = getAuthToken()
47
+ if (token == null || headers.has('Authorization')) {
48
+ return
49
+ }
50
+ headers.set('Authorization', `Bearer ${token}`)
51
+ }
@@ -0,0 +1,46 @@
1
+ import { clearAuthToken } from './auth-token'
2
+ import { fetchApiJson, fetchApiJsonOrThrow, jsonHeaders } from './base'
3
+
4
+ export interface AuthStatus {
5
+ enabled: boolean
6
+ authenticated: boolean
7
+ usernames: string[]
8
+ passwordSource: 'config' | 'env' | 'generated'
9
+ passwordFilePath?: string
10
+ version?: string
11
+ token?: string
12
+ }
13
+
14
+ export interface LoginInput {
15
+ username: string
16
+ password: string
17
+ rememberDevice: boolean
18
+ returnToken?: boolean
19
+ }
20
+
21
+ export const getAuthStatus = () => fetchApiJson<AuthStatus>('/api/auth/status')
22
+
23
+ export const login = (input: LoginInput) => (
24
+ fetchApiJsonOrThrow<AuthStatus>(
25
+ '/api/auth/login',
26
+ {
27
+ method: 'POST',
28
+ headers: jsonHeaders,
29
+ body: JSON.stringify(input)
30
+ },
31
+ '[api] login failed:'
32
+ )
33
+ )
34
+
35
+ export const logout = async () => {
36
+ const result = await fetchApiJsonOrThrow<{ ok: boolean }>(
37
+ '/api/auth/logout',
38
+ {
39
+ method: 'POST',
40
+ headers: jsonHeaders
41
+ },
42
+ '[api] logout failed:'
43
+ )
44
+ clearAuthToken()
45
+ return result
46
+ }
@@ -1,3 +1,5 @@
1
+ import type { EffortLevel, GitBranchKind, SessionPermissionMode } from '@vibe-forge/types'
2
+
1
3
  import { createApiUrl, fetchApiJson, jsonHeaders } from './base'
2
4
 
3
5
  export interface AutomationTrigger {
@@ -12,6 +14,14 @@ export interface AutomationTask {
12
14
  id: string
13
15
  title: string
14
16
  prompt: string
17
+ model?: string | null
18
+ adapter?: string | null
19
+ effort?: EffortLevel | null
20
+ permissionMode?: SessionPermissionMode | null
21
+ createWorktree?: boolean | null
22
+ branchName?: string | null
23
+ branchKind?: GitBranchKind | null
24
+ branchMode?: 'checkout' | 'create' | null
15
25
  }
16
26
 
17
27
  export interface AutomationRule {
package/src/api/base.ts CHANGED
@@ -1,33 +1,26 @@
1
- import { getServerHostEnv, getServerPortEnv } from '#~/runtime-config.js'
1
+ import { createServerUrl, getServerBaseUrl } from '#~/runtime-config.js'
2
2
 
3
- const DEFAULT_SERVER_PORT = '8787'
4
- const SERVER_HOST_ENV = getServerHostEnv()
5
- const SERVER_PORT_ENV = getServerPortEnv()
3
+ import { applyAuthHeader } from './auth-token'
6
4
 
7
5
  export const jsonHeaders = { 'Content-Type': 'application/json' } as const
8
6
 
9
7
  export const getServerHost = () => {
10
- if (SERVER_HOST_ENV != null && SERVER_HOST_ENV !== '') {
11
- return SERVER_HOST_ENV
12
- }
13
- return window.location.hostname
8
+ return new URL(getServerUrl()).hostname
14
9
  }
15
10
 
16
11
  export const getServerPort = () => {
17
- if (SERVER_PORT_ENV != null && SERVER_PORT_ENV !== '') {
18
- return SERVER_PORT_ENV
19
- }
20
- return DEFAULT_SERVER_PORT
12
+ const { port, protocol } = new URL(getServerUrl())
13
+ if (port !== '') return port
14
+ return protocol === 'https:' ? '443' : '80'
21
15
  }
22
16
 
23
- export const getServerUrl = () => `http://${getServerHost()}:${getServerPort()}`
17
+ export const getServerUrl = () => getServerBaseUrl()
24
18
 
25
19
  export const buildApiUrl = (path: string) => {
26
20
  if (path.startsWith('http://') || path.startsWith('https://')) {
27
21
  return path
28
22
  }
29
- const normalized = path.startsWith('/') ? path : `/${path}`
30
- return `${getServerUrl()}${normalized}`
23
+ return createServerUrl(path)
31
24
  }
32
25
 
33
26
  export const createApiUrl = (path: string) => new URL(buildApiUrl(path))
@@ -146,9 +139,19 @@ export const getApiErrorMessage = (error: unknown, fallback: string) => {
146
139
  return fallback
147
140
  }
148
141
 
142
+ const createRequestInit = (init?: RequestInit): RequestInit => {
143
+ const headers = new Headers(init?.headers)
144
+ applyAuthHeader(headers)
145
+ return {
146
+ ...init,
147
+ credentials: init?.credentials ?? 'include',
148
+ headers
149
+ }
150
+ }
151
+
149
152
  export async function fetchApiJson<T>(pathOrUrl: string | URL, init?: RequestInit): Promise<T> {
150
153
  const url = typeof pathOrUrl === 'string' ? buildApiUrl(pathOrUrl) : pathOrUrl.toString()
151
- const res = await fetch(url, init)
154
+ const res = await fetch(url, createRequestInit(init))
152
155
  return unwrapApiResponse<T>(res)
153
156
  }
154
157
 
@@ -158,6 +161,6 @@ export async function fetchApiJsonOrThrow<T>(
158
161
  errorLabel: string
159
162
  ): Promise<T> {
160
163
  const url = typeof pathOrUrl === 'string' ? buildApiUrl(pathOrUrl) : pathOrUrl.toString()
161
- const res = await fetch(url, init)
164
+ const res = await fetch(url, createRequestInit(init))
162
165
  return unwrapApiResponse<T>(res, errorLabel)
163
166
  }
package/src/api/config.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { ConfigSource } from '@vibe-forge/core'
2
- import type { ConfigResponse } from '@vibe-forge/types'
2
+ import type { ConfigResponse, ConfigSchemaResponse } from '@vibe-forge/types'
3
3
 
4
4
  import { fetchApiJson, fetchApiJsonOrThrow, jsonHeaders } from './base'
5
5
  import type { ApiOkResponse } from './types'
@@ -8,6 +8,10 @@ export async function getConfig(): Promise<ConfigResponse> {
8
8
  return fetchApiJson<ConfigResponse>('/api/config')
9
9
  }
10
10
 
11
+ export async function getConfigSchema(): Promise<ConfigSchemaResponse> {
12
+ return fetchApiJson<ConfigSchemaResponse>('/api/config/schema')
13
+ }
14
+
11
15
  export async function updateConfig(
12
16
  source: ConfigSource,
13
17
  section: string,
@@ -21,6 +21,15 @@ export interface EntitySummary {
21
21
  rules: string[]
22
22
  }
23
23
 
24
+ export interface WorkspaceSummary {
25
+ id: string
26
+ name: string
27
+ description: string
28
+ path: string
29
+ cwd: string
30
+ pattern?: string
31
+ }
32
+
24
33
  export interface RuleSummary {
25
34
  id: string
26
35
  name: string
@@ -29,6 +38,15 @@ export interface RuleSummary {
29
38
  globs?: string[]
30
39
  }
31
40
 
41
+ export interface SkillSummary {
42
+ id: string
43
+ name: string
44
+ description: string
45
+ always: boolean
46
+ instancePath?: string
47
+ source: 'project' | 'plugin' | 'home'
48
+ }
49
+
32
50
  export interface SpecDetail extends SpecSummary {
33
51
  body: string
34
52
  }
@@ -41,14 +59,49 @@ export interface RuleDetail extends RuleSummary {
41
59
  body: string
42
60
  }
43
61
 
62
+ export interface SkillDetail extends SkillSummary {
63
+ body: string
64
+ }
65
+
44
66
  export async function listSpecs(): Promise<{ specs: SpecSummary[] }> {
45
67
  return fetchApiJson<{ specs: SpecSummary[] }>('/api/ai/specs')
46
68
  }
47
69
 
70
+ export async function listSkills(): Promise<{ skills: SkillSummary[] }> {
71
+ return fetchApiJson<{ skills: SkillSummary[] }>('/api/ai/skills')
72
+ }
73
+
74
+ export async function createSkill(params: {
75
+ name: string
76
+ description?: string
77
+ body?: string
78
+ }): Promise<{ skill: SkillDetail }> {
79
+ return fetchApiJson<{ skill: SkillDetail }>('/api/ai/skills', {
80
+ method: 'POST',
81
+ headers: { 'Content-Type': 'application/json' },
82
+ body: JSON.stringify(params)
83
+ })
84
+ }
85
+
86
+ export async function importSkillArchive(file: File): Promise<{ fileCount: number; targetDir: string }> {
87
+ return fetchApiJson<{ fileCount: number; targetDir: string }>('/api/ai/skills/import', {
88
+ method: 'POST',
89
+ headers: {
90
+ 'Content-Type': file.type || 'application/octet-stream',
91
+ 'x-file-name': encodeURIComponent(file.name)
92
+ },
93
+ body: file
94
+ })
95
+ }
96
+
48
97
  export async function listEntities(): Promise<{ entities: EntitySummary[] }> {
49
98
  return fetchApiJson<{ entities: EntitySummary[] }>('/api/ai/entities')
50
99
  }
51
100
 
101
+ export async function listWorkspaces(): Promise<{ workspaces: WorkspaceSummary[] }> {
102
+ return fetchApiJson<{ workspaces: WorkspaceSummary[] }>('/api/ai/workspaces')
103
+ }
104
+
52
105
  export async function listRules(): Promise<{ rules: RuleSummary[] }> {
53
106
  return fetchApiJson<{ rules: RuleSummary[] }>('/api/ai/rules')
54
107
  }
@@ -70,3 +123,9 @@ export async function getRuleDetail(path: string): Promise<{ rule: RuleDetail }>
70
123
  url.searchParams.set('path', path)
71
124
  return fetchApiJson<{ rule: RuleDetail }>(url)
72
125
  }
126
+
127
+ export async function getSkillDetail(path: string): Promise<{ skill: SkillDetail }> {
128
+ const url = createApiUrl('/api/ai/skills/detail')
129
+ url.searchParams.set('path', path)
130
+ return fetchApiJson<{ skill: SkillDetail }>(url)
131
+ }
@@ -1,9 +1,9 @@
1
1
  import type { ChatMessageContent, Session, SessionMessageQueueState, SessionQueuedMessageMode } from '@vibe-forge/core'
2
- import type { GitBranchKind, SessionWorkspace } from '@vibe-forge/types'
2
+ import type { GitBranchKind, SessionPromptType, SessionWorkspace } from '@vibe-forge/types'
3
3
 
4
4
  import { createApiUrl, fetchApiJson, fetchApiJsonOrThrow, jsonHeaders } from './base'
5
5
  import type { ApiOkResponse, ApiRemoveResponse, SessionMessagesResponse } from './types'
6
- import type { WorkspaceTreeEntry } from './workspace'
6
+ import type { WorkspaceFileContent, WorkspaceTreeEntry } from './workspace'
7
7
 
8
8
  export async function listSessions(
9
9
  filter: 'active' | 'archived' | 'all' = 'active'
@@ -21,13 +21,16 @@ export async function createSession(
21
21
  start?: boolean
22
22
  parentSessionId?: string
23
23
  id?: string
24
- promptType?: 'spec' | 'entity'
24
+ promptType?: SessionPromptType
25
25
  promptName?: string
26
26
  effort?: 'low' | 'medium' | 'high' | 'max'
27
27
  permissionMode?: 'default' | 'acceptEdits' | 'plan' | 'dontAsk' | 'bypassPermissions'
28
28
  adapter?: string
29
+ account?: string
30
+ updateSkills?: boolean
29
31
  workspace?: {
30
32
  createWorktree?: boolean
33
+ worktreeEnvironment?: string
31
34
  branch?: {
32
35
  name: string
33
36
  kind?: GitBranchKind
@@ -52,6 +55,8 @@ export async function createSession(
52
55
  effort: options?.effort,
53
56
  permissionMode: options?.permissionMode,
54
57
  adapter: options?.adapter,
58
+ account: options?.account,
59
+ updateSkills: options?.updateSkills,
55
60
  workspace: options?.workspace
56
61
  })
57
62
  })
@@ -133,6 +138,33 @@ export async function listSessionWorkspaceTree(
133
138
  }>(url)
134
139
  }
135
140
 
141
+ export async function readSessionWorkspaceFile(
142
+ id: string,
143
+ path: string
144
+ ): Promise<WorkspaceFileContent> {
145
+ const url = createApiUrl(`/api/sessions/${id}/workspace/file`)
146
+ url.searchParams.set('path', path)
147
+ return fetchApiJson<WorkspaceFileContent>(url)
148
+ }
149
+
150
+ export function getSessionWorkspaceResourceUrl(id: string, path: string) {
151
+ const url = createApiUrl(`/api/sessions/${id}/workspace/resource`)
152
+ url.searchParams.set('path', path)
153
+ return url.toString()
154
+ }
155
+
156
+ export async function updateSessionWorkspaceFile(
157
+ id: string,
158
+ path: string,
159
+ content: string
160
+ ): Promise<WorkspaceFileContent> {
161
+ return fetchApiJson<WorkspaceFileContent>(`/api/sessions/${id}/workspace/file`, {
162
+ method: 'PUT',
163
+ headers: jsonHeaders,
164
+ body: JSON.stringify({ path, content })
165
+ })
166
+ }
167
+
136
168
  export async function respondSessionInteraction(
137
169
  sessionId: string,
138
170
  interactionId: string,