collavre 0.24.0 → 0.25.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 (440) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -1
  3. data/app/assets/stylesheets/collavre/comments_popup.css +165 -99
  4. data/app/assets/stylesheets/collavre/creatives.css +346 -37
  5. data/app/assets/stylesheets/collavre/desktop_setup.css +246 -0
  6. data/app/assets/stylesheets/collavre/gnb.css +64 -3
  7. data/app/assets/stylesheets/collavre/landing.css +108 -3
  8. data/app/assets/stylesheets/collavre/mention_menu.css +32 -0
  9. data/app/assets/stylesheets/collavre/popup.css +14 -0
  10. data/app/assets/stylesheets/collavre/print.css +0 -1
  11. data/app/assets/stylesheets/collavre/search_popup.css +1 -1
  12. data/app/assets/stylesheets/collavre/secret_fields.css +3 -0
  13. data/app/assets/stylesheets/collavre/workspace.css +307 -0
  14. data/app/channels/collavre/agent_channel.rb +14 -21
  15. data/app/channels/collavre/comments_presence_channel.rb +181 -21
  16. data/app/channels/collavre/inbox_badge_channel.rb +7 -1
  17. data/app/components/collavre/inbox/badge_component.rb +6 -13
  18. data/app/components/collavre/progress_filter_component.html.erb +2 -2
  19. data/app/components/collavre/progress_filter_component.rb +20 -0
  20. data/app/controllers/collavre/admin/settings_controller.rb +4 -1
  21. data/app/controllers/collavre/agent_connections_controller.rb +165 -0
  22. data/app/controllers/collavre/agent_gateways_controller.rb +132 -0
  23. data/app/controllers/collavre/agent_provisioning_controller.rb +79 -0
  24. data/app/controllers/collavre/api/v1/agents_controller.rb +45 -97
  25. data/app/controllers/collavre/application_controller.rb +13 -2
  26. data/app/controllers/collavre/comment_read_pointers_controller.rb +69 -40
  27. data/app/controllers/collavre/comments_controller.rb +45 -131
  28. data/app/controllers/collavre/concerns/shareable.rb +9 -3
  29. data/app/controllers/collavre/creatives_controller.rb +144 -11
  30. data/app/controllers/collavre/desktop_gateway_registrations_controller.rb +173 -0
  31. data/app/controllers/collavre/desktop_setup_controller.rb +119 -0
  32. data/app/controllers/collavre/desktop_sidecar_health_controller.rb +35 -0
  33. data/app/controllers/collavre/features_controller.rb +57 -0
  34. data/app/controllers/collavre/invites_controller.rb +12 -1
  35. data/app/controllers/collavre/llm_models_controller.rb +8 -0
  36. data/app/controllers/collavre/notices_controller.rb +20 -0
  37. data/app/controllers/collavre/tasks_controller.rb +40 -6
  38. data/app/controllers/collavre/topics_controller.rb +130 -53
  39. data/app/controllers/collavre/user_creative_preferences_controller.rb +214 -30
  40. data/app/controllers/concerns/collavre/comments/batch_operations.rb +15 -3
  41. data/app/controllers/concerns/collavre/comments/conversion.rb +1 -1
  42. data/app/controllers/concerns/collavre/users_controller/ai_user_management.rb +118 -8
  43. data/app/controllers/concerns/collavre/users_controller/profile_and_settings.rb +1 -15
  44. data/app/controllers/concerns/collavre/users_controller/registration.rb +2 -2
  45. data/app/errors/collavre/turn_deadline_error.rb +20 -0
  46. data/app/helpers/collavre/application_helper.rb +38 -0
  47. data/app/helpers/collavre/creatives_helper.rb +56 -22
  48. data/app/helpers/collavre/navigation_helper.rb +12 -0
  49. data/app/javascript/collavre.js +1 -2
  50. data/app/javascript/components/InlineLexicalEditor.jsx +30 -21
  51. data/app/javascript/components/__tests__/creative_tree_row_parent_id.test.js +32 -2
  52. data/app/javascript/components/__tests__/creative_tree_row_progress_toggle.test.js +185 -0
  53. data/app/javascript/components/creative_tree_row.js +62 -22
  54. data/app/javascript/controllers/__tests__/agent_connection_controller.test.js +195 -0
  55. data/app/javascript/controllers/__tests__/desktop_proxy_setup_controller.test.js +96 -0
  56. data/app/javascript/controllers/__tests__/index.test.js +42 -0
  57. data/app/javascript/controllers/__tests__/last_visited_creative_controller.test.js +103 -0
  58. data/app/javascript/controllers/__tests__/link_creative_controller.test.js +253 -2
  59. data/app/javascript/controllers/__tests__/progress_filter_controller.test.js +134 -0
  60. data/app/javascript/controllers/__tests__/search_popup_controller.test.js +310 -0
  61. data/app/javascript/controllers/__tests__/topic_list_controller.test.js +111 -0
  62. data/app/javascript/controllers/__tests__/workspace_tree_controller.test.js +1011 -0
  63. data/app/javascript/controllers/agent_connection_controller.js +357 -0
  64. data/app/javascript/controllers/agent_vendor_controller.js +23 -0
  65. data/app/javascript/controllers/comment_controller.js +3 -1
  66. data/app/javascript/controllers/comments/__tests__/feature_cards_controller.test.js +223 -0
  67. data/app/javascript/controllers/comments/__tests__/form_controller_default_placeholder.test.js +83 -0
  68. data/app/javascript/controllers/comments/__tests__/form_controller_draft.test.js +2069 -0
  69. data/app/javascript/controllers/comments/__tests__/form_controller_ime_send.test.js +324 -0
  70. data/app/javascript/controllers/comments/__tests__/form_controller_review.test.js +28 -2
  71. data/app/javascript/controllers/comments/__tests__/form_controller_search_submit.test.js +106 -0
  72. data/app/javascript/controllers/comments/__tests__/form_controller_stashed_draft.test.js +134 -0
  73. data/app/javascript/controllers/comments/__tests__/form_controller_stashed_draft_creative_switch.test.js +166 -0
  74. data/app/javascript/controllers/comments/__tests__/form_controller_stashed_draft_failure.test.js +183 -0
  75. data/app/javascript/controllers/comments/__tests__/list_controller_deep_link_topic.test.js +467 -0
  76. data/app/javascript/controllers/comments/__tests__/list_controller_docked.test.js +115 -0
  77. data/app/javascript/controllers/comments/__tests__/list_controller_prev_message.test.js +245 -0
  78. data/app/javascript/controllers/comments/__tests__/list_controller_read_pointer.test.js +276 -0
  79. data/app/javascript/controllers/comments/__tests__/list_controller_stream_archived.test.js +221 -0
  80. data/app/javascript/controllers/comments/__tests__/list_controller_stream_search.test.js +104 -0
  81. data/app/javascript/controllers/comments/__tests__/placeholder_controller.test.js +79 -0
  82. data/app/javascript/controllers/comments/__tests__/popup_controller.test.js +754 -1
  83. data/app/javascript/controllers/comments/__tests__/presence_controller.test.js +717 -15
  84. data/app/javascript/controllers/comments/__tests__/prev_message_navigator.test.js +129 -0
  85. data/app/javascript/controllers/comments/__tests__/topics_controller_action_errors.test.js +184 -0
  86. data/app/javascript/controllers/comments/__tests__/topics_controller_archived.test.js +879 -0
  87. data/app/javascript/controllers/comments/__tests__/topics_controller_creation_container.test.js +154 -0
  88. data/app/javascript/controllers/comments/__tests__/topics_controller_creation_scroll.test.js +92 -0
  89. data/app/javascript/controllers/comments/__tests__/topics_controller_delete.test.js +130 -0
  90. data/app/javascript/controllers/comments/__tests__/topics_controller_docked.test.js +32 -0
  91. data/app/javascript/controllers/comments/__tests__/topics_controller_last_topic_echo.test.js +1938 -0
  92. data/app/javascript/controllers/comments/__tests__/topics_controller_primary_agent.test.js +256 -0
  93. data/app/javascript/controllers/comments/__tests__/topics_controller_scroll.test.js +182 -0
  94. data/app/javascript/controllers/comments/__tests__/topics_controller_selection_race.test.js +981 -0
  95. data/app/javascript/controllers/comments/__tests__/topics_controller_topic_list.test.js +313 -0
  96. data/app/javascript/controllers/comments/feature_cards_controller.js +83 -0
  97. data/app/javascript/controllers/comments/form_controller.js +795 -14
  98. data/app/javascript/controllers/comments/list_controller.js +338 -52
  99. data/app/javascript/controllers/comments/placeholder_controller.js +30 -0
  100. data/app/javascript/controllers/comments/popup_controller.js +425 -83
  101. data/app/javascript/controllers/comments/presence_controller.js +317 -55
  102. data/app/javascript/controllers/comments/prev_message_navigator.js +94 -0
  103. data/app/javascript/controllers/comments/topics_controller.js +1772 -100
  104. data/app/javascript/controllers/common_popup_controller.js +2 -2
  105. data/app/javascript/controllers/creatives/__tests__/select_mode_controller.test.js +139 -0
  106. data/app/javascript/controllers/creatives/__tests__/tree_controller.test.js +605 -0
  107. data/app/javascript/controllers/creatives/__tests__/write_access_request_controller.test.js +125 -0
  108. data/app/javascript/controllers/creatives/select_mode_controller.js +7 -2
  109. data/app/javascript/controllers/creatives/tree_controller.js +140 -31
  110. data/app/javascript/controllers/creatives/write_access_request_controller.js +58 -0
  111. data/app/javascript/controllers/desktop_proxy_setup_controller.js +51 -0
  112. data/app/javascript/controllers/gateway_check_controller.js +36 -0
  113. data/app/javascript/controllers/index.js +25 -1
  114. data/app/javascript/controllers/last_visited_creative_controller.js +58 -0
  115. data/app/javascript/controllers/link_creative_controller.js +89 -18
  116. data/app/javascript/controllers/progress_filter_controller.js +12 -22
  117. data/app/javascript/controllers/search_popup_controller.js +64 -46
  118. data/app/javascript/controllers/share_user_search_controller.js +2 -2
  119. data/app/javascript/controllers/topic_list_controller.js +44 -7
  120. data/app/javascript/controllers/workspace_tree_controller.js +662 -0
  121. data/app/javascript/creatives/__tests__/tree_renderer.test.js +80 -0
  122. data/app/javascript/creatives/drag_drop/__tests__/drop_completion_empty_state.test.js +98 -0
  123. data/app/javascript/creatives/drag_drop/__tests__/topic_move_released_agent.test.js +125 -0
  124. data/app/javascript/creatives/drag_drop/event_handlers.js +12 -0
  125. data/app/javascript/creatives/tree_renderer.js +65 -22
  126. data/app/javascript/lib/__tests__/chat_drafts.test.js +1458 -0
  127. data/app/javascript/lib/__tests__/common_popup_bounds.test.js +8 -3
  128. data/app/javascript/lib/__tests__/common_popup_placement.test.js +374 -0
  129. data/app/javascript/lib/__tests__/common_popup_reshow.test.js +131 -0
  130. data/app/javascript/lib/__tests__/creative_link_prefetch.test.js +46 -0
  131. data/app/javascript/lib/__tests__/last_visited_creative.test.js +87 -0
  132. data/app/javascript/lib/__tests__/skill_html_entities.test.js +23 -0
  133. data/app/javascript/lib/__tests__/turbo_stream_actions.test.js +190 -0
  134. data/app/javascript/lib/api/__tests__/creatives.test.js +68 -0
  135. data/app/javascript/lib/api/__tests__/csrf_fetch.test.js +27 -0
  136. data/app/javascript/lib/api/__tests__/topics_save_last_topic.test.js +112 -0
  137. data/app/javascript/lib/api/creatives.js +32 -13
  138. data/app/javascript/lib/api/csrf_fetch.js +6 -4
  139. data/app/javascript/lib/api/topics.js +63 -5
  140. data/app/javascript/lib/chat_drafts.js +786 -0
  141. data/app/javascript/lib/common_popup.js +164 -25
  142. data/app/javascript/lib/creative_link_prefetch.js +27 -0
  143. data/app/javascript/lib/last_visited_creative.js +97 -0
  144. data/app/javascript/lib/lexical/__tests__/creative_link_node.test.js +162 -0
  145. data/app/javascript/lib/lexical/__tests__/creative_link_trigger.test.js +133 -0
  146. data/app/javascript/lib/lexical/__tests__/link_toolbar.test.js +62 -0
  147. data/app/javascript/lib/lexical/creative_link_node.js +101 -0
  148. data/app/javascript/lib/lexical/creative_link_trigger.js +98 -0
  149. data/app/javascript/lib/lexical/link_toolbar.js +23 -0
  150. data/app/javascript/lib/turbo_stream_actions.js +23 -16
  151. data/app/javascript/lib/utils/__tests__/filter_navigation.test.js +210 -0
  152. data/app/javascript/lib/utils/__tests__/markdown.test.js +44 -0
  153. data/app/javascript/lib/utils/filter_navigation.js +100 -0
  154. data/app/javascript/modules/__tests__/command_menu_creative_picker.test.js +62 -0
  155. data/app/javascript/modules/__tests__/command_menu_typeahead.test.js +267 -0
  156. data/app/javascript/modules/__tests__/creative_link_picker.test.js +85 -0
  157. data/app/javascript/modules/__tests__/creative_row_editor_archive.test.js +391 -0
  158. data/app/javascript/modules/__tests__/creative_row_editor_delegated_clicks.test.js +158 -0
  159. data/app/javascript/modules/__tests__/creative_row_editor_empty_state_recovery.test.js +519 -0
  160. data/app/javascript/modules/__tests__/creative_row_editor_empty_state_removal.test.js +346 -0
  161. data/app/javascript/modules/__tests__/creative_row_editor_session.test.js +144 -0
  162. data/app/javascript/modules/__tests__/creative_tree_dom.test.js +30 -0
  163. data/app/javascript/modules/__tests__/creative_tree_empty_state.test.js +186 -0
  164. data/app/javascript/modules/__tests__/dom_listener_registry.test.js +67 -0
  165. data/app/javascript/modules/__tests__/support/inline_editor_dom.js +159 -0
  166. data/app/javascript/modules/command_args_form.js +0 -12
  167. data/app/javascript/modules/command_menu.js +80 -38
  168. data/app/javascript/modules/creative_link_picker.js +56 -0
  169. data/app/javascript/modules/creative_row_editor.js +446 -243
  170. data/app/javascript/modules/creative_row_editor_delegated_clicks.js +87 -0
  171. data/app/javascript/modules/creative_tree_dom.js +4 -0
  172. data/app/javascript/modules/creative_tree_empty_state.js +80 -0
  173. data/app/javascript/modules/dom_listener_registry.js +23 -0
  174. data/app/javascript/modules/mention_menu.js +2 -3
  175. data/app/javascript/utils/__tests__/caret_anchor.test.js +75 -0
  176. data/app/javascript/utils/__tests__/chevron_icons.test.js +15 -0
  177. data/app/javascript/utils/caret_position.js +10 -0
  178. data/app/javascript/utils/chevron_icons.js +7 -0
  179. data/app/jobs/collavre/ai_agent_job.rb +262 -72
  180. data/app/jobs/collavre/cancel_offline_delegated_tasks_job.rb +11 -36
  181. data/app/jobs/collavre/comment_badges_broadcast_job.rb +28 -0
  182. data/app/jobs/collavre/comment_link_preview_job.rb +33 -0
  183. data/app/jobs/collavre/comment_notification_job.rb +14 -0
  184. data/app/jobs/collavre/comment_push_delivery_sweep_job.rb +17 -0
  185. data/app/jobs/collavre/compress_job.rb +33 -22
  186. data/app/jobs/collavre/creative_broadcast_job.rb +161 -48
  187. data/app/jobs/collavre/cron_action_job.rb +36 -18
  188. data/app/jobs/collavre/drop_trigger_job.rb +23 -9
  189. data/app/jobs/collavre/merge_comments_job.rb +33 -16
  190. data/app/jobs/collavre/push_notification_job.rb +62 -18
  191. data/app/jobs/collavre/restore_dropped_dispatches_job.rb +17 -0
  192. data/app/jobs/collavre/stuck_detector_job.rb +1 -1
  193. data/app/jobs/collavre/touch_creative_subtree_job.rb +14 -0
  194. data/app/models/collavre/agent_gateway.rb +200 -0
  195. data/app/models/collavre/agent_subscription.rb +4 -4
  196. data/app/models/collavre/agent_workspace.rb +210 -0
  197. data/app/models/collavre/comment/broadcastable.rb +22 -52
  198. data/app/models/collavre/comment/notifiable.rb +154 -77
  199. data/app/models/collavre/comment/topic_membership.rb +41 -0
  200. data/app/models/collavre/comment.rb +336 -31
  201. data/app/models/collavre/comment_notification_delivery.rb +61 -0
  202. data/app/models/collavre/comment_presence_store/cache_batches.rb +64 -0
  203. data/app/models/collavre/comment_presence_store.rb +272 -12
  204. data/app/models/collavre/comment_read_pointer.rb +9 -15
  205. data/app/models/collavre/creative/describable.rb +8 -2
  206. data/app/models/collavre/creative/permissible.rb +11 -0
  207. data/app/models/collavre/creative.rb +29 -4
  208. data/app/models/collavre/creative_share.rb +109 -4
  209. data/app/models/collavre/current.rb +1 -0
  210. data/app/models/collavre/llm_model.rb +62 -0
  211. data/app/models/collavre/system_setting.rb +12 -1
  212. data/app/models/collavre/task.rb +121 -2
  213. data/app/models/collavre/topic.rb +51 -0
  214. data/app/models/collavre/user.rb +101 -41
  215. data/app/models/collavre/user_creative_preference.rb +3 -1
  216. data/app/services/collavre/agent_provisioning/archive.rb +108 -0
  217. data/app/services/collavre/ai_agent/a2a_dispatcher.rb +16 -3
  218. data/app/services/collavre/ai_agent/agent_lifecycle_manager.rb +63 -6
  219. data/app/services/collavre/ai_agent/approval_handler.rb +12 -4
  220. data/app/services/collavre/ai_agent/claude_channel_adapter.rb +10 -5
  221. data/app/services/collavre/ai_agent/merged_trigger_comments.rb +164 -0
  222. data/app/services/collavre/ai_agent/message_builder.rb +103 -16
  223. data/app/services/collavre/ai_agent/session_provisioner.rb +3 -7
  224. data/app/services/collavre/ai_agent/task_claim_service.rb +29 -15
  225. data/app/services/collavre/ai_agent/task_reply_service.rb +67 -0
  226. data/app/services/collavre/ai_agent_service.rb +108 -20
  227. data/app/services/collavre/ai_client.rb +211 -21
  228. data/app/services/collavre/cli_proxy/client.rb +147 -0
  229. data/app/services/collavre/cli_proxy/endpoint_policy.rb +81 -0
  230. data/app/services/collavre/cli_proxy/identity.rb +47 -0
  231. data/app/services/collavre/cli_proxy/safe_net_http_adapter.rb +19 -0
  232. data/app/services/collavre/command_menu_service.rb +0 -10
  233. data/app/services/collavre/comment_move_service.rb +96 -7
  234. data/app/services/collavre/comment_snapshot_restore_service.rb +11 -5
  235. data/app/services/collavre/comments/action_executor.rb +48 -20
  236. data/app/services/collavre/comments/command_processor.rb +0 -1
  237. data/app/services/collavre/comments/list_response.rb +133 -0
  238. data/app/services/collavre/comments/read_pointer_writer.rb +210 -0
  239. data/app/services/collavre/comments/read_receipt_broadcaster.rb +157 -0
  240. data/app/services/collavre/comments/read_receipt_index.rb +152 -0
  241. data/app/services/collavre/comments/topic_command.rb +72 -1
  242. data/app/services/collavre/comments/topic_mutation.rb +20 -0
  243. data/app/services/collavre/creatives/breadcrumb_resolver.rb +1 -1
  244. data/app/services/collavre/creatives/comment_badge_index.rb +299 -27
  245. data/app/services/collavre/creatives/reorderer.rb +15 -3
  246. data/app/services/collavre/creatives/tree_builder.rb +1 -1
  247. data/app/services/collavre/creatives/tree_formatter.rb +5 -6
  248. data/app/services/collavre/creatives/workspace_path_resolver.rb +50 -0
  249. data/app/services/collavre/creatives/workspace_tree_builder.rb +92 -0
  250. data/app/services/collavre/crons/recurring_topic_tasks.rb +23 -0
  251. data/app/services/collavre/home_page_path.rb +55 -0
  252. data/app/services/collavre/html_text.rb +64 -0
  253. data/app/services/collavre/http_client.rb +11 -2
  254. data/app/services/collavre/inbox_reply_service.rb +1 -1
  255. data/app/services/collavre/markdown_converter.rb +13 -1
  256. data/app/services/collavre/orchestration/agent_orchestrator.rb +776 -81
  257. data/app/services/collavre/orchestration/arbiter.rb +48 -5
  258. data/app/services/collavre/orchestration/deferred_trigger_scope.rb +53 -0
  259. data/app/services/collavre/orchestration/delivery_record.rb +792 -0
  260. data/app/services/collavre/orchestration/loop_breaker.rb +10 -4
  261. data/app/services/collavre/orchestration/matcher.rb +132 -17
  262. data/app/services/collavre/orchestration/policy_resolver.rb +58 -10
  263. data/app/services/collavre/orchestration/scheduler.rb +10 -4
  264. data/app/services/collavre/orchestration/scheduling_hooks.rb +10 -0
  265. data/app/services/collavre/orchestration/selection.rb +43 -0
  266. data/app/services/collavre/orchestration/stuck_detector.rb +25 -112
  267. data/app/services/collavre/orchestration/task_coalescer.rb +355 -0
  268. data/app/services/collavre/orchestration/topic_slot.rb +73 -0
  269. data/app/services/collavre/system_events/context_builder.rb +60 -11
  270. data/app/services/collavre/system_events/dispatcher.rb +58 -12
  271. data/app/services/collavre/system_events/envelope.rb +73 -0
  272. data/app/services/collavre/system_events/vocabulary.rb +45 -0
  273. data/app/services/collavre/tools/creative_retrieval_service.rb +1 -1
  274. data/app/services/collavre/tools/cron_create_service.rb +32 -18
  275. data/app/services/collavre/tools/id_list.rb +38 -0
  276. data/app/services/collavre/tools/topic_authorizer.rb +61 -7
  277. data/app/services/collavre/tools/topic_branch_service.rb +85 -0
  278. data/app/services/collavre/tools/topic_create_service.rb +117 -0
  279. data/app/services/collavre/tools/topic_list_service.rb +101 -0
  280. data/app/services/collavre/tools/topic_message_create_service.rb +192 -0
  281. data/app/services/collavre/tools/topic_messages_service.rb +346 -0
  282. data/app/services/collavre/tools/topic_move_service.rb +108 -0
  283. data/app/services/collavre/tools/topic_selection.rb +59 -0
  284. data/app/services/collavre/tools/topic_update_service.rb +165 -0
  285. data/app/services/collavre/topic_branch_service.rb +39 -10
  286. data/app/services/collavre/topics/agent_resolver.rb +87 -0
  287. data/app/services/collavre/topics/char_budget.rb +70 -0
  288. data/app/services/collavre/topics/last_topic_preference_payload.rb +18 -0
  289. data/app/services/collavre/topics/message_page.rb +380 -0
  290. data/app/services/collavre/topics/message_page_markdown.rb +102 -0
  291. data/app/services/collavre/topics/message_scope.rb +61 -0
  292. data/app/services/collavre/topics/message_stats.rb +92 -0
  293. data/app/services/collavre/topics/move_blocker.rb +47 -0
  294. data/app/services/collavre/topics/next_name.rb +35 -0
  295. data/app/services/collavre/topics/pin_rejection.rb +25 -0
  296. data/app/services/collavre/topics/read_pointer_relocator.rb +71 -0
  297. data/app/services/collavre/topics/reserved_name.rb +18 -0
  298. data/app/services/collavre/topics/serializer.rb +92 -0
  299. data/app/services/collavre/topics/topic_destroy.rb +30 -0
  300. data/app/services/collavre/topics/topic_move.rb +80 -0
  301. data/app/services/collavre/topics/topic_move_effects.rb +35 -0
  302. data/app/services/collavre/topics/topic_mutation.rb +27 -0
  303. data/app/views/collavre/admin/integrations/_setting_row.html.erb +5 -8
  304. data/app/views/collavre/admin/settings/_system_tab.html.erb +7 -0
  305. data/app/views/collavre/agent_connections/show.html.erb +77 -0
  306. data/app/views/collavre/agent_gateways/_form.html.erb +71 -0
  307. data/app/views/collavre/agent_gateways/edit.html.erb +2 -0
  308. data/app/views/collavre/agent_gateways/index.html.erb +54 -0
  309. data/app/views/collavre/agent_gateways/new.html.erb +2 -0
  310. data/app/views/collavre/comments/_comments_popup.html.erb +32 -17
  311. data/app/views/collavre/comments/_empty_state.html.erb +33 -0
  312. data/app/views/collavre/comments/_empty_state_minimal.html.erb +7 -0
  313. data/app/views/collavre/comments/_feature_card.html.erb +35 -0
  314. data/app/views/collavre/comments/_list.html.erb +3 -2
  315. data/app/views/collavre/comments/_no_search_results.html.erb +3 -0
  316. data/app/views/collavre/creatives/_add_button.html.erb +17 -19
  317. data/app/views/collavre/creatives/_empty_state.html.erb +109 -0
  318. data/app/views/collavre/creatives/_inline_edit_form.html.erb +5 -5
  319. data/app/views/collavre/creatives/_tree_loading_placeholder.html.erb +16 -0
  320. data/app/views/collavre/creatives/_workspace_tree.html.erb +33 -0
  321. data/app/views/collavre/creatives/index.html.erb +79 -18
  322. data/app/views/collavre/desktop_setup/show.html.erb +114 -0
  323. data/app/views/collavre/features/index.html.erb +42 -0
  324. data/app/views/collavre/features/show.html.erb +52 -0
  325. data/app/views/collavre/invitation_mailer/invite.html.erb +1 -1
  326. data/app/views/collavre/invitation_mailer/invite.text.erb +1 -1
  327. data/app/views/collavre/invites/show.html.erb +14 -1
  328. data/app/views/collavre/landing/show.html.erb +5 -1
  329. data/app/views/collavre/shared/_link_creative_modal.html.erb +4 -1
  330. data/app/views/collavre/shared/navigation/_help_button.html.erb +3 -1
  331. data/app/views/collavre/shared/navigation/_panels.html.erb +1 -8
  332. data/app/views/collavre/shared/navigation/_search_form.html.erb +13 -2
  333. data/app/views/collavre/user_themes/index.html.erb +1 -1
  334. data/app/views/collavre/users/_llm_fields.html.erb +65 -0
  335. data/app/views/collavre/users/_org_chart_node.html.erb +1 -1
  336. data/app/views/collavre/users/edit_ai.html.erb +33 -31
  337. data/app/views/collavre/users/new.html.erb +4 -2
  338. data/app/views/collavre/users/new_ai.html.erb +14 -32
  339. data/app/views/collavre/users/show.html.erb +13 -1
  340. data/app/views/layouts/collavre/landing.html.erb +9 -4
  341. data/config/initializers/ruby_llm_openai_reasoning_content.rb +77 -0
  342. data/config/locales/admin.en.yml +3 -1
  343. data/config/locales/admin.ko.yml +3 -1
  344. data/config/locales/agent_gateway.en.yml +217 -0
  345. data/config/locales/agent_gateway.ko.yml +217 -0
  346. data/config/locales/ai_agent.en.yml +0 -1
  347. data/config/locales/ai_agent.ko.yml +0 -1
  348. data/config/locales/comments.en.yml +72 -30
  349. data/config/locales/comments.ko.yml +72 -30
  350. data/config/locales/creatives.en.yml +32 -1
  351. data/config/locales/creatives.ko.yml +32 -1
  352. data/config/locales/features.en.yml +140 -0
  353. data/config/locales/features.ko.yml +140 -0
  354. data/config/locales/invites.en.yml +3 -0
  355. data/config/locales/invites.ko.yml +3 -0
  356. data/config/locales/landing.en.yml +2 -1
  357. data/config/locales/landing.ko.yml +2 -1
  358. data/config/locales/tools.en.yml +20 -0
  359. data/config/locales/tools.ko.yml +20 -0
  360. data/config/locales/users.en.yml +15 -14
  361. data/config/locales/users.ko.yml +14 -14
  362. data/config/routes.rb +45 -19
  363. data/db/migrate/20250911084338_backfill_creative_in_comment_inbox_items.rb +9 -1
  364. data/db/migrate/20260724000000_add_creative_id_index_to_comments.rb +34 -0
  365. data/db/migrate/20260724000001_add_creative_private_id_index_to_comments.rb +50 -0
  366. data/db/migrate/20260724090000_add_async_comment_notification_state.rb +64 -0
  367. data/db/migrate/20260727000000_add_waiting_notice_scope_to_comments.rb +30 -0
  368. data/db/migrate/20260727010000_add_waiting_notice_scope_to_tasks.rb +26 -0
  369. data/db/migrate/20260805000000_add_creative_workspace_enabled_to_users.rb +5 -0
  370. data/db/migrate/20260807050000_add_dismissed_notices_to_users.rb +5 -0
  371. data/db/migrate/20260809000000_change_creative_workspace_enabled_default_to_true.rb +18 -0
  372. data/db/migrate/20260809000001_create_llm_models.rb +64 -0
  373. data/db/migrate/20260809000002_create_agent_gateways_and_workspaces.rb +35 -0
  374. data/db/migrate/20260809000003_hash_agent_workspace_callback_tokens.rb +44 -0
  375. data/db/migrate/20260809000004_encrypt_agent_workspace_manifest_tokens.rb +59 -0
  376. data/db/migrate/20260810000000_split_agent_workspace_identity_axes.rb +58 -0
  377. data/db/migrate/20260810000001_seed_codex_custom_proxy_llm_models.rb +28 -0
  378. data/db/migrate/20260810010000_add_last_visited_creative_to_users.rb +8 -0
  379. data/db/migrate/20260810020000_add_last_visited_creative_at_to_users.rb +5 -0
  380. data/db/migrate/20260810030000_add_last_visited_creative_navigation_order_to_users.rb +6 -0
  381. data/db/migrate/20260810060000_add_last_visited_creative_issued_sequence_to_users.rb +5 -0
  382. data/db/migrate/20260810100000_add_desktop_managed_to_agent_gateways.rb +40 -0
  383. data/db/migrate/20260810100001_add_desktop_preset_adapter_to_users.rb +38 -0
  384. data/db/migrate/20260811000000_make_agent_gateway_completion_key_nullable.rb +7 -0
  385. data/db/migrate/20260812000000_remove_workflow_columns_from_tasks.rb +101 -0
  386. data/db/migrate/20260812000001_remove_android_devices.rb +24 -0
  387. data/db/migrate/20260812010000_drop_inbox_items.rb +22 -0
  388. data/db/migrate/20260813000000_clear_claude_channel_presence_routing_expressions.rb +16 -0
  389. data/db/migrate/20260813000001_add_last_topic_revision_to_user_creative_preferences.rb +5 -0
  390. data/db/migrate/20260813000002_add_last_topic_save_order_to_user_creative_preferences.rb +6 -0
  391. data/db/migrate/20260813000003_add_last_topic_save_sequences_to_user_creative_preferences.rb +5 -0
  392. data/db/migrate/20260813000004_add_last_topic_save_fences_to_user_creative_preferences.rb +6 -0
  393. data/db/migrate/20260814000000_add_topic_to_comment_read_pointers.rb +79 -0
  394. data/db/migrate/20260814000001_add_creative_topic_private_id_index_to_comments.rb +37 -0
  395. data/db/migrate/20260816000000_add_watermark_index_to_comment_read_pointers.rb +27 -0
  396. data/db/migrate/20260816000001_add_private_recipient_topic_index_to_comments.rb +48 -0
  397. data/db/migrate/20260820000000_add_topic_assigned_at_to_comments.rb +13 -0
  398. data/db/seeds.rb +1 -51
  399. data/lib/collavre/engine.rb +108 -1
  400. data/lib/collavre/feature_card_registry.rb +168 -0
  401. data/lib/collavre/hashed_access_token_lookup.rb +22 -0
  402. data/lib/collavre/sensitive_request_silencer.rb +23 -0
  403. data/lib/collavre/user_extensions.rb +0 -2
  404. data/lib/collavre/version.rb +1 -1
  405. data/lib/collavre.rb +1 -0
  406. data/skills/collavre/SKILL.md +165 -0
  407. data/skills/collavre/package.json +8 -0
  408. data/skills/collavre/references/tool-reference.md +347 -0
  409. data/skills/collavre/scripts/collavre +634 -0
  410. data/skills/collavre/scripts/html_entities.js +24 -0
  411. metadata +228 -30
  412. data/app/controllers/collavre/api/v1/mobile/agent_events_controller.rb +0 -224
  413. data/app/controllers/collavre/api/v1/mobile/base_controller.rb +0 -95
  414. data/app/controllers/collavre/api/v1/mobile/devices_controller.rb +0 -31
  415. data/app/controllers/collavre/api/v1/mobile/voice_commands_controller.rb +0 -25
  416. data/app/controllers/collavre/inbox_items_controller.rb +0 -70
  417. data/app/controllers/collavre/typo_corrections_controller.rb +0 -39
  418. data/app/javascript/lib/__tests__/typo_correction.test.js +0 -192
  419. data/app/javascript/lib/typo_correction.js +0 -146
  420. data/app/javascript/modules/__tests__/typo_corrector.test.js +0 -365
  421. data/app/javascript/modules/creative_guide.js +0 -67
  422. data/app/javascript/modules/typo_corrector.js +0 -534
  423. data/app/jobs/collavre/inbox_summary_job.rb +0 -24
  424. data/app/mailers/collavre/inbox_mailer.rb +0 -19
  425. data/app/models/collavre/inbox_item.rb +0 -89
  426. data/app/services/collavre/comments/concerns/workflow_support.rb +0 -115
  427. data/app/services/collavre/comments/work_command.rb +0 -161
  428. data/app/services/collavre/comments/workflow_executor.rb +0 -276
  429. data/app/services/collavre/gemini_parent_recommender.rb +0 -77
  430. data/app/services/collavre/mobile/event_summarizer.rb +0 -40
  431. data/app/services/collavre/typo_corrector.rb +0 -188
  432. data/app/views/collavre/inbox_items/_item.html.erb +0 -18
  433. data/app/views/collavre/inbox_items/_items.html.erb +0 -3
  434. data/app/views/collavre/inbox_items/_list.html.erb +0 -7
  435. data/app/views/collavre/inbox_items/index.html.erb +0 -1
  436. data/app/views/collavre/inbox_mailer/daily_summary.html.erb +0 -11
  437. data/app/views/collavre/inbox_mailer/daily_summary.text.erb +0 -8
  438. data/app/views/collavre/users/typo_correction.html.erb +0 -50
  439. data/config/locales/mobile.en.yml +0 -16
  440. data/config/locales/mobile.ko.yml +0 -16
