@promptbook/cli 0.112.0-99 → 0.113.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 (850) hide show
  1. package/README.md +76 -44
  2. package/agents/default/developer.book +24 -0
  3. package/apps/agents-server/README.md +19 -2
  4. package/apps/agents-server/env-manual/GITHUB_APP.md +1 -1
  5. package/apps/agents-server/next.config.ts +41 -1
  6. package/apps/agents-server/package.json +1 -1
  7. package/apps/agents-server/playwright.config.ts +3 -0
  8. package/apps/agents-server/public/promptbook-logo-blue.png +0 -0
  9. package/apps/agents-server/public/promptbook-logo-white.png +0 -0
  10. package/apps/agents-server/scripts/prerender-homepage.js +76 -1
  11. package/apps/agents-server/src/app/AddAgentButton.tsx +0 -5
  12. package/apps/agents-server/src/app/[agentName]/layout.tsx +1 -0
  13. package/apps/agents-server/src/app/actions.ts +70 -9
  14. package/apps/agents-server/src/app/admin/about/page.tsx +1 -1
  15. package/apps/agents-server/src/app/admin/api-tokens/ApiTokensClient.tsx +4 -1
  16. package/apps/agents-server/src/app/admin/chat-feedback/ChatFeedbackClient.tsx +3 -0
  17. package/apps/agents-server/src/app/admin/chat-feedback/ChatFeedbackTable.tsx +13 -8
  18. package/apps/agents-server/src/app/admin/chat-feedback/page.tsx +2 -4
  19. package/apps/agents-server/src/app/admin/chat-history/ChatHistoryClient.tsx +3 -0
  20. package/apps/agents-server/src/app/admin/chat-history/ChatHistoryTable.tsx +13 -8
  21. package/apps/agents-server/src/app/admin/chat-history/page.tsx +2 -4
  22. package/apps/agents-server/src/app/admin/cli-access/CliAccessClient.tsx +1 -3
  23. package/apps/agents-server/src/app/admin/code-runners/CodeRunnersClient.tsx +19 -11
  24. package/apps/agents-server/src/app/admin/custom-css/CustomCssClient.tsx +4 -0
  25. package/apps/agents-server/src/app/admin/custom-css/CustomCssEditorPanel.tsx +7 -1
  26. package/apps/agents-server/src/app/admin/custom-css/CustomCssFilesPanel.tsx +7 -1
  27. package/apps/agents-server/src/app/admin/custom-js/CustomJsClient.tsx +11 -0
  28. package/apps/agents-server/src/app/admin/custom-js/CustomJsEditorPanel.tsx +7 -1
  29. package/apps/agents-server/src/app/admin/custom-js/CustomJsFilesPanel.tsx +7 -1
  30. package/apps/agents-server/src/app/admin/files/FilesGalleryClient.tsx +4 -0
  31. package/apps/agents-server/src/app/admin/files/FilesGalleryGrid.tsx +9 -11
  32. package/apps/agents-server/src/app/admin/files/FilesGalleryTable.tsx +9 -8
  33. package/apps/agents-server/src/app/admin/image-generator-test/ImageAttachmentsEditor.tsx +30 -9
  34. package/apps/agents-server/src/app/admin/images/ImagesGalleryClient.tsx +4 -0
  35. package/apps/agents-server/src/app/admin/images/ImagesGalleryGrid.tsx +16 -11
  36. package/apps/agents-server/src/app/admin/images/ImagesGalleryTable.tsx +18 -9
  37. package/apps/agents-server/src/app/admin/limits/LimitsClient.tsx +11 -12
  38. package/apps/agents-server/src/app/admin/login-methods/shibboleth/page.tsx +355 -0
  39. package/apps/agents-server/src/app/admin/logs/LogsClient.tsx +9 -3
  40. package/apps/agents-server/src/app/admin/messages/MessagesClient.tsx +7 -6
  41. package/apps/agents-server/src/app/admin/metadata/MetadataClient.tsx +671 -45
  42. package/apps/agents-server/src/app/admin/servers/CreateServerDialog.tsx +22 -1
  43. package/apps/agents-server/src/app/admin/servers/ServersRegistryTable.tsx +14 -13
  44. package/apps/agents-server/src/app/admin/servers/useCreateServerWizard.ts +57 -20
  45. package/apps/agents-server/src/app/admin/task-manager/TaskManagerClient.tsx +4 -2
  46. package/apps/agents-server/src/app/admin/task-manager/TaskManagerTaskRow.tsx +14 -15
  47. package/apps/agents-server/src/app/admin/task-manager/TaskManagerTasksCard.tsx +4 -1
  48. package/apps/agents-server/src/app/admin/task-manager/useTaskManagerState.ts +6 -9
  49. package/apps/agents-server/src/app/admin/update/CustomCommitPicker.tsx +258 -0
  50. package/apps/agents-server/src/app/admin/update/UpdateClient.tsx +627 -137
  51. package/apps/agents-server/src/app/admin/usage/UsageClient.tsx +4 -2
  52. package/apps/agents-server/src/app/admin/usage/UsageClientAnalyticsPanels.tsx +6 -4
  53. package/apps/agents-server/src/app/admin/usage/UsageClientFormatting.ts +6 -12
  54. package/apps/agents-server/src/app/admin/usage/UsageClientTimelineChart.tsx +7 -4
  55. package/apps/agents-server/src/app/admin/usage/useUsageClientState.ts +12 -4
  56. package/apps/agents-server/src/app/admin/users/[userId]/UserDetailClient.tsx +27 -15
  57. package/apps/agents-server/src/app/agents/[agentName]/ActiveAgentBreadcrumbBinder.tsx +30 -0
  58. package/apps/agents-server/src/app/agents/[agentName]/AgentChatWrapper.tsx +13 -2
  59. package/apps/agents-server/src/app/agents/[agentName]/AgentProfileChat.tsx +20 -25
  60. package/apps/agents-server/src/app/agents/[agentName]/_utils.ts +7 -5
  61. package/apps/agents-server/src/app/agents/[agentName]/api/book/route.ts +2 -0
  62. package/apps/agents-server/src/app/agents/[agentName]/api/user-chats/[chatId]/messages/route.ts +4 -11
  63. package/apps/agents-server/src/app/agents/[agentName]/api/user-chats/[chatId]/stream/route.ts +85 -56
  64. package/apps/agents-server/src/app/agents/[agentName]/book/BookEditorWrapper.tsx +7 -1
  65. package/apps/agents-server/src/app/agents/[agentName]/book/useBookEditorHistory.ts +9 -2
  66. package/apps/agents-server/src/app/agents/[agentName]/chat/AgentChatHistoryPayloadState.ts +38 -4
  67. package/apps/agents-server/src/app/agents/[agentName]/chat/AgentChatHistorySyncOperations.ts +4 -1
  68. package/apps/agents-server/src/app/agents/[agentName]/chat/AgentChatPageLayout.tsx +2 -2
  69. package/apps/agents-server/src/app/agents/[agentName]/chat/AgentChatSidebarDefault.tsx +19 -13
  70. package/apps/agents-server/src/app/agents/[agentName]/chat/CanonicalAgentChatSurface.tsx +30 -16
  71. package/apps/agents-server/src/app/agents/[agentName]/chat/useAgentChatHistoryClientState.ts +2 -15
  72. package/apps/agents-server/src/app/agents/[agentName]/chat/useAgentChatHistorySyncEffects.ts +7 -13
  73. package/apps/agents-server/src/app/agents/[agentName]/chat/useCanonicalAgentChatPanelState.ts +58 -7
  74. package/apps/agents-server/src/app/agents/[agentName]/history/page.tsx +6 -1
  75. package/apps/agents-server/src/app/agents/[agentName]/images/default-avatar.png/route.ts +6 -2
  76. package/apps/agents-server/src/app/agents/[agentName]/integration/CalendarIntegrationSection.tsx +23 -5
  77. package/apps/agents-server/src/app/agents/[agentName]/layout.tsx +47 -1
  78. package/apps/agents-server/src/app/agents/[agentName]/timeouts/AgentTimeoutsClient.tsx +4 -2
  79. package/apps/agents-server/src/app/agents/[agentName]/timeouts/AgentTimeoutsFiltersCard.tsx +9 -4
  80. package/apps/agents-server/src/app/agents/[agentName]/timeouts/AgentTimeoutsTableCard.tsx +4 -1
  81. package/apps/agents-server/src/app/agents/[agentName]/timeouts/AgentTimeoutsTableRow.tsx +10 -3
  82. package/apps/agents-server/src/app/api/admin/cli-access/route.ts +27 -123
  83. package/apps/agents-server/src/app/api/admin/code-runners/authentication/route.ts +33 -125
  84. package/apps/agents-server/src/app/api/admin/code-runners/route.ts +1 -1
  85. package/apps/agents-server/src/app/api/admin/servers/route.ts +5 -0
  86. package/apps/agents-server/src/app/api/admin/update/commits/route.ts +35 -0
  87. package/apps/agents-server/src/app/api/admin/update/log/route.ts +42 -0
  88. package/apps/agents-server/src/app/api/admin/update/route.ts +10 -2
  89. package/apps/agents-server/src/app/api/agent-folders/[folderId]/visibility/route.ts +19 -7
  90. package/apps/agents-server/src/app/api/agents/[agentName]/route.ts +39 -25
  91. package/apps/agents-server/src/app/api/agents/export/route.ts +67 -0
  92. package/apps/agents-server/src/app/api/agents/import/route.ts +168 -0
  93. package/apps/agents-server/src/app/api/auth/change-password/route.ts +53 -6
  94. package/apps/agents-server/src/app/api/auth/login/route.ts +17 -16
  95. package/apps/agents-server/src/app/api/auth/logout/route.ts +2 -10
  96. package/apps/agents-server/src/app/api/auth/shibboleth/acs/route.ts +112 -0
  97. package/apps/agents-server/src/app/api/auth/shibboleth/login/route.ts +70 -0
  98. package/apps/agents-server/src/app/api/auth/shibboleth/metadata/route.ts +15 -0
  99. package/apps/agents-server/src/app/api/auth/shibboleth/status/route.ts +17 -0
  100. package/apps/agents-server/src/app/api/chat/citation-label/route.ts +133 -0
  101. package/apps/agents-server/src/app/api/chat/export/pdf/route.ts +167 -2
  102. package/apps/agents-server/src/app/api/chat/route.ts +29 -7
  103. package/apps/agents-server/src/app/api/chat-feedback/export/route.ts +2 -2
  104. package/apps/agents-server/src/app/api/chat-feedback/route.ts +3 -3
  105. package/apps/agents-server/src/app/api/chat-history/[id]/route.ts +2 -2
  106. package/apps/agents-server/src/app/api/chat-history/export/route.ts +2 -2
  107. package/apps/agents-server/src/app/api/chat-history/route.ts +3 -3
  108. package/apps/agents-server/src/app/api/chat-streaming/route.ts +29 -0
  109. package/apps/agents-server/src/app/api/elevenlabs/tts/route.ts +60 -2
  110. package/apps/agents-server/src/app/api/emails/incoming/sendgrid/route.ts +24 -2
  111. package/apps/agents-server/src/app/api/federated-agents/route.ts +1 -1
  112. package/apps/agents-server/src/app/api/health/route.ts +18 -0
  113. package/apps/agents-server/src/app/api/images/[filename]/route.ts +108 -2
  114. package/apps/agents-server/src/app/api/internal/agent-runner-limits/route.ts +52 -0
  115. package/apps/agents-server/src/app/api/internal/user-chat-jobs/run/route.ts +17 -4
  116. package/apps/agents-server/src/app/api/metadata/export/route.ts +34 -0
  117. package/apps/agents-server/src/app/api/metadata/import/route.ts +47 -0
  118. package/apps/agents-server/src/app/api/metadata/route.ts +4 -0
  119. package/apps/agents-server/src/app/api/openai/v1/audio/transcriptions/route.ts +111 -2
  120. package/apps/agents-server/src/app/api/page-preview/check/route.ts +49 -0
  121. package/apps/agents-server/src/app/api/page-preview/screenshot/route.ts +64 -0
  122. package/apps/agents-server/src/app/api/scrape/route.ts +18 -0
  123. package/apps/agents-server/src/app/api/team-agent-profile/route.ts +20 -0
  124. package/apps/agents-server/src/app/api/upload/route.ts +204 -220
  125. package/apps/agents-server/src/app/api/users/[username]/route.ts +3 -2
  126. package/apps/agents-server/src/app/api/users/route.ts +8 -7
  127. package/apps/agents-server/src/app/api/v1/agents/[agentId]/route.ts +17 -8
  128. package/apps/agents-server/src/app/api/v1/agents/route.ts +2 -0
  129. package/apps/agents-server/src/app/dashboard/page.tsx +12 -17
  130. package/apps/agents-server/src/app/docs/[docId]/page.tsx +1 -1
  131. package/apps/agents-server/src/app/docs/page.tsx +1 -1
  132. package/apps/agents-server/src/app/globals.css +179 -0
  133. package/apps/agents-server/src/app/layout.tsx +33 -4
  134. package/apps/agents-server/src/app/recycle-bin/actions.ts +3 -0
  135. package/apps/agents-server/src/app/recycle-bin/page.tsx +1 -1
  136. package/apps/agents-server/src/app/s3/[first]/[second]/[hash]/[filename]/route.ts +52 -0
  137. package/apps/agents-server/src/app/swagger/SwaggerApiKeysPanel.tsx +4 -1
  138. package/apps/agents-server/src/app/system/settings/KeybindingsSettingsClient.tsx +13 -7
  139. package/apps/agents-server/src/app/system/user-memory/UserMemoryClient.tsx +4 -2
  140. package/apps/agents-server/src/app/system/user-wallet/UserWalletClient.tsx +3 -0
  141. package/apps/agents-server/src/app/system/user-wallet/UserWalletRecordsTable.tsx +5 -1
  142. package/apps/agents-server/src/app/system/utilities/mocked-chats/MockedChatsEditorClient.tsx +3 -0
  143. package/apps/agents-server/src/app/system/utilities/mocked-chats/MockedChatsEditorSidebar.tsx +7 -8
  144. package/apps/agents-server/src/components/AdminTerminal/AdminTerminalCard.tsx +13 -70
  145. package/apps/agents-server/src/components/AdminTerminal/AdminXtermTerminal.tsx +330 -0
  146. package/apps/agents-server/src/components/AdminTerminal/useAdminTerminalSession.ts +45 -5
  147. package/apps/agents-server/src/components/AgentContextMenu/useAgentContextMenuItems.ts +27 -19
  148. package/apps/agents-server/src/components/AgentProfile/AgentCapabilityChips.tsx +39 -5
  149. package/apps/agents-server/src/components/AgentProfile/AgentProfile.tsx +4 -7
  150. package/apps/agents-server/src/components/AgentProfile/AgentProfileImage.tsx +8 -2
  151. package/apps/agents-server/src/components/ApplicationErrorPage/ApplicationErrorPage.tsx +118 -12
  152. package/apps/agents-server/src/components/DocsToolbar/DocsToolbar.tsx +4 -4
  153. package/apps/agents-server/src/components/DocumentationContent/DocumentationContent.tsx +9 -9
  154. package/apps/agents-server/src/components/FileUploadAvailability/FileUploadAvailabilityContext.tsx +50 -0
  155. package/apps/agents-server/src/components/FileUploadAvailability/FileUploadUnavailableNotice.tsx +45 -0
  156. package/apps/agents-server/src/components/Footer/Footer.tsx +10 -9
  157. package/apps/agents-server/src/components/Footer/getCommitFooterEmoji.ts +112 -0
  158. package/apps/agents-server/src/components/Header/ActiveAgentBreadcrumbContext.tsx +82 -0
  159. package/apps/agents-server/src/components/Header/Header.tsx +24 -15
  160. package/apps/agents-server/src/components/Header/HeaderTypes.ts +6 -0
  161. package/apps/agents-server/src/components/Header/buildHeaderSystemMenuItems.ts +51 -1
  162. package/apps/agents-server/src/components/Header/useHeaderActiveAgent.ts +26 -7
  163. package/apps/agents-server/src/components/Header/useHeaderAgentMenus.tsx +0 -5
  164. package/apps/agents-server/src/components/Homepage/AgentCard.tsx +7 -1
  165. package/apps/agents-server/src/components/Homepage/AgentsList.tsx +22 -1
  166. package/apps/agents-server/src/components/Homepage/AgentsListHeader.tsx +85 -1
  167. package/apps/agents-server/src/components/Homepage/AgentsListListView.tsx +6 -0
  168. package/apps/agents-server/src/components/Homepage/AgentsListViewContent.tsx +6 -0
  169. package/apps/agents-server/src/components/Homepage/Card.tsx +1 -1
  170. package/apps/agents-server/src/components/Homepage/Section.tsx +3 -1
  171. package/apps/agents-server/src/components/Homepage/SortableFolderCard.tsx +7 -1
  172. package/apps/agents-server/src/components/Homepage/hiddenFolders.ts +104 -0
  173. package/apps/agents-server/src/components/Homepage/useAgentsListImportExportState.ts +525 -0
  174. package/apps/agents-server/src/components/Homepage/useAgentsListQueryState.ts +35 -0
  175. package/apps/agents-server/src/components/Homepage/useAgentsListState.ts +38 -4
  176. package/apps/agents-server/src/components/LayoutWrapper/LayoutWrapper.tsx +93 -70
  177. package/apps/agents-server/src/components/LoginForm/LoginForm.tsx +52 -12
  178. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/ManGoNewAgentWizard.tsx +151 -0
  179. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/ManGoOnboardingNavigation.tsx +50 -0
  180. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/BookLanguagePanel.tsx +125 -0
  181. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/DropZone.tsx +83 -0
  182. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/EmailTestRun.tsx +216 -0
  183. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/KnowledgeList.tsx +79 -0
  184. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/Logo.tsx +20 -0
  185. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/MarkdownBookEditor.tsx +154 -0
  186. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/MarkdownPreview.tsx +188 -0
  187. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/RailStepper.tsx +115 -0
  188. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/StepFrame.tsx +47 -0
  189. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/TestChat.tsx +159 -0
  190. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/WizardShell.tsx +114 -0
  191. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/brand/RailArtwork.tsx +60 -0
  192. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/steps/BookStep.tsx +135 -0
  193. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/steps/DoneStep.tsx +215 -0
  194. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/steps/KnowledgeStep.tsx +152 -0
  195. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/steps/TestStep.tsx +262 -0
  196. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/steps/ZadaniStep.tsx +64 -0
  197. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/ui/Badge.tsx +41 -0
  198. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/ui/Banner.tsx +69 -0
  199. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/ui/Button.tsx +77 -0
  200. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/ui/Card.tsx +33 -0
  201. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/ui/Field.tsx +103 -0
  202. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/ui/IconButton.tsx +40 -0
  203. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/ui/Spinner.tsx +14 -0
  204. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/ui/tokens.ts +37 -0
  205. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/config/bookSections.ts +62 -0
  206. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/config/emailScenarios.ts +22 -0
  207. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/config/steps.ts +46 -0
  208. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/index.ts +11 -0
  209. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/lib/cn.ts +4 -0
  210. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/lib/format.ts +9 -0
  211. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/lib/id.ts +11 -0
  212. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/services/agentEvalService.ts +30 -0
  213. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/services/agentTestService.ts +69 -0
  214. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/services/bookService.ts +21 -0
  215. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/services/createManGoAgentSource.ts +107 -0
  216. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/services/draftService.ts +45 -0
  217. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/services/uploadService.ts +27 -0
  218. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/state/OnboardingProvider.tsx +121 -0
  219. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/types.ts +52 -0
  220. package/apps/agents-server/src/components/NewAgentDialog/NewAgentDialog.tsx +7 -3
  221. package/apps/agents-server/src/components/NewAgentDialog/NewAgentWizardKnowledgeStep.tsx +6 -0
  222. package/apps/agents-server/src/components/NewAgentDialog/createNewAgentWizardSource.ts +1 -1
  223. package/apps/agents-server/src/components/NewAgentDialog/trackNewAgentCreationEvent.ts +1 -1
  224. package/apps/agents-server/src/components/NewAgentDialog/useNewAgentDialog.tsx +113 -14
  225. package/apps/agents-server/src/components/NewAgentDialog/useNewAgentWizardKnowledgeState.ts +8 -1
  226. package/apps/agents-server/src/components/PrintHeader/PrintHeader.tsx +4 -2
  227. package/apps/agents-server/src/components/Skeleton/ConsolePageLoadingSkeleton.tsx +1 -1
  228. package/apps/agents-server/src/components/Skeleton/DocumentationRouteLoadingSkeleton.tsx +1 -1
  229. package/apps/agents-server/src/components/Skeleton/HomepageLoadingSkeleton.tsx +1 -1
  230. package/apps/agents-server/src/components/UsersList/UsersList.tsx +24 -6
  231. package/apps/agents-server/src/components/UsersList/useUsersAdmin.ts +2 -7
  232. package/apps/agents-server/src/constants/defaultAgentAvatarVisual.ts +1 -1
  233. package/apps/agents-server/src/constants/newAgentWizard.ts +17 -8
  234. package/apps/agents-server/src/constants/serverLimits.ts +41 -2
  235. package/apps/agents-server/src/constants/shibbolethAuth.ts +139 -0
  236. package/apps/agents-server/src/database/$provideClientSql.ts +37 -0
  237. package/apps/agents-server/src/database/$provideSupabaseForServer.ts +41 -0
  238. package/apps/agents-server/src/database/customJavascript.ts +62 -1
  239. package/apps/agents-server/src/database/customStylesheet.ts +60 -1
  240. package/apps/agents-server/src/database/getMetadata.ts +121 -4
  241. package/apps/agents-server/src/database/loadAgentsServerEnvFile.ts +29 -0
  242. package/apps/agents-server/src/database/metadataDefaults.ts +85 -31
  243. package/apps/agents-server/src/database/migrate.ts +8 -2
  244. package/apps/agents-server/src/database/migrations/2026-06-0100-shibboleth-auth.sql +136 -0
  245. package/apps/agents-server/src/database/migrations/2026-06-0200-default-agent-avatar-visual-octopus3d3.sql +16 -0
  246. package/apps/agents-server/src/database/migrations/2026-06-1300-user-chat-active-read-indexes.sql +7 -0
  247. package/apps/agents-server/src/database/migrations/2026-06-2200-new-agent-wizard-metadata-key.sql +27 -0
  248. package/apps/agents-server/src/database/migrations/2026-06-2201-new-agent-wizard-mango-default.sql +11 -0
  249. package/apps/agents-server/src/database/migrations/2026-06-2600-agent-directory-performance-indexes.sql +14 -0
  250. package/apps/agents-server/src/database/migrations/2026-06-2700-default-agent-avatar-visual-octopus3d4.sql +16 -0
  251. package/apps/agents-server/src/database/seedCoreAgents.ts +234 -0
  252. package/apps/agents-server/src/database/seedDefaultAgents.ts +223 -0
  253. package/apps/agents-server/src/database/sqlite/$provideLocalSqliteSupabase.ts +234 -41
  254. package/apps/agents-server/src/generated/reservedPaths.ts +3 -0
  255. package/apps/agents-server/src/instrumentation-client.ts +28 -0
  256. package/apps/agents-server/src/instrumentation.ts +19 -0
  257. package/apps/agents-server/src/languages/ServerTranslationKeys.ts +4 -0
  258. package/apps/agents-server/src/languages/translations/czech.yaml +5 -1
  259. package/apps/agents-server/src/languages/translations/english.yaml +5 -1
  260. package/apps/agents-server/src/message-providers/email/sendgrid/verifySendgridInboundParseWebhook.ts +345 -0
  261. package/apps/agents-server/src/middleware/applyEmbeddingHeader.ts +4 -2
  262. package/apps/agents-server/src/middleware/contentSecurityPolicy.ts +97 -0
  263. package/apps/agents-server/src/middleware/resolveAccessControlResponse.ts +3 -2
  264. package/apps/agents-server/src/middleware/resolveMiddlewareResponse.ts +8 -3
  265. package/apps/agents-server/src/middleware.ts +15 -32
  266. package/apps/agents-server/src/search/createDefaultServerSearchProviders/createFederatedAgentsSearchProvider.ts +1 -1
  267. package/apps/agents-server/src/sentry.edge.config.ts +18 -0
  268. package/apps/agents-server/src/sentry.server.config.ts +19 -0
  269. package/apps/agents-server/src/tools/$provideAgentCollectionForServer.ts +2 -9
  270. package/apps/agents-server/src/tools/$provideCdnForServer.ts +187 -15
  271. package/apps/agents-server/src/tools/BrowserConnectionProvider.ts +2 -19
  272. package/apps/agents-server/src/tools/agent_progress.ts +4 -10
  273. package/apps/agents-server/src/tools/createAgentProgressTools.ts +8 -4
  274. package/apps/agents-server/src/tools/createChatAttachmentToolFunctions.ts +8 -4
  275. package/apps/agents-server/src/tools/createServerChromiumLaunchOptions.ts +44 -0
  276. package/apps/agents-server/src/utils/agentOwnership.ts +54 -5
  277. package/apps/agents-server/src/utils/agentRouting/resolveAgentRouteTarget.ts +101 -19
  278. package/apps/agents-server/src/utils/agentVisibility.ts +25 -62
  279. package/apps/agents-server/src/utils/agentsTransfer/createAgentsExportZipStream.ts +81 -0
  280. package/apps/agents-server/src/utils/agentsTransfer/importAgentsFromFiles.ts +852 -0
  281. package/apps/agents-server/src/utils/assertSafeUrl.ts +136 -0
  282. package/apps/agents-server/src/utils/authenticateUser.ts +112 -4
  283. package/apps/agents-server/src/utils/authenticationAttemptRateLimit.ts +504 -0
  284. package/apps/agents-server/src/utils/backup/createBooksBackupZipStream.ts +91 -7
  285. package/apps/agents-server/src/utils/cdn/classes/DigitalOceanSpaces.ts +48 -4
  286. package/apps/agents-server/src/utils/cdn/classes/TrackedFilesStorage.ts +6 -5
  287. package/apps/agents-server/src/utils/cdn/interfaces/IFilesStorage.ts +5 -0
  288. package/apps/agents-server/src/utils/cdn/utils/getUserFileCdnKey.ts +10 -3
  289. package/apps/agents-server/src/utils/chat/resolveAgentsServerCitationLabel.ts +130 -0
  290. package/apps/agents-server/src/utils/chat/resolveCitationSourceLabel.ts +436 -0
  291. package/apps/agents-server/src/utils/chatExport/renderHtmlToPdfOnServer.ts +66 -17
  292. package/apps/agents-server/src/utils/chatExport/sanitizeChatPdfExportHtml.ts +193 -0
  293. package/apps/agents-server/src/utils/codeRunnerConfiguration.ts +1 -1
  294. package/apps/agents-server/src/utils/createAdminTerminalRouteHandlers.ts +264 -0
  295. package/apps/agents-server/src/utils/createAgentWithDefaultVisibility.ts +3 -1
  296. package/apps/agents-server/src/utils/currentUserIdentity.ts +22 -9
  297. package/apps/agents-server/src/utils/defaultAgents/loadDefaultAgentBooks.ts +145 -0
  298. package/apps/agents-server/src/utils/errorReporting/agentsServerSentryContext.ts +203 -0
  299. package/apps/agents-server/src/utils/errorReporting/applicationErrorHandling.ts +45 -0
  300. package/apps/agents-server/src/utils/errorReporting/refreshApplicationDocument.ts +10 -0
  301. package/apps/agents-server/src/utils/errorReporting/registerServerErrorSentryLogging.ts +381 -0
  302. package/apps/agents-server/src/utils/errorReporting/sendApplicationErrorReportToSentry.ts +43 -152
  303. package/apps/agents-server/src/utils/errorReporting/sentrySdkConfig.ts +237 -0
  304. package/apps/agents-server/src/utils/errorReporting/sentryStore.ts +187 -0
  305. package/apps/agents-server/src/utils/externalChatRunner/createExternalAgentRepositoryFiles.ts +2 -2
  306. package/apps/agents-server/src/utils/externalChatRunner/processExternalUserChatJob.ts +15 -8
  307. package/apps/agents-server/src/utils/findAgentForCallerWriteAccess.ts +36 -0
  308. package/apps/agents-server/src/utils/getCurrentUser.ts +2 -1
  309. package/apps/agents-server/src/utils/getFederatedServers.ts +3 -74
  310. package/apps/agents-server/src/utils/getUserById.ts +19 -5
  311. package/apps/agents-server/src/utils/getWellKnownAgentUrl.ts +10 -4
  312. package/apps/agents-server/src/utils/iframe/checkIfUrlCanBeEmbedded.ts +68 -0
  313. package/apps/agents-server/src/utils/interactiveTerminalSession.ts +9 -4
  314. package/apps/agents-server/src/utils/isAdminPasswordEqual.ts +28 -0
  315. package/apps/agents-server/src/utils/isUserGlobalAdmin.ts +3 -1
  316. package/apps/agents-server/src/utils/knowledge/createInlineKnowledgeSourceUploader.ts +24 -5
  317. package/apps/agents-server/src/utils/knowledge/resolveWebsiteKnowledgeSourcesForServer.ts +10 -1
  318. package/apps/agents-server/src/utils/localChatRunner/LocalUserChatJobMetadata.ts +15 -5
  319. package/apps/agents-server/src/utils/localChatRunner/processLocalUserChatJob.ts +24 -18
  320. package/apps/agents-server/src/utils/localization/formatServerLanguageHumanReadableDate.ts +70 -0
  321. package/apps/agents-server/src/utils/localization/getRequestServerLanguage.ts +32 -0
  322. package/apps/agents-server/src/utils/metadataConfigurationTransfer.ts +442 -0
  323. package/apps/agents-server/src/utils/paidApiRequestGuard.ts +241 -0
  324. package/apps/agents-server/src/utils/publicUser.ts +59 -0
  325. package/apps/agents-server/src/utils/serverLimits.ts +28 -1
  326. package/apps/agents-server/src/utils/serverManagement/createManagedServer/bootstrapManagedServer.ts +5 -6
  327. package/apps/agents-server/src/utils/serverManagement/createManagedServer/normalizeCreateServerInput.ts +6 -0
  328. package/apps/agents-server/src/utils/serverManagement/createManagedServer/seedServerCoreAgents.ts +162 -0
  329. package/apps/agents-server/src/utils/serverManagement/createManagedServer/seedServerDefaultAgents.ts +7 -87
  330. package/apps/agents-server/src/utils/serverManagement/createManagedServer.ts +5 -0
  331. package/apps/agents-server/src/utils/session.ts +72 -30
  332. package/apps/agents-server/src/utils/shareTargetPayloads.ts +37 -66
  333. package/apps/agents-server/src/utils/shibbolethAuthentication.ts +957 -0
  334. package/apps/agents-server/src/utils/transpilers/resolveTranspiledTeamExport.ts +10 -10
  335. package/apps/agents-server/src/utils/upload/createBookEditorUploadHandler.ts +19 -28
  336. package/apps/agents-server/src/utils/upload/fileUploadAvailability.ts +91 -0
  337. package/apps/agents-server/src/utils/upload/uploadFileToServer.ts +157 -0
  338. package/apps/agents-server/src/utils/userChat/createImmediateUserChatAnswerModelRequirements.ts +26 -12
  339. package/apps/agents-server/src/utils/userChat/createRunUserChatJobExecutionContext.ts +45 -0
  340. package/apps/agents-server/src/utils/userChat/createRunUserChatJobPersistenceController.ts +17 -11
  341. package/apps/agents-server/src/utils/userChat/createUserChatDetailPayload.ts +33 -18
  342. package/apps/agents-server/src/utils/userChat/createUserChatHarnessProgressCard.ts +93 -0
  343. package/apps/agents-server/src/utils/userChat/createUserChatRunnerProgressCard.ts +57 -0
  344. package/apps/agents-server/src/utils/userChat/hasPotentiallyPendingAssistantMessages.ts +26 -0
  345. package/apps/agents-server/src/utils/userChat/listUserChats.ts +117 -6
  346. package/apps/agents-server/src/utils/userChat/persistUserChatJobProgressCard.ts +40 -0
  347. package/apps/agents-server/src/utils/userChat/resolveUserChatProgressToolHighlights.ts +100 -0
  348. package/apps/agents-server/src/utils/userChat/resolveUserChatWorkerInternalToken.ts +63 -9
  349. package/apps/agents-server/src/utils/userChat/runImmediateUserChatAnswer.ts +1 -1
  350. package/apps/agents-server/src/utils/userChat/runUserChatJob.ts +30 -0
  351. package/apps/agents-server/src/utils/userChat/triggerUserChatJobWorker.ts +54 -19
  352. package/apps/agents-server/src/utils/userChat/userChatMessageLifecycle.ts +69 -1
  353. package/apps/agents-server/src/utils/userChat/userChatProgressCard.ts +360 -0
  354. package/apps/agents-server/src/utils/validateApiKey.ts +7 -3
  355. package/apps/agents-server/src/utils/vpsConfiguration.ts +8 -1
  356. package/apps/agents-server/src/utils/vpsSelfUpdate.ts +935 -64
  357. package/esm/apps/agents-server/src/constants/federatedAgentImport.d.ts +42 -0
  358. package/esm/apps/agents-server/src/constants/serverLimits.d.ts +224 -0
  359. package/esm/apps/agents-server/src/constants/toolUsageLimits.d.ts +55 -0
  360. package/esm/index.es.js +24308 -18655
  361. package/esm/index.es.js.map +1 -1
  362. package/esm/scripts/run-agent-chat/executeAgentChatTurn.d.ts +28 -0
  363. package/esm/scripts/run-agent-chat/runAgentChat.d.ts +5 -0
  364. package/esm/scripts/run-agent-chat/runAgentExec.d.ts +11 -0
  365. package/esm/scripts/run-agent-messages/main/AgentMessageFailureTracker.d.ts +27 -0
  366. package/esm/scripts/run-agent-messages/main/handleAgentWatchError.d.ts +4 -0
  367. package/esm/scripts/run-agent-messages/main/runAgentMessages.d.ts +1 -0
  368. package/esm/scripts/run-agent-messages/main/runMultipleAgentMessages.d.ts +1 -0
  369. package/esm/scripts/run-agent-messages/main/tickAgentMessages.d.ts +1 -0
  370. package/esm/scripts/run-agent-messages/messages/createAgentRunnerSystemMessage.d.ts +10 -0
  371. package/esm/scripts/run-agent-messages/messages/moveAgentMessageToFailed.d.ts +17 -0
  372. package/esm/scripts/run-codex-prompts/common/buildCoderRunProgressSnapshot.d.ts +5 -1
  373. package/esm/scripts/run-codex-prompts/common/cliProgressDisplay.d.ts +7 -0
  374. package/esm/scripts/run-codex-prompts/common/coderRunEstimateCache.d.ts +31 -0
  375. package/esm/scripts/run-codex-prompts/common/parseDuration.d.ts +19 -0
  376. package/esm/scripts/run-codex-prompts/common/progressFormatting.d.ts +2 -0
  377. package/esm/scripts/run-codex-prompts/common/resolveAgentSystemMessage.d.ts +6 -0
  378. package/esm/scripts/run-codex-prompts/common/resolveInlineOrFileText.d.ts +14 -0
  379. package/esm/scripts/run-codex-prompts/common/runGoScript/printLiveScriptChunk.d.ts +4 -0
  380. package/esm/scripts/run-codex-prompts/common/sleepWithCountdown.d.ts +27 -0
  381. package/esm/scripts/run-codex-prompts/common/waitForPause.d.ts +12 -0
  382. package/esm/scripts/run-codex-prompts/git/commitChanges.d.ts +3 -1
  383. package/esm/scripts/run-codex-prompts/main/findUnwrittenPrompts.d.ts +19 -0
  384. package/esm/scripts/run-codex-prompts/main/runCodexPromptsServer.d.ts +27 -0
  385. package/esm/scripts/run-codex-prompts/main/runPromptRound.d.ts +5 -3
  386. package/esm/scripts/run-codex-prompts/runners/claude-code/ClaudeCodeRunner.d.ts +3 -1
  387. package/esm/scripts/run-codex-prompts/server/buildCoderServerPromptResponse.d.ts +50 -0
  388. package/esm/scripts/run-codex-prompts/server/buildCoderServerRunState.d.ts +23 -0
  389. package/esm/scripts/run-codex-prompts/server/coderServerHtml.d.ts +9 -0
  390. package/esm/scripts/run-codex-prompts/server/runCoderHttpServer.d.ts +35 -0
  391. package/esm/scripts/run-codex-prompts/server/updatePromptSection.d.ts +9 -0
  392. package/esm/scripts/run-codex-prompts/ui/CoderRunUiState.d.ts +8 -0
  393. package/esm/scripts/run-codex-prompts/ui/buildCoderRunUiFrame.d.ts +1 -0
  394. package/esm/scripts/run-codex-prompts/ui/buildRunUiFrameShared.d.ts +5 -1
  395. package/esm/scripts/run-codex-prompts/ui/renderCoderRunUi.d.ts +1 -0
  396. package/esm/src/_packages/components.index.d.ts +4 -0
  397. package/esm/src/_packages/core.index.d.ts +22 -2
  398. package/esm/src/_packages/node.index.d.ts +40 -0
  399. package/esm/src/_packages/types.index.d.ts +20 -0
  400. package/esm/src/avatars/avatarAnimationScheduler.d.ts +4 -0
  401. package/esm/src/avatars/types/AvatarVisualDefinition.d.ts +1 -1
  402. package/esm/src/avatars/visuals/octopus3d3AvatarVisual.d.ts +7 -0
  403. package/esm/src/avatars/visuals/octopus3d4AvatarVisual.d.ts +7 -0
  404. package/esm/src/book-2.0/agent-source/AgentBasicInformation.d.ts +2 -0
  405. package/esm/src/book-2.0/agent-source/agentSourceVisibility.d.ts +97 -0
  406. package/esm/src/book-2.0/agent-source/agentSourceVisibility.test.d.ts +1 -0
  407. package/esm/src/book-3.0/BookNodeAgentSource.d.ts +38 -0
  408. package/esm/src/book-3.0/CliAgent.d.ts +66 -0
  409. package/esm/src/book-3.0/CliAgent.test.d.ts +1 -0
  410. package/esm/src/book-3.0/LiteAgent.d.ts +68 -0
  411. package/esm/src/book-3.0/LiteAgent.test.d.ts +1 -0
  412. package/esm/src/book-3.0/agentFolderPaths.d.ts +30 -0
  413. package/esm/src/book-3.0/cliAgentEnv.d.ts +33 -0
  414. package/esm/src/book-components/BookEditor/BookEditor.d.ts +6 -5
  415. package/esm/src/book-components/BookEditor/BookEditorAboutPromptbookInformation.d.ts +12 -0
  416. package/esm/src/book-components/BookEditor/BookEditorBrowserConfig.d.ts +2 -0
  417. package/esm/src/book-components/BookEditor/BookEditorForClient.d.ts +7 -0
  418. package/esm/src/book-components/BookEditor/BookEditorMonacoTokenization.d.ts +2 -0
  419. package/esm/src/book-components/BookEditor/BookEditorTheme.d.ts +24 -0
  420. package/esm/src/book-components/BookEditor/createDeprecatedCommitmentDiagnostics.browser.d.ts +9 -0
  421. package/esm/src/book-components/BookEditor/useBookEditorMonacoLanguage.d.ts +1 -6
  422. package/esm/src/book-components/BookEditor/useBookEditorMonacoLifecycle.d.ts +1 -4
  423. package/esm/src/book-components/BookEditor/useBookEditorMonacoStyles.d.ts +2 -1
  424. package/esm/src/book-components/Chat/Chat/ChatCitationModal.d.ts +2 -0
  425. package/esm/src/book-components/Chat/Chat/ChatMessageItem.d.ts +4 -0
  426. package/esm/src/book-components/Chat/Chat/ChatMessageList.d.ts +4 -0
  427. package/esm/src/book-components/Chat/Chat/ChatProps.d.ts +5 -0
  428. package/esm/src/book-components/Chat/Chat/ChatToolCallModal.d.ts +2 -0
  429. package/esm/src/book-components/Chat/Chat/ChatToolCallModalContent.d.ts +3 -1
  430. package/esm/src/book-components/Chat/Chat/CitationIframePreview.d.ts +20 -0
  431. package/esm/src/book-components/Chat/Chat/TeamToolCallModalContent.d.ts +2 -0
  432. package/esm/src/book-components/Chat/MarkdownContent/MarkdownContent.d.ts +1 -0
  433. package/esm/src/book-components/Chat/SourceChip/SourceChip.d.ts +6 -1
  434. package/esm/src/book-components/Chat/hooks/useResolvedCitationLabel.d.ts +12 -0
  435. package/esm/src/book-components/Chat/types/ChatMessage.d.ts +4 -0
  436. package/esm/src/book-components/Chat/types/ChatParticipant.d.ts +1 -1
  437. package/esm/src/book-components/Chat/types/CitationLabelResolver.d.ts +8 -0
  438. package/esm/src/book-components/Chat/utils/citationHelpers.d.ts +9 -0
  439. package/esm/src/book-components/Chat/utils/decodeJsonUnicodeEscapesInMarkdownText.d.ts +14 -0
  440. package/esm/src/book-components/Chat/utils/decodeJsonUnicodeEscapesInMarkdownText.test.d.ts +1 -0
  441. package/esm/src/book-components/Chat/utils/isVisibleChatToolCall.d.ts +10 -0
  442. package/esm/src/book-components/Chat/utils/parseCitationsFromContent.d.ts +4 -0
  443. package/esm/src/book-components/_common/Dropdown/Dropdown.d.ts +1 -1
  444. package/esm/src/book-components/_common/MenuHoisting/MenuHoistingContext.d.ts +1 -1
  445. package/esm/src/book-components/_common/Modal/Modal.d.ts +1 -1
  446. package/esm/src/book-components/icons/AboutIcon.d.ts +1 -1
  447. package/esm/src/book-components/icons/DownloadIcon.d.ts +1 -1
  448. package/esm/src/book-components/icons/ExitFullscreenIcon.d.ts +1 -1
  449. package/esm/src/book-components/icons/FullscreenIcon.d.ts +1 -1
  450. package/esm/src/cli/cli-commands/agent/agentCliOptions.d.ts +38 -0
  451. package/esm/src/cli/cli-commands/agent/chat.d.ts +10 -0
  452. package/esm/src/cli/cli-commands/agent/exec.d.ts +10 -0
  453. package/esm/src/cli/cli-commands/agent/run.test.d.ts +1 -0
  454. package/esm/src/cli/cli-commands/agent-folder/agentProjectPaths.d.ts +2 -24
  455. package/esm/src/cli/cli-commands/agent.d.ts +14 -0
  456. package/esm/src/cli/cli-commands/agents-server/buildAgentsServer.d.ts +23 -1
  457. package/esm/src/cli/cli-commands/agents-server/run.d.ts +6 -0
  458. package/esm/src/cli/cli-commands/agents-server/startAgentsServer.d.ts +9 -2
  459. package/esm/src/cli/cli-commands/coder/ThinkingLevel.d.ts +1 -1
  460. package/esm/src/cli/cli-commands/coder/ensureCoderDeveloperAgentFile.d.ts +25 -0
  461. package/esm/src/cli/cli-commands/coder/find-unwritten.d.ts +10 -0
  462. package/esm/src/cli/cli-commands/coder/initializeCoderProjectConfiguration.d.ts +2 -0
  463. package/esm/src/cli/cli-commands/coder/server.d.ts +13 -0
  464. package/esm/src/cli/cli-commands/coder/waitOptions.d.ts +14 -0
  465. package/esm/src/cli/cli-commands/common/promptRunnerCliOptions.d.ts +9 -25
  466. package/esm/src/collection/agent-collection/CreateAgentInput.d.ts +2 -1
  467. package/esm/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentCollectionInSupabase.d.ts +22 -0
  468. package/esm/src/collection/agent-collection/constructors/agent-collection-in-supabase/prepareAgentSourceForPersistence.d.ts +21 -1
  469. package/esm/src/commitments/META_VISIBILITY/META_VISIBILITY.d.ts +27 -0
  470. package/esm/src/commitments/_common/teamInternalAgentAccess.d.ts +9 -1
  471. package/esm/src/commitments/index.d.ts +2 -1
  472. package/esm/src/llm-providers/_common/register/$provideLlmToolsConfigurationFromEnv.d.ts +1 -1
  473. package/esm/src/llm-providers/_common/register/$provideLlmToolsFromEnv.d.ts +1 -1
  474. package/esm/src/scrapers/website/utils/createShowdownConverter.d.ts +2 -2
  475. package/esm/src/utils/isTimingSafeEqualString.d.ts +25 -0
  476. package/esm/src/utils/validators/url/isValidAgentUrl.d.ts +5 -0
  477. package/esm/src/version.d.ts +1 -1
  478. package/package.json +6 -1
  479. package/servers.ts +1 -16
  480. package/src/_packages/components.index.ts +4 -0
  481. package/src/_packages/core.index.ts +22 -2
  482. package/src/_packages/node.index.ts +40 -0
  483. package/src/_packages/types.index.ts +20 -0
  484. package/src/avatars/avatarAnimationScheduler.ts +76 -4
  485. package/src/avatars/types/AvatarVisualDefinition.ts +2 -0
  486. package/src/avatars/visuals/avatarVisualRegistry.ts +4 -0
  487. package/src/avatars/visuals/fractalAvatarVisual.ts +5 -4
  488. package/src/avatars/visuals/minecraft2AvatarVisual.ts +16 -11
  489. package/src/avatars/visuals/minecraftAvatarVisual.ts +21 -7
  490. package/src/avatars/visuals/octopus3d2AvatarVisual.ts +175 -38
  491. package/src/avatars/visuals/octopus3d3AvatarVisual.ts +1068 -0
  492. package/src/avatars/visuals/octopus3d4AvatarVisual.ts +1295 -0
  493. package/src/avatars/visuals/octopus3dAvatarVisual.ts +69 -17
  494. package/src/book-2.0/agent-source/AgentBasicInformation.ts +2 -0
  495. package/src/book-2.0/agent-source/agentSourceVisibility.ts +214 -0
  496. package/src/book-2.0/agent-source/createAgentModelRequirementsWithCommitments/augmentAgentModelRequirementsFromSource.ts +18 -2
  497. package/src/book-2.0/agent-source/parseAgentSource/applyMetaCommitment.ts +17 -0
  498. package/src/book-2.0/book-language-documentation/createStandaloneBookLanguageMarkdown.ts +1 -0
  499. package/src/book-2.0/book-language-documentation/renderGroupedCommitmentDocumentationMarkdown.ts +7 -1
  500. package/src/book-3.0/Book.ts +3 -1
  501. package/src/book-3.0/BookNodeAgentSource.ts +135 -0
  502. package/src/book-3.0/CliAgent.ts +252 -0
  503. package/src/book-3.0/LiteAgent.ts +468 -0
  504. package/src/book-3.0/agentFolderPaths.ts +38 -0
  505. package/src/book-3.0/cliAgentEnv.ts +46 -0
  506. package/src/book-components/BookEditor/BookEditor.module.css +61 -0
  507. package/src/book-components/BookEditor/BookEditor.tsx +16 -13
  508. package/src/book-components/BookEditor/BookEditorAboutPromptbookInformation.tsx +72 -0
  509. package/src/book-components/BookEditor/BookEditorActionbar.tsx +35 -5
  510. package/src/book-components/BookEditor/BookEditorBrowserConfig.ts +11 -0
  511. package/src/book-components/BookEditor/BookEditorForClient.tsx +33 -0
  512. package/src/book-components/BookEditor/BookEditorMonaco.tsx +4 -2
  513. package/src/book-components/BookEditor/BookEditorMonacoTokenization.ts +89 -27
  514. package/src/book-components/BookEditor/BookEditorTheme.ts +32 -0
  515. package/src/book-components/BookEditor/createDeprecatedCommitmentDiagnostics.browser.ts +11 -0
  516. package/src/book-components/BookEditor/useBookEditorMonacoLanguage.ts +62 -92
  517. package/src/book-components/BookEditor/useBookEditorMonacoLifecycle.ts +1 -5
  518. package/src/book-components/BookEditor/useBookEditorMonacoStyles.ts +3 -2
  519. package/src/book-components/BookEditor/useBookEditorMonacoUploads.ts +1 -1
  520. package/src/book-components/Chat/Chat/Chat.module.css +50 -0
  521. package/src/book-components/Chat/Chat/Chat.tsx +4 -0
  522. package/src/book-components/Chat/Chat/ChatCitationModal.tsx +19 -5
  523. package/src/book-components/Chat/Chat/ChatMessageItem.tsx +22 -2
  524. package/src/book-components/Chat/Chat/ChatMessageList.tsx +6 -0
  525. package/src/book-components/Chat/Chat/ChatProps.tsx +6 -0
  526. package/src/book-components/Chat/Chat/ChatToolCallModal.tsx +4 -0
  527. package/src/book-components/Chat/Chat/ChatToolCallModalContent.tsx +4 -0
  528. package/src/book-components/Chat/Chat/CitationIframePreview.tsx +78 -0
  529. package/src/book-components/Chat/Chat/TeamToolCallModalContent.tsx +16 -3
  530. package/src/book-components/Chat/Chat/createChatMessageToolCallRenderModel.ts +2 -9
  531. package/src/book-components/Chat/Chat/useChatPostprocessedMessages.ts +13 -2
  532. package/src/book-components/Chat/MarkdownContent/MarkdownContent.tsx +63 -4
  533. package/src/book-components/Chat/SourceChip/SourceChip.module.css +8 -0
  534. package/src/book-components/Chat/SourceChip/SourceChip.tsx +19 -5
  535. package/src/book-components/Chat/hooks/useResolvedCitationLabel.ts +65 -0
  536. package/src/book-components/Chat/save/html/htmlSaveFormatDefinition.ts +315 -88
  537. package/src/book-components/Chat/save/react/reactSaveFormatDefinition.ts +7 -1
  538. package/src/book-components/Chat/types/ChatMessage.ts +5 -0
  539. package/src/book-components/Chat/types/ChatParticipant.ts +1 -1
  540. package/src/book-components/Chat/types/CitationLabelResolver.ts +9 -0
  541. package/src/book-components/Chat/utils/citationHelpers.ts +90 -2
  542. package/src/book-components/Chat/utils/createCitationFootnoteRenderModel.ts +3 -0
  543. package/src/book-components/Chat/utils/decodeJsonUnicodeEscapesInMarkdownText.ts +178 -0
  544. package/src/book-components/Chat/utils/isVisibleChatToolCall.ts +23 -0
  545. package/src/book-components/Chat/utils/parseCitationsFromContent.ts +6 -0
  546. package/src/book-components/Chat/utils/renderMarkdown.ts +3 -2
  547. package/src/book-components/_common/Dropdown/Dropdown.tsx +1 -1
  548. package/src/book-components/_common/MenuHoisting/MenuHoistingContext.tsx +1 -1
  549. package/src/book-components/_common/Modal/Modal.tsx +1 -1
  550. package/src/book-components/icons/AboutIcon.tsx +1 -1
  551. package/src/book-components/icons/DownloadIcon.tsx +1 -1
  552. package/src/book-components/icons/ExitFullscreenIcon.tsx +1 -1
  553. package/src/book-components/icons/FullscreenIcon.tsx +1 -1
  554. package/src/cli/cli-commands/agent/agentCliOptions.ts +92 -0
  555. package/src/cli/cli-commands/agent/chat.ts +54 -0
  556. package/src/cli/cli-commands/agent/exec.ts +60 -0
  557. package/src/cli/cli-commands/agent-folder/agentProjectPaths.ts +15 -28
  558. package/src/cli/cli-commands/agent.ts +44 -0
  559. package/src/cli/cli-commands/agents-server/buildAgentsServer.ts +325 -33
  560. package/src/cli/cli-commands/agents-server/ensureAgentsServerEnvFile.ts +15 -2
  561. package/src/cli/cli-commands/agents-server/run.ts +103 -31
  562. package/src/cli/cli-commands/agents-server/startAgentsServer.ts +270 -41
  563. package/src/cli/cli-commands/agents-server.ts +7 -1
  564. package/src/cli/cli-commands/coder/ThinkingLevel.ts +3 -1
  565. package/src/cli/cli-commands/coder/agentCodingFile.ts +1 -1
  566. package/src/cli/cli-commands/coder/ensureCoderDeveloperAgentFile.ts +79 -0
  567. package/src/cli/cli-commands/coder/find-unwritten.ts +58 -0
  568. package/src/cli/cli-commands/coder/getDefaultCoderPackageJsonScripts.ts +2 -2
  569. package/src/cli/cli-commands/coder/init.ts +6 -1
  570. package/src/cli/cli-commands/coder/initializeCoderProjectConfiguration.ts +10 -0
  571. package/src/cli/cli-commands/coder/printInitializationSummary.ts +3 -0
  572. package/src/cli/cli-commands/coder/run.ts +108 -13
  573. package/src/cli/cli-commands/coder/server.ts +259 -0
  574. package/src/cli/cli-commands/coder/waitOptions.ts +24 -0
  575. package/src/cli/cli-commands/coder.ts +6 -0
  576. package/src/cli/cli-commands/common/promptRunnerCliOptions.ts +33 -49
  577. package/src/cli/common/$deprecateCliCommand.ts +10 -1
  578. package/src/cli/promptbookCli.ts +2 -0
  579. package/src/collection/agent-collection/CreateAgentInput.ts +10 -5
  580. package/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentCollectionInSupabase.ts +98 -17
  581. package/src/collection/agent-collection/constructors/agent-collection-in-supabase/createAgentPersistenceRecords.ts +7 -4
  582. package/src/collection/agent-collection/constructors/agent-collection-in-supabase/prepareAgentSourceForPersistence.ts +44 -8
  583. package/src/commands/KNOWLEDGE/utils/knowledgeSourceContentToName.ts +2 -2
  584. package/src/commitments/GOAL/GOAL.ts +7 -2
  585. package/src/commitments/LANGUAGE/LANGUAGE.ts +7 -2
  586. package/src/commitments/META_VISIBILITY/META_VISIBILITY.ts +78 -0
  587. package/src/commitments/TEAM/TEAM.ts +12 -1
  588. package/src/commitments/USE_PROJECT/createUseProjectToolFunctions.ts +8 -1
  589. package/src/commitments/_common/teamInternalAgentAccess.ts +14 -8
  590. package/src/commitments/index.ts +2 -0
  591. package/src/execution/createPipelineExecutor/getKnowledgeForTask.ts +1 -1
  592. package/src/formats/csv/CsvFormatParser.ts +4 -4
  593. package/src/formats/csv/utils/csvParse.ts +2 -2
  594. package/src/import-plugins/JsonFileImportPlugin.ts +15 -2
  595. package/src/import-plugins/TextFileImportPlugin.ts +8 -1
  596. package/src/llm-providers/_common/register/$provideLlmToolsConfigurationFromEnv.ts +1 -1
  597. package/src/llm-providers/_common/register/$provideLlmToolsFromEnv.ts +1 -1
  598. package/src/llm-providers/_common/register/$registeredLlmToolsMessage.ts +6 -1
  599. package/src/llm-providers/agent/AgentLlmExecutionTools.ts +2 -2
  600. package/src/llm-providers/agent/AgentLlmExecutionToolsAgentKitRunner.ts +2 -2
  601. package/src/llm-providers/agent/AgentLlmExecutionToolsOpenAiAssistantRunner.ts +2 -2
  602. package/src/llm-providers/anthropic-claude/register-configuration.ts +6 -3
  603. package/src/llm-providers/openai/OpenAiAgentKitExecutionToolsToolBuilder.ts +3 -1
  604. package/src/llm-providers/openai/OpenAiAssistantExecutionToolsToolRunner.ts +1 -1
  605. package/src/llm-providers/openai/OpenAiVectorStoreKnowledgeSourcePreparer.ts +1 -1
  606. package/src/other/templates/getTemplatesPipelineCollection.ts +817 -702
  607. package/src/scrapers/_common/utils/getScraperIntermediateSource.ts +2 -2
  608. package/src/scrapers/website/WebsiteScraper.ts +1 -1
  609. package/src/scrapers/website/utils/createShowdownConverter.ts +2 -2
  610. package/src/scripting/javascript/JavascriptEvalExecutionTools.ts +1 -1
  611. package/src/utils/agents/resolveAgentAvatarImageUrl.ts +1 -1
  612. package/src/utils/chat/chatAttachments/resolveChatAttachmentContent.ts +8 -1
  613. package/src/utils/isTimingSafeEqualString.ts +43 -0
  614. package/src/utils/misc/computeHash.ts +2 -2
  615. package/src/utils/random/$randomToken.ts +2 -2
  616. package/src/utils/validators/url/isValidAgentUrl.ts +5 -7
  617. package/src/version.ts +2 -2
  618. package/src/versions.txt +33 -0
  619. package/umd/apps/agents-server/src/constants/federatedAgentImport.d.ts +42 -0
  620. package/umd/apps/agents-server/src/constants/serverLimits.d.ts +224 -0
  621. package/umd/apps/agents-server/src/constants/toolUsageLimits.d.ts +55 -0
  622. package/umd/index.umd.js +24336 -18681
  623. package/umd/index.umd.js.map +1 -1
  624. package/umd/scripts/run-agent-chat/executeAgentChatTurn.d.ts +28 -0
  625. package/umd/scripts/run-agent-chat/runAgentChat.d.ts +5 -0
  626. package/umd/scripts/run-agent-chat/runAgentExec.d.ts +11 -0
  627. package/umd/scripts/run-agent-messages/main/AgentMessageFailureTracker.d.ts +27 -0
  628. package/umd/scripts/run-agent-messages/main/handleAgentWatchError.d.ts +4 -0
  629. package/umd/scripts/run-agent-messages/main/runAgentMessages.d.ts +1 -0
  630. package/umd/scripts/run-agent-messages/main/runMultipleAgentMessages.d.ts +1 -0
  631. package/umd/scripts/run-agent-messages/main/tickAgentMessages.d.ts +1 -0
  632. package/umd/scripts/run-agent-messages/messages/createAgentRunnerSystemMessage.d.ts +10 -0
  633. package/umd/scripts/run-agent-messages/messages/moveAgentMessageToFailed.d.ts +17 -0
  634. package/umd/scripts/run-codex-prompts/common/buildCoderRunProgressSnapshot.d.ts +5 -1
  635. package/umd/scripts/run-codex-prompts/common/cliProgressDisplay.d.ts +7 -0
  636. package/umd/scripts/run-codex-prompts/common/coderRunEstimateCache.d.ts +31 -0
  637. package/umd/scripts/run-codex-prompts/common/parseDuration.d.ts +19 -0
  638. package/umd/scripts/run-codex-prompts/common/progressFormatting.d.ts +2 -0
  639. package/umd/scripts/run-codex-prompts/common/resolveAgentSystemMessage.d.ts +6 -0
  640. package/umd/scripts/run-codex-prompts/common/resolveInlineOrFileText.d.ts +14 -0
  641. package/umd/scripts/run-codex-prompts/common/runGoScript/printLiveScriptChunk.d.ts +4 -0
  642. package/umd/scripts/run-codex-prompts/common/sleepWithCountdown.d.ts +27 -0
  643. package/umd/scripts/run-codex-prompts/common/waitForPause.d.ts +12 -0
  644. package/umd/scripts/run-codex-prompts/git/commitChanges.d.ts +3 -1
  645. package/umd/scripts/run-codex-prompts/main/findUnwrittenPrompts.d.ts +19 -0
  646. package/umd/scripts/run-codex-prompts/main/runCodexPromptsServer.d.ts +27 -0
  647. package/umd/scripts/run-codex-prompts/main/runPromptRound.d.ts +5 -3
  648. package/umd/scripts/run-codex-prompts/runners/claude-code/ClaudeCodeRunner.d.ts +3 -1
  649. package/umd/scripts/run-codex-prompts/server/buildCoderServerPromptResponse.d.ts +50 -0
  650. package/umd/scripts/run-codex-prompts/server/buildCoderServerRunState.d.ts +23 -0
  651. package/umd/scripts/run-codex-prompts/server/coderServerHtml.d.ts +9 -0
  652. package/umd/scripts/run-codex-prompts/server/runCoderHttpServer.d.ts +35 -0
  653. package/umd/scripts/run-codex-prompts/server/updatePromptSection.d.ts +9 -0
  654. package/umd/scripts/run-codex-prompts/ui/CoderRunUiState.d.ts +8 -0
  655. package/umd/scripts/run-codex-prompts/ui/buildCoderRunUiFrame.d.ts +1 -0
  656. package/umd/scripts/run-codex-prompts/ui/buildRunUiFrameShared.d.ts +5 -1
  657. package/umd/scripts/run-codex-prompts/ui/renderCoderRunUi.d.ts +1 -0
  658. package/umd/src/_packages/components.index.d.ts +4 -0
  659. package/umd/src/_packages/core.index.d.ts +22 -2
  660. package/umd/src/_packages/node.index.d.ts +40 -0
  661. package/umd/src/_packages/types.index.d.ts +20 -0
  662. package/umd/src/avatars/avatarAnimationScheduler.d.ts +4 -0
  663. package/umd/src/avatars/types/AvatarVisualDefinition.d.ts +1 -1
  664. package/umd/src/avatars/visuals/octopus3d3AvatarVisual.d.ts +7 -0
  665. package/umd/src/avatars/visuals/octopus3d4AvatarVisual.d.ts +7 -0
  666. package/umd/src/book-2.0/agent-source/AgentBasicInformation.d.ts +2 -0
  667. package/umd/src/book-2.0/agent-source/agentSourceVisibility.d.ts +97 -0
  668. package/umd/src/book-2.0/agent-source/agentSourceVisibility.test.d.ts +1 -0
  669. package/umd/src/book-3.0/BookNodeAgentSource.d.ts +38 -0
  670. package/umd/src/book-3.0/CliAgent.d.ts +66 -0
  671. package/umd/src/book-3.0/CliAgent.test.d.ts +1 -0
  672. package/umd/src/book-3.0/LiteAgent.d.ts +68 -0
  673. package/umd/src/book-3.0/LiteAgent.test.d.ts +1 -0
  674. package/umd/src/book-3.0/agentFolderPaths.d.ts +30 -0
  675. package/umd/src/book-3.0/cliAgentEnv.d.ts +33 -0
  676. package/umd/src/book-components/BookEditor/BookEditor.d.ts +6 -5
  677. package/umd/src/book-components/BookEditor/BookEditorAboutPromptbookInformation.d.ts +12 -0
  678. package/umd/src/book-components/BookEditor/BookEditorBrowserConfig.d.ts +2 -0
  679. package/umd/src/book-components/BookEditor/BookEditorForClient.d.ts +7 -0
  680. package/umd/src/book-components/BookEditor/BookEditorMonacoTokenization.d.ts +2 -0
  681. package/umd/src/book-components/BookEditor/BookEditorTheme.d.ts +24 -0
  682. package/umd/src/book-components/BookEditor/createDeprecatedCommitmentDiagnostics.browser.d.ts +9 -0
  683. package/umd/src/book-components/BookEditor/useBookEditorMonacoLanguage.d.ts +1 -6
  684. package/umd/src/book-components/BookEditor/useBookEditorMonacoLifecycle.d.ts +1 -4
  685. package/umd/src/book-components/BookEditor/useBookEditorMonacoStyles.d.ts +2 -1
  686. package/umd/src/book-components/Chat/Chat/ChatCitationModal.d.ts +2 -0
  687. package/umd/src/book-components/Chat/Chat/ChatMessageItem.d.ts +4 -0
  688. package/umd/src/book-components/Chat/Chat/ChatMessageList.d.ts +4 -0
  689. package/umd/src/book-components/Chat/Chat/ChatProps.d.ts +5 -0
  690. package/umd/src/book-components/Chat/Chat/ChatToolCallModal.d.ts +2 -0
  691. package/umd/src/book-components/Chat/Chat/ChatToolCallModalContent.d.ts +3 -1
  692. package/umd/src/book-components/Chat/Chat/CitationIframePreview.d.ts +20 -0
  693. package/umd/src/book-components/Chat/Chat/TeamToolCallModalContent.d.ts +2 -0
  694. package/umd/src/book-components/Chat/MarkdownContent/MarkdownContent.d.ts +1 -0
  695. package/umd/src/book-components/Chat/SourceChip/SourceChip.d.ts +6 -1
  696. package/umd/src/book-components/Chat/hooks/useResolvedCitationLabel.d.ts +12 -0
  697. package/umd/src/book-components/Chat/types/ChatMessage.d.ts +4 -0
  698. package/umd/src/book-components/Chat/types/ChatParticipant.d.ts +1 -1
  699. package/umd/src/book-components/Chat/types/CitationLabelResolver.d.ts +8 -0
  700. package/umd/src/book-components/Chat/utils/citationHelpers.d.ts +9 -0
  701. package/umd/src/book-components/Chat/utils/decodeJsonUnicodeEscapesInMarkdownText.d.ts +14 -0
  702. package/umd/src/book-components/Chat/utils/decodeJsonUnicodeEscapesInMarkdownText.test.d.ts +1 -0
  703. package/umd/src/book-components/Chat/utils/isVisibleChatToolCall.d.ts +10 -0
  704. package/umd/src/book-components/Chat/utils/parseCitationsFromContent.d.ts +4 -0
  705. package/umd/src/book-components/_common/Dropdown/Dropdown.d.ts +1 -1
  706. package/umd/src/book-components/_common/MenuHoisting/MenuHoistingContext.d.ts +1 -1
  707. package/umd/src/book-components/_common/Modal/Modal.d.ts +1 -1
  708. package/umd/src/book-components/icons/AboutIcon.d.ts +1 -1
  709. package/umd/src/book-components/icons/DownloadIcon.d.ts +1 -1
  710. package/umd/src/book-components/icons/ExitFullscreenIcon.d.ts +1 -1
  711. package/umd/src/book-components/icons/FullscreenIcon.d.ts +1 -1
  712. package/umd/src/cli/cli-commands/agent/agentCliOptions.d.ts +38 -0
  713. package/umd/src/cli/cli-commands/agent/chat.d.ts +10 -0
  714. package/umd/src/cli/cli-commands/agent/exec.d.ts +10 -0
  715. package/umd/src/cli/cli-commands/agent/run.test.d.ts +1 -0
  716. package/umd/src/cli/cli-commands/agent-folder/agentProjectPaths.d.ts +2 -24
  717. package/umd/src/cli/cli-commands/agent.d.ts +14 -0
  718. package/umd/src/cli/cli-commands/agents-server/buildAgentsServer.d.ts +23 -1
  719. package/umd/src/cli/cli-commands/agents-server/run.d.ts +6 -0
  720. package/umd/src/cli/cli-commands/agents-server/startAgentsServer.d.ts +9 -2
  721. package/umd/src/cli/cli-commands/coder/ThinkingLevel.d.ts +1 -1
  722. package/umd/src/cli/cli-commands/coder/ensureCoderDeveloperAgentFile.d.ts +25 -0
  723. package/umd/src/cli/cli-commands/coder/find-unwritten.d.ts +10 -0
  724. package/umd/src/cli/cli-commands/coder/initializeCoderProjectConfiguration.d.ts +2 -0
  725. package/umd/src/cli/cli-commands/coder/server.d.ts +13 -0
  726. package/umd/src/cli/cli-commands/coder/waitOptions.d.ts +14 -0
  727. package/umd/src/cli/cli-commands/common/promptRunnerCliOptions.d.ts +9 -25
  728. package/umd/src/collection/agent-collection/CreateAgentInput.d.ts +2 -1
  729. package/umd/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentCollectionInSupabase.d.ts +22 -0
  730. package/umd/src/collection/agent-collection/constructors/agent-collection-in-supabase/prepareAgentSourceForPersistence.d.ts +21 -1
  731. package/umd/src/commitments/META_VISIBILITY/META_VISIBILITY.d.ts +27 -0
  732. package/umd/src/commitments/_common/teamInternalAgentAccess.d.ts +9 -1
  733. package/umd/src/commitments/index.d.ts +2 -1
  734. package/umd/src/llm-providers/_common/register/$provideLlmToolsConfigurationFromEnv.d.ts +1 -1
  735. package/umd/src/llm-providers/_common/register/$provideLlmToolsFromEnv.d.ts +1 -1
  736. package/umd/src/scrapers/website/utils/createShowdownConverter.d.ts +2 -2
  737. package/umd/src/utils/isTimingSafeEqualString.d.ts +25 -0
  738. package/umd/src/utils/validators/url/isValidAgentUrl.d.ts +5 -0
  739. package/umd/src/version.d.ts +1 -1
  740. package/apps/agents-server/src/app/api/long-streaming/route.ts +0 -23
  741. package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddress.test.ts.todo +0 -108
  742. package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddresses.test.ts.todo +0 -117
  743. package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddress.test.ts.todo +0 -119
  744. package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddresses.test.ts.todo +0 -74
  745. package/apps/agents-server/src/utils/defaultFederatedAgents/DefaultFederatedAgentsSyncOptions.ts +0 -9
  746. package/apps/agents-server/src/utils/defaultFederatedAgents/ensureDefaultFederatedAgentExists.ts +0 -277
  747. package/apps/agents-server/src/utils/defaultFederatedAgents/fetchCoreOrganizationPayload.ts +0 -39
  748. package/apps/agents-server/src/utils/defaultFederatedAgents/fetchFederatedAgentBook.ts +0 -43
  749. package/apps/agents-server/src/utils/defaultFederatedAgents/fetchWithDefaultFederatedAgentTimeout.ts +0 -28
  750. package/apps/agents-server/src/utils/defaultFederatedAgents/getDefaultFederatedAgentSyncPool.ts +0 -38
  751. package/apps/agents-server/src/utils/defaultFederatedAgents/loadActiveLocalAgentIdsByNormalizedName.ts +0 -41
  752. package/apps/agents-server/src/utils/defaultFederatedAgents/loadDefaultFederatedAgentSyncMetadata.ts +0 -76
  753. package/apps/agents-server/src/utils/defaultFederatedAgents/quoteIdentifier.ts +0 -11
  754. package/apps/agents-server/src/utils/defaultFederatedAgents/scheduleDefaultFederatedAgentsSync.ts +0 -88
  755. package/apps/agents-server/src/utils/defaultFederatedAgents/selectDefaultFederatedAgentsFromOrganizationPayload.ts +0 -181
  756. package/apps/agents-server/src/utils/defaultFederatedAgents/synchronizeDefaultFederatedAgents.ts +0 -77
  757. package/apps/agents-server/src/utils/shibboleth/createShibbolethAuthenticationLogPayload.ts +0 -173
  758. package/apps/agents-server/src/utils/shibboleth/writeShibbolethAuthenticationLog.ts +0 -27
  759. package/apps/agents-server/tests/e2e/authentication-and-navigation.spec.ts.todo +0 -178
  760. package/src/_packages/browser.index.ts +0 -31
  761. package/src/_packages/browser.readme.md +0 -43
  762. package/src/book-2.0/agent-source/parseAgentSourceWithCommitments.test.ts.todo +0 -265
  763. package/src/book-components/BookEditor/BookEditorMonaco.test.tsx.todo +0 -115
  764. package/src/book-components/Chat/utils/renderMarkdown.test.ts.tmp +0 -199
  765. package/src/collection/agent-collection/constructors/agent-collection-in-directory/AgentCollectionInDirectory.test.ts.todo +0 -131
  766. package/src/commands/_common/parseCommand.test.ts.todo +0 -48
  767. package/src/commitments/META_LINK/META_LINK.test.ts.todo +0 -75
  768. package/src/conversion/validation/pipelineStringToJson-errors.test.ts.todo +0 -33
  769. package/src/dialogs/simple-prompt/SimplePromptInterfaceTools.ts +0 -51
  770. package/src/executables/browsers/locateSafari.test.ts.tmp +0 -15
  771. package/src/execution/PromptbookFetch.test-type.ts +0 -14
  772. package/src/execution/createPipelineExecutor/00-createPipelineExecutor.test.ts.todo +0 -0
  773. package/src/execution/execution-report/executionReportJsonToString.test.ts.todo +0 -83
  774. package/src/execution/utils/usageToHuman.test.ts.todo +0 -80
  775. package/src/llm-providers/_common/register/$provideLlmToolsForTestingAndScriptsAndPlayground.ts +0 -76
  776. package/src/llm-providers/_common/utils/assertUniqueModels.ts +0 -27
  777. package/src/llm-providers/_multiple/playground/playground.ts +0 -141
  778. package/src/llm-providers/_multiple/playground/tsconfig.json +0 -19
  779. package/src/llm-providers/agent/playground/playground.ts +0 -190
  780. package/src/llm-providers/agent/playground/tsconfig.json +0 -19
  781. package/src/llm-providers/anthropic-claude/playground/playground.ts +0 -99
  782. package/src/llm-providers/anthropic-claude/playground/tsconfig.json +0 -19
  783. package/src/llm-providers/azure-openai/playground/playground.ts +0 -101
  784. package/src/llm-providers/azure-openai/playground/tsconfig.json +0 -19
  785. package/src/llm-providers/ollama/playground/playground.ts +0 -120
  786. package/src/llm-providers/ollama/playground/tsconfig.json +0 -19
  787. package/src/llm-providers/openai/playground/playground.ts +0 -406
  788. package/src/llm-providers/openai/playground/tsconfig.json +0 -19
  789. package/src/llm-providers/remote/playground/playground.ts +0 -144
  790. package/src/llm-providers/remote/playground/tsconfig.json +0 -19
  791. package/src/llm-providers/vercel/playground/playground.ts +0 -133
  792. package/src/llm-providers/vercel/playground/tsconfig.json +0 -19
  793. package/src/personas/preparePersona.test.ts.todo +0 -126
  794. package/src/playground/backup/_playground-boilerplate.ts.txt +0 -37
  795. package/src/playground/backup/playground-agent-os.txt +0 -62
  796. package/src/playground/backup/playground-brj-app.ts.txt +0 -302
  797. package/src/playground/backup/playground-browser-playwright.txt +0 -110
  798. package/src/playground/backup/playground-claude-mcp.txt +0 -43
  799. package/src/playground/backup/playground-document-conversion.txt +0 -84
  800. package/src/playground/backup/playground-glob.ts.txt +0 -42
  801. package/src/playground/backup/playground-mcp-server.txt +0 -1
  802. package/src/playground/backup/playground-openai-agent-kit.txt +0 -73
  803. package/src/playground/backup/playground-openai-function-calling.txt +0 -131
  804. package/src/playground/backup/playground-openai-streaming.ts.txt +0 -68
  805. package/src/playground/backup/playground-scrape-knowledge.txt +0 -65
  806. package/src/playground/backup/playground-scraperFetch.ts.txt +0 -44
  807. package/src/playground/backup/playground-using-openai-compatible-route-on-agents-server.ts.txt +0 -49
  808. package/src/playground/backup/playground-write-pavolhejny-bio.txt +0 -120
  809. package/src/playground/permanent/_boilerplate.ts +0 -54
  810. package/src/playground/permanent/agent-with-browser-playground.ts +0 -92
  811. package/src/playground/permanent/error-handling-playground.ts +0 -103
  812. package/src/playground/playground.ts +0 -36
  813. package/src/playground/tsconfig.json +0 -19
  814. package/src/scrapers/_boilerplate/BoilerplateScraper.test.ts.todo +0 -73
  815. package/src/scrapers/_boilerplate/playground/boilerplate-scraper-playground.ts +0 -79
  816. package/src/scrapers/_boilerplate/playground/tsconfig.json +0 -19
  817. package/src/scrapers/_common/utils/files/blobToDataurl.test.ts.todo +0 -17
  818. package/src/scrapers/_common/utils/files/dataurlToBlob.test.ts.todo +0 -52
  819. package/src/scrapers/_common/utils/files/isValidDataurl.test.ts.todo +0 -42
  820. package/src/scrapers/_common/utils/files/shorten.test.ts.todo +0 -13
  821. package/src/scrapers/document/playground/document-scraper-playground.ts +0 -80
  822. package/src/scrapers/document/playground/tsconfig.json +0 -19
  823. package/src/scrapers/document-legacy/playground/legacy-document-scraper-playground.ts +0 -80
  824. package/src/scrapers/document-legacy/playground/tsconfig.json +0 -19
  825. package/src/scrapers/markdown/playground/markdown-scraper-playground.ts +0 -74
  826. package/src/scrapers/markdown/playground/tsconfig.json +0 -19
  827. package/src/scrapers/markitdown/MarkitdownScraper.test.ts.todo +0 -132
  828. package/src/scrapers/markitdown/playground/markitdown-scraper-playground.ts +0 -91
  829. package/src/scrapers/markitdown/playground/tsconfig.json +0 -19
  830. package/src/scrapers/pdf/PdfScraper.test.ts.todo +0 -52
  831. package/src/scrapers/pdf/playground/pdf-scraper-playground.ts +0 -75
  832. package/src/scrapers/pdf/playground/tsconfig.json +0 -19
  833. package/src/scrapers/website/playground/tsconfig.json +0 -19
  834. package/src/scrapers/website/playground/website-scraper-playground.ts +0 -82
  835. package/src/storage/_common/PromptbookStorage.test-type.ts +0 -14
  836. package/src/storage/local-storage/getIndexedDbStorage.ts +0 -36
  837. package/src/storage/local-storage/getLocalStorage.ts +0 -33
  838. package/src/storage/local-storage/getSessionStorage.ts +0 -33
  839. package/src/storage/local-storage/utils/IndexedDbStorageOptions.ts +0 -16
  840. package/src/storage/local-storage/utils/makePromptbookStorageFromIndexedDb.ts +0 -58
  841. package/src/storage/local-storage/utils/makePromptbookStorageFromWebStorage.ts +0 -45
  842. package/src/transpilers/formatted-book-in-markdown/FormattedBookInMarkdownTranspiler.test.ts.todo +0 -35
  843. package/src/transpilers/openai-sdk/playground/playground.ts +0 -85
  844. package/src/transpilers/openai-sdk/playground/tmp/chatbot-openaisdk-1.js +0 -194
  845. package/src/transpilers/openai-sdk/playground/tmp/package.json +0 -3
  846. package/src/transpilers/openai-sdk/playground/tsconfig.json +0 -18
  847. package/src/utils/editable/utils/findUsableParameters.test.ts.todo +0 -43
  848. package/src/utils/editable/utils/stringifyPipelineJson.test.ts.todo +0 -38
  849. package/src/utils/markdown/prettifyMarkdown.test.ts.tmp +0 -42
  850. package/src/utils/serialization/serializeToPromptbookJavascript.test.ts.todo +0 -116
