collavre 0.3.2 → 0.5.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 (110) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/collavre/actiontext.css +73 -71
  3. data/app/assets/stylesheets/collavre/activity_logs.css +18 -45
  4. data/app/assets/stylesheets/collavre/comments_popup.css +197 -35
  5. data/app/assets/stylesheets/collavre/creatives.css +101 -51
  6. data/app/assets/stylesheets/collavre/dark_mode.css +221 -88
  7. data/app/assets/stylesheets/collavre/design_tokens.css +334 -0
  8. data/app/assets/stylesheets/collavre/mention_menu.css +13 -9
  9. data/app/assets/stylesheets/collavre/popup.css +57 -27
  10. data/app/assets/stylesheets/collavre/slide_view.css +6 -6
  11. data/app/assets/stylesheets/collavre/user_menu.css +4 -5
  12. data/app/components/collavre/plans_timeline_component.html.erb +2 -2
  13. data/app/controllers/collavre/admin/orchestration_controller.rb +9 -2
  14. data/app/controllers/collavre/admin/settings_controller.rb +199 -0
  15. data/app/controllers/collavre/comments/reactions_controller.rb +1 -9
  16. data/app/controllers/collavre/comments_controller.rb +39 -162
  17. data/app/controllers/collavre/creatives_controller.rb +18 -58
  18. data/app/controllers/collavre/users_controller.rb +31 -3
  19. data/app/helpers/collavre/application_helper.rb +97 -0
  20. data/app/helpers/collavre/creatives_helper.rb +10 -202
  21. data/app/javascript/collavre.js +0 -1
  22. data/app/javascript/components/creative_tree_row.js +3 -2
  23. data/app/javascript/controllers/comment_controller.js +309 -4
  24. data/app/javascript/controllers/comments/form_controller.js +52 -0
  25. data/app/javascript/controllers/comments/presence_controller.js +13 -0
  26. data/app/javascript/controllers/creatives/tree_controller.js +2 -1
  27. data/app/javascript/controllers/link_creative_controller.js +29 -3
  28. data/app/javascript/lib/__tests__/html_code_block_wrapper.test.js +201 -0
  29. data/app/javascript/lib/html_code_block_wrapper.js +168 -0
  30. data/app/javascript/lib/utils/markdown.js +2 -1
  31. data/app/javascript/modules/creative_row_editor.js +5 -1
  32. data/app/javascript/utils/emoji_parser.js +21 -0
  33. data/app/jobs/collavre/ai_agent_job.rb +6 -2
  34. data/app/jobs/collavre/cron_action_job.rb +18 -6
  35. data/app/jobs/collavre/cron_scheduler_job.rb +112 -0
  36. data/app/models/collavre/comment/approvable.rb +50 -0
  37. data/app/models/collavre/comment/broadcastable.rb +119 -0
  38. data/app/models/collavre/comment/notifiable.rb +111 -0
  39. data/app/models/collavre/comment.rb +13 -258
  40. data/app/models/collavre/comment_reaction.rb +15 -0
  41. data/app/models/collavre/creative/describable.rb +86 -0
  42. data/app/models/collavre/creative/linkable.rb +77 -0
  43. data/app/models/collavre/creative/permissible.rb +103 -0
  44. data/app/models/collavre/creative.rb +3 -289
  45. data/app/models/collavre/orchestrator_policy.rb +1 -1
  46. data/app/models/collavre/system_setting.rb +27 -1
  47. data/app/models/collavre/user.rb +42 -0
  48. data/app/models/collavre/user_theme.rb +10 -0
  49. data/app/services/collavre/ai_agent/approval_handler.rb +110 -0
  50. data/app/services/collavre/ai_agent/message_builder.rb +129 -0
  51. data/app/services/collavre/ai_agent/review_handler.rb +70 -0
  52. data/app/services/collavre/ai_agent_service.rb +93 -150
  53. data/app/services/collavre/ai_client.rb +23 -4
  54. data/app/services/collavre/auto_theme_generator.rb +168 -50
  55. data/app/services/collavre/command_menu_service.rb +70 -0
  56. data/app/services/collavre/comment_move_service.rb +94 -0
  57. data/app/services/collavre/comments/action_executor.rb +10 -0
  58. data/app/services/collavre/comments/mcp_command.rb +1 -2
  59. data/app/services/collavre/creatives/create_service.rb +86 -0
  60. data/app/services/collavre/creatives/destroy_service.rb +41 -0
  61. data/app/services/collavre/creatives/index_query.rb +3 -0
  62. data/app/services/collavre/markdown_converter.rb +240 -0
  63. data/app/services/collavre/mention_parser.rb +63 -0
  64. data/app/services/collavre/orchestration/agent_context_builder.rb +24 -8
  65. data/app/services/collavre/orchestration/agent_orchestrator.rb +59 -10
  66. data/app/services/collavre/orchestration/loop_breaker.rb +12 -7
  67. data/app/services/collavre/orchestration/policy_resolver.rb +16 -2
  68. data/app/services/collavre/orchestration/scheduler.rb +4 -3
  69. data/app/services/collavre/orchestration/stuck_detector.rb +1 -1
  70. data/app/services/collavre/system_events/context_builder.rb +1 -6
  71. data/app/services/collavre/tools/creative_batch_service.rb +107 -0
  72. data/app/services/collavre/tools/creative_update_service.rb +17 -12
  73. data/app/services/collavre/tools/cron_create_service.rb +17 -5
  74. data/app/views/admin/shared/_tabs.html.erb +2 -1
  75. data/app/views/collavre/admin/orchestration/show.html.erb +11 -0
  76. data/app/views/collavre/admin/settings/_system_tab.html.erb +138 -0
  77. data/app/views/collavre/admin/settings/_uiux_tab.html.erb +44 -0
  78. data/app/views/collavre/admin/settings/index.html.erb +11 -0
  79. data/app/views/collavre/admin/settings/uiux.html.erb +11 -0
  80. data/app/views/collavre/comments/_comment.html.erb +15 -5
  81. data/app/views/collavre/comments/_comments_popup.html.erb +9 -2
  82. data/app/views/collavre/creatives/_mobile_actions_menu.html.erb +0 -3
  83. data/app/views/collavre/creatives/_share_button.html.erb +0 -52
  84. data/app/views/collavre/creatives/_share_modal.html.erb +52 -0
  85. data/app/views/collavre/creatives/index.html.erb +5 -8
  86. data/app/views/collavre/shared/navigation/_panels.html.erb +2 -2
  87. data/app/views/collavre/user_themes/index.html.erb +7 -9
  88. data/app/views/collavre/users/_contact_management.html.erb +2 -1
  89. data/app/views/collavre/users/edit_ai.html.erb +7 -0
  90. data/app/views/collavre/users/index.html.erb +16 -1
  91. data/app/views/collavre/users/new_ai.html.erb +18 -8
  92. data/app/views/collavre/users/passkeys.html.erb +1 -1
  93. data/app/views/collavre/users/show.html.erb +1 -1
  94. data/app/views/layouts/collavre/slide.html.erb +8 -1
  95. data/config/locales/admin.en.yml +88 -0
  96. data/config/locales/admin.ko.yml +88 -0
  97. data/config/locales/ai_agent.en.yml +5 -1
  98. data/config/locales/ai_agent.ko.yml +5 -1
  99. data/config/locales/comments.en.yml +5 -1
  100. data/config/locales/comments.ko.yml +5 -1
  101. data/config/locales/orchestration.en.yml +8 -0
  102. data/config/locales/orchestration.ko.yml +8 -0
  103. data/config/locales/users.en.yml +12 -0
  104. data/config/locales/users.ko.yml +12 -0
  105. data/config/routes.rb +7 -1
  106. data/db/migrate/20260212011655_add_quoted_comment_to_comments.rb +7 -0
  107. data/db/migrate/20260213044247_add_agent_conf_to_users.rb +5 -0
  108. data/lib/collavre/engine.rb +25 -0
  109. data/lib/collavre/version.rb +1 -1
  110. metadata +32 -1