@@ -2,6 +2,15 @@
2
2
  en:
3
3
  collavre:
4
4
  creatives:
5
+ workspace:
6
+ tree_title: Creative tree
7
+ tree_label: Creative navigation tree
8
+ toggle_tree: Toggle creative tree
9
+ empty: No creatives with children found.
10
+ load_error: Could not load the creative tree.
11
+ select_chat: Select a creative to view its chat.
12
+ collapse_chat: Collapse chat
13
+ expand_chat: Expand chat
5
14
  index:
6
15
  up: Up
7
16
  new_creative: Add
@@ -44,10 +53,29 @@ en:
44
53
  no_creatives: No creatives found.
45
54
  no_sub_creatives: No sub-creatives found.
46
55
  no_search_results: No creatives match your search.
56
+ load_error: Could not load the creative tree.
57
+ loading_creatives: Loading creatives
58
+ empty_state_heading_root: No creatives yet
59
+ empty_state_heading_sub: No sub-creatives yet
60
+ empty_state_concept_title: "💡 What's a creative?"
61
+ empty_state_facet_doc: Tree-structured document piece
62
+ empty_state_facet_task: Actionable task
63
+ empty_state_facet_chat: Discussion channel
64
+ empty_state_block_label: One creative block
65
+ empty_state_concept_caption: One block plays all three roles — document, task, and conversation. Stacked as a tree, it becomes a document-shaped project with automatic progress rollup.
66
+ empty_state_add_creative: Add creative
67
+ empty_state_add_sub_creative: Add sub-creative
68
+ empty_state_add_shortcut: Enter
69
+ empty_state_readonly_message: You don't have write access to add sub-creatives here.
70
+ empty_state_request_pending: Access requested · awaiting owner approval
71
+ empty_state_request_failed: Could not request access. Please try again.
72
+ empty_state_loggedout_message: Sign up or log in to add sub-creatives.
47
73
  link_loading: Loading…
