@lazyingart/agintiflow 0.20.1 → 0.20.2

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/index.html CHANGED
@@ -106,8 +106,9 @@
106
106
 
107
107
  <label>
108
108
  <span data-i18n="modelLabel">Model</span>
109
- <input id="model" name="model" type="text" list="model-options" value="deepseek-v4-flash" />
110
- <datalist id="model-options"></datalist>
109
+ <select id="model" name="model">
110
+ <option value="deepseek-v4-flash">DeepSeek v4 flash</option>
111
+ </select>
111
112
  </label>
112
113
  </div>
113
114
 
@@ -122,70 +123,6 @@
122
123
  <div id="model-catalog" class="model-catalog"></div>
123
124
  </section>
124
125
 
125
- <section class="model-role-editor" aria-label="Model role settings">
126
- <div class="model-role-editor-head">
127
- <strong>Model roles</strong>
128
- <span>Route, main, spare, wrapper, auxiliary</span>
129
- </div>
130
- <div class="role-editor-grid">
131
- <label>
132
- <span>Route</span>
133
- <select id="routeProvider" name="routeProvider">
134
- <option value="deepseek">DeepSeek</option>
135
- <option value="openai">OpenAI</option>
136
- <option value="qwen">Qwen</option>
137
- <option value="venice">Venice</option>
138
- <option value="mock">Mock</option>
139
- </select>
140
- <input id="routeModel" name="routeModel" type="text" placeholder="deepseek-v4-flash" />
141
- </label>
142
- <label>
143
- <span>Main</span>
144
- <select id="mainProvider" name="mainProvider">
145
- <option value="deepseek">DeepSeek</option>
146
- <option value="openai">OpenAI</option>
147
- <option value="qwen">Qwen</option>
148
- <option value="venice">Venice</option>
149
- </select>
150
- <input id="mainModel" name="mainModel" type="text" placeholder="deepseek-v4-pro" />
151
- </label>
152
- <label>
153
- <span>Spare</span>
154
- <select id="spareProvider" name="spareProvider">
155
- <option value="openai">OpenAI</option>
156
- <option value="deepseek">DeepSeek</option>
157
- <option value="qwen">Qwen</option>
158
- <option value="venice">Venice</option>
159
- </select>
160
- <input id="spareModel" name="spareModel" type="text" placeholder="gpt-5.4" />
161
- <select id="spareReasoning" name="spareReasoning">
162
- <option value="low">low</option>
163
- <option value="medium">medium</option>
164
- <option value="high">high</option>
165
- <option value="xhigh">xhigh</option>
166
- </select>
167
- </label>
168
- <label>
169
- <span>Wrapper</span>
170
- <input id="wrapperModel" name="wrapperModel" type="text" placeholder="gpt-5.5" />
171
- <select id="wrapperReasoning" name="wrapperReasoning">
172
- <option value="low">low</option>
173
- <option value="medium">medium</option>
174
- <option value="high">high</option>
175
- <option value="xhigh">xhigh</option>
176
- </select>
177
- </label>
178
- <label>
179
- <span>Auxiliary</span>
180
- <select id="auxiliaryProvider" name="auxiliaryProvider">
181
- <option value="grsai">GRS AI</option>
182
- <option value="venice">Venice image</option>
183
- </select>
184
- <input id="auxiliaryModel" name="auxiliaryModel" type="text" placeholder="nano-banana-2" />
185
- </label>
186
- </div>
187
- </section>
188
-
189
126
  <label>
190
127
  <span data-i18n="taskProfileLabel">Task profile</span>
191
128
  <select id="taskProfile" name="taskProfile">
@@ -204,16 +141,6 @@
204
141
  ></textarea>
205
142
  </label>
206
143
 
207
- <label>
208
- <span data-i18n="startUrlLabel">Start URL</span>
209
- <input id="startUrl" name="startUrl" type="url" data-i18n-placeholder="startUrlPlaceholder" placeholder="https://news.ycombinator.com" />
210
- </label>
211
-
212
- <label>
213
- <span data-i18n="allowedDomainsLabel">Allowed domains</span>
214
- <input id="allowedDomains" name="allowedDomains" type="text" data-i18n-placeholder="allowedDomainsPlaceholder" placeholder="news.ycombinator.com,github.com" />
215
- </label>
216
-
217
144
  <div class="grid">