@@ -1,8 +1,29 @@
1
1
  'use client';
2
2
 
3
- import { CheckCircle2, Download, Loader2, RefreshCcw, Rocket, Server, TriangleAlert } from 'lucide-react';
4
- import { useCallback, useEffect, useMemo, useState } from 'react';
3
+ import {
4
+ CheckCircle2,
5
+ ChevronDown,
6
+ ChevronUp,
7
+ ClipboardCopy,
8
+ Download,
9
+ FileDown,
10
+ GitCommit,
11
+ Loader2,
12
+ RefreshCcw,
13
+ Rocket,
14
+ Server,
15
+ Settings2,
16
+ TriangleAlert,
17
+ } from 'lucide-react';
18
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
19
+ import { AdminXtermTerminal } from '../../../components/AdminTerminal/AdminXtermTerminal';
5
20
  import { Card } from '../../../components/Homepage/Card';
21
+ import { useServerLanguage } from '../../../components/ServerLanguage/ServerLanguageProvider';
22
+ import type { ServerLanguageCode } from '../../../languages/ServerLanguageRegistry';
23
+ import { downloadBlob, parseFilenameFromContentDisposition } from '../../../utils/download/browserFileDownload';
24
+ import { createServerLanguageMoment } from '../../../utils/localization/createServerLanguageMoment';
25
+ import { formatServerLanguageHumanReadableDate } from '../../../utils/localization/formatServerLanguageHumanReadableDate';
26
+ import { CustomCommitPicker, type CustomCommitPickerCandidate } from './CustomCommitPicker';
6
27
 