74
+ link_create: Create “%{query}”
75
+ link_creating: Creating creative…
76
+ link_create_failed: Could not create the creative.
48
77
  link_expand: Expand
49
78
  search_placeholder: Search creatives...
50
- recommend_parent: Recommend Category
51
79
  import_uploading: Uploading...
52
80
  import_success: Import successful! Reloading...
53
81
  import_failed: Import failed.
@@ -118,6 +146,9 @@ en:
118
146
  progress_complete: Complete
119
147
  progress_incomplete: Incomplete
120
148
  progress_complete_children_alert: Marking this creative complete will also mark all child creatives complete.
149
+ save_failed_alert: Failed to save changes. Your edits are still open in the editor. Please check your connection and try again.
150
+ archive_failed_alert: Failed to archive this creative. Nothing was changed. Please check your connection and try again.
151
+ unarchive_failed_alert: Failed to restore this creative. Nothing was changed. Please check your connection and try again.
121
152
  mark_complete: Mark as complete
122
153
  mark_incomplete: Mark as incomplete
123
154
  set_plan_title: Set Plan for Selected Creative
@@ -2,6 +2,15 @@
2
2
  ko:
3
3
  collavre:
4
4
  creatives:
5
+ workspace:
6
+ tree_title: 크리에이티브 트리
7
+ tree_label: 크리에이티브 탐색 트리
8
+ toggle_tree: 크리에이티브 트리 열기/닫기
9
+ empty: 하위 항목이 있는 크리에이티브가 없습니다.
10
+ load_error: 크리에이티브 트리를 불러오지 못했습니다.
11
+ select_chat: 채팅을 볼 크리에이티브를 선택하세요.
12
+ collapse_chat: 채팅 접기
13
+ expand_chat: 채팅 펼치기
5
14
  index:
