koneck 2.25.76 → 2.27.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/dist/doctor.d.ts +15 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +28 -8
- package/dist/doctor.js.map +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +4 -1
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -4
- package/dist/index.js.map +1 -1
- package/dist/ink-chat.d.ts +10 -0
- package/dist/ink-chat.d.ts.map +1 -1
- package/dist/ink-chat.js +156 -22
- package/dist/ink-chat.js.map +1 -1
- package/dist/quality-gate.d.ts +5 -1
- package/dist/quality-gate.d.ts.map +1 -1
- package/dist/quality-gate.js +8 -6
- package/dist/quality-gate.js.map +1 -1
- package/dist/session.d.ts +10 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +12 -1
- package/dist/session.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/web/api.d.ts +31 -0
- package/dist/web/api.d.ts.map +1 -0
- package/dist/web/api.js +295 -0
- package/dist/web/api.js.map +1 -0
- package/dist/web/changes.d.ts +55 -0
- package/dist/web/changes.d.ts.map +1 -0
- package/dist/web/changes.js +215 -0
- package/dist/web/changes.js.map +1 -0
- package/dist/web/events.d.ts +172 -0
- package/dist/web/events.d.ts.map +1 -0
- package/dist/web/events.js +52 -0
- package/dist/web/events.js.map +1 -0
- package/dist/web/history.d.ts +61 -0
- package/dist/web/history.d.ts.map +1 -0
- package/dist/web/history.js +197 -0
- package/dist/web/history.js.map +1 -0
- package/dist/web/mark.d.ts +15 -0
- package/dist/web/mark.d.ts.map +1 -0
- package/dist/web/mark.js +15 -0
- package/dist/web/mark.js.map +1 -0
- package/dist/web/sessions.d.ts +82 -0
- package/dist/web/sessions.d.ts.map +1 -0
- package/dist/web/sessions.js +197 -0
- package/dist/web/sessions.js.map +1 -0
- package/dist/web/ui-client.d.ts +14 -0
- package/dist/web/ui-client.d.ts.map +1 -0
- package/dist/web/ui-client.js +0 -0
- package/dist/web/ui-client.js.map +1 -0
- package/dist/web/ui-css.d.ts +15 -0
- package/dist/web/ui-css.d.ts.map +1 -0
- package/dist/web/ui-css.js +284 -0
- package/dist/web/ui-css.js.map +1 -0
- package/dist/web/ui.d.ts +11 -0
- package/dist/web/ui.d.ts.map +1 -0
- package/dist/web/ui.js +116 -0
- package/dist/web/ui.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The stylesheet, and the three themes.
|
|
3
|
+
*
|
|
4
|
+
* Every colour is a token defined once on `:root`, so a theme is a list of token values rather
|
|
5
|
+
* than a second stylesheet. Three states, which is what "light, dark and system" actually needs:
|
|
6
|
+
* an explicit choice writes `data-theme` on the root and wins; with nothing written, the browser's
|
|
7
|
+
* own preference decides.
|
|
8
|
+
*
|
|
9
|
+
* Contrast was asked for specifically — "font visible well in dark theme". The dark palette's body
|
|
10
|
+
* text is #e6f1f5 on #0d1418, which is about 14:1, and the muted tone is #93aab5 at about 7:1;
|
|
11
|
+
* both clear WCAG AA for body text with room to spare. The first version used #7f9aa6 for anything
|
|
12
|
+
* secondary, which measures 4.6:1 — passable on paper and genuinely hard to read on a dim screen.
|
|
13
|
+
*/
|
|
14
|
+
export function css(markUrl) {
|
|
15
|
+
return `
|
|
16
|
+
:root{
|
|
17
|
+
/* light, and the default when nothing has been chosen */
|
|
18
|
+
--bg:#f7f9fa; --panel:#ffffff; --panel-2:#eef2f4; --line:#d5dee2; --line-2:#c3d0d6;
|
|
19
|
+
--ink:#0f1c22; --muted:#4a606b; --dim:#6b8390;
|
|
20
|
+
--cyan:#0d7f92; --cyan-ink:#ffffff; --amber:#8a5a00; --green:#0f7a4a; --red:#b4232a;
|
|
21
|
+
--violet:#6d4bc4;
|
|
22
|
+
--add-bg:#e4f6ea; --add-ink:#0d5c37; --del-bg:#fdeaea; --del-ink:#8f1c22;
|
|
23
|
+
--shadow:0 1px 2px rgba(15,28,34,.07), 0 8px 24px rgba(15,28,34,.05);
|
|
24
|
+
--radius:10px; --mono:ui-monospace,'SF Mono',Menlo,Consolas,'DejaVu Sans Mono',monospace;
|
|
25
|
+
--mark:url("${markUrl}");
|
|
26
|
+
}
|
|
27
|
+
@media (prefers-color-scheme: dark){
|
|
28
|
+
:root:not([data-theme="light"]){
|
|
29
|
+
--bg:#0d1418; --panel:#131e24; --panel-2:#1a2932; --line:#24363f; --line-2:#2f454f;
|
|
30
|
+
--ink:#e6f1f5; --muted:#93aab5; --dim:#6f8894;
|
|
31
|
+
--cyan:#4dd6e8; --cyan-ink:#04181c; --amber:#e8b04d; --green:#57d99a; --red:#ef767b;
|
|
32
|
+
--violet:#b39cfb;
|
|
33
|
+
--add-bg:#0f2a1e; --add-ink:#7ee0a7; --del-bg:#2b1416; --del-ink:#f4a3a6;
|
|
34
|
+
--shadow:0 1px 2px rgba(0,0,0,.4), 0 8px 24px rgba(0,0,0,.3);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
:root[data-theme="dark"]{
|
|
38
|
+
--bg:#0d1418; --panel:#131e24; --panel-2:#1a2932; --line:#24363f; --line-2:#2f454f;
|
|
39
|
+
--ink:#e6f1f5; --muted:#93aab5; --dim:#6f8894;
|
|
40
|
+
--cyan:#4dd6e8; --cyan-ink:#04181c; --amber:#e8b04d; --green:#57d99a; --red:#ef767b;
|
|
41
|
+
--violet:#b39cfb;
|
|
42
|
+
--add-bg:#0f2a1e; --add-ink:#7ee0a7; --del-bg:#2b1416; --del-ink:#f4a3a6;
|
|
43
|
+
--shadow:0 1px 2px rgba(0,0,0,.4), 0 8px 24px rgba(0,0,0,.3);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
*{box-sizing:border-box}
|
|
47
|
+
html,body{height:100%}
|
|
48
|
+
body{margin:0;background:var(--bg);color:var(--ink);
|
|
49
|
+
font:14px/1.55 ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,'Helvetica Neue',sans-serif;
|
|
50
|
+
display:flex;overflow:hidden;-webkit-font-smoothing:antialiased}
|
|
51
|
+
button,input,textarea,select{font:inherit;color:inherit}
|
|
52
|
+
button{background:none;border:0;cursor:pointer}
|
|
53
|
+
::-webkit-scrollbar{width:10px;height:10px}
|
|
54
|
+
::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:10px;border:2px solid var(--bg)}
|
|
55
|
+
::-webkit-scrollbar-track{background:transparent}
|
|
56
|
+
:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}
|
|
57
|
+
|
|
58
|
+
/* The mark, in whatever colour it inherits. */
|
|
59
|
+
.mark{display:block;background:currentColor;
|
|
60
|
+
-webkit-mask:var(--mark) center/contain no-repeat;mask:var(--mark) center/contain no-repeat}
|
|
61
|
+
|
|
62
|
+
/* ── sidebar ─────────────────────────────────────────────── */
|
|
63
|
+
aside{width:272px;flex:0 0 272px;background:var(--panel);border-right:1px solid var(--line);
|
|
64
|
+
display:flex;flex-direction:column;min-height:0}
|
|
65
|
+
aside.hide{display:none}
|
|
66
|
+
.brand{display:flex;align-items:center;gap:10px;padding:15px 15px 12px}
|
|
67
|
+
.brand .mark{width:26px;height:25px;color:var(--cyan)}
|
|
68
|
+
.brand b{font-size:13px;letter-spacing:.15em;font-weight:600}
|
|
69
|
+
.brand .tag{font-size:9px;letter-spacing:.12em;color:var(--dim);
|
|
70
|
+
border:1px solid var(--line);border-radius:4px;padding:2px 5px}
|
|
71
|
+
.newbtn{margin:0 12px 12px;padding:9px;border:1px solid var(--line);background:var(--panel-2);
|
|
72
|
+
border-radius:var(--radius);display:flex;align-items:center;justify-content:center;gap:7px;
|
|
73
|
+
transition:border-color .14s,color .14s;font-weight:500}
|
|
74
|
+
.newbtn:hover{border-color:var(--cyan);color:var(--cyan)}
|
|
75
|
+
.shead{padding:9px 15px 5px;font-size:10px;letter-spacing:.12em;color:var(--dim);
|
|
76
|
+
text-transform:uppercase;display:flex;justify-content:space-between;align-items:center}
|
|
77
|
+
.slist{overflow-y:auto;flex:1;min-height:0;padding:0 8px 10px}
|
|
78
|
+
.srow{padding:8px 10px;border-radius:8px;margin-bottom:2px;border:1px solid transparent;
|
|
79
|
+
cursor:pointer;width:100%;text-align:left;display:block}
|
|
80
|
+
.srow:hover{background:var(--panel-2)}
|
|
81
|
+
.srow.on{background:var(--panel-2);border-color:var(--line-2)}
|
|
82
|
+
.srow .t{font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
83
|
+
.srow .m{font-size:10.5px;color:var(--dim);margin-top:2px;display:flex;gap:7px;align-items:center;
|
|
84
|
+
white-space:nowrap;overflow:hidden}
|
|
85
|
+
.dot{width:6px;height:6px;border-radius:50%;background:var(--green);flex:0 0 6px}
|
|
86
|
+
.dot.busy{background:var(--amber);animation:pulse 1.1s infinite}
|
|
87
|
+
.dot.past{background:var(--dim)}
|
|
88
|
+
@keyframes pulse{50%{opacity:.3}}
|
|
89
|
+
.foot{border-top:1px solid var(--line);padding:9px 12px;font-size:10.5px;color:var(--dim);
|
|
90
|
+
display:flex;justify-content:space-between;align-items:center;gap:8px}
|
|
91
|
+
.themebtn{border:1px solid var(--line);border-radius:7px;padding:3px 8px;font-size:10.5px;
|
|
92
|
+
color:var(--muted)}
|
|
93
|
+
.themebtn:hover{border-color:var(--cyan);color:var(--cyan)}
|
|
94
|
+
|
|
95
|
+
/* ── main ────────────────────────────────────────────────── */
|
|
96
|
+
main{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0}
|
|
97
|
+
header{height:47px;flex:0 0 47px;border-bottom:1px solid var(--line);display:flex;
|
|
98
|
+
align-items:center;gap:8px;padding:0 14px;background:var(--panel);font-size:12px}
|
|
99
|
+
.iconbtn{width:28px;height:28px;border-radius:7px;border:1px solid transparent;color:var(--muted);
|
|
100
|
+
display:grid;place-items:center;font-size:15px}
|
|
101
|
+
.iconbtn:hover{background:var(--panel-2);color:var(--ink)}
|
|
102
|
+
.tabs{display:flex;gap:2px;background:var(--panel-2);border-radius:8px;padding:2px}
|
|
103
|
+
.tab{padding:4px 12px;border-radius:6px;font-size:12px;color:var(--muted)}
|
|
104
|
+
.tab.on{background:var(--panel);color:var(--ink);box-shadow:var(--shadow)}
|
|
105
|
+
.tab .n{color:var(--dim);margin-left:5px;font-variant-numeric:tabular-nums}
|
|
106
|
+
.pill{border:1px solid var(--line);background:var(--panel-2);border-radius:999px;
|
|
107
|
+
padding:4px 11px;color:var(--muted);display:flex;gap:6px;align-items:center;max-width:230px}
|
|
108
|
+
.pill:hover{border-color:var(--cyan);color:var(--ink)}
|
|
109
|
+
.pill b{color:var(--ink);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
110
|
+
.spacer{flex:1}
|
|
111
|
+
.stat{color:var(--dim);font-variant-numeric:tabular-nums;white-space:nowrap}
|
|
112
|
+
.stat b{color:var(--muted);font-weight:500}
|
|
113
|
+
.stopbtn{border:1px solid var(--red);color:var(--red);border-radius:999px;padding:4px 11px}
|
|
114
|
+
|
|
115
|
+
.view{flex:1;overflow-y:auto;min-height:0}
|
|
116
|
+
.view[hidden]{display:none}
|
|
117
|
+
.wrap{max-width:840px;margin:0 auto;padding:24px}
|
|
118
|
+
.hero{text-align:center;padding:12vh 0 0;color:var(--muted)}
|
|
119
|
+
.hero .mark{width:64px;height:63px;color:var(--cyan);margin:0 auto 14px}
|
|
120
|
+
.hero h1{font-size:22px;margin:0;color:var(--ink);font-weight:600}
|
|
121
|
+
.hero p{font-size:13px;margin:8px 0 0}
|
|
122
|
+
.hero .ex{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin-top:18px}
|
|
123
|
+
.hero .ex button{border:1px solid var(--line);border-radius:999px;padding:5px 13px;
|
|
124
|
+
font-size:12px;color:var(--muted);background:var(--panel)}
|
|
125
|
+
.hero .ex button:hover{border-color:var(--cyan);color:var(--cyan)}
|
|
126
|
+
|
|
127
|
+
/* ── transcript ──────────────────────────────────────────── */
|
|
128
|
+
.msg{margin-bottom:18px}
|
|
129
|
+
.you{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);
|
|
130
|
+
padding:11px 14px;white-space:pre-wrap;word-break:break-word}
|
|
131
|
+
.who{display:flex;align-items:center;gap:7px;font-size:10.5px;letter-spacing:.11em;
|
|
132
|
+
color:var(--dim);text-transform:uppercase;margin-bottom:7px}
|
|
133
|
+
.who .mark{width:13px;height:13px;color:var(--cyan)}
|
|
134
|
+
.reply{white-space:pre-wrap;word-break:break-word}
|
|
135
|
+
.reply code{background:var(--panel-2);border:1px solid var(--line);border-radius:4px;
|
|
136
|
+
padding:1px 5px;font-family:var(--mono);font-size:12.5px}
|
|
137
|
+
.reply pre{background:var(--panel);border:1px solid var(--line);border-radius:8px;
|
|
138
|
+
padding:12px 14px;overflow-x:auto;margin:10px 0;white-space:pre}
|
|
139
|
+
.reply pre code{background:none;border:0;padding:0;font-size:12.5px;line-height:1.5}
|
|
140
|
+
.reply h3{font-size:14.5px;margin:16px 0 6px}
|
|
141
|
+
.reply strong{font-weight:600}
|
|
142
|
+
.reply table{border-collapse:collapse;margin:10px 0;font-size:12.5px;display:block;overflow-x:auto}
|
|
143
|
+
.reply th,.reply td{border:1px solid var(--line);padding:5px 9px;text-align:left}
|
|
144
|
+
.reply th{background:var(--panel-2);color:var(--muted);font-weight:600}
|
|
145
|
+
|
|
146
|
+
.tool{border:1px solid var(--line);border-left:3px solid var(--dim);border-radius:8px;
|
|
147
|
+
background:var(--panel);margin:8px 0;overflow:hidden}
|
|
148
|
+
.tool.ok{border-left-color:var(--green)} .tool.bad{border-left-color:var(--red)}
|
|
149
|
+
.tool.run{border-left-color:var(--amber)}
|
|
150
|
+
.tool .th{display:flex;align-items:center;gap:9px;padding:8px 12px;font-size:12.5px;width:100%;
|
|
151
|
+
text-align:left}
|
|
152
|
+
.tool .th:hover{background:var(--panel-2)}
|
|
153
|
+
.tool .nm{font-family:var(--mono);color:var(--cyan);font-size:12px}
|
|
154
|
+
.tool .dt{color:var(--muted);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
|
|
155
|
+
font-family:var(--mono);font-size:11.5px}
|
|
156
|
+
.tool .ms{color:var(--dim);font-variant-numeric:tabular-nums;font-size:11px}
|
|
157
|
+
.tool .body{border-top:1px solid var(--line);padding:9px 12px;font-family:var(--mono);
|
|
158
|
+
font-size:11.5px;color:var(--muted);white-space:pre-wrap;max-height:320px;overflow:auto}
|
|
159
|
+
.think{border:1px solid var(--line);border-left:3px solid var(--violet);border-radius:8px;
|
|
160
|
+
padding:9px 12px;margin:8px 0;color:var(--violet);font-size:12.5px;white-space:pre-wrap;
|
|
161
|
+
max-height:210px;overflow:auto;background:var(--panel)}
|
|
162
|
+
.notice{border:1px solid var(--line);border-left:3px solid var(--amber);border-radius:8px;
|
|
163
|
+
padding:10px 13px;margin:9px 0;font-size:12.5px;color:var(--muted);white-space:pre-wrap;
|
|
164
|
+
background:var(--panel)}
|
|
165
|
+
.notice.info{border-left-color:var(--cyan)}
|
|
166
|
+
.err{border:1px solid var(--red);border-left:3px solid var(--red);border-radius:8px;
|
|
167
|
+
padding:10px 13px;margin:9px 0;font-size:12.5px;color:var(--red);white-space:pre-wrap;
|
|
168
|
+
background:var(--panel)}
|
|
169
|
+
|
|
170
|
+
.plan{border:1px solid var(--line);border-radius:8px;background:var(--panel);margin:9px 0;
|
|
171
|
+
padding:11px 13px;font-size:12.5px}
|
|
172
|
+
.plan h4{margin:0 0 8px;font-size:10.5px;letter-spacing:.11em;color:var(--dim);
|
|
173
|
+
text-transform:uppercase;display:flex;justify-content:space-between}
|
|
174
|
+
.step{display:flex;gap:9px;padding:2px 0;color:var(--muted)}
|
|
175
|
+
.step .bx{width:14px;color:var(--dim);flex:0 0 14px;text-align:center;font-family:var(--mono)}
|
|
176
|
+
.step.done{color:var(--dim);text-decoration:line-through} .step.done .bx{color:var(--green)}
|
|
177
|
+
.step.doing{color:var(--ink);font-weight:500} .step.doing .bx{color:var(--amber)}
|
|
178
|
+
.step.blocked .bx{color:var(--red)}
|
|
179
|
+
|
|
180
|
+
.ask{border:1px solid var(--amber);border-radius:var(--radius);background:var(--panel);
|
|
181
|
+
padding:12px 14px;margin:11px 0;box-shadow:var(--shadow)}
|
|
182
|
+
.ask .q{font-size:13px;margin-bottom:5px;font-weight:500}
|
|
183
|
+
.ask .a{font-family:var(--mono);font-size:11.5px;color:var(--muted);margin-bottom:11px;
|
|
184
|
+
white-space:pre-wrap;max-height:140px;overflow:auto;background:var(--panel-2);
|
|
185
|
+
border-radius:6px;padding:7px 9px}
|
|
186
|
+
.ask .btns{display:flex;gap:8px}
|
|
187
|
+
.ask .btns button{padding:6px 15px;border-radius:7px;border:1px solid var(--line)}
|
|
188
|
+
.ask .yes{border-color:var(--green);color:var(--green)}
|
|
189
|
+
.ask .no{border-color:var(--red);color:var(--red)}
|
|
190
|
+
|
|
191
|
+
.busy{display:flex;align-items:center;gap:10px;color:var(--amber);font-size:12.5px;margin:8px 0}
|
|
192
|
+
.sp{width:11px;height:11px;border:2px solid var(--amber);border-right-color:transparent;
|
|
193
|
+
border-radius:50%;animation:spin .8s linear infinite}
|
|
194
|
+
@keyframes spin{to{transform:rotate(360deg)}}
|
|
195
|
+
|
|
196
|
+
/* ── changes ─────────────────────────────────────────────── */
|
|
197
|
+
.chead{display:flex;align-items:center;gap:14px;margin-bottom:14px;font-size:12.5px;
|
|
198
|
+
color:var(--muted);flex-wrap:wrap}
|
|
199
|
+
.chead .plus{color:var(--green);font-variant-numeric:tabular-nums}
|
|
200
|
+
.chead .minus{color:var(--red);font-variant-numeric:tabular-nums}
|
|
201
|
+
.file{border:1px solid var(--line);border-radius:8px;background:var(--panel);margin-bottom:10px;
|
|
202
|
+
overflow:hidden}
|
|
203
|
+
.file .fh{display:flex;align-items:center;gap:10px;padding:9px 12px;width:100%;text-align:left;
|
|
204
|
+
font-size:12.5px}
|
|
205
|
+
.file .fh:hover{background:var(--panel-2)}
|
|
206
|
+
.file .kind{font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;padding:2px 6px;
|
|
207
|
+
border-radius:4px;border:1px solid var(--line);color:var(--muted);flex:0 0 auto}
|
|
208
|
+
.file .kind.added{color:var(--green);border-color:var(--green)}
|
|
209
|
+
.file .kind.deleted{color:var(--red);border-color:var(--red)}
|
|
210
|
+
.file .fp{font-family:var(--mono);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
|
|
211
|
+
direction:rtl;text-align:left}
|
|
212
|
+
.file .cnt{font-size:11px;font-variant-numeric:tabular-nums;flex:0 0 auto}
|
|
213
|
+
.diff{border-top:1px solid var(--line);font-family:var(--mono);font-size:11.5px;line-height:1.45;
|
|
214
|
+
overflow-x:auto;max-height:520px;overflow-y:auto}
|
|
215
|
+
.diff div{padding:0 12px;white-space:pre}
|
|
216
|
+
.diff .a{background:var(--add-bg);color:var(--add-ink)}
|
|
217
|
+
.diff .d{background:var(--del-bg);color:var(--del-ink)}
|
|
218
|
+
.diff .c{color:var(--muted)}
|
|
219
|
+
.diff .h{color:var(--dim);background:var(--panel-2);padding:2px 12px}
|
|
220
|
+
|
|
221
|
+
/* ── timing ──────────────────────────────────────────────── */
|
|
222
|
+
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:10px;
|
|
223
|
+
margin-bottom:18px}
|
|
224
|
+
.card{border:1px solid var(--line);border-radius:8px;background:var(--panel);padding:11px 13px}
|
|
225
|
+
.card .k{font-size:10px;letter-spacing:.11em;color:var(--dim);text-transform:uppercase}
|
|
226
|
+
.card .v{font-size:19px;margin-top:3px;font-variant-numeric:tabular-nums;font-weight:600}
|
|
227
|
+
.card .s{font-size:11px;color:var(--muted);margin-top:2px}
|
|
228
|
+
.bars{border:1px solid var(--line);border-radius:8px;background:var(--panel);overflow:hidden}
|
|
229
|
+
.brow{display:flex;align-items:center;gap:10px;padding:6px 12px;font-size:12px;
|
|
230
|
+
border-bottom:1px solid var(--line)}
|
|
231
|
+
.brow:last-child{border-bottom:0}
|
|
232
|
+
.brow .lbl{width:118px;flex:0 0 118px;color:var(--muted);font-family:var(--mono);font-size:11px;
|
|
233
|
+
overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
234
|
+
.brow .track{flex:1;height:15px;background:var(--panel-2);border-radius:4px;overflow:hidden;
|
|
235
|
+
display:flex;min-width:60px}
|
|
236
|
+
.brow .seg{height:100%}
|
|
237
|
+
.brow .seg.wait{background:var(--violet);opacity:.55}
|
|
238
|
+
.brow .seg.gen{background:var(--cyan)}
|
|
239
|
+
.brow .seg.tool{background:var(--amber)}
|
|
240
|
+
.brow .val{width:74px;flex:0 0 74px;text-align:right;color:var(--dim);
|
|
241
|
+
font-variant-numeric:tabular-nums;font-size:11px}
|
|
242
|
+
.legend{display:flex;gap:16px;margin:10px 0 0;font-size:11px;color:var(--muted)}
|
|
243
|
+
.legend i{width:9px;height:9px;border-radius:2px;display:inline-block;margin-right:5px}
|
|
244
|
+
.empty{text-align:center;padding:12vh 0;color:var(--dim);font-size:13px}
|
|
245
|
+
|
|
246
|
+
/* ── composer ────────────────────────────────────────────── */
|
|
247
|
+
footer{flex:0 0 auto;border-top:1px solid var(--line);background:var(--panel);padding:11px 0 13px}
|
|
248
|
+
footer[hidden]{display:none}
|
|
249
|
+
.cbox{max-width:840px;margin:0 auto;padding:0 24px}
|
|
250
|
+
.cin{display:flex;align-items:flex-end;gap:10px;border:1px solid var(--line);
|
|
251
|
+
background:var(--panel-2);border-radius:var(--radius);padding:9px 11px;transition:border-color .14s}
|
|
252
|
+
.cin:focus-within{border-color:var(--cyan)}
|
|
253
|
+
textarea{flex:1;background:none;border:0;outline:0;resize:none;max-height:200px;
|
|
254
|
+
line-height:1.5;font-size:14px}
|
|
255
|
+
textarea::placeholder{color:var(--dim)}
|
|
256
|
+
.send{width:31px;height:31px;flex:0 0 31px;border-radius:50%;
|
|
257
|
+
background:var(--cyan);color:var(--cyan-ink);font-size:15px;display:grid;place-items:center}
|
|
258
|
+
.send:disabled{background:var(--line);color:var(--dim);cursor:not-allowed}
|
|
259
|
+
.chint{display:flex;gap:13px;margin-top:7px;font-size:10.5px;color:var(--dim)}
|
|
260
|
+
.chint kbd{border:1px solid var(--line);border-radius:4px;padding:0 4px;font-family:var(--mono)}
|
|
261
|
+
.readonly{max-width:840px;margin:0 auto;padding:0 24px;font-size:12px;color:var(--dim);
|
|
262
|
+
display:flex;gap:9px;align-items:center}
|
|
263
|
+
|
|
264
|
+
dialog{border:1px solid var(--line);background:var(--panel);color:var(--ink);
|
|
265
|
+
border-radius:var(--radius);padding:0;max-width:450px;width:92%;box-shadow:var(--shadow)}
|
|
266
|
+
dialog::backdrop{background:rgba(0,0,0,.5)}
|
|
267
|
+
.dlg{padding:18px}
|
|
268
|
+
.dlg h3{margin:0 0 5px;font-size:15px}
|
|
269
|
+
.dlg p{margin:0 0 14px;color:var(--muted);font-size:12.5px}
|
|
270
|
+
.dlg label{display:block;font-size:10.5px;letter-spacing:.09em;color:var(--dim);
|
|
271
|
+
text-transform:uppercase;margin:0 0 4px}
|
|
272
|
+
.dlg input,.dlg select{width:100%;padding:8px 10px;border-radius:8px;border:1px solid var(--line);
|
|
273
|
+
background:var(--panel-2);margin-bottom:11px}
|
|
274
|
+
.dlg .row{display:flex;gap:8px;justify-content:flex-end}
|
|
275
|
+
.dlg .row button{padding:7px 15px;border-radius:8px;border:1px solid var(--line)}
|
|
276
|
+
.dlg .go{border-color:var(--cyan);color:var(--cyan)}
|
|
277
|
+
|
|
278
|
+
@media (max-width:820px){
|
|
279
|
+
aside{position:absolute;z-index:5;height:100%;box-shadow:var(--shadow)}
|
|
280
|
+
.wrap,.cbox{padding-left:16px;padding-right:16px}
|
|
281
|
+
}
|
|
282
|
+
`;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=ui-css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-css.js","sourceRoot":"","sources":["../../src/web/ui-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,OAAO;;;;;;;;;;gBAUO,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiQtB,CAAC;AACF,CAAC"}
|
package/dist/web/ui.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The page, assembled.
|
|
3
|
+
*
|
|
4
|
+
* One HTML document with its styles and script inline, served from memory. No build step and
|
|
5
|
+
* nothing fetched from the network: KONECK is installed with `npm i -g koneck`, so anything needing
|
|
6
|
+
* a second toolchain would be broken for most people on the day they first tried it — and a page
|
|
7
|
+
* that pulls a font from a CDN does not work on the machine most likely to be running a local
|
|
8
|
+
* model, which is one that is offline.
|
|
9
|
+
*/
|
|
10
|
+
export declare function page(): string;
|
|
11
|
+
//# sourceMappingURL=ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,wBAAgB,IAAI,IAAI,MAAM,CAsG7B"}
|
package/dist/web/ui.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The page, assembled.
|
|
3
|
+
*
|
|
4
|
+
* One HTML document with its styles and script inline, served from memory. No build step and
|
|
5
|
+
* nothing fetched from the network: KONECK is installed with `npm i -g koneck`, so anything needing
|
|
6
|
+
* a second toolchain would be broken for most people on the day they first tried it — and a page
|
|
7
|
+
* that pulls a font from a CDN does not work on the machine most likely to be running a local
|
|
8
|
+
* model, which is one that is offline.
|
|
9
|
+
*/
|
|
10
|
+
import { MARK_MASK } from './mark.js';
|
|
11
|
+
import { css } from './ui-css.js';
|
|
12
|
+
import { clientScript } from './ui-client.js';
|
|
13
|
+
export function page() {
|
|
14
|
+
return `<!doctype html>
|
|
15
|
+
<html lang="en"><head>
|
|
16
|
+
<meta charset="utf-8">
|
|
17
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
18
|
+
<meta name="referrer" content="no-referrer">
|
|
19
|
+
<meta name="color-scheme" content="light dark">
|
|
20
|
+
<title>KONECK</title>
|
|
21
|
+
<style>${css(MARK_MASK)}</style>
|
|
22
|
+
</head><body>
|
|
23
|
+
|
|
24
|
+
<aside id="side">
|
|
25
|
+
<div class="brand">
|
|
26
|
+
<div class="mark"></div>
|
|
27
|
+
<b>KONECK</b>
|
|
28
|
+
<span class="tag">web</span>
|
|
29
|
+
</div>
|
|
30
|
+
<button class="newbtn" id="new">New session</button>
|
|
31
|
+
<div class="slist" id="slist"></div>
|
|
32
|
+
<div class="foot">
|
|
33
|
+
<span id="wsname" style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap">—</span>
|
|
34
|
+
<button class="themebtn" id="theme">system</button>
|
|
35
|
+
<span id="conn">offline</span>
|
|
36
|
+
</div>
|
|
37
|
+
</aside>
|
|
38
|
+
|
|
39
|
+
<main>
|
|
40
|
+
<header>
|
|
41
|
+
<button class="iconbtn" id="sidebtn" title="Show or hide the sidebar">☰</button>
|
|
42
|
+
<div class="tabs">
|
|
43
|
+
<button class="tab on" id="tab-chat">Chat</button>
|
|
44
|
+
<button class="tab" id="tab-changes">Changes</button>
|
|
45
|
+
<button class="tab" id="tab-timing">Timing</button>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="spacer"></div>
|
|
48
|
+
<button class="pill" id="pprov">provider <b>—</b></button>
|
|
49
|
+
<button class="pill" id="pmodel">model <b>—</b></button>
|
|
50
|
+
<div class="stat" id="stat">—</div>
|
|
51
|
+
<button class="stopbtn" id="stop" hidden>stop</button>
|
|
52
|
+
</header>
|
|
53
|
+
|
|
54
|
+
<div class="view" id="chatview">
|
|
55
|
+
<div class="wrap" id="stream">
|
|
56
|
+
<div class="hero">
|
|
57
|
+
<div class="mark"></div>
|
|
58
|
+
<h1>Into the workspace</h1>
|
|
59
|
+
<p>Everything the CLI does, from here. Ask for a change and watch it happen.</p>
|
|
60
|
+
<div class="ex">
|
|
61
|
+
<button>What is in this project?</button>
|
|
62
|
+
<button>Find the slowest test and explain why</button>
|
|
63
|
+
<button>Add a README with real usage examples</button>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
<div class="view" id="changesview" hidden></div>
|
|
70
|
+
<div class="view" id="timingview" hidden></div>
|
|
71
|
+
|
|
72
|
+
<footer id="composer">
|
|
73
|
+
<div class="cbox">
|
|
74
|
+
<div class="cin">
|
|
75
|
+
<textarea id="ta" rows="1" placeholder="Describe what you want to build…"></textarea>
|
|
76
|
+
<button class="send" id="send" disabled title="Send">↑</button>
|
|
77
|
+
</div>
|
|
78
|
+
<div class="chint">
|
|
79
|
+
<span><kbd>Enter</kbd> send</span>
|
|
80
|
+
<span><kbd>Shift</kbd>+<kbd>Enter</kbd> newline</span>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
</footer>
|
|
84
|
+
<footer id="readonlybar" hidden>
|
|
85
|
+
<div class="readonly">
|
|
86
|
+
<span>Finished session, read only —</span>
|
|
87
|
+
<b id="readonlywhat" style="font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"></b>
|
|
88
|
+
</div>
|
|
89
|
+
</footer>
|
|
90
|
+
</main>
|
|
91
|
+
|
|
92
|
+
<dialog id="tokdlg"><form class="dlg" method="dialog">
|
|
93
|
+
<h3>Token needed</h3>
|
|
94
|
+
<p>Anything that starts a run needs the token KONECK printed when it started. It is in the
|
|
95
|
+
terminal you launched it from.</p>
|
|
96
|
+
<label for="tokin">Token</label>
|
|
97
|
+
<input id="tokin" placeholder="paste it here" autocomplete="off">
|
|
98
|
+
<div class="row"><button class="go" id="toksave">Use it</button></div>
|
|
99
|
+
</form></dialog>
|
|
100
|
+
|
|
101
|
+
<dialog id="mdlg"><form class="dlg" method="dialog">
|
|
102
|
+
<h3>Model</h3>
|
|
103
|
+
<p>Applies from your next message.</p>
|
|
104
|
+
<label for="mprov">Provider</label>
|
|
105
|
+
<select id="mprov"></select>
|
|
106
|
+
<label for="mmodel">Model</label>
|
|
107
|
+
<input id="mmodel" placeholder="model name" autocomplete="off">
|
|
108
|
+
<div class="row"><button>Cancel</button><button class="go" id="msave">Switch</button></div>
|
|
109
|
+
</form></dialog>
|
|
110
|
+
|
|
111
|
+
<script>
|
|
112
|
+
${clientScript()}
|
|
113
|
+
</script>
|
|
114
|
+
</body></html>`;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,UAAU,IAAI;IAClB,OAAO;;;;;;;SAOA,GAAG,CAAC,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2FrB,YAAY,EAAE;;eAED,CAAC;AAChB,CAAC"}
|