@lazyingart/agintiflow 0.20.6 → 0.20.8

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.
@@ -48,12 +48,15 @@ Interactive commands:
48
48
 
49
49
  In the interactive CLI, `/provider`, `/route`, `/model`, `/spare`, and `/auxiliary model` without arguments open selectors. Use Up/Down/Left/Right to move through choices, Enter to confirm, and Esc to cancel. Slash-command hints use the same arrow selection behavior: type a prefix such as `/mo`, use arrows to choose `/model` or `/models`, then press Enter or Tab.
50
50
 
51
+ `/route`, `/model`, and `/spare` intentionally share the same text-model selector so users do not need to learn three different catalogs. The shared list is grouped as DeepSeek, Venice Uncensored, Venice GPT/Claude/Gemma/Qwen, OpenAI, Qwen, and Mock. OpenAI entries show the recommended default reasoning effort in the description; `/spare` stores that reasoning value when selected.
52
+
51
53
  `/venice` opens a two-step selector for the Venice route and main models. The current text choices are:
52
54
 
53
55
  ```text
54
56
  venice/venice-uncensored-1-2
55
57
  venice/venice-uncensored
56
58
  venice/gemma-4-uncensored
59
+ Disable Venice
57
60
  ```
58
61
 
59
62
  For scripts or non-interactive terminals, `/venice` uses Venice 1.2 for both roles. You can also set both roles directly with `/venice 1.2`, `/venice 1.1`, or `/venice gemma`. Use two values to set route and main separately, for example `/venice 1.2 gemma`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lazyingart/agintiflow",
3
- "version": "0.20.6",
3
+ "version": "0.20.8",
4
4
  "type": "module",
5
5
  "description": "AgInTiFlow is a web-first coding agent and CLI with DeepSeek routing, sandboxed tools, model providers, canvas artifacts, and optional wrappers.",
6
6
  "license": "Apache-2.0",
@@ -53,7 +53,9 @@ Interactive equivalents:
53
53
  /auxiliary model grsai/nano-banana-2