6
15
  up: 위로
7
16
  new_creative: 추가
@@ -40,9 +49,28 @@ ko:
40
49
  no_creatives: 크리에이티브가 없습니다.
41
50
  no_sub_creatives: 하위 크리에이티브가 없습니다.
42
51
  no_search_results: 검색 결과가 없습니다.
52
+ load_error: 크리에이티브 트리를 불러오지 못했습니다.
53
+ loading_creatives: 크리에이티브를 불러오는 중
54
+ empty_state_heading_root: 크리에이티브가 없습니다
55
+ empty_state_heading_sub: 아직 하위 크리에이티브가 없습니다
56
+ empty_state_concept_title: "💡 크리에이티브란?"
57
+ empty_state_facet_doc: 트리 구조 문서 조각
58
+ empty_state_facet_task: 실행 가능한 작업
59
+ empty_state_facet_chat: 관련 대화 채널
60
+ empty_state_block_label: 크리에이티브 1블록
61
+ empty_state_concept_caption: 하나의 블록이 문서·작업·대화 역할을 동시에 합니다. 트리로 쌓으면 진행률이 자동 집계되는 문서형 프로젝트가 됩니다.
62
+ empty_state_add_creative: 크리에이티브 추가
63
+ empty_state_add_sub_creative: 하위 크리에이티브 추가
64
+ empty_state_add_shortcut: Enter
65
+ empty_state_readonly_message: 이 크리에이티브에 쓰기 권한이 없어 하위 항목을 추가할 수 없습니다.
66
+ empty_state_request_pending: 권한 요청됨 · 소유자 승인 대기 중
67
+ empty_state_request_failed: 권한을 요청하지 못했습니다. 다시 시도해 주세요.
68
+ empty_state_loggedout_message: 하위 크리에이티브를 추가하려면 회원가입 또는 로그인하세요.
43
69
  link_loading: 불러오는 중…
70
+ link_create: “%{query}” 새로 만들기
71
+ link_creating: 크리에이티브를 만드는 중…
72
+ link_create_failed: 크리에이티브를 만들지 못했습니다.
44
73
  link_expand: 펼치기
45
- recommend_parent: 카테고리 추천
46
74
  import_uploading: 업로드 중...
47
75
  import_success: 가져오기 성공! 새로고침 중...