218
145
  <label>
219
146
  <span data-i18n="commandCwdLabel">Working directory</span>
@@ -246,11 +173,6 @@
246
173
  </div>
247
174
 
248
175
  <div class="checks">
249
- <label class="switch-label">
250
- <input id="headless" name="headless" type="checkbox" checked />
251
- <span class="switch" aria-hidden="true"></span>
252
- <span data-i18n="headlessLabel">Headless browser</span>
253
- </label>
254
176
  <label class="switch-label">
255
177
  <input id="allowShellTool" name="allowShellTool" type="checkbox" checked />
256
178
  <span class="switch" aria-hidden="true"></span>
@@ -261,103 +183,19 @@
261
183
  <span class="switch" aria-hidden="true"></span>
262
184
  <span data-i18n="fileToolLabel">Enable file tools</span>
263
185
  </label>
264
- <label class="switch-label">
265
- <input id="allowAuxiliaryTools" name="allowAuxiliaryTools" type="checkbox" checked />
266
- <span class="switch" aria-hidden="true"></span>
267
- <span data-i18n="auxiliaryToolLabel">Enable auxiliary skills</span>
268
- </label>
269
186
  <label class="switch-label">
270
187
  <input id="allowWebSearch" name="allowWebSearch" type="checkbox" checked />
271
188
  <span class="switch" aria-hidden="true"></span>
272
189
  <span data-i18n="webSearchLabel">Enable web search</span>
273
190
  </label>
274
- <label class="switch-label">
275
- <input id="allowParallelScouts" name="allowParallelScouts" type="checkbox" checked />
276
- <span class="switch" aria-hidden="true"></span>
277
- <span data-i18n="parallelScoutsLabel">Parallel DeepSeek scouts</span>
278
- </label>
279
- <label class="switch-label">
280
- <input id="allowPasswords" name="allowPasswords" type="checkbox" />
281
- <span class="switch" aria-hidden="true"></span>
282
- <span data-i18n="allowPasswordsLabel">Allow password typing</span>
283
- </label>
284
- <label class="switch-label">
285
- <input id="allowDestructive" name="allowDestructive" type="checkbox" />
286
- <span class="switch" aria-hidden="true"></span>
287
- <span data-i18n="allowDestructiveLabel">Allow destructive actions</span>
288
- </label>
289
- </div>
290
-
291
- <label>
292
- <span data-i18n="parallelScoutCountLabel">Scout count</span>
293
- <input id="parallelScoutCount" name="parallelScoutCount" type="number" min="1" max="10" value="3" />
294
- </label>
295
-
296
- <div class="grid wrapper-controls">
297
- <label class="switch-label switch-card">
298
- <input id="allowWrapperTools" name="allowWrapperTools" type="checkbox" />
299
- <span class="switch" aria-hidden="true"></span>
300
- <span data-i18n="wrapperToolLabel">Enable agent wrappers</span>
301
- </label>
302
- <label>
303
- <span data-i18n="preferredWrapperLabel">Preferred wrapper</span>
304
- <select id="preferredWrapper" name="preferredWrapper">
305
- <option value="codex">Codex</option>
306
- <option value="claude">Claude Code</option>
307
- <option value="gemini">Gemini CLI</option>
308
- <option value="copilot">GitHub Copilot CLI</option>
309
- <option value="qwen">Qwen Code</option>
310
- </select>
311
- </label>
312
191
  </div>
313
192
 
314
- <label>
315
- <span data-i18n="dockerImageLabel">Docker image</span>
316
- <input
317
- id="dockerSandboxImage"
318
- name="dockerSandboxImage"
319
- type="text"
320
- value="agintiflow-sandbox:latest"
321
- data-i18n-placeholder="dockerImagePlaceholder"
322
- placeholder="agintiflow-sandbox:latest"
323
- />
324
- </label>
193
+ <button id="open-settings" type="button" class="secondary settings-button">Advanced settings</button>
325
194
 