54
54
  ```
55
55
 
56
- `/venice` opens a route/main selector for Venice text models. The selector includes `venice/venice-uncensored-1-2` (Venice 1.2), `venice/venice-uncensored` (Venice 1.1), and `venice/gemma-4-uncensored` (Gemma 4). In non-interactive shells, `/venice` keeps script compatibility by selecting `venice/venice-uncensored-1-2` for both roles. `/venice 1.2 gemma` sets route to Venice 1.2 and main to Gemma 4; `/venice off` restores `deepseek/deepseek-v4-flash` for route and `deepseek/deepseek-v4-pro` for main.
56
+ `/route`, `/model`, and `/spare` share a single text-model selector. The selector is grouped as DeepSeek, Venice Uncensored, Venice GPT/Claude/Gemma/Qwen, OpenAI, Qwen, and Mock so the user sees the same union of route/main/spare-capable models in every role.
57
+
58
+ `/venice` opens a route/main selector for Venice text models. The selector includes `venice/venice-uncensored-1-2` (Venice 1.2), `venice/venice-uncensored` (Venice 1.1), `venice/gemma-4-uncensored` (Gemma 4), and a Disable Venice option. In non-interactive shells, `/venice` keeps script compatibility by selecting `venice/venice-uncensored-1-2` for both roles. `/venice 1.2 gemma` sets route to Venice 1.2 and main to Gemma 4; `/venice off` or the Disable Venice selector option restores `deepseek/deepseek-v4-flash` for route and `deepseek/deepseek-v4-pro` for main.
57
59
 
58
60
  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.
59
61
 
@@ -7,6 +7,7 @@ import { fileURLToPath } from "node:url";
7
7
  import {
8
8
  buildLaunchHeaderLines,
9
9
  buildPromptLayout,
10
+ buildPromptRenderSequence,
10
11
  canonicalSlashPromptBuffer,
11
12
  classifyEscapeAction,
12
13
  formatWorkspaceChange,
@@ -131,6 +132,16 @@ try {
131
132
  if (promptLayout.cursorRow < 0 || promptLayout.cursorColumn < 0) {
132
133
  throw new Error("terminal prompt layout returned an invalid cursor location");
133
134
  }
135
+ const promptCursorMoveBefore = buildPromptLayout("smooth typing", 13, 90, 24, { commandCwd: "/tmp/aginti-project" });
136
+ const promptCursorMoveAfter = buildPromptLayout("smooth typing", 4, 90, 24, { commandCwd: "/tmp/aginti-project" });
137
+ const cursorOnlySequence = buildPromptRenderSequence(promptCursorMoveAfter, {
138
+ lineCount: promptCursorMoveBefore.renderedRows.length,
139
+ cursorRow: promptCursorMoveBefore.cursorRow,
140
+ renderedRows: promptCursorMoveBefore.renderedRows,
141
+ });
142
+ if (cursorOnlySequence.includes("\x1b[2K") || cursorOnlySequence.includes("\x1b[?25l")) {
143
+ throw new Error("cursor-only prompt moves should not clear/redraw the input panel");
144
+ }
134
145
  const paddedPromptLayout = buildPromptLayout("hello", 5, 80, 24, { commandCwd: "/tmp/aginti-project" });
135
146
  const paddedRows = paddedPromptLayout.renderedRows.map((line) => line.replace(/\x1b\[[0-9;?]*[ -/]*[@-~]/g, ""));
136
147
  if (
@@ -271,6 +282,7 @@ try {
271
282
  "workspace-patch-event-render",
272
283
  "large-launch-header",
273
284
  "prompt-layout",
285
+ "prompt-redraw-fast-path",
274
286
  "user-prompt-label",
275
287
  "escape-policy",
276
288
  "live-input-status-layout",
@@ -10,6 +10,7 @@ import {
10
10
  selectModelRoute,
11
11
  } from "../src/model-routing.js";
12
12
  import { parseTextToolCalls, usesTextToolProtocol } from "../src/model-client.js";
13
+ import { modelRoleChoices } from "../src/interactive-cli.js";
13
14
 
14
15
  const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
15
16
 
@@ -111,6 +112,32 @@ assert(MODEL_PROVIDER_GROUPS["venice-gpt"].provider === "venice", "venice-gpt gr
111
112
  assert(modelsForProviderGroup("venice-gemma").some((item) => item.id === "gemma-4-uncensored"), "venice-gemma bucket missing Gemma");
112
113
  assert(modelsForProviderGroup("venice-uncensored").some((item) => item.id === "e2ee-venice-uncensored-24b-p"), "venice-uncensored bucket missing Venice 1.1");
113
114
  assert(AUXILIARY_MODEL_CATALOG["venice-image"].some((item) => item.id === "gpt-image-2"), "Venice image catalog missing GPT Image 2");
115
+ const routeChoices = modelRoleChoices("route").map((item) => `${item.provider}/${item.model}`);
116
+ const mainChoices = modelRoleChoices("main").map((item) => `${item.provider}/${item.model}`);
117
+ const spareChoices = modelRoleChoices("spare").map((item) => `${item.provider}/${item.model}`);
118
+ assert(JSON.stringify(routeChoices) === JSON.stringify(mainChoices), "route and main selectors should share the same text-model list");
119
+ assert(JSON.stringify(routeChoices) === JSON.stringify(spareChoices), "route and spare selectors should share the same text-model list");
120
+ for (const expected of [
121
+ "deepseek/deepseek-v4-flash",
122
+ "deepseek/deepseek-v4-pro",
123
+ "venice/venice-uncensored-1-2",
124
+ "venice/venice-uncensored",
125
+ "venice/gemma-4-uncensored",
126
+ "venice/openai-gpt-55",
127
+ "venice/claude-sonnet-4-6",
128
+ "venice/qwen3-6-27b",
129
+ "openai/gpt-5.5",
130
+ "openai/gpt-5.4",
131
+ "openai/gpt-5.4-mini",
132
+ "openai/gpt-5.3-codex",
133
+ "openai/gpt-5.3-codex-spark",
134
+ "qwen/qwen-plus",
135
+ "mock/mock-agent",
136
+ ]) {
137
+ assert(routeChoices.includes(expected), `shared model selector missing ${expected}`);
138
+ }
139
+ assert(!routeChoices.includes("venice/e2ee-venice-uncensored-24b-p"), "shared model selector should hide unstable E2EE Venice 1.1");
140
+ assert(modelRoleChoices("auxiliary").some((item) => item.provider === "grsai"), "auxiliary selector missing GRS AI");
114
141
  const parsedTextToolCalls = parseTextToolCalls('[TOOL_CALLS]list_files[ARGS]call_123[ARGS]{"path":".","maxDepth":1}');
115
142
  assert(parsedTextToolCalls.length === 1, "Venice text tool-call parser did not detect encoded tool call");
116
143
  assert(parsedTextToolCalls[0].function.name === "list_files", "Venice text tool-call parser returned wrong tool name");
@@ -151,6 +178,7 @@ console.log(
151
178
  "route-overrides",
152
179
  "provider-groups",
153
180
  "auxiliary-catalog",
181
+ "shared-model-selectors",
154
182
  "venice-text-tool-parser",
155
183
  "cli-models-command",
156
184
  "venice-shortcut",
@@ -832,24 +832,58 @@ function cursorLocation(layout, cursor) {
832
832
 
833
833
  function clearRenderedPrompt(previous) {
834
834
  if (!previous.lineCount) return;
835
+ let sequence = ansi.cursorHide;
835
836
  const below = previous.lineCount - 1 - previous.cursorRow;
836
- if (below > 0) output.write(`\x1b[${below}B`);
837
- output.write(`\r${ansi.clearLine}`);
837
+ if (below > 0) sequence += `\x1b[${below}B`;
838
+ sequence += `\r${ansi.clearLine}`;
838
839
  for (let index = 1; index < previous.lineCount; index += 1) {
839
- output.write(`\x1b[1A\r${ansi.clearLine}`);
840
+ sequence += `\x1b[1A\r${ansi.clearLine}`;
841
+ }
842
+ sequence += ansi.cursorShow;
843
+ output.write(sequence);
844
+ }
845
+
846
+ function renderedRowsEqual(left = [], right = []) {
847
+ if (left.length !== right.length) return false;
848
+ return left.every((line, index) => line === right[index]);
849
+ }
850
+
851
+ export function buildPromptRenderSequence(layout, previous = { lineCount: 0, cursorRow: 0, renderedRows: [] }) {
852
+ const previousRows = Array.isArray(previous.renderedRows) ? previous.renderedRows : [];
853
+ const previousLineCount = Number(previous.lineCount) || 0;
854
+ const previousCursorRow = Number(previous.cursorRow) || 0;
855
+ const nextRows = layout.renderedRows || [];
856
+
857
+ if (previousLineCount > 0 && renderedRowsEqual(previousRows, nextRows)) {
858
+ const rowDelta = layout.cursorRow - previousCursorRow;
859
+ return `${rowDelta > 0 ? `\x1b[${rowDelta}B` : rowDelta < 0 ? `\x1b[${Math.abs(rowDelta)}A` : ""}\r\x1b[${
860
+ layout.cursorColumn + 1
861
+ }G`;
862
+ }
863
+
864
+ let sequence = ansi.cursorHide;
865
+ if (previousLineCount > 0) {
866
+ const below = Math.max(previousLineCount - 1 - previousCursorRow, 0);
867
+ if (below > 0) sequence += `\x1b[${below}B`;
868
+ sequence += "\r";
869
+ if (previousLineCount > 1) sequence += `\x1b[${previousLineCount - 1}A`;
870
+ }
871
+
872
+ const lineCount = Math.max(previousLineCount, nextRows.length);
873
+ for (let index = 0; index < lineCount; index += 1) {
874
+ sequence += `\r${ansi.clearLine}${nextRows[index] || ""}`;
875
+ if (index < lineCount - 1) sequence += "\n";
840
876
  }
877
+
878
+ const cursorUp = Math.max(lineCount - 1 - layout.cursorRow, 0);
879
+ if (cursorUp > 0) sequence += `\x1b[${cursorUp}A`;
880
+ sequence += `\r\x1b[${layout.cursorColumn + 1}G${ansi.cursorShow}`;
881
+ return sequence;
841
882
  }
842
883
 
843
884
  function renderPromptBuffer(buffer, cursor, previous = { lineCount: 0, cursorRow: 0, renderedRows: [] }, options = {}) {
844
885
  const layout = buildPromptLayout(buffer, cursor, terminalWidth(), terminalHeight(), options);
845
- output.write(ansi.cursorHide);
846
- clearRenderedPrompt(previous);
847
- output.write(layout.renderedRows.join("\n"));
848
-
849
- const below = layout.renderedRows.length - 1 - layout.cursorRow;
850
- if (below > 0) output.write(`\x1b[${below}A`);
851
- output.write(`\r\x1b[${layout.cursorColumn + 1}G`);
852
- output.write(ansi.cursorShow);
886
+ output.write(buildPromptRenderSequence(layout, previous));
853
887
  return {
854
888
  lineCount: layout.renderedRows.length,
855
889
  cursorRow: layout.cursorRow,
@@ -1660,6 +1694,13 @@ function veniceTextModelChoices() {
1660
1694
  label: "Gemma 4",
1661
1695
  description: "Gemma-family Venice text model; 256K context",
1662
1696
  },
1697
+ {
1698
+ action: "disable",
1699
+ provider: "deepseek",
1700
+ model: "deepseek-v4-flash",
1701
+ label: "Disable Venice",
1702
+ description: "restore DeepSeek route/main defaults",
1703
+ },
1663
1704
  ];
1664
1705
  }
1665
1706
 
@@ -1755,98 +1796,69 @@ function printModelRoles(state) {
1755
1796
  );
1756
1797
  }
1757
1798
 
1758
- function modelRoleChoices(role = "main") {
1799
+ function compactReasoning(model = {}) {
1800
+ const values = Array.isArray(model.reasoning) ? model.reasoning : [];
1801
+ if (values.length === 0) return "";
1802
+ const preferred = model.id === "gpt-5.4-mini" || model.id === "gpt-5.3-codex-spark" ? "high" : "medium";
1803
+ return `${preferred} reasoning`;
1804
+ }
1805
+
1806
+ function modelSelectorGroup(provider, model = {}) {
1807
+ if (provider === "deepseek") return "DeepSeek";
1808
+ if (provider === "openai") return "OpenAI";
1809
+ if (provider === "qwen") return "Qwen";
1810
+ if (provider === "mock") return "Mock";
1811
+ if (provider === "venice") {
1812
+ if (model.bucket === "venice-uncensored") return "Venice Uncensored";
1813
+ if (model.bucket === "venice-gpt") return "Venice GPT";
1814
+ if (model.bucket === "venice-claude") return "Venice Claude";
1815
+ if (model.bucket === "venice-gemma") return "Venice Gemma";
1816
+ if (model.bucket === "venice-qwen") return "Venice Qwen";
1817
+ return "Venice";
1818
+ }
1819
+ return provider;
1820
+ }
1821
+
1822
+ function textModelRoleChoices() {
1823
+ const providerOrder = ["deepseek", "venice", "openai", "qwen", "mock"];
1824
+ const veniceOrder = [
1825
+ "venice-uncensored-1-2",
1826
+ "venice-uncensored",
1827
+ "gemma-4-uncensored",
1828
+ "openai-gpt-55",
1829
+ "claude-sonnet-4-6",
1830
+ "qwen3-6-27b",
1831
+ ];
1832
+ const choices = [];
1833
+ for (const provider of providerOrder) {
1834
+ let models = PROVIDER_MODEL_CATALOG[provider] || [];
1835
+ if (provider === "venice") {
1836
+ const byId = new Map(models.filter((model) => !model.hidden).map((model) => [model.id, model]));
1837
+ models = veniceOrder.map((id) => byId.get(id)).filter(Boolean);
1838
+ } else {
1839
+ models = models.filter((model) => !model.hidden);
1840
+ }
1841
+ for (const model of models) {
1842
+ const group = modelSelectorGroup(provider, model);
1843
+ const reasoning = compactReasoning(model);
1844
+ const context = model.context ? `${model.context} context` : "";
1845
+ const details = [reasoning, context, model.description].filter(Boolean).join("; ");
1846
+ choices.push({
1847
+ provider,
1848
+ model: model.id,
1849
+ label: `${group} · ${model.label}`,
1850
+ group,
1851
+ description: details,
1852
+ reasoningDefault: reasoning ? reasoning.split(" ")[0] : "",
1853
+ });
1854
+ }
1855
+ }
1856
+ return choices;
1857
+ }
1858
+
1859
+ export function modelRoleChoices(role = "main") {
1860
+ if (role !== "auxiliary") return textModelRoleChoices();
1759
1861
  const common = [
1760
- {
1761
- provider: "deepseek",
1762
- model: "deepseek-v4-flash",
1763
- label: "DeepSeek V4 Flash",
1764
- description: "fast planner, short shell/browser/code work",
1765
- route: true,
1766
- },
1767
- {
1768
- provider: "deepseek",
1769
- model: "deepseek-v4-pro",
1770
- label: "DeepSeek V4 Pro",
1771
- description: "complex coding, debugging, writing, and long tasks",
1772
- main: true,
1773
- spare: true,
1774
- },
1775
- {
1776
- provider: "venice",
1777
- model: "venice-uncensored-1-2",
1778
- label: "Venice 1.2",
1779
- description: "Venice text route; use /auth venice if missing",
1780
- route: true,
1781
- main: true,
1782
- spare: true,
1783
- },
1784
- {
1785
- provider: "venice",
1786
- model: "venice-uncensored",
1787
- label: "Venice 1.1",
1788
- description: "legacy Venice text route; use /auth venice if missing",
1789
- route: true,
1790
- main: true,
1791
- spare: true,
1792
- },
1793
- {
1794
- provider: "venice",
1795
- model: "gemma-4-uncensored",
1796
- label: "Gemma 4",
1797
- description: "Gemma-family Venice route; use /auth venice if missing",
1798
- route: true,
1799
- main: true,
1800
- spare: true,
1801
- },
1802
- {
1803
- provider: "openai",
1804
- model: "gpt-5.5",
1805
- label: "OpenAI GPT-5.5",
1806
- description: "frontier spare/manual model",
1807
- main: true,
1808
- spare: true,
1809
- },
1810
- {
1811
- provider: "openai",
1812
- model: "gpt-5.4",
1813
- label: "OpenAI GPT-5.4",
1814
- description: "strong everyday coding spare",
1815
- main: true,
1816
- spare: true,
1817
- },
1818
- {
1819
- provider: "openai",
1820
- model: "gpt-5.4-mini",
1821
- label: "OpenAI GPT-5.4 Mini",
1822
- description: "small fast spare route",
1823
- route: true,
1824
- spare: true,
1825
- },
1826
- {
1827
- provider: "qwen",
1828
- model: "qwen-plus",
1829
- label: "Qwen Plus",
1830
- description: "general Qwen route",
1831
- route: true,
1832
- },
1833
- {
1834
- provider: "qwen",
1835
- model: "qwen-max",
1836
- label: "Qwen Max",
1837
- description: "larger Qwen route",
1838
- main: true,
1839
- spare: true,
1840
- },
1841
- {
1842
- provider: "mock",
1843
- model: "mock-agent",
1844
- label: "Mock Agent",
1845
- description: "local deterministic test route",
1846
- route: true,
1847
- main: true,
1848
- spare: true,
1849
- },
1850
1862
  {
1851
1863
  provider: "grsai",
1852
1864
  model: "nano-banana-2",
@@ -1869,22 +1881,7 @@ function modelRoleChoices(role = "main") {
1869
1881
  auxiliary: true,
1870
1882
  },
1871
1883
  ];
1872
- const filtered = common.filter((item) => {
1873
- if (role === "route") return item.route;
1874
- if (role === "spare") return item.spare;
1875
- if (role === "auxiliary") return item.auxiliary;
1876
- return item.main;
1877
- });
1878
- if (role === "route") {
1879
- return filtered.sort((a, b) => Number(b.model === "deepseek-v4-flash") - Number(a.model === "deepseek-v4-flash"));
1880
- }
1881
- if (role === "spare") {
1882
- return filtered.sort((a, b) => Number(b.model === "gpt-5.4") - Number(a.model === "gpt-5.4"));
1883
- }
1884
- if (role === "auxiliary") {
1885
- return filtered.sort((a, b) => Number(b.provider === "grsai") - Number(a.provider === "grsai"));
1886
- }
1887
- return filtered.sort((a, b) => Number(b.model === "deepseek-v4-pro") - Number(a.model === "deepseek-v4-pro"));
1884
+ return common.filter((item) => item.auxiliary).sort((a, b) => Number(b.provider === "grsai") - Number(a.provider === "grsai"));
1888
1885
  }
1889
1886
 
1890
1887
  function providerChoices() {
@@ -1923,6 +1920,7 @@ function providerChoices() {
1923
1920
  }
1924
1921
 
1925
1922
  function modelChoiceLine(option) {
1923
+ if (option.action === "disable") return `${option.label} ${option.description}`;
1926
1924
  return `${option.label} ${option.provider}/${option.model} ${option.description}`;
1927
1925
  }
1928
1926
 
@@ -2058,7 +2056,7 @@ async function pickModelRole(role, state) {
2058
2056
  } else if (role === "spare") {
2059
2057
  state.spareProvider = selected.provider;
2060
2058
  state.spareModel = selected.model;
2061
- state.spareReasoning = state.spareReasoning || "medium";
2059
+ state.spareReasoning = selected.reasoningDefault || state.spareReasoning || "medium";
2062
2060
  printSystemLine(`spare=${state.spareProvider}/${state.spareModel} reasoning=${state.spareReasoning}`);
2063
2061
  } else if (role === "auxiliary") {
2064
2062
  state.auxiliaryProvider = selected.provider;
@@ -2086,10 +2084,15 @@ async function pickVeniceRouteAndMain(state) {
2086
2084
  initialIndex: routeIndex,
2087
2085
  });
2088
2086
  if (!route) return false;
2087
+ if (route.action === "disable") {
2088
+ useDeepSeekDefaults(state);
2089
+ printSystemLine("venice=off routing=smart route=deepseek/deepseek-v4-flash main=deepseek/deepseek-v4-pro");
2090
+ return true;
2091
+ }
2089
2092
 
2090
2093
  const mainIndex = Math.max(
2091
- options.findIndex((item) => item.provider === state.mainProvider && item.model === state.mainModel),
2092
- options.findIndex((item) => item.model === route.model),
2094
+ options.findIndex((item) => item.action !== "disable" && item.provider === state.mainProvider && item.model === state.mainModel),
2095
+ options.findIndex((item) => item.action !== "disable" && item.model === route.model),
2093
2096
  0
2094
2097
  );
2095
2098
  const main = await selectModelChoice({
@@ -2099,6 +2102,11 @@ async function pickVeniceRouteAndMain(state) {
2099
2102
  initialIndex: mainIndex,
2100
2103
  });
2101
2104
  if (!main) return false;
2105
+ if (main.action === "disable") {
2106
+ useDeepSeekDefaults(state);
2107
+ printSystemLine("venice=off routing=smart route=deepseek/deepseek-v4-flash main=deepseek/deepseek-v4-pro");
2108
+ return true;
2109
+ }
2102
2110
 
2103
2111
  useVeniceModels(state, route.model, main.model);
2104
2112
  printSystemLine(`venice=on routing=smart route=venice/${state.routeModel} main=venice/${state.mainModel}`);
@@ -216,24 +216,26 @@ export const PROVIDER_MODEL_CATALOG = {
216
216
  description: "Current Venice uncensored text route.",
217
217
  },
218
218
  {
219
- id: "e2ee-venice-uncensored-24b-p",
219
+ id: "venice-uncensored",
220
220
  label: "Venice Uncensored 1.1",
221
221
  bucket: "venice-uncensored",
222
222
  context: "32K",
223
- description: "E2EE Venice uncensored 1.1 text route.",
223
+ description: "Working Venice uncensored 1.1 text route.",
224
224
  },
225
225
  {
226
- id: "venice-uncensored",
227
- label: "Venice Uncensored Legacy",
226
+ id: "e2ee-venice-uncensored-24b-p",
227
+ label: "Venice Uncensored 1.1 E2EE",
228
228
  bucket: "venice-uncensored",
229
229
  context: "32K",
230
- description: "Deprecated legacy Venice uncensored text route.",
230
+ hidden: true,
231
+ description: "Documented E2EE Venice 1.1 route; hidden from selectors until upstream stabilizes.",
231
232
  },
232
233
  {
233
234
  id: "venice-uncensored-role-play",
234
235
  label: "Venice Role Play Uncensored",
235
236
  bucket: "venice-uncensored",
236
237
  context: "128K",
238
+ hidden: true,
237
239
  description: "Role-play oriented Venice route.",
238
240
  },
239
241
  {