@qnote/q-ai-note 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +50 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +55 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/server/aiClient.d.ts +11 -0
  7. package/dist/server/aiClient.d.ts.map +1 -0
  8. package/dist/server/aiClient.js +83 -0
  9. package/dist/server/aiClient.js.map +1 -0
  10. package/dist/server/api/batchRecovery.d.ts +11 -0
  11. package/dist/server/api/batchRecovery.d.ts.map +1 -0
  12. package/dist/server/api/batchRecovery.js +68 -0
  13. package/dist/server/api/batchRecovery.js.map +1 -0
  14. package/dist/server/api/chat.d.ts +3 -0
  15. package/dist/server/api/chat.d.ts.map +1 -0
  16. package/dist/server/api/chat.js +485 -0
  17. package/dist/server/api/chat.js.map +1 -0
  18. package/dist/server/api/diary.d.ts +3 -0
  19. package/dist/server/api/diary.d.ts.map +1 -0
  20. package/dist/server/api/diary.js +102 -0
  21. package/dist/server/api/diary.js.map +1 -0
  22. package/dist/server/api/sandbox.d.ts +3 -0
  23. package/dist/server/api/sandbox.d.ts.map +1 -0
  24. package/dist/server/api/sandbox.js +87 -0
  25. package/dist/server/api/sandbox.js.map +1 -0
  26. package/dist/server/api/settings.d.ts +3 -0
  27. package/dist/server/api/settings.d.ts.map +1 -0
  28. package/dist/server/api/settings.js +45 -0
  29. package/dist/server/api/settings.js.map +1 -0
  30. package/dist/server/api/workItem.d.ts +3 -0
  31. package/dist/server/api/workItem.d.ts.map +1 -0
  32. package/dist/server/api/workItem.js +290 -0
  33. package/dist/server/api/workItem.js.map +1 -0
  34. package/dist/server/chatUtils.d.ts +15 -0
  35. package/dist/server/chatUtils.d.ts.map +1 -0
  36. package/dist/server/chatUtils.js +52 -0
  37. package/dist/server/chatUtils.js.map +1 -0
  38. package/dist/server/config.d.ts +14 -0
  39. package/dist/server/config.d.ts.map +1 -0
  40. package/dist/server/config.js +56 -0
  41. package/dist/server/config.js.map +1 -0
  42. package/dist/server/db.d.ts +6 -0
  43. package/dist/server/db.d.ts.map +1 -0
  44. package/dist/server/db.js +106 -0
  45. package/dist/server/db.js.map +1 -0
  46. package/dist/server/index.d.ts +5 -0
  47. package/dist/server/index.d.ts.map +1 -0
  48. package/dist/server/index.js +72 -0
  49. package/dist/server/index.js.map +1 -0
  50. package/dist/server/react/agent.d.ts +56 -0
  51. package/dist/server/react/agent.d.ts.map +1 -0
  52. package/dist/server/react/agent.js +219 -0
  53. package/dist/server/react/agent.js.map +1 -0
  54. package/dist/server/react/prompts.d.ts +13 -0
  55. package/dist/server/react/prompts.d.ts.map +1 -0
  56. package/dist/server/react/prompts.js +84 -0
  57. package/dist/server/react/prompts.js.map +1 -0
  58. package/dist/server/react/tools.d.ts +67 -0
  59. package/dist/server/react/tools.d.ts.map +1 -0
  60. package/dist/server/react/tools.js +208 -0
  61. package/dist/server/react/tools.js.map +1 -0
  62. package/dist/server/types.d.ts +59 -0
  63. package/dist/server/types.d.ts.map +1 -0
  64. package/dist/server/types.js +2 -0
  65. package/dist/server/types.js.map +1 -0
  66. package/dist/web/app.js +1081 -0
  67. package/dist/web/chatView.js +31 -0
  68. package/dist/web/index.html +218 -0
  69. package/dist/web/shared.js +49 -0
  70. package/dist/web/styles.css +1320 -0
  71. package/dist/web/vueRenderers.js +191 -0
  72. package/package.json +46 -0