@@ -1,8 +1,36 @@
1
- /* #creatives {} - removed empty rule */
2
-
3
1
  :root {
4
2
  --creative-row-text-offset: 1.8em;
5
3
  --creative-loading-emojis: "🚀,🧠,🧩,🤝,🗂️,⚡";
4
+
5
+ /* Creative tree heading styles — defaults match pre-#799 behavior.
6
+ Themes that don't define these variables render identically to before. */
7
+ --creative-h1-size: 1.3em;
8
+ --creative-h2-size: 1.2em;
9
+ --creative-h3-size: 1.1em;
10
+ --creative-h1-weight: bold;
11
+ --creative-h2-weight: bold;
12
+ --creative-h3-weight: bold;
13
+ --creative-h1-color: inherit;
14
+ --creative-h2-color: inherit;
15
+ --creative-h3-color: inherit;
16
+ --creative-h1-bg: transparent;
17
+ --creative-h2-bg: transparent;
18
+ --creative-h3-bg: transparent;
19
+
20
+ /* Childless heading style (level 1-3 without children) */
21
+ --creative-childless-size: 1em;
22
+ --creative-childless-weight: 400;
23
+
24
+ /* Bullet style */
25
+ --creative-bullet-size: 5px;
26
+ /* --creative-bullet-color: NOT set here; inline fallback (currentColor) used.
27
+ Setting it at :root would freeze the value to :root scope,
28
+ ignoring dark-mode overrides on body. */
29
+
30
+ /* Tree line style — only size/opacity have safe defaults.
31
+ --creative-tree-line-color: NOT set here; inline fallback var(--border-color) used.
32
+ This ensures dark mode's --border-color override on body is respected. */
33
+ --creative-tree-line-opacity: 0.5;
6
34
  }