7
28
  /**
8
29
  * Browser-safe environment option returned by the update API.
@@ -12,6 +33,7 @@ type UpdateEnvironmentOption = {
12
33
  readonly branch: string;
13
34
  readonly label: string;
14
35
  readonly description: string;
36
+ readonly isCustom: boolean;
15
37
  };
16
38
 
17
39
  /**
@@ -33,6 +55,16 @@ type UpdateJobSnapshot = {
33
55
  readonly logFilePath: string | null;
34
56
  };
35
57
 
58
+ /**
59
+ * Browser-safe summary of one commit between the deployed checkout and the latest remote commit.
60
+ */
61
+ type UpdatePendingCommit = {
62
+ readonly commitSha: string;
63
+ readonly shortCommitSha: string;
64
+ readonly subject: string;
65
+ readonly authoredAt: string | null;
66
+ };
67
+
36
68
  /**
37
69
  * Browser-safe self-update overview returned by the super-admin API.
38
70
  */
@@ -45,53 +77,86 @@ type UpdateOverview = {
45
77
  readonly currentCommitSha: string | null;
46
78
  readonly currentCommitShortSha: string | null;
47
79
  readonly currentCommitMessage: string | null;
80
+ readonly currentCommitDate: string | null;
48
81
  readonly latestRemoteCommitSha: string | null;
49
82
  readonly latestRemoteCommitShortSha: string | null;
83
+ readonly latestRemoteCommitDate: string | null;
84
+ readonly latestRemoteCommitMessage: string | null;
85
+ readonly commitsBehindCount: number | null;
86
+ readonly pendingCommits: ReadonlyArray<UpdatePendingCommit>;
50
87
  readonly isUpdateAvailable: boolean;
88
+ readonly originRepositoryUrl: string;
89
+ readonly isOriginRepositoryDefault: boolean;
90
+ readonly defaultOriginRepositoryUrl: string;
51
91
  readonly job: UpdateJobSnapshot;
52
92
  readonly error?: string;
53
93
  };
