turboflux 1.0.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 (490) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +177 -0
  3. package/bin/turboflux.mjs +28 -0
  4. package/dist/cli/brand.d.ts +7 -0
  5. package/dist/cli/brand.js +33 -0
  6. package/dist/cli/brand.js.map +1 -0
  7. package/dist/cli/commands/index.d.ts +4 -0
  8. package/dist/cli/commands/index.js +671 -0
  9. package/dist/cli/commands/index.js.map +1 -0
  10. package/dist/cli/commands/registry.d.ts +24 -0
  11. package/dist/cli/commands/registry.js +124 -0
  12. package/dist/cli/commands/registry.js.map +1 -0
  13. package/dist/cli/commands/types.d.ts +69 -0
  14. package/dist/cli/commands/types.js +2 -0
  15. package/dist/cli/commands/types.js.map +1 -0
  16. package/dist/cli/components/App.d.ts +15 -0
  17. package/dist/cli/components/App.js +1738 -0
  18. package/dist/cli/components/App.js.map +1 -0
  19. package/dist/cli/components/ConversationHistory.d.ts +15 -0
  20. package/dist/cli/components/ConversationHistory.js +92 -0
  21. package/dist/cli/components/ConversationHistory.js.map +1 -0
  22. package/dist/cli/components/TranscriptViewport.d.ts +25 -0
  23. package/dist/cli/components/TranscriptViewport.js +77 -0
  24. package/dist/cli/components/TranscriptViewport.js.map +1 -0
  25. package/dist/cli/components/agentActivityModel.d.ts +24 -0
  26. package/dist/cli/components/agentActivityModel.js +45 -0
  27. package/dist/cli/components/agentActivityModel.js.map +1 -0
  28. package/dist/cli/components/appHelpers.d.ts +34 -0
  29. package/dist/cli/components/appHelpers.js +209 -0
  30. package/dist/cli/components/appHelpers.js.map +1 -0
  31. package/dist/cli/components/design-system/StatusIcon.d.ts +5 -0
  32. package/dist/cli/components/design-system/StatusIcon.js +25 -0
  33. package/dist/cli/components/design-system/StatusIcon.js.map +1 -0
  34. package/dist/cli/components/developerFlowModel.d.ts +36 -0
  35. package/dist/cli/components/developerFlowModel.js +88 -0
  36. package/dist/cli/components/developerFlowModel.js.map +1 -0
  37. package/dist/cli/components/diff/DiffCard.d.ts +16 -0
  38. package/dist/cli/components/diff/DiffCard.js +30 -0
  39. package/dist/cli/components/diff/DiffCard.js.map +1 -0
  40. package/dist/cli/components/diff/DiffHunks.d.ts +11 -0
  41. package/dist/cli/components/diff/DiffHunks.js +58 -0
  42. package/dist/cli/components/diff/DiffHunks.js.map +1 -0
  43. package/dist/cli/components/header/Header.d.ts +13 -0
  44. package/dist/cli/components/header/Header.js +25 -0
  45. package/dist/cli/components/header/Header.js.map +1 -0
  46. package/dist/cli/components/header/Mascot.d.ts +4 -0
  47. package/dist/cli/components/header/Mascot.js +53 -0
  48. package/dist/cli/components/header/Mascot.js.map +1 -0
  49. package/dist/cli/components/header/StatusLine.d.ts +21 -0
  50. package/dist/cli/components/header/StatusLine.js +110 -0
  51. package/dist/cli/components/header/StatusLine.js.map +1 -0
  52. package/dist/cli/components/input/EffortPicker.d.ts +30 -0
  53. package/dist/cli/components/input/EffortPicker.js +126 -0
  54. package/dist/cli/components/input/EffortPicker.js.map +1 -0
  55. package/dist/cli/components/input/ModelPicker.d.ts +15 -0
  56. package/dist/cli/components/input/ModelPicker.js +95 -0
  57. package/dist/cli/components/input/ModelPicker.js.map +1 -0
  58. package/dist/cli/components/input/PromptInput.d.ts +79 -0
  59. package/dist/cli/components/input/PromptInput.js +496 -0
  60. package/dist/cli/components/input/PromptInput.js.map +1 -0
  61. package/dist/cli/components/input/RewindSelector.d.ts +8 -0
  62. package/dist/cli/components/input/RewindSelector.js +45 -0
  63. package/dist/cli/components/input/RewindSelector.js.map +1 -0
  64. package/dist/cli/components/input/pasteState.d.ts +6 -0
  65. package/dist/cli/components/input/pasteState.js +42 -0
  66. package/dist/cli/components/input/pasteState.js.map +1 -0
  67. package/dist/cli/components/input/terminalInputStateMachine.d.ts +29 -0
  68. package/dist/cli/components/input/terminalInputStateMachine.js +67 -0
  69. package/dist/cli/components/input/terminalInputStateMachine.js.map +1 -0
  70. package/dist/cli/components/layout/CockpitRails.d.ts +6 -0
  71. package/dist/cli/components/layout/CockpitRails.js +13 -0
  72. package/dist/cli/components/layout/CockpitRails.js.map +1 -0
  73. package/dist/cli/components/layout/LandingView.d.ts +15 -0
  74. package/dist/cli/components/layout/LandingView.js +12 -0
  75. package/dist/cli/components/layout/LandingView.js.map +1 -0
  76. package/dist/cli/components/layout/SessionSidebar.d.ts +18 -0
  77. package/dist/cli/components/layout/SessionSidebar.js +70 -0
  78. package/dist/cli/components/layout/SessionSidebar.js.map +1 -0
  79. package/dist/cli/components/layout/StartupAnimation.d.ts +14 -0
  80. package/dist/cli/components/layout/StartupAnimation.js +30 -0
  81. package/dist/cli/components/layout/StartupAnimation.js.map +1 -0
  82. package/dist/cli/components/markdown/highlighter.d.ts +1 -0
  83. package/dist/cli/components/markdown/highlighter.js +110 -0
  84. package/dist/cli/components/markdown/highlighter.js.map +1 -0
  85. package/dist/cli/components/markdown/index.d.ts +11 -0
  86. package/dist/cli/components/markdown/index.js +86 -0
  87. package/dist/cli/components/markdown/index.js.map +1 -0
  88. package/dist/cli/components/messages/MessageList.d.ts +16 -0
  89. package/dist/cli/components/messages/MessageList.js +56 -0
  90. package/dist/cli/components/messages/MessageList.js.map +1 -0
  91. package/dist/cli/components/messages/Messages.d.ts +26 -0
  92. package/dist/cli/components/messages/Messages.js +32 -0
  93. package/dist/cli/components/messages/Messages.js.map +1 -0
  94. package/dist/cli/components/messages/ThinkingBlock.d.ts +9 -0
  95. package/dist/cli/components/messages/ThinkingBlock.js +51 -0
  96. package/dist/cli/components/messages/ThinkingBlock.js.map +1 -0
  97. package/dist/cli/components/messages/WindowedMessageList.d.ts +21 -0
  98. package/dist/cli/components/messages/WindowedMessageList.js +44 -0
  99. package/dist/cli/components/messages/WindowedMessageList.js.map +1 -0
  100. package/dist/cli/components/permissions/PermissionDialog.d.ts +23 -0
  101. package/dist/cli/components/permissions/PermissionDialog.js +83 -0
  102. package/dist/cli/components/permissions/PermissionDialog.js.map +1 -0
  103. package/dist/cli/components/spinner/SpinnerGlyph.d.ts +6 -0
  104. package/dist/cli/components/spinner/SpinnerGlyph.js +55 -0
  105. package/dist/cli/components/spinner/SpinnerGlyph.js.map +1 -0
  106. package/dist/cli/components/spinner/constants.d.ts +4 -0
  107. package/dist/cli/components/spinner/constants.js +5 -0
  108. package/dist/cli/components/spinner/constants.js.map +1 -0
  109. package/dist/cli/components/tools/ActiveWorkPanel.d.ts +22 -0
  110. package/dist/cli/components/tools/ActiveWorkPanel.js +70 -0
  111. package/dist/cli/components/tools/ActiveWorkPanel.js.map +1 -0
  112. package/dist/cli/components/tools/AgentActivityLine.d.ts +13 -0
  113. package/dist/cli/components/tools/AgentActivityLine.js +88 -0
  114. package/dist/cli/components/tools/AgentActivityLine.js.map +1 -0
  115. package/dist/cli/components/tools/QueuedPromptList.d.ts +10 -0
  116. package/dist/cli/components/tools/QueuedPromptList.js +26 -0
  117. package/dist/cli/components/tools/QueuedPromptList.js.map +1 -0
  118. package/dist/cli/components/tools/TaskFlowHud.d.ts +15 -0
  119. package/dist/cli/components/tools/TaskFlowHud.js +55 -0
  120. package/dist/cli/components/tools/TaskFlowHud.js.map +1 -0
  121. package/dist/cli/components/tools/TerminalSessionsFooter.d.ts +6 -0
  122. package/dist/cli/components/tools/TerminalSessionsFooter.js +36 -0
  123. package/dist/cli/components/tools/TerminalSessionsFooter.js.map +1 -0
  124. package/dist/cli/components/tools/ToolActivityList.d.ts +11 -0
  125. package/dist/cli/components/tools/ToolActivityList.js +73 -0
  126. package/dist/cli/components/tools/ToolActivityList.js.map +1 -0
  127. package/dist/cli/components/tools/ToolCallTree.d.ts +11 -0
  128. package/dist/cli/components/tools/ToolCallTree.js +14 -0
  129. package/dist/cli/components/tools/ToolCallTree.js.map +1 -0
  130. package/dist/cli/components/tools/toolLifecycleModel.d.ts +16 -0
  131. package/dist/cli/components/tools/toolLifecycleModel.js +30 -0
  132. package/dist/cli/components/tools/toolLifecycleModel.js.map +1 -0
  133. package/dist/cli/components/tools/toolPresentation.d.ts +9 -0
  134. package/dist/cli/components/tools/toolPresentation.js +171 -0
  135. package/dist/cli/components/tools/toolPresentation.js.map +1 -0
  136. package/dist/cli/components/tools/toolTypes.d.ts +16 -0
  137. package/dist/cli/components/tools/toolTypes.js +2 -0
  138. package/dist/cli/components/tools/toolTypes.js.map +1 -0
  139. package/dist/cli/components/transcriptWindowing.d.ts +19 -0
  140. package/dist/cli/components/transcriptWindowing.js +81 -0
  141. package/dist/cli/components/transcriptWindowing.js.map +1 -0
  142. package/dist/cli/config.d.ts +1 -0
  143. package/dist/cli/config.js +2 -0
  144. package/dist/cli/config.js.map +1 -0
  145. package/dist/cli/conversations/journalWriter.d.ts +50 -0
  146. package/dist/cli/conversations/journalWriter.js +191 -0
  147. package/dist/cli/conversations/journalWriter.js.map +1 -0
  148. package/dist/cli/conversations/manager.d.ts +65 -0
  149. package/dist/cli/conversations/manager.js +435 -0
  150. package/dist/cli/conversations/manager.js.map +1 -0
  151. package/dist/cli/conversations/recoveryExport.d.ts +18 -0
  152. package/dist/cli/conversations/recoveryExport.js +39 -0
  153. package/dist/cli/conversations/recoveryExport.js.map +1 -0
  154. package/dist/cli/conversations/recoveryMessages.d.ts +2 -0
  155. package/dist/cli/conversations/recoveryMessages.js +3 -0
  156. package/dist/cli/conversations/recoveryMessages.js.map +1 -0
  157. package/dist/cli/conversations/store.d.ts +14 -0
  158. package/dist/cli/conversations/store.js +603 -0
  159. package/dist/cli/conversations/store.js.map +1 -0
  160. package/dist/cli/conversations/types.d.ts +142 -0
  161. package/dist/cli/conversations/types.js +2 -0
  162. package/dist/cli/conversations/types.js.map +1 -0
  163. package/dist/cli/globalConfiguration.d.ts +13 -0
  164. package/dist/cli/globalConfiguration.js +61 -0
  165. package/dist/cli/globalConfiguration.js.map +1 -0
  166. package/dist/cli/hooks/useMessageCursor.d.ts +16 -0
  167. package/dist/cli/hooks/useMessageCursor.js +75 -0
  168. package/dist/cli/hooks/useMessageCursor.js.map +1 -0
  169. package/dist/cli/hooks/useOverlayStack.d.ts +9 -0
  170. package/dist/cli/hooks/useOverlayStack.js +26 -0
  171. package/dist/cli/hooks/useOverlayStack.js.map +1 -0
  172. package/dist/cli/hooks/useTerminalSize.d.ts +16 -0
  173. package/dist/cli/hooks/useTerminalSize.js +37 -0
  174. package/dist/cli/hooks/useTerminalSize.js.map +1 -0
  175. package/dist/cli/i18n/index.d.ts +15 -0
  176. package/dist/cli/i18n/index.js +32 -0
  177. package/dist/cli/i18n/index.js.map +1 -0
  178. package/dist/cli/i18n/messages.d.ts +1305 -0
  179. package/dist/cli/i18n/messages.js +1305 -0
  180. package/dist/cli/i18n/messages.js.map +1 -0
  181. package/dist/cli/imageAttachments.d.ts +22 -0
  182. package/dist/cli/imageAttachments.js +329 -0
  183. package/dist/cli/imageAttachments.js.map +1 -0
  184. package/dist/cli/index.d.ts +2 -0
  185. package/dist/cli/index.js +146 -0
  186. package/dist/cli/index.js.map +1 -0
  187. package/dist/cli/platform/terminalAttention.d.ts +46 -0
  188. package/dist/cli/platform/terminalAttention.js +152 -0
  189. package/dist/cli/platform/terminalAttention.js.map +1 -0
  190. package/dist/cli/platform/terminalTransparency.d.ts +11 -0
  191. package/dist/cli/platform/terminalTransparency.js +193 -0
  192. package/dist/cli/platform/terminalTransparency.js.map +1 -0
  193. package/dist/cli/repl.d.ts +15 -0
  194. package/dist/cli/repl.js +38 -0
  195. package/dist/cli/repl.js.map +1 -0
  196. package/dist/cli/setup.d.ts +17 -0
  197. package/dist/cli/setup.js +991 -0
  198. package/dist/cli/setup.js.map +1 -0
  199. package/dist/cli/singleShot.d.ts +30 -0
  200. package/dist/cli/singleShot.js +167 -0
  201. package/dist/cli/singleShot.js.map +1 -0
  202. package/dist/cli/state/adaptiveStreamScheduler.d.ts +53 -0
  203. package/dist/cli/state/adaptiveStreamScheduler.js +136 -0
  204. package/dist/cli/state/adaptiveStreamScheduler.js.map +1 -0
  205. package/dist/cli/state/agentFlowController.d.ts +37 -0
  206. package/dist/cli/state/agentFlowController.js +402 -0
  207. package/dist/cli/state/agentFlowController.js.map +1 -0
  208. package/dist/cli/state/approvalPresentationScheduler.d.ts +28 -0
  209. package/dist/cli/state/approvalPresentationScheduler.js +72 -0
  210. package/dist/cli/state/approvalPresentationScheduler.js.map +1 -0
  211. package/dist/cli/state/flowFeatureFlags.d.ts +18 -0
  212. package/dist/cli/state/flowFeatureFlags.js +45 -0
  213. package/dist/cli/state/flowFeatureFlags.js.map +1 -0
  214. package/dist/cli/state/flowReducer.d.ts +120 -0
  215. package/dist/cli/state/flowReducer.js +535 -0
  216. package/dist/cli/state/flowReducer.js.map +1 -0
  217. package/dist/cli/state/flowSelectors.d.ts +45 -0
  218. package/dist/cli/state/flowSelectors.js +144 -0
  219. package/dist/cli/state/flowSelectors.js.map +1 -0
  220. package/dist/cli/state/flowStore.d.ts +19 -0
  221. package/dist/cli/state/flowStore.js +51 -0
  222. package/dist/cli/state/flowStore.js.map +1 -0
  223. package/dist/cli/state/globalCommandActivity.d.ts +25 -0
  224. package/dist/cli/state/globalCommandActivity.js +57 -0
  225. package/dist/cli/state/globalCommandActivity.js.map +1 -0
  226. package/dist/cli/state/goldenTraces.d.ts +2 -0
  227. package/dist/cli/state/goldenTraces.js +15 -0
  228. package/dist/cli/state/goldenTraces.js.map +1 -0
  229. package/dist/cli/state/notificationCoordinator.d.ts +38 -0
  230. package/dist/cli/state/notificationCoordinator.js +101 -0
  231. package/dist/cli/state/notificationCoordinator.js.map +1 -0
  232. package/dist/cli/stateProvider.d.ts +5 -0
  233. package/dist/cli/stateProvider.js +7 -0
  234. package/dist/cli/stateProvider.js.map +1 -0
  235. package/dist/cli/telemetry/localFlowTelemetry.d.ts +42 -0
  236. package/dist/cli/telemetry/localFlowTelemetry.js +131 -0
  237. package/dist/cli/telemetry/localFlowTelemetry.js.map +1 -0
  238. package/dist/cli/telemetry/terminalBaseline.d.ts +93 -0
  239. package/dist/cli/telemetry/terminalBaseline.js +199 -0
  240. package/dist/cli/telemetry/terminalBaseline.js.map +1 -0
  241. package/dist/cli/telemetry/terminalLatencyTracker.d.ts +24 -0
  242. package/dist/cli/telemetry/terminalLatencyTracker.js +59 -0
  243. package/dist/cli/telemetry/terminalLatencyTracker.js.map +1 -0
  244. package/dist/cli/terminalLayout.d.ts +2 -0
  245. package/dist/cli/terminalLayout.js +16 -0
  246. package/dist/cli/terminalLayout.js.map +1 -0
  247. package/dist/cli/terminalMouse.d.ts +10 -0
  248. package/dist/cli/terminalMouse.js +29 -0
  249. package/dist/cli/terminalMouse.js.map +1 -0
  250. package/dist/cli/theme/ThemeProvider.d.ts +9 -0
  251. package/dist/cli/theme/ThemeProvider.js +26 -0
  252. package/dist/cli/theme/ThemeProvider.js.map +1 -0
  253. package/dist/cli/theme/dark.d.ts +2 -0
  254. package/dist/cli/theme/dark.js +27 -0
  255. package/dist/cli/theme/dark.js.map +1 -0
  256. package/dist/cli/theme/index.d.ts +5 -0
  257. package/dist/cli/theme/index.js +5 -0
  258. package/dist/cli/theme/index.js.map +1 -0
  259. package/dist/cli/theme/light.d.ts +2 -0
  260. package/dist/cli/theme/light.js +26 -0
  261. package/dist/cli/theme/light.js.map +1 -0
  262. package/dist/cli/theme/palette.d.ts +7 -0
  263. package/dist/cli/theme/palette.js +8 -0
  264. package/dist/cli/theme/palette.js.map +1 -0
  265. package/dist/cli/theme/resolveColor.d.ts +4 -0
  266. package/dist/cli/theme/resolveColor.js +43 -0
  267. package/dist/cli/theme/resolveColor.js.map +1 -0
  268. package/dist/cli/theme/types.d.ts +27 -0
  269. package/dist/cli/theme/types.js +2 -0
  270. package/dist/cli/theme/types.js.map +1 -0
  271. package/dist/cli/toolExecutor.d.ts +1 -0
  272. package/dist/cli/toolExecutor.js +2 -0
  273. package/dist/cli/toolExecutor.js.map +1 -0
  274. package/dist/core/agentEngine.d.ts +425 -0
  275. package/dist/core/agentEngine.js +5170 -0
  276. package/dist/core/agentEngine.js.map +1 -0
  277. package/dist/core/agents/loader.d.ts +9 -0
  278. package/dist/core/agents/loader.js +144 -0
  279. package/dist/core/agents/loader.js.map +1 -0
  280. package/dist/core/applyPatch.d.ts +24 -0
  281. package/dist/core/applyPatch.js +158 -0
  282. package/dist/core/applyPatch.js.map +1 -0
  283. package/dist/core/cacheMonitor.d.ts +24 -0
  284. package/dist/core/cacheMonitor.js +211 -0
  285. package/dist/core/cacheMonitor.js.map +1 -0
  286. package/dist/core/clientIdentity.d.ts +6 -0
  287. package/dist/core/clientIdentity.js +44 -0
  288. package/dist/core/clientIdentity.js.map +1 -0
  289. package/dist/core/config.d.ts +99 -0
  290. package/dist/core/config.js +715 -0
  291. package/dist/core/config.js.map +1 -0
  292. package/dist/core/contextCompaction.d.ts +20 -0
  293. package/dist/core/contextCompaction.js +158 -0
  294. package/dist/core/contextCompaction.js.map +1 -0
  295. package/dist/core/contextManager.d.ts +44 -0
  296. package/dist/core/contextManager.js +590 -0
  297. package/dist/core/contextManager.js.map +1 -0
  298. package/dist/core/contextPolicy.d.ts +18 -0
  299. package/dist/core/contextPolicy.js +39 -0
  300. package/dist/core/contextPolicy.js.map +1 -0
  301. package/dist/core/credentialStore.d.ts +8 -0
  302. package/dist/core/credentialStore.js +37 -0
  303. package/dist/core/credentialStore.js.map +1 -0
  304. package/dist/core/diffCompute.d.ts +31 -0
  305. package/dist/core/diffCompute.js +116 -0
  306. package/dist/core/diffCompute.js.map +1 -0
  307. package/dist/core/editHelpers.d.ts +8 -0
  308. package/dist/core/editHelpers.js +35 -0
  309. package/dist/core/editHelpers.js.map +1 -0
  310. package/dist/core/fileIO.d.ts +12 -0
  311. package/dist/core/fileIO.js +199 -0
  312. package/dist/core/fileIO.js.map +1 -0
  313. package/dist/core/gitService.d.ts +83 -0
  314. package/dist/core/gitService.js +522 -0
  315. package/dist/core/gitService.js.map +1 -0
  316. package/dist/core/index.d.ts +30 -0
  317. package/dist/core/index.js +19 -0
  318. package/dist/core/index.js.map +1 -0
  319. package/dist/core/mcp/client.d.ts +32 -0
  320. package/dist/core/mcp/client.js +186 -0
  321. package/dist/core/mcp/client.js.map +1 -0
  322. package/dist/core/mcp/settings.d.ts +2 -0
  323. package/dist/core/mcp/settings.js +26 -0
  324. package/dist/core/mcp/settings.js.map +1 -0
  325. package/dist/core/mcp/toolBridge.d.ts +20 -0
  326. package/dist/core/mcp/toolBridge.js +74 -0
  327. package/dist/core/mcp/toolBridge.js.map +1 -0
  328. package/dist/core/mcp/types.d.ts +29 -0
  329. package/dist/core/mcp/types.js +2 -0
  330. package/dist/core/mcp/types.js.map +1 -0
  331. package/dist/core/modelDiscovery.d.ts +14 -0
  332. package/dist/core/modelDiscovery.js +566 -0
  333. package/dist/core/modelDiscovery.js.map +1 -0
  334. package/dist/core/modelProtocol.d.ts +43 -0
  335. package/dist/core/modelProtocol.js +238 -0
  336. package/dist/core/modelProtocol.js.map +1 -0
  337. package/dist/core/modelRegistry.d.ts +56 -0
  338. package/dist/core/modelRegistry.js +308 -0
  339. package/dist/core/modelRegistry.js.map +1 -0
  340. package/dist/core/networkProxy.d.ts +20 -0
  341. package/dist/core/networkProxy.js +145 -0
  342. package/dist/core/networkProxy.js.map +1 -0
  343. package/dist/core/normalizeBaseUrl.d.ts +1 -0
  344. package/dist/core/normalizeBaseUrl.js +9 -0
  345. package/dist/core/normalizeBaseUrl.js.map +1 -0
  346. package/dist/core/pathUtils.d.ts +3 -0
  347. package/dist/core/pathUtils.js +46 -0
  348. package/dist/core/pathUtils.js.map +1 -0
  349. package/dist/core/permissions.d.ts +29 -0
  350. package/dist/core/permissions.js +245 -0
  351. package/dist/core/permissions.js.map +1 -0
  352. package/dist/core/persona/voiceProfile.d.ts +7 -0
  353. package/dist/core/persona/voiceProfile.js +14 -0
  354. package/dist/core/persona/voiceProfile.js.map +1 -0
  355. package/dist/core/profile.d.ts +35 -0
  356. package/dist/core/profile.js +373 -0
  357. package/dist/core/profile.js.map +1 -0
  358. package/dist/core/requestCompatibility.d.ts +13 -0
  359. package/dist/core/requestCompatibility.js +181 -0
  360. package/dist/core/requestCompatibility.js.map +1 -0
  361. package/dist/core/runtime/agentRuntime.d.ts +43 -0
  362. package/dist/core/runtime/agentRuntime.js +137 -0
  363. package/dist/core/runtime/agentRuntime.js.map +1 -0
  364. package/dist/core/runtime/approvalCoordinator.d.ts +36 -0
  365. package/dist/core/runtime/approvalCoordinator.js +113 -0
  366. package/dist/core/runtime/approvalCoordinator.js.map +1 -0
  367. package/dist/core/runtime/capabilityBoundary.d.ts +18 -0
  368. package/dist/core/runtime/capabilityBoundary.js +89 -0
  369. package/dist/core/runtime/capabilityBoundary.js.map +1 -0
  370. package/dist/core/runtime/nodeToolExecutor.d.ts +200 -0
  371. package/dist/core/runtime/nodeToolExecutor.js +2446 -0
  372. package/dist/core/runtime/nodeToolExecutor.js.map +1 -0
  373. package/dist/core/runtime/runtimeLogWriter.d.ts +32 -0
  374. package/dist/core/runtime/runtimeLogWriter.js +129 -0
  375. package/dist/core/runtime/runtimeLogWriter.js.map +1 -0
  376. package/dist/core/runtime/runtimeTaskManager.d.ts +78 -0
  377. package/dist/core/runtime/runtimeTaskManager.js +374 -0
  378. package/dist/core/runtime/runtimeTaskManager.js.map +1 -0
  379. package/dist/core/runtime/sessionRegistry.d.ts +19 -0
  380. package/dist/core/runtime/sessionRegistry.js +41 -0
  381. package/dist/core/runtime/sessionRegistry.js.map +1 -0
  382. package/dist/core/runtime/stateProvider.d.ts +69 -0
  383. package/dist/core/runtime/stateProvider.js +131 -0
  384. package/dist/core/runtime/stateProvider.js.map +1 -0
  385. package/dist/core/runtime/subAgentTaskManager.d.ts +111 -0
  386. package/dist/core/runtime/subAgentTaskManager.js +386 -0
  387. package/dist/core/runtime/subAgentTaskManager.js.map +1 -0
  388. package/dist/core/schemaValidation.d.ts +5 -0
  389. package/dist/core/schemaValidation.js +153 -0
  390. package/dist/core/schemaValidation.js.map +1 -0
  391. package/dist/core/skills/loader.d.ts +7 -0
  392. package/dist/core/skills/loader.js +91 -0
  393. package/dist/core/skills/loader.js.map +1 -0
  394. package/dist/core/skills/runtime.d.ts +19 -0
  395. package/dist/core/skills/runtime.js +61 -0
  396. package/dist/core/skills/runtime.js.map +1 -0
  397. package/dist/core/subAgent.d.ts +50 -0
  398. package/dist/core/subAgent.js +1258 -0
  399. package/dist/core/subAgent.js.map +1 -0
  400. package/dist/core/systemPrompt.d.ts +27 -0
  401. package/dist/core/systemPrompt.js +219 -0
  402. package/dist/core/systemPrompt.js.map +1 -0
  403. package/dist/core/taskManager.d.ts +105 -0
  404. package/dist/core/taskManager.js +617 -0
  405. package/dist/core/taskManager.js.map +1 -0
  406. package/dist/core/tokenCompressor.d.ts +14 -0
  407. package/dist/core/tokenCompressor.js +161 -0
  408. package/dist/core/tokenCompressor.js.map +1 -0
  409. package/dist/core/tokenCounter.d.ts +28 -0
  410. package/dist/core/tokenCounter.js +101 -0
  411. package/dist/core/tokenCounter.js.map +1 -0
  412. package/dist/core/toolDispatcher.d.ts +11 -0
  413. package/dist/core/toolDispatcher.js +38 -0
  414. package/dist/core/toolDispatcher.js.map +1 -0
  415. package/dist/core/toolExecutionLedger.d.ts +9 -0
  416. package/dist/core/toolExecutionLedger.js +84 -0
  417. package/dist/core/toolExecutionLedger.js.map +1 -0
  418. package/dist/core/toolRegistry.d.ts +19 -0
  419. package/dist/core/toolRegistry.js +820 -0
  420. package/dist/core/toolRegistry.js.map +1 -0
  421. package/dist/core/turnStrategy.d.ts +20 -0
  422. package/dist/core/turnStrategy.js +103 -0
  423. package/dist/core/turnStrategy.js.map +1 -0
  424. package/dist/platform/process.d.ts +14 -0
  425. package/dist/platform/process.js +28 -0
  426. package/dist/platform/process.js.map +1 -0
  427. package/dist/platform/runtime.d.ts +8 -0
  428. package/dist/platform/runtime.js +21 -0
  429. package/dist/platform/runtime.js.map +1 -0
  430. package/dist/server/adminPage.d.ts +1 -0
  431. package/dist/server/adminPage.js +755 -0
  432. package/dist/server/adminPage.js.map +1 -0
  433. package/dist/server/index.d.ts +22 -0
  434. package/dist/server/index.js +566 -0
  435. package/dist/server/index.js.map +1 -0
  436. package/dist/shared/agentTypes.d.ts +227 -0
  437. package/dist/shared/agentTypes.js +79 -0
  438. package/dist/shared/agentTypes.js.map +1 -0
  439. package/dist/shared/codeIndexTypes.d.ts +32 -0
  440. package/dist/shared/codeIndexTypes.js +2 -0
  441. package/dist/shared/codeIndexTypes.js.map +1 -0
  442. package/dist/shared/flowEvents.d.ts +192 -0
  443. package/dist/shared/flowEvents.js +37 -0
  444. package/dist/shared/flowEvents.js.map +1 -0
  445. package/dist/shared/memoryTypes.d.ts +100 -0
  446. package/dist/shared/memoryTypes.js +2 -0
  447. package/dist/shared/memoryTypes.js.map +1 -0
  448. package/dist/shared/pluginTypes.d.ts +345 -0
  449. package/dist/shared/pluginTypes.js +2 -0
  450. package/dist/shared/pluginTypes.js.map +1 -0
  451. package/dist/shared/runtimeTaskTypes.d.ts +43 -0
  452. package/dist/shared/runtimeTaskTypes.js +2 -0
  453. package/dist/shared/runtimeTaskTypes.js.map +1 -0
  454. package/dist/shared/skillTypes.d.ts +1 -0
  455. package/dist/shared/skillTypes.js +2 -0
  456. package/dist/shared/skillTypes.js.map +1 -0
  457. package/dist/shared/subAgentTypes.d.ts +99 -0
  458. package/dist/shared/subAgentTypes.js +2 -0
  459. package/dist/shared/subAgentTypes.js.map +1 -0
  460. package/dist/shared/terminalTypes.d.ts +102 -0
  461. package/dist/shared/terminalTypes.js +2 -0
  462. package/dist/shared/terminalTypes.js.map +1 -0
  463. package/dist/shared/toolCallMarkup.d.ts +10 -0
  464. package/dist/shared/toolCallMarkup.js +107 -0
  465. package/dist/shared/toolCallMarkup.js.map +1 -0
  466. package/dist/shared/toolTypes.d.ts +24 -0
  467. package/dist/shared/toolTypes.js +2 -0
  468. package/dist/shared/toolTypes.js.map +1 -0
  469. package/dist/shared/types.d.ts +81 -0
  470. package/dist/shared/types.js +2 -0
  471. package/dist/shared/types.js.map +1 -0
  472. package/dist/state/types.d.ts +69 -0
  473. package/dist/state/types.js +2 -0
  474. package/dist/state/types.js.map +1 -0
  475. package/dist/tools/executor.d.ts +133 -0
  476. package/dist/tools/executor.js +2 -0
  477. package/dist/tools/executor.js.map +1 -0
  478. package/dist/tools/memory/loaders.d.ts +6 -0
  479. package/dist/tools/memory/loaders.js +292 -0
  480. package/dist/tools/memory/loaders.js.map +1 -0
  481. package/dist/tools/memory/sanitizer.d.ts +6 -0
  482. package/dist/tools/memory/sanitizer.js +48 -0
  483. package/dist/tools/memory/sanitizer.js.map +1 -0
  484. package/dist/tools/memory/service.d.ts +24 -0
  485. package/dist/tools/memory/service.js +273 -0
  486. package/dist/tools/memory/service.js.map +1 -0
  487. package/dist/tools/memory/writer.d.ts +17 -0
  488. package/dist/tools/memory/writer.js +192 -0
  489. package/dist/tools/memory/writer.js.map +1 -0
  490. package/package.json +68 -0