326
195
  <div class="actions">
327
196
  <button type="submit" data-i18n="startRunButton">Start run</button>
328
197
  <span id="key-status" class="subtle"></span>
329
198
  </div>
330
-
331
- <section class="capability-card">
332
- <div>
333
- <h2 data-i18n="wrapperCapabilityTitle">Agent wrappers</h2>
334
- <p id="wrapper-status" class="subtle wrapper-status"></p>
335
- </div>
336
- <div id="wrapper-grid" class="capability-grid"></div>
337
- </section>
338
-
339
- <section class="capability-card workspace-card">
340
- <div>
341
- <h2 data-i18n="workspaceCapabilityTitle">Workspace files</h2>
342
- <p id="workspace-status" class="subtle wrapper-status"></p>
343
- </div>
344
- <div id="workspace-tools" class="capability-grid"></div>
345
- <div id="workspace-changes" class="workspace-changes"></div>
346
- </section>
347
-
348
- <section class="sandbox-card">
349
- <div class="header-row">
350
- <div>
351
- <h2 data-i18n="sandboxStatusTitle">Sandbox status</h2>
352
- <p id="sandbox-status" class="subtle route-hint" data-i18n="sandboxStatusEmpty">Not checked yet.</p>
353
- </div>
354
- <div class="sandbox-actions">
355
- <button id="check-sandbox" type="button" class="secondary" data-i18n="checkSandboxButton">Check</button>
356
- <button id="preflight-sandbox" type="button" class="secondary" data-i18n="preflightSandboxButton">Preflight</button>
357
- </div>
358
- </div>
359
- <pre id="sandbox-logs" class="sandbox-logs" data-i18n="sandboxLogsEmpty">No sandbox logs yet.</pre>
360
- </section>
361
199
  </form>
362
200
  </section>
363
201
 
@@ -425,9 +263,213 @@
425
263
  </div>
426
264
  <div id="logs" class="logs" data-i18n="noRunStarted">No run started.</div>
427
265
  </section>
266
+
267
+ <section class="capability-card">
268
+ <div>
269
+ <h2 data-i18n="wrapperCapabilityTitle">Agent wrappers</h2>
270
+ <p id="wrapper-status" class="subtle wrapper-status"></p>
271
+ </div>
272
+ <div id="wrapper-grid" class="capability-grid"></div>
273
+ </section>
274
+
275
+ <section class="capability-card workspace-card">
276
+ <div>
277
+ <h2 data-i18n="workspaceCapabilityTitle">Workspace files</h2>
278
+ <p id="workspace-status" class="subtle wrapper-status"></p>
279
+ </div>
280
+ <div id="workspace-tools" class="capability-grid"></div>
281
+ <div id="workspace-changes" class="workspace-changes"></div>
282
+ </section>
283
+
284
+ <section class="sandbox-card">
285
+ <div class="header-row">
286
+ <div>
287
+ <h2 data-i18n="sandboxStatusTitle">Sandbox status</h2>
288
+ <p id="sandbox-status" class="subtle route-hint" data-i18n="sandboxStatusEmpty">Not checked yet.</p>
289
+ </div>
290
+ <div class="sandbox-actions">
291
+ <button id="check-sandbox" type="button" class="secondary" data-i18n="checkSandboxButton">Check</button>
292
+ <button id="preflight-sandbox" type="button" class="secondary" data-i18n="preflightSandboxButton">Preflight</button>
293
+ </div>
294
+ </div>
295
+ <pre id="sandbox-logs" class="sandbox-logs" data-i18n="sandboxLogsEmpty">No sandbox logs yet.</pre>
296
+ </section>
428
297
  </section>
429
298
  </main>
430
299
 