7
35
 
8
36
  .creative-actions-row,
@@ -33,10 +61,10 @@ html.creative-alignment-ready .page-title {
33
61
  display: none;
34
62
  position: absolute;
35
63
  z-index: 10;
36
- background: var(--color-section-bg);
37
- border: 1px solid var(--color-border);
64
+ background: var(--surface-section);
65
+ border: 1px solid var(--border-color);
38
66
  padding: 0.5em;
39
- box-shadow: 0 2px 8px var(--color-border);
67
+ box-shadow: 0 2px 8px var(--border-color);
40
68
  min-width: 220px;
41
69
  }
42
70
 
@@ -65,7 +93,7 @@ creative-tree-row.show-edit .creative-row {
65
93
  position: absolute;
66
94
  top: 50%;
67
95
  margin-left: 12px;
68
- color: #2196f3;
96
+ color: var(--color-active);
69
97
  font-size: 1.3em;
70
98
  transform: translateY(-50%);
71
99
  pointer-events: none;
@@ -77,13 +105,13 @@ creative-tree-row.show-edit .creative-row {
77
105
  display: none;
78
106
  pointer-events: none;
79
107
  background: rgba(33, 150, 243, 0.9);
80
- color: #fff;
81
- font-size: 12px;
108
+ color: var(--text-on-badge);
109
+ font-size: var(--text-0);
82
110
  padding: 2px 8px;
83
111
  border-radius: 4px;
84
112
  transform: translate(-50%, -170%);
85
113
  z-index: 9999;
86
- font-weight: 600;
114
+ font-weight: var(--weight-6);
87
115
  letter-spacing: 1px;
88
116
  }
89
117
 
@@ -113,9 +141,8 @@ creative-tree-row.show-edit .creative-row {
113
141
  bottom: 0;
114
142
  left: 50%;
115
143
  width: 1px;
116
- background-color: var(--color-border);
117
- /* Thin guide line */
118
- opacity: 0.5;
144
+ background-color: var(--creative-tree-line-color, var(--border-color));
145
+ opacity: var(--creative-tree-line-opacity, 0.5);
119
146
  }
120
147
 
121
148
  .creative-content {
@@ -132,7 +159,7 @@ creative-tree-row.show-edit .creative-row {
132
159
  .creative-content img {
133
160
  pointer-events: auto;
134
161
  position: relative;
135
- z-index: 1;
162
+ z-index: var(--layer-1);
136
163
  }
137
164
 
138
165
  .creative-row:hover .creative-content {
@@ -151,24 +178,24 @@ creative-tree-row.show-edit .creative-row {
151
178
 
152
179
  /* make it as same as <li> tag */
153
180
  .creative-tree-bullet {
154
- width: 5px;
155
- height: 5px;
156
- min-width: 5px;
157
- min-height: 5px;
158
- max-width: 5px;
159
- max-height: 5px;
181
+ width: var(--creative-bullet-size, 5px);
182
+ height: var(--creative-bullet-size, 5px);
183
+ min-width: var(--creative-bullet-size, 5px);
184
+ min-height: var(--creative-bullet-size, 5px);
185
+ max-width: var(--creative-bullet-size, 5px);
186
+ max-height: var(--creative-bullet-size, 5px);
160
187
  border-radius: 50%;
161
- background: var(--color-text);
188
+ background: var(--creative-bullet-color, currentColor);
162
189
  margin-left: 4px;
163
190
  margin-right: 8px;
164
- flex: 0 0 5px;
191
+ flex: 0 0 var(--creative-bullet-size, 5px);
165
192
  margin-top: 10px;
166
193
  /* Align with first line of text (approx) */
167
194
  }
168
195
 
169
196
  .creative-row-end {
170
197
  margin-left: 10px;
171
- color: var(--color-muted);
198
+ color: var(--text-muted);
172
199
  font-size: 0.9em;
173
200
  white-space: nowrap;
174
201
  display: flex;
@@ -189,13 +216,13 @@ creative-tree-row.show-edit .creative-row {
189
216
 
190
217
  .creative-progress-complete,
191
218
  .creative-progress-incomplete {
192
- color: var(--color-complete);
219
+ color: var(--color-brand);
193
220
  padding-top: 4px;
194
221
  /* Restore baseline alignment */
195
222
  }
196
223
 
197
224
  .creative-progress-incomplete {
198
- color: var(--color-muted);
225
+ color: var(--text-muted);
199
226
  }
200
227
 
201
228
  /* .creative-progress-incomplete {} - removed empty rule */
@@ -211,12 +238,12 @@ creative-tree-row.show-edit .creative-row {
211
238
  display: inline-flex;
212
239
  align-items: baseline;
213
240
  margin-left: 0.5em;
214
- color: var(--color-muted);
241
+ color: var(--text-muted);
215
242
  min-width: 1.5em;
216
243
  }
217
244
 
218
245
  .creative-loading-dot {
219
- font-weight: bold;
246
+ font-weight: var(--weight-7);
220
247
  display: inline-block;
221
248
  width: 1.05em;
222
249
  text-align: center;
@@ -228,7 +255,7 @@ creative-tree-row.show-edit .creative-row {
228
255
  display: flex;
229
256
  align-items: center;
230
257
  justify-content: center;
231
- color: var(--color-muted);
258
+ color: var(--text-muted);
232
259
  font-size: 1.2em;
233
260
  letter-spacing: 2px;
234
261
  }
@@ -240,7 +267,7 @@ creative-tree-row.show-edit .creative-row {
240
267
 
241
268
  .creative-action-btn {
242
269
  margin-left: 0px;
243
- font-size: 16px;
270
+ font-size: var(--text-1);
244
271
  cursor: pointer;
245
272
  background: none;
246
273
  border: none;
@@ -255,14 +282,14 @@ creative-tree-row.show-edit .creative-row {
255
282
 
256
283
  /* Ensure inline editor actions use the correct text color */
257
284
  #actions-inline-editor .creative-action-btn {
258
- color: var(--color-text);
285
+ color: var(--text-primary);
259
286
  }
260
287
 
261
288
  .creative-action-btn:disabled,
262
289
  .popup-menu-toggle:disabled,
263
290
  .popup-menu .popup-menu-item:disabled {
264
291
  opacity: 0.4;
265
- color: var(--color-muted);
292
+ color: var(--text-muted);
266
293
  cursor: not-allowed;
267
294
  filter: grayscale(100%);
268
295
  }
@@ -277,9 +304,9 @@ creative-tree-row.show-edit .creative-row {
277
304
  pointer-events: none;
278
305
  }
279
306
 
280
- .voice-input-active {
281
- background-color: #2ecc71;
282
- color: #ffffff;
307
+ #voice-comments-btn.voice-input-active {
308
+ background-color: var(--color-brand);
309
+ color: var(--surface-bg);
283
310
  border-radius: 6px;
284
311
  padding: 4px 8px;
285
312
  }
@@ -308,7 +335,7 @@ creative-tree-row:not([expanded]) .creative-toggle-btn {
308
335
 
309
336
  .add-creative-btn {
310
337
  font-size: 18px;
311
- font-weight: bold;
338
+ font-weight: var(--weight-7);
312
339
  text-decoration: none;
313
340
  }
314
341
 
@@ -317,14 +344,14 @@ creative-tree-row:not([expanded]) .creative-toggle-btn {
317
344
  .edit-inline-btn {
318
345
  visibility: hidden;
319
346
  opacity: 0;
320
- color: var(--color-text);
347
+ color: var(--text-primary);
321
348
  transition: opacity 0.2s ease;
322
349
  width: 20px;
323
350
  /* Fixed width for alignment */
324
351
  }
325
352
 
326
353
  .creative-row:hover .edit-inline-btn {
327
- color: var(--color-text);
354
+ color: var(--text-primary);
328
355
  visibility: visible;
329
356
  opacity: 1;
330
357
  }
@@ -356,7 +383,7 @@ creative-tree-row:not([expanded]) .creative-toggle-btn {
356
383
  position: relative;
357
384
  /* width: 6px; */
358
385
  margin-right: 2px;
359
- background-color: var(--color-border);
386
+ background-color: var(--border-color);
360
387
  display: flex;
361
388
  align-items: center;
362
389
  align-self: stretch;
@@ -373,7 +400,7 @@ creative-tree-row:not([expanded]) .creative-toggle-btn {
373
400
  width: 100%;
374
401
  height: 6px;
375
402
  /* border thickness */
376
- background: var(--color-bg);
403
+ background: var(--surface-bg);
377
404
  }
378
405
 
379
406
  .creative-divider::before {
@@ -405,15 +432,15 @@ creative-tree-row:not([expanded]) .creative-toggle-btn {
405
432
  }
406
433
 
407
434
  .creative-row.selected {
408
- background-color: var(--color-drag-over);
435
+ background-color: var(--border-drag-over);
409
436
  }
410
437
 
411
438
  .creative-row:hover {
412
- background-color: var(--color-border);
439
+ background-color: var(--border-color);
413
440
  }
414
441
 
415
442
  .creative-progress {
416
- color: var(--color-muted);
443
+ color: var(--text-muted);
417
444
  font-size: 0.9em;
418
445
  margin-left: 10px;
419
446
  padding-top: 4px;
@@ -438,13 +465,13 @@ creative-tree-row:not([expanded]) .creative-toggle-btn {
438
465
  align-items: center;
439
466
  justify-content: center;
440
467
  padding: 4px;
441
- border-radius: 999px;
468
+ border-radius: var(--radius-round);
442
469
  transition: background-color 0.2s ease;
443
470
  }
444
471
 
445
472
  .creative-origin-link:hover,
446
473
  .creative-origin-link:focus {
447
- background-color: var(--color-border);
474
+ background-color: var(--border-color);
448
475
  }
449
476
 
450
477
  .creative-origin-link-icon {
@@ -453,17 +480,23 @@ creative-tree-row:not([expanded]) .creative-toggle-btn {
453
480
  }
454
481
 
455
482
  .creative-row-start h1 {
456
- font-size: 1.3em;
483
+ font-size: var(--creative-h1-size, 1.3em);
484
+ font-weight: var(--creative-h1-weight, bold);
485
+ color: var(--creative-h1-color, inherit);
457
486
  margin: 0;
458
487
  }
459
488
 
460
489
  .creative-row-start h2 {
461
- font-size: 1.2em;
490
+ font-size: var(--creative-h2-size, 1.2em);
491
+ font-weight: var(--creative-h2-weight, bold);
492
+ color: var(--creative-h2-color, inherit);
462
493
  margin: 0;
463
494
  }
464
495
 
465
496
  .creative-row-start h3 {
466
- font-size: 1.1em;
497
+ font-size: var(--creative-h3-size, 1.1em);
498
+ font-weight: var(--creative-h3-weight, bold);
499
+ color: var(--creative-h3-color, inherit);
467
500
  margin: 0;
468
501
  }
469
502
 
@@ -473,6 +506,12 @@ creative-tree-row:not([expanded]) .creative-toggle-btn {
473
506
  margin: 0;
474
507
  }
475
508
 
509
+ /* Childless items (level 1-3 without children) rendered as plain text */
510
+ .creative-childless .creative-content {
511
+ font-size: var(--creative-childless-size, 1em);
512
+ font-weight: var(--creative-childless-weight, 400);
513
+ }
514
+
476
515
  /* Headings need specific alignment adjustments */
477
516
  .level-1 .creative-action-btn,
478
517
  .level-1 .select-creative-checkbox,
@@ -506,7 +545,7 @@ creative-tree-row:not([expanded]) .creative-toggle-btn {
506
545
  width: 28px;
507
546
  height: 28px;
508
547
  position: relative;
509
- color: var(--color-text);
548
+ color: var(--text-primary);
510
549
  margin-top: -2px;
511
550
  /* Move higher as requested */
512
551
  }
@@ -519,17 +558,28 @@ creative-tree-row:not([expanded]) .creative-toggle-btn {
519
558
  }
520
559
 
521
560
  /* Add spacing for headings via row padding to preserve alignment */
522
- .creative-row.level-1,
523
- .creative-row.level-2,
561
+ .creative-row.level-1 {
562
+ padding-top: 6px;
563
+ padding-bottom: 6px;
564
+ background-color: var(--creative-h1-bg, transparent);
565
+ }
566
+
567
+ .creative-row.level-2 {
568
+ padding-top: 6px;
569
+ padding-bottom: 6px;
570
+ background-color: var(--creative-h2-bg, transparent);
571
+ }
572
+
524
573
  .creative-row.level-3 {
525
574
  padding-top: 6px;
526
575
  padding-bottom: 6px;
576
+ background-color: var(--creative-h3-bg, transparent);
527
577
  }
528
578
 
529
579
  .comment-icon {
530
580
  width: 100%;
531
581
  height: 100%;
532
- color: var(--color-text);
582
+ color: var(--text-primary);
533
583
  }
534
584
 
535
585
  .comments-btn.no-comments {
@@ -555,5 +605,5 @@ creative-tree-row:not([expanded]) .creative-toggle-btn {
555
605
  }
556
606
 
557
607
  .comments-btn .badge[data-count="0"] {
558
- background: var(--color-complete);
608
+ background: var(--color-brand);
559
609
  }