@@ -0,0 +1,755 @@
1
+ export const ADMIN_HTML = `<!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>TurboFlux Admin</title>
7
+ <style>
8
+ :root {
9
+ --paper: #f5eedf;
10
+ --paper-deep: #e4d4ba;
11
+ --paper-line: rgba(72, 50, 28, 0.18);
12
+ --ink: #2d2419;
13
+ --muted: #75634f;
14
+ --cloth: #47574e;
15
+ --cloth-dark: #2f3b36;
16
+ --accent: #8a4f35;
17
+ --accent-2: #2f6f73;
18
+ --danger: #9b342b;
19
+ --ok: #3d6b42;
20
+ --shadow: 0 22px 60px rgba(45, 36, 25, 0.22);
21
+ }
22
+
23
+ * { box-sizing: border-box; }
24
+
25
+ html, body { min-height: 100%; }
26
+
27
+ body {
28
+ margin: 0;
29
+ color: var(--ink);
30
+ font-family: ui-serif, Georgia, "Times New Roman", "Noto Serif SC", serif;
31
+ background:
32
+ radial-gradient(circle at 12% 8%, rgba(82, 61, 36, 0.12) 0 1px, transparent 1px),
33
+ radial-gradient(circle at 78% 24%, rgba(82, 61, 36, 0.09) 0 1px, transparent 1px),
34
+ linear-gradient(135deg, #dbc8a9, #f6efe2 34%, #e7d8bf 100%);
35
+ background-size: 22px 22px, 34px 34px, 100% 100%;
36
+ }
37
+
38
+ body::before {
39
+ content: "";
40
+ position: fixed;
41
+ inset: 0;
42
+ pointer-events: none;
43
+ background:
44
+ repeating-linear-gradient(0deg, rgba(72, 50, 28, 0.025), rgba(72, 50, 28, 0.025) 1px, transparent 1px, transparent 5px),
45
+ linear-gradient(90deg, rgba(255,255,255,0.22), rgba(95, 68, 38, 0.10));
46
+ mix-blend-mode: multiply;
47
+ }
48
+
49
+ button, input, textarea {
50
+ font: inherit;
51
+ }
52
+
53
+ .book {
54
+ position: relative;
55
+ z-index: 1;
56
+ display: grid;
57
+ grid-template-columns: 280px minmax(0, 1fr);
58
+ min-height: calc(100vh - 36px);
59
+ margin: 18px;
60
+ border: 1px solid rgba(83, 59, 33, 0.28);
61
+ border-radius: 8px;
62
+ overflow: hidden;
63
+ box-shadow: var(--shadow);
64
+ background: var(--paper);
65
+ }
66
+
67
+ .spine {
68
+ display: flex;
69
+ flex-direction: column;
70
+ gap: 28px;
71
+ padding: 30px 24px;
72
+ background:
73
+ linear-gradient(90deg, rgba(34, 45, 39, 0.92), rgba(67, 82, 73, 0.94)),
74
+ repeating-linear-gradient(90deg, rgba(255,255,255,0.05), rgba(255,255,255,0.05) 1px, transparent 1px, transparent 8px);
75
+ color: #f8f1e3;
76
+ border-right: 8px solid rgba(72, 50, 28, 0.20);
77
+ }
78
+
79
+ .brand {
80
+ display: grid;
81
+ gap: 8px;
82
+ padding-bottom: 22px;
83
+ border-bottom: 1px solid rgba(248, 241, 227, 0.25);
84
+ }
85
+
86
+ .brand-mark {
87
+ width: 42px;
88
+ height: 42px;
89
+ display: grid;
90
+ place-items: center;
91
+ border: 1px solid rgba(248, 241, 227, 0.45);
92
+ border-radius: 6px;
93
+ color: #f8f1e3;
94
+ letter-spacing: 0;
95
+ font-weight: 800;
96
+ }
97
+
98
+ h1 {
99
+ margin: 0;
100
+ font-size: 26px;
101
+ line-height: 1.05;
102
+ letter-spacing: 0;
103
+ }
104
+
105
+ .subtitle {
106
+ margin: 0;
107
+ color: rgba(248, 241, 227, 0.72);
108
+ font-size: 14px;
109
+ line-height: 1.5;
110
+ }
111
+
112
+ .nav {
113
+ display: grid;
114
+ gap: 10px;
115
+ }
116
+
117
+ .nav-button {
118
+ width: 100%;
119
+ display: grid;
120
+ grid-template-columns: 46px 1fr;
121
+ align-items: center;
122
+ gap: 12px;
123
+ padding: 12px 10px;
124
+ color: rgba(248, 241, 227, 0.78);
125
+ background: transparent;
126
+ border: 1px solid transparent;
127
+ border-radius: 6px;
128
+ text-align: left;
129
+ cursor: pointer;
130
+ }
131
+
132
+ .nav-button:hover,
133
+ .nav-button.active {
134
+ color: #fff9ec;
135
+ background: rgba(255, 255, 255, 0.09);
136
+ border-color: rgba(248, 241, 227, 0.20);
137
+ }
138
+
139
+ .nav-code {
140
+ display: grid;
141
+ place-items: center;
142
+ min-width: 42px;
143
+ height: 30px;
144
+ border: 1px solid rgba(248, 241, 227, 0.26);
145
+ border-radius: 5px;
146
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
147
+ font-size: 12px;
148
+ }
149
+
150
+ .token-box {
151
+ margin-top: auto;
152
+ display: grid;
153
+ gap: 9px;
154
+ }
155
+
156
+ .token-box label {
157
+ color: rgba(248, 241, 227, 0.78);
158
+ font-size: 13px;
159
+ }
160
+
161
+ .token-row {
162
+ display: grid;
163
+ grid-template-columns: minmax(0, 1fr) 42px;
164
+ gap: 8px;
165
+ }
166
+
167
+ .token-row input {
168
+ min-width: 0;
169
+ color: #fff9ec;
170
+ background: rgba(0, 0, 0, 0.16);
171
+ border: 1px solid rgba(248, 241, 227, 0.24);
172
+ border-radius: 5px;
173
+ padding: 10px;
174
+ }
175
+
176
+ .token-row button {
177
+ color: #fff9ec;
178
+ background: rgba(255, 255, 255, 0.10);
179
+ border: 1px solid rgba(248, 241, 227, 0.26);
180
+ border-radius: 5px;
181
+ cursor: pointer;
182
+ }
183
+
184
+ .page {
185
+ position: relative;
186
+ min-width: 0;
187
+ padding: 34px;
188
+ background:
189
+ linear-gradient(90deg, rgba(97, 68, 36, 0.11), transparent 22px),
190
+ linear-gradient(#f8f1e3, var(--paper));
191
+ }
192
+
193
+ .page::after {
194
+ content: "";
195
+ position: absolute;
196
+ inset: 0;
197
+ pointer-events: none;
198
+ border-left: 1px solid rgba(68, 45, 24, 0.12);
199
+ box-shadow: inset 16px 0 24px rgba(68, 45, 24, 0.08);
200
+ }
201
+
202
+ .page-head {
203
+ position: relative;
204
+ z-index: 1;
205
+ display: flex;
206
+ justify-content: space-between;
207
+ gap: 20px;
208
+ align-items: flex-start;
209
+ padding-bottom: 22px;
210
+ border-bottom: 1px solid var(--paper-line);
211
+ }
212
+
213
+ .page-title {
214
+ margin: 0;
215
+ font-size: 30px;
216
+ line-height: 1.1;
217
+ letter-spacing: 0;
218
+ }
219
+
220
+ .page-note {
221
+ margin: 8px 0 0;
222
+ color: var(--muted);
223
+ line-height: 1.6;
224
+ max-width: 650px;
225
+ }
226
+
227
+ .status-strip {
228
+ display: flex;
229
+ flex-wrap: wrap;
230
+ gap: 8px;
231
+ justify-content: flex-end;
232
+ }
233
+
234
+ .pill {
235
+ display: inline-flex;
236
+ align-items: center;
237
+ min-height: 30px;
238
+ padding: 5px 10px;
239
+ border: 1px solid var(--paper-line);
240
+ border-radius: 999px;
241
+ color: var(--muted);
242
+ background: rgba(255, 255, 255, 0.28);
243
+ font-size: 13px;
244
+ white-space: nowrap;
245
+ }
246
+
247
+ .pill.ok { color: var(--ok); border-color: rgba(61, 107, 66, 0.28); }
248
+ .pill.warn { color: var(--danger); border-color: rgba(155, 52, 43, 0.28); }
249
+
250
+ .panel {
251
+ position: relative;
252
+ z-index: 1;
253
+ margin-top: 24px;
254
+ padding: 24px;
255
+ border: 1px solid rgba(87, 61, 34, 0.24);
256
+ border-radius: 8px;
257
+ background: rgba(255, 252, 244, 0.56);
258
+ }
259
+
260
+ .panel h2 {
261
+ margin: 0 0 18px;
262
+ font-size: 20px;
263
+ letter-spacing: 0;
264
+ }
265
+
266
+ .form-grid {
267
+ display: grid;
268
+ grid-template-columns: repeat(2, minmax(0, 1fr));
269
+ gap: 18px;
270
+ }
271
+
272
+ .field {
273
+ display: grid;
274
+ gap: 8px;
275
+ }
276
+
277
+ .field.full { grid-column: 1 / -1; }
278
+
279
+ .field label {
280
+ color: var(--muted);
281
+ font-size: 14px;
282
+ }
283
+
284
+ .field input,
285
+ .field textarea {
286
+ width: 100%;
287
+ padding: 10px 12px;
288
+ color: var(--ink);
289
+ background: rgba(255, 255, 255, 0.54);
290
+ border: 1px solid rgba(82, 58, 32, 0.28);
291
+ border-radius: 6px;
292
+ outline: none;
293
+ }
294
+
295
+ .field input {
296
+ min-height: 42px;
297
+ }
298
+
299
+ .field textarea {
300
+ min-height: 190px;
301
+ resize: vertical;
302
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
303
+ font-size: 13px;
304
+ line-height: 1.5;
305
+ }
306
+
307
+ .field input:focus,
308
+ .field textarea:focus {
309
+ border-color: rgba(47, 111, 115, 0.62);
310
+ box-shadow: 0 0 0 3px rgba(47, 111, 115, 0.12);
311
+ }
312
+
313
+ .checks {
314
+ display: flex;
315
+ flex-wrap: wrap;
316
+ gap: 14px;
317
+ align-items: center;
318
+ color: var(--muted);
319
+ font-size: 14px;
320
+ }
321
+
322
+ .checks input { width: auto; min-height: auto; }
323
+
324
+ .actions {
325
+ display: flex;
326
+ flex-wrap: wrap;
327
+ gap: 10px;
328
+ align-items: center;
329
+ margin-top: 20px;
330
+ }
331
+
332
+ .primary,
333
+ .secondary {
334
+ min-height: 40px;
335
+ padding: 9px 14px;
336
+ border-radius: 6px;
337
+ border: 1px solid transparent;
338
+ cursor: pointer;
339
+ }
340
+
341
+ .primary {
342
+ color: #fff9ec;
343
+ background: var(--accent);
344
+ border-color: rgba(92, 48, 31, 0.35);
345
+ }
346
+
347
+ .secondary {
348
+ color: var(--ink);
349
+ background: rgba(255,255,255,0.38);
350
+ border-color: rgba(82, 58, 32, 0.28);
351
+ }
352
+
353
+ .message {
354
+ min-height: 24px;
355
+ color: var(--muted);
356
+ font-size: 14px;
357
+ }
358
+
359
+ .table {
360
+ width: 100%;
361
+ border-collapse: collapse;
362
+ overflow: hidden;
363
+ border: 1px solid rgba(82, 58, 32, 0.18);
364
+ border-radius: 6px;
365
+ }
366
+
367
+ .table th,
368
+ .table td {
369
+ padding: 13px 12px;
370
+ border-bottom: 1px solid rgba(82, 58, 32, 0.14);
371
+ text-align: left;
372
+ vertical-align: top;
373
+ font-size: 14px;
374
+ }
375
+
376
+ .table th {
377
+ color: var(--muted);
378
+ background: rgba(105, 78, 45, 0.08);
379
+ font-weight: 700;
380
+ }
381
+
382
+ .table tr:last-child td { border-bottom: 0; }
383
+
384
+ .mono {
385
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
386
+ font-size: 13px;
387
+ }
388
+
389
+ .empty {
390
+ min-height: 180px;
391
+ display: grid;
392
+ place-items: center;
393
+ color: var(--muted);
394
+ border: 1px dashed rgba(82, 58, 32, 0.28);
395
+ border-radius: 8px;
396
+ background: rgba(255, 255, 255, 0.24);
397
+ text-align: center;
398
+ line-height: 1.7;
399
+ }
400
+
401
+ .hidden { display: none; }
402
+
403
+ @media (max-width: 880px) {
404
+ .book {
405
+ grid-template-columns: 1fr;
406
+ margin: 0;
407
+ min-height: 100vh;
408
+ border-radius: 0;
409
+ }
410
+
411
+ .spine {
412
+ gap: 18px;
413
+ padding: 20px;
414
+ }
415
+
416
+ .nav {
417
+ grid-template-columns: repeat(3, minmax(0, 1fr));
418
+ }
419
+
420
+ .nav-button {
421
+ grid-template-columns: 1fr;
422
+ justify-items: center;
423
+ text-align: center;
424
+ }
425
+
426
+ .page {
427
+ padding: 22px;
428
+ }
429
+
430
+ .page-head {
431
+ display: grid;
432
+ }
433
+
434
+ .status-strip {
435
+ justify-content: flex-start;
436
+ }
437
+
438
+ .form-grid {
439
+ grid-template-columns: 1fr;
440
+ }
441
+ }
442
+ </style>
443
+ </head>
444
+ <body>
445
+ <main class="book">
446
+ <aside class="spine">
447
+ <div class="brand">
448
+ <div class="brand-mark">TF</div>
449
+ <h1>TurboFlux</h1>
450
+ <p class="subtitle">本地后台管理</p>
451
+ </div>
452
+
453
+ <nav class="nav" aria-label="后台导航">
454
+ <button class="nav-button active" type="button" data-tab="api">
455
+ <span class="nav-code">API</span><span>API 配置</span>
456
+ </button>
457
+ <button class="nav-button" type="button" data-tab="users">
458
+ <span class="nav-code">USR</span><span>用户管理</span>
459
+ </button>
460
+ <button class="nav-button" type="button" data-tab="logs">
461
+ <span class="nav-code">LOG</span><span>日志</span>
462
+ </button>
463
+ </nav>
464
+
465
+ <div class="token-box">
466
+ <label for="adminToken">访问令牌</label>
467
+ <div class="token-row">
468
+ <input id="adminToken" type="password" autocomplete="off" placeholder="X-TurboFlux-Token">
469
+ <button id="saveToken" type="button" title="保存到本机浏览器">OK</button>
470
+ </div>
471
+ </div>
472
+ </aside>
473
+
474
+ <section class="page">
475
+ <div class="page-head">
476
+ <div>
477
+ <h2 id="pageTitle" class="page-title">API 配置</h2>
478
+ <p id="pageNote" class="page-note">模型代理、密钥与本地服务状态。</p>
479
+ </div>
480
+ <div id="statusStrip" class="status-strip"></div>
481
+ </div>
482
+
483
+ <section id="tab-api" class="tab-panel">
484
+ <div class="panel">
485
+ <h2>上游模型</h2>
486
+ <form id="configForm">
487
+ <div class="form-grid">
488
+ <div class="field full">
489
+ <label for="upstreamBaseUrl">Base URL</label>
490
+ <input id="upstreamBaseUrl" name="upstreamBaseUrl" type="url" required>
491
+ </div>
492
+ <div class="field">
493
+ <label for="defaultModel">默认模型</label>
494
+ <input id="defaultModel" name="defaultModel" required>
495
+ </div>
496
+ <div class="field">
497
+ <label for="corsOrigin">CORS Origin</label>
498
+ <input id="corsOrigin" name="corsOrigin" placeholder="http://127.0.0.1">
499
+ </div>
500
+ <div class="field full">
501
+ <label for="modelsJson">Models JSON</label>
502
+ <textarea id="modelsJson" name="modelsJson" rows="9" spellcheck="false"></textarea>
503
+ </div>
504
+ <div class="field">
505
+ <label for="upstreamApiKey">上游 API Key</label>
506
+ <input id="upstreamApiKey" name="upstreamApiKey" type="password" autocomplete="off" placeholder="留空则保持当前密钥">
507
+ </div>
508
+ <div class="field">
509
+ <label for="authToken">代理访问令牌</label>
510
+ <input id="authToken" name="authToken" type="password" autocomplete="off" placeholder="留空则保持当前令牌">
511
+ </div>
512
+ <div class="field full checks">
513
+ <label><input id="clearUpstreamApiKey" name="clearUpstreamApiKey" type="checkbox"> 清空上游密钥</label>
514
+ <label><input id="clearAuthToken" name="clearAuthToken" type="checkbox"> 关闭代理令牌</label>
515
+ </div>
516
+ </div>
517
+ <div class="actions">
518
+ <button class="primary" type="submit">保存配置</button>
519
+ <button class="secondary" id="testUpstream" type="button">测试上游</button>
520
+ <span id="formMessage" class="message"></span>
521
+ </div>
522
+ </form>
523
+ </div>
524
+ </section>
525
+
526
+ <section id="tab-users" class="tab-panel hidden">
527
+ <div class="panel">
528
+ <h2>用户管理</h2>
529
+ <table class="table">
530
+ <thead>
531
+ <tr><th>用户</th><th>角色</th><th>状态</th></tr>
532
+ </thead>
533
+ <tbody id="usersBody"></tbody>
534
+ </table>
535
+ </div>
536
+ </section>
537
+
538
+ <section id="tab-logs" class="tab-panel hidden">
539
+ <div class="panel">
540
+ <h2>最近日志</h2>
541
+ <table class="table">
542
+ <thead>
543
+ <tr><th>时间</th><th>级别</th><th>模块</th><th>消息</th></tr>
544
+ </thead>
545
+ <tbody id="logsBody"></tbody>
546
+ </table>
547
+ </div>
548
+ </section>
549
+ </section>
550
+ </main>
551
+
552
+ <script>
553
+ const $ = (selector) => document.querySelector(selector);
554
+ const $$ = (selector) => Array.from(document.querySelectorAll(selector));
555
+ const state = { config: null, users: [], logs: [] };
556
+ const titles = {
557
+ api: ['API 配置', '模型代理、密钥与本地服务状态。'],
558
+ users: ['用户管理', '初版占位,保留角色与状态视图。'],
559
+ logs: ['日志', '当前进程内的最近运行记录。']
560
+ };
561
+
562
+ function adminToken() {
563
+ return localStorage.getItem('turboflux.adminToken') || '';
564
+ }
565
+
566
+ function requestHeaders(hasBody) {
567
+ const headers = { 'Accept': 'application/json' };
568
+ if (hasBody) headers['Content-Type'] = 'application/json';
569
+ const token = adminToken();
570
+ if (token) headers['X-TurboFlux-Token'] = token;
571
+ return headers;
572
+ }
573
+
574
+ function escapeHtml(value) {
575
+ return String(value ?? '').replace(/[&<>"']/g, (char) => ({
576
+ '&': '&amp;',
577
+ '<': '&lt;',
578
+ '>': '&gt;',
579
+ '"': '&quot;',
580
+ "'": '&#39;'
581
+ })[char]);
582
+ }
583
+
584
+ async function api(path, options) {
585
+ const request = options || {};
586
+ const response = await fetch(path, {
587
+ method: request.method || 'GET',
588
+ headers: Object.assign(requestHeaders(Boolean(request.body)), request.headers || {}),
589
+ body: request.body
590
+ });
591
+ const text = await response.text();
592
+ let payload = {};
593
+ if (text) {
594
+ try { payload = JSON.parse(text); } catch { payload = { raw: text }; }
595
+ }
596
+ if (!response.ok) {
597
+ const message = payload && payload.error && payload.error.message ? payload.error.message : 'HTTP ' + response.status;
598
+ throw new Error(message);
599
+ }
600
+ return payload;
601
+ }
602
+
603
+ function setMessage(text, tone) {
604
+ const el = $('#formMessage');
605
+ el.textContent = text || '';
606
+ el.style.color = tone === 'error' ? 'var(--danger)' : tone === 'ok' ? 'var(--ok)' : 'var(--muted)';
607
+ }
608
+
609
+ function renderStatus() {
610
+ const cfg = state.config;
611
+ const strip = $('#statusStrip');
612
+ if (!cfg) {
613
+ strip.innerHTML = '<span class="pill warn">未连接</span>';
614
+ return;
615
+ }
616
+ const keyClass = cfg.upstreamKeyConfigured ? 'ok' : 'warn';
617
+ const authClass = cfg.proxyAuth === 'enabled' ? 'ok' : '';
618
+ strip.innerHTML =
619
+ '<span class="pill ok">服务在线</span>' +
620
+ '<span class="pill ' + keyClass + '">Key ' + escapeHtml(cfg.upstreamKeyConfigured ? cfg.upstreamKeyPreview : '未配置') + '</span>' +
621
+ '<span class="pill ' + authClass + '">Auth ' + escapeHtml(cfg.proxyAuth) + '</span>' +
622
+ '<span class="pill mono">' + escapeHtml(cfg.host) + ':' + escapeHtml(cfg.port) + '</span>';
623
+ }
624
+
625
+ function renderConfig() {
626
+ const cfg = state.config;
627
+ if (!cfg) return;
628
+ $('#upstreamBaseUrl').value = cfg.upstreamBaseUrl || '';
629
+ $('#defaultModel').value = cfg.defaultModel || '';
630
+ $('#corsOrigin').value = cfg.corsOrigin || '';
631
+ $('#modelsJson').value = JSON.stringify(cfg.models || [], null, 2);
632
+ $('#upstreamApiKey').placeholder = cfg.upstreamKeyConfigured ? '当前:' + cfg.upstreamKeyPreview + ',留空保持' : '<upstream API key>';
633
+ $('#authToken').placeholder = cfg.proxyAuth === 'enabled' ? '已启用,留空保持' : '可选';
634
+ $('#clearUpstreamApiKey').checked = false;
635
+ $('#clearAuthToken').checked = false;
636
+ renderStatus();
637
+ }
638
+
639
+ function renderUsers() {
640
+ const body = $('#usersBody');
641
+ if (!state.users.length) {
642
+ body.innerHTML = '<tr><td colspan="3"><div class="empty">用户管理占位</div></td></tr>';
643
+ return;
644
+ }
645
+ body.innerHTML = state.users.map((user) =>
646
+ '<tr><td class="mono">' + escapeHtml(user.name) + '</td><td>' + escapeHtml(user.role) + '</td><td>' + escapeHtml(user.status) + '</td></tr>'
647
+ ).join('');
648
+ }
649
+
650
+ function renderLogs() {
651
+ const body = $('#logsBody');
652
+ if (!state.logs.length) {
653
+ body.innerHTML = '<tr><td colspan="4"><div class="empty">暂无日志</div></td></tr>';
654
+ return;
655
+ }
656
+ body.innerHTML = state.logs.map((log) =>
657
+ '<tr><td class="mono">' + escapeHtml(new Date(log.time).toLocaleString()) + '</td><td>' + escapeHtml(log.level) + '</td><td>' + escapeHtml(log.area) + '</td><td>' + escapeHtml(log.message) + '</td></tr>'
658
+ ).join('');
659
+ }
660
+
661
+ async function loadConfig() {
662
+ state.config = await api('/admin/api/config');
663
+ renderConfig();
664
+ }
665
+
666
+ async function loadUsers() {
667
+ const payload = await api('/admin/api/users');
668
+ state.users = payload.data || [];
669
+ renderUsers();
670
+ }
671
+
672
+ async function loadLogs() {
673
+ const payload = await api('/admin/api/logs');
674
+ state.logs = payload.data || [];
675
+ renderLogs();
676
+ }
677
+
678
+ async function refreshAll() {
679
+ try {
680
+ await Promise.all([loadConfig(), loadUsers(), loadLogs()]);
681
+ } catch (error) {
682
+ setMessage(error.message, 'error');
683
+ renderStatus();
684
+ }
685
+ }
686
+
687
+ function switchTab(name) {
688
+ $$('.nav-button').forEach((button) => button.classList.toggle('active', button.dataset.tab === name));
689
+ $$('.tab-panel').forEach((panel) => panel.classList.add('hidden'));
690
+ $('#tab-' + name).classList.remove('hidden');
691
+ $('#pageTitle').textContent = titles[name][0];
692
+ $('#pageNote').textContent = titles[name][1];
693
+ if (name === 'logs') loadLogs().catch((error) => setMessage(error.message, 'error'));
694
+ }
695
+
696
+ $('#configForm').addEventListener('submit', async (event) => {
697
+ event.preventDefault();
698
+ setMessage('保存中...', '');
699
+ const upstreamApiKey = $('#upstreamApiKey').value.trim();
700
+ const authToken = $('#authToken').value.trim();
701
+ let models;
702
+ try {
703
+ models = JSON.parse($('#modelsJson').value || '[]');
704
+ if (!Array.isArray(models)) throw new Error('Models JSON must be an array');
705
+ } catch (error) {
706
+ setMessage(error.message, 'error');
707
+ return;
708
+ }
709
+ const payload = {
710
+ upstreamBaseUrl: $('#upstreamBaseUrl').value.trim(),
711
+ defaultModel: $('#defaultModel').value.trim(),
712
+ models,
713
+ corsOrigin: $('#corsOrigin').value.trim(),
714
+ clearUpstreamApiKey: $('#clearUpstreamApiKey').checked,
715
+ clearAuthToken: $('#clearAuthToken').checked
716
+ };
717
+ if (upstreamApiKey) payload.upstreamApiKey = upstreamApiKey;
718
+ if (authToken) payload.authToken = authToken;
719
+ try {
720
+ state.config = await api('/admin/api/config', { method: 'PUT', body: JSON.stringify(payload) });
721
+ $('#upstreamApiKey').value = '';
722
+ $('#authToken').value = '';
723
+ renderConfig();
724
+ await loadLogs();
725
+ setMessage('已保存', 'ok');
726
+ } catch (error) {
727
+ setMessage(error.message, 'error');
728
+ }
729
+ });
730
+
731
+ $('#testUpstream').addEventListener('click', async () => {
732
+ setMessage('测试中...', '');
733
+ try {
734
+ const payload = await api('/admin/api/config/test', { method: 'POST', body: JSON.stringify({}) });
735
+ setMessage(payload.message || '测试通过', 'ok');
736
+ await loadLogs();
737
+ } catch (error) {
738
+ setMessage(error.message, 'error');
739
+ await loadLogs().catch(() => {});
740
+ }
741
+ });
742
+
743
+ $('#saveToken').addEventListener('click', () => {
744
+ localStorage.setItem('turboflux.adminToken', $('#adminToken').value.trim());
745
+ setMessage('访问令牌已保存到本机浏览器', 'ok');
746
+ refreshAll();
747
+ });
748
+
749
+ $$('.nav-button').forEach((button) => button.addEventListener('click', () => switchTab(button.dataset.tab)));
750
+ $('#adminToken').value = adminToken();
751
+ refreshAll();
752
+ </script>
753
+ </body>
754
+ </html>`;
755
+ //# sourceMappingURL=adminPage.js.map