48
76
  import_failed: 가져오기 실패
@@ -106,6 +134,9 @@ ko:
106
134
  progress_complete: 완료
107
135
  progress_incomplete: 미완료
108
136
  progress_complete_children_alert: 하위 크리에이티브도 모두 완료로 표시됩니다.
137
+ save_failed_alert: 변경사항을 저장하지 못했습니다. 수정한 내용은 편집기에 그대로 남아 있습니다. 연결 상태를 확인한 뒤 다시 시도해 주세요.
138
+ archive_failed_alert: 아카이브하지 못했습니다. 변경된 내용은 없습니다. 연결 상태를 확인한 뒤 다시 시도해 주세요.
139
+ unarchive_failed_alert: 복원하지 못했습니다. 변경된 내용은 없습니다. 연결 상태를 확인한 뒤 다시 시도해 주세요.
109
140
  mark_complete: 완료로 표시
110
141
  mark_incomplete: 미완료로 표시
111
142
  set_plan_title: 선택된 크리에이티브에 대한 계획 설정
@@ -0,0 +1,140 @@
1
+ ---
2
+ en:
3
+ collavre:
4
+ features:
5
+ nav:
6
+ landing: "Home"
7
+ all: "All features"
8
+ all_arrow: "← All features"
9
+ separator: "/"
10
+ index:
11
+ title: "Features"
12
+ subtitle: "The things worth knowing about before your first message."
13
+ meta_title: "Features"
14
+ meta_description: "Mentions, slash commands, chat context, automation triggers, topics, sharing, and inbox notifications — everything Collavre's chat can do."
15
+ card_more: "Learn more →"
16
+ show:
17
+ tips: "Tips"
18
+ pages:
19
+ mention_agent:
20
+ title: "Mention teammates & agents"
21
+ tagline: "Address one participant directly, and only that participant answers."
22
+ meta_description: "Use @name: to direct a message at a teammate or an AI agent in a Collavre chat."
23
+ sections:
24
+ - heading: "How it works"
25
+ body: "Use @name: — the name of a mentionable person or AI agent followed by a colon — to address everything after the colon to them. This canonical form may open the message or follow whitespace or one of : . , ;. At the very start of a message only, @name followed by whitespace also counts without a colon, so @Agent do this routes the message to an AI agent named Agent. That colonless form is only for AI routing; use @name: when addressing a teammate so Collavre creates their mention notification. Other mid-word @ signs, such as those in email addresses, are not mentions."
26
+ - heading: "What happens after a mention"
27
+ body: "A teammate addressed with the canonical @name: form gets a mention notification. A mentioned AI agent with comment permission reads the chat, the Creative it belongs to, and any attached context, then replies in the thread. The colonless start-of-message form also routes an AI agent, but it does not create a teammate notification."
28
+ - heading: "Who can be mentioned"
29
+ body: "The mention list includes the Creative owner, people with comment permission or higher, and globally searchable users and agents. A read-only collaborator is not mentionable unless they are globally searchable. A globally searchable AI agent can appear before it has access to the Creative, but it cannot read or reply until the Creative is shared with it using comment permission or higher."
30
+ tips:
31
+ - "Without a mention, the topic's primary agent responds when one is assigned. Otherwise, agents whose routing rules match may respond; if neither applies, the message remains a note."
32
+ - "An @mention routes exclusively to one participant. To ask two agents the same question, send it twice."
33
+ - "An agent needs comment permission to read and reply. Write permission is additionally required to change the Creative itself."
34
+ slash_command:
35
+ title: "Slash commands"
36
+ tagline: "Type / in the message box to run something instead of saying something."
37
+ meta_description: "Collavre slash commands: /calendar, /topic, /compress, /creative, and MCP tools."
38
+ sections:
39
+ - heading: "How it works"
40
+ body: "Type / at the start of a message and a menu of available commands appears. Commands that need arguments open a small form, so you do not have to memorize the argument order; they are submitted like messages and their result lands in the thread. /creative works differently: it opens a Creative picker and inserts your selection as a link in the draft, which you can continue editing before you send the message yourself."
41
+ - heading: "Built-in commands"
42
+ body: "/calendar (also /cal) creates a local calendar event from a date and a memo, accepting relative dates like tomorrow, +3days, or +mon. When Google Calendar is connected, Collavre also attempts to sync the event there. /topic creates a named topic and can assign a primary agent to it. If that name already exists, it targets the existing topic instead: mentioning an agent assigns or replaces its primary agent, while omitting the mention releases any existing primary agent. Assigning, replacing, or releasing a primary agent requires write permission. /compress summarizes the current topic's messages and removes the originals. /creative inserts a link to another Creative, which in an AI chat also injects that Creative and descendants up to the agent's configured child-depth limit as context."
43
+ - heading: "MCP tools"
44
+ body: "MCP tools registered in your workspace show up in the same menu below the built-in commands and run through the same command form. The tools you see depend on which ones are registered and which ones you have permission to use."
45
+ tips:
46
+ - "Whatever you had typed is kept. A form-backed command temporarily stashes the draft, submits the command alone, and restores the draft after the send settles. Commands without a form stay in the message box for you to edit and send."
47
+ - "/compress requires a topic, write permission, and an available AI agent. Collavre tries the topic's primary agent, the policy primary agent, then any AI agent shared on the Creative with comment permission."
48
+ - "Commands are submitted as messages, so they generally need comment permission, and they are unavailable on an archived Creative. Assigning, replacing, or releasing a /topic primary agent additionally requires write permission."
49
+ chat_context:
50
+ title: "Chat context"
51
+ tagline: "Point an agent at another Creative instead of pasting its contents."
52
+ meta_description: "Attach other Creatives as context so AI agents in a Collavre chat can reference them."
53
+ sections:
54
+ - heading: "How it works"
55
+ body: "Attach another Creative as context and the agents in this chat can read its description and descendants up to each agent's configured child-depth limit as part of answering. The link is live, so editing the source Creative changes what the agent sees on the next message. Nothing is copied into the conversation."
56
+ - heading: "Context is inherited"
57
+ body: "A Creative inherits the contexts attached to its parents. Attaching your team's conventions once near the top of a tree means every chat underneath already knows them, and you are not re-pasting the same brief into every thread."
58
+ - heading: "Linking inline"
59
+ body: "The /creative command inserts a link to another Creative in the message itself. In an AI chat, that linked Creative is injected with descendants up to the same configured depth for that exchange — useful for a one-off reference you do not want permanently attached."
60
+ tips:
61
+ - "Context is what an agent reads, not what it may change — sharing governs write access separately."
62
+ - "Each agent has a configured child-depth limit: six descendant levels by default, while zero includes only the referenced Creative. Deeper descendants are not sent to that agent."
63
+ - "Attach the narrowest Creative that answers the question; a large subtree costs the agent attention it could spend on your actual request."
64
+ automation_trigger:
65
+ title: "Automation triggers"
66
+ tagline: "Let an agent react on its own when work arrives."
67
+ meta_description: "Drop triggers and agent triggers in Collavre run an AI agent automatically when a Creative moves or a message arrives."
68
+ sections:
69
+ - heading: "Drop triggers"
70
+ body: "Mark a Creative as a trigger container and it becomes a stage: whenever a Creative is dropped into it, the AI agent on that container is asked to process the new arrival according to the stage's purpose. A column of trigger containers turns a tree into a pipeline that moves work along without anyone dispatching it."
71
+ - heading: "Trigger loops"
72
+ body: "A looped trigger is designed to keep work moving until it is finished. The agent reports DONE, CONTINUE, or BLOCKED after each pass; CONTINUE runs another iteration, BLOCKED pauses for you, and there is an iteration ceiling so a confused agent cannot run forever. If the agent asks for your input, the loop waits and resumes when you reply in the topic."
73
+ - heading: "What you need first"
74
+ body: "A trigger needs an AI agent with write permission on the container. Without one, the drop is recorded but nothing runs, and Collavre says so in the thread rather than failing quietly."
75
+ tips:
76
+ - "DONE claims are checked on a best-effort basis against the requested actions. If a verifier finds unfinished work, it sends the task back for another iteration. If no verifier is available, the check returns no response, or the verification request fails, Collavre accepts DONE and completes the loop to avoid blocking."
77
+ - "Keep the decisive instruction in the first 24 visible characters of the container description: the trigger message receives only that snippet, not the full description."
78
+ topic_management:
79
+ title: "Topics"
80
+ tagline: "Split one chat into parallel conversations that do not interrupt each other."
81
+ meta_description: "Use topics to keep separate threads of conversation inside a single Collavre chat."
82
+ sections:
83
+ - heading: "How it works"
84
+ body: "A topic is a named thread inside a Creative's chat. Messages sent in a topic stay in that topic, so a long-running investigation and a quick question can share a Creative without shuffling into one another. The topic list shows every topic on the Creative, including archived ones."
85
+ - heading: "Topics and agents"
86
+ body: "A topic can have a primary agent as its sole ambient responder: without an explicit mention, that agent answers even if another agent's routing rules match. Explicitly mentioning another agent invites that agent instead. /topic \"name\" @agent: creates the topic and sets its primary agent at once. If that name already exists, the command assigns or replaces the existing topic's primary agent instead; /topic \"name\" without a mention releases any primary agent already assigned to it. Assigning, replacing, or releasing a primary agent requires write permission. This is how one Creative can host several agents working in parallel, each in its own topic, without them reading each other's turns."
87
+ - heading: "Keeping topics small"
88
+ body: "/compress summarizes a topic's messages and removes the originals, leaving the conclusion behind. Long-lived topics stay useful instead of becoming an archive nobody scrolls."
89
+ tips:
90
+ - "Archive a topic when it is finished — it stays readable but leaves the active list."
91
+ - "Compressing requires write permission and an available AI agent. Collavre tries the topic's primary agent, the policy primary agent, then any AI agent shared on the Creative with comment permission."
92
+ inbox_notifications:
93
+ title: "Inbox notifications"
94
+ tagline: "Your System topic collects the updates that need your attention."
95
+ meta_description: "See which Collavre notifications arrive in the inbox System topic and how that topic behaves."
96
+ sections:
97
+ - heading: "What arrives here"
98
+ body: "Mentions, new conversation activity, Creative shares, access requests, moderation notices, and important agent recovery updates can appear in your inbox's System topic. They are collected in one stream so you can review activity without reopening every Creative."
99
+ - heading: "A notification-only topic"
100
+ body: "System is reserved for alerts and behaves differently from ordinary topics. Messages here do not invoke an AI agent, even when they contain an agent mention or a slash command."
101
+ tips:
102
+ - "No notifications is a healthy state: it means there is nothing new in this stream."
103
+ - "Other topics in your inbox still behave like regular conversation topics."
104
+ inbox_reply:
105
+ title: "Reply from your inbox"
106
+ tagline: "Answer a conversation notification without leaving the System topic."
107
+ meta_description: "Reply to a Collavre conversation notification from the inbox and send the response back to its original topic."
108
+ sections:
109
+ - heading: "How it works"
110
+ body: "When you post after a conversation notification, Collavre copies your message into the original Creative and the same topic as a reply to the source comment. Your message also remains visible in the inbox, so the action is easy to trace."
111
+ - heading: "Which notification receives the reply"
112
+ body: "The most recent preceding System notification is used. Cross-posting works when that notification links to an original comment and you still have comment permission on its Creative. Otherwise the message stays in the inbox without being copied."
113
+ tips:
114
+ - "Check the notification immediately above your draft before sending."
115
+ - "Attachments are copied to the original conversation with the reply."
116
+ inbox_source:
117
+ title: "Jump to the source"
118
+ tagline: "Move from an alert to the conversation where it happened."
119
+ meta_description: "Use links in Collavre inbox notifications to open the source Creative and its conversation."
120
+ sections:
121
+ - heading: "Open the original context"
122
+ body: "Conversation notifications include a Creative link when source context is available. Follow it to open that Creative with its chat, then review the surrounding messages before acting."
123
+ - heading: "Use the inbox as a hub"
124
+ body: "Scan notifications in System, open the source when you need broader context, and return to the inbox for the next update. This keeps the notification stream compact without duplicating each full conversation."
125
+ tips:
126
+ - "A source may be unavailable if it was removed or your access was revoked."
127
+ add_user:
128
+ title: "Add people"
129
+ tagline: "Bring a teammate or an AI agent into this Creative."
130
+ meta_description: "Share a Collavre Creative with teammates or AI agents and control what they can do."
131
+ sections:
132
+ - heading: "How it works"
133
+ body: "Sharing a Creative grants access to it and everything below it, so you share at the level the person actually works at rather than one Creative at a time. The Creative owner and people shared with comment permission or higher can be mentioned in its chat. A read-only collaborator is mentionable only if they are globally searchable."
134
+ - heading: "Permission levels"
135
+ body: "Access is graded: reading, commenting, writing, and administering are separate. A reviewer who should comment but not restructure gets comment access; an agent that only summarizes does not need write. Only an admin on a Creative can change who is shared on it."
136
+ - heading: "AI agents are participants too"
137
+ body: "An AI agent is added the same way a person is, with its own permission level. That is what makes an agent's reach reviewable — you can see exactly which Creatives it can read and which it can change, and revoke either."
138
+ tips:
139
+ - "Grant the narrowest permission that lets someone do their job; you can raise it later without re-sharing."
140
+ - "Sharing high in the tree is usually right — inherited access is easier to reason about than a dozen individual grants."
@@ -0,0 +1,140 @@
1
+ ---
2
+ ko:
3
+ collavre:
4
+ features:
5
+ nav:
6
+ landing: "홈"
7
+ all: "전체 기능"
8
+ all_arrow: "← 전체 기능"
9
+ separator: "/"
10
+ index:
11
+ title: "기능"
12
+ subtitle: "첫 메시지를 보내기 전에 알아두면 좋은 것들."
13
+ meta_title: "기능"
14
+ meta_description: "멘션, 슬래시 명령어, 채팅 컨텍스트, 자동화 트리거, 토픽, 공유, 인박스 알림 — Collavre 채팅으로 할 수 있는 것들."
15
+ card_more: "자세히 보기 →"
16
+ show:
17
+ tips: "팁"
18
+ pages:
19
+ mention_agent:
20
+ title: "팀원 · 에이전트 멘션"
21
+ tagline: "한 명을 직접 지목하면, 그 한 명만 답합니다."
22
+ meta_description: "Collavre 채팅에서 @이름: 으로 팀원이나 AI 에이전트를 지목해 메시지를 보내는 방법."
23
+ sections:
24
+ - heading: "사용 방법"
25
+ body: "@이름: 형식으로 멘션할 수 있는 사람이나 AI 에이전트의 이름 뒤에 콜론을 붙이면, 그 뒤의 내용이 그 대상에게 전달됩니다. 이 표준 형식의 @는 메시지 맨 앞, 공백 뒤, 또는 : . , ; 중 하나 뒤에 올 수 있습니다. 메시지 맨 앞에서는 @이름 뒤에 공백만 두어도 콜론 없는 멘션으로 인식되므로, @Agent 작업해라고 쓰면 해당 메시지가 Agent라는 AI 에이전트에게 라우팅됩니다. 이 콜론 없는 형식은 AI 라우팅에만 사용됩니다. 팀원에게 멘션 알림을 보내려면 @이름: 표준 형식을 사용하세요. 이메일 주소처럼 단어 중간에 있는 다른 @ 기호는 멘션이 아닙니다."
26
+ - heading: "멘션 후 동작"
27
+ body: "@이름: 표준 형식으로 지목한 팀원에게는 멘션 알림이 갑니다. 댓글 권한이 있는 AI 에이전트는 멘션되면 채팅과 해당 Creative, 그리고 연결된 컨텍스트를 읽고 스레드에 답변합니다. 메시지 맨 앞의 콜론 없는 형식도 AI 에이전트를 라우팅하지만 팀원 멘션 알림은 만들지 않습니다."
28
+ - heading: "멘션할 수 있는 대상"
29
+ body: "멘션 목록에는 Creative 소유자, 댓글 이상의 권한을 공유받은 사용자, 전역 검색 가능한 사용자와 에이전트가 표시됩니다. 읽기 전용 참여자는 전역 검색 대상이 아니면 멘션할 수 없습니다. 전역 검색 가능한 AI 에이전트는 Creative 접근 권한이 없어도 표시될 수 있지만, 댓글 이상의 권한으로 Creative를 공유하기 전에는 읽거나 답하지 못합니다."
30
+ tips:
31
+ - "멘션이 없으면 토픽에 주 담당 에이전트가 지정된 경우 그 에이전트가 답합니다. 그렇지 않으면 라우팅 규칙이 일치하는 에이전트가 답할 수 있고, 둘 다 해당하지 않으면 메시지는 메모로 남습니다."
32
+ - "@멘션은 참여자 한 명에게만 라우팅됩니다. 두 에이전트에게 같은 질문을 하려면 두 번 보내세요."
33
+ - "에이전트가 Creative를 읽고 답하려면 댓글 권한이 필요합니다. Creative 자체를 변경하려면 쓰기 권한도 필요합니다."
34
+ slash_command:
35
+ title: "슬래시 명령어"
36
+ tagline: "입력창에 /를 치면, 말하는 대신 실행할 수 있습니다."
37
+ meta_description: "Collavre 슬래시 명령어: /calendar, /topic, /compress, /creative 그리고 MCP 도구."
38
+ sections:
39
+ - heading: "사용 방법"
40
+ body: "메시지 맨 앞에 /를 입력하면 사용 가능한 명령어 메뉴가 나타납니다. 인자가 필요한 명령어는 작은 폼을 열기 때문에 인자 순서를 외울 필요가 없으며, 메시지처럼 전송되어 실행 결과가 스레드에 남습니다. /creative는 다르게 동작합니다. Creative 선택 창을 열고 선택한 항목의 링크를 초안에 삽입하므로, 내용을 계속 작성한 뒤 사용자가 직접 메시지를 전송해야 합니다."
41
+ - heading: "기본 제공 명령어"
42
+ body: "/calendar(또는 /cal)는 날짜와 메모로 로컬 캘린더 일정을 만들며 tomorrow, +3days, +mon 같은 상대 날짜를 인식합니다. Google Calendar가 연결되어 있으면 Collavre가 해당 일정의 동기화도 시도합니다. /topic은 이름 붙은 토픽을 만들고 주 담당 에이전트를 지정할 수 있습니다. 같은 이름이 이미 있으면 새 토픽 대신 기존 토픽을 대상으로 합니다. 에이전트를 멘션하면 기존 토픽의 주 담당 에이전트를 지정하거나 교체하고, 멘션하지 않으면 지정되어 있던 주 담당 에이전트를 해제합니다. 주 담당 에이전트를 지정·교체·해제하려면 쓰기 권한이 필요합니다. /compress는 현재 토픽의 메시지를 요약하고 원본을 정리합니다. /creative는 다른 Creative 링크를 삽입하며, AI 채팅에서는 그 Creative와 에이전트에 설정된 하위 깊이 한도까지의 하위 항목이 컨텍스트로 함께 주입됩니다."
43
+ - heading: "MCP 도구"
44
+ body: "워크스페이스에 등록된 MCP 도구는 기본 명령어 아래 같은 메뉴에 나타나며 동일한 명령 폼으로 실행됩니다. 표시되는 도구는 등록 여부와 사용 권한에 따라 달라집니다."
45
+ tips:
46
+ - "입력 중이던 내용은 그대로 유지됩니다. 인자 폼이 있는 명령은 초안을 잠시 보관하고 명령만 따로 전송한 뒤, 전송 처리가 끝나면 초안을 복원합니다. 인자 폼이 없는 명령은 사용자가 수정하고 전송할 수 있도록 입력창에 남습니다."
47
+ - "/compress에는 토픽, 쓰기 권한, 사용 가능한 AI 에이전트가 필요합니다. Collavre는 토픽의 주 담당 에이전트, 정책의 주 담당 에이전트, 해당 Creative에 댓글 권한으로 공유된 AI 에이전트 순으로 찾습니다."
48
+ - "명령어는 메시지로 전송되므로 일반적으로 댓글 권한이 필요하고, 보관된 Creative에서는 사용할 수 없습니다. /topic으로 주 담당 에이전트를 지정·교체·해제하려면 추가로 쓰기 권한이 필요합니다."
49
+ chat_context:
50
+ title: "채팅 컨텍스트"
51
+ tagline: "내용을 붙여넣는 대신, 에이전트가 볼 Creative를 가리키세요."
52
+ meta_description: "다른 Creative를 컨텍스트로 연결해 Collavre 채팅의 AI 에이전트가 참고하게 하는 방법."
53
+ sections:
54
+ - heading: "사용 방법"
55
+ body: "다른 Creative를 컨텍스트로 연결하면 이 채팅의 에이전트가 그 Creative의 설명과 하위 항목을 각 에이전트에 설정된 하위 깊이 한도까지 답변에 참고합니다. 연결은 살아 있어서, 원본 Creative를 수정하면 다음 메시지부터 에이전트가 보는 내용도 바뀝니다. 대화에 내용이 복사되지는 않습니다."
56
+ - heading: "컨텍스트는 상속됩니다"
57
+ body: "Creative는 상위 Creative에 연결된 컨텍스트를 물려받습니다. 팀의 작업 규칙을 트리 상단에 한 번만 연결해두면 그 아래 모든 채팅이 이미 그 규칙을 알고 있으므로, 같은 설명을 스레드마다 다시 붙여넣지 않아도 됩니다."
58
+ - heading: "메시지 안에서 연결하기"
59
+ body: "/creative 명령어는 메시지 자체에 다른 Creative 링크를 삽입합니다. AI 채팅에서는 그 Creative와 같은 설정 깊이까지의 하위 항목이 해당 대화의 컨텍스트로 주입되므로, 상시로 붙여두고 싶지 않은 일회성 참조에 적합합니다."
60
+ tips:
61
+ - "컨텍스트는 에이전트가 읽는 범위이지 변경할 수 있는 범위가 아닙니다. 쓰기 권한은 공유로 따로 정해집니다."
62
+ - "각 에이전트에는 하위 깊이 한도가 설정됩니다. 기본값은 하위 6단계이며, 0이면 참조한 Creative만 포함됩니다. 그보다 깊은 하위 항목은 에이전트에게 전달되지 않습니다."
63
+ - "질문에 답하기에 충분한 가장 좁은 Creative를 연결하세요. 큰 트리는 에이전트가 실제 요청에 쓸 주의력을 가져갑니다."
64
+ automation_trigger:
65
+ title: "자동화 트리거"
66
+ tagline: "일이 도착하면 에이전트가 스스로 반응하게 하세요."
67
+ meta_description: "Creative가 이동하거나 메시지가 도착할 때 AI 에이전트를 자동 실행하는 Collavre의 드롭 트리거와 트리거 루프."
68
+ sections:
69
+ - heading: "드롭 트리거"
70
+ body: "Creative를 트리거 컨테이너로 지정하면 그 Creative는 하나의 공정 단계가 됩니다. 다른 Creative가 그 안으로 이동될 때마다, 컨테이너에 지정된 AI 에이전트가 그 단계의 목적에 맞게 새로 들어온 항목을 처리하도록 요청받습니다. 트리거 컨테이너를 여러 단계로 늘어놓으면, 누가 일일이 배정하지 않아도 트리가 파이프라인처럼 동작합니다."
71
+ - heading: "트리거 루프"
72
+ body: "루프 트리거는 작업이 끝날 때까지 이어가도록 설계되었습니다. 에이전트는 각 회차 끝에 DONE, CONTINUE, BLOCKED 중 하나를 보고합니다. CONTINUE면 다음 회차가 돌고, BLOCKED면 사용자를 기다리며 멈추고, 반복 횟수 상한이 있어 혼란에 빠진 에이전트가 무한히 돌지 않습니다. 에이전트가 사용자의 판단을 요청하면 루프는 대기하다가 토픽에 답을 남기는 순간 이어서 진행합니다."
73
+ - heading: "먼저 필요한 것"
74
+ body: "트리거에는 컨테이너에 쓰기 권한을 가진 AI 에이전트가 필요합니다. 없으면 이동은 기록되지만 아무것도 실행되지 않으며, 조용히 실패하는 대신 스레드에 그 사실을 남깁니다."
75
+ tips:
76
+ - "DONE 보고는 요청받은 작업을 기준으로 가능한 범위에서 검증됩니다. 검증기가 남은 작업을 찾으면 다음 회차로 되돌립니다. 검증 에이전트가 없거나, 검증 응답이 비어 있거나, 검증 요청이 실패하면 작업이 멈추지 않도록 DONE을 수락하고 루프를 완료합니다."
77
+ - "컨테이너 설명의 핵심 지시는 처음 24자 안에 넣으세요. 트리거 메시지는 전체 설명이 아니라 화면에 보이는 텍스트의 24자 요약만 받습니다."
78
+ topic_management:
79
+ title: "토픽"
80
+ tagline: "하나의 채팅을 서로 방해하지 않는 여러 대화로 나눕니다."
81
+ meta_description: "하나의 Collavre 채팅 안에서 대화 갈래를 분리해 관리하는 토픽 사용법."
82
+ sections:
83
+ - heading: "사용 방법"
84
+ body: "토픽은 Creative 채팅 안의 이름 붙은 스레드입니다. 토픽에서 보낸 메시지는 그 토픽에 남으므로, 오래 걸리는 조사와 짧은 질문이 서로 뒤섞이지 않고 한 Creative를 공유할 수 있습니다. 토픽 목록에서는 보관된 토픽까지 포함해 모든 토픽을 볼 수 있습니다."
85
+ - heading: "토픽과 에이전트"
86
+ body: "토픽에는 멘션 없는 메시지에 단독으로 답하는 주 담당 에이전트를 지정할 수 있습니다. 다른 에이전트의 라우팅 규칙이 일치해도 주 담당 에이전트가 답하지만, 다른 에이전트를 명시적으로 멘션하면 그 에이전트가 대신 답합니다. /topic \"이름\" @에이전트: 로 토픽 생성과 주 담당 에이전트 지정을 한 번에 처리합니다. 같은 이름의 토픽이 이미 있으면 기존 토픽의 주 담당 에이전트를 지정하거나 교체하며, 멘션 없이 /topic \"이름\"을 사용하면 기존 주 담당 에이전트를 해제합니다. 주 담당 에이전트를 새로 지정하거나 변경·해제하려면 쓰기 권한이 필요합니다. 이렇게 하면 하나의 Creative에서 여러 에이전트가 각자의 토픽에서 서로의 대화를 읽지 않고 동시에 일할 수 있습니다."
87
+ - heading: "토픽을 가볍게 유지하기"
88
+ body: "/compress는 토픽의 메시지를 요약하고 원본을 정리해 결론만 남깁니다. 오래 이어지는 토픽이 아무도 스크롤하지 않는 기록 더미가 되는 대신 계속 쓸모 있게 유지됩니다."
89
+ tips:
90
+ - "끝난 토픽은 보관하세요. 계속 읽을 수 있지만 활성 목록에서는 빠집니다."
91
+ - "압축에는 쓰기 권한과 사용 가능한 AI 에이전트가 필요합니다. Collavre는 토픽의 주 담당 에이전트, 정책의 주 담당 에이전트, 해당 Creative에 댓글 권한으로 공유된 AI 에이전트 순으로 찾습니다."
92
+ inbox_notifications:
93
+ title: "인박스 알림"
94
+ tagline: "확인이 필요한 업데이트가 System 토픽에 모입니다."
95
+ meta_description: "Collavre 인박스의 System 토픽에 어떤 알림이 모이고 이 토픽이 어떻게 동작하는지 알아봅니다."
96
+ sections:
97
+ - heading: "이곳에 오는 알림"
98
+ body: "멘션, 새 대화 활동, Creative 공유, 권한 요청, 관리 알림, 중요한 에이전트 복구 안내가 인박스의 System 토픽에 표시될 수 있습니다. 모든 Creative를 다시 열지 않아도 한 흐름에서 활동을 확인할 수 있습니다."
99
+ - heading: "알림 전용 토픽"
100
+ body: "System은 알림을 위해 예약되어 일반 토픽과 다르게 동작합니다. 이곳의 메시지에 에이전트 멘션이나 슬래시 명령어가 있어도 AI 에이전트를 실행하지 않습니다."
101
+ tips:
102
+ - "알림이 없는 것은 정상입니다. 지금 확인할 새 소식이 없다는 뜻입니다."
103
+ - "인박스의 다른 토픽은 일반 대화 토픽처럼 동작합니다."
104
+ inbox_reply:
105
+ title: "인박스에서 바로 답장"
106
+ tagline: "System 토픽을 떠나지 않고 대화 알림에 답합니다."
107
+ meta_description: "Collavre 인박스에서 대화 알림에 답장하고 원래 토픽으로 응답을 전달하는 방법."
108
+ sections:
109
+ - heading: "동작 방식"
110
+ body: "대화 알림 뒤에 메시지를 보내면 Collavre가 그 메시지를 원본 Creative의 같은 토픽에 원문 댓글의 답장으로 복사합니다. 보낸 메시지는 인박스에도 남아 전달 과정을 확인할 수 있습니다."
111
+ - heading: "어떤 알림에 답장되는지"
112
+ body: "바로 앞의 가장 최근 System 알림을 기준으로 전달합니다. 그 알림이 원문 댓글과 연결되어 있고 원본 Creative에 댓글 권한이 있을 때만 복사됩니다. 조건을 충족하지 않으면 메시지는 인박스에만 남습니다."
113
+ tips:
114
+ - "보내기 전에 초안 바로 위의 알림이 답장하려는 대상인지 확인하세요."
115
+ - "첨부 파일도 답장과 함께 원래 대화로 복사됩니다."
116
+ inbox_source:
117
+ title: "원문으로 바로 이동"
118
+ tagline: "알림이 발생한 대화로 이동해 전체 맥락을 확인합니다."
119
+ meta_description: "Collavre 인박스 알림의 링크로 원본 Creative와 대화를 여는 방법."
120
+ sections:
121
+ - heading: "원래 맥락 열기"
122
+ body: "원본 맥락을 제공할 수 있는 대화 알림에는 Creative 링크가 포함됩니다. 링크를 누르면 해당 Creative의 채팅이 열리므로 조치하기 전에 주변 메시지를 확인할 수 있습니다."
123
+ - heading: "인박스를 허브로 사용하기"
124
+ body: "System에서 알림을 훑고, 더 넓은 맥락이 필요할 때 원문을 연 다음, 다음 업데이트를 위해 인박스로 돌아오세요. 전체 대화를 복제하지 않고도 알림 흐름을 간결하게 유지할 수 있습니다."
125
+ tips:
126
+ - "원본이 삭제되었거나 접근 권한이 회수되면 열 수 없을 수 있습니다."
127
+ add_user:
128
+ title: "사용자 추가"
129
+ tagline: "팀원이나 AI 에이전트를 이 Creative에 초대합니다."
130
+ meta_description: "Collavre Creative를 팀원이나 AI 에이전트와 공유하고 권한을 조정하는 방법."
131
+ sections:
132
+ - heading: "사용 방법"
133
+ body: "Creative를 공유하면 그 Creative와 하위 전체에 접근 권한이 부여됩니다. 그래서 Creative를 하나씩 공유하는 대신, 그 사람이 실제로 일하는 층위에서 공유하면 됩니다. Creative 소유자와 댓글 이상의 권한으로 공유된 사람은 채팅에서 멘션할 수 있습니다. 읽기 전용 참여자는 전역 검색이 허용된 경우에만 멘션할 수 있습니다."
134
+ - heading: "권한 단계"
135
+ body: "권한은 읽기, 댓글, 쓰기, 관리로 나뉩니다. 의견은 주되 구조는 바꾸지 않아야 할 검토자에게는 댓글 권한을, 요약만 하는 에이전트에게는 쓰기 권한 없이 부여하면 됩니다. 공유 대상을 변경할 수 있는 것은 해당 Creative의 관리 권한자뿐입니다."
136
+ - heading: "AI 에이전트도 참여자입니다"
137
+ body: "AI 에이전트는 사람과 같은 방식으로, 각자의 권한 단계와 함께 추가됩니다. 이것이 에이전트의 활동 범위를 검토 가능하게 만듭니다. 어떤 Creative를 읽을 수 있고 어떤 것을 변경할 수 있는지 그대로 확인하고, 언제든 회수할 수 있습니다."
138
+ tips:
139
+ - "맡은 일을 할 수 있는 가장 좁은 권한부터 주세요. 나중에 다시 공유하지 않고도 올릴 수 있습니다."
140
+ - "대개 트리 상단에서 공유하는 편이 낫습니다. 상속된 권한이 개별 권한 수십 개보다 파악하기 쉽습니다."
@@ -10,6 +10,9 @@ en:
10
10
  prompt: To accept the invitation, please log in or sign up.