@@ -0,0 +1,1320 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ :root {
8
+ --primary: #1a73e8;
9
+ --primary-hover: #1557b0;
10
+ --bg: #ffffff;
11
+ --bg-secondary: #f8f9fa;
12
+ --text: #202124;
13
+ --text-secondary: #5f6368;
14
+ --border: #dadce0;
15
+ --hover: #f1f3f4;
16
+ --success: #34a853;
17
+ --warning: #fbbc04;
18
+ --error: #ea4335;
19
+ --shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
20
+ }
21
+
22
+ body {
23
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Google Sans', sans-serif;
24
+ background: var(--bg-secondary);
25
+ color: var(--text);
26
+ font-size: 14px;
27
+ line-height: 1.5;
28
+ }
29
+
30
+ #app {
31
+ display: flex;
32
+ min-height: 100vh;
33
+ }
34
+
35
+ /* Sidebar */
36
+ .sidebar {
37
+ width: 220px;
38
+ background: var(--bg);
39
+ border-right: 1px solid var(--border);
40
+ display: flex;
41
+ flex-direction: column;
42
+ position: fixed;
43
+ height: 100vh;
44
+ }
45
+
46
+ .sidebar-header {
47
+ padding: 18px 16px;
48
+ border-bottom: 1px solid var(--border);
49
+ }
50
+
51
+ .sidebar-header h1 {
52
+ font-size: 18px;
53
+ font-weight: 500;
54
+ color: var(--text);
55
+ }
56
+
57
+ .nav-list {
58
+ list-style: none;
59
+ padding: 12px 0;
60
+ flex: 1;
61
+ }
62
+
63
+ .nav-list a {
64
+ display: flex;
65
+ align-items: center;
66
+ gap: 12px;
67
+ padding: 10px 16px;
68
+ color: var(--text-secondary);
69
+ text-decoration: none;
70
+ transition: all 0.2s;
71
+ }
72
+
73
+ .nav-list a:hover {
74
+ background: var(--hover);
75
+ }
76
+
77
+ .nav-list a.active {
78
+ background: #e8f0fe;
79
+ color: var(--primary);
80
+ }
81
+
82
+ /* Main Content */
83
+ .content {
84
+ flex: 1;
85
+ margin-left: 220px;
86
+ padding: 24px 32px;
87
+ max-width: 1400px;
88
+ }
89
+
90
+ .page {
91
+ animation: fadeIn 0.2s ease;
92
+ }
93
+
94
+ .page.hidden {
95
+ display: none;
96
+ }
97
+
98
+ @keyframes fadeIn {
99
+ from { opacity: 0; transform: translateY(8px); }
100
+ to { opacity: 1; transform: translateY(0); }
101
+ }
102
+
103
+ h2 {
104
+ font-size: 22px;
105
+ font-weight: 500;
106
+ margin-bottom: 20px;
107
+ color: var(--text);
108
+ }
109
+
110
+ .section-header {
111
+ display: flex;
112
+ justify-content: space-between;
113
+ align-items: center;
114
+ margin-bottom: 12px;
115
+ font-size: 14px;
116
+ font-weight: 500;
117
+ color: var(--text-secondary);
118
+ }
119
+
120
+ .summary-strip {
121
+ display: flex;
122
+ flex-wrap: wrap;
123
+ align-items: stretch;
124
+ gap: 12px;
125
+ margin-bottom: 16px;
126
+ }
127
+
128
+ .summary-card {
129
+ background: var(--bg);
130
+ border: 1px solid var(--border);
131
+ border-radius: 10px;
132
+ padding: 10px 12px;
133
+ min-width: 180px;
134
+ flex: 1 1 220px;
135
+ }
136
+
137
+ .summary-card .label {
138
+ font-size: 12px;
139
+ color: var(--text-secondary);
140
+ }
141
+
142
+ .summary-card .value {
143
+ margin-top: 4px;
144
+ font-size: 18px;
145
+ font-weight: 600;
146
+ }
147
+
148
+ .action-strip {
149
+ display: flex;
150
+ align-items: center;
151
+ gap: 10px;
152
+ margin-bottom: 14px;
153
+ }
154
+
155
+ .action-strip input,
156
+ .action-strip select,
157
+ .inline-actions input,
158
+ .inline-actions select {
159
+ border: 1px solid var(--border);
160
+ border-radius: 8px;
161
+ padding: 8px 10px;
162
+ font-size: 13px;
163
+ background: var(--bg);
164
+ }
165
+
166
+ .inline-actions {
167
+ display: flex;
168
+ align-items: center;
169
+ gap: 8px;
170
+ }
171
+
172
+ .insight-box {
173
+ background: #eef3fd;
174
+ border: 1px solid #c6d5f8;
175
+ color: #17366f;
176
+ border-radius: 10px;
177
+ padding: 10px 12px;
178
+ margin-bottom: 12px;
179
+ white-space: pre-wrap;
180
+ }
181
+
182
+ .changes-list {
183
+ display: flex;
184
+ flex-direction: column;
185
+ gap: 10px;
186
+ }
187
+
188
+ .change-date-group {
189
+ display: flex;
190
+ flex-direction: column;
191
+ gap: 8px;
192
+ }
193
+
194
+ .change-date-title {
195
+ margin: 4px 0;
196
+ font-size: 13px;
197
+ color: var(--text-secondary);
198
+ }
199
+
200
+ .change-item {
201
+ background: var(--bg);
202
+ border: 1px solid var(--border);
203
+ border-radius: 10px;
204
+ padding: 10px 12px;
205
+ }
206
+
207
+ .change-meta {
208
+ display: flex;
209
+ gap: 10px;
210
+ align-items: center;
211
+ margin-bottom: 6px;
212
+ font-size: 12px;
213
+ color: var(--text-secondary);
214
+ }
215
+
216
+ .change-type {
217
+ font-size: 11px;
218
+ border-radius: 8px;
219
+ padding: 2px 8px;
220
+ color: #fff;
221
+ }
222
+
223
+ .change-type.create { background: var(--success); }
224
+ .change-type.update { background: var(--primary); }
225
+ .change-type.delete { background: var(--error); }
226
+
227
+ .change-detail {
228
+ font-size: 13px;
229
+ line-height: 1.5;
230
+ }
231
+
232
+ .change-diff-list {
233
+ margin-top: 6px;
234
+ display: flex;
235
+ flex-direction: column;
236
+ gap: 4px;
237
+ }
238
+
239
+ .change-diff-line {
240
+ font-size: 12px;
241
+ color: var(--text-secondary);
242
+ }
243
+
244
+ .btn-sm {
245
+ padding: 6px 14px;
246
+ font-size: 13px;
247
+ }
248
+
249
+ /* Cards */
250
+ .card {
251
+ background: var(--bg);
252
+ border-radius: 12px;
253
+ box-shadow: var(--shadow);
254
+ padding: 20px 24px;
255
+ margin-bottom: 16px;
256
+ transition: box-shadow 0.2s;
257
+ }
258
+
259
+ .card:hover {
260
+ box-shadow: 0 4px 8px rgba(0,0,0,0.16);
261
+ }
262
+
263
+ /* Sandbox List */
264
+ .sandbox-grid {
265
+ display: grid;
266
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
267
+ gap: 16px;
268
+ }
269
+
270
+ .sandbox-card {
271
+ cursor: pointer;
272
+ transition: transform 0.2s, box-shadow 0.2s;
273
+ }
274
+
275
+ .sandbox-card:hover {
276
+ transform: translateY(-2px);
277
+ }
278
+
279
+ .sandbox-card h3 {
280
+ font-size: 16px;
281
+ font-weight: 500;
282
+ margin-bottom: 8px;
283
+ }
284
+
285
+ .sandbox-card p {
286
+ color: var(--text-secondary);
287
+ font-size: 13px;
288
+ }
289
+
290
+ .sandbox-meta {
291
+ display: flex;
292
+ gap: 12px;
293
+ margin-top: 12px;
294
+ font-size: 12px;
295
+ color: var(--text-secondary);
296
+ }
297
+
298
+ /* Add Button */
299
+ .btn {
300
+ display: inline-flex;
301
+ align-items: center;
302
+ gap: 8px;
303
+ padding: 10px 20px;
304
+ border: none;
305
+ border-radius: 8px;
306
+ font-size: 14px;
307
+ font-weight: 500;
308
+ cursor: pointer;
309
+ transition: all 0.2s;
310
+ }
311
+
312
+ .btn-primary {
313
+ background: var(--primary);
314
+ color: white;
315
+ }
316
+
317
+ .btn-primary:hover {
318
+ background: var(--primary-hover);
319
+ }
320
+
321
+ .btn-secondary {
322
+ background: var(--hover);
323
+ color: var(--text);
324
+ }
325
+
326
+ .btn-secondary:hover {
327
+ background: #e8eaed;
328
+ }
329
+
330
+ /* Work Tree - Card Style Layout */
331
+ .work-tree {
332
+ flex: 1;
333
+ overflow-y: auto;
334
+ padding: 8px;
335
+ }
336
+
337
+ /* Parent Node Card */
338
+ .tree-parent-card {
339
+ background: var(--bg);
340
+ border: 1px solid var(--border);
341
+ border-radius: 12px;
342
+ margin-bottom: 12px;
343
+ overflow: visible;
344
+ }
345
+
346
+ .tree-parent-header {
347
+ position: relative;
348
+ display: flex;
349
+ align-items: center;
350
+ gap: 10px;
351
+ padding: 12px 14px;
352
+ background: linear-gradient(135deg, #f8f9fa 0%, #fff 100%);
353
+ cursor: pointer;
354
+ transition: background 0.2s;
355
+ }
356
+
357
+ .tree-parent-header:focus-visible,
358
+ .tree-leaf-node:focus-visible {
359
+ outline: 2px solid #c2dbff;
360
+ outline-offset: 2px;
361
+ }
362
+
363
+ .tree-parent-header:hover {
364
+ background: linear-gradient(135deg, #e8f0fe 0%, #f0f7ff 100%);
365
+ }
366
+
367
+ .tree-parent-header .node-status {
368
+ width: 10px;
369
+ height: 10px;
370
+ }
371
+
372
+ .tree-parent-header .node-name {
373
+ flex: 1;
374
+ font-weight: 600;
375
+ font-size: 15px;
376
+ }
377
+
378
+ .tree-parent-header .node-meta {
379
+ font-size: 12px;
380
+ color: var(--text-secondary);
381
+ background: var(--bg-secondary);
382
+ padding: 2px 8px;
383
+ border-radius: 10px;
384
+ }
385
+
386
+ .tree-parent-children {
387
+ padding: 8px 14px 14px 28px;
388
+ display: flex;
389
+ flex-direction: column;
390
+ gap: 6px;
391
+ border-top: 1px dashed var(--border);
392
+ background: #fafafa;
393
+ }
394
+
395
+ /* Child Node (non-leaf) */
396
+ .tree-child-node {
397
+ display: flex;
398
+ align-items: center;
399
+ gap: 8px;
400
+ padding: 8px 12px;
401
+ border-radius: 8px;
402
+ background: white;
403
+ border: 1px solid var(--border);
404
+ transition: all 0.15s;
405
+ }
406
+
407
+ .tree-child-node:hover {
408
+ border-color: var(--primary);
409
+ box-shadow: 0 2px 6px rgba(26, 115, 232, 0.15);
410
+ }
411
+
412
+ .tree-child-node .node-status {
413
+ width: 8px;
414
+ height: 8px;
415
+ }
416
+
417
+ .tree-child-node .node-name {
418
+ flex: 1;
419
+ font-size: 13px;
420
+ font-weight: 500;
421
+ }
422
+
423
+ .tree-child-node .node-meta {
424
+ font-size: 11px;
425
+ color: var(--text-secondary);
426
+ }
427
+
428
+ /* Leaf Nodes Container - Tiled/Paved */
429
+ .tree-leaf-container {
430
+ display: flex;
431
+ flex-direction: column;
432
+ gap: 8px;
433
+ padding: 10px 8px 2px;
434
+ background: linear-gradient(180deg, #f5f5f5 0%, #fafafa 100%);
435
+ border-top: 1px dashed var(--border);
436
+ margin-top: 4px;
437
+ width: 100%;
438
+ }
439
+
440
+ .tree-leaf-grid {
441
+ display: grid;
442
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
443
+ gap: 8px;
444
+ width: 100%;
445
+ }
446
+
447
+ /* Leaf Node Block */
448
+ .tree-leaf-node {
449
+ position: relative;
450
+ min-width: 0;
451
+ max-width: none;
452
+ padding: 8px 10px;
453
+ background: white;
454
+ border: 1px solid var(--border);
455
+ border-radius: 8px;
456
+ text-align: left;
457
+ cursor: pointer;
458
+ transition: all 0.2s;
459
+ display: flex;
460
+ align-items: center;
461
+ gap: 6px;
462
+ overflow: visible;
463
+ }
464
+
465
+ .tree-leaf-node:hover {
466
+ border-color: var(--primary);
467
+ transform: translateY(-2px);
468
+ box-shadow: 0 4px 12px rgba(0,0,0,0.1);
469
+ }
470
+
471
+ .tree-leaf-node .node-status {
472
+ display: inline-flex;
473
+ width: 6px;
474
+ height: 6px;
475
+ flex-shrink: 0;
476
+ }
477
+
478
+ .tree-leaf-node .node-name {
479
+ font-size: 12px;
480
+ font-weight: 500;
481
+ display: inline-block;
482
+ flex: 1;
483
+ overflow: hidden;
484
+ text-overflow: ellipsis;
485
+ white-space: nowrap;
486
+ }
487
+
488
+ .tree-leaf-node .node-name.short-name {
489
+ overflow: visible;
490
+ text-overflow: clip;
491
+ white-space: normal;
492
+ word-break: break-all;
493
+ }
494
+
495
+ /* Node Actions */
496
+ .node-actions {
497
+ position: absolute;
498
+ top: -10px;
499
+ right: -8px;
500
+ display: flex;
501
+ gap: 4px;
502
+ opacity: 0;
503
+ transform: translateY(-2px) scale(0.96);
504
+ pointer-events: none;
505
+ transition: opacity 0.18s ease, transform 0.18s ease;
506
+ z-index: 3;
507
+ background: #fff;
508
+ border: 1px solid var(--border);
509
+ border-radius: 999px;
510
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.14);
511
+ padding: 2px;
512
+ }
513
+
514
+ .tree-parent-header:hover .node-actions,
515
+ .tree-parent-header:focus .node-actions,
516
+ .tree-parent-header:focus-within .node-actions,
517
+ .tree-child-node:hover .node-actions,
518
+ .tree-leaf-node:hover .node-actions,
519
+ .tree-leaf-node:focus .node-actions,
520
+ .tree-leaf-node:focus-within .node-actions {
521
+ opacity: 1;
522
+ transform: translateY(0) scale(1);
523
+ pointer-events: auto;
524
+ }
525
+
526
+ .node-action-btn {
527
+ width: 22px;
528
+ height: 22px;
529
+ border: none;
530
+ border-radius: 999px;
531
+ background: transparent;
532
+ cursor: pointer;
533
+ display: flex;
534
+ align-items: center;
535
+ justify-content: center;
536
+ color: var(--text-secondary);
537
+ font-size: 12px;
538
+ transition: all 0.2s;
539
+ }
540
+
541
+ .node-action-btn:hover {
542
+ background: var(--border);
543
+ color: var(--text);
544
+ }
545
+
546
+ .node-action-btn.delete:hover {
547
+ background: #fce8e6;
548
+ color: var(--error);
549
+ }
550
+
551
+ .node-action-btn.add-child {
552
+ background: var(--primary);
553
+ color: white;
554
+ }
555
+
556
+ .node-action-btn.add-child:hover {
557
+ background: var(--primary-hover);
558
+ }
559
+
560
+ .node-status.pending { background: #9aa0a6; }
561
+ .node-status.in_progress { background: var(--primary); }
562
+ .node-status.done { background: var(--success); }
563
+ .node-status.archived { background: #bdc1c6; }
564
+
565
+ .node-name {
566
+ flex: 1;
567
+ font-weight: 500;
568
+ font-size: 14px;
569
+ }
570
+
571
+ .node-tag {
572
+ font-size: 11px;
573
+ padding: 2px 8px;
574
+ border-radius: 12px;
575
+ background: var(--bg-secondary);
576
+ color: var(--text-secondary);
577
+ }
578
+
579
+ .node-meta {
580
+ font-size: 12px;
581
+ color: var(--text-secondary);
582
+ margin-right: 8px;
583
+ }
584
+
585
+ .tree-children {
586
+ margin-left: 24px;
587
+ }
588
+
589
+ .add-child-btn {
590
+ width: 24px;
591
+ height: 24px;
592
+ border: 1px dashed var(--border);
593
+ border-radius: 4px;
594
+ background: transparent;
595
+ cursor: pointer;
596
+ display: flex;
597
+ align-items: center;
598
+ justify-content: center;
599
+ color: var(--text-secondary);
600
+ margin-left: 32px;
601
+ opacity: 0;
602
+ transition: all 0.2s;
603
+ }
604
+
605
+ .tree-node:hover .add-child-btn {
606
+ opacity: 1;
607
+ }
608
+
609
+ .add-child-btn:hover {
610
+ border-color: var(--primary);
611
+ color: var(--primary);
612
+ background: #e8f0fe;
613
+ }
614
+
615
+ /* Chat */
616
+ .chat-container {
617
+ background: var(--bg);
618
+ border-radius: 16px;
619
+ box-shadow: var(--shadow);
620
+ display: flex;
621
+ flex-direction: column;
622
+ height: calc(100vh - 200px);
623
+ min-height: 500px;
624
+ }
625
+
626
+ .chat-messages {
627
+ flex: 1;
628
+ overflow-y: auto;
629
+ padding: 20px;
630
+ display: flex;
631
+ flex-direction: column;
632
+ gap: 12px;
633
+ }
634
+
635
+ .chat-message {
636
+ max-width: 75%;
637
+ padding: 10px 14px;
638
+ border-radius: 14px;
639
+ animation: fadeIn 0.2s;
640
+ line-height: 1.5;
641
+ font-size: 14px;
642
+ word-break: break-word;
643
+ }
644
+
645
+ .chat-message.user {
646
+ align-self: flex-end;
647
+ background: var(--primary);
648
+ color: white;
649
+ border-bottom-right-radius: 4px;
650
+ }
651
+
652
+ .chat-message.assistant {
653
+ align-self: flex-start;
654
+ background: var(--bg-secondary);
655
+ border-bottom-left-radius: 4px;
656
+ }
657
+
658
+ .chat-message.assistant.loading {
659
+ color: var(--text-secondary);
660
+ font-style: italic;
661
+ }
662
+
663
+ .chat-message.assistant.error {
664
+ background: #fce8e6;
665
+ color: var(--error);
666
+ border-left: 3px solid var(--error);
667
+ }
668
+
669
+ .operation-result {
670
+ display: flex;
671
+ align-items: center;
672
+ gap: 8px;
673
+ }
674
+
675
+ .operation-result .status-icon {
676
+ font-size: 16px;
677
+ }
678
+
679
+ .operation-result.is-partial .status-icon {
680
+ color: #b26a00;
681
+ }
682
+
683
+ .operation-result.is-failed .status-icon {
684
+ color: var(--error);
685
+ }
686
+
687
+ .operation-result .result-text {
688
+ flex: 1;
689
+ }
690
+
691
+ .btn-sm {
692
+ padding: 4px 10px;
693
+ font-size: 12px;
694
+ border-radius: 4px;
695
+ cursor: pointer;
696
+ border: 1px solid var(--border);
697
+ background: white;
698
+ color: var(--text-secondary);
699
+ transition: all 0.2s;
700
+ }
701
+
702
+ .btn-sm:hover {
703
+ background: #fce8e6;
704
+ color: var(--error);
705
+ border-color: var(--error);
706
+ }
707
+
708
+ .btn-sm.undone {
709
+ background: #e6f4ea;
710
+ color: var(--success);
711
+ border-color: var(--success);
712
+ }
713
+
714
+ .loading-dots::after {
715
+ content: '...';
716
+ animation: dots 1.5s infinite;
717
+ }
718
+
719
+ @keyframes dots {
720
+ 0%, 20% { content: '.'; }
721
+ 40% { content: '..'; }
722
+ 60%, 100% { content: '...'; }
723
+ }
724
+
725
+ .chat-message.diary {
726
+ align-self: flex-start;
727
+ background: #fef7e0;
728
+ border-left: 3px solid var(--warning);
729
+ }
730
+
731
+ .chat-input {
732
+ display: flex;
733
+ gap: 12px;
734
+ padding: 16px 24px;
735
+ border-top: 1px solid var(--border);
736
+ background: var(--bg);
737
+ border-radius: 0 0 16px 16px;
738
+ }
739
+
740
+ .chat-input input {
741
+ flex: 1;
742
+ padding: 12px 16px;
743
+ border: 1px solid var(--border);
744
+ border-radius: 24px;
745
+ font-size: 14px;
746
+ outline: none;
747
+ transition: border-color 0.2s;
748
+ }
749
+
750
+ .chat-input input:focus {
751
+ border-color: var(--primary);
752
+ }
753
+
754
+ .chat-input button {
755
+ padding: 10px 24px;
756
+ background: var(--primary);
757
+ color: white;
758
+ border: none;
759
+ border-radius: 24px;
760
+ font-weight: 500;
761
+ cursor: pointer;
762
+ transition: background 0.2s;
763
+ }
764
+
765
+ .chat-input button:hover {
766
+ background: var(--primary-hover);
767
+ }
768
+
769
+ /* Diary */
770
+ .diary-form {
771
+ background: var(--bg);
772
+ border-radius: 12px;
773
+ padding: 20px;
774
+ margin-bottom: 24px;
775
+ box-shadow: var(--shadow);
776
+ }
777
+
778
+ .diary-form select {
779
+ padding: 10px 12px;
780
+ border: 1px solid var(--border);
781
+ border-radius: 8px;
782
+ font-size: 14px;
783
+ margin-bottom: 12px;
784
+ min-width: 200px;
785
+ }
786
+
787
+ .diary-form textarea {
788
+ width: 100%;
789
+ min-height: 80px;
790
+ padding: 12px;
791
+ border: 1px solid var(--border);
792
+ border-radius: 8px;
793
+ font-family: inherit;
794
+ font-size: 14px;
795
+ resize: vertical;
796
+ }
797
+
798
+ .diary-form textarea:focus {
799
+ outline: none;
800
+ border-color: var(--primary);
801
+ }
802
+
803
+ .diary-timeline {
804
+ position: relative;
805
+ padding-left: 24px;
806
+ }
807
+
808
+ .diary-timeline::before {
809
+ content: '';
810
+ position: absolute;
811
+ left: 7px;
812
+ top: 0;
813
+ bottom: 0;
814
+ width: 2px;
815
+ background: var(--border);
816
+ }
817
+
818
+ .diary-item {
819
+ position: relative;
820
+ padding: 16px 20px;
821
+ margin-bottom: 16px;
822
+ background: var(--bg);
823
+ border-radius: 12px;
824
+ box-shadow: var(--shadow);
825
+ }
826
+
827
+ .diary-item::before {
828
+ content: '';
829
+ position: absolute;
830
+ left: -20px;
831
+ top: 24px;
832
+ width: 12px;
833
+ height: 12px;
834
+ background: var(--warning);
835
+ border-radius: 50%;
836
+ border: 2px solid var(--bg);
837
+ }
838
+
839
+ .diary-meta {
840
+ font-size: 12px;
841
+ color: var(--text-secondary);
842
+ margin-bottom: 8px;
843
+ }
844
+
845
+ .diary-content {
846
+ line-height: 1.6;
847
+ }
848
+
849
+ .diary-actions {
850
+ display: flex;
851
+ gap: 8px;
852
+ margin-top: 12px;
853
+ }
854
+
855
+ .diary-actions button {
856
+ padding: 6px 12px;
857
+ border: none;
858
+ border-radius: 6px;
859
+ font-size: 12px;
860
+ cursor: pointer;
861
+ transition: all 0.2s;
862
+ }
863
+
864
+ .diary-actions .confirm {
865
+ background: #e6f4ea;
866
+ color: var(--success);
867
+ }
868
+
869
+ .diary-actions .ignore {
870
+ background: #f1f3f4;
871
+ color: var(--text-secondary);
872
+ }
873
+
874
+ /* Settings */
875
+ .settings-form {
876
+ background: var(--bg);
877
+ border-radius: 12px;
878
+ padding: 24px;
879
+ max-width: 600px;
880
+ box-shadow: var(--shadow);
881
+ }
882
+
883
+ .setting-group {
884
+ margin-bottom: 24px;
885
+ }
886
+
887
+ .setting-group label {
888
+ display: block;
889
+ font-weight: 500;
890
+ margin-bottom: 8px;
891
+ color: var(--text);
892
+ }
893
+
894
+ .setting-group input {
895
+ width: 100%;
896
+ padding: 12px;
897
+ border: 1px solid var(--border);
898
+ border-radius: 8px;
899
+ font-size: 14px;
900
+ }
901
+
902
+ .setting-group input:focus {
903
+ outline: none;
904
+ border-color: var(--primary);
905
+ }
906
+
907
+ /* Dialog */
908
+ dialog {
909
+ position: fixed;
910
+ top: 50%;
911
+ left: 50%;
912
+ transform: translate(-50%, -50%);
913
+ padding: 0;
914
+ border: none;
915
+ border-radius: 16px;
916
+ box-shadow: 0 24px 38px rgba(0,0,0,0.25);
917
+ max-width: 420px;
918
+ width: 90%;
919
+ max-height: 80vh;
920
+ overflow-y: auto;
921
+ }
922
+
923
+ dialog::backdrop {
924
+ background: rgba(0,0,0,0.3);
925
+ }
926
+
927
+ .dialog-toggle {
928
+ position: fixed;
929
+ right: 24px;
930
+ top: 24px;
931
+ z-index: 100;
932
+ width: 48px;
933
+ height: 48px;
934
+ border-radius: 50%;
935
+ background: var(--primary);
936
+ color: white;
937
+ border: none;
938
+ cursor: pointer;
939
+ display: flex;
940
+ align-items: center;
941
+ justify-content: center;
942
+ box-shadow: var(--shadow);
943
+ font-size: 20px;
944
+ transition: all 0.2s;
945
+ }
946
+
947
+ .dialog-toggle:hover {
948
+ background: var(--primary-hover);
949
+ transform: scale(1.05);
950
+ }
951
+
952
+ .dialog-toggle.hidden {
953
+ display: flex;
954
+ }
955
+
956
+ #sandbox-dialog:not([open]),
957
+ #item-dialog:not([open]) {
958
+ display: none;
959
+ }
960
+
961
+ #sandbox-dialog:not([open]) + .dialog-toggle,
962
+ #item-dialog:not([open]) + .dialog-toggle {
963
+ display: flex;
964
+ }
965
+
966
+ #sandbox-dialog[open] + .dialog-toggle,
967
+ #item-dialog[open] + .dialog-toggle {
968
+ display: none;
969
+ }
970
+
971
+ .dialog-content {
972
+ padding: 24px;
973
+ }
974
+
975
+ .dialog-content h3 {
976
+ margin-bottom: 20px;
977
+ font-size: 18px;
978
+ }
979
+
980
+ .dialog-content input,
981
+ .dialog-content textarea,
982
+ .dialog-content select {
983
+ width: 100%;
984
+ padding: 12px;
985
+ margin-bottom: 16px;
986
+ border: 1px solid var(--border);
987
+ border-radius: 8px;
988
+ font-family: inherit;
989
+ font-size: 14px;
990
+ }
991
+
992
+ .dialog-content input:focus,
993
+ .dialog-content textarea:focus,
994
+ .dialog-content select:focus {
995
+ outline: none;
996
+ border-color: var(--primary);
997
+ }
998
+
999
+ .dialog-actions {
1000
+ display: flex;
1001
+ justify-content: flex-end;
1002
+ gap: 12px;
1003
+ padding: 16px 24px;
1004
+ border-top: 1px solid var(--border);
1005
+ background: var(--bg-secondary);
1006
+ border-radius: 0 0 16px 16px;
1007
+ }
1008
+
1009
+ .dialog-actions button {
1010
+ padding: 10px 20px;
1011
+ border: none;
1012
+ border-radius: 8px;
1013
+ font-weight: 500;
1014
+ cursor: pointer;
1015
+ transition: all 0.2s;
1016
+ }
1017
+
1018
+ .dialog-actions .cancel {
1019
+ background: var(--hover);
1020
+ color: var(--text);
1021
+ }
1022
+
1023
+ .dialog-actions .submit {
1024
+ background: var(--primary);
1025
+ color: white;
1026
+ }
1027
+
1028
+ /* Back Link */
1029
+ .back-link {
1030
+ display: inline-flex;
1031
+ align-items: center;
1032
+ gap: 8px;
1033
+ color: var(--primary);
1034
+ text-decoration: none;
1035
+ font-size: 14px;
1036
+ margin-bottom: 20px;
1037
+ }
1038
+
1039
+ .back-link:hover {
1040
+ text-decoration: underline;
1041
+ }
1042
+
1043
+ /* Sandbox Actions */
1044
+ .sandbox-actions {
1045
+ display: flex;
1046
+ gap: 12px;
1047
+ margin-bottom: 24px;
1048
+ }
1049
+
1050
+ /* Sandbox Layout - Left/Right */
1051
+ .sandbox-layout {
1052
+ display: grid;
1053
+ grid-template-columns: minmax(0, 1fr) 320px;
1054
+ gap: 12px;
1055
+ height: calc(100vh - 180px);
1056
+ padding-right: 10px;
1057
+ box-sizing: border-box;
1058
+ }
1059
+
1060
+ .sandbox-tree-section {
1061
+ width: 100%;
1062
+ min-width: 0;
1063
+ display: flex;
1064
+ flex-direction: column;
1065
+ background: var(--bg);
1066
+ border-radius: 12px;
1067
+ padding: 16px;
1068
+ box-shadow: var(--shadow);
1069
+ overflow: hidden;
1070
+ }
1071
+
1072
+ .sandbox-chat-section {
1073
+ width: 100%;
1074
+ min-width: 0;
1075
+ display: flex;
1076
+ flex-direction: column;
1077
+ background: var(--bg);
1078
+ border-radius: 12px;
1079
+ padding: 12px;
1080
+ margin-right: 2px;
1081
+ box-shadow: var(--shadow);
1082
+ overflow: hidden;
1083
+ }
1084
+
1085
+ .sandbox-chat-section .chat-container {
1086
+ flex: 1;
1087
+ height: auto;
1088
+ min-height: 0;
1089
+ box-shadow: none;
1090
+ }
1091
+
1092
+ .sandbox-chat-section .chat-messages {
1093
+ flex: 1;
1094
+ overflow-y: auto;
1095
+ }
1096
+
1097
+ /* Sandbox Chat */
1098
+ .sandbox-chat {
1099
+ margin-top: 32px;
1100
+ }
1101
+
1102
+ .sandbox-chat h3 {
1103
+ font-size: 16px;
1104
+ margin-bottom: 16px;
1105
+ color: var(--text-secondary);
1106
+ }
1107
+
1108
+ /* Empty State */
1109
+ .empty-state {
1110
+ text-align: center;
1111
+ padding: 48px;
1112
+ color: var(--text-secondary);
1113
+ }
1114
+
1115
+ .empty-state p {
1116
+ margin-bottom: 16px;
1117
+ }
1118
+
1119
+ /* Status Badge */
1120
+ .status-badge {
1121
+ display: inline-flex;
1122
+ align-items: center;
1123
+ gap: 6px;
1124
+ font-size: 12px;
1125
+ padding: 4px 10px;
1126
+ border-radius: 12px;
1127
+ }
1128
+
1129
+ .status-badge.pending {
1130
+ background: #f1f3f4;
1131
+ color: #5f6368;
1132
+ }
1133
+
1134
+ .status-badge.in_progress {
1135
+ background: #e8f0fe;
1136
+ color: #1a73e8;
1137
+ }
1138
+
1139
+ .status-badge.done {
1140
+ background: #e6f4ea;
1141
+ color: #34a853;
1142
+ }
1143
+
1144
+ .status-badge.archived {
1145
+ background: #f1f3f4;
1146
+ color: #9aa0a6;
1147
+ }
1148
+
1149
+ /* Delete button in card */
1150
+ .sandbox-delete {
1151
+ opacity: 0;
1152
+ transition: opacity 0.2s;
1153
+ }
1154
+
1155
+ .sandbox-card:hover .sandbox-delete {
1156
+ opacity: 1;
1157
+ }
1158
+
1159
+ /* Suggestions Panel */
1160
+ .suggestions-panel {
1161
+ background: #e8f0fe;
1162
+ border: 1px solid var(--primary);
1163
+ border-radius: 12px;
1164
+ padding: 16px;
1165
+ margin: 16px 0;
1166
+ }
1167
+
1168
+ .suggestions-panel h4 {
1169
+ font-size: 14px;
1170
+ font-weight: 500;
1171
+ margin-bottom: 12px;
1172
+ color: var(--primary);
1173
+ }
1174
+
1175
+ .suggestion-item {
1176
+ display: flex;
1177
+ align-items: center;
1178
+ gap: 12px;
1179
+ padding: 8px 12px;
1180
+ background: var(--bg);
1181
+ border-radius: 8px;
1182
+ margin-bottom: 8px;
1183
+ }
1184
+
1185
+ .suggestion-action {
1186
+ font-size: 12px;
1187
+ padding: 2px 8px;
1188
+ border-radius: 4px;
1189
+ background: var(--primary);
1190
+ color: white;
1191
+ }
1192
+
1193
+ .suggestion-action.create {
1194
+ background: var(--success);
1195
+ }
1196
+
1197
+ .suggestion-action.update {
1198
+ background: var(--warning);
1199
+ color: var(--text);
1200
+ }
1201
+
1202
+ .suggestion-action.delete {
1203
+ background: var(--error);
1204
+ }
1205
+
1206
+ .suggestion-name {
1207
+ font-weight: 500;
1208
+ flex: 1;
1209
+ }
1210
+
1211
+ .suggestion-desc {
1212
+ font-size: 12px;
1213
+ color: var(--text-secondary);
1214
+ }
1215
+
1216
+ .suggestions-panel .btn {
1217
+ margin-top: 12px;
1218
+ }
1219
+
1220
+ /* Confirm Panel (ReAct) */
1221
+ .confirm-panel {
1222
+ background: linear-gradient(135deg, #fef7e0 0%, #fff9e6 100%);
1223
+ border: 1px solid #f59e0b;
1224
+ border-radius: 12px;
1225
+ padding: 14px;
1226
+ margin: 8px 0;
1227
+ width: 100%;
1228
+ box-shadow: 0 2px 8px rgba(245, 158, 11, 0.15);
1229
+ }
1230
+
1231
+ .ai-thought {
1232
+ font-size: 12px;
1233
+ color: #92400e;
1234
+ padding: 8px 12px;
1235
+ background: rgba(255, 255, 255, 0.6);
1236
+ border-radius: 8px;
1237
+ margin-bottom: 10px;
1238
+ font-style: italic;
1239
+ border-left: 3px solid #f59e0b;
1240
+ }
1241
+
1242
+ .confirm-panel h4 {
1243
+ font-size: 13px;
1244
+ font-weight: 500;
1245
+ margin-bottom: 10px;
1246
+ color: var(--text);
1247
+ }
1248
+
1249
+ .confirm-panel .confirm-item {
1250
+ background: white;
1251
+ border-radius: 8px;
1252
+ padding: 10px 12px;
1253
+ margin-bottom: 8px;
1254
+ border: 1px solid #e5e7eb;
1255
+ }
1256
+
1257
+ .confirm-actions {
1258
+ display: flex;
1259
+ gap: 10px;
1260
+ justify-content: flex-end;
1261
+ margin-top: 12px;
1262
+ }
1263
+
1264
+ .confirm-actions .btn {
1265
+ padding: 8px 16px;
1266
+ font-size: 13px;
1267
+ }
1268
+
1269
+ .confirm-item {
1270
+ display: flex;
1271
+ align-items: center;
1272
+ gap: 12px;
1273
+ padding: 10px 12px;
1274
+ background: var(--bg);
1275
+ border-radius: 8px;
1276
+ margin-bottom: 8px;
1277
+ }
1278
+
1279
+ .confirm-action {
1280
+ font-size: 12px;
1281
+ padding: 2px 8px;
1282
+ border-radius: 4px;
1283
+ }
1284
+
1285
+ .confirm-action.create_work_item {
1286
+ background: var(--success);
1287
+ color: white;
1288
+ }
1289
+
1290
+ .confirm-action.update_work_item {
1291
+ background: var(--warning);
1292
+ color: var(--text);
1293
+ }
1294
+
1295
+ .confirm-action.delete_work_item {
1296
+ background: var(--error);
1297
+ color: white;
1298
+ }
1299
+
1300
+ .confirm-action.move_work_item {
1301
+ background: var(--primary);
1302
+ color: white;
1303
+ }
1304
+
1305
+ .confirm-name {
1306
+ font-weight: 500;
1307
+ flex: 1;
1308
+ }
1309
+
1310
+ .confirm-desc {
1311
+ font-size: 12px;
1312
+ color: var(--text-secondary);
1313
+ }
1314
+
1315
+ .confirm-actions {
1316
+ display: flex;
1317
+ gap: 12px;
1318
+ justify-content: flex-end;
1319
+ margin-top: 16px;
1320
+ }