54
94
 
95
+ /**
96
+ * Duration (ms) of the transient "Copied!" / "Saved!" feedback shown next to log action buttons.
97
+ */
98
+ const UPDATE_LOG_ACTION_FEEDBACK_DURATION_MS = 2500;
99
+
100
+ /**
101
+ * Default download filename used when the server does not provide one via `Content-Disposition`.
102
+ */
103
+ const DEFAULT_UPDATE_LOG_DOWNLOAD_FILENAME = 'self-update.log';
104
+
55
105
  /**
56
106
  * Client UI for standalone VPS branch-aware self-updates.
57
107
  */
58
108
  export function UpdateClient() {
109
+ const { language } = useServerLanguage();
59
110
  const [overview, setOverview] = useState<UpdateOverview | null>(null);
60
111
  const [selectedEnvironmentId, setSelectedEnvironmentId] = useState<string>('');
112
+ const [customRef, setCustomRef] = useState<string>('');
113
+ const [customCandidate, setCustomCandidate] = useState<CustomCommitPickerCandidate | null>(null);
114
+ const [originRepositoryUrlOverride, setOriginRepositoryUrlOverride] = useState<string>('');
115
+ const [isAdvancedExpanded, setIsAdvancedExpanded] = useState<boolean>(false);
61
116
  const [isLoading, setIsLoading] = useState(true);
62
117
  const [isStartingUpdate, setIsStartingUpdate] = useState(false);
63
118
  const [errorMessage, setErrorMessage] = useState<string | null>(null);
64
119
  const [successMessage, setSuccessMessage] = useState<string | null>(null);
65
120
 
66
- /**
67
- * Loads the latest self-update overview from the server.
68
- */
69
- const loadOverview = useCallback(async (options?: { readonly isSilent?: boolean }): Promise<void> => {
70
- try {
71
- if (!options?.isSilent) {
72
- setIsLoading(true);
73
- }
74
- setErrorMessage(null);
75
-
76
- const response = await fetch('/api/admin/update', { cache: 'no-store' });
77
- const payload = (await response.json()) as UpdateOverview;
78
-
79
- if (!response.ok) {
80
- throw new Error(payload.error || 'Failed to load the update overview.');
81
- }
82
-
83
- setOverview(payload);
84
- setSelectedEnvironmentId((currentSelectedEnvironmentId) =>
85
- currentSelectedEnvironmentId || payload.currentEnvironment.id,
86
- );
87
- } catch (error) {
88
- setErrorMessage(error instanceof Error ? error.message : 'Failed to load the update overview.');
89
- } finally {
90
- if (!options?.isSilent) {
91
- setIsLoading(false);
121
+ const loadOverview = useCallback(
122
+ async (options?: { readonly isSilent?: boolean; readonly isRestartExpected?: boolean }): Promise<void> => {
123
+ try {
124
+ if (!options?.isSilent) {
125
+ setIsLoading(true);
126
+ }
127
+ setErrorMessage(null);
128
+
129
+ const response = await fetch('/api/admin/update', { cache: 'no-store' });
130
+ const payload = (await response.json()) as UpdateOverview;
131
+
132
+ if (!response.ok) {
133
+ throw new Error(payload.error || 'Failed to load the update overview.');
134
+ }
135
+
136
+ setOverview(payload);
137
+ setSelectedEnvironmentId(
138
+ (currentSelectedEnvironmentId) => currentSelectedEnvironmentId || payload.currentEnvironment.id,
139
+ );
140
+ setOriginRepositoryUrlOverride((currentValue) => currentValue || payload.originRepositoryUrl);
141
+ if (payload.job.status === 'succeeded') {
142
+ setSuccessMessage(getUpdateJobSuccessMessage(payload.job));
143
+ } else if (payload.job.status === 'failed') {
144
+ setSuccessMessage(null);
145
+ }
146
+ } catch (error) {
147
+ if (options?.isRestartExpected) {
148
+ return;
149
+ }
150
+
151
+ setErrorMessage(error instanceof Error ? error.message : 'Failed to load the update overview.');
152
+ } finally {
153
+ if (!options?.isSilent) {
154
+ setIsLoading(false);
155
+ }
92
156
  }
93
- }
94
- }, []);
157
+ },
158
+ [],
159
+ );
95
160
 
96
161
  useEffect(() => {
97
162
  void loadOverview();
@@ -103,7 +168,7 @@ export function UpdateClient() {
103
168
  }
104
169
 
105
170
  const interval = window.setInterval(() => {
106
- void loadOverview({ isSilent: true });
171
+ void loadOverview({ isSilent: true, isRestartExpected: true });
107
172
  }, 4000);
108
173
 
109
174
  return () => {
@@ -118,13 +183,18 @@ export function UpdateClient() {
118
183
  null,
119
184
  [overview, selectedEnvironmentId],
120
185
  );
186
+ const isCustomEnvironmentSelected = selectedEnvironment?.isCustom === true;
121
187
  const isEnvironmentSwitchRequired =
122
188
  Boolean(selectedEnvironment) && selectedEnvironment?.id !== overview?.currentEnvironment.id;
123
189
  const isUpdateRunning = overview?.job.status === 'running';
190
+ const updateTerminalId = `standalone-vps-update:${overview?.job.startedAt || overview?.job.finishedAt || overview?.job.status || 'loading'}`;
191
+ const updateTerminalEmptyState =
192
+ isLoading && !overview ? 'Loading update log...' : 'No persisted update log output yet.';
193
+ const isCustomRefRelease = isCustomEnvironmentSelected ? customCandidate?.isReleaseTag === true : true;
194
+ const isCustomRefMissing = isCustomEnvironmentSelected && !customRef.trim();
195
+ const isOriginOverrideChanged =
196
+ overview !== null && originRepositoryUrlOverride.trim() !== overview.originRepositoryUrl;
124
197
 
125
- /**
126
- * Starts one detached update run for the selected environment.
127
- */
128
198
  async function startUpdate(): Promise<void> {
129
199
  if (!selectedEnvironment) {
130
200
  return;
@@ -142,6 +212,8 @@ export function UpdateClient() {
142
212
  },
143
213
  body: JSON.stringify({
144
214
  environment: selectedEnvironment.id,
215
+ customRef: isCustomEnvironmentSelected ? customRef.trim() : null,
216
+ originRepositoryUrl: isOriginOverrideChanged ? originRepositoryUrlOverride.trim() : null,
145
217
  }),
146
218
  });
147
219
  const payload = (await response.json()) as UpdateOverview;
@@ -152,9 +224,11 @@ export function UpdateClient() {
152
224
 
153
225
  setOverview(payload);
154
226
  setSuccessMessage(
155
- isEnvironmentSwitchRequired
156
- ? `Switched to ${selectedEnvironment.label} and started the standalone VPS update.`
157
- : 'Standalone VPS update started.',
227
+ isCustomEnvironmentSelected
228
+ ? `Started the standalone VPS update to custom ref ${customRef.trim()}.`
229
+ : isEnvironmentSwitchRequired
230
+ ? `Switched to ${selectedEnvironment.label} and started the standalone VPS update.`
231
+ : 'Standalone VPS update started.',
158
232
  );
159
233
  } catch (error) {
160
234
  setErrorMessage(error instanceof Error ? error.message : 'Failed to start the update.');
@@ -169,8 +243,8 @@ export function UpdateClient() {
169
243
  <div>
170
244
  <h1 className="text-3xl font-light text-gray-900">Update</h1>
171
245
  <p className="mt-1 max-w-3xl text-sm text-gray-500">
172
- Switch the standalone VPS between Production, Live, Preview, and LTS, and update the managed
173
- Promptbook checkout with one click.
246
+ Switch the standalone VPS between Live, Preview, Production, LTS, or a custom ref, and update
247
+ the managed Promptbook checkout with one click.
174
248
  </p>
175
249
  </div>
176
250
 
@@ -204,77 +278,7 @@ export function UpdateClient() {
204
278
 
205
279
  <div className="grid gap-4 lg:grid-cols-[1.4fr_1fr]">
206
280
  <Card className="hover:border-gray-200 hover:shadow-md">
207
- <div className="space-y-4">
208
- <div className="flex items-start gap-3">
209
- <Server className="mt-0.5 h-5 w-5 text-blue-600" />
210
- <div>
211
- <h2 className="text-lg font-semibold text-slate-900">Current deployment</h2>
212
- <p className="mt-1 text-sm text-slate-500">
213
- The server currently tracks the <span className="font-medium">{overview?.currentEnvironment.label || 'Production'}</span>{' '}
214
- environment on branch <span className="font-mono">{overview?.currentEnvironment.branch || 'production'}</span>.
215
- </p>
216
- </div>
217
- </div>
218
-
219
- <dl className="grid gap-4 text-sm text-slate-600 sm:grid-cols-2">
220
- <div className="rounded-xl border border-slate-200 bg-slate-50 px-4 py-3">
221
- <dt className="text-xs font-semibold uppercase tracking-wide text-slate-500">Branch</dt>
222
- <dd className="mt-1 font-mono text-slate-900">
223
- {overview?.currentEnvironment.branch || 'production'}
224
- </dd>
225
- </div>
226
- <div className="rounded-xl border border-slate-200 bg-slate-50 px-4 py-3">
227
- <dt className="text-xs font-semibold uppercase tracking-wide text-slate-500">
228
- Deployed commit
229
- </dt>
230
- <dd className="mt-1 font-mono text-slate-900">
231
- {overview?.currentCommitShortSha || 'Unknown'}
232
- </dd>
233
- </div>
234
- <div className="rounded-xl border border-slate-200 bg-slate-50 px-4 py-3">
235
- <dt className="text-xs font-semibold uppercase tracking-wide text-slate-500">
236
- Latest remote commit
237
- </dt>
238
- <dd className="mt-1 font-mono text-slate-900">
239
- {overview?.latestRemoteCommitShortSha || 'Unknown'}
240
- </dd>
241
- </div>
242
- <div className="rounded-xl border border-slate-200 bg-slate-50 px-4 py-3">
243
- <dt className="text-xs font-semibold uppercase tracking-wide text-slate-500">
244
- Update availability
245
- </dt>
246
- <dd className="mt-1 flex items-center gap-2 text-slate-900">
247
- {overview?.isUpdateAvailable ? (
248
- <>
249
- <TriangleAlert className="h-4 w-4 text-amber-500" />
250
- New commit available
251
- </>
252
- ) : (
253
- <>
254
- <CheckCircle2 className="h-4 w-4 text-emerald-600" />
255
- Up to date
256
- </>
257
- )}
258
- </dd>
259
- </div>
260
- </dl>
261
-
262
- {overview?.currentCommitMessage && (
263
- <div className="rounded-xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-600">
264
- <div className="text-xs font-semibold uppercase tracking-wide text-slate-500">
265
- Current commit message
266
- </div>
267
- <div className="mt-1 text-slate-900">{overview.currentCommitMessage}</div>
268
- </div>
269
- )}
270
-
271
- {overview?.repositoryDirectory && (
272
- <div className="text-xs text-slate-500">
273
- Managed repository:
274
- <span className="ml-2 font-mono text-slate-700">{overview.repositoryDirectory}</span>
275
- </div>
276
- )}
277
- </div>
281
+ <CurrentDeploymentCard overview={overview} language={language} />
278
282
  </Card>
279
283
 
280
284
  <Card className="hover:border-gray-200 hover:shadow-md">
@@ -312,13 +316,48 @@ export function UpdateClient() {
312
316
  </span>
313
317
  )}
314
318
  </div>
315
- <div className="mt-1 font-mono text-xs">{environment.branch}</div>
319
+ {environment.branch && (
320
+ <div className="mt-1 font-mono text-xs">{environment.branch}</div>
321
+ )}
316
322
  <div className="mt-2 text-sm opacity-80">{environment.description}</div>
317
323
  </button>
318
324
  );
319
325
  })}
320
326
  </div>
321
327
 
328
+ {isCustomEnvironmentSelected && overview?.isAvailable && (
329
+ <div className="space-y-3 rounded-xl border border-blue-200 bg-blue-50/40 p-4">
330
+ <CustomCommitPicker
331
+ language={language}
332
+ selectedRef={customRef}
333
+ onSelectRef={(nextRef, matchedCandidate) => {
334
+ setCustomRef(nextRef);
335
+ setCustomCandidate(matchedCandidate);
336
+ }}
337
+ isDisabled={isUpdateRunning || isStartingUpdate}
338
+ />
339
+
340
+ {customRef.trim() && !isCustomRefRelease && (
341
+ <div className="flex items-start gap-2 rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800">
342
+ <TriangleAlert className="mt-0.5 h-4 w-4 shrink-0" />
343
+ <div>
344
+ <strong>Heads up:</strong> the selected ref is not a release tag, so it may
345
+ be unstable and was not validated by the regular release pipeline.
346
+ </div>
347
+ </div>
348
+ )}
349
+ </div>
350
+ )}
351
+
352
+ <AdvancedOriginRepositoryPanel
353
+ originRepositoryUrlOverride={originRepositoryUrlOverride}
354
+ onChange={setOriginRepositoryUrlOverride}
355
+ overview={overview}
356
+ isExpanded={isAdvancedExpanded}
357
+ onToggleExpanded={() => setIsAdvancedExpanded((current) => !current)}
358
+ isDisabled={isUpdateRunning || isStartingUpdate}
359
+ />
360
+
322
361
  <button
323
362
  type="button"
324
363
  onClick={() => void startUpdate()}
@@ -327,20 +366,28 @@ export function UpdateClient() {
327
366
  !selectedEnvironment ||
328
367
  isUpdateRunning ||
329
368
  isStartingUpdate ||
330
- (!isEnvironmentSwitchRequired && !overview?.isUpdateAvailable)
369
+ isCustomRefMissing ||
370
+ (!isCustomEnvironmentSelected &&
371
+ !isEnvironmentSwitchRequired &&
372
+ !overview?.isUpdateAvailable &&
373
+ !isOriginOverrideChanged)
331
374
  }
332
375
  className="inline-flex w-full items-center justify-center gap-2 rounded-md bg-blue-600 px-4 py-3 text-sm font-semibold text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60"
333
376
  >
334
377
  {isStartingUpdate || isUpdateRunning ? (
335
378
  <Loader2 className="h-4 w-4 animate-spin" />
379
+ ) : isCustomEnvironmentSelected ? (
380
+ <Rocket className="h-4 w-4" />
336
381
  ) : isEnvironmentSwitchRequired ? (
337
382
  <Rocket className="h-4 w-4" />
338
383
  ) : (
339
384
  <Download className="h-4 w-4" />
340
385
  )}
341
- {isEnvironmentSwitchRequired
342
- ? `Switch to ${selectedEnvironment?.label || 'selected environment'} and update`
343
- : 'Update to latest commit'}
386
+ {isCustomEnvironmentSelected
387
+ ? `Update to ${customRef.trim() || 'custom ref'}`
388
+ : isEnvironmentSwitchRequired
389
+ ? `Switch to ${selectedEnvironment?.label || 'selected environment'} and update`
390
+ : 'Update to latest commit'}
344
391
  </button>
345
392
  </div>
346
393
  </Card>
@@ -374,7 +421,9 @@ export function UpdateClient() {
374
421
  <dl className="grid gap-4 text-sm text-slate-600 md:grid-cols-2 xl:grid-cols-4">
375
422
  <div className="rounded-xl border border-slate-200 bg-slate-50 px-4 py-3">
376
423
  <dt className="text-xs font-semibold uppercase tracking-wide text-slate-500">Target</dt>
377
- <dd className="mt-1 text-slate-900">{overview?.job.targetEnvironment.label || 'Production'}</dd>
424
+ <dd className="mt-1 text-slate-900">
425
+ {overview?.job.targetEnvironment.label || 'Production'}
426
+ </dd>
378
427
  </div>
379
428
  <div className="rounded-xl border border-slate-200 bg-slate-50 px-4 py-3">
380
429
  <dt className="text-xs font-semibold uppercase tracking-wide text-slate-500">Step</dt>
@@ -382,22 +431,26 @@ export function UpdateClient() {
382
431
  </div>
383
432
  <div className="rounded-xl border border-slate-200 bg-slate-50 px-4 py-3">
384
433
  <dt className="text-xs font-semibold uppercase tracking-wide text-slate-500">Started</dt>
385
- <dd className="mt-1 text-slate-900">{formatTimestamp(overview?.job.startedAt)}</dd>
434
+ <dd className="mt-1 text-slate-900">
435
+ {formatHumanReadableTimestamp(overview?.job.startedAt, language)}
436
+ </dd>
386
437
  </div>
387
438
  <div className="rounded-xl border border-slate-200 bg-slate-50 px-4 py-3">
388
439
  <dt className="text-xs font-semibold uppercase tracking-wide text-slate-500">Finished</dt>
389
- <dd className="mt-1 text-slate-900">{formatTimestamp(overview?.job.finishedAt)}</dd>
440
+ <dd className="mt-1 text-slate-900">
441
+ {formatHumanReadableTimestamp(overview?.job.finishedAt, language)}
442
+ </dd>
390
443
  </div>
391
444
  </dl>
392
445
 
393
- {overview?.job.errorMessage && (
394
- <div className="rounded-xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700">
395
- {overview.job.errorMessage}
446
+ {overview?.job.status === 'succeeded' && (
447
+ <div className="rounded-xl border border-emerald-200 bg-emerald-50 px-4 py-3 text-sm text-emerald-700">
448
+ {getUpdateJobSuccessMessage(overview.job)}
396
449
  </div>
397
450
  )}
398
- {overview?.job.isStale && (
399
- <div className="rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-800">
400
- The previous background update process stopped unexpectedly. You can start the update again.
451
+ {overview?.job.status === 'failed' && (
452
+ <div className="rounded-xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700">
453
+ {getUpdateJobFailureMessage(overview.job)}
401
454
  </div>
402
455
  )}
403
456
  {overview?.job.logFilePath && (
@@ -406,30 +459,467 @@ export function UpdateClient() {
406
459
  <span className="ml-2 font-mono text-slate-700">{overview.job.logFilePath}</span>
407
460
  </div>
408
461
  )}
409
- <pre className="max-h-[28rem] overflow-auto rounded-xl border border-slate-200 bg-slate-950 p-4 text-xs text-slate-100">
410
- {overview?.job.logTail || 'No persisted update log output yet.'}
411
- </pre>
462
+ {overview?.job.status === 'failed' && <UpdateJobLogActions />}
463
+ <AdminXtermTerminal
464
+ terminalId={updateTerminalId}
465
+ output={overview?.job.logTail || ''}
466
+ emptyState={updateTerminalEmptyState}
467
+ isReadOnly
468
+ isPlainTextOutput
469
+ ariaLabel="Standalone VPS update log"
470
+ />
412
471
  </div>
413
472
  </Card>
473
+
474
+ <PendingCommitsCard overview={overview} language={language} />
414
475
  </div>
415
476
  );
416
477
  }
417
478
 
418
479
  /**
419
- * Formats optional timestamps for the status cards.
480
+ * Current-deployment metrics card, including the new commits-behind and time-behind info.
420
481
  *
421
- * @param value - ISO timestamp or `null`.
422
- * @returns Human-friendly timestamp or fallback text.
482
+ * @private internal component of `<UpdateClient/>`
483
+ */
484
+ function CurrentDeploymentCard({
485
+ overview,
486
+ language,
487
+ }: {
488
+ readonly overview: UpdateOverview | null;
489
+ readonly language: ServerLanguageCode;
490
+ }) {
491
+ const driftLabel = useMemo(
492
+ () => buildDeploymentDriftLabel(overview, language),
493
+ [overview, language],
494
+ );
495
+
496
+ return (
497
+ <div className="space-y-4">
498
+ <div className="flex items-start gap-3">
499
+ <Server className="mt-0.5 h-5 w-5 text-blue-600" />
500
+ <div>
501
+ <h2 className="text-lg font-semibold text-slate-900">Current deployment</h2>
502
+ <p className="mt-1 text-sm text-slate-500">
503
+ The server currently tracks the{' '}
504
+ <span className="font-medium">
505
+ {overview?.currentEnvironment.label || 'Production'}
506
+ </span>{' '}
507
+ environment on branch{' '}
508
+ <span className="font-mono">{overview?.currentEnvironment.branch || 'production'}</span>.
509
+ </p>
510
+ </div>
511
+ </div>
512
+
513
+ <dl className="grid gap-4 text-sm text-slate-600 sm:grid-cols-2">
514
+ <div className="rounded-xl border border-slate-200 bg-slate-50 px-4 py-3">
515
+ <dt className="text-xs font-semibold uppercase tracking-wide text-slate-500">Branch</dt>
516
+ <dd className="mt-1 font-mono text-slate-900">
517
+ {overview?.currentEnvironment.branch || 'production'}
518
+ </dd>
519
+ </div>
520
+ <CommitSummaryCard
521
+ label="Deployed commit"
522
+ commitSha={overview?.currentCommitSha ?? null}
523
+ shortCommitSha={overview?.currentCommitShortSha ?? null}
524
+ subject={overview?.currentCommitMessage ?? null}
525
+ authoredAt={overview?.currentCommitDate ?? null}
526
+ language={language}
527
+ />
528
+ <CommitSummaryCard
529
+ label="Latest remote commit"
530
+ commitSha={overview?.latestRemoteCommitSha ?? null}
531
+ shortCommitSha={overview?.latestRemoteCommitShortSha ?? null}
532
+ subject={overview?.latestRemoteCommitMessage ?? null}
533
+ authoredAt={overview?.latestRemoteCommitDate ?? null}
534
+ language={language}
535
+ />
536
+ <div className="rounded-xl border border-slate-200 bg-slate-50 px-4 py-3">
537
+ <dt className="text-xs font-semibold uppercase tracking-wide text-slate-500">
538
+ Update availability
539
+ </dt>
540
+ <dd className="mt-1 flex items-center gap-2 text-slate-900">
541
+ {overview?.isUpdateAvailable ? (
542
+ <>
543
+ <TriangleAlert className="h-4 w-4 text-amber-500" />
544
+ {driftLabel}
545
+ </>
546
+ ) : (
547
+ <>
548
+ <CheckCircle2 className="h-4 w-4 text-emerald-600" />
549
+ Up to date
550
+ </>
551
+ )}
552
+ </dd>
553
+ </div>
554
+ </dl>
555
+
556
+ {overview?.repositoryDirectory && (
557
+ <div className="text-xs text-slate-500">
558
+ Managed repository:
559
+ <span className="ml-2 font-mono text-slate-700">{overview.repositoryDirectory}</span>
560
+ </div>
561
+ )}
562
+ </div>
563
+ );
564
+ }
565
+
566
+ /**
567
+ * Renders one commit as subject, hash and authored date.
568
+ *
569
+ * @private internal component of `<UpdateClient/>`
570
+ */
571
+ function CommitSummaryCard({
572
+ label,
573
+ commitSha,
574
+ shortCommitSha,
575
+ subject,
576
+ authoredAt,
577
+ language,
578
+ }: {
579
+ readonly label: string;
580
+ readonly commitSha: string | null;
581
+ readonly shortCommitSha: string | null;
582
+ readonly subject: string | null;
583
+ readonly authoredAt: string | null;
584
+ readonly language: ServerLanguageCode;
585
+ }) {
586
+ const commitHashLabel = commitSha || shortCommitSha || 'Unknown hash';
587
+
588
+ return (
589
+ <div className="rounded-xl border border-slate-200 bg-slate-50 px-4 py-3">
590
+ <dt className="text-xs font-semibold uppercase tracking-wide text-slate-500">{label}</dt>
591
+ <dd className="mt-1 text-slate-900">{subject || 'Unknown commit subject'}</dd>
592
+ <div className="mt-2 break-all font-mono text-xs text-slate-600">{commitHashLabel}</div>
593
+ <div className="mt-1 text-xs text-slate-500">{formatHumanReadableTimestamp(authoredAt, language)}</div>
594
+ </div>
595
+ );
596
+ }
597
+
598
+ /**
599
+ * Lists the commits between the deployed checkout and the latest remote commit so the super admin can review what
600
+ * exactly is about to be installed before triggering the self-update.
601
+ *
602
+ * @private internal component of `<UpdateClient/>`
423
603
  */
424
- function formatTimestamp(value: string | null | undefined): string {
425
- if (!value) {
426
- return 'Not available';
604
+ function PendingCommitsCard({
605
+ overview,
606
+ language,
607
+ }: {
608
+ readonly overview: UpdateOverview | null;
609
+ readonly language: ServerLanguageCode;
610
+ }) {
611
+ if (!overview || overview.pendingCommits.length === 0) {
612
+ return null;
427
613
  }
428
614
 
429
- const date = new Date(value);
430
- if (Number.isNaN(date.getTime())) {
431
- return value;
615
+ const commitsBehindLabel =
616
+ overview.commitsBehindCount !== null && overview.commitsBehindCount > 0
617
+ ? `${overview.commitsBehindCount} commit${overview.commitsBehindCount === 1 ? '' : 's'} behind`
618
+ : `${overview.pendingCommits.length} commit${overview.pendingCommits.length === 1 ? '' : 's'} pending`;
619
+ const timeBehindLabel = buildDeploymentTimeBehindLabel(overview, language);
620
+
621
+ return (
622
+ <Card className="hover:border-gray-200 hover:shadow-md">
623
+ <div className="space-y-4">
624
+ <div className="flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between">
625
+ <div className="flex items-start gap-3">
626
+ <GitCommit className="mt-0.5 h-5 w-5 text-amber-500" />
627
+ <div>
628
+ <h2 className="text-lg font-semibold text-slate-900">Pending commits</h2>
629
+ <p className="mt-1 text-sm text-slate-500">
630
+ Commits between the currently deployed checkout and the latest commit on{' '}
631
+ <span className="font-mono">{overview.currentEnvironment.branch}</span>.
632
+ </p>
633
+ </div>
634
+ </div>
635
+ <div className="text-xs font-semibold uppercase tracking-wide text-slate-500 sm:text-right">
636
+ <div>{commitsBehindLabel}</div>
637
+ {timeBehindLabel && <div className="mt-1 normal-case text-slate-400">{timeBehindLabel}</div>}
638
+ </div>
639
+ </div>
640
+
641
+ <ul className="divide-y divide-slate-100 rounded-xl border border-slate-200 bg-white">
642
+ {overview.pendingCommits.map((pendingCommit) => (
643
+ <li key={pendingCommit.commitSha} className="px-4 py-3">
644
+ <div className="text-sm text-slate-900">{pendingCommit.subject}</div>
645
+ <div className="mt-1 break-all font-mono text-xs text-slate-500">
646
+ {pendingCommit.commitSha || pendingCommit.shortCommitSha}
647
+ </div>
648
+ <div className="mt-1 text-xs text-slate-500">
649
+ {formatHumanReadableTimestamp(pendingCommit.authoredAt, language)}
650
+ </div>
651
+ </li>
652
+ ))}
653
+ </ul>
654
+ </div>
655
+ </Card>
656
+ );
657
+ }
658
+
659
+ /**
660
+ * Renders the copy / download actions for the persisted standalone VPS self-update log file.
661
+ *
662
+ * Shown when the latest update job failed so the super admin can quickly share the full log with the developers.
663
+ *
664
+ * @private internal component of `<UpdateClient/>`
665
+ */
666
+ function UpdateJobLogActions() {
667
+ const [actionFeedback, setActionFeedback] = useState<string | null>(null);
668
+ const [actionErrorMessage, setActionErrorMessage] = useState<string | null>(null);
669
+ const [isCopying, setIsCopying] = useState(false);
670
+ const [isDownloading, setIsDownloading] = useState(false);
671
+ const feedbackTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
672
+
673
+ useEffect(() => {
674
+ return () => {
675
+ if (feedbackTimeoutRef.current !== null) {
676
+ clearTimeout(feedbackTimeoutRef.current);
677
+ feedbackTimeoutRef.current = null;
678
+ }
679
+ };
680
+ }, []);
681
+
682
+ function showActionFeedback(feedbackMessage: string): void {
683
+ if (feedbackTimeoutRef.current !== null) {
684
+ clearTimeout(feedbackTimeoutRef.current);
685
+ }
686
+ setActionFeedback(feedbackMessage);
687
+ setActionErrorMessage(null);
688
+ feedbackTimeoutRef.current = setTimeout(() => {
689
+ setActionFeedback(null);
690
+ feedbackTimeoutRef.current = null;
691
+ }, UPDATE_LOG_ACTION_FEEDBACK_DURATION_MS);
692
+ }
693
+
694
+ async function fetchUpdateLogResponse(): Promise<Response> {
695
+ const response = await fetch('/api/admin/update/log', { cache: 'no-store' });
696
+ if (!response.ok) {
697
+ const errorPayload = (await response.json().catch(() => null)) as { readonly error?: string } | null;
698
+ throw new Error(errorPayload?.error || 'Failed to load the self-update log file.');
699
+ }
700
+ return response;
701
+ }
702
+
703
+ async function handleCopyLog(): Promise<void> {
704
+ if (isCopying || isDownloading) {
705
+ return;
706
+ }
707
+
708
+ try {
709
+ setIsCopying(true);
710
+ setActionErrorMessage(null);
711
+ if (!navigator.clipboard?.writeText) {
712
+ throw new Error('The browser clipboard API is unavailable in this context.');
713
+ }
714
+ const response = await fetchUpdateLogResponse();
715
+ const logContent = await response.text();
716
+ await navigator.clipboard.writeText(logContent);
717
+ showActionFeedback('Self-update log copied to clipboard.');
718
+ } catch (error) {
719
+ setActionErrorMessage(error instanceof Error ? error.message : 'Failed to copy the self-update log.');
720
+ } finally {
721
+ setIsCopying(false);
722
+ }
723
+ }
724
+
725
+ async function handleDownloadLog(): Promise<void> {
726
+ if (isCopying || isDownloading) {
727
+ return;
728
+ }
729
+
730
+ try {
731
+ setIsDownloading(true);
732
+ setActionErrorMessage(null);
733
+ const response = await fetchUpdateLogResponse();
734
+ const logFilename =
735
+ parseFilenameFromContentDisposition(response.headers.get('Content-Disposition')) ||
736
+ DEFAULT_UPDATE_LOG_DOWNLOAD_FILENAME;
737
+ const logBlob = await response.blob();
738
+ downloadBlob(logBlob, logFilename);
739
+ showActionFeedback(`Saved self-update log as ${logFilename}.`);
740
+ } catch (error) {
741
+ setActionErrorMessage(error instanceof Error ? error.message : 'Failed to download the self-update log.');
742
+ } finally {
743
+ setIsDownloading(false);
744
+ }
745
+ }
746
+
747
+ return (
748
+ <div className="flex flex-wrap items-center gap-3 rounded-xl border border-rose-200 bg-rose-50/40 px-4 py-3 text-sm text-rose-700">
749
+ <span className="font-medium">Share the log with the developers:</span>
750
+ <button
751
+ type="button"
752
+ onClick={() => void handleCopyLog()}
753
+ disabled={isCopying || isDownloading}
754
+ className="inline-flex items-center gap-2 rounded-md border border-rose-200 bg-white px-3 py-1.5 text-xs font-semibold text-rose-700 hover:bg-rose-100 disabled:cursor-not-allowed disabled:opacity-60"
755
+ >
756
+ {isCopying ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <ClipboardCopy className="h-3.5 w-3.5" />}
757
+ Copy log
758
+ </button>
759
+ <button
760
+ type="button"
761
+ onClick={() => void handleDownloadLog()}
762
+ disabled={isCopying || isDownloading}
763
+ className="inline-flex items-center gap-2 rounded-md border border-rose-200 bg-white px-3 py-1.5 text-xs font-semibold text-rose-700 hover:bg-rose-100 disabled:cursor-not-allowed disabled:opacity-60"
764
+ >
765
+ {isDownloading ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <FileDown className="h-3.5 w-3.5" />}
766
+ Download log
767
+ </button>
768
+ {actionFeedback && (
769
+ <span className="text-xs text-rose-600" role="status" aria-live="polite">
770
+ {actionFeedback}
771
+ </span>
772
+ )}
773
+ {actionErrorMessage && (
774
+ <span className="text-xs text-rose-700" role="alert">
775
+ {actionErrorMessage}
776
+ </span>
777
+ )}
778
+ </div>
779
+ );
780
+ }
781
+
782
+ /**
783
+ * Collapsible advanced panel for overriding the upstream repository URL.
784
+ *
785
+ * @private internal component of `<UpdateClient/>`
786
+ */
787
+ function AdvancedOriginRepositoryPanel({
788
+ originRepositoryUrlOverride,
789
+ onChange,
790
+ overview,
791
+ isExpanded,
792
+ onToggleExpanded,
793
+ isDisabled,
794
+ }: {
795
+ readonly originRepositoryUrlOverride: string;
796
+ readonly onChange: (nextValue: string) => void;
797
+ readonly overview: UpdateOverview | null;
798
+ readonly isExpanded: boolean;
799
+ readonly onToggleExpanded: () => void;
800
+ readonly isDisabled: boolean;
801
+ }) {
802
+ return (
803
+ <div className="rounded-xl border border-slate-200 bg-white">
804
+ <button
805
+ type="button"
806
+ onClick={onToggleExpanded}
807
+ className="flex w-full items-center justify-between gap-3 px-4 py-3 text-sm font-semibold text-slate-700"
808
+ >
809
+ <span className="inline-flex items-center gap-2">
810
+ <Settings2 className="h-4 w-4" />
811
+ Advanced
812
+ </span>
813
+ {isExpanded ? <ChevronUp className="h-4 w-4" /> : <ChevronDown className="h-4 w-4" />}
814
+ </button>
815
+ {isExpanded && (
816
+ <div className="space-y-3 border-t border-slate-100 px-4 py-3 text-sm text-slate-600">
817
+ <label className="block">
818
+ <span className="text-xs font-semibold uppercase tracking-wide text-slate-500">
819
+ Upstream repository URL
820
+ </span>
821
+ <input
822
+ type="url"
823
+ value={originRepositoryUrlOverride}
824
+ onChange={(event) => onChange(event.target.value)}
825
+ disabled={isDisabled}
826
+ placeholder={overview?.defaultOriginRepositoryUrl || ''}
827
+ className="mt-1 w-full rounded-md border border-slate-300 bg-white px-3 py-2 font-mono text-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500 disabled:cursor-not-allowed disabled:opacity-60"
828
+ />
829
+ </label>
830
+ <p className="text-xs text-slate-500">
831
+ Defaults to <span className="font-mono">{overview?.defaultOriginRepositoryUrl}</span>. Only
832
+ change this if you self-host a fork of the original Promptbook repository — the new value is
833
+ persisted in the standalone VPS <code>.env</code>.
834
+ </p>
835
+ {overview && !overview.isOriginRepositoryDefault && (
836
+ <div className="rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800">
837
+ <strong>Custom origin active:</strong> updates currently pull from{' '}
838
+ <span className="font-mono">{overview.originRepositoryUrl}</span>.
839
+ </div>
840
+ )}
841
+ </div>
842
+ )}
843
+ </div>
844
+ );
845
+ }
846
+
847
+ /**
848
+ * Builds the "behind by …" label combining commits-behind and time-behind info.
849
+ *
850
+ * @param overview - Current overview snapshot.
851
+ * @param language - Active UI language for moment localization.
852
+ * @returns Human-readable label or fallback text.
853
+ */
854
+ function buildDeploymentDriftLabel(overview: UpdateOverview | null, language: ServerLanguageCode): string {
855
+ if (!overview) {
856
+ return 'New commit available';
857
+ }
858
+
859
+ const commitsBehindLabel =
860
+ overview.commitsBehindCount !== null && overview.commitsBehindCount > 0
861
+ ? `${overview.commitsBehindCount} commit${overview.commitsBehindCount === 1 ? '' : 's'} behind`
862
+ : 'New commit available';
863
+
864
+ const timeBehindLabel = buildDeploymentTimeBehindLabel(overview, language);
865
+ if (!timeBehindLabel) {
866
+ return commitsBehindLabel;
867
+ }
868
+
869
+ return `${commitsBehindLabel} · ${timeBehindLabel}`;
870
+ }
871
+
872
+ /**
873
+ * Builds the localized time-behind portion of the deployment drift label (e.g. `3 days behind`).
874
+ *
875
+ * @param overview - Current overview snapshot.
876
+ * @param language - Active UI language for moment localization.
877
+ * @returns Time-behind label or empty string when either side of the comparison is missing.
878
+ */
879
+ function buildDeploymentTimeBehindLabel(overview: UpdateOverview | null, language: ServerLanguageCode): string {
880
+ if (!overview?.currentCommitDate || !overview.latestRemoteCommitDate) {
881
+ return '';
882
+ }
883
+
884
+ const currentMoment = createServerLanguageMoment(overview.currentCommitDate, language);
885
+ const latestMoment = createServerLanguageMoment(overview.latestRemoteCommitDate, language);
886
+ if (!currentMoment.isValid() || !latestMoment.isValid()) {
887
+ return '';
432
888
  }
433
889
 
434
- return `${date.toLocaleString()} (${value})`;
890
+ return `${currentMoment.from(latestMoment, true)} behind`;
891
+ }
892
+
893
+ /**
894
+ * Builds the success message for a finished standalone VPS update.
895
+ *
896
+ * @param job - Completed update job snapshot.
897
+ * @returns Human-readable success message.
898
+ */
899
+ function getUpdateJobSuccessMessage(job: UpdateJobSnapshot): string {
900
+ return job.currentStep || 'Standalone VPS update finished successfully.';
901
+ }
902
+
903
+ /**
904
+ * Builds the failure message for a failed standalone VPS update.
905
+ *
906
+ * @param job - Failed update job snapshot.
907
+ * @returns Human-readable failure message.
908
+ */
909
+ function getUpdateJobFailureMessage(job: UpdateJobSnapshot): string {
910
+ return job.errorMessage || 'The standalone VPS update failed. Review the installer log for details.';
911
+ }
912
+
913
+ /**
914
+ * Formats optional timestamps for the status cards using `moment.js` with the active UI language.
915
+ *
916
+ * @param value - ISO timestamp or `null`.
917
+ * @param language - Active UI language code.
918
+ * @returns Localized human-friendly timestamp or fallback text.
919
+ */
920
+ function formatHumanReadableTimestamp(value: string | null | undefined, language: ServerLanguageCode): string {
921
+ return formatServerLanguageHumanReadableDate(value, language, {
922
+ fallbackLabel: 'Not available',
923
+ isExactDateIncluded: true,
924
+ });
435
925
  }