11
11
  login: Log in
12
12
  sign_up: Sign up
13
+ meta:
14
+ title: 'Invitation to "%{creative}"'
15
+ description: "%{inviter} invited you to collaborate on Collavre."
13
16
  invitation_mailer:
14
17
  invite:
15
18
  subject: You're invited to Collavre
@@ -10,6 +10,9 @@ ko:
10
10
  prompt: 초대를 수락하려면 로그인하거나 회원 가입을 해주세요.
11
11
  login: 로그인
12
12
  sign_up: 회원 가입
13
+ meta:
14
+ title: '"%{creative}" 크리에이티브 초대'
15
+ description: "%{inviter}님이 콜라브에서 함께 협업하도록 초대했습니다."
13
16
  invitation_mailer:
14
17
  invite:
15
18
  subject: 콜라브에 초대되었습니다
@@ -23,6 +23,7 @@ en:
23
23
  features:
24
24
  title: "Everything in one living tree"
25
25
  subtitle: "Write it once. Every block is a doc, a task, and a discussion at the same time — one source of truth, self-hosted in your own database, that you inject straight into your AI agents."
26
+ explore: "Explore all features →"
26
27
  tree:
27
28
  title: "Hierarchical blocks"
28
29
  desc: "Organize work as a tree. Drag, link, and reuse blocks across projects. Progress rolls up automatically."
