orquesta-agent 0.2.220 → 0.2.222
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/index.js +44 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +6 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +26 -0
- package/dist/logger.js.map +1 -1
- package/dist/supabase.d.ts +24 -0
- package/dist/supabase.d.ts.map +1 -1
- package/dist/supabase.js +71 -0
- package/dist/supabase.js.map +1 -1
- package/dist/ui/onboarding.d.ts +38 -0
- package/dist/ui/onboarding.d.ts.map +1 -0
- package/dist/ui/onboarding.js +180 -0
- package/dist/ui/onboarding.js.map +1 -0
- package/dist/ui/public/logo-mark-white.png +0 -0
- package/dist/ui/public/welcome.css +247 -0
- package/dist/ui/public/welcome.html +210 -0
- package/dist/ui/public/welcome.js +183 -0
- package/dist/ui/server.d.ts +32 -0
- package/dist/ui/server.d.ts.map +1 -1
- package/dist/ui/server.js +87 -0
- package/dist/ui/server.js.map +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.js +6 -7
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/* First-run welcome / onboarding wizard. Reuses the palette from style.css. */
|
|
2
|
+
|
|
3
|
+
.welcome-body {
|
|
4
|
+
overflow: auto;
|
|
5
|
+
background:
|
|
6
|
+
radial-gradient(1100px 560px at 50% -12%, rgba(34,197,94,0.14), transparent 70%),
|
|
7
|
+
radial-gradient(820px 440px at 88% 116%, rgba(34,197,94,0.06), transparent 70%),
|
|
8
|
+
var(--bg-950);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.wz {
|
|
12
|
+
max-width: 900px;
|
|
13
|
+
margin: 0 auto;
|
|
14
|
+
min-height: 100vh;
|
|
15
|
+
padding: 0 30px;
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-direction: column;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* ── Header ─────────────────────────────────────────── */
|
|
21
|
+
.wz-head {
|
|
22
|
+
display: flex;
|
|
23
|
+
align-items: center;
|
|
24
|
+
justify-content: space-between;
|
|
25
|
+
gap: 16px;
|
|
26
|
+
padding: 26px 0 18px;
|
|
27
|
+
}
|
|
28
|
+
.wz-brand { display: flex; align-items: center; gap: 11px; }
|
|
29
|
+
.wz-logo { width: 30px; height: 30px; filter: drop-shadow(0 2px 8px rgba(34,197,94,0.25)); }
|
|
30
|
+
.wz-brand-text { display: flex; flex-direction: column; line-height: 1.05; }
|
|
31
|
+
.wz-brand-name { font-weight: 800; font-size: 17px; letter-spacing: -0.02em; }
|
|
32
|
+
.wz-version { color: var(--text-500); font-size: 11px; font-family: 'JetBrains Mono', monospace; margin-top: 1px; }
|
|
33
|
+
|
|
34
|
+
.wz-report-btn {
|
|
35
|
+
display: inline-flex; align-items: center; gap: 7px;
|
|
36
|
+
font-family: inherit; font-size: 13px; font-weight: 600; cursor: pointer;
|
|
37
|
+
color: #fca5a5; background: rgba(239,68,68,0.07);
|
|
38
|
+
border: 1px solid rgba(239,68,68,0.28); border-radius: 9px; padding: 8px 14px;
|
|
39
|
+
transition: color .15s ease, border-color .15s ease, background .15s ease, transform .1s ease;
|
|
40
|
+
}
|
|
41
|
+
.wz-report-btn:hover { color: #fecaca; border-color: rgba(239,68,68,0.55); background: rgba(239,68,68,0.15); }
|
|
42
|
+
.wz-report-btn:active { transform: translateY(1px); }
|
|
43
|
+
.wz-report-btn svg { width: 15px; height: 15px; }
|
|
44
|
+
|
|
45
|
+
/* ── Progress (numbered, labelled) ──────────────────── */
|
|
46
|
+
.wz-steps { display: flex; align-items: center; gap: 0; padding: 6px 0 22px; }
|
|
47
|
+
.wz-pip { display: flex; align-items: center; gap: 9px; flex: 0 0 auto; cursor: default; }
|
|
48
|
+
.wz-pip-num {
|
|
49
|
+
width: 26px; height: 26px; flex: 0 0 26px; border-radius: 50%;
|
|
50
|
+
display: grid; place-items: center; font-size: 12px; font-weight: 700;
|
|
51
|
+
background: var(--bg-800); color: var(--text-500);
|
|
52
|
+
border: 1px solid var(--bg-700); transition: all .22s cubic-bezier(.2,.7,.3,1);
|
|
53
|
+
}
|
|
54
|
+
.wz-pip-label { font-size: 12px; color: var(--text-500); font-weight: 500; white-space: nowrap; transition: color .22s ease; }
|
|
55
|
+
.wz-pip-line { flex: 1 1 auto; height: 2px; border-radius: 2px; background: var(--bg-700); margin: 0 11px; min-width: 8px; transition: background .3s ease; }
|
|
56
|
+
/* Fill the connector leading into any reached step (modern :has, degrades gracefully). */
|
|
57
|
+
.wz-pip-line:has(+ .wz-pip.active), .wz-pip-line:has(+ .wz-pip.done) {
|
|
58
|
+
background: linear-gradient(90deg, rgba(34,197,94,0.5), var(--green));
|
|
59
|
+
}
|
|
60
|
+
.wz-pip:hover .wz-pip-num { border-color: var(--bg-600); }
|
|
61
|
+
.wz-pip.active .wz-pip-num { background: var(--green); color: #052e16; border-color: var(--green); box-shadow: 0 0 0 4px var(--green-bg); }
|
|
62
|
+
.wz-pip.active .wz-pip-label { color: var(--text-100); font-weight: 600; }
|
|
63
|
+
.wz-pip.done .wz-pip-num { background: var(--green-bg); color: var(--green-light); border-color: rgba(34,197,94,0.45); }
|
|
64
|
+
.wz-pip.done .wz-pip-label { color: var(--text-400); }
|
|
65
|
+
|
|
66
|
+
/* ── Main / steps ───────────────────────────────────── */
|
|
67
|
+
.wz-main { flex: 1; display: flex; flex-direction: column; justify-content: center; padding: 10px 0 30px; }
|
|
68
|
+
.wz-step { animation: wzIn .32s cubic-bezier(.2,.7,.3,1); }
|
|
69
|
+
@keyframes wzIn { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }
|
|
70
|
+
|
|
71
|
+
.wz-step-head { margin-bottom: 12px; }
|
|
72
|
+
.wz-step-kicker {
|
|
73
|
+
display: inline-block; font-size: 11px; font-weight: 700; letter-spacing: .1em;
|
|
74
|
+
text-transform: uppercase; color: var(--green-light); margin-bottom: 10px;
|
|
75
|
+
padding: 3px 9px; border-radius: 6px;
|
|
76
|
+
background: var(--green-bg); border: 1px solid rgba(34,197,94,0.22);
|
|
77
|
+
}
|
|
78
|
+
.wz-step h1 { font-size: 38px; line-height: 1.08; letter-spacing: -0.038em; margin-bottom: 14px; font-weight: 800; }
|
|
79
|
+
.wz-step h2 { font-size: 28px; letter-spacing: -0.028em; font-weight: 700; line-height: 1.15; }
|
|
80
|
+
.wz-lead { color: var(--text-300); font-size: 15.5px; line-height: 1.6; max-width: 740px; margin-bottom: 26px; }
|
|
81
|
+
.wz-lead-center { margin-left: auto; margin-right: auto; }
|
|
82
|
+
.wz-lead code, .wz-step code {
|
|
83
|
+
font-family: 'JetBrains Mono', monospace; font-size: .85em;
|
|
84
|
+
background: var(--bg-800); border: 1px solid var(--bg-700);
|
|
85
|
+
border-radius: 5px; padding: 1.5px 6px; color: var(--green-light);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Hero (step 1) */
|
|
89
|
+
.wz-hero { text-align: center; margin-bottom: 34px; }
|
|
90
|
+
.wz-hero-logo { width: 60px; height: 60px; margin-bottom: 20px; filter: drop-shadow(0 8px 28px rgba(34,197,94,0.4)); }
|
|
91
|
+
.wz-hero-badge {
|
|
92
|
+
display: inline-flex; align-items: center; gap: 8px; margin-bottom: 20px;
|
|
93
|
+
background: var(--green-bg); color: var(--green-light);
|
|
94
|
+
border: 1px solid rgba(34,197,94,0.3);
|
|
95
|
+
border-radius: 999px; padding: 6px 15px; font-size: 12.5px; font-weight: 600;
|
|
96
|
+
}
|
|
97
|
+
.wz-pulse { width: 7px; height: 7px; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 0 rgba(34,197,94,0.6); animation: wzPulse 2s infinite; }
|
|
98
|
+
@keyframes wzPulse { 0% { box-shadow: 0 0 0 0 rgba(34,197,94,0.5);} 70% { box-shadow: 0 0 0 7px rgba(34,197,94,0);} 100% { box-shadow: 0 0 0 0 rgba(34,197,94,0);} }
|
|
99
|
+
|
|
100
|
+
/* Card grid */
|
|
101
|
+
.wz-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; }
|
|
102
|
+
.wz-card {
|
|
103
|
+
position: relative; overflow: hidden;
|
|
104
|
+
background: linear-gradient(180deg, var(--bg-900), rgba(20,20,23,0.55));
|
|
105
|
+
border: 1px solid var(--bg-700); border-radius: 16px; padding: 22px 20px;
|
|
106
|
+
transition: border-color .18s ease, transform .18s ease, box-shadow .18s ease;
|
|
107
|
+
}
|
|
108
|
+
.wz-card::before {
|
|
109
|
+
content: ''; position: absolute; inset: 0 0 auto 0; height: 1px;
|
|
110
|
+
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.08), transparent);
|
|
111
|
+
}
|
|
112
|
+
.wz-card:hover { border-color: rgba(34,197,94,0.35); transform: translateY(-3px); box-shadow: 0 12px 32px rgba(0,0,0,0.3); }
|
|
113
|
+
.wz-card-ico {
|
|
114
|
+
display: grid; place-items: center; width: 42px; height: 42px; margin-bottom: 15px;
|
|
115
|
+
border-radius: 11px; color: var(--green-light);
|
|
116
|
+
background: var(--green-bg); border: 1px solid rgba(34,197,94,0.25);
|
|
117
|
+
}
|
|
118
|
+
.wz-card-ico svg { width: 21px; height: 21px; }
|
|
119
|
+
.wz-card h3 { font-size: 15px; margin-bottom: 7px; letter-spacing: -0.01em; }
|
|
120
|
+
.wz-card p { color: var(--text-400); font-size: 13.5px; line-height: 1.55; }
|
|
121
|
+
|
|
122
|
+
/* Mode list */
|
|
123
|
+
.wz-modes { display: flex; flex-direction: column; gap: 12px; }
|
|
124
|
+
.wz-mode {
|
|
125
|
+
display: flex; gap: 16px; align-items: flex-start;
|
|
126
|
+
background: var(--bg-900); border: 1px solid var(--bg-700);
|
|
127
|
+
border-radius: 13px; padding: 16px 18px;
|
|
128
|
+
transition: border-color .18s ease, background .18s ease;
|
|
129
|
+
}
|
|
130
|
+
.wz-mode:hover { border-color: var(--bg-600); background: rgba(255,255,255,0.012); }
|
|
131
|
+
.wz-mode h4 { font-size: 15px; margin-bottom: 4px; display: flex; align-items: center; gap: 9px; letter-spacing: -0.01em; }
|
|
132
|
+
.wz-mode p { color: var(--text-400); font-size: 14px; line-height: 1.55; }
|
|
133
|
+
.wz-mode p code { font-size: .82em; }
|
|
134
|
+
.wz-tag {
|
|
135
|
+
flex-shrink: 0; min-width: 94px; text-align: center;
|
|
136
|
+
font-family: 'JetBrains Mono', monospace; font-size: 12px; font-weight: 500;
|
|
137
|
+
background: var(--bg-800); border: 1px solid var(--bg-700); color: var(--text-300);
|
|
138
|
+
border-radius: 8px; padding: 8px 8px; margin-top: 1px;
|
|
139
|
+
}
|
|
140
|
+
.wz-tag-green { background: var(--green-bg); border-color: rgba(34,197,94,0.3); color: var(--green-light); }
|
|
141
|
+
.wz-tag-yellow { background: var(--yellow-bg); border-color: rgba(234,179,8,0.3); color: var(--yellow); }
|
|
142
|
+
.wz-tag-purple { background: var(--purple-bg); border-color: rgba(168,85,247,0.3); color: var(--purple); }
|
|
143
|
+
.wz-rec {
|
|
144
|
+
font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em;
|
|
145
|
+
color: var(--green-light); background: var(--green-bg);
|
|
146
|
+
border: 1px solid rgba(34,197,94,0.25);
|
|
147
|
+
border-radius: 5px; padding: 2px 7px;
|
|
148
|
+
}
|
|
149
|
+
.wz-note { color: var(--text-500); font-size: 13px; line-height: 1.55; margin-top: 20px; }
|
|
150
|
+
.wz-note strong { color: var(--text-300); }
|
|
151
|
+
.wz-note code { font-size: .85em; }
|
|
152
|
+
|
|
153
|
+
/* Configure form */
|
|
154
|
+
.wz-form { display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; margin-bottom: 20px; }
|
|
155
|
+
.wz-field { display: flex; flex-direction: column; gap: 8px; }
|
|
156
|
+
.wz-field label { font-size: 13px; font-weight: 600; color: var(--text-300); }
|
|
157
|
+
.wz-select-wrap { position: relative; }
|
|
158
|
+
.wz-select-wrap::after {
|
|
159
|
+
content: ''; position: absolute; right: 14px; top: 50%; width: 8px; height: 8px;
|
|
160
|
+
transform: translateY(-65%) rotate(45deg); pointer-events: none;
|
|
161
|
+
border-right: 1.5px solid var(--text-500); border-bottom: 1.5px solid var(--text-500);
|
|
162
|
+
}
|
|
163
|
+
.wz-field select, .wz-textarea {
|
|
164
|
+
width: 100%;
|
|
165
|
+
background: var(--bg-900); color: var(--text-100);
|
|
166
|
+
border: 1px solid var(--bg-700); border-radius: 10px;
|
|
167
|
+
padding: 11px 12px; font-size: 14px; font-family: inherit;
|
|
168
|
+
transition: border-color .15s ease, box-shadow .15s ease;
|
|
169
|
+
}
|
|
170
|
+
.wz-field select {
|
|
171
|
+
cursor: pointer; appearance: none; -webkit-appearance: none;
|
|
172
|
+
padding-right: 34px;
|
|
173
|
+
}
|
|
174
|
+
.wz-field select:hover { border-color: var(--bg-600); }
|
|
175
|
+
.wz-field select:focus, .wz-textarea:focus { outline: none; border-color: var(--green); box-shadow: 0 0 0 3px var(--green-bg); }
|
|
176
|
+
.wz-apply-row { display: flex; align-items: center; gap: 14px; }
|
|
177
|
+
.wz-apply-status { font-size: 13px; color: var(--text-400); }
|
|
178
|
+
.wz-apply-status.ok { color: var(--green-light); }
|
|
179
|
+
.wz-apply-status.err { color: #fca5a5; }
|
|
180
|
+
|
|
181
|
+
/* ── Footer ─────────────────────────────────────────── */
|
|
182
|
+
.wz-foot {
|
|
183
|
+
display: flex; align-items: center; gap: 16px;
|
|
184
|
+
padding: 18px 0 30px; border-top: 1px solid var(--bg-800);
|
|
185
|
+
}
|
|
186
|
+
.wz-foot-spacer { flex: 1; }
|
|
187
|
+
.wz-skip { color: var(--text-500); font-size: 13px; text-decoration: none; transition: color .15s ease; }
|
|
188
|
+
.wz-skip:hover { color: var(--text-300); }
|
|
189
|
+
|
|
190
|
+
.wz-btn {
|
|
191
|
+
font-family: inherit; font-size: 14px; font-weight: 600; cursor: pointer;
|
|
192
|
+
border-radius: 10px; padding: 10px 24px; border: 1px solid transparent;
|
|
193
|
+
transition: background .15s ease, border-color .15s ease, opacity .15s ease, transform .1s ease, box-shadow .15s ease;
|
|
194
|
+
}
|
|
195
|
+
.wz-btn:active { transform: translateY(1px); }
|
|
196
|
+
.wz-btn-primary { background: var(--green); color: #052e16; box-shadow: 0 4px 16px rgba(34,197,94,0.22); }
|
|
197
|
+
.wz-btn-primary:hover { background: var(--green-light); box-shadow: 0 6px 20px rgba(34,197,94,0.3); }
|
|
198
|
+
.wz-btn-ghost { background: transparent; color: var(--text-300); border-color: var(--bg-700); }
|
|
199
|
+
.wz-btn-ghost:hover { border-color: var(--bg-600); color: var(--text-100); }
|
|
200
|
+
.wz-btn:disabled { opacity: .5; cursor: default; box-shadow: none; }
|
|
201
|
+
|
|
202
|
+
/* ── Report modal ───────────────────────────────────── */
|
|
203
|
+
.wz-modal-overlay {
|
|
204
|
+
position: fixed; inset: 0; z-index: 50;
|
|
205
|
+
background: rgba(0,0,0,0.62); backdrop-filter: blur(4px);
|
|
206
|
+
display: grid; place-items: center; padding: 20px;
|
|
207
|
+
animation: wzFade .15s ease;
|
|
208
|
+
}
|
|
209
|
+
/* The author `display: grid` above overrides the UA `[hidden] { display:none }`
|
|
210
|
+
rule, so without this the modal is ALWAYS visible — it shows on page load and
|
|
211
|
+
Close/Cancel (which set `hidden = true`) can't dismiss it. Re-assert hidden. */
|
|
212
|
+
.wz-modal-overlay[hidden] { display: none; }
|
|
213
|
+
@keyframes wzFade { from { opacity: 0; } to { opacity: 1; } }
|
|
214
|
+
.wz-modal {
|
|
215
|
+
width: 100%; max-width: 490px;
|
|
216
|
+
background: linear-gradient(180deg, var(--bg-900), var(--bg-950));
|
|
217
|
+
border: 1px solid var(--bg-700);
|
|
218
|
+
border-radius: 18px; padding: 24px; box-shadow: 0 28px 70px rgba(0,0,0,0.55);
|
|
219
|
+
animation: wzPop .22s cubic-bezier(.2,.8,.3,1);
|
|
220
|
+
}
|
|
221
|
+
@keyframes wzPop { from { opacity: 0; transform: translateY(14px) scale(.98); } to { opacity: 1; transform: none; } }
|
|
222
|
+
.wz-modal-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px; }
|
|
223
|
+
.wz-modal-head h3 { font-size: 18px; font-weight: 700; letter-spacing: -0.01em; }
|
|
224
|
+
.wz-modal-close { background: none; border: none; color: var(--text-500); font-size: 26px; line-height: 1; cursor: pointer; padding: 0 4px; transition: color .15s ease; }
|
|
225
|
+
.wz-modal-close:hover { color: var(--text-100); }
|
|
226
|
+
.wz-modal-sub { color: var(--text-400); font-size: 13.5px; line-height: 1.55; margin-bottom: 15px; }
|
|
227
|
+
.wz-textarea { resize: vertical; min-height: 100px; line-height: 1.55; }
|
|
228
|
+
.wz-logs-note {
|
|
229
|
+
display: flex; align-items: center; gap: 8px; margin-top: 13px;
|
|
230
|
+
font-size: 12.5px; color: var(--green-light);
|
|
231
|
+
background: var(--green-bg); border: 1px solid rgba(34,197,94,0.25);
|
|
232
|
+
border-radius: 9px; padding: 10px 12px;
|
|
233
|
+
}
|
|
234
|
+
.wz-logs-note svg { width: 15px; height: 15px; flex-shrink: 0; }
|
|
235
|
+
.wz-modal-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 18px; }
|
|
236
|
+
.wz-report-status { font-size: 13px; margin-top: 12px; min-height: 18px; }
|
|
237
|
+
.wz-report-status.ok { color: var(--green-light); }
|
|
238
|
+
.wz-report-status.err { color: #fca5a5; }
|
|
239
|
+
|
|
240
|
+
@media (max-width: 760px) {
|
|
241
|
+
.wz { padding: 0 20px; }
|
|
242
|
+
.wz-cards, .wz-form { grid-template-columns: 1fr; }
|
|
243
|
+
.wz-step h1 { font-size: 30px; }
|
|
244
|
+
.wz-step h2 { font-size: 24px; }
|
|
245
|
+
.wz-pip-label { display: none; }
|
|
246
|
+
.wz-pip-line { margin: 0 7px; }
|
|
247
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Welcome to Orquesta</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
|
9
|
+
<link rel="icon" href="favicon.ico">
|
|
10
|
+
<link rel="stylesheet" href="style.css">
|
|
11
|
+
<link rel="stylesheet" href="welcome.css">
|
|
12
|
+
</head>
|
|
13
|
+
<body class="welcome-body">
|
|
14
|
+
<div class="wz">
|
|
15
|
+
<!-- Header -->
|
|
16
|
+
<header class="wz-head">
|
|
17
|
+
<div class="wz-brand">
|
|
18
|
+
<img src="logo-mark-white.png" alt="Orquesta" class="wz-logo">
|
|
19
|
+
<div class="wz-brand-text">
|
|
20
|
+
<span class="wz-brand-name">orquesta</span>
|
|
21
|
+
<span class="wz-version" id="wz-version"></span>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
<button class="wz-report-btn" id="wz-report-open" type="button" title="Something went wrong? Send us the details.">
|
|
25
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
|
|
26
|
+
Report a problem
|
|
27
|
+
</button>
|
|
28
|
+
</header>
|
|
29
|
+
|
|
30
|
+
<!-- Progress -->
|
|
31
|
+
<nav class="wz-steps" id="wz-progress" aria-label="Setup progress"></nav>
|
|
32
|
+
|
|
33
|
+
<!-- Steps -->
|
|
34
|
+
<main class="wz-main" id="wz-main">
|
|
35
|
+
|
|
36
|
+
<!-- 1. Welcome -->
|
|
37
|
+
<section class="wz-step" data-step="0">
|
|
38
|
+
<div class="wz-hero">
|
|
39
|
+
<img src="logo-mark-white.png" alt="" class="wz-hero-logo">
|
|
40
|
+
<div class="wz-hero-badge"><span class="wz-pulse"></span> Agent connected</div>
|
|
41
|
+
<h1>Welcome to Orquesta</h1>
|
|
42
|
+
<p class="wz-lead wz-lead-center" id="wz-project-line">This machine is now an Orquesta agent. Your team can send prompts from the dashboard and they run right here — on your machine, against your code.</p>
|
|
43
|
+
</div>
|
|
44
|
+
<div class="wz-cards">
|
|
45
|
+
<div class="wz-card">
|
|
46
|
+
<span class="wz-card-ico">
|
|
47
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2"/><path d="M8 21h8"/><path d="M12 17v4"/></svg>
|
|
48
|
+
</span>
|
|
49
|
+
<h3>Runs locally</h3>
|
|
50
|
+
<p>Prompts execute on this machine. Your code never leaves it — only logs and results are sent back.</p>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="wz-card">
|
|
53
|
+
<span class="wz-card-ico">
|
|
54
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>
|
|
55
|
+
</span>
|
|
56
|
+
<h3>Dashboard-driven</h3>
|
|
57
|
+
<p>Your team submits prompts from the Orquesta dashboard. The agent picks them up over a realtime channel.</p>
|
|
58
|
+
</div>
|
|
59
|
+
<div class="wz-card">
|
|
60
|
+
<span class="wz-card-ico">
|
|
61
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg>
|
|
62
|
+
</span>
|
|
63
|
+
<h3>Fully logged</h3>
|
|
64
|
+
<p>Every prompt, tool call and result is recorded, so the whole team sees what the AI did and why.</p>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
</section>
|
|
68
|
+
|
|
69
|
+
<!-- 2. Engine -->
|
|
70
|
+
<section class="wz-step" data-step="1" hidden>
|
|
71
|
+
<div class="wz-step-head"><span class="wz-step-kicker">Execution</span><h2>The engine that runs your prompts</h2></div>
|
|
72
|
+
<p class="wz-lead">This is the AI coding CLI that actually executes your prompts. Change it anytime — per machine here, or per project from the dashboard.</p>
|
|
73
|
+
<div class="wz-modes">
|
|
74
|
+
<div class="wz-mode"><span class="wz-tag wz-tag-green">auto</span><div><h4>Auto <span class="wz-rec">recommended</span></h4><p>Picks the best CLI installed on this machine (Orquesta → Claude → Kimi). Set it and forget it.</p></div></div>
|
|
75
|
+
<div class="wz-mode"><span class="wz-tag">claude</span><div><h4>Claude CLI</h4><p>Anthropic's Claude Code. Best-in-class coding model; uses your Claude subscription or API key.</p></div></div>
|
|
76
|
+
<div class="wz-mode"><span class="wz-tag">orquesta</span><div><h4>Orquesta CLI</h4><p>Multi-model engine routed through Orquesta's Batuta proxy — switch models without reconfiguring the machine.</p></div></div>
|
|
77
|
+
<div class="wz-mode"><span class="wz-tag">kimi</span><div><h4>Kimi Code CLI</h4><p>The local Kimi coding CLI, if you have it installed.</p></div></div>
|
|
78
|
+
</div>
|
|
79
|
+
</section>
|
|
80
|
+
|
|
81
|
+
<!-- 3. Permissions -->
|
|
82
|
+
<section class="wz-step" data-step="2" hidden>
|
|
83
|
+
<div class="wz-step-head"><span class="wz-step-kicker">Control</span><h2>Permissions</h2></div>
|
|
84
|
+
<p class="wz-lead">How much the agent can do on its own before a human steps in.</p>
|
|
85
|
+
<div class="wz-modes">
|
|
86
|
+
<div class="wz-mode"><span class="wz-tag wz-tag-green">auto</span><div><h4>Auto</h4><p>The agent runs commands and edits files without asking. Fast and hands-free — ideal for trusted automation.</p></div></div>
|
|
87
|
+
<div class="wz-mode"><span class="wz-tag wz-tag-yellow">supervised</span><div><h4>Supervised</h4><p>Each action waits for approval in the dashboard before it runs. Slower, but you stay in control of every step.</p></div></div>
|
|
88
|
+
</div>
|
|
89
|
+
<p class="wz-note">You can flip this live from the dashboard at any time — no restart needed.</p>
|
|
90
|
+
</section>
|
|
91
|
+
|
|
92
|
+
<!-- 4. Sandbox -->
|
|
93
|
+
<section class="wz-step" data-step="3" hidden>
|
|
94
|
+
<div class="wz-step-head"><span class="wz-step-kicker">Safety</span><h2>Filesystem isolation</h2></div>
|
|
95
|
+
<p class="wz-lead">Limits which files the agent can touch — protecting the rest of your machine from a wrong move.</p>
|
|
96
|
+
<div class="wz-modes">
|
|
97
|
+
<div class="wz-mode"><span class="wz-tag">off</span><div><h4>Off</h4><p>The agent has the same access you do. Simplest; use on machines dedicated to one project.</p></div></div>
|
|
98
|
+
<div class="wz-mode"><span class="wz-tag wz-tag-green">standard</span><div><h4>Standard</h4><p>Only the project folder is writable. The rest of the filesystem is read-only — a stray <code>rm</code> can't escape the project.</p></div></div>
|
|
99
|
+
<div class="wz-mode"><span class="wz-tag wz-tag-purple">strict</span><div><h4>Strict</h4><p>Standard, plus <em>hides</em> other projects and credentials (<code>~/.ssh</code>, <code>~/.aws</code>, cloud tokens) entirely. Best for shared machines.</p></div></div>
|
|
100
|
+
</div>
|
|
101
|
+
<p class="wz-note" id="wz-sandbox-avail">Checking sandbox support on this host…</p>
|
|
102
|
+
</section>
|
|
103
|
+
|
|
104
|
+
<!-- 5. Manager UI -->
|
|
105
|
+
<section class="wz-step" data-step="4" hidden>
|
|
106
|
+
<div class="wz-step-head"><span class="wz-step-kicker">Control panel</span><h2>Your local manager</h2></div>
|
|
107
|
+
<p class="wz-lead">This page lives at <code id="wz-ui-url">http://localhost:8080</code> — bookmark it. It's where you watch and manage every agent on this machine.</p>
|
|
108
|
+
<div class="wz-cards">
|
|
109
|
+
<div class="wz-card">
|
|
110
|
+
<span class="wz-card-ico">
|
|
111
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2"/><rect x="9" y="9" width="6" height="6"/><path d="M9 1v3M15 1v3M9 20v3M15 20v3M20 9h3M20 14h3M1 9h3M1 14h3"/></svg>
|
|
112
|
+
</span>
|
|
113
|
+
<h3>Agents</h3>
|
|
114
|
+
<p>See every agent's status, switch its engine / permissions / sandbox inline, and start or stop it.</p>
|
|
115
|
+
</div>
|
|
116
|
+
<div class="wz-card">
|
|
117
|
+
<span class="wz-card-ico">
|
|
118
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"/><line x1="12" y1="19" x2="20" y2="19"/></svg>
|
|
119
|
+
</span>
|
|
120
|
+
<h3>All Logs</h3>
|
|
121
|
+
<p>Live, streaming logs from every agent — exactly what each prompt did, as it happens.</p>
|
|
122
|
+
</div>
|
|
123
|
+
<div class="wz-card">
|
|
124
|
+
<span class="wz-card-ico">
|
|
125
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>
|
|
126
|
+
</span>
|
|
127
|
+
<h3>System</h3>
|
|
128
|
+
<p>CPU, memory and disk for this machine, so you know it has headroom to run prompts.</p>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
<p class="wz-note">Closing this page does <strong>not</strong> stop your agent — it keeps running in the background.</p>
|
|
132
|
+
</section>
|
|
133
|
+
|
|
134
|
+
<!-- 6. Configure -->
|
|
135
|
+
<section class="wz-step" data-step="5" hidden>
|
|
136
|
+
<div class="wz-step-head"><span class="wz-step-kicker">Finish</span><h2>Configure this agent</h2></div>
|
|
137
|
+
<p class="wz-lead">Set the defaults for this machine. These apply <strong>live</strong> to the running agent — no restart.</p>
|
|
138
|
+
<div class="wz-form" id="wz-form">
|
|
139
|
+
<div class="wz-field">
|
|
140
|
+
<label for="wz-engine">Engine</label>
|
|
141
|
+
<div class="wz-select-wrap">
|
|
142
|
+
<select id="wz-engine">
|
|
143
|
+
<option value="auto">Auto (best available)</option>
|
|
144
|
+
<option value="claude">Claude CLI</option>
|
|
145
|
+
<option value="orquesta">Orquesta CLI (multi-model)</option>
|
|
146
|
+
<option value="kimi">Kimi Code CLI</option>
|
|
147
|
+
</select>
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
<div class="wz-field">
|
|
151
|
+
<label for="wz-perm">Permissions</label>
|
|
152
|
+
<div class="wz-select-wrap">
|
|
153
|
+
<select id="wz-perm">
|
|
154
|
+
<option value="auto">Auto (no approval)</option>
|
|
155
|
+
<option value="supervised">Supervised (review each)</option>
|
|
156
|
+
</select>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
<div class="wz-field">
|
|
160
|
+
<label for="wz-sandbox">Sandbox</label>
|
|
161
|
+
<div class="wz-select-wrap">
|
|
162
|
+
<select id="wz-sandbox">
|
|
163
|
+
<option value="off">Off</option>
|
|
164
|
+
<option value="standard">Standard (project-only writes)</option>
|
|
165
|
+
<option value="strict">Strict (hide other projects + creds)</option>
|
|
166
|
+
</select>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
<div class="wz-apply-row">
|
|
171
|
+
<button class="wz-btn wz-btn-ghost" id="wz-apply-btn" type="button">Apply settings</button>
|
|
172
|
+
<span class="wz-apply-status" id="wz-apply-status"></span>
|
|
173
|
+
</div>
|
|
174
|
+
<p class="wz-note" id="wz-no-live" hidden>This agent was started elsewhere, so settings can't be applied from here — change them from the Orquesta dashboard or the Agents tab.</p>
|
|
175
|
+
</section>
|
|
176
|
+
</main>
|
|
177
|
+
|
|
178
|
+
<!-- Footer -->
|
|
179
|
+
<footer class="wz-foot">
|
|
180
|
+
<button class="wz-btn wz-btn-ghost" id="wz-back" type="button" hidden>Back</button>
|
|
181
|
+
<div class="wz-foot-spacer"></div>
|
|
182
|
+
<a class="wz-skip" href="/" id="wz-skip">Skip to manager</a>
|
|
183
|
+
<button class="wz-btn wz-btn-primary" id="wz-next" type="button">Next</button>
|
|
184
|
+
</footer>
|
|
185
|
+
</div>
|
|
186
|
+
|
|
187
|
+
<!-- Report a problem modal -->
|
|
188
|
+
<div class="wz-modal-overlay" id="wz-report-modal" hidden>
|
|
189
|
+
<div class="wz-modal" role="dialog" aria-modal="true" aria-labelledby="wz-report-title">
|
|
190
|
+
<div class="wz-modal-head">
|
|
191
|
+
<h3 id="wz-report-title">Report a problem</h3>
|
|
192
|
+
<button class="wz-modal-close" id="wz-report-close" type="button" aria-label="Close">×</button>
|
|
193
|
+
</div>
|
|
194
|
+
<p class="wz-modal-sub">Tell us what went wrong. Your recent terminal logs are attached automatically so we can see exactly what happened.</p>
|
|
195
|
+
<textarea id="wz-report-msg" class="wz-textarea" rows="5" placeholder="What were you trying to do, and what happened instead?"></textarea>
|
|
196
|
+
<div class="wz-logs-note">
|
|
197
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
|
|
198
|
+
Terminal logs from this agent will be included with your report.
|
|
199
|
+
</div>
|
|
200
|
+
<div class="wz-modal-actions">
|
|
201
|
+
<button class="wz-btn wz-btn-ghost" id="wz-report-cancel" type="button">Cancel</button>
|
|
202
|
+
<button class="wz-btn wz-btn-primary" id="wz-report-send" type="button">Send report</button>
|
|
203
|
+
</div>
|
|
204
|
+
<p class="wz-report-status" id="wz-report-status"></p>
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
|
|
208
|
+
<script src="welcome.js"></script>
|
|
209
|
+
</body>
|
|
210
|
+
</html>
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// First-run welcome wizard. Vanilla JS, no build step. Talks to the embedded
|
|
2
|
+
// agent server (/api/onboarding/*) to read current config, apply live changes,
|
|
3
|
+
// and submit problem reports (message + terminal logs).
|
|
4
|
+
|
|
5
|
+
const STEP_LABELS = ['Welcome', 'Engine', 'Permissions', 'Sandbox', 'Manager', 'Setup']
|
|
6
|
+
const TOTAL_STEPS = STEP_LABELS.length
|
|
7
|
+
let step = 0
|
|
8
|
+
let hasLiveAgent = false
|
|
9
|
+
|
|
10
|
+
const $ = (id) => document.getElementById(id)
|
|
11
|
+
const steps = Array.from(document.querySelectorAll('.wz-step'))
|
|
12
|
+
|
|
13
|
+
// Build the numbered, labelled progress bar
|
|
14
|
+
const progress = $('wz-progress')
|
|
15
|
+
const pips = []
|
|
16
|
+
STEP_LABELS.forEach((label, i) => {
|
|
17
|
+
if (i > 0) {
|
|
18
|
+
const line = document.createElement('span')
|
|
19
|
+
line.className = 'wz-pip-line'
|
|
20
|
+
progress.appendChild(line)
|
|
21
|
+
}
|
|
22
|
+
const pip = document.createElement('div')
|
|
23
|
+
pip.className = 'wz-pip'
|
|
24
|
+
pip.innerHTML = `<span class="wz-pip-num">${i + 1}</span><span class="wz-pip-label">${label}</span>`
|
|
25
|
+
pip.addEventListener('click', () => { if (i <= furthest) { step = i; render() } })
|
|
26
|
+
progress.appendChild(pip)
|
|
27
|
+
pips.push(pip)
|
|
28
|
+
})
|
|
29
|
+
let furthest = 0
|
|
30
|
+
|
|
31
|
+
function render() {
|
|
32
|
+
furthest = Math.max(furthest, step)
|
|
33
|
+
steps.forEach((s) => { s.hidden = Number(s.dataset.step) !== step })
|
|
34
|
+
pips.forEach((p, i) => {
|
|
35
|
+
p.classList.toggle('active', i === step)
|
|
36
|
+
p.classList.toggle('done', i < step)
|
|
37
|
+
p.style.cursor = i <= furthest ? 'pointer' : 'default'
|
|
38
|
+
})
|
|
39
|
+
$('wz-back').hidden = step === 0
|
|
40
|
+
const isLast = step === TOTAL_STEPS - 1
|
|
41
|
+
$('wz-next').textContent = isLast ? 'Finish' : 'Next'
|
|
42
|
+
$('wz-skip').hidden = isLast
|
|
43
|
+
window.scrollTo({ top: 0, behavior: 'smooth' })
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
$('wz-next').addEventListener('click', () => {
|
|
47
|
+
if (step < TOTAL_STEPS - 1) { step++; render() }
|
|
48
|
+
else finish()
|
|
49
|
+
})
|
|
50
|
+
$('wz-back').addEventListener('click', () => { if (step > 0) { step--; render() } })
|
|
51
|
+
|
|
52
|
+
// Keyboard nav (ignored while typing in a field or the modal is open)
|
|
53
|
+
document.addEventListener('keydown', (e) => {
|
|
54
|
+
if (!$('wz-report-modal').hidden) { if (e.key === 'Escape') closeReport(); return }
|
|
55
|
+
if (e.target.tagName === 'SELECT' || e.target.tagName === 'TEXTAREA') return
|
|
56
|
+
if (e.key === 'ArrowRight' || e.key === 'Enter') $('wz-next').click()
|
|
57
|
+
else if (e.key === 'ArrowLeft') $('wz-back').click()
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
async function finish() {
|
|
61
|
+
if (hasLiveAgent) await applySettings(true)
|
|
62
|
+
try { await fetch('/api/onboarding/complete', { method: 'POST' }) } catch {}
|
|
63
|
+
window.location.href = '/'
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function applySettings(silent) {
|
|
67
|
+
const status = $('wz-apply-status')
|
|
68
|
+
const body = {
|
|
69
|
+
cliPreference: $('wz-engine').value,
|
|
70
|
+
permissionMode: $('wz-perm').value,
|
|
71
|
+
sandboxMode: $('wz-sandbox').value,
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const r = await fetch('/api/onboarding/apply', {
|
|
75
|
+
method: 'POST',
|
|
76
|
+
headers: { 'Content-Type': 'application/json' },
|
|
77
|
+
body: JSON.stringify(body),
|
|
78
|
+
})
|
|
79
|
+
const data = await r.json().catch(() => ({}))
|
|
80
|
+
if (!r.ok) throw new Error(data.error || `HTTP ${r.status}`)
|
|
81
|
+
if (!silent) { status.textContent = '✓ Applied to the running agent'; status.className = 'wz-apply-status ok' }
|
|
82
|
+
} catch (err) {
|
|
83
|
+
if (!silent) { status.textContent = err.message || 'Failed to apply'; status.className = 'wz-apply-status err' }
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
$('wz-apply-btn').addEventListener('click', () => applySettings(false))
|
|
88
|
+
|
|
89
|
+
// ── Report a problem ─────────────────────────────────
|
|
90
|
+
function openReport() {
|
|
91
|
+
$('wz-report-status').textContent = ''
|
|
92
|
+
$('wz-report-status').className = 'wz-report-status'
|
|
93
|
+
$('wz-report-modal').hidden = false
|
|
94
|
+
setTimeout(() => $('wz-report-msg').focus(), 50)
|
|
95
|
+
}
|
|
96
|
+
function closeReport() { $('wz-report-modal').hidden = true }
|
|
97
|
+
|
|
98
|
+
$('wz-report-open').addEventListener('click', openReport)
|
|
99
|
+
$('wz-report-close').addEventListener('click', closeReport)
|
|
100
|
+
$('wz-report-cancel').addEventListener('click', closeReport)
|
|
101
|
+
$('wz-report-modal').addEventListener('click', (e) => { if (e.target.id === 'wz-report-modal') closeReport() })
|
|
102
|
+
|
|
103
|
+
$('wz-report-send').addEventListener('click', async () => {
|
|
104
|
+
const status = $('wz-report-status')
|
|
105
|
+
const message = $('wz-report-msg').value.trim()
|
|
106
|
+
if (!message) {
|
|
107
|
+
status.textContent = 'Please describe the problem first.'
|
|
108
|
+
status.className = 'wz-report-status err'
|
|
109
|
+
return
|
|
110
|
+
}
|
|
111
|
+
const btn = $('wz-report-send')
|
|
112
|
+
btn.disabled = true; btn.textContent = 'Sending…'
|
|
113
|
+
status.textContent = ''; status.className = 'wz-report-status'
|
|
114
|
+
// Client-side timeout so the button can never get stuck on "Sending…" even if
|
|
115
|
+
// the agent or the network stalls — it always resolves to success or a clear error.
|
|
116
|
+
const ac = new AbortController()
|
|
117
|
+
const timer = setTimeout(() => ac.abort(), 15000)
|
|
118
|
+
try {
|
|
119
|
+
const r = await fetch('/api/onboarding/report', {
|
|
120
|
+
method: 'POST',
|
|
121
|
+
headers: { 'Content-Type': 'application/json' },
|
|
122
|
+
body: JSON.stringify({ message }),
|
|
123
|
+
signal: ac.signal,
|
|
124
|
+
})
|
|
125
|
+
const data = await r.json().catch(() => ({}))
|
|
126
|
+
if (!r.ok) throw new Error(data.error || `HTTP ${r.status}`)
|
|
127
|
+
status.textContent = '✓ Report sent with your terminal logs. Thank you!'
|
|
128
|
+
status.className = 'wz-report-status ok'
|
|
129
|
+
$('wz-report-msg').value = ''
|
|
130
|
+
setTimeout(closeReport, 1800)
|
|
131
|
+
} catch (err) {
|
|
132
|
+
status.textContent = err.name === 'AbortError'
|
|
133
|
+
? 'Timed out reaching the agent. Check the connection and try again.'
|
|
134
|
+
: (err.message || 'Could not send the report.')
|
|
135
|
+
status.className = 'wz-report-status err'
|
|
136
|
+
} finally {
|
|
137
|
+
clearTimeout(timer)
|
|
138
|
+
btn.disabled = false; btn.textContent = 'Send report'
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
// ── Load current state ───────────────────────────────
|
|
143
|
+
async function loadState() {
|
|
144
|
+
try {
|
|
145
|
+
const r = await fetch('/api/onboarding/state')
|
|
146
|
+
const s = await r.json()
|
|
147
|
+
if (s.version) $('wz-version').textContent = 'v' + s.version
|
|
148
|
+
hasLiveAgent = !!s.hasLiveAgent
|
|
149
|
+
|
|
150
|
+
const avail = $('wz-sandbox-avail')
|
|
151
|
+
if (s.sandbox && s.sandbox.available) {
|
|
152
|
+
avail.textContent = `Sandbox is supported on this host (bubblewrap ${s.sandbox.version || 'available'}).`
|
|
153
|
+
} else {
|
|
154
|
+
avail.innerHTML = 'Standard/Strict need <code>bubblewrap</code>, which isn\'t installed here yet — the agent runs unsandboxed until it is. (Linux only.)'
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (s.config) {
|
|
158
|
+
if (s.config.cliPreference) $('wz-engine').value = s.config.cliPreference
|
|
159
|
+
if (s.config.permissionMode) $('wz-perm').value = s.config.permissionMode
|
|
160
|
+
$('wz-sandbox').value = s.config.sandbox ? (s.config.sandboxMode || 'standard') : 'off'
|
|
161
|
+
if (s.config.projectName) {
|
|
162
|
+
$('wz-project-line').innerHTML =
|
|
163
|
+
`This machine is now an Orquesta agent for <strong>${escapeHtml(s.config.projectName)}</strong>. Your team can send prompts from the dashboard and they run right here — on your machine, against your code.`
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (!hasLiveAgent) {
|
|
167
|
+
$('wz-no-live').hidden = false
|
|
168
|
+
$('wz-apply-btn').disabled = true
|
|
169
|
+
}
|
|
170
|
+
} catch {
|
|
171
|
+
$('wz-no-live').hidden = false
|
|
172
|
+
$('wz-apply-btn').disabled = true
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function escapeHtml(str) {
|
|
177
|
+
return String(str).replace(/[&<>"']/g, (c) => (
|
|
178
|
+
{ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]
|
|
179
|
+
))
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
loadState()
|
|
183
|
+
render()
|