@lazyingart/agintiflow 0.1.0 → 0.2.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.
package/public/styles.css CHANGED
@@ -34,7 +34,8 @@ body {
34
34
 
35
35
  .stack {
36
36
  display: grid;
37
- gap: 20px;
37
+ align-content: start;
38
+ gap: 14px;
38
39
  }
39
40
 
40
41
  .panel {
@@ -101,7 +102,8 @@ h1 {
101
102
  }
102
103
 
103
104
  .route-hint,
104
- .wrapper-status {
105
+ .wrapper-status,
106
+ .package-warning {
105
107
  margin: -4px 0 0;
106
108
  font-size: 0.88rem;
107
109
  line-height: 1.45;
@@ -151,11 +153,98 @@ textarea {
151
153
  grid-template-columns: repeat(2, minmax(0, 1fr));
152
154
  }
153
155
 
154
- .checks label {
156
+ .switch-label {
157
+ position: relative;
155
158
  align-items: center;
156
- grid-auto-flow: column;
159
+ display: grid;
160
+ grid-template-columns: auto minmax(0, 1fr);
157
161
  justify-content: start;
158
- gap: 10px;
162
+ gap: 12px;
163
+ min-height: 44px;
164
+ padding: 9px 10px;
165
+ border: 1px solid var(--line);
166
+ border-radius: 14px;
167
+ background: rgba(255, 253, 250, 0.72);
168
+ cursor: pointer;
169
+ user-select: none;
170
+ }
171
+
172
+ .switch-label input[type="checkbox"] {
173
+ position: absolute;
174
+ width: 1px;
175
+ height: 1px;
176
+ margin: 0;
177
+ padding: 0;
178
+ opacity: 0;
179
+ pointer-events: none;
180
+ }
181
+
182
+ .switch {
183
+ position: relative;
184
+ display: inline-flex;
185
+ width: 62px;
186
+ height: 32px;
187
+ align-items: center;
188
+ border: 1px solid rgba(95, 86, 74, 0.24);
189
+ border-radius: 999px;
190
+ background: #d8d0c3;
191
+ box-shadow: inset 0 2px 8px rgba(62, 49, 26, 0.14);
192
+ transition:
193
+ background 180ms ease,
194
+ border-color 180ms ease,
195
+ box-shadow 180ms ease;
196
+ }
197
+
198
+ .switch::before {
199
+ position: absolute;
200
+ left: 4px;
201
+ width: 24px;
202
+ height: 24px;
203
+ border-radius: 50%;
204
+ background: #fffdfa;
205
+ box-shadow: 0 3px 10px rgba(62, 49, 26, 0.24);
206
+ content: "";
207
+ transition: transform 180ms ease;
208
+ }
209
+
210
+ .switch::after {
211
+ position: absolute;
212
+ right: 8px;
213
+ color: rgba(95, 86, 74, 0.8);
214
+ font-size: 0.64rem;
215
+ font-weight: 900;
216
+ letter-spacing: 0.04em;
217
+ content: "OFF";
218
+ }
219
+
220
+ .switch-label input[type="checkbox"]:checked + .switch {
221
+ border-color: rgba(15, 118, 110, 0.46);
222
+ background: linear-gradient(135deg, var(--accent), #12b8aa);
223
+ box-shadow: inset 0 2px 10px rgba(4, 88, 81, 0.22);
224
+ }
225
+
226
+ .switch-label input[type="checkbox"]:checked + .switch::before {
227
+ transform: translateX(30px);
228
+ }
229
+
230
+ .switch-label input[type="checkbox"]:checked + .switch::after {
231
+ right: auto;
232
+ left: 9px;
233
+ color: white;
234
+ content: "ON";
235
+ }
236
+
237
+ .switch-label input[type="checkbox"]:focus-visible + .switch {
238
+ outline: 3px solid rgba(15, 118, 110, 0.22);
239
+ outline-offset: 3px;
240
+ }
241
+
242
+ .wrapper-controls {
243
+ grid-template-columns: minmax(0, 1fr) 180px;
244
+ }
245
+
246
+ .switch-card {
247
+ min-height: 100%;
159
248
  }
160
249
 
161
250
  button {
@@ -174,6 +263,46 @@ button.secondary {
174
263
  color: var(--ink);
175
264
  }
176
265
 
266
+ button.danger {
267
+ background: linear-gradient(135deg, #b42318, #dc6803);
268
+ }
269
+
270
+ .icon-button {
271
+ position: relative;
272
+ width: 42px;
273
+ min-width: 42px;
274
+ height: 42px;
275
+ padding: 0;
276
+ border: 1px solid var(--line);
277
+ background: #fffdfa;
278
+ color: var(--ink);
279
+ box-shadow: none;
280
+ }
281
+
282
+ .artifact-button {
283
+ width: auto;
284
+ min-width: 78px;
285
+ padding: 0 14px;
286
+ font-weight: 800;
287
+ }
288
+
289
+ .artifact-badge {
290
+ position: absolute;
291
+ top: -7px;
292
+ right: -7px;
293
+ min-width: 20px;
294
+ height: 20px;
295
+ padding: 0 6px;
296
+ border: 2px solid #fffdfa;
297
+ border-radius: 999px;
298
+ background: #d92d20;
299
+ color: white;
300
+ font-size: 0.68rem;
301
+ font-weight: 900;
302
+ line-height: 16px;
303
+ text-align: center;
304
+ }
305
+
177
306
  .actions,
178
307
  .header-row {
179
308
  display: flex;
@@ -192,6 +321,104 @@ button.secondary {
192
321
  background: rgba(255, 253, 250, 0.7);
193
322
  }
194
323
 
324
+ .capability-card {
325
+ display: grid;
326
+ gap: 12px;
327
+ padding: 14px;
328
+ border: 1px solid rgba(217, 119, 6, 0.2);
329
+ border-radius: 16px;
330
+ background: linear-gradient(135deg, rgba(255, 253, 250, 0.9), rgba(236, 253, 245, 0.58));
331
+ }
332
+
333
+ .capability-card h2 {
334
+ margin: 0 0 4px;
335
+ font-size: 1.05rem;
336
+ }
337
+
338
+ .capability-grid {
339
+ display: grid;
340
+ gap: 8px;
341
+ grid-template-columns: repeat(auto-fit, minmax(108px, 1fr));
342
+ }
343
+
344
+ .capability-chip {
345
+ padding: 9px 10px;
346
+ border: 1px solid var(--line);
347
+ border-radius: 12px;
348
+ background: #fffdfa;
349
+ font-size: 0.82rem;
350
+ line-height: 1.25;
351
+ }
352
+
353
+ .capability-chip strong {
354
+ display: block;
355
+ margin-bottom: 2px;
356
+ }
357
+
358
+ .capability-chip[data-ready="true"] {
359
+ border-color: rgba(15, 118, 110, 0.35);
360
+ }
361
+
362
+ .capability-chip[data-ready="false"] {
363
+ opacity: 0.72;
364
+ }
365
+
366
+ .capability-chip[data-selected="true"] {
367
+ border-color: rgba(15, 118, 110, 0.62);
368
+ box-shadow: 0 0 0 2px rgba(15, 118, 110, 0.1);
369
+ }
370
+
371
+ .workspace-card {
372
+ border-color: rgba(0, 111, 238, 0.18);
373
+ background: linear-gradient(135deg, rgba(255, 253, 250, 0.9), rgba(239, 246, 255, 0.72));
374
+ }
375
+
376
+ .workspace-changes {
377
+ display: grid;
378
+ gap: 8px;
379
+ }
380
+
381
+ .change-item {
382
+ padding: 10px;
383
+ border: 1px solid var(--line);
384
+ border-radius: 12px;
385
+ background: rgba(255, 253, 250, 0.82);
386
+ }
387
+
388
+ .change-item.blocked {
389
+ border-color: rgba(217, 119, 6, 0.28);
390
+ }
391
+
392
+ .change-meta {
393
+ display: flex;
394
+ flex-wrap: wrap;
395
+ gap: 6px;
396
+ color: var(--muted);
397
+ font-size: 0.78rem;
398
+ line-height: 1.35;
399
+ }
400
+
401
+ .change-path {
402
+ display: block;
403
+ margin: 4px 0;
404
+ font-family: "IBM Plex Mono", "SFMono-Regular", monospace;
405
+ font-size: 0.82rem;
406
+ }
407
+
408
+ .change-diff {
409
+ max-height: 150px;
410
+ overflow: auto;
411
+ margin: 8px 0 0;
412
+ padding: 10px;
413
+ border-radius: 10px;
414
+ background: #111827;
415
+ color: #dbeafe;
416
+ font-family: "IBM Plex Mono", "SFMono-Regular", monospace;
417
+ font-size: 0.72rem;
418
+ line-height: 1.42;
419
+ white-space: pre-wrap;
420
+ }
421
+
195
422
  .sandbox-card h2 {
196
423
  margin: 0 0 4px;
197
424
  font-size: 1.05rem;
@@ -223,9 +450,21 @@ button.secondary {
223
450
  max-width: 340px;
224
451
  }
225
452
 
453
+ .session-tools {
454
+ display: flex;
455
+ min-width: min(100%, 420px);
456
+ gap: 8px;
457
+ align-items: center;
458
+ justify-content: flex-end;
459
+ }
460
+
461
+ .session-tools .session-select {
462
+ max-width: none;
463
+ }
464
+
226
465
  .logs {
227
- min-height: 360px;
228
- max-height: 48vh;
466
+ min-height: 300px;
467
+ max-height: 42vh;
229
468
  overflow: auto;
230
469
  margin: 0;
231
470
  padding: 16px;
@@ -239,9 +478,14 @@ button.secondary {
239
478
  white-space: pre-wrap;
240
479
  }
241
480
 
481
+ .chat-panel {
482
+ display: grid;
483
+ gap: 12px;
484
+ }
485
+
242
486
  .chat-thread {
243
- min-height: 260px;
244
- max-height: 40vh;
487
+ min-height: 200px;
488
+ max-height: 32vh;
245
489
  overflow: auto;
246
490
  display: grid;
247
491
  gap: 12px;
@@ -273,7 +517,313 @@ button.secondary {
273
517
  }
274
518
 
275
519
  .chat-form {
276
- margin-top: 14px;
520
+ margin: 0;
521
+ }
522
+
523
+ .modal {
524
+ width: min(720px, calc(100% - 28px));
525
+ padding: 0;
526
+ border: 0;
527
+ border-radius: 22px;
528
+ background: transparent;
529
+ color: var(--ink);
530
+ }
531
+
532
+ .modal::backdrop {
533
+ background: rgba(29, 28, 26, 0.42);
534
+ backdrop-filter: blur(5px);
535
+ }
536
+
537
+ .modal-card {
538
+ display: grid;
539
+ gap: 16px;
540
+ padding: 18px;
541
+ border: 1px solid var(--line);
542
+ border-radius: 22px;
543
+ background: rgba(255, 251, 244, 0.98);
544
+ box-shadow: 0 30px 90px rgba(29, 28, 26, 0.24);
545
+ }
546
+
547
+ .modal-header {
548
+ display: flex;
549
+ gap: 14px;
550
+ align-items: flex-start;
551
+ justify-content: space-between;
552
+ }
553
+
554
+ .modal-header h2 {
555
+ margin: 0 0 4px;
556
+ }
557
+
558
+ .session-manager-list {
559
+ display: grid;
560
+ max-height: 300px;
561
+ gap: 8px;
562
+ overflow: auto;
563
+ }
564
+
565
+ .session-row {
566
+ display: grid;
567
+ width: 100%;
568
+ gap: 4px;
569
+ padding: 11px 12px;
570
+ border: 1px solid var(--line);
571
+ border-radius: 14px;
572
+ background: #fffdfa;
573
+ color: var(--ink);
574
+ text-align: left;
575
+ }
576
+
577
+ .session-row[data-selected="true"] {
578
+ border-color: rgba(15, 118, 110, 0.62);
579
+ box-shadow: 0 0 0 2px rgba(15, 118, 110, 0.1);
580
+ }
581
+
582
+ .session-row strong {
583
+ overflow: hidden;
584
+ text-overflow: ellipsis;
585
+ white-space: nowrap;
586
+ }
587
+
588
+ .session-row span {
589
+ color: var(--muted);
590
+ font-size: 0.8rem;
591
+ }
592
+
593
+ .modal-actions {
594
+ display: flex;
595
+ flex-wrap: wrap;
596
+ gap: 10px;
597
+ justify-content: flex-end;
598
+ }
599
+
600
+ .modal-status {
601
+ min-height: 20px;
602
+ margin: 0;
603
+ }
604
+
605
+ .artifact-modal {
606
+ width: min(1120px, calc(100% - 28px));
607
+ }
608
+
609
+ .artifact-modal-card {
610
+ max-height: min(840px, calc(100vh - 36px));
611
+ overflow: hidden;
612
+ }
613
+
614
+ .artifact-tabs {
615
+ display: flex;
616
+ flex-wrap: wrap;
617
+ gap: 8px;
618
+ padding: 5px;
619
+ border: 1px solid var(--line);
620
+ border-radius: 999px;
621
+ background: rgba(255, 253, 250, 0.72);
622
+ }
623
+
624
+ .artifact-tab {
625
+ flex: 1;
626
+ min-width: 130px;
627
+ border: 1px solid transparent;
628
+ background: transparent;
629
+ color: var(--muted);
630
+ box-shadow: none;
631
+ }
632
+
633
+ .artifact-tab[data-selected="true"] {
634
+ border-color: rgba(15, 118, 110, 0.26);
635
+ background: linear-gradient(135deg, var(--accent), #155e75);
636
+ color: white;
637
+ }
638
+
639
+ .artifact-layout {
640
+ display: grid;
641
+ min-height: 520px;
642
+ gap: 14px;
643
+ grid-template-columns: minmax(240px, 340px) minmax(0, 1fr);
644
+ overflow: hidden;
645
+ }
646
+
647
+ .artifact-list-panel,
648
+ .artifact-viewer {
649
+ min-height: 0;
650
+ border: 1px solid var(--line);
651
+ border-radius: 18px;
652
+ background: rgba(255, 253, 250, 0.82);
653
+ }
654
+
655
+ .artifact-list-panel {
656
+ display: grid;
657
+ grid-template-rows: auto minmax(0, 1fr);
658
+ }
659
+
660
+ .artifact-list-header {
661
+ display: flex;
662
+ gap: 10px;
663
+ align-items: center;
664
+ justify-content: space-between;
665
+ padding: 12px;
666
+ border-bottom: 1px solid var(--line);
667
+ }
668
+
669
+ .compact-button {
670
+ padding: 8px 12px;
671
+ font-size: 0.82rem;
672
+ }
673
+
674
+ .artifact-list {
675
+ display: grid;
676
+ align-content: start;
677
+ gap: 8px;
678
+ overflow: auto;
679
+ padding: 10px;
680
+ }
681
+
682
+ .artifact-row {
683
+ display: grid;
684
+ gap: 5px;
685
+ width: 100%;
686
+ padding: 11px 12px;
687
+ border: 1px solid var(--line);
688
+ border-radius: 14px;
689
+ background: #fffdfa;
690
+ color: var(--ink);
691
+ text-align: left;
692
+ }
693
+
694
+ .artifact-row[data-selected="true"] {
695
+ border-color: rgba(15, 118, 110, 0.62);
696
+ box-shadow: 0 0 0 2px rgba(15, 118, 110, 0.1);
697
+ }
698
+
699
+ .artifact-row[data-read="false"] {
700
+ border-color: rgba(217, 45, 32, 0.28);
701
+ background: linear-gradient(135deg, #fffdfa, rgba(254, 242, 242, 0.96));
702
+ }
703
+
704
+ .artifact-row[data-read="false"] .artifact-row-top strong::before {
705
+ display: inline-block;
706
+ width: 8px;
707
+ height: 8px;
708
+ margin-right: 8px;
709
+ border-radius: 50%;
710
+ background: #d92d20;
711
+ content: "";
712
+ vertical-align: 1px;
713
+ }
714
+
715
+ .artifact-row-top,
716
+ .artifact-viewer-header {
717
+ display: flex;
718
+ gap: 10px;
719
+ align-items: flex-start;
720
+ justify-content: space-between;
721
+ }
722
+
723
+ .artifact-row-top strong,
724
+ .artifact-viewer-header h3 {
725
+ overflow: hidden;
726
+ text-overflow: ellipsis;
727
+ }
728
+
729
+ .artifact-row-top strong {
730
+ white-space: nowrap;
731
+ }
732
+
733
+ .artifact-row-top span,
734
+ .artifact-kind-pill {
735
+ flex: none;
736
+ padding: 3px 8px;
737
+ border-radius: 999px;
738
+ background: rgba(15, 118, 110, 0.12);
739
+ color: var(--accent);
740
+ font-size: 0.72rem;
741
+ font-weight: 800;
742
+ text-transform: uppercase;
743
+ }
744
+
745
+ .artifact-row-meta,
746
+ .artifact-row-preview {
747
+ color: var(--muted);
748
+ font-size: 0.78rem;
749
+ line-height: 1.35;
750
+ }
751
+
752
+ .artifact-row-preview {
753
+ display: -webkit-box;
754
+ overflow: hidden;
755
+ -webkit-box-orient: vertical;
756
+ -webkit-line-clamp: 2;
757
+ }
758
+
759
+ .artifact-viewer {
760
+ display: grid;
761
+ grid-template-rows: auto minmax(0, 1fr) auto;
762
+ overflow: hidden;
763
+ }
764
+
765
+ .artifact-viewer-header {
766
+ padding: 14px;
767
+ border-bottom: 1px solid var(--line);
768
+ }
769
+
770
+ .artifact-viewer-header h3 {
771
+ margin: 0 0 4px;
772
+ font-size: 1.05rem;
773
+ }
774
+
775
+ .artifact-viewer-body {
776
+ min-height: 0;
777
+ overflow: auto;
778
+ padding: 14px;
779
+ }
780
+
781
+ .artifact-image-frame {
782
+ display: grid;
783
+ min-height: 100%;
784
+ place-items: center;
785
+ margin: 0;
786
+ padding: 14px;
787
+ border-radius: 16px;
788
+ background:
789
+ linear-gradient(45deg, rgba(15, 118, 110, 0.08) 25%, transparent 25%),
790
+ linear-gradient(-45deg, rgba(15, 118, 110, 0.08) 25%, transparent 25%),
791
+ linear-gradient(45deg, transparent 75%, rgba(15, 118, 110, 0.08) 75%),
792
+ linear-gradient(-45deg, transparent 75%, rgba(15, 118, 110, 0.08) 75%);
793
+ background-position:
794
+ 0 0,
795
+ 0 10px,
796
+ 10px -10px,
797
+ -10px 0;
798
+ background-size: 20px 20px;
799
+ }
800
+
801
+ .artifact-preview-image {
802
+ max-width: 100%;
803
+ max-height: 58vh;
804
+ border-radius: 14px;
805
+ object-fit: contain;
806
+ box-shadow: 0 20px 48px rgba(29, 28, 26, 0.18);
807
+ }
808
+
809
+ .artifact-pdf-frame {
810
+ width: 100%;
811
+ min-height: 62vh;
812
+ border: 1px solid var(--line);
813
+ border-radius: 14px;
814
+ background: white;
815
+ }
816
+
817
+ .artifact-editor {
818
+ min-height: 100%;
819
+ height: 100%;
820
+ border-radius: 14px;
821
+ background: #0f172a;
822
+ color: #dbeafe;
823
+ font-family: "IBM Plex Mono", "SFMono-Regular", monospace;
824
+ font-size: 0.82rem;
825
+ line-height: 1.55;
826
+ white-space: pre;
277
827
  }
278
828
 
279
829
  @media (max-width: 960px) {
@@ -295,11 +845,34 @@ button.secondary {
295
845
  }
296
846
 
297
847
  .logs {
298
- min-height: 320px;
299
- max-height: 44vh;
848
+ min-height: 260px;
849
+ max-height: 40vh;
300
850
  }
301
851
 
302
852
  .chat-thread {
303
- max-height: 34vh;
853
+ max-height: 36vh;
854
+ }
855
+
856
+ .header-row {
857
+ align-items: stretch;
858
+ flex-direction: column;
859
+ }
860
+
861
+ .session-tools {
862
+ width: 100%;
863
+ }
864
+
865
+ .wrapper-controls {
866
+ grid-template-columns: 1fr;
867
+ }
868
+
869
+ .artifact-layout {
870
+ min-height: 620px;
871
+ grid-template-columns: 1fr;
872
+ grid-template-rows: 230px minmax(0, 1fr);
873
+ }
874
+
875
+ .artifact-modal-card {
876
+ overflow: auto;
304
877
  }
305
878
  }
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env bash
2
+ set -Eeuo pipefail
3
+
4
+ SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
5
+ REPO_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)"
6
+ IMAGE="${AGINTIFLOW_TOOLCHAIN_IMAGE:-agintiflow-sandbox:latest}"
7
+ WORKSPACE="${AGINTIFLOW_TOOLCHAIN_WORKSPACE:-${REPO_ROOT}}"
8
+ DOCKERFILE="${AGINTIFLOW_TOOLCHAIN_DOCKERFILE:-${REPO_ROOT}/docker/sandbox.Dockerfile}"
9
+
10
+ if ! command -v docker >/dev/null 2>&1; then
11
+ echo "Docker is not installed or not on PATH. Run scripts/install-docker-ubuntu.sh first." >&2
12
+ exit 1
13
+ fi
14
+
15
+ mkdir -p "${WORKSPACE}"
16
+
17
+ echo "Building AgInTiFlow toolchain sandbox image:"
18
+ echo " image=${IMAGE}"
19
+ echo " dockerfile=${DOCKERFILE}"
20
+ echo " context=${REPO_ROOT}"
21
+ docker build -t "${IMAGE}" -f "${DOCKERFILE}" "${REPO_ROOT}"
22
+
23
+ echo
24
+ echo "Running toolchain preflight inside Docker:"
25
+ docker run --rm \
26
+ --network none \
27
+ --cap-drop ALL \
28
+ --security-opt no-new-privileges \
29
+ --pids-limit 256 \
30
+ --memory 2g \
31
+ --cpus 2 \
32
+ --tmpfs /tmp:rw,nosuid,nodev,size=512m \
33
+ -e HOME=/tmp \
34
+ -v "${WORKSPACE}:/workspace:rw" \
35
+ -w /workspace \
36
+ "${IMAGE}" \
37
+ bash -lc 'set -Eeuo pipefail
38
+ node -v
39
+ npm -v
40
+ python3 --version
41
+ python3 - <<PY
42
+ import matplotlib, numpy
43
+ print("matplotlib", matplotlib.__version__)
44
+ print("numpy", numpy.__version__)
45
+ PY
46
+ latexmk -version | head -1
47
+ pdflatex --version | head -1
48
+ '
49
+
50
+ echo
51
+ echo "Toolchain sandbox is ready."