@@ -60,4 +61,4 @@ en:
60
61
  subtitle: "Start organizing your work with AI-powered context."
61
62
  start: "Get Started"
62
63
  footer:
63
- rights: "All rights reserved."
64
+ copyright: "© %{year} %{app_name}. All rights reserved."
@@ -23,6 +23,7 @@ ko:
23
23
  features:
24
24
  title: "하나의 살아있는 트리로"
25
25
  subtitle: "한 번만 쓰세요. 모든 블록이 문서이자 일감이자 대화입니다 — 셀프호스트로 자신의 DB에 쌓이는 하나의 SSOT를, 그대로 AI 에이전트에 주입합니다."
26
+ explore: "전체 기능 살펴보기 →"
26
27
  tree:
27
28
  title: "계층형 블록"
28
29
  desc: "작업을 트리로 구성하세요. 드래그, 링크, 재사용이 자유롭고 진행률은 자동 계산됩니다."
@@ -60,4 +61,4 @@ ko:
60
61
  subtitle: "AI 기반 컨텍스트로 작업을 정리하세요."
61
62
  start: "시작하기"
62
63
  footer:
63
- rights: "모든 권리 보유."
64
+ copyright: "© %{year} %{app_name}. 모든 권리 보유."
@@ -0,0 +1,20 @@
1
+ en:
2
+ collavre:
3
+ tools:
4
+ topic_message_create:
5
+ errors:
6
+ current_user_required: Current.user is required.
7
+ archived_creative: Archived creatives do not accept topic messages.
8
+ archived_topic: Archived topics do not accept messages.
9
+ system_topic: The inbox System topic does not accept user-authored messages.
10
+ current_topic: An agent cannot dispatch a topic message to its own current topic.
11
+ self_route: An agent cannot route an unpinned topic message back to itself.
12
+ topic_move:
13
+ errors:
14
+ current_user_required: Current.user is required.
15
+ source_permission: Admin permission is required on the topic's current creative.
16
+ target_permission: Write permission is required on the destination creative.
17
+ same_creative: The topic already belongs to the destination creative.
18
+ reserved_topic: Main and an inbox's System topic cannot be moved.
19
+ session_topic: A live agent session topic cannot be moved.
20
+ duplicate_name: A topic named '%{name}' already exists in the destination creative.
@@ -0,0 +1,20 @@
1
+ ko:
2
+ collavre:
3
+ tools:
4
+ topic_message_create:
5
+ errors:
6
+ current_user_required: Current.user가 필요합니다.
7
+ archived_creative: 보관된 크리에이티브에는 토픽 메시지를 작성할 수 없습니다.
8
+ archived_topic: 보관된 토픽에는 메시지를 작성할 수 없습니다.
9
+ system_topic: 받은 편지함의 System 토픽에는 사용자가 메시지를 작성할 수 없습니다.
10
+ current_topic: 에이전트는 현재 처리 중인 토픽에 토픽 메시지를 전달할 수 없습니다.
11
+ self_route: 에이전트는 고정되지 않은 토픽 메시지를 자신에게 다시 라우팅할 수 없습니다.
12
+ topic_move:
13
+ errors:
14
+ current_user_required: Current.user가 필요합니다.
15
+ source_permission: 토픽의 현재 크리에이티브에 대한 관리자 권한이 필요합니다.
16
+ target_permission: 대상 크리에이티브에 대한 쓰기 권한이 필요합니다.
17
+ same_creative: 토픽이 이미 대상 크리에이티브에 속해 있습니다.
18
+ reserved_topic: Main 토픽과 받은 편지함의 System 토픽은 이동할 수 없습니다.
19
+ session_topic: 실행 중인 에이전트 세션 토픽은 이동할 수 없습니다.
20
+ duplicate_name: "'%{name}' 토픽이 대상 크리에이티브에 이미 존재합니다."
@@ -24,11 +24,17 @@ en:
24
24
  vendor_label: LLM Vendor