300
+ <dialog id="settings-modal" class="modal settings-modal">
301
+ <section class="modal-card settings-modal-card" aria-labelledby="settings-modal-title">
302
+ <div class="modal-header">
303
+ <div>
304
+ <h2 id="settings-modal-title">Advanced settings</h2>
305
+ <p class="subtle">Model roles, browser targets, wrappers, scouts, and safety toggles.</p>
306
+ </div>
307
+ <button id="close-settings" class="icon-button" type="button" data-i18n-aria-label="cancelButton" aria-label="Cancel">x</button>
308
+ </div>
309
+
310
+ <section class="settings-section model-role-editor" aria-label="Model role settings">
311
+ <div class="model-role-editor-head">
312
+ <strong>Model roles</strong>
313
+ <span>Route, main, spare, wrapper, auxiliary</span>
314
+ </div>
315
+ <div class="role-editor-grid">
316
+ <label>
317
+ <span>Route</span>
318
+ <select id="routeProvider" name="routeProvider">
319
+ <option value="deepseek">DeepSeek</option>
320
+ <option value="openai">OpenAI</option>
321
+ <option value="qwen">Qwen</option>
322
+ <option value="venice">Venice</option>
323
+ <option value="mock">Mock</option>
324
+ </select>
325
+ <select id="routeModel" name="routeModel">
326
+ <option value="deepseek-v4-flash">DeepSeek v4 flash</option>
327
+ </select>
328
+ </label>
329
+ <label>
330
+ <span>Main</span>
331
+ <select id="mainProvider" name="mainProvider">
332
+ <option value="deepseek">DeepSeek</option>
333
+ <option value="openai">OpenAI</option>
334
+ <option value="qwen">Qwen</option>
335
+ <option value="venice">Venice</option>
336
+ </select>
337
+ <select id="mainModel" name="mainModel">
338
+ <option value="deepseek-v4-pro">DeepSeek v4 pro</option>
339
+ </select>
340
+ </label>
341
+ <label>
342
+ <span>Spare</span>
343
+ <select id="spareProvider" name="spareProvider">
344
+ <option value="openai">OpenAI</option>
345
+ <option value="deepseek">DeepSeek</option>
346
+ <option value="qwen">Qwen</option>
347
+ <option value="venice">Venice</option>
348
+ </select>
349
+ <select id="spareModel" name="spareModel">
350
+ <option value="gpt-5.4">GPT-5.4</option>
351
+ </select>
352
+ <select id="spareReasoning" name="spareReasoning">
353
+ <option value="low">low</option>
354
+ <option value="medium">medium</option>
355
+ <option value="high">high</option>
356
+ <option value="xhigh">xhigh</option>
357
+ </select>
358
+ </label>
359
+ <label>
360
+ <span>Wrapper</span>
361
+ <select id="wrapperModel" name="wrapperModel">
362
+ <option value="gpt-5.5">GPT-5.5</option>
363
+ </select>
364
+ <select id="wrapperReasoning" name="wrapperReasoning">
365
+ <option value="low">low</option>
366
+ <option value="medium">medium</option>
367
+ <option value="high">high</option>
368
+ <option value="xhigh">xhigh</option>
369
+ </select>
370
+ </label>
371
+ <label>
372
+ <span>Auxiliary</span>
373
+ <select id="auxiliaryProvider" name="auxiliaryProvider">
374
+ <option value="grsai">GRS AI</option>
375
+ <option value="venice">Venice image</option>
376
+ </select>
377
+ <select id="auxiliaryModel" name="auxiliaryModel">
378
+ <option value="nano-banana-2">Nano Banana 2</option>
379
+ </select>
380
+ </label>
381
+ </div>
382
+ </section>
383
+
384
+ <section class="settings-section">
385
+ <div class="settings-section-head">
386
+ <strong>Browser and target</strong>
387
+ <span class="subtle">Optional browser start point and allowed domains.</span>
388
+ </div>
389
+ <div class="settings-grid">
390
+ <label>
391
+ <span data-i18n="startUrlLabel">Start URL</span>
392
+ <input id="startUrl" name="startUrl" type="url" data-i18n-placeholder="startUrlPlaceholder" placeholder="https://news.ycombinator.com" />
393
+ </label>
394
+ <label>
395
+ <span data-i18n="allowedDomainsLabel">Allowed domains</span>
396
+ <input id="allowedDomains" name="allowedDomains" type="text" data-i18n-placeholder="allowedDomainsPlaceholder" placeholder="news.ycombinator.com,github.com" />
397
+ </label>
398
+ </div>
399
+ </section>
400
+
401
+ <section class="settings-section">
402
+ <div class="settings-section-head">
403
+ <strong>Tools and wrappers</strong>
404
+ <span class="subtle">Less-used capabilities stay here to keep the daily panel focused.</span>
405
+ </div>
406
+ <div class="checks settings-checks">
407
+ <label class="switch-label">
408
+ <input id="headless" name="headless" type="checkbox" checked />
409
+ <span class="switch" aria-hidden="true"></span>
410
+ <span data-i18n="headlessLabel">Headless browser</span>
411
+ </label>
412
+ <label class="switch-label">
413
+ <input id="allowAuxiliaryTools" name="allowAuxiliaryTools" type="checkbox" checked />
414
+ <span class="switch" aria-hidden="true"></span>
415
+ <span data-i18n="auxiliaryToolLabel">Enable auxiliary skills</span>
416
+ </label>
417
+ <label class="switch-label">
418
+ <input id="allowParallelScouts" name="allowParallelScouts" type="checkbox" checked />
419
+ <span class="switch" aria-hidden="true"></span>
420
+ <span data-i18n="parallelScoutsLabel">Parallel DeepSeek scouts</span>
421
+ </label>
422
+ <label class="switch-label">
423
+ <input id="allowPasswords" name="allowPasswords" type="checkbox" />
424
+ <span class="switch" aria-hidden="true"></span>
425
+ <span data-i18n="allowPasswordsLabel">Allow password typing</span>
426
+ </label>
427
+ <label class="switch-label">
428
+ <input id="allowDestructive" name="allowDestructive" type="checkbox" />
429
+ <span class="switch" aria-hidden="true"></span>
430
+ <span data-i18n="allowDestructiveLabel">Allow destructive actions</span>
431
+ </label>
432
+ <label class="switch-label switch-card">
433
+ <input id="allowWrapperTools" name="allowWrapperTools" type="checkbox" />
434
+ <span class="switch" aria-hidden="true"></span>
435
+ <span data-i18n="wrapperToolLabel">Enable agent wrappers</span>
436
+ </label>
437
+ </div>
438
+ <div class="settings-grid">
439
+ <label>
440
+ <span data-i18n="parallelScoutCountLabel">Scout count</span>
441
+ <input id="parallelScoutCount" name="parallelScoutCount" type="number" min="1" max="10" value="3" />
442
+ </label>
443
+ <label>
444
+ <span data-i18n="preferredWrapperLabel">Preferred wrapper</span>
445
+ <select id="preferredWrapper" name="preferredWrapper">
446
+ <option value="codex">Codex</option>
447
+ <option value="claude">Claude Code</option>
448
+ <option value="gemini">Gemini CLI</option>
449
+ <option value="copilot">GitHub Copilot CLI</option>
450
+ <option value="qwen">Qwen Code</option>
451
+ </select>
452
+ </label>
453
+ <label class="settings-wide">
454
+ <span data-i18n="dockerImageLabel">Docker image</span>
455
+ <input
456
+ id="dockerSandboxImage"
457
+ name="dockerSandboxImage"
458
+ type="text"
459
+ value="agintiflow-sandbox:latest"
460
+ data-i18n-placeholder="dockerImagePlaceholder"
461
+ placeholder="agintiflow-sandbox:latest"
462
+ />
463
+ </label>
464
+ </div>
465
+ </section>
466
+
467
+ <div class="modal-actions">
468
+ <button id="done-settings" type="button">Done</button>
469
+ </div>
470
+ </section>
471
+ </dialog>
472
+
431
473
  <dialog id="session-manager" class="modal">
432
474
  <section class="modal-card" aria-labelledby="session-manager-title">
433
475
  <div class="modal-header">
package/public/styles.css CHANGED
@@ -44,6 +44,7 @@ body {
44
44
  .stack {
45
45
  display: grid;
46
46
  min-width: 0;
47
+ grid-auto-rows: min-content;
47
48
  align-content: start;
48
49
  gap: 14px;
49
50
  }
@@ -57,6 +58,13 @@ body {
57
58
  box-shadow: 0 18px 50px rgba(62, 49, 26, 0.08);
58
59
  }
59
60
 
61
+ .form-panel,
62
+ .chat-panel,
63
+ .output-panel {
64
+ min-width: 0;
65
+ align-self: start;
66
+ }
67
+
60
68
  h1,
61
69
  h2 {
62
70
  margin-top: 0;
@@ -441,6 +449,11 @@ textarea {
441
449
  min-height: 100%;
442
450
  }
443
451
 
452
+ .settings-button {
453
+ width: 100%;
454
+ justify-self: stretch;
455
+ }
456
+
444
457
  button {
445
458
  border: 0;
446
459
  border-radius: 999px;
@@ -516,6 +529,13 @@ button.danger {
516
529
  justify-content: flex-end;
517
530
  }
518
531
 
532
+ #run-meta {
533
+ min-width: 0;
534
+ max-width: 100%;
535
+ overflow-wrap: anywhere;
536
+ text-align: right;
537
+ }
538
+
519
539
  .sandbox-card {
520
540
  display: grid;
521
541
  gap: 12px;
@@ -689,6 +709,8 @@ button.danger {
689
709
  }
690
710
 
691
711
  .logs {
712
+ width: 100%;
713
+ min-width: 0;
692
714
  min-height: 300px;
693
715
  max-height: 42vh;
694
716
  overflow: auto;
@@ -705,6 +727,12 @@ button.danger {
705
727
  overflow-wrap: anywhere;
706
728
  }
707
729
 
730
+ .output-panel {
731
+ display: grid;
732
+ gap: 12px;
733
+ overflow: hidden;
734
+ }
735
+
708
736
  .log-line {
709
737
  margin: 0 0 10px;
710
738
  }
@@ -1160,6 +1188,56 @@ button.danger {
1160
1188
  margin: 0;
1161
1189
  }
1162
1190
 
1191
+ .settings-modal {
1192
+ width: min(980px, calc(100% - 28px));
1193
+ }
1194
+
1195
+ .settings-modal-card {
1196
+ max-height: min(860px, calc(100vh - 28px));
1197
+ overflow: auto;
1198
+ }
1199
+
1200
+ .settings-section {
1201
+ display: grid;
1202
+ gap: 12px;
1203
+ padding: 14px;
1204
+ border: 1px solid rgba(15, 118, 110, 0.16);
1205
+ border-radius: 18px;
1206
+ background: rgba(255, 253, 250, 0.72);
1207
+ }
1208
+
1209
+ .settings-section.model-role-editor {
1210
+ margin-top: 0;
1211
+ }
1212
+
1213
+ .settings-section-head {
1214
+ display: flex;
1215
+ flex-wrap: wrap;
1216
+ gap: 8px 14px;
1217
+ align-items: baseline;
1218
+ justify-content: space-between;
1219
+ }
1220
+
1221
+ .settings-section-head strong {
1222
+ color: #0f766e;
1223
+ text-transform: uppercase;
1224
+ letter-spacing: 0.08em;
1225
+ }
1226
+
1227
+ .settings-grid {
1228
+ display: grid;
1229
+ gap: 12px;
1230
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1231
+ }
1232
+
1233
+ .settings-wide {
1234
+ grid-column: 1 / -1;
1235
+ }
1236
+
1237
+ .settings-checks {
1238
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1239
+ }
1240
+
1163
1241
  .artifact-modal {
1164
1242
  width: min(1120px, calc(100% - 28px));
1165
1243
  max-width: 100%;
@@ -1478,6 +1556,11 @@ button.danger {
1478
1556
  .artifact-modal-card {
1479
1557
  overflow: auto;
1480
1558
  }
1559
+
1560
+ .settings-grid,
1561
+ .settings-checks {
1562
+ grid-template-columns: 1fr;
1563
+ }
1481
1564
  }
1482
1565
 
1483
1566
  @media (max-width: 720px) {
@@ -42,15 +42,20 @@ Interactive equivalents:
42
42
 
43
43
  ```text
44
44
  /models
45
+ /provider
45
46
  /venice
47
+ /venice off
46
48
  /route deepseek/deepseek-v4-flash
47
49
  /model deepseek/deepseek-v4-pro
50
+ /spare
48
51
  /spare openai/gpt-5.4 medium
49
52
  /wrapper codex gpt-5.5 medium
50
53
  /auxiliary model grsai/nano-banana-2
51
54
  ```
52
55
 
53
- `/venice` keeps smart routing enabled and points both route and main roles at `venice/venice-uncensored-1-2`.
56
+ `/venice` is a toggle: it keeps smart routing enabled and points both route and main roles at `venice/venice-uncensored-1-2`; running it again or using `/venice off` restores `deepseek/deepseek-v4-flash` for route and `deepseek/deepseek-v4-pro` for main.
57
+
58
+ The web UI should expose model names as dropdowns, not free-text fields. The left panel should stay focused on common daily controls, while model-role editing and less-used switches live in an Advanced settings modal. The terminal-like capability panels belong after the runtime log so the left control panel remains short.
54
59
 
55
60
  ## OpenAI Model Reference
56
61
 
@@ -202,6 +202,16 @@ try {
202
202
  if (abbreviatedSkillsResult.stdout.includes("Unknown command") || !abbreviatedSkillsResult.stdout.includes("website-app")) {
203
203
  throw new Error("interactive slash command prefix did not auto-select the first matching command");
204
204
  }
205
+ const abbreviatedVeniceResult = await runChat("/ve\n");
206
+ const veniceOffResult = await runChat("/venice off\n");
207
+ if (
208
+ !abbreviatedVeniceResult.stdout.includes("venice=on") ||
209
+ !abbreviatedVeniceResult.stdout.includes("route=venice/venice-uncensored-1-2") ||
210
+ !veniceOffResult.stdout.includes("venice=off") ||
211
+ !veniceOffResult.stdout.includes("route=deepseek/deepseek-v4-flash")
212
+ ) {
213
+ throw new Error("interactive /ve prefix did not toggle Venice roles and restore DeepSeek defaults");
214
+ }
205
215
  await runChat("remember that this project prefers pytest smoke tests in AGINTI.md\n/exit\n");
206
216
  const updatedInstructions = await fs.readFile(path.join(tempRoot, "AGINTI.md"), "utf8");
207
217
  if (!updatedInstructions.includes("pytest smoke tests")) {
@@ -113,9 +113,13 @@ assert(AUXILIARY_MODEL_CATALOG["venice-image"].some((item) => item.id === "gpt-i
113
113
  const output = await runCli(["models"]);
114
114
  assert(output.includes("/route") && output.includes("/spare") && output.includes("venice-gpt"), "aginti models output missing role details");
115
115
 
116
- const interactiveOutput = await runInteractive("/venice\n/status\n/exit\n");
116
+ const interactiveOutput = await runInteractive("/venice\n");
117
+ assert(interactiveOutput.includes("venice=on"), "/venice did not enable Venice roles");
117
118
  assert(interactiveOutput.includes("route=venice/venice-uncensored-1-2"), "/venice did not set Venice route role");
118
119
  assert(interactiveOutput.includes("main=venice/venice-uncensored-1-2"), "/venice did not set Venice main role");
120
+ const interactiveOffOutput = await runInteractive("/venice off\n");
121
+ assert(interactiveOffOutput.includes("venice=off"), "/venice off did not restore DeepSeek roles");
122
+ assert(interactiveOffOutput.includes("route=deepseek/deepseek-v4-flash"), "/venice off did not restore DeepSeek route role");
119
123
 
120
124
  console.log(
121
125
  JSON.stringify(