cptr 0.1.6__tar.gz → 0.1.7__tar.gz

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 (189) hide show
  1. {cptr-0.1.6 → cptr-0.1.7}/CHANGELOG.md +6 -0
  2. {cptr-0.1.6 → cptr-0.1.7}/PKG-INFO +1 -1
  3. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/package.json +1 -1
  4. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/apis/chat.ts +2 -0
  5. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/ChatPanel.svelte +22 -5
  6. {cptr-0.1.6 → cptr-0.1.7}/cptr/routers/chat.py +10 -1
  7. {cptr-0.1.6 → cptr-0.1.7}/pyproject.toml +1 -1
  8. {cptr-0.1.6 → cptr-0.1.7}/.dockerignore +0 -0
  9. {cptr-0.1.6 → cptr-0.1.7}/.github/pull_request_template.md +0 -0
  10. {cptr-0.1.6 → cptr-0.1.7}/.github/workflows/docker.yml +0 -0
  11. {cptr-0.1.6 → cptr-0.1.7}/.github/workflows/pypi.yml +0 -0
  12. {cptr-0.1.6 → cptr-0.1.7}/.github/workflows/release.yml +0 -0
  13. {cptr-0.1.6 → cptr-0.1.7}/.gitignore +0 -0
  14. {cptr-0.1.6 → cptr-0.1.7}/.python-version +0 -0
  15. {cptr-0.1.6 → cptr-0.1.7}/CONTRIBUTOR_LICENSE_AGREEMENT +0 -0
  16. {cptr-0.1.6 → cptr-0.1.7}/Dockerfile +0 -0
  17. {cptr-0.1.6 → cptr-0.1.7}/LICENSE +0 -0
  18. {cptr-0.1.6 → cptr-0.1.7}/MANIFESTO.md +0 -0
  19. {cptr-0.1.6 → cptr-0.1.7}/README.md +0 -0
  20. {cptr-0.1.6 → cptr-0.1.7}/cptr/__init__.py +0 -0
  21. {cptr-0.1.6 → cptr-0.1.7}/cptr/app.py +0 -0
  22. {cptr-0.1.6 → cptr-0.1.7}/cptr/cli.py +0 -0
  23. {cptr-0.1.6 → cptr-0.1.7}/cptr/env.py +0 -0
  24. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/.gitignore +0 -0
  25. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/.npmrc +0 -0
  26. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/.prettierignore +0 -0
  27. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/.prettierrc +0 -0
  28. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/README.md +0 -0
  29. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/package-lock.json +0 -0
  30. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/app.css +0 -0
  31. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/app.d.ts +0 -0
  32. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/app.html +0 -0
  33. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/apis/admin.ts +0 -0
  34. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/apis/auth.ts +0 -0
  35. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/apis/files.ts +0 -0
  36. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/apis/git.ts +0 -0
  37. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/apis/index.ts +0 -0
  38. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/apis/state.ts +0 -0
  39. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/apis/terminal.ts +0 -0
  40. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/apis/uploads.ts +0 -0
  41. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/assets/favicon.svg +0 -0
  42. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Admin/Connections.svelte +0 -0
  43. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Admin/CreateConnectionModal.svelte +0 -0
  44. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Admin/CreateUserModal.svelte +0 -0
  45. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Admin/EditConnectionModal.svelte +0 -0
  46. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Admin/EditUserModal.svelte +0 -0
  47. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Admin/Settings.svelte +0 -0
  48. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Admin/Users.svelte +0 -0
  49. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/AdminPanel.svelte +0 -0
  50. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/AuthScreen.svelte +0 -0
  51. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Bar.svelte +0 -0
  52. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/ChangelogModal.svelte +0 -0
  53. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Collapsible.svelte +0 -0
  54. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/DirectoryPicker.svelte +0 -0
  55. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/DropdownMenu.svelte +0 -0
  56. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/FileBrowser.svelte +0 -0
  57. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/FileEditor.svelte +0 -0
  58. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/GitBar.svelte +0 -0
  59. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/GitView.svelte +0 -0
  60. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/GroupTabBar.svelte +0 -0
  61. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Icon.svelte +0 -0
  62. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/KeyPill.svelte +0 -0
  63. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Modal.svelte +0 -0
  64. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/PortNotification.svelte +0 -0
  65. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/PortPreview.svelte +0 -0
  66. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/QuickOpen.svelte +0 -0
  67. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/SaveDialog.svelte +0 -0
  68. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Settings/About.svelte +0 -0
  69. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Settings/Account.svelte +0 -0
  70. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Settings/General.svelte +0 -0
  71. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Settings/Keyboard.svelte +0 -0
  72. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/SettingsModal.svelte +0 -0
  73. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/ShortcutBar.svelte +0 -0
  74. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Sidebar.svelte +0 -0
  75. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/SystemInfo.svelte +0 -0
  76. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/Terminal.svelte +0 -0
  77. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/ToggleSwitch.svelte +0 -0
  78. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/AssistantMessage.svelte +0 -0
  79. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/AttachButton.svelte +0 -0
  80. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/ChatHistory.svelte +0 -0
  81. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/ChatInput.svelte +0 -0
  82. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/DictateButton.svelte +0 -0
  83. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/FileMention.ts +0 -0
  84. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/FileSuggestionPopup.svelte +0 -0
  85. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/ModelSelector.svelte +0 -0
  86. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/OutputEditView.svelte +0 -0
  87. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/PlusMenu.svelte +0 -0
  88. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/QueuedMessageItem.svelte +0 -0
  89. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/SendButton.svelte +0 -0
  90. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/chat/UserMessage.svelte +0 -0
  91. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/common/Pagination.svelte +0 -0
  92. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/markdown/BlockRenderer.svelte +0 -0
  93. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/markdown/CodeBlock.svelte +0 -0
  94. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/markdown/EditorToolbar.svelte +0 -0
  95. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/markdown/InlineRenderer.svelte +0 -0
  96. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/markdown/MarkdownRenderer.svelte +0 -0
  97. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/markdown/MermaidBlock.svelte +0 -0
  98. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/markdown/RichTextEditor.svelte +0 -0
  99. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/preview/CsvTable.svelte +0 -0
  100. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/preview/HtmlPreview.svelte +0 -0
  101. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/preview/ImagePreview.svelte +0 -0
  102. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/preview/JsonTreeView.svelte +0 -0
  103. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/preview/OfficePreview.svelte +0 -0
  104. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/preview/PDFViewer.svelte +0 -0
  105. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/preview/SqliteView.svelte +0 -0
  106. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/components/preview/SvgPreview.svelte +0 -0
  107. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/i18n/index.ts +0 -0
  108. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/i18n/locales/de.json +0 -0
  109. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/i18n/locales/en.json +0 -0
  110. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/i18n/locales/es.json +0 -0
  111. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/i18n/locales/fr.json +0 -0
  112. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/i18n/locales/ja.json +0 -0
  113. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/i18n/locales/ko.json +0 -0
  114. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/i18n/locales/pt-BR.json +0 -0
  115. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/i18n/locales/ru.json +0 -0
  116. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/i18n/locales/zh-CN.json +0 -0
  117. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/i18n/locales/zh-TW.json +0 -0
  118. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/index.ts +0 -0
  119. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/session.ts +0 -0
  120. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/stores/chat.ts +0 -0
  121. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/stores/gitStatus.svelte.ts +0 -0
  122. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/stores/keybindings.ts +0 -0
  123. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/stores/socket.svelte.ts +0 -0
  124. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/stores/systemEvents.svelte.ts +0 -0
  125. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/stores.ts +0 -0
  126. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/tooltip.ts +0 -0
  127. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/lib/utils/fileIcon.ts +0 -0
  128. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/routes/+layout.svelte +0 -0
  129. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/routes/+layout.ts +0 -0
  130. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/src/routes/+page.svelte +0 -0
  131. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/static/favicon.ico +0 -0
  132. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/static/favicon.png +0 -0
  133. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/static/favicon.svg +0 -0
  134. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/static/icon-192.png +0 -0
  135. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/static/icon-512.png +0 -0
  136. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/static/manifest.json +0 -0
  137. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/static/robots.txt +0 -0
  138. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/static/user.png +0 -0
  139. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/svelte.config.js +0 -0
  140. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/tsconfig.json +0 -0
  141. {cptr-0.1.6 → cptr-0.1.7}/cptr/frontend/vite.config.ts +0 -0
  142. {cptr-0.1.6 → cptr-0.1.7}/cptr/migrations/env.py +0 -0
  143. {cptr-0.1.6 → cptr-0.1.7}/cptr/migrations/script.py.mako +0 -0
  144. {cptr-0.1.6 → cptr-0.1.7}/cptr/migrations/versions/0001_initial.py +0 -0
  145. {cptr-0.1.6 → cptr-0.1.7}/cptr/models/__init__.py +0 -0
  146. {cptr-0.1.6 → cptr-0.1.7}/cptr/models/base.py +0 -0
  147. {cptr-0.1.6 → cptr-0.1.7}/cptr/models/chats.py +0 -0
  148. {cptr-0.1.6 → cptr-0.1.7}/cptr/models/config.py +0 -0
  149. {cptr-0.1.6 → cptr-0.1.7}/cptr/models/files.py +0 -0
  150. {cptr-0.1.6 → cptr-0.1.7}/cptr/models/users.py +0 -0
  151. {cptr-0.1.6 → cptr-0.1.7}/cptr/models/workspaces.py +0 -0
  152. {cptr-0.1.6 → cptr-0.1.7}/cptr/routers/__init__.py +0 -0
  153. {cptr-0.1.6 → cptr-0.1.7}/cptr/routers/admin.py +0 -0
  154. {cptr-0.1.6 → cptr-0.1.7}/cptr/routers/auth.py +0 -0
  155. {cptr-0.1.6 → cptr-0.1.7}/cptr/routers/events.py +0 -0
  156. {cptr-0.1.6 → cptr-0.1.7}/cptr/routers/files.py +0 -0
  157. {cptr-0.1.6 → cptr-0.1.7}/cptr/routers/git.py +0 -0
  158. {cptr-0.1.6 → cptr-0.1.7}/cptr/routers/proxy.py +0 -0
  159. {cptr-0.1.6 → cptr-0.1.7}/cptr/routers/state.py +0 -0
  160. {cptr-0.1.6 → cptr-0.1.7}/cptr/routers/terminal.py +0 -0
  161. {cptr-0.1.6 → cptr-0.1.7}/cptr/routers/uploads.py +0 -0
  162. {cptr-0.1.6 → cptr-0.1.7}/cptr/routers/workspace.py +0 -0
  163. {cptr-0.1.6 → cptr-0.1.7}/cptr/socket/__init__.py +0 -0
  164. {cptr-0.1.6 → cptr-0.1.7}/cptr/socket/main.py +0 -0
  165. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/__init__.py +0 -0
  166. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/ai.py +0 -0
  167. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/changelog.py +0 -0
  168. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/chat_export.py +0 -0
  169. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/chat_task.py +0 -0
  170. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/config.py +0 -0
  171. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/crypto.py +0 -0
  172. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/db.py +0 -0
  173. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/git.py +0 -0
  174. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/json_parser.py +0 -0
  175. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/proxy_middleware.py +0 -0
  176. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/storage.py +0 -0
  177. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/terminal.py +0 -0
  178. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/tools.py +0 -0
  179. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/web/__init__.py +0 -0
  180. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/web/brave.py +0 -0
  181. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/web/duckduckgo.py +0 -0
  182. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/web/exa.py +0 -0
  183. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/web/reader.py +0 -0
  184. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/web/search.py +0 -0
  185. {cptr-0.1.6 → cptr-0.1.7}/cptr/utils/web/tavily.py +0 -0
  186. {cptr-0.1.6 → cptr-0.1.7}/demo.png +0 -0
  187. {cptr-0.1.6 → cptr-0.1.7}/dev.sh +0 -0
  188. {cptr-0.1.6 → cptr-0.1.7}/package.json +0 -0
  189. {cptr-0.1.6 → cptr-0.1.7}/uv.lock +0 -0
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.1.7] - 2026-06-07
9
+
10
+ ### Fixed
11
+
12
+ - 🔄 **Messages no longer disappear after sending.** Fixed a race condition where the frontend needed a separate GET request after sending a message, creating a window where socket events were dropped. The POST now returns the created messages directly, eliminating the round-trip and the race.
13
+
8
14
  ## [0.1.6] - 2026-06-07