25
25
  vendor_help: Select the AI provider for this agent
26
26
  model_label: Model
27
+ remove_model: Remove from model list
28
+ remove_model_failed: Could not remove the model from the list.
27
29
  api_key_label: API Key
28
30
  api_key_help: If provided, this key will be used instead of the system default.
29
31
  Stored encrypted.
30
32
  gateway_url_label: Gateway URL
31
33
  gateway_url_help: Required for OpenClaw. The URL of your OpenClaw gateway.
34
+ agent_gateway_label: Agent Gateway
35
+ agent_gateway_blank: Select a gateway for CLI Proxy
36
+ agent_gateway_help: Required only when LLM Vendor is CLI Proxy.
37
+ manage_gateways: Manage gateways
32
38
  searchable_label: Allow this AI to be searchable and mentionable
33
39
  searchable_help: When enabled, others can find and mention this AI by name.
34
40
  submit: Add AI Agent
@@ -53,7 +59,13 @@ en:
53
59
  not_an_ai: This user is not an AI agent.
54
60
  tools_title: Available Tools
55
61
  tools_description: These tools are available for the agent to use.
62
+ meta_skills_title: Collavre meta-skills
63
+ meta_skills_description: The single provisioned collavre-cli skill runs the selected tools as meta-skills. These selections are not enforced as callback-token permissions yet.
64
+ gateway_mode: "Workspace mode: %{mode}. Change it in the selected gateway's settings."
56
65
  no_tools_found: No tools found.
66
+ clear_api_key_label: Remove stored API key
67
+ clear_api_key_help: After saving, the agent will use the system default or
68
+ a keyless gateway.
57
69
  agent_conf_label: "Agent Configuration (YAML)"
58
70
  agent_conf_help: "YAML configuration for agent behavior. chat_history: max previous messages (default 50), chat_history_size: max total characters (default 100000), context.creative_children_level: depth of children to include in creative context (default nil → follows user setting, 0=no children, 1=direct children, 2=grandchildren)."
59
71
  chat_title: Chat with Agent
@@ -116,25 +128,14 @@ en:
116
128
  theme: Theme
117
129
  calendar_id: Calendar ID
118
130
  notifications_enabled: Enable notifications
131
+ creative_workspace:
132
+ enabled: Enable three-column creative workspace
133
+ description: Keep the creative tree mounted on the left, update creative content without a full page refresh, and dock chat on the right.
119
134
  locale: Language
120
135
  locales:
121
136
  en: English
122
137
  ko: Korean
123
138
  timezone: Timezone
124
- typo_correction:
125
- legend: Typo correction
126
- manage: Typo correction settings
127
- description: Automatically suggest and fix typos as you type. Suggestions run only when both the typing device and the input location below are enabled.
128
- enabled: Enable typo correction
129
- threshold: Auto-apply threshold
130
- threshold_hint: Edits at or above this confidence (0-100) are applied automatically; lower-confidence edits are only suggested.
131
- device_legend: Typing devices
132
- on_voice: Voice input
133
- on_soft_keyboard: On-screen (soft) keyboard
134
- on_physical_keyboard: Physical keyboard (Bluetooth/wired)
135
- location_legend: Input locations
136
- in_chat: Chat message input
137
- in_editor: Creative editor
138
139
  profile_updated: Profile updated successfully.
139
140
  avatar_updated: Avatar updated successfully.
140
141
  password_updated: Password updated successfully.