omnius 1.0.890 → 1.0.892

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.
@@ -1639,13 +1639,27 @@ function nativeMarkdownSections(owner, source, streaming = false) {
1639
1639
  return segmented ? output : void 0;
1640
1640
  }
1641
1641
 
1642
- // packages/cli/src/tui/native/components/blocks.ts
1643
- function nativeProgressText(value, working = false) {
1644
- if (value === void 0 || !Number.isFinite(value)) return `[············] ${working ? "working" : "pending"}`;
1642
+ // packages/cli/src/tui/native/activity-presentation.ts
1643
+ function nativeProgressText(value, _working = false) {
1644
+ if (value === void 0 || !Number.isFinite(value)) return "";
1645
1645
  const ratio = Math.max(0, Math.min(1, value));
1646
1646
  const filled = Math.round(ratio * 12);
1647
1647
  return `[${"▮".repeat(filled)}${"░".repeat(12 - filled)}] ${Math.round(ratio * 100)}%`;
1648
1648
  }
1649
+ function nativeActivityText(activity, runtimeStatus) {
1650
+ const stage = activity?.stage?.trim().replace(/_/g, " ") ?? "";
1651
+ const label3 = activity?.label?.trim() ?? "";
1652
+ if (/^(?:blocked|failed|error|awaiting input|waiting|paused|interrupted|stopped)(?:\b|$)/i.test(stage)) {
1653
+ return [stage.toUpperCase(), label3.toLowerCase() === stage.toLowerCase() ? "" : label3].filter(Boolean).join(" · ");
1654
+ }
1655
+ if (!activity?.operationId && activity?.progress !== void 0 && Number.isFinite(activity.progress)) {
1656
+ const percent = Math.round(Math.max(0, Math.min(1, activity.progress)) * 100);
1657
+ return [label3, `${percent}%`].filter(Boolean).join(" · ");
1658
+ }
1659
+ return runtimeStatus?.trim() ?? "";
1660
+ }
1661
+
1662
+ // packages/cli/src/tui/native/components/blocks.ts
1649
1663
  function nativeControlFocus(control, baseAttributes = 0) {
1650
1664
  const update = () => {
1651
1665
  if (!control.isDestroyed) control.attributes = baseAttributes | (control.focused ? 32 : 0);
@@ -1921,11 +1935,7 @@ var NativeBlockView = class {
1921
1935
  this.collapsed = spec.collapsed ?? false;
1922
1936
  this.previousModelCollapsed = spec.collapsed;
1923
1937
  }
1924
- if (this.title) {
1925
- this.title.content = `${spec.collapsible ? this.collapsed ? "▸ " : "· " : ""}${plainText(spec.title)}`;
1926
- this.title.focusable = Boolean(spec.collapsible);
1927
- }
1928
- if (this.body) this.body.visible = !this.collapsed;
1938
+ this.syncDisclosure();
1929
1939
  const sections = spec.kind === "markdown" ? nativeMarkdownSections(spec.id, plainText(spec.text), spec.streaming) : void 0;
1930
1940
  if (this.text && spec.kind === "markdown") this.text.visible = !sections;
1931
1941
  if (sections && this.body) {
@@ -1948,7 +1958,11 @@ var NativeBlockView = class {
1948
1958
  if (this.image && spec.imagePath && this.image.source !== spec.imagePath) this.image.source = spec.imagePath;
1949
1959
  if (this.terminal) this.terminal.height = spec.height ?? 14;
1950
1960
  if (this.image) this.image.height = spec.height ?? 12;
1951
- if (this.progress) this.progress.content = nativeProgressText(spec.progress, spec.streaming);
1961
+ if (this.progress) {
1962
+ const meter = nativeProgressText(spec.progress, spec.streaming);
1963
+ this.progress.content = meter;
1964
+ this.progress.visible = Boolean(meter);
1965
+ }
1952
1966
  this.children?.replace(spec.children ?? []);
1953
1967
  const actionsSignature = JSON.stringify(spec.actions ?? []);
1954
1968
  if (this.actions && actionsSignature !== this.actionsSignature) {
@@ -1988,10 +2002,26 @@ var NativeBlockView = class {
1988
2002
  }
1989
2003
  toggle() {
1990
2004
  this.collapsed = !this.collapsed;
1991
- if (this.body) this.body.visible = !this.collapsed;
1992
- if (this.title) this.title.content = `${this.collapsed ? "▸ " : "· "}${plainText(this.spec.title)}`;
2005
+ this.syncDisclosure();
1993
2006
  this.context.emit({ type: "action", action: "toggle-block", id: this.spec.id });
1994
2007
  }
2008
+ syncDisclosure() {
2009
+ if (this.body) this.body.visible = !this.collapsed;
2010
+ if (!this.title) return;
2011
+ const title = plainText(this.spec.title);
2012
+ const lineDisclosure = /^\+ \d+ lines?$/.test(title);
2013
+ const label3 = this.spec.collapsible && !this.collapsed && lineDisclosure ? title.replace(/^\+/, "−") : title;
2014
+ this.title.content = `${this.spec.collapsible ? this.collapsed ? "▸ " : "▾ " : ""}${label3}`;
2015
+ this.title.focusable = Boolean(this.spec.collapsible);
2016
+ const children = this.root.getChildren();
2017
+ const position = this.spec.collapsible && !this.collapsed && (this.spec.disclosurePlacement === "footer" || lineDisclosure) ? children.length - 1 : 0;
2018
+ if (children.indexOf(this.title) !== position) {
2019
+ const focused = this.title.focused;
2020
+ this.root.remove(this.title);
2021
+ this.root.add(this.title, position);
2022
+ if (focused) this.title.focus();
2023
+ }
2024
+ }
1995
2025
  captureDisclosures(result) {
1996
2026
  if (this.spec.collapsible) Object.defineProperty(result, this.spec.id, { value: this.collapsed, enumerable: true, configurable: true, writable: true });
1997
2027
  this.children?.captureDisclosures(result);
@@ -2000,8 +2030,7 @@ var NativeBlockView = class {
2000
2030
  restoreDisclosures(state) {
2001
2031
  if (this.spec.collapsible && Object.hasOwn(state, this.spec.id)) {
2002
2032
  this.collapsed = state[this.spec.id];
2003
- if (this.body) this.body.visible = !this.collapsed;
2004
- if (this.title) this.title.content = `${this.collapsed ? "▸ " : "· "}${plainText(this.spec.title)}`;
2033
+ this.syncDisclosure();
2005
2034
  }
2006
2035
  this.children?.restoreDisclosures(state);
2007
2036
  this.markdownSections?.restoreDisclosures(state);
@@ -6110,7 +6139,7 @@ var COMMAND_SIGNATURES = [
6110
6139
  ["/wizard", "Alias for /setup"],
6111
6140
  ["/parallel", "Show current Ollama parallel inference slots"],
6112
6141
  ["/parallel <1-15>", "Set parallel slots (restarts Ollama, max 15)"],
6113
- ["/gpu", "Select enabled GPUs with arrow keys and Space"],
6142
+ ["/gpu", "Select enabled GPUs and CPU offload with arrow keys and Space"],
6114
6143
  ["/gpu status|reset", "Inspect or reset the host-local GPU policy"],
6115
6144
  ["/gpu select <UUID>", "Open the GPU policy selector focused on a device"],
6116
6145
  [
@@ -8144,7 +8173,6 @@ var NativeFrontend = class {
8144
8173
  this.sessionPicker.on("blurred", stylePicker);
8145
8174
  this.sessionRow.add(this.sessionPicker);
8146
8175
  this.routeWarning = new TextRenderable11(renderer2, { id: "omnius-route-warning", content: "", width: "100%", wrapMode: "word", fg: colors.warning, attributes: TextAttributes11.BOLD | TextAttributes11.UNDERLINE, visible: false, flexShrink: 0 });
8147
- this.root.add(this.routeWarning);
8148
8176
  this.taskPane = new BoxRenderable12(renderer2, { id: "omnius-tasks", width: "100%", flexDirection: "column", maxHeight: 6, flexShrink: 0, overflow: "hidden", visible: false });
8149
8177
  this.tasks = new NativeBlockList(this.context, this.taskPane);
8150
8178
  this.root.add(this.taskPane);
@@ -8160,6 +8188,7 @@ var NativeFrontend = class {
8160
8188
  this.root.add(this.body);
8161
8189
  this.transcriptPane = new BoxRenderable12(renderer2, { id: "omnius-transcript-pane", flexDirection: "column", flexGrow: 1, flexShrink: 1, minWidth: 0, minHeight: 1 });
8162
8190
  this.body.add(this.transcriptPane);
8191
+ this.transcriptPane.add(this.routeWarning);
8163
8192
  this.scroll = new ScrollBoxRenderable8(renderer2, {
8164
8193
  id: "omnius-conversation",
8165
8194
  flexGrow: 1,
@@ -8683,14 +8712,9 @@ var NativeFrontend = class {
8683
8712
  this.replaceActions(this.enhance, actions, "enhance");
8684
8713
  }
8685
8714
  renderActivity() {
8686
- const activity = this.state?.activity;
8687
- const stage = activity?.stage === "idle" ? void 0 : activity?.stage?.replace(/_/g, " ").toUpperCase();
8688
- const label3 = activity?.label && activity.label.toUpperCase() !== stage ? activity.label : void 0;
8689
- const elapsed = activity?.elapsedMs === void 0 ? void 0 : `${Math.max(0, Math.floor(activity.elapsedMs / 1e3))}s`;
8690
- const progress = activity?.progress === void 0 ? void 0 : `${Math.round(activity.progress * 100)}% source accounted`;
8691
- const reading = [stage, label3, elapsed, progress].filter(Boolean).join(" · ") || this.state?.instruments?.runtimeStatus || "";
8692
- this.activity.visible = Boolean(activity?.processing || reading);
8693
- this.activity.content = `${activity?.processing ? "RUN · " : ""}${reading}`;
8715
+ const reading = nativeActivityText(this.state?.activity, this.state?.instruments?.runtimeStatus);
8716
+ this.activity.visible = Boolean(reading);
8717
+ this.activity.content = reading;
8694
8718
  this.status.visible = this.activity.visible || this.media.visible || this.copyFeedback.visible;
8695
8719
  }
8696
8720
  renderMedia() {
@@ -23971,7 +23971,7 @@
23971
23971
  "id": "command.gpu",
23972
23972
  "kind": "command",
23973
23973
  "title": "/gpu",
23974
- "summary": "Select enabled GPUs with arrow keys and Space",
23974
+ "summary": "Select enabled GPUs and CPU offload with arrow keys and Space",
23975
23975
  "aliases": [
23976
23976
  "/gpu",
23977
23977
  "gpu"
@@ -24005,7 +24005,7 @@
24005
24005
  "signatures": [
24006
24006
  {
24007
24007
  "signature": "/gpu",
24008
- "description": "Select enabled GPUs with arrow keys and Space"
24008
+ "description": "Select enabled GPUs and CPU offload with arrow keys and Space"
24009
24009
  },
24010
24010
  {
24011
24011
  "signature": "/gpu status|reset",
package/docs/DISCOVERY.md CHANGED
@@ -330,7 +330,7 @@ Daemon equivalents are `GET /v1/discovery/bootstrap`, `GET /v1/discovery?q=<inte
330
330
  | `command.flow` | /flow | Toggle FlowState protocol - immediate action, tight loops, goal clarity |
331
331
  | `command.fortemi` | /fortemi | Manage Fortemi React bridge integration |
332
332
  | `command.full-send-bless` | /full-send-bless | Infinite warm loop - DMN self-reflection chains tasks autonomously |
333
- | `command.gpu` | /gpu | Select enabled GPUs with arrow keys and Space |
333
+ | `command.gpu` | /gpu | Select enabled GPUs and CPU offload with arrow keys and Space |
334
334
  | `command.hangup` | /hangup | End active call session |
335
335
  | `command.help` | /help | Show this help |
336
336
  | `command.hf` | /hf | Show HF token status (set / not set) |
@@ -18,6 +18,7 @@ Configuration is layered from environment, global user settings, project setting
18
18
  | `OMNIUS_DAEMON` | Start in daemon mode when set to `1` |
19
19
  | `OMNIUS_FORCE_NO_THINK` | Force `think: false` for Qwen-style backends |
20
20
  | `OMNIUS_THINK_AUTO` | Enable opt-in automatic thinking mode trigger |
21
+ | `OMNIUS_CPU_OFFLOAD_ALLOWED` | `1` permits native Ollama CPU overflow; any other explicit value disables it. When absent, use saved `cpuOffloadAllowed` (default `false`) |
21
22
  | `OMNIUS_TG_LATENCY_TARGET_MS` | Desired end-to-end Telegram reply time (default `30000`) |
22
23
  | `OMNIUS_TG_LATENCY_HARD_MS` | Trial a leaner Telegram chat profile after this total latency (default `60000`) |
23
24
  | `OMNIUS_TG_LATENCY_MIN_SAMPLES` | Receipt-valid samples required to retain a leaner profile (default `3`) |
@@ -77,6 +78,26 @@ remains saved but disabled until a protocol is selected.
77
78
 
78
79
  ## Runtime State
79
80
 
81
+ ### GPU selection and CPU offload
82
+
83
+ Open `/gpu`, use Space to toggle devices or **CPU offload OK**, then Enter to
84
+ save. Escape cancels. The ordered `gpuEnabledUuids` setting limits native broker
85
+ requests to those devices; enabling two or more lets the broker split a model
86
+ across them. The preferred device does not restrict the request to one GPU.
87
+
88
+ `cpuOffloadAllowed` defaults to `false`. When enabled, native Ollama requests
89
+ permit overflow layers in system RAM. The broker still prefers full GPU
90
+ placement. A model larger than the enabled GPUs' combined physical capacity
91
+ can use an exclusive GPU scope with CPU overflow after host and service memory
92
+ checks. GPU selection and CPU permission have independent project/global
93
+ settings, and `/gpu reset` resets only the GPU selection. An empty GPU selection
94
+ still disables CUDA; CPU permission does not enable CPU-only fallback.
95
+
96
+ The broker advertises support through its discovery endpoint. Older brokers
97
+ must be updated before accepting CPU overflow. Remote OpenAI and Anthropic
98
+ providers do not receive this host policy. Changes apply to future requests;
99
+ existing model placement is not migrated.
100
+
80
101
  Project runtime state:
81
102
 
82
103
  ```text
@@ -19,12 +19,12 @@ Command metadata drives the TUI, REST command proxy, gateway exposure, and agent
19
19
  | Sessions And Control | 16 |
20
20
  | Runtime | 14 |
21
21
  | Media | 11 |
22
- | Network And P2P | 11 |
22
+ | Network And P2P | 12 |
23
23
  | Memory And Context | 3 |
24
24
  | Tools And Skills | 6 |
25
25
  | External Gateways | 2 |
26
26
  | Secrets | 2 |
27
- | Interface | 10 |
27
+ | Interface | 12 |
28
28
  | Administration | 2 |
29
29
  | Planned | 8 |
30
30
 
@@ -522,7 +522,7 @@ Open sound-effect model/setup menu
522
522
  | Status | implemented |
523
523
  | Surfaces | tui, rest, gateway, agentTool |
524
524
  | Safety | none |
525
- | Aliases | - |
525
+ | Aliases | /audio |
526
526
  | Args | - |
527
527
  | Subcommands | --model, setup, list |
528
528
 
@@ -1048,7 +1048,7 @@ Show or manage the local API daemon
1048
1048
  Signatures:
1049
1049
 
1050
1050
  - `/daemon` - Show or manage the local API daemon
1051
- - `/daemon &lt;start\|stop\|restart\|takeover&gt;` - Control the local API daemon
1051
+ - `/daemon &lt;status\|diagnostics\|start\|stop\|restart\|takeover&gt;` - Inspect startup diagnostics or control the local API daemon
1052
1052
 
1053
1053
  ### /debug
1054
1054
 
@@ -1114,7 +1114,7 @@ Signatures:
1114
1114
 
1115
1115
  ### /gpu
1116
1116
 
1117
- Select enabled GPUs with arrow keys and Space
1117
+ Select enabled GPUs and CPU offload with arrow keys and Space
1118
1118
 
1119
1119
  | Field | Value |
1120
1120
  | --- | --- |
@@ -1124,12 +1124,13 @@ Select enabled GPUs with arrow keys and Space
1124
1124
  | Safety | userOnly |
1125
1125
  | Aliases | - |
1126
1126
  | Args | - |
1127
- | Subcommands | - |
1127
+ | Subcommands | select |
1128
1128
 
1129
1129
  Signatures:
1130
1130
 
1131
- - `/gpu` - Select enabled GPUs with arrow keys and Space
1131
+ - `/gpu` - Select enabled GPUs and CPU offload with arrow keys and Space
1132
1132
  - `/gpu status\|reset` - Inspect or reset the host-local GPU policy
1133
+ - `/gpu select &lt;UUID&gt;` - Open the GPU policy selector focused on a device
1133
1134
 
1134
1135
  ### /parallel
1135
1136
 
@@ -1554,7 +1555,7 @@ Signatures:
1554
1555
 
1555
1556
  ### /endpoint
1556
1557
 
1557
- Show current endpoint
1558
+ Select an endpoint or provider
1558
1559
 
1559
1560
  | Field | Value |
1560
1561
  | --- | --- |
@@ -1568,8 +1569,8 @@ Show current endpoint
1568
1569
 
1569
1570
  Signatures:
1570
1571
 
1571
- - `/endpoint` - Show current endpoint
1572
- - `/endpoint &lt;url&gt;` - Set backend URL (auto-detects type)
1572
+ - `/endpoint` - Select an endpoint or provider
1573
+ - `/endpoint &lt;provider\|alias\|url&gt;` - Set a provider name, alias, or backend URL
1573
1574
  - `/endpoint &lt;url&gt; --auth &lt;t&gt;` - Set endpoint with Bearer auth
1574
1575
  - `/endpoint sponsor` - Browse and connect to sponsored inference from the nexus mesh
1575
1576
 
@@ -1634,6 +1635,24 @@ Signatures:
1634
1635
  - `/ipfs share &lt;tool\|skill&gt; &lt;name&gt;` - Share a tool or skill through IPFS
1635
1636
  - `/ipfs import &lt;cid&gt;` - Import a shared IPFS tool or skill reference
1636
1637
 
1638
+ ### /mesh
1639
+
1640
+ Inspect trusted inference mesh routing and public identity
1641
+
1642
+ | Field | Value |
1643
+ | --- | --- |
1644
+ | Category | Network And P2P |
1645
+ | Status | implemented |
1646
+ | Surfaces | tui, rest, gateway, agentTool |
1647
+ | Safety | none |
1648
+ | Aliases | - |
1649
+ | Args | [status\|identity] |
1650
+ | Subcommands | - |
1651
+
1652
+ Signatures:
1653
+
1654
+ - `/mesh [status\|identity]` - Inspect trusted inference mesh routing and public identity
1655
+
1637
1656
  ### /network
1638
1657
 
1639
1658
  Quick network access helper
@@ -1700,21 +1719,22 @@ Signatures:
1700
1719
 
1701
1720
  ### /provider
1702
1721
 
1703
- Show or select provider profile
1722
+ Configure rate-limited inference sponsorship to the mesh
1704
1723
 
1705
1724
  | Field | Value |
1706
1725
  | --- | --- |
1707
1726
  | Category | Network And P2P |
1708
- | Status | planned |
1727
+ | Status | implemented |
1709
1728
  | Surfaces | tui |
1710
- | Safety | none |
1729
+ | Safety | userOnly, networked, secretBearing, profileGated |
1711
1730
  | Aliases | - |
1712
1731
  | Args | - |
1713
- | Subcommands | - |
1732
+ | Subcommands | status |
1714
1733
 
1715
1734
  Signatures:
1716
1735
 
1717
- - `/provider` - Show or select provider profile
1736
+ - `/provider` - Configure rate-limited inference sponsorship to the mesh
1737
+ - `/provider status` - Inspect saved and active mesh provider state
1718
1738
 
1719
1739
  ### /sponsor
1720
1740
 
@@ -2043,7 +2063,7 @@ Signatures:
2043
2063
 
2044
2064
  ### /color
2045
2065
 
2046
- Show or configure colors (Omnius Earth by default)
2066
+ Use terminal colors and thin section rules
2047
2067
 
2048
2068
  | Field | Value |
2049
2069
  | --- | --- |
@@ -2057,10 +2077,10 @@ Show or configure colors (Omnius Earth by default)
2057
2077
 
2058
2078
  Signatures:
2059
2079
 
2060
- - `/color` - Show or configure colors (Omnius Earth by default)
2061
- - `/color status` - Show TUI chrome effect settings
2062
- - `/color frill on\|off\|toggle\|status` - Control ornamental TUI button ends
2063
- - `/color flow on\|off\|toggle\|status` - Control animated and gradient-flowing box borders
2080
+ - `/color` - Use terminal colors and thin section rules
2081
+ - `/color status` - Show terminal appearance preferences
2082
+ - `/color frill on\|off\|toggle\|status` - Legacy text ornament preference
2083
+ - `/color flow on\|off\|toggle\|status` - Legacy border animation preference
2064
2084
  - `/theme` - Alias for /color
2065
2085
 
2066
2086
  ### /emojis
@@ -2081,6 +2101,24 @@ Signatures:
2081
2101
 
2082
2102
  - `/emojis` - Toggle emoji rendering in TUI messages
2083
2103
 
2104
+ ### /enhance
2105
+
2106
+ Enhance a prompt into the input editor
2107
+
2108
+ | Field | Value |
2109
+ | --- | --- |
2110
+ | Category | Interface |
2111
+ | Status | implemented |
2112
+ | Surfaces | tui |
2113
+ | Safety | userOnly, networked |
2114
+ | Aliases | - |
2115
+ | Args | &lt;prompt&gt; |
2116
+ | Subcommands | - |
2117
+
2118
+ Signatures:
2119
+
2120
+ - `/enhance &lt;prompt&gt;` - Enhance a prompt into the input editor
2121
+
2084
2122
  ### /indicator
2085
2123
 
2086
2124
  Start the native system indicator and report readiness
@@ -2132,7 +2170,7 @@ Toggle embedded Neovim editor (Ctrl+N to switch focus)
2132
2170
  | Status | implemented |
2133
2171
  | Surfaces | tui, rest, gateway, agentTool |
2134
2172
  | Safety | none |
2135
- | Aliases | /nvim, /vim |
2173
+ | Aliases | /nvim |
2136
2174
  | Args | - |
2137
2175
  | Subcommands | - |
2138
2176
 
@@ -2141,7 +2179,6 @@ Signatures:
2141
2179
  - `/neovim` - Toggle embedded Neovim editor (Ctrl+N to switch focus)
2142
2180
  - `/neovim &lt;file&gt;` - Open file in embedded Neovim editor
2143
2181
  - `/nvim &lt;file&gt;` - Alias for /neovim &lt;file&gt;
2144
- - `/vim &lt;file&gt;` - Alias for /neovim &lt;file&gt;
2145
2182
 
2146
2183
  ### /personality
2147
2184
 
@@ -2234,6 +2271,25 @@ Signatures:
2234
2271
  - `/statusbar` - Configure the status bar
2235
2272
  - `/sb` - Alias for /statusbar
2236
2273
 
2274
+ ### /vim
2275
+
2276
+ Toggle Vim composer editing (Esc normal; i insert)
2277
+
2278
+ | Field | Value |
2279
+ | --- | --- |
2280
+ | Category | Interface |
2281
+ | Status | implemented |
2282
+ | Surfaces | tui, rest, gateway, agentTool |
2283
+ | Safety | none |
2284
+ | Aliases | - |
2285
+ | Args | - |
2286
+ | Subcommands | - |
2287
+
2288
+ Signatures:
2289
+
2290
+ - `/vim` - Toggle Vim composer editing (Esc normal; i insert)
2291
+ - `/vim on\|off\|status` - Set or inspect Vim composer editing
2292
+
2237
2293
 
2238
2294
  ## Administration
2239
2295
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.890",
3
+ "version": "1.0.892",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.890",
9
+ "version": "1.0.892",
10
10
  "bundleDependencies": [
11
11
  "image-to-ascii"
12
12
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.890",
3
+ "version": "1.0.892",
4
4
  "description": "AI coding agent powered by open-source models (Ollama/vLLM) — interactive TUI with agentic tool-calling loop",
5
5
  "type": "module",
6
6
  "main": "./dist/library.js",