9
15
 
10
16
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cptr
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: Your computer, from anywhere. Code, manage, and control your machine from the web.
5
5
  License: Open Use License
6
6
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "frontend",
3
3
  "private": true,
4
- "version": "0.1.4",
4
+ "version": "0.1.7",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite dev",
@@ -36,6 +36,8 @@ export interface SendMessageResult {
36
36
  chat_id: string;
37
37
  message_id: string;
38
38
  queued?: boolean;
39
+ user_message?: ChatMessageRow;
40
+ assistant_message?: ChatMessageRow;
39
41
  }
40
42
 
41
43
  // ── Queries ─────────────────────────────────────────────────
@@ -541,8 +541,9 @@
541
541
  created_at: Date.now()
542
542
  }
543
543
  ];
544
- } else {
545
- await loadChat(result.chat_id);
544
+ } else if (result.assistant_message) {
545
+ allMessages = [...allMessages, result.assistant_message];
546
+ currentMessageId = result.message_id;
546
547
  }
547
548
  } catch (e) {
548
549
  console.error('[chat] send (queue) error', e);
@@ -588,7 +589,17 @@
588
589
  undefined,
589
590
  files
590
591
  );
591
- await loadChat(result.chat_id);
592
+
593
+ // Swap optimistic temp msg with real messages from backend.
594
+ chatId = result.chat_id;
595
+ const withoutTemp = allMessages.filter((m) => m.id !== tempId);
596
+ if (result.user_message && result.assistant_message) {
597
+ allMessages = [...withoutTemp, result.user_message, result.assistant_message];
598
+ } else if (result.assistant_message) {
599
+ allMessages = [...withoutTemp, result.assistant_message];
600
+ }
601
+ currentMessageId = result.message_id;
602
+
592
603
  if (isNew && tabId) {
593
604
  updateTab(tabId, result.chat_id, text.slice(0, 40) || 'Chat');
594
605
  }
@@ -737,7 +748,10 @@
737
748
  tool_approval_mode: mode,
738
749
  plan_mode: get(planMode)
739
750
  });
740
- await loadChat(result.chat_id);
751
+ if (result.assistant_message) {
752
+ allMessages = [...allMessages, result.assistant_message];
753
+ currentMessageId = result.message_id;
754
+ }
741
755
  } catch (e) {
742
756
  console.error('[chat] regenerate error', e);
743
757
  }
@@ -777,7 +791,10 @@
777
791
  msg.parent_id,
778
792
  { tool_approval_mode: get(toolApprovalMode), plan_mode: get(planMode) }
779
793
  );
780
- await loadChat(result.chat_id);
794
+ if (result.user_message && result.assistant_message) {
795
+ allMessages = [...allMessages, result.user_message, result.assistant_message];
796
+ currentMessageId = result.message_id;
797
+ }
781
798
  } catch (e) {
782
799
  console.error('[chat] edit-send error', e);
783
800
  }
@@ -423,7 +423,16 @@ async def send_message(body: SendMessageRequest, request: Request):
423
423
  regeneration_prompt=body.regeneration_prompt,
424
424
  )
425
425
 
426
- return {"chat_id": chat.id, "message_id": assistant_msg.id}
426
+ # Return the created messages so the frontend can append them
427
+ # directly — no separate GET needed, no client-side construction.
428
+ resp: dict = {
429
+ "chat_id": chat.id,
430
+ "message_id": assistant_msg.id,
431
+ "assistant_message": _message_dict(assistant_msg),
432
+ }
433
+ if parent_msg is None or parent_msg.role != "user":
434
+ resp["user_message"] = _message_dict(user_msg)
435
+ return resp
427
436
 
428
437
 
429
438
  # ── Approve / reject a pending tool call ────────────────────
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cptr"
3
- version = "0.1.6"
3
+ version = "0.1.7"
4
4
  description = "Your computer, from anywhere. Code, manage, and control your machine from the web."
5
5
  license = {file = "LICENSE"}
6
6
  readme = "README.md"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes