glad-web 1.0.44 → 1.0.45

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.
@@ -148,8 +148,10 @@
148
148
  #attachment-strip::-webkit-scrollbar { display: none; }
149
149
  .attachment-chip { min-width: 0; max-width: 210px; display: flex; align-items: center; gap: 7px; padding: 7px 9px; border: 1px solid rgba(0,122,255,0.45); border-radius: 10px; background: rgba(0,122,255,0.14); color: #e9f2ff; font-size: 12px; }
150
150
  .attachment-chip.uploading { border-color: rgba(255,159,10,0.55); background: rgba(255,159,10,0.12); }
151
+ .attachment-chip.file { border-color: var(--line); background: var(--surface-soft); color: var(--text); }
151
152
  .attachment-chip-content { min-width: 0; flex: 1; }
152
153
  .attachment-chip-name { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
154
+ .attachment-chip-icon { width: 17px; height: 17px; flex: 0 0 17px; }
153
155
  .attachment-progress { display: block; height: 5px; margin-top: 5px; overflow: hidden; border-radius: 999px; background: rgba(255,255,255,0.16); }
154
156
  .attachment-progress > span { display: block; height: 100%; border-radius: inherit; background: #ff9f0a; transition: width .15s ease; }
155
157
  .attachment-progress.estimated > span { background: repeating-linear-gradient(90deg, #ff9f0a 0 12px, #ffd37b 12px 24px); background-size: 48px 100%; animation: attachment-upload-pulse .75s linear infinite; }
@@ -185,7 +187,7 @@
185
187
  .codex-conversation { width: min(100%, var(--chat-content-max)); margin: 0 auto; }
186
188
  .codex-working-indicator, .claude-working-indicator { position: sticky; top: 0; z-index: 4; width: 28px; height: 28px; margin: 0 0 -28px auto; border: 1px solid rgba(255,255,255,.1); border-radius: 50%; background: rgba(28,28,30,.68); box-shadow: 0 5px 16px rgba(0,0,0,.24); backdrop-filter: blur(8px); pointer-events: none; }
187
189
  .codex-working-indicator::after, .claude-working-indicator::after { content: ''; position: absolute; inset: 8px; border: 1.5px solid rgba(255,255,255,.7); border-top-color: transparent; border-radius: 50%; animation: codex-spin .8s linear infinite; }
188
- .codex-skill-bubble { position: sticky; top: 0; z-index: 5; display: flex; width: max-content; max-width: min(280px, 72vw); min-height: 28px; margin: 0 0 -30px auto; padding: 0 4px 0 10px; align-items: center; gap: 7px; border: 1px solid rgba(0,122,255,.42); border-radius: 15px; background: rgba(21,47,78,.92); color: #eaf3ff; box-shadow: 0 5px 18px rgba(0,0,0,.3); backdrop-filter: blur(10px); font-size: 11px; font-weight: 750; }
190
+ .codex-skill-bubble { position: relative; z-index: 5; display: flex; width: max-content; max-width: min(280px, 72vw); min-height: 28px; padding: 0 4px 0 10px; align-items: center; gap: 7px; border: 1px solid rgba(0,122,255,.42); border-bottom: 0; border-radius: 12px 12px 0 0; background: rgba(21,47,78,.96); color: #eaf3ff; box-shadow: 0 -3px 12px rgba(0,0,0,.12); font-size: 11px; font-weight: 750; }
189
191
  .codex-skill-bubble-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
190
192
  .codex-skill-bubble-close { width: 23px; height: 23px; padding: 0; border: 0; border-radius: 50%; background: rgba(255,255,255,.1); color: #fff; cursor: pointer; font-size: 16px; line-height: 1; }
191
193
  .codex-message-block { max-width: 100%; margin: 0 0 12px; }
@@ -323,9 +325,12 @@
323
325
  .claude-message-block.user > .claude-message { max-width: 100%; }
324
326
  .claude-message-time { display: block; width: max-content; margin-top: 4px; padding: 0 2px; color: #8e8e93; font-size: 10px; font-weight: 500; line-height: 1; font-variant-numeric: tabular-nums; }
325
327
  .claude-message-block.user .claude-message-time { margin-left: auto; }
326
- .codex-message-skill { display: inline-flex; max-width: min(220px, 58vw); min-height: 16px; align-items: center; padding: 1px 6px; border: 1px solid rgba(0,122,255,.32); border-radius: 999px; background: rgba(0,122,255,.12); color: #8fc5ff; font-size: 9px; font-weight: 750; line-height: 1.2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
328
+ .codex-message-skills { position: relative; z-index: 1; display: flex; justify-content: flex-start; gap: 5px; margin-bottom: -1px; }
329
+ .codex-message-skill { display: inline-flex; max-width: min(220px, 58vw); min-height: 18px; align-items: center; padding: 2px 8px; border: 1px solid rgba(0,122,255,.32); border-bottom: 0; border-radius: 9px 9px 0 0; background: rgba(0,122,255,.16); color: #8fc5ff; font-size: 9px; font-weight: 750; line-height: 1.2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
330
+ .codex-message-skills + .codex-message.user { border-top-left-radius: 4px; }
327
331
  .claude-message-attachments { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 6px; }
328
332
  .claude-message-attachment { max-width: 100%; border: 1px solid rgba(255,255,255,.14); border-radius: 999px; padding: 3px 7px; color: #d1d5db; background: rgba(255,255,255,.07); font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
333
+ .message-attachment-icon { width: 13px; height: 13px; flex: 0 0 13px; margin-right: 4px; vertical-align: -2px; }
329
334
  .claude-message.user { margin-left: auto; background: rgba(0,122,255,0.24); border: 1px solid rgba(0,122,255,0.32); color: #fff; border-radius: 12px; padding-top: 7px; padding-bottom: 7px; }
330
335
  .claude-message.assistant { max-width: 100%; background: transparent; border: 0; color: #f5f5f7; padding: 0 4px; margin: 0 0 12px 0; }
331
336
  .claude-message.event { max-width: 100%; background: transparent; border: 0; color: var(--text-dim); font-size: 12px; padding: 3px 2px; text-align: center; }
@@ -449,6 +454,9 @@
449
454
  .history-meta { color: var(--text-dim); font-size: 11px; padding: 8px 14px; border-bottom: 1px solid rgba(255,255,255,0.06); background: #0d0d0d; }
450
455
 
451
456
  .tab-bar { display: flex; border-bottom: 1px solid rgba(255,255,255,0.1); background: var(--bg); }
457
+ .subview-nav { flex: 0 0 auto; padding-top: env(safe-area-inset-top); border-bottom: 1px solid var(--line); background: var(--surface); }
458
+ .subview-nav-row { display: flex; align-items: center; padding: 8px 14px; }
459
+ .subview-nav-title { flex: 1; min-width: 0; color: var(--text); text-align: center; font-size: 16px; font-weight: 600; }
452
460
  .tab-btn { flex: 1; text-align: center; padding: 12px 0; font-size: 14px; font-weight: 600; color: var(--text-dim); background: none; border: none; cursor: pointer; position: relative; }
453
461
  .tab-btn.active { color: var(--text); }
454
462
  .tab-btn.active::after { content: ''; position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); height: 2px; width: 40px; background: var(--primary); border-radius: 2px; }
@@ -520,9 +528,8 @@
520
528
  .usage-summary-card .value { font-size: 21px; }
521
529
  }
522
530
  @media (max-width: 430px) {
523
- #nav-bar > div:last-child .icon-btn:not(#codex-terminal-switch) { width: 34px; font-size: 0 !important; gap: 0 !important; }
524
- #nav-bar > div:last-child .icon-btn:not(#codex-terminal-switch) svg { width: 16px; height: 16px; }
525
- #codex-terminal-switch { padding-left: 8px !important; padding-right: 8px !important; }
531
+ #nav-bar > div:last-child .icon-btn { width: 34px; font-size: 0 !important; gap: 0 !important; }
532
+ #nav-bar > div:last-child .icon-btn svg { width: 16px; height: 16px; }
526
533
  }
527
534
  @media (min-width: 768px) and (max-width: 1199px) {
528
535
  :root { --chat-content-max: 780px; --control-content-max: 920px; }
@@ -546,6 +553,15 @@
546
553
  --input-fg: #ffffff;
547
554
  --input-placeholder: rgba(255,255,255,.45);
548
555
  --overlay-bg: rgba(0,0,0,.80);
556
+ --git-diff-bg: #0d0d0d;
557
+ --git-diff-text: #d1d5db;
558
+ --git-add-text: #4ade80;
559
+ --git-add-bg: rgba(74,222,128,.1);
560
+ --git-del-text: #f87171;
561
+ --git-del-bg: rgba(248,113,113,.1);
562
+ --git-hunk-text: #60a5fa;
563
+ --git-hunk-bg: rgba(96,165,250,.1);
564
+ --git-modified-text: #fbbf24;
549
565
  color-scheme: dark;
550
566
  }
551
567
 
@@ -563,6 +579,15 @@ html[data-theme="light"] {
563
579
  --input-fg: #172033;
564
580
  --input-placeholder: #8a94a6;
565
581
  --overlay-bg: rgba(15,23,42,.45);
582
+ --git-diff-bg: #f7f8fa;
583
+ --git-diff-text: #344054;
584
+ --git-add-text: #176b3a;
585
+ --git-add-bg: #dff4e7;
586
+ --git-del-text: #a12b24;
587
+ --git-del-bg: #fde5e3;
588
+ --git-hunk-text: #075fae;
589
+ --git-hunk-bg: #e6f2ff;
590
+ --git-modified-text: #9a6700;
566
591
  color-scheme: light;
567
592
  }
568
593
 
@@ -581,13 +606,31 @@ html[data-theme="dark"] { color-scheme: dark; }
581
606
  #detail-empty p { max-width: 360px; margin: 8px 0 0; font-size: 13px; line-height: 1.5; }
582
607
  #sidebar-resizer { display: none; }
583
608
 
584
- #terminal-view.active { display: grid; grid-template-rows: auto minmax(0, 1fr) auto; }
609
+ #terminal-view.active { display: grid; grid-template-rows: auto auto minmax(0, 1fr) auto; }
585
610
  #top-ui { display: contents; }
586
611
  #nav-bar { grid-row: 1; z-index: 20; padding-top: max(8px, env(safe-area-inset-top)); background: var(--surface); border-color: var(--line); }
587
- #terminal-controls { position: relative; inset: auto; grid-row: 3; z-index: 30; max-height: min(62dvh, 620px); overflow-y: auto; padding-bottom: env(safe-area-inset-bottom); border-top: 1px solid var(--line); border-bottom: 0; background: color-mix(in srgb, var(--surface) 96%, transparent); box-shadow: 0 -10px 28px rgba(0,0,0,.12); }
612
+ #session-status-strip { display: none; grid-row: 2; z-index: 19; padding: 6px 12px; border-bottom: 1px solid var(--line); background: color-mix(in srgb, var(--surface) 97%, transparent); }
613
+ #session-attention-rail { display: flex; width: min(100%, var(--chat-content-max)); min-width: 0; margin: 0 auto; gap: 7px; overflow-x: auto; scrollbar-width: none; white-space: nowrap; }
614
+ #session-attention-rail::-webkit-scrollbar { display: none; }
615
+ .session-attention-pill { display: inline-flex; min-height: 28px; flex: 0 0 auto; align-items: center; gap: 5px; padding: 0 10px; border: 1px solid var(--line); border-radius: 999px; background: var(--surface-soft); color: var(--text-dim); font-size: 11px; font-weight: 750; cursor: pointer; }
616
+ .session-attention-pill.approval { border-color: rgba(255,204,0,.42); background: rgba(255,204,0,.10); color: #ffd60a; }
617
+ .session-attention-pill.subagent { border-color: rgba(100,210,255,.35); background: rgba(100,210,255,.10); color: #64d2ff; }
618
+ .session-attention-pill:active { transform: translateY(1px); }
619
+ html[data-theme="light"] .session-attention-pill.approval { border-color: #e5bd36; background: #fff7d6; color: #795500; }
620
+ html[data-theme="light"] .session-attention-pill.subagent { border-color: #99c8f7; background: #e8f3ff; color: #075fae; }
621
+ #terminal-controls { position: relative; inset: auto; grid-row: 4; z-index: 30; max-height: min(62dvh, 620px); overflow-y: auto; padding-bottom: env(safe-area-inset-bottom); border-top: 1px solid var(--line); border-bottom: 0; background: color-mix(in srgb, var(--surface) 96%, transparent); box-shadow: 0 -10px 28px rgba(0,0,0,.12); }
588
622
  #terminal-controls-spacer { display: none; }
589
- #terminal-container, #claude-chat-container, #codex-chat-container { grid-row: 2; min-width: 0; min-height: 0; background: var(--chat-bg); }
623
+ #terminal-container, #claude-chat-container, #codex-chat-container { grid-row: 3; min-width: 0; min-height: 0; background: var(--chat-bg); }
624
+ #composer-skill-prefix { display: none; width: min(100%, var(--control-content-max)); margin: 0 auto; padding: 8px 14px 0; box-sizing: border-box; }
625
+ #composer-skill-prefix.active { display: flex; justify-content: flex-start; }
626
+ #composer-skill-prefix.active + #input-row { padding-top: 0; }
590
627
  #input-row { padding-top: 10px; padding-bottom: 7px; }
628
+ @media (max-width: 480px) {
629
+ #composer-skill-prefix { padding-left: 10px; padding-right: 10px; }
630
+ }
631
+ @media (min-width: 768px) and (max-width: 1199px) {
632
+ #composer-skill-prefix { padding-left: 18px; padding-right: 18px; }
633
+ }
591
634
  #cmd-input { width: 100%; min-height: 42px; border-color: var(--line); background: var(--input-bg); color: var(--input-fg); }
592
635
  #cmd-input::placeholder { color: var(--input-placeholder); }
593
636
  #cmd-input:focus { color: var(--input-fg); }
@@ -595,6 +638,8 @@ html[data-theme="dark"] { color-scheme: dark; }
595
638
  .composer-action-btn { position: relative; width: 40px; min-width: 40px; height: 40px; flex: 0 0 40px; padding: 0; margin: 0; border: 1px solid var(--line); border-radius: 12px; background: var(--surface-soft); color: var(--text-dim); display: flex; align-items: center; justify-content: center; cursor: pointer; }
596
639
  .composer-action-btn:hover { color: var(--text); }
597
640
  .composer-action-btn.active { color: var(--primary); border-color: color-mix(in srgb, var(--primary) 48%, transparent); background: color-mix(in srgb, var(--primary) 14%, var(--surface)); }
641
+ #composer-action-tooltip { position: fixed; z-index: 11000; display: none; max-width: min(220px, calc(100vw - 24px)); padding: 6px 9px; border: 1px solid var(--line); border-radius: 7px; background: color-mix(in srgb, var(--surface-raised) 96%, transparent); color: var(--text); box-shadow: 0 6px 18px rgba(0,0,0,.18); font-size: 11px; font-weight: 700; line-height: 1.2; text-align: center; white-space: nowrap; pointer-events: none; }
642
+ #composer-action-tooltip.visible { display: block; }
598
643
  #send-btn { right: max(12px, calc((100% - var(--control-content-max)) / 2 + 14px)); width: 44px; height: 40px; }
599
644
  #claude-control-panel, #codex-control-panel { position: relative; flex-direction: column; width: min(100%, var(--control-content-max)); padding: 0 14px 10px; border: 0; background: transparent; }
600
645
  .claude-control-rail, .codex-control-rail { order: 100; min-height: 40px; gap: 7px; margin: 0 58px 0 0; padding: 0; overflow-x: auto; overflow-y: hidden; scroll-snap-type: none; scroll-padding: 0; }
@@ -748,6 +793,9 @@ html[data-theme="light"] .codex-warning-title { color: #7a5200; }
748
793
  html[data-theme="light"] .codex-warning-text { color: #725d28; }
749
794
  html[data-theme="light"] .codex-compaction-card { border-color: #d9c4ef; background: #f7f0ff; color: #3f2a56; }
750
795
  html[data-theme="light"] .codex-compaction-meta { color: #725d86; }
796
+ html[data-theme="light"] .codex-skill-bubble,
797
+ html[data-theme="light"] .codex-message-skill { border-color: #99c8f7; background: #e8f3ff; color: #075fae; }
798
+ html[data-theme="light"] .codex-skill-bubble-close { background: rgba(7,95,174,.10); color: #075fae; }
751
799
  html[data-theme="light"] .codex-context-meter { --context-color: #168447; border-color: #69c98a; background: #effaf3; color: #125f34; }
752
800
  html[data-theme="light"] .codex-context-meter::before { background: #bcebc9; }
753
801
  html[data-theme="light"] .codex-context-meter.warn { --context-color: #a66f00; border-color: #e0b53e; background: #fff9df; color: #715000; }
@@ -808,3 +856,50 @@ html[data-theme="light"] .usage-pricing-note { color: #667085; }
808
856
  html[data-theme="light"] .usage-chart-track { background: #e9edf2; }
809
857
  html[data-theme="light"] .usage-table th { border-color: #dfe4eb; color: #667085; }
810
858
  html[data-theme="light"] .usage-table td { border-color: #edf0f3; color: #344054; }
859
+ html[data-theme="light"] .tool-modal-header { border-color: #e0e5ec; }
860
+ html[data-theme="light"] .tool-item { border: 1px solid #e0e5ec; background: #f7f9fb; color: #172033; }
861
+ html[data-theme="light"] .tool-item:hover,
862
+ html[data-theme="light"] .tool-item:active { border-color: #99c8f7; background: #eaf4ff; }
863
+ html[data-theme="light"] .tool-icon { background: #dceeff; color: #006acb; }
864
+ html[data-theme="light"] #default-cwd { color: #526174 !important; }
865
+ html[data-theme="light"] .usage-source-item { border: 1px solid #e1e6ed; background: #f7f9fb; color: #172033; }
866
+ html[data-theme="light"] .usage-source-item:hover,
867
+ html[data-theme="light"] .usage-source-item:active { border-color: #99c8f7; background: #eaf4ff; }
868
+ html[data-theme="light"] .usage-source-copy strong { color: #172033; }
869
+ html[data-theme="light"] .usage-source-badge { background: #dceeff; color: #006acb; }
870
+ html[data-theme="light"] .usage-source-arrow { color: #667085; }
871
+ html[data-theme="light"] .attachment-chip { border-color: #99c8f7; background: #e8f3ff; color: #173b61; }
872
+ html[data-theme="light"] .attachment-chip.file { border-color: #c8d0dc; background: #f2f4f7; color: #344054; }
873
+ html[data-theme="light"] .attachment-chip.uploading { border-color: #e6b94c; background: #fff6df; color: #715000; }
874
+ html[data-theme="light"] .attachment-status { color: #725d28; }
875
+ html[data-theme="light"] .attachment-remove { background: rgba(23,59,97,.1); color: #344054; }
876
+ html[data-theme="light"] .attachment-progress { background: rgba(23,59,97,.12); }
877
+ html[data-theme="light"] .claude-message-attachment { border-color: #b9c9dc; background: rgba(255,255,255,.72); color: #344054; }
878
+ html[data-theme="light"] .claude-md a { color: #006acb; }
879
+
880
+ .tool-modal-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 18px; padding-bottom: 12px; border-bottom: 1px solid var(--line); }
881
+ .tool-modal-header h2 { margin: 0; }
882
+ .tool-modal-header .icon-btn { width: 32px; height: 32px; border-radius: 50%; color: var(--text-dim); font-size: 24px; }
883
+ #add-step-type { border-color: var(--line) !important; background: var(--surface-soft) !important; color: var(--text) !important; }
884
+
885
+ .git-change-card { margin-bottom: 8px; overflow: hidden; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-raised); }
886
+ .git-change-header { display: flex; align-items: center; min-height: 42px; padding: 8px 10px; color: var(--text); cursor: pointer; font-size: 13px; font-weight: 600; outline: none; user-select: none; }
887
+ .git-change-header:hover { background: var(--surface-soft); }
888
+ .git-change-path { min-width: 0; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
889
+ .git-status-badge { flex: 0 0 auto; margin-left: 8px; padding: 1px 5px; border: 1px solid currentColor; border-radius: 4px; font-size: 10px; font-weight: 800; }
890
+ .git-status-badge.modified { color: var(--git-modified-text); }
891
+ .git-status-badge.added { color: var(--git-staged-color, #34c759); }
892
+ .git-status-badge.deleted { color: var(--git-deleted-color, #ff3b30); }
893
+ .git-inline-diff { border-top: 1px solid var(--line); background: var(--git-diff-bg); }
894
+ .git-inline-diff-body { max-height: 400px; overflow: auto; padding: 4px 0; font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
895
+ .git-inline-diff-footer { padding: 8px; border-top: 1px solid var(--line); background: var(--surface); text-align: center; }
896
+ .git-diff-panel { margin-bottom: 8px; overflow: hidden; border: 1px solid var(--line); border-radius: 6px; }
897
+ .git-diff-summary { padding: 7px 10px; background: var(--surface-raised); color: var(--text); cursor: pointer; font-size: 13px; font-weight: 600; outline: none; user-select: none; }
898
+ .git-diff-body { overflow-x: auto; padding: 4px 0; background: var(--git-diff-bg); font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
899
+ .git-file-code { overflow-x: auto; margin: 0; padding: 12px 0; border-radius: 8px; background: var(--git-diff-bg); color: var(--git-diff-text); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
900
+ .git-file-toolbar-group { display: flex; gap: 2px; margin-right: 8px; padding: 2px; border: 1px solid var(--line); border-radius: 5px; background: var(--surface-soft); }
901
+ .git-file-toolbar-button { padding: 4px 8px; border: 0; border-radius: 3px; background: transparent; color: var(--text-dim); cursor: pointer; font-size: 12px; }
902
+ .git-file-toolbar-button:hover { background: var(--surface-raised); color: var(--text); }
903
+ .git-file-mode-button { padding: 4px 8px; border: 1px solid var(--line); border-radius: 4px; background: var(--surface-soft); color: var(--text); cursor: pointer; font-size: 12px; }
904
+ .git-file-mode-button.active { border-color: var(--primary); background: var(--primary); color: #fff; }
905
+ .git-line-number { width: 36px; flex: 0 0 36px; margin-right: 16px; color: var(--text-dim); text-align: right; user-select: none; }
@@ -172,17 +172,17 @@
172
172
  }
173
173
 
174
174
  document.getElementById('send-btn').addEventListener('click', performSend);
175
- document.getElementById('attach-image-btn').addEventListener('click', () => {
176
- imageFileInput.click();
175
+ document.getElementById('attachment-btn').addEventListener('click', () => {
176
+ attachmentFileInput.click();
177
177
  });
178
178
  document.getElementById('schedule-send-btn').addEventListener('click', () => {
179
179
  if (document.getElementById('timed-send-panel').classList.contains('active')) closeTimedSendPanel();
180
180
  else openTimedSendPanel();
181
181
  });
182
- imageFileInput.addEventListener('change', () => {
183
- const files = imageFileInput.files;
184
- if (files?.length) void uploadImageFiles(files);
185
- imageFileInput.value = '';
182
+ attachmentFileInput.addEventListener('change', () => {
183
+ const files = attachmentFileInput.files;
184
+ if (files?.length) void uploadSelectedAttachments(files);
185
+ attachmentFileInput.value = '';
186
186
  });
187
187
  inputEl.addEventListener('keydown', (e) => {
188
188
  if (e.key === 'Enter' && e.shiftKey) { e.preventDefault(); performSend(); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glad-web",
3
- "version": "1.0.44",
3
+ "version": "1.0.45",
4
4
  "description": "Glad transforms terminal-based AI coding tools into a polished, mobile-friendly local Web interface.",
5
5
  "bin": {
6
6
  "glad": "bin